From 2f815b312045ae740e88d4dc44dcc3cbf70a9d98 Mon Sep 17 00:00:00 2001 From: Nathaniel Walizer Date: Sun, 16 Mar 2025 23:15:58 -0700 Subject: [PATCH] Refactor cart loading for early mapper failure --- src/linux/port.c | 89 ++++++++++++++++++++++++++++++++++++++++++++---- src/nese.c | 39 ++------------------- src/nese.h | 2 +- src/port.h | 3 -- 4 files changed, 86 insertions(+), 47 deletions(-) diff --git a/src/linux/port.c b/src/linux/port.c index cf758c1..1064d7d 100644 --- a/src/linux/port.c +++ b/src/linux/port.c @@ -7,6 +7,7 @@ #include +#include "cart.h" #include "nese.h" #include "port.h" @@ -14,7 +15,7 @@ #include "log.h" -void* nese_map_file(FILE* file, int size) { +static void* nese_map_file(FILE* file, int size) { void* addr = mmap(NULL, size, PROT_READ, MAP_SHARED, fileno(file), 0); if (MAP_FAILED == addr || NULL == addr) { @@ -24,16 +25,30 @@ void* nese_map_file(FILE* file, int size) { return addr; } -int nese_unmap_file(void* addr, int size) { +static int nese_unmap_file(void* addr, int size) { return munmap(addr, size); } +static int nese_file_size(FILE* file) { + int size = -1; + if (0 == fseek(file, 0, SEEK_END)) { + size = ftell(file); + } + return size; +} + typedef struct { - nes* sys; + const char* filename; + FILE* file; + int filesize; + void* cart_data; +} cart_info; +typedef struct { + nes* sys; + cart_info cart; int64_t t_target; - SDL_Window* window; SDL_Renderer* renderer; SDL_Texture* texture; @@ -321,22 +336,82 @@ static void plat_done(platform_data* plat) { } +static int load_cart(const char* filename, platform_data* plat) { + int status = 0; + int filesize = 0; + void* cart_data = NULL; + + FILE* file = fopen(filename, "rb"); + if (NULL == file) { + status = -1; + } else { + filesize = nese_file_size(file); + cart_data = nese_map_file(file, filesize); + if (NULL == cart_data) { + fprintf(stderr, "Failed to map %s\n", filename); + status = -1; + } else { + status = nes_cart_load_mem(cart_data, filesize, + plat->sys); + } + } + + if (0 == status) { + plat->cart.filename = filename; + plat->cart.filesize = filesize; + plat->cart.file = file; + plat->cart.cart_data = cart_data; + } + + return status; +} + +static void unload_cart(cart_info* cart) { + if (cart->cart_data) { + nese_unmap_file(cart->cart_data, cart->filesize); + cart->cart_data = NULL; + cart->filesize = 0; + } + + if (cart->file) { + fclose(cart->file); + cart->file = NULL; + } +} + + // This is too big for the stack. static nes sys = {0}; int main(int argc, char* argv[]) { + int status = 0; + // This should be tiny enough to keep on the stack. platform_data plat = { .sys = &sys, }; - int status = plat_init(&plat); + if (argc <= 1) { LOGE("No ROM file provided."); status = -1; - } else if (0 == status) { - status = nese_start(&sys, argv[1], &plat); } + + if (0 == status) { + status = load_cart(argv[1], &plat); + } + + if (0 == status) { + status = plat_init(&plat); + } + + if (0 == status) { + status = nese_start(&sys, &plat); + } + + unload_cart(&plat.cart); + plat_done(&plat); + return status; } diff --git a/src/nese.c b/src/nese.c index 64ee31c..ff4d2e3 100644 --- a/src/nese.c +++ b/src/nese.c @@ -5,47 +5,14 @@ #include "port.h" -static int nese_file_size(FILE* file) { - int size = -1; - if (0 == fseek(file, 0, SEEK_END)) { - size = ftell(file); - } - return size; -} - - -int nese_start(nes* sys, const char* filename, void* plat) { - int status = 0; - void* cart_data = NULL; - int filesize = -1; - FILE* file = NULL; - - file = fopen(filename, "rb"); - - if (NULL == file) { - status = -1; - } - - if (0 == status) { - filesize = nese_file_size(file); - cart_data = nese_map_file(file, filesize); - if (NULL == cart_data) { - fprintf(stderr, "Failed to map %s\n", filename); - status = -1; - } else { - status = nes_cart_load_mem(cart_data, filesize, sys); - } - } - +int nese_start(nes* sys, void* plat) { nes_init(sys); nes_reset(sys); - nes_loop(sys, plat); - - if (cart_data) nese_unmap_file(cart_data, filesize); + int status = nes_loop(sys, plat); nes_done(sys); - return 0; + return status; } diff --git a/src/nese.h b/src/nese.h index a738f8b..59ad16a 100644 --- a/src/nese.h +++ b/src/nese.h @@ -4,7 +4,7 @@ #include "nes.h" -int nese_start(nes* sys, const char* filename, void*); +int nese_start(nes* sys, void*); #endif // NESE_H_ diff --git a/src/port.h b/src/port.h index 8389e69..a522a7c 100644 --- a/src/port.h +++ b/src/port.h @@ -6,9 +6,6 @@ #include "input.h" -void* nese_map_file(FILE* file, int size); -int nese_unmap_file(void* addr, int size); - int nese_frame_start(void*, uint8_t background); int nese_line_ready(void*, uint8_t* buffer, int line); int nese_frame_ready(void*);