summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2019-04-15 00:56:46 +0200
committer hap <happppp@users.noreply.github.com>2019-04-15 00:59:26 +0200
commit8b018d198c8d6986e3f988ad087c87e080a08868 (patch)
tree2456f7d8c901db0d768143bd51b9b436f3b801f7
parentb5d3b29d1604bd12ced8014f20cad2126f71a098 (diff)
New working machine added
--------- Great Game Machine [hap, bataais]
-rw-r--r--hash/arb.xml18
-rw-r--r--hash/fidel_scc.xml6
-rw-r--r--hash/ggm.xml22
-rw-r--r--hash/lantutor.xml40
-rw-r--r--scripts/target/mame/mess.lua1
-rw-r--r--src/devices/cpu/z80/z80.cpp7
-rw-r--r--src/emu/ioport.cpp2
-rw-r--r--src/mame/drivers/aci_boris.cpp17
-rw-r--r--src/mame/drivers/aci_borisdpl.cpp2
-rw-r--r--src/mame/drivers/aci_ggm.cpp412
-rw-r--r--src/mame/drivers/ave_arb.cpp5
-rw-r--r--src/mame/drivers/fidel_cc1.cpp16
-rw-r--r--src/mame/drivers/intellect02.cpp4
-rw-r--r--src/mame/drivers/mk1.cpp63
-rw-r--r--src/mame/layout/aci_ggm.lay294
-rw-r--r--src/mame/layout/cncchess.lay10
-rw-r--r--src/mame/layout/snread.lay2
-rw-r--r--src/mame/layout/snspell.lay50
-rw-r--r--src/mame/layout/snspellsp.lay2
-rw-r--r--src/mame/layout/spellb.lay53
-rw-r--r--src/mame/mame.lst3
-rw-r--r--src/mame/mess.flt1
22 files changed, 880 insertions, 150 deletions
diff --git a/hash/arb.xml b/hash/arb.xml
index 591e97ad15a..e3d303cdd87 100644
--- a/hash/arb.xml
+++ b/hash/arb.xml
@@ -3,7 +3,7 @@
<softwarelist name="arb" description="ARB Modules">
-<!-- AVE Micro Systems Auto Response Board (ARB) chess program modules -->
+<!-- AVE Micro Systems Auto Response Board (ARB) game modules -->
<software name="sargon25">
<description>Sargon 2.5</description>
@@ -11,10 +11,10 @@
<publisher>AVE Micro Systems</publisher>
<part name="cart" interface="arb">
<dataarea name="rom" size="0x8000">
- <rom name="4000-4800_ea_8332a161-1" size="0x1000" crc="00460848" sha1="ac4fe2232028bd42506a24457882296e7d3a8f54" offset="0x4000" />
- <rom size="0x1000" offset="0x6000" loadflag="reload" />
- <rom name="5000-5800_ea_8332a160-1" size="0x1000" crc="aac1dff2" sha1="9a7fc6dc98e53120e511d266304ad07f248f415a" offset="0x5000" />
- <rom size="0x1000" offset="0x7000" loadflag="reload" />
+ <rom name="4000-4800_ea_8332a161-1" offset="0x4000" size="0x1000" crc="00460848" sha1="ac4fe2232028bd42506a24457882296e7d3a8f54" />
+ <rom offset="0x6000" size="0x1000" loadflag="reload" />
+ <rom name="5000-5800_ea_8332a160-1" offset="0x5000" size="0x1000" crc="aac1dff2" sha1="9a7fc6dc98e53120e511d266304ad07f248f415a" />
+ <rom offset="0x7000" size="0x1000" loadflag="reload" />
</dataarea>
</part>
</software>
@@ -26,10 +26,10 @@
<part name="cart" interface="arb">
<feature name="ram" value="1" />
<dataarea name="rom" size="0x8000">
- <rom name="1.bin" size="0x1000" crc="26e57f38" sha1="b37364dd567018e5aebaecbcc47af3bd43e36032" offset="0x2000" />
- <rom size="0x1000" offset="0x3000" loadflag="reload" />
- <rom name="2.bin" size="0x2000" crc="3b1b26a2" sha1="0b59f6c344c9996a06e63e61e91a195b0eb1dd32" offset="0x4000" />
- <rom name="3.bin" size="0x2000" crc="b90f7f80" sha1="71ffd2d56e1f44e7c4e1d13364e43fc6ac1a4f99" offset="0x6000" />
+ <rom name="1.bin" offset="0x2000" size="0x1000" crc="26e57f38" sha1="b37364dd567018e5aebaecbcc47af3bd43e36032" />
+ <rom offset="0x3000" size="0x1000" loadflag="reload" />
+ <rom name="2.bin" offset="0x4000" size="0x2000" crc="3b1b26a2" sha1="0b59f6c344c9996a06e63e61e91a195b0eb1dd32" />
+ <rom name="3.bin" offset="0x6000" size="0x2000" crc="b90f7f80" sha1="71ffd2d56e1f44e7c4e1d13364e43fc6ac1a4f99" />
</dataarea>
</part>
</software>
diff --git a/hash/fidel_scc.xml b/hash/fidel_scc.xml
index 26f8155a46e..69f0807d57e 100644
--- a/hash/fidel_scc.xml
+++ b/hash/fidel_scc.xml
@@ -11,7 +11,7 @@
<publisher>Fidelity Electronics</publisher>
<part name="cart" interface="fidel_scc">
<dataarea name="rom" size="0x2000">
- <rom name="cb9.bin" size="0x2000" crc="421147e8" sha1="ccf62f6f218e8992baf30973fe41b35e14a1cc1a" offset="0x0000" />
+ <rom name="cb9.bin" offset="0x0000" size="0x2000" crc="421147e8" sha1="ccf62f6f218e8992baf30973fe41b35e14a1cc1a" />
</dataarea>
</part>
</software>
@@ -22,8 +22,8 @@
<publisher>Fidelity Electronics</publisher>
<part name="cart" interface="fidel_scc">
<dataarea name="rom" size="0x4000">
- <rom name="101-1042a01" size="0x2000" crc="591b3e4a" sha1="f75ae850f2f70808b5423f847ff12ee890752bf8" offset="0x0000" />
- <rom name="101-1042a02" size="0x2000" crc="1bdf0a21" sha1="1c6f673c0bf846e705d15c802f433ac1dc9b153c" offset="0x2000" />
+ <rom name="101-1042a01" offset="0x0000" size="0x2000" crc="591b3e4a" sha1="f75ae850f2f70808b5423f847ff12ee890752bf8" />
+ <rom name="101-1042a02" offset="0x2000" size="0x2000" crc="1bdf0a21" sha1="1c6f673c0bf846e705d15c802f433ac1dc9b153c" />
</dataarea>
</part>
</software>
diff --git a/hash/ggm.xml b/hash/ggm.xml
new file mode 100644
index 00000000000..eddd1aa0432
--- /dev/null
+++ b/hash/ggm.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+
+<softwarelist name="ggm" description="GGM Cartridges">
+
+<!-- Applied Concepts Great Game Machine (GGM) / Chafitz Modular Game System (MGS) game cartridges -->
+
+ <software name="boris25">
+ <description>Boris 2.5 / Sargon 2.5</description>
+ <year>1980</year>
+ <publisher>Applied Concepts</publisher>
+ <part name="cart" interface="ggm">
+ <dataarea name="rom" size="0x8000">
+ <rom name="10.bin" offset="0x4000" size="0x1000" crc="0db2e277" sha1="9f8823739d28b0a0e3857b7c672aa2514cd6816b" />
+ <rom offset="0x6000" size="0x1000" loadflag="reload" />
+ <rom name="11.bin" offset="0x5000" size="0x1000" crc="980fa10f" sha1="5ec814bbaf583031acbe2c0199a6195c2849ef5e" />
+ <rom offset="0x7000" size="0x1000" loadflag="reload" />
+ </dataarea>
+ </part>
+ </software>
+
+</softwarelist>
diff --git a/hash/lantutor.xml b/hash/lantutor.xml
index 46710493b2b..859a67f9b66 100644
--- a/hash/lantutor.xml
+++ b/hash/lantutor.xml
@@ -10,10 +10,10 @@
<publisher>Texas Instruments</publisher>
<part name="cart" interface="lantutor">
<dataarea name="rom" size="0x10000">
- <rom name="cd2311.vsm" size="0x4000" crc="7bab7f7c" sha1="e89cfa7ae9d5ce09ff19b9474ecd70fb5982ccb9" offset="0x0000" />
- <rom name="cd2312.vsm" size="0x4000" crc="6acb9c72" sha1="09817f1e0b1683d90edada38ac70ce738af6417f" offset="0x4000" />
- <rom name="cd2313.vsm" size="0x4000" crc="ed979cc9" sha1="414457c6359e64c48cd1b80f47098dc2438f0b93" offset="0x8000" />
- <rom name="cd2314.vsm" size="0x4000" crc="0454d5fb" sha1="347d0d5f39e2e31f93773bad9e62d121f1d40d3c" offset="0xc000" />
+ <rom name="cd2311.vsm" offset="0x0000" size="0x4000" crc="7bab7f7c" sha1="e89cfa7ae9d5ce09ff19b9474ecd70fb5982ccb9" />
+ <rom name="cd2312.vsm" offset="0x4000" size="0x4000" crc="6acb9c72" sha1="09817f1e0b1683d90edada38ac70ce738af6417f" />
+ <rom name="cd2313.vsm" offset="0x8000" size="0x4000" crc="ed979cc9" sha1="414457c6359e64c48cd1b80f47098dc2438f0b93" />
+ <rom name="cd2314.vsm" offset="0xc000" size="0x4000" crc="0454d5fb" sha1="347d0d5f39e2e31f93773bad9e62d121f1d40d3c" />
</dataarea>
</part>
</software>
@@ -24,10 +24,10 @@
<publisher>Texas Instruments</publisher>
<part name="cart" interface="lantutor">
<dataarea name="rom" size="0x10000">
- <rom name="cd2315.vsm" size="0x4000" crc="cd44490f" sha1="7b62e9fb0cc30fa81c23ef3361bb579c8794f178" offset="0x0000" />
- <rom name="cd2316.vsm" size="0x4000" crc="c5464edf" sha1="0f028cb5e8445216dd45fa641e5751b08a637f5c" offset="0x4000" />
- <rom name="cd2317.vsm" size="0x4000" crc="53231c0b" sha1="472117c3d0e28437fa8faa054f98088e06efc2a1" offset="0x8000" />
- <rom name="cd2318.vsm" size="0x4000" crc="6c0727bc" sha1="132e39755b122f2cbec6f3e767f5d256a9c1e7ae" offset="0xc000" />
+ <rom name="cd2315.vsm" offset="0x0000" size="0x4000" crc="cd44490f" sha1="7b62e9fb0cc30fa81c23ef3361bb579c8794f178" />
+ <rom name="cd2316.vsm" offset="0x4000" size="0x4000" crc="c5464edf" sha1="0f028cb5e8445216dd45fa641e5751b08a637f5c" />
+ <rom name="cd2317.vsm" offset="0x8000" size="0x4000" crc="53231c0b" sha1="472117c3d0e28437fa8faa054f98088e06efc2a1" />
+ <rom name="cd2318.vsm" offset="0xc000" size="0x4000" crc="6c0727bc" sha1="132e39755b122f2cbec6f3e767f5d256a9c1e7ae" />
</dataarea>
</part>
</software>
@@ -38,10 +38,10 @@
<publisher>Texas Instruments</publisher>
<part name="cart" interface="lantutor">
<dataarea name="rom" size="0x10000">
- <rom name="cd2327.vsm" size="0x4000" crc="207aa27d" sha1="e5012c48b20f9b49a00f6fe8ee5719df1cbf04b4" offset="0x0000" />
- <rom name="cd2328.vsm" size="0x4000" crc="768980d0" sha1="085ba873c83d25790b090a9a8797183c6664d03c" offset="0x4000" />
- <rom name="cd2329.vsm" size="0x4000" crc="c8583a4b" sha1="3a4f2e42b4ab63e5bfdbd98eb40706f940491015" offset="0x8000" />
- <rom name="cd2330.vsm" size="0x4000" crc="52ac969f" sha1="3a9e3db62f2ef3aedd5f4cd4bd21dccecfecf02f" offset="0xc000" />
+ <rom name="cd2327.vsm" offset="0x0000" size="0x4000" crc="207aa27d" sha1="e5012c48b20f9b49a00f6fe8ee5719df1cbf04b4" />
+ <rom name="cd2328.vsm" offset="0x4000" size="0x4000" crc="768980d0" sha1="085ba873c83d25790b090a9a8797183c6664d03c" />
+ <rom name="cd2329.vsm" offset="0x8000" size="0x4000" crc="c8583a4b" sha1="3a4f2e42b4ab63e5bfdbd98eb40706f940491015" />
+ <rom name="cd2330.vsm" offset="0xc000" size="0x4000" crc="52ac969f" sha1="3a9e3db62f2ef3aedd5f4cd4bd21dccecfecf02f" />
</dataarea>
</part>
</software>
@@ -52,10 +52,10 @@
<publisher>Texas Instruments</publisher>
<part name="cart" interface="lantutor">
<dataarea name="rom" size="0x10000">
- <rom name="cd2331.vsm" size="0x4000" crc="a1e9290b" sha1="1163f7695e0727c6058684ea7f7c52d432f3fb7c" offset="0x0000" />
- <rom name="cd2332.vsm" size="0x4000" crc="b8ef4eed" sha1="0eccd98c81498caa166f7164c9563ef95412ffd7" offset="0x4000" />
- <rom name="cd2333.vsm" size="0x4000" crc="c989eaf2" sha1="26e644523b318cefb0fe46c7886cd0746afa438c" offset="0x8000" />
- <rom name="cd2334.vsm" size="0x4000" crc="54bbb9c8" sha1="32fb22397b2cd30490cecf3d978a24b4def389db" offset="0xc000" />
+ <rom name="cd2331.vsm" offset="0x0000" size="0x4000" crc="a1e9290b" sha1="1163f7695e0727c6058684ea7f7c52d432f3fb7c" />
+ <rom name="cd2332.vsm" offset="0x4000" size="0x4000" crc="b8ef4eed" sha1="0eccd98c81498caa166f7164c9563ef95412ffd7" />
+ <rom name="cd2333.vsm" offset="0x8000" size="0x4000" crc="c989eaf2" sha1="26e644523b318cefb0fe46c7886cd0746afa438c" />
+ <rom name="cd2334.vsm" offset="0xc000" size="0x4000" crc="54bbb9c8" sha1="32fb22397b2cd30490cecf3d978a24b4def389db" />
</dataarea>
</part>
</software>
@@ -66,10 +66,10 @@
<publisher>Texas Instruments</publisher>
<part name="cart" interface="lantutor">
<dataarea name="rom" size="0x10000">
- <rom name="cd3526.vsm" size="0x4000" crc="58fae847" sha1="ee9c0f4dbd7101a1f8f276e60e77403d01a9b36f" offset="0x0000" />
- <rom name="cd3527.vsm" size="0x4000" crc="aa9f5334" sha1="a363aaf4fb9194995431a9dc1d78446ef510e7be" offset="0x4000" />
- <rom name="cd3528.vsm" size="0x4000" crc="e21919ea" sha1="b0edd35d5de29ac2f61a1dc7dc0a7fab20914fbe" offset="0x8000" />
- <rom name="cd3529.vsm" size="0x4000" crc="dc06f09d" sha1="946868b4748d93c918bbe33c9b1a40a723dbf410" offset="0xc000" />
+ <rom name="cd3526.vsm" offset="0x0000" size="0x4000" crc="58fae847" sha1="ee9c0f4dbd7101a1f8f276e60e77403d01a9b36f" />
+ <rom name="cd3527.vsm" offset="0x4000" size="0x4000" crc="aa9f5334" sha1="a363aaf4fb9194995431a9dc1d78446ef510e7be" />
+ <rom name="cd3528.vsm" offset="0x8000" size="0x4000" crc="e21919ea" sha1="b0edd35d5de29ac2f61a1dc7dc0a7fab20914fbe" />
+ <rom name="cd3529.vsm" offset="0xc000" size="0x4000" crc="dc06f09d" sha1="946868b4748d93c918bbe33c9b1a40a723dbf410" />
</dataarea>
</part>
</software>
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index c5beded26ca..43e756cd296 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -3783,6 +3783,7 @@ files {
MAME_DIR .. "src/mame/drivers/aceex.cpp",
MAME_DIR .. "src/mame/drivers/aci_boris.cpp",
MAME_DIR .. "src/mame/drivers/aci_borisdpl.cpp",
+ MAME_DIR .. "src/mame/drivers/aci_ggm.cpp",
MAME_DIR .. "src/mame/drivers/adm23.cpp",
MAME_DIR .. "src/mame/drivers/adm31.cpp",
MAME_DIR .. "src/mame/drivers/adm36.cpp",
diff --git a/src/devices/cpu/z80/z80.cpp b/src/devices/cpu/z80/z80.cpp
index 3454f6773e3..8e1e29a8a1f 100644
--- a/src/devices/cpu/z80/z80.cpp
+++ b/src/devices/cpu/z80/z80.cpp
@@ -2,7 +2,7 @@
// copyright-holders:Juergen Buchmueller
/*****************************************************************************
*
- * z80.c
+ * z80.cpp
* Portable Z80 emulator V3.9
*
* TODO:
@@ -17,8 +17,9 @@
* - OUT (C),0 outputs 0 on NMOS Z80, $FF on CMOS Z80
* - SCF/CCF X/Y flags is ((flags | A) & 0x28) on SGS/SHARP/ZiLOG NMOS Z80,
* (flags & A & 0x28) on NEC NMOS Z80, other models unknown.
- * However, people from the Speccy scene mention that SCF/CCF X/Y results
- * are inconsistant and may be influenced by I and R registers.
+ * However, recent findings say that SCF/CCF X/Y results depend on whether
+ * or not the previous instruction touched the flag register. And the exact
+ * behaviour on NEC Z80 is still unknown.
* This Z80 emulator assumes a ZiLOG NMOS model.
*
* Changes in 3.9:
diff --git a/src/emu/ioport.cpp b/src/emu/ioport.cpp
index a589abe982e..b2208523b0c 100644
--- a/src/emu/ioport.cpp
+++ b/src/emu/ioport.cpp
@@ -1457,7 +1457,7 @@ ioport_field *ioport_port::field(ioport_value mask) const
{
// if we got the port, look for the field
for (ioport_field &field : fields())
- if ((field.mask() & mask) != 0)
+ if ((field.mask() & mask) != 0 && field.enabled())
return &field;
return nullptr;
}
diff --git a/src/mame/drivers/aci_boris.cpp b/src/mame/drivers/aci_boris.cpp
index 457a9807166..c369acc4787 100644
--- a/src/mame/drivers/aci_boris.cpp
+++ b/src/mame/drivers/aci_boris.cpp
@@ -44,10 +44,11 @@ public:
void boris(machine_config &config);
- DECLARE_INPUT_CHANGED_MEMBER(reset_switch);
+ DECLARE_INPUT_CHANGED_MEMBER(reset_switch) { update_reset(newval); }
protected:
virtual void machine_start() override;
+ virtual void machine_reset() override;
private:
// devices/pointers
@@ -59,6 +60,7 @@ private:
void main_map(address_map &map);
void main_io(address_map &map);
+ void update_reset(ioport_value state);
TIMER_DEVICE_CALLBACK_MEMBER(delay_display);
DECLARE_WRITE8_MEMBER(mux_w);
@@ -85,13 +87,18 @@ void boris_state::machine_start()
save_item(NAME(m_4042));
}
-INPUT_CHANGED_MEMBER(boris_state::reset_switch)
+void boris_state::machine_reset()
+{
+ update_reset(ioport("RESET")->read());
+}
+
+void boris_state::update_reset(ioport_value state)
{
// reset switch is tied to MK3850 RESET pin
- m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
+ m_maincpu->set_input_line(INPUT_LINE_RESET, state ? ASSERT_LINE : CLEAR_LINE);
// clear display
- if (newval)
+ if (state)
{
for (int i = 0; i < 8; i++)
m_delay_display[i]->adjust(attotime::zero, i);
@@ -211,7 +218,7 @@ static INPUT_PORTS_START( boris )
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter")
PORT_START("RESET")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_R) PORT_TOGGLE PORT_CHANGED_MEMBER(DEVICE_SELF, boris_state, reset_switch, nullptr) PORT_NAME("Reset Switch")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_TOGGLE PORT_CHANGED_MEMBER(DEVICE_SELF, boris_state, reset_switch, nullptr) PORT_NAME("Reset Switch")
INPUT_PORTS_END
diff --git a/src/mame/drivers/aci_borisdpl.cpp b/src/mame/drivers/aci_borisdpl.cpp
index d2210d63df8..d54104c1097 100644
--- a/src/mame/drivers/aci_borisdpl.cpp
+++ b/src/mame/drivers/aci_borisdpl.cpp
@@ -181,7 +181,7 @@ static INPUT_PORTS_START( borisdpl )
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") // clear entry
PORT_START("RESET")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, borisdpl_state, reset_button, nullptr) PORT_NAME("Reset")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, borisdpl_state, reset_button, nullptr) PORT_NAME("Reset")
INPUT_PORTS_END
diff --git a/src/mame/drivers/aci_ggm.cpp b/src/mame/drivers/aci_ggm.cpp
new file mode 100644
index 00000000000..bd24f9ad525
--- /dev/null
+++ b/src/mame/drivers/aci_ggm.cpp
@@ -0,0 +1,412 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/******************************************************************************
+
+Applied Concepts Great Game Machine (GGM), electronic board game computer.
+2nd source distribution: Modular Game System (MGS), by Chafitz.
+
+TODO:
+- what's VIA PB0 for? game toggles it once per irq
+- identify XTAL (2MHz CPU/VIA is correct, compared to video reference)
+- add display DP segment (unused in boris25), and what about AP segment?
+- verify cartridge pinout, right now assume A0-A14 (max known cart size is 24KB)
+- auto-switch keypad overlays? no need for it yet
+
+*******************************************************************************
+
+Hardware notes:
+- 6502A 2MHz (unknown XTAL, label "5-80"), SYP6522 VIA
+- 2KB RAM(4*HM472114AP-2), no ROM on main PCB
+- 2*74164 shift register, 3*6118P VFD driver
+- 8-digit 14seg VFD panel (same one as in Speak & Spell)
+- 5*4 keypad(unlabeled by default), 1-bit sound
+
+Games are on separate cartridges, each came with a keypad overlay.
+There were also some standalone machines, eg. Morphy Encore, Odin Encore.
+
+Known chess cartridges (*denotes not dumped):
+- Chess/Boris 2.5 (aka Sargon 2.5)
+- *Gruenfeld Edition - Master Chess Openings
+- *Morphy Edition - Master Chess (aka Sandy Edition?)
+- *Capablanca Edition - Master Chess Endgame
+- *Steinitz Edition-4 - Master Chess
+- *Monitor Edition - Master Kriegspiel
+
+The opening/endgame cartridges are meant to be ejected/inserted while
+playing (put the power switch in "MEM" first).
+
+Other games:
+- *Borchek Edition - Master Checkers
+- *Odin Edition - Master Reversi
+- *Las Vegas 21
+- *Wits End (unreleased?)
+- *Lunar Lander (unreleased?)
+
+******************************************************************************/
+
+#include "emu.h"
+#include "cpu/m6502/m6502.h"
+#include "machine/6522via.h"
+#include "machine/nvram.h"
+#include "machine/timer.h"
+#include "sound/dac.h"
+#include "sound/volt_reg.h"
+#include "speaker.h"
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
+#include "softlist.h"
+
+// internal artwork
+#include "aci_ggm.lh" // clickable
+
+
+namespace {
+
+class ggm_state : public driver_device
+{
+public:
+ ggm_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_via(*this, "via"),
+ m_dac(*this, "dac"),
+ m_cart(*this, "cartslot"),
+ m_ca1_off(*this, "ca1_off"),
+ m_delay_update(*this, "delay_update"),
+ m_inp_matrix(*this, "IN.%u", 0),
+ m_out_digit(*this, "digit%u", 0U)
+ { }
+
+ void ggm(machine_config &config);
+
+ DECLARE_INPUT_CHANGED_MEMBER(reset_switch) { update_reset(newval); }
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+private:
+ // devices/pointers
+ required_device<cpu_device> m_maincpu;
+ required_device<via6522_device> m_via;
+ required_device<dac_bit_interface> m_dac;
+ required_device<generic_slot_device> m_cart;
+ required_device<timer_device> m_ca1_off;
+ required_device<timer_device> m_delay_update;
+ required_ioport_array<6> m_inp_matrix;
+ output_finder<8> m_out_digit;
+
+ void main_map(address_map &map);
+
+ void update_reset(ioport_value state);
+ void update_display();
+ TIMER_DEVICE_CALLBACK_MEMBER(delay_update) { update_display(); }
+ TIMER_DEVICE_CALLBACK_MEMBER(ca1_off) { m_via->write_ca1(0); }
+
+ u8 m_digit_select;
+ u16 m_digit_data;
+ u8 m_shift_data;
+ u8 m_shift_clock;
+ u32 m_cart_mask;
+
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cartridge);
+ DECLARE_READ8_MEMBER(cartridge_r);
+
+ DECLARE_WRITE8_MEMBER(select_w);
+ DECLARE_WRITE8_MEMBER(control_w);
+ DECLARE_READ8_MEMBER(input_r);
+
+ DECLARE_WRITE_LINE_MEMBER(shift_clock_w);
+ DECLARE_WRITE_LINE_MEMBER(shift_data_w);
+};
+
+void ggm_state::machine_start()
+{
+ // resolve handlers
+ m_out_digit.resolve();
+
+ // zerofill
+ m_digit_select = 0;
+ m_digit_data = 0;
+ m_shift_data = 0;
+ m_shift_clock = 0;
+
+ // register for savestates
+ save_item(NAME(m_digit_select));
+ save_item(NAME(m_digit_data));
+ save_item(NAME(m_shift_data));
+ save_item(NAME(m_shift_clock));
+}
+
+void ggm_state::machine_reset()
+{
+ // it determines whether it's a cold boot or warm boot ("MEM" switch), with CA1
+ if (~m_inp_matrix[4]->read() & 2)
+ {
+ m_via->write_ca1(1);
+ m_ca1_off->adjust(attotime::from_msec(10));
+ }
+ else
+ update_reset(1);
+}
+
+void ggm_state::update_reset(ioport_value state)
+{
+ // assume that the MEM switch puts the system in reset state (just like Boris)
+ m_maincpu->set_input_line(INPUT_LINE_RESET, state ? ASSERT_LINE : CLEAR_LINE);
+
+ if (state)
+ {
+ m_via->reset();
+
+ // clear display
+ m_digit_data = 0;
+ m_digit_select = 0xff;
+ update_display();
+ m_digit_select = 0;
+ }
+}
+
+
+
+/******************************************************************************
+ Devices, I/O
+******************************************************************************/
+
+// cartridge
+
+DEVICE_IMAGE_LOAD_MEMBER(ggm_state, cartridge)
+{
+ u32 size = m_cart->common_get_size("rom");
+ m_cart_mask = ((1 << (31 - count_leading_zeros(size))) - 1) & 0x7fff;
+
+ m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
+ m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
+
+ return image_init_result::PASS;
+}
+
+READ8_MEMBER(ggm_state::cartridge_r)
+{
+ return m_cart->read_rom(offset & m_cart_mask);
+}
+
+
+// 6522 ports
+
+void ggm_state::update_display()
+{
+ u16 data = bitswap<16>(m_digit_data,15,7,2,11,10,3,1,9,6,14,12,5,0,4,13,8);
+
+ for (int i = 0; i < 8; i++)
+ if (BIT(m_digit_select, i))
+ m_out_digit[i] = data & 0x3fff;
+}
+
+WRITE_LINE_MEMBER(ggm_state::shift_clock_w)
+{
+ // shift display segment data on rising edge
+ if (state && !m_shift_clock)
+ m_digit_data = m_digit_data << 1 | (m_shift_data & 1);
+
+ m_shift_clock = state;
+}
+
+WRITE_LINE_MEMBER(ggm_state::shift_data_w)
+{
+ m_shift_data = state;
+}
+
+WRITE8_MEMBER(ggm_state::select_w)
+{
+ // update display on rising edge, but delay a bit until shifter is ready
+ if (~m_digit_select & data && !m_delay_update->enabled())
+ m_delay_update->adjust(attotime::from_usec(50));
+
+ // input mux, digit select
+ m_digit_select = data;
+}
+
+WRITE8_MEMBER(ggm_state::control_w)
+{
+ // PB0: ?
+
+ // PB7: speaker out
+ m_dac->write(BIT(data, 7));
+
+}
+
+READ8_MEMBER(ggm_state::input_r)
+{
+ u16 data = 0;
+
+ // PB1-PB5: multiplexed inputs
+ for (int i = 0; i < 4; i++)
+ if (BIT(m_digit_select, i))
+ data |= m_inp_matrix[i]->read();
+
+ data |= data >> 8;
+ data = ~data << 1 & 0x3e;
+
+
+ // PB6: hardware version
+ return 0x81 | data | (m_inp_matrix[4]->read() << 6 & 0x40);
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+void ggm_state::main_map(address_map &map)
+{
+ // external slot has potential bus conflict with RAM/VIA
+ map(0x0000, 0x7fff).mirror(0x8000).r(FUNC(ggm_state::cartridge_r));
+ map(0x0000, 0x07ff).ram().share("nvram");
+ map(0x8000, 0x800f).rw(m_via, FUNC(via6522_device::read), FUNC(via6522_device::write));
+}
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+#define OVERLAY(val) \
+ PORT_CONDITION("IN.5", 0x01, EQUALS, val)
+
+static INPUT_PORTS_START( overlay_boris ) // actually most of the Chess games have a similar overlay
+ PORT_MODIFY("IN.0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x01) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x01) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("A.1 / Pawn")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x01) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("B.2 / Knight")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x01) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("C.3 / Bishop")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x01) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("D.4 / Rook")
+
+ PORT_MODIFY("IN.1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x01) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("E.5 / Queen")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x01) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("F.6 / King")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x01) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("G.7")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x01) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("H.8")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x01) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
+
+ PORT_MODIFY("IN.2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x01) PORT_CODE(KEYCODE_SPACE) PORT_CODE(KEYCODE_MINUS) PORT_NAME("-")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x01) PORT_CODE(KEYCODE_W) PORT_NAME("B/W")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x01) PORT_CODE(KEYCODE_K) PORT_NAME("Rank")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x01) PORT_CODE(KEYCODE_T) PORT_NAME("Time")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x01) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE")
+
+ PORT_MODIFY("IN.3")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x01) PORT_CODE(KEYCODE_L) PORT_NAME("Level")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x01) PORT_CODE(KEYCODE_H) PORT_NAME("Halt / Hint")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x01) PORT_CODE(KEYCODE_S) PORT_NAME("Best")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x01) PORT_CODE(KEYCODE_R) PORT_NAME("Restore")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x01) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter")
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( ggm )
+ PORT_START("IN.0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x00) PORT_CODE(KEYCODE_X) PORT_NAME("Keypad 4-2")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x00) PORT_CODE(KEYCODE_S) PORT_NAME("Keypad 3-2")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x00) PORT_CODE(KEYCODE_D) PORT_NAME("Keypad 3-3")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x00) PORT_CODE(KEYCODE_F) PORT_NAME("Keypad 3-4")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x00) PORT_CODE(KEYCODE_W) PORT_NAME("Keypad 2-2")
+
+ PORT_START("IN.1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x00) PORT_CODE(KEYCODE_E) PORT_NAME("Keypad 2-3")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x00) PORT_CODE(KEYCODE_R) PORT_NAME("Keypad 2-4")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x00) PORT_CODE(KEYCODE_2) PORT_NAME("Keypad 1-2")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x00) PORT_CODE(KEYCODE_3) PORT_NAME("Keypad 1-3")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x00) PORT_CODE(KEYCODE_4) PORT_NAME("Keypad 1-4")
+
+ PORT_START("IN.2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x00) PORT_CODE(KEYCODE_C) PORT_NAME("Keypad 4-3")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x00) PORT_CODE(KEYCODE_V) PORT_NAME("Keypad 4-4")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x00) PORT_CODE(KEYCODE_G) PORT_NAME("Keypad 3-5")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x00) PORT_CODE(KEYCODE_T) PORT_NAME("Keypad 2-5")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x00) PORT_CODE(KEYCODE_5) PORT_NAME("Keypad 1-5")
+
+ PORT_START("IN.3")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x00) PORT_CODE(KEYCODE_Z) PORT_NAME("Keypad 4-1")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x00) PORT_CODE(KEYCODE_Q) PORT_NAME("Keypad 2-1")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x00) PORT_CODE(KEYCODE_A) PORT_NAME("Keypad 3-1")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x00) PORT_CODE(KEYCODE_1) PORT_NAME("Keypad 1-1")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) OVERLAY(0x00) PORT_CODE(KEYCODE_B) PORT_NAME("Keypad 4-5")
+
+ PORT_INCLUDE( overlay_boris )
+
+ PORT_START("IN.4")
+ PORT_CONFNAME( 0x01, 0x00, "Version" ) // factory-set
+ PORT_CONFSETTING( 0x00, "GGS (Applied Concepts)" )
+ PORT_CONFSETTING( 0x01, "MGS (Chafitz)" )
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_TOGGLE PORT_CHANGED_MEMBER(DEVICE_SELF, ggm_state, reset_switch, nullptr) PORT_NAME("Memory Switch")
+
+ PORT_START("IN.5")
+ PORT_CONFNAME( 0x01, 0x01, "Keypad Overlay" )
+ PORT_CONFSETTING( 0x00, "None" )
+ PORT_CONFSETTING( 0x01, "Boris 2.5" )
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Configs
+******************************************************************************/
+
+void ggm_state::ggm(machine_config &config)
+{
+ /* basic machine hardware */
+ M6502(config, m_maincpu, 2000000);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ggm_state::main_map);
+
+ VIA6522(config, m_via, 2000000); // DDRA = 0xff, DDRB = 0x81
+ m_via->writepa_handler().set(FUNC(ggm_state::select_w));
+ m_via->writepb_handler().set(FUNC(ggm_state::control_w));
+ m_via->readpb_handler().set(FUNC(ggm_state::input_r));
+ m_via->irq_handler().set_inputline(m_maincpu, M6502_IRQ_LINE);
+ m_via->cb1_handler().set(FUNC(ggm_state::shift_clock_w));
+ m_via->cb2_handler().set(FUNC(ggm_state::shift_data_w));
+ TIMER(config, m_ca1_off).configure_generic(FUNC(ggm_state::ca1_off));
+
+ NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
+
+ /* video hardware */
+ TIMER(config, m_delay_update).configure_generic(FUNC(ggm_state::delay_update));
+ config.set_default_layout(layout_aci_ggm);
+
+ /* sound hardware */
+ SPEAKER(config, "speaker").front_center();
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+ VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
+
+ /* cartridge */
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "ggm", "bin");
+ m_cart->set_device_load(device_image_load_delegate(&ggm_state::device_image_load_cartridge, this));
+ m_cart->set_must_be_loaded(true);
+
+ SOFTWARE_LIST(config, "cart_list").set_original("ggm");
+}
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( ggm )
+ ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 )
+ // nothing here, ROM is on cartridge
+ROM_END
+
+} // anonymous namespace
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
+COMP( 1980, ggm, 0, 0, ggm, ggm, ggm_state, empty_init, "Applied Concepts", "Great Game Machine", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
diff --git a/src/mame/drivers/ave_arb.cpp b/src/mame/drivers/ave_arb.cpp
index 638c5533549..8e75c684d9a 100644
--- a/src/mame/drivers/ave_arb.cpp
+++ b/src/mame/drivers/ave_arb.cpp
@@ -23,12 +23,15 @@ The electronic magnetic chessboard is the first of is kind. AVE later licensed
it to Fidelity (see fidel_elite.cpp).
ARB is a romless system, the program ROM is on a cartridge.
-Known modules (*denotes not dumped yet):
+Known chess modules (*denotes not dumped yet):
- Sargon 2.5
- *Grand Master Series 3
- *Grand Master Series 3.5
- Grand Master Series 4.0
+Other games:
+- *Avelan (checkers)
+
Newer modules included button label stickers for OPTIONS, Verify, Take Back, Clear.
Around 2012, Steve Braid(aka Trilobyte/Steve UK) started manufacturing ARB V2 boards
diff --git a/src/mame/drivers/fidel_cc1.cpp b/src/mame/drivers/fidel_cc1.cpp
index 8bd68cf38b8..53d06cc985e 100644
--- a/src/mame/drivers/fidel_cc1.cpp
+++ b/src/mame/drivers/fidel_cc1.cpp
@@ -20,11 +20,17 @@ This is the world's 1st released dedicated chess computer. Oddly, the rows/colum
are reversed: left to right is 1-8, bottom to top is A-H, eg. pawn from D2 to D4
is 4B to 4D here.
-PCB label PC-P-86, P179 C-2 7.77
-NEC 8080AF @ 2MHz(18MHz XTAL through a 8224)
-Everything goes via a NEC B8228, its special features are unused.
-NEC 2316A ROM(2KB), 4*2101AL RAM(0.5KB total)
-8255C for I/O, 4*7seg display + 2 extra leds, 12-key keypad
+The CC1 patent(US4235442) refers to a Hewlett Packard chess program. It was eventually
+found out that it was written for a HP-9810A by Alan A. Wray in 1974, and CC1 is very
+similar to it. Ron C. Nelson must have ported the algorithms to 8080 when he wrote
+his Altair 8800 chess program, and this is what made it into CC1.
+
+CC1 hardware overview:
+- PCB label PC-P-86, P179 C-2 7.77
+- NEC 8080AF @ 2MHz(18MHz XTAL through a 8224)
+- Everything goes via a NEC B8228, its special features are unused.
+- NEC 2316A ROM(2KB), 4*2101AL RAM(0.5KB total)
+- 8255C for I/O, 4*7seg display + 2 extra leds, 12-key keypad
Chess Challenger 3 is on the same hardware, but with double ROM size, and they
corrected the reversed chess notation. It was also offered as an upgrade to CC1.
diff --git a/src/mame/drivers/intellect02.cpp b/src/mame/drivers/intellect02.cpp
index 019a46b244b..a87a0367b02 100644
--- a/src/mame/drivers/intellect02.cpp
+++ b/src/mame/drivers/intellect02.cpp
@@ -6,7 +6,7 @@
Интеллект-02 (Intellect-02) driver
This is a Soviet electronic board game console, a dozen or so cartridge games were
-made for it(can't say for certain how many released). PCB labels have prefix ДМП,
+announced(can't say for certain how many released). PCB labels have prefix ДМП,
it's assumed to have been designed by НИИ БРЭА (SRI BREA). First shown in 1983,
produced during around 1985-1992.
@@ -218,7 +218,7 @@ WRITE8_MEMBER(intel02_state::control_w)
if (!m_delay_update->enabled())
m_delay_update->adjust(attotime::from_usec(15));
- // d6: N/C
+ // d6: N/C (it's a delay timer on CC3)
// d7: enable beeper
m_beeper->set_state(BIT(data, 7));
diff --git a/src/mame/drivers/mk1.cpp b/src/mame/drivers/mk1.cpp
index 4fa70565fed..a5650714cc9 100644
--- a/src/mame/drivers/mk1.cpp
+++ b/src/mame/drivers/mk1.cpp
@@ -7,8 +7,7 @@ Driver file to handle emulation of the Novag/Videomaster Chess Champion MK I
Initial version by PeT mess@utanet.at 2000,2001.
TODO:
-- verify cncchess beeper duration/frequency
-- cncchess middle leds
+- cncchess sound is wrong, it should be a long dual-tone alarm sound
*******************************************************************************
@@ -89,17 +88,20 @@ public:
m_beeper(*this, "beeper"),
m_keypad(*this, "LINE%u", 1U),
m_delay_display(*this, "delay_display_%u", 0),
- m_out_digit(*this, "digit%u", 0U)
+ m_out_digit(*this, "digit%u", 0U),
+ m_out_led(*this, "led%u", 0U),
+ m_out_leda(*this, "led%ua", 0U)
{ }
void cmpchess(machine_config &config);
void mk1(machine_config &config);
void cnc(machine_config &config);
- DECLARE_INPUT_CHANGED_MEMBER(reset_switch);
+ DECLARE_INPUT_CHANGED_MEMBER(reset_switch) { update_reset(newval); }
protected:
virtual void machine_start() override;
+ virtual void machine_reset() override;
private:
// devices/pointers
@@ -109,6 +111,8 @@ private:
required_ioport_array<4> m_keypad;
required_device_array<timer_device, 4> m_delay_display;
output_finder<4> m_out_digit;
+ output_finder<4> m_out_led;
+ output_finder<4> m_out_leda;
void main_map(address_map &map);
void main_io(address_map &map);
@@ -117,7 +121,9 @@ private:
TIMER_DEVICE_CALLBACK_MEMBER(beeper_off) { m_beeper->set_state(0); }
TIMER_DEVICE_CALLBACK_MEMBER(blink) { m_blink = !m_blink; update_display(); }
TIMER_DEVICE_CALLBACK_MEMBER(delay_display);
+ void clear_digit(int i);
void update_display();
+ void update_reset(ioport_value state);
DECLARE_READ8_MEMBER(beeper_r);
DECLARE_WRITE8_MEMBER(input_w);
@@ -139,6 +145,8 @@ void mk1_state::machine_start()
{
// resolve handlers
m_out_digit.resolve();
+ m_out_led.resolve();
+ m_out_leda.resolve();
// zerofill
m_inp_mux = 0;
@@ -153,17 +161,30 @@ void mk1_state::machine_start()
save_item(NAME(m_blink));
}
-INPUT_CHANGED_MEMBER(mk1_state::reset_switch)
+void mk1_state::machine_reset()
+{
+ update_reset(ioport("RESET")->read());
+}
+
+void mk1_state::clear_digit(int i)
+{
+ // clear digit + connected leds
+ m_out_digit[i] = 0;
+ m_out_led[i] = 0;
+ m_out_leda[i] = 0;
+}
+
+void mk1_state::update_reset(ioport_value state)
{
// reset switch is tied to F3850 RESET pin
- m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
+ m_maincpu->set_input_line(INPUT_LINE_RESET, state ? ASSERT_LINE : CLEAR_LINE);
// clear display
- if (newval)
+ if (state)
{
m_digit_select = 0xff;
for (int i = 0; i < 4; i++)
- m_out_digit[i] = 0;
+ clear_digit(i);
}
}
@@ -179,7 +200,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(mk1_state::delay_display)
{
// clear digits if inactive
if (BIT(m_digit_select, param))
- m_out_digit[param] = 0;
+ clear_digit(param);
}
void mk1_state::update_display()
@@ -189,11 +210,15 @@ void mk1_state::update_display()
{
if (!BIT(m_digit_select, i))
{
- // display panel goes into automated blink mode if DP segment is held high
- // and DP segment itself only appears to be active if no other segments are
- u8 mask = (m_digit_data == 1) ? 0x80 : 0x7f;
- mask = (m_blink && m_digit_data & 1) ? 0 : mask;
- m_out_digit[i] = bitswap<8>(m_digit_data,0,2,1,3,4,5,6,7) & mask;
+ // display panel goes into automated blink mode if DP segment is held high,
+ // and DP segment itself by default only appears to be active if no other segments are
+ u8 dmask = (m_digit_data == 1) ? 0x80 : 0x7f;
+ u8 bmask = (m_blink && m_digit_data & 1) ? 0 : 0xff;
+ m_out_digit[i] = bitswap<8>(m_digit_data,0,2,1,3,4,5,6,7) & dmask & bmask;
+
+ // output led separately too
+ m_out_led[i] = (m_out_digit[i] & 0x80) ? 1 : 0;
+ m_out_leda[i] = m_digit_data & bmask & 1; // for ignoring dmask above
}
}
}
@@ -207,7 +232,7 @@ READ8_MEMBER(mk1_state::beeper_r)
if (!machine().side_effects_disabled() && m_beeper != nullptr)
{
m_beeper->set_state(1);
- m_beeper_off->adjust(attotime::from_msec(50)); // guessed
+ m_beeper_off->adjust(attotime::from_msec(50)); // wrong, see TODO
}
return m_maincpu->space(AS_PROGRAM).read_byte(offset);
@@ -318,7 +343,7 @@ static INPUT_PORTS_START( cmpchess )
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8 / ep") // enter piece(position)
PORT_START("RESET")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_R) PORT_TOGGLE PORT_CHANGED_MEMBER(DEVICE_SELF, mk1_state, reset_switch, nullptr) PORT_NAME("Reset Switch") // L.S. switch on the MK I
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_TOGGLE PORT_CHANGED_MEMBER(DEVICE_SELF, mk1_state, reset_switch, nullptr) PORT_NAME("Reset Switch") // L.S. switch on the MK I
INPUT_PORTS_END
static INPUT_PORTS_START( cncchess )
@@ -347,7 +372,7 @@ static INPUT_PORTS_START( cncchess )
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("H / GO")
PORT_START("RESET")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, mk1_state, reset_switch, nullptr) PORT_NAME("Reset")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, mk1_state, reset_switch, nullptr) PORT_NAME("Reset")
INPUT_PORTS_END
@@ -397,7 +422,7 @@ void mk1_state::cnc(machine_config &config)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
- BEEP(config, m_beeper, 2000); // guessed
+ BEEP(config, m_beeper, 2000); // wrong, see TODO
m_beeper->add_route(ALL_OUTPUTS, "speaker", 0.25);
TIMER(config, "beeper_off").configure_generic(FUNC(mk1_state::beeper_off));
}
@@ -436,4 +461,4 @@ ROM_END
CONS( 1977, cmpchess, 0, 0, cmpchess, cmpchess, mk1_state, empty_init, "Data Cash Systems", "CompuChess", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1978, ccmk1, cmpchess, 0, mk1, cmpchess, mk1_state, empty_init, "Novag", "Chess Champion: MK I", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
-CONS( 1979, cncchess, 0, 0, cnc, cncchess, mk1_state, empty_init, "Conic", "Computer Chess (Conic)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
+CONS( 1979, cncchess, 0, 0, cnc, cncchess, mk1_state, empty_init, "Conic", "Computer Chess (Conic)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
diff --git a/src/mame/layout/aci_ggm.lay b/src/mame/layout/aci_ggm.lay
new file mode 100644
index 00000000000..7894cc36315
--- /dev/null
+++ b/src/mame/layout/aci_ggm.lay
@@ -0,0 +1,294 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="black"><rect><color red="0.16" green="0.16" blue="0.16" /></rect></element>
+ <element name="disk_white"><disk><color red="0.73" green="0.73" blue="0.73" /></disk></element>
+ <element name="brown"><rect><color red="0.25" green="0.1" blue="0.05" /></rect></element>
+
+ <element name="digit" defstate="0">
+ <led14seg><color red="0.2" green="1.0" blue="0.85" /></led14seg>
+ </element>
+
+ <element name="seg_disk" defstate="0">
+ <disk state="0"><color red="0.0235" green="0.1255" blue="0.1059" /></disk>
+ <disk state="1"><color red="0.2" green="1.0" blue="0.85" /></disk>
+ </element>
+ <element name="seg_rect" defstate="0">
+ <rect state="0"><color red="0.0235" green="0.1255" blue="0.1059" /></rect>
+ <rect state="1"><color red="0.2" green="1.0" blue="0.85" /></rect>
+ </element>
+
+ <element name="reset" defstate="0">
+ <text string=" ">
+ <bounds x="0.0" y="0.0" width="1.8" height="3.7" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </text>
+ <disk state="0">
+ <bounds x="0.0" y="1.9" width="1.8" height="1.8" />
+ <color red="0.4" green="0.4" blue="0.4" />
+ </disk>
+ <disk state="1">
+ <bounds x="0.0" y="0.0" width="1.8" height="1.8" />
+ <color red="0.4" green="0.4" blue="0.4" />
+ </disk>
+ </element>
+
+ <element name="hl" defstate="0">
+ <text string=" ">
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </text>
+ <rect state="1">
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </rect>
+ </element>
+
+ <element name="text_r1"><text string="MEM"><color red="0.3" green="0.3" blue="0.3" /></text></element>
+ <element name="text_r2"><text string="ON"><color red="0.3" green="0.3" blue="0.3" /></text></element>
+
+ <element name="text_boris01">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="RESTORE"><color red="0.8" green="0.7" blue="0.4" /></text>
+ </element>
+ <element name="text_boris02">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="G.7"><color red="0.8" green="0.7" blue="0.4" /></text>
+ </element>
+ <element name="text_boris03">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="H.8"><color red="0.8" green="0.7" blue="0.4" /></text>
+ </element>
+ <element name="text_boris04">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="9"><color red="0.8" green="0.7" blue="0.4" /></text>
+ </element>
+ <element name="text_boris05">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="CE"><color red="0.8" green="0.7" blue="0.4" /></text>
+ </element>
+ <element name="text_boris06a">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="HALT /" align="1"><color red="0.8" green="0.7" blue="0.4" /></text>
+ </element>
+ <element name="text_boris06b">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="HINT" align="1"><color red="0.8" green="0.7" blue="0.4" /></text>
+ </element>
+ <element name="text_boris07">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="D.4"><color red="0.8" green="0.7" blue="0.4" /></text>
+ </element>
+ <element name="text_boris08">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="E.5"><color red="0.8" green="0.7" blue="0.4" /></text>
+ </element>
+ <element name="text_boris09">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="F.6"><color red="0.8" green="0.7" blue="0.4" /></text>
+ </element>
+ <element name="text_boris10">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="TIME"><color red="0.8" green="0.7" blue="0.4" /></text>
+ </element>
+ <element name="text_boris11">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string=".BEST"><color red="0.8" green="0.7" blue="0.4" /></text>
+ </element>
+ <element name="text_boris12">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="A.1"><color red="0.8" green="0.7" blue="0.4" /></text>
+ </element>
+ <element name="text_boris13">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="B.2"><color red="0.8" green="0.7" blue="0.4" /></text>
+ </element>
+ <element name="text_boris14">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="C.3"><color red="0.8" green="0.7" blue="0.4" /></text>
+ </element>
+ <element name="text_boris15">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="RANK"><color red="0.8" green="0.7" blue="0.4" /></text>
+ </element>
+ <element name="text_boris16">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="LEVEL"><color red="0.8" green="0.7" blue="0.4" /></text>
+ </element>
+ <element name="text_boris17">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="0"><color red="0.8" green="0.7" blue="0.4" /></text>
+ </element>
+ <element name="text_boris18">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="-"><color red="0.8" green="0.7" blue="0.4" /></text>
+ </element>
+ <element name="text_boris19">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="B/W"><color red="0.8" green="0.7" blue="0.4" /></text>
+ </element>
+ <element name="text_boris20">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="ENTER"><color red="0.8" green="0.7" blue="0.4" /></text>
+ </element>
+
+ <element name="text_borisp">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="[P]"><color red="0.8" green="0.1" blue="0.15" /></text>
+ </element>
+ <element name="text_borisn">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="[N]"><color red="0.8" green="0.1" blue="0.15" /></text>
+ </element>
+ <element name="text_borisb">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="[B]"><color red="0.8" green="0.1" blue="0.15" /></text>
+ </element>
+ <element name="text_borisr">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="[R]"><color red="0.8" green="0.1" blue="0.15" /></text>
+ </element>
+ <element name="text_borisq">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="[Q]"><color red="0.8" green="0.1" blue="0.15" /></text>
+ </element>
+ <element name="text_borisk">
+ <rect><color red="0.25" green="0.1" blue="0.05" /></rect>
+ <text string="[K]"><color red="0.8" green="0.1" blue="0.15" /></text>
+ </element>
+
+<!-- groups -->
+
+ <group name="display">
+ <bounds x="0" y="0" width="88" height="19" />
+
+ <repeat count="8">
+ <param name="i" start="7" increment="-1" />
+ <param name="digit_x" start="0" increment="11" />
+ <param name="dp_x" start="8.8" increment="11" />
+ <param name="ap1_x" start="10.1" increment="11" />
+ <param name="ap2_x" start="10.5" increment="11" />
+ <param name="dot_x" start="3.5" increment="11" />
+
+ <bezel name="digit~i~" element="digit"><bounds x="~digit_x~" y="0" width="10" height="15" /></bezel>
+ <bezel name="~i~.14" element="seg_disk"><bounds x="~dp_x~" y="13.5" width="1.5" height="1.5" /></bezel>
+ <bezel name="~i~.15" element="seg_disk"><bounds x="~ap1_x~" y="0" width="1" height="1.6" /></bezel>
+ <bezel name="~i~.15" element="seg_rect"><bounds x="~ap2_x~" y="0" width="0.7" height="3.5" /></bezel>
+ <bezel element="disk_white"><bounds x="~dot_x~" y="17.1" width="1.9" height="1.9" /></bezel>
+ </repeat>
+ </group>
+
+ <group name="buttons_base">
+ <bounds x="0" y="0" width="19.5" height="13.5" />
+
+ <repeat count="4">
+ <param name="y" start="0" increment="3.5" />
+ <repeat count="5">
+ <param name="x" start="0" increment="4" />
+ <bezel element="~basecolor~"><bounds x="~x~" y="~y~" width="3.5" height="3" /></bezel>
+ </repeat>
+ </repeat>
+ </group>
+
+ <group name="buttons_boris">
+ <bounds x="0" y="0" width="19.5" height="13.5" />
+
+ <bezel element="text_boris01"><bounds x="0.1" y="0.9" width="3.3" height="1" /></bezel>
+ <bezel element="text_boris02"><bounds x="4.1" y="0.01" width="3.3" height="1.5" /></bezel>
+ <bezel element="text_boris03"><bounds x="8.1" y="0.01" width="3.3" height="1.5" /></bezel>
+ <bezel element="text_boris04"><bounds x="12.1" y="0.4" width="3.3" height="1.9" /></bezel>
+ <bezel element="text_boris05"><bounds x="16.1" y="0.6" width="3.3" height="1.5" /></bezel>
+
+ <bezel element="text_boris06a"><bounds x="0.6" y="4.0" width="2.8" height="1" /></bezel>
+ <bezel element="text_boris06b"><bounds x="0.6" y="5.0" width="2.8" height="1" /></bezel>
+ <bezel element="text_boris07"><bounds x="4.1" y="3.51" width="3.3" height="1.5" /></bezel>
+ <bezel element="text_boris08"><bounds x="8.1" y="3.51" width="3.3" height="1.5" /></bezel>
+ <bezel element="text_boris09"><bounds x="12.1" y="3.51" width="3.3" height="1.5" /></bezel>
+ <bezel element="text_boris10"><bounds x="16.1" y="4.4" width="3.3" height="1" /></bezel>
+
+ <bezel element="text_boris11"><bounds x="0.1" y="7.9" width="3.3" height="1" /></bezel>
+ <bezel element="text_boris12"><bounds x="4.1" y="7.01" width="3.3" height="1.5" /></bezel>
+ <bezel element="text_boris13"><bounds x="8.1" y="7.01" width="3.3" height="1.5" /></bezel>
+ <bezel element="text_boris14"><bounds x="12.1" y="7.01" width="3.3" height="1.5" /></bezel>
+ <bezel element="text_boris15"><bounds x="16.1" y="7.9" width="3.3" height="1" /></bezel>
+
+ <bezel element="text_boris16"><bounds x="0.1" y="11.4" width="3.3" height="1" /></bezel>
+ <bezel element="text_boris17"><bounds x="4.1" y="10.9" width="3.3" height="1.9" /></bezel>
+ <bezel element="text_boris18"><bounds x="8.1" y="10.9" width="3.3" height="1.9" /></bezel>
+ <bezel element="text_boris19"><bounds x="12.1" y="11.1" width="3.3" height="1.5" /></bezel>
+ <bezel element="text_boris20"><bounds x="16.1" y="11.4" width="3.3" height="1" /></bezel>
+
+ <bezel element="text_borisp"><bounds x="4.1" y="8.3" width="3.3" height="1.5" /></bezel>
+ <bezel element="text_borisn"><bounds x="8.1" y="8.3" width="3.3" height="1.5" /></bezel>
+ <bezel element="text_borisb"><bounds x="12.1" y="8.3" width="3.3" height="1.5" /></bezel>
+ <bezel element="text_borisr"><bounds x="4.1" y="4.8" width="3.3" height="1.5" /></bezel>
+ <bezel element="text_borisq"><bounds x="8.1" y="4.8" width="3.3" height="1.5" /></bezel>
+ <bezel element="text_borisk"><bounds x="12.1" y="4.8" width="3.3" height="1.5" /></bezel>
+ </group>
+
+ <group name="buttons_click">
+ <bounds x="0" y="0" width="19.5" height="13.5" />
+
+ <bezel element="hl" inputtag="IN.3" inputmask="0x08"><bounds x="0" y="0" width="3.5" height="3" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x04"><bounds x="4" y="0" width="3.5" height="3" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x08"><bounds x="8" y="0" width="3.5" height="3" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x10"><bounds x="12" y="0" width="3.5" height="3" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x10"><bounds x="16" y="0" width="3.5" height="3" /><color alpha="0.22" /></bezel>
+
+ <bezel element="hl" inputtag="IN.3" inputmask="0x02"><bounds x="0" y="3.5" width="3.5" height="3" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x10"><bounds x="4" y="3.5" width="3.5" height="3" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x01"><bounds x="8" y="3.5" width="3.5" height="3" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x02"><bounds x="12" y="3.5" width="3.5" height="3" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x08"><bounds x="16" y="3.5" width="3.5" height="3" /><color alpha="0.22" /></bezel>
+
+ <bezel element="hl" inputtag="IN.3" inputmask="0x04"><bounds x="0" y="7" width="3.5" height="3" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x02"><bounds x="4" y="7" width="3.5" height="3" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x04"><bounds x="8" y="7" width="3.5" height="3" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x08"><bounds x="12" y="7" width="3.5" height="3" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x04"><bounds x="16" y="7" width="3.5" height="3" /><color alpha="0.22" /></bezel>
+
+ <bezel element="hl" inputtag="IN.3" inputmask="0x01"><bounds x="0" y="10.5" width="3.5" height="3" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x01"><bounds x="4" y="10.5" width="3.5" height="3" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x01"><bounds x="8" y="10.5" width="3.5" height="3" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x02"><bounds x="12" y="10.5" width="3.5" height="3" /><color alpha="0.22" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x10"><bounds x="16" y="10.5" width="3.5" height="3" /><color alpha="0.22" /></bezel>
+ </group>
+
+ <group name="mem_switch">
+ <bounds x="0" y="0" width="6" height="6.4" />
+
+ <bezel element="black"><bounds x="2.5" y="2" width="1" height="2.5" /></bezel>
+ <bezel element="text_r1"><bounds x="0" y="0" width="6" height="1.8" /></bezel>
+ <bezel element="text_r2"><bounds x="0" y="4.6" width="6" height="1.8" /></bezel>
+ <bezel element="reset" inputtag="IN.4" inputmask="0x02"><bounds x="2.345" y="1.9" width="1.31" height="2.7" /></bezel>
+ </group>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout, Boris 2.5">
+ <bounds left="-5" right="104" top="-2" bottom="93" />
+ <group ref="display"><bounds x="0" y="0" width="88" height="19" /></group>
+ <bezel element="black"><bounds x="-6" y="23" width="111" height="1.5" /></bezel>
+
+ <param name="basecolor" value="brown" />
+ <group ref="buttons_base"><bounds x="0" y="30" width="88" height="60.92" /></group>
+ <group ref="buttons_boris"><bounds x="0" y="30" width="88" height="60.92" /></group>
+ <group ref="buttons_click"><bounds x="0" y="30" width="88" height="60.92" /></group>
+ <group ref="mem_switch"><bounds x="87" y="28" width="18" height="19.2" /></group>
+ </view>
+
+ <view name="Internal Layout, No Overlay">
+ <bounds left="-5" right="104" top="-2" bottom="93" />
+ <group ref="display"><bounds x="0" y="0" width="88" height="19" /></group>
+ <bezel element="black"><bounds x="-6" y="23" width="111" height="1.5" /></bezel>
+
+ <param name="basecolor" value="brown" />
+ <group ref="buttons_base"><bounds x="0" y="30" width="88" height="60.92" /></group>
+ <group ref="buttons_click"><bounds x="0" y="30" width="88" height="60.92" /></group>
+ <group ref="mem_switch"><bounds x="87" y="28" width="18" height="19.2" /></group>
+ </view>
+
+</mamelayout>
diff --git a/src/mame/layout/cncchess.lay b/src/mame/layout/cncchess.lay
index 0546d2e8a0e..432c6146365 100644
--- a/src/mame/layout/cncchess.lay
+++ b/src/mame/layout/cncchess.lay
@@ -195,8 +195,12 @@
<bezel name="digit1" element="digit"><bounds x="31.3" y="23" width="3" height="4.5" /></bezel>
<bezel name="digit2" element="digit"><bounds x="36.3" y="23" width="3" height="4.5" /></bezel>
<bezel name="digit3" element="digit"><bounds x="39.3" y="23" width="3" height="4.5" /></bezel>
- <bezel name="ledx" element="led"><bounds x="35.15" y="24.0" width="0.45" height="0.45" /></bezel>
- <bezel name="ledx" element="led"><bounds x="35.0" y="26.05" width="0.45" height="0.45" /></bezel>
+ <bezel element="disk_blackb"><bounds x="30.82" y="27.0" width="0.55" height="0.55" /></bezel>
+ <bezel element="disk_blackb"><bounds x="33.82" y="27.0" width="0.55" height="0.55" /></bezel>
+ <bezel element="disk_blackb"><bounds x="38.82" y="27.0" width="0.55" height="0.55" /></bezel>
+ <bezel element="disk_blackb"><bounds x="41.82" y="27.0" width="0.55" height="0.55" /></bezel>
+ <bezel name="led1a" element="led"><bounds x="35.15" y="24.0" width="0.45" height="0.45" /></bezel>
+ <bezel name="led0a" element="led"><bounds x="35.0" y="26.05" width="0.45" height="0.45" /></bezel>
<bezel element="red"><bounds x="25.3" y="22" width="20" height="6.5" /><color alpha="0.15" /></bezel>
<!-- button panel -->
@@ -270,7 +274,7 @@
<bezel element="hl" inputtag="LINE2" inputmask="0x10"><bounds x="48" y="36.2" width="2.6" height="4.5" /><color alpha="0.25" /></bezel>
<bezel element="orange"><bounds x="10.8" y="37.15" width="4.5" height="2.6" /></bezel>
- <bezel element="text_br"><bounds x="10.9" y="37.6" width="4.3" height="1.5" /></bezel>
+ <bezel element="text_br"><bounds x="10.9" y="37.65" width="4.3" height="1.5" /></bezel>
<bezel element="hl" inputtag="RESET" inputmask="0x01"><bounds x="10.8" y="37.15" width="4.5" height="2.6" /><color alpha="0.25" /></bezel>
</view>
diff --git a/src/mame/layout/snread.lay b/src/mame/layout/snread.lay
index 23b285b751c..26da6cf2c80 100644
--- a/src/mame/layout/snread.lay
+++ b/src/mame/layout/snread.lay
@@ -3,8 +3,6 @@
<!-- define elements -->
-<!-- note: TI's alphanumeric 14seg digits look different from MAME's default, most notably the right half is wider -->
-
<element name="digit" defstate="0">
<led14seg><color red="0.2" green="1.0" blue="0.85" /></led14seg>
</element>
diff --git a/src/mame/layout/snspell.lay b/src/mame/layout/snspell.lay
index 78a50fea709..752e81ab234 100644
--- a/src/mame/layout/snspell.lay
+++ b/src/mame/layout/snspell.lay
@@ -3,25 +3,22 @@
<!-- define elements -->
-<!-- note: TI's alphanumeric 14seg digits look different from MAME's default, most notably the right half is wider -->
-
<element name="digit" defstate="0">
<led14seg><color red="0.2" green="1.0" blue="0.85" /></led14seg>
</element>
<!-- add our own for DP(display point) and the custom AP(apostrophe) segments -->
- <element name="lamp_dp" defstate="0">
+ <element name="seg_disk" defstate="0">
<disk state="0"><color red="0.0235" green="0.1255" blue="0.1059" /></disk>
<disk state="1"><color red="0.2" green="1.0" blue="0.85" /></disk>
</element>
- <element name="lamp_ap" defstate="0">
+ <element name="seg_rect" defstate="0">
<rect state="0"><color red="0.0235" green="0.1255" blue="0.1059" /></rect>
<rect state="1"><color red="0.2" green="1.0" blue="0.85" /></rect>
</element>
-
<!-- build screen -->
<view name="Internal Layout">
@@ -29,37 +26,18 @@
<!-- 8 digits -->
- <bezel name="digit0" element="digit"><bounds x="0" y="0" width="10" height="15" /></bezel>
- <bezel name="0.14" element="lamp_dp"><bounds x="9" y="13.5" width="1.5" height="1.5" /></bezel>
- <bezel name="0.15" element="lamp_ap"><bounds x="10.5" y="0" width="0.5" height="3.5" /></bezel>
-
- <bezel name="digit1" element="digit"><bounds x="11" y="0" width="10" height="15" /></bezel>
- <bezel name="1.14" element="lamp_dp"><bounds x="20" y="13.5" width="1.5" height="1.5" /></bezel>
- <bezel name="1.15" element="lamp_ap"><bounds x="21.5" y="0" width="0.5" height="3.5" /></bezel>
-
- <bezel name="digit2" element="digit"><bounds x="22" y="0" width="10" height="15" /></bezel>
- <bezel name="2.14" element="lamp_dp"><bounds x="31" y="13.5" width="1.5" height="1.5" /></bezel>
- <bezel name="2.15" element="lamp_ap"><bounds x="32.5" y="0" width="0.5" height="3.5" /></bezel>
-
- <bezel name="digit3" element="digit"><bounds x="33" y="0" width="10" height="15" /></bezel>
- <bezel name="3.14" element="lamp_dp"><bounds x="42" y="13.5" width="1.5" height="1.5" /></bezel>
- <bezel name="3.15" element="lamp_ap"><bounds x="43.5" y="0" width="0.5" height="3.5" /></bezel>
-
- <bezel name="digit4" element="digit"><bounds x="44" y="0" width="10" height="15" /></bezel>
- <bezel name="4.14" element="lamp_dp"><bounds x="53" y="13.5" width="1.5" height="1.5" /></bezel>
- <bezel name="4.15" element="lamp_ap"><bounds x="54.5" y="0" width="0.5" height="3.5" /></bezel>
-
- <bezel name="digit5" element="digit"><bounds x="55" y="0" width="10" height="15" /></bezel>
- <bezel name="5.14" element="lamp_dp"><bounds x="64" y="13.5" width="1.5" height="1.5" /></bezel>
- <bezel name="5.15" element="lamp_ap"><bounds x="65.5" y="0" width="0.5" height="3.5" /></bezel>
-
- <bezel name="digit6" element="digit"><bounds x="66" y="0" width="10" height="15" /></bezel>
- <bezel name="6.14" element="lamp_dp"><bounds x="75" y="13.5" width="1.5" height="1.5" /></bezel>
- <bezel name="6.15" element="lamp_ap"><bounds x="76.5" y="0" width="0.5" height="3.5" /></bezel>
-
- <bezel name="digit7" element="digit"><bounds x="77" y="0" width="10" height="15" /></bezel>
- <bezel name="7.14" element="lamp_dp"><bounds x="86" y="13.5" width="1.5" height="1.5" /></bezel>
- <bezel name="7.15" element="lamp_ap"><bounds x="87.5" y="0" width="0.5" height="3.5" /></bezel>
+ <repeat count="8">
+ <param name="i" start="0" increment="1" />
+ <param name="digit_x" start="0" increment="11" />
+ <param name="dp_x" start="8.8" increment="11" />
+ <param name="ap1_x" start="10.1" increment="11" />
+ <param name="ap2_x" start="10.5" increment="11" />
+
+ <bezel name="digit~i~" element="digit"><bounds x="~digit_x~" y="0" width="10" height="15" /></bezel>
+ <bezel name="~i~.14" element="seg_disk"><bounds x="~dp_x~" y="13.5" width="1.5" height="1.5" /></bezel>
+ <bezel name="~i~.15" element="seg_disk"><bounds x="~ap1_x~" y="0" width="1" height="1.6" /></bezel>
+ <bezel name="~i~.15" element="seg_rect"><bounds x="~ap2_x~" y="0" width="0.7" height="3.5" /></bezel>
+ </repeat>
</view>
</mamelayout>
diff --git a/src/mame/layout/snspellsp.lay b/src/mame/layout/snspellsp.lay
index a13712b7ea1..7e9b48a05e5 100644
--- a/src/mame/layout/snspellsp.lay
+++ b/src/mame/layout/snspellsp.lay
@@ -3,8 +3,6 @@
<!-- define elements -->
-<!-- note: TI's alphanumeric 14seg digits look different from MAME's default, most notably the right half is wider -->
-
<element name="digit" defstate="0">
<led14seg><color red="0.2" green="1.0" blue="0.85" /></led14seg>
</element>
diff --git a/src/mame/layout/spellb.lay b/src/mame/layout/spellb.lay
index 0398108caff..752e81ab234 100644
--- a/src/mame/layout/spellb.lay
+++ b/src/mame/layout/spellb.lay
@@ -3,21 +3,17 @@
<!-- define elements -->
-<!-- file is copied from, and identical to snspell.lay -->
-
-<!-- note: TI's alphanumeric 14seg digits look different from MAME's default, most notably the right half is wider -->
-
<element name="digit" defstate="0">
<led14seg><color red="0.2" green="1.0" blue="0.85" /></led14seg>
</element>
<!-- add our own for DP(display point) and the custom AP(apostrophe) segments -->
- <element name="lamp_dp" defstate="0">
+ <element name="seg_disk" defstate="0">
<disk state="0"><color red="0.0235" green="0.1255" blue="0.1059" /></disk>
<disk state="1"><color red="0.2" green="1.0" blue="0.85" /></disk>
</element>
- <element name="lamp_ap" defstate="0">
+ <element name="seg_rect" defstate="0">
<rect state="0"><color red="0.0235" green="0.1255" blue="0.1059" /></rect>
<rect state="1"><color red="0.2" green="1.0" blue="0.85" /></rect>
</element>
@@ -26,41 +22,22 @@
<!-- build screen -->
<view name="Internal Layout">
- <bounds left="0" right="89" top="0" bottom="15" />
+ <bounds left="0" right="88.5" top="0" bottom="15" />
<!-- 8 digits -->
- <bezel name="digit0" element="digit"><bounds x="0" y="0" width="10" height="15" /></bezel>
- <bezel name="0.14" element="lamp_dp"><bounds x="9" y="13.5" width="1.5" height="1.5" /></bezel>
- <bezel name="0.15" element="lamp_ap"><bounds x="10.5" y="0" width="0.5" height="3.5" /></bezel>
-
- <bezel name="digit1" element="digit"><bounds x="11" y="0" width="10" height="15" /></bezel>
- <bezel name="1.14" element="lamp_dp"><bounds x="20" y="13.5" width="1.5" height="1.5" /></bezel>
- <bezel name="1.15" element="lamp_ap"><bounds x="21.5" y="0" width="0.5" height="3.5" /></bezel>
-
- <bezel name="digit2" element="digit"><bounds x="22" y="0" width="10" height="15" /></bezel>
- <bezel name="2.14" element="lamp_dp"><bounds x="31" y="13.5" width="1.5" height="1.5" /></bezel>
- <bezel name="2.15" element="lamp_ap"><bounds x="32.5" y="0" width="0.5" height="3.5" /></bezel>
-
- <bezel name="digit3" element="digit"><bounds x="33" y="0" width="10" height="15" /></bezel>
- <bezel name="3.14" element="lamp_dp"><bounds x="42" y="13.5" width="1.5" height="1.5" /></bezel>
- <bezel name="3.15" element="lamp_ap"><bounds x="43.5" y="0" width="0.5" height="3.5" /></bezel>
-
- <bezel name="digit4" element="digit"><bounds x="44" y="0" width="10" height="15" /></bezel>
- <bezel name="4.14" element="lamp_dp"><bounds x="53" y="13.5" width="1.5" height="1.5" /></bezel>
- <bezel name="4.15" element="lamp_ap"><bounds x="54.5" y="0" width="0.5" height="3.5" /></bezel>
-
- <bezel name="digit5" element="digit"><bounds x="55" y="0" width="10" height="15" /></bezel>
- <bezel name="5.14" element="lamp_dp"><bounds x="64" y="13.5" width="1.5" height="1.5" /></bezel>
- <bezel name="5.15" element="lamp_ap"><bounds x="65.5" y="0" width="0.5" height="3.5" /></bezel>
-
- <bezel name="digit6" element="digit"><bounds x="66" y="0" width="10" height="15" /></bezel>
- <bezel name="6.14" element="lamp_dp"><bounds x="75" y="13.5" width="1.5" height="1.5" /></bezel>
- <bezel name="6.15" element="lamp_ap"><bounds x="76.5" y="0" width="0.5" height="3.5" /></bezel>
-
- <bezel name="digit7" element="digit"><bounds x="77" y="0" width="10" height="15" /></bezel>
- <bezel name="7.14" element="lamp_dp"><bounds x="86" y="13.5" width="1.5" height="1.5" /></bezel>
- <bezel name="7.15" element="lamp_ap"><bounds x="87.5" y="0" width="0.5" height="3.5" /></bezel>
+ <repeat count="8">
+ <param name="i" start="0" increment="1" />
+ <param name="digit_x" start="0" increment="11" />
+ <param name="dp_x" start="8.8" increment="11" />
+ <param name="ap1_x" start="10.1" increment="11" />
+ <param name="ap2_x" start="10.5" increment="11" />
+
+ <bezel name="digit~i~" element="digit"><bounds x="~digit_x~" y="0" width="10" height="15" /></bezel>
+ <bezel name="~i~.14" element="seg_disk"><bounds x="~dp_x~" y="13.5" width="1.5" height="1.5" /></bezel>
+ <bezel name="~i~.15" element="seg_disk"><bounds x="~ap1_x~" y="0" width="1" height="1.6" /></bezel>
+ <bezel name="~i~.15" element="seg_rect"><bounds x="~ap2_x~" y="0" width="0.7" height="3.5" /></bezel>
+ </repeat>
</view>
</mamelayout>
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index d062a8aa3fb..ce99ae93328 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -879,6 +879,9 @@ borisa //
@source:aci_borisdpl.cpp
borisdpl //
+@source:aci_ggm.cpp
+ggm
+
@source:acommand.cpp
acommand // (c) 1990
diff --git a/src/mame/mess.flt b/src/mame/mess.flt
index c874689ea3f..c4c4621cac5 100644
--- a/src/mame/mess.flt
+++ b/src/mame/mess.flt
@@ -18,6 +18,7 @@ acd.cpp
aceex.cpp
aci_boris.cpp
aci_borisdpl.cpp
+aci_ggm.cpp
acrnsys1.cpp
acrnsys.cpp
acvirus.cpp