石原 博の覚書

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

TINIDISK

2021-07-18 19:58:32 | 日記

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

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

CPMUG011  TINIDISK

アセンブルは問題なく終了
-------------------------
F>ASM TINIDISK
CP/M ASSEMBLER - VER 2.0
2000
00AH USE FACTOR
END OF ASSEMBLY

RunCPM Version 5.3 (CP/M 2.2 60K)

F>LOAD TINIDISK

FIRST ADDRESS 0100
LAST  ADDRESS 0AB8
BYTES READ    0985
RECORDS WRITTEN 14


F>TINIDISK

SHERRY BROTHERS TINY BASIC VER. 3.1

OK
>10 FOR X=0 TO 10
>20   PRINT X
>30 NEXT X
>LIST
  10 FOR X=0 TO 10
  20 PRINT X
  30 NEXT X

OK
>RUN
     0
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10

OK
>SAVE TESTPG

OK
>BYE

RunCPM Version 5.3 (CP/M 2.2 60K)

F>dir
F: STARTREK TBI : TESTPG   TBI : TINIDISK ASM : TINIDISK COM
F: TINIDISK DOC : TINIDISK HEX : TINIDISK PRN


感想
ベースは有名なWANGのPalo Alto Tiny BASIC(この時すでにCOPYLEFTになってる)

;*                  TINY BASIC FOR INTEL 8080
;*                      VERSION 1.0
;*                    BY LI-CHEN WANG
;*                     10 JUNE, 1976 
;*                       @COPYLEFT 
;*                  ALL WRONGS RESERVED


面白いのは、もともとのWANGのTINY BASICはRST1〜7をサブルーチンの代わりに使用し、インタープリタを小さくしているため、CP/Mでは変更が必要となる。通常ならCALLに置き換えてアセンブルし直すのだが、このプログラムでは、なんと初期化でRST1〜7を上書きしている。
(なのでRST7を使用するDDTでのデバッグは出来ない)

                ; RESTART TABLE
 0A50            ORG 0A50H
                RSTBL:
 0A50 E3               XTHL           ;*** TSTC OR RST 1 *** 
 0A51 EF               RST  5         ;IGNORE BLANKS AND 
 0A52 BE               CMP  M         ;TEST CHARACTER
 0A53 C32F01           JMP  TC1       ;REST OF THIS IS AT TC1
                ;* 
 000E =         CRLF: EQU 0EH ;EXECUTE TIME LOCATION OF THIS INSTRUCTION.
 0A56 3E0D       MVI  A,0DH     ;*** CRLF ***
                ;* 
 0A58 F5               PUSH PSW       ;*** OUTC OR RST 2 *** 
 0A59 3AC009           LDA  OCSW      ;PRINT CHARACTER ONLY
 0A5C B7               ORA  A         ;IFF OCSW SWITCH IS ON
 0A5D C35D09           JMP  OC2       ;REST OF THIS IS AT OC2
                ;* 
 0A60 CD1606           CALL EXPR2     ;*** EXPR OR RST 3 *** 
 0A63 E5               PUSH H         ;EVALUATE AN EXPRESION 
 0A64 C3D205           JMP  EXPR1     ;REST OF IT IS AT EXPR1
 0A67 57               DB   'W' 
                ;* 
 0A68 7C               MOV  A,H       ;*** COMP OR RST 4 *** 
 0A69 BA               CMP  D         ;COMPARE HL WITH DE
 0A6A C0               RNZ            ;RETURN CORRECT C AND
 0A6B 7D               MOV  A,L       ;Z FLAGS 
 0A6C BB               CMP  E         ;BUT OLD A IS LOST 
 0A6D C9               RET
 0A6E 414E             DB   'AN'
                ;* 
 0028 =         SS1: EQU 28H ;EXECUTE TIME LOCATION OF THIS INSTRUCTION.
 0A70 1A         LDAX D         ;*** IGNBLK/RST 5 ***
 0A71 FE20             CPI  40Q       ;IGNORE BLANKS 
 0A73 C0               RNZ            ;IN TEXT (WHERE DE->)
 0A74 13               INX  D         ;AND RETURN THE FIRST
 0A75 C32800           JMP  SS1       ;NON-BLANK CHAR. IN A
                ;* 
 0A78 F1               POP  PSW       ;*** FINISH/RST 6 ***
 0A79 CDCD07           CALL FIN       ;CHECK END OF COMMAND
 0A7C C3E007           JMP  QWHAT     ;PRINT "WHAT?" IFF WRONG
 0A7F 47               DB   'G' 
                ;* 
 0A80 EF               RST  5         ;*** TSTV OR RST 7 *** 
 0A81 D640             SUI  100Q      ;TEST VARIABLES
 0A83 D8               RC             ;C:NOT A VARIABLE
 0A84 C30301           JMP  TSTV1     ;JUMP AROUND RESERVED AREA
                ; ROUTINE TO COPY RESTART TABLE INTO LOW MEMORY
 0008 =         RST1: EQU 8 ;LOCATION FIRST REATART ROUTINE
                
 0040 =         EOT: EQU 40H ;LAST LOC TO BE FILLED
                
 0AA0            ORG 0AA0H
 0AA0 210800    NINIT: LXI H,RST1  ;POINT TO BEGINNING OF MODEL TABLE
 0AA3 11500A     LXI D,RSTBL
 0AA6 1A        NXT: LDAX D
 0AA7 77         MOV M,A
 0AA8 23         INX H
 0AA9 13         INX D
 0AAA 3E40       MVI A,EOT
 0AAC BD         CMP L
 0AAD C2A60A     JNZ NXT
 0AB0 21FF09     LXI H,INIT
 0AB3 220101     SHLD START+1
 0AB6 C30001     JMP START
 0F00                  ORG  0F00H
 0F00 =         TXTEND EQU  $         ;TEXT SAVE AREA ENDS 
 0F00           VARBGN DS   2*27      ;VARIABLE @(0)
 0F36                  DS   1         ;EXTRA BYTE FOR BUFFER
 0F37           BUFFER DS   80        ;INPUT BUFFER
 0F87 =         BUFEND EQU  $         ;BUFFER ENDS
 0F87                  DS   40        ;EXTRA BYTES FOR STACK
 0FAF =         STKLMT EQU  $         ;TOP LIMIT FOR STACK
 2000                  ORG  2000H
 2000 =         STACK  EQU  $         ;STACK STARTS HERE
 2000                  END

 

