| 2020年10月23日増補 | CPLDP-8 |
OS/8を動かす
omiokone
ディスクを一から構築するのは大変なので、PDP-8シミュレーションソフトSIMHのRF08ディスク(256Kワード)イメージを利用。ブートブロックを書き換え、ディレクトリを修正して224Kワードにした物を使う。この状態でもSIMHで読み書きは可能。DECtapeイメージなどからのソフトのインストールはSIMHに頼るため、この点は重要である。(注)EPICユーティリティを使うと任意形式のファイルを紙テープの形にして転送できるが手間がかかる。
紙テープ版の8K FORTRANではコンパイルから実行まで最低8回はテープをかけ換える事になり忍耐がいるが、OS/8のFORTRANはコマンド1つで快適である。また紙テープ版ソフトでフロントパネルのスイッチから指示を与えるものがあり、スイッチを持たないCPLDP-8では改造が必要だったが、OS/8ではPDP-8/E以降の拡張命令や特殊なハードを使うもの以外はすんなり動く。
追加のソフトは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ソフト
ファイル管理は原始的で階層ディレクトリはない。ディレクトリにある先頭ブロックとサイズの情報だけで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
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'$