本文へスキップ

《 A Engineer Den 》知的冒険の旅へ出かけよう

Raspberry Pi4でTOPS-20を起動 Boot TOPS-20 on Raspberry Pi4


超マシン復活

DEC TOPS-20とは

TOPS-20は、DECというコンピューター・メーカーがPDP-10マシン向けに 1976年に開発したオペレーティングシステムです。 DECは対話型で手ごろな価格のPDPシリーズというミニコンを開発して急成長しました。 その中で、PDP-10マシンは大型機市場を狙った36ビットメインフレームです。

TOPS-20 誕生秘話

偉大な先人が開発したTOPS-20 OSは、歴史的に貴重なソフトウェアの宝庫です。 TOPS-20の誕生には、BBNが開発したTENEX OSと深く関係しています。 詳しくは、拙著 『超マシン復活 #1 DEC TOPS-20 レトロOSワールド』 の「TOPS-20 誕生秘話」を参照してください。

次の表に示すように、最新の技術を取り入れながらPDP-10マシンのプロセッサーに改良を続けました。

PDP-10プロセッサーの改良
出荷年 プロセッサー 物理アドレス 仮想アドレス 備考
1967年 KA10 18bit(256K) ---
1972年 KI10 22bit(4M) 18bit(256K) ページング方式
1975年 KL10 Model-A 22bit(4M) 18bit(256K) キャッシュ搭載
1978年 KL10 Model-B 22bit(4M) 23bit(8M) 拡張アドレス
1978年 KS10 20bit(1M) 18bit(256K) 小型低価格版
  • 1967年、KA10プロセッサーを搭載した最初のPDP-10マシンが開発されました。 KA10プロセッサーは、ページング機構はなく、最大メモリー容量は256Kワードで小さなTOPS-10というOSが走りました。
  • 1976年、KL10プロセッサーを搭載してTOPS-20 OSが走るDECSYSTEM-20を出荷しました。
  • 1978年、KL10プロセッサーModel-Bで基本命令セットを変更してアドレス空間を18ビットから23ビットに拡張しました。 アドレッシング拡張は、TOPS-20 release 4でサポートしました。

TOPS-20の終焉

1980年代初頭、TOPS-20は成功し非常に人気があり、UNIXなどと共に隆盛期を迎えました。 しかし、VAXスーパーミニコンと製品ラインが競合するので内部ライバル廃止のため PDP-10の開発終了というDECの決定は、人気のあったTOPS-20の時代に終止符を打ちました。 1980年代の終わりには、かつてのTOPS-20ユーザーたちはUNIXへと流れていきました。 そして、TOPS-20は終焉を迎えて世の中から消えてしまいました。

TOPS-20の復活

2020年の現在、残念ながらPDP-10マシンはもう現存していません。 最近のパソコンや小さなRaspberry Pi ボードコンピューターは、 当時のDECのPDP-10シリーズに比べて格段に高性能になりました。 その結果、エミュレーター技術により「時を超えてTOPS-20が復活」しました。 LinuxマシンでPDP-10エミュレーターを実行することにより 本物のTOPS-20(TOPS-20 Monitor 7.1) バイナリーコードを実行できます。

PDP-10エミュレーター

KLH10エミュレーター

エミュレーターにより歴史的に重要なコンピューターハードウェアおよび ソフトウェアシステムを復活することができます。 KLH10エミュレーターは、Ken Harrenstienが開発したPDP-10エミュレーターです。 このエミュレーターは、KL10プロセッサーだけでなくNI20ネットワークインターフェイスなどの DEC I/Oデバイスをエミュレートするマシンエミュレーターです。 KLH10エミュレーターは、KL10プロセッサー(Model-B)とKS10プロセッサー(Model-A)をエミュレートします。 KL10(Model-B)で、拡張アドレスモードのTOPS-20 release 7が走ります。

KLH10は、移植性が高く新しいプラットフォームに移植できるようANSI Cで書かれています。 現在のところx86とARMプロセッサーのUNIX系プラットフォームで動作します。

ディストリビューション

Panda TOPS-20 Distributionは、 Mark Crispinが作成したディストリビューションです。 このディストリビューションは、KLH10エミュレーターとTOPS-20用のハードディスクイメージをセットにしたものです。 このハードディスクイメージには、標準的なソフトウェアパッケージやTELNETログインなどを含む 本格的なTOPS-20システムをインストール済みです。

