mirror of
https://github.com/holub/mame
synced 2025-04-26 18:23:08 +03:00
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
This commit is contained in:
parent
5ba9a2a428
commit
0fdb920e40
@ -179,6 +179,7 @@ const double XTAL::known_xtals[] = {
|
|||||||
10'480'000, /* 10.48_MHz_XTAL System-80 (50 Hz) */
|
10'480'000, /* 10.48_MHz_XTAL System-80 (50 Hz) */
|
||||||
10'500'000, /* 10.5_MHz_XTAL Agat-7 */
|
10'500'000, /* 10.5_MHz_XTAL Agat-7 */
|
||||||
10'595'000, /* 10.595_MHz_XTAL Mad Alien */
|
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'644'500, /* 10.6445_MHz_XTAL TRS-80 Model I */
|
||||||
10'687'500, /* 10.6875_MHz_XTAL BBC Bridge Companion */
|
10'687'500, /* 10.6875_MHz_XTAL BBC Bridge Companion */
|
||||||
10'694'250, /* 10.69425_MHz_XTAL Xerox 820 */
|
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'057'600, /* 12.0576_MHz_XTAL Poly 1 (38400 * 314) */
|
||||||
12'096'000, /* 12.096_MHz_XTAL Some early 80's Atari games */
|
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'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'324'000, /* 12.324_MHz_XTAL Otrona Attache */
|
||||||
12'432'000, /* 12.432_MHz_XTAL Kaneko Fly Boy/Fast Freddie Hardware */
|
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 */
|
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'000'000, /* 20_MHz_XTAL - */
|
||||||
20'160'000, /* 20.16_MHz_XTAL Nintendo 8080 */
|
20'160'000, /* 20.16_MHz_XTAL Nintendo 8080 */
|
||||||
20'275'200, /* 20.2752_MHz_XTAL TRS-80 Model III */
|
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'375'040, /* 20.37504_MHz_XTAL Apple Lisa dot clock (197-0019A) */
|
||||||
20'625'000, /* 20.625_MHz_XTAL SM 7238 */
|
20'625'000, /* 20.625_MHz_XTAL SM 7238 */
|
||||||
20'790'000, /* 20.79_MHz_XTAL Blockade-hardware Gremlin games */
|
20'790'000, /* 20.79_MHz_XTAL Blockade-hardware Gremlin games */
|
||||||
|
@ -24,13 +24,19 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// original h19
|
||||||
void h19(machine_config &config);
|
void h19(machine_config &config);
|
||||||
|
|
||||||
|
// replacement ROMs
|
||||||
void h19_superh19(machine_config &config);
|
void h19_superh19(machine_config &config);
|
||||||
void h19_watzh19(machine_config &config);
|
void h19_watzh19(machine_config &config);
|
||||||
void h19_ultrah19(machine_config &config);
|
void h19_ultrah19(machine_config &config);
|
||||||
|
|
||||||
private:
|
// add-on graphics boards
|
||||||
|
void h19_gp19(machine_config &config);
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
required_device<heath_tlb_device> m_tlb;
|
required_device<heath_tlb_device> m_tlb;
|
||||||
|
|
||||||
};
|
};
|
||||||
@ -55,6 +61,11 @@ void h19_state::h19_ultrah19(machine_config &config)
|
|||||||
HEATH_ULTRA(config, m_tlb);
|
HEATH_ULTRA(config, m_tlb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void h19_state::h19_gp19(machine_config &config)
|
||||||
|
{
|
||||||
|
HEATH_GP19(config, m_tlb);
|
||||||
|
}
|
||||||
|
|
||||||
// ROM definition
|
// ROM definition
|
||||||
ROM_START( h19 )
|
ROM_START( h19 )
|
||||||
ROM_END
|
ROM_END
|
||||||
@ -67,6 +78,10 @@ ROM_END
|
|||||||
|
|
||||||
ROM_START( ultra19 )
|
ROM_START( ultra19 )
|
||||||
ROM_END
|
ROM_END
|
||||||
|
|
||||||
|
ROM_START( gp19 )
|
||||||
|
ROM_END
|
||||||
|
|
||||||
} // anonymous namespace
|
} // anonymous namespace
|
||||||
|
|
||||||
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
|
// 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 )
|
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
|
// 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 )
|
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 )
|
||||||
|
@ -12,15 +12,19 @@
|
|||||||
mask-programmed keyboard controller. The output of this passes
|
mask-programmed keyboard controller. The output of this passes
|
||||||
through a rom.
|
through a rom.
|
||||||
|
|
||||||
Input can also come from the serial port (a 8250).
|
Input can also come from the serial port.
|
||||||
Either device will signal an interrupt to the CPU when a key
|
|
||||||
is pressed/data is received.
|
|
||||||
|
|
||||||
TODO:
|
TODO:
|
||||||
- determine why ULTRA ROM's self-diag (ESC |) fails for the ROM and
|
- determine why ULTRA ROM's self-diag (ESC |) fails for the ROM and
|
||||||
scratchpad memory
|
scratchpad memory
|
||||||
- INS8250 needs to implement "Set Break" (LCR, bit 6) before Break key
|
- INS8250 needs to implement "Set Break" (LCR, bit 6) before Break key
|
||||||
will function as expected.
|
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 "tlb.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
// Clocks
|
// Clocks
|
||||||
static constexpr XTAL MASTER_CLOCK = XTAL(12'288'000);
|
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 H19_CLOCK = MASTER_CLOCK / 6;
|
||||||
static constexpr XTAL MC6845_CLOCK = MASTER_CLOCK / 8;
|
|
||||||
static constexpr XTAL INS8250_CLOCK = MASTER_CLOCK / 4;
|
static constexpr XTAL INS8250_CLOCK = MASTER_CLOCK / 4;
|
||||||
|
|
||||||
// Beep Frequency is 1 KHz
|
// 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_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_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_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::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)
|
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) :
|
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),
|
device_t(mconfig, type, tag, owner, clock),
|
||||||
m_maincpu(*this, "maincpu"),
|
m_maincpu(*this, "maincpu"),
|
||||||
m_write_sd(*this),
|
m_screen(*this, "screen"),
|
||||||
m_reset(*this),
|
|
||||||
m_palette(*this, "palette"),
|
m_palette(*this, "palette"),
|
||||||
m_crtc(*this, "crtc"),
|
m_crtc(*this, "crtc"),
|
||||||
m_ace(*this, "ins8250"),
|
|
||||||
m_beep(*this, "beeper"),
|
|
||||||
m_p_videoram(*this, "videoram"),
|
m_p_videoram(*this, "videoram"),
|
||||||
m_p_chargen(*this, "chargen"),
|
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_mm5740(*this, "mm5740"),
|
||||||
m_kbdrom(*this, "keyboard"),
|
m_kbdrom(*this, "keyboard"),
|
||||||
m_kbspecial(*this, "MODIFIERS"),
|
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)
|
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()
|
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()
|
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()
|
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)
|
void heath_tlb_device::mm5740_data_ready_w(int state)
|
||||||
{
|
{
|
||||||
if (state == ASSERT_LINE)
|
if (state)
|
||||||
{
|
{
|
||||||
uint8_t *decode = m_kbdrom->base();
|
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)
|
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();
|
set_irq_line();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -301,7 +314,7 @@ void heath_tlb_device::check_for_reset()
|
|||||||
if (m_reset_key && m_right_shift)
|
if (m_reset_key && m_right_shift)
|
||||||
{
|
{
|
||||||
m_reset_pending = true;
|
m_reset_pending = true;
|
||||||
m_reset(ASSERT_LINE);
|
m_reset(1);
|
||||||
m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
|
m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
|
||||||
}
|
}
|
||||||
else if (m_reset_pending)
|
else if (m_reset_pending)
|
||||||
@ -309,7 +322,7 @@ void heath_tlb_device::check_for_reset()
|
|||||||
m_reset_pending = false;
|
m_reset_pending = false;
|
||||||
reset();
|
reset();
|
||||||
m_maincpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
|
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)
|
void heath_tlb_device::repeat_key_w(int state)
|
||||||
{
|
{
|
||||||
// when repeat key pressed, set duty cycle to 0.5, else 0.
|
// 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)
|
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;
|
uint8_t const gfx = m_p_chargen[(chr<<4) | ra] ^ inv;
|
||||||
|
|
||||||
// Display a scanline of a character (8 pixels)
|
// Display a scanline of a character (8 pixels)
|
||||||
*p++ = palette[BIT(gfx, 7)];
|
for (int b = 0; 8 > b; ++b)
|
||||||
*p++ = palette[BIT(gfx, 6)];
|
*p++ = palette[BIT(gfx, 7 - b)];
|
||||||
*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)];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const rgb_t color = palette[0];
|
const rgb_t color = palette[0];
|
||||||
|
std::fill_n(p, x_count * 8, color);
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -709,6 +705,41 @@ static INPUT_PORTS_START( watz19 )
|
|||||||
|
|
||||||
INPUT_PORTS_END
|
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_START( h19 )
|
||||||
ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASEFF )
|
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_LOAD( "2716_h19_ultra_keyboard.bin", 0x0000, 0x0800, CRC(76130c92) SHA1(ca39c602af48505139d2750a084b5f8f0e662ff7))
|
||||||
ROM_END
|
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
|
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
|
// video hardware
|
||||||
// TODO: make configurable, Heath offered 2 different CRTs - White, Green
|
// TODO: make configurable, Heath offered 2 different CRTs - White, Green
|
||||||
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER, rgb_t::green()));
|
SCREEN(config, m_screen, SCREEN_TYPE_RASTER, rgb_t::green());
|
||||||
screen.set_raw(MC6845_CLOCK * 45 / 2, 900, 260, 0, 640, 0, 250);
|
// based on the H19 ROM code for 60 Hz
|
||||||
screen.set_screen_update("crtc", FUNC(mc6845_device::screen_update));
|
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);
|
GFXDECODE(config, "gfxdecode", m_palette, gfx_h19);
|
||||||
PALETTE(config, "palette", palette_device::MONOCHROME);
|
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_screen("screen");
|
||||||
m_crtc->set_show_border_area(true);
|
m_crtc->set_show_border_area(true);
|
||||||
m_crtc->set_char_width(8);
|
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();
|
SPEAKER(config, "mono").front_center();
|
||||||
BEEP(config, m_beep, H19_BEEP_FRQ).add_route(ALL_OUTPUTS, "mono", 0.05);
|
BEEP(config, m_beep, H19_BEEP_FRQ).add_route(ALL_OUTPUTS, "mono", 0.05);
|
||||||
|
|
||||||
|
// clock for repeat key
|
||||||
CLOCK(config, m_repeat_clock, 40);
|
CLOCK(config, m_repeat_clock, 40);
|
||||||
m_repeat_clock->set_duty_cycle(0);
|
m_repeat_clock->set_duty_cycle(0);
|
||||||
m_repeat_clock->signal_handler().set(m_mm5740, FUNC(mm5740_device::repeat_line_w));
|
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);
|
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);
|
||||||
|
}
|
||||||
|
@ -21,6 +21,8 @@
|
|||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
#include "speaker.h"
|
#include "speaker.h"
|
||||||
|
|
||||||
|
|
||||||
|
// Standard Heath Terminal logic board
|
||||||
class heath_tlb_device : public device_t
|
class heath_tlb_device : public device_t
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -50,7 +52,14 @@ protected:
|
|||||||
void mem_map(address_map &map);
|
void mem_map(address_map &map);
|
||||||
void io_map(address_map &map);
|
void io_map(address_map &map);
|
||||||
|
|
||||||
required_device<cpu_device> m_maincpu;
|
virtual MC6845_UPDATE_ROW(crtc_update_row);
|
||||||
|
|
||||||
|
required_device<cpu_device> m_maincpu;
|
||||||
|
required_device<screen_device> m_screen;
|
||||||
|
required_device<palette_device> m_palette;
|
||||||
|
required_device<mc6845_device> m_crtc;
|
||||||
|
required_shared_ptr<uint8_t> m_p_videoram;
|
||||||
|
required_region_ptr<uint8_t> m_p_chargen;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void set_irq_line();
|
void set_irq_line();
|
||||||
@ -70,8 +79,6 @@ private:
|
|||||||
int mm5740_control_r();
|
int mm5740_control_r();
|
||||||
void mm5740_data_ready_w(int state);
|
void mm5740_data_ready_w(int state);
|
||||||
|
|
||||||
MC6845_UPDATE_ROW(crtc_update_row);
|
|
||||||
|
|
||||||
TIMER_CALLBACK_MEMBER(key_click_off);
|
TIMER_CALLBACK_MEMBER(key_click_off);
|
||||||
TIMER_CALLBACK_MEMBER(bell_off);
|
TIMER_CALLBACK_MEMBER(bell_off);
|
||||||
|
|
||||||
@ -81,12 +88,8 @@ private:
|
|||||||
devcb_write_line m_write_sd;
|
devcb_write_line m_write_sd;
|
||||||
devcb_write_line m_reset;
|
devcb_write_line m_reset;
|
||||||
|
|
||||||
required_device<palette_device> m_palette;
|
|
||||||
required_device<mc6845_device> m_crtc;
|
|
||||||
required_device<ins8250_device> m_ace;
|
required_device<ins8250_device> m_ace;
|
||||||
required_device<beep_device> m_beep;
|
required_device<beep_device> m_beep;
|
||||||
required_shared_ptr<uint8_t> m_p_videoram;
|
|
||||||
required_region_ptr<uint8_t> m_p_chargen;
|
|
||||||
required_device<mm5740_device> m_mm5740;
|
required_device<mm5740_device> m_mm5740;
|
||||||
required_memory_region m_kbdrom;
|
required_memory_region m_kbdrom;
|
||||||
required_ioport m_kbspecial;
|
required_ioport m_kbspecial;
|
||||||
@ -104,6 +107,7 @@ private:
|
|||||||
bool m_break_key_irq_raised;
|
bool m_break_key_irq_raised;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Heath TLB with Super19 ROM
|
||||||
class heath_super19_tlb_device : public heath_tlb_device
|
class heath_super19_tlb_device : public heath_tlb_device
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -114,6 +118,7 @@ protected:
|
|||||||
virtual ioport_constructor device_input_ports() const override;
|
virtual ioport_constructor device_input_ports() const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Heath TLB with Watzman (HUG) ROM
|
||||||
class heath_watz_tlb_device : public heath_tlb_device
|
class heath_watz_tlb_device : public heath_tlb_device
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -124,6 +129,7 @@ protected:
|
|||||||
virtual ioport_constructor device_input_ports() const override;
|
virtual ioport_constructor device_input_ports() const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Heath TLB with Ultra ROM
|
||||||
class heath_ultra_tlb_device : public heath_tlb_device
|
class heath_ultra_tlb_device : public heath_tlb_device
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -137,7 +143,34 @@ protected:
|
|||||||
void mem_map(address_map &map);
|
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_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_SUPER19, heath_super19_tlb_device)
|
||||||
DECLARE_DEVICE_TYPE(HEATH_WATZ, heath_watz_tlb_device)
|
DECLARE_DEVICE_TYPE(HEATH_WATZ, heath_watz_tlb_device)
|
||||||
DECLARE_DEVICE_TYPE(HEATH_ULTRA, heath_ultra_tlb_device)
|
DECLARE_DEVICE_TYPE(HEATH_ULTRA, heath_ultra_tlb_device)
|
||||||
|
@ -19171,9 +19171,10 @@ h8 //
|
|||||||
|
|
||||||
@source:heathkit/h19.cpp
|
@source:heathkit/h19.cpp
|
||||||
h19 // Heath H19 (Zenith Z-19)
|
h19 // Heath H19 (Zenith Z-19)
|
||||||
|
gp19 // H19 with Northwest Digital Systems GP-19
|
||||||
super19 // Super19 replacement ROMS for H19
|
super19 // Super19 replacement ROMS for H19
|
||||||
watz19 // Watzman replacement ROMS for H19
|
|
||||||
ultra19 // ULTRA ROM replacement ROMS for H19
|
ultra19 // ULTRA ROM replacement ROMS for H19
|
||||||
|
watz19 // Watzman replacement ROMS for H19
|
||||||
|
|
||||||
@source:heathkit/h89.cpp
|
@source:heathkit/h89.cpp
|
||||||
h89 //
|
h89 //
|
||||||
|
Loading…
Reference in New Issue
Block a user