DEC社 TOPS-20を使う方法 KLH10エミュレーター導入編

DEC System-20

DEC System-20


【2023/12 追記】AMAZONから『超マシン復活 #1 ~ #5』を出版しました。



Pi Desktop X86でTOPS-20

2018年1月、歴史的に貴重なDEC社 TOPS-20を使うためにKLH10エミュレーターをLinuxにインストールしました。

KLH10エミュレータのソースコードをLinuxOSでビルドします。LinuxOSであれば比較的簡単にビルドできます。

私の手持ちのLinuxマシンから、Raspberry Pi Desktop X86(DEBIAN STRETCH)をインストールしたPC(CPU:Atom Z520)を選びました。Raspberry Pi Desktop X86は、ラズベリーパイ用OSのRaspbianと同じ環境のx86 PC用のOSです。

PCに Raspberry Pi Desktop X86 (DEBIAN STRETCH)をインストールした

今回は、x86 PCを使用しましたが Raspberry Pi2でもDEC社 TOPS-20は動作します。

「れがしーなOS達ラズベリーパイで試す DEC社 TOPS-20」という本は、DEC社 TOPS-20をRaspberry Piで実行する方法について書いてあります。

れがしーなOS達ラズベリーパイで試す DEC社 TOPS-20

DEC社 TOPS-20とは

TOPS-20はDEC社 System-20用のOSで、私が大学生のときに使用していた素晴らしいOSです。

タイムシェアリング方式のコンピュータ

DEC社といえば、1970年代に人気となった16ビットミニコンPDP-11を知っている技術者が多いかと思います。

DEC社 System-20は、36ビットメインフレームのタイムシェアリング機 PDP-10 の系列です。KL10とかのプロセッサ名について調べてみました。

プロセッサ モデル
KA10
KI10 10xx
KL10 Model-A 10xx : DEC System-10 TOPS-10
20xx : DEC System-20 TOPS-20
KL10 Model-B 2060 : DEC System-10 TOPS-10
2060 : DEC System-20 TOPS-20 v4.1
KS10 Model-A 2020

10xx/20xxモデルの両方でTOPS-10/TOPS-20のオペレーティングシステムが実行できます。同じKL10プロセッサでも2060で仮想アドレス空間に関する命令セットを変更したので、Model-A と Model-B は全く別のCPUとなります。TOPS-20 v4.1以降は、Model B プロセッサでだけ動作します。

1976年に京都産業大学が導入したコンピュータは、DEC社のSystem-20(DEC-2040)でした。翌年には、さらに上位のSystem-20(DEC-2050)にリプレースしました。私が大学生のときに使った TOPS-20は、KL10プロセッサ Model-Aを搭載していたわけです。

シミュレーターについて

TOPS-20を使用するためのシミュレーターについて調べてみるといくつか候補がありました。

simh マルチシステムシミュレーター

まず定評あるsimhシミュレーターがあります。

SIMHシミュレーター

SIMHシミュレーター

simhは 「The Computer History Simulation Project」が開発しているWindows向けシミュレーターです。シミュレーターでCP/Mを実行したときに使用しました。

懐かしいCP/MをSIMHシミュレータで実行

simh implements simulators for:
Digital Equipment Corporation
PDP-1, PDP-4, PDP-7, PDP-8, PDP-9, PDP-10, PDP-11, PDP-15, VAX

PDP-10も動作します。

しかし、「れがしーなOS達ラズベリーパイで試す DEC社 TOPS-20」という本に気になることが書いてありました。

今までの本では simhシミュレーターを使っていましたが、最新のTOPS-20 v7.0が動かないため、今回は Kenneth L.Harrenstien氏のKLH10(KL10BおよびKS10プロセッサをエミュレート)というエミュレータを利用します。

どうやらsimhは、KS10プロセッサ Model-Aをシミュレートしているようです。従って、TOPS-20 v4.1以降(最新は v7.0)を走らせることはできないということみたいです。

KLH10エミュレータ

KLH10エミュレータというのがあります。

KLH10 Emulator

KLH10 Emulator

TOPS-20 Operating Systemの説明の中で紹介しています。

TOPS-20 Operating System

TOPS-20 Operating System

For TOPS-20 enthusiasts, the best emulator is called KLH10, written by Ken Harrenstien (now at google). It’s an amazing piece of software, accurately reproducing not only the KL10 processor but also several of the complicated DEC I/O devices, including the dpni20 Network Interface Card. Unfortunately, the KLH10 emulator currently runs only on UNIX systems (Ken ported it to many flavors of UNIX, incl. Linux) but not on Windows.
(中略)・・・
Using this KLH10 emulator, Mark Crispin created the Panda TOPS-20 distribution, another milestone. This distribution provides an easy way to run your own full-blown TOPS-20 system, including TELNET logins, at speeds many times the original DEC hardware. I also added the Panda Display Panel for the KLH10 emulator.


