2015.1.15

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

MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!


[第101回]


●そうだった!インテルニーモニック!

本日になりましてから「これはいかんなぁ」と、あることにやっと気が付きました。
本当は前回でも気が付いていたはずなのですが…。

今までのテストプログラムはND80Z3.5(ND80ZV)用のZB3DOS(CP/M互換DOS)のためのものでした。
CP/MはCPUが8080であることを前提に書かれていますが、ND80Z3.5(ND80ZV)のCPUはZ80です。
Z80は8080上位互換なので8080にある命令のみでコーディングすればザイログニーモニックでも全く問題はありません。
そこで今までのテストプログラムは全てザイログニーモニックでコーディングしたものを中日電工オリジナルのZ80アセンブラZASMでアセンブルしました。

しかしMYCPU80は8080互換です。
そのMYCPU80用のZB3DOS(CP/M互換DOS)のためのテストプログラムのソースリストがザイログニーモニックでよいのか?
マシン語に落ちてしまえばザイログニーモニック(Z80)でもインテルニーモニック(8080)でも同じコードになってしまいますから実行上の問題はありません。
しかしユーザー様のための参考プログラムも兼ねるという観点からしますれば、そりゃあ問題は大有りでありましょう。

当初の腹積もりではND80Z3.5(ND80ZV)用のZB3DOS(CP/M互換DOS)のために書いたテストプログラムをそのまま実行して問題がなければそれでOK、テスト作業完了と簡単に考えていたのでありますが…。
ここに気が付いてしまったからには、もうやるしかありませんでしょう。
まだテスト作業に入ったばかりだったのがせめてもの救いであります。

おお。
そういえば。
ND80Z3.5(ND80ZV)用のZB3DOS(CP/M互換DOS)の付属CDROMにはそれらの参考プログラムのソースリストが収めてあります。
それも全て変更しなければなりませぬ。

下は付属CDROMの¥ZASMフォルダに収められているアセンブラソースプログラムファイルです。



このうち最後のZBDOS4K.TXTとZCCP4K.TXTはMYCPU80用ではありませんから、差し換えるつもりです。

あれ?
STARTREK.TXT?
STRTRKSB.TXT?

おお。思い出しました。
これは中日電工製ZB3BASIC用に改造したSTARTREKではありませぬか。
詳しくは「ワンボードマイコンでCP/Mを!」[第367回]をご参照ください。
うむむ。
STRTRKSB.TXTはアセンブラソースプログラムですからここにあってもよいのですけれど、STARTREK.TXTはZB3BASICプログラムですから、これは置く場所が違っています。
それはともかくとしまして、せっかくZB3BASICもMYCPU80用を作りましたので、やっぱりこれもMYCPU80で試してみなくてはいけませんねえ。

またまたお話が横にそれていってしまいそうですが。
とりあえず、CP/Mテストプログラムにつきましてはちょいと横におきまして。
思い立ったが吉日であります。
さっそく試してみることにいたしました。



CP/M版ではありませんから、ZB3BASICを起動してすぐに、まずは/LDコマンドでマシン語サブルーチンSTRTRKSB.BINをアドレス8004にロードしました。
続いてZB3BASIC用のSTARTREK.TXTを/LOADコマンドでアドレス8100にロードしました。
こちらはかなり大きなプログラムですからロードするのにずいぶん時間がかかりました。
時計を見ながらですからやや不正確ですが、2分17〜18秒ほどかかりました。
STARTREK.TXTは21KBです。
/LOADのボーレートは19200bpsですからスタートビット、ストップビットを加えて計算すると1920バイト/秒になります。
21/1.92≒11秒でロード完了するはずなのですが…。
BASICのテキストプログラムはロードするだけではなくて、それを中間言語に翻訳しながらメモリに書き込んでいます。
その翻訳時間は転送ボーレートに依存するのではなくてCPUクロックに依存します。
MYCPU80のCPUクロックは2MHzですから、翻訳作業に大半の時間を費やしてしまいます。
ですので、ことBASICテキストプログラムに限って言えば、ボーレートを上げることは無意味ということになります。

