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

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

[第172回]


●F80で摩訶不思議なエラーメッセージ

前回はF80(FORTRAN80コンパイラ)のためのサンプルプログラム(インターネットからのいただきものです。[第168回]参照)に、お恥ずかしい入力ミスがあったことが、エラーメッセージが表示された原因でした、ということを書きました。

そこで、その入力ミスを直して、あらためてF80を実行しましたところ、今までのエラーメッセージは出なくなりましたが、代わりに摩訶不思議といいますか、全く理解できないエラーメッセージが表示されるようになってしまいました。

A>f80

*=HELL1
HELL1

?Line:1 Statement Unrecognizable or Misspelle・

?Line:5 Premature End of File on input devic・

?2 Fatal Error(s) Detected・lt;

あ。
上記はログファイルからのコピーで、このログファイルが作成された時点では7ビットコードに限定対応前ですので([第170回])、エラーメッセージの一部におかしな文字が表示されています。

突然にF80様が、Line:1がわからんぞ、と言い出しました。
んなわけはないのです。
Line:1は、
PROGRAM HELL1
だけでありまして、それはちゃんとコンパイラの先頭で
HELL1
と表示されておりますから、F80様はちゃんとお読みになったはずでありまして、それを今更UnrecognizableでありますとかMisspelledでありますとか言われましても、そりゃあ理不尽というものでありましょう。
Line:5では、ここでファイルエンドは早過ぎるとのたもうておりますが、そこにはEndなどありませぬ。

こういうことはCコンパイラなどでもよくあります。
原因はそこにはないのですけれど、ロジックを全く無視した想定外の事態が発生すると、さすがのコンパイラ様も乱心あそばしてしまいます。

これは前回よりも難題でありまして、いろいろソースプログラムを書き換えたり短くしてみたり、またまたF80.COMの逆アセンブルリストをもとに、エラーメッセージのもとをさぐってみたり、とまたもや疑心暗鬼の1日となってしまいました。

何回も書いたことですけれど、「もう駄目」「わからん」「万事休す」と言って投げてしまっては、ほんとうにそこでジ・エンドになってしまいます。
「もう駄目」と思っても、そこでもうひと押しすることが意外と解決につながったりします。
とにかく諦めてしまわないことです。

さて、血走った目でエラーメッセージをながめ、朦朧とした頭でそれを繰り返しそしゃくしておりましたら。
「Premature End of File」
に、感じるものがありました。

