[ChannelFHawk] Implement the Sean Riddle multi-cart mapper

This commit is contained in:
Asnivor 2024-09-05 13:41:57 +01:00
parent c77486f88d
commit 8ae73ed850
5 changed files with 37 additions and 13 deletions

View File

@ -18,10 +18,10 @@ E1FB8D61FFE07B53869A93A8AD0C04A8 B Robot War (1977)(Fairchild)(proto)[b] Channel
;;;;;;;;;;--------------------------------------------------;;;;;;;;;; ;;;;;;;;;;--------------------------------------------------;;;;;;;;;;
;;; Hacks ;;; Hacks
;;;;;;;;;;--------------------------------------------------;;;;;;;;;; ;;;;;;;;;;--------------------------------------------------;;;;;;;;;;
02B4A4F523B972C63FEF21BF2E51AE58 Channel F Multi-Cart - Menu (2004)(Riddle, Sean) ChannelF board=SCHACH 02B4A4F523B972C63FEF21BF2E51AE58 Channel F Multi-Cart - Menu (2004)(Riddle, Sean) ChannelF board=RIDDLE
DFC3DF32F9FB558A6E54928559D67FE7 Channel F Multi-Cart (2004)(Riddle, Sean) ChannelF board=SCHACH DFC3DF32F9FB558A6E54928559D67FE7 Channel F Multi-Cart (2004)(Riddle, Sean) ChannelF board=RIDDLE
4B3657594CD1000D08704F4F0FB53C75 Channel F Multi-Cart - Menu (2004)(Riddle, Sean)[a] ChannelF board=SCHACH 4B3657594CD1000D08704F4F0FB53C75 Channel F Multi-Cart - Menu (2004)(Riddle, Sean)[a] ChannelF board=RIDDLE
0C8AE0E5776D48022F8D2B9642C6A197 Channel F Multi-Cart (2004)(Riddle, Sean)[a] ChannelF board=SCHACH 0C8AE0E5776D48022F8D2B9642C6A197 Channel F Multi-Cart (2004)(Riddle, Sean)[a] ChannelF board=RIDDLE
533BAC14DE68FBA49078EEF8E9502DD2 Hangman (USA) (Multicart Hack) ChannelF board=SCHACH USA 533BAC14DE68FBA49078EEF8E9502DD2 Hangman (USA) (Multicart Hack) ChannelF board=SCHACH USA
ABC6FC7083B66A65C1E18EBF911F6689 Maze + Jailbreak + Blind-man's-bluff + Trailblazer (1977)(Fairchild)[h] ChannelF board=SCHACH USA ABC6FC7083B66A65C1E18EBF911F6689 Maze + Jailbreak + Blind-man's-bluff + Trailblazer (1977)(Fairchild)[h] ChannelF board=SCHACH USA

View File

@ -34,6 +34,8 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
protected byte[] _ram; protected byte[] _ram;
public bool ActivityLED; public bool ActivityLED;
public int MultiBank;
public int MultiHalfBank;
// SRAM config // SRAM config
// taken from https://github.com/mamedev/mame/blob/ee1e4f9683a4953cb9d88f9256017fcbc38e3144/src/devices/bus/chanf/rom.cpp // taken from https://github.com/mamedev/mame/blob/ee1e4f9683a4953cb9d88f9256017fcbc38e3144/src/devices/bus/chanf/rom.cpp
@ -65,6 +67,10 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
case "MAZE": case "MAZE":
return new mapper_MAZE(rom); return new mapper_MAZE(rom);
case "RIDDLE":
// Sean Riddle's modified SCHACH multi-cart
return new mapper_RIDDLE(rom);
case "SCHACH": case "SCHACH":
default: default:
// F3853 Memory Interface Chip, 6KB of ROM and 2KB of RAM // F3853 Memory Interface Chip, 6KB of ROM and 2KB of RAM
@ -157,7 +163,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
} }
} }
public void Reset() public virtual void Reset()
{ {
m_latch[0] = 0; m_latch[0] = 0;
m_latch[1] = 0; m_latch[1] = 0;
@ -177,6 +183,8 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
ser.Sync(nameof(m_read_write), ref m_read_write); ser.Sync(nameof(m_read_write), ref m_read_write);
ser.Sync(nameof(m_data0), ref m_data0); ser.Sync(nameof(m_data0), ref m_data0);
ser.Sync(nameof(ActivityLED), ref ActivityLED); ser.Sync(nameof(ActivityLED), ref ActivityLED);
ser.Sync(nameof(MultiBank), ref MultiBank);
ser.Sync(nameof(MultiHalfBank), ref MultiHalfBank);
ser.EndSection(); ser.EndSection();
} }
} }

View File

@ -1,4 +1,6 @@
namespace BizHawk.Emulation.Cores.Consoles.ChannelF using BizHawk.Common.NumberExtensions;
namespace BizHawk.Emulation.Cores.Consoles.ChannelF
{ {
/// <summary> /// <summary>
/// Sean Riddle's modified SCHACH cart mapper (multi-cart) (WIP) /// Sean Riddle's modified SCHACH cart mapper (multi-cart) (WIP)
@ -9,7 +11,7 @@
public mapper_RIDDLE(byte[] rom) public mapper_RIDDLE(byte[] rom)
{ {
ROM = new byte[0x10000 - 0x800]; ROM = new byte[rom.Length];
for (int i = 0; i < rom.Length; i++) for (int i = 0; i < rom.Length; i++)
{ {
ROM[i] = rom[i]; ROM[i] = rom[i];
@ -31,7 +33,7 @@
else else
{ {
if (off < ROM.Length) if (off < ROM.Length)
result = ROM[off]; result = ROM[off + (MultiBank * 0x2000) + (MultiHalfBank * 0x1000)];
} }
return (byte)result; return (byte)result;
@ -44,14 +46,15 @@
{ {
RAM[addr - 0x2800] = value; RAM[addr - 0x2800] = value;
} }
else if (addr == 0x3800) else if (addr == 0x3000)
{ {
// activity LED // bank switching
ActivityLED = !ActivityLED; MultiBank = value & 0x1F;
MultiHalfBank = (value & 0x20) >> 5;
} }
else else
{ {
} }
} }
@ -64,5 +67,12 @@
{ {
// no writeable hardware // no writeable hardware
} }
public override void Reset()
{
base.Reset();
MultiBank = 0;
MultiHalfBank = 0;
}
} }
} }

View File

@ -74,5 +74,11 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
public void Dispose() public void Dispose()
{ {
} }
private void ConsoleReset()
{
CPU.Reset();
Cartridge.Reset();
}
} }
} }

View File

@ -40,7 +40,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
if (key == "RESET" && StateConsole[i]) if (key == "RESET" && StateConsole[i])
{ {
CPU.Reset(); ConsoleReset();
for (int l = 0; l < OutputLatch.Length; l++) for (int l = 0; l < OutputLatch.Length; l++)
{ {
OutputLatch[l] = 0; OutputLatch[l] = 0;