From bee1c8e09cd4684ec868cc014f6a9ef3926ad17e Mon Sep 17 00:00:00 2001 From: hap Date: Mon, 20 Jan 2025 23:48:13 +0100 Subject: glasgow: add waitstates, mmdisplay1: more sane shift register New working systems ------------------- Mephisto Excalibur [hap, anonymous, Berger] Mephisto Excalibur (WCCC 1983 New York TM) [hap, anonymous, Berger] --- src/devices/bus/vme/sys68k_cpu1.cpp | 39 ++- src/devices/machine/chessmachine.cpp | 1 - src/mame/fidelity/clockdiv.h | 2 +- src/mame/hegenerglaser/amsterdam.cpp | 18 +- src/mame/hegenerglaser/brikett.cpp | 2 +- src/mame/hegenerglaser/excalibur.cpp | 249 +++++++++++++ src/mame/hegenerglaser/glasgow.cpp | 111 +++++- src/mame/hegenerglaser/mm2.cpp | 18 +- src/mame/hegenerglaser/mmdisplay1.cpp | 35 +- src/mame/hegenerglaser/mmdisplay1.h | 4 +- src/mame/hegenerglaser/modular_tm.cpp | 4 +- src/mame/hegenerglaser/roma2.cpp | 15 +- src/mame/layout/mephisto_excalibur.lay | 621 +++++++++++++++++++++++++++++++++ src/mame/mame.lst | 4 + src/mame/misc/micro3d_m.cpp | 2 +- src/mame/pinball/gts80b.cpp | 6 +- 16 files changed, 1036 insertions(+), 95 deletions(-) create mode 100644 src/mame/hegenerglaser/excalibur.cpp create mode 100644 src/mame/layout/mephisto_excalibur.lay diff --git a/src/devices/bus/vme/sys68k_cpu1.cpp b/src/devices/bus/vme/sys68k_cpu1.cpp index f40eea95ed1..160a14ad3e8 100644 --- a/src/devices/bus/vme/sys68k_cpu1.cpp +++ b/src/devices/bus/vme/sys68k_cpu1.cpp @@ -260,9 +260,9 @@ INPUT_PORTS_END */ void vme_sys68k_cpu1_card_device::centronics_ack_w(int state) { - LOG("%s(%d)\n", FUNCNAME, state); - m_centronics_ack = state; - m_pit->h1_set (state); + LOG("%s(%d)\n", FUNCNAME, state); + m_centronics_ack = state; + m_pit->h1_set(state); } /* Centronics BUSY handler @@ -270,8 +270,8 @@ void vme_sys68k_cpu1_card_device::centronics_ack_w(int state) */ void vme_sys68k_cpu1_card_device::centronics_busy_w(int state) { - LOG("%s(%d)\n", FUNCNAME, state); - m_centronics_busy = state; + LOG("%s(%d)\n", FUNCNAME, state); + m_centronics_busy = state; } /* Centronics PERROR handler @@ -279,8 +279,8 @@ void vme_sys68k_cpu1_card_device::centronics_busy_w(int state) */ void vme_sys68k_cpu1_card_device::centronics_perror_w(int state) { - LOG("%s(%d)\n", FUNCNAME, state); - m_centronics_perror = state; + LOG("%s(%d)\n", FUNCNAME, state); + m_centronics_perror = state; } /* Centronics SELECT handler @@ -288,20 +288,20 @@ void vme_sys68k_cpu1_card_device::centronics_perror_w(int state) */ void vme_sys68k_cpu1_card_device::centronics_select_w(int state) { - LOG("%s(%d)\n", FUNCNAME, state); - m_centronics_select = state; - m_pit->portb_setbit (0, state); + LOG("%s(%d)\n", FUNCNAME, state); + m_centronics_select = state; + m_pit->portb_setbit(0, state); } /* Start it up */ -void vme_sys68k_cpu1_card_device::device_start () +void vme_sys68k_cpu1_card_device::device_start() { LOG("%s\n", FUNCNAME); - save_item (NAME (m_centronics_busy)); - save_item (NAME (m_centronics_ack)); - save_item (NAME (m_centronics_select)); - save_item (NAME (m_centronics_perror)); + save_item(NAME(m_centronics_busy)); + save_item(NAME(m_centronics_ack)); + save_item(NAME(m_centronics_select)); + save_item(NAME(m_centronics_perror)); /* Map user ROM/RAM socket(s) */ if (m_cart->exists()) @@ -316,13 +316,13 @@ void vme_sys68k_cpu1_card_device::device_start () } /* Reset it */ -void vme_sys68k_cpu1_card_device::device_reset () +void vme_sys68k_cpu1_card_device::device_reset() { LOG("%s\n", FUNCNAME); // Set up the BRG divider. RSA is a jumper setting and RSB is always set High - m_brg->rsa_w( m_serial_brf->read() == 0x80 ? ASSERT_LINE : CLEAR_LINE ); - m_brg->rsb_w( ASSERT_LINE); + m_brg->rsa_w(m_serial_brf->read() == 0x80 ? ASSERT_LINE : CLEAR_LINE); + m_brg->rsb_w(ASSERT_LINE); // Disable all configured timers, only enabling the used ones m_brg->timer_disable_all(); @@ -344,7 +344,8 @@ void vme_sys68k_cpu1_card_device::device_reset () } /* A very inefficient User cart emulation of two 8 bit sockets (odd and even) */ -uint16_t vme_sys68k_cpu1_card_device::read16_rom(offs_t offset){ +uint16_t vme_sys68k_cpu1_card_device::read16_rom(offs_t offset) +{ offset = offset % m_cart->common_get_size("rom"); // Don't read outside buffer... return swapendian_int16(m_usrrom [offset]); } diff --git a/src/devices/machine/chessmachine.cpp b/src/devices/machine/chessmachine.cpp index 80ea45a91be..13eafaaddb7 100644 --- a/src/devices/machine/chessmachine.cpp +++ b/src/devices/machine/chessmachine.cpp @@ -135,7 +135,6 @@ u32 chessmachine_device::disable_bootrom_r() void chessmachine_device::main_map(address_map &map) { map(0x00000000, 0x000fffff).ram(); - map(0x00000000, 0x0000007f).view(m_boot_view); m_boot_view[0](0x00000000, 0x0000007f).rom().region("bootrom", 0); diff --git a/src/mame/fidelity/clockdiv.h b/src/mame/fidelity/clockdiv.h index 71c6cdbe817..6be4e3e41a2 100644 --- a/src/mame/fidelity/clockdiv.h +++ b/src/mame/fidelity/clockdiv.h @@ -24,7 +24,7 @@ public: protected: virtual void machine_start() override ATTR_COLD; - virtual void machine_reset() override { div_refresh(); } + virtual void machine_reset() override ATTR_COLD { div_refresh(); } virtual void device_post_load() override { div_refresh(); } // devices/pointers diff --git a/src/mame/hegenerglaser/amsterdam.cpp b/src/mame/hegenerglaser/amsterdam.cpp index 1e1ab677587..8896119eee3 100644 --- a/src/mame/hegenerglaser/amsterdam.cpp +++ b/src/mame/hegenerglaser/amsterdam.cpp @@ -15,7 +15,8 @@ Dallas 68020: - rest is similar to 16-bit version TODO: -- waitstates, same as glasgow.cpp +- 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 *******************************************************************************/ @@ -70,22 +71,19 @@ private: 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); - m_display->reset(); - } } - - -/******************************************************************************* - I/O -*******************************************************************************/ - void amsterdam_state::led_w(offs_t offset, u8 data) { // d0-d7: board leds diff --git a/src/mame/hegenerglaser/brikett.cpp b/src/mame/hegenerglaser/brikett.cpp index 3ac67a171a6..0409bdcb955 100644 --- a/src/mame/hegenerglaser/brikett.cpp +++ b/src/mame/hegenerglaser/brikett.cpp @@ -76,7 +76,7 @@ ESB 3000 hardware is probably same as ESB 6000. There are no other known external port peripherals. The Brikett (sans PCB) was also used in the 1983 Mephisto Excalibur, but the -hardware is completely different, based on a 68000. +hardware is completely different, based on a 68000 (see excalibur.cpp). BTANB: - bad bug in mephistoj opening library: e4 e6 / d4 d5 / Nd2 c5 / exd5 Qd1xd5, diff --git a/src/mame/hegenerglaser/excalibur.cpp b/src/mame/hegenerglaser/excalibur.cpp new file mode 100644 index 00000000000..341b49cc94e --- /dev/null +++ b/src/mame/hegenerglaser/excalibur.cpp @@ -0,0 +1,249 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Berger +/******************************************************************************* + +Mephisto Excalibur + +It's a very rare chess computer, the chess engine was programmed by the same guys +that did Mephisto III and Mephisto III-S Glasgow. + +Hardware notes: + +Motherboard: +- PCB label: FORCE COMPUTERS +- HD68000-8, 16MHz XTAL +- 128KB DRAM (16*MB8264-20), half unused +- 4 EPROM sockets are unpopulated +- HD6840 PTM @ 800kHz, HD6821P PIA +- MC14411P (set to 9600 baud), 1.8432MHz XTAL +- 2*HD6850P ACIA looped back to itself, both unused + +Interface board: +- PCB label: HGS 15 101 00 B +- edge connector to module with 64KB ROM (4*2764) + +Brikett: +- stripped down, only the LCD/keypad PCB +- 4-digit 7seg LCD +- keypad, piezo + +The wooden ESB type chessboard is the same as the one for ESB II/Mephisto III, +except the interface is more similar to Mephisto Exclusive. + +The motherboard is a 1983 Force Computers 68000 kit with lots of patches and wire +mods. It's an older version of the VME in src/devices/bus/vme/sys68k_cpu1.cpp. + +The CPU appears to run at 5MHz? This matches both piezo frequency and position +calculation speed. How it derives this from a 16MHz XTAL is unknown. Or maybe +it uses wait states? If so, how and why? The program copies itself to 280ns DRAM, +which should be fast enough to run at 8MHz (500ns per memory cycle). + +See glasgow.cpp on how to verify CPU speed. On the real thing after 6 minutes, +number of positions 2026 for excal, and 2028 for excaltm. + +TODO: +- verify CPU speed, see notes above +- correct ROM labels + +*******************************************************************************/ + +#include "emu.h" + +#include "mmboard.h" +#include "mmdisplay1.h" + +#include "cpu/m68000/m68000.h" +#include "machine/6821pia.h" +#include "machine/6840ptm.h" +#include "sound/dac.h" + +#include "speaker.h" + +// internal artwork +#include "mephisto_excalibur.lh" + + +namespace { + +class excal_state : public driver_device +{ +public: + excal_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_ptm(*this, "ptm"), + m_pia(*this, "pia"), + m_board(*this, "board"), + m_display(*this, "display"), + m_dac(*this, "dac"), + m_inputs(*this, "IN.%u", 0) + { } + + DECLARE_INPUT_CHANGED_MEMBER(reset_button); + + void excal(machine_config &config); + +private: + required_device m_maincpu; + required_device m_ptm; + required_device m_pia; + required_device m_board; + required_device m_display; + required_device m_dac; + required_ioport_array<4> m_inputs; + + void excal_mem(address_map &map) ATTR_COLD; + + u8 input_r(offs_t offset); +}; + + + +/******************************************************************************* + I/O +*******************************************************************************/ + +INPUT_CHANGED_MEMBER(excal_state::reset_button) +{ + // reset system (same function as SW1 on the motherboard) + if (newval) + { + m_ptm->reset(); + m_pia->reset(); + m_maincpu->reset(); + } +} + +u8 excal_state::input_r(offs_t offset) +{ + u8 data = 0; + + // read keypad + for (int i = 0; i < 4; i++) + if (BIT(~offset, i)) + data |= m_inputs[i]->read(); + + return data; +} + + + +/******************************************************************************* + Address Maps +*******************************************************************************/ + +void excal_state::excal_mem(address_map &map) +{ + map(0x000000, 0x01ffff).ram(); + map(0x000000, 0x000007).rom(); + map(0x020000, 0x02ffff).rom().region("maincpu", 0); + map(0x04c000, 0x04c00f).mirror(0x003ff0).rw(m_ptm, FUNC(ptm6840_device::read), FUNC(ptm6840_device::write)).umask16(0x00ff); + map(0x05c000, 0x05c007).mirror(0x003ff8).rw(m_pia, FUNC(pia6821_device::read), FUNC(pia6821_device::write)).umask16(0x00ff); + + map(0x100000, 0x100001).mirror(0x0ffffe).r(m_board, FUNC(mephisto_board_device::input_r)).umask16(0x00ff); + map(0x200000, 0x200001).mirror(0x0ffffe).w(m_board, FUNC(mephisto_board_device::mux_w)).umask16(0xff00); + map(0x300000, 0x300001).mirror(0x0ffffe).w(m_board, FUNC(mephisto_board_device::led_w)).umask16(0xff00); + map(0x400000, 0x40001f).mirror(0x0fffe0).r(FUNC(excal_state::input_r)).umask16(0x00ff); + map(0x800000, 0x800001).mirror(0x0ffffe).w(m_display, FUNC(mephisto_display1_device::data_w)).umask16(0xff00); +} + + + +/******************************************************************************* + Input Ports +*******************************************************************************/ + +static INPUT_PORTS_START( excal ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("A / 1") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("ENT") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("B / 2 / Pawn") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("INFO") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("C / 3 / Knight") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("LEV") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("D / 4 / Bishop") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_P) PORT_NAME("POS") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("E / 5 / Rook") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Left / Black / 9") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("F / 6 / Queen") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Right / White / 0") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("G / 7 / King") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("MEM") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("H / 8") + + PORT_START("RESET") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("RES") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(excal_state::reset_button), 0) +INPUT_PORTS_END + + + +/******************************************************************************* + Machine Configs +*******************************************************************************/ + +void excal_state::excal(machine_config &config) +{ + // basic machine hardware + M68000(config, m_maincpu, 16_MHz_XTAL / 3.2); // see driver notes + m_maincpu->set_addrmap(AS_PROGRAM, &excal_state::excal_mem); + + PTM6840(config, m_ptm, 16_MHz_XTAL / 20); + m_ptm->irq_callback().set_inputline(m_maincpu, M68K_IRQ_4); + + PIA6821(config, m_pia); + m_pia->writepa_handler().set(m_display, FUNC(mephisto_display1_device::strobe_w)).bit(0); + m_pia->writepa_handler().append(m_dac, FUNC(dac_1bit_device::write)).bit(1); + + 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_excalibur); + + // sound hardware + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); +} + + + +/******************************************************************************* + ROM Definitions +*******************************************************************************/ + +ROM_START( excal ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD16_BYTE("excalibur_1u.u1", 0x00000, 0x04000, CRC(f4b16b35) SHA1(778b1ece0fc5db88b667d550a55cb757c1280d4d) ) + ROM_LOAD16_BYTE("excalibur_1l.l1", 0x00001, 0x04000, CRC(372639b0) SHA1(fb56a19689e164175a3db10faf24ab3360264b7c) ) + ROM_LOAD16_BYTE("excalibur_2u.u2", 0x08000, 0x04000, CRC(ad039672) SHA1(4dc80600bcc7ea450102f2d0eb25be644e5e542c) ) + ROM_LOAD16_BYTE("excalibur_2l.l2", 0x08001, 0x04000, CRC(08dc7409) SHA1(6f7a336c615ff40dd4018a2150c3213bc7e7e1dc) ) +ROM_END + +ROM_START( excaltm ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD16_BYTE("excalibur_wccc_1983_1u.u1", 0x00000, 0x04000, CRC(70c420c0) SHA1(11130d910dbc062da224ca24d020f34e95e299a9) ) + ROM_LOAD16_BYTE("excalibur_wccc_1983_1l.l1", 0x00001, 0x04000, CRC(5ff3c9f7) SHA1(6d408f9709a7b763215a6bf1c7199d9b54f89d79) ) + ROM_LOAD16_BYTE("excalibur_wccc_1983_2u.u2", 0x08000, 0x04000, CRC(5d899bcc) SHA1(d9dbdc1b05a86664bb22489c812ca347b44c6395) ) + ROM_LOAD16_BYTE("excalibur_wccc_1983_2l.l2", 0x08001, 0x04000, CRC(576d2e6e) SHA1(58b8018996442b4b957d64631c0701be64dfc382) ) +ROM_END + +} // anonymous namespace + + + +/******************************************************************************* + Drivers +*******************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +SYST( 1983, excal, 0, 0, excal, excal, excal_state, empty_init, "Hegener + Glaser", "Mephisto Excalibur", MACHINE_SUPPORTS_SAVE ) +SYST( 1983, excaltm, excal, 0, excal, excal, excal_state, empty_init, "Hegener + Glaser", "Mephisto Excalibur (WCCC 1983 New York TM)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/hegenerglaser/glasgow.cpp b/src/mame/hegenerglaser/glasgow.cpp index 4afa855a03c..88d8e0984b0 100644 --- a/src/mame/hegenerglaser/glasgow.cpp +++ b/src/mame/hegenerglaser/glasgow.cpp @@ -3,10 +3,13 @@ // thanks-to:Berger /******************************************************************************* -Mephisto Glasgow 3 S chess computer +Mephisto III-S Glasgow chess computer Dirk V. sp_rinter@gmx.de +Mephisto Glasgow is the last chess engine written by Thomas Nitsche & Elmar Henne. +Amsterdam/Dallas/Roma are by Richard Lang. + Hardware notes: - R68000C10 or MC68000P12 @ 12MHz, IRQ from 50Hz Seiko SG-10 chip "50H", to IPL0+2 - 64KB ROM (4*27128), 16KB RAM (2*6264) @@ -25,9 +28,14 @@ Other TTL: 1*74LS20 Dual 4 Input NAND GAte 1*74LS367 3 State Hex Buffers -TODO: -- add waitstates, CPU is 12MHz but with DTACK waitstates for slow EPROMs, - effective speed is around 7.2MHz +By default, it makes heavy use of DTACK wait states. Overall it runs much slower +than 12MHz. The LDS/UDS wait states can be modified with solder pads on the +backside of the PCB (under the 74LS164). + +To verify CPU speed: Set level to 9 and move pawn to F3. At exactly 6 minutes, +a real Glasgow with 1 LDS/UDS wait state will have calculated 3432 positions +(may fluctuate a little due to 74121). To see number of calculated positions, +press INFO, C, then Right 3 times. *******************************************************************************/ @@ -56,13 +64,18 @@ public: m_board(*this, "board"), m_display(*this, "display"), m_dac(*this, "dac"), - m_keys(*this, "KEY.%u", 0) + m_keys(*this, "KEY.%u", 0), + m_wait(*this, "WAIT") { } + DECLARE_INPUT_CHANGED_MEMBER(wait_changed) { install_wait(); } + void glasgow(machine_config &config); protected: virtual void machine_start() override ATTR_COLD; + virtual void machine_reset() override ATTR_COLD { install_wait(); } + virtual void device_post_load() override { install_wait(); } private: required_device m_maincpu; @@ -70,19 +83,90 @@ private: required_device m_display; required_device m_dac; required_ioport_array<2> m_keys; + required_ioport m_wait; + + memory_passthrough_handler m_read_tap; + memory_passthrough_handler m_write_tap; u8 m_kp_mux = 0; + int m_wait_ticks = 0; + int m_ext_ticks = 0; void glasgow_mem(address_map &map) ATTR_COLD; + void install_wait(); + void control_w(u8 data); u8 keys_r(); void keys_w(u8 data); }; + + +/******************************************************************************* + Initialization +*******************************************************************************/ + void glasgow_state::machine_start() { save_item(NAME(m_kp_mux)); + + // on external access (0x10000-0x17fff), additional wait states via a 74121 + // (R=internal 2K, C=10nf, which is 20us according to datasheet) + attotime ext_delay = attotime::from_usec(20); + m_ext_ticks = ext_delay.as_ticks(m_maincpu->clock()); + + address_space &space = m_maincpu->space(AS_PROGRAM); + + space.install_read_tap( + 0x10000, 0x17fff, + "maincpu_ext_r", + [this] (offs_t offset, u16 &data, u16 mem_mask) + { + if (!machine().side_effects_disabled()) + m_maincpu->adjust_icount(-m_ext_ticks); + }); + space.install_write_tap( + 0x10000, 0x17fff, + "maincpu_ext_w", + [this] (offs_t offset, u16 &data, u16 mem_mask) + { + if (!machine().side_effects_disabled()) + m_maincpu->adjust_icount(-m_ext_ticks); + }); +} + +void glasgow_state::install_wait() +{ + m_read_tap.remove(); + m_write_tap.remove(); + + // optional 0-3 wait states via 74LS164 for each LDS/UDS + m_wait_ticks = m_wait->read() & 3; + + if (m_wait_ticks) + { + address_space &program = m_maincpu->space(AS_PROGRAM); + + m_read_tap = program.install_read_tap( + 0x00000, 0x1ffff, + "maincpu_wait_r", + [this] (offs_t offset, u16 &data, u16 mem_mask) + { + if (!machine().side_effects_disabled()) + m_maincpu->adjust_icount(-m_wait_ticks); + }, + &m_read_tap); + m_write_tap = program.install_write_tap( + 0x00000, 0x1ffff, + "maincpu_wait_w", + [this] (offs_t offset, u16 &data, u16 mem_mask) + { + if (!machine().side_effects_disabled()) + m_maincpu->adjust_icount(-m_wait_ticks); + }, + &m_write_tap); + } } @@ -131,11 +215,11 @@ void glasgow_state::glasgow_mem(address_map &map) { map.global_mask(0x1ffff); map(0x000000, 0x00ffff).rom(); - map(0x010000, 0x010000).w(m_display, FUNC(mephisto_display1_device::data_w)); - map(0x010002, 0x010002).rw(FUNC(glasgow_state::keys_r), FUNC(glasgow_state::keys_w)); - map(0x010004, 0x010004).w(FUNC(glasgow_state::control_w)); - map(0x010006, 0x010006).rw(m_board, FUNC(mephisto_board_device::input_r), FUNC(mephisto_board_device::led_w)); - map(0x010008, 0x010008).w(m_board, FUNC(mephisto_board_device::mux_w)); + map(0x010000, 0x010001).mirror(0x007ff0).w(m_display, FUNC(mephisto_display1_device::data_w)).umask16(0xff00); + map(0x010002, 0x010003).mirror(0x007ff0).rw(FUNC(glasgow_state::keys_r), FUNC(glasgow_state::keys_w)).umask16(0xff00); + map(0x010004, 0x010005).mirror(0x007ff0).w(FUNC(glasgow_state::control_w)).umask16(0xff00); + map(0x010006, 0x010007).mirror(0x007ff0).rw(m_board, FUNC(mephisto_board_device::input_r), FUNC(mephisto_board_device::led_w)).umask16(0xff00); + map(0x010008, 0x010009).mirror(0x007ff0).w(m_board, FUNC(mephisto_board_device::mux_w)).umask16(0xff00); map(0x01c000, 0x01ffff).ram(); } @@ -165,6 +249,13 @@ static INPUT_PORTS_START( glasgow ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A / 1") PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_BIT( 0x40, 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( 0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B / 2 / Pawn") PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) + + PORT_START("WAIT") // hardwired, default to 1 + PORT_CONFNAME( 0x03, 0x01, "LDS/UDS Wait States" ) PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(glasgow_state::wait_changed), 0) + PORT_CONFSETTING( 0x00, "None (12 MHz)" ) + PORT_CONFSETTING( 0x01, "1 (~9.5 MHz)" ) + PORT_CONFSETTING( 0x02, "2 (~8 MHz)" ) + PORT_CONFSETTING( 0x03, "3 (~7 Mhz)" ) INPUT_PORTS_END diff --git a/src/mame/hegenerglaser/mm2.cpp b/src/mame/hegenerglaser/mm2.cpp index f6bcba5a0fc..7a7b595d41b 100644 --- a/src/mame/hegenerglaser/mm2.cpp +++ b/src/mame/hegenerglaser/mm2.cpp @@ -148,7 +148,7 @@ public: void bup(machine_config &config); protected: - virtual void machine_reset() override ATTR_COLD; + virtual void machine_reset() override ATTR_COLD { m_maincpu->set_input_line(0, CLEAR_LINE); } private: required_device m_maincpu; @@ -167,11 +167,11 @@ private: u8 keys_r(offs_t offset); }; -void mm2_state::machine_reset() -{ - m_maincpu->set_input_line(0, CLEAR_LINE); - m_display->reset(); -} + + +/******************************************************************************* + I/O +*******************************************************************************/ INPUT_CHANGED_MEMBER(mm2_state::reset_button) { @@ -183,12 +183,6 @@ INPUT_CHANGED_MEMBER(mm2_state::reset_button) } } - - -/******************************************************************************* - I/O -*******************************************************************************/ - void mm2_state::lcd_irqack_w(u8 data) { m_display->data_w(data); diff --git a/src/mame/hegenerglaser/mmdisplay1.cpp b/src/mame/hegenerglaser/mmdisplay1.cpp index acc12dea65a..147601e0422 100644 --- a/src/mame/hegenerglaser/mmdisplay1.cpp +++ b/src/mame/hegenerglaser/mmdisplay1.cpp @@ -34,29 +34,16 @@ void mephisto_display1_device::device_start() if (m_output_digit.isunset()) m_digits.resolve(); + // initialize + m_strobe = 1; + m_digit_data = ~0; + // register for savestates save_item(NAME(m_strobe)); - save_item(NAME(m_digit_idx)); save_item(NAME(m_digit_data)); } -//------------------------------------------------- -// device_reset - device-specific reset -//------------------------------------------------- - -void mephisto_display1_device::device_reset() -{ - m_strobe = 0; - m_digit_idx = 0; - - // clear display - for (int i = 0; i < 4; i++) - m_digit_data[i] = 0; - update_lcd(); -} - - //------------------------------------------------- // I/O handlers //------------------------------------------------- @@ -65,10 +52,12 @@ void mephisto_display1_device::update_lcd() { for (int i = 0; i < 4; i++) { + u8 digit = m_digit_data >> (i * 8) ^ (m_strobe ? 0 : 0xff); + if (m_output_digit.isunset()) - m_digits[i] = m_digit_data[i]; + m_digits[i] = digit; else - m_output_digit(i, m_digit_data[i]); + m_output_digit(i, digit); } } @@ -78,13 +67,13 @@ void mephisto_display1_device::strobe_w(int state) // update lcd on any edge if (state != m_strobe) + { + m_strobe = state; update_lcd(); - - m_strobe = state; + } } void mephisto_display1_device::data_w(u8 data) { - m_digit_data[m_digit_idx] = m_strobe ? ~data : data; - m_digit_idx = (m_digit_idx + 1) & 3; + m_digit_data = (m_digit_data >> 8) | (data << 24); } diff --git a/src/mame/hegenerglaser/mmdisplay1.h b/src/mame/hegenerglaser/mmdisplay1.h index 22a98a33b8f..b64cf3d0833 100644 --- a/src/mame/hegenerglaser/mmdisplay1.h +++ b/src/mame/hegenerglaser/mmdisplay1.h @@ -27,15 +27,13 @@ public: protected: // device-level overrides virtual void device_start() override ATTR_COLD; - virtual void device_reset() override ATTR_COLD; private: output_finder<4> m_digits; devcb_write8 m_output_digit; int m_strobe; - u8 m_digit_idx; - u8 m_digit_data[4]; + u32 m_digit_data; void update_lcd(); }; diff --git a/src/mame/hegenerglaser/modular_tm.cpp b/src/mame/hegenerglaser/modular_tm.cpp index f3defb70bf6..086869f4c3c 100644 --- a/src/mame/hegenerglaser/modular_tm.cpp +++ b/src/mame/hegenerglaser/modular_tm.cpp @@ -89,7 +89,7 @@ private: u8 nvram_r(offs_t offset) { return m_nvram[offset]; } void nvram_w(offs_t offset, u8 data) { m_nvram[offset] = data; } - TIMER_CALLBACK_MEMBER(disable_bootrom) { m_boot_view.select(1); } + TIMER_CALLBACK_MEMBER(disable_bootrom) { m_boot_view.disable(); } }; @@ -130,9 +130,9 @@ INPUT_CHANGED_MEMBER(mmtm_state::change_cpu_freq) void mmtm_state::mmtm_2m_map(address_map &map) { + map(0x00000000, 0x0003ffff).ram(); map(0x00000000, 0x0003ffff).view(m_boot_view); m_boot_view[0](0x00000000, 0x0003ffff).rom().region("maincpu", 0); - m_boot_view[1](0x00000000, 0x0003ffff).ram(); map(0x80000000, 0x801fffff).ram(); map(0xf0000000, 0xf003ffff).rom().region("maincpu", 0); diff --git a/src/mame/hegenerglaser/roma2.cpp b/src/mame/hegenerglaser/roma2.cpp index 90dcb95548e..8bfa76fe6a1 100644 --- a/src/mame/hegenerglaser/roma2.cpp +++ b/src/mame/hegenerglaser/roma2.cpp @@ -72,22 +72,19 @@ private: u8 input_r(); }; + + +/******************************************************************************* + I/O +*******************************************************************************/ + INPUT_CHANGED_MEMBER(roma2_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); - m_display->reset(); - } } - - -/******************************************************************************* - I/O -*******************************************************************************/ - u8 roma2_state::input_r() { u8 data = 0; diff --git a/src/mame/layout/mephisto_excalibur.lay b/src/mame/layout/mephisto_excalibur.lay new file mode 100644 index 00000000000..87de5c0d4d1 --- /dev/null +++ b/src/mame/layout/mephisto_excalibur.lay @@ -0,0 +1,621 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 0f79965063e..501be451722 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -19711,6 +19711,10 @@ mephistoj @source:hegenerglaser/europa.cpp europa +@source:hegenerglaser/excalibur.cpp +excal +excaltm + @source:hegenerglaser/glasgow.cpp amsterdg // Amsterdam dallas16g // Dallas diff --git a/src/mame/misc/micro3d_m.cpp b/src/mame/misc/micro3d_m.cpp index 51a38743f36..01269f2887b 100644 --- a/src/mame/misc/micro3d_m.cpp +++ b/src/mame/misc/micro3d_m.cpp @@ -473,7 +473,7 @@ void micro3d_state::init_micro3d() /* TODO? BOTSS sometimes crashes when starting a stage because the 68000 overwrites memory in use by the Am29000. Slowing down the 68000 slightly avoids this. */ - m_maincpu->set_clock_scale(0.945f); + m_maincpu->set_clock_scale(0.945); } void micro3d_state::init_botss() diff --git a/src/mame/pinball/gts80b.cpp b/src/mame/pinball/gts80b.cpp index f7a9626a422..f71e9dad426 100644 --- a/src/mame/pinball/gts80b.cpp +++ b/src/mame/pinball/gts80b.cpp @@ -2269,9 +2269,9 @@ GAME(1989, bighousef, bighouse, p5, gts80b, gts80b_state, init_s80c, ROT0, "Got GAME(1989, bighouseg, bighouse, p5, gts80b, gts80b_state, init_s80c, ROT0, "Gottlieb", "Big House (German)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) GAME(1988, robowars, 0, p4, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Robo-War", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) GAME(1988, robowarsf, robowars, p4, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Robo-War (French)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1988, excalibr, 0, p4, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Excalibur", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1988, excalibrf, excalibr, p4, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Excalibur (French)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1988, excalibrg, excalibr, p4, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Excalibur (German)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1988, excalibr, 0, p4, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Excalibur (Gottlieb)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1988, excalibrf, excalibr, p4, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Excalibur (Gottlieb, French)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1988, excalibrg, excalibr, p4, gts80b, gts80b_state, empty_init, ROT0, "Gottlieb", "Excalibur (Gottlieb, German)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) GAME(1988, badgirls, 0, p5, gts80b, gts80b_state, init_s80c, ROT0, "Gottlieb", "Bad Girls", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) GAME(1988, badgirlsa, badgirls, p5, gts80b, gts80b_state, init_s80c, ROT0, "Gottlieb", "Bad Girls (alternate set)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) GAME(1988, badgirlsf, badgirls, p5, gts80b, gts80b_state, init_s80c, ROT0, "Gottlieb", "Bad Girls (French)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -- cgit v1.2.3