a10e5fd84a8145449ff6bbe6b038fd32b0d4164c
[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
7 extern uint16_t simbabg_data[], simbabg_data_end[];
8 extern unsigned char simbabg_cmap[], simbabg_cmap_end[];
9 extern uint16_t simbabg_tmap[], simbabg_tmap_end[];
10
11 static int scroll;
12
13 void simba_init(void)
14 {
15         uint16_t *src;
16
17         /* upload tiles */
18         src = simbabg_data;
19         vdp_setup_addr(VDP_VRAM, 32);   /* start from tile 1 32 bytes on */
20         while(src < simbabg_data_end) {
21                 VDP_DATA = *src++;
22         }
23 }
24
25 void simba_start(void)
26 {
27         int i;
28         uint16_t *src;
29         unsigned char *cptr;
30
31         /* setup tilemaps */
32         src = simbabg_tmap;
33         vdp_setup_addr(VDP_VRAM, 0xe000);       /* nametable B */
34         while(src < simbabg_tmap_end) {
35                 VDP_DATA = VDP_TILENAME(*src++ + 1, 2, 0);
36         }
37
38         /* setup colormaps */
39         cptr = simbabg_cmap;
40         for(i=0; i<16; i++) {
41                 vdp_setcolor(2, i, cptr[0] >> 4, cptr[1] >> 4, cptr[2] >> 4);
42                 cptr += 3;
43         }
44
45         /* set scrolling to whole screen */
46         vdp_setreg(VDP_REG_MODE3, 0);
47 }
48
49 void simba_update(void)
50 {
51         if(bnstate & PAD_LEFT) {
52                 if(scroll > 0) scroll--;
53         } else if(bnstate & PAD_RIGHT) {
54                 if(scroll < 511) scroll++;
55         }
56 }
57
58 void simba_vblank(void)
59 {
60         vdp_setup_addr(VDP_VRAM, 0xf000);       /* hscroll table is at f000, see vdp.S */
61         VDP_DATA = 0;
62         VDP_DATA = scroll;
63 }