Browse Source

Use single-step CPU call for 17% performance boost

master
Nathaniel Walizer 11 months ago
parent
commit
f0d45e9680
4 changed files with 19 additions and 22 deletions
  1. +2
    -2
      Makefile
  2. +15
    -18
      src/nes.c
  3. +1
    -1
      src/nes.h
  4. +1
    -1
      src/nese.c

+ 2
- 2
Makefile View File

@@ -1,7 +1,7 @@
CC = gcc
LD = $(CC)
PFLAGS = -g
#PFLAGS = -O3
#PFLAGS = -pg
PFLAGS += -O3
#PFLAGS += -DDEBUG_MAPPER
#PFLAGS += -DDEBUG_RENDER
#PFLAGS += -DDEBUG_PPU -DDEBUG_VRAM -DDEBUG_OAM


+ 15
- 18
src/nes.c View File

@@ -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;


+ 1
- 1
src/nes.h View File

@@ -59,7 +59,7 @@ int nes_init(nes*);

void nes_reset(nes*);

nes_ppu_Result nes_run(nes*, int cycles, int* run);
nes_ppu_Result nes_step(nes*, int* run);


#endif // NES_H_

+ 1
- 1
src/nese.c View File

@@ -97,7 +97,7 @@ int main(int argc, char* argv[]) {
// int last_frame_rendered = -1;
for (int i = 0; i < n_loops && status == 0; ++i) {
int run = 0;
nes_ppu_Result result = nes_run(&sys, 1U, &run);
nes_ppu_Result result = nes_step(&sys, &run);
total_cycles += run;
/*
float us_run = ( run * 1000. * 1000. *


Loading…
Cancel
Save