実験中パート2

Windows95でフォーマットした16bitFATのZIPディスクを MSX−DOS2でREAD/WRITEする実験をしています。
12月30日

わぁ今年が終わっちゃう。年を越さないように、これでFAT16パッチ第一段階を終了します。
リードは多分問題ないのではと思いますが、ZIPの全ての領域で試したわけではありません。
セクタ番号のbit16が変化する位置にあるファイルとか、サブディレクトリがディスクの後方で、
ファイルがディスクの前方にある物とか、問題になりそうなケースだけ試しました。

ライトに関してはコピーなら大丈夫みたいです。これも完璧に試したわけではないです。
普通にファイルを作成するなら、ディスクの位置やディレクトリに関係なく出来るようす。
NGLOADやTRLOADでZIPにセーブした場合、エラーになることがあります。

28日版のパッチは、リードするセクタがBUFFERに読み込んであるかどうか調べるルーチンで、
手抜きしたので010001hセクタと000001hセクタの区別がつきません。危ないので直しました。
ものすごく危ないですね。

FAT16が使えるのはSTだけです。カーネルにはいろいろなバージョンがあるようで、
STのふたつのバージョンに対応しています。

LUNAと一緒に使えますが、CDエクステンションと一緒に使えないので、そのあたりを何とか
したいです。それから、気になることがひとつ。パッチをあてたSHEMでファイルを指定して
起動すると、セクタ番号のbit16-23が無視されるようなのですが、どうしてなのでしょう。
FAT16パッチ(ST用)MEGA-SCSI only

12月28日

ごめんなさい。下のパッチ、あちこち間違えています。これだからプログラム組みたくないのよね。
ディスクキャッシュを使いたいという要望が届いたので、直すついでに常駐アドレスをちょっと
変更してLUNAと一緒に使えるようにしました。

ディスクキャッシュってあまり使ったことがないし、家にあるのは随分前のバージョンかも
知れません。常駐アドレスは3FB0h〜3FFFhですか?変わってない?キャッシュのお陰で
アクセスが速くなりました。ZIPってFDDみたいに遅いです。

MMを使えるようにしたいです。解析しようかな。

12月26日

MEGA-SCSIの拡張入出力の使い方、わかりました。16bitFATの読み出しを考えて作った機能
ですか?3554hにパッチあてて、拡張入出力が使えるようにしました。
FDD以外はメディアIDがなくてもDIR出来るのですね。
DOS2カーネルも良くできてますが、MEGA-SCSIは凄いですね。私にはまだまだ理解できません。

32Mb以降のルートディレクトリにファイルを作れない問題はまだ解決できてないし、
やっぱり年を越しちゃいますね。

それから、また違う種類のカーネルが見つかりました。
スペインからの報告ですが、GTでUnknown kernelのエラーになるそうです。
STとGTではカーネルが違うのですか? どなたかGTのカーネルを送っていただけませんか。


12月23日 論理ブロック数をFFFFFFhに変えてFFFDh〜10004hセクタをリードすると、あっさり読めるじゃ ないですか。な〜んだ、これなら簡単。でも、こうすると・・・・ この先がわかりません。CレジスタにメディアIDの代わりにセクタ番号のbit22〜16を入れて、 普通に35E2hをコールすればいいのでしょうか。それともMEGA-SCSIの4010hを直接コールする? 3554hのメディアIDをCレジスタに入れるところ書き換えて、セクタ番号を入れていますが、 こうするとディレクトリが取れなくなってしまうのです。メディアIDがないからね。 もうちょっと、という所で先に進めません。

12月22日

この実験を始めてから半年近くになりますが、ようやく第1段階終了かなという所まで来ました。
ディレクトリ問題(サブディレクトリからルートディレクトリに戻れない、ディスクの空き容量
計算が出来ない)は解決方法がわかりました。
あとは32Mb以降のルートディレクトリへのセーブ、COMファイルはMMから実行しないと
"Wrong version of MSX-DOS"のエラーが出るので、MMで正常にファイル表示が出来るといいな
とか、まだまだすることがありましたね。

