diff --git a/Core/MMC3.h b/Core/MMC3.h index cf42f627..16937712 100644 --- a/Core/MMC3.h +++ b/Core/MMC3.h @@ -22,7 +22,6 @@ class MMC3 : public BaseMapper }; uint8_t _currentRegister; - uint8_t _prgMode; bool _wramEnabled; bool _wramWriteProtected; @@ -69,6 +68,7 @@ class MMC3 : public BaseMapper uint8_t _irqCounter; bool _irqReload; bool _irqEnabled; + uint8_t _prgMode; uint8_t _chrMode; uint8_t _registers[8]; diff --git a/Core/MMC3_245.h b/Core/MMC3_245.h index e6ed1897..ea8f3aaf 100644 --- a/Core/MMC3_245.h +++ b/Core/MMC3_245.h @@ -5,13 +5,8 @@ class MMC3_245 : public MMC3 { protected: - virtual void UpdateState() + virtual void UpdateState() override { - uint8_t orValue = _registers[0] & 0x01 ? 0x40 : 0x00; - - _registers[6] = (_registers[6] & 0x3F) | orValue; - _registers[7] = (_registers[7] & 0x3F) | orValue; - MMC3::UpdateState(); if(HasChrRam()) { @@ -24,4 +19,24 @@ protected: } } } + + virtual void UpdatePrgMapping() override + { + uint8_t orValue = _registers[0] & 0x02 ? 0x40 : 0x00; + _registers[6] = (_registers[6] & 0x3F) | orValue; + _registers[7] = (_registers[7] & 0x3F) | orValue; + + uint16_t lastPageInBlock = (GetPRGPageCount() >= 0x40 ? (0x3F | orValue) : -1); + if(_prgMode == 0) { + SelectPRGPage(0, _registers[6]); + SelectPRGPage(1, _registers[7]); + SelectPRGPage(2, lastPageInBlock - 1); + SelectPRGPage(3, lastPageInBlock); + } else if(_prgMode == 1) { + SelectPRGPage(0, lastPageInBlock - 1); + SelectPRGPage(1, _registers[7]); + SelectPRGPage(2, _registers[6]); + SelectPRGPage(3, lastPageInBlock); + } + } }; \ No newline at end of file