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; } }