TOPS-20 のFORTHシステム
2018年1月、歴史的に貴重なDEC社 TOPS-20を使用しています。
Panda TOPS-20 distribution にFORTHシステムがインストールされていました。
@FORTH FORTH-10 Type QUIT to exit. Ok VLIST DUP SWAP ROLL PICK DROP OVER ROT -DUP ?DUP LEVEL DEPTH FLOAT + - * / ^ F+ F- F* F/ FIX MOD /MOD 0= 0=_ 0< 0<= 0> 0>= EXCHANGE JSYS = =_ < <= > >= FLUSH TRACE @ ! +! -! FILL ' '# ] QUIT <# # HOLD #N SIGN #S #> HOME CR CLEAR SPACE SPACES EMIT TYPE [TYPE] KEY ?TERMINAL EXPECT [EXPECT] C@ C! C> C< . .R F. ." :" (") ["] VLIST ( ABS MINUS +- 1+ 1- MAX MIN SINE COSINE ROOT LN <-,, SW,,AP ,,-> AND OR NOT XOR EXECUTE FORGET : ; <BUILDS DOES> , ALLOT LOAD [LOAD] UNLOAD DECIMAL OCTAL BINARY IF ELSE THEN DO LOOP +LOOP I J IJ..N RUNT REPEAT UNTIL CMOVE [CMOVE] HERE LEAVE ERROR [NUMBER] WHILE BEGIN END Ok QUIT Exiting FORTH @
FORTH-10 とタイトルが表示されます。
VLISTコマンドでディクショナリに登録されているワード一覧を表示しました。見慣れたワードは登録されていますが、少しワード数が少ないです。取りあえずQUITコマンドで終了します。
TOPS-20はどんなFORTHシステムか?
FORTHという名前が付いたファイルを探してみます。
@DIRECTORY (OF FILES) <*>FORTH* TOPS20:<SUBSYS> FORTH.EXE.1 Total of 10 pages in 1 file TOPS20:<UTILITIES> FORTH.MID.1 Total of 16 pages in 1 file Grand total of 26 pages in 2 files @
ファイル名に “FORTH” という名前が付いているファイルが二つありました。
Directory | File | 内容 |
---|---|---|
TOPS20:<SUBSYS> | FORTH.EXE | 実行形式プログラム |
TOPS20:<UTILITIES> | FORTH.MID | MIT Assembler Languageソース |
FORTH.MIDのソースコードを参照します。
@EDIT FORTH.MID.1 ・・・
Title FORTH – The FORTH Language
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Caution: This FORTH is NOT totally standard.
;;;
;;; When FORTH is started up, the file AUTO-LOAD.4TH is searched
;;; for. If it exists, it is loaded automatically. If not, a
;;; standard header is printed.
;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
「注意:このFORTHは完全に標準ではありません。」と書いてあります。FORTHが起動するときに、ファイル「AUTO-LOAD.4TH」を自動的にロードするようです。
FORTHシステムについて
私は、1981年ごろからFORTHシステムに興味を持って調査していました。コンピュータサイエンスbit誌の1981年12月号には「拡張性のある言語 FORTH」という記事を掲載していました。
1983年には、基板試験システム試作開発をCP/MのFORTH言語で行いました。
Starting FORTH にFORTHの資料があります。
FORTHプログラム
35年ぶりにFORTHシステムを使います。
まずは、教科書的な計算式からです。
「 (9 – 2) * (5 + 3)」は、逆ポーランド記述で「9 2 – 5 3 + *」となります。
9 2 - 5 3 + * CR . 56 Ok
コロン定義で、3乗を計算する関数 3POWERを定義します。3の3乗と、4の3乗を計算します。
: 3POWER DUP DUP * * ; Ok 3 3POWER . 27 Ok 4 3POWER . 64 Ok
TRACEコマンドでトレースモードにしてみます。
: 3POWER DUP DUP * * ; Ok 2 3POWER . 8 Ok TRACE ( ←トレースON ) [ Nil ] Ok 2 3POWER . > 3POWER [ 2 ] ==> DUP [ 2 2 ] ==> DUP [ 2 2 2 ] ==> * [ 2 4 ] ==> * [ 8 ] > .8 [ Nil ] Ok 0 TRACE ( ←トレースOFF ) > TRACE Ok 2 3POWER .8 Ok </pre>
トレースモードでは、スタックの状態を表示するので動作がよくわかります。
FORTHプログラムの修正方法が不明なので、AUTO-LOAD.4THにプログラムを書いて初期ロードするようにします。
階乗のFORTHプログラムを書きます。
@TYPE AUTO-LOAD.4TH : FACTORIAL 1 SWAP 1 + 2 DO I * LOOP ;
【FORTHプログラムの説明】
- スタックに階乗を算出する Nをプッシュして、FACTORIALを呼び出します。
- 階乗の積を求める初期値 1をプッシュします。
- SWAPして、N+1してループの終値とします。
- ループの初期値 2をプッシュします。スタックは[ 1 (N+1) 2 ]となります。
- DOで繰り返しに入ります。
- 繰り返し変数 Iをプッシュして、積を求めていきます。
実行してみます。最初は確認のために、トレースモードで行います。
@FORTH Ok TRACE [ Nil ] Ok 3 FACTORIAL . > FACTORIAL [ 3 ] ==> Constant [ 3 1 ] ==> SWAP [ 1 3 ] ==> Constant [ 1 3 1 ] ==> + [ 1 4 ] ==> Constant [ 1 4 2 ] ==> DO [ 1 ] ==> I [ 1 2 ] ==> * [ 2 ] ==> LOOP [ 2 ] ==> I [ 2 3 ] ==> * [ 6 ] ==> LOOP [ 6 ] > .6 [ Nil ] Ok 0 TRACE > TRACE Ok 3 FACTORIAL . 6 Ok
3の階乗は、3×2×1=6になりました。
いろいろな値でテストしてみます。
3 FACTORIAL . 6 Ok 4 FACTORIAL . 24 Ok 5 FACTORIAL . 120 Ok 10 FACTORIAL . 3628800 Ok 11 FACTORIAL . 39916800 Ok 12 FACTORIAL . 479001600 Ok 13 FACTORIAL . 6227020800 Ok 14 FACTORIAL . 18458814464 Ok
うまく動作しています。しかし、おゃっと思う点が・・・
標準的FORTHは、パラメータ・スタック演算は16ビットで行います。32ビット精度の演算を行うために倍精度演算用ワードがあります。FACTORIALの実行結果を見ると、16ビット精度を超え、32ビット精度も表現できています。
N Bitで表現できる符号付き整数の値は、( 2(N-1)-1 )~( - 2(N-1) )です。
大学生のときに、DEC社 SYSTEM20 (PDP-10)のアーキテクチャやアセンブラも勉強しています。確か、PDP-10は36ビットワードマシンでした。このマシンで素直にFORTHシステムを構築すれば、36ビット演算となるでしょう。
36ビット精度では、とのくらいの大きさの数値を表現できるでしょうか?
2(36-1)=2(10×3)×25=(210)3×64=(103)3×64=約1010
10進数で10桁精度の数値を表現することができます。
ビット数とそのビット幅で表現できる精度の対応表をFORTHで作成します。
: MAXINT 1 - 2 SWAP 1 DO 2 * LOOP 1 - ; : MAXINT-BIT 36 4 DO I DUP CR SPACE . SPACE MAXINT . LOOP ;
実行します。
MAXINT-BIT 4 7 5 15 6 31 7 63 8 127 9 255 10 511 11 1023 12 2047 13 4095 14 8191 15 16383 16 32767 17 65535 18 131071 19 262143 20 524287 21 1048575 22 2097151 23 4194303 24 8388607 25 16777215 26 33554431 27 67108863 28 134217727 29 268435455 30 536870911 31 1073741823 32 2147483647 33 4294967295 34 8589934591 35 17179869183 Ok
まとめ
35年ぶりにFORTHシステムを使用し、初歩的なFORTHプログラムを作成しました。このFORTH-10のヘルプやマニュアルが見つからなかったので、プログラムの修正方法がわかりません。QUITコマンドでコマンドレベルに戻り、EMACSで修正していました。
この状態で深い使い方は難しいです。10進10桁の精度なので、電卓代わりには使えそうです。
TOPS-20に関するブログ
歴史的に貴重なDEC社 TOPS-20を使うためにKLH10エミュレーターをLinuxにインストールして、TOPS-20を実行することができました。
TOPS-20に関するブログを以下に示します。
ピンバック: DEC社 TOPS-20を使う方法 KermitTeraTerm でファイル転送 | ある計算機屋さんの手帳
ピンバック: DEC社 TOPS-20を使う方法 SNOBOL言語使用編 | ある計算機屋さんの手帳
ピンバック: DEC社 TOPS-20のSNOBOL言語で8080アセンブラを作成(設計編) | ある計算機屋さんの手帳
ピンバック: DEC社 TOPS-20「hello, world」プログラミング(Ⅵ) FORTH | ある計算機屋さんの手帳