VT202/1303 Keyboard Fix Revisited

This is a long technical post. There’s probably only one reason to read it: you have a Lexitron with a broken keyboard. I’m not going to polish it much, but I leave it here just for you!

I spent a lot of time creating a teensy replacement for the microcontroller in the keyboard.  One of the great challenges was to work out the key codes sent from the keyboard to the 8085.  This was very time-consuming and there were some that I never really cracked.

With the arrival of working keyboards, I could just swap out the original for one of the working units. Buuut the teensy solution actually provides a mechanism to move data from a modern PC to the Lexitron and that’s handy.  Also, I guess I’d like to just close the loop!

I can now sniff the communication between the 8085 and the keyboard microcontroller.  Because the keyboard appears to be just another device on the 8085 bus the data is transmitted as a parallel byte.  This would be easy to sniff with a logic analyser, but not so easy with an oscilloscope.  I thought my Analogue Discovery 2 might be sufficient for this task.

Two Different Keyboard Types

One of the VT202 units uses the same Cortron Keyboard as the VT1303.  The other uses a Digitran keyboard which looks quite different but seems to be entirely compatible with the Cortron.  The Digitran sound is not as loud.

Revisit Operation

Keyboard Pinout

PinNameFunction
1+5V 
2+5V 
3GND 
4GND 
5NC 
6GND 
7Strobe_LThis line indicates activity on the keyboard.  It is asserted for 5us when a key is pressed and for 10us when a key is released.   The strobe is not asserted when a front panel switch is changed.  It is not asserted when the shift key is pressed.  It is asserted for spec shift.
8D5 
9D6 
10GND 
11D7 
12D4 
13Kbd_Read_LThis line causes the keyboard to put data on to the 8085 bus.   The read occurs about 100us after the strobe is asserted. A0 is low.  Scan code?   A second read occurs about 8us after the first.  A0 is high. Switch state?   This strobe is asserted a couple of times every 10ms (approx.)  
14Screen OnThis also appears in the status register.
15A0This selects the data that is read by the 8085 – either the keycode or the status of the front panel switches.
16Kbd_Write_LThis strobe is asserted about 5us after Read is asserted in response to the Strobe.   This strobe is asserted every 10ms (approx.)  
17Reset? 
18GND 
19D3 
20D2 
21D1 
22D0 
23-15V 
24-15V 
25+15V 
26+15V 

Character Register

Bits 6:0 = Character number

Bit 7 = Shift

Status Register:

Bits 1:0 = Print Spacing

Bit 2 = Pitch

Bit 3 = Screen Spacing

Bit 4 = Not used (input pulled up)

Bit 5 = Key pressed

Bit 6 = Screen On/Off

Bit 7 = Autorepeat (although it doesn’t seem to be used)

Command Register:

Bit 0 = Key click

Bit 1 = Type Through LED

Bit 2 = Select LED

Bit 3 = Continuous Typing LED

Bit 4 = Write LED state (Bits 1, 2 & 3)

Bit 5 = Acknowledge

Bit 6 = Bell (Not supressed by volume control)? Under CP/M this is sent when Select is pressed.  Select causes an alarm chime (not volume controlled). 

Bit 7 = Unknown

Adjustable volume applies to key strokes.  Alarms have a fixed volume.

Word Processing Program Behaviour

Periodic

Once every 10ms or so the program reads the status register and writes the Command Register. 

Keystroke

When a key is hit the keyboard alerts the uP by asserting Strobe_L for 5us.  The program responds by reading the character, reading the status register, and then writing 32 to the Command Register.  This seems to be an acknowledgement. If there is a LED change or sound then that will be sent a few milliseconds later.

The key release is also acknowledged with a command write which can update the LED state and sound a bell but I think does neither.  

The unit only autorepeats on space, backspace, dash, underline, and full stop.  This auto repeat is convoluted.  It involves resending a specific character after the wait time has elapsed.  This triggers the software to autorepeat.  It looks like the bit 6 of the status word is set at the same time.  This is set by an output from the microcontroller (Pin 29).  Although the original keyboard does this it does no appear necessary.

