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

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

[第510回]


●E−80ミニコンOS(ZB3BASIC)のRS232C割込み受信プログラム

このところE−80ミニコンのZB3DOS(CP/M互換DOS)のRS232C受信プログラムについて書いてきました。
ところが先回その割込み受信プログラムのリストの説明を書いていましたら、バッファフルの処理が中途半端なままになっていることを発見してしまいました。
説明の流れからしますと、当然ここはまずCP/M互換DOSについて修正作業をすべきところです。
しかしながら私の場合、ずっとこの連載でCP/M互換DOSをウリにしておりながら、じつのところやっぱりオリジナルのZB3BASICのほうが扱いやすいものですから、どうしてもまずZB3BASICのほうに行ってしまいます。

前回も書きましたようにもともとRS232C受信の割込みプログラムはZB3BASICのシステムの中にあったものを、そのままではバンクが異なるCP/M互換DOSでは割込み処理できないことに気がついて、ZBIOSの中に移植したものです。
ですので全く同じ割込みプログラムがバンク0のZB3BASICシステムプログラムにも存在します。
私としましては、まずZB3BASICのほうを修正して、その結果を確かめてから、次にCP/M互換DOSのほうに取りかかるほうが楽な手順ということになります。

そこで、ZB3BASICのほうの割込み受信プログラムをまず手直しいたしました。
下はそのように修正したあとのZB3BASICの割込み受信プログラムです

04A2 E5       RSINT:PUSH HL
04A3 D5         PUSH DE
04A4 C5         PUSH BC
04A5 F5         PUSH AF
04A6 ED         DB ED;IN0 A,[04]
04A7 38         DB 38
04A8 04         DB 04
04A9 E670       AND 70
04AB C2D104     JP NZ,RSINTE
04AE ED         DB ED;IN0 D,[08]
04AF 10         DB 10
04B0 08         DB 08
04B1 3A02F9     LD A,(BFCNTR)
04B4 3C         INC A
04B5 CAD004     JP Z,RSINTE1
04B8 ED4B00F9   LD BC,(BFTOP)
04BC 2100F8     LD HL,SPTOP;=RSBF
04BF 68         LD L,B
04C0 72         LD (HL),D
04C1 04         INC B
04C2 ED4300F9   LD (BFTOP),BC
04C6 3202F9     LD (BFCNTR),A
04C9 F1       RSINT2:POP AF
04CA C1         POP BC
04CB D1         POP DE
04CC E1         POP HL
04CD FB         EI
04CE ED4D       RETI
04D0 3C       RSINTE1:INC A
04D1 3203F9   RSINTE:LD (RSERR),A
04D4 F1         POP AF
04D5 C1         POP BC
04D6 D1         POP DE
04D7 E1         POP HL
04D8 ED4D       RETI


どこを直したかといいますと、ほんのちょっとの手直しをしただけです。
説明のために前回お見せしたCP/M互換DOSの割込み受信プログラムを下に再掲します。
アドレスは異なりますが全く同じ処理プログラムです。
どこが違っているか見比べてみてください。

              ;    rs232c int
E5BA E5       RSINT:PUSH HL
E5BB D5       	PUSH DE
E5BC C5       	PUSH BC
E5BD F5       	PUSH AF
E5BE ED       	DB ED;IN0 A,[04]
E5BF 38       	DB 38
E5C0 04       	DB 04
E5C1 E670     	AND 70
E5C3 C2E8E5   	JP NZ,RSINTE
E5C6 ED       	DB ED;IN0 D,[08]
E5C7 10       	DB 10
E5C8 08       	DB 08
E5C9 3A02F9   	LD A,(BFCNTR)
E5CC 3C       	INC A
E5CD CAE1E5   	JP Z,RSINT2
E5D0 ED4B00F9 	LD BC,(BFTOP)
E5D4 2100F8   	LD HL,SPTOP;=RSBF
E5D7 68       	LD L,B
E5D8 72       	LD (HL),D
E5D9 04       	INC B
E5DA ED4300F9 	LD (BFTOP),BC
E5DE 3202F9   	LD (BFCNTR),A
E5E1 F1       RSINT2:POP AF
E5E2 C1       	POP BC
E5E3 D1       	POP DE
E5E4 E1       	POP HL
E5E5 FB       	EI
E5E6 ED4D     	RETI
E5E8 3203F9   RSINTE:LD (RSERR),A
E5EB F1       	POP AF
E5EC C1       	POP BC
E5ED D1       	POP DE
E5EE E1       	POP HL
E5EF ED4D     	RETI

修正前のプログラムではBFCNTRの値を+1した結果が0のときはRSINT2にジャンプしています(アドレスE5CD)。
先にお見せした修正後のプログラムでは、そこのところをRSINTE1へのジャンプ命令に変更しています(アドレス04B5)。
RSINTE1は新しく追加したジャンプ先で、そこではAレジスタの値を+1したあと、その後ろのエラー処理ルーチンにつないでいます。
なんてことはない処理で、こんなことでよいのか、と思われるかも知れませんが、これで十分なのです。
RSERRにはもともとはZ8S180内蔵のRS232Cモジュールがエラーを検知したときに、そのエラーコードを入れるために用意したものなのですが、そこをそのまま利用しています。
RSERRはエラーがなければ0になっています(ですからここに0を入れてもエラーを示すことにはなりません)。
本来のエラーはビット4〜6が1になる値で示されます。
それ以外の0ではない値ならば、バッファフルを示す値として使えます。
RSINTE1にジャンプしてきた時点でAレジスタの値は0ですから、一番簡単な処理として、それを+1したのです。

あ。
今、また思いついてしまいました。
うーむ。
ここは+1ではなくて−1して、値をFFにしたほうがもっとよさそうです。
せっかく上のように直して、それをテストしている画面も記録したのですけれど。

それに今まためちゃめちゃ忙しくなってしまって、それどころではなくなってきているのですけれど。
むむ。
なんとか時間をみつけて直した上で、あらためて説明をし直すことにいたします。

なんとも中途半端な説明に終始してしまいまして、まことに申し訳ありません。
いずれきちんと説明をいたします(そのつもりです)。
今しばらくのご猶予をお願いいたします。

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

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