【要約】
TOPS-20愛好家のために、Ken Harrenstien(現在google)によって書かれた最高のエミュレータはKLH10と呼ばれています。エミュレータは、KL10プロセッサだけでなく、dpni20ネットワークインターフェイスカードを含む複雑なDEC I/Oデバイスのいくつかを正確に再現する素晴らしいソフトウェアです。 残念ながら、KLH10エミュレータは現在、UNIXシステムでだけ動作しています(KenはLinuxを含む多くのUNIX製品に移植しましたが、Windowsでは使用できません)。
(中略)・・・
このKLH10エミュレータを使用して、Mark Crispinは別のマイルストーンであるPanda TOPS-20ディストリビューションを作成しました。 このディストリビューションは、元のDECハードウェアの何倍もの速度で、TELNETログインを含む本格的なTOPS-20システムを簡単に実行する方法を提供します。 また、KLH10エミュレータ用のPanda Display Panelも追加しました。

 

ここで紹介している Mark Crispin氏の Panda TOPS-20 distributionが良さそうです。先の「れがしーなOS達ラズベリーパイで試す DEC社 TOPS-20」という本でも、Panda TOPS-20 distribution を利用しています。

古代の冒険: Ten over Pi

ネットを検索するとThe Ancient Bits adventure: Ten over Piという面白い記事を見つけました。

古代の冒険

古代の冒険

Raspberry PiでTOPS-20システムを実行する方法についての記事です。

The Ancient Bits adventure : Retrocomputing and systems simulation fun

Simulating a KL10 system

Our good friend simh is not a good option to run TOPS-20. The reason is simh emulates a Decsystem-10, based on the KS-10 CPU. The KS-10 was a scaled down version of the “big” PDP-10 machines. It is posible to run TOPS-20 in a KS-10, but it is limited to the 4.something version. The last TOPS-20 version, the one we will want to run, is 7.1. Nevertheless, the real reason we will not want to use simh is the lack of the NI20 networking interface, necessary to plug the simulated machine into the network, either internet, decnet or both. Fortunately, there is another simulator we can use: Ken Harrenstien’s KLH10.

KLH10 has not been enhanced for some time. The newest version you can get, as far as I know, comes with a full image of TOPS-20, ready to be used. This is the work of Mark Crispin, and can be found also here. Unfortunately, the package contains binaries just for Linux over intel processors. Since we want to use a Raspberry, which is ARM-based, we will have to compile KLH from sources.


【要約】
古代の冒険:レトロコンピューティングとシステムシミュレーションの楽しみ

KL10システムのシミュレーション

私たちの良い友達 simhはTOPS-20を実行する良い選択肢ではありません。理由は、simhはKS-10 CPUに基づいてDEC System-10をエミュレートしているからです。KS-10は、大きなPDP-10マシンの縮小版でした。KS-10でTOPS-20を走らせることは可能ですが、それはバージョン4.?に限られています。
最後に実行したいTOPS-20バージョンは7.1です。それにもかかわらず、私たちがsimhを使いたくない本当の理由は、シミュレーションされたマシンをinternet、decnetまたはその両方に接続するために必要なNI20ネットワーキングインターフェイスの欠如です。幸運なことに、Ken HarrenstienのKLH10という別のシミュレーターがあります。

KLH10はしばらくの間拡張されていません。あなたが得ることができる最新のバージョンは、私が知る限りTOPS-20の完全なイメージが用意されています。これはMark Crispinの作品であり、ここでも見ることができます。残念ながら、このパッケージには、IntelプロセッサのLinux用のバイナリーしか入っていません。ARMベースのRaspberryを使用したいので、ソースからKLHをコンパイルする必要があります。

simhシミュレーターではなく、Ken HarrenstienのKLH10 PDP-10 エミュレータを勧めています。

その他、Compiling KLH10にも、KLH10のビルド方法について記述があります。

Panda TOPS-20 distribution

KLH10エミュレータを使用して作成した Panda TOPS-20 distributionには、以下が含まれています。

  • complete klh10-2.0h sources
  • prebuilt klh10-2.0h binaries for Linux on Intel
  • prebuilt TOPS-20 filesystem with complete sources
Panda TOPS-20

