per-line scrolling test
[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 = 256;
71 }
72
73 void simba_update(void)
74 {
75         if(bnstate & PAD_LEFT) {
76                 if(scroll > 256) scroll--;
77         } else if(bnstate & PAD_RIGHT) {
78                 if(scroll < 704) scroll++;
79         }
80         dbgval[0] = scroll;
81 }
82
83 void simba_vblank(void)
84 {
85         vdp_setup_addr(VDP_VRAM, 0xf000);       /* hscroll table is at f000, see vdp.S */
86         if(scroll < 512) {
87                 VDP_DATA = 0;
88         } else {
89                 VDP_DATA = 1024 - scroll;
90         }
91         VDP_DATA = 512 - (scroll >> 1);
92 }