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

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

[第410回]


●F80でのまさかのエラーの顛末です

本日も結局時間がなくなってしまいましたので、どこまで書けるかわかりませんが、とにかくできるところまで書くことにいたします。

[第408回]で書きましたように、思ってもみなかったF80(FORTRAN80)でのまさかのエラーに直面してしまいました。
さてどうするか?

F80(FORTRAN80)はもう1年ほど前、昨年7月に、作ったばかりのZB3DOS上で動くことを確かめております([第168回])。
それからこっちかなりたっぷりとあれこれいじってきましたから、一体そのどこがいけなかったのかなんて、それはもう考えたってどだい無理つうもんです。

ファイルオープンができないらしいということからすると、FORTRAN80プログラムのかなり始めのほうでトラブルが発生していることになります。
Zフォルダを新設したりしまして、そうとうファイルオープンのあたりもいじくってしまいましたから、ひょっとするとそのあたりかもしれません。

こういう場合には。
ブレークポイントを設定しながら、エラーが発生するまで、少しずつ気長にトレースを続けていくというやり方が、回り道のようでいて、結果的には効果的であるということをよく経験しています。

今回の場合には、*の表示に=HELLO と入力したところから始まっているわけですから、それがプログラムのどのあたりかということがわかれば、あとはそれから先に少しずつ進んでいくことができます。
有り難いことにCP/Mアプリケーションは大抵はファンクションコールを利用しています。
アドレス0005Hのコールです。
そこでFORTRAN80の逆アセンブルリストをTeraPadで開いて、CD0500という文字列で検索をかけて、それを順にチェックしていきました。
すると。
ほどなくして、入口がみつかりました。

63B7 3E2A           LD A,2A
63B9 CDF763         CALL $63F7
63BC 0E0A           LD C,0A
63BE 11005B         LD DE,$5B00
63C1 CD0500         CALL $0005
63C4 3E0A           LD A,0A
63C6 CDF763         CALL $63F7
63C9 D1             POP DE
63CA C1             POP BC
63CB 3A015B         LD A,($5B01)
63CE 21025B         LD HL,$5B02
63D1 E5             PUSH HL
63D2 22515B         LD ($5B51),HL
63D5 85             ADD A,L
63D6 6F             LD L,A
63D7 3E00           LD A,00
63D9 8C             ADC A,H
63DA 67             LD H,A
63DB 360D           LD (HL),0D
63DD 23             INC HL
63DE 3E0A           LD A,0A
63E0 77             LD (HL),A
63E1 E1             POP HL
63E2 C9             RET

アドレス63C1HのCALL $0005です。
Cレジスタに0Aを入れていますから、ファンクション0A(コンソールバッファ入力)です。
その上のところでAレジスタに2Aを入れています。
2Aは*のASCIIコードです。
その下のCALL $63F7を調べましたら、ファンクション02(コンソール出力)をコールしていました。
おお。
間違いありません。
ここが、=HELLO の入力部分です。
そこでここからデバッグを開始しました。

>bp cc03
>/cpm,d
drive D ................................
drive C ................................
drive B ................................
drive A ................................

A>f80

A F  B C  D E  H L  A'F' B'C' D'E' H'L'  PC   SP   IX   IY  I  SZ H PNC
0044 0000 0001 0000 0000 0000 0000 0000 CC03 F7FE 0000 0000 FF 01000100
>bp@63c4
>rt@

*=HELLO
A F  B C  D E  H L  A'F' B'C' D'E' H'L'  PC   SP   IX   IY  I  SZ H PNC
4F42 000A 5B00 5B01 0000 0000 0000 0000 63C4 D3FD 0000 0000 FF 01000010
>dm@5b00,5b30
5B00  50 06 3D 48 45 4C 4C 4F-00 00 00 00 00 00 00 00  P.=HELLO........
5B10  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
5B20  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
5B30  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
>bp@63e1
>rt@


A F  B C  D E  H L  A'F' B'C' D'E' H'L'  PC   SP   IX   IY  I  SZ H PNC
0A08 0000 0001 5B09 0000 0000 0000 0000 63E1 D3FF 0000 0000 FF 00001000
>dm@5b00,5b0f
5B00  50 06 3D 48 45 4C 4C 4F-0D 0A 00 00 00 00 00 00  P.=HELLO........
>bp@63e2
>rt@

A F  B C  D E  H L  A'F' B'C' D'E' H'L'  PC   SP   IX   IY  I  SZ H PNC
0A08 0000 0001 5B02 0000 0000 0000 0000 63E2 D401 0000 0000 FF 00001000
>

毎々自画自賛ですけれど、FORTRAN80などというプログラムまでこうやってデバッグできてしまうところがちょいとすぐれもののシステムだとは思いませんでしょうか?

BP CC03とそのあとの/CPM,Dはこういう場合の約束ごとです。
F80[Enter]と入力するとCC03でブレークします。
ここからが本番です。
BP@63C4
RT@
と入力すると、F80に戻ります。
*の表示に=HELLO[Enter]と入力すると、63C4でブレークしました。
さきほどのF80の逆アセンブルリストから、コンソール入力バッファは5B00からであることがわかっていますから、その内容をDM@で表示させてみました。
むむ。
ちゃんと=HELLOは入力されていますね。
そうすると。
ここから先を続けていくしかありません。
ええ。
仕方がありませんから、続けていきましたよ。

そうしましたら。
ついに。
あれえ?
おかしいじゃないの?
というところに行き着きました。

646E D5             PUSH DE
646F 0E16           LD C,16
6471 CD0500         CALL $0005
6474 3C             INC A
6475 CAAC60         JP Z,$60AC
6478 E1             POP HL
6479 CDA764         CALL $64A7
647C 0E0F           LD C,0F
647E CD0500         CALL $0005
6481 3C             INC A
6482 CAA660         JP Z,$60A6

6471のCALL $0005はファンクション16H(新規ファイルオープン)です。
ここでHELLO.RELを新規オープンしています。
おかしいのは、そのあと647EのCALL $0005です。
ここはファンクション0F(ファイルオープン)です。
この部分だけではよくわかりませんが、じつは6471のCALL $0005と647EのCALL $0005ではどちらもDEレジスタの値は同じなのです。

>bp@6471
>rt@

A F  B C  D E  H L  A'F' B'C' D'E' H'L'  PC   SP   IX   IY  I  SZ H PNC
FF6A 0016 5A71 E00A 0000 0000 0000 0000 6471 D3F5 0000 0000 FF 01101010
>bp@6475
>rt@

A F  B C  D E  H L  A'F' B'C' D'E' H'L'  PC   SP   IX   IY  I  SZ H PNC
0100 0016 5A71 5A91 0000 0000 0000 0000 6475 D3F5 0000 0000 FF 00000000
>bp@647e
>rt@

A F  B C  D E  H L  A'F' B'C' D'E' H'L'  PC   SP   IX   IY  I  SZ H PNC
0048 000F 5A71 5A71 0000 0000 0000 0000 647E D3F7 0000 0000 FF 01001000
>dm@5a70,5a7f
5A70  00 00 48 45 4C 4C 4F 20-20 20 52 45 4C 00 00 00  ..HELLO   REL...

そしてそのDEレジスタの値(5A71)はFCBアドレスを示していて、そこには新規ファイル名HELLO.RELがありました。

でも、これっておかしくない?
だって。
今新規オープンしたばかりのファイルをまたオープンするの?
なんだかおかしなことをやっているようでありますけれど…。
おお。
ひょっとして。
647EのCALL $0005の後ろにあるJP Z,$60A6って、もしや…。

その、もしやでありました。
60A6は、
?File not foundのエラー表示ルーチンでありました。
そして、確かに、647EのCALL $0005でファイルオープンに失敗していたのです。

あっ。
そういうことか。
だが、しかし。

というところで、本日は時間がなくなってしまいました。
次回、意外、まさかの解決編です。

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

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