--- /dev/null
+#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;
+ }
+}
+