diff options
| author | Peter Fors <peter.fors@mindkiller.com> | 2025-04-05 20:26:45 +0200 |
|---|---|---|
| committer | Peter Fors <peter.fors@mindkiller.com> | 2025-04-05 20:26:45 +0200 |
| commit | dabd7a5848e6aa55e91cf4c804f6236b4f7fe30e (patch) | |
| tree | cbde04c65735fb8ecf3e9d433172c942f7bb63db /mknes.c | |
| parent | 8573fb74da28b89f52c168c7f10ddbcaf5858532 (diff) | |
everything working, 2285 fps
Diffstat (limited to 'mknes.c')
| -rw-r--r-- | mknes.c | 112 |
1 files changed, 78 insertions, 34 deletions
@@ -100,45 +100,88 @@ struct nes_state nstate; static uint32_t frames; + +#define PRG_ROM_SIZE (512 * 1024) +#define CHR_ROM_SIZE (512 * 1024) +#define PIXELS_SIZE (256 * 240) +#define RAM_SIZE 0x800 +#define SRAM_SIZE 0x2000 +#define CIRAM_SIZE 0x1000 + +static struct nes_state *allocate_nes_state(void) { + struct nes_state *state = (struct nes_state*)calloc(1, sizeof(struct nes_state)); + if(!state) return 0; + + size_t total_size = (PRG_ROM_SIZE + CHR_ROM_SIZE + PIXELS_SIZE + RAM_SIZE + SRAM_SIZE + CIRAM_SIZE + 4095) & ~0xfff; + + uint8_t *m = (uint8_t*)aligned_alloc(4096, total_size); + memset(m, 0, total_size); + + size_t offset = 0; + + state->prg_rom = m + offset; + offset += PRG_ROM_SIZE; + + state->chr_rom = m + offset; + offset += CHR_ROM_SIZE; + + state->pixels = m + offset; + offset += PIXELS_SIZE; + + state->ram = m + offset; + offset += RAM_SIZE; + + state->sram = m + offset; + offset += SRAM_SIZE; + + state->ciram = m + offset; + offset += CIRAM_SIZE; + + return state; +} + + int main(int argc, char **argv) { #ifdef _WIN32 timeBeginPeriod(1); #endif + struct nes_state *nstate = allocate_nes_state(); + state.toggle_crt_emulation = 1; setbuf(stdout, 0); init_opcode_lut(); init_opcode_ud_lut(); // protect_opcode_lut(); - ppu_reset(&nstate); - // ines2_load(&nstate, "data/nrom/10-Yard Fight (USA, Europe).nes"); - // ines2_load(&nstate, "data/nrom/Balloon Fight (USA).nes"); - // ines2_load(&nstate, "data/nrom/Excitebike (Japan, USA).nes"); - // ines2_load(&nstate, "data/nrom/Ice Climber (USA, Europe, Korea).nes"); - // ines2_load(&nstate, "data/nrom/Kung Fu (Japan, USA).nes"); - ines2_load(&nstate, "data/nrom/Super Mario Bros. (World) (HVC-SM).nes"); - // ines2_load(&nstate, "data/nrom/Urban Champion (World).nes"); - // ines2_load(&nstate, "data/nrom/Wrecking Crew (World).nes"); - // ines2_load(&nstate, "data/nrom/scanline.nes"); - // ines2_load(&nstate, "data/nrom/Sayoonara!.NES"); - // ines2_load(&nstate, "data/nrom/raster_demos/RasterChromaLuma.NES"); - // ines2_load(&nstate, "data/nrom/raster_demos/RasterTest1.NES"); - // ines2_load(&nstate, "data/nrom/raster_demos/RasterTest2.NES"); - // ines2_load(&nstate, "data/nrom/raster_demos/RasterTest3.NES"); - // ines2_load(&nstate, "data/nrom/raster_demos/RasterTest3a.NES"); - // ines2_load(&nstate, "data/nrom/raster_demos/RasterTest3b.NES"); - // ines2_load(&nstate, "data/nrom/raster_demos/RasterTest3c.NES"); - // ines2_load(&nstate, "data/nrom/raster_demos/RasterTest3d.NES"); - // ines2_load(&nstate, "data/nrom/raster_demos/RasterTest3e.NES"); - // ines2_load(&nstate, "data/nrom/NEStress.NES"); - // ines2_load(&nstate, "data/tv.nes"); - // ines2_load(&nstate, "data/Super Mario Bros. (World) (HVC-SM).zip"); - // ines2_load(&nstate, "data/Super Mario Bros. + Duck Hunt (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; + ppu_reset(nstate); + // ines2_load(nstate, "data/nrom/10-Yard Fight (USA, Europe).nes"); + // ines2_load(nstate, "data/nrom/Balloon Fight (USA).nes"); + // ines2_load(nstate, "data/nrom/Excitebike (Japan, USA).nes"); + // ines2_load(nstate, "data/nrom/Ice Climber (USA, Europe, Korea).nes"); + // ines2_load(nstate, "data/nrom/Kung Fu (Japan, USA).nes"); + ines2_load(nstate, "data/nrom/Super Mario Bros. (World) (HVC-SM).nes"); + // ines2_load(nstate, "data/nrom/Urban Champion (World).nes"); + // ines2_load(nstate, "data/nrom/Wrecking Crew (World).nes"); + // ines2_load(nstate, "data/nrom/scanline.nes"); + // ines2_load(nstate, "data/nrom/Sayoonara!.NES"); + // ines2_load(nstate, "data/nrom/raster_demos/RasterChromaLuma.NES"); + // ines2_load(nstate, "data/nrom/raster_demos/RasterTest1.NES"); + // ines2_load(nstate, "data/nrom/raster_demos/RasterTest2.NES"); + // ines2_load(nstate, "data/nrom/raster_demos/RasterTest3.NES"); + // ines2_load(nstate, "data/nrom/raster_demos/RasterTest3a.NES"); + // ines2_load(nstate, "data/nrom/raster_demos/RasterTest3b.NES"); + // ines2_load(nstate, "data/nrom/raster_demos/RasterTest3c.NES"); + // ines2_load(nstate, "data/nrom/raster_demos/RasterTest3d.NES"); + // ines2_load(nstate, "data/nrom/raster_demos/RasterTest3e.NES"); + // ines2_load(nstate, "data/nrom/NEStress.NES"); + // ines2_load(nstate, "data/tv.nes"); + // ines2_load(nstate, "data/Super Mario Bros. (World) (HVC-SM).zip"); + // ines2_load(nstate, "data/Super Mario Bros. + Duck Hunt (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; struct timer_handle *timer = timer_new(FRAME_INTERVAL_NS); if(!timer) { @@ -178,19 +221,20 @@ int main(int argc, char **argv) { timer_start(timer); while(!glfwWindowShouldClose(window)) { + // for(uint32_t i = 0; i < 0x5000; ++ i) { timer_wait(timer); glfwPollEvents(); // // - 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++; uint32_t * restrict dst = buffer; - uint8_t * restrict src = nstate.ppu.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++; @@ -203,7 +247,7 @@ int main(int argc, char **argv) { render_frame(); glfwSwapBuffers(window); } -printf("total frames: %6.6d total cycles: %ld\n", frames, nstate.cycles); +printf("total frames: %6.6d total cycles: %ld\n", frames, nstate->cycles); glfwDestroyWindow(window); } else { fprintf(stderr, "Failed to create window\n"); |