CharacterOriginal OutputAutorepeat Output
Space80112
Dash103119
Underline231247
Full stop26122
Backspace110126

I can’t see any obvious pattern in these numbers.   They just are.

CP/M Behaviour

Periodic

Once every 10ms or so the program reads the status register. 

Keystroke

When a key is hit the keyboard alerts the uP by asserting Strobe_L for 5us.  The program responds by reading the status register, reading the character, and then writing the Command Register – it can acknowledge, set LEDs, or make a sound.

The key release is also acknowledged but the LED data is not repeated.  There is no periodic write The key release is also acknowledged with a command write which can update the LED state and sound a bell but I think does neither.  

CP/M autorepeats on most keys but not Spec Shift or Sel. It initiates a beep on each auto repeated character.   

CP/M politely ignores the autorepeat shenanigans that the keyboard does for the word processing program.

In CP/M lots of keys are defined as function keys that can be changed using the config program.  The config can also control auto repeat and key click. 

Select is a caps lock key.

My Current Keyboard Code

The current routine that I have for sending a character to the 8085 sets up the character and then takes then asserts the strobe (indirectly) for 1ms.  It then sets up another character (usually zero).

The real thing asserts the strobe for 5 or 10us.  Both the key register and the status register are read within about 100us of the strobe.  The Command Register is then written.  This may be the trigger to clear the key but maybe not.  I previously concluded that the key needed to be nulled but I’m not sure why it does.

My implementation autorepeats on all keys except “mode” keys like Spec Shift and Margin Set.  The actual unit does not autorepeat, although the software does under some circumstances.

I’ve treated Spec Shift and Margin Set as special cases because they are used in combination with other keys.  Certainly, autorepeat doesn’t apply.  CP/M treats Margin Set as a normal function key. 

This means that the effect of these keys is application specific.  Eg in CP/M the Spec Shift key is used to create control keys eg Ctrl-C to do a soft boot.  In the word processing program it has no effect on the letter c.  Spec Shift does not beep.

Shift really is different.  No key code is sent with just the shift key, and the character that is sent is modified if a shift key is pressed.  When shift is pressed the most significant bit is set.  This applies to all keys including Spec Shift and Margin Set.

The various reads and writes change a little with CP/M.  CP/M still reads the front panel switches but I have no idea what it does with the state. Similarly, the LEDs have no apparent function. 

Under CP/M Select behaves like a caps lock.  The shift is done in software.

Observations

Key hit

Close up of subsequent reads and write.

With the autorepeat:

The regular status read (word processor software):

Revised Keyboard Code

The keyboard code has been substantially reworked based on the observations that were possible using the logic analyser function of the Analogue Discovery 2.

  • Autorepeat has been removed except to the extent required by the word processing program.
  • Each key press and release is transferred to the 8085.
  • The timings have been changed to better match the real keyboard.
  • Only one key is checked and processed on each pass of the main loop so that commands are less likely to be missed.
  • All sounds are generated only at the request of the 8085.  There are no automatically generated sounds.
  • An additional signal was discovered that is set when a command is written and is cleared when the command has been read.
  • A few missing key codes were found.

Things like Spec Shift, Set Margin, and Select now work as advertised (as far as I can tell).

The code works on the VT1303 and the VT202.  It works with the word processing programs and with both the VT1303 CP/M and the VT202 CP/M.

Mapping

The transmitted codes can be read straight off the data lines (see waveform pics above).

Circuitry

https://www.pjrc.com/store/teensypp.html

The mapping from the microcontroller to the teensy are shown in this table:

uC Pin NruC Pin NameTeensy Pin NrSignal NameComment
1T0   
2XTAL1   
3XTAL2   
4RESET_L   
5SS   
6INT_LD4uC_New_Command 
7EA   
8RD_L   
9PSEN_L   
10WR_L   
11ALE   
12DB0C0DB0Data bus for the keyboard.
13DB1C1DB1 
14DB2C2DB2 
15DB3C3DB3 
16DB4C4DB4 
17DB5C5DB5 
18DB6C6DB6 
19DB7C7DB7 
20VSSGND  
21P20F6LED_TypeThru 
22P21F5LED_Unused 
23P22F4LED_Select 
24P23   
25PROG   
26VDD   
27P10B0Column0Keyboard Column
28P11B1Column1 
29P12B2Column2Also drives a status register input to indicate that the current key has been pressed.
30P13B3Column3Also indicates when an autorepeat could be started.
31P14B4Row0Keyboard Row
32P15B5Row1 
33P16B6Row2 
34P17B7PulserThis creates an opportunity for a pulse at E7
35P24F3LED_ContType 
36P25D3uC_Rd_LEnables command register so it can be read via Port C.
37P26D2uC_GotOne_Loud_LLoud Beep for Alarms
38P27D1uC_GotOne_Adj_LAdjustable beep for key presses
39T1E7uC_SenseSenses when a key is down
40VCC+5V  

VT202/1303 Comms Card & Kermit

I have a couple of working Lexitron word processors that run the CP/M operating system. They use an unusual disk format for which i have no means of decoding or encoding. The only input that these machines have is the keyboard which is a somewhat tedious means of transferring programs and data. This has limited the applications that i have been able to transfer to these machines.

Documentation and the CP/M implementation both suggested that Lexitron produced a communications card that could do asynchronous serial communication but i had never seen one. Recently i did a search on ebay, and discovered a card that was likely to be the unicorn communication card so i snapped it up. It arrived from the UK within a couple of weeks.

It has a 8251 programmable communication interface (PCI), an 8253 programmable interval timer (PIT), a 8255A programmable peripheral interface (PPI), and an MM5307 baud rate generator (BRG). It has a lot of RS232 drivers/receivers so i suspect that a bunch of parallel port lines use them.

I couldn’t be sure that this was the right card for either the VT1303 or the VT202 but i crossed my fingers and took the lid off the VT202.

Looking at the relationship between the PCI and the drivers/receivers, the pinout on the DIP connector was consistent with the usual RS232 pinout. The connector allows for external transmit and receive clocks, but there is some logic which allows the PCI to also use the clock from the onboard baud rate generator.

The card seemed to be in good condition. I checked for shorts on the power rails but found none. The spare slots in the card frame a little different to the slots that are home to the other cards, but the affected pins were not in use by the communications card.

Unfortunately the card developed a short on power up, resulting in the -15V fuse blowing. After replacing the offending tantalum capacitor and the fuse, the system started up ok with the board present.

I ran the configuration program on the CP/M disk to set port to 9600, no parity, one stop bit, 8 data bits. I also set up pun: and rdr: to use the serial port. I tried to get it to transmit data using:

pip pun:=rdr:

Alas, there was nothing so i started checking things out – which is a little laborious without an extender or a schematic. I did confirm that the card accessed both the PCI and the PPI, which i took as a sign that it was the correct card.

The PCI transmit/receive clock was missing and this was because the BRG was not oscillating. Everything around it looks ok:

  • Power lines
  • Crystal connected
  • Parallel control inputs from PPI changing as they should
  • Capacitors values are plausible

Currently, i’m concluding that the IC is dead which is a shame because it’s not easy to get.

In the interests of progress i pulled the IC and provided my own clock from a lab waveform generator. Frequency= 9600 x16 = 153.6kHz.

Lo and behold, there was communication:

Although the BRG is disappointing the overall result is very good. I can either knock together an emulator or try to source a replacement.

Before charging in, i decided to see if it was just the oscillator that was at fault. It would make life easier if the divider was still a going concern. I configured it for an external oscillator – again provided by a waveform generator. This seemed to work ok. It is possible that the oscillator fault is due to the crystal and the IC is actually fine.

Given some uncertainty about the crystal characteristics, testing that hypothesis seemed more trouble than putting together a replacement oscillator. There are plenty of spare footprints on the board.

Oscillator modules at 2x 921.6kHz = 1.8432MHz so i settled on that frequency. A flip-flop will divide by 2.

I built up the mod above and reconfigured the baud rate generator to use an external oscillator. It worked fine. The oscillator and divider are in the bottom left hand corner.

Unfortunately, i have found that the xon/xoff does not seem to work with data being sent to the lexitron. The configuration program does call the setting “output flow control” so i guess i should have been forewarned!