Panda TOPS-20

 

KLH10エミュレータ用のPanda Display Panelという コンソールディスプレイが用意され、ランプが点滅してアドレスやプログラムデータの動きを見ることができるそうです。

 

Panda TOPS-20 distributionのダウンロード

Panda TOPS-20 distributionのKLH10エミュレータをインストールすることにしました。
この distributionは、KLH10をベースとしてTOPS-20やオプションソフトをインストールしたディスク・イメージをまとめたものです。

Panda TOPS-20 distribution をダウンロードして展開します。

/home/MyHome ディレクトリに DECsystem20というディレクトリを作成してダウンロードして panda-dist.tar.gz を展開します。

$ cd MyHome/
$ mkdir DECsystem20
$ cd DECsystem20/
$ wget http://panda.trailing-edge.com/panda-dist.tar.gz
・・・

$ tar zxvf panda-dist.tar.gz
panda-dist/
panda-dist/README
・・・

$ ls -l
drwxr-xr-x 3 pi pi      4096 11月 23  2005 panda-dist
-rw-r--r-- 1 pi pi 221145391  6月 24  2006 panda-dist.tar.gz
$ 

tree コマンドでディレクトリ構造を確認します。

$ tree   --charset X -d
.
`-- panda-dist
    `-- klh10-2.0h
        |-- bld
        |   |-- fbppc
        |   |-- fbx86
        |   |-- lnx86
        |   |-- lnxarm
        |   |-- lnxppc
        |   |-- nbaxp
        |   |-- nbx86
        |   |-- osfaxp
        |   `-- solsparc
        |-- contrib
        |   |-- backwr
        |   |-- read20
        |   `-- supdup
        |-- doc
        |-- run
        |   |-- dfkfb
        |   |-- klnic
        |   |-- klt10
        |   |-- klt20
        |   |-- ksits
        |   |   `-- pubits
        |   |       |-- adm
        |   |       `-- doc
        |   |-- kst10
        |   `-- kst20
        `-- src

29 directories

panda-dist/klh10-2.0h/bld/ に複数プラットフォーム用のビルド環境を用意しています。例えば、lnx86は86アーキテクチャのLinuxOS用であり、lnxarmはarmアーキテクチャのLinuxOS用です。

panda-dist/klh10-2.0h/bld/ ディレクトリをもう少し調べてみます。

$ tree   --charset X panda-dist/klh10-2.0h/bld/

panda-dist/klh10-2.0h/bld/
|-- fbppc
|   |-- 00build
|   `-- Makefile -> ../../src/Mk-fbppc.mk
|-- fbx86
|   |-- 00build
|   `-- Makefile -> ../../src/Mk-fbx86.mk
|-- lnx86
|   |-- 00build
|   `-- Makefile -> ../../src/Mk-lnx86.mk
|-- lnxarm
|   |-- 00build
|   `-- Makefile -> ../../src/Mk-lnxarm.mk
|-- lnxppc
|   |-- 00build
|   `-- Makefile -> ../../src/Mk-lnxppc.mk
|-- nbaxp
|   |-- 00build
|   `-- Makefile -> ../../src/Mk-nbaxp.mk
|-- nbx86
|   |-- 00build
|   `-- Makefile -> ../../src/Mk-nbx86.mk
|-- osfaxp
|   |-- 00build
|   `-- Makefile -> ../../src/Mk-osfaxp.mk
`-- solsparc
    |-- 00build
    `-- Makefile -> ../../src/Mk-solsparc.mk

9 directories, 18 files

Makefile は、/src 以下の Mk-xxxx.mk (xxxxはビルド環境)へのリンクとなっています。

KLH10エミュレータについて

ドキュメントの概要(panda-dist/klh10-2.0h/doc/Intro.txt)にKLH10エミュレータについて書いてあります。

“KLH10” is an emulator for the PDP-10 series of machines from Digital Equipment Corporation. The most important thing to know is that this is a MACHINE emulator. It emulates a specific PDP-10 CPU and all necessary I/O devices, running a site’s existing operating system (monitor) binary without change — which then runs user-mode application programs just as if they were on a real PDP-10. Even floating-point results are bit-identical.

The KLH10 emulator is extremely portable and flexible — it is written in ANSI C so that it can be ported to new platforms quickly, and new “virtual hardware” can readily be added. The following describes the currently supported versions:


【要約】
「KLH10」はDigital Equipment CorporationのPDP-10シリーズのマシンのエミュレータです。知るべき最も重要なことは、これがマシンエミュレータであることです。これは、特定のPDP-10 CPUと必要なすべてのI/Oデバイスをエミュレートして、サイトの既存のオペレーティングシステム(モニタ)バイナリを変更せずに実行し、実際のPDP-10のようにユーザーモードのアプリケーションプログラムを実行します。浮動小数点の結果でさえ、ビットは同一です。

KLH10エミュレータは非常に移植性と柔軟性が高く、新しいプラットフォームに素早く移植できるようにANSI Cで書かれており、新しい「仮想ハードウェア」を簡単に追加できます。現在サポートされているバージョンについて以下に説明します。

Emulation Target: KL

CPU KL10B with extended addressing
Memory 4MW MF20 (22 bits – 8192 pages of 512 words)
Microcode v.442 (supports final versions of TOPS-10 or TOPS-20)
Devices available: DTE – one CTY
RH20 – up to 8 (7 if using a NI20)
Disk – 8 RP06 or RP07 drives per RH20
Tape – 8 TM02/3 formatters per RH20, with one TU45/TU77 each
Network – one NI20 (KLNI/NIA20) ethernet interface

KL10 Model-B プロセッサをエミュレートし、TOPS-10/TOPS-20の最終版をサポートしています。

Emulation Target: KS

CPU KS10
Memory 512KW (19 bits – 1024 pages of 512 words)
Microcode ITS v.262 (supports final version of KS10 ITS)
DEC v.130 (supports final versions of KS TOPS-10/20)
Devices available: FE – one CTY
RH11 – up to 2
Disk – 8 RP06 or RP07 drives per RH11
Tape – 8 TM02/3 formatters per RH11, with one TU45/TU77 each
Network – one “ACC LH-DH” IMP interface (ITS only)

KS10プロセッサをエミュレートし、ITSとKS TOPS-10/20の最終版をサポートしています。

ITS(Incompatible Timesharing System)は、マサチューセッツ工科大学(MIT)で開発されたPDP-10のタイムシェアリングオペレーティングシステムの1つです。

KLH10エミュレータのビルド

インストールするPCは、CPU Atom Z520を搭載しています。
panda-dist/klh10-2.0h/bld ディレクトリにAtomアーキテクチャのLinuxOS用ビルド環境(lnxatom)を作成します。x86アーキテクチャのLinuxOS用ビルド環境(lnx86)をベースとしますので、一式をコピーします。
Makefileを修正しますので、差分を比較できるように元のMakefileをMakefile.orgで保存します。

$ pwd
/home/pi/MyHome/DECsystem20/panda-dist/klh10-2.0h/bld

$ ls
fbppc  fbx86  lnx86  lnxarm  lnxppc  nbaxp  nbx86  osfaxp  solsparc

