2020年10月23日増補 CPLDP-8

CPLDP-8

OS/8を動かす

omiokone


OS/8はPDP-8で最も広く使われたOS。前回は端末ソフトを改造して、PC上のディスクイメージにシリアル通信経由でアクセスして動かした。今回はRAMディスクのロードが済めば、PCに頼らず例えばダム端末での動作も可能。

ディスクを一から構築するのは大変なので、PDP-8シミュレーションソフトSIMHのRF08ディスク(256Kワード)イメージを利用。ブートブロックを書き換え、ディレクトリを修正して224Kワードにした物を使う。この状態でもSIMHで読み書きは可能。DECtapeイメージなどからのソフトのインストールはSIMHに頼るため、この点は重要である。(注)EPICユーティリティを使うと任意形式のファイルを紙テープの形にして転送できるが手間がかかる。

紙テープ版の8K FORTRANではコンパイルから実行まで最低8回はテープをかけ換える事になり忍耐がいるが、OS/8のFORTRANはコマンド1つで快適である。また紙テープ版ソフトでフロントパネルのスイッチから指示を与えるものがあり、スイッチを持たないCPLDP-8では改造が必要だったが、OS/8ではPDP-8/E以降の拡張命令や特殊なハードを使うもの以外はすんなり動く。

OS/8 session

追加のソフトはos8packからSIMHでコピーして動かせる。ただしPAGE8とPascal-Sは8/E拡張命令使用のためCPLDP-8では動かない(Pascalは既にP4が使用可能)。 その他BASIC用ゲームソフトはpdp8online(diag-games-kermit.rk05)で入手可。BASICゲームの解説書はbitsaversの/dec/_Books/にDEC BASIC版の101 BASIC Computer Games がある。
その他のOS/8ソフト


OS/8はどんなOSか

OS/8は最小メモリ8Kワードで動く。OS常駐部は256ワード、keyboard monitorは1.5Kワードでプログラムのロードなど最低限の機能しかない。例えばファイルのコピー/削除/名前の変更はFOTPと言うソフトを使う。これは不便なのでCCL(Concise Command Language)があり、COPYなどのコマンド入力でCCLが起動し適切なソフトにオプションをつけて実行する。keyboard monitorやCCLは使用時だけロードされ、メモリ8K(12Kバイト)でもFORTRAN IVなどが動く。これは実用上24K~32Kバイトは必要なCP/Mに比べても小さい。その代わり簡単なコマンドでもやたらディスクアクセスが多いのはやむをえない。当時メモリは高価で実際に8Kワードで使うケースも多かった。

ファイル管理は原始的で階層ディレクトリはない。ディレクトリにある先頭ブロックとサイズの情報だけでFAT(File Allocation Table)を持たず、ファイルはディスク上の連続したブロックに置かれる。ディスクの空き領域は特別なempty fileとしてディレクトリに登録される。このためディスクが虫食い状態になると、空き容量はあっても連続領域がとれずファイルを書き込めなくなる。この場合SQUISHコマンドでファイルを詰め直す必要がある。

ディスクなどの入出力はデバイスハンドラに集約されていて、起動しているOS上でデバイスの追加や削除もおこなえる。ハンドラの仕様も公開されているが、128ワード、システムデバイスハンドラは93ワードのサイズ制限がある(注)。DECのディスク装置では、アドレスやサイズを設定してDMA転送終了を待つだけなのでこれで足りるが、やや複雑な処理を要する今回のような場合問題となる。
(注)2-page handlerにすれば128ワード拡張できるが、特にシステムハンドラの作成にはテクニックを要する。

参考文献(いずれもbitsaversで入手可)
OS/8一般 OS/8 handbook 1974 DEC-S8-OSHBA-A-D
OS/8内部構造 OS/8 software support manual DEC-S8-OSSMB-A-D


付録 Rogalgol

ALGOL60には入出力の規定がなく処理系依存となるが、Rogalgolの説明書が入手できない。筆者が調べて判明したものを以下に示す。
(追記) その後ROGALGOL COMPILERが入手可能になったが、旧版で多くの点が合致しない。それでも未発見機能のヒントが幾つかあり、調査してALGOL60との相違点と共に追加した。

Differences from ALGOL60

Rogalgol I/O summary

stream/device number
0 null output device (no output)
1 TTY: (Ctrl-C checked, LF echoed if CR)
2 PTP: PTR:
3 files by IOC
output file must be closed by Ctrl-Z (CHOUT(3,154))

PROCEDURE SKIP(dev);                    output CR/LF

INTEGER PROCEDURE CHIN(dev);            read byte
                                        MSB=1 (A is 193 in decimal)
                                        return Ctrl-Z (154) at the end of file

REAL PROCEDURE READ(dev);               read floating point or integer number

PROCEDURE TEXT(dev,"string");           output string
                                        2nd parameter may be a string parameter
                                        'PROCEDURE' SAMPLE(MSG); 'STRING' MSG;
                                        'BEGIN' TEXT(1,MSG); 'END';

PROCEDURE CHOUT(dev,ival);              output byte

PROCEDURE WRITE(dev,ival);              output integer

PROCEDURE RWRITE(dev,val);              output real
PROCEDURE RWRITE(dev,val,n,d);
  n=total characters including sign and decimal point
  d=number of digits after decimal point

IOC(0);                                 rewind input file which has been
                                        read to end
IOC(1);                                 get input  filename & open
IOC(2);                                 get output filename & open
IOC(3);                                 close output file & open it for reading
IOC(-2);                                suppress echo of teletype keyboard
IOC(-1);                                enable echo (default)
DISK(ival) is equivalent to IOC(ival)

'BEGIN'
'COMMENT' COPYING TEXT FILE,
          SAMPLE OF FILE I/O;
  'INTEGER' C;
  SKIP(1);
  IOC(1);
  IOC(2);
  LOOP:
    C:=CHIN(3);
    CHOUT(3,C);
  'IF' C#154 'THEN' 'GOTO' LOOP
'END'$