gbdb,memory: require memory files on initialization
This will make it a little bit easier to set up the proper MBC when they are implemented.
This commit is contained in:
@@ -25,11 +25,38 @@ static unsigned char bootrom[0x100] = {0};
|
||||
static unsigned char cart_low[0x100] = {0};
|
||||
static int bootrom_mapped = 1;
|
||||
|
||||
void gb_mem_init(struct gb_memory *memory, struct gb_video *v)
|
||||
static void load_file_to_buffer(const char *filename, uint8_t *buffer, size_t size)
|
||||
{
|
||||
//TODO: Check error codes like a real programmer :P
|
||||
FILE* prog_file;
|
||||
long filesize;
|
||||
|
||||
prog_file = fopen(filename, "r");
|
||||
if(prog_file < 0) {
|
||||
printf("Failed to load game file: %d\n", errno);
|
||||
return;
|
||||
}
|
||||
|
||||
fseek(prog_file, 0, SEEK_END);
|
||||
filesize = ftell(prog_file);
|
||||
fseek(prog_file, 0, SEEK_SET);
|
||||
|
||||
if (fread(buffer, MIN(filesize, size), 1, prog_file) < 0) {
|
||||
printf("Failed to read filed: %d\n", errno);
|
||||
}
|
||||
fclose(prog_file);
|
||||
}
|
||||
|
||||
void gb_mem_init(struct gb_memory *memory, struct gb_video *v,
|
||||
const char *bootrom_file, const char *rom_file)
|
||||
{
|
||||
video = v;
|
||||
memset(&ram, 0, MAX_RAM_LEN);
|
||||
bootrom_mapped = 1;
|
||||
load_file_to_buffer(rom_file, cart_low, sizeof(cart_low));
|
||||
load_file_to_buffer(rom_file, ram, sizeof(ram));
|
||||
load_file_to_buffer(bootrom_file, bootrom, sizeof(bootrom));
|
||||
load_file_to_buffer(bootrom_file, ram, sizeof(ram));
|
||||
}
|
||||
|
||||
static uint8_t ser_byte = 0;
|
||||
@@ -169,67 +196,3 @@ void gb_mem_force_write(struct gb_memory *memory, uint16_t addr, uint8_t val)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void load_file_to_buffer(char *filename, uint8_t *buffer, size_t size)
|
||||
{
|
||||
//TODO: Check error codes like a real programmer :P
|
||||
FILE* prog_file;
|
||||
long filesize;
|
||||
|
||||
prog_file = fopen(filename, "r");
|
||||
if(prog_file < 0) {
|
||||
printf("Failed to load game file: %d\n", errno);
|
||||
return;
|
||||
}
|
||||
|
||||
fseek(prog_file, 0, SEEK_END);
|
||||
filesize = ftell(prog_file);
|
||||
fseek(prog_file, 0, SEEK_SET);
|
||||
|
||||
if (fread(buffer, MIN(filesize, size), 1, prog_file) < 0) {
|
||||
printf("Failed to read filed: %d\n", errno);
|
||||
}
|
||||
fclose(prog_file);
|
||||
|
||||
}
|
||||
|
||||
int gb_memory_load_file(struct gb_memory *memory, enum gb_memory_range destination, char *filename)
|
||||
{
|
||||
//TODO: Check error codes like a real programmer :P
|
||||
FILE* prog_file;
|
||||
long filesize;
|
||||
|
||||
switch (destination) {
|
||||
case GB_MEMORY_BOOTROM:
|
||||
load_file_to_buffer(filename, bootrom, sizeof(bootrom));
|
||||
load_file_to_buffer(filename, ram, sizeof(bootrom));
|
||||
|
||||
break;
|
||||
case GB_MEMORY_CART:
|
||||
load_file_to_buffer(filename, ram, sizeof(ram));
|
||||
load_file_to_buffer(filename, cart_low, sizeof(cart_low));
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* static void mem_dump(char *filename) */
|
||||
/* { */
|
||||
/* //TODO: Check error codes like a real programmer :P */
|
||||
/* FILE* dump_file; */
|
||||
/* char *token = strtok(filename, " "); */
|
||||
|
||||
/* if (token == NULL) { */
|
||||
/* gb_log("usage: load <file>\n"); */
|
||||
/* return; */
|
||||
/* } */
|
||||
/* strip_newline(token); */
|
||||
/* dump_file = fopen(token, "w"); */
|
||||
/* if(dump_file == NULL) { */
|
||||
/* gb_log("Failed to open mem dump file: %d\n", errno); */
|
||||
/* return; */
|
||||
/* } */
|
||||
/* fwrite(ram, MAX_RAM_LEN, 1, dump_file); */
|
||||
/* fclose(dump_file); */
|
||||
/* } */
|
||||
|
||||
Reference in New Issue
Block a user