NESEmulator/NES Emulator/cartridge.c

80 lines
1.8 KiB
C
Raw Normal View History

2021-10-20 20:39:29 +00:00
#include "cartridge.h"
#include <stdlib.h>
#include <stdio.h>
#include "bus.h"
struct Cartridge* createCartridge(struct Bus* parent, const char* filepath)
{
struct Cartridge* cartridge = (struct Cartridge*)malloc(sizeof(struct Cartridge));
if (cartridge == NULL)
{
fprintf(stderr, "Failed to create cartridge.\n");
exit(1);
}
2021-10-20 21:11:08 +00:00
FILE* fp = fopen(filepath, "rb");
2021-10-24 11:47:11 +00:00
fread(&cartridge->header, sizeof(cartridge->header), 1, fp);
2021-10-20 21:11:08 +00:00
2021-10-24 11:47:11 +00:00
cartridge->prg_rom = (Byte*)malloc(0x4000 * (size_t)cartridge->header.prg_rom_size);
2021-10-20 21:11:08 +00:00
if (cartridge->prg_rom == NULL)
{
fprintf(stderr, "Failed to allocate PRG memory for cartridge, aborting.\n");
exit(1);
}
2021-10-24 11:47:11 +00:00
cartridge->chr_rom = (Byte*)malloc(0x2000 * (size_t)cartridge->header.chr_rom_size);
2021-10-20 21:23:16 +00:00
if (cartridge->chr_rom == NULL)
2021-10-20 21:11:08 +00:00
{
fprintf(stderr, "Failed to allocate CHR memory for cartridge, aborting.\n");
exit(1);
}
2021-10-24 11:47:11 +00:00
fread(cartridge->prg_rom, 0x4000, cartridge->header.prg_rom_size, fp);
fread(cartridge->chr_rom, 0x2000, cartridge->header.chr_rom_size, fp);
2021-10-20 21:23:16 +00:00
2021-10-20 20:39:29 +00:00
cartridge->bus = parent;
return cartridge;
}
void destroyCartridge(struct Cartridge* cartridge)
{
2021-10-20 21:11:08 +00:00
free(cartridge->chr_rom);
free(cartridge->prg_rom);
2021-10-20 20:39:29 +00:00
free(cartridge);
}
2021-10-20 21:23:16 +00:00
Byte readCartridge(struct Cartridge* cartridge, Word addr)
{
// TODO: Force M000 mapper for now
Byte val = 0;
if (0x6000 <= addr && addr <= 0x7FFF) // PRG RAM
{
// do nothing for now
}
else if (0x8000 <= addr && addr <= 0xFFFF) // PRG ROM
{
2021-10-23 18:16:29 +00:00
val = cartridge->prg_rom[addr % 0x4000];
2021-10-20 21:23:16 +00:00
}
return val;
}
void writeCartridge(struct Cartridge* cartridge, Word addr, Byte val)
{
// TODO: Force M000 mapper for now
if (0x6000 <= addr && addr <= 0x7FFF) // PRG RAM
{
// do nothing for now
}
else if (0x8000 <= addr && addr <= 0xFFFF) // PRG ROM
{
2021-10-23 18:16:29 +00:00
cartridge->prg_rom[addr % 0x4000] = val;
2021-10-20 21:23:16 +00:00
}
}