|
|
|
@@ -7,6 +7,7 @@ |
|
|
|
|
|
|
|
#include <SDL.h> |
|
|
|
|
|
|
|
#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; |
|
|
|
} |