Переглянути джерело

Refactor cart loading for early mapper failure

v2
Nathaniel Walizer 9 місяці тому
джерело
коміт
2f815b3120
4 змінених файлів з 86 додано та 47 видалено
  1. +82
    -7
      src/linux/port.c
  2. +3
    -36
      src/nese.c
  3. +1
    -1
      src/nese.h
  4. +0
    -3
      src/port.h

+ 82
- 7
src/linux/port.c Переглянути файл

@@ -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;
}

+ 3
- 36
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;
}

+ 1
- 1
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_

+ 0
- 3
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*);


Завантаження…
Відмінити
Зберегти