summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/hegenerglaser/amsterdam.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/hegenerglaser/amsterdam.cpp')
-rw-r--r--src/mame/hegenerglaser/amsterdam.cpp263
1 files changed, 263 insertions, 0 deletions
diff --git a/src/mame/hegenerglaser/amsterdam.cpp b/src/mame/hegenerglaser/amsterdam.cpp
new file mode 100644
index 00000000000..8896119eee3
--- /dev/null
+++ b/src/mame/hegenerglaser/amsterdam.cpp
@@ -0,0 +1,263 @@
+// license:BSD-3-Clause
+// copyright-holders:Dirk Verwiebe, Cowering, hap
+/*******************************************************************************
+
+Mephisto Amsterdam (2-ROM hardware version)
+
+Hardware notes:
+
+Amsterdam:
+- same as Glasgow, but 2*27C256 EPROMs
+
+Dallas 68020:
+- MC68020RC12B @ 14MHz
+- 64KB ROM(27C512), 64KB RAM(8*M5M5165P-10L)
+- rest is similar to 16-bit version
+
+TODO:
+- does it have DTACK wait states? surely the PCB supports LDS/UDS wait states
+ just like Glasgow, but it's probably disabled due to faster EPROMs
+
+*******************************************************************************/
+
+#include "emu.h"
+
+#include "mmboard.h"
+#include "mmdisplay1.h"
+
+#include "cpu/m68000/m68000.h"
+#include "cpu/m68000/m68020.h"
+#include "sound/dac.h"
+
+#include "speaker.h"
+
+// internal artwork
+#include "mephisto_amsterdam.lh"
+
+
+namespace {
+
+class amsterdam_state : public driver_device
+{
+public:
+ amsterdam_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_board(*this, "board"),
+ m_display(*this, "display"),
+ m_dac(*this, "dac"),
+ m_keys(*this, "KEY.%u", 0),
+ m_reset(*this, "RESET")
+ { }
+
+ DECLARE_INPUT_CHANGED_MEMBER(reset_button);
+
+ void amsterdam(machine_config &config);
+ void dallas32(machine_config &config);
+
+private:
+ required_device<cpu_device> m_maincpu;
+ required_device<mephisto_board_device> m_board;
+ required_device<mephisto_display1_device> m_display;
+ required_device<dac_1bit_device> m_dac;
+ required_ioport_array<2> m_keys;
+ required_ioport m_reset;
+
+ void amsterd_mem(address_map &map) ATTR_COLD;
+ void dallas32_mem(address_map &map) ATTR_COLD;
+
+ void led_w(offs_t offset, u8 data);
+ void dac_w(u8 data);
+ u8 keys_r();
+};
+
+
+
+/*******************************************************************************
+ I/O
+*******************************************************************************/
+
+INPUT_CHANGED_MEMBER(amsterdam_state::reset_button)
+{
+ // RES buttons in serial tied to CPU RESET
+ if (m_reset->read() == 3)
+ m_maincpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero);
+}
+
+void amsterdam_state::led_w(offs_t offset, u8 data)
+{
+ // d0-d7: board leds
+ m_board->led_w(data);
+
+ // a8: lcd strobe
+ m_display->strobe_w(BIT(offset, 7));
+}
+
+void amsterdam_state::dac_w(u8 data)
+{
+ // d0: speaker out
+ m_dac->write(BIT(data, 0));
+}
+
+u8 amsterdam_state::keys_r()
+{
+ // lcd strobe is shared with keypad select
+ return m_keys[m_display->strobe_r()]->read();
+}
+
+
+
+/*******************************************************************************
+ Address Maps
+*******************************************************************************/
+
+void amsterdam_state::amsterd_mem(address_map &map)
+{
+ map(0x000000, 0x00ffff).rom();
+ map(0x800002, 0x800002).w(m_display, FUNC(mephisto_display1_device::data_w));
+ map(0x800004, 0x800004).w(FUNC(amsterdam_state::dac_w));
+ map(0x800008, 0x800009).nopr(); // clr.b
+ map(0x800008, 0x800008).select(0x80).w(FUNC(amsterdam_state::led_w));
+ map(0x800010, 0x800010).w(m_board, FUNC(mephisto_board_device::mux_w));
+ map(0x800020, 0x800020).r(m_board, FUNC(mephisto_board_device::input_r));
+ map(0x800040, 0x800040).r(FUNC(amsterdam_state::keys_r));
+ map(0xffc000, 0xffffff).ram(); // 16KB
+}
+
+void amsterdam_state::dallas32_mem(address_map &map)
+{
+ map(0x000000, 0x00ffff).rom();
+ map(0x010000, 0x01ffff).ram(); // 64KB
+ map(0x800002, 0x800002).w(m_display, FUNC(mephisto_display1_device::data_w));
+ map(0x800004, 0x800004).w(FUNC(amsterdam_state::dac_w));
+ map(0x800008, 0x800008).select(0x80).w(FUNC(amsterdam_state::led_w));
+ map(0x800010, 0x800010).w(m_board, FUNC(mephisto_board_device::mux_w));
+ map(0x800020, 0x800020).r(m_board, FUNC(mephisto_board_device::input_r));
+ map(0x800040, 0x800040).r(FUNC(amsterdam_state::keys_r));
+}
+
+
+
+/*******************************************************************************
+ Input Ports
+*******************************************************************************/
+
+static INPUT_PORTS_START( amsterdam )
+ PORT_START("KEY.0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("INFO") PORT_CODE(KEYCODE_I)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("POS") PORT_CODE(KEYCODE_P)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LEV") PORT_CODE(KEYCODE_L)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("MEM") PORT_CODE(KEYCODE_M)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("ENT") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G / 7 / King") PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H / 8") PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD)
+
+ PORT_START("KEY.1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A / 1") PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B / 2 / Pawn") PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C / 3 / Knight") PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D / 4 / Bishop") PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E / 5 / Rook") PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F / 6 / Queen") PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Left / Black / 9") PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_LEFT)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Right / White / 0") PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_RIGHT)
+
+ PORT_START("RESET")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RES 1") PORT_CODE(KEYCODE_Z) PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(amsterdam_state::reset_button), 0)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RES 2") PORT_CODE(KEYCODE_X) PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(amsterdam_state::reset_button), 0)
+INPUT_PORTS_END
+
+
+
+/*******************************************************************************
+ Machine Configs
+*******************************************************************************/
+
+void amsterdam_state::amsterdam(machine_config &config)
+{
+ // basic machine hardware
+ M68000(config, m_maincpu, 12_MHz_XTAL);
+ m_maincpu->set_periodic_int(FUNC(amsterdam_state::irq5_line_hold), attotime::from_hz(50));
+ m_maincpu->set_addrmap(AS_PROGRAM, &amsterdam_state::amsterd_mem);
+
+ MEPHISTO_SENSORS_BOARD(config, m_board);
+ m_board->set_delay(attotime::from_msec(200));
+
+ // video hardware
+ MEPHISTO_DISPLAY_MODULE1(config, m_display);
+ config.set_default_layout(layout_mephisto_amsterdam);
+
+ // sound hardware
+ SPEAKER(config, "speaker").front_center();
+ DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25);
+}
+
+void amsterdam_state::dallas32(machine_config &config)
+{
+ amsterdam(config);
+
+ // basic machine hardware
+ M68020(config.replace(), m_maincpu, 14_MHz_XTAL);
+ m_maincpu->set_periodic_int(FUNC(amsterdam_state::irq4_line_hold), attotime::from_hz(50));
+ m_maincpu->set_addrmap(AS_PROGRAM, &amsterdam_state::dallas32_mem);
+}
+
+
+
+/*******************************************************************************
+ ROM Definitions
+*******************************************************************************/
+
+ROM_START( amsterd )
+ ROM_REGION16_BE( 0x10000, "maincpu", 0 )
+ ROM_LOAD16_BYTE("amsterda-u.bin", 0x00000, 0x08000, CRC(0a75514e) SHA1(27daf78b0aba4d7a293b96b3c1fa92f6ee9bcb59) )
+ ROM_LOAD16_BYTE("amsterda-l.bin", 0x00001, 0x08000, CRC(6e17d8fa) SHA1(e0f9e57aaa445f6ff7cbe868658ed7bcfa7e31fb) )
+ROM_END
+
+
+ROM_START( dallas32 ) // serial 06053xx
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("dallas_68020", 0x00000, 0x10000, CRC(00ab8e11) SHA1(5e0a2f5e6b5a65d4997d6a999f23f9c30460f2e3) ) // MBM27C512-25
+ROM_END
+
+ROM_START( dallas32a )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("dallas32a.bin", 0x00000, 0x10000, CRC(83b9ff3f) SHA1(97bf4cb3c61f8ec328735b3c98281bba44b30a28) )
+ROM_END
+
+ROM_START( dallas16 )
+ ROM_REGION16_BE( 0x10000, "maincpu", 0 )
+ ROM_LOAD16_BYTE("dallas-u.bin", 0x00000, 0x08000, CRC(70b741f7) SHA1(23d55ed0fea127b727d725c367ee1932ff5af39f) )
+ ROM_LOAD16_BYTE("dallas-l.bin", 0x00001, 0x08000, CRC(69300ad3) SHA1(57ec1b955b1ddfe722011ff5da68a0cd71af9251) )
+ROM_END
+
+
+ROM_START( roma32 )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD("roma32.bin", 0x00000, 0x10000, CRC(587d03bf) SHA1(504e9ff958084700076d633f9c306fc7baf64ffd) )
+ROM_END
+
+ROM_START( roma16 )
+ ROM_REGION16_BE( 0x10000, "maincpu", 0 )
+ ROM_LOAD16_BYTE("roma16-u.bin", 0x00000, 0x08000, CRC(111d030f) SHA1(e027f7e7018d28ab794e7730392506056809db6b) )
+ ROM_LOAD16_BYTE("roma16-l.bin", 0x00001, 0x08000, CRC(736e1c8d) SHA1(3a71f9185406ab5237c912ec8563b88b01ad50e8) )
+ROM_END
+
+} // anonymous namespace
+
+
+
+/*******************************************************************************
+ Drivers
+*******************************************************************************/
+
+// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS
+SYST( 1985, amsterd, 0, 0, amsterdam, amsterdam, amsterdam_state, empty_init, "Hegener + Glaser", "Mephisto Amsterdam", MACHINE_SUPPORTS_SAVE )
+
+SYST( 1986, dallas32, 0, 0, dallas32, amsterdam, amsterdam_state, empty_init, "Hegener + Glaser", "Mephisto Dallas 68020 (set 1)", MACHINE_SUPPORTS_SAVE )
+SYST( 1986, dallas32a, dallas32, 0, dallas32, amsterdam, amsterdam_state, empty_init, "Hegener + Glaser", "Mephisto Dallas 68020 (set 2)", MACHINE_SUPPORTS_SAVE )
+SYST( 1986, dallas16, dallas32, 0, amsterdam, amsterdam, amsterdam_state, empty_init, "Hegener + Glaser", "Mephisto Dallas 68000", MACHINE_SUPPORTS_SAVE )
+
+SYST( 1987, roma32, 0, 0, dallas32, amsterdam, amsterdam_state, empty_init, "Hegener + Glaser", "Mephisto Roma 68020", MACHINE_SUPPORTS_SAVE )
+SYST( 1987, roma16, roma32, 0, amsterdam, amsterdam, amsterdam_state, empty_init, "Hegener + Glaser", "Mephisto Roma 68000", MACHINE_SUPPORTS_SAVE )