復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第76回]
●CP/Mの変更作業
今回は、Ctrl−S、Ctrl−Dの処理が正しく行なえるように、プログラムを変更する作業について説明をいたします。
まずは、もう一度あらためてCKCONSOLを見てみることにします。
あらためて見てみますと、なんとも奇妙なプログラムです。
普通はこんなプログラムは書きません。
これは実行不能です。
ですから、あんなおかしなことになってしまったのでした。
1379のCALL CONSTで、コンソール入力があったことを確認したあと、1383のCALL CONINを実行しています。
しかしこのときに入力されるキー入力コードが、CONSTでチェックされたキー入力と同じである保証はありません。
事実、ここにはCtrl−Dが入ってしまいました。
さらに言うならば、1383と1387の2回CALL CONINを連続して実行していますが、これは実に危ういプログラムです。
ちょいとキー入力のタイミングが変わっただけで、正しく認識してくれなくなります。
これは言うなれば、綱渡り的なプログラムです。
そのように解析できましたので、私はここを書き換えてしまうことにしました。
で。
最初はそのように直して、期待通りの動作になることも確認したのですが。
まてよ?
もう一度考え直すことにしました。
このプログラムは、CONSTでコンソール入力を確認したときに、コンソール側でそのときに入力された文字コードがラッチされていることを期待しているのではないか?
と考えたからです。
それなら、その次にCONINを実行すれば、コンソールにラッチされた入力文字を読み込むことができます。
ZB3BASICのINKEY$もそのように考えて、キー入力を確認すると同時に、その入力されたキー入力コードを読み込みます。
これはコンソール側にそのような応答をする仕組みが必要になりますが、おそらくそういう仕掛けになっていたのではないでしょうか?
そして一旦キーが離されて、再度押されたときにそれが次の1387行のCALL CONINの入力になる、と考えれば、綱渡りではなくなります。
それならBIOSを工夫すれば、そのようにできそうです。
そのように考えましたから、CKCONSOLルーチンはそのままにしておいて、BIOSを変更することにしました。
●BIOSを変更します
ファンクションコール0BHの動作確認のために、CP/Mソースはあちこちを書き換えてしまいましたが、動作確認はできましたので、それは全部さわらなかったことにします。
ですから、[第71回]で作成したCPM22I.TXTに対してBIOSの変更をすることにします。
おや?
[第71回]では、BIOSのCONST(コンソールステータスチェック)を直したのでしたね。
それを再度変更することになります。
それからRS232Cについての追加も行ないます。
1)システムサブルーチンとワーク変数のアドレスを定義します
RS232C入力と出力を行なうシステムサブルーチンのアドレスを定義します。
それとコンソールステータスチェック時の入力文字を一時的にラッチしておくためのワークアドレスを追加します。
左が変更前のCPM22I.TXTです。
それを右のように変更します。
@SIN EQU 10AEHの下に次の2行を追加します。
RSOUT EQU 067CH
RSIN EQU 078DH
ADRVNO EQU 0BB06Hの下に次の行を追加します。
CONSTDT EQU 0BB07H
2)ワークアドレスの初期クリアを追加します
上で定義したCONSTDTの初期クリアを追加します。
JP CBASEの前に次の行を追加します。
LD (CONSTDT),A
3)CONSTとCONINを変更します
CONSTに入力文字コードをCONSTDTに保存する部分と、CONINにそのCONSTDTを参照する部分を追加します。
@CONSTJ2:OR 01を次のように変更します。
CONSTJ2:LD (CONSTDT),A
OR 01
ACONINJ:LD A,5を次のように変更します。
CONINJ: LD A,(CONSTDT) OR A JP Z,CONINJ2 PUSH AF XOR A LD (CONSTDT),A POP AF RET CONINJ2:LD A,5;1chr IN,nodp |
; ;PUNCHER OUT(RS232C OUT) ; PUNCHJ:LD A,C LD B,0E3H CALL RSOUT LD A,0EFH OUT (98H),A RET ; ;READER IN ; READERJ:LD B,0EBH LD A,B OUT (98H),A READERJ1:CALL RSIN LD A,C JP NZ,READERJ2;GET DATA CP 0FFH JP Z,READERJ1;NO DATA ;get data or error READERJ2:PUSH AF LD A,0EFH OUT (98H),A POP AF;if error A=01,02,04 RET ; |
5)CPM22J.TXTの名前で保存します
以上のように変更したら、CPM22J.TXTの名前で保存します。
6)ZASM.EXEでアセンブルします
CPM22J.TXTをZASM.EXEでアセンブルします。
さて、今回の変更の結果をテストプログラムで確かめてみなければいけませんが、説明が長くなってしまいましたので、それについては次回にて説明することにいたします。
ワンボードマイコンでCP/Mを![第76回]
2012.3.30upload
前へ
次へ
ホームページトップへ戻る