This Web page last updated date Apr 24 2018. I obtained some PDP-8/A chassis and power parts in May 2015, examined, cleaned, painted, tested and repaired them. Other Web pages linked from that page, discuss various repairs. On this Web page, I discuss working with the M8317 multifunction card's boot PROMS; and the work done by others on PDP-8 boot PROMs. My thanks to David Gesswein, who supported my 8/A repairs and who provided PROM dumps of his 8/A PROMs and discussed how to generate new PROMs. Also thanks to Anders Sandahl who discussed his 8/A PROM work and tools with me in 2018. - Herb
See my other DEC minicomputers as listed on my DEC Web page. To email me, see see my ordering Web page for my email addresses.
Introduction
Background
Documents
Summary
Interpreting the 8/A boot PROMS: PROM configuration
Interpreting the 87A2 & 88A2 PROM descriptions in 8/A User's Manual
Interpreting 87A2 & 88A2 PROMs in 8/A Engineering Documents
158a2 & 159a2 PROM dumps by David Gesswein
INterpreting 158a2 & 159a2 PROM in the 8/A User's manual
Interpreting 158a2 & 159a2 PROM dumps from David Gesswein
Decoding the 8/A boot PROMS by Anders Sandahl
The point of this Web page, is to display the work I did on understanding the bootstrap PROMS on the M8317 PDP-8/A option card. Why understand them? To make copies for my use! To know how to use them. And to confirm the copies are "correct" - these PROMS are not mere data-in-memory like program PROMS use in post-microprocessor era computers, they are little bits of logic. The PROMS themselves are obscure early 1970's technology as described in the introduction. In the 20th century digital logic manner, I show my work so I and others can confirm results and use them for further benefit.
PLease point out any errors, corrections or additions. If you find this page useful, contact me. Thank you. - Herb Johnson
The M8317 option board #2 for the PDP-8/A includes a pair of 256 by 4 bit PROMS. On my card, they are located at E82 and E87. (In the photo, the two chips centered on the bottom row.) These contain power-on jump and bootstrap code sequences for various PDP-8 devices. Also, pages 6-55 and furthre in the 8/A User's Manual. These are available from various online archives of PDP 8 documents.
The configuration of these 4-bit PROMs is not like PROMS used in later microcomputers, where ROM memory resides in processor instruction addressing. These PROMS are a kind of micro-code, instructions about loading their content into available memory - thus they require working RAM to operate. As these are 4-bits wide, and the PDP-8 instructions are 12 bit, for each four "nybbles" of ROM there's four bits for directing operations: load address, load page (extended address), deposit, and start. These patterns are encoded across both ROMS, they are read as pairs. So, to interpret the contents of these PROMS, from a perspective decades later, is challenging.
Another challenge is the PROMS by brand and model. These are TTL fusable or fuse link PROMS. To program, they require sufficient current pulses to blow internal fuse links. MOst UVPROM programmers don't know what to do with these devices. Reading them can be as simple as providing a TTL address and some LED's to look at outputs; writing to them involves simple circuits but thoughtful design. I discuss fuse-link PROMS on another Web page. They were common to 1970's minicomputers, microcomputers as logic elements - the 8/A uses a few others for that purpose.
The PDP-8/A I own, contains proprietry PROMS and not DEC PROMs. To use DEC PROMS, I'll have to copy them from another machine, and David Gesswein kindly provided a copy of his DEC PROMs. But making sense of them, confirming they are correct copies, and understanding how they work to use them, obliged me to do the work shown on this Web page.
ROMS part number 23-084A1, 23-086A2, 23-087A2, 23-088A2, are dump-listed in the 8/A Engineering Drawings as "ROM Pattern Spec." sheets. There's also descriptions "ROM Prog. Directions" for 8/a Option Board #2 M8317-YA. The 23-086A2, is a PROM used for decoding logic operations, it is not a boot PROM; the 087 and 088 are bootstrap PROMs.
The PDP 8/A User's Manual, section 6, describes the details of the PROM configuration and how they are loaded into memory based on selections made on a DIP switch on the M8317 board. It's like the instructions in the Engineering Drawings. That's followed by listings of sets of bootstrap PROMs for PROMS labled 87A2 and 88A2, and labled 158A2 and 159A2. DEC's part number 23-000A8 is a blank PROM.
After reviewing the PDP 8/A Engineering and Users Manual documents, I read their descriptions of how the pair of 256 X 4 PROMS were operated by the M8317 Option board. They are not literally read as software in memory; the ROMS have encoded commands to direct the M8317 to perform load address or load data instructions into writable memory and to execute those operations. The two 4-bit PROMS are read alternately, as directed by switch-settings on a DIP switch, to perform either auto-start or bootstrap-loading. I describe the scheme under "PROM configuration" on this Web page.
The documents provide descriptions of the contents of some DEC PROM-sets.The 87A2 and 88A2 is one set, and 158A2 and 159A2 is another set. Both the Engineering documents and the Users documents, describe the ROM encoding and command scheme, in similar ways. But they show the ROM contents in two different ways - neither are literal "dumps" of each ROM. As the 87A2 and 88A2 set are in both documents, I chose to "interpret" and "decode" each of those, to compare and verify my understanding of the ROM's encoding and operation. I hand-decoded these for the first 32 decimal (40 octal) PROM locations. IN these M8317 PROMS, the first 20 octal (16 decimal) locations are "autostart/reset vectors" which load an address and extended address and then jump there; the remaining PROM locations are sets of bootstrap instructions (which are selected by the M8317 DIP switch) to load and then execute at selected memory locations.
Results for the 87A2 and 88A2 from two document sets, are shown on this Web page, as Interpreting the 87A2 & 88A2 in the User's Manual and Interpreting 87A2 & 88A2 in the Engineering Documents. The results were similar but not identical - which simply means the two documents I obtained were of different releases or revisions.
The PROMs of interest to me, are from David Gesswein's PDP-8/A, labled 158A2 and 159A2. He generously pulled them from his board and read them on a PROM reader, described on this web page as 158a2 & 159a2 PROM dumps by David Gesswein. The Intel hex record format is described, and I show how to "merge" the two files - which I did by hand for 16 decimal bytes.
Then, I interpreted both the 158A2/159A2 PROM dump from David, and a similar description for them in the 8/A user's manual, in the same ways as demonstrated for the 87A2/88A2 sets. I describe INterpreting 158a2 & 159a2 PROM in the 8/A User's manual in one section on this page, and Interpreting 158a2 & 159a2 PROM dumps from David Gesswein in another section. The results for the first 40 octal (32 decimal) sets of instructions are similar but not identical - again as with the other PROM set, there's some variation.
I"ll wrap up this work, by producing a complete interpreted set of 158A2/159A2 operations from David's PROM dump. He also has a dump from other non-DEC PROMs. If i choose to automate the interpretation and decoding, then I'd have the tools to process those and other PROMS more conveniently.
On the M8317-YA, the boot PROMs are referred to in the DEC literature as ROM#1 in socket E82, ROM#2 in socket E87. (Other versions of the M8317 may place these elsewhere.) THere's a number of PROM sets that DEC provided, and OEM's produced other sets. My interests are in the DEC PROMS labled 158A2 (#1) and 159A2 (#2), which provide bootstraps for paper-tape devices and loading the RIM loader from the serial console port. DEC's documents also describe a set of ROMS labled 87A2 and 88A2. For me to verify I understood the PROM configuration, I decoded information for both sets of PROMS.
The PDP 8/A User's Manual, section 6, describes the details of the PROM configuration and how they are loaded into memory based on selections made on a DIP switch on the M8317 board. I'll not describe the switch settings. The pattern of ROMs #1 and #2 in memory are accessed as sketched below. ROM #1 is read as a high nybble, ROM #2 as a low nybble, in address sequence, for 8 bits; the next address in each ROM forms the lower 8 bits, of what amounts to a control and data "word" - 4 bits of control, 12 bits for a PDP 8 address or data.
addr 0 rom 1 X | rom 2 C addr 1 rom 1 B | rom 2 A addr 2 rom 1 X | rom 2 C addr 3 rom 1 B | rom 2 A So each four nybbles forms a 16 bit value XCBA; XCBA; etc. where X is a control nybble load addr/load ex addr/dep/st in that order: load address operation load extended address operation deposit operation start address operation and CBA is a 12 bit PDP8 instruction or data or address. note: I think the extended address has a 3-bit offset, so page 1 would be octal 0010, page 2 0020, etc.
There's an additional encoding. The first 17 octal sets of contents, are used for autostart or reset operations. They are in a simple pattern of load address, then loas extended address and start, as what amounts to eight "reset vectors". I believe one of these is selected by the DIP switch; or none if autostart is disabled, another DIP switch setting. So "bootstrap" instructions begin at octal 20 in the PROM-pairs.
The PDP-8/A User's manual section 6, describes the programming pattern methods, and then lists the contents of the PROM pair 87A2 (ROM#1) and 88A2 (ROM#2). As described above, these are read alternately to form 16 bit words, with four leading bits for address or deposit or start operations; the 12 remaining bits are the data for an address or instruction or data to be deposited in the selected memory.
The table below, shows on the left side the ROM address, supposed octal memory address to deposit into, the contents (the lower 12 bits, in octal) to be deposited or addressed, and comments - as listed in the User's manual. The column on the right, "my guess", is what I believed would be the binary encoding across the two PROM pairs - which is split between the PROMS as described on this page.
Rom mem cont comments MY GUESS adr adr octal hex 0 0000 0000 auto/rst load adr 0 8000h 1 2 0000 0000 auto/rst field adr 0/start 5000h 3 4 0200 0200 auto/rst load adr 0200 8080h 5 6 0000 0000 auto/rst field adr 0/start 5000h 7 10 2000 2000 auto/rst load adr 2000 8400h 11 12 0000 0000 auto/rst field adr 0/start 5000h 13 14 4200 4200 auto/rst load adr 4200 8880h 15 16 0000 0000 auto/rst field adr 0/start 5000h 17 20 7737 7737 load addr 7737 8FDFh 21 22 0000 0000 load field 0 4000h 23 24 7737 6014 dep 6014 0010110000001100 2C0Ch 25 26 7740 3376 dep 3376 0010011011111110 26FEh 27 30 7741 7326 dep 7326 0010111011010110 2ED6h 31 32 7742 1337 dep 1337 0010001011011111 22DFh 33 34 7743 2376 dep 2376 0010010011111110 24FEh 35 36 7744 5341 dep 5341 0010101011100001 2AE1h 37 40 7745 6011 dep 6011 0010110000001001 2C09h
The PDP-8/A Engineering docs provide a listing of three PROMs. One of them , 23-086A2, is used for logic operations and is not relevant at this point. The others are part number 23-087A2 ROM #1, and part number 23-088A2 ROM #2. Each PROM is "dumped" to show its contents in address order, as four binary bits and two octal values.
As described above, the 4-bit PROMS are read alternately by the M8317, to form 16 bit words, with four leading bits for address or deposit or start operations; the 12 remaining bits are the data for an address or instruction or data to be deposited in the selected memory.
In the table below, the first (leftmost) column is the PROM address. the next two columns show the binary 4-bit values from that address for the 87A2 and the 88A2. Read horizontaly, these form the first 8 bits of the operation read by the M8317 hardware. Likewise, the next row represents the next 8 bits. Together, they form the 16 bits of control and data for the first ROM instruction.
The next column is the "execution address" representing that 16 bit value; and the next column shows the hexadecimal value. Note these occur every other row, of course.
The column on the right, "octal result", is my interpretaton of that 16-bit binary encoding across the two PROM pairs. Compare these results, with the similar table and interpreted results as read from the 8/A User's Manual, also on this Web page.
Note that the first 17 octal ROM locations, are uses as what amount to "autorestart jump vectors" and have a consistent pattern of load address followed by load extended address and start. The M8317 has a DIP switch to direct autostart to one of these locations, or to choose none and instead choose one of the bootstrap loaders which follow at address 20 octal.
ROM #1 and ROM #2 form these binary instructions 87A2 88A2 octal binary bin exec hex octal result addr data data addr instruction 0 1000 0000 0 8000 load adr 0000 1 0000 0000 2 0101 0000 1 5000 load ext 0000 / start 3 0000 0000 4 1000 0000 2 8080 load adr 0200 5 1000 0000 6 0101 0000 3 5000 load ext 0000 / start 7 0000 0000 10 1000 0100 4 8400 load adr 2000 11 0000 0000 12 0101 0000 5 5000 load ext 0000 / start 13 0000 0000 14 1000 1000 6 8880 load adr 4200 15 1000 0000 16 0101 0000 7 5000 load ext 0000 / start 17 0000 0000 20 1000 1111 10 8FDF load adr 7737 (hi/lo paper) 21 1101 1111 22 0100 0000 11 4000 load ext 0000 23 0000 0000 24 0010 1100 12 2C0C dep 6014 25 0000 1100 26 0010 0001 13 21FE dep 0776 (different) 27 1111 1110 30 0010 1110 14 2ED6 dep 7326 31 1101 0110 32 0010 0010 15 22DF dep 1337 33 1101 1111 34 0010 0100 16 24FE dep 2376 35 1111 1110 36 0010 1010 17 2AE0 dep 5340 (different) 37 1110 0000 40 0010 1100 20 2C09 dep 6011 41 0000 1001 42 0010 1010 21 2AEE dep 5356 43 1110 1110
David provided me with dumps of his two M8317 PROMS, labled 158A2 and 159A2. This section describes how to read off those hex dumps into the instruction format as interpreted by the 8/A.
Hex dump of 158A2 PROM
Hex dump of 159A2 PROM
As he described: "They were read with a Data-IO Unisite. Checksums are checksums reported by the Unisite. .bin is binary file and .hex is Intel hex32. These are the standard PDP-8/A boot proms. I found Intersil 5603A and Signetics 82S126 PROMS in the [M8317] boards." David had some difficulties with a clean read and binary of the PROMS, so I've corrected his Intel Hex files to remove irrelevant content.
Processing the Intel Hex record format of both PROMS :1000000008000500080805000800050008080500AC nccaaaattddddddddddddddddddddddddddddddddss aaaa - data address dddd... - 10 hex bytes of data, but the upper four bits are 00 (four bits PROMS) Since the PROMS are read alternately, the nybbles must be combined alternately: PROM 158a2.hex has first 10 data bytes: 08000500080805000800050008080500 PROM 159a2.hex has first 10 data bytes: 00000000000000000400000008000000 So mixing the two becomes: 0800 - first two low order nybbles from 158a2, 159a2 0000 - next two, and so on 0500 0000 0800 0800 0500 0000 0804 0000 0500 0000 0808 0800 0500 0000
The above 16-bit words, represent the four control bits and 12 data/address bits which the M8317 bootstrap and auto-start hardware reads. This is described elsewhere on this page.
In the 8/A User's manual table 6-7, are descriptions of the 158a2 & 159a2 PROMs. Below is my representation of that table, plus what I call "my guess" as to the 16 bit hexadecimal representation of those operations, as read from those two PROMs. Other parts of this Web page, show how to split those hex values between the ROMS. Another part of this Web page, shows how to construct the 12-bit octal value of address or data, and the upper 4 bits which direct the M8317 to perform the load address, load field (extended address), deposit, and start operations.
Note that the first 17 octal ROM locations, are uses as what amount to "autorestart jump vectors" and have a consistent pattern of load address followed by load extended address and start. The M8317 has a DIP switch to direct autostart to one of these locations, or to choose none and instead choose one of the bootstrap loaders which follow at address 20 octal.
ROM #1 & #2, 158A2 and 159A2 Rom mem cont comments MY GUESS adr adr octal hex 0 0000 0000 auto/rst load adr 0 8000h 1 2 0000 0000 auto/rst field adr 0/start 5000h 3 4 0200 0200 auto/rst load adr 0200 8080h 5 6 0000 0000 auto/rst field adr 0/start 5000h 7 10 2000 2000 auto/rst load adr 2000 8400h 11 12 0000 0000 auto/rst field adr 0/start 5000h 13 14 4200 4200 auto/rst load adr 4200 8880h 15 16 0000 0000 auto/rst field adr 0/start 5000h 17 20 7737 7737 load addr 7737 8FDFh 21 22 0000 0000 load field 0 4000h 23 24 7737 6014 dep 6014 0010110000001100 2C0Ch 25 26 7740 3376 dep 3376 0010011011111110 26FEh 27 30 7741 7326 dep 7326 0010111011010110 2ED6h 31 32 7742 1337 dep 1337 0010001011011111 22DFh 33 34 7743 2376 dep 2376 0010010011111110 24FEh 35 36 7744 5341 dep 5341 0010101011100001 2AE1h 37 40 7745 6011 dep 6011 0010110000001001 2C09h
From David Gesswein's dump of his 158a2 & 159a2 PROMs, I've constructed the table below. Another section of this Web page, describes how the two 4-bit PROMS are read alternately, to form four 4-bit or one 16-bit "instruction" as I've listed below. That instruction becomes four upper bits of load address, load extended address, deposit and start bits; plus 12 bits which are the associated address or instruction loaded. ROM #1 and ROM #2 then become these binary instructions, very similar to the 87A2 and 88A2 listings in user's manual (and described on this Web page.)
Note that the first 17 octal ROM locations, are uses as what amount to "autorestart jump vectors" and have a consistent pattern of load address followed by load extended address and start. The M8317 has a DIP switch to direct autostart to one of these locations, or to choose none and instead choose one of the bootstrap loaders which follow at address 20 octal.
158A2 159A2 octal binary bin exec hex octal result addr data data addr instruction 0 1000 0000 0 8000 load adr 0000 1 0000 0000 2 0101 0000 1 5000 load ext 0000 / start 3 0000 0000 4 1000 0000 2 8080 load adr 0200 5 1000 0000 6 0101 0000 3 5000 load ext 0000 / start 7 0000 0000 10 1000 0100 4 8400 load adr 2000 11 0000 0000 12 0101 0000 5 5000 load ext 0000 / start 13 0000 0000 14 1000 1000 6 8880 load adr 4200 15 1000 0000 16 0101 0000 7 5000 load ext 0000 / start 17 0000 0000 20 1000 1111 10 8FDF load adr 7737 (hi/lo paper) 21 1101 1111 22 0100 0000 11 4000 load ext 0000 23 0000 0000 24 0010 1100 12 2C0C dep 6014 25 0000 1100 26 0010 0110 13 26FE dep 3376 27 1111 1110 30 0010 1110 14 2ED6 dep 7326 31 1101 0110 32 0010 0010 15 22DF dep 1337 33 1101 1111 34 0010 0100 16 24FE dep 2376 35 1111 1110 36 0010 1010 17 2AE1 dep 5341 37 1110 0001
Anders Sandahl contacted me in April 2018 about his work as follows:
I found your page about decoding PDP-8A boot PROM's while I was looking after some info about which PROM I could use as replacement for the ones that I got now. Good info!
Background; I restored a PDP-8A/420 a few years ago. That machine actually ended up as a PDP-8A/620 with a KK8E and extra everything (including [the extended arithmetic boards for] EAE).
Then I got some parts over and I was given a small 8A/100 chassis. So I decided to build another 8A from the pieces. I also intend to boot from the os8 diskserver that Kyle Owen made. For this I need to make bootroms (since I don't want to toggle in the bootstrap every time).
So, I'll create new PROM images with the bootstrap for the serialdisk server. To verify the images before I burn them to real ROM's, I wrote a small c-program that decodes the ROM-contents. I ran it on the 8/A boot PROM images at bitsavers.org and the results look as expected.
Later:[Here] is a little c-program and a makefile which compiles under Linux. Feel free to put it anywhere, I will put it on my page as well. I've created a restoration page about my 8A/100. I've [also] sent decoded dumps of the PROMs above. I also got some unknown PROM's with the M8317 board that I bought for this machine. I've dumped and decode them as well. - Anders
15xA2 bitsaver PROMs
46xA2 bitsaver PROMs
1287xx PROMS on the M8317 I bought. - Anders