そういえば。
CP/Mではファイルは256バイト単位でセーブされているため、本来のファイルエンドの後に余計なものがくっついてしまうことがあったのでは?([第15回]

そこで。
本来のファイルの終わりから後に余計なものがくっついてこないように、あらかじめ0100Hからのトランジェントエリアを00でクリアしておいて、そこにソースプログラムをロードしてから、それをセーブするようにしてみました。

これはちょいと面倒な作業になります。
トランジェントエリアを00でクリアするプログラムは[第48回][第49回]でご紹介しました。
ただし、そのプログラムのままでは、今回は使えません。
そのときはまだ仮のシステムでしたから、トランジェントエリアは8100H〜でした。
しかし今は本来のアドレス0100H〜になっています。
当然00を書き込むアドレスを81xxから01xxに直さなければなりません。
そのためにはプログラムの先頭で
LD A,FF
OUT (9C),A
を実行して0000H〜7FFFHをRAMに切り換えておく必要があります。
しかし今回はそうする代わりにもっと簡便な方法で行ないました。

●JP@コマンド

CP/MでもMSDOSでもスタンダードなコマンドにはJPはありません。
それはデバッガとして用意されています。
実はJPだけではなくてDMでもCMでも同じで、そういう機能はマシン語のデバッグツールを起動して、はじめて使えるようになります。

しかしND80ZVのZB3BASICではそんな面倒なことは不要です。
BASICのコマンドラインからマシン語のデバッグコマンドである、JPやDMやCMをダイレクトに入力して直ちに実行することができます。

JPコマンドは指定するアドレスにジャンプします。
たとえば
JP 8080[Enter]
と入力すると、8080Hにあるマシン語プログラムが実行されます。

以前に、DMコマンドの機能を拡張して、DM@と入力することで、指定するメモリアドレス範囲が0000H〜7FFFHであるときに、その対象をRAMに切り換えてその内容を表示することができるようにしました([第163回])。
[第164回]ではCMも同様に機能拡張を行なって、CM@と入力することで、対象をRAMに切り換えることができるようにしました。

実はこのときに、JPコマンドについても同様の機能拡張を行ないました。
JP@xxxx
と入力したときは、指定アドレスがどのようなアドレスであっても、0000H〜7FFFHの範囲はRAMに切り換えます。

さて。
それではトランジェントエリア(ここではその一部の範囲0100H〜07FFH)を00で埋めます。


logfile nd80zlog\07141046.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
can't open D.vfd
>/ld fill00.bin,8080
loading FILL00.BIN ...0010(16)bytes loaded,from 8080 to 808F
>cm 8080
8080 21-
8081 00-
8082 81-01
8083 06-
8084 00-
8085 70-
8086 23-
8087 7C-
8088 FE-
8089 88-08
808A C2-
808B 85-
808C 80-
808D C3-3e
808E 33-00
808F 10-d3
8090 00-9c
8091 00-c3
8092 00-33
8093 00-10
8094 00-
>jp@8080

FILL00.BINをロードしてから、CMコマンドで一部を書き換えます。
書き換えたのは以下の部分です。

8080 210001 LD HL,$0100
8088 FE08   CP 08
808D 3E00   LD A,00
808F D39C   OUT (9C),A
8091 C33310 JP $1033

このように変更してから、
JP@8080[Enter]
と入力します。
ここで
JP 8080[Enter]
と入力してもプログラムは実行されますが、0000H〜7FFFHの範囲がROMのままになるため、00で書き換えられません。

実行後にDM@コマンドで確認してみました。

>dm@0100,01ff
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 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0140  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0150  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0160  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0170  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0180  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0190  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
01A0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
01B0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
01C0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
01D0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
01E0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
01F0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
>

●ソースプログラムをロードする

以上の準備をしてからソースプログラムをロードしました。
ここではHELLO.FORではなくて、HELL1.FORになっていますが、内容は先頭の
PROGRAM HELLO

PROGRAM HELL1
になっているだけで、そのほかは同じです。

>/ld hell1.for,0100
loading HELL1.FOR ...00de(222)bytes loaded,from 0100 to 01DD
>dm@0100,01ff
0100  09 50 52 4F 47 52 41 4D-20 48 45 4C 4C 31 0D 0A  .PROGRAM HELL1..
0110  09 57 52 49 54 45 28 33-2C 31 30 30 29 0D 0A 31  .WRITE(3,100)..1
0120  30 30 09 46 4F 52 4D 41-54 28 27 20 48 45 4C 4C  00.FORMAT(' HELL
0130  4F 20 57 4F 52 4C 44 21-21 20 62 79 20 46 4F 52  O WORLD!! by FOR
0140  54 52 41 4E 38 30 27 29-0D 0A 09 57 52 49 54 45  TRAN80')...WRITE
0150  28 33 2C 31 31 30 29 0D-0A 31 31 30 09 46 4F 52  (3,110)..110.FOR
0160  4D 41 54 28 33 58 2C 27-41 2C 42 2C 43 2C 44 3D  MAT(3X,'A,B,C,D=
0170  27 29 0D 0A 09 52 45 41-44 28 33 2C 31 32 30 29  ')...READ(3,120)
0180  20 49 2C 4A 2C 4C 2C 4D-0D 0A 31 32 30 09 46 4F   I,J,L,M..120.FO
0190  52 4D 41 54 28 34 49 31-35 29 0D 0A 09 4B 3D 49  RMAT(4I15)...K=I
01A0  2B 4A 2B 4C 2B 4D 0D 0A-09 57 52 49 54 45 28 33  +J+L+M...WRITE(3
01B0  2C 32 30 30 29 20 4B 0D-0A 32 30 30 09 46 4F 52  ,200) K..200.FOR
01C0  4D 41 54 28 33 58 2C 27-37 41 2B 42 2B 43 2B 44  MAT(3X,'7A+B+C+D
01D0  3D 27 2C 49 35 29 0D 0A-09 45 4E 44 0D 0A 00 00  =',I5)...END....
01E0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
01F0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
>jp d233

ロード後にDM@で内容を確認しました。
最後の0D0Aの後は00になっています。
これなら大丈夫かも。

JP D233[Enter]
でCP/M互換DOSを起動しました。

●やっぱり同じエラーメッセージが出てしまいました

SAVEコマンドでAドライブにセーブします。
ファイル名はHELL1.FORと区別するためにHELL2.FORにしました。

そうしておいて、F80を実行し、HELL2.FORをコンパイルしたのですが。

A>save 2 hell2.for

A>dir
A: F80      COM : HELL1    FOR : HELL1    REL : HELLO    FOR
A: HELLO    REL : HELL2    FOR
A>f80

*=HELL2
HELL1

?Line: 1 Statement Unrecognizable or Misspelled:

?Line: 5 Premature End of File on input device:

?2 Fatal Error(s) Detected

*end of ZBDOS

やっぱり同じエラーメッセージが出てしまいました。

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

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