今日は気になっていたけど、大変そうだから見ないようにしていた部分に手を着けましたが、
案の定見なければ良かったという感じです。
25ADhからのセクタREAD/WRITEルーチンで、セクタ番号にREAD/WRITEしたセクタ数を足している
ところがあるのです。FFFFhセクタの次はどうなるのかなって。

この実験、ディスクのFFFFh〜10000hセクタにファイルをセーブしなければいけないので、
それが面倒でした。MSXで3F95hクラスタまでFATにFFhを書き込んで、それからWindows95で
ファイルをセーブしました。ファイルは3F96h〜3FA5hクラスタにあります。

SHEMでファイルをリードすると3F99hクラスタが読めません。3F99hクラスタはFFFDhセクタ〜
10000hセクタです。試しに3F99hクラスタを600hバイトと200hバイトに分けてリードしてみま
したが、始めの600バイトはFFFDhセクタ〜FFFFhセクタなので正常に読めました。
後の200hバイトはクラスタ番号が3F99hのままなので読めませんでした。

ファイルのREAD/WRITEはクラスタ単位?なので、クラスタの途中でセクタが終わってしまうと
駄目なのですね。
CDエクステンションみたいに論理ブロック数をFFFFFFhにするとどうなるのだろう。
似非職人工房さんに聞いてみないと、分からないですね。

ディスクを読む前にクラスタ番号のチェックをして、セクタの終わりだったらFFFFhまでを
ファイルリード、そのクラスタの残りはセクターリードして、転送アドレスやファイルリードの
ポインタを書き換える。なんか面倒ですね。
ファイルアクセスルーチンってファンクション26h,27h,48h,49hと共通なので、どっちを使って
いるのか分からないし、FIBのアドレスを調べるのも・・・・FIBはBBF2hに書いてあるかな。

年内には終わらない。


