VT1303 Transferring CP/M Files

After doing some reading, I thought that if I could transfer a hex file I might be able to transfer some more programs.  Once I had the hex file it could be converted to a binary using load.  Normally the transfer would be done with a serial port – but, alas, the lexitron doesn’t have a serial port.  The only input mechanism that I know of is the keyboard – and that would mean a lot of typing.

But – I have an Arduino keyboard scanner now – so that means that it can do the typing for me and a lot faster.  I arranged the code to read characters from the virtual serial port (over USB) – convert them to the keycodes – and then push them into a file using PIP.  There is no flow control, but I found that 4k could be transferred without triggering an awkward disk write.  That means breaking the files into 4k blocks and then reassembling them. Of course, you have to be mad.

First, you need the binaries.  In many cases, they are available.  In some cases, they are encapsulated in images. They can usually be extracted from images using CPMTools.

The executables need to be 8085 compatible – some CP/M programs (eg turbo pascal, I think) rely on Z80 instructions. 

They also need to be compatible with the lexitron “terminal” – which seems to be compatible with the Lier-Siegler ADM-3A. Some programs have an installer to set the terminal type. 

Once you have a suitable binary (and several may be required) then each has to be converted to 4k hex files, each of which is about 12k in size.  I wanted to do this on a Windows PC, so I used srecord-1.64-win32.

It’s easiest to do this in a batch file, eg this one for the Wordstar overlay:

srec_cat wsovly1.ovr -binary -crop 0x000000 0x001000 -offset  0x00100 -o wsov0.hex -intel -address-length=2 -output_block_size=16

srec_cat wsovly1.ovr -binary -crop 0x001000 0x002000 -offset -0x00F00 -o wsov1.hex -intel -address-length=2 -output_block_size=16

srec_cat wsovly1.ovr -binary -crop 0x002000 0x003000 -offset -0x01F00 -o wsov2.hex -intel -address-length=2 -output_block_size=16

srec_cat wsovly1.ovr -binary -crop 0x003000 0x004000 -offset -0x02F00 -o wsov3.hex -intel -address-length=2 -output_block_size=16

srec_cat wsovly1.ovr -binary -crop 0x004000 0x005000 -offset -0x03F00 -o wsov4.hex -intel -address-length=2 -output_block_size=16

srec_cat wsovly1.ovr -binary -crop 0x005000 0x006000 -offset -0x04F00 -o wsov5.hex -intel -address-length=2 -output_block_size=16

srec_cat wsovly1.ovr -binary -crop 0x006000 0x007000 -offset -0x05F00 -o wsov6.hex -intel -address-length=2 -output_block_size=16

srec_cat wsovly1.ovr -binary -crop 0x007000 0x008000 -offset -0x06F00 -o wsov7.hex -intel -address-length=2 -output_block_size=16

srec_cat wsovly1.ovr -binary -crop 0x008000 0x009000 -offset -0x07F00 -o wsov8.hex -intel -address-length=2 -output_block_size=16

srec_cat wsovly1.ovr -binary -crop 0x009000 0x00A000 -offset -0x08F00 -o wsov9.hex -intel -address-length=2 -output_block_size=16

srec_cat wsovly1.ovr -binary -crop 0x00A000 0x00B000 -offset -0x09F00 -o wsovA.hex -intel -address-length=2 -output_block_size=16

srec_cat wsovly1.ovr -binary -crop 0x00B000 0x00C000 -offset -0x0AF00 -o wsovB.hex -intel -address-length=2 -output_block_size=16

srec_cat wsovly1.ovr -binary -crop 0x00C000 0x00D000 -offset -0x0BF00 -o wsovC.hex -intel -address-length=2 -output_block_size=16

srec_cat wsovly1.ovr -binary -crop 0x00D000 0x00E000 -offset -0x0CF00 -o wsovD.hex -intel -address-length=2 -output_block_size=16

srec_cat wsovly1.ovr -binary -crop 0x00E000 0x00F000 -offset -0x0DF00 -o wsovE.hex -intel -address-length=2 -output_block_size=16

srec_cat wsovly1.ovr -binary -crop 0x00F000 0x010000 -offset -0x0EF00 -o wsovF.hex -intel -address-length=2 -output_block_size=16

Excel is a very handy tool for creating repetitive batch files.

Each hex file holds 4k of the binary but takes 12k of space to do it.  The offset in each file is 0x100 which is as expected by the cp/m load program.

The PC serial port (which is a virtual com port over USB) needs to be setup to talk to the teensy:

mode com3:baud=9600 parity=n data=8 stop=1 xon=on

Regardless of baud rate, the rate at which characters are sent to the 8085 has to be throttled in the teensy. 

At the lexitron setup to receive the file:

pip b:wsov0.hex=con:

At the pc copy the file to the serial port:

copy wsov0.hex com3

Once the transfer ceases, type Special Shift Z to terminate the transfer.

Then convert the hex to a binary

load b:wsov0

This will create b:wsov0.com

Repeat for the other hex files.

Once you have all the required files, they have to be re-assembled:

b:

a:pip wsovly1.ovr=wsov0.com[o],wsov1.com[o], ……… wsov8.com[o]

Do it in stages if the command line gets too big.  The hex files are big so will quickly fill a floppy disk, so delete them once converted to com. 

It’s very easy to make a mistake.  Stay alert!!

Using this technique I was able to transfer wordstar, zork, and some utilities.

I thought it may be possible to avoid all this by using the PIP block mode.  This would rely on the OS to stop accepting characters when they weren’t being used eg during a disk access.  Unfortunately, the OS accepts them and then throws them away.  It appears to be impossible to implement flow control at the keyboard interface, even though it is possible with the serial interface.

