From a8e0c141b0184d629504b9f0ee8dbc4fefb90934 Mon Sep 17 00:00:00 2001 From: Peter Fors Date: Sat, 24 May 2025 15:45:54 +0200 Subject: 3011fps --- mknes.c | 61 ++++++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 19 deletions(-) (limited to 'mknes.c') diff --git a/mknes.c b/mknes.c index 7220450..9e87a33 100644 --- a/mknes.c +++ b/mknes.c @@ -8,6 +8,8 @@ #include #include +#define printf(...) + #define BUFFER_WIDTH 256 #define BUFFER_HEIGHT 240 #define WINDOW_WIDTH 320 * 3 @@ -105,7 +107,7 @@ static uint32_t frames; // debug information #include "callbacks.c" -struct nes_state nstate; +// struct nes_state nstate; int main(int argc, char **argv) { #ifdef _WIN32 @@ -118,13 +120,17 @@ int main(int argc, char **argv) { init_opcode_lut(); init_opcode_ud_lut(); // protect_opcode_lut(); - ppu_reset(&nstate); + + struct nes_state *nstate = aligned_alloc(4096, (sizeof(struct nes_state) + 4095) & ~4096); + + + ppu_reset(nstate); // ines2_load(&nstate, "data/0000/10-Yard Fight (USA, Europe).nes"); // ines2_load(&nstate, "data/0000/Balloon Fight (USA).nes"); // ines2_load(&nstate, "data/0000/Excitebike (Japan, USA).nes"); // ines2_load(&nstate, "data/0000/Ice Climber (USA, Europe, Korea).nes"); // ines2_load(&nstate, "data/0000/Kung Fu (Japan, USA).nes"); - ines2_load(&nstate, "data/0000/Super Mario Bros. (World) (HVC-SM).nes"); + ines2_load(nstate, "data/0000/Super Mario Bros. (World) (HVC-SM).nes"); // ines2_load(&nstate, "data/Super Mario Bros. (W) (V1.0) [!].nes"); // ines2_load(&nstate, "data/Super Mario Bros. (JU) [!].nes"); // ines2_load(&nstate, "data/0000/Urban Champion (World).nes"); @@ -146,13 +152,13 @@ int main(int argc, char **argv) { // ines2_load(&nstate, "data/0000/Xevious - The Avenger (USA).zip"); // ines2_load(&nstate, "data/tv.nes"); - ines2_load(&nstate, "data/Life Force (USA).zip"); // 2002 + // ines2_load(&nstate, "data/Life Force (USA).zip"); // 2002 // ines2_load(&nstate, "data/0003/Flipull - An Exciting Cube Game (Japan) (En).zip"); // ines2_load(&nstate, "data/0003/Friday the 13th (USA).zip"); // ines2_load(&nstate, "data/0003/Ghostbusters (Japan).zip"); // ines2_load(&nstate, "data/0003/Gradius (USA).zip"); - // ines2_load(&nstate, "data/0007/Battletoads (USA).zip"); + // ines2_load(nstate, "data/0007/Battletoads (USA).zip"); // ines2_load(&nstate, "data/0007/Beetlejuice (USA).zip"); // ines2_load(&nstate, "data/0007/Cabal (USA).zip"); @@ -167,22 +173,22 @@ int main(int argc, char **argv) { // ines2_load(&nstate, "data/Blaster Master (USA).zip"); - mapper_setup(&nstate); - uint32_t lo = nstate.mapper.prg_read(&nstate, 0xfffc); - uint32_t hi = nstate.mapper.prg_read(&nstate, 0xfffd); - nstate.cpu.pc = (hi << 8) | lo; + mapper_setup(nstate); + uint32_t lo = nstate->mapper.prg_read(nstate, 0xfffc); + uint32_t hi = nstate->mapper.prg_read(nstate, 0xfffd); + nstate->cpu.pc = (hi << 8) | lo; #if 1 for(uint32_t i = 0; i < 0x5000; ++ i) { - while(!nstate.ppu.frame_ready) { + while(!nstate->ppu.frame_ready) { // PROFILE_NAMED("nes emulator"); - cpu_tick(&nstate); + cpu_tick(nstate); } - nstate.ppu.frame_ready = 0; + nstate->ppu.frame_ready = 0; frames++; } return 0; -#endif +#else struct timer_handle *timer = timer_new(FRAME_INTERVAL_NS); if(!timer) { @@ -198,10 +204,12 @@ int main(int argc, char **argv) { window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "NES Emulator", 0, 0); if(window) { - glfwSetWindowUserPointer(window, (void*)&nstate); + glfwSetWindowUserPointer(window, (void*)nstate); glfwSetWindowAspectRatio(window, 320, 240); // Need to set a 4:3 resolution for things to look correct! glfwSetWindowSizeLimits(window, WINDOW_WIDTH, WINDOW_HEIGHT, GLFW_DONT_CARE, GLFW_DONT_CARE); + glfwSetInputMode(window, GLFW_STICKY_KEYS, GLFW_TRUE); + glfwMakeContextCurrent(window); opengl_setup(); glfwSetKeyCallback(window, key_callback); @@ -226,15 +234,28 @@ int main(int argc, char **argv) { timer_wait(timer); glfwPollEvents(); - while(!nstate.ppu.frame_ready) { + uint8_t input = 0; + + if(glfwGetKey(window, GLFW_KEY_X) == GLFW_PRESS) { input |= (1 << 0); } + if(glfwGetKey(window, GLFW_KEY_Z) == GLFW_PRESS) { input |= (1 << 1); } + if(glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) { input |= (1 << 2); } + if(glfwGetKey(window, GLFW_KEY_ENTER) == GLFW_PRESS) { input |= (1 << 3); } + if(glfwGetKey(window, GLFW_KEY_UP) == GLFW_PRESS) { input |= (1 << 4); } + if(glfwGetKey(window, GLFW_KEY_DOWN) == GLFW_PRESS) { input |= (1 << 5); } + if(glfwGetKey(window, GLFW_KEY_LEFT) == GLFW_PRESS) { input |= (1 << 6); } + if(glfwGetKey(window, GLFW_KEY_RIGHT) == GLFW_PRESS) { input |= (1 << 7); } + + nstate->ppu.input[0] = input; + + while(!nstate->ppu.frame_ready) { // PROFILE_NAMED("nes emulator"); - cpu_tick(&nstate); + cpu_tick(nstate); } - nstate.ppu.frame_ready = 0; + nstate->ppu.frame_ready = 0; frames++; uint32_t * restrict dst = display_buffer; //buffer; - uint8_t * restrict src = nstate.pixels; + uint8_t * restrict src = nstate->pixels; for(uint32_t y = 0; y < 240; ++y) { for(uint32_t x = 0; x < 256; ++x) { uint8_t val = *src++; @@ -248,7 +269,7 @@ int main(int argc, char **argv) { glfwSwapBuffers(window); } - printf("total frames: %6.6d total cycles: %ld\n", frames, nstate.cpu.cycles); + printf("total frames: %6.6d total cycles: %ld\n", frames, nstate->cpu.cycles); glfwDestroyWindow(window); } else { @@ -261,6 +282,8 @@ int main(int argc, char **argv) { } timer_destroy(timer); // free_nes_state(&nstate); +#endif + #ifdef _WIN32 timeEndPeriod(1); #endif -- cgit v1.2.3