12月18日 DOS2カーネルはいくつか種類があるようで、ウチのはTYPE Bというものです。 なのでここに出てくるアドレスは全てTYPE B用です。 2B7Eh, 2EB6hのバッファ関連ルーチンを見ていたら、パッチのあてかたが分かりました。 どこにあてたのでしょう。セクタ番号の16-23bitが問題だったわけですね。 でもFATとルートディレクトリは必ず最上位8bitが0になるので除外します。 そうすると問題はサブディレクトリとデータのあるセクタです。 それでバッファにセクタ番号を書き込むときにそれらを見分けて、サブディレクトリと データのときはセクタ番号の最上位8bitをBUFFER+8に書き込みます。 そうすればFLUSH(2D23h)の時に完全なセクタ番号が得られると言うわけです。 このパッチをあてて、TRLOADでゲームをZIPのサブディレクトリにセーブしました。 932Chクラスタにバッチリセーブ出来てました。ロードもOK。ところが、ルートディレクトリに セーブ出来ません。なぜ簡単なルートディレクトリにセーブ出来ないのでしょう。 う〜ん、完成は遠いですね。 そのうち解析結果をアップします。
12月14日 ディスクライトの実験をしました。 クラスタ総数計算にパッチあてて、COMMAND2.COMパッチ版(ずっとこれを使ってますけど、 大丈夫みたいです)を使ってDIRを取ると・・・ディスクの空き容量計算に時間がかかりすぎ。 クラスタが多すぎるから? 2/3くらい埋まっているディスクにファイルを作成すると、MSXがハングしました。 どこで止まるのか・・・ページ3を他のセグメントにしてから実験してみよう。 スタックが残っていれば分かるかも知れないから。 FAT16-4は直しましたので、今度こそディスクの後ろの方が読めます。
12月13日 最近、ボケているのかも知れない。ZIPの後ろの方に作ったサブディレクトリが 読めなかったのは、BIT 7,D を潰すのを忘れていたからでした。 3ヶ所潰してあっさり解決しました。それにしても物忘れが・・・ 解析結果もきちんと残しておかないと、時間の無駄ですね。 若い人が受け継いでくれるといいのだけど。
12月12日 実験用のZIPディスクを作りなおしました。 WIN95にMSXのHDDを繋ぎたかったのに、どういう訳か出来ませんでした。 以前は出来たのに・・・・って、WINのHDDを飛ばす前でした。 何か必要なファイルがあったのでしょうか。 HDDが繋がらないので、CDからZIPにコピーすることにしました。 思いっきり後ろのクラスタ(BE6Fh)にサブディレクトリ\ROMを作って、ディスクの真ん中 あたりのファイルを大量に消してから、ROMに大量のファイルをコピーしました。 変な作り方ですね。 FAT16-4を起動して、TRLOAD F:\ROM\TWIN-BEE.ROM 実行するとFile not foundになります。 何か変です。SHEMから\ROM\TWIN-BEE.ROMをリードすると読めるんですよね、1回だけ。 どうして1回だけなのでしょう。 サブディレクトリ\ROMはBE6Fhクラスタ(2FB55hセクタ)、TWIN-BEE.ROMは91A2hクラスタ (24821hセクタ)にあります。BBB4hにはファイルのセクタ番号、BBE2hにはサブディレクトリの セクタ番号がそれぞれ16bitだけ入っています。 そしてバッファにもサブディレクトリのセクタ番号が16bitだけ。 2回目からファイルが読めないのはどうしてなのでしょう。 11時を過ぎたので寝ます。
12月11日 私の頭は夜11時になると、自動的にお休みモードになってしまうようです。 昨日は11時過ぎにホームページの更新をしましたが間違いが多くて、2回目の訂正をした ところです。
12月10日 クラスタ総数問題は原因がわかりました。DOS2カーネルの3311hあたり、ブートセクタからDPBに 値を書き込んでいます。そこにもパッチをあてて、COMMAND2.COMパッチ版を使うとディスクの 空き容量計算が正常に出来ました。 これで32Mまでのリード/ライトが出来ます。それ以降はリードのみです。 それにしても32M以降のライトは難しいです。バッファのセクタ番号を保存するスペースが 16bit分しかないし、BB80h〜BBFFhでセクタ番号を保存するところが2ヶ所(BBB4hとBBE2h)。 セクタ番号のbit16-23をどうしたらいいのやら。 バッファの+8hって空いてるのかな。空いていればセクタ番号の上位bitを入れてしまうとか。
12月1日 FATに書き込むルーチンを見直すと、こんな所に間違いが・・・。 という訳で早速なおしました。ZIPへのファイル書き込みが出来ます。 ただし、ディスクの空き容量計算が正常に出来ないので、書き込みは32Mまでのアクセスに なります。 NSLOADとTRLOADでZIPからロード、ZIPにゲームのセーブをしてみましたが、 セーブ/ロード共に正常でした。 ディスクの空きクラスタが32M以降にあるディスクの場合、たぶんDISK FULLになると 思うのですが、確かめていないので実験される方は注意して下さい。 MSXで書き込んだ後、Windows95で読めるのかな。試してない。

11月27日

クラスタ総数の計算について情報をいただきました。
早速 COMMAND2.COM のDIRルーチンと MEGA-SCSI の4016hルーチンにパッチをあてました。
DIRコマンドを使ってみると、空き容量計算が間違っています。どうして。

DPBを見るとクラスタ総数が 3FF0h になっています。BFF0hにしたはずなのに。
どうもクラスタ総数の bit15,14 がリセットされてしまうようです。
フラグにでも使っているのでしょうか。

モニタでメモリ上のDPBとワーク内のDPBを書き換えれば、空き容量計算は正常に出来ます。
と言ってもクラスタ総数が BFF0h といい加減な数値なので、正しくないですね。
100Mbって 100 * 1024 * 1024 ですか? 違う?
数字が大きくなると分からなくなってしまう。


