Skip to content

Commit

Permalink
Merge pull request #44 from Kautenja/clone_restore
Browse files Browse the repository at this point in the history
Clone restore
  • Loading branch information
Kautenja authored Jan 5, 2019
2 parents 32e7306 + 73435bd commit 4d17088
Show file tree
Hide file tree
Showing 28 changed files with 721 additions and 886 deletions.
69 changes: 14 additions & 55 deletions nes_py/cpp/cartridge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,59 +3,23 @@
#include <fstream>
#include <string>

Cartridge::Cartridge() :
m_nameTableMirroring(0),
m_mapperNumber(0),
m_extendedRAM(false)
{

}
const std::vector<Byte>& Cartridge::getROM()
{
return m_PRG_ROM;
}

const std::vector<Byte>& Cartridge::getVROM()
{
return m_CHR_ROM;
}

Byte Cartridge::getMapper()
{
return m_mapperNumber;
}

Byte Cartridge::getNameTableMirroring()
{
return m_nameTableMirroring;
}

bool Cartridge::hasExtendedRAM()
{
return m_extendedRAM;
}

bool Cartridge::loadFromFile(std::string path)
{
bool Cartridge::loadFromFile(std::string path) {
std::ifstream romFile (path, std::ios_base::binary | std::ios_base::in);
if (!romFile)
{
if (!romFile) {
LOG(Error) << "Could not open ROM file from path: " << path << std::endl;
return false;
}

std::vector<Byte> header;
std::vector<uint8_t> header;
LOG(Info) << "Reading ROM from path: " << path << std::endl;

//Header
header.resize(0x10);
if (!romFile.read(reinterpret_cast<char*>(&header[0]), 0x10))
{
if (!romFile.read(reinterpret_cast<char*>(&header[0]), 0x10)) {
LOG(Error) << "Reading iNES header failed." << std::endl;
return false;
}
if (std::string{&header[0], &header[4]} != "NES\x1A")
{
if (std::string{&header[0], &header[4]} != "NES\x1A") {
LOG(Error) << "Not a valid iNES image. Magic number: "
<< std::hex << header[0] << " "
<< header[1] << " " << header[2] << " " << int(header[3]) << std::endl
Expand All @@ -65,15 +29,14 @@ bool Cartridge::loadFromFile(std::string path)

LOG(Info) << "Reading header, it dictates: \n";

Byte banks = header[4];
uint8_t banks = header[4];
LOG(Info) << "16KB PRG-ROM Banks: " << +banks << std::endl;
if (!banks)
{
if (!banks) {
LOG(Error) << "ROM has no PRG-ROM banks. Loading ROM failed." << std::endl;
return false;
}

Byte vbanks = header[5];
uint8_t vbanks = header[5];
LOG(Info) << "8KB CHR-ROM Banks: " << +vbanks << std::endl;

m_nameTableMirroring = header[6] & 0xB;
Expand All @@ -85,14 +48,12 @@ bool Cartridge::loadFromFile(std::string path)
m_extendedRAM = header[6] & 0x2;
LOG(Info) << "Extended (CPU) RAM: " << std::boolalpha << m_extendedRAM << std::endl;

if (header[6] & 0x4)
{
if (header[6] & 0x4) {
LOG(Error) << "Trainer is not supported." << std::endl;
return false;
}

if ((header[0xA] & 0x3) == 0x2 || (header[0xA] & 0x1))
{
if ((header[0xA] & 0x3) == 0x2 || (header[0xA] & 0x1)) {
LOG(Error) << "PAL ROM not supported." << std::endl;
return false;
}
Expand All @@ -101,23 +62,21 @@ bool Cartridge::loadFromFile(std::string path)

//PRG-ROM 16KB banks
m_PRG_ROM.resize(0x4000 * banks);
if (!romFile.read(reinterpret_cast<char*>(&m_PRG_ROM[0]), 0x4000 * banks))
{
if (!romFile.read(reinterpret_cast<char*>(&m_PRG_ROM[0]), 0x4000 * banks)) {
LOG(Error) << "Reading PRG-ROM from image file failed." << std::endl;
return false;
}

//CHR-ROM 8KB banks
if (vbanks)
{
if (vbanks) {
m_CHR_ROM.resize(0x2000 * vbanks);
if (!romFile.read(reinterpret_cast<char*>(&m_CHR_ROM[0]), 0x2000 * vbanks))
{
if (!romFile.read(reinterpret_cast<char*>(&m_CHR_ROM[0]), 0x2000 * vbanks)) {
LOG(Error) << "Reading CHR-ROM from image file failed." << std::endl;
return false;
}
}
else
LOG(Info) << "Cartridge with CHR-RAM." << std::endl;

return true;
}
10 changes: 3 additions & 7 deletions nes_py/cpp/controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,15 @@ Controller::Controller() {
joypad_bits = 0;
}

void Controller::write_buttons(uint8_t buttons) {
joypad_buttons = buttons;
}

void Controller::strobe(Byte b) {
void Controller::strobe(uint8_t b) {
is_strobe = (b & 1);
if (!is_strobe) {
joypad_bits = joypad_buttons;
}
}

Byte Controller::read() {
Byte ret;
uint8_t Controller::read() {
uint8_t ret;
if (is_strobe)
ret = (joypad_buttons & 1);
else {
Expand Down
Loading

0 comments on commit 4d17088

Please sign in to comment.