2015.1.21

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

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


[第107回]


●MBDOSを修正しました

前回テストプログラムMFTST7を実行しましたところ、ファンクション0C(version No.の取り出し)のコールで、本来ならば0022と表示されるはずのところが、全然version No.とは関係ないようなおかしな値が表示されました。
ファンクション0Cでおかしなことがおきているようです。

ファンクションコールはCP/Mの本体ともいうべきBDOSプログラムの機能です。
MYCPU80用のZB3DOS(CP/M互換DOS)では(ND80Z3.5、V用も同じですが)、CCP、BDOS、BIOSの3本のプログラムに分けて作成したのちに、バイナリレベルで1本のファイルにまとめています。
MYCPU80用のBDOSプログラムはMBDOSというファイル名で作成しています。
下はMBDOSプログラムのアセンブルリストからファンクション0Cに関係する部分のみを抜き出して表示したものです。

              ;********* BDOS ENTRY ************
              ;
D406 C3A1D4   	JMP BDOS

              ;
D4A1 210000   BDOS:LXI H,$0000
D4A4 39       	DAD SP
D4A5 229CD4   	SHLD DSPWK
D4A8 31E0E8   	LXI SP,DSP
D4AB C5       	PUSH B
D4AC 21BDD4   	LXI H,BDOSRT
D4AF E5       	PUSH H
D4B0 69       	MOV L,C
D4B1 2600     	MVI H,00
D4B3 29       	DAD H
D4B4 01C3D4   	LXI B,FNCTBL
D4B7 09       	DAD B
D4B8 7E       	MOV A,M
D4B9 23       	INX H
D4BA 66       	MOV H,M
D4BB 6F       	MOV L,A
D4BC E9       	PCHL
D4BD C1       BDOSRT:POP B
              ;? 	LD SP,(DSPWK)
D4BE 2A9CD4   	LHLD DSPWK
D4C1 F9       	SPHL
D4C2 C9       	RET
              ;
D4C3 15D5     FNCTBL:DW SYSRES;00
D4C5 18D5     	DW CONIN;01
D4C7 35D5     	DW CONOUT;02
D4C9 E8D5     	DW RDRIN;03
D4CB EBD5     	DW PUNOUT;04
D4CD EFD5     	DW LSTOUT;05
D4CF F3D5     	DW CONINOT;06
D4D1 07D6     	DW IOBYTERD;07
D4D3 0BD6     	DW IOBYTESET;08
D4D5 10D6     	DW DEOUT;09
D4D7 1ED6     	DW CONBFIN;0A
D4D9 93D7     	DW CONCHK;0B
D4DB ACD7     	DW VERRD;0C

              ;
              ;VERSION NO. READ FCALL 0C
              ;
D7AC 3E22     VERRD:MVI A,22
D7AE 6F       	MOV L,A
D7AF 2600     	MVI H,00
D7B1 C9       	RET
              ;

ファンクションコールはアドレス0005をコールします。
アドレス0005にはBDOSのエントリポイントへのジャンプ命令(C306D4)が書かれています(前回の画面コピーの下の方にアドレス0000〜000Fのメモリダンプがありますからそれで確認してみてください)。
ファンクション0Cの処理はアドレス07ACのVERRDです。
別にどうということもない、単純なプログラムです。
ただHLレジスタに0022を入れてリターンしているだけですから、ここで間違うはずはありません。
となると…。

おお、わかりました(ええい、なんてこった)。
ファンクションコールの最後のところ、BDOSRT:が間違っていました。
ここはND80Z3.5(ND80ZV)用では、便利な命令なのでついタブーを冒して、Z80固有の命令を使ってしまいました。
LD SP,(DSPWK)
です。
この命令は8080にはありません。
そこで
LHLD DSPWK
SPHL
としたのですが、それが間違いでした。
VERRDでセットしたHLレジスタの値がここで上書きされてしまいました。
原因が分かりましたので、その部分を下のように修正しました。

D4BD C1       BDOSRT:POP B
D4BE 22C9D4   	SHLD BDOSHLWK
              ;? 	LD SP,(DSPWK)
D4C1 2A9CD4   	LHLD DSPWK
D4C4 F9       	SPHL
D4C5 2AC9D4   	LHLD BDOSHLWK
D4C8 C9       	RET
D4C9 00       BDOSHLWK:DB 00
D4CA 00       	DB 00
              ;

ここでは PUSH H は使えません。
SP(スタックポインタ)の値を変更する処理をしているところですから、その前後でPUSH/POPは使えません。
ですからこのようにするしかありません。

アセンブルしたあとバイナリファイルを合成しました(下の画面)。
こういうファイル操作はZB3DOSのZB3BASIC上で簡単に行なえます。
今までのZB3DOSファイル(CP/M互換ファイル)MCPM5D.BINをロードして、そこに変更後のバイナリファイルMBDOS5B.BINとMBIOS5G.BINをロードしたあと、
/SV MCPM5E.BIN
を実行して新しいCP/M互換ファイルを作成しました。

そのあとさっそく/CPMコマンドでCP/M互換DOSにエントリして、MFTST7を再テストしました。



今度は正しく0022が表示されました。
ZB3BASICなどとは違ってCP/M互換DOSプログラムはほとんどが8080で実行できる命令のみで作成しましたから、今更わざわざファンクションコールのテストなどしなくてもよいとも思いつつ、念のためにテストを始めたのですが、やっぱりテストをして正解でした。

MYCPU80でCP/Mを![第107回]
2015.1.21upload

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