diff options
Diffstat (limited to 'mknes.c')
| -rw-r--r-- | mknes.c | 139 |
1 files changed, 72 insertions, 67 deletions
@@ -67,10 +67,7 @@ struct main_state state; uint32_t buffer[BUFFER_WIDTH * BUFFER_HEIGHT] __attribute__((section(".bss"), aligned(4096))); uint32_t display_buffer[BUFFER_WIDTH * BUFFER_HEIGHT] __attribute__((section(".bss"), aligned(4096))); -void audio_callback(int16_t *data, size_t frames) { - -} - +static void audio_callback(int16_t *data, size_t frames) { } #define FRAME_INTERVAL_NS (1000000000ULL / 60.0988) @@ -84,7 +81,6 @@ static GLFWwindow *window; #include "opengl.c" #include "render.c" -#include "callbacks.c" // NES core #include "mapper.h" @@ -96,6 +92,7 @@ static GLFWwindow *window; #include "ines2.c" #include "mapper.c" +#include "callbacks.c" struct nes_state nstate; static uint32_t frames; @@ -103,40 +100,29 @@ static uint32_t frames; #define PRG_ROM_SIZE (512 * 1024) #define CHR_ROM_SIZE (512 * 1024) -#define PIXELS_SIZE (256 * 240) +#define PIXELS_SIZE (256 * 240) #define RAM_SIZE 0x800 #define SRAM_SIZE 0x2000 -#define CIRAM_SIZE 0x1000 +#define CIRAM_SIZE 0x1000 +#define CHR_RAM_SIZE 0x4000 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; + size_t total_size = (PRG_ROM_SIZE + CHR_ROM_SIZE + PIXELS_SIZE + RAM_SIZE + SRAM_SIZE + CIRAM_SIZE + CHR_RAM_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; - + 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; + state->chr_ram = m + offset; offset += CHR_RAM_SIZE; return state; } @@ -154,29 +140,46 @@ int main(int argc, char **argv) { 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/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/Urban Champion (World).nes"); + // ines2_load(nstate, "data/0000/Wrecking Crew (World).nes"); + // ines2_load(nstate, "data/0000/scanline.nes"); + // ines2_load(nstate, "data/0000/Sayoonara!.NES"); + // ines2_load(nstate, "data/0000/raster_demos/RasterChromaLuma.NES"); + // ines2_load(nstate, "data/0000/raster_demos/RasterTest1.NES"); + // ines2_load(nstate, "data/0000/raster_demos/RasterTest2.NES"); + // ines2_load(nstate, "data/0000/raster_demos/RasterTest3.NES"); + // ines2_load(nstate, "data/0000/raster_demos/RasterTest3a.NES"); + // ines2_load(nstate, "data/0000/raster_demos/RasterTest3b.NES"); + // ines2_load(nstate, "data/0000/raster_demos/RasterTest3c.NES"); + // ines2_load(nstate, "data/0000/raster_demos/RasterTest3d.NES"); + // ines2_load(nstate, "data/0000/raster_demos/RasterTest3e.NES"); + // ines2_load(nstate, "data/0000/NEStress.NES"); + // ines2_load(nstate, "data/0000/Super Mario Bros. (World) (HVC-SM).zip"); + // ines2_load(nstate, "data/0042/Super Mario Bros. + Duck Hunt (USA).zip"); + // ines2_load(nstate, "data/0000/Xevious - The Avenger (USA).zip"); // 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"); + + // 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/0007/Battletoads (USA).zip"); + // ines2_load(nstate, "data/0007/Beetlejuice (USA).zip"); + // ines2_load(nstate, "data/0007/Cabal (USA).zip"); + + // ines2_load(nstate, "data/000b/Baby Boomer (USA) (Unl).zip"); + // ines2_load(nstate, "data/000b/Captain Comic - The Adventure (USA) (Unl).zip"); + // ines2_load(nstate, "data/000b/King Neptune's Adventure (USA) (Unl).zip"); + + // ines2_load(nstate, "data/2002/Attack Animal Gakuen (Japan).zip"); + // ines2_load(nstate, "data/2002/Ballblazer (Japan).zip"); + // ines2_load(nstate, "data/2002/Best of the Best - Championship Karate (USA).zip"); mapper_setup(nstate); uint32_t lo = nstate->mapper.prg_read(nstate, 0xfffc); @@ -197,6 +200,7 @@ int main(int argc, char **argv) { window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "NES Emulator", 0, 0); if(window) { + glfwSetWindowUserPointer(window, (void*)nstate); glfwSetWindowAspectRatio(window, 320, 240); glfwSetWindowSizeLimits(window, 320*3, 240*3, GLFW_DONT_CARE, GLFW_DONT_CARE); @@ -208,6 +212,7 @@ int main(int argc, char **argv) { framebuffer_callback(window, WINDOW_WIDTH, WINDOW_HEIGHT); + for(int jid = GLFW_JOYSTICK_1; jid <= GLFW_JOYSTICK_LAST; jid++) { if(glfwJoystickPresent(jid)) { const char *name = glfwGetJoystickName(jid); @@ -216,14 +221,14 @@ int main(int argc, char **argv) { } } - set_decay(40); + set_decay(10); timer_start(timer); - while(!glfwWindowShouldClose(window)) { - // for(uint32_t i = 0; i < 0x5000; ++ i) { - timer_wait(timer); - glfwPollEvents(); + // while(!glfwWindowShouldClose(window)) { + for(uint32_t i = 0; i < 0x5000; ++ i) { + // timer_wait(timer); + // glfwPollEvents(); // // while(!nstate->ppu.frame_ready) { @@ -233,19 +238,19 @@ int main(int argc, char **argv) { nstate->ppu.frame_ready = 0; frames++; - uint32_t * restrict dst = buffer; - 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++; - if(val >= 64) val = 0; - dst[x] = nes_palette[val]; - } - dst += BUFFER_WIDTH; - } - apply_phosphor_decay(); - render_frame(); - glfwSwapBuffers(window); + // uint32_t * restrict dst = buffer; + // 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++; + // if(val >= 64) val = 0; + // dst[x] = nes_palette[val]; + // } + // dst += BUFFER_WIDTH; + // } + // apply_phosphor_decay(); + // render_frame(); + // glfwSwapBuffers(window); } printf("total frames: %6.6d total cycles: %ld\n", frames, nstate->cycles); glfwDestroyWindow(window); |
