mirror of
https://github.com/SourMesen/Mesen2.git
synced 2025-04-02 10:21:44 -04:00
79 lines
No EOL
1.9 KiB
C++
79 lines
No EOL
1.9 KiB
C++
#pragma once
|
|
#include "NES/Mappers/Nintendo/MMC3.h"
|
|
|
|
class MMC3_219 : public MMC3
|
|
{
|
|
private:
|
|
uint8_t _exRegs[3] = {};
|
|
|
|
protected:
|
|
void InitMapper() override
|
|
{
|
|
MMC3::InitMapper();
|
|
SelectPrgPage4x(0, -4);
|
|
SelectChrPage8x(0, 0);
|
|
_exRegs[0] = 0;
|
|
_exRegs[1] = 0;
|
|
_exRegs[2] = 0;
|
|
}
|
|
|
|
void Serialize(Serializer& s) override
|
|
{
|
|
MMC3::Serialize(s);
|
|
SVArray(_exRegs, 3);
|
|
}
|
|
|
|
void UpdatePrgMapping() override
|
|
{
|
|
}
|
|
|
|
void UpdateChrMapping() override
|
|
{
|
|
}
|
|
|
|
void WriteRegister(uint16_t addr, uint8_t value) override
|
|
{
|
|
if(addr < 0xA000) {
|
|
switch(addr & 0xE003) {
|
|
case 0x8000:
|
|
_exRegs[0] = 0;
|
|
_exRegs[1] = value;
|
|
break;
|
|
|
|
case 0x8001:
|
|
if(_exRegs[0] >= 0x23 && _exRegs[0] <= 0x26) {
|
|
uint8_t prgBank = ((value & 0x20) >> 5) | ((value & 0x10) >> 3) | ((value & 0x08) >> 1) | ((value & 0x04) << 1);
|
|
SelectPrgPage(0x26 - _exRegs[0], prgBank);
|
|
}
|
|
|
|
switch(_exRegs[1]) {
|
|
case 0x08: case 0x0A: case 0x0E: case 0x12: case 0x16: case 0x1A: case 0x1E:
|
|
_exRegs[2] = value << 4;
|
|
break;
|
|
|
|
case 0x09: SelectChrPage(0, _exRegs[2] | (value >> 1 & 0x0E)); break;
|
|
case 0x0B: SelectChrPage(1, _exRegs[2] | (value >> 1 | 0x1)); break;
|
|
case 0x0C:
|
|
case 0x0D: SelectChrPage(2, _exRegs[2] | (value >> 1 & 0xE)); break;
|
|
case 0x0F: SelectChrPage(3, _exRegs[2] | (value >> 1 | 0x1)); break;
|
|
case 0x10:
|
|
case 0x11: SelectChrPage(4, _exRegs[2] | (value >> 1 & 0xF)); break;
|
|
case 0x14:
|
|
case 0x15: SelectChrPage(5, _exRegs[2] | (value >> 1 & 0xF)); break;
|
|
case 0x18:
|
|
case 0x19: SelectChrPage(6, _exRegs[2] | (value >> 1 & 0xF)); break;
|
|
case 0x1C:
|
|
case 0x1D: SelectChrPage(7, _exRegs[2] | (value >> 1 & 0xF)); break;
|
|
}
|
|
break;
|
|
|
|
case 0x8002:
|
|
_exRegs[0] = value;
|
|
_exRegs[1] = 0;
|
|
break;
|
|
}
|
|
} else {
|
|
MMC3::WriteRegister(addr, value);
|
|
}
|
|
}
|
|
}; |