This means that i will either need to write a transfer program or adapt kermit to this machine – or i suppose i could attempt to write my own driver. I think the best course of action is to adapt kermit. I’ve never done that before and if i learn i might be able to make a version for the Osborne Executive as well.

The operating system seems capable of setting up the communication parameters so i would just need to correctly set the address of UART on an 8251 version of kermit.

The first thing i need is the base address of the UART. I wrote a little basic program to read all the I/O locations and sent a character to the UART from a PC with the hope that it would appear in the data register of the UART. Sure enough it did “t”=116. It is at 48H and again at 4AH.

Actually, i may be able to use the generic version of kermit. In doing a bit more reading i see that there is a generic version that uses operating system calls. This version relies on the the CP/M IOBYTE being used by the Lexitron OS version. There is a speed penalty from using the generic version but i could live with that for now.

A handy place to start is here:

http://www.z80.eu/kermit.html

Kermit80 is distributed as a common part (CPSKER.HEX) and a customised part. The generic part for CP/M 2.2 is CPVGEN.HEX.

The initial transfers to the target machine are a little tricky because i needed to rely on the tools that were already present on the machine. In this case i have a serial port that can be accessed with PIP.

In principle, it should be possible to transfer hex files fairly safely using PIP as long as the OS supports XON/XOFF flow control. I’ve already discovered that this support is limited. That means that there is a risk that the computer will not keep up with the data. I experimented and found that it was quite reliable at 2400 baud unless the machine got distracted by some other I/O eg a disk write.

I had previously found that PIP has quite a good buffer and that 4k of data translated to hex (ie about 12k of text) does not trigger a disk write during the transfer.

CPSKER.HEX weighs in at about 70kB. I divided it up into 6 files and transmitted each one using kermit on a PC and PIP on the Lexitron.

Because the disks don’t hold a lot of data and the hex files are inefficient, there is some disk juggling to be done. I find it convenient to create working disks with a boot track and PIP, STAT, and LOAD. Two of these gives sufficient working space.

At the Lexitron i configured the serial card to use 8 bits, no parity, and 2400 baud and received with PIP via the RDR: device:

B> a:pip kerm0.hex=rdr:

At the PC:

Kermit> set port com4
Kermit> set baud 2400
Kermit> transmit cpsker.hex

Once the transfer is complete it is necessary to connect to the Lexitron as a terminal and send an end of file character, Ctrl-z.

I repeated this for kerm[1..5] and also for the custom file CPVGEN.HEX.

Then the files can be concatenated locally with PIP:

B> a:pip kerm411.hex=kerm0.hex,kerm1.hex,kerm2.hex,kerm3.hex,kerm4.hex,kerm5.hex

At this point the files are ready to be converted to an executable. The standard LOAD program can only do one file at a time. The kermit411 distribution includes a more advanced load, MLOAD, as a small hex file. I transferred it in the same way as above and then converted it to an executable:

B> load mload

And then created the kermit executable:

B:> mload kerm411,cpsker
B:> kerm411

Kermit on the Lexitron requires some setup:

Kermit> set port tty
Kermit> set file binary

Note that the baud rate is already set by the OS config program.

Then any file can be transferred using send and receive. I sent pacman95.com as a test. The terminal characteristics aren’t quite right, but it got there.

It does not sound like much, but this is a very important step forward for the Lexitron ecosystem. I should now be able to transfer a bunch of generic CP/M programs and data.

Using the terminal mode in kermit on the Lexitron is a little complicated by the unusual keyboard. I could connect using “connect” but i could not find the exit key. Shift-Menu does provide a menu though, and this does have a command to exit. More experimenting required.

At the PC end, timeouts occur during disk writes. The length can be increased to, say 10s, at the PC end with:

Kermit> set transmit timeout 10

The error limit can also be increased at the PC end:

Kermit> set retry limit 100

VT202/1303 BDS-C Compiler

Having got Kermit running on the Lexitron CP/M my attention could turn to adding some more applications. The Lexitron does have the limitation that it uses an 8085 microprocessor and that rules out any apps that assume a Z80. This seems, for example, to include Turbo Pascal. The Lexitron also uses 35 track single sided drives; the space available is only 140kB which is tight.

