fixed ppu postfetching
This commit is contained in:
parent
a7808815a1
commit
ca3eac8393
17 changed files with 343 additions and 31 deletions
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
126
src/mappers/Mapper001.cpp
Normal 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
27
src/mappers/Mapper001.hpp
Normal 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
48
src/mappers/Mapper003.cpp
Normal 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
21
src/mappers/Mapper003.hpp
Normal 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;
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue