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

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

[第193回]


●MACRO−80(5)

前回からの続きです。
MACRO−80でアセンブルして作成したMVFTST1C.COMを実行したところハングアップしてしまいました。
その原因をさぐるため、ブレークポイントを設定して、MVFTST1C.COMをトランジェントエリア(0100H〜)にロードした直後にブレークさせて、0100Hからのメモリ内容をDM@コマンドで確認してみました。
そうしましたら、そこにはMVFTST1C.COMとは全然違うマシン語コードが展開されていました。


A>dir
A: F80      COM : HELL1    FOR : HELL1    REL : HELLO    FOR
A: HELLO    REL : HELL2    FOR : HELL2    REL : HELL3    FOR
A: HELL3    REL : M80      COM : MVFTST1  MAC : MVFTST1  REL
A: MVFTST1B MAC : MVFTST1B PRN : MVFTST1B REL : MVFTST1C MAC
A: MVFTST1C PRN : MVFTST1C REL : L80      COM : MVFTST1C COM
A: VFTST1   COM
A>mvftst1c

A F  B C  D E  H L  A'F' B'C' D'E' H'L'  PC   SP   IX   IY  I  SZ H PNC
0042 0001 D709 D604 0000 0000 0000 0000 C541 F800 0000 0000 FF 01000010
>dm@0100,017f
0100  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0110  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0120  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0130  00 00 1A 29 0B FE 29 C4-9D 04 C3 40 0B 3E 01 32  ...)..)ト..テ@.>.2
0140  2F 3D C3 59 2B AF 32 2F-3D C3 59 2B AF 32 2D 3D  /=テY+ッ2/=テY+ッ2-=
0150  C3 59 2B CD 55 0B C2 47-2B 0C 0D CA 47 2B F5 CD  テY+ヘU.ツG+..ハG+.ヘ
0160  0E 0C C4 24 0C C2 3A 2B-7E F6 40 77 F1 FE 2C C0  ..ト$.ツ:+~.@w..,タ
0170  CD 55 0B C2 C1 04 C3 2C-2B 3E 01 32 2D 3D C9 3E  ヘU.ツチ.テ,+>.2-=ノ>
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Sat Aug 04 17:02:05 2012

こうなると、そもそもAドライブにセーブされているのは、これと同じデータなのか、それとも何かの原因で、別のものがロードされてしまったのではないか、とそのような疑問が出てきました。
それを確認するためには、Aドライブの中味を確かめてみなければなりません。
仮想フロッピードライブの中味を確認するためのツールは[第167回]で紹介いたしました。
VFDUMP.EXEです。

VFDUMPを実行して、Aドライブのディレクトリを表示させました。
下の画像では、ちょうどMVFTST1C.COMのFCBが表示されています。
その下には、ND80ZV附属のZ80アセンブラZASM.COMでアセンブルして作成したVFTST1.COMのFCBが見えます。

念の為、まずはVFTST1.COMのデータセクタを確認してみました。
VFTST1.COMのFCBのブロックアロケーションエリアにはデータブロックbニして33Hが書かれています。
十進に直すと51です。
その下のところでセクタbT1を表示させていますが、これは間違いです。



33H(=51)はセクタbナはなくてブロックbナした。
CP/M互換DOSでは1ブロック=16セクタにしましたから、ブロックbゥらセクタb算出すると、51×16=816になります。
そこでセクタbW16を表示させてみました。
セクタ内容は正しいようです。

それでは次にMVFTST1C.COMのデータの確認です。
もう一度上の画像のMVFTST1C.COMのFCBエリアを見てください。
データブロックのbヘ32Hになっています。
32Hは十進の50です。
ブロックbT0からセクタb計算すると、50×16=800になります。

そこでセクタbW00の内容を表示させてみました。



やっぱりMVFTST1C.COMというファイル名で、間違ったデータがセーブされてしまっているようです。

さて、この原因はどこにあるのでしょうか?
これはなかなかに悩ましい問題です。
MVFTST1C.COMをAドライブにセーブしたのはリンカ(L80)です。
しかし、同じL80を使って、先にはFORTRAN−80コンパイラで作成したファイルを処理しましたが、そのときは正しいファイルがセーブされました。

そうなってくると、やっぱり問題はMACRO−80にあるということになります。
しかし、MACRO−80では最終的にエラーメッセージは表示されなくなりました。
すると。
問題は、ひょっとすると、ソースプログラムにあるのかも知れません。
どこかがMACRO−80のルールに合っていないのかも。

実はMVFTST1Cではファンクションコールアドレスの0005Hを、
FCALL EQU 0005H
としてプログラムの先頭で定義しています。
ところが「応用CP/M」(村瀬康治著。アスキー出版局)に書かれているサンプルプログラムでは、どういうわけかデータエリアはEQUを使って定義しているのですが、ファンクションコール(外部のプログラム)をCALLしているところでは、
CALL 0005H
というように、直接アドレスを指定しているのです。
ひょっとして、
FCALL EQU 0005H
がまずいのでは?
と思って、CALL 0005Hに直してみたのですが、結果は変わりませんでした。

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

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