Compiling KLH10

From Computer History Wiki
Revision as of 08:06, 26 February 2012 by Lexthehex (talk | contribs) (Compiling KLH10 on Gentoo x86_64)
Jump to: navigation, search


This is a brief guide to compiling Ken Harrenstein's KLH10 PDP-10 emulator. It was written on an AMD64 Gentoo machine with 2GB RAM and gcc 4.5.3-r1. The author currently has a bad cold, so please excuse any mistakes/foolishness caused by light-headedness.

I was satisfied with using SIMH to run MIT's ITS operating system, but there was an annoying bug: the reported time of the system looped endlessly over three hours, and did not seem to keep proper time. Was the clock running too fast? It seemed to be okay, but something was amiss with the way that ITS reads the clock. In an effort to narrow down the cause, I decided to get KLH10 running and see if it exhibited the same problem. I have not found an answer yet.

Useful links: Viktor Björn's tutorial 'Some notes on setting up an ITS system'

This tutorial assumes that you are running a Linux system with a modern version of gcc. Some of these instructions will not apply to your system, or may differ. I am using a current Gentoo system, as of February 2012. The system has been configured as a 'multilib' configuration, with a mixture of 32- and 64-bit. By default, gcc compiles for 64-bit. (verify this)

Step 1: obtaining the KLH-10 source. There are two places that you can get the source, but I recommend using the Panda source, which you can download at [1]. As mentioned in Mr. Björn's tutorial, if you are using gcc 4.x or later (I am!) you need to apply this patch. I needed to apply some additional patches of my own - see later.

Step 2: unpack the source - easy: 'tar -xzf panda-dist.tar.gz'

Step 3: compile the source. Here's where I got lost. The instructions (panda-dist/klh10-2.0h/doc/install.txt) tell you to:

  1. Unpack the main distribution, and the auxiliary distribution (I didn't, as I don't need it yet).
  2. Configure for the native platform. Again, I didn't do anything here. Perhaps I should have.
  3. 'Build a KN10 from sources'. Here, I was stumped. Which sources? Where? How?

The example shows:

       $ cd <distrib>/bld/<platform>
       $ make base-kl          ;;; or base-ks or base-ks-its

On my system, '<distrib>' is 'klh10-2.0h' and '<platform>' is 'lnx86' (Linux, x86) - so, I did:

       $ cd klh10-2.0h/bld/lnx86

.. but was dismayed to find a solitary file in this directory:

       -rwxr-xr-x 1 lex root 70 Feb 21  2005 00build

This contains a 'make' command:

       make base-kl CONFFLAGS_AUX=-DKLH10_I_CIRC=1 LDFLAGS=-static

Predictably, executing it causes make to output an error, because there is no Makefile.

       make: *** No rule to make target `base-kl'.  Stop.

Eventually, I decided to copy the command from the '00build' file, but source the in the 'src' directory, two levels up (../../src/). This gave me this command:

       make -f ../../src/ base-kl CONFFLAGS_AUX=-DKLH10_I_CIRC=1 LDFLAGS=-static

I was happy that at this point, gcc compiled some code before aborting with a syntax error in ../../cenv.h. This was easily-fixed: edit cenv.h and find line 270.

       #   define _FILE_OFFSET_BITS=64 /* Use 64-bit file ops */

Change that to:

       #   define _FILE_OFFSET_BITS 64 /* Use 64-bit file ops */

I.e. change the '=' to a space.

Repeating the 'make base-kl ...' command should cause compilation to progress a bit further, before it aborts with an undefined reference to 'lites_init'. That function is in src/dvlites.c, and is an addition that the Panda team added: it sends the processor status over the parallel port, where it is displayed by a custom bit of hardware (a microcontroller, as designed by Spare Time Gizmos. I have almost all of the parts for this device, but alas! My computer doesn't have a parallel port, and no serial port either. I'll have to think of another way to display the CPU status, and I have thought of a few:

  1. Display the CPU status as a window on the screen.
  2. Send it to a file, or a pipe (to be interpreted by another application).
  3. Send it over the network, to be displayed by other hardware.
  4. Display it on standard PC hardware - e.g. the keyboard LEDs. Problem: there aren't many LEDs, and XKB might not take too kindly to my app stealing its control.

I've decided on '2' at present, but might do the window thing first, as I am trying to learn to program with SDL.

Back to the patching of the KLH10 code. My next edit was to add an 'extern int' declaration to src/klh10.c, edit src/dvlites.c and change '#include <asm/io.h>' to '#include <sys/io.h>', having determined that it's using the functions ioperm() and outb() to write to the parallel port.

I'll make these patches available once I have produced them; currently, I'm editing the files directly and have not made backups - having to sneeze/blow my nose every 2 minutes means that I am not able to concentrate very well.

The addition to klh10.c is at the top: find the section marked '/* Imported functions */' and add this line after the final 'extern int' of the block:

       extern int lites_init(unsigned int prt);

After one more command, the klh10 executable should compile.

       make -f ../../src/ base-kl CONFFLAGS_AUX="-DKLH10_I_CIRC=1 -DKLH10_DEV_LITES=1" LDFLAGS="-static"

You may not need the '-DKLH10_DEV_LITES=1' definition, as I added this while testing [note to self: tidy this document!].

Lexthehex 22:06, 25 February 2012 (PST)