summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/mame/drivers/h19.cpp87
-rw-r--r--src/mame/drivers/h89.cpp78
2 files changed, 137 insertions, 28 deletions
diff --git a/src/mame/drivers/h19.cpp b/src/mame/drivers/h19.cpp
index 73332ffe62e..b168bee0bb9 100644
--- a/src/mame/drivers/h19.cpp
+++ b/src/mame/drivers/h19.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Robbbert
+// copyright-holders:Robbbert, Mark Garlanger
/***************************************************************************
Heathkit H19
@@ -33,6 +33,34 @@
However, a keyclick can be heard, to assure you it does in fact work.
****************************************************************************/
+/***************************************************************************
+ Memory Layout
+ The U435 three-to-eight line decoder uses A14 and A15 to generate three memory addresses:
+
+ 1. Program ROM 0x0000
+
+ 2. Scratchpad RAM 0x4000
+
+ 3. Display Memory 0xF800
+
+
+ Port Layout
+
+ Only address lines A5, A6, A7 are used by the U442 three-to-eight line decoder
+
+ 1. Keyboard encoder 0x80
+ 2. Keyboard status 0xA0
+ 3. CRT controller 0x60
+ 4. Power-up configuration (primary) 0x00
+ 5. Power-up configuration (secondary) 0x20
+ 6. ACE (communications) 0x40
+ 7. Bell enable 0xE0
+ 8. Key click enable 0xC0
+
+ Decoder U442 is enabled only during an I/O read or write operation to elimnate the
+ possibility of false decoding on a refresh address coming from the Z80.
+
+****************************************************************************/
#include "emu.h"
#include "cpu/z80/z80.h"
@@ -41,8 +69,11 @@
#include "machine/ins8250.h"
#include "machine/keyboard.h"
+// Standard H19 used a 2.048 MHz clock
#define H19_CLOCK (XTAL_12_288MHz / 6)
-#define H19_BEEP_FRQ (H19_CLOCK / 1024)
+
+// Beep Frequency is 1 KHz
+#define H19_BEEP_FRQ (H19_CLOCK / 2048)
class h19_state : public driver_device
@@ -115,11 +146,11 @@ READ8_MEMBER( h19_state::h19_a0_r )
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_t length = (offset & 0x20) ? 200 : 4;
+ uint8_t length = (offset & 0x20) ? 200 : 6;
m_beep->set_state(1);
timer_set(attotime::from_msec(length), TIMER_BEEP_OFF);
}
@@ -360,7 +391,7 @@ static const gfx_layout h19_charlayout =
{
8, 10, /* 8 x 10 characters */
128, /* 128 characters */
- 1, /* 1 bits per pixel */
+ 1, /* 1 bits per pixel */
{ 0 }, /* no bitplanes */
/* x offsets */
{ 0, 1, 2, 3, 4, 5, 6, 7 },
@@ -391,8 +422,8 @@ static MACHINE_CONFIG_START( h19, h19_state )
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_SCREEN_SIZE(640, 250)
+ MCFG_SCREEN_VISIBLE_AREA(0, 640 - 1, 0, 250 - 1)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", h19)
MCFG_PALETTE_ADD_MONOCHROME("palette")
@@ -418,14 +449,21 @@ MACHINE_CONFIG_END
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_LOAD( "2732_444-46_h19code.bin", 0x0000, 0x1000, CRC(f4447da0) SHA1(fb4093d5b763be21a9580a0defebed664b1f7a7b))
+
+ 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))
+ROM_END
+
+ROM_START( super19 )
+ // Super H19 ROM
+ ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "2732_super19_h447.bin", 0x0000, 0x1000, CRC(6c51aaa6) SHA1(5e368b39fe2f1af44a905dc474663198ab630117))
ROM_REGION( 0x0800, "chargen", 0 )
// Original font dump
@@ -434,11 +472,24 @@ ROM_START( h19 )
ROM_REGION( 0x1000, "keyboard", 0 )
// Original dump
ROM_LOAD( "2716_444-37_h19keyb.bin", 0x0000, 0x0800, CRC(5c3e6972) SHA1(df49ce64ae48652346a91648c58178a34fb37d3c))
+ROM_END
+
+ROM_START( watz19 )
+ // Watzman ROM
+ ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
+ ROM_LOAD( "watzman.bin", 0x0000, 0x1000, CRC(8168b6dc) SHA1(bfaebb9d766edbe545d24bc2b6630be4f3aa0ce9))
+
+ ROM_REGION( 0x0800, "chargen", 0 )
+ // Original font dump
+ ROM_LOAD( "2716_444-29_h19font.bin", 0x0000, 0x0800, CRC(d595ac1d) SHA1(130fb4ea8754106340c318592eec2d8a0deaf3d0))
// Watzman keyboard
+ ROM_REGION( 0x1000, "keyboard", 0 )
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( 1979, h19, 0, 0, h19, h19, driver_device, 0, "Heath Inc", "Heathkit H-19", MACHINE_NOT_WORKING )
+/* TODO - verify the years for these third-party replacement ROMs. */
+COMP( 1982, super19, h19, 0, h19, h19, driver_device, 0, "Heath Inc", "Heathkit H-19 w/ Super-19 ROM", MACHINE_NOT_WORKING )
+COMP( 1982, watz19, h19, 0, h19, h19, driver_device, 0, "Heath Inc", "Heathkit H-19 w/ Watzman ROM", MACHINE_NOT_WORKING )
-/* 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 )
diff --git a/src/mame/drivers/h89.cpp b/src/mame/drivers/h89.cpp
index 4431a1a4e99..5b0aac8ce2d 100644
--- a/src/mame/drivers/h89.cpp
+++ b/src/mame/drivers/h89.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Sandro Ronco
+// copyright-holders:Sandro Ronco, Mark Garlanger
/***************************************************************************
Heathkit H89
@@ -46,27 +46,82 @@ public:
static ADDRESS_MAP_START(h89_mem, AS_PROGRAM, 8, h89_state)
ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x0000, 0x1fff) AM_ROM
+ // Bank 0 - At startup has the format defined below, but software could swap it for RAM (Later H-89s and
+ // Early ones with the Org-0 modification),
+ // TODO - define the RAM so it can swap in/out under program control.
+ AM_RANGE(0x0000, 0x0fff) AM_ROM // Page 0-4 - System ROM (at most 4k(MTR-90), early versions(MTR-88, MTR-89) only had 2k)
+ AM_RANGE(0x1000, 0x13ff) AM_RAM // Page 5 - Floppy Disk RAM (Write-protectable)
+ AM_RANGE(0x1400, 0x1fff) AM_ROM // Page 6-7 - Floppy Disk ROM
+
+ // Banks 1-7
AM_RANGE(0x2000, 0xffff) AM_RAM
ADDRESS_MAP_END
static ADDRESS_MAP_START( h89_io, AS_IO, 8, h89_state)
ADDRESS_MAP_UNMAP_HIGH
ADDRESS_MAP_GLOBAL_MASK(0xff)
-// AM_RANGE(0x78, 0x7b) expansion 1
-// AM_RANGE(0x7c, 0x7f) expansion 2
+// AM_RANGE(0x78, 0x7b) expansion 1 // Options - Cassette I/O (only uses 0x78 - 0x79) Requires MTR-88 ROM
+ // - H37 5-1/4" Soft-sectored Controller MTR-90 ROM
+ // - H47 Dual 8" Drives - Requires MTR-89 or MTR-90 ROM
+ // - H67 8" Hard disk + 8" Floppy Drives - MTR-90 ROM
+// AM_RANGE(0x7c, 0x7f) expansion 2 // Options - 5-1/4" Hard-sectored Controller (works with ALL ROMs)
+ // - H47 Dual 8" Drives - Requires MTR-89 or MTR-90 ROM
+ // - H67 8" Hard disk + 8" Floppy Drives - MTR-90 ROM
+
// AM_RANGE(0xd0, 0xd7) 8250 UART DCE
-// AM_RANGE(0xd8, 0xdf) 8250 UART DTE
-// AM_RANGE(0xe0, 0xe7) 8250 UART LP
- AM_RANGE(0xe8, 0xef) AM_DEVREADWRITE("ins8250", ins8250_device, ins8250_r, ins8250_w) // 8250 UART console
-// AM_RANGE(0xf0, 0xf1) front panel
+// AM_RANGE(0xd8, 0xdf) 8250 UART DTE - MODEM
+// AM_RANGE(0xe0, 0xe7) 8250 UART DCE - LP
+ AM_RANGE(0xe8, 0xef) AM_DEVREADWRITE("ins8250", ins8250_device, ins8250_r, ins8250_w) // 8250 UART console - this
+ // connects internally to a Terminal board
+ // that is also used in the H19. Ideally,
+ // the H19 code could be connected and ran
+ // as a separate thread.
+// AM_RANGE(0xf0, 0xf1) // ports defined on the H8 - on the H89, access to these addresses causes a NMI
AM_RANGE(0xf2, 0xf2) AM_WRITE(port_f2_w) AM_READ_PORT("SW501")
-// AM_RANGE(0xf8, 0xf9) cassette
-// AM_RANGE(0xfa, 0xff) serial I/O
+// AM_RANGE(0xf3, 0xf3) // ports defined on the H8 - on the H89, access to these addresses causes a NMI
ADDRESS_MAP_END
/* Input ports */
static INPUT_PORTS_START( h89 )
+
+ // Settings with the MTR-88 ROM (#444-40)
+// PORT_START("SW501")
+// PORT_DIPNAME( 0x1f, 0x00, "Unused" ) PORT_DIPLOCATION("S1:1,S1:2,S1:3,S1:4,S1:5")
+// PORT_DIPNAME( 0x20, 0x20, "Perform memory test at start" ) PORT_DIPLOCATION("S1:6")
+// PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+// PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+// PORT_DIPNAME( 0xc0, 0x00, "Console Baud rate" ) PORT_DIPLOCATION("S1:7")
+// PORT_DIPSETTING( 0x00, "9600" )
+// PORT_DIPSETTING( 0x40, "19200" )
+// PORT_DIPSETTING( 0x80, "38400" )
+// PORT_DIPSETTING( 0xc0, "57600" )
+
+ // Settings with the MTR-89 ROM (#444-62)
+// PORT_START("SW501")
+// PORT_DIPNAME( 0x03, 0x00, "Expansion 1" ) PORT_DIPLOCATION("S1:1,S1:2")
+// PORT_DIPSETTING( 0x00, "H-88-1" )
+// PORT_DIPSETTING( 0x01, "H/Z-47" )
+// PORT_DIPSETTING( 0x02, "Undefined" )
+// PORT_DIPSETTING( 0x03, "Undefined" )
+// PORT_DIPNAME( 0x0c, 0x00, "Expansion 2" ) PORT_DIPLOCATION("S1:3,S1:4")
+// PORT_DIPSETTING( 0x00, "Unused" )
+// PORT_DIPSETTING( 0x04, "H/Z-47" )
+// PORT_DIPSETTING( 0x08, "Undefined" )
+// PORT_DIPSETTING( 0x0c, "Undefined" )
+// PORT_DIPNAME( 0x10, 0x00, "Boot from" ) PORT_DIPLOCATION("S1:5")
+// PORT_DIPSETTING( 0x00, "Expansion 1" )
+// PORT_DIPSETTING( 0x10, "Expansion 2" )
+// PORT_DIPNAME( 0x20, 0x20, "Perform memory test at start" ) PORT_DIPLOCATION("S1:6")
+// PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+// PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+// PORT_DIPNAME( 0x40, 0x00, "Console Baud rate" ) PORT_DIPLOCATION("S1:7")
+// PORT_DIPSETTING( 0x00, "9600" )
+// PORT_DIPSETTING( 0x40, "19200" )
+// PORT_DIPNAME( 0x80, 0x00, "Boot mode" ) PORT_DIPLOCATION("S1:8")
+// PORT_DIPSETTING( 0x00, DEF_STR( Normal ) )
+// PORT_DIPSETTING( 0x80, "Auto" )
+
+ // Settings with the MTR-90 ROM (#444-84 or 444-142)
PORT_START("SW501")
PORT_DIPNAME( 0x03, 0x00, "Expansion 1" ) PORT_DIPLOCATION("S1:1,S1:2")
PORT_DIPSETTING( 0x00, "H-88-1" )
@@ -105,10 +160,13 @@ TIMER_DEVICE_CALLBACK_MEMBER(h89_state::h89_irq_timer)
WRITE8_MEMBER( h89_state::port_f2_w )
{
+ // Bit 0 - Single-step
+ // Bit 1 - Enable timer interrupt (2mSec Clock)
m_port_f2 = data;
}
static DEVICE_INPUT_DEFAULTS_START( terminal )
+ // TODO - baud rate should be controlled by SW501 setting
DEVICE_INPUT_DEFAULTS( "RS232_TXBAUD", 0xff, RS232_BAUD_9600 )
DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_9600 )
DEVICE_INPUT_DEFAULTS( "RS232_STARTBITS", 0xff, RS232_STARTBITS_1 )