From 2c0246059f81a9f486f19708cecae2516d205966 Mon Sep 17 00:00:00 2001 From: Mark Garlanger Date: Wed, 14 Jun 2023 13:48:27 -0500 Subject: [PATCH] heath/h19.cpp Implement Shift-Reset functionality (#11330) --- src/mame/heathkit/h19.cpp | 4 +- src/mame/heathkit/h89.cpp | 19 +++++- src/mame/heathkit/intr_cntrl.cpp | 14 +++++ src/mame/heathkit/intr_cntrl.h | 3 + src/mame/heathkit/tlb.cpp | 105 +++++++++++++++++++++---------- src/mame/heathkit/tlb.h | 6 +- src/mame/heathkit/z37_fdc.cpp | 12 ++++ src/mame/heathkit/z37_fdc.h | 5 +- 8 files changed, 129 insertions(+), 39 deletions(-) diff --git a/src/mame/heathkit/h19.cpp b/src/mame/heathkit/h19.cpp index d725d8d23f3c5..825cc826212aa 100644 --- a/src/mame/heathkit/h19.cpp +++ b/src/mame/heathkit/h19.cpp @@ -5,7 +5,7 @@ Heathkit H19 A smart terminal designed and manufactured by Heath Company. This - is identical to the Zenith Data Systems Z-19. + is identical to the Zenith Data Systems Z-19. ****************************************************************************/ @@ -69,7 +69,7 @@ ROM_START( ultra19 ) ROM_END } // anonymous namespace -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS COMP( 1979, h19, 0, 0, h19, 0, h19_state, empty_init, "Heath Company", "Heathkit H-19", MACHINE_SUPPORTS_SAVE ) //Super-19 ROM - ATG Systems, Inc - Adv in Sextant Issue 4, Winter 1983. With the magazine lead-time, likely released late 1982. COMP( 1982, super19, h19, 0, h19_superh19, 0, h19_state, empty_init, "Heath Company", "Heathkit H-19 w/ Super-19 ROM", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/heathkit/h89.cpp b/src/mame/heathkit/h89.cpp index 2a5e2ab81dd18..544cccb54cf6f 100644 --- a/src/mame/heathkit/h89.cpp +++ b/src/mame/heathkit/h89.cpp @@ -123,6 +123,7 @@ class h89_state : public driver_device uint8_t raise_NMI_r(); void raise_NMI_w(uint8_t data); void console_intr(uint8_t data); + void reset_line(uint8_t data); }; /* @@ -362,9 +363,15 @@ void h89_state::machine_reset() update_gpp(0); update_mem_view(); + m_h37->reset(); + m_intr_cntrl->reset(); + m_console->reset(); + m_serial1->reset(); + m_serial2->reset(); + m_serial3->reset(); + m_maincpu->reset(); } - uint8_t h89_state::raise_NMI_r() { m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::from_usec(2)); @@ -389,6 +396,14 @@ void h89_state::console_intr(uint8_t data) } } +void h89_state::reset_line(uint8_t data) +{ + if (data == ASSERT_LINE) + { + reset(); + } +} + TIMER_DEVICE_CALLBACK_MEMBER(h89_state::h89_irq_timer) { if (m_timer_intr_enabled) @@ -448,6 +463,8 @@ void h89_state::h89(machine_config & config) m_console->out_tx_callback().set(m_tlb, FUNC(heath_tlb_device::cb1_w)); m_tlb->serial_data_callback().set(m_console, FUNC(ins8250_uart_device::rx_w)); + m_tlb->reset_cb().set(FUNC(h89_state::reset_line)); + HEATH_Z37_FDC(config, m_h37); m_h37->drq_cb().set(m_intr_cntrl, FUNC(z37_intr_cntrl::set_drq)); m_h37->irq_cb().set(m_intr_cntrl, FUNC(z37_intr_cntrl::set_intrq)); diff --git a/src/mame/heathkit/intr_cntrl.cpp b/src/mame/heathkit/intr_cntrl.cpp index 30a694c05cb2a..b1c9a42142d6f 100644 --- a/src/mame/heathkit/intr_cntrl.cpp +++ b/src/mame/heathkit/intr_cntrl.cpp @@ -31,6 +31,11 @@ void heath_intr_cntrl::device_start() m_intr_lines = 0; } +void heath_intr_cntrl::device_reset() +{ + m_intr_lines = 0; +} + void heath_intr_cntrl::device_resolve_objects() { m_irq_line.resolve_safe(); @@ -171,6 +176,15 @@ void z37_intr_cntrl::device_start() m_fd_irq_raised = false; } +void z37_intr_cntrl::device_reset() +{ + heath_intr_cntrl::device_reset(); + + m_interrupts_blocked = false; + m_drq_raised = false; + m_fd_irq_raised = false; +} + void z37_intr_cntrl::block_interrupts(uint8_t data) { m_interrupts_blocked = (data != CLEAR_LINE); diff --git a/src/mame/heathkit/intr_cntrl.h b/src/mame/heathkit/intr_cntrl.h index d6da5c0b6d9fc..371f928853d65 100644 --- a/src/mame/heathkit/intr_cntrl.h +++ b/src/mame/heathkit/intr_cntrl.h @@ -36,6 +36,8 @@ class heath_intr_cntrl : public device_t virtual void update_intr_line(); virtual void device_start() override; + virtual void device_reset() override; + virtual void device_resolve_objects() override; devcb_write8 m_irq_line; @@ -62,6 +64,7 @@ class z37_intr_cntrl : public heath_intr_cntrl virtual void update_intr_line() override; virtual void device_start() override; + virtual void device_reset() override; private: bool m_interrupts_blocked; diff --git a/src/mame/heathkit/tlb.cpp b/src/mame/heathkit/tlb.cpp index 38a67c0135342..d8bc8a2537d56 100644 --- a/src/mame/heathkit/tlb.cpp +++ b/src/mame/heathkit/tlb.cpp @@ -6,7 +6,7 @@ The board used in the H19 smart terminal designed and manufactured by Heath Company. (and the identical Z19 sold by Zenith Data Systems) - This board is also used the Heath's H89 / H88, and ZDS's Z-89 and Z-90. + This board is also used the Heath's H89 / H88, and ZDS's Z-89 and Z-90. The keyboard consists of a 9x10 matrix connected to a MM5740AAC/N mask-programmed keyboard controller. The output of this passes @@ -19,12 +19,14 @@ TODO: - determine why ULTRA ROM's self-diag (ESC |) fails for the ROM and scratchpad memory + - when pressing "REPEAT", the other pressed key should repeatedly trigger ****************************************************************************/ /*************************************************************************** Memory Layout - The U435 three-to-eight line decoder uses A14 and A15 to generate three memory addresses: + The U435 three-to-eight line decoder uses A14 and A15 to generate + three memory addresses: 1. Program ROM 0x0000 2. Scratchpad RAM 0x4000 @@ -33,7 +35,8 @@ Port Layout - Only address lines A5, A6, A7 are used by the U442 three-to-eight line decoder + Only address lines A5, A6, A7 are used by the U442 three-to-eight + line decoder Address Description ---------------------------------------------------- @@ -81,6 +84,7 @@ heath_tlb_device::heath_tlb_device(const machine_config &mconfig, device_type ty device_t(mconfig, type, tag, owner, clock), m_maincpu(*this, "maincpu"), m_write_sd(*this), + m_reset(*this), m_palette(*this, "palette"), m_crtc(*this, "crtc"), m_ace(*this, "ins8250"), @@ -153,26 +157,40 @@ static constexpr uint8_t KB_STATUS_KEYBOARD_STROBE_MASK = 0x80; void heath_tlb_device::device_resolve_objects() { - m_write_sd.resolve_safe(); + m_reset.resolve_safe(); } void heath_tlb_device::device_start() { - save_item(NAME(m_transchar)); save_item(NAME(m_strobe)); save_item(NAME(m_keyclickactive)); save_item(NAME(m_bellactive)); + save_item(NAME(m_reset_pending)); m_strobe = false; m_keyclickactive = false; m_bellactive = false; + m_reset_pending = false; m_key_click_timer = timer_alloc(FUNC(heath_tlb_device::key_click_off), this); m_bell_timer = timer_alloc(FUNC(heath_tlb_device::bell_off), this); } +void heath_tlb_device::device_reset() +{ + m_strobe = false; + m_keyclickactive = false; + m_bellactive = false; + m_reset_pending = false; + + m_crtc->reset(); + m_ace->reset(); + m_beep->reset(); + m_mm5740->reset(); + m_maincpu->reset(); +} void heath_tlb_device::key_click_w(uint8_t data) { @@ -212,22 +230,39 @@ uint16_t heath_tlb_device::translate_mm5740_b(uint16_t b) return ((b & 0x100) >> 2) | ((b & 0x0c0) << 1) | (b & 0x03f); } +void heath_tlb_device::check_for_reset() +{ + ioport_value value = m_kbspecial->read(); + + if ((value & 0x300) == 0) + { + m_reset_pending = true; + } + else if (m_reset_pending) + { + m_reset_pending = false; + m_maincpu->reset(); + m_reset(ASSERT_LINE); + } +} + uint8_t heath_tlb_device::kbd_key_r() { m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE); m_strobe = false; - // high bit is for control key pressed, this is handled in the ROM, no processing needed. + // high bit is for control key pressed, this is handled in the ROM, + // no processing needed. return m_transchar; } uint8_t heath_tlb_device::kbd_flags_r() { uint16_t modifiers = m_kbspecial->read(); - uint8_t rv = modifiers & 0x7f; + uint8_t rv = modifiers & 0x7e; // check both shifts - if ((modifiers & 0x020) == 0 || (modifiers & 0x100) == 0) + if ((modifiers & 0x120) != 0x120) { rv |= KB_STATUS_SHIFT_KEYS_MASK; } @@ -242,16 +277,18 @@ uint8_t heath_tlb_device::kbd_flags_r() int heath_tlb_device::mm5740_shift_r() { - return ((m_kbspecial->read() ^ 0x120) & 0x120) ? ASSERT_LINE : CLEAR_LINE; + return ((m_kbspecial->read() & 0x120) != 0x120) ? ASSERT_LINE : CLEAR_LINE; } int heath_tlb_device::mm5740_control_r() { - return ((m_kbspecial->read() ^ 0x10) & 0x10) ? ASSERT_LINE: CLEAR_LINE; + return (m_kbspecial->read() & 0x10) ? CLEAR_LINE : ASSERT_LINE; } void heath_tlb_device::mm5740_data_ready_w(int state) { + check_for_reset(); + if (state == ASSERT_LINE) { uint8_t *decode = m_kbdrom->base(); @@ -331,8 +368,8 @@ static INPUT_PORTS_START( tlb ) PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("LeftShift") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Repeat") PORT_CODE(KEYCODE_LALT) // bit 7 - 0x080 is low if a key is pressed - PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("RightShift") PORT_CODE(KEYCODE_RSHIFT) - PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Reset") PORT_CODE(KEYCODE_F10) + PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("RightShift") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_2) + PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Reset") PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) PORT_START("X1") PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("/") PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') @@ -350,7 +387,7 @@ static INPUT_PORTS_START( tlb ) PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("; :") PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\' \"") PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"') PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("{ }") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('{') PORT_CHAR('}') - PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) + PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_UNUSED) PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_UNUSED) PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("KP-1 IL") PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) @@ -383,15 +420,15 @@ static INPUT_PORTS_START( tlb ) PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_UNUSED) PORT_START("X5") - PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) - PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) - PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) - PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) - PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) - PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Erase") PORT_CODE(KEYCODE_F6) - PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Blue") PORT_CODE(KEYCODE_F7) - PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Red") PORT_CODE(KEYCODE_F8) - PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Gray") PORT_CODE(KEYCODE_F9) + PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) + PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) + PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) + PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) + PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) + PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Erase") PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) + PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Blue") PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) + PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Red") PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) + PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Gray") PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_UNUSED) PORT_START("X6") @@ -443,7 +480,7 @@ static INPUT_PORTS_START( tlb ) PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Esc") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) PORT_START("SW401") - PORT_DIPNAME( 0x0f, 0x0c, "Baud Rate") PORT_DIPLOCATION("SW401:1,2,3,4") + PORT_DIPNAME( 0x0f, 0x0c, "Baud Rate") PORT_DIPLOCATION("SW401:1,2,3,4") PORT_DIPSETTING( 0x01, "110") PORT_DIPSETTING( 0x02, "150") PORT_DIPSETTING( 0x03, "300") @@ -470,28 +507,28 @@ static INPUT_PORTS_START( tlb ) PORT_DIPSETTING( 0x80, "Full") PORT_START("SW402") - PORT_DIPNAME( 0x01, 0x00, "Cursor") PORT_DIPLOCATION("SW402:1") + PORT_DIPNAME( 0x01, 0x00, "Cursor") PORT_DIPLOCATION("SW402:1") PORT_DIPSETTING( 0x00, "Underline") PORT_DIPSETTING( 0x01, "Block") - PORT_DIPNAME( 0x02, 0x00, "Keyclick") PORT_DIPLOCATION("SW402:2") + PORT_DIPNAME( 0x02, 0x00, "Keyclick") PORT_DIPLOCATION("SW402:2") PORT_DIPSETTING( 0x02, DEF_STR(No)) PORT_DIPSETTING( 0x00, DEF_STR(Yes)) - PORT_DIPNAME( 0x04, 0x00, "Wrap at EOL") PORT_DIPLOCATION("SW402:3") + PORT_DIPNAME( 0x04, 0x00, "Wrap at EOL") PORT_DIPLOCATION("SW402:3") PORT_DIPSETTING( 0x00, DEF_STR(No)) PORT_DIPSETTING( 0x04, DEF_STR(Yes)) - PORT_DIPNAME( 0x08, 0x00, "Auto LF on CR") PORT_DIPLOCATION("SW402:4") + PORT_DIPNAME( 0x08, 0x00, "Auto LF on CR") PORT_DIPLOCATION("SW402:4") PORT_DIPSETTING( 0x00, DEF_STR(No)) PORT_DIPSETTING( 0x08, DEF_STR(Yes)) - PORT_DIPNAME( 0x10, 0x00, "Auto CR on LF") PORT_DIPLOCATION("SW402:5") + PORT_DIPNAME( 0x10, 0x00, "Auto CR on LF") PORT_DIPLOCATION("SW402:5") PORT_DIPSETTING( 0x00, DEF_STR(No)) PORT_DIPSETTING( 0x10, DEF_STR(Yes)) - PORT_DIPNAME( 0x20, 0x00, "Mode") PORT_DIPLOCATION("SW402:6") + PORT_DIPNAME( 0x20, 0x00, "Mode") PORT_DIPLOCATION("SW402:6") PORT_DIPSETTING( 0x00, "Heath/VT52") PORT_DIPSETTING( 0x20, "ANSI") - PORT_DIPNAME( 0x40, 0x00, "Keypad Shifted") PORT_DIPLOCATION("SW402:7") + PORT_DIPNAME( 0x40, 0x00, "Keypad Shifted") PORT_DIPLOCATION("SW402:7") PORT_DIPSETTING( 0x00, DEF_STR(No)) PORT_DIPSETTING( 0x40, DEF_STR(Yes)) - PORT_DIPNAME( 0x80, 0x00, "Refresh") PORT_DIPLOCATION("SW402:8") + PORT_DIPNAME( 0x80, 0x00, "Refresh") PORT_DIPLOCATION("SW402:8") PORT_DIPSETTING( 0x00, "60Hz") PORT_DIPSETTING( 0x80, "50Hz") INPUT_PORTS_END @@ -581,7 +618,7 @@ static INPUT_PORTS_START( ultra19 ) PORT_DIPSETTING( 0x20, "Invisible") PORT_DIPSETTING( 0x40, "Fast Blink") PORT_DIPSETTING( 0x60, "Slow Blink") - PORT_DIPNAME( 0x80, 0x00, "Interlace Scan Mode") PORT_DIPLOCATION("SW402:8") + PORT_DIPNAME( 0x80, 0x00, "Interlace Scan Mode") PORT_DIPLOCATION("SW402:8") PORT_DIPSETTING( 0x00, "Off") PORT_DIPSETTING( 0x80, "On") @@ -591,7 +628,7 @@ static INPUT_PORTS_START( watz19 ) PORT_INCLUDE( tlb ) PORT_MODIFY("SW401") - PORT_DIPNAME( 0x0f, 0x0c, "Baud Rate") PORT_DIPLOCATION("SW401:1,2,3,4") + PORT_DIPNAME( 0x0f, 0x0c, "Baud Rate") PORT_DIPLOCATION("SW401:1,2,3,4") PORT_DIPSETTING( 0x00, "75") PORT_DIPSETTING( 0x01, "110") PORT_DIPSETTING( 0x02, "150") @@ -608,7 +645,7 @@ static INPUT_PORTS_START( watz19 ) PORT_DIPSETTING( 0x0d, "19200") PORT_DIPSETTING( 0x0e, "38400") PORT_DIPSETTING( 0x0f, "134.5") - PORT_DIPNAME( 0x40, 0x00, "Word Size") PORT_DIPLOCATION("SW401:7") + PORT_DIPNAME( 0x40, 0x00, "Word Size") PORT_DIPLOCATION("SW401:7") PORT_DIPSETTING( 0x00, "8-bit Word") PORT_DIPSETTING( 0x40, "7-bit Word") PORT_DIPNAME( 0x80, 0x80, "Duplex") PORT_DIPLOCATION("SW401:8") diff --git a/src/mame/heathkit/tlb.h b/src/mame/heathkit/tlb.h index 7ebe322b3b95d..8bb294841ac26 100644 --- a/src/mame/heathkit/tlb.h +++ b/src/mame/heathkit/tlb.h @@ -27,6 +27,7 @@ class heath_tlb_device : public device_t // interface routines auto serial_data_callback() { return m_write_sd.bind(); } + auto reset_cb() { return m_reset.bind(); } void cb1_w(int state); @@ -36,6 +37,7 @@ class heath_tlb_device : public device_t virtual ioport_constructor device_input_ports() const override; virtual const tiny_rom_entry *device_rom_region() const override; virtual void device_start() override; + virtual void device_reset() override; virtual void device_add_mconfig(machine_config &config) override; virtual void device_resolve_objects() override; @@ -47,6 +49,7 @@ class heath_tlb_device : public device_t private: void key_click_w(uint8_t data); void bell_w(uint8_t data); + void check_for_reset(); uint8_t kbd_key_r(); uint8_t kbd_flags_r(); uint16_t translate_mm5740_b(uint16_t b); @@ -68,6 +71,7 @@ class heath_tlb_device : public device_t emu_timer *m_bell_timer; devcb_write_line m_write_sd; + devcb_write_line m_reset; required_device m_palette; required_device m_crtc; @@ -83,7 +87,7 @@ class heath_tlb_device : public device_t bool m_strobe; bool m_keyclickactive; bool m_bellactive; - + bool m_reset_pending; }; class heath_super19_tlb_device : public heath_tlb_device diff --git a/src/mame/heathkit/z37_fdc.cpp b/src/mame/heathkit/z37_fdc.cpp index 5fccdc2d7519d..4d8d39d356589 100644 --- a/src/mame/heathkit/z37_fdc.cpp +++ b/src/mame/heathkit/z37_fdc.cpp @@ -170,6 +170,18 @@ void heath_z37_fdc_device::device_start() m_access_track_sector = false; } +void heath_z37_fdc_device::device_reset() +{ + m_control_reg = 0; + m_interface_reg = 0; + + m_intrq_allowed = false; + m_drq_allowed = false; + m_access_track_sector = false; + + m_fdc->reset(); +} + static void z37_floppies(device_slot_interface &device) { // H-17-1 diff --git a/src/mame/heathkit/z37_fdc.h b/src/mame/heathkit/z37_fdc.h index dcd6a15493860..b27216bf65b86 100644 --- a/src/mame/heathkit/z37_fdc.h +++ b/src/mame/heathkit/z37_fdc.h @@ -27,7 +27,10 @@ class heath_z37_fdc_device : public device_t auto block_interrupt_cb() { return m_block_interrupt_cb.bind(); } -protected : virtual void device_start() override; +protected: + + virtual void device_start() override; + virtual void device_reset() override; virtual void device_add_mconfig(machine_config &config) override; virtual void device_resolve_objects() override;