BDS-C was written for the 8080 and doesn’t require a lot of disk space. The author’s website provides the software, sources, and various other files for the last version, 1.6. It also has a video where he talks about the history of the compiler and more:

https://www.bdsoft.com/resources/bdsc.html

i was able to transfer the files to Lexitron floppy disks by means of kermit. Once i had set up a disk with just the essential items it was good to go.

I started to punch in hello world and then realised that there were no braces {} on the keyboard. I eventually worked out that the ascii codes correspond to some unusual characters that the Lexitron uses so i just used them in place of the braces.

{ = §

} = †

Hewlett-Packard HP-85

HP called the HP-85 a calculator, but it was definitely a microcomputer.  It runs an HP designed Capricorn microprocessor at a seemingly slow 613kHz, but with native floating point operations it was excellent for scientific calculations.

Having had an HP-11C since my uni days, i have a soft spot for HP gear.  The computer itself was a quite a modest ebay purchase in about 2017, but i was aware when i bought it that it may be quite a project. 

It sucked me right in. There’s a lot of love out there for this machine and its brethren. Curious Marc has done as much as anyone to raise interest in this machine. There is a ton of data available from the HP Museum and more at the HP Series 80 website. There is also an email group. I found myself wanting to get the most out of it.

I replaced the tape drive capstan rubber and modified the capstan to accommodate QIC tapes, which are easier to find than the original DC100 tapes.  

At the back of the unit is an expansion bus that can accommodate I/O, RAM, and a ROM tray.  I added 16k RAM, HPIB, Serial, and PRM-85 ROM boards.  The PRM-85 mimics as many ROMs as i could have ever needed to poke into a ROM tray. 

I added an HP-IB printer and a serial plotter (recently a friend found the HP-IB version for me – thanks Mike).  I asked if anyone on the Australian Vintage Computers FB page might happen to have a drive unit – sure enough, Ben just happened to have one at very reasonable cost.  I really appreciate the help that people give me to get things going.

The icing on the cake was when another group member offered me a box of DC100 tapes.  Thanks, Chris.  I’m in the process of refurbishing them with new drive bands. Maybe i will be able to revert the tape drive.

These days, an EBKTS board is the go-to for these machines. It’s a brilliant solution to either get started or just to experience everything the machine offers without the hassle of quite complex repairs or tracking down hard-to-get expansion modules and peripherals. It serves up disks and tapes from solid state storage.

The EBKTS wasn’t available when i started, so i was forced to do some hard yards. I don’t regret that; the tape and floppy drives add a lot of character. I will get an EBKTS at some stage, but the aussie dollar is pretty awful at the moment.

HP-85 Inspection and Power

The machine was plug and play – apart from the well documented issues with the tape drive. The capstan rubber turns to mush and can easily destroy a tape.

Destroying tapes was not an immediate issue for me, as i had none. It would soon become an issue, though, because tapes were the only means available to me at the time to load and save programs.

On power up, the machine displays a cursor for the basic interpreter. It is happy to immediately evaluate an expression and display the result.

The cursor can be moved around the screen to edit and reuse text. The screen rolls up and down, displaying 16 of 64 stored lines. This makes it pretty easy to use the small screen.

Basic programs are entered in the normal way. Data can be printed to the screen or to the thermal printer.

Inside, the machine is a joy to behold, with lots of ceramic packaged ICs and a neat arrangement of the CRT, thermal printer and tape drive. Outside, the case is quite yellow, but brightening cases is low on my to-do list.

HP-85 Tape Drive

Browsing the web quickly revealed that DC100 tapes were scarce and unreliable, and it was widely recommended that the tape drive be modified to accept QIC tapes, which are not as ancient and a lot easier to procure. I placed an order for tapes and set about attempting both the necessary mods and the capstan repair.

The tape drive mod is described in detail here. It requires a change in one resistor to account for the slightly different magnetic properties of the tape. This was easy.

The mod also required the wheel to grow a little to account for the slightly different dimensions of the cartridge. This was hard. The last thing i wanted to do was to put the existing capstan in the hands of a tradesman because i feared for the rotary encoder.

