diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Taito_X1_005.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Taito_X1_005.cs index 19b74f80a7..59b4b8ab39 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Taito_X1_005.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Taito_X1_005.cs @@ -44,11 +44,22 @@ PRG Setup: class TAITO_X1_005 : NES.NESBoardBase { - int prg, chr; + int prg_bank_mask, chr_bank_mask; + ByteBuffer chr_regs_2k = new ByteBuffer(6); + ByteBuffer prg_regs_8k = new ByteBuffer(4); public override void SyncState(Serializer ser) { base.SyncState(ser); + ser.Sync("chr_regs_2k", ref chr_regs_2k); + ser.Sync("prg_regs_8k", ref prg_regs_8k); + } + + public override void Dispose() + { + base.Dispose(); + chr_regs_2k.Dispose(); + prg_regs_8k.Dispose(); } public override bool Configure(NES.EDetectionOrigin origin) @@ -62,7 +73,10 @@ PRG Setup: return false; } - SetMirrorType(Cart.pad_h, Cart.pad_v); + SetMirrorType(EMirrorType.Vertical); + chr_bank_mask = Cart.chr_size / 2 - 1; + prg_bank_mask = Cart.prg_size / 8 - 1; + prg_regs_8k[3] = 0xFF; return true; } @@ -78,50 +92,57 @@ PRG Setup: break; case 0x7EF0: - chr = 0; + chr_regs_2k[0] = value; break; case 0x7EF1: - chr = 1; + chr_regs_2k[1] = value; break; case 0x7EF2: - chr = 2; + chr_regs_2k[2] = value; break; case 0x7EF3: - chr = 3; + chr_regs_2k[3] = value; break; case 0x7EF4: - chr = 4; + chr_regs_2k[4] = value; break; case 0X7EF5: - chr = 5; + chr_regs_2k[5] = value; break; case 0x7EFA: //PRG Reg 0 case 0x7EFB: - prg = 0; + prg_regs_8k[0] = value; break; case 0x7EFC: //PRG Reg 1 case 0x7EFD: - prg = 1; + prg_regs_8k[1] = value; break; case 0x7EFE: //PRG Reg 2 case 0x7EFF: - prg = 2; + prg_regs_8k[2] = value; break; } } public override byte ReadPRG(int addr) { - return ROM[(addr & 0x01FFF)+ (prg * 0x2000)]; + int bank_8k = addr >> 13; + int ofs = addr & ((1 << 13) - 1); + bank_8k = prg_regs_8k[bank_8k]; + bank_8k &= prg_bank_mask; + addr = (bank_8k << 13) | ofs; + return ROM[addr]; } public override byte ReadPPU(int addr) { - if (chr < 2) - return VROM[(addr & 0x7FF) + (chr * 0x800)]; - else - return VROM[(addr & 0x3FF) + 0x800 + (chr * 0x400)]; + int bank_2k = addr >> 11; + int ofs = addr & ((1 << 11) - 1); + bank_2k = chr_regs_2k[bank_2k]; + bank_2k &= chr_bank_mask; + addr = (bank_2k << 11) | ofs; + return VROM[addr]; } } } \ No newline at end of file