summaryrefslogtreecommitdiff
path: root/mknes.c
diff options
context:
space:
mode:
Diffstat (limited to 'mknes.c')
-rw-r--r--mknes.c139
1 files changed, 72 insertions, 67 deletions
diff --git a/mknes.c b/mknes.c
index 25e920f..7417bed 100644
--- a/mknes.c
+++ b/mknes.c
@@ -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);