protected void WriteByte(uint addr, byte value) { bool even = (addr & 0x1) == 0; if (addr < 0x8000) { if (_prgRAMEnabled) { _prgRAM[addr - 0x6000] = value; } } else if (addr < 0xA000) { if (even) { _currentBank = value & 0x7u; _prgBankingMode = (PRGBankingMode)((value >> 6) & 0x1); _chrBankingMode = (CHRBankingMode)((value >> 7) & 0x1); } else { _banks[_currentBank] = value; } UpdateOffsets(); } else if (addr < 0xC000) { if (even) { _emulator.Cartridge.MirroringMode = _mirroringModes[value & 0x1]; } else { _prgRAMEnabled = (value & 0xC0) == 0x80; } } else if (addr < 0xE000) { if (even) { _irqReloadValue = value; } else { _irqCounter = 0; } } else { _irqEnabled = !even; } }
private void UpdateControl(uint value) { _control = value; _emulator.Cartridge.MirroringMode = _mirroringModes[value & 0x3]; _chrBankingMode = (CHRBankingMode)((value >> 4) & 0x1); var prgMode = (value >> 2) & 0x3; // Both 0 and 1 are 32Kb switch if (prgMode == 0) { prgMode = 1; } _prgBankingMode = (PRGBankingMode)(prgMode - 1); UpdateCHRBank(1, _chrBanks[1]); UpdateCHRBank(0, _chrBanks[0]); UpdatePRGBank(_prgBank); }