瀏覽代碼

Use single-step CPU call for 17% performance boost

master
Nathaniel Walizer 11 月之前
父節點
當前提交
f0d45e9680
共有 4 個檔案被更改,包括 19 行新增22 行删除
  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 查看文件

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


+ 15
- 18
src/nes.c 查看文件

@@ -76,26 +76,23 @@ void nes_reset(nes* sys) {
nes_apu_reset(&sys->apu); 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; return result;


+ 1
- 1
src/nes.h 查看文件

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


void nes_reset(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_ #endif // NES_H_

+ 1
- 1
src/nese.c 查看文件

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


Loading…
取消
儲存