Instead, i crafted a piece of plastic to glue to the top of the capstan. After a few tries, i got it to bond. I use the drive sparingly (i now have better alternatives), but the extension is still there many years later.

I worked through several versions of rubber replacement and eventually i had success with 6/9mm surgical rubber tubing.

Reliability is not great but, it is good enough to demonstrate operation. QIC tapes are tight in the drive slot, which makes them a little tricky to insert. I found that if i kept the front screws of the enclosure a little loose, it was easier to insert. Not great but acceptable. The alternative is probably a file.

Of course, once you have a tape drive and some viable tapes, there is the small matter of getting software on to the tapes.

HP-85 Disk Drive

The HP-85 tape drive was never going to be a daily drive proposition and the HPDrive emulator, good as it is, is a bit unwieldy for a convincing demonstration. I really needed (wanted?) a disk drive.

I kept an eye out for a disk unit.  They are usually very expensive and i’ve only seen them listed for sale in the states, from where the cost of postage is horrendous.  I did find a cheap 3.5” unit, but the thought of paying nearly $200 for postage prompted me to scream for help on one of the facebook groups.

To my surprise a gentleman Ben G happened to have a M82901 Dual Drive uniit out in a container at his property in NSW.  He was kind enough to send some pics, explain the unit’s shortcomings, offer it at nominal cost, and arrange for its dispatch. That was a generous thing to do.

When it arrived it was clear from some dents and gouges that it had landed very heavily at some stage.  Ben said that he’d recovered it from a gold recycler. 

There were rattles in the box and once opened some damage was apparent.  Both of the drives had parts of the plastic broken.  The interface card was only secured by a couple screws used to secure the circuit card on the right drive.  Not a great effort from HP really but I guess they weren’t planning on the unit being thrown on the scrap heap.

I attempted to glue things up but it will always be fragile. I pulled it all apart, cleaned it up, checked the supplies and put it all back together.

The drives are PC style double height double sided units. The heads were not moving easily so they needed some lubrication and bit more rough treatment to get them moving again. Once they were free, i connected them to a PC for alignment using ImageDisk.

One was pretty good on the PC but the other had some issues formatting; successful but with lots of retries so I subbed in a known good spare drive.

There’s a set of dip switches that set the HP-IB address.  The drives are referenced by “:D720” where the second digit is the HP-IB address and the third is the disk drive number. 

Format with:

INITIALIZE “<label>”,”:D720”

The drive unit failed to communicate.

Fortunately, the manual was available online and the unit has built in self tests.  It took a while to work out how the tests worked and they seemed to produce very erratic results.  It seemed to consistently show that the RAM test was failing so I ordered some new RAM.  128 byte static RAMs.

I also read back the ROMS using an EPROM programmer and that suggested that one ROM didn’t seem to be working. I scrambled to see if the binaries were online.  Fortunately there were.

The natural replacement would be 2716 EPROMS but I only had 2732 EPROMs.  They have a compatible footprint but with the upper half being the active portion.  My EPROM and cheap EPROM programmer did not play nicely together but eventually i convinced myself that i had two working EPROMs.

After spending a long time searching for a problem which turned out to be incorrect configuration, i was able to get all of the tests to pass with a known good drive.  That meant the controller was good.  Even better the unit worked with the HP-85!!

Neither of the two original drives wanted to play the game. I had a good look at the writes on the first drive.  Everything looked good except the signal on the top head was different to the bottom – about half the size.  That made me have a closer look at the head which I discovered had been damaged – it looked like a piece of ferrite was missing.

The other drive’s heads seemed ok, and I’d checked the first drive’s electronics pretty thoroughly, so I thought I might get a second drive working by swapping the electronics card.  That worked.

Sure enough the HP 85 could happily operate two drives.

The other original drive now has an electronics fault as well as a drive head fault! 

I needed some disks to try it all out.  The teledisk images I had seemed to often be for 3.5” drives and wouldn’t write to 5.25” disks.  Instead i used the HPdrive emulator and copied them across:

COPY “:D700” to “:D720”

It’s not fast.

