fixed ppu postfetching

This commit is contained in:
Lauchmelder 2022-03-05 17:14:07 +01:00
parent a7808815a1
commit ca3eac8393
No known key found for this signature in database
GPG key ID: C2403C69D78F011D
17 changed files with 343 additions and 31 deletions

View file

@ -8,7 +8,6 @@ Mapper000::Mapper000(const Header& header, std::ifstream& ifs) :
Mapper(header)
{
LOG_CORE_INFO("Allocating PRG ROM");
prgBanks = header.PrgROM;
PRG_ROM = std::vector<Byte>(0x4000 * prgBanks);
ifs.read((char*)PRG_ROM.data(), 0x4000 * prgBanks);

View file

@ -1,6 +1,5 @@
#pragma once
#include <vector>
#include <fstream>
#include "../Mapper.hpp"
@ -16,7 +15,4 @@ public:
virtual Byte ReadPPU(Word addr) override;
virtual void WriteCPU(Word addr, Byte val) override;
virtual void WritePPU(Word addr, Byte val) override;
private:
Byte prgBanks = 0;
};

126
src/mappers/Mapper001.cpp Normal file
View file

@ -0,0 +1,126 @@
#include "Mapper001.hpp"
Mapper001::Mapper001(const Header& header, std::ifstream& ifs) :
Mapper(header)
{
LOG_CORE_INFO("Allocating PRG ROM");
PRG_ROM = std::vector<Byte>(0x4000 * prgBanks);
ifs.read((char*)PRG_ROM.data(), 0x4000 * prgBanks);
LOG_CORE_INFO("Allocating CHR ROM");
CHR_ROM = std::vector<Byte>(0x2000 * chrBanks);
ifs.read((char*)CHR_ROM.data(), 0x2000 * chrBanks);
}
Byte Mapper001::ReadCPU(Word addr)
{
if (0x8000 <= addr && addr <= 0xFFFF)
{
Byte selectedBank = prgBank;
Byte prgControl = (control >> 2) & 0x3;
switch (prgControl)
{
case 0:
selectedBank &= ~0x1;
break;
case 1:
if (addr < 0xC000)
selectedBank = 1;
break;
case 2:
if (addr >= 0xC000)
selectedBank = prgBanks;
break;
}
return PRG_ROM[addr & (0x4000 * selectedBank - 1)];
}
return 0x00;
}
Byte Mapper001::ReadPPU(Word addr)
{
if (0x0000 <= addr && addr <= 0x1FFF)
{
Byte selectedBank = 0x00;
Byte chrControl = (control >> 4) & 0x1;
if (chrControl)
{
if (addr < 0x1000)
selectedBank = chrBank0;
else
selectedBank = chrBank1;
}
else
{
selectedBank = chrBank0 & ~0x1;
}
return CHR_ROM[addr & (0x1000 * selectedBank - 1)];
}
return 0x00;
}
void Mapper001::WriteCPU(Word addr, Byte val)
{
if (addr <= 0x8000 && addr <= 0xFFFF)
{
if ((val & 0x80) == 0x80)
{
shiftRegister = 0x00;
control |= 0x0C;
return;
}
latch++;
shiftRegister >>= 1;
shiftRegister |= (val & 0x1) << 4;
if (latch == 5)
{
Byte registerSelect = (addr & 0x6000) >> 13;
switch (registerSelect)
{
case 0: control = shiftRegister; break;
case 1: chrBank0 = shiftRegister; break;
case 2: chrBank1 = shiftRegister; break;
case 3: prgBank = shiftRegister; break;
}
shiftRegister = 0x00;
latch = 0;
}
}
}
void Mapper001::WritePPU(Word addr, Byte val)
{
}
bool Mapper001::MapCIRAM(Word& addr)
{
if ((control & 0x3) < 2)
{
LOG_CORE_WARN("Mapper MMC1 doesn't yet support One-Screen mirroring");
return true;
}
if ((control & 0x3) == 0x3)
{
// Shift Bit 11 into Bit 10
addr &= ~(1 << 10);
addr |= ((addr & (1 << 11)) >> 1);
}
// Unset bit 11
addr &= ~(1 << 11);
return false;
}

27
src/mappers/Mapper001.hpp Normal file
View file

@ -0,0 +1,27 @@
#pragma once
#include <fstream>
#include "../Mapper.hpp"
class Mapper001 :
public Mapper
{
public:
Mapper001(const Header& header, std::ifstream& ifs);
virtual Byte ReadCPU(Word addr) override;
virtual Byte ReadPPU(Word addr) override;
virtual void WriteCPU(Word addr, Byte val) override;
virtual void WritePPU(Word addr, Byte val) override;
virtual bool MapCIRAM(Word& addr) override;
private:
Byte latch = 0;
Byte shiftRegister = 0x00;
Byte control = 0x00;
Byte chrBank0 = 0x00;
Byte chrBank1 = 0x00;
Byte prgBank = 0x00;
};

48
src/mappers/Mapper003.cpp Normal file
View file

@ -0,0 +1,48 @@
#include "Mapper003.hpp"
#include <fstream>
#include "../Log.hpp"
Mapper003::Mapper003(const Header& header, std::ifstream& ifs) :
Mapper(header)
{
LOG_CORE_INFO("Allocating PRG ROM");
PRG_ROM = std::vector<Byte>(0x4000 * prgBanks);
ifs.read((char*)PRG_ROM.data(), 0x4000 * prgBanks);
LOG_CORE_INFO("Allocating CHR ROM");
CHR_ROM = std::vector<Byte>(0x2000 * chrBanks);
ifs.read((char*)CHR_ROM.data(), 0x2000 * chrBanks);
}
Byte Mapper003::ReadCPU(Word addr)
{
if (0x8000 <= addr && addr <= 0xFFFF)
{
return PRG_ROM[addr & (0x4000 * prgBanks - 1)];
}
return 0x00;
}
Byte Mapper003::ReadPPU(Word addr)
{
if (0x0000 <= addr && addr <= 0x1FFF)
{
return CHR_ROM[0x2000 * selectedChrBank + addr];
}
return 0x00;
}
void Mapper003::WriteCPU(Word addr, Byte val)
{
if (0x8000 <= addr && addr <= 0xFFFF)
{
selectedChrBank = val & 0x3;
}
}
void Mapper003::WritePPU(Word addr, Byte val)
{
}

21
src/mappers/Mapper003.hpp Normal file
View file

@ -0,0 +1,21 @@
#pragma once
#include <fstream>
#include "../Mapper.hpp"
struct Header;
class Mapper003 :
public Mapper
{
public:
Mapper003(const Header& header, std::ifstream& ifs);
virtual Byte ReadCPU(Word addr) override;
virtual Byte ReadPPU(Word addr) override;
virtual void WriteCPU(Word addr, Byte val) override;
virtual void WritePPU(Word addr, Byte val) override;
private:
Byte selectedChrBank = 0;
};