記念すべき20回目になりました。今回は、Beginner's All-purpose Symbolic Instruction Code (BASIC)をに挑戦します。
BASICとは、1964年に(第1回目の東京オリンピックの年)アメリカのダートマス大学(アイビー・リーグのメンバーで名門大学)でケメニーとカーツが開発したプログラミング言語です。1975年にマイクロソフトのビル・ゲーツとポール・アレンがインテルの8080マイクロプロセッサ(ALTAIR 8800)用に移植してから、一世を風靡したのです。日本でも、多くのパーソナル・コンピュータに移植されて、1970年代後半から、1980年代前半の当時のBASICは、現在のOSの役割も担っていて、ファイルの管理、周辺機器の管理、プログラムのロード、保存なども、全てBASICの中からコマンドで操作していました。BASICのプログラムの中から、機械語プログラムを呼び出したり、メモリの特定番地も読み書きできたりと、今のOSではできないこともできたりしました。
このBASICをベアメタルでPiDP-11で使ってみます。前回、ブートストラップと絶対ローダを導入したので、これらを使って、紙テープベースのBASICをメモリにロードしてみます。
ブートストラップですが、当時のPDP-11は、メインメモリにコア・メモリというものを使っていました。このメモリ素子は、電源を切っても内容を保持する特性があったので、PDP-11に電源を入れるたびに、ブートストラップを入力する必要はありませんでした。現代のコンピュータのメモリは、起動するたびに初期化されてしまうので、毎回、ブートストラップを入力しなければなりません。手入力で、ブートストラップを書き込むのは面倒なので、boot.iniというブートストラップの入力と、絶対ローダの読み込みをするスクリプトを作ったので、これを使うことにします。
DEC謹製のBASICのインタプリタは、DEC-11-AJPB-PB.ptap というテープに入っています。
simhをコントールEで一旦停止して、sim>というプロンプトに対して do boot.iniと打ち込むと、スクリプトが実行されます。 ブートストラップを入力して、絶対ローダを紙テープにセットして、15744番地から実行して、17476番地で一旦実行停止します。ここで、手動でBASICインタープリタの紙テープ DEC-11-AJPB-PB.ptap を読み取り装置にセットして、go 157500で絶対ローダを起動します。
sim> do boot.ini
Searching realcons controller "11/70" ...
Connecting to host localhost ...
HALT instruction, PC: 157500 (MOV PC,SP)
ABSOLUTE LOADER is READY.
attach paper tape to load.
then start at 157500.
BASICが起動すると
PDP-11BASIC VERSION 007A
*Oと打ち出して、入力待ちになります。これはオプションの指定待ちです。オプションは次のようなものがあります。
(マニュアルは、こちらから、http://bitsavers.trailing-edge.com/pdf/dec/pdp11/lang/basic/basic_pts/DEC-11-AJPB-D_PDP-11_BASIC_Programming_Manual_Dec70.pdf)
L: 紙テープの入力・出力にテレタイプの低速装置を使う。
D: 数学関数 SIN、 COS , ATAN、 SQRを使わない。
E: EXP、LOG を使わない。
H: BASICを開始する前に一旦停止する。このあと機械語の関数を紙テープからロードする。
4から28の数字: メモリの使用量を指定する。
*Oに続いて、リターンを打つと、デフォールトモードになります。この場合は、紙テープは、高速テープ装置を使う、数学関数はすべて利用可能、実装されている全メモリをBASICで使う、BASIC開始前の一旦停止はしないとなります。READYは、入力を促するプロンプトです。
PDP-11 BASIC, VERSION 007A
*O
READY
ここで、コントールEで、simhを止めて、プログラムテープを取り付けると、以前保存したプログラムを読み込めます。 OLD コマンドで読み込みます。
Simulation stopped, PC: 000706 (TST (R2))
sim> att ptr sum-bas.ptap
sim> c
OLD
READY
読み込んだプログラムを表示します。
LIST
5 PRINT
10 LET S = 0
15 PRINT"NUMBER";:INPUT Z
20 FOR I=1 TO Z
30 LET S = S + I
40 NEXT I
50 PRINT "SUM OF 1 TO";Z;"IS";S
70 END
READY
1から入力された数までの整数の和を求めるプログラムです。実行してみます。
READY
RUN
NUMBER?10
SUM OF 1 TO 10 IS 55
STOP AT LINE 70
READY
1から10までの整数の和なので、55となります。
プログラムを紙テープに打ち出すには、新しい紙テープのイメージファイルを、紙テープパンチ装置にセットして、BASICの入力待ち状態でSAVEと打ちます。DELETEコマンドはメモリ内のプログラムすべて消去します。
今回使用したファイルは、以下のURLからダウンロード可能です。