復活!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
前へ
次へ
ホームページトップへ戻る