DEC社 TOPS-20を使う方法 FORTHシステム使用編

FORTH

FORTH

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 
・・・
FORTH ソースコード

FORTH ソースコード

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」という記事を掲載していました。

小さいけどパワフルなFORTH言語について

拡張性のある言語 FORTH

1983年には、基板試験システム試作開発をCP/MのFORTH言語で行いました。

マイクロプロセッサ制御系の開発

Starting FORTH

Starting 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ビット精度では、とのくらいの大きさの数値を表現できるでしょうか?


(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を使う方法 KLH10エミュレーター導入編

DEC社 TOPS-20を使う方法 KLH10エミュレーター実行編

DEC社 TOPS-20を使う方法 TOPS-20コマンド使用編

DEC社 TOPS-20を使う方法 エミュレーター簡単起動/停止編

DEC社 TOPS-20を使う方法 TELNETでログイン編

DEC社 TOPS-20を使う方法 タイムゾーンの設定編

DEC社 TOPS-20を使う方法 ディレクトリのツリーウォーク編

DEC社 TOPS-20を使う方法 UNIX Toolsとbash使用編

DEC社 TOPS-20を使う方法 ファイルタイプ編