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