実験中パート1

WIN95フォーマット(16bitFAT)のZIPをMSXで読めたらいいなぁ。 そう思ってDOS2ファンクション27hの解析をはじめました。 いきなり始まった実験コーナーです。


10月10日

ここに書くの久しぶりです。
確実にZIPを見分ける方法がわからなくて、お休みしていました。
SCSIコマンドを使ってinquiryデータからデバイスタイプを調べると教えていただきました。
ところが、ZIPとHDDはデバイスタイプが同じなのです。
この辺は主婦にはわからない領域ですよね。

ウチには何故かトランジスタ技術SPECIAL No.27があるので、ずいぶんと助かりました。
ZIPかどうかの判別には成功しましたが、NS_CD.COM(NSLOADのCD-ROM対応版)でファイルが
読めません。ファイルハンドラが使えないってどういうことなんでしょう。MMが使えないのは
そのせいだったのかな。
また解析の日々が始まりそう。
FAT_A.ZIP
FAT16パッチの最新版は”実験中パート2”にあります。新しいほど安全ですが、FATと
ディレクトリをファイルにしてから実験して下さい。

9月14日 翻訳ソフトを買ったので、これならマニュアルの英訳が簡単と喜んでいたのですが、そんなに 甘くないですね。正しい英語を得るには正しい日本語が必要なのです。 私の日本語は35点位なので、翻訳された英文を確かめないと意味が違っていたりします。 翻訳ソフトを使うと日本語の練習にもなりますね。 FAT_9.COMの英語版マニュアルを作りました。 他のパッチは危険度が少ないですけど、これは正しく使わないと100Mの被害ですからね。 FAT_9.ZIP (English)
9月8日 FAT_9.LZHがダウンロード出来なくてごめんなさい。アップする場所を間違えてました。 今度は大丈夫です。 軽傷を負った98ノートにとどめを刺してしまって、ホームページのデータやMSXの開発環境が 消えてしまいました。バックアップって大切ですね。 悪戦苦闘の末やっと復旧しましたが、その間FAT16パッチが役に立ちました。 WIN用ZIPをコピー元に指定しても、正常にコピー出来るのです。これでアセンブラとソースが 助かりました。
8月30日 パッチが動かないと言う人からカーネルを送っていただきました。 (こんなこと書いちゃいけない?) 調べてみると 2331h〜アドレスが14hバイトずれています。 2308hからのサブルーチン、TYPE BにはVOL IDを比べるルーチンが追加されています。 両者の違いってそれだけなんです。VOL ID比較がないカーネルには、2308hから戻った後に 違う処理が待っているのかと思ったのですが。 どういうことなんでしょう。不都合があってVOL ID比較を付け加えたのかな。 VOL ID比較の無いタイプと有るタイプ、両方のカーネルに対応させました。 ZIP以外にも容量の少ないMOなら使えそうです。 FAT_9.LZH (Japanese) ZIP、MO共通です。
8月28日 ウチのカーネルはTYPEBなのですが、カーネルの違いでパッチがうまく行かないことも ありますよね。どうしよう。 それからWINフォーマットディスクのファイルは、データとして読み出したときのみ成功かも 知れません。COMファイルを実行すると MSX DOSのバージョンが違うと言われてしまいます。 ファイルハンドルを使ってCOMファイルを読むだけなら出来ますが、COMファイルの実行って どうするのでしょう。 SHEM上でCOMファイルの実行なら出来るのに。 DOSのコマンドから実行すると、ファイルを読み始めてすぐにバージョン違いのエラーになります。 やめようと思ったけどまだまだやめられないかな、DOS2解析。
8月26日 MO版を作りました。230Mあたりなら読めるのでしょうか。 勇気のある方はどうぞ。FAT_MO.LZH ZIP版も少しなおしました。FAT_8A.LZH
8月25日 DOS2パッチを始めてから1ヶ月です。ようやくディスクの後ろの方にあるサブディレクトリの ファイルも読めるようになりました。と言っても、NGLOAD.COMやNSLOAD.COMでファイルが正常に 読めたというだけのことです。両方ともファンクション27hですね。他は試していません。 まだまだ気になるところがいっぱい残っています。ディスクバッファの掃き出しとか、DIRでの ディスクの空き容量計算とか。もう少しレベルアップしないと理解できないと思うので、 1年後に再挑戦しようかな。 2D23h〜 ディスクバッファの掃き出しで、ディスクのFATやDIRに書き込むことってあるのですか? FATなんか第1FAT、第2FATと両方に書いています。もしかしてファイルの書き込みの時、 FATやDIRはディスクバッファの方を使う? それで掃き出しのときFATとDIRをディスクに 戻している?それならファイルリードだけなら掃き出しのとき、ディスクに書き込まない?  ここのディスクライトが気になるのです。FATやDIRが壊れると困るでしょ。 なので、実験版を使う方は十分に気を付けて下さいね。 FAT_8.COM
8月22日 Mフェス疲れで何もしていません。 昼寝してたら「お母さんは死んじゃった」と下の子が側で泣いていました。 お母さんは落ち着いて死んでいられません。 サブディレクトリが・・・データセグメントにキャッシュするときのセクタ番号がネックですね。 16bitだから。DOS2のファンクションって知らない物ばかりです。というか、使ったことないです。 DOS2専用ソフトなんて作ったことないし。どんなときに使うのか分からない物ばかりですね。
8月12日 昨日の書き込みの「データセグメントを見てもDPB+20hにサブDIRのクラスタ番号が入って いるし」は間違いです。サブDIRのクラスタ番号はDPBの先頭+1Ehに入ります。+20hに入る のはサブDIR名です。ごめんなさい。 CHDIRではサブDIRのセクタをデータセグメントに読み込みません。ファンクション5Ahが 正常だったのは、そのためですね。DIRを取ると、サブDIRをセクタ変換してデータセグメントに リードですね、きっと。 サブDIRのセクタが32Mより後ろにあるときは、リード出来ないです。ドライブ登録テーブル 書き換えはファンクション27hに仕込んだだけですから。 ワークにリードするルーチンを探せば・・・何とか出来るのかな。
8月11日 ドライブ登録テーブル書き換えを入れる場所を変えてみたら、ルートディレクトリに置いた 7BA8hクラスタ以降にあるファイルも、MGLOAD.COMやNSLOAD.COMで簡単に読み出せました。 ルートDIRだけね。32M以降のサブDIRも読めたら・・・。 DOS2ファンクション5Ahを使えば、CHDIRは成功するのですが、ファイルをオープンしたとたんに ハングです。DIRもとれません。 5Ahは正常終了です。データセグメントを見てもDPB+20hにサブDIRのクラスタ番号が入っているし、 どこがいけないのでしょう。 DIRってファンクションの組み合わせですよね。解析できない。 FAT_6.COM 実験したい方はどうぞ。でも気を付けてね。
8月9日 なんか泥沼状態です。解析すればするほど分からなくなります。 ZIPをWIN95で普通にフォーマットすると、ブートセクタにあたるところがセクタ20hなので、 MEGA-SCSIドライブ登録テーブルの開始ブロックを20hにするだけで、ルートディレクトリが 読めます。 MSX-DOSって良くできてますね。FDDでもZIPでもブートセクタからDPBにちゃんと情報が 送られるようです。FATサイズ=C0hセクタ、ディレクトリの先頭=セクタ181h、データ領域の 先頭=セクタ1A1h、クラスタ総数=3F98hです。DOS2でもルートディレクトリの表示は簡単に 出来ます。 サブディレクトリはルートからディレクトリ名を探して、クラスタ番号をセクタ番号に 変換してデータセグメントに読み込み、BBF6hにアドレスセットでしょうか。 クラスタが3F98h以内なら、セクタへの変換はパッチなしで出来ます。 ファイルを読むためには、FATの読み出しにパッチをあてます。これで32Mまでなんとか 読めるかな。 さて、問題の「3F98h以上の読み出し」ですが、セクタ番号がFFFFhを越えたら開始ブロックを +10000hします。例えば10100hセクタにあるファイルを読むときは、読み出し前に開始ブロックを 10020hに書き換え、読み出した後00020hに戻します。手動で実験すると、この方法で読めるの ですけど。パッチでは駄目でした。
8月1日 プログラムバンクの39B9h〜で最終クラスタのbit12-15を0にしていること、すっかり忘れて いました。あと、もうひとつ3CD0h〜、両方とも書き換えて2E9Ahクラスタなんていうのも 読んでしまいました。MMから NSLOAD TWINBEE.ROM なんてできます。 でも、ディレクトリの階層が深くなると駄目ですね。やはりDIR、CHDIRを解析しないと いけないかも。それから最大級の難問、クラスタ番号が3F98hを越えたら・・・ ドライブ登録テーブルの開始ブロックを書き換えようかと思ってますが、うまく行くのでしょうか。FAT数がC0hセクターもあるので、頻繁に読むことになります。FATアクセスの度に開始ブロックを20hに戻さなければ。う〜ん、面倒かも知れないです。 今日のパッチはこれ。プログラムバンクの3F00hを使っているので、キャッシュと喧嘩しますね。
7月30日 テスト用のZIPには0F00hクラスタあたりまで、ファイルを入れていました。 正常に読めたのはそのためだったのですね。 65Mまでファイルを入れてDIRをとると、ルートDIRは正常に表示されますが、サブのほうは クラスタ番号が0FFFhを越えると file not found になってしまいます。 喜んだのもつかの間、また振り出しに戻ってしまいました。 クラスタ番号のbit12-15がフラグになっているのかも。
7月29日 ファンクション26h、27hのときだけFAT16対応にしたら、DIRもCDも出来るようになりました。 MGLOAD GRA2.MEG /S1 なんてやっても読めます。 でも、DOS2ってセクタ番号が16bitなので、100Mなんて読めません。 正常に読めるのは、たぶんはじめの32Mだけ。 試してみたい方、パッチはここです。
7月27日 FATがセクター02h以降でも読めるようになりました。FATアドレス計算のミスでした。 これで16bitFATでも読めることがわかりましたが、問題はこれからです。 ファンクション27hってクラスタ番号のbit15をフラグに使っているし、ここだけパッチあてても しょうがないし。それにパッチあてるとMMでファイルが見えなくなる。 それから、DIRするとディスクの空き容量が計算できないみたい。 DIRってどんなことしているのでしょう。2D9Ah書き換えは問題ありですか?
7月25日 WIN95フォーマットのZIPをMSXで読むためには、MEGA-SCSIドライブ登録テーブルの 開始論理ブロック番号を20hにします。そしてFAT読み出し部分にパッチをあてて16bitFATを 読み出せるようにすると、00FFhクラスタまでのファイルは簡単にリードできます。 でもFATがセクター02h以降のファイルはエラーになってしまいます。 どうもデータセグメントのBBF6hの更新に失敗するようです。
FAT16パッチ開発日記に戻る MSXのページに戻る