2015.2.16

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

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  

おお。
アドレス801EのRR H、
8020のRR L、
8022のDJNZ、
802AのSBC HL,DE、
802CのRES 7,H、

これじゃあまともに動くはずがありませぬ。
うう。
STRTRKSBを8080用に変換することをうっかり忘れておりました。

●8080用に直したマシン語サブルーチンMSTRTRKSです

STRTRKSBのソースプログラムをインテルニーモニックに書き直してMSTRTRKSを作りました。

;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
;


こちらはMSTRTRKSのアセンブルリストです。
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  

SBC HL,DEはシステムプログラムで用意したSBCHLDEサブルーチンをCALLしています。

●今度はうまくいきました

そのようにして新しく作ったMSTRTRKS.BINをロードして、もう一度トライしました。



エラーの原因をさぐろうとして、ラベルの*RNDを確認しているところが残っています。
ここで、マシン語サブルーチンが原因かも、と気が付いたのでありました。

今度は大丈夫そうです。

ここでかなり(約1分ほど)待たされます。

今度はエラーにはならずに、先に進みました。


無事にゲームが開始されました。


これにて一件落着、でした。

[2015.2.18追記]
[第134回]に書きましたように、今回の記事はすでに[第101回]に書いておりました。
内容は完全に重複していますが、[第101回]はWindows98SEでのテストで今回はWindows7でのテストです。
そこのところのみ相違がありますので、本当はみっともないので削除してしまいたい気持ちを抑えて、参考のためこのまま残すことにいたしました(恥)。

MYCPU80でCP/Mを![第132回]
2015.2.16upload
2015.2.18追記

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