per-line scrolling test
[mdlife] / src / main.c
index 9b02e61..a48d881 100644 (file)
@@ -1,38 +1,77 @@
 #include <stdio.h>
 #include "z80.h"
 #include "vdp.h"
+#include "pad.h"
 #include "sprite.h"
+#include "parts.h"
 #include "debug.h"
 
-#define SPRITE_BASE            0x8000
-extern uint16_t cellspr_data[], cellspr_data_end[];
+uint32_t frameno;
+uint32_t dbgval[4];
+
+struct part parts[3];
+static struct part *part;
+
 
 int main(void)
 {
-       uint16_t *src;
-       int tile;
+       int i;
+       static unsigned short bnprev;
 
        z80_init();
        vdp_init();
+       pad_init();
        dbg_init();
 
-       vdp_setcolor(0, 0, 2, 2, 2);
-       vdp_setcolor(0, 15, 15, 15, 15);
+       dna_init();
+       mitosis_init();
+       simba_init();
 
-       /* upload sprite tiles */
-       src = cellspr_data;
-       vdp_setup_addr(VDP_VRAM, SPRITE_BASE);
-       while(src < cellspr_data_end) {
-               VDP_DATA = *src++;
-       }
+       parts[0].start = dna_start;
+       parts[0].update = dna_update;
+       parts[1].start = mitosis_start;
+       parts[1].update = mitosis_update;
+       parts[1].vblank = mitosis_vblank;
+       parts[2].start = simba_start;
+       parts[2].update = simba_update;
+       parts[2].vblank = simba_vblank;
+       part = parts;
+
+       part->start();
 
        for(;;) {
+               unsigned char val;
+               z80_grab_bus();
+               while(!z80_have_bus());
+               val = Z80_MEM[0x1ffc];
+               dbgval[3] = (uint32_t)val << 8;
+               val = Z80_MEM[0x1ffd];
+               dbgval[3] |= val;
+               z80_release_bus();
+
+               dbg_setcursor(32, 0);
+               for(i=0; i<4; i++) {
+                       printf("%04x\n", (unsigned int)dbgval[i]);
+               }
                spr_begin();
-               tile = SPRITE_BASE / 32 + 2;
-               spr_add(160, 100, VDP_TILENAME(tile, 0, VDP_TILE_FG), SPR_SIZE(1,1));
+
+               part->update();
 
                vdp_wait_vblank();
+               if(part->vblank) part->vblank();
                spr_submit();
+               bnstate = pad_read(0);
+               bndiff = bnstate ^ bnprev;
+               bnprev = bnstate;
+
+               if(bndiff & bnstate & PAD_START) {
+                       if(++part >= parts + 3) {
+                               part = parts;
+                       }
+                       part->start();
+               }
+
+               frameno++;
        }
 
        return 0;