|
|
|
@@ -76,26 +76,23 @@ void nes_reset(nes* sys) { |
|
|
|
nes_apu_reset(&sys->apu); |
|
|
|
} |
|
|
|
|
|
|
|
nes_ppu_Result nes_run(nes* sys, int master_cycles, int* run) { |
|
|
|
int cpu_run = 0; |
|
|
|
int cpu_cycles = (master_cycles + (nes_clock_cpu_div - 1)) / |
|
|
|
nes_clock_cpu_div; |
|
|
|
int status = e6502_run(&sys->cpu, cpu_cycles, &cpu_run, 0); |
|
|
|
|
|
|
|
master_cycles = cpu_run * nes_clock_cpu_div; |
|
|
|
int ppu_cycles = master_cycles / nes_clock_ppu_div; |
|
|
|
nes_ppu_Result result = nes_ppu_run(&sys->ppu, ppu_cycles); |
|
|
|
|
|
|
|
if (result == ppu_Result_VBlank_On) { |
|
|
|
e6502_set_nmi(&sys->cpu, 1); |
|
|
|
} else if (result == ppu_Result_VBlank_Off) { |
|
|
|
e6502_set_nmi(&sys->cpu, 0); |
|
|
|
} |
|
|
|
nes_ppu_Result nes_step(nes* sys, int* run) { |
|
|
|
nes_ppu_Result result = ppu_Result_Halt; |
|
|
|
|
|
|
|
int cpu_run = e6502_step(&sys->cpu); |
|
|
|
|
|
|
|
if (run) *run = master_cycles; |
|
|
|
if (cpu_run > 0) { |
|
|
|
int master_cycles = cpu_run * nes_clock_cpu_div; |
|
|
|
int ppu_cycles = master_cycles / nes_clock_ppu_div; |
|
|
|
result = nes_ppu_run(&sys->ppu, ppu_cycles); |
|
|
|
|
|
|
|
if (result == ppu_Result_VBlank_On) { |
|
|
|
e6502_set_nmi(&sys->cpu, 1); |
|
|
|
} else if (result == ppu_Result_VBlank_Off) { |
|
|
|
e6502_set_nmi(&sys->cpu, 0); |
|
|
|
} |
|
|
|
|
|
|
|
if (status < 0) { |
|
|
|
result = ppu_Result_Halt; |
|
|
|
if (run) *run = master_cycles; |
|
|
|
} |
|
|
|
|
|
|
|
return result; |
|
|
|
|