diff --git a/Assets/gamedb/gamedb_channelf.txt b/Assets/gamedb/gamedb_channelf.txt
index e8d7681bd9..ae3f039bca 100644
--- a/Assets/gamedb/gamedb_channelf.txt
+++ b/Assets/gamedb/gamedb_channelf.txt
@@ -8,12 +8,16 @@
;;;;;;;;;;--------------------------------------------------;;;;;;;;;;
C8D5CE90CB1C76C9589711B5029D3421 B Color Organ (19xx)(-)[b] ChannelF
3EF873268F8FC428DA225CADABB4703F B Democart (demo) (1977)(Fairchild)[b] ChannelF
+0CFD9B9213CFF4A9DF9DD7FEA4663236 B Spitfire (USA) (proto)[b] ChannelF board=STD USA
+7385E596BF2A58E2186439AC1E49C075 B Schach (Germany) [b] ChannelF board=SCHACH Germany
;
;;;;;;;;;;--------------------------------------------------;;;;;;;;;;
;;; Hacks
;;;;;;;;;;--------------------------------------------------;;;;;;;;;;
02B4A4F523B972C63FEF21BF2E51AE58 Channel F Multi-Cart - Menu (2004)(Riddle, Sean) ChannelF
4B3657594CD1000D08704F4F0FB53C75 Channel F Multi-Cart - Menu (2004)(Riddle, Sean)[a] ChannelF
+ABC6FC7083B66A65C1E18EBF911F6689 Maze, Jailbreak, Blind-man's-bluff, Trailblazer (USA) (Multicart Hack) ChannelF board=SCHACH USA
+533BAC14DE68FBA49078EEF8E9502DD2 Hangman (USA) (Multicart Hack) ChannelF board=SCHACH USA
;
;;;;;;;;;;--------------------------------------------------;;;;;;;;;;
;;; Over Dumps
@@ -33,46 +37,86 @@ D337BE6E8F348FB329FBAF44D3C2FA17 D International Karate Demo Test 2 (200x)(-)(PD
A6607B7C30CC4A7695D3112B3271D4E8 D International Karate Demo Test 3 (200x)(-)(PD) ChannelF
7DD3F1040C774FE147FC1D825B353524 D International Karate Demo Test 5 (200x)(-)(PD) ChannelF
F680225A38C3C4A66E30DBCA8D351407 D Test Controls (200x)(e5frog)(PD) ChannelF
+D7050AF61479AA549206250441AA2B0F D Tetris (2004)(Trauner, Peter)[p] ChannelF board=SCHACH USA
+2AEBEDA05478E8B7F5C1ECA037AC6C2F D Tetris (2004)(Trauner, Peter)[p][a] ChannelF board=SCHACH USA
;;;;;;;;;;--------------------------------------------------;;;;;;;;;;
;;; Believed Good
;;;;;;;;;;--------------------------------------------------;;;;;;;;;;
-F7BF7D55A7660FFA80D08AD1BA903FF7 Alien Invasion (USA) ChannelF USA
-D89B48AE8C906488CAAC2B2AE1D63D88 Backgammon, Acey-Deucey (USA) ChannelF USA
-4FA83F734C139963AA02BDBB7A52E500 Baseball (USA) ChannelF USA
+7E5C26A6D1F9A90C68669A9800BA522D Tic-Tac-Toe, Shooting Gallery, Doodle, Quadra-Doodle (USA) ChannelF board=STD USA
+1FBD86DCCA0E4619963B902C48AE77F2 Muehle, Tontauben-Schiessen, Kreatives Malspiel, Videoscope (Germany) ChannelF board=STD Germany
+4F11F13CBCA685CB20E888F87B3B1586 Desert Fox, Shooting Gallery (USA) ChannelF board=STD USA
+B074C867F235FB69CED96C6916673B45 Video Blackjack (USA) ChannelF board=STD USA
+1B409FE1154584F4D1AB76B344A73D99 Spitfire (USA) ChannelF board=STD USA
+5B86FE22007E6D0A92247809AC8934E9 Spitfire (USA) (proto) ChannelF board=STD USA
+32CCA8FF09041A39251D7AADE21EE22F Space War (USA) ChannelF board=STD USA
+A8E6103FCAE4D0F9E14D9EDCFC3FC493 Math Quiz I - Addition + Subtraction (USA) ChannelF board=STD USA
+86B77EAFDF7B806E19E01724987E384F Math Quiz II - Multiplication + Division (USA) ChannelF board=STD USA
+4C10FA5C7316C59EFA241043FC67DFA8 Magic Numbers - Mind Reader + Nim (USA) ChannelF board=STD USA
+F80AF74B09D058B90E719BB7DFBDD50E Drag Race (USA) ChannelF board=STD USA
+6565DF74539476D66FD78DE1BAC0259C Maze, Jailbreak, Blind-man's-bluff, Trailblazer (USA) ChannelF board=MAZE USA
+53E4CC2DA0F2C167E0692B794CB7692C Maze, Jailbreak, Blind-man's-bluff, Trailblazer (USA) (Alt 1) ChannelF board=MAZE USA
+5DB71E3B0CD13F7C42790A2CD9072CA1 Maze, Jailbreak, Blind-man's-bluff, Trailblazer (USA) (Alt 2) ChannelF board=MAZE USA
+D89B48AE8C906488CAAC2B2AE1D63D88 Backgammon, Acey-Deucey (USA) ChannelF board=STD USA
+4FA83F734C139963AA02BDBB7A52E500 Baseball (USA) ChannelF board=STD USA
+3783B6AC359E21B99CFA17773AA811C6 Robot War, Torpedo Alley (USA) ChannelF board=STD USA
+FACB452602F59FDDDE1CFBC4D598A282 Robot War (USA) (proto) ChannelF board=STD USA
+FACB452602F59FDDDE1CFBC4D598A282 Robot War (USA) (proto) [b] ChannelF board=STD USA
+4CB12EDAE37DF23851884B82CA410754 Sonar Search (USA) ChannelF board=STD USA
+2B3CA549E27579E4519A765FD8F52D0F Memory Match 1 & 2 (USA) ChannelF board=STD USA
+6FFEDAED3C5CD8BA74D98901849CC451 Dodge It (USA) ChannelF board=STD USA
+E90339B7068C6227D54F3C0CA637E017 Pinball Challenge (USA) ChannelF board=STD USA
+5CBCDA1C44F0DAD02B0DFE209B6325D5 Pinball Challenge (USA) (Alt 1) ChannelF board=STD USA
+0124CD0B61DF5502AABD59029CCB6D5A Hangman (USA) ChannelF board=HANG USA
+35D61D40EF7EC337CBA092AABAC74DBD Checkers (USA) ChannelF board=STD USA
+90A9B3952568F91502A7088BFB0AE07E Video Whizball (USA) ChannelF board=STD USA
25E231E7A464A32B4715BFB47AF89240 Bowling (USA) ChannelF board=STD USA
-BB7F7BBBE21F142591CDCAFA98D7F6E4 Casino Poker (USA) ChannelF USA
-35D61D40EF7EC337CBA092AABAC74DBD Checkers (USA) ChannelF USA
+DFB66EE145FAB65062FDEADAFC8DC34C Slot Machine (USA) ChannelF board=STD USA
+9E0711B140E22729687DB1E1354980AB Galactic Space Wars, Lunar Lander (USA) ChannelF board=STD USA
+5CCCEE534FD002AF6EB4FCAAA6B95D88 Glactic Space Wars (proto) (USA) ChannelF board=STD USA
+9A894D745356A050F95410983C3BC54A Pro Football (USA) ChannelF board=STD USA
+BB7F7BBBE21F142591CDCAFA98D7F6E4 Casino Poker (USA) ChannelF board=STD USA
+F7BF7D55A7660FFA80D08AD1BA903FF7 Alien Invasion (USA) ChannelF board=STD USA
+
+C2A44D22D3865B036479E9311C74D3AD Ordtaevling (Sweden) ChannelF board=hang Sweden
+913ECBAA30816C6D78DE8651251761FC Rat' Mal (Germany) ChannelF board=hang Germany
+5568205F926333914DEDC8EF8BF16AF2 Schach (Germany) ChannelF board=SCHACH Germany
+7B227DE474806A8AB9474C4716A270B7 Schach [b] (Actually Tennis) ChannelF board=SCHACH Germany
+
+
+
+
+
94530113A22AE27AF6ED87B98D9AF62A Color Organ (19xx)(-) ChannelF
C44BE208013B82041D01D2BC1834060B Colortest Demo (200x)(Riddle, Sean) ChannelF
54CF17C48707467295749490D458EAFB Democart (demo) (1977)(Fairchild) ChannelF
F6916B665893AA8138CDE57C37E50ADA Democart 2 (demo) (197x)(Fairchild) ChannelF
54CF17C48707467295749490D458EAFB Demonstration Cartridge (USA) ChannelF USA
F6916B665893AA8138CDE57C37E50ADA Demonstration Cartridge 2 (USA) ChannelF USA
-4F11F13CBCA685CB20E888F87B3B1586 Desert Fox, Shooting Gallery (USA) ChannelF USA
-6FFEDAED3C5CD8BA74D98901849CC451 Dodge It (USA) ChannelF USA
-F80AF74B09D058B90E719BB7DFBDD50E Drag Race (USA) ChannelF USA
-9E0711B140E22729687DB1E1354980AB Galactic Space Wars, Lunar Lander (USA) ChannelF USA
-0124CD0B61DF5502AABD59029CCB6D5A Hangman (USA) ChannelF board=HANG USA
-4C10FA5C7316C59EFA241043FC67DFA8 Magic Numbers - Mind Reader + Nim (USA) ChannelF USA
-A8E6103FCAE4D0F9E14D9EDCFC3FC493 Math Quiz I - Addition + Subtraction (USA) ChannelF USA
-86B77EAFDF7B806E19E01724987E384F Math Quiz II - Multiplication + Division (USA) ChannelF USA
-6565DF74539476D66FD78DE1BAC0259C Maze, Jailbreak, Blind-man's-bluff, Trailblazer (USA) ChannelF board=MAZE USA
-53E4CC2DA0F2C167E0692B794CB7692C Maze, Jailbreak, Blind-man's-bluff, Trailblazer (USA) (Alt 1) ChannelF board=MAZE USA
-2B3CA549E27579E4519A765FD8F52D0F Memory Match 1 & 2 (USA) ChannelF USA
-1FBD86DCCA0E4619963B902C48AE77F2 Muehle, Tontauben-Schiessen, Kreatives Malspiel, Videoscope (Germany) ChannelF Germany
-C2A44D22D3865B036479E9311C74D3AD Ordtaevling (Sweden) ChannelF Sweden
-E90339B7068C6227D54F3C0CA637E017 Pinball Challenge (USA) ChannelF USA
-5CBCDA1C44F0DAD02B0DFE209B6325D5 Pinball Challenge (USA) (Alt 1) ChannelF USA
-9A894D745356A050F95410983C3BC54A Pro Football (USA) ChannelF USA
-913ECBAA30816C6D78DE8651251761FC Rat' Mal (Germany) ChannelF Germany
-3783B6AC359E21B99CFA17773AA811C6 Robot War, Torpedo Alley (USA) ChannelF USA
-5568205F926333914DEDC8EF8BF16AF2 Schach (Germany) ChannelF board=SCHACH Germany
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
442E362A39018F2D117F43FE013D1D8B Scrolling Mountains (200x)(Curtdawg) ChannelF
-DFB66EE145FAB65062FDEADAFC8DC34C Slot Machine (USA) ChannelF USA
-4CB12EDAE37DF23851884B82CA410754 Sonar Search (USA) ChannelF USA
-32CCA8FF09041A39251D7AADE21EE22F Space War (USA) ChannelF USA
-1B409FE1154584F4D1AB76B344A73D99 Spitfire (USA) ChannelF USA
-7E5C26A6D1F9A90C68669A9800BA522D Tic-Tac-Toe, Shooting Gallery, Doodle, Quadra-Doodle (USA) ChannelF USA
-B074C867F235FB69CED96C6916673B45 Video Blackjack (USA) ChannelF USA
-90A9B3952568F91502A7088BFB0AE07E Video Whizball (USA) ChannelF USA
+
+
+
+
+
+
C3C7B3246E50117BD5CDDB2B53E6FBAE Werbetextcassette (198x)(Electronic-Partner)(DE) ChannelF DE
diff --git a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Audio.cs b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Audio.cs
index 4ba0c002b9..508cc1bf95 100644
--- a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Audio.cs
+++ b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Audio.cs
@@ -45,7 +45,6 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
if (tone == 0)
{
// silence
- amplitude = 0;
}
else
{
diff --git a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Cart.cs b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Cart.cs
deleted file mode 100644
index 94627703d7..0000000000
--- a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Cart.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace BizHawk.Emulation.Cores.Consoles.ChannelF
-{
- ///
- /// Cartridge and related functions
- ///
- public partial class ChannelF
- {
- //public byte[] Rom = new byte[4096];
- }
-}
diff --git a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Cart/VesCartBase.cs b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Cart/VesCartBase.cs
index 6cf2183516..3c575d7d1e 100644
--- a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Cart/VesCartBase.cs
+++ b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Cart/VesCartBase.cs
@@ -50,7 +50,8 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
switch (boardStr)
{
// standard cart layout - default to this
- case "STD":
+ case "STD":
+ default:
// any number of F3851 Program Storage Units (1KB ROM each) or F3856 Program Storage Unit (2KB ROM)
// no on-pcb RAM and no extra IO
return new mapper_STD(rom);
@@ -59,7 +60,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
return new mapper_MAZE(rom);
case "SCHACH":
- default:
+
// F3853 Memory Interface Chip, 6KB of ROM and 2KB of RAM
return new mapper_SCHACH(rom);
@@ -69,92 +70,86 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
}
}
- ///
- /// Write method for carts that have an IO-accessible 2102 SRAM chip
- /// Taken from: https://github.com/mamedev/mame/blob/ee1e4f9683a4953cb9d88f9256017fcbc38e3144/src/devices/bus/chanf/rom.cpp
- /// license:BSD-3-Clause
- /// copyright-holders:Fabio Priuli
- ///
- public void SRAM2102_Write(int index, byte data)
- {
- switch (index)
- {
- case 0:
- m_latch[0] = data;
-
- m_read_write = data.Bit(0) ? 1 : 0;// BIT(data, 0);
-
- //m_addr_latch = (m_addr_latch & 0x3f3) | (BIT(data, 2) << 2) | (BIT(data, 1) << 3); // bits 2,3 come from this write!
- m_addr_latch = (ushort)((m_addr_latch & 0x3f3) | (data.Bit(2) ? 1 : 0 << 2) | (data.Bit(1) ? 1 : 0 << 3)); // bits 2,3 come from this write!
-
- m_addr = m_addr_latch;
-
- m_data0 = data.Bit(3) ? 1 : 0; // BIT(data, 3);
-
- if (m_read_write == 1)
- RAM[m_addr] = (byte)m_data0;
- break;
-
- case 1:
- m_latch[1] = data;
- // all bits but 2,3 come from this write, but they are shuffled
- // notice that data is 8bits, so when swapping bit8 & bit9 are always 0!
- //m_addr_latch = (m_addr_latch & 0x0c) | (bitswap < 16 > ((uint16_t)data, 15, 14, 13, 12, 11, 10, 7, 6, 5, 3, 2, 1, 9, 8, 4, 0));
-
- if (m_addr_latch > 0)
- {
- BitArray b = new BitArray(m_addr_latch);
- b[9] = m_addr_latch.Bit(7);
- b[8] = m_addr_latch.Bit(6);
- b[7] = m_addr_latch.Bit(5);
- b[6] = m_addr_latch.Bit(3);
- b[5] = m_addr_latch.Bit(2);
- b[4] = m_addr_latch.Bit(1);
- b[3] = m_addr_latch.Bit(3);
- b[2] = m_addr_latch.Bit(2);
- b[1] = m_addr_latch.Bit(4);
- b[0] = m_addr_latch.Bit(0);
- var resBytes = new byte[1];
- b.CopyTo(resBytes, 0);
- m_addr_latch = resBytes[0];
- }
-
- break;
-
- default:
-
- break;
- }
- }
-
///
/// Read method for carts that have an IO-accessible 2102 SRAM chip
- /// Taken from: https://github.com/mamedev/mame/blob/ee1e4f9683a4953cb9d88f9256017fcbc38e3144/src/devices/bus/chanf/rom.cpp
+ /// Based on: https://github.com/mamedev/mame/blob/ee1e4f9683a4953cb9d88f9256017fcbc38e3144/src/devices/bus/chanf/rom.cpp
/// license:BSD-3-Clause
/// copyright-holders:Fabio Priuli
///
public byte SRAM2102_Read(int index)
{
- switch (index)
+ if (index == 0)
{
- case 0:
- if (m_read_write == 0)
- {
- m_addr = m_addr_latch;
- m_data0 = RAM[m_addr] & 1;
- return (byte)((m_latch[0] & 0x7f) | (m_data0 << 7));
- }
+ if (m_read_write == 0)
+ {
+ m_addr = m_addr_latch;
+ m_data0 = RAM[m_addr] & 1;
+ return (byte)((m_latch[0] & 0x7f) | (m_data0 << 7));
+ }
- return m_latch[0];
-
- case 1:
- return m_latch[1];
-
- default:
- return 0xFF;
+ return m_latch[0];
+ }
+ else
+ {
+ return m_latch[1];
}
}
+ ///
+ /// Write method for carts that have an IO-accessible 2102 SRAM chip
+ /// Based on: https://github.com/mamedev/mame/blob/ee1e4f9683a4953cb9d88f9256017fcbc38e3144/src/devices/bus/chanf/rom.cpp
+ /// license:BSD-3-Clause
+ /// copyright-holders:Fabio Priuli
+ ///
+ public void SRAM2102_Write(int index, byte data)
+ {
+ if (index == 0)
+ {
+ m_latch[0] = data;
+
+ m_read_write = data.Bit(0) ? 1 : 0;// BIT(data, 0);
+
+ //m_addr_latch = (m_addr_latch & 0x3f3) | (BIT(data, 2) a<< 2) | (BIT(data, 1) << 3); // bits 2,3 come from this write!
+ m_addr_latch = (ushort)((m_addr_latch & 0x3f3) | ((data.Bit(2) ? 1 : 0) << 2) | ((data.Bit(1) ? 1 : 0) << 3)); // bits 2,3 come from this write!
+
+ m_addr = m_addr_latch;
+
+ m_data0 = data.Bit(3) ? 1 : 0; // BIT(data, 3);
+
+ if (m_read_write == 1)
+ {
+ RAM[m_addr] = (byte)m_data0;
+ }
+ }
+ else
+ {
+ m_latch[1] = data;
+ // all bits but 2,3 come from this write, but they are shuffled
+ // notice that data is 8bits, so when swapping bit8 & bit9 are always 0!
+ //m_addr_latch = (m_addr_latch & 0x0c) | (bitswap < 16 > ((uint16_t)data, 15, 14, 13, 12, 11, 10, 7, 6, 5, 3, 2, 1, 9, 8, 4, 0));
+
+ BitArray b = new BitArray(16);
+ b[3] = false;// data.Bit(3);
+ b[2] = false; // data.Bit(2);
+
+ b[9] = data.Bit(7);
+ b[8] = data.Bit(6);
+ b[7] = data.Bit(5);
+
+ b[6] = data.Bit(3);
+ b[5] = data.Bit(2);
+ b[4] = data.Bit(1);
+
+ b[1] = data.Bit(4);
+
+ b[0] = data.Bit(0);
+
+ var resBytes = new byte[4];
+ b.CopyTo(resBytes, 0);
+ m_addr_latch = (ushort)(resBytes[0] | resBytes[1] << 8);
+ }
+ }
+
public void Reset()
{
m_latch[0] = 0;
diff --git a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Cart/mapper_HANG.cs b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Cart/mapper_HANG.cs
index 3b472e1cda..3669709934 100644
--- a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Cart/mapper_HANG.cs
+++ b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Cart/mapper_HANG.cs
@@ -42,71 +42,15 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
public override byte ReadPort(ushort addr)
{
- var result = 0xFF;
-
- switch (addr)
- {
- case 0x24:
- if (m_read_write == 0)
- {
- m_addr = m_addr_latch;
- m_data0 = RAM[m_addr] & 1;
- return (byte)((m_latch[0] & 0x7f) | (m_data0 << 7));
- }
-
- return m_latch[0];
-
- case 0x25:
- return m_latch[1];
- }
-
- return (byte)result;
+ var index = addr - 0x20;
+ return SRAM2102_Read(index);
}
public override void WritePort(ushort addr, byte data)
{
- switch (addr)
- {
- case 20:
- m_latch[0] = data;
-
- m_read_write = data.Bit(0) ? 1 : 0;// BIT(data, 0);
-
- //m_addr_latch = (m_addr_latch & 0x3f3) | (BIT(data, 2) a<< 2) | (BIT(data, 1) << 3); // bits 2,3 come from this write!
- m_addr_latch = (ushort)((m_addr_latch & 0x3f3) | (data.Bit(2) ? 1 : 0 << 2) | (data.Bit(1) ? 1 : 0 << 3)); // bits 2,3 come from this write!
-
- m_addr = m_addr_latch;
-
- m_data0 = data.Bit(3) ? 1 : 0; // BIT(data, 3);
-
- if (m_read_write == 1)
- RAM[m_addr] = (byte)m_data0;
- break;
-
- case 21:
- m_latch[1] = data;
- // all bits but 2,3 come from this write, but they are shuffled
- // notice that data is 8bits, so when swapping bit8 & bit9 are always 0!
- //m_addr_latch = (m_addr_latch & 0x0c) | (bitswap < 16 > ((uint16_t)data, 15, 14, 13, 12, 11, 10, 7, 6, 5, 3, 2, 1, 9, 8, 4, 0));
-
- BitArray b = new BitArray(m_addr_latch);
- b[9] = m_addr_latch.Bit(7);
- b[8] = m_addr_latch.Bit(6);
- b[7] = m_addr_latch.Bit(5);
- b[6] = m_addr_latch.Bit(3);
- b[5] = m_addr_latch.Bit(2);
- b[4] = m_addr_latch.Bit(1);
- b[3] = m_addr_latch.Bit(3);
- b[2] = m_addr_latch.Bit(2);
- b[1] = m_addr_latch.Bit(4);
- b[0] = m_addr_latch.Bit(0);
- var resBytes = new byte[1];
- b.CopyTo(resBytes, 0);
- m_addr_latch = resBytes[0];
-
- break;
-
- }
- }
+ var index = addr - 0x20;
+ SRAM2102_Write(index, data);
}
+
+ }
}
diff --git a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Cart/mapper_MAZE.cs b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Cart/mapper_MAZE.cs
index 624c4d40af..df851e1e06 100644
--- a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Cart/mapper_MAZE.cs
+++ b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Cart/mapper_MAZE.cs
@@ -21,7 +21,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
ROM[i] = rom[i];
}
- RAM = new byte[400];
+ RAM = new byte[0x400];
}
public override byte ReadBus(ushort addr)
@@ -37,70 +37,14 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
public override byte ReadPort(ushort addr)
{
- var result = 0xFF;
-
- switch (addr)
- {
- case 0x24:
- if (m_read_write == 0)
- {
- m_addr = m_addr_latch;
- m_data0 = RAM[m_addr] & 1;
- return (byte)((m_latch[0] & 0x7f) | (m_data0 << 7));
- }
-
- return m_latch[0];
-
- case 0x25:
- return m_latch[1];
- }
-
- return (byte)result;
+ var index = addr - 0x24;
+ return SRAM2102_Read(index);
}
public override void WritePort(ushort addr, byte data)
{
- switch (addr)
- {
- case 24:
- m_latch[0] = data;
-
- m_read_write = data.Bit(0) ? 1 : 0;// BIT(data, 0);
-
- //m_addr_latch = (m_addr_latch & 0x3f3) | (BIT(data, 2) << 2) | (BIT(data, 1) << 3); // bits 2,3 come from this write!
- m_addr_latch = (ushort)((m_addr_latch & 0x3f3) | (data.Bit(2) ? 1 : 0 << 2) | (data.Bit(1) ? 1 : 0 << 3)); // bits 2,3 come from this write!
-
- m_addr = m_addr_latch;
-
- m_data0 = data.Bit(3) ? 1 : 0; // BIT(data, 3);
-
- if (m_read_write == 1)
- RAM[m_addr] = (byte)m_data0;
- break;
-
- case 25:
- m_latch[1] = data;
- // all bits but 2,3 come from this write, but they are shuffled
- // notice that data is 8bits, so when swapping bit8 & bit9 are always 0!
- //m_addr_latch = (m_addr_latch & 0x0c) | (bitswap < 16 > ((uint16_t)data, 15, 14, 13, 12, 11, 10, 7, 6, 5, 3, 2, 1, 9, 8, 4, 0));
-
- BitArray b = new BitArray(m_addr_latch);
- b[9] = m_addr_latch.Bit(7);
- b[8] = m_addr_latch.Bit(6);
- b[7] = m_addr_latch.Bit(5);
- b[6] = m_addr_latch.Bit(3);
- b[5] = m_addr_latch.Bit(2);
- b[4] = m_addr_latch.Bit(1);
- b[3] = m_addr_latch.Bit(3);
- b[2] = m_addr_latch.Bit(2);
- b[1] = m_addr_latch.Bit(4);
- b[0] = m_addr_latch.Bit(0);
- var resBytes = new byte[1];
- b.CopyTo(resBytes, 0);
- m_addr_latch = resBytes[0];
-
- break;
- }
+ var index = addr - 0x24;
+ SRAM2102_Write(index, data);
}
}
}
diff --git a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Cart/mapper_SCHACH.cs b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Cart/mapper_SCHACH.cs
index afcc274300..c051dadf63 100644
--- a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Cart/mapper_SCHACH.cs
+++ b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Cart/mapper_SCHACH.cs
@@ -11,7 +11,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
///
public class mapper_SCHACH : VesCartBase
{
- public override string BoardType => "MAZE";
+ public override string BoardType => "SCHACH";
public mapper_SCHACH(byte[] rom)
{
diff --git a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Cart/mapper_STD.cs b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Cart/mapper_STD.cs
index 37be4481e4..d12f9ab482 100644
--- a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Cart/mapper_STD.cs
+++ b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Cart/mapper_STD.cs
@@ -26,7 +26,10 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
public override byte ReadBus(ushort addr)
{
var off = addr - 0x800;
- return ROM[off];
+ if (off < ROM.Length)
+ return ROM[off];
+ else
+ return 0xFF;
}
public override void WriteBus(ushort addr, byte value)
diff --git a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.Controllers.cs b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.Controllers.cs
index 5d47226cc9..47dff97356 100644
--- a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.Controllers.cs
+++ b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.Controllers.cs
@@ -119,64 +119,5 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
return (byte)(w & 0xFF);
}
}
-
-
- ///
- /// Cycles through all the input callbacks
- /// This should be done once per frame
- ///
- public bool PollInput()
- {
- bool noInput = true;
-
- InputCallbacks.Call();
-
- lock (this)
- {
- for (int i = 0; i < ButtonsConsole.Length; i++)
- {
- var key = ButtonsConsole[i];
- bool prevState = StateConsole[i]; // CTRLConsole.Bit(i);
- bool currState = _controller.IsPressed(key);
- if (currState != prevState)
- {
- StateConsole[i] = currState;
- noInput = false;
-
- if (key == "RESET" && StateConsole[i] == true)
- {
- CPU.Reset();
- return true;
- }
- }
- }
-
- for (int i = 0; i < ButtonsRight.Length; i++)
- {
- var key = "P1 " + ButtonsRight[i];
- bool prevState = StateRight[i];
- bool currState = _controller.IsPressed(key);
- if (currState != prevState)
- {
- StateRight[i] = currState;
- noInput = false;
- }
- }
-
- for (int i = 0; i < ButtonsLeft.Length; i++)
- {
- var key = "P2 " + ButtonsLeft[i];
- bool prevState = StateLeft[i];
- bool currState = _controller.IsPressed(key);
- if (currState != prevState)
- {
- StateLeft[i] = currState;
- noInput = false;
- }
- }
- }
-
- return noInput;
- }
}
}
diff --git a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.IEmulator.cs b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.IEmulator.cs
index 7ed033c0bd..1eeaa8fa1a 100644
--- a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.IEmulator.cs
+++ b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.IEmulator.cs
@@ -12,8 +12,8 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
public bool DeterministicEmulation { get; set; }
- private static readonly double cpuFreq = 1.7897725;
- private static readonly double refreshRate = 60;
+ private double cpuFreq => region == RegionType.NTSC ? 1.7897725 : 2.000000;
+ private double refreshRate => region == RegionType.NTSC ? 60 : 50;
public int ClockPerFrame;
public int FrameClock = 0;
@@ -29,7 +29,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
public bool FrameAdvance(IController controller, bool render, bool renderSound)
{
_controller = controller;
- _isLag = false;
+ _isLag = true;
if (_tracer.IsEnabled())
{
@@ -40,29 +40,33 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
CPU.TraceCallback = null;
}
- _isLag = PollInput();
-
while (FrameClock++ < ClockPerFrame)
{
CPU.ExecuteOne();
}
+ PollInput();
+
FrameClock = 0;
_frame++;
+
+ if (_isLag)
+ _lagCount++;
+
return true;
}
private int _frame;
#pragma warning disable CS0414
- private int _lagcount;
- private bool _islag;
+ //private int _lagcount;
+ //private bool _islag;
#pragma warning restore CS0414
public void ResetCounters()
{
_frame = 0;
- _lagcount = 0;
- _islag = false;
+ _lagCount = 0;
+ _isLag = false;
}
public int Frame => _frame;
diff --git a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.ISettable.cs b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.ISettable.cs
index 47f3cdc1a9..cbb0ff2eed 100644
--- a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.ISettable.cs
+++ b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.ISettable.cs
@@ -56,6 +56,10 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
[Description("If true, the core agrees to behave in a completely deterministic manner")]
[DefaultValue(true)]
public bool DeterministicEmulation { get; set; }
+ [DisplayName("Region")]
+ [Description("NTSC or PAL - Affects the CPU clock speed and refresh rate")]
+ [DefaultValue(RegionType.NTSC)]
+ public RegionType Region { get; set; }
public ChannelFSyncSettings Clone()
{
@@ -72,5 +76,11 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
return !DeepEquality.DeepEquals(x, y);
}
}
+
+ public enum RegionType
+ {
+ NTSC,
+ PAL
+ }
}
}
diff --git a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.IVideoProvider.cs b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.IVideoProvider.cs
index 3c35b83bb6..742dc03ce2 100644
--- a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.IVideoProvider.cs
+++ b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.IVideoProvider.cs
@@ -60,15 +60,14 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
}
- public int _frameHz = 60;
+ //public int _frameHz => region == RegionType.NTSC ? 60 : 50;
public int[] CroppedBuffer = new int[102 * 58];
-
public int VirtualWidth => BufferWidth * 4;
- public int VirtualHeight => (int)((double)BufferHeight * 1.15) * 4;
+ public int VirtualHeight => (int)((double)BufferHeight * 1.43) * 4;
public int BufferWidth => 102; //128
public int BufferHeight => 58; //64
public int BackgroundColor => Colors.ARGB(0xFF, 0xFF, 0xFF);
- public int VsyncNumerator => _frameHz;
+ public int VsyncNumerator => (int)refreshRate;
public int VsyncDenominator => 1;
public int[] GetVideoBuffer()
@@ -98,6 +97,6 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
return CroppedBuffer;
}
- public DisplayType Region => DisplayType.NTSC;
+ public DisplayType Region => region == RegionType.NTSC ? DisplayType.NTSC : DisplayType.PAL;
}
}
diff --git a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.InputPollable.cs b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.InputPollable.cs
index ed8c28be36..20af8691dd 100644
--- a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.InputPollable.cs
+++ b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.InputPollable.cs
@@ -20,5 +20,67 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
private int _lagCount = 0;
private bool _isLag = false;
+
+ ///
+ /// Cycles through all the input callbacks
+ /// This should be done once per frame
+ ///
+ public bool PollInput()
+ {
+ bool noInput = true;
+
+ InputCallbacks.Call();
+
+ lock (this)
+ {
+ for (int i = 0; i < ButtonsConsole.Length; i++)
+ {
+ var key = ButtonsConsole[i];
+ bool prevState = StateConsole[i]; // CTRLConsole.Bit(i);
+ bool currState = _controller.IsPressed(key);
+ if (currState != prevState)
+ {
+ StateConsole[i] = currState;
+ noInput = false;
+
+ if (key == "RESET" && StateConsole[i] == true)
+ {
+ CPU.Reset();
+ for (int l = 0; l < OutputLatch.Length; l++)
+ {
+ OutputLatch[l] = 0;
+ }
+ return true;
+ }
+ }
+ }
+
+ for (int i = 0; i < ButtonsRight.Length; i++)
+ {
+ var key = "P1 " + ButtonsRight[i];
+ bool prevState = StateRight[i];
+ bool currState = _controller.IsPressed(key);
+ if (currState != prevState)
+ {
+ StateRight[i] = currState;
+ noInput = false;
+ }
+ }
+
+ for (int i = 0; i < ButtonsLeft.Length; i++)
+ {
+ var key = "P2 " + ButtonsLeft[i];
+ bool prevState = StateLeft[i];
+ bool currState = _controller.IsPressed(key);
+ if (currState != prevState)
+ {
+ StateLeft[i] = currState;
+ noInput = false;
+ }
+ }
+ }
+
+ return noInput;
+ }
}
}
diff --git a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.cs b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.cs
index 22cf9135fd..c7db8017f4 100644
--- a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.cs
+++ b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/ChannelF.cs
@@ -23,6 +23,9 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
var settings = lp.Settings ?? new ChannelFSettings();
var syncSettings = lp.SyncSettings ?? new ChannelFSyncSettings();
+ region = syncSettings.Region;
+
+
MemoryCallbacks = new MemoryCallbackSystem(new[] { "System Bus" });
ControllerDefinition = ChannelFControllerDefinition;
@@ -70,5 +73,6 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
public IController _controller;
public VesCartBase Cartridge;
+ public RegionType region;
}
}
diff --git a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Ports.cs b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Ports.cs
index a63ad7b8e8..7a6bd50d3c 100644
--- a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Ports.cs
+++ b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/Ports.cs
@@ -37,8 +37,9 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
// b1: MODE
// b2: HOLD
// b3: START
- // RESET button is connected directly to the RST pin on the CPU (this is handled here in the PollInput() method)
- result = ~(DataConsole & 0x0F) | OutputLatch[addr];
+ // RESET button is connected directly to the RST pin on the CPU (this is handled here in the PollInput() method)
+ result = (~DataConsole & 0x0F) | OutputLatch[addr];
+ _isLag = false;
break;
case 1:
@@ -52,6 +53,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
// b5: CW
var v1 = LS368Enable ? DataRight : DataRight | 0xC0;
result = (~v1) | OutputLatch[addr];
+ _isLag = false;
break;
case 4:
@@ -68,6 +70,8 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
// b7: PUSH
var v2 = LS368Enable ? DataLeft : 0xFF;
result = (~v2) | OutputLatch[addr];
+ if (LS368Enable)
+ _isLag = false;
break;
case 5:
@@ -76,11 +80,10 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
default:
// possible cartridge hardware IO space
- result = ~(Cartridge.ReadPort(addr)) | OutputLatch[addr];
+ result = (Cartridge.ReadPort(addr));
break;
}
-
return (byte)result;
}
@@ -116,7 +119,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
case 5:
OutputLatch[addr] = value;
latch_y = (value | 0xC0) ^ 0xFF;
- var audio = (value >> 6) & 0x03;
+ var audio = ((value ^ 0xFF) >> 6) & 0x03;
if (audio != tone)
{
tone = audio;
@@ -128,7 +131,7 @@ namespace BizHawk.Emulation.Cores.Consoles.ChannelF
default:
// possible write to cartridge hardware
- Cartridge.WritePort(addr, (byte)(value ^ 0xFF));
+ Cartridge.WritePort(addr, (byte)(value));
break;
}
}
diff --git a/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/readme.md b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/readme.md
new file mode 100644
index 0000000000..88628856f4
--- /dev/null
+++ b/src/BizHawk.Emulation.Cores/Consoles/Fairchild/ChannelF/readme.md
@@ -0,0 +1,94 @@
+# ChannelFHawk
+## Fairchild Channel F Core
+
+Work in progress.
+
+### Testing
+
+Lists taken from https://en.wikipedia.org/wiki/Fairchild_Channel_F_Videocarts and http://www.classic-consoles-center.at/fairchild/fairchild-channel-f-and-relatives-cart-list
+
+Group 1: Fairchild Channel F (USA) and Grandstand Video Entertainment Computer (UK)
+Group 2: Saba Videoplay (Germany)
+Group 3: Luxor Video Entertainment System (Sweden)
+Group 4: Nordmende Teleplay (Germany)
+Group 5: ITT Tele-Match Processor (Germany)
+
+#### Commercial Games (USA)
+
+| Status | VideoCartID | Group | Game | Cart Info | MD5
+| --- | --- | --- | --- | --- | --- |
+| Working | 01 | 1 | Tic Tac Toe / Shooting Gallery / Doodle / Quadradoodle | STANDARD | 7E5C26A6D1F9A90C68669A9800BA522D |
+| Working | 02 | 1 | Desert Fox / Shooting Gallery | STANDARD | 4F11F13CBCA685CB20E888F87B3B1586 |
+| Untested | 03 | 1 | Video Blackjack | STANDARD | B074C867F235FB69CED96C6916673B45 |
+| Working | 04 | 1 | Spitfire | STANDARD | 1B409FE1154584F4D1AB76B344A73D99 |
+| Working | 04 | 1 | Spitfire (proto) | STANDARD | 5B86FE22007E6D0A92247809AC8934E9 |
+| Untested | 05 | 1 | Space War | STANDARD | 32CCA8FF09041A39251D7AADE21EE22F |
+| Working | 06 | 1 | Math Quiz I | STANDARD | A8E6103FCAE4D0F9E14D9EDCFC3FC493 |
+| Working | 07 | 1 | Math Quiz II | STANDARD | 86B77EAFDF7B806E19E01724987E384F |
+| Working | 08 | 1 | Magic Numbers | STANDARD | 4C10FA5C7316C59EFA241043FC67DFA8 |
+| Working | 09 | 1 | Drag Race | STANDARD | F80AF74B09D058B90E719BB7DFBDD50E |
+| Working | 10 | 1 | Maze | SRAM2102 | 6565DF74539476D66FD78DE1BAC0259C |
+| Working | 10 | 1 | Maze (alt 1) | SRAM2102 | 6565DF74539476D66FD78DE1BAC0259C |
+| Working | 10 | 1 | Maze (alt 2) | SRAM2102 | 5DB71E3B0CD13F7C42790A2CD9072CA1 |
+| Working | 10 | 1 | Maze (Multicart Hack) | F3853 | 5DB71E3B0CD13F7C42790A2CD9072CA1 |
+| Working | 11 | 1 | Backgammon / Acey Deucey | STANDARD | D89B48AE8C906488CAAC2B2AE1D63D88 |
+| Working | 12 | 1 | Baseball | STANDARD | 4FA83F734C139963AA02BDBB7A52E500 |
+| Working | 13 | 1 | Robot War / Torpedo Alley | STANDARD | 3783B6AC359E21B99CFA17773AA811C6 |
+| Untested | 13 | 1 | Robot War (proto) | STANDARD | FACB452602F59FDDDE1CFBC4D598A282 |
+| Untested | 13 | 1 | Robot War (proto) [b] | STANDARD | E1FB8D61FFE07B53869A93A8AD0C04A8 |
+| Working | 14 | 1 | Sonar Search | STANDARD | 4CB12EDAE37DF23851884B82CA410754 |
+| Working | 15 | 1 | Memory Match 1 & 2 | STANDARD | 2B3CA549E27579E4519A765FD8F52D0F |
+| Untested | 16 | 1 | Dodge It | STANDARD | 6FFEDAED3C5CD8BA74D98901849CC451 |
+| Working | 17 | 1 | Pinball Challenge | STANDARD | E90339B7068C6227D54F3C0CA637E017 |
+| Working | 17 | 1 | Pinball Challenge (Alt 1) | STANDARD | 5CBCDA1C44F0DAD02B0DFE209B6325D5 |
+| Working | 18 | 1 | Hangman | SRAM2102 | 0124CD0B61DF5502AABD59029CCB6D5A |
+| Not Working | 18 | 1 | Hangman (Multicart Hack) | F3853 | 533BAC14DE68FBA49078EEF8E9502DD2 |
+| Untested | 19 | 1 | Checkers | STANDARD | 35D61D40EF7EC337CBA092AABAC74DBD |
+| Working | 20 | 1 | Video Whizball | STANDARD | 90A9B3952568F91502A7088BFB0AE07E |
+| Working | 21 | 1 | Bowling | STANDARD | 25E231E7A464A32B4715BFB47AF89240 |
+| Working | 22 | 1 | Slot Machine | STANDARD | DFB66EE145FAB65062FDEADAFC8DC34C |
+| Working | 23 | 1 | Galactic Space Wars, Lunar Lander | STANDARD | 9E0711B140E22729687DB1E1354980AB |
+| Working | 23 | 1 | Glactic Space Wars (proto) | STANDARD | 5CCCEE534FD002AF6EB4FCAAA6B95D88 |
+| Working | 24 | 1 | Pro Football | STANDARD | 9A894D745356A050F95410983C3BC54A |
+| Working | 25 | 1 | Casino Poker | STANDARD | BB7F7BBBE21F142591CDCAFA98D7F6E4 |
+| Working | 26 | 1 | Alien Invasion | STANDARD | F7BF7D55A7660FFA80D08AD1BA903FF7 |
+| Untested | xx | 1 | | | |
+| Untested | xx | 1 | | | |
+| Untested | xx | 1 | | | |
+
+#### Commercial Games (Rest of World Regional Modifications)
+
+| Status | VideoCartID | Group | Game | Cart Info | MD5
+| --- | --- | --- | --- | --- | --- |
+| Working | 01 | 2 | Mühle / Tontauben-Schießen / Kreatives Malspiel / Videoscope | STANDARD | 1FBD86DCCA0E4619963B902C48AE77F2 |
+| Working | 18 | 3 | Ordtävling (Sweden) | SRAM2102 | C2A44D22D3865B036479E9311C74D3AD |
+| Working | 16 | 2 | Rat' Mal (Germany) | SRAM2102 | 913ECBAA30816C6D78DE8651251761FC |
+| Not Working | 20 | 2 | Schach (Germany) | F3853 | 5568205F926333914DEDC8EF8BF16AF2 |
+| Working | 20 | 2 | Schach (Actually Tennis) | F3853 | 7B227DE474806A8AB9474C4716A270B7 |
+
+
+#### Homebrew Games
+
+| Status | VideoCartID | Group | Game | Cart Info | MD5
+| --- | --- | --- | --- | --- | --- |
+| Working | xx | 1 | Tetris (2004)(Trauner, Peter)[p] | SRAM2102 | D7050AF61479AA549206250441AA2B0F |
+| Working | xx | 1 | Tetris (2004)(Trauner, Peter)[p][a] | SRAM2102 | 2AEBEDA05478E8B7F5C1ECA037AC6C2F |
+
+#### Demos
+
+| Status | VideoCartID | Group | Game | Cart Info | MD5
+| --- | --- | --- | --- | --- | --- |
+
+#### Applications
+
+| Status | VideoCartID | Group | Game | Cart Info | MD5
+| --- | --- | --- | --- | --- | --- |
+
+#### Bad dumps?
+
+| Status | VideoCartID | Group | Game | Cart Info | MD5
+| --- | --- | --- | --- | --- | --- |
+| Not Working | 04 | 1 | Spitfire (proto)[b] | Standard | 0CFD9B9213CFF4A9DF9DD7FEA4663236 |
+| Not Working | 20 | 2 | Schach (Germany) [b] | F3853 | 7385E596BF2A58E2186439AC1E49C075 |
+
+-Asnivor
\ No newline at end of file