Reading a VAXstation 3100 ROM

I’ve had a VAXstation 3100 M38 sitting in my flat for years, but it doesn’t quite work. I’ll write up the repair process elsewhere, but as part of troubleshooting I decided to see what’s on some of the ROMS.

There are two M27C1024 chips installed on the main board. These are STMicroelectronics chips, both 1Mbit EPROMs. Reading them on Minipro produced an interesting error:

pwh@angel:~/src/minipro$ ./minipro -p "M27C1024@DIP40" -r rom2.bin -y
WARNING: Chip ID mismatch: expected 0x20008C00, got 0x20FF8CFF (unknown)

Maybe this is a DEC variant. Throwing caution to the wind, I re-ran Minipro with the -y switch to ignore the error. This produced a 131,072 byte file for each chip, which is correct for a 1Mbit IC because 131072 bytes is 1 megabit.

The contents of the files were all over the place – nothing stood out as text except for this:

) ns Fn
s uie mae) 1Desc 9)taan
Dts (hwz) 10Nerlds 3Enis 1)or
) glh rishri) 1 Ptu
s 5Es
o 3)uo
) anis 1 Sns
) anisCadi) 1 Vam

If you’ve used a VAX before, you might recognise that this looks a little like the language selection menu:

0) Dansk                      8) Français (Suisse Romande)
1) Deutsch                    9) Italiano
2) Deutsch (Schweiz)         10) Nederlands
3) English                   11) Norsk
4) English (British/Irish)   12) Português
5) Español                   13) Suomi
6) Français                  14) Svenska
7) Français (Canadien)       15) Vlaams

Since this is the second ROM of a pair, let’s look at what the first contains:

0Dak 8)raai(SssRond
) uth Ilio
2)euchScei ) dean
) glh 1 Nsk 4Enis(Bti/Ish 2)orgu
) pal 1 Smi 6Fr
a 4)veka 7Fr a
(naen 5)las

If we take two bytes from one ROM, and two bytes from the second ROM, we can take a guess as to how the image is laid out. The characters “En” are from the the second ROM, “gl” from the first ROM, “is” from the second ROM, “h ” from the first ROM, and so on.

If it sounds like madness, but the datasheet makes it clear why:

It is ideally suited for microprocessor systems requiring large data or program storage and is organized as 65,536 words of 16 bits.

This handy bit of Python code will reassemble the data by reading two bytes from one file, two bytes from the second and so on:

#!/usr/bin/env python
#  Read the content of two files and output an interleaved file

from pathlib import Path

FILE_A = './rom1.bin'
FILE_B = './rom2.bin'

if Path(FILE_A).stat().st_size != Path(FILE_B).stat().st_size:
    print('Files differ')

fileA = open(FILE_A, 'rb')
fileB = open(FILE_B, 'rb')

data = b""

for n in range(Path(FILE_A).stat().st_size):
    data = data +
    data = data +

f = open('./out.bin', 'w+b')

How do we know it’s worked? Simple – the content of the binary file is exactly the same as the original KA42B firmware!