This repository has been archived on 2022-06-22. You can view files and clone it, but cannot push or open issues or pull requests.
LaiNES/src/cartridge.cpp
2020-05-18 14:42:11 -05:00

76 lines
1.6 KiB
C++

#include <cstdio>
#include "apu.hpp"
#include "cpu.hpp"
#include "mappers/mapper0.hpp"
#include "mappers/mapper1.hpp"
#include "mappers/mapper2.hpp"
#include "mappers/mapper3.hpp"
#include "mappers/mapper4.hpp"
#include "mappers/mapper7.hpp"
#include "ppu.hpp"
#include "cartridge.hpp"
namespace Cartridge {
Mapper* mapper = nullptr; // Mapper chip.
/* PRG-ROM access */
template <bool wr> u8 access(u16 addr, u8 v)
{
if (!wr) return mapper->read(addr);
else return mapper->write(addr, v);
}
template u8 access<0>(u16, u8); template u8 access<1>(u16, u8);
/* CHR-ROM/RAM access */
template <bool wr> u8 chr_access(u16 addr, u8 v)
{
if (!wr) return mapper->chr_read(addr);
else return mapper->chr_write(addr, v);
}
template u8 chr_access<0>(u16, u8); template u8 chr_access<1>(u16, u8);
void signal_scanline()
{
mapper->signal_scanline();
}
/* Load the ROM from a file. */
void load(const char* fileName)
{
FILE* f = fopen(fileName, "rb");
fseek(f, 0, SEEK_END);
int size = ftell(f);
fseek(f, 0, SEEK_SET);
u8* rom = new u8[size];
fread(rom, size, 1, f);
fclose(f);
int mapperNum = (rom[7] & 0xF0) | (rom[6] >> 4);
if (loaded()) delete mapper;
switch (mapperNum)
{
case 0: mapper = new Mapper0(rom); break;
case 1: mapper = new Mapper1(rom); break;
case 2: mapper = new Mapper2(rom); break;
case 3: mapper = new Mapper3(rom); break;
case 4: mapper = new Mapper4(rom); break;
case 7: mapper = new Mapper7(rom); break;
}
CPU::power();
PPU::reset();
//APU::reset();
}
bool loaded()
{
return mapper != nullptr;
}
}