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

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

[第73回]

●ファンクションコール0BHの動作解析(2)

ファンクションコール0BHの動作解析のために変更したCP/Mプログラム(CPM22I2.COM)と、テストプログラムFNC0BT2.BINをND80ZVにロードして実行してみました。

下はそのときのログファイルです。

logfile nd80zlog\03262007.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/ld cpm22i2.bin,bc00
loading CPM22I2.BIN ...1715(5909)bytes loaded,from BC00 to D314
>/ld fnc0bt2.bin,8100
loading FNC0BT2.BIN ...00b3(179)bytes loaded,from 8100 to 81B2
>jp d233

a>save 1 fnc0bt2.com
a>fnc0bt2
00001A0000 00001A0000 00001A0000 00001A0000 00001A0000 00001A0000 00001A0000 000
01A0000 00001A0000 00001A0000 00001A0000 00001A0000 00001A0000 00001A0000 00001A
0000 00001A0000 00001A0000 0061610161*a:61a 0000610061 6161610161*a:61a 00616101
61*a:61a 0000610061 6161610161*a:61a 0000610061 6161610161*a:61a 6161610161*a:61
a 6261620162*b:62b 0000620062 6263620162*b:62b 6263620162*b:62b 6263620162*b:62b
 6263620162*b:62b 6263620162*b:62b 6263620162*b:62b 0000620062 6263620162*b:62b 
0000620000 0000620000 0000620000 0000620000 0000620000 0063630163*c:63c 00006300
63 6363630163*c:63c 6363630163*c:63c 6363630163*c:63c 6363630163*c:63c 636363016
3*c:63c 0000630000 0000630000 0000630000 0000630000 0000630000 6465640164*d:64d 
6465640164*d:64d 6465640164*d:64d 6465640164*d:64d 6465640164*d:64d 6465640164*d
:64d 6465640164*d:64d 0000640000 0065650165*e:65e 0065650065 6565650165*e:65e 65
65650165*e:65e 0000650065 6565650165*e:65e 0000650000 0000650000 0000650000 0000
650000 0000650000 0000650000 0000650000 0000650000 0000650000 0000650000 0000650
000 0000650000 0000650000 0000650000 0000[ctrl-s]650004 0413040104*:04 0000040000 000004
0000 0000040000 0000040000 0000040000 0000040000 0000040000 0000040000 000004000
0 0000040000 0000040000 0000040000 0000040000 0000040000 0000040000 0000040000 0
000040000 0000040000 0000040000 0000040000 0000040000 0000040000 0000040000 0000
040000 0000040000 0000040000 0000040000 0000040000 0000040000 0000040000 0000040
000 0000040000 0000040000 0000040000 0000040000 0000040000 0000040000 0000040000
 0000040000 0000040000 0000040000 0000040000 0000040000 0000040000 0000040000 00
00040000 0000040000 0000040000 0000040000 0000040000 0000040000 0000040000 00000
40000 001B1A001A 1A1B1A011A*:1A
a>^D>a>^D>

ERR:23 
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Mon Mar 26 20:08:42 2012

先に実行したときに最後に入力したCtrl−Z(コード1AH)が残っていて表示されています。
a(コード61H)、b(62H)、c(63H)、d(64H)、e(65H)と、順に入力してみました。
ちょっとごちゃごちゃしていますが、そのように入力したものが、その通りに表示されているようです。
そのあとCtrl−Sを入力しました。
入力した位置に[ctrl−s]を記入して示しました。
これはログファイルに後から記入したもので、このように表示されたわけではありません。
実際に実行したときは、ここで表示が停止しました。
そこで[Ctrl][D]を入力したのですが、ブレイクしないで、ログファイルにあるように、表示が再開されてしまいました。
最後に[Ctrl][Z]を入力することで、やっとブレイクできました。

ファンクションコール0BHの処理ルーチンになんだか怪しげなところがあるような気がして、それでワークエリアWK1〜WK3を設けて、処理中の値をそこに保存して、それをテストプログラムでモニタしてみた結果が、上のログファイルに見えています。

ええ。
見えましたよ。
あ。
ただ、ちょっとまだ、どうにも悩ましいところがありまして、その謎が解けるまで2日間悩んでもだえておりました。
悩んでおりましたのは、[Ctrl−S]入力後の表示、650004です。
むむ。
謎の数字、ですな。
実に悩ましい…。
これは有り得ない…。
ということで。ええ。2日間悩んでいたのです。
ま、その件につきましては、またのちほど説明いたします。

