復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第74回]
●ファンクションコール0BHの悩ましい振舞い
本日もちょっとわかりにくいお話になってしまいそうです。
前回、テストプログラムの実行中に[Ctrl][S]を入力し、そのあと[Ctrl][D]を入力したときに表示された650004という数値について、「有り得ない」と書きました。
どういうことかと言いますと。
テストプログラムを実行して、a(コード61)、b(62)、c(63)、d(64)、e(65)と順に入力していきました(コードは16進数表記です)。
そして[Ctrl][S]を入力したところ、0000と表示したところでポーズしました。
む?
おかしなところで停止するなあ…。
と思ったのですけれど。
その通り。
確かにおかしかったのです。
テストプログラムの流れからしますと、
0000650000 (最後に1桁のスペース)
と表示されたあと、プログラムのトップに戻って、そこでファンクションコール0BHが実行されるわけですから、最後のスペースが表示されたあとでCtrl−Sが受け付けられて、そこで入力待ちで停止するはずです。
それが途中の0000まで表示したところで停止してしまうというのは、いかにも不自然です。
まあ、しかし。
画面表示もコンソール入力もUSBを介しておこなっているのでありますから、多少のタイムラグもあるかなあと…。
いや、しかし、おかしいなあ…。
そんなことが、ありかなあ…。
見た目には、スペースで停止するべきところ、おっとっと、とちょいと4文字ほどオーバーランしてから止まったと…(いや。しかし。そんなことがありますかいなあ)。
ま。
しかし、基本的にWindowsはイベントドリブンで動いているのでありますから、厳密にはシーケンシャルに処理が進行するとは限らない…。
とにかく、Ctrl−Sの入力前に表示された0000はWK1、WK2の値で、これは勿論、問題はありません。
あ。
WK2も問題かと…。
問題はその次の65の表示です。
これは前回のCP/Mソースリストで見ていただきますと…。
あ。
戻るのは面倒でありますね。
再掲いたします。

おそらくは1383行のCALL CONINで入力された文字コードのはずですから、Ctrl−Sでポーズしたあとに入力したのは、Ctrl−D(コード04)であるべきはずです。
それなのに、そのあとで表示されたWK3の値はCtrl−D入力前と同じコード65…。
ああ。そうか。
停止したときに、棚上げになっていた、Ctrl−S入力前の表示が再開された結果、多分表示バッファに残っていた文字が表示されたのでありましょう…(おかしいなあ。なにか、しっくりこないなあ)。
で、そのあとの00も、Ctrl−S入力前の、コンソール入力無し情報としての00が表示されたのでありましょう、と…。
しかし、しかし。そのあとのCHARBUFの表示になって、突然そこに04(おそらくCtrl−Dの入力コード)が現れるのでありました。
なんで、ここだけ、Ctrl−Dの入力が反映されてしまうのお?
繰り返し何回か試してみたのですけれど、結果はいずれもほぼ同様でありました(停止位置はあちこち前後するのですが…)。
こういうことになりますと、USBを介して画面表示とコンソール入力を同時に受け持っております、ZB3.exeを疑ってしまいます。
むむ。
表示と入力のタイミングに何かとんでもないずれが発生しているのではあるまいか?
ひょっとすると、そこに時空のゆがみが発生しているのでは…。
むむ。
おそろしいこっちゃあ。
こ、これはなんとか解決して、時空のゆがみを元に戻さなければ…。
で。
目を血走らせて、そこで何がおきているのかを、さらに深く探査したのでありました。
うむむ。
入力と表示の関係で何かがおきているとするならば、それはWindows側で発生しているはず。
ならば、Windows側で表示させるのとは別の方法でモニタすることができれば、そこに何かが見えてくるのでは…。
おお。
そうでありました。
ファンクションコール04がありました。
●ファンクションコール04(パンチ出力)
これはちょいと面倒なので、後回しにするつもりだったファンクションコールです。
しかし、いくらなんでもいまどき紙テープパンチャ出力はありませんから、当然別の媒体への出力です。
ND80ZVにはRS232Cの送受信機能があります。

