#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, i;
+ int i;
+ static unsigned short bnprev;
z80_init();
vdp_init();
+ pad_init();
dbg_init();
- for(i=0; i<16; i++) {
- vdp_setcolor(0, i, i, i, i);
- }
+ 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;
- dbg_setcursor(0, 0);
- printf("xyzzy");
+ 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("%08x\n", (unsigned int)dbgval[i]);
+ printf("%04x\n", (unsigned int)dbgval[i]);
}
spr_begin();
- tile = VDP_ADDR2TILE(SPRITE_BASE);
- spr_add(160, 50, VDP_TILENAME(tile, 0, VDP_TILE_FG), SPR_SIZE(1,1));
- tile++;
- spr_add(160, 60, VDP_TILENAME(tile, 0, VDP_TILE_FG), SPR_SIZE(1,1));
- tile++;
- spr_add(160, 75, VDP_TILENAME(tile, 0, VDP_TILE_FG), SPR_SIZE(1,1));
- tile++;
- spr_add(156, 90, VDP_TILENAME(tile, 0, VDP_TILE_FG), SPR_SIZE(1,1));
- spr_add(164, 90, VDP_TILENAME(tile, 0, VDP_TILE_FG | VDP_TILE_HFLIP), SPR_SIZE(1,1));
- spr_add(156, 98, VDP_TILENAME(tile, 0, VDP_TILE_FG | VDP_TILE_VFLIP), SPR_SIZE(1,1));
- spr_add(164, 98, VDP_TILENAME(tile, 0, VDP_TILE_FG | VDP_TILE_HVFLIP), SPR_SIZE(1,1));
- tile++;
- spr_add(148, 120, VDP_TILENAME(tile, 0, VDP_TILE_FG), SPR_SIZE(2, 2));
- spr_add(164, 120, VDP_TILENAME(tile, 0, VDP_TILE_FG | VDP_TILE_HFLIP), SPR_SIZE(2, 2));
- spr_add(148, 136, VDP_TILENAME(tile, 0, VDP_TILE_FG | VDP_TILE_VFLIP), SPR_SIZE(2, 2));
- spr_add(164, 136, VDP_TILENAME(tile, 0, VDP_TILE_FG | VDP_TILE_HVFLIP), SPR_SIZE(2, 2));
+
+ 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;