CP/Mが動くハードが何種類も出来たが、それだけでは面白くない。
有り難いことに、インターネット上に様々なソフトがある。
そこでいくつかダウンロードして動かしてみた。
CPMUG002 LLLBASIC
CPMUG010 LLLBASIC DISK I/O追加
LLLBASICは3つのソース、LLLBASIC.ASM,LLLFP.ASM,LLLMON.ASMから出来ている。もともとはCP/M用ではなかったため、LLLMON.ASMを追加しているようだ。CPMUG002とCPMUG010は、DISK I/Oの追加とメモリレイアウトの差である。
(CPMUG010の方が使いやすいし、COMファイルも小さく出来る)
3つのファイルを結合するため、DDTを使用する必要がある。
アセンブル(CPMUG002の場合)
----------------------
G>ASM LLLBASIC
CP/M ASSEMBLER - VER 2.0
8FDC
00EH USE FACTOR
END OF ASSEMBLY
RunCPM Version 5.3 (CP/M 2.2 60K)
G>ASM LLLFP
CP/M ASSEMBLER - VER 2.0
9800
007H USE FACTOR
END OF ASSEMBLY
RunCPM Version 5.3 (CP/M 2.2 60K)
G>ASM LLLMON
CP/M ASSEMBLER - VER 2.0
014F
000H USE FACTOR
END OF ASSEMBLY
RunCPM Version 5.3 (CP/M 2.2 60K)
G>DDT
DDT VERS 1.4
-ILLLMON.HEX
-R
NEXT PC
014F 0000
-ILLLBASIC.HEX
-R
NEXT PC
8FDC 0000
-ILLLFP.HEX
-R
NEXT PC
9800 0000
-^C
RunCPM Version 5.3 (CP/M 2.2 60K)
NEXTが9800なので、01〜97の97Hページを保存すれば良い。 16進数で97 => 10進数で151
G>SAVE 151 LLLBASIC.COM
G>LLLBASIC
READY
10 FOR X=0 TO 10
20 PRINT X
30 NEXT X
LIST
10FORX=0TO10
20PRINTX
30NEXTX
40 END
RUN
0.0000E 00
1.0000E 00
2.0000E 00
3.0000E 00
4.0000E 00
5.0000E 00
6.0000E 00
7.0000E 00
8.0000E 00
9.0000E 00
1.0000E 01
READY
アセンブル(CPMUG010の場合)
--------------------------
G>ASM LLLBASIC
CP/M ASSEMBLER - VER 2.0
10DD
00FH USE FACTOR
END OF ASSEMBLY
RunCPM Version 5.3 (CP/M 2.2 60K)
G>ASM LLLFP
CP/M ASSEMBLER - VER 2.0
17AD
007H USE FACTOR
END OF ASSEMBLY
RunCPM Version 5.3 (CP/M 2.2 60K)
G>ASM LLLMON
CP/M ASSEMBLER - VER 2.0
2000
001H USE FACTOR
END OF ASSEMBLY
RunCPM Version 5.3 (CP/M 2.2 60K)
G>DDT
DDT VERS 1.4
-ILLLBASIC.HEX
-R
NEXT PC
10DD 0000
-ILLLFP.HEX
-R
NEXT PC
17AD 0000
-ILLLMON.HEX
-R
NEXT PC
1A02 0000
-^C
RunCPM Version 5.3 (CP/M 2.2 60K)
NEXTが1A02なので、01〜1Aの1AHページを保存すれば良い。 16進数で1A => 10進数で26
G>SAVE 26 LLLBASIC.COM
G>
感想
LLLBASICはディスクの読み出しで面白い方法を使用している。
起動時にファイル名を指定すると、FCBにそのファイルの状態が保存されることを利用しており、以下のように「PTA」コマンドにより対象ファイルからプログラムを読み込む。
しかし書き込むことは出来ない。EDなどでファイルを作成しそれを読むことを想定している。
G>DIR
G: LLLBASIC ASM : LLLBASIC COM : LLLBASIC DOC : LLLBASIC HEX
G: LLLBASIC PRN : LLLFP ASM : LLLFP HEX : LLLFP PRN
G: LLLMON ASM : LLLMON HEX : LLLMON PRN : TEST FIL
G>LLLBASIC TEST.FIL
READY
PTA
READY
LIST
10PRINT"THIS IS A SIMPLE BENCHMARK PROGRAM. IT"
20PRINT"MULTIPLIES, DIVIDES, ADDS AND SUBTRACTS."
25PRINT"INPUT 1ST NUMBER ";
30INPUTA
35PRINT"INPUT 2ND NUMBER ";
40INPUTB
45PRINT
50LETC=A+B
60LETA=A+1
70LETE=B/C
80LETF=A*E
90LETC=C-F
95PRINT"A IS";A;" B IS";B;" C IS";C
97PRINT"E IS";E;" F IS";F
98PRINT
99PRINT
100IFA=100THEN200
110GOTO50
200PRINT"THE LOOP IS DONE"
202PRINT"NOW FOR THE FANCY STUFF!!"
203PRINT"WE ARE GOING TO DO A WARM BOOT"
205CALL(1)
210END
READY
コマンド
---------
RUN、PLS、LIS、SCR、PTA
文
------------
LET、PRI(xx)、REM、STO(x)、END
GOT(x)、IF、INP(xx)、DIM、CAL(x)、GOSU(x)、RET
FOR、NEXT、THEN、TO、STEP
GET、PUT
ここでPRI(xx)とは、通常のBASICのPRINTと同じなのであるが、PRIまで同じなら、PRIxxでも PRIAAでも同じことを示す。
PRIxxA == PRIAAA == PRINTA
TINYBASICのような短縮形ではないため、ユーザプログラムのサイズの減少は出来ない。すこしでもインタプリタのサイズを小さくしようとしたのだと思う。
※コメント投稿者のブログIDはブログ作成者のみに通知されます