前回のbaremetal編ではTangNanoDCJ11MEMに搭載したDCJ11 CPUがbare metal環境で動作することを確認しました。同時にPDP11GUIというツールでODTを活用できそうだということを紹介しました。今回はPDP11GUIを使ってPDP-11 BASICを動かしてみました。なお、TangNanoDCJ11MEMのapplicationではtapebasicをSDカードからロードする方法が公開されています。
この実験を行う場合はTangNanoDCJ11MEMのbare metal環境で行ってください。unix-v1環境だと動作しません
PDP-11とPaper tape software
PDP-11でプログラムを実行させる際にデータが記録されている紙テープを紙テープリーダーで読み込んでメモリにプログラムをロードすることを行っていました。当時の紙テープのデータをまとめたアーカイブが存在します。
https://www.vaxhaven.com/Paper_Tape_Archive
この紙テープデータを読み込む機能がPDP11GUIにありますので、それを使ってみます。
PDP11GUIでの紙テープデータの読み込み
今回読み込む紙テープソフトウェアはBASICにします。先ほどのアーカイブサイトではPDP-11 BASIC V007A SA=16104 RA=0と書かれているものになります。ファイル名はDEC-11-AJPB-PB.ptapですのでこれをダウンロードします。
次にPDP11GUIのメニューにあるMemoryからMemory Loaderを選択すると次のような画面が表示されます。

ここでFile formatでファイル形式を指定します。様々な形式のファイルフォーマットが使えますが、紙テープデータの場合は「Stansard Absolute Paper Tape image」を選択します。そのあと紙テープのイメージファイル名を指定して、Loadボタンを押すと紙テープイメージデータが読み込まれ、読み込まれたデータが表示されます。

このイメージデータをメモリ上にロードするためにDeposit allボタンを押すと、Terminal画面でODTを使って1ワードずつメモリに書き込みが行われます。

データの読み込みに時間がかかってしまいますが、紙テープを読み込んでいる時間と思えば良いかもしれません。私の場合は115200bpsで約4分かかりました。
PDP-11 BASICの起動
ロードが完了したら、Memory Loader画面のEntry addr:に表示されている値が実行開始アドレスです。PDP-11 BASICは016104でした。

Terminalから実行開始アドレスを指定してGコマンドを入力します。うまく読み込めていれば以下のような表示になります。
| |
そのままEnterを押してもREADYとなりますが、以下のように?を入力することでオプションを指定できます。オプションについては後述のマニュアルを参照してください。
| |
これでBASICが使える状態になりました。テストプログラムを入力して実行してみます。
| |
HELLO WORLDと表示することができました。
PDP-11 BASICを使ってみる
PDP-11 BASICのマニュアルは以下にあります。実数も使えるBASICです。
https://retrocmp.com/attachments/article/254/DEC-11-AJPB-D_PDP-11_BASIC_Programming_Manual_Dec70.pdf
PDP-11 BASICでいつものASCIIART(マンデルブロ集合)ベンチマークを実行してみようとしたのですが、PDP-11 BASICにおいて以下の制約があるためやむなくプログラムを改変して実行しています。このため実行時間はあくまでも参考値としてください。
- 変数名は英字一文字もしくは英字一文字の後に一桁の数字
- 変数の代入には必ずLET文が必要
- CHR$()は存在しない
- PRINT文で表示する際に72文字目で強制的に改行されてしまうのでX軸を少し短くしました(ラインプリンタの仕様?)
上記の条件を考慮したプログラムです。オリジナルからは大きく変更しています。
| |
こちらを実行すると以下のような結果になりました。CPUクロックが18MHzのときは、実行時間は8分14秒でした。

まとめ
今回はPDP-11 BASICを動かしてみましたが、PDP11GUIのMemory Loader機能は紙テープデータだけでなくテキストで書かれた8進数のリストファイルなど様々な形式のファイルを扱うことができます。PDP-11のいろいろな資産を手軽に活用できそうです。
