2013年12月07日

ディスクのロードとセーブの問題

 現在、ディスク関連をいろいろと調べているんですが、ちょっと気になって仕様をいくつか。


 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を解析したわけではなく、憶測が入っていますので、間違っているかも知れません。念のため。 


posted by えすび at 20:32| Comment(5) | P6解析:FDC周り | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
>  つまり、AXシリーズなどの、BASIC+データを1本のBASICプログラムにしているものの場合、プログラムの終了アドレスが違うことになります。
>  また、カセットにセーブする際の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)の気がしますが。
Posted by かかっくん at 2013年12月09日 21:16
 SAVE の代わりに BSAVE を使う事自体は問題ないのですが、それを BLOAD する時に2つ問題が発生します。

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)は、違うはずですが。
Posted by えすび at 2013年12月09日 23:01
こうなったらワークエリアまでBSAVEするというのは反則ですか?
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が付くだけでした。
Posted by かかっくん at 2013年12月12日 04:13
>>こうなったらワークエリアまでBSAVEするというのは反則ですか?
>>MODE5でも32Kを保存すれば済むので1D1枚に4本入りますし。

 反則ですねぇ(^^;

 実際はスタックと割り込みの関係で多分動かないと思います。エミュレータだったら動くかも知れませんが。


Posted by えすび at 2013年12月12日 09:06
> 反則ですねぇ(^^;

やっぱり。

> 実際はスタックと割り込みの関係で多分動かないと思います。エミュレータだったら動くかも知れませんが。

確かに、CPUの状態まではBSAVEできませんね。これができたらBSAVEではなくどこでも
セーブですし(どこでもセーブには他のICの状態等の保存も必要ですが)。
でもBASICの入力待ちではSPはあまりヘンな値ではなさそうですし、割り込みの状態も
問題なさそうな気がします。
何しろカセットからのCLOADの直後ですし。
Posted by かかっくん at 2013年12月13日 01:01
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。