石原 博の覚書

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

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



最新の画像もっと見る

コメントを投稿