I found many of the disks would not run unless labelled correctly.  The failing line of basic revealed the required label.

VOLUME “:D720” IS “STDPAC”

I could copy from the tape drive to disk:

COPY “:D700” to “:T”

HP-85 External Printer

I spotted an HP 82905 printer on ebay.  It was made by Epson. I’d never seen an HP-IB printer come up before, so I grabbed it.  I figured that it would be cheaper to run than the thermal printer.  I was hoping that it might be good for Centronics as well, but not so.

It needs the Plotter/Printer ROM, which I was surprised to find was not on my PRM-85 super ROM. See the post on the PRM-85.

The printer can be set to be the default printer:

PRINTER IS 701,80

where 7=GPIB and 01=GPIB address – set with DIP switches under secret panel on top of the printer.

I punched in the screen plotting program in Application Note: Copying CRT Graphics from the HP-83/85 to the 82905B.

HP-85 PRM-85

The HP-85 comes with a Tape Drive, a Thermal Printer, a CRT display, 16k of RAM, and Basic in ROM. Out of the box, there is no external I/O, but it does have a 4 slot expansion bus that can accept modules, of which there are many.

The expansion bus not only allows additional I/O to be added but also additional RAM and ROM. Probably the most important I/O to be added is a HP-IB interface to support connection to many peripherals and instruments.

The addition of ROMs allowed command set enhancements and in many cases the use of additional I/O or peripherals needed enhanced commands. eg the use of disk drives requires the addition of a mass storage ROM and an enhanced mass storage ROM. A plotter requires the addition of a Plotter/Printer ROM.

ROMs were sold individually and were plugged into a ROM tray that plugged into the expansion bus.

The exercise of finding the individual ROMs and the ROM tray requires deep pockets and patience. Noting that providing code in ROMs is fairly easy to do, it was a matter of time before an alternative solution appeared.

The HP computer community is awesome and some years ago a couple of gents (Bill Kotaska with support from John Shadbolt) developed an expansion module, PRM-85, that emulates a ROM tray.

