石原 博の覚書

電子工作に関する日々の覚書を記載します

Forthの制御構造(BEGIN AGAIN)

2021-04-29 10:47:17 | 日記
Forthの面白さは、BEGIN AGAINやIF ELSE THENなどの制御構造のコンパイルもForthで書かれているところだと思う。
F83の場合、SEEでデコンパイル出来るし、VIEW BEGIN や VIEW IF として、制御用のワードの定義を見ることが出来る。

BEGIN AGAINの例 (無限ループ)
: TEST 0 BEGIN 1 + DUP . AGAIN ;

SEE TEST
: TEST 0 1 + DUP . BRANCH -10 ; ok

→コンパイルすると、BEGIN も AGAIN も消えて単純なBRANCHになっていることがわかる。


制御用のワードBEGINを見てみよう。
VIEW BEGIN すると、KERNEL80.BLK 内の BEGIN の定義を見ることが出来る
1 : BEGIN ?
? 10 : ?
TRUEをスタックに積んで 5 :
なんのことはない。結局TRUEと現在のアドレスをスタックに積んでいるだけ。


AGAINは
10 : AGAIN COMPILE BRANCH ? BRANCHワードを書き込んで、?
11 : ? SWAPしてTRUEとアドレスを交換し、?CONDITION

1 : ?CONDITION (S f -- )
2 NOT ABORT" Conditionals Wrong" ;
スタックトップがTRUEじゃなければ、アボート

6 : スタックトップのアドレスを書き込む

これも結局フラグをチェックして、スタックに積まれていたアドレスに分岐(BRANCH)しているだけなことがわかる。

デコンパイルした結果の下線部分がその結果となっている。
: TEST 0 1 + DUP . BRANCH -10 ; ok
          ^^^^^^^^^^^^
(注意)
 SEEでは分岐先が相対アドレス表記になっているが、実際は絶対アドレスが入っている。
 FIG-ForthやF79では実際にも相対アドレスであったが、F83から絶対アドレスに変わっているみたい


制御構造には、BEGIN ... UNTIL もある。これは条件が成立するまでループであるが、
BEGIN AGAINとほとんど変わらない。
9 : UNTIL COMPILE ?BRANCH ?
AGAINのBRANCHが、?BRANCHにかわっただけ。 (?BRANCHはスタックトップが0なら分岐というワード)

F83を動かした(セルフコンパイル)

2021-04-25 09:13:48 | 日記
Forthは元々スタンドアロンなシステムでDISKに対するアクセスも独自で持つため、
CP/Mなどとは相性が悪い。

そこでCP/Mのファイルシステム上にForth用のディスクブロックを作る方法で問題を回避した
Forthを使用してみた。sigm154, sigm204にForth(F83)が存在するが、
ここでは、新しいsigm204を使用した。

F83.COMが入っているので、わざわざセルフコンパイルする必要はないが、方法は以下のとおり。

===セルフコンパイル方法===
AドライブにF83.COM BドライブにMETA80.BLK, KERNEL80.BLKを置く
B>A:F83 META80.BLK
B>1 LOAD
B>BYE

KERNEL.COMがAドライブに作成されるので、(作成先はMETA80.BLKの中にハードコーディングされている)
Aドライブに以下の3ファイルを置く
EXTEND80.BLK
CPU80.BLK
UTILITY.BLK

A>KERNEL EXTEND80.BLK
A>1 LOAD
A>BYE

これでF83.COMが出来る。
========================

sigm204に含まれるF83.COM には、ディスクを選択するのに A: や B: というワードはあるが、
C: 以降は存在していない。 必要ならEXTEND80.BLKを編集してセルフコンパイルすれば
それらのワードが含まれたF83.COMが作成される。

EXTEND80.BLK には以下が含まれてる
: B: (S -- ) [ DOS ] 1 SELECT ;

まねして
: C: [ DOS ] 2 SELECT ;
として、セルフコンパイルすると C:が使える F83.COMを作ることが出来る。

CPMUGのソフトを展開する

2021-04-11 10:07:59 | 日記
ハードウエアを作成したのだから、ソフトを動かさないともったいない。
そこでCPMUGで興味のあるものをインストールし動かしてみる。
まずは圧縮されているものを展開しようとした。古いアーカイバARCが使われているが、幸いなことにDebianにはarcパッケージがあり展開出来る。
# sudo apt install arc

ところが展開出来ないものがある。どうもファイル名にスラッシュ (/)が入っている。
(こんなエラーメッセージ ARC: cpmug003.ark contains illegal filename S/TREK.BAS)