見えてきましたのは、そのさらに次の表示です。
0413040104*:04
です。
この数字を読み解くと、何がおきていたのかが見えてきます。

その説明をする前に、そもそもこの数値がどこから出てきたのか、ということについて、まず整理しておきましょう。
以下の説明については、前回のCP/Mの変更部分と、テストプログラムのリストを参照していただくと理解が早いと思います。

前から10桁は8ビットの数を16進で表示したもので、2桁ずつに区切ります。
前から順に
WK1=04(CHARBUFに入れられていた値)
WK2=13(BIOSのコンソールステータスルーチンによって得られた値)
WK3=04(ファンクションコール0BHの処理ルーチン内でコールされたBIOSのコンソール入力により得られた入力データ)
です。

その次の01はファンクションコール0BHを実行した結果です。
Aレジスタ=01で、コンソール入力有り、を意味しています。
その次の04はファンクションコール0BHの処理ルーチン中で設定されるCHARBUFの値です。
WK1も同じですが、時間のずれが関係する場合があります。

その次の*:04は、ファンクションコール0BHの結果、キー入力有り、が得られたために、ファンクションコール01(コンソール入力)を実行した結果の表示です。
[Ctrl][D](コード04)が入力文字として受取られてしまったため、文字としては何も表示されず、16進として04が表示されています。

さて。
この結果から見えたものとは。

おそらく、こういうことだと思います。
あ。
説明の理解を助けるために、前回お見せした、CP/Mソースのファンクションコール0BHの処理を行なっている部分のリストを再掲いたします。
この部分で行なわれていることを頭に置いて、以下の説明をお読みください。



表示された数値は2回の処理の結果が重なって示されています
まず最初に次のことが行なわれたと思います。

[Ctrl][S]が受け付けられてポーズしたことから、まず1379行のCALL CONSTで[Ctrl][S](13)が検出されたと考えられます。
ここでWK2に13が入ります。
そのあとでポーズしたのは、CALL CONIN(コンソール入力)で入力待ちになったからだと考えられます。
ところでCALL CONINは2つあります。
1383と1387です。
どちらのCALL CONINなのでしょうか?
結果からみて、1383のCALL CONINでポーズしていると思います。
そこで[Ctrl][D](コード04)を入力します。
すると。
その下の1385ではCTRL−Sのチェックをしています。
CTRL−Sではないので、そのコードをCHARBUFに入れて、Aレジスタには01を入れてリターンしてしまいます。

そして、もう一度ファンクションコール0BHが実行されます。
CHARBUFには04が入っています。
これがWK1に入れられます。
1377行のOR Aで、ゼロではありませんから、CKCON2(1393行)に行きます。
1393行ではAレジスタに01を入れてリターンします。

ここからがテストプログラムの動作です。
WK1〜WK3、ファンクションコール0BHの結果とCHARBUFの表示に続いて、ファンクションコール01が実行されます。
ファンクションコール01では、CHARBUFに値が入っていたら、それを入力データにして、すぐにリターンします。
CHARBUFには[Ctrl][D]のコード04が入っていましたから、それが入力文字として表示されます。

むむ。
どこかがおかしい。
そうなのです。
最初に書きました、悩ましい表示、あの650004です。
上の説明では、ここのところの説明ができません。
なぜ65なのか?
そしてなぜ00なのか?
なぜここで04なのか?
ここでは過去と未来が同居してしまっています。
00と04は矛盾しています(え?なにを言っているのかわかりません?)。
むむ。
さては異次元ポケットか?

んなわけはありませんでしょう。
んでも、そのために2日間も苦悶してしまいました。
なかなかにつらい人生であります。
ま。
そこの説明は次回、ということにいたしまして。

とにかくちょいと穴のある説明には目をつぶることとしまして、[Ctrl][D]でブレイクできなかったのは、入力データとして受取られてしまったからだということがわかります。
本当は、最初のCALL CONINで[Ctrl][S]が入力され、次のCALL CONINで[Ctrl][D]が入力されなければならないのに、最初のCALL CONINで[Ctrl][D]が入力されてしまうことがその原因である、ということが上の解析結果から見えてきます。

なぜ、そんなことになってしまうのか?
そしてその解決方法は?
ということにつきましては、時間がなくなってしまいましたので、次回にさせていただきます。

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

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