STARTREK.TXTをロードしたあとで、多分これではだめかも、ということに気が付きました。
ここも今回のいきなりのテーマでありますZ80と8080の違いに関係してきます。
先にロードしたSTRTRKSB.BINはマシン語のプログラムです。
このプログラムもソースプログラムはザイログニーモニックで書きました。
ZB3BASIC用のサブルーチンですから、これこそ8080を意識せずにZ80のプログラムとして書いています。
念のためにSTRTRKSB.TXT(ソースプログラム)を確認してみましたら、やっぱり何箇所か8080にはない命令を使っておりました。

そこで今回のテーマの手始めに、このソースプログラムをインテルニーモニックに変更したうえで、8080では実行できない命令を8080の命令に書き直すことにしました。
というとちょっと面倒なことのように思えますが、ザイログニーモニックからインテルニーモニックへの変換は、そのために作った変換プログラムを使いますから、最小限必要な手間のみで完了できます([第9回]参照)。

●サブルーチンプログラムMSTRTRKS

下はそのようにしてザイログニーモニックからインテルニーモニックに変換して作ったMSTRTRKSのソースプログラムリストです。

;subroutine of STARTREK
;rnd & Q$ subroutine
;13/4/11
        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
;?      RR H
        MOV A,H
        RAR
        MOV H,A
;?      RR L
        MOV A,L
        RAR
        MOV L,A
;?      DJNZ RND2
        DCR B
        JNZ RND2
        MOV B,H
        MOV C,L
        DAD H
        DAD H
        DAD B
        XCHG
;?      SBC HL,DE
        CALL SBCHLDE
;?      RES 7,H
        MOV A,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
;

?が付いている行はインテルニーモニックに変換できなかった命令です。
コンバート後に手作業で ; をつけて注釈行にした後、その下にそれに代わる命令動作になるように8080の命令を書き加えてあります。
SBC HL,DE
はシステムプログラムでも多用していますので、システムモニタサブルーチンに組み込んであります。
上のプログラムではそれをコールしています。
参考までに、下はシステムモニタサブルーチンに組み込んだSBCHLDEサブルーチンです。

10B4 C3A616   JMP SBCHLDE

              ;
16A6 C5       SBCHLDE:PUSH B
16A7 47       	MOV B,A
16A8 7D       	MOV A,L
16A9 9B       	SBB E
16AA 6F       	MOV L,A
16AB 7C       	MOV A,H
16AC 9A       	SBB D
16AD 67       	MOV H,A
16AE DAB816   	JC SBCHLDE1
16B1 FAB816   	JM SBCHLDE1
16B4 B5       	ORA L
16B5 C2BB16   	JNZ SBCHLDE2
16B8 78       SBCHLDE1:MOV A,B
16B9 C1       	POP B
16BA C9       	RET
16BB 3E01     SBCHLDE2:MVI A,01
16BD B7       	ORA A;clear sf
16BE 78       	MOV A,B
16BF C1       	POP B
16C0 C9       	RET
              ;


こういうプログラムを書きますと、つくづくZ80の有難さを実感します。

下はMSTRTRKSのアセンブルリストです。

2015/1/14  11:57  mstrtrks.txt
END=8072
              ;subroutine of STARTREK
              ;rnd & Q$ subroutine
              ;13/4/11
                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
              ;?        RR H
801E 7C         MOV A,H
801F 1F         RAR
8020 67         MOV H,A
              ;?        RR L
8021 7D         MOV A,L
8022 1F         RAR
8023 6F         MOV L,A
              ;?        DJNZ RND2
8024 05         DCR B
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
              ;?        SBC HL,DE
802E CDB410     CALL SBCHLDE
              ;?        RES 7,H
8031 7C         MOV A,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  

説明か後先になってしまいましたが、そのようにして作成したMSTRTRKS.BINは今回の上のほうでお見せした画面でBASICプログラムのSTARTREK.TXTをロードしたあとで、/LDコマンドでロードしています。

下は実行結果です。



今はとてもゲームを楽しんでいる余裕はありませんから、ここまで表示されたところで実行を打ち切りました。
ですのでこの先進んでいくと何かでこけてしまうこともなきにしもあらずですが、まあ多分大丈夫でありましょう。

MYCPU80でCP/Mを![第101回]
2015.1.15upload
2015.1.18一部訂正([第104回]参照)

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