nesemu/rom/rom.c

76 lines
1.5 KiB
C
Raw Normal View History

2023-12-03 00:27:07 -05:00
//
// Created by william on 12/2/23.
//
#include <stdio.h>
#include <stdlib.h>
2023-12-23 16:35:23 -05:00
#include <assert.h>
2023-12-03 00:27:07 -05:00
#include "../include/rom.h"
#include "ines.c"
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
2023-12-23 16:35:23 -05:00
Rom rom;
2023-12-03 00:27:07 -05:00
2023-12-23 16:35:23 -05:00
void rom_init() {
rom.header = NULL;
rom.prg_rom = NULL;
rom.chr_rom = NULL;
2023-12-03 00:27:07 -05:00
}
2023-12-23 16:35:23 -05:00
int rom_load(char *path) {
rom_init();
2023-12-03 00:27:07 -05:00
FILE *file = fopen(path, "r");
if (!file) {
2023-12-23 16:35:23 -05:00
log_error("Failed to open ROM");
2023-12-03 00:27:07 -05:00
return EXIT_FAILURE;
}
2023-12-23 16:35:23 -05:00
char header_buffer[ROM_HEADER_SIZE] = {0};
2023-12-03 00:27:07 -05:00
size_t read_size = fread(header_buffer, sizeof(char), ARRAY_SIZE(header_buffer), file);
if (read_size < ARRAY_SIZE(header_buffer)) {
2023-12-23 16:35:23 -05:00
log_error("Failed to read ROM");
2023-12-03 00:27:07 -05:00
return EXIT_FAILURE;
}
if (!rom_is_ines(header_buffer)) {
2023-12-23 16:35:23 -05:00
log_error("Only iNes ROMs are supported");
2023-12-03 00:27:07 -05:00
return EXIT_FAILURE;
}
2023-12-23 16:35:23 -05:00
log_info("Reading iNes 1.0 ROM at %s", path);
rom_ines_read(header_buffer, file, &rom);
2023-12-03 00:27:07 -05:00
if (fclose(file) != 0) {
2023-12-23 16:35:23 -05:00
log_error("Failed to close ROM file");
2023-12-03 00:27:07 -05:00
return EXIT_FAILURE;
}
return 0;
2023-12-23 16:35:23 -05:00
}
void rom_uninit() {
assert(rom.prg_rom != NULL);
assert(rom.chr_rom != NULL);
free(rom.prg_rom);
free(rom.chr_rom);
log_info("Cleared ROM data");
}
byte rom_prg_get_byte(address addr) {
assert(rom.prg_rom != NULL);
return rom.prg_rom[addr];
}
word rom_prg_get_word(address addr) {
assert(rom.prg_rom != NULL);
word word = rom.prg_rom[addr];
word += rom.prg_rom[addr + 1] << 8; // Little endian
return word;
2023-12-03 00:27:07 -05:00
}