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

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

[第173回]


●EOF(End of File)コード

前回からの続きです。
ソースプログラムの終わりから後は全て00にしたのですが、それでもおかしなエラーはなくなりませんでした。

Premature End of File(ファイルの終わりが早過ぎる)というエラーメッセージから推測すると、どうやらファイルの終わり方に問題があるらしいように思えます。
ソースプログラムの最後にはENDが書いてありますからそれで終わりにしてくれてもよさそうなものですけれど、どうもそうはいかないようです。
END文から後ろを全て00にしてみても、やっぱり駄目でした。

END文の後ろは全て00にしたのですけれど、それでも相変わらず「END文のうしろにまだ何かある」と言っているようです。
ひょっとするとファイルの最後にEOFコードを置いたら解決できるかもしれません。

EOFコードは[第15回]で説明をいたしました。
コード1AHです。
その昔はファイルの終わりを示すために、最後にEOFコード(1AH)を置いたようですが、いまどきのテキストエディタはそんなことはしてくれません。
自分でファイルの終わりに1AHを書くしかありません。
なかなかに面倒なことです。

面倒ではありますが、ND80ZVにはそういう作業のためのマシン語コマンドが用意されていますから、こういう場合には比較的簡単に目的のものを作り上げることができます。

以下は実際に作業を行なった過程を記録したログファイルです。
最初に前回と同じように
JP@8080
を実行して、0100Hからのエリアを00でクリアしました。
前回の結果からすると、このようにしてもエラーメッセージはなくなりませんでしたから、無駄作業のようなものですが、こうすることで視覚的にファイルの終わりがよくわかりますから、そのようにしました。
実行後DM@コマンドでメモリ内容を確認しました。

>jp@8080
>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  ................
>

そうしておいて、前回と同じように、
/ld hell1.for,0100[Enter]
を実行して、0100Hからのトランジェントエリアにソースプログラムをロードしました。
ロード後に、もう一度DM@コマンドでメモリの中味を確認しました。

>/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  ................
>

/ldコマンドを実行するとロードしたメモリの範囲が表示されますから、ファイルをロードした最後のメモリアドレスが01DDHであることはその表示からわかります。
さらに、DM@コマンドを実行すると、プログラムがロードされなかったところは00なので、ファイルの終わりを見て確かめることができます。

ここからが今回の作業です。
CM@コマンドでファイルの終わりにEOFコード(1AH)を追加します。


>cm@01dd
01DD 0A-
01DE 00-1a
01DF 00-
>dm@01d0,01df
01D0  3D 27 2C 49 35 29 0D 0A-09 45 4E 44 0D 0A 1A 00  =',I5)...END....
>

アドレス01DEHに1Aを書き込みました。
そのあとまたDM@コマンドで正しく書き込まれたことを確認しました。

これで準備は完了しましたから、CP/M互換DOSを起動します。
JP D233[Enter]
を実行してCP/M互換DOSを起動しました。
SAVE 2 HELL3.FOR[Enter]
を実行して、HELL3.FORというファイル名でAドライブにセーブしました。

>jp d233

A>dir
A: F80      COM : HELL1    FOR : HELL1    REL : HELLO    FOR
A: HELLO    REL : HELL2    FOR : HELL2    REL
A>save 2 hell3.for
A>

もう一度F80コンパイラを実行します。

A>f80

*=HELL3
HELL1

*end of ZBDOS
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Sat Jul 14 10:54:25 2012

F80[Enter]
と入力してF80コンパイラを起動し、*の表示に
=HELL3[Enter]
と入力したところ、今度はエラーメッセージが表示されなくなりました。

やっとエラーメッセージの原因とその対策がわかりました。
しかし。
毎回ここで説明しましたように、EOFコード(1AH)を手操作で付け加えるというのは、面倒なことです。
そうでなくても、/LDコマンドでファイルをロードして、それからCP/M互換DOSを起動して、それからSAVEコマンドであらためて仮想FDDに保存する、という操作自体が結構面倒な作業です。

そこで、そのあたりを簡単にすることができるようにツールを作りました。
それにつきましては、また次回に説明することにいたします。

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

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