9pinのDサブコネクタがついています。
ここがRS232Cインターフェース回路部です。
ファンクションコール04には、このRS232C出力をあてることにします。
そのために新たにBIOSに追加を行ないましたが、それをここで紹介しますと、ただでさえ説明が交錯しておりますところが、さらに混乱してしまいますので、BIOSの変更につきましては、のちほど整理して説明することにいたします。
ともかくBIOSの追加変更を行なったあと、テストプログラムの方もファンクションコール04を使って、RS232C送信を行なうように変更をして、FNC0BT3.TXTとして保存しました。
下がそのソースリストです。
; BDOS function0B test fnc0bt3
;2012/3/27
;
ORG $8100
FCALL=$8005
CHARBUF=$C707
WK1=$8300
WK2=$8301
WK3=$8302
;
LOOP:LD C,0B
CALL FCALL
PUSH AF
LD A,(WK1)
CALL B2HEXDP
LD A,(WK2)
CALL B2HEXDP
LD A,(WK3)
CALL B2HEXDP
POP AF
PUSH AF
CALL B2HEXDP
LD A,(CHARBUF)
CALL B2HEXDP
POP AF
OR A
JP NZ,KEYIN
NEXT:CALL SPDP
JP LOOP
KEYIN:LD A,2A;'*'
CALL ADP
LD C,01
CALL FCALL
PUSH AF
LD A,3A;':'
CALL ADP
POP AF
PUSH AF
CALL B2HEXDP
POP AF
PUSH AF
CALL ADP
POP AF
CP 1A;^Z
RET Z
JP NEXT
;
;CL & LF
CRLF:LD A,0D
CALL ADP
LD A,0A
JP ADP
;space disp
SPDP:LD A,20
;A disp
ADP:PUSH BC
PUSH HL
LD E,A
PUSH DE
LD C,04
CALL FCALL
POP DE
LD C,02
CALL FCALL
POP HL
POP BC
RET
;HL(bynary 2bytes) to asckii 4bytes & disp
HEX4DP:PUSH BC
PUSH HL
CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
PUSH DE
EX DE,HL
CALL DEDP
POP DE
CALL DEDP
POP HL
POP BC
RET
;A(binary) to asckii 2bytes HEX & disp
B2HEXDP:PUSH BC
PUSH HL
CALL B2HEX2
CALL DEDP
POP HL
POP BC
RET
;
;DE(asckii 2bytes) disp
DEDP:PUSH DE
LD E,D
PUSH DE
LD C,04
CALL FCALL
POP DE
LD C,02
CALL FCALL
POP DE
PUSH DE
LD C,04
CALL FCALL
POP DE
LD C,02
CALL FCALL
RET
;
;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
B2HEX4:LD A,H
CALL B2HEX2
EX DE,HL
LD A,E
;binary to hex, 1byte data to ascii 2charactors,A to DE
B2HEX2:PUSH AF
RRCA
RRCA
RRCA
RRCA
CALL B2HEX1
LD D,A
POP AF
CALL B2HEX1
LD E,A
RET
;binary to hex, low 4bit to ascii 1charactor
B2HEX1:AND 0F
ADD A,30
CP 3A
RET C;0-9
ADD A,07;A-F
RET
;
STRIN:"in"
DB 3A;:
DB 24;$
;
|
2012/3/27 15:6 fnc0bt3.txt
END=81C7
; BDOS function0B test fnc0bt3
;2012/3/27
;
ORG $8100
FCALL=$8005
CHARBUF=$C707
WK1=$8300
WK2=$8301
WK3=$8302
;
8100 0E0B LOOP:LD C,0B
8102 CD0580 CALL FCALL
8105 F5 PUSH AF
8106 3A0083 LD A,(WK1)
8109 CD7E81 CALL B2HEXDP
810C 3A0183 LD A,(WK2)
810F CD7E81 CALL B2HEXDP
8112 3A0283 LD A,(WK3)
8115 CD7E81 CALL B2HEXDP
8118 F1 POP AF
8119 F5 PUSH AF
811A CD7E81 CALL B2HEXDP
811D 3A07C7 LD A,(CHARBUF)
8120 CD7E81 CALL B2HEXDP
8123 F1 POP AF
8124 B7 OR A
8125 C22E81 JP NZ,KEYIN
8128 CD5981 NEXT:CALL SPDP
812B C30081 JP LOOP
812E 3E2A KEYIN:LD A,2A;'*'
8130 CD5B81 CALL ADP
8133 0E01 LD C,01
8135 CD0580 CALL FCALL
8138 F5 PUSH AF
8139 3E3A LD A,3A;':'
813B CD5B81 CALL ADP
813E F1 POP AF
813F F5 PUSH AF
8140 CD7E81 CALL B2HEXDP
8143 F1 POP AF
8144 F5 PUSH AF
8145 CD5B81 CALL ADP
8148 F1 POP AF
8149 FE1A CP 1A;^Z
814B C8 RET Z
814C C32881 JP NEXT
;
;CL & LF
814F 3E0D CRLF:LD A,0D
8151 CD5B81 CALL ADP
8154 3E0A LD A,0A
8156 C35B81 JP ADP
;space disp
8159 3E20 SPDP:LD A,20
;A disp
815B C5 ADP:PUSH BC
815C E5 PUSH HL
815D 5F LD E,A
815E D5 PUSH DE
815F 0E04 LD C,04
8161 CD0580 CALL FCALL
8164 D1 POP DE
8165 0E02 LD C,02
8167 CD0580 CALL FCALL
816A E1 POP HL
816B C1 POP BC
816C C9 RET
;HL(bynary 2bytes) to asckii 4bytes & disp
816D C5 HEX4DP:PUSH BC
816E E5 PUSH HL
816F CDA581 CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
8172 D5 PUSH DE
8173 EB EX DE,HL
8174 CD8981 CALL DEDP
8177 D1 POP DE
8178 CD8981 CALL DEDP
817B E1 POP HL
817C C1 POP BC
817D C9 RET
;A(binary) to asckii 2bytes HEX & disp
817E C5 B2HEXDP:PUSH BC
817F E5 PUSH HL
8180 CDAB81 CALL B2HEX2
8183 CD8981 CALL DEDP
8186 E1 POP HL
8187 C1 POP BC
8188 C9 RET
;
;DE(asckii 2bytes) disp
8189 D5 DEDP:PUSH DE
818A 5A LD E,D
818B D5 PUSH DE
818C 0E04 LD C,04
818E CD0580 CALL FCALL
8191 D1 POP DE
8192 0E02 LD C,02
8194 CD0580 CALL FCALL
8197 D1 POP DE
8198 D5 PUSH DE
8199 0E04 LD C,04
819B CD0580 CALL FCALL
819E D1 POP DE
819F 0E02 LD C,02
81A1 CD0580 CALL FCALL
81A4 C9 RET
;
;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
81A5 7C B2HEX4:LD A,H
81A6 CDAB81 CALL B2HEX2
81A9 EB EX DE,HL
81AA 7B LD A,E
;binary to hex, 1byte data to ascii 2charactors,A to DE
81AB F5 B2HEX2:PUSH AF
81AC 0F RRCA
81AD 0F RRCA
81AE 0F RRCA
81AF 0F RRCA
81B0 CDBA81 CALL B2HEX1
81B3 57 LD D,A
81B4 F1 POP AF
81B5 CDBA81 CALL B2HEX1
81B8 5F LD E,A
81B9 C9 RET
;binary to hex, low 4bit to ascii 1charactor
81BA E60F B2HEX1:AND 0F
81BC C630 ADD A,30
81BE FE3A CP 3A
81C0 D8 RET C;0-9
81C1 C607 ADD A,07;A-F
81C3 C9 RET
;
81C4 696E STRIN:"in"
81C6 3A DB 3A;:
81C7 24 DB 24;$
;
ADP =815B B2HEX1 =81BA B2HEX2 =81AB
B2HEX4 =81A5 B2HEXDP =817E CHARBUF =C707
CRLF =814F DEDP =8189 FCALL =8005
HEX4DP =816D KEYIN =812E LOOP =8100
NEXT =8128 SPDP =8159 STRIN =81C4
WK1 =8300 WK2 =8301 WK3 =8302
|



