From 0fdb920e402a3a1e5eadc5a79acbd219fce16922 Mon Sep 17 00:00:00 2001 From: Mark Garlanger Date: Thu, 3 Aug 2023 13:58:33 -0500 Subject: heathkit/h19.cpp, heathkit/tlb.cpp: Added Northwest Digital Systems GP-19 terminal (not working). (#11427) New clones marked not working -------------------------- Heath Company Heathkit H-19 w/ GP-19 --- src/emu/xtal.cpp | 3 + src/mame/heathkit/h19.cpp | 19 ++- src/mame/heathkit/tlb.cpp | 297 +++++++++++++++++++++++++++++++++++++++------- src/mame/heathkit/tlb.h | 47 ++++++-- src/mame/mame.lst | 3 +- 5 files changed, 319 insertions(+), 50 deletions(-) diff --git a/src/emu/xtal.cpp b/src/emu/xtal.cpp index d7f90e9bdd3..367142f1827 100644 --- a/src/emu/xtal.cpp +++ b/src/emu/xtal.cpp @@ -179,6 +179,7 @@ const double XTAL::known_xtals[] = { 10'480'000, /* 10.48_MHz_XTAL System-80 (50 Hz) */ 10'500'000, /* 10.5_MHz_XTAL Agat-7 */ 10'595'000, /* 10.595_MHz_XTAL Mad Alien */ + 10'644'000, /* 10.644_MHz_XTAL Northwest Digitial Systems GP-19 */ 10'644'500, /* 10.6445_MHz_XTAL TRS-80 Model I */ 10'687'500, /* 10.6875_MHz_XTAL BBC Bridge Companion */ 10'694'250, /* 10.69425_MHz_XTAL Xerox 820 */ @@ -205,6 +206,7 @@ const double XTAL::known_xtals[] = { 12'057'600, /* 12.0576_MHz_XTAL Poly 1 (38400 * 314) */ 12'096'000, /* 12.096_MHz_XTAL Some early 80's Atari games */ 12'288'000, /* 12.288_MHz_XTAL Sega Model 3 digital audio board */ + 12'292'000, /* 12.292_MHz_XTAL Northwest Digitial Systems GP-19 */ 12'324'000, /* 12.324_MHz_XTAL Otrona Attache */ 12'432'000, /* 12.432_MHz_XTAL Kaneko Fly Boy/Fast Freddie Hardware */ 12'472'500, /* 12.4725_MHz_XTAL Bonanza's Mini Boy 7 */ @@ -317,6 +319,7 @@ const double XTAL::known_xtals[] = { 20'000'000, /* 20_MHz_XTAL - */ 20'160'000, /* 20.16_MHz_XTAL Nintendo 8080 */ 20'275'200, /* 20.2752_MHz_XTAL TRS-80 Model III */ + 20'282'000, /* 20.282_MHz_XTAL Northwest Digitial Systems GP-19 */ 20'375'040, /* 20.37504_MHz_XTAL Apple Lisa dot clock (197-0019A) */ 20'625'000, /* 20.625_MHz_XTAL SM 7238 */ 20'790'000, /* 20.79_MHz_XTAL Blockade-hardware Gremlin games */ diff --git a/src/mame/heathkit/h19.cpp b/src/mame/heathkit/h19.cpp index 825cc826212..8b72623b2c4 100644 --- a/src/mame/heathkit/h19.cpp +++ b/src/mame/heathkit/h19.cpp @@ -24,13 +24,19 @@ public: { } + // original h19 void h19(machine_config &config); + + // replacement ROMs void h19_superh19(machine_config &config); void h19_watzh19(machine_config &config); void h19_ultrah19(machine_config &config); -private: + // add-on graphics boards + void h19_gp19(machine_config &config); + +private: required_device m_tlb; }; @@ -55,6 +61,11 @@ void h19_state::h19_ultrah19(machine_config &config) HEATH_ULTRA(config, m_tlb); } +void h19_state::h19_gp19(machine_config &config) +{ + HEATH_GP19(config, m_tlb); +} + // ROM definition ROM_START( h19 ) ROM_END @@ -67,6 +78,10 @@ ROM_END ROM_START( ultra19 ) ROM_END + +ROM_START( gp19 ) +ROM_END + } // anonymous namespace // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS @@ -77,3 +92,5 @@ COMP( 1982, super19, h19, 0, h19_superh19, 0, h19_state, empty_init COMP( 1982, watz19, h19, 0, h19_watzh19, 0, h19_state, empty_init, "Heath Company", "Heathkit H-19 w/ Watzman ROM", MACHINE_SUPPORTS_SAVE ) // ULTRA ROM - Software Wizardry, Inc., (c) 1983 William G. Parrott, III COMP( 1983, ultra19, h19, 0, h19_ultrah19, 0, h19_state, empty_init, "Heath Company", "Heathkit H-19 w/ ULTRA ROM", MACHINE_SUPPORTS_SAVE ) +// GP-19 - Northwest Digital Systems, (c) 1983 +COMP( 1983, gp19, h19, 0, h19_gp19, 0, h19_state, empty_init, "Heath Company", "Heathkit H-19 w/ GP-19", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/heathkit/tlb.cpp b/src/mame/heathkit/tlb.cpp index b5ce81a8af2..0f5566bad16 100644 --- a/src/mame/heathkit/tlb.cpp +++ b/src/mame/heathkit/tlb.cpp @@ -12,15 +12,19 @@ mask-programmed keyboard controller. The output of this passes through a rom. - Input can also come from the serial port (a 8250). - Either device will signal an interrupt to the CPU when a key - is pressed/data is received. + Input can also come from the serial port. TODO: - determine why ULTRA ROM's self-diag (ESC |) fails for the ROM and scratchpad memory - INS8250 needs to implement "Set Break" (LCR, bit 6) before Break key will function as expected. + - 49/50 row mode does not work when DOT clocks are programmed as documented + in the manual. It does work when DOT clock is fixed at the 20.282 MHz + rate. + - In 49/50 row mode, character descenders are cut off. + - fix GP-19 graphics mode only showing the top half of the image (on the + visible screen). ****************************************************************************/ /*************************************************************************** @@ -56,12 +60,19 @@ #include "tlb.h" +#include + // Clocks static constexpr XTAL MASTER_CLOCK = XTAL(12'288'000); -// Standard H19 used a 2.048 MHz clock +// DOT clocks +static constexpr XTAL BASE_DOT_CLOCK = MASTER_CLOCK; +static constexpr XTAL GP19_DOT_CLOCK_1 = XTAL(20'282'000); // 132 columns +static constexpr XTAL GP19_DOT_CLOCK_2 = XTAL(12'292'000); // 80 columns +static constexpr XTAL GP19_DOT_CLOCK_3 = XTAL(10'644'000); // Graphics mode + +// Standard H19 used a 2.048 MHz clock for Z80 static constexpr XTAL H19_CLOCK = MASTER_CLOCK / 6; -static constexpr XTAL MC6845_CLOCK = MASTER_CLOCK / 8; static constexpr XTAL INS8250_CLOCK = MASTER_CLOCK / 4; // Beep Frequency is 1 KHz @@ -75,6 +86,7 @@ DEFINE_DEVICE_TYPE(HEATH_TLB, heath_tlb_device, "heath_tlb", "Heath Terminal Log DEFINE_DEVICE_TYPE(HEATH_SUPER19, heath_super19_tlb_device, "heath_super19_tlb", "Heath Terminal Logic Board w/Super19 ROM"); DEFINE_DEVICE_TYPE(HEATH_WATZ, heath_watz_tlb_device, "heath_watz_tlb", "Heath Terminal Logic Board w/Watzman ROM"); DEFINE_DEVICE_TYPE(HEATH_ULTRA, heath_ultra_tlb_device, "heath_ultra_tlb", "Heath Terminal Logic Board w/Ultra ROM"); +DEFINE_DEVICE_TYPE(HEATH_GP19, heath_gp19_tlb_device, "heath_gp19_tlb", "Heath Terminal Logic Board plus Northwest Digital Systems GP-19") heath_tlb_device::heath_tlb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : heath_tlb_device(mconfig, HEATH_TLB, tag, owner, clock) @@ -84,14 +96,15 @@ heath_tlb_device::heath_tlb_device(const machine_config &mconfig, const char *ta heath_tlb_device::heath_tlb_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, type, tag, owner, clock), m_maincpu(*this, "maincpu"), - m_write_sd(*this), - m_reset(*this), + m_screen(*this, "screen"), m_palette(*this, "palette"), m_crtc(*this, "crtc"), - m_ace(*this, "ins8250"), - m_beep(*this, "beeper"), m_p_videoram(*this, "videoram"), m_p_chargen(*this, "chargen"), + m_write_sd(*this), + m_reset(*this), + m_ace(*this, "ins8250"), + m_beep(*this, "beeper"), m_mm5740(*this, "mm5740"), m_kbdrom(*this, "keyboard"), m_kbspecial(*this, "MODIFIERS"), @@ -227,7 +240,7 @@ void heath_tlb_device::bell_w(uint8_t data) ****************************************************************************/ uint16_t heath_tlb_device::translate_mm5740_b(uint16_t b) { - return ((b & 0x100) >> 2) | ((b & 0x0c0) << 1) | (b & 0x03f); + return bitswap<9>(b, 7, 6, 8, 5, 4, 3, 2, 1, 0); } uint8_t heath_tlb_device::kbd_key_r() @@ -262,17 +275,17 @@ 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) ? 1 : 0; } int heath_tlb_device::mm5740_control_r() { - return (m_kbspecial->read() & KB_STATUS_CONTROL_KEY_MASK) ? CLEAR_LINE : ASSERT_LINE; + return (m_kbspecial->read() & KB_STATUS_CONTROL_KEY_MASK) ? 0 : 1; } void heath_tlb_device::mm5740_data_ready_w(int state) { - if (state == ASSERT_LINE) + if (state) { uint8_t *decode = m_kbdrom->base(); @@ -285,7 +298,7 @@ void heath_tlb_device::mm5740_data_ready_w(int state) void heath_tlb_device::serial_irq_w(int state) { - m_serial_irq_raised = state != CLEAR_LINE; + m_serial_irq_raised = bool(state); set_irq_line(); } @@ -301,7 +314,7 @@ void heath_tlb_device::check_for_reset() if (m_reset_key && m_right_shift) { m_reset_pending = true; - m_reset(ASSERT_LINE); + m_reset(1); m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); } else if (m_reset_pending) @@ -309,7 +322,7 @@ void heath_tlb_device::check_for_reset() m_reset_pending = false; reset(); m_maincpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); - m_reset(CLEAR_LINE); + m_reset(0); } } @@ -330,7 +343,7 @@ void heath_tlb_device::right_shift_w(int state) void heath_tlb_device::repeat_key_w(int state) { // when repeat key pressed, set duty cycle to 0.5, else 0. - m_repeat_clock->set_duty_cycle(state == CLEAR_LINE ? 0.5 : 0); + m_repeat_clock->set_duty_cycle(state == 0 ? 0.5 : 0); } void heath_tlb_device::break_key_w(int state) @@ -363,31 +376,14 @@ MC6845_UPDATE_ROW(heath_tlb_device::crtc_update_row) uint8_t const gfx = m_p_chargen[(chr<<4) | ra] ^ inv; // Display a scanline of a character (8 pixels) - *p++ = palette[BIT(gfx, 7)]; - *p++ = palette[BIT(gfx, 6)]; - *p++ = palette[BIT(gfx, 5)]; - *p++ = palette[BIT(gfx, 4)]; - *p++ = palette[BIT(gfx, 3)]; - *p++ = palette[BIT(gfx, 2)]; - *p++ = palette[BIT(gfx, 1)]; - *p++ = palette[BIT(gfx, 0)]; + for (int b = 0; 8 > b; ++b) + *p++ = palette[BIT(gfx, 7 - b)]; } } else { const rgb_t color = palette[0]; - - for (uint16_t x = 0; x < x_count; x++) - { - *p++ = color; // bit 7 - *p++ = color; // bit 6 - *p++ = color; // bit 5 - *p++ = color; // bit 4 - *p++ = color; // bit 3 - *p++ = color; // bit 2 - *p++ = color; // bit 1 - *p++ = color; // bit 0 - } + std::fill_n(p, x_count * 8, color); } } @@ -709,6 +705,41 @@ static INPUT_PORTS_START( watz19 ) INPUT_PORTS_END +static INPUT_PORTS_START( gp19 ) + PORT_INCLUDE( tlb ) + + PORT_MODIFY("SW402") + PORT_DIPNAME( 0x80, 0x00, "Automatic Holdscreen") PORT_DIPLOCATION("SW402:8") + PORT_DIPSETTING( 0x00, "Disabled (VT100 mode)") + PORT_DIPSETTING( 0x80, "Enabled (Z19 mode)") + + PORT_START("SW1") + PORT_DIPNAME( 0x03, 0x01, "Trailing Characters for Tektronix Message") PORT_DIPLOCATION("SW1:1,2") + PORT_DIPSETTING( 0x00, "None") + PORT_DIPSETTING( 0x01, "CR") + PORT_DIPSETTING( 0x02, "None") + PORT_DIPSETTING( 0x03, "CR,EOT") + PORT_DIPNAME( 0x04, 0x01, "Shift Key") PORT_DIPLOCATION("SW1:3") + PORT_DIPSETTING( 0x00, "Normal") + PORT_DIPSETTING( 0x04, "Shift key inverts CAPS LOCK") + PORT_DIPNAME( 0x08, 0x00, "Terminal Transmission Rate") PORT_DIPLOCATION("SW1:4") + PORT_DIPSETTING( 0x00, "Only limited by baud rate") + PORT_DIPSETTING( 0x08, "One character per 16.7 msec") + PORT_DIPNAME( 0x10, 0x10, "Character Set") PORT_DIPLOCATION("SW1:5") + PORT_DIPSETTING( 0x00, "VT100") + PORT_DIPSETTING( 0x10, "Zenith") + PORT_DIPNAME( 0x20, 0x00, "ANSI Mode") PORT_DIPLOCATION("SW1:6") + PORT_DIPSETTING( 0x00, "Zenith ANSI") + PORT_DIPSETTING( 0x20, "EDT compatible") + PORT_DIPNAME( 0x40, 0x00, "Tektronix Character Wrap") PORT_DIPLOCATION("SW1:7") + PORT_DIPSETTING( 0x00, "Column 74") + PORT_DIPSETTING( 0x40, "Column 73") + PORT_DIPNAME( 0x80, 0x00, "Blank Screen") PORT_DIPLOCATION("SW1:8") + PORT_DIPSETTING( 0x00, "After 10 mins") + PORT_DIPSETTING( 0x80, "Never") + +INPUT_PORTS_END + ROM_START( h19 ) ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASEFF ) @@ -770,6 +801,23 @@ ROM_START( ultra19 ) ROM_LOAD( "2716_h19_ultra_keyboard.bin", 0x0000, 0x0800, CRC(76130c92) SHA1(ca39c602af48505139d2750a084b5f8f0e662ff7)) ROM_END +ROM_START( gp19 ) + // GP-19 ROMs + ROM_REGION( 0x3000, "maincpu", ROMREGION_ERASEFF ) + ROM_LOAD( "gp19_rom_1_ver_1_1.bin", 0x0000, 0x1000, CRC(7cbe8e0d) SHA1(977df895b067fa4e4646b4518cffb08d4e6bb6e0)) + ROM_LOAD( "gp19_rom_2_ver_1_1.bin", 0x1000, 0x1000, CRC(a85e3bc4) SHA1(f64e851c5d3ef98a9a48e0fc482baa576773ff43)) + ROM_LOAD( "gp19_rom_3_ver_1_1.bin", 0x2000, 0x1000, CRC(878f577c) SHA1(0756435914dcfb981de4e40d5f81af3e0f5bb1c5)) + + ROM_REGION( 0x1000, "chargen", 0 ) + // GP-19 font + ROM_LOAD( "gp19_char_gen_cg_1.bin", 0x0000, 0x1000, CRC(49ec9242) SHA1(770a8c7b5b15bcfe465fd84326d0ae3dcaa85311)) + + ROM_REGION( 0x1000, "keyboard", 0 ) + // Original dump + ROM_LOAD( "2716_444-37_h19keyb.bin", 0x0000, 0x0800, CRC(5c3e6972) SHA1(df49ce64ae48652346a91648c58178a34fb37d3c)) +ROM_END + + ioport_constructor heath_tlb_device::device_input_ports() const { @@ -800,14 +848,16 @@ void heath_tlb_device::device_add_mconfig(machine_config &config) // video hardware // TODO: make configurable, Heath offered 2 different CRTs - White, Green - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green())); - screen.set_raw(MC6845_CLOCK * 45 / 2, 900, 260, 0, 640, 0, 250); - screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update)); + SCREEN(config, m_screen, SCREEN_TYPE_RASTER, rgb_t::green()); + // based on the H19 ROM code for 60 Hz + m_screen->set_raw(BASE_DOT_CLOCK, 768, 32, 672, 270, 0, 250); + m_screen->set_screen_update("crtc", FUNC(mc6845_device::screen_update)); GFXDECODE(config, "gfxdecode", m_palette, gfx_h19); PALETTE(config, "palette", palette_device::MONOCHROME); - MC6845(config, m_crtc, MC6845_CLOCK); + // MC 6845 uses a character clock, divide the DOT clock by 8. + MC6845(config, m_crtc, BASE_DOT_CLOCK / 8); m_crtc->set_screen("screen"); m_crtc->set_show_border_area(true); m_crtc->set_char_width(8); @@ -839,6 +889,7 @@ void heath_tlb_device::device_add_mconfig(machine_config &config) SPEAKER(config, "mono").front_center(); BEEP(config, m_beep, H19_BEEP_FRQ).add_route(ALL_OUTPUTS, "mono", 0.05); + // clock for repeat key CLOCK(config, m_repeat_clock, 40); m_repeat_clock->set_duty_cycle(0); m_repeat_clock->signal_handler().set(m_mm5740, FUNC(mm5740_device::repeat_line_w)); @@ -906,3 +957,167 @@ ioport_constructor heath_ultra_tlb_device::device_input_ports() const { return INPUT_PORTS_NAME(ultra19); } + +/** + * Northwest Digital Systems GP-19 add-in board + */ +heath_gp19_tlb_device::heath_gp19_tlb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + heath_tlb_device(mconfig, HEATH_GP19, tag, owner, clock) +{ +} + +void heath_gp19_tlb_device::device_add_mconfig(machine_config &config) +{ + heath_tlb_device::device_add_mconfig(config); + + m_maincpu->set_addrmap(AS_PROGRAM, &heath_gp19_tlb_device::mem_map); + m_maincpu->set_addrmap(AS_IO, &heath_gp19_tlb_device::io_map); + + m_crtc->set_update_row_callback(FUNC(heath_gp19_tlb_device::crtc_update_row)); + m_crtc->set_clock(GP19_DOT_CLOCK_2 / 8); + + m_screen->set_raw(GP19_DOT_CLOCK_2, 776, 32, 672, 264, 10, 250); + +} + +void heath_gp19_tlb_device::device_start() +{ + heath_tlb_device::device_start(); + + save_item(NAME(m_char_gen_a11)); + save_item(NAME(m_graphic_mode)); + save_item(NAME(m_col_132)); + save_item(NAME(m_reverse_video)); + + m_char_gen_a11 = false; + m_graphic_mode = false; + m_col_132 = false; + m_reverse_video = false; + +} + +void heath_gp19_tlb_device::mem_map(address_map &map) +{ + // ROMs 1, 2, 3 + map(0x0000, 0x02fff).rom(); + + // Optional external board - Program ROM 4, external I/O + // map(0x3000, 0x03fff).rom(); + + map(0x4000, 0x40ff).mirror(0x3f00).ram(); + map(0x6000, 0x67ff).mirror(0x1800).ram(); + map(0x8000, 0xbfff).mirror(0x4000).ram().share(m_p_videoram); +} + + +void heath_gp19_tlb_device::io_map(address_map &map) +{ + heath_tlb_device::io_map(map); + + // Latch U5 + map(0x68, 0x68).mirror(0x07).w(FUNC(heath_gp19_tlb_device::latch_u5_w)); + + // Switch on GP-19 board + map(0x70, 0x70).mirror(0x07).portr("SW1"); + + // Optional Auxiliary I/O connector + // map(0x78, 0x78).mirror(0x07); +} + +/** + * U5 Latch + * + * Q0 Graph/character H + * Q1 132/80 columns H + * Q2 Reverse Screen H + * Q3 Alt Character L + * Q4-Q7 LED indicators (debug LEDs on circuit board) + */ +void heath_gp19_tlb_device::latch_u5_w(uint8_t data) +{ + m_graphic_mode = bool(BIT(data, 0)); + m_col_132 = bool(BIT(data, 1)); + m_reverse_video = bool(BIT(data, 2)); + m_char_gen_a11 = bool(BIT(data, 3)); + + // TODO handle LED indicators + + if (m_graphic_mode) + { + m_crtc->set_clock(GP19_DOT_CLOCK_3 / 8); + m_screen->set_raw(GP19_DOT_CLOCK_3, 672, 50, 560, 264, 0, 250); + } + else if (m_col_132) + { + m_crtc->set_clock(GP19_DOT_CLOCK_1 / 8); + m_screen->set_raw(GP19_DOT_CLOCK_1, 1280, 1088, 33, 264, 10, 250); + } + else + { + m_crtc->set_clock(GP19_DOT_CLOCK_2 / 8); + m_screen->set_raw(GP19_DOT_CLOCK_2, 776, 32, 672, 264, 10, 250); + } +} + + +MC6845_UPDATE_ROW(heath_gp19_tlb_device::crtc_update_row) +{ + rgb_t const *const palette = m_palette->palette()->entry_list_raw(); + uint32_t *p = &bitmap.pix(y); + + if (de) + { + uint8_t screen_inv = m_reverse_video ? 0xff : 0x00; + + if (m_graphic_mode) + { + for (uint16_t x = 0; x < x_count; x++) + { + uint8_t const gfx = m_p_videoram[(ma + x) & 0x3fff] ^ screen_inv; + for (int b = 0; 8 > b; ++b) + *p++ = palette[BIT(gfx, b)]; + } + } + else + { + for (uint16_t x = 0; x < x_count; x++) + { + uint8_t inv = (x == cursor_x) ? 0xff : 0; + + uint8_t chr = m_p_videoram[(ma + x) & 0x3fff]; + + if (chr & 0x80) + { + inv ^= 0xff; + chr &= 0x7f; + } + + inv ^= screen_inv; + + // select proper character set + uint16_t base = m_char_gen_a11 ? 0x800 : 0x0; + + uint8_t const gfx = m_p_chargen[base | (chr << 4) | ra] ^ inv; + + // Display a scanline of a character (8 pixels) + for (int b = 0; 8 > b; ++b) + *p++ = palette[BIT(gfx, 7 - b)]; + } + } + } + else + { + const rgb_t color = palette[0]; + std::fill_n(p, x_count * 8, color); + } +} + +const tiny_rom_entry *heath_gp19_tlb_device::device_rom_region() const +{ + return ROM_NAME(gp19); +} + +ioport_constructor heath_gp19_tlb_device::device_input_ports() const +{ + return INPUT_PORTS_NAME(gp19); +} diff --git a/src/mame/heathkit/tlb.h b/src/mame/heathkit/tlb.h index a627d488b97..edc2cde811f 100644 --- a/src/mame/heathkit/tlb.h +++ b/src/mame/heathkit/tlb.h @@ -21,6 +21,8 @@ #include "screen.h" #include "speaker.h" + +// Standard Heath Terminal logic board class heath_tlb_device : public device_t { public: @@ -50,7 +52,14 @@ protected: void mem_map(address_map &map); void io_map(address_map &map); - required_device m_maincpu; + virtual MC6845_UPDATE_ROW(crtc_update_row); + + required_device m_maincpu; + required_device m_screen; + required_device m_palette; + required_device m_crtc; + required_shared_ptr m_p_videoram; + required_region_ptr m_p_chargen; private: void set_irq_line(); @@ -70,8 +79,6 @@ private: int mm5740_control_r(); void mm5740_data_ready_w(int state); - MC6845_UPDATE_ROW(crtc_update_row); - TIMER_CALLBACK_MEMBER(key_click_off); TIMER_CALLBACK_MEMBER(bell_off); @@ -81,12 +88,8 @@ private: devcb_write_line m_write_sd; devcb_write_line m_reset; - required_device m_palette; - required_device m_crtc; required_device m_ace; required_device m_beep; - required_shared_ptr m_p_videoram; - required_region_ptr m_p_chargen; required_device m_mm5740; required_memory_region m_kbdrom; required_ioport m_kbspecial; @@ -104,6 +107,7 @@ private: bool m_break_key_irq_raised; }; +// Heath TLB with Super19 ROM class heath_super19_tlb_device : public heath_tlb_device { public: @@ -114,6 +118,7 @@ protected: virtual ioport_constructor device_input_ports() const override; }; +// Heath TLB with Watzman (HUG) ROM class heath_watz_tlb_device : public heath_tlb_device { public: @@ -124,6 +129,7 @@ protected: virtual ioport_constructor device_input_ports() const override; }; +// Heath TLB with Ultra ROM class heath_ultra_tlb_device : public heath_tlb_device { public: @@ -137,7 +143,34 @@ protected: void mem_map(address_map &map); }; +// Heath TLB plus Northwest Digital Systems GP-19 +class heath_gp19_tlb_device : public heath_tlb_device +{ +public: + heath_gp19_tlb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + +protected: + virtual const tiny_rom_entry *device_rom_region() const override; + virtual ioport_constructor device_input_ports() const override; + + virtual void device_start() override; + virtual void device_add_mconfig(machine_config &config) override; + + void mem_map(address_map &map); + void io_map(address_map &map); + + void latch_u5_w(uint8_t data); + + virtual MC6845_UPDATE_ROW(crtc_update_row) override; + + bool m_char_gen_a11; + bool m_graphic_mode; + bool m_col_132; + bool m_reverse_video; +}; + DECLARE_DEVICE_TYPE(HEATH_TLB, heath_tlb_device) +DECLARE_DEVICE_TYPE(HEATH_GP19, heath_gp19_tlb_device) DECLARE_DEVICE_TYPE(HEATH_SUPER19, heath_super19_tlb_device) DECLARE_DEVICE_TYPE(HEATH_WATZ, heath_watz_tlb_device) DECLARE_DEVICE_TYPE(HEATH_ULTRA, heath_ultra_tlb_device) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 8fda82cac32..faf88861e25 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -19171,9 +19171,10 @@ h8 // @source:heathkit/h19.cpp h19 // Heath H19 (Zenith Z-19) +gp19 // H19 with Northwest Digital Systems GP-19 super19 // Super19 replacement ROMS for H19 -watz19 // Watzman replacement ROMS for H19 ultra19 // ULTRA ROM replacement ROMS for H19 +watz19 // Watzman replacement ROMS for H19 @source:heathkit/h89.cpp h89 // -- cgit v1.2.3