$ mkdir lnxatom
$ cp lnx86/* lnxatom

$ ls lnxatom
00build  Makefile

$ cd lnxatom

$ cp Makefile Makefile.org

$ ls
00build  Makefile  Makefile.org

Makefile に次のような記述があります。

# Source definitions
CENVFLAGS = -DCENV_CPU_I386=1 -DCENV_SYS_LINUX=1 -DKLH10_DEV_LITES=1 \
                -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE

記号定数の意味をソースコードから調べます。

  • CENV_CPU_I386=1 : (klh10s.h) CPUの種類をIntel 386/486と指定
  • CENV_CPU_ARM=1 : (klh10s.h) CPUの種類をARMと指定
  • CENV_SYS_LINUX=1 : (cenv.h) OSの種類をLinuxと指定
  • KLH10_DEV_LITES=1 : (dvlites.c) パラレルポートに接続した Panda Display表示コード
  • _FILE_OFFSET_BITS=64 : (cenv.h) 64-bit file操作を使用
  • _LARGEFILE_SOURCE : (cenv.h) fseeko() 関数など64-bit型

Makefile を修正します。
私のPCはPanda Displayを接続していないので、KLH10_DEV_LITES=0に変更します。

$ diff Makefile Makefile.org
30c30
< CENVFLAGS = -DCENV_CPU_I386=1 -DCENV_SYS_LINUX=1 -DKLH10_DEV_LITES=0 \
---
> CENVFLAGS = -DCENV_CPU_I386=1 -DCENV_SYS_LINUX=1 -DKLH10_DEV_LITES=1 \

panda-dist/klh10-2.0h/src のMakefileを修正します。
Makefileを修正しますので、差分を比較できるように元のMakefileをMakefile.orgで保存します。

$ pwd
/home/pi/MyHome/DECsystem20/panda-dist/klh10-2.0h/src

$ cp Makefile.mk Makefile.mk.org

記号定数の意味をソースコードから調べます。

  • KLH10_CTYIO_INT=? : デバイスのI/Oチェック方法 1=割り込み駆動方式, 0=ポーリング方式
  • KLH10_ITIME_SYNCH=1 : INTERVAL TIME CLOCK カウンタ同期
  • KLH10_ITIME_INTRP=1 : INTERVAL TIME CLOCK 割り込み駆動

高性能コンピュータがKLH10の非同期メカニズムを破壊するようなので、デバイスI/O方式を変更するために Makefile.mk を修正します。
The Ancient Bits adventureの情報

INTERVAL TIME CLOCKを割り込み駆動(KLH10_RTIME_INTRP)からカウンタ同期(KLH10_ITIME_SYNCH)に変更します。
KLH10_CTYIO_INT を1→0に変更して、デバイスのI/Oチェック方法をポーリング方式とします。

$ diff Makefile.mk Makefile.mk.org
357,358c357,358
<               -DKLH10_ITIME_SYNCH=1   \
<               -DKLH10_CTYIO_INT=0     \
---
>               -DKLH10_ITIME_INTRP=1   \
>               -DKLH10_CTYIO_INT=1     \

KLH10エミュレータのインストール

インストール用のドキュメント(panda-dist/klh10-2.0h/doc/install.txt)を参考にしてインストールします。

実行形式を保存する DECsystem20/binklh ディレクトリを作成して、環境変数 $KLH10_HOME に設定します。

$ pwd
/home/pi/MyHome/DECsystem20

$ mkdir binklh

$ export KLH10_HOME=~/MyHome/DECsystem20/binklh

$ echo $KLH10_HOME
/home/pi/MyHome/DECsystem20/binklh
PANDAディレクトリ構成

PANDAディレクトリ構成

AtomアーキテクチャのLinuxOS用ビルド環境(lnxatom)に移動します。

$ pwd
/home/pi/MyHome/DECsystem20/panda-dist/klh10-2.0h/bld/lnxatom

$ ls
00build  Makefile  Makefile.org

「make base-kl」と入力してビルドします。

$ make base-kl
・・・

「make install」と入力して、$KLH10_HOMEに実行形式をインストールします。

$ make install
・・・
Copying binaries into /home/pi/MyHome/DECsystem20/binklh
・・・

 

panda-dist/klh10-2.0h/run ディレクトリに各OSの実行環境があります。

$KLH10_HOMEにPDP-10ソフトウェアのTOPS-20(klt20)をインストールします。

$ cd panda-dist/klh10-2.0h/run

$ ls
dfkfb  klnic  klt10  klt20  ksits  kst10  kst20

$ cd klt20

$ pwd
/home/pi/MyHome/DECsystem20/panda-dist/klh10-2.0h/run/klt20

$ cp -p * $KLH10_HOME

panda-dist ディレクトリにTOPS-20のサンプルがあるので$KLH10_HOMEにコピーします。

$ pwd
/home/pi/MyHome/DECsystem20/panda-dist

$ cp klt20     $KLH10_HOME
$ cp klt20.ini $KLH10_HOME

klt20 の内容を確認すると、klt20.iniの環境を設定して kn10-klを起動しています。

$ cat klt20
#!/bin/sh
exec ./kn10-kl klt20.ini

klt20.ini の内容を確認します。

$ cat klt20.ini
; Define basic device config - one DTE, one disk, one tape
devdef dte0 200   dte   master
devdef rh0  540   rh20
devdef rh1  544   rh20
devdef dsk0 rh0.0 rp    type=rp07 format=dbd9
devdef mta0 rh1.0 tm03  type=tu45

; Set Ethernet address
devdef ni0 564 ni20 ipaddr=10.0.0.51

; Define the idle device on 700
devdef idler 700 host

; Set switch register
set sw=254200,,147

; Set console lights I/O base register
;Uncomment the following line if you have a Panda display.
;lights 378

; Load disk bootstrap directly
load boot.sav

; Ready to GO

panda-dist ディレクトリにTOPS-20のハードディスクイメージ(RH20.RP07.1)があります。
約500MBと大きいですが、$KLH10_HOMEにコピーします。

$ pwd
/home/pi/MyHome/DECsystem20/panda-dist

$ cp RH20.RP07.1 $KLH10_HOME

まとめ

$KLH10_HOME(/home/pi/MyHome/DECsystem20/binklh)にKLH10エミュレータの実行環境ができました。

TOPS-20実行方法は、次のブログに書きます。お楽しみに!