===調べてみるとこんなに展開出来ないものがある===
3.32 5K S/TREK.BAS BASIC-E PROGRAM. SEE DOC'S
11.1 76K BASIC/5.ASM PRO TECH 5K DISKIFIED BASIC
11.2 8K BASIC/5.COM 5K BASIC IN 8K (SIGN OF THE TIMES)
11.3 7K BASIC/5.DOC CP/M VERSION AND OTHER MAJOR EXTENSIONS
13.1 7K 15/PUZ.ASC PROGRAM IN MICROSOFT BASIC
20.14 33K STRTRK/1.BAS PROG IN BASIC-E/CBASIC. SEE ZOSO.20
21.21 21K STRTRK/2.ASC PROGRAM IN MICROSOFT BASIC. SEE ZOSO21.DOC/TOP
21.22 20K STRTRK/3.ASC PROGRAM IN MICROSOFT BASIC. SEE ZOSO21.DOC/TOP
21.27 4K W/SEARCH.ASC PROGRAM IN MICROSOFT BASIC. SEE ZOSO21.DOC/TOP
22.4 21K STRTRK/2.ASC A SECOND APPEARENCE OF PROGRAM 21.21
23A.11 4K STOICD/A.STC GRAPHICS FOR D/A HARDWARE
40.1 1K /.COM Quickie submit; Example:
40.2 1K /.DOC / asm foo.bbz;load b:foo
46.8 16K DU-8/12.ASM Disk dump/patch, supports many controllers.
46.9 29K DU-V61.ASM version of CPMUG 40.20,single density only
46.10 2K DU/MAP.DOC Doc. on CP/M directory format
46.12 10K MDIR8/17.ASM Fancy directory list program,
46.13 1K MDIR8/17.COM CP/M 1.4 (or 2.X, all users)
46.23 20K XD-7/4.ASM Fancy directory list program
46.24 2K XD-7/4.COM COM of above
47.2 10K BMAP7/11.ASM Bit Map program.
47.6 22K DIAL6/23.ASM Modem program with autodial for PMMI.
47.7 2K DIAL6/23.DOC DOC of above.
47.8 8K DIRS9/8.ASM Sorted directory program.
078.1 4K /.ASM Quickie SUBMIT from command
078.2 1K /.COM line.
078.3 1K /DUP.COM Same as /.ASM but produces a second copy
83.20 1K PAR/SER.SRT Parallel to serial impedance convert
83.21 1K POL/REC.SRT Complex polar to rectangular convert
83.22 1K REC/POL.SRT Complex rectangular to polar convert
83.23 1K REFC/Z.SRT Reflection coefficient to Z conv
83.24 1K SER/PAR.SRT Serial to parallel impedance convert
83.28 1K Z/REFC.SRT Z to reflection coefficient convert

やむなく、arcのソースを修正して、ファイル名の '/' を '-' に変更して展開するようにした。

$ sudo apt-get source arc
$ cd arc-5.21q
$ sudo vi arcext.c

115行目あたり、(CUTOFFには / が入っている)
if (strchr(hdr->name, CUTOFF) != NULL)
// arcdie("%s contains illegal filename %s", arcname, hdr->name);
*(strchr(hdr->name, CUTOFF)) = '-';

$ sudo make
$ sudo make install

arcで圧縮されたファイルを、フォルダを作成し展開
$ find cpmug -name *.ark | xargs -i sh -c 'mkdir `basename {} .ark` && cd `basename {} .ark` && arc x {}'

その他
 CP/Mのunarcで展開出来るかと思ったのだがエラーになる。
(RunCPMでのエミュレーションの場合)
Linuxなのでファイル名に / は駄目。AVRCPMでは展開出来ました。
 ====
 S/TREK .BAS 5007 8k Crunched 8 2684 47% 29 Apr 84 3:03p 8B1A

 Directory full
 UNARC aborted!
 ====

MINOLを動かした

2021-04-04 20:31:33 | 日記

CP/Mが動くハードが何種類も出来たが、それだけでは面白くない。

有り難いことに、インターネット上に様々なソフトがある。
そこでいくつかダウンロードして動かしてみた。

CPMUG17のMINOL.ASM
(1.75KBのTinyBasic)

参考
https://deramp.com/downloads/mfe_archive/010-S100%20Computers%20and%20Boards/00-MITS/40-Software/minolvtl/minol22.txt
https://brhfl.com/2019/05/minol/
http://vintagecomputer.net/cisc367/DrDobbs%20Apr%2076%20Minol%20Listing%20w-corrections.pdf

ソースを見ると、RST 2がINPUT, RST 4がOUTPUTなどCP/Mで直ぐ動くわけではないことがわかる。
CP/Mで動くようにソースを修正。LOAD SAVEを追加
https://github.com/ishihara-h/minol
(CP/M付属のASMでアセンブル出来ます)

特徴
・行番号は1〜254
・変数はA〜Z(1バイト長)
・ソースは入力してもスペースが消される
・予約後は以下のとおり
 PR、IN、IF、GOTO、CALL、END、RUN、LIST、NEW、CLEAR、OS
 先頭からマッチングするが、一意に定まった時点であとは読み飛ばし
  なので GOTO10 は GXXX10 と書いても動くし、PRA は PXA でも動く(Xはスペースでない任意の文字) 
・演算子は +, -, *, / だが優先順位はない
・CP/Mなのに保存出来ないのは辛いので、
 LOAD、SAVE を追加した。 LOADTEST SAVETEST (拡張子は入力不要)

注意点
 CPMUG17のMINOL.ASMにはバグがある。
> GOTO: INX D ;GOTO EXECUTOR

  ここれは INX H でないとおかしい。 (そのままだと GOTO文が3文字になり、GOT10等としないといけなくなる)
  (参考であげたURLでも微妙に違うんだけど)