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