COMPAQ DeskPro 386 ROMs
Originally, the oldest COMPAQ DeskPro 386 ROM I had was a
Rev J.4 ROM from a “Version 2” motherboard designed
in 1987, released in 1988, and purchased on eBay in October 2014.
And thanks to folks on the Vintage Computer forums, I was later able to add
Rev N.1 ROM from 1989 to this collection. And when I obtained a DeskPro 386/25 from eBay in March 2015, I was
able to add the
Rev K.2 ROM.
More recently (January 2018), I discovered that I still had a copy of the 1986
Rev F ROM, which I had made on
April 22, 1987, using one of the early DeskPro 386 machines that Microsoft had purchased for the OS/2 development team.
The only downside of my
Rev F ROM image is that it was dumped using the DOS
DEBUG utility, since I didn’t have
ROM reader hardware in those days. Fortunately, since I wasn’t sure how large the ROM actually was, I had dumped the
entire 64Kb from F000:0000 through F000:FFFF. As it turns out, that entire address range is actually write-protected
RAM (since RAM provided faster 32-bit access), where the first 32Kb contained a modified copy of the second. For example,
the first 32Kb contains some data structures that are updated by COMPAQ utilities such as
CEMM to record “Built-in Memory”
Sure enough, attempting to use the first 32Kb as a DeskPro 386 ROM generated a
“ROM Error”, no doubt due to a checksum mismatch. However, the second 32Kb appeared
to work fine. I can’t guarantee that its contents are identical to the original
Rev F ROM, since it was not a direct
copy of the physical ROM, but it’s all we’ve got. All our
EGA-based COMPAQ machine configurations have been updated to use that ROM.
This collection of COMPAQ DeskPro 386 ROMs still has several holes, but I’m very happy to have finally found one of the earliest (if not the earliest) ROMs commercially available for this line of COMPAQ computers.
System ROM Locations
COMPAQ DESKPRO 386 System Board Version 2 (Assembly No. 000558-001) U13 (EVEN) U15 (ODD)
System ROM Revisions
Rev Even ROM # Odd ROM # Size Date --- ---------- ---------- ---- ---- E 108285-001 108284-001 F 108328-001 108327-001 32Kb 1986-09-04 G 108328-002 108327-002 H.8 113270-008 113269-008 J.4 109592-001 109591-001 32Kb 1988-01-28 (from a 386/16 motherboard) K.2 109592-003 109591-003 32Kb 1988-05-10 (from a 386/25 motherboard) M.1 109592-004 109591-004 N.1 109592-005 109591-005 32Kb 1989-04-14
cd 1988-01-28 filedump --file=109592-001.hex --merge=109591-001.hex --output=1988-01-28.json
For a more human-readable dump, use the
filedump --file=109592-001.hex --merge=109591-001.hex --output=1988-01-28.dump --comments
And for those who want a binary file, the FileDump API can be used to recreate binary data from JSON data:
cd 1989-04-14 filedump --file=archive/109592-005.U11.bin --merge=archive/109591-005.U13.bin --output=archive/1989-04-14.rom --format=rom filedump --file=archive/1989-04-14.rom --output=1989-04-14.json
Dumping the ROMs
The .hex files for the 1988-01-28 DeskPro ROM were produced by running eeprom_read on a chipKIT Uno32 Arduino-compatible prototyping board, and capturing the serial port output on my MacBook Pro – as outlined in “Stick a Straw in Its Brain and Suck: How to Read a ROM” by NYC Resistor contributor phooky.
The DeskPro 386 ROMs were P27128A-2 chips, so I wired my Uno32 based on this 27128A datasheet – the closest match I could find online.
On my first dump attempt, every ROM address returned 0xFF. After looking at the 27128A datasheet more closely, I noticed the DEVICE OPERATION table indicated that, for a READ operation, /CE and /OE pins should be connected to INPUT LOW VOLTAGE, while the /PGM should be connected to INPUT HIGH VOLTAGE. So I wired pin 27 (/PGM) to +5V instead of GND, and the dump worked perfectly. The NYC Resistor article implied that every active low pin should be connected to GND, but apparently there are exceptions to that general rule.
Recreating ROM Source Code
In the current directory, an original ROM can be regenerated from the JSON-encoded file:
cd 1988-01-28 node ../../../../../../modules/filedump/bin/filedump --file=1988-01-28.json --output=1988-01-28.rom --format=rom
The ROM can then be fed into NDISASM, the disassembler included with NASM:
ndisasm -o0x8000 -se105h -se05ah -se6ffh -sf025h -sf8aah 1988-01-28.rom > 1988-01-28.asm
-o0x8000 argument is required to “org” the file at the proper starting address, but the
are optional; they simply establish a few sync points within the ROM image that save a little cleanup effort, by
preventing disassembly in the middle of instructions.
Next, the PCjs TextOut command, with the –nasm option, prepares the code for reassembly:
node ../../../../../../modules/textout/bin/textout --file=1988-01-28.asm --nasm > temp.asm mv temp.asm 1988-01-28.asm
The result, 1988-01-28.asm, after a small amount of manual cleanup, can now be successfully reassembled:
nasm -f bin 1988-01-28.asm -l 1988-01-28.lst -o 1988-01-28.rom
However, it does NOT produce a binary identical to the original ROM, in part because of instruction ambiguities (ie, instructions that can be assembled multiple ways). It’s possible the reassembled ROM may still work, but more research is required.
One interesting section of the COMPAQ DeskPro ROM is this string at offset 0xE002:
db 'AUTHORS CAB93GLB93RWS93DJC93NPB(C)Copyright COMPAQ Computer Corporation 1982,83,84,85,86'
which appears to list the initials of 5 authors: CAB, GLB, RWS, DJC, and NPB. The meaning of the “93” sequences is unknown; they may have simply been a form of obfuscation.