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

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

[第506回]


●RS232Cプログラムにバグがありました


前回お見せしたE−80ミニコンのCP/M互換DOSのBIOSプログラムにバグがありました。

E−80ミニコンの動作テストをしていただいている大分県のH様から、RS232C受信がうまくできないという連絡をいただいていました。
ZB3BASICではうまく受信できるのですが、CP/M互換DOSのファンクション03を実行すると、全く受信できないとのことでした。
ところが私のところではそのようなことはなくてまともに受信できています。

H様はRS232CのテストにTeratermというソフトを使ってみえるのだそうですが、そうするとそのソフトの問題かとも考えました。
しかしそれならばZB3BASICでも受信できないはずで、それがZB3BASICのREAD#やH様が作られたマシン語のプログラムではうまくいって、CP/M互換DOSのファンクション03を使うと受信できないということですから、ここはCP/M互換DOSのBIOSを疑うべきでした。
ですけれど、私のところではまともに受信できてしまいます。

そうなると、ハードウェアか?
と考えてしまいます。
そこでE−80ミニコンを送り返してもらって調べてみたのですが、全く問題はありませんでした。
私のところでRS232C送受信テストを行なうと何の問題もなく正しく受信できてしまいます。

結局、原因は不明のまま、おそらくH様が1台の同じパソコンにE−80ミニコンを接続して動作させつつ、その同じパソコンの上でTeratermを実行して、かつRS232C−USB変換ケーブルを使って送受信テストを行なっていることに問題があるのではないか、という結論になりました。
マシン語のプログラムやZB3BASICでは問題は発生しないのですけれど、CP/M互換DOSのファンクション03をコールするときだけ異常が発生するという、ちょっといかにも苦しい結論でありますが、それしか他に考えられないという状況でありました。
H様にもそのようにご返事をさしあげたのですが…。

そのH様からファンクション03のバグを指摘するメールをいただきました。

アドレスE426のCA10E4がおかしいのではありませんか?
そこをCA23E4に変更したところ、正しく受信できるようになりました。


下が前回お見せした、その部分のリストです。
              ;
              ;PUNCHER OUT(RS232C OUT)
              ;
E404 ED       PUNCHJ:DB ED;IN0 A,[04]
E405 38       	DB 38
E406 04       	DB 04
E407 E602     	AND 02
E409 CA04E4   	JP Z,PUNCHJ
E40C ED       	DB ED;OUT0 [06],C
E40D 09       	DB 09
E40E 06       	DB 06
E40F C9       	RET
              ;
              ;READER IN
              ;
E410 2274E2   READERJ:LD (HLWK),HL
E413 210000   	LD HL,$0000
E416 39       	ADD HL,SP
E417 2276E2   	LD (SPWK),HL
E41A 2A74E2   	LD HL,(HLWK)
E41D 3100E9   	LD SP,BSP
E420 AF       	XOR A
E421 D339     	OUT (39),A
E423 CD0904   	CALL RSRDSB
E426 CA10E4   	JP Z,READERJ
E429 79       	LD A,C
E42A C379E3   	JP CONSTJ1

メールをいただいてはじめて気が付きました。
うむむ。
全く気がつきませんでした。
ご指摘の通りでありました。

確かにこのプログラムはおかしいです。
CALL RSRDSBを繰り返すべきところを、先頭まで戻って繰り返しています。
これではせっかく保存したSPの値が失われてしまいます。
こうなると、私のところでのテストがまともに行なわれていたことのほうが奇跡だということになります。

いやあ。お恥ずかしい。
まことに汗顔の至りです。
さっそく修正いたしました。

              ;
              ;PUNCHER OUT(RS232C OUT)
              ;
E404 ED       PUNCHJ:DB ED;IN0 A,[04]
E405 38       	DB 38
E406 04       	DB 04
E407 E602     	AND 02
E409 CA04E4   	JP Z,PUNCHJ
E40C ED       	DB ED;OUT0 [06],C
E40D 09       	DB 09
E40E 06       	DB 06
E40F C9       	RET
              ;
              ;READER IN
              ;
E410 2274E2   READERJ:LD (HLWK),HL
E413 210000   	LD HL,$0000
E416 39       	ADD HL,SP
E417 2276E2   	LD (SPWK),HL
E41A 2A74E2   	LD HL,(HLWK)
E41D 3100E9   	LD SP,BSP
E420 AF       	XOR A
E421 D339     	OUT (39),A
E423 CD0904   READERJ2:CALL RSRDSB
E426 CA23E4   	JP Z,READERJ2
E429 79       	LD A,C
E42A C379E3   	JP CONSTJ1

H様。
いつもいつもご協力いただき有難うございます。
今後ともご協力のほど、よろしくお願いいたします。

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

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