ea6f3ae4855cc251f78f3788134ebe80b9ce4152
[mdlife] / src / part_simba.c
1 #include <stdio.h>
2 #include <stdint.h>
3 #include "vdp.h"
4 #include "pad.h"
5 #include "parts.h"
6 #include "debug.h"
7
8 #define BGTILES_OFFS            1
9 #define FGTILES_OFFS            4
10
11 extern uint16_t simbabg_data[], simbabg_data_end[];
12 extern unsigned char simbabg_cmap[], simbabg_cmap_end[];
13 extern uint16_t simbabg_tmap[], simbabg_tmap_end[];
14 extern uint16_t simbafg_data[], simbafg_data_end[];
15 extern unsigned char simbafg_cmap[], simbafg_cmap_end[];
16 extern uint16_t simbafg_tmap[], simbafg_tmap_end[];
17
18 static short scroll;
19
20 void simba_init(void)
21 {
22         uint16_t *src;
23
24         /* upload tiles */
25         src = simbabg_data;
26         vdp_setup_addr(VDP_VRAM, BGTILES_OFFS * 32);    /* start from tile 1 32 bytes on */
27         while(src < simbabg_data_end) {
28                 VDP_DATA = *src++;
29         }
30
31         src = simbafg_data;
32         vdp_setup_addr(VDP_VRAM, FGTILES_OFFS * 32);
33         while(src < simbafg_data_end) {
34                 VDP_DATA = *src++;
35         }
36 }
37
38 void simba_start(void)
39 {
40         int i;
41         uint16_t *src;
42         unsigned char *cptr;
43
44         /* setup tilemaps */
45         src = simbafg_tmap;
46         vdp_setup_addr(VDP_VRAM, 0xc000);       /* nametable A */
47         while(src < simbafg_tmap_end) {
48                 VDP_DATA = VDP_TILENAME(*src++ + FGTILES_OFFS, 3, 0);
49         }
50         src = simbabg_tmap;
51         vdp_setup_addr(VDP_VRAM, 0xe000);       /* nametable B */
52         while(src < simbabg_tmap_end) {
53                 VDP_DATA = VDP_TILENAME(*src++ + BGTILES_OFFS, 2, 0);
54         }
55
56         /* setup colormaps */
57         cptr = simbabg_cmap;
58         for(i=0; i<16; i++) {
59                 vdp_setcolor(2, i, cptr[0] >> 4, cptr[1] >> 4, cptr[2] >> 4);
60                 cptr += 3;
61         }
62         cptr = simbafg_cmap;
63         for(i=0; i<16; i++) {
64                 vdp_setcolor(3, i, cptr[0] >> 4, cptr[1] >> 4, cptr[2] >> 4);
65                 cptr += 3;
66         }
67
68         /* set scrolling to whole screen */
69         vdp_setreg(VDP_REG_MODE3, 0);
70         scroll = 0;
71         vdp_setup_addr(VDP_VRAM, 0xf000);       /* hscroll table is at f000, see vdp.S */
72         VDP_DATA = 0;
73         VDP_DATA = 0;
74 }
75
76 void simba_update(void)
77 {
78         if(bnstate & PAD_LEFT) {
79                 if(scroll < 0) scroll++;
80         } else if(bnstate & PAD_RIGHT) {
81                 if(scroll > -192) scroll--;
82         }
83         dbgval[0] = scroll;
84 }
85
86 void simba_vblank(void)
87 {
88         vdp_setup_addr(VDP_VRAM, 0xf000);       /* hscroll table is at f000, see vdp.S */
89         VDP_DATA = scroll;
90         VDP_DATA = scroll >> 1;
91 }