diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj index 907c6e71bc..8ed45f9ecb 100644 --- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj +++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj @@ -297,7 +297,6 @@ - diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper207.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper207.cs deleted file mode 100644 index d695c77866..0000000000 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper207.cs +++ /dev/null @@ -1,189 +0,0 @@ -using BizHawk.Common; - -namespace BizHawk.Emulation.Cores.Nintendo.NES -{ - /* - * Here are Disch's original notes: - ======================== - = Mapper 207 = - ======================== - - Example Game: - -------------------------- - Fudou Myouou Den - - Notes: - --------------------------- - Regs appear at $7EFx, I'm unsure whether or not PRG-RAM can exist at $6000-7FFF - - Registers: - --------------------------- - - $7EF0: [MCCC CCCC] - M = Mirroring 0 - C = CHR Reg 0 - - $7EF1: [MCCC CCCC] - M = Mirroring 1 - C = CHR Reg 1 - - $7EF2-7EF5: CHR Regs 2-5 - - - $7EFA,7EFB: PRG Reg 0 (8k @ $8000) - $7EFC,7EFD: PRG Reg 1 (8k @ $A000) - $7EFE,7EFF: PRG Reg 2 (8k @ $C000) - - - CHR Setup: - --------------------------- - - $0000 $0400 $0800 $0C00 $1000 $1400 $1800 $1C00 - +---------------+---------------+-------+-------+-------+-------+ - | <$7EF0> | <$7EF1> | $7EF2 | $7EF3 | $7EF4 | $7EF5 | - +---------------+---------------+-------+-------+-------+-------+ - - PRG Setup: - --------------------------- - - $8000 $A000 $C000 $E000 - +-------+-------+-------+-------+ - | $7EFA | $7EFC | $7EFE | { -1} | - +-------+-------+-------+-------+ - - Mirroring: - --------------------------- - - [ $7EF0 ][ $7EF0 ] - [ $7EF1 ][ $7EF1 ] - - Mirroring bit of appropriate reg selects NTA or NTB - */ - public sealed class Mapper207 : NES.NESBoardBase - { - int prg_bank_mask, chr_bank_mask; - ByteBuffer chr_regs_1k = new ByteBuffer(8); - ByteBuffer prg_regs_8k = new ByteBuffer(4); - bool mirror0 = false; - bool mirror1 = false; - - public override void SyncState(Serializer ser) - { - base.SyncState(ser); - ser.Sync("chr_regs_1k", ref chr_regs_1k); - ser.Sync("prg_regs_8k", ref prg_regs_8k); - ser.Sync("mirror0", ref mirror0); - ser.Sync("mirror1", ref mirror1); - DoMirroring(); - } - - public override void Dispose() - { - base.Dispose(); - chr_regs_1k.Dispose(); - prg_regs_8k.Dispose(); - } - - public override bool Configure(NES.EDetectionOrigin origin) - { - //configure - switch (Cart.board_type) - { - case "MAPPER207": - break; - case "TAITO-X1-005": - if (Cart.mapper == 207) - { - break; - } - return false; - default: - return false; - } - - SetMirrorType(EMirrorType.Horizontal); - chr_bank_mask = Cart.chr_size / 1 - 1; - prg_bank_mask = Cart.prg_size / 8 - 1; - prg_regs_8k[3] = 0xFF; - return true; - } - - public override void WriteWRAM(int addr, byte value) - { - switch (addr) - { - case 0x1EF0: - mirror0 = value.Bit(7); - int val1 = value & 0x7F; - chr_regs_1k[0] = (byte)(val1/2*2); - chr_regs_1k[1] = (byte)(val1/2*2+1); - break; - case 0x1EF1: - mirror1 = value.Bit(7); - int val2 = value & 0x7F; - chr_regs_1k[2] = (byte)(val2/2*2); - chr_regs_1k[3] = (byte)(val2/2*2+1); - break; - - case 0x1EF2: - chr_regs_1k[4] = value; - break; - case 0x1EF3: - chr_regs_1k[5] = value; - break; - case 0x1EF4: - chr_regs_1k[6] = value; - break; - case 0X1EF5: - chr_regs_1k[7] = value; - break; - - case 0x1EFA: //PRG Reg 0 - case 0x1EFB: - prg_regs_8k[0] = value; - break; - case 0x1EFC: //PRG Reg 1 - case 0x1EFD: - prg_regs_8k[1] = value; - break; - case 0x1EFE: //PRG Reg 2 - case 0x1EFF: - prg_regs_8k[2] = value; - break; - } - DoMirroring(); - } - - private void DoMirroring() - { - int m0 = mirror0?1:0; - int m1 = mirror1?1:0; - SetMirroring(m0, m0, m1, m1); - } - - public override byte ReadPRG(int addr) - { - 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 (addr < 0x2000) - { - - int bank_1k = addr >> 10; - int ofs = addr & ((1 << 10) - 1); - bank_1k = chr_regs_1k[bank_1k]; - bank_1k &= chr_bank_mask; - addr = (bank_1k << 10) | ofs; - return VROM[addr]; - } - else return base.ReadPPU(addr); - } - } -} diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Taito_X1_005.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Taito_X1_005.cs index 66c4811c06..742e97d892 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Taito_X1_005.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Taito_X1_005.cs @@ -2,55 +2,58 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES { - //AKA mapper 80 - - //Minelvaton Saga - //Taito Grand Prix - Eikou heno License - //Kyuukyoku Harikiri Stadium + // Mapper 80. TLSROM variant is Mapper 207 /* - * Registers: - --------------------------- + * Bakushou!! Jinsei Gekijou 2 爆笑!!人生劇場2 + * Fudou Myouou Den 不動明王伝 <=== TLSROM VARIANT!!! + * Kyonshiizu 2 キョンシーズ2 + * Kyuukyoku Harikiri Stadium 究極ハリキリスタジアム + * Minelvaton Saga: Ragon no Fukkatsu ミネルバトンサーガ ラゴンの復活 + * Mirai Shinwa Jarvas 未来神話ジャーヴァス + * Taito Grand Prix: Eikou e no License タイトーグランプリ 栄光へのライセンス + * Yamamura Misa Suspense: Kyouto Ryuu no Tera Satsujin Jiken 山村美紗サスペンス 京都龍の寺殺人事件 + */ - $7EF0-7EF5: CHR Regs - - $7EF6: [.... ...M] Mirroring - 0 = Horz - 1 = Vert - - $7EFA,7EFB: PRG Reg 0 (8k @ $8000) - $7EFC,7EFD: PRG Reg 1 (8k @ $A000) - $7EFE,7EFF: PRG Reg 2 (8k @ $C000) - - - CHR Setup: - --------------------------- - - $0000 $0400 $0800 $0C00 $1000 $1400 $1800 $1C00 - +---------------+---------------+-------+-------+-------+-------+ - | <$7EF0> | <$7EF1> | $7EF2 | $7EF3 | $7EF4 | $7EF5 | - +---------------+---------------+-------+-------+-------+-------+ - - PRG Setup: - --------------------------- - - $8000 $A000 $C000 $E000 - +-------+-------+-------+-------+ - | $7EFA | $7EFC | $7EFE | { -1} | - +-------+-------+-------+-------+ - */ + /* + * Registers should be masked with $ff7f. + * + * $7e70: 2k chr @ PPU $0000 (lsb ignored) + * $7e71: 2k chr @ PPU $0800 (lsb ignored) + * $7e72: 1k chr @ PPU $1000 + * $7e73: 1k chr @ PPU $1400 + * $7e74: 1k chr @ PPU $1800 + * $7e75: 1k chr @ PPU $1c00 + * $7e76,$7e77: mirroring. bit0: 0 = H, 1 = V + * $7e78,$7e79: prg wram protect. must be $a3 to enable read+write + * $7e7a,$7e7b: 8k prg @ cpu $8000 + * $7e7c,$7e7d: 8k prg @ cpu $a000 + * $7e7e,$7e7f: 8k prg @ cpu $c000 + * + * $7f00:$7f7f: 128 bytes internal prg ram, mirrored on CPU A7 + * + * 8k prg @ cpu $e000 is fixed to last 8k of rom. + * in TLSROM-like mode (mapper 207), mirroring reg is ignored, + * and top bit of CHR regs (normally CHRROM A17) is used as CIRAM A10 + * + */ public sealed class TAITO_X1_005 : NES.NESBoardBase { + // config int prg_bank_mask, chr_bank_mask; + bool tlsrewire = false; + // state ByteBuffer chr_regs_1k = new ByteBuffer(8); ByteBuffer prg_regs_8k = new ByteBuffer(4); + bool wramenable = false; public override void SyncState(Serializer ser) { base.SyncState(ser); ser.Sync("chr_regs_1k", ref chr_regs_1k); ser.Sync("prg_regs_8k", ref prg_regs_8k); + ser.Sync("wramenable", ref wramenable); } public override void Dispose() @@ -67,11 +70,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES { case "MAPPER080": break; + case "MAPPER207": + tlsrewire = true; + break; case "TAITO-X1-005": - if (Cart.mapper == 207) - { - return false; - } + if (Cart.pcb == "アシユラー") + tlsrewire = true; break; default: return false; @@ -80,58 +84,91 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES SetMirrorType(EMirrorType.Vertical); chr_bank_mask = Cart.chr_size / 1 - 1; prg_bank_mask = Cart.prg_size / 8 - 1; + + // the chip has 128 bytes of WRAM built into it, which we have to instantiate ourselves + Cart.wram_size = 0; + prg_regs_8k[3] = 0xFF; return true; } + public override void PostConfigure() + { + WRAM = new byte[128]; + base.PostConfigure(); + } + public override void WriteWRAM(int addr, byte value) { + addr &= 0x1f7f; + + if (addr >= 0x1f00) + { + if (wramenable) + WRAM[addr & 0x7f] = value; + return; + } + switch (addr) { - case 0x1EF6: + case 0x1E76: + case 0x1E77: if (value.Bit(0)) SetMirrorType(EMirrorType.Vertical); else SetMirrorType(EMirrorType.Horizontal); break; - case 0x1EF0: - chr_regs_1k[0] = (byte)(value/2*2); - chr_regs_1k[1] = (byte)(value/2*2+1); + case 0x1E70: + chr_regs_1k[0] = (byte)(value & ~1); + chr_regs_1k[1] = (byte)(value | 1); break; - case 0x1EF1: - chr_regs_1k[2] = (byte)(value/2*2); - chr_regs_1k[3] = (byte)(value/2*2+1); + case 0x1E71: + chr_regs_1k[2] = (byte)(value & ~1); + chr_regs_1k[3] = (byte)(value | 1); break; - - case 0x1EF2: + + case 0x1E72: chr_regs_1k[4] = value; break; - case 0x1EF3: + case 0x1E73: chr_regs_1k[5] = value; break; - case 0x1EF4: + case 0x1E74: chr_regs_1k[6] = value; break; - case 0X1EF5: + case 0X1E75: chr_regs_1k[7] = value; break; - case 0x1EFA: //PRG Reg 0 - case 0x1EFB: + case 0x1E78: + case 0x1E79: + wramenable = value == 0xa3; + break; + + case 0x1E7A: //PRG Reg 0 + case 0x1E7B: prg_regs_8k[0] = value; break; - case 0x1EFC: //PRG Reg 1 - case 0x1EFD: + case 0x1E7C: //PRG Reg 1 + case 0x1E7D: prg_regs_8k[1] = value; break; - case 0x1EFE: //PRG Reg 2 - case 0x1EFF: + case 0x1E7E: //PRG Reg 2 + case 0x1E7F: prg_regs_8k[2] = value; break; } } + public override byte ReadWRAM(int addr) + { + if (addr >= 0x1f00 && wramenable) + return WRAM[addr & 0x7f]; + else + return NES.DB; + } + public override byte ReadPRG(int addr) { int bank_8k = addr >> 13; @@ -153,24 +190,39 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES addr = (bank_1k << 10) | ofs; return VROM[addr]; } - else return base.ReadPPU(addr); + else if (tlsrewire) + { + int bank_1k = addr >> 10; + int ofs = addr & ((1 << 10) - 1); + bank_1k = chr_regs_1k[bank_1k & 7]; // ignore PPU A13 + bank_1k >>= 7; // top bit is used + addr = (bank_1k << 10) | ofs; + return NES.CIRAM[addr]; + } + else + { + return base.ReadPPU(addr); + } + } + + public override void WritePPU(int addr, byte value) + { + if (addr >= 0x2000) + { + if (tlsrewire) + { + int bank_1k = addr >> 10; + int ofs = addr & ((1 << 10) - 1); + bank_1k = chr_regs_1k[bank_1k & 7]; // ignore PPU A13 + bank_1k >>= 7; // top bit is used + addr = (bank_1k << 10) | ofs; + NES.CIRAM[addr] = value; + } + else + { + base.WritePPU(addr, value); + } + } } } } - - - - - - -/* - CHR Setup: - --------------------------- - - $0000 $0400 $0800 $0C00 $1000 $1400 $1800 $1C00 - +---------------+---------------+-------+-------+-------+-------+ - CHR Mode 0: | <$7EF0> | <$7EF1> | $7EF2 | $7EF3 | $7EF4 | $7EF5 | - +---------------+---------------+---------------+---------------+ - CHR Mode 1: | $7EF2 | $7EF3 | $7EF4 | $7EF5 | <$7EF0> | <$7EF1> | - +-------+-------+-------+-------+---------------+---------------+ - */ \ No newline at end of file