Skip to content

Instantly share code, notes, and snippets.

@jblang
Last active August 7, 2023 20:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jblang/3f13784f7c469da4b65b23d082ac0cf4 to your computer and use it in GitHub Desktop.
Save jblang/3f13784f7c469da4b65b23d082ac0cf4 to your computer and use it in GitHub Desktop.
Heathkit H89 Survival Guide

H89 Survival Guide

This is a work-in-progress collection of notes I've been making as I'm exploring the Heathkit H89.

HDOS

Devices

Logical Device Device Name Port (Octal) Port (Hex) Interrupt Level
Console Terminal TT: 350-357 E8-EF 3
Line Printer LP: 340-347 E0-E7
Alternate Terminal AT: 320-327 D0-D7
5.25" Floppy SY:, DK: 174-177 7C-7F
8" Floppy SY:, DK: 170-173 78-7B 5
Reserved 376-377 FE-FF
Reserved 360-361 F0-F1

Drive and File Names

HDOS device names for system drives are SY0:, SY1:, and SY2:; alternate drives are DK0:, DK1:, and DK2:. Whether a drive is considered a system or alternate drive depends on how the controller it's attached to is configured.

The boot drive is SY0: and the drive name can be omitted for files stored on that drive. Unlike CP/M or DOS, it's not possible to change the default drive, so files on any other drive have to be qualified with the device name.

Similar to CP/M and DOS, files are limited to 8 characters with a 3 character extension.

Commands

HELP

Displays the following help:

Command Description
HELP Print This List
BYE Dismount all Mounted Disks, and Reboot
CAT [DEV:] List Files on Disk
COPY TO=FROM Copy FROM file to TO
DATE [NEWDATE] Display or Set Date
DELETE FNAME Delete File(s)
DISMOUNT DEV: Dismount Volume from Drive
PIP Execute PIP
MOUNT DEV: Mount Volume on Device
RENAME TO=FROM Rename File FROM to TO
RUN FNAME Run Program
SET dev: opt Select Option for Device
SET HELP Documentation for SET Command
STATUS Display Disk Statistics
TYPE FNAME Type file contents on terminal
VER Display the Current Version of HDOS
FNAME Same as RUN SY0:FNAME.ABS

MOUNT, DISMOUNT, BYE

Disks must be mounted with the MOUNT command before use. The command takes the device name of the drive as a parameter (SY0:-SY2: or DK0:-DK2:)

MOUNT DVn:

HDOS keeps parts of the directory for mounted disks in memory. To ensure that any changes to the directory are written to disk, the UNMOUNT command must be run before removing the disk or turning off the system:

UNMOUNT DVn:

The BYE command dismounts all mounted drives so the system can be shutdown or rebooted.

CAT

COPY

DATE

DELETE

PIP

RENAME

RUN

SET

STATUS

TYPE

VER

FNAME

Recommended Settings

From Mark Garlanger via SEBHC mailing list:

By default HDOS assumes the worst (that the terminal does not support lower case or backspace). If the letters you are seeing are upper-case, then that would be the issue, in graphics mode, only the lower-case letters are graphic symbols. So you will need to enter a few set commands on the command-line.

    set tt: bks
    set tt: nomlo
    set tt: nomli

First one lets the backspace work. The second 2 are to prevent mapping lower case to upper on output and input respectively. It seems like only one is needed, but I don't remember which and for completeness, I always do both. The emulator should auto save the disks you are using to something like "saveA.tmpDisk" (not positive on what extension I had set in the latest github version). But that is just a raw image, which the emulator supports, so you can rename your configured HDOS disk to hdos.h17raw, then update the emulator configure file to use it. Then you won't have to do the changes every time you boot.

Another thing I usually do is to set the floppy drives to 6ms to speed it up slightly. You can do that with set sy0: step 6 and repeat for the other drives. Being a virtual drive, it could even be 0, but HDOS has a lower limit of 6.

Hardware

Ports

Physical Device Name Hex Port Octal Port MTR-89 References
8251 Console UART (R/W) SC.UART FA 372
Casette Data (R) IP.TPD F9 371
Casette Data (W) OP.TPD F9 371
Casette Control (R) IP.TPC F8 370
Casette Control (W) OP.TPC F8 370 660
Switch (R) H88.SW F2 362 1253, 1430, 1798, 1828
Control (W) H88.CTL F2 362 1791, 1959, 2636
H8 Front Panel* Pad (R) IP.PAD F0 360
H8 Front Panel* Control (W) OP.CTL F0 360 771, 1069, 1083
H8 Front Panel* Digit (W) OP.DIG F0 360
H8 Front Panel* Segment (W) OP.SEG F1 361
8250 Console UART (R/W) SC.ACE E8-EF 350-357 1580, 1586, 1686, 1690, 1707, 1712, 1796, 1808, 1811, 1813, 1815, 2015, 2019
H17 Disk Control (R/W) DP.DC 7F 177 1325, 1402
H17 Status Flags (R) UP.ST 7E 176
H17 Fill Character (W) UP.FC 7E 176
H17 Sync Reset (R) UP.SR 7D 175
H17 Sync Character (W) UP.SC 7D 175
H17 Data (R/W) UP.DP 7C 174 1440
Z47 Data (R/W) D.DAT 79 171
Z47 Status (R/W) D.STA 78 170 212, 1423

* The front panel is not present on the H89 so these ports trigger an NMI instead.

Switch Bits