I found I could push files to 8k with 32 bytes per record.  I have written batch files to assist. 

VT1303 Screen Cataracts

It was a very long time (about three years) before I mustered the courage to tackle the CRT. My assessment of the implosion risk is that it is credible, and therefore should be treated with some caution.

I started by making a box to secure the CRT while I did the work. I then removed the CRT from the unit and mounted in the box. This protected it from the rough treatment that it was about to receive, and it would help contain material in the event of a mishap.

I’ve seen several approaches on youtube to cataract remediation.  Some people heat up the tube to quite high temperatures, which just looks too dangerous to me due to the significant possibility of uneven heating causing catastrophic failure. See:

https://www.videokarma.org/archive/index.php/t-184752.html

Others use a hot wire, which seems more reasonable.  I thought about cutting through with a high strength fishing line.

In the end I found the gel was quite soft and could be worked out with some plastic picnic knives.  It took a couple of hours and several broken knives to get it to a point where i could break the suction without risking the glass.

I expect the second layer of glass protected the CRT from user abuse, and perhaps gave some assurance that if the screen suddenly imploded, the user had some protection. I’m not totally convinced that the glass itself provided a lot of protection because it isn’t very thick, but it may be laminated. It does have a nice non-reflective surface though.

I think the gel was probably doing two things. Firstly, it attached the protective low sheen glass cover without any risk of dust between the two layers. I expect it was also part of the protection of the CRT from the user and vice versa. It would have been effective at absorbing energy and reducing the scattering of the front glass. Something akin to an air-bag.

I cannot think of a way to replace the gel, but i can at least replace the antiglare screen.

There is no such protection at the back of the CRT, so once the computer cover is off the risk is probably higher at the back than the front.

The CRT also has an anti-implosion band which was in good condition and i left it as it was.

After cleaning up the glass, I reattached the antiglare screen with double-sided tape.  Once in the machine, the anti-glare screen is against the enclosure. I will be treating the machine with some respect when moving it around.

Before putting the tube back in the machine, i put tape around the gap to seal it from dust.

Before and after:

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  

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 Serial Card

I feel like a computer is incomplete without a serial line, so i procured a HP82939A Serial Interface. It requires the I/O ROM for operation.

The serial properties are set by DIP switches inside the package, so it’s a screwdriver job.  I used 2400 baud, 8 bits, 1 stop bit, no parity. 

Then I set this back to defaults to appease the terminal program which insisted on factory defaults: 7 data bits, 1 stop, 300baud. 

I left the plotter at the original settings, so the initialisation program needs to program the serial port via CONTROL statements. (See I/O ROM Manual)

The device number is 10 which is the default.

It worked fine with the plotter.

The Data Communications Pac includes a terminal program, TERMEM.  The comms parameters can be changed via the soft keys.

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 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!

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 7470A Plotter

An HP 7470A plotter appeared on gumtree. It’s a serial version rather than the HP-IB version, but i thought i might be able to make it work. The bloke who sold it to me, Bob, was an absolute gentleman – even offering to turn up pen holders on his lathe!

It’s quite a simple little plotter that uses only two pens.

The plotter itself needed a drop of oil on the rail, but otherwise worked fine.

The manual lists the HP-IB version as the one to use with the HP-85, so I had a bit of reading to do to work out if it could work over the serial line. In principle, it could be done by directing the plotter output to the serial line:

PLOTTER IS 10

Many people have reported that this causes the HP-85 to just hang.  There was some suggestion that this was due to the serial version of the plotter sending just a CR rather than a CR/LF at the end of its transmission. (10 is actually set on the serial card.)

https://forum.vcfed.org/index.php?threads/serial-plotting-on-the-hp85.41043

The last post which came very late is key.

The plotter can be programmed to send a CR/LF.  I did the required reading and found that this worked:

PRINTER IS 10
PRINT CHR$(27);”.M;;;13;10:”
PLOTTER is 10

No hang!  I tried some test code and found that I could send HPGL and use the HP 85 plotter commands.  I didn’t have any success with the Graphics Presentation software on disk.  I suspect that it resets the interface.  There may be a workaround for that, but I’m not overly concerned.  I don’t mind writing a bit of BASIC to make the plotter do its thing.

I used 2400 baud, 8 bits, 1 stop bit, no parity as per the serial card.  This is done through DIP switches next to the serial connector.  The serial card and the plotter both had female connectors but the transmit/receive was reversed so I just used a M-M gender changer between them.

The plotter commands are the same as for the screen.  Using PLOTTER IS 10 points them to the plotter instead.

The HPGL codes are in the plotter interfacing manual. 

Comms are more reliable with flow control.  I’ve used xon/xoff a lot in the past – this sets up the machine and the plotter to use xon/xoff.

Xon/xoff at plotter – 7470A Interfacing and programming manual

PRINTER IS 10
PRINT CHR$(27);”.M;;;13;10:”
PRINT CHR$(27);”.I;;17:”
PRINT CHR$(27);”.N;19:”
PLOTTER is 10

Xon/Xoff at computer – 82939A Serial Port Manual

I changed the DIP switch settings on the serial card to suit the datacomms pac, so the settings for the plotter need to be programmed.

CONTROL 10,3 ; 11 ! 2400 baud
CONTROL 10,4;7 ! No parity, 2 stop bits, 8 data bits

The I/O ROM provides a command, TRANSLATE, which converts a program to play nicely with it.  Load the program (eg CALEND in the standard pac, and type TRANSLATE.  It can then be STORED as an external plotter variant. 

For the serial plotter, load and run the instructions above and then load and run the external plot variant.