2015.1.24

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

MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!


[第110回]


●SAVE

前回の続きです。

SAVE n ファイル名.拡張子[Enter]
と入力すると、カレントドライブに、現在メモリの0100〜にあるプログラム(データ)の0100〜n×256バイト分が指定したファイル名でセーブされます。

SAVE n B:ファイル名.拡張子[Enter]

のようにファイル名の前にドライブ名とコロン(:)をつけて入力すると、指定したドライブにファイルがセーブされます。
このコマンドを実行してもカレントドライブは変更されません。

SAVEコマンドのテストをしようとして、ちょいと困惑してしまいました。
サンプルとして都合がいいのはちょうど前回使ったMFTST2.TXTです。
最初はちょっと思い違いをしておりまして、TYPEコマンドで使ったファイルが0100〜のトランジェントエリアに残っていないかと思ったのですけれど、TYPEコマンドはシステムのワークスペースを使っていて、トランジェントエリアは使っていませんでした。

それを確かめるために一旦CP/M互換モードを終了してZB3BASICに戻ってDM@コマンドを実行してみました。
DM@コマンドは[第95回]で説明をしました。


ここでまた気が付きました。
CP/MにはSAVEコマンドはあるのですがLOADコマンドは無いのですねえ。
どうやらそれはマシン語デバッガーのようなユーティリティプログラムを使って実現することのようです。

う?
マシン語デバッガー?

おお、そうでした。
マシン語デバッガーならあるじゃありませんか。
ZB3BASICのマシン語モニタコマンドを使えばできます!
DM@コマンドもその1つでした。

/LDコマンドを使えばよかったのでした。
/LDは[第97回]で説明しました。

/LDは普通はZB3DOSの置かれているディレクトリにあるファイルをロードするのに使います。
しかし上の例のように目的のファイルをディスクドライブ名(仮想ディスクではなくてWindowsのディスクドライブのことです)からフルパス記述することで、他のディレクトリにあるファイルをロードすることもできてしまいます(これは便利!)。
/LD C:¥ASM80¥MYCPU80¥Z¥MFTST2.TXT
でCドライブのASM80ディレクトリのMYCPU80ディレクトリのZディレクトリにあるMFTST2.TXTをアドレス0100にロードしました。
そのあと念のためにDM@コマンドで確認をしました。

さてこれからのテストの手順ですが、上のようにしてロードした0100〜にあるデータをSAVEコマンドで仮想ディスクにセーブしたあと、それをTYPEコマンドで表示させてみようというわけです。
TYPEコマンドで表示させるためには、そのファイルがTXTファイルである必要がありますがこれはクリアしています。
しかしクリアしなければならないことがもう一点あります。

前回TYPEコマンドのところで書きましたように、テキストファイルの終わりには1A(ファイルエンドコード)が必要です。
これもそこで説明をしましたようにCOPYコマンドでZドライブからA〜Dドライブにコピーするときにはファイルエンドに1Aコードが追加されます。
ですのでDドライブにコピーされたMFTST2.TXTをロードすればファイルエンドコードもついてきます。

ところが残念なことに/LDコマンドはCP/M互換DOSのA〜Dドライブにはアクセスできません。
/LDで仮想ディスクのDドライブにあるMFTST2.TXTではなくてわざわざフルパスでZドライブにあるMFTST2.TXTをロードしたのはそのためです。
しかしZドライブにあるMFTST2.TXTはWindows上で作成したテキストファイルですから末尾に1Aコードは付加されていません。

そのことをMSDOSのDEBUGコマンドで確かめてみました。

これではファイルエンドがはっきりわかりませんねえ(ソースプログラムリストと対比させてみればわかりますけれど)。

そこでMSDOSのDIRコマンドで確認してみました。

ファイルサイズは148バイトです。
0100Hがファイルの先頭ですから148(94H)バイトということはファイルエンドは0193Hになります。
0193Hは0Aです。
やっぱり1Aコードはありません。

余談ですが。
注意深い読者様は「MFTST2.TXTのフルパスが違うじゃないの?」とお気付きかも。
ええ。
私のところでは何台かあるパソコンを目的に応じて使いまわしておりまして、このところ通常MYCPU80を接続してZB3DOS(CP/M互換DOS)のデバッグをしておりますパソコンと、上の画像のパソコンは別物なのです。
こちらは主にプログラム開発に使っております(どちらもいまだにWindows98SEです。使い勝手が良いのでいまだに手放せません)。

もうひとつ余談です。
ひとつ上の画面ではDEBUGコマンドでD(ダンプ)を入力するとメモリダンプが0100Hから開始されていますが、CP/Mのトランジェントエリアとは関係ありません。
MFTST2.TXTはテキストファイルですからロード先アドレスの情報は持っていません。
実はMSDOSのDEBUGコマンドでファイルを開くとアドレス0100Hから始まるメモリスペースにロードされるのです。
MSDOSはCP/Mを参考にして作られたといわれていますが、このあたりをみますと、なるほどと納得してしまいます。

1Aコードに戻ります。
そういうことなので通常は上のような操作で/LDコマンドで直接トランジェントエリアにテキストファイルをロードした場合、ファイルエンドに1Aを追加しておかないとまずい場合があります。
その追加はCM@コマンドを使えば簡単にできます。
CM@コマンドは[第95回]で説明をしました。
しかし今回の場合には幸い先に行なった作業の名残でロード先が1Aで埋められていましたから、今回に限ってはCM@コマンドは使わなくても済みました。

ということで、やっとここからがSAVEコマンドのテストです。

ZB3BASICの/LDコマンドで0100HにMFTST2.TXTをロードして、DM@コマンドでちゃんとロードされていることを確認しましたので、
/CPM,D
でCP/M互換DOSに再エントリしました。
/CPMでも問題はないだろうと思ったのですがここで余計なことはしてほしくないので、念のためそのようにしました。
/CPM,Dは[第103回]で説明しました。

今回セーブしたいデータは0100H〜0194Hの95H(149)バイトですから、n=1を指定してsvtst1.txtの名前でセーブしました。
SAVE 1 SVTST1.TXT
です。
n=1の場合0100H〜01FFHまでの256バイトがセーブされます。

そのあとDIRコマンドでちゃんとセーブされていることを確認しました。

TYPEコマンドで今セーブしたSVTST2.TXTを表示させてみました。


上のテストでは256バイト未満の短いファイルをセーブしました。
今度はn>1の少し大きなファイルをセーブしてみます。

MFTST7.TXTも[第106回]でお見せしたアセンブラソースファイルです。

こちらは1449バイトあります。

これもMFTST2.TXTのときと同じようにして0100Hにロードしました。

1449=05A9Hですから、0100Hからロードするとファイルの終わりは06A8Hになります。
DM@コマンドで確認してみると今回はそれより後ろのメモリアドレスは1Aでは埋められていませんでした。
そこでCM@コマンドで1Aを付加しました。

それで準備完了しましたから、/CPM,DでCP/M互換DOSに再エントリしました。

今度は別のドライブからSAVEコマンドを使ってみました。
カレントドライブをAドライブにして、そこからDドライブにファイルをセーブします。
1450/256≒5.66ですからn=6になります。
SAVE 6 D:SVTST2.TXT
を実行しました。
そのあとDIRコマンドでちゃんとDドライブにセーブされていることを確認しました。
そして
TYPE D:SVTST2.TXT
を実行しました。

ファイルの終わりまで正しく表示されました。


今回はSAVEコマンドを説明しただけですが、ちょっと長くなってしまいましたので、続きはまた次回にいたします。

MYCPU80でCP/Mを![第110回]
2015.1.24upload

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