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
※コメント投稿者のブログIDはブログ作成者のみに通知されます