このディストリビューションを利用することにより、TOPS-20 OSやソフトウェアパッケージなどの面倒なインストール作業は不要です。 Panda TOPS-20 Distributionを使うだけで、素晴らしい世界が待っています。

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

KLH10エミュレーターのインストール方法の詳細は、 拙著 『超マシン復活 #1 DEC TOPS-20 レトロOSワールド』 の「第2章 超マシン復活」を参照してください。

Linuxマシンの準備

KLH10エミュレーターを、ラズパイ(Raspberry Pi4)にインストールします。

Raspberry Pi4

Raspberry Piの公式OSの「Raspberry Pi OS (32-bit)」をインストールします。 インストールの方法は、 このサイト などを参考にしてください。

Raspberry Pi OSのバージョンを確認します。


$ uname -a 
Linux pi4 4.19.118-v7l+ #1311 SMP Mon Apr 27 14:26:42 BST 2020 armv7l GNU/Linux 

$ lsb_release -a 
No LSB modules are available. 
Distributor ID: Raspbian 
Description: Raspbian GNU/Linux 10 (buster) Release: 10 
Codename: buster 

$

Panda TOPS-20 Distribution ダウンロード

エミュレーターを構築するディレクトリー「~/MyHome/DEC20」を作成して、そのディレクトリーに移動します。


$ cd 
$ mkdir MyHome 
$ cd MyHome/ 
$ mkdir DEC20 
$ cd DEC20/ 
$

wgetコマンドでPanda TOPS-20 Distributionをダウンロードします。

【URL】http://panda.trailing-edge.com/panda-dist.tar.gz


$ wget http://panda.trailing-edge.com/panda-dist.tar.gz 

  …(省略)… 

`panda-dist.tar.gz' に保存中 
  …
`panda-dist.tar.gz' へ保存完了 [221145391/221145391] 

$ ls
panda-dist.tar.gz 
$

panda-dist.tar.gzは、圧縮したアーカイブファイルです。tarコマンドで解凍します。


$ tar zxvf panda-dist.tar.gz 
panda-dist/ panda-dist/RH20.RP07.1 
panda-dist/README 

 …(省略)… 

$ ls 
panda-dist panda-dist.tar.gz 

$ 

panda-distディレクトリーにKLH10エミュレーターの環境一式が入っています。 ディレクトリー構成を確認します。


$ 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/ディレクトリーの下に次のようなディレクトリーがあります。

panda-distディレクトリー内容
項番ディレクトリー内容
1 doc ドキュメント
2 run ブートOS環境
3 src ソースコード
4 bld ホストマシン別ビルド環境
5 contrib 提供ツール
  • panda-dist/klh10-2.0h/runディレクトリーに各種ブートOS環境があります。
    klt20
    KL10プロセッサーのTOPS-20 bootstrap バイナリー
    kst20
    KS10プロセッサーのTOPS-20 bootstrap バイナリー
  • panda-dist/klh10-2.0h/bldディレクトリーに各種ビルド環境があります。
    lnx86
    Linux on i386

ビルド準備

KLH10エミュレーターをインストールするために環境に合わせてソースコードやMakefileを修正します。

Copyright文字化けの修正

Copyrightの文字列が文字化けしています。 panda-dist/klh10-2.0h/src/klh10.hのKLH10_COPYRIGHT定義を修正します。


$ cd ~/MyHome/DEC20/panda-dist/klh10-2.0h/src
$ cp klh10.h klh10.h.org
$ vi klh10.h

 …(修正)…

#define KLH10_COPYRIGHT のCopyrightの直後の文字を(C)に修正します。


$ diff klh10.h klh10.h.org
63c63
<     Copyright (C) 2002 Kenneth L. Harrenstien -- All Rights Reserved."
---
>     Copyright  ゥ 2002 Kenneth L. Harrenstien -- All Rights Reserved."
$
Makefile.mkの修正

Rapsberry Piで動作するように同期メカニズムを変更します。 panda-dist/klh10-2.0h/src/Makefile.mkを修正します。


$ cd ~/MyHome/DEC20/panda-dist/klh10-2.0h/src/
$ cp Makefile.mk Makefile.mk.org
$ vi Makefile.mk

 …(修正)…