コマンド
-------
LIST,RUN,NEW,LOAD,SAVE,BYE


--------
NEXT,LET,OUT,POKE,WAIT,IF
GOTO,GOSUB,RETURN
REM,FOR,INPUT,PRINT,STOP

関数
--------
RND,INP,PEEK,USR,ABS,SIZE


LLLBASIC

2021-07-18 19:06:00 | 日記

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のような短縮形ではないため、ユーザプログラムのサイズの減少は出来ない。すこしでもインタプリタのサイズを小さくしようとしたのだと思う。


BASIC-5

2021-07-18 13:17:25 | 日記

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

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

CPMUG011

BASIC-5

コマンド
RUN、LLIST、SCR、NEW、SAVE、OLD、SYSTEM
NAME、ERA、UNSAVE、LIST

関数
ABS、INT、ARG、CALL、RND、SGN、SIN、SQR
TAN、COS、POP、PEEK、INP、UNTRAP


LET、NEXT、IF、GOTO、GOSUB、RETURN
READ、DATA、FOR、LPRINT、:
INPUT、DIM、STOP、END
RESTORE、REM、CLEAR、PUSH、POKE
OUT、TRAP、BEAM、DRAW、PRINT

変数は英字(A〜Z)+数字(0〜9)


BASIC-5.ASMは問題なくアセンブル出来る
-----
F>ASM BASIC-5
CP/M ASSEMBLER - VER 2.0
1FD9
01DH USE FACTOR
END OF ASSEMBLY

RunCPM Version 5.3 (CP/M 2.2 60K)

F>LOAD BASIC-5

FIRST ADDRESS 0100
LAST  ADDRESS 1E05
BYTES READ    1C35
RECORDS WRITTEN 3B


使用例
-------
F>BASIC-5

BASIC/5 INTERACTIVE INTERPRETER    V Z1.0  10/16/77


NEW OR OLD? NEW
NEW PROGRAM NAME: TESTPG


READY
10 FOR X=0 TO 10
20  PRINT X
30 NEXT X
LIST
10 FOR X=0 TO 10
20 PRINT X
30 NEXT X

RUN


 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 


READY
SAVE


READY
SYSTEM

プログラムはディスクに、文字数(1バイト)+行番号(2バイト)+中間コード+0DHで保存される。
---------
RunCPM Version 5.3 (CP/M 2.2 60K)

F>dir
F: BASIC-5  ASM : BASIC-5  COM : BASIC-5  DOC : BASIC-5  HEX
F: BASIC-5  PRN : DEFAULT  BSC : TESTPG   BSC
F>

$ hexdump -C TESTPG.BSC
00000000  0e 0a 00 88 20 58 f5 30  20 9e 20 31 30 0d 07 14  |.... X.0 . 10...|
00000010  00 97 20 58 0d 07 1e 00  81 20 58 0d 01 00 00 00  |.. X..... X.....|

中身を詳しく見ると
-----------
0e 文字数
0a 00 行番号10
88 FOR
20 スペース
58 X
f5 =
30 0
20 スペース
9e TO
20 スペース
31 1
30 0
0d 行末
07 文字数
14 00 行番号20
97 PRINT
20 スペース
58 X
0d 行末
07 文字数
1e 00 行番号30
81 NEXT
20 スペース
58 X
0d 行末
01 文字数=1 -> プログラム末


感想
----------
プログラム名を最初に入れるところが面白い

・起動時にプログラム名を入力しその後はその名前で保存する。
 (NEWすると初期化するとともに、プログラム名を要求される。名前を変えず初期化は SCR)
・起動時にOLDを選びプログラム名を入れると、ディスクから「プログラム名.BSC」がロードされる。
  (OLDというコマンドでも、名前を指定してロード出来る)
・名前はNAMEで確認出来る。
・TRAPという仕組みがある。スタック構造でエラー発生時に移行する行番号をPUSHしていく。
 
TRAPの例
--------
LIST
10 TRAP 200
20 TRAP 100
30 PRINT 1/0
40 STOP
100 PRINT "TRAP1"
110 PR "ERROR"
120 STOP
200 PRINT "TRAP2"
210 STOP

RUN

TRAP1
TRAP2


STOP IN LINE 210

READY