Installing Unix V7M: Part II

The previous steps had left me with a working root/swap disk but, despite writing the rluboot boot block to it, this wouldn't yet boot. Specifically, the boot ROM told me there was no boot block on the disk, which I found a little odd as I'd verified the contents and the same set-up was working fine on SIMH. The difference must therefore be in the bootstrap code for the RL02 in the MXV11-B2 boot roms. The ROMs do feature the "LD" command for loading a (non-standard) boot block into memory, but the code bailed out when run from here. ODT-ing in an RL boot loader from the Internet didn't work either. In any case, a boot block which would work off-the-bat with my set-up would be the preferred solution.

Comparing a few different boot blocks from disks which did boot on this particular system, I found that all began with a NOP followed by a BR instruction. It turns out the boot ROM code uses this sequence to verify a valid boot block is installed. As the V7M boot block didn't start with this magic sequence (supposedly it was created before this "standard" was implemented) the ROM assumed the boot block was just random data. Maybe if I could get this sequence into the boot block it would be recognised and I'd be able to boot the disk without VTServer's help.

Just tacking on a few bytes to the start of the boot block isn't an option as it messes up all kinds of addresses coded into the program. The boot block would need to be reassembled with the NOP and BR in place. This took a few attempts as the V7M assembler doesn't appear to recognise "nop" as an instruction mnemonic. The assembler's error messages are, to put it politely, on terse side and you'll need the man page to decipher them. The confusion lead me on a wild goose chase for an undefined symbol which turned out to be caused by the "nop" itself. My work-around was to just pad out the code with an superfluous instruction with the same length as a NOP; an extra BR did the job perfectly. I then replaced the first word of the resulting boot block with 000240, the opcode for the NOP instruction, by hand.

The boot block checked out fine on the emulator, so it was time to test it on the real machine. But how was I going to get it on there? VTServer 2.x won't work with my RL02s and version 1.1 doesn't come with a stand-alone copy program - or does it? In the accompanying standalone code is a version of dd which can be used to copy virtual tape files straight to real devices. So it turns out I do have a version of VTServer which works with my RL02s - why am I just finding this out now!? I went ahead and compiled dd (if you need it, you can download it here) transfered it to the PC, and hung it in the VTServer configuration. A simple copy of 512 bytes to the start of the disk had the new boot block installed so it was, yet again, the grand moment of truth...

The PDP-11 was restarted and at the BOOT> prompt I ran the RL bootstrap. After a few flashes of the RL02's READY light, the mere sight of a single "#" let me know it was worth the work. This is of course the prompt of the second stage boot loader which was now running from the RL02 itself. Unix could now be booted straight form the disk:

#unix
 
 
 
unix/v7m 2.1
 
mem = 206208
#

It's also remarkable that, with this boot loader, it wasn't necessary to halt the system to get the kernel running, as was the case with the boot loader from VTServer 1.1. Should you find yourself in the same predicament, you can save yourself a bit of leg work by downloading the working boot block here. Although I still need to get the second RL02 working to finish things off, I've already created a disk image of /usr on SIMH which I should be able to transfer to an RL02 disk pack with the older version of VTServer, now that I have the all-important dd program.

Next: DEQNA Ethernet Interface: Part II >>