間隔クロック方式
割り込み駆動「KLH10_RTIME_INTRP」からカウンター同期「KLH10_ITIME_SYNCH」に変更
デバイスI/Oチェック方法
割り込み駆動方式「1」からポーリング方式「0」に変更

$ 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	\
ホストマシン用Makefile

KLH10エミュレーターをインストールするホストマシンに合わせて 新しいLinux用ビルド環境(lnxmy)を作成してMakefileを修正します。

新しいLinux用ビルド環境(lnxmy)は、 x86アーキテクチャーのビルド環境(lnx86)をベースとしますので、一式をコピーします。


$ cd ~My/MyHome/DEC20/panda-dist/klh10-2.0h/bld/
$ ls
fbppc  fbx86  lnx86  lnxarm  lnxppc  nbaxp  nbx86  osfaxp  solsparc
$ mkdir lnxmy
$ cp lnx86/* lnxmy
$ cd lnxmy/
$ ls
00build  Makefile
$

panda-dist/klh10-2.0h/bld/lnxmy/Makefileを修正します。


$ cd ~My/MyHome/DEC20/panda-dist/klh10-2.0h/bld/lnxmy/
$ cp Makefile Makefile.org
$ vi Makefile

 …(修正)…

  • CPUの種類をI386からARMに変更(CENV_CPU_ARM)
  • Panda Displayを非表示(KLH10_DEV_LITES=0)

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

インストール

《STEP-1》から《STEP-7》の手順でエミュレーターをDEC20/binディレクトリーに作成します。 ディレクトリー構成を次に示します。

TOPS-20ディレクトリー構成
《STEP-1》 $KLH10_HOME作成

KLH10エミュレーターの実行環境を格納するディレクトリー「~/MyHome/DEC20/bin」を作成して、 環境変数 $KLH10_HOMEに設定します。


$ cd  ~/MyHome/DEC20/
$ mkdir bin
$ export KLH10_HOME=~/MyHome/DEC20/bin
$ echo $KLH10_HOME
/home/pi/MyHome/DEC20/bin
《STEP-2》 エミュレーターのビルド

ビルド用ディレクトリーpanda-dist/klh10-2.0h/bld/lnxmyでビルドします。


$ cd ~/MyHome/DEC20/panda-dist/klh10-2.0h/bld/lnxmy/
$ ls
00build  Makefile  Makefile.org
$ make -s clean
$ ./00build 

 …(ワーニングエラーが発生します)…

$

ビルドに要する時間は、Raspberry Pi4で約1分、Pi3で約2分、Pi Zeroで約8分です。

《STEP-3》 実行環境へインストール

実行環境へインストールします。


$ make -s install
Copying binaries into /home/pi/MyHome/DEC20/bin
Done!
$ cd $KLH10_HOME
$ ls
dpni20  dprpxx  dptm03  flushed  kn10-kl  tapedd  uexbconv  vdkfmt  wfconv  wxtest
$
《STEP-4》 ネットワークドライバー dpni20

KN10の実行環境を格納したディレクトリー($KLH10_HOME)にネットワークドライバーdpni20があります。 ネットワークドライバーdpni20の実行には、ルート権限が必要なので特殊なファイルアクセス権(setuid)を与えます。


$ cd $KLH10_HOME
$ ls -l dpni20 
-rwxr-xr-x 1 pi pi 779604  6月  2 19:00 dpni20
$ sudo chown root dpni20 
$ sudo chmod 4750 dpni20 
$ ls -l dpni20 
-rwsr-x--- 1 root pi 779604  6月  2 19:00 dpni20
$

setuid属性を付与したので、KN10エミュレーターがネットワークドライバーdpni20を実行するとき、 そのファイルの所有者(root)の特権を得ることができます。

《STEP-5》 TOPS-20ブートOS環境のコピー

panda-dist/klh10-2.0h/runディレクトリーにブートOS環境があります。 KL10 TOPS-20のブートOS環境(klt20)を$KLH10_HOMEにコピーします。


$ cd ~/MyHome/DEC20/
$ cp -f panda-dist/klh10-2.0h/run/klt20/* $KLH10_HOME
$ ls $KLH10_HOME
README    dpni20  dptm03   inst-klt20.ini  kn10-kl     tapedd    vdkfmt  wxtest
boot.sav  dprpxx  flushed  klt20.ini       mtboot.sav  uexbconv  wfconv
$
《STEP-6》 システム構成設定のコピー

panda-distディレクトリーにTOPS-20システム構成設定のサンプルがあるので klt20とklt20.iniを$KLH10_HOMEにコピーします。


$ cp -f panda-dist/klt20     $KLH10_HOME
$ cp -f panda-dist/klt20.ini $KLH10_HOME
$
《STEP-7》 ハードディスクイメージのコピー

panda-distディレクトリーにTOPS-20をインストール済みのハードディスクイメージがあります。 RH20.RP07.1を$KLH10_HOMEにコピーします。約500MBと大きいので少し時間がかかります。


$ cp -f panda-dist/RH20.RP07.1 $KLH10_HOME
$

システム構成の定義

システム構成設定(klt20.ini)ファイルのネットワークIPアドレスを変更します。 デフォルトでは、「devdef ni0 564 ni20 ipaddr=10.0.0.51」になっています。 IPアドレスを192.168.0.253に設定するときは、「devdef ni0 564 ni20 ipaddr=192.168.0.253」とします。


$ 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=192.168.0.253

; 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
$

TOPS-20 起動と終了

環境変数 $KLH10_HOMEに設定した「~/MyHome/DEC20/bin」ディレクトリーに KLH10エミュレーターの実行環境を作成しました。

TOPS-20起動

実行環境ディレクトリー($KLH10_HOME)に移動して./klt20と入力します。


$ cd ~/MyHome/DEC20/bin/
$ ./klt20
KLH10 V2.0H (MyKL) built Aug 20 2019 00:01:59
    Copyright (C) 2002 Kenneth L. Harrenstien -- All Rights Reserved.
This program comes "AS IS" with ABSOLUTELY NO WARRANTY.

Compiled for LINUX on ARM with word model USEINT
Emulated config:
         CPU: KL10-extend   SYS: T20   Pager: KL  APRID: 3600
         Memory: 8192 pages of 512 words  (SHARED)
         Time interval: SYNCH   Base: OSGET
         Interval default: 60Hz
         Internal clock: COUNT
         Other: MCA25 CIRC JPC DEBUG PCCACHE EVHINT
         Devices: DTE RH20 RPXX(DP) TM03(DP) NI20(DP)
[MEM: Allocating 8192 pages shared memory, clearing...done]

KLH10# ; Define basic device config - one DTE, one disk, one tape
KLH10# devdef dte0 200   dte    master
KLH10# devdef rh0  540   rh20
KLH10# devdef rh1  544   rh20
KLH10# devdef dsk0 rh0.0 rp     type=rp07 format=dbd9
KLH10# devdef mta0 rh1.0 tm03   type=tu45
KLH10#
KLH10# ; Set Ethernet address
KLH10# devdef ni0 564 ni20 ipaddr=192.168.0.251
KLH10#
KLH10# ; Define the idle device on 700
KLH10# devdef idler 700 host
KLH10#
KLH10# ; Set switch register
KLH10# set sw=254200,,147
   sw: 0,,0  =>  254200,,147
KLH10#
KLH10# ; Set console lights I/O base register
KLH10# ;Uncomment the following line if you have a Panda display.
KLH10# ;lights 378
KLH10#
KLH10# ; Load disk bootstrap directly
KLH10# load boot.sav
Using word format "c36"...
Loaded "boot.sav":
Format: DEC-CSAV
Data: 4630, Symwds: 0, Low: 040000, High: 054641, Startaddress: 040000
Entvec: JRST (120 ST: 0, 124 RE: 0, 137 VR: 0,,0)
KLH10#
KLH10# ; Ready to GO
KLH10# [EOF on klt20.ini]
KLH10#

KLH10# プロンプトに対して、「go」と入力して[Enter]キーを押して BOOTプログラムを起動します。


KLH10# go
Starting KN10 at loc 040000...

BOOT V11.0(315)

BOOT>

BOOT>プロンプトに対して「/e」と入力して[Enter]キーを押してEDDTを起動します。


BOOT>/e

[BOOT: Loading] [OK]
EDDT

EDDTで DBUGSWシステムテーブルを設定するために、 「dbugsw/」と入力すると T1と表示しますので「2」を入力して[Enter]を押します。 「2」はスタンドアロン起動を意味します。

続けて「147」と入力してESCキーを押します。 $を表示しますので「g」と入力して TOPS-20を起動します。 147はTOPS-20の通常の開始アドレスです。


dbugsw/   T1   2
147$g


[TOPS20 mounted]
Panda Distribution, PANDA TOPS-20 Monitor 7.1(21733)-4 Internet: Loading host names
Date and time is: Tuesday, 2-June-2020 3:15AM
Why reload?  

システム立ち上げの理由を聞かれるので、「sa」と入力して[Enter]キーを押します。


Why reload?  

sa

[System is stand-alone]

スタンドアロンでTOPS-20が起動しました。

TOPS-20ログインとログアウト

ログイン要求

CTRL/Cを入力すると、TOPS-20のプロンプト「@」を表示します。


[Caution--System is stand-alone]

 Panda Distribution, PANDA TOPS-20 Monitor 7.1(21733)-4

This system is for the use of authorized users only.  Usage of
this system may be monitored and recorded by system personnel.

Anyone using this system expressly consents to such monitoring
and is advised that if such monitoring reveals possible
evidence of criminal activity, system personnel may provide the
evidence from such monitoring to law enforcement officials.

@
ログイン

TOPS-20には、次のユーザーがあらかじめ登録されています。

ユーザー名 パスワード
operator dec-20

loginコマンドでログインします。 「login」と入力してESCキーを押します。 (USER)と表示してユーザー名の入力となります。 ユーザー名に「operator」を入力して、ESCキーを押すと(PASSWORD)と表示してパスワードの入力となります。 パスワード「dec-20」を入力します。パスワードはエコーバックされません。


@login (USER) operator (PASSWORD) 
@

ユーザーoperatorにログインしました。 TOPS-20のいろいろなコマンドを使用できます。

ログアウト

LOGOUTコマンドでログアウトします。


@logout
[Job 0(DET) also logged in under OPERATOR]
Killed Job 1, User OPERATOR, TTY5, at dd-mm-yyyy hh:mm:ss

TOPS-20停止

TOPS-20の停止は、ログインした状態から行いますので、CTRL/Cでログイン要求してログインしてください。 ENABLEコマンドで特権モードに入ります。


@enable 
$

プロンプトが「@」から「$」に変わります。 特権コマンド^ECEASEでシャットダウン停止を行います。 CTRL/Eに続いて「cease now」と入力します。 [Confirm]で確認してきますので、[Enter]を押します。


$^Ecease now
TOPS20 Will be shut down IMMEDIATELY
[Confirm]

[Timesharing is over]
$
        OPERATOR - Wait for the message "Shutdown complete" before
        entering commands to PARSER.
dd-mm-yyyy hh:mm:ss HSYS: Shutdown complete

CTRL/\を入力するとKN10のプロンプトKLH10>が表示されます。 KN10のshutdownコマンドを入力して[Enter]を押します。


[HALTED: FE interrupt]
KLH10> shutdown
Continuing KN10 at loc 01051636...
**HALTED**
$11B>>SWHLT4#/   XCT CHKADR   BUGCHK/   0

もう一度CTRL/\を入力するとKN10のプロンプトKLH10>が表示されます。 KN10のquitコマンドを入力して[Enter]を押します。 [Confirm]で確認しますので[Enter]を押します。 KN10エミュレーターを終了してLinuxコマンドラインになります。


KLH10> quit
Are you sure you want to quit? [Confirm]
Shutting down...Bye!
$

TOPS-20 冒険の旅へ出発

小さなRaspberry Pi4でTOPS-20が走りました。 手のひらで動作するパーソナル・メインフレームと言えます。 TOPS-20ワールドは、ワクワクすることがいっぱいあります。 探究心と好奇心の扉を開いて、知的冒険の旅へ出発しましょう!



次の文献が参考になります。

  • 先人の知恵を探す知的冒険の旅へようこそ
  • 技術を極める知的冒険の旅へようこそ
  • 太古のマシンを操る知的冒険の旅にようこそ
  • 達人の英知と技に学ぶ知的冒険の旅にようこそ
  • 未知なる世界を探求する知的冒険の旅にようこそ

ある技術者の書斎

探究心と好奇心の扉を開いて
知的冒険の旅に出かけよう