実験中パート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のページに戻る