Difference between revisions of "Running UNIX V6 on an -11/23"

From Computer History Wiki
Jump to: navigation, search
(For now, insts - will add links later)
 
(Larger main memory: Mention mesg oflo issue)
Line 120: Line 120:
 
IO = 177600
 
IO = 177600
 
</pre>
 
</pre>
 +
 +
You might also want to change this line:
 +
 +
<pre>
 +
printf("mem = %l\n", maxmem*5/16);
 +
</pre>
 +
 +
in main.c to this:
 +
 +
<pre>
 +
printf("mem = %l\n", (maxmem/16)*5);
 +
</pre>
 +
 +
to prevent overflow issues in machines with a lot of memory.
  
 
Edit the 'run' file that builds the system to use m23.o instead of m40.o, and that should do it.
 
Edit the 'run' file that builds the system to use m23.o instead of m40.o, and that should do it.

Revision as of 17:25, 5 February 2018

It is possible to run UNIX Sixth Edition on a PDP-11/23, although this is not a configuration supported 'out of the box' with the Version 6 distribution.

There are three issues which have to be addressed before V6 will run on a /23:

All of them are fairly simple to deal with, but they require minor modifications to the system, so you will need a running V6 to do these; bringing it under a simulator, e.g. Installing UNIX Sixth Edition on Ersatz-11, is therefore required.

Use the 'm40.s' machine language file, as the memory management supported by the /23 is the same 'simple' kind (i.e. without split I+D) as that on the PDP-11/40.

Switch register

V6 expects to see a switch register, and refers to it during booting to see whether to come up single-user or not.

The best general approach is to provide a 'software switch register'; a location in low memory whose contents are used as the switch register.

The following can be used to do so:

  • insert four lines into l.s (in the appropriate location in the source):
. = 50^.
.globl  _SW
_SW:    memcsw
memcsw: 173030 
  • change the last line of param.h to read:
extern	int	*SW;
  • add the following three lines to main.c (last two go just after

the check for the LTC)

#define SWREG	0177570

if (fuiword(SWREG) != -1)
	SW = SWREG;
  • then recompile sys4.c and prf.c, plus the two files above.

Clock

V6 requires either a KW11-L or KW11-P clock, and will 'panic' unless one or the other is found. The -11/23 does have a 60Hz clock, but... there is no control register. There are two ways to deal with this:

  1. Install a BDV11 card, which has a simulation of the KW11-L on it, or
  2. Modify the OS

To do the latter, in main.c, change:

			panic("no clock");

to:

			{
			lks = 0;
			printf("No clock?\n");
			printf("On an 11/23, turn on clock now.\n");
			}

and change the:

	*lks = 0115;

to:

	if (lks != 0)
		*lks = 0115;

NOTE: It is critical to turn off the system's clock (usually possible with a switch on the console) before and during booting, as a clock interrupt before UNIX is ready for it can trash the system (and has been observed to trash the disk, if you are really unlucky).

Larger main memory

All -11/23's after the (very rare) model A can support more than 256KB of main memory. If you put more than 256KB on an -11/23 and boot V6, it will ignore the extra memory above 256KB (technically, above 248KB).

That is because 22-bit operation must be explicitly enabled, using SSR3. So, make a copy of m40.s (m23.s seems the obvious name), and add the following:

	mov     $EN22BIT, *$SSR3	/ allow > 256KB

just before the

	inc	SSR0

You will also need to add:

SSR3	= 172516
EN22BIT	= 20

somewhere (probably at the end, with the other register definitions).

Finally, the PAR contents to reach the I/0 page are different in a 22-bit system from an 18-bit system, so change:

IO	= 7600

to:

IO	= 177600

You might also want to change this line:

	printf("mem = %l\n", maxmem*5/16);

in main.c to this:

	printf("mem = %l\n", (maxmem/16)*5);

to prevent overflow issues in machines with a lot of memory.

Edit the 'run' file that builds the system to use m23.o instead of m40.o, and that should do it.