diff --git a/src/f6502.c b/src/f6502.c index 8a664b7..2a23007 100644 --- a/src/f6502.c +++ b/src/f6502.c @@ -39,7 +39,7 @@ static inline uint8_t f6502_read(nes_Memory* mem, return mem->ram[addr]; #else if (addr >= 0x8000U) { - return mem->rom_bank[(addr - 0x8000U) >> 13][addr & 0x1FFFFU]; + return mem->rom_bank[(addr - 0x8000U) >> 13][addr & 0x1FFFU]; } switch (addr & 0x6000U) { @@ -1548,5 +1548,6 @@ int f6502_step(f6502_Core* core, int clocks) { } */ clocks_elapsed += f6502_check_interrupts(core); - return (clocks_elapsed + f6502_do_step(core, clocks)); + return ( f6502_do_step(core, clocks - clocks_elapsed) + + clocks_elapsed); } diff --git a/src/nes.c b/src/nes.c index c511048..801c6e0 100644 --- a/src/nes.c +++ b/src/nes.c @@ -6,6 +6,14 @@ void nes_init(nes* sys) { f6502_init(&sys->core); + // TODO: Init PPU + // TODO: Init APU +} + +void nes_reset(nes* sys) { + f6502_reset(&sys->core); + // TODO: Reset PPU + // TODO: Reset APU } void nes_done(nes* sys) { @@ -15,7 +23,11 @@ void nes_done(nes* sys) { static int nes_vsync(nes* sys) { int status = 0; - // TODO: PPU Set VBlank flag + sys->core.memory.ppu.status |= ppu_Status_VBlank; + if (sys->core.memory.ppu.ctrl & ppu_Control_VBlank) { + f6502_set_NMI(&sys->core, 1); + } + // TODO: APU Sync // TODO: APU Frame IRQ @@ -25,8 +37,6 @@ static int nes_vsync(nes* sys) { status = nese_update_input(&sys->input); } - // TODO: NMI - return status; } @@ -56,6 +66,7 @@ static int nes_hsync(nes* sys) { switch (sys->ppu.scanline) { case nes_ppu_prerender_line: + f6502_set_NMI(&sys->core, 0); sys->core.memory.ppu.status &= ~( ppu_Status_VBlank | ppu_Status_Hit); nes_ppu_find_hit_line(&sys->ppu, &sys->core.memory.ppu); diff --git a/src/nes.h b/src/nes.h index 2c3b333..6887c7d 100644 --- a/src/nes.h +++ b/src/nes.h @@ -17,6 +17,7 @@ typedef struct { } nes; void nes_init(nes*); +void nes_reset(nes*); void nes_done(nes*); int nes_loop(nes*); diff --git a/src/nese.c b/src/nese.c index 057e6c7..d1a8a2a 100644 --- a/src/nese.c +++ b/src/nese.c @@ -39,6 +39,8 @@ int nese_start(nes* sys, const char* filename) { nes_init(sys); + nes_reset(sys); + nes_loop(sys); if (cart_data) nese_unmap_file(cart_data, filesize);