2020.7.7
前へ
次へ
ホームページトップへ戻る

[新連載]復活!TINY BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
すべてはここからはじまりました。
中日電工も。
40年前を振り返りつつ新連載です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜



[第34回]


●中日電工版TINY BASIC(2)

前回は「中日電工版」TINY BASICのアセンブルリストをお見せしました。
オリジナルのTINY BASICを出来る限りそのままの形でND80Z3.5(ND8080他の当社ボード)上で動作するように最小限の手を加えたものです。
しかしリストを見ていただきますと、先頭の部分からオリジナルのプログラムとは全く異なっていることにお気付きかもしれません。
オリジナルに対して変更しなければならなかったところは第一にはオリジナル版がTINY BASICプログラム本体を0000から始まるROM上に置いている点です。
これに対して「中日電工版」はデバッグを容易に行なえるようにすることなどの理由からZB3BASICを起動させた後で8000〜のRAM上に置いて動作するようにしてあります。
主としてアドレスの違いによってそれが関係するところは全面的に変更する必要がありました。
それは単にアドレスそのものを変更するだけでは済まなくて、アセンブラの機能の違いによるさらなる手直しが必要でした。
そのことについては今回はちょっと時間が足りませんので次回に説明することにしますが、「中日電工版」の先頭に各命令処理へのジャンプテーブルを置いているのはそのためです。
オリジナルプログラムの先頭部分のリストは[第10回]でお見せしていますが、比較を容易にするため、下の「中日電工版」の先頭部分のリストの次のところに再掲いたしました。
両者を比較していただければすぐにわかりますように、「中日電工版」の先頭のジャンプテーブル部分が終ったところからがオリジナル版のリストの先頭部分に一致しています。

オリジナル版では先頭の基本的なサブルーチンはRST 1〜RST 7に割り当てていて、プログラム本体の中でもそのままRST 1〜RST 7としてコールしています。
しかしプログラム本体の中でRST 1〜RST 7の名前のままでコールしていては一体何をしているのかすぐには思い出せません。
もともとRST 0〜RST 7が割り付けられているアドレス0000〜のエリアはシステムROMが置かれているところなので、そこにTINY BASICを置くわけにはいきません。
となるとどの道RST nの名前でサブルーチンコールをするわけにはいきませんから普通のサブルーチン名をつけて普通にCALL命令で呼び出すことになります。
そういうことでもありますから「中日電工版」ではRST 1〜RST 7についてはどういうサブルーチンなのかを想起し易い名前をつけてCALLするように書き換えました。
ただできるだけオリジナル版と対比し易いように先頭のジャンプテーブルが終ったすぐのところに、オリジナル版のRST 0〜RST 7と同じ順序で対応するサブルーチンを配置しました。

2020/6/6  9:  tinybst7.txt
END=9FDE
              ;;;TINY BASIC from PALO ALTO
              ;20/3/3 5/8 5/9 5/10 5/11 5/12 5/13 5/28
              ;6/6
              ;
                ;SOUT=$067C;5/10
                SOUT=$10AB
                ;SIN=$06A3
                SIN=$10AE
                REENT=$1033
              ;
                ORG $8000
8000 C35D80     JMP START
8003 C3D681     JMP LIST
8006 C3A681     JMP RUN
8009 C39781     JMP NEW
800C C3D682     JMP NEXT
800F C3B683     JMP LET
8012 C33B83     JMP IFF;"IF"
8015 C3C581     JMP GOTO
8018 C33482     JMP GOSUB
801B C35682     JMP RETURN
801E C33783     JMP REM
8021 C37182     JMP FOR
8024 C35683     JMP INPUT
8027 C3EE81     JMP PRINT
802A C3A081     JMP STOP
802D C3B083     JMP DEFLT
8030 C3E884     JMP RND
8033 C31585     JMP ABS
8036 C31E85     JMP SIZE
8039 C3C684     JMP XP40
803C C38182     JMP FR1;"TO"
803F C39985     JMP QWHAT;"WHAT"
8042 C38D82     JMP FR2;"STEP"
8045 C39382     JMP FR3
8048 C3CA83     JMP XP11;">="
804B C3D083     JMP XP12;"#"
804E C3D683     JMP XP13;">"
8051 C3E583     JMP XP15;"="
8054 C3DD83     JMP XP14;"<="
8057 C3EB83     JMP XP16;"<"
805A C3F183     JMP XP17
              ;
              START:;LXI SP,STACK
