per-line scrolling test
[mdlife] / src / part_mitosis.c
diff --git a/src/part_mitosis.c b/src/part_mitosis.c
new file mode 100644 (file)
index 0000000..9fdc2eb
--- /dev/null
@@ -0,0 +1,93 @@
+#include <stdio.h>
+#include "vdp.h"
+#include "demo.h"
+#include "pad.h"
+#include "parts.h"
+#include "debug.h"
+
+
+#define FTILES_OFFS            256
+
+extern uint16_t floor_data[], floor_data_end[];
+extern unsigned char floor_cmap[], floor_cmap_end[];
+extern uint16_t floor_tmap[], floor_tmap_end[];
+
+static short scroll;
+
+void mitosis_init(void)
+{
+       uint16_t *src;
+
+       src = floor_data;
+       vdp_setup_addr(VDP_VRAM, FTILES_OFFS * 32);
+       while(src < floor_data_end) {
+               VDP_DATA = *src++;
+       }
+}
+
+void mitosis_start(void)
+{
+       int i;
+       uint16_t *src;
+       unsigned char *cptr;
+
+       /* setup tilemap */
+       src = floor_tmap;
+       vdp_setup_addr(VDP_VRAM, 0xc000);
+       while(src < floor_tmap_end) {
+               VDP_DATA = VDP_TILENAME(*src++ + FTILES_OFFS, 3, 0);
+       }
+
+       /* setup colormap */
+       cptr = floor_cmap;
+       for(i=0; i<16; i++) {
+               vdp_setcolor(3, i, cptr[0] >> 4, cptr[1] >> 4, cptr[2] >> 4);
+               cptr += 3;
+       }
+
+       vdp_setreg(VDP_REG_MODE3, VDP_M3_HLINE);
+       scroll = 0;
+}
+
+static int16_t scrolltab[96];
+
+void mitosis_update(void)
+{
+       short i, dir;
+       int16_t delta;
+
+       if(bnstate & PAD_LEFT) {
+               dir = -1;
+       } else if(bnstate & PAD_RIGHT) {
+               dir = 1;
+       } else {
+               dir = 0;
+       }
+
+       if(dir) {
+               for(i=0; i<96; i++) {
+                       delta = ((96 - i) + 64) << 1;
+                       if(dir > 0) {
+                               scrolltab[i] += delta;
+                       } else {
+                               scrolltab[i] -= delta;
+                       }
+               }
+       }
+
+       dbgval[0] = scrolltab[0];
+}
+
+void mitosis_vblank(void)
+{
+       short i;
+       uint16_t val;
+
+       vdp_setup_addr(VDP_VRAM, 0xf000);       /* hscroll table is at f000, see vdp.S */
+       for(i=0; i<96; i++) {
+               val = 512 - (scrolltab[i] >> 8);
+               VDP_DATA = val;
+               VDP_DATA = val;
+       }
+}
+