Mask Name Description MTR-89 References
80 H88S.AT Auto boot switch (0 = Disable, 1 = Enable) 1254
40 H88S.BR Baud rate switch (0 = 9600, 1 = 19200) 1799
20 H88S.M Memory test (1) / normal operation (0) 1829
10 H88S.DV Boot device (0 = 174-177Q, 1 = 170-173Q) 1432
0C H88S.0 174-177Q Device Type (0 = None, 1 = Z47) 1462
03 H88S.4 170-173Q Device Type (0 = H17, 1 = Z47) 1443

Control Bits

Mask Name Description MTR-89 References
02 H88B.CK 2ms clock enable/disable 1790
01 H88B.SS Single step enable/disable

UART

The Heathkit uses 8250-compatible UARTs for both the console I/O and the serial card. Further info:

Registers

Reg Name Description MTR-89 References
0+DLAB UR.DLL Divisor Latch (LSB) 1811
1+DLAB UR.DLH Divisor Latch (MSB) 1808
0 UR.RBR Receive Data
0 UR.THR Transmit Data
1 UR.IER Interrupt Enable 1815
2 UR.IIR Interrupt Identification
3 UR.LCR Line control 1796, 1813
4 UR.MCR Modem control
5 UR.LSR Line status 1580, 1686, 1707, 2015
6 UR.MCR Modem status

Interrupt Enable Bits

Mask Name Description MTR-89 References
1 UC.EDA Enable received data available interrupt
2 UC.TRE Enable transmit hold register empty interrupt
4 UC.RSI Enable receive status interrupt
8 UC.MSI Enable modem status interrupt

Interrupt ID Register

Mask Name Description MTR-89 References
1 UC.IIP Inverted interrupt pending
6 UC.IID Interrupt ID

Line Control Register

Mask Name Description MTR-89 References
00 UC.5BW 5 bit words
01 UC.6BW 6 bit words
02 UC.7BW 7 bit words
03 UC.8BW 8 bit words 1812
04 UC.2SB 2 stop bits
08 UC.PEN parity enabled
10 UC.EPS even parity select
20 UC.SKP stick parity
40 UC.SB set break
80 UC.DLA divisor latch access 1795

Modem Control Register

Mask Name Description MTR-89 References
01 UC.DTR data terminal ready
02 UC.RTS request to send
04 UC.OU1 out 1
08 UC.OU2 out 2
10 UC.LOO loop

Line Status Register

Mask Name Description MTR-89 References
01 UC.DR data ready 1687, 2016
02 UC.OR overrun
04 UC.PE parity error
08 UC.FE framing error
10 UC.BI break interrupt
20 UC.THE transmitter holding register empty 1581, 1708
40 UC.TSE transmitter shift register empty

Modem Status Register

Mask Name Description MTR-89 References
01 UC.DCS delta clear to send
02 UC.DDR delta data set ready
04 UC.TER trailing edge of ring
08 UC.DRL delta receive line signal detect
10 UC.CTS clear to send
20 UC.DSR data set ready
40 UC.RI ring indicator
80 UC.RLS received line signal

H17 Disk

Disk Status Bits

Mask Name Description MTR-89 References
01 DF.HD hole detect
02 DF.TO track 0 detect
04 DF.WP write protect
08 DF.SD sync detect

Disk Control Bits

Mask Name Description MTR-89 References
01 DF.WG write gate enable
02 DF.DS0 drive select 0
04 DF.DS1 drive select 1
08 DF.DS2 drive select 2
10 DF.MO motor on (both drives)
20 DF.DI direction (0=out)
40 DF.ST step command (active high)
80 DF.WR write enable ram

Disk UART Bits

Mask Name Description MTR-89 References
01 UF.RDA receive data available
02 UF.ROR receiver overrun
04 UF.RPE receiver parity error
40 UF.FCT fill char transmitted
80 UF.TBM transmitter buffer empty

H19 Terminal

Graphical Characters

Heathkit Unicode Codepoint Description
^ 25CF BLACK CIRCLE.
- 25E5 UPPER RIGHT TRIANGLE.
` 2503 LIGHT VERTICLE LINE.
a 2501 LIGHT HORIZONTAL LINE.
b 254B LIGHT PLUS.
c 2513 LIGHT UPPER RIGHT CORNER.
d 251B LIGHT LOWER RIGHT CORNER.
e 2517 LIGHT LOWER LEFT CORNER.
f 250F LIGHT UPPER LEFT CORNER.
g ± 00B1 LIGHT PLUS MINUS.
h 279C RIGHT ARROW.
i 2591 MEDIUM SHADE.
j 259A QUADRANT UPPER LEFT LOWER R.
k 2B07 DOWN ARROW.
l 2597 QUADRANT LOWER RIGHT.
m 2596 QUADRANT LOWER LEFT.
n 2598 QUADRANT UPPER LEFT.
o 259D QUADRANT UPPER RIGHT.
p 2580 UPPER HALF BLOCK.
q 2590 RIGHT HALF BLOCK.
r 25E4 UPPER LEFT TRIANGLE.
s 2533 LIGHT DOWN HORIZONTAL.
t 252B LIGHT VERTICAL LEFT.
u 253B LIGHT UP HORIZONTAL.
v 2523 LIGHT VERTICAL RIGHT.
w 2573 LIGHT CROSS.
x 2571 LIGHT RIGHT.
y 2572 LIGHT LEFT.
z 2594 UPPER HORIZONTAL LINE.
{ 2581 LOWER HORIZONTAL LINE.
| 258F LEFT VERTICAL LINE.
} 2595 RIGHT VERTICAL LINE.
~ 00B6 PILCROW SIGN
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment