復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第16回]
●EOFコードの確認は?
前回、テキストファイルを表示させるプログラムを作って試したところ、表示されたリストの後にゴミが表示されてしまいました。
CP/MではプログラムやデータをディスクにSAVEするときに、ページ(256バイト)単位で保存を行ないます。
データの最後の部分が256バイトに満たないときは、その後の関係のない部分も含めて256バイト分が保存されてしまいます。
そのようにしてディスクに保存されたファイルを、読み出すときも同じように、データの最後の部分は、その後の関係のない部分も含めて読み出してしまいます。
ですからもしデータの終わりを示すマーク(EOF)が無いと、前回お見せしたようなゴミが表示されてしまうことになります。
そういうことがわかりましたから、データの最後の部分にEOFコード(1A)を追加してから、もう一度そのファイルを読み込んで表示させてみました。
EOFコードを追加する前は、TYPEコマンドでもゴミが表示されたのですが、EOFコードを追加したところ、TYPEコマンドではゴミは表示されなくなりました。
ところが「応用CP/M」に載っているサンプルプログラムを実行したところ、EOFコードを追加しても、やっぱり追加する前と同じように、ゴミまで表示されてしまいました。
というところまでが、前回でした。
そこで、あらためてプログラムを調べてみましたら、なんとEOFコードをチェックしているところが全く無いことがわかりました。
これではEOFコードを追加してみても、何の変化も無かったのも当たり前です。
下はそのプログラムの、バッファに読み込んだファイルの内容を1バイトずつ表示する部分です。
Cレジスタ=02のファンクションコールは、Eレジスタの値をASCIIコードとみなして、その文字をコンソールに表示します。
811C 218080 LD HL,DMABF 811F 0E02 SCROUT:LD C,02 8121 5E LD E,(HL) 8122 E5 PUSH HL 8123 CD09C4 CALL BDOS |
811C 218080 LD HL,DMABF 811F 0E02 SCROUT:LD C,02 8121 7E LD A,(HL) 8122 FE1A CP 1A;EOF 8124 C8 RET Z 8125 5F LD E,A 8126 E5 PUSH HL 8127 CD09C4 CALL BDOS |
>D.,8300,833F 8300 0D 0A 09 44 42 20 30 41-0D 0A 09 22 24 22 0D 0A ...DB 0A..."$".. 8310 3B 45 4E 44 0D 0A 0D 0A-00 00 00 00 00 00 00 00 ;END............ 8320 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 8330 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ |
RET MSGERR:DB 0D DB 0A DB 0A "FILE" " GA " "NAI" DB 0D DB 0A "$" ;END a>DIR |