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

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第254回]


●BIOSに即席のデバッガを組み込みました

前回からの続きです。
プリントアウトされた意味不明の文字列なのですが、しかしLLISTとRUNを交互に繰り返してみますと、文字そのものは意味不明ででたらめなのですが、なんとなくプリンタに出力しようとしているらしく思えます。
どうもMBASICから送られてくる文字コードに問題がありそうです。
そこでMBASICからどういうコードが送られてくるのか、こないのか、そこのところを確かめてみることにしました。

どうやらBIOSのプリンタ出力ルーチンはコールされているらしく思えましたので、BIOSのその部分にデバッグのためのちょいとしたプログラムを仕込みました。
といってもそれほど大げさなものではありません。
ほんの小ワザです。
これがその小ワザを仕込んだBIOSのプリンタ出力部です。
D3A0 3EFF     CONOUTJ3:LD A,FF
D3A2 D39C     	OUT (9C),A
D3A4 C9       	RET
              ;
              ;PRINTER OUT
D3A5 DB82     LISTJ:IN A,(82)
D3A7 E680     	AND 80
D3A9 C2A5D3   	JP NZ,LISTJ
D3AC 7B       	LD A,E
D3AD D380     	OUT (80),A
D3AF AF       	XOR A
D3B0 D383     	OUT (83),A
D3B2 00       	NOP
D3B3 3C       	INC A
D3B4 D383     	OUT (83),A
              ; printer check ************
D3B6 AF       	XOR A
D3B7 D39C     	OUT (9C),A
D3B9 E5       	PUSH HL
D3BA 63       	LD H,E
D3BB CD4B10   	CALL HDP2
D3BE E1       	POP HL
D3BF C3A0D3   	JP CONOUTJ3
              ;	RET    ************
              ;

文字コードが入っているEレジスタの値をちょいといただいて、それを16進で表示するようにしました。
BIOSの動作には影響を与えません。
HDP2はROM内のZB3BASICのシステムルーチンでHレジスタの値を2桁の16進数で表示します。

このように細工をしたBIOSを組み込んで、CP/M互換DOSを起動して、そしてMBASICを起動して、前回と同じ操作をしてみました。
下はそのときの様子を記録したログファイルです。
logfile nd80zlog\11180723.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/ld zbios2qt.bin,d200
loading ZBIOS2QT.BIN ...0360(864)bytes loaded,from D200 to D55F
>/cpm
can't open D.vfd
loading ZBDOS,wait a while...

A>b:
B>mbasic
BASIC-80 Rev. 5.21
[CP/M Version]
Copyright 1977-1981 (C) by Microsoft
Created: 28-Jul-81
25400 Bytes free
Ok
auto
10 for a=0 to 5
20 lprint a,
30 next a
40 ^C
Ok
list
10 FOR A=0 TO 5
20 LPRINT A,
30 NEXT A
Ok
llist
19191900000000000000000000000000001919192C2C2C2C2C2C2C2C2C2C2C1919194141414141414141Ok
run
1515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151313Ok
system
 
B>zb3
end of ZBDOS
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Sun Nov 18 07:26:13 2012
意味不明の文字コードを吐き出してはいますが、どうやらプリンタ出力ルーチンがコールされていることは間違いないようです。

さて。しかし。
これでは一体何が悪いのか、どこに問題があるのか、さっぱりわかりません。
いっそのこと、もっと他のレジスタの値も表示させてみたら何かつかめるかもしれません。
下手な鉄砲も数撃てば当たる、です。

う?
他のレジスタ?
…!!
わ。
わかった!

やっとわかりました。
おばかでありました。
原因はBIOSのプリンタ出力ルーチンにありました。

実はBIOSのプリンタ出力ルーチンを作成するときに、オリジナルのCP/Mソースをちょいと参考にしたのです。
オリジナルのCP/Mソースの入手先につきましては[第5回]で紹介いたしました。
CP/Mのプリンタ出力ルーチンはこれまで説明してきましたように、ファンクションコール05です。
そしてそのファンクションコール05は、BIOSのプリンタ出力ルーチンをコールしているはずです。
で。
CP/Mオリジナルのソースリストで、ファンクションコール05を探してみましたら。
それがないのですよねえ。
むむ。
そんなはずは…。
ということで、よくよくさがしてみましたら、こんなところにありました。

NFUNCTS	EQU	41	;number of functions in followin table.
;
FUNCTNS	DW	WBOOT,GETCON,OUTCON,GETRDR,PUNCH,LIST,DIRCIO,GETIOB
	DW	SETIOB,PRTSTR,RDBUFF,GETCSTS,GETVER,RSTDSK,SETDSK,OPENFIL
	DW	CLOSEFIL,GETFST,GETNXT,DELFILE,READSEQ,WRTSEQ,FCREATE
	DW	RENFILE,GETLOG,GETCRNT,PUTDMA,GETALOC,WRTPRTD,GETROV,SETATTR
	DW	GETPARM,GETUSER,RDRANDOM,WTRANDOM,FILESIZE,SETRAN,LOGOFF,RTN
	DW	RTN,WTSPECL

ここは各ファンクションコールへのジャンプテーブルです。
テーブルの一行目の中ほどに’LIST’があります。
これがファンクションコール05です。
それではこのLISTの本体はどこにあるかといいますと。
ここにあります。

;**************************************************************
;*
;*        B I O S   J U M P   T A B L E
;*
;**************************************************************
;
BOOT	JMP	0	;NOTE WE USE FAKE DESTINATIONS
WBOOT	JMP	0
CONST	JMP	0
CONIN	JMP	0
CONOUT	JMP	0
LIST	JMP	0
PUNCH	JMP	0
READER	JMP	0
HOME	JMP	0
SELDSK	JMP	0
SETTRK	JMP	0
SETSEC	JMP	0
SETDMA	JMP	0
READ	JMP	0
WRITE	JMP	0
PRSTAT	JMP	0
SECTRN	JMP	0
;

これはBIOSの先頭に置かれたジャンプテーブルです。
つまりファンクションコール05はそのままBIOSのプリンタ出力ルーチンにジャンプしていたのです。
これを見て、私もつい何も疑問を感じないまま、ファンクションコール05については、オリジナルのソースと同じように、そのままBIOSのプリンタ出力ルーチンにジャンプするようにしてしまいました。
本当はここで、
あれ?おかしいぞ。
と気が付くべきでありました。

どこかに書いたように思いますが、このCP/Mソースリストなのですが、実際のソースリストではなくて、CP/Mのバイナリイメージか何かをもとに逆アセンブルして、それを整理して、それにコメントをつけたもののようです。
そのため実はバグもあります([第36回]参照)。
このファンクションコール05からいきなりBIOSのプリンタ出力ルーチンへのジャンプもバグといいますか、おそらくはいい加減な手抜きでありましょう。
それについのせられてしまった私でありました。

そのどこがいけないのか。手抜きなのか。
もうあと一息のところなのですが、本日もタイムアウトになってしまいました。
次回に続きます。

ワンボードマイコンでCP/Mを![第254回]
2012.11.22upload

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