per-line scrolling test
[mdlife] / src / part_mitosis.c
1 #include <stdio.h>
2 #include "vdp.h"
3 #include "demo.h"
4 #include "pad.h"
5 #include "parts.h"
6 #include "debug.h"
7
8
9 #define FTILES_OFFS             256
10
11 extern uint16_t floor_data[], floor_data_end[];
12 extern unsigned char floor_cmap[], floor_cmap_end[];
13 extern uint16_t floor_tmap[], floor_tmap_end[];
14
15 static short scroll;
16
17 void mitosis_init(void)
18 {
19         uint16_t *src;
20
21         src = floor_data;
22         vdp_setup_addr(VDP_VRAM, FTILES_OFFS * 32);
23         while(src < floor_data_end) {
24                 VDP_DATA = *src++;
25         }
26 }
27
28 void mitosis_start(void)
29 {
30         int i;
31         uint16_t *src;
32         unsigned char *cptr;
33
34         /* setup tilemap */
35         src = floor_tmap;
36         vdp_setup_addr(VDP_VRAM, 0xc000);
37         while(src < floor_tmap_end) {
38                 VDP_DATA = VDP_TILENAME(*src++ + FTILES_OFFS, 3, 0);
39         }
40
41         /* setup colormap */
42         cptr = floor_cmap;
43         for(i=0; i<16; i++) {
44                 vdp_setcolor(3, i, cptr[0] >> 4, cptr[1] >> 4, cptr[2] >> 4);
45                 cptr += 3;
46         }
47
48         vdp_setreg(VDP_REG_MODE3, VDP_M3_HLINE);
49         scroll = 0;
50 }
51
52 static int16_t scrolltab[96];
53
54 void mitosis_update(void)
55 {
56         short i, dir;
57         int16_t delta;
58
59         if(bnstate & PAD_LEFT) {
60                 dir = -1;
61         } else if(bnstate & PAD_RIGHT) {
62                 dir = 1;
63         } else {
64                 dir = 0;
65         }
66
67         if(dir) {
68                 for(i=0; i<96; i++) {
69                         delta = ((96 - i) + 64) << 1;
70                         if(dir > 0) {
71                                 scrolltab[i] += delta;
72                         } else {
73                                 scrolltab[i] -= delta;
74                         }
75                 }
76         }
77
78         dbgval[0] = scrolltab[0];
79 }
80
81 void mitosis_vblank(void)
82 {
83         short i;
84         uint16_t val;
85
86         vdp_setup_addr(VDP_VRAM, 0xf000);       /* hscroll table is at f000, see vdp.S */
87         for(i=0; i<96; i++) {
88                 val = 512 - (scrolltab[i] >> 8);
89                 VDP_DATA = val;
90                 VDP_DATA = val;
91         }
92 }
93