I had gathered an HP-IB and serial cards, and I had a serial plotter and an HP-IB printer. I also wanted to be able to use HPDrive to emulate disk drives via the HP-IB interface, including SS/80 protocol. To achieve this, i needed the following ROMs:

  • EDISK (85B version – supports Extended Mass Storage
  • Mass Storage (85B version) – supports Extended Mass Storage
  • Extended Mass Storage – Supports SS/80 protocols
  • Input/Output – Supports HP-IB and Serial interfaces
  • Plotter/Printer – Supports plotter peripherals

All the ROMs have been captured and can be loaded into the onboard ROM.  I contacted Bill in 2018. They had done a small run the previous year and had one left, which I purchased for much less than the combined cost of the original tray and ROMs. The details are here. ROM info is here.

The “85A without EMS” uses the first ROM socket on the PRM-85. It uses the 8 predefined addresses below:

Jumper J10 Decoded
Contact#   ROM Address  ROM Name
---------- ------------ --------------------
  17       232 (E8 Hex) Advanced Programming
  18        40 (28 Hex) Assembler
  19       224 (E0 Hex) Service-85
  20         8 (08 Hex) Program Development
  21       208 (D0 Hex) Mass Storage
  22       176 (B0 Hex) Matrix
  23       192 (C0 Hex) Input/Output
  24       207 (CF Hex) Extended Mass Storage

But for the 85 to use SS/80 disk storage requires the “85A with EMS” Super ROM. This Super ROM replaces the Program Development ROM (08H) with the 85B EDISK ROM (D1H) and the Mass Storage (D0H) with the 85B Mass Storage ROM (also D0H). The address D1H requires DIP Switch 1 as it is not one of the predefined addresses.

Jumper J6/9/10 J6=1-8, J9=9-16, J10=17-24
Contacts  ROM Name
--------  ---------------------
 9 to 17  232 (E8 Hex) Advanced Programming
10 to 18  40 (28 Hex) Assembler
11 to 19  224 (E0 Hex) Service-85
 4 to 12  209 (D1 Hex) EDISK (85B version) - set address with first DIP Switch
13 to 21  208 (D0 Hex) Mass Storage (85B version)
14 to 22  176 (B0 Hex) Matrix
15 to 23  192 (C0 Hex) Input/Output
16 to 24  207 (CF Hex) Extended Mass Storage

The second ROM slot on the PRM-85 is available. It can take up to a 27C512 for 8 x 8k slots.  I had a 27C256 so that was 4 slots.  Practically, though, the only addresses left were the predefined 08H and the second DIP switch.

Active Enable  ROM Image Start Address (Hex) 
Signal (pin)   2764 27128 27256 27512
------------- ----- ----- ----- -----
Enable 0 (9)   XXXX  XXXX  XXXX  0000
Enable 1 (10)  XXXX  XXXX  XXXX  2000
Enable 2 (11)  XXXX  XXXX  XXXX  4000
Enable 3 (12)  XXXX  XXXX  XXXX  6000
Enable 4 (13)  XXXX  XXXX  0000  8000  =>Prog Dev (08H)
Enable 5 (14)  XXXX  XXXX  2000  A000  =>Plotter/Printer 
Enable 6 (15)  XXXX  0000  4000  C000
Enable 7 (16)  0000  2000  6000  E000

I could add the Plotter ROM (F0H) using the DIP switch and pop the Program Development ROM (08H) in next to it.

Jumper J7/8 J7=1-8, J8=9-16
Contacts        ROM Name
--------        ---------------------
4  to 20(J10!!) 8 (08 Hex) Program Development
5  to 13(J8)    240 (F0H)  Plotter/Printer  - set address with second DIP switch

I think i could probably add a couple more ROMs to the second EPROM. They could not be used at the same time as the Plotter/Printer ROM. The link from J7-5 to J8-13 would need to be changed and the second DIP switch changed to the appropriate address.

ROM Name               Number Switch settings
---------------------- ------ ---------------
Advanced Programming 2  231   11100111
Matrix 2                177   10110001
Plotter/Printer         240   11110000

HP-85 HP-IB & Drive Emulator

Having a computer that can write and read tapes is great but, that left the problem of getting software on to the tapes.

The HP-85 doesn’t have a lot of I/O built-in but, it does have 4 expansion slots that can accommodate various adapters such as HP-IB (GP-IB), serial port, and a ROM tray for expansion ROMs.  

The most popular technique for file transfer is to connect a disk drive to the HP-IB adapter.  I also considered using the serial port but, I wasn’t sure that it would work.

So I needed HP-IB adapter.  And, of course, to get a HP-IB adapter to work with a disk drive requires some expansion ROMs.  Actually, if it had been an HP 85B instead of an HP 85, they would have been built in.  It wasn’t though.

That meant I needed an HP-IB adapter, a ROM tray, and the various ROMs.  None of this stuff is easy to come by. I did find a few vendors in the US with most of the items – unfortunately at high cost, high postage, and low interest in going to any trouble. This led me to the PRM-85. See my separate post on this.

I found a GPIB card in Australia on ebay, so I grabbed it. 

There are not many computers that use HP-IB for their disk interface (the Commodore PET is one) so only an HP drive unit will do, and they are even rarer than DC100 tapes. 

The HP computer community is awesome, though.  Recognising that HP drives were becoming very rare, a chap from the HP 9845 project set about creating an emulator called HPDrive.

It runs on a PC with a GP-IB adapter installed, and it is particularly good. I followed the instructions at:

http://www.hp9845.net/9845/projects/hpdrive/

GP-IB cards are generally expensive but, fittingly for such a project, I found a reasonably priced National Instruments ISA card that seemed suitable (suitability is described in detail at the project site). 

Then of course I needed a computer with an ISA slot.  I had an old Windows 2000 machine stored in pieces that had a slot (I had some other older options as well) so I set that up with the downloaded disk images. I’m never short of a project.

And it just worked. To get the disk catalogue type:

CAT “:D700”

My notes were a bit sketchy about how i set this up so i recently fired it up again to gets some details. Unfortunately, part way through that exercise the PC motherboard developed a fault and i have not been able to resolve it. That means i will go through the exercise again sometime in the next couple of months!