59 lines
999 B
C++
59 lines
999 B
C++
#include "Cartridge.hpp"
|
|
#include <fstream>
|
|
#include <iostream>
|
|
#include <string>
|
|
|
|
|
|
const unsigned int HEADER_SIZE = 16u;
|
|
|
|
|
|
#pragma pack(push, 1)
|
|
struct Header
|
|
{
|
|
uint8_t string[4];
|
|
uint8_t prgSize;
|
|
uint8_t chrSize;
|
|
uint8_t flags6;
|
|
uint8_t flags7;
|
|
uint8_t flags8;
|
|
uint8_t flags9;
|
|
uint8_t flags10;
|
|
uint8_t padding[5];
|
|
};
|
|
#pragma pack(pop)
|
|
|
|
|
|
void Cartridge::Load(char const* filename)
|
|
{
|
|
std::ifstream file(filename, std::ios::binary);
|
|
|
|
if (file.is_open())
|
|
{
|
|
char buf[HEADER_SIZE];
|
|
file.read(buf, HEADER_SIZE);
|
|
|
|
auto header = reinterpret_cast<Header*>(buf);
|
|
|
|
// Trainer
|
|
if (header->flags6 & 0x4)
|
|
{
|
|
char trainerBuf[512];
|
|
file.read(trainerBuf, 512);
|
|
}
|
|
|
|
uint32_t prgSize = header->prgSize * 16384;
|
|
prgROM.resize(prgSize);
|
|
file.read(reinterpret_cast<char*>(prgROM.data()), prgSize);
|
|
|
|
uint32_t chrSize = header->chrSize * 8192;
|
|
|
|
if (chrSize > 0)
|
|
{
|
|
chrROM.resize(chrSize);
|
|
file.read(reinterpret_cast<char*>(chrROM.data()), chrSize);
|
|
}
|
|
|
|
file.close();
|
|
}
|
|
}
|