11月24日 パッチのあてかたを変えたので、見落としがなければクラスタ番号の上位bit問題は解決したかも。 FCBを使ったファイルの書き込みは、ZIP以外のドライブでは問題なしです。 WIN95フォーマットのZIPにMSXで書き込むのは、なんか問題ありそうで、 その前に問題ありすぎて私には出来ないです。 FAT16パッチのNEW VERSIONです。 NSLOAD、NGLOAD、TRLOADでZIPのROMファイルをロード、HDDにゲームのパラメータを セーブなんてことが出来ます。 ファイルセーブ用のドライブにZIPを指定するとエラーになるので、間違えても大丈夫かな。 もしかしたらZIPのディレクトリにはしっかりとファイル名が書かれてしまうかも知れませんが。 それからMMからの操作も出来ます。時々、サブディレクトリに行ったときに画面表示が乱れます。 表示出来ないサブディレクトリもあります。これってクラスタ番号のせいかも知れませんね。 セクターバッファ問題かも。 DOS2って良くできてますね。 サブルーチンに行くときのレジスタの値が決まっているじゃないですか。 IY=BB80h、 IX=FCB又はFIBのアドレス、 HL=DPBのアドレスとか。 Z=0で戻ったらエラーとか。 下の空きクラスタが探せない理由がわかりました。原因はDPBのクラスタ総数+1です。 ZIPのクラスタ総数+1は3F98hになってしまうので、ファイルの書き込みでFATが 3F00hクラスタまでワークに読まれていたのでした。だから'DISK FULL'なのですね。 ということは動作は正常? クラスタ総数の計算って、いつどこでするのですか? MEGA-SCSIの論理ブロック数を 変えても変化なし。もしかして、ディスクのブートセクターの情報から求めている?

11月15日

実験が進んでいろいろと分かってきたら、#26,#27はクラスタ番号の問題で使えない気がしました。
FCBを使ったファイルの書き込みでは、FCB+1Dhの上位4bitをフラグに使っているようなので、
クラスタ番号問題でファイルのクローズが出来ません。

FIBを使えばZIP以外のドライブではファイルが書けます。
9000hクラスタあたりまで使っているZIPに、FIBでファイル書き込みを試してみました。
結果は空きクラスタが見つけられずエラーになりました。
ページ2のワークを見るとFATは3F00hクラスタまでしかリード出来ていません。
FATが大きすぎて読めないのでしょうか。カーネルを見ると空きクラスタサーチにはループ回数が
ないし、クラスタ番号が0000hかFF00hを見つけるまでループするはずなのですが。

11月6日

ファイルハンドルのオープンで、FIB+31hに変な値が書き込まれる原因がわかりました。
MEGA-SCSIファンクションコールを使うときに、裏レジスタを保存していなかったからでした。
ファイルハンドルは使えるようになったのですが、DIRを取ったときのディスクの空き容量計算は
駄目です。

あと、クラスタ番号のbit15が1になると、ルートディレクトリと判断されてしまいます。
お願いだから bit 7,d だけで判定しないで。
このあたりのパッチが大変かも知れない。
あっ、最大の難関を忘れていました。DISK BUFFER。

11月2日

ちょっと行き詰まっているので、ファイルハンドルの仕組みを調べてみようかな。と言うことで、
パート2になりました。

今までのパッチではかろうじてファンクション#27が使えましたが、#48では駄目でした。
#48のファイルハンドルの読み出しを使っても、ディスクリードルーチンは#27と一緒なので、
理論的には読めないはずはないのです。

ファイルハンドルのオープンは正常終了なのですが、どういう訳かデータセグメント内のFIB+31hに
変な値が書き込まれてしまいます。ここはオープン時にAレジスタにセットした値が書き込まれます。
パッチをあてるとなぜか最初のファイルオープンのときだけ、違う値が書かれてしまうようです。
ひとつでもオープンしているファイルがあれば、正常値になるのですが。不思議。

う〜ん。どうなっているのだろう。


FAT16パッチ開発日記に戻る

トップページに戻る