summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/h19.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/h19.c')
-rw-r--r--src/mame/drivers/h19.c452
1 files changed, 452 insertions, 0 deletions
diff --git a/src/mame/drivers/h19.c b/src/mame/drivers/h19.c
new file mode 100644
index 00000000000..4e44801c862
--- /dev/null
+++ b/src/mame/drivers/h19.c
@@ -0,0 +1,452 @@
+// license:BSD-3-Clause
+// copyright-holders:Robbbert
+/***************************************************************************
+
+ Heathkit H19
+
+ 12/05/2009 Skeleton driver.
+
+ The keyboard consists of a 9x10 matrix connected to a MM5740N
+ mask-programmed keyboard controller. The output of this passes
+ through a rom. The MM5740N may be custom-made, in which case it
+ will need to be procured and tested. There is a "default" array;
+ perhaps this is used. The presence of the rom would seem to
+ indicate that the default is being used. We won't know, of
+ course, until the device is emulated.
+
+ Keyboard input can also come from the serial port (a 8250).
+ Either device will signal an interrupt to the CPU when a key
+ is pressed/sent.
+
+ For the moment, the "ascii keyboard" device is used for the keyboard.
+
+ TODO:
+ - Create device or HLE of MM5740N keyboard controller
+ - Make sure correct mask programming is used for it
+ - Use keyboard rom
+ - Finish connecting up the 8250
+ - Verify beep lengths
+ - Verify ram size
+ - When the internal keyboard works, get rid of the "ascii_keyboard".
+
+ Bios 1 (super19) has the videoram at D800. This is not emulated.
+ However, a keyclick can be heard, to assure you it does in fact work.
+
+****************************************************************************/
+
+#include "emu.h"
+#include "cpu/z80/z80.h"
+#include "video/mc6845.h"
+#include "sound/beep.h"
+#include "machine/ins8250.h"
+#include "machine/keyboard.h"
+
+#define KEYBOARD_TAG "keyboard"
+
+#define H19_CLOCK (XTAL_12_288MHz / 6)
+#define H19_BEEP_FRQ (H19_CLOCK / 1024)
+
+
+class h19_state : public driver_device
+{
+public:
+ enum
+ {
+ TIMER_BEEP_OFF
+ };
+
+ h19_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_crtc(*this, "crtc"),
+ m_ace(*this, "ins8250"),
+ m_beep(*this, "beeper"),
+ m_p_videoram(*this, "videoram"),
+ m_palette(*this, "palette")
+ {
+ }
+
+ required_device<cpu_device> m_maincpu;
+ required_device<mc6845_device> m_crtc;
+ required_device<ins8250_device> m_ace;
+ required_device<beep_device> m_beep;
+ DECLARE_READ8_MEMBER(h19_80_r);
+ DECLARE_READ8_MEMBER(h19_a0_r);
+ DECLARE_WRITE8_MEMBER(h19_c0_w);
+ DECLARE_WRITE8_MEMBER(h19_kbd_put);
+ MC6845_UPDATE_ROW(crtc_update_row);
+ required_shared_ptr<UINT8> m_p_videoram;
+ required_device<palette_device> m_palette;
+ UINT8 *m_p_chargen;
+ UINT8 m_term_data;
+ virtual void machine_reset();
+ virtual void video_start();
+ DECLARE_WRITE_LINE_MEMBER(h19_ace_irq);
+
+protected:
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
+};
+
+
+void h19_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ switch (id)
+ {
+ case TIMER_BEEP_OFF:
+ m_beep->set_state(0);
+ break;
+ default:
+ assert_always(FALSE, "Unknown id in h19_state::device_timer");
+ }
+}
+
+READ8_MEMBER( h19_state::h19_80_r )
+{
+// keyboard data
+ UINT8 ret = m_term_data;
+ m_term_data = 0;
+ return ret;
+}
+
+READ8_MEMBER( h19_state::h19_a0_r )
+{
+// keyboard status
+ m_maincpu->set_input_line(0, CLEAR_LINE);
+ return 0x7f; // says that a key is ready and no modifier keys are pressed
+}
+
+WRITE8_MEMBER( h19_state::h19_c0_w )
+{
+/* Beeper control - a 96L02 contains 2 oneshots, one for bell and one for keyclick.
+- lengths need verifying
+ offset 00-1F = keyclick
+ offset 20-3F = terminal bell */
+
+ UINT8 length = (offset & 0x20) ? 200 : 4;
+ m_beep->set_state(1);
+ timer_set(attotime::from_msec(length), TIMER_BEEP_OFF);
+}
+
+static ADDRESS_MAP_START(h19_mem, AS_PROGRAM, 8, h19_state)
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x0000, 0x1fff) AM_ROM
+ AM_RANGE(0x2000, 0xf7ff) AM_RAM
+ AM_RANGE(0xf800, 0xffff) AM_RAM AM_SHARE("videoram")
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( h19_io, AS_IO, 8, h19_state)
+ ADDRESS_MAP_UNMAP_HIGH
+ ADDRESS_MAP_GLOBAL_MASK(0xff)
+ AM_RANGE(0x00, 0x1F) AM_READ_PORT("S401")
+ AM_RANGE(0x20, 0x3F) AM_READ_PORT("S402")
+ AM_RANGE(0x40, 0x47) AM_MIRROR(0x18) AM_DEVREADWRITE("ins8250", ins8250_device, ins8250_r, ins8250_w )
+ AM_RANGE(0x60, 0x60) AM_DEVWRITE("crtc", mc6845_device, address_w)
+ AM_RANGE(0x61, 0x61) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w)
+ AM_RANGE(0x80, 0x9F) AM_READ(h19_80_r)
+ AM_RANGE(0xA0, 0xBF) AM_READ(h19_a0_r)
+ AM_RANGE(0xC0, 0xFF) AM_WRITE(h19_c0_w)
+ADDRESS_MAP_END
+
+/* Input ports */
+static INPUT_PORTS_START( h19 )
+// Port codes are omitted to prevent collision with terminal keys
+
+ PORT_START("MODIFIERS")
+ // bit 0 connects to B8 of MM5740 - purpose unknown
+ // bit 7 is low if a key is pressed
+ PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CapsLock")
+ PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Break")
+ PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("OffLine")
+ PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CTRL")
+ PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("LeftShift")
+ PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Repeat")
+ PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Reset")
+ PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("RightShift")
+
+ PORT_START("X1")
+ PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("/")
+ PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("X2")
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0-pad")
+ PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Dot-pad")
+ PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Enter-pad")
+
+ PORT_START("X2")
+ PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(";")
+ PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\'")
+ PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("{")
+ PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return")
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("1-pad")
+ PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("2-pad")
+ PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("3-pad")
+
+ PORT_START("X3")
+ PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("P")
+ PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("[")
+ PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\\")
+ PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("LF")
+ PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DEL")
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("4-pad")
+ PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("5-pad")
+ PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("6-pad")
+
+ PORT_START("X4")
+ PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0")
+ PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("-")
+ PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("=")
+ PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("AccentAcute")
+ PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("BS")
+ PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("X1")
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("7-pad")
+ PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("8-pad")
+ PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("9-pad")
+
+ PORT_START("X5")
+ PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F1")
+ PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F2")
+ PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F3")
+ PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F4")
+ PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F5")
+ PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Erase")
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Blue")
+ PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Red")
+ PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Gray")
+
+ PORT_START("X6")
+ PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Space")
+ PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z")
+ PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("X")
+ PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C")
+ PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("V")
+ PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B")
+ PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("N")
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M")
+ PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(",")
+ PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(".")
+
+ PORT_START("X7")
+ PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Scroll")
+ PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A")
+ PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S")
+ PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D")
+ PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F")
+ PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G")
+ PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H")
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("J")
+ PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("K")
+ PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("L")
+
+ PORT_START("X8")
+ PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Tab")
+ PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Q")
+ PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("W")
+ PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E")
+ PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("R")
+ PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("T")
+ PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Y")
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("U")
+ PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I")
+ PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("O")
+
+ PORT_START("X9")
+ PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Esc")
+ PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("1")
+ PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("2")
+ PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("3")
+ PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("4")
+ PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("5")
+ PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("6")
+ PORT_BIT(0x080, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("7")
+ PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("8")
+ PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("9")
+
+ PORT_START("S401")
+ PORT_DIPNAME( 0x0f, 0x03, "Baud Rate")
+ PORT_DIPSETTING( 0x01, "110")
+ PORT_DIPSETTING( 0x02, "150")
+ PORT_DIPSETTING( 0x03, "300")
+ PORT_DIPSETTING( 0x04, "600")
+ PORT_DIPSETTING( 0x05, "1200")
+ PORT_DIPSETTING( 0x06, "1800")
+ PORT_DIPSETTING( 0x07, "2000")
+ PORT_DIPSETTING( 0x08, "2400")
+ PORT_DIPSETTING( 0x09, "3600")
+ PORT_DIPSETTING( 0x0a, "4800")
+ PORT_DIPSETTING( 0x0b, "7200")
+ PORT_DIPSETTING( 0x0c, "9600")
+ PORT_DIPSETTING( 0x0d, "19200")
+ PORT_DIPNAME( 0x30, 0x00, "Parity")
+ PORT_DIPSETTING( 0x00, DEF_STR(None))
+ PORT_DIPSETTING( 0x10, "Odd")
+ PORT_DIPSETTING( 0x30, "Even")
+ PORT_DIPNAME( 0x40, 0x00, "Parity Type")
+ PORT_DIPSETTING( 0x00, DEF_STR(Normal))
+ PORT_DIPSETTING( 0x40, "Stick")
+ PORT_DIPNAME( 0x80, 0x00, "Duplex")
+ PORT_DIPSETTING( 0x00, "Half")
+ PORT_DIPSETTING( 0x80, "Full")
+
+ PORT_START("S402") // stored at 40C8
+ PORT_DIPNAME( 0x01, 0x00, "Cursor")
+ PORT_DIPSETTING( 0x00, "Underline")
+ PORT_DIPSETTING( 0x01, "Block")
+ PORT_DIPNAME( 0x02, 0x00, "Keyclick")
+ PORT_DIPSETTING( 0x02, DEF_STR(No))
+ PORT_DIPSETTING( 0x00, DEF_STR(Yes))
+ PORT_DIPNAME( 0x04, 0x04, "Wrap at EOL")
+ PORT_DIPSETTING( 0x00, DEF_STR(No))
+ PORT_DIPSETTING( 0x04, DEF_STR(Yes))
+ PORT_DIPNAME( 0x08, 0x08, "Auto LF on CR")
+ PORT_DIPSETTING( 0x00, DEF_STR(No))
+ PORT_DIPSETTING( 0x08, DEF_STR(Yes))
+ PORT_DIPNAME( 0x10, 0x00, "Auto CR on LF")
+ PORT_DIPSETTING( 0x00, DEF_STR(No))
+ PORT_DIPSETTING( 0x10, DEF_STR(Yes))
+ PORT_DIPNAME( 0x20, 0x00, "Mode")
+ PORT_DIPSETTING( 0x00, "VT52")
+ PORT_DIPSETTING( 0x20, "ANSI")
+ PORT_DIPNAME( 0x40, 0x00, "Keypad Shifted")
+ PORT_DIPSETTING( 0x00, DEF_STR(No))
+ PORT_DIPSETTING( 0x40, DEF_STR(Yes))
+ PORT_DIPNAME( 0x80, 0x00, "Refresh")
+ PORT_DIPSETTING( 0x00, "50Hz")
+ PORT_DIPSETTING( 0x80, "60Hz")
+INPUT_PORTS_END
+
+
+void h19_state::machine_reset()
+{
+ m_beep->set_frequency(H19_BEEP_FRQ);
+}
+
+void h19_state::video_start()
+{
+ m_p_chargen = memregion("chargen")->base();
+}
+
+MC6845_UPDATE_ROW( h19_state::crtc_update_row )
+{
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
+ UINT8 chr,gfx;
+ UINT16 mem,x;
+ UINT32 *p = &bitmap.pix32(y);
+
+ for (x = 0; x < x_count; x++)
+ {
+ UINT8 inv=0;
+ if (x == cursor_x) inv=0xff;
+ mem = (ma + x) & 0x7ff;
+ chr = m_p_videoram[mem];
+
+ if (chr & 0x80)
+ {
+ inv ^= 0xff;
+ chr &= 0x7f;
+ }
+
+ /* get pattern of pixels for that character scanline */
+ 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)];
+ }
+}
+
+WRITE_LINE_MEMBER(h19_state::h19_ace_irq)
+{
+ m_maincpu->set_input_line(0, (state ? HOLD_LINE : CLEAR_LINE));
+}
+
+/* F4 Character Displayer */
+static const gfx_layout h19_charlayout =
+{
+ 8, 10, /* 8 x 10 characters */
+ 128, /* 128 characters */
+ 1, /* 1 bits per pixel */
+ { 0 }, /* no bitplanes */
+ /* x offsets */
+ { 0, 1, 2, 3, 4, 5, 6, 7 },
+ /* y offsets */
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8 },
+ 8*16 /* every char takes 16 bytes */
+};
+
+static GFXDECODE_START( h19 )
+ GFXDECODE_ENTRY( "chargen", 0x0000, h19_charlayout, 0, 1 )
+GFXDECODE_END
+
+WRITE8_MEMBER( h19_state::h19_kbd_put )
+{
+ m_term_data = data;
+ m_maincpu->set_input_line(0, HOLD_LINE);
+}
+
+static MACHINE_CONFIG_START( h19, h19_state )
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu",Z80, H19_CLOCK) // From schematics
+ MCFG_CPU_PROGRAM_MAP(h19_mem)
+ MCFG_CPU_IO_MAP(h19_io)
+ //MCFG_DEVICE_PERIODIC_INT_DRIVER(h19_state, irq0_line_hold, 50) // for testing, causes a keyboard scan
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
+ MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
+ MCFG_SCREEN_SIZE(640, 200)
+ MCFG_SCREEN_VISIBLE_AREA(0, 640 - 1, 0, 200 - 1)
+ MCFG_GFXDECODE_ADD("gfxdecode", "palette", h19)
+ MCFG_PALETTE_ADD_MONOCHROME_GREEN("palette")
+
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_12_288MHz / 8) // clk taken from schematics
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8) /*?*/
+ MCFG_MC6845_UPDATE_ROW_CB(h19_state, crtc_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(INPUTLINE("maincpu", INPUT_LINE_NMI)) // frame pulse
+
+ MCFG_DEVICE_ADD("ins8250", INS8250, XTAL_12_288MHz / 4) // 3.072mhz clock which gets divided down for the various baud rates
+ MCFG_INS8250_OUT_INT_CB(WRITELINE(h19_state, h19_ace_irq)) // interrupt
+
+ MCFG_DEVICE_ADD(KEYBOARD_TAG, GENERIC_KEYBOARD, 0)
+ MCFG_GENERIC_KEYBOARD_CB(WRITE8(h19_state, h19_kbd_put))
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("beeper", BEEP, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+MACHINE_CONFIG_END
+
+/* ROM definition */
+ROM_START( h19 )
+ ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
+ // Original
+ ROM_SYSTEM_BIOS(0, "orig", "Original")
+ ROMX_LOAD( "2732_444-46_h19code.bin", 0x0000, 0x1000, CRC(f4447da0) SHA1(fb4093d5b763be21a9580a0defebed664b1f7a7b), ROM_BIOS(1))
+ // Super H19 ROM (
+ ROM_SYSTEM_BIOS(1, "super", "Super 19")
+ ROMX_LOAD( "2732_super19_h447.bin", 0x0000, 0x1000, CRC(6c51aaa6) SHA1(5e368b39fe2f1af44a905dc474663198ab630117), ROM_BIOS(2))
+ // Watzman ROM
+ ROM_SYSTEM_BIOS(2, "watzman", "Watzman")
+ ROMX_LOAD( "watzman.bin", 0x0000, 0x1000, CRC(8168b6dc) SHA1(bfaebb9d766edbe545d24bc2b6630be4f3aa0ce9), ROM_BIOS(3))
+
+ ROM_REGION( 0x0800, "chargen", 0 )
+ // Original font dump
+ ROM_LOAD( "2716_444-29_h19font.bin", 0x0000, 0x0800, CRC(d595ac1d) SHA1(130fb4ea8754106340c318592eec2d8a0deaf3d0))
+
+ ROM_REGION( 0x1000, "keyboard", 0 )
+ // Original dump
+ ROM_LOAD( "2716_444-37_h19keyb.bin", 0x0000, 0x0800, CRC(5c3e6972) SHA1(df49ce64ae48652346a91648c58178a34fb37d3c))
+ // Watzman keyboard
+ ROM_LOAD( "keybd.bin", 0x0800, 0x0800, CRC(58dc8217) SHA1(1b23705290bdf9fc6342065c6a528c04bff67b13))
+ROM_END
+
+/* Driver (year is either 1978 or 1979) */
+
+/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */
+COMP( 1978, h19, 0, 0, h19, h19, driver_device, 0, "Heath Inc", "Heathkit H-19", MACHINE_NOT_WORKING )