現在、ディスク関連をいろいろと調べているんですが、ちょっと気になって仕様をいくつか。
1)BSAVE の時は、開始番地、終了番地+1が、セーブされるデータの前にセーブされる。このため、データが4バイト増える。
これは、解析マニュアルTにも書かれている事です。
2)BLOAD の時は、指定した範囲以外にはデータを格納しない。
当たり前ですが...
3)SAVE の時は、バイト単位のディスク長がデータにセーブされずに、どれだけのセクタ数を使ったかを記録している。
FAT を使って、どれだけのクラスタ、セクタ数を使っているかを示しています。このためプログラムのサイズは、セクタ単位(256バイト単位)でしか表せません。数十バイトのプログラムでも、256バイトと見なされます。
4)SAVE の時は、ワークエリアで示された『プログラムの開始アドレス』、『変数領域の始まり=プログラムの終了アドレス−1』までを、ディスクに書き込んでいる。この時、セクタ単位(256バイト単位)で書き込むため、プログラムの後ろの部分もセーブする。
『プログラムの開始アドレス』は、0xFA5F、0xFA60 で示されます。『変数領域の始まり=プログラムの終了アドレス−1』は、0xFF56、0xFF57 で示されます。
このため、このワークエリアを書き換えると、任意の場所のデータをBASICファイルとしてSAVEできます。
5)LOAD の時は、セクタ単位で、『プログラムの開始アドレス』から順に格納していく。格納し終わったら、リンクポインタの再計算と、『変数領域の始まり=プログラムの終了アドレス−1』を修正する。
修正の処理は、CLOAD の時も同じ処理が行われますが、CLOAD と LOAD で微妙に違うようです。
『変数領域の始まり=プログラムの終了アドレス−1』の算出の仕方
CLOAD:カセットからのデータの格納が終了したアドレス(0x00を10個検出した地点)
LOAD:リンクポインタを再計算した結果の最終アドレス。
つまり、AXシリーズなどの、BASIC+データを1本のBASICプログラムにしているものの場合、プログラムの終了アドレスが違うことになります。
また、カセットにセーブする際のBASICプログラムは、0x00が10個以上続くとNGだったのが、ディスクでは、0x00 が何個も続いても構わないという事になります。
ディスクでBASICのプログラムを扱う時、5)に付随して問題が発生します。
◆AXシリーズなどの、BASIC+データを1本のBASICプログラムにしているものの場合、
カセットからCLOADする。
↓
ディスクにSAVEする(これは問題なくセーブされる)。
↓
ディスクからLOADする(これも問題なくロードされる)。
↓
ディスクにSAVEする(これができない。終了アドレスが間違っているため)。
◆メモリをぎりぎりまで使っているようなプログラムの場合、
カセットにCSAVEする。
↓
カセットからCLOADする(問題なし)。
ディスクにSAVEする。
↓
ディスクからLOADする(?OM Error が出ることがある。256バイト単位の管理のため)。
BASIC-ROMを解析したわけではなく、憶測が入っていますので、間違っているかも知れません。念のため。


> また、カセットにセーブする際のBASICプログラムは、0x00が10個以上続くとNGだったのが、ディスクでは、0x00 が何個も続いても構わないという事になります。
これですが、対処方法としてBSAVEを使うのはいかがでしょう?
BASICのSAVEにBSAVEは変な気もしますが、要はメモリ上のデータをそのままSAVEできる
のがBSAVEですから、両者とも対応できそうな気がします。
でも、そもそも通常のBASICでは00hは行末やプログラムの末尾の記号なので、
途中で10個以上続く事はないと思いますが。
> ◆AXシリーズなどの、BASIC+データを1本のBASICプログラムにしているものの場合、
> カセットからCLOADする。
> ディスクにSAVEする(これは問題なくセーブされる)。
> ディスクからLOADする(これも問題なくロードされる)。
> ディスクにSAVEする(これができない。終了アドレスが間違っているため)。
(中略しました)
この場合はBSAVEで一括SAVEする方法とBASICをSAVEで、データをBSAVEで別々に
保存する方法がある気がします。元々はプロテクト目的でしょうけど。
> ◆メモリをぎりぎりまで使っているようなプログラムの場合、
> カセットにCSAVEする。
> カセットからCLOADする(問題なし)。
> ディスクにSAVEする。
> ディスクからLOADする(?OM Error が出ることがある。256バイト単位の管理のため)。
実際にこうなるのか試してみますが、これもBSAVEで解決できそうです。
ところで、MODEによりワークエリアが違いそうな気がしますが、コレはどのMODEですか?
いつものようにMODE5(N66)の気がしますが。
1)ワークエリアの設定をする必要がある。
P6の場合、プログラムの直後に、変数領域、配列変数領域、とあり、その後ろが空きエリアとなります。
ロードした後に、変数領域、配列領域、空きエリアの開始アドレスを設定しないと、動作がおかしくなる場合があります。
2)BASICのリンクポインタの再生成をする必要がある。
セーブした時と同じデータをロードする場合は問題になりませんが、mode、pageが変わる場合は、BASICのスタートアドレスが変わることがあるために、リンクポインタを再生成する必要があります。CLOAD、LOAD では、コマンドを実行した時に、リンクポインタを再生成しているようです。
>>この場合はBSAVEで一括SAVEする方法とBASICをSAVEで、データをBSAVEで別々に
>>保存する方法がある気がします。元々はプロテクト目的でしょうけど。
プログラムで、BASIC+データ(マシン語)が1本になっているのは、プロテクト目的ではなくP6にマシン語モニタがないためだと思います。
>>ところで、MODEによりワークエリアが違いそうな気がしますが、コレはどのMODEですか?
>>いつものようにMODE5(N66)の気がしますが。
mode1〜mode5 共通です。P6初代機からSRまで同じです。mode6(SR−BASIC)は、違うはずですが。
MODE5でも32Kを保存すれば済むので1D1枚に4本入りますし。
> プログラムで、BASIC+データ(マシン語)が1本になっているのは、プロテクト目的ではなくP6にマシン語モニタがないためだと思います。
これはセオリー通りに分離(SAVE+BSAVE)した方が良さそうですね。
でもCLOADした直後には問題なくSAVEできるならそれでも...
> 1)BSAVE の時は、開始番地、終了番地+1が、セーブされるデータの前にセーブされる。このため、データが4バイト増える。
> これは、解析マニュアルTにも書かれている事です。
MODE1〜5でも、N88でもN88(86)でも同様でした。MODE6はSRが、NやN80はディスクが
ないので試していません。
DOS版N88(86)は番地を記録せずに、末尾にEOFが付くだけでした。
>>MODE5でも32Kを保存すれば済むので1D1枚に4本入りますし。
反則ですねぇ(^^;
実際はスタックと割り込みの関係で多分動かないと思います。エミュレータだったら動くかも知れませんが。
やっぱり。
> 実際はスタックと割り込みの関係で多分動かないと思います。エミュレータだったら動くかも知れませんが。
確かに、CPUの状態まではBSAVEできませんね。これができたらBSAVEではなくどこでも
セーブですし(どこでもセーブには他のICの状態等の保存も必要ですが)。
でもBASICの入力待ちではSPはあまりヘンな値ではなさそうですし、割り込みの状態も
問題なさそうな気がします。
何しろカセットからのCLOADの直後ですし。