MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!
[第132回]
●ZB3BASIC版STARTREK
説明書の作業をしていて、ZB3BASIC版STARTREKのテストをまだしていなかったことに気が付きました。
ZB3BASIC版STARTREKは「ワンボードマイコンでCP/Mを!」[第367回]〜「ワンボードマイコンでCP/Mを!」[第376回]で説明をしています。
ZB3BASIC版のSTARTREKは、MBASICの上で走るものをインターネットから入手して、それをもとにしてZB3BASIC用に直したものです。
なお、オリジナルのSTARTREKは「ワンボードマイコンでCP/Mを!」[第365回]で紹介しております。
●まさかのエラーです
オリジナルのSTARTREKはBASICプログラムのみですが、ZB3BASICはRND()を実装していないことなどから、ZB3BASIC版はその部分をマシン語のサブルーチンで実装しています。
そこで先にマシン語サブルーチンSTRTRKSB.BINをロードして、次にBASICプログラムのSTARTREK.TXTをロードしました。
マシン語のサブルーチンはほぼ瞬時にロードが完了しますが、BASICプログラムは長いのでかなりロードに時間がかかります。
ロードが完了するのにたっぷり2分半もかかりました。
RUN[Enter]を入力したところ、順調にスタートしたように見えたのですが…。
まさかのエラーが発生してしまいました。
マシン語のサブルーチンをコールしているところでエラーが発生しています。
ERR:15?
ZB3BASIC説明書のエラーコードのところを参照してみましたら。
15 記号の使い方が間違っている。たとえばコロン(:)やカンマ(,)が行の先頭にある。
いや。それはおかしい。
どこにも記号の使い方が間違っているところなどないはず。
そもそもこれは、ND80ZV(ND80Z3.5)用のZB3BASICでは問題なく実行できているプログラムです。
念のため、ZB80ZVでも実行して確認してみましたが、そんなおかしなエラーなど発生しませんでした。
となると。
まさか、今頃になってMYCPU80用ZB3BASICにバグが…。
がっくり、です。
USR()関数か?
ラベルの*RNDか?
それとも、RD=A%/33000か?
とりあえずはそのどこかにおかしい原因がある、と睨んで少しずつチェックを始めましたが…。
途中で、はっと気が付きました。
ひょっとしたら、マシン語サブルーチン!
ビンゴでありました。
下はマシン語サブルーチンSTRTRKSBのアセンブルリストです。
2013/4/13 21:15 strtrksb.txt END=806B ;subroutine of STARTREK ;rnd & Q$ subroutine ;13/4/11 ORG $8004 ; PA=$F440 AD=$F300 BD=$F328 R=$E000 QD=$E002 ; 8004 C31080 JP RND 8007 C33580 JP CLRQD 800A C34380 JP MID;B$=MID$(Q$,A%,3) 800D C35B80 JP QDAD;set A$ to Q$,position by A% 8010 2A00E0 RND:LD HL,(R) 8013 54 LD D,H 8014 5D LD E,L 8015 29 ADD HL,HL 8016 29 ADD HL,HL 8017 19 ADD HL,DE 8018 23 INC HL 8019 54 LD D,H 801A 5D LD E,L 801B 0604 LD B,04 801D AF RND2:XOR A 801E CB1C RR H 8020 CB1D RR L 8022 10F9 DJNZ RND2 8024 44 LD B,H 8025 4D LD C,L 8026 29 ADD HL,HL 8027 29 ADD HL,HL 8028 09 ADD HL,BC 8029 EB EX DE,HL 802A ED52 SBC HL,DE 802C CBBC RES 7,H 802E 2200E0 LD (R),HL 8031 2240F4 LD (PA),HL 8034 C9 RET ;clear Q$ 8035 2102E0 CLRQD:LD HL,QD 8038 06C3 LD B,C3 803A 3E20 LD A,20 803C 77 CLRQD2:LD (HL),A 803D 23 INC HL 803E 05 DEC B 803F C23C80 JP NZ,CLRQD2 8042 C9 RET ;B$=MID$(Q$,A%,3) 8043 2A40F4 MID:LD HL,(PA) 8046 1102E0 LD DE,QD 8049 19 ADD HL,DE 804A 1128F3 LD DE,BD 804D 3E03 LD A,03 804F 12 LD (DE),A 8050 13 INC DE 8051 47 LD B,A 8052 7E MID2:LD A,(HL) 8053 12 LD (DE),A 8054 23 INC HL 8055 13 INC DE 8056 05 DEC B 8057 C25280 JP NZ,MID2 805A C9 RET ;set A$ to Q$,position by A% 805B 2A40F4 QDAD:LD HL,(PA) 805E 1102E0 LD DE,QD 8061 19 ADD HL,DE 8062 1100F3 LD DE,AD 8065 13 INC DE 8066 EB EX DE,HL 8067 0603 LD B,03 8069 C35280 JP MID2 ; AD =F300 BD =F328 CLRQD =8035 CLRQD2 =803C MID =8043 MID2 =8052 PA =F440 QD =E002 QDAD =805B R =E000 RND =8010 RND2 =801D |
;subroutine of STARTREK ;rnd & Q$ subroutine ;13/4/11 ;15/2/14 for MYCPU80 ; ORG $8004 ; SBCHLDE=$10B4 ; PA=$F440 AD=$F300 BD=$F328 R=$E000 QD=$E002 ; JMP RND JMP CLRQD JMP MID;B$=MID$(Q$,A%,3) JMP QDAD;set A$ to Q$,position by A% RND:LHLD R MOV D,H MOV E,L DAD H DAD H DAD D INX H MOV D,H MOV E,L MVI B,04 RND2:XRA A MOV A,H;? RR H RAR MOV H,A MOV A,L;? RR L RAR MOV L,A DCR B;? DJNZ RND2 JNZ RND2 MOV B,H MOV C,L DAD H DAD H DAD B XCHG CALL SBCHLDE;? SBC HL,DE MOV A,H;? RES 7,H ANI 7F MOV H,A SHLD R SHLD PA RET ;clear Q$ CLRQD:LXI H,QD MVI B,C3 MVI A,20 CLRQD2:MOV M,A INX H DCR B JNZ CLRQD2 RET ;B$=MID$(Q$,A%,3) MID:LHLD PA LXI D,QD DAD D LXI D,BD MVI A,03 STAX D INX D MOV B,A MID2:MOV A,M STAX D INX H INX D DCR B JNZ MID2 RET ;set A$ to Q$,position by A% QDAD:LHLD PA LXI D,QD DAD D LXI D,AD INX D XCHG MVI B,03 JMP MID2 ; |
2015/2/13 11:27 mstrtrks.txt END=8072 ;subroutine of STARTREK ;rnd & Q$ subroutine ;13/4/11 ;15/2/14 for MYCPU80 ; ORG $8004 ; SBCHLDE=$10B4 ; PA=$F440 AD=$F300 BD=$F328 R=$E000 QD=$E002 ; 8004 C31080 JMP RND 8007 C33C80 JMP CLRQD 800A C34A80 JMP MID;B$=MID$(Q$,A%,3) 800D C36280 JMP QDAD;set A$ to Q$,position by A% 8010 2A00E0 RND:LHLD R 8013 54 MOV D,H 8014 5D MOV E,L 8015 29 DAD H 8016 29 DAD H 8017 19 DAD D 8018 23 INX H 8019 54 MOV D,H 801A 5D MOV E,L 801B 0604 MVI B,04 801D AF RND2:XRA A 801E 7C MOV A,H;? RR H 801F 1F RAR 8020 67 MOV H,A 8021 7D MOV A,L;? RR L 8022 1F RAR 8023 6F MOV L,A 8024 05 DCR B;? DJNZ RND2 8025 C21D80 JNZ RND2 8028 44 MOV B,H 8029 4D MOV C,L 802A 29 DAD H 802B 29 DAD H 802C 09 DAD B 802D EB XCHG 802E CDB410 CALL SBCHLDE;? SBC HL,DE 8031 7C MOV A,H;? RES 7,H 8032 E67F ANI 7F 8034 67 MOV H,A 8035 2200E0 SHLD R 8038 2240F4 SHLD PA 803B C9 RET ;clear Q$ 803C 2102E0 CLRQD:LXI H,QD 803F 06C3 MVI B,C3 8041 3E20 MVI A,20 8043 77 CLRQD2:MOV M,A 8044 23 INX H 8045 05 DCR B 8046 C24380 JNZ CLRQD2 8049 C9 RET ;B$=MID$(Q$,A%,3) 804A 2A40F4 MID:LHLD PA 804D 1102E0 LXI D,QD 8050 19 DAD D 8051 1128F3 LXI D,BD 8054 3E03 MVI A,03 8056 12 STAX D 8057 13 INX D 8058 47 MOV B,A 8059 7E MID2:MOV A,M 805A 12 STAX D 805B 23 INX H 805C 13 INX D 805D 05 DCR B 805E C25980 JNZ MID2 8061 C9 RET ;set A$ to Q$,position by A% 8062 2A40F4 QDAD:LHLD PA 8065 1102E0 LXI D,QD 8068 19 DAD D 8069 1100F3 LXI D,AD 806C 13 INX D 806D EB XCHG 806E 0603 MVI B,03 8070 C35980 JMP MID2 ; AD =F300 BD =F328 CLRQD =803C CLRQD2 =8043 MID =804A MID2 =8059 PA =F440 QD =E002 QDAD =8062 R =E000 RND =8010 RND2 =801D SBCHLDE =10B4 |