Example #1
0
        public override void WritePrg(int addr, byte value)
        {
            if (newer_variant)
            {
                addr = (addr & 0xFFFC) | ((addr >> 1) & 1) | ((addr << 1) & 2);
            }
            switch (addr)
            {
            case 0x0000:                     //$8000
            case 0x0001:
            case 0x0002:
            case 0x0003:
                prg_bank_16k = value;
                SyncPRG();
                break;

            case 0x1000:                     //$9000
                VRC6Sound.Write9000(value);
                break;

            case 0x1001:                     //$9001
                VRC6Sound.Write9001(value);
                break;

            case 0x1002:                     //$9002
                VRC6Sound.Write9002(value);
                break;

            case 0x1003:                     //$9003
                VRC6Sound.Write9003(value);
                break;

            case 0x2000:                     //$A000
                VRC6Sound.WriteA000(value);
                break;

            case 0x2001:                     //$A001
                VRC6Sound.WriteA001(value);
                break;

            case 0x2002:                     //$A002
                VRC6Sound.WriteA002(value);
                break;

            case 0x3000:                     //$B000
                VRC6Sound.WriteB000(value);
                break;

            case 0x3001:                     //$B001
                VRC6Sound.WriteB001(value);
                break;

            case 0x3002:                     //$B002
                VRC6Sound.WriteB002(value);
                break;

            case 0x3003:                     //$B003
                PPUBankingMode = value & 15;
                NTROM          = value.Bit(4);
                chrA10replace  = value.Bit(5);
                break;

            case 0x4000:                     //$C000
            case 0x4001:
            case 0x4002:
            case 0x4003:
                prg_bank_8k = value;
                SyncPRG();
                break;

            case 0x5000:                     //$D000
            case 0x5001:                     //$D001
            case 0x5002:                     //$D002
            case 0x5003:                     //$D003
                chr_banks_1k[addr - 0x5000] = value;
                break;

            case 0x6000:                     //$E000
            case 0x6001:                     //$E001
            case 0x6002:                     //$E002
            case 0x6003:                     //$E003
                chr_banks_1k[4 + addr - 0x6000] = value;
                break;

            case 0x7000:                     //$F000 (reload)
                irq_reload = value;
                break;

            case 0x7001:                     //$F001 (control)
                irq_mode   = value.Bit(2);
                irq_autoen = value.Bit(0);

                if (value.Bit(1))
                {
                    //enabled
                    irq_enabled   = true;
                    irq_counter   = irq_reload;
                    irq_prescaler = 341;
                }
                else
                {
                    //disabled
                    irq_enabled = false;
                }

                //acknowledge
                irq_pending = false;

                SyncIRQ();

                break;

            case 0x7002:                     //$F002 (ack)
                irq_pending = false;
                irq_enabled = irq_autoen;
                SyncIRQ();
                break;
            }
        }