Exemple #1
0
        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;
            }
        }
Exemple #2
0
        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);
        }