805D 00         NOP
805E 00         NOP
805F 00         NOP
8060 3EFF       MVI A,FF
8062 C33387     JMP INIT
              ;RST 1(test character)
8065 E3       TSTC:XTHL
8066 CD8480     CALL SPJP
8069 BE         CMP M
806A C3C780     JMP TC1
              ;
806D 3E0D     CRLF:MVI A,0D
              ;RST 2(out character)
806F F5       OUTC:PUSH PSW
8070 3A0090     LDA OCSW
8073 B7         ORA A
8074 C34F87     JMP OC2
              ;RST 3(expression)
8077 CD0884   EXPR:CALL EXPR2
807A E5         PUSH H
807B C3C483     JMP EXPR1
              ;RST 4(compare HL with DE)
807E 7C       HDCP:MOV A,H
807F BA         CMP D
8080 C0         RNZ
8081 7D         MOV A,L
8082 BB         CMP E
8083 C9         RET
              ;RST 5(jump space code)
8084 1A       SPJP:LDAX D
8085 FE20       CPI 20
8087 C0         RNZ
8088 13         INX D
8089 C38480     JMP SPJP
              ;RST 6(check end)
808C F1       ENDCK:POP PSW
808D CD8085     CALL FIN
8090 C39985     JMP QWHAT
              ;RST 7(test variables)
8093 CD8480   TSTV:CALL SPJP
8096 D640       SUI 40
8098 D8         RC
8099 C2B780     JNZ TV1
809C 13         INX D
809D CDD784     CALL PARN
80A0 29         DAD H
80A1 DA0081     JC QHOW
80A4 D5         PUSH D
80A5 EB         XCHG
80A6 CD1E85     CALL SIZE
80A9 CD7E80     CALL HDCP
80AC DAC985     JC ASORRY
80AF 21669F     LXI H,VARBGN
80B2 CD4185     CALL SUBDE
80B5 D1         POP D
80B6 C9         RET
80B7 FE1B     TV1:CPI 1B
80B9 3F         CMC
80BA D8         RC
80BB 13         INX D
80BC 21669F     LXI H,VARBGN
80BF 07         RLC
80C0 85         ADD L
80C1 6F         MOV L,A
80C2 3E00       MVI A,00
80C4 8C         ADC H
80C5 67         MOV H,A
80C6 C9         RET
              ;
80C7 23       TC1:INX H
80C8 CAD280     JZ TC2
80CB C5         PUSH B
80CC 4E         MOV C,M
80CD 0600       MVI B,00
80CF 09         DAD B
80D0 C1         POP B
80D1 1B         DCX D
80D2 13       TC2:INX D
80D3 23         INX H
80D4 E3         XTHL
80D5 C9         RET
              ;
80D6 210000   TSTNUM:LXI H,$0000
80D9 44         MOV B,H
80DA CD8480     CALL SPJP
80DD FE30     TN1:CPI 30
80DF D8         RC
80E0 FE3A       CPI 3A
80E2 D0         RNC
80E3 3EF0       MVI A,F0
80E5 A4         ANA H
80E6 C20081     JNZ QHOW
80E9 04         INR B
80EA C5         PUSH B
80EB 44         MOV B,H
80EC 4D         MOV C,L
80ED 29         DAD H
80EE 29         DAD H
80EF 09         DAD B
80F0 29         DAD H
80F1 1A         LDAX D
80F2 13         INX D
80F3 E60F       ANI 0F
80F5 85         ADD L
80F6 6F         MOV L,A
80F7 3E00       MVI A,00
80F9 8C         ADC H
80FA 67         MOV H,A
80FB C1         POP B
80FC 1A         LDAX D
80FD F2DD80     JP TN1
8100 D5       QHOW:PUSH D
8101 110781   AHOW:LXI D,HOW
8104 C39D85     JMP ERROR
              ;
8107 484F573F HOW:"HOW?"
810B 0D         DB 0D
810C 4F4B     OK:"OK"
810E 0D         DB 0D
810F 57484154 WHAT: "WHAT"
8113 3F         "?"
8114 0D         DB 0D
8115 534F5252 SORRY:"SORR"
8119 59         "Y"
811A 0D         DB 0D 


下は[第10回]でお見せしたオリジナル版のTINY BASICの先頭部分のプログラムリストです。
上の「中日電工版」のリストのアドレス805Dからがオリジナル版の先頭部分に相当しています。








復活!TINY BASIC[第34回]
2020.7.7upload

前へ
次へ
ホームページトップへ戻る