Skip to content

Latest commit

 

History

History
402 lines (261 loc) · 20.3 KB

twentyonesys.md

File metadata and controls

402 lines (261 loc) · 20.3 KB

始めに

(V)TwentyOne.sysはTwentyOne.X Ver 1.36c +14(以下TW136C14)をベースに、 ユーザインタフェイスの変更や不具合の修正を行ったものです

このソフトウェアはディスク入出力を扱うものですので、ディスクを破壊する恐れがあります。 また、システムに深く関わるのでOSが正常に起動しなくなる恐れもあります。 組み込む前には必ずバックアップを取り、復旧が出来る状態にしておいて下さい。 無保証につき各自の責任で使用して下さい。

不具合の修正

TW136C14にある以下の不具合が修正されています。

DOS _CHDIRに失敗する。

lndrvを常駐させると問題なく動作したものです。 (V)TwentyOne側の動作を変更することにより修正しました。 これは恐らくHuman68k内部の問題ではなく、単純に(V)TwentyOneのバグだと思います。

なお、この修正に関しては詳しく調べていないので、間違っている恐れがあります。 もしうまくいかないようでしたら報告して下さい。

DOS _OPENに失敗する。

dirsch = offにすると問題なく動作したものです。 原因は多分(V)TwentyOne側にあるのだと思いますが、対策が分からなかったので Human68kにパッチをあてました。

この修正も詳しく調べていないので間違っているかも知れません。

+RAまたは-RAのとき+O/-Oオプションを指定すると、Aが表示されない。

コマンドラインから実行できないように変更したので、それに伴ない解消しました。

-Pのときにa.b.c.fooといったファイルが作成できてしまう。

複数ピリオドを使用可能にしない設定の時の動作が完全ではなかったために、 TwentyOne.xを-Pオプションで組み込んだ時にだけアクセスできる 不正なエントリを作成してしまいます(-P指定時なら削除可能)。

内部動作に若干の非互換部分があったので、これを修正しました。

-SのときにX-9といったファイルが作成できない。

Human68k version 2.03以降ではファイル名の先頭以外ならどこでも-が使えますが、 TwentyOne.xを-Sオプションで組み込むと、-より前に2バイト文字しかない ファイル名だとエラーになってしまいます。

先頭に空白のあるファイルが作成できてしまう。

mkdir foo; echo > "foo/ bar"とするとfooディレクトリに barというファイルができてしまいます。 ちなみにchdir foo; rm " bar"はできませんが、rm "foo/ bar"なら出来ます(これも同じ原因)。

DOS _FILESで空白を含むファイル名が正しく扱えない。

+Sのときはファイル名に半角スペースが使えますが、DOS _FILESで検索すると 半角スペースから後ろが無くなって見えます。 実際にはディスクには半角スペースもその後の文字もきちんと記録されており、 他のDOSコールは半角スペースが含まれていてもファイル名を全て見るので、 一見ディレクトリには存在するのに扱えないファイルができてしまいます。

.rというファイルをR形式実行ファイルと見なして実行してしまう。

.rは拡張子がないのでDOS _EXECで形式を明示的に指定した場合以外は実行できないはずですが、 .rをそのまま拡張子と誤認してしまいます。 また、execdが組み込まれている状態ではexecdが拡張子なしのX形式と認識して形式を指定するのですが、 拡張子が.x .r .zのいずれかだとそれが優先されてしまいます。 もともとR形式なら構いませんが、X形式をリネームした場合もR形式だと思ってロード してしまうので白帯を見ることになります。

大文字拡張子の実行ファイルが検索・実行できない。

DOS _EXEC{2=pathchk}において、DOS _FILESで検索されたファイル名の拡張子を 小文字化してしまうため、+Cで使用していると大文字の拡張子の実行ファイルが正しく 検索・ロード・実行できません。

修正後は拡張子の優先順位がr R z Z x Xとなります。

DOS _NAMECKで空白を含むファイル名が正しく扱えない。

+Sのときはファイル名に半角スペースが使えますが、DOS _NAMECKで正規化すると 半角スペースから後ろが消えてしまいます。

タブ記号がパスデリミタと見なされる。

パス名中にタブ記号があっても/\と同じように扱われてエラーになりません。 しかし、パスデリミタとして正しく処理している訳ではないので、不正なパス名が通ってしまいます。

+Pのときに1234567890123456.8.というファイル名の扱いがおかしい。

19文字目の.で終わるファイル名が、ノード名=1234567890123456.8、 拡張子=(空)として認識され、見た目のファイル名が1234567890123456.8になります。 しかし、見た目通りのファイル名でアクセスしようとすると、ノード名=1234567890123456、 拡張子=.8として解釈されるので、ファイル名不一致として扱われてしまいます。 逆に、1234567890123456.8.というファイル名で指定すればアクセスできます。

このようなファイル名は、ノード名=1234567890123456、拡張子=.8. として認識するようにしました。

+T -Cのときにファイル名の比較がおかしい。

ディレクトリエントリの参照順序が誤っていたため、abcdefg、.aaaabcdefg∥.aaa が一致するものとして扱われ、その結果ファイルの排他処理が期待通りに行われなくなります。

機能の削除

TW136C14 にあった以下の機能は削除しました。

実行ファイルとしての使用。

(V)TwentyOne.sysは純粋なデバイスドライバで、コマンドラインから実行することはできなくなりました。 オプションの設定や表示は新規作成したツールtwon.rか、TW136C14を使用して下さい。 組み込み時に使用できるオプションは+D/-D、+O/-Oが削除されています。

プリンタ切り換え無効化。

TW136C14では+D/-Dオプションで^Pによるプリンタ出力開始の操作を無効化・有効化 する機能がありましたが、削除されました。 オプション+D/-Dも削除されています。

Human68k version 3.00/3.01への対応。

Human68k version 3.02専用となります。

環境変数SYSROOTの参照。

TW136C14では+R/+rを実行されると環境変数SYSROOTを参照して、その値を内部バッファに 転送していましたが、(V)TwentyOne.sysはコマンドラインからは実行できなくなったので、 この機能も削除されました。組み込み時に指定するか(後述)、twon.rで設定して下さい。

従来は環境変数SYSROOTが重視されていましたが、組み込み時に設定できない、 環境変数が変更されても追従しないなどの問題があるので(V)TwentyOne.sysでは 環境変数は参照しません。内部バッファに格納されたパスを以下、SYSROOTと呼びます。

動作の変更

TW136C14 とは以下の点が違います。

SYSROOT関係のオプションが+R/+r(大文字小文字区別)から+r/+yに変更。

従来はどちらが/のみを処理して、どちらが/\の両方を処理するのか 紛らわしかったので、後者の機能を+y/-yに変更しました。 +r/-rとも大文字小文字は区別しません。

yはyenのyです。本当はbackslashのbにしたかったのですが、 バッファ数の指定で既に使われていたので…

+rと+yとSYSROOTは独立して働く。

TW136C14では+rを指定すると同時に+Rも指定されたことになりましたが、 /\の処理は別々に設定できるようにしました。 従来の+rは+ryで等価になります。

さらに、+R/+rを指定した時に環境変数SYSROOTが参照され、また同変数が空の時は +R/+rは指定できないなど、設定が面倒だったので自由に指定できるようにしました (とはいえtwon.rを使わないと意味がありません)。

SYSROOTが空の時に+rを指定すると、フラグだけ変化して/は処理されません。 その後にSYSROOTを設定すると/が処理されるようになります。 なお、\を処理するかどうかには全く影響しません。

SYSROOTが設定されている時に+rを指定すると/が処理されるようになります。 その状態でSYSROOTを空にすると処理されなくなりますが、もう一度 SYSROOTを設定すれば処理されるようになります。

+yについても同じです。/を処理するかどうかには全く影響しません。

機能の拡張

(V)TwentyOne.sysでは以下の機能が追加されています。

組み込み時のSYSROOT設定。

CONFIG.SYSのdevice=行での組み込み時、引数にパス名を指定するとそれを SYSROOTと見なして内部バッファに転送します。

例: device = \sys\twentyone.sys +cprst c:/

DOSコール_TWON($ffb0)。

$ffb0に勝手にファンクションコールを割り当てました。 詳しくはソースコードを見て下さい。 ただしコール番号や機能については今後変更される場合があるので、 対応アプリケーションを作成する場合は注意して下さい。

Human68k の不具合の修正。

bug_fixes.sを参考にパッチをpatch.sとして書き下ろしました。 TW136C14にもあった二つの修正に加えて、以下の修正を行います。

21文字のディレクトリ名でDOS _CHDIRが失敗する。

mkdir 123456789012345678.012
chdir 123456789012345678.012

が失敗する不具合の修正です。

実行ファイルのパスデリミタに/が使えない。

DOS _EXEC{2=pathchk}で、/以降が実行ファイル名ではなくオプションとして誤認 されていました。この修正によりCONFIG.SYSのprogram=行などで/を使用できるようになります。

仮想ドライブ/ディレクトリ関係。

mkdir foo.bar || subst z: fooがエラーにならずにfooに割り当てられてしまい、 もちろんfooは存在しないので一切のアクセスができないという不具合を修正します。

また通常は有り得ませんが、..及び.エントリの存在しないサブディレクトリを 割り当てられない不具合も修正します。

実行ファイルのロード指定「最小ブロックから確保」が無視される。

btstするビット位置が間違っているという、有名なあれです。

排他制御の互換モードが非互換。

LockCompatible.xと同じパッチです。読み込みオープンと書き込みオープンが同時に できるようになります。わざわざ別の実行ファイルを起動するのは遅くなるから、 というだけの理由で内蔵しました。不要な場合は同ツールで戻してください。

拡張子のない実行ファイルの不具合。

実行ファイルをロードするとPSP内にファイル名が格納されますが、拡張子のない ファイルだと末尾に.が付いてしまう不具合です。execdやLIBCのスタートアップ ルーチンでも対策が行われていますが、特殊なファイル名で正しく対処できないようです。

DOS _RENAMEの各種不具合。

DOS _RENAMEに含まれる以下の不具合を修正しました。

新ファイル名と同名のエントリが存在するとき、先頭FAT番号とファイルサイズの上位 ワードが等しい場合に、旧ファイル名で指定したエントリが新ファイル名で指定した 名称にリネームされる不具合。

移動先のディレクトリに空きエントリが確保できない場合、ファイルが消滅する不具合。

リネームが移動と見なされ、属性を異なる条件で検査することがある不具合。

DOS _RMDIRの空ディレクトリ検査。

+Pの時に作成された..fooなど、..で始まるエントリが含まれるディレクトリを 空ディレクトリと認識して削除できてしまう不具合を修正しました。

読み込み専用属性のみのファイルをDOS _FILES($20)で検索可能。

Windows95でCD-ROMからファイルをコピーすると、ファイル属性が読み込み専用ビットだけ がセットされて、アーカイブ属性はセットされません。これは間違いではないのですが、 Human68kがそのような属性を考慮してないこともあってか、ツールなどで正しく扱えない ことが多々あります。DOS _FILES$20(アーカイブ属性のみ)を検索属性としていると、 読み込み専用属性のみのファイルが一致しないのが原因です。

そのような場合に+Fを指定すると、読み込み属性のみのファイルの属性をアーカイブ属性 もセットされていると見なしてDOS _FILES/_NFILESを処理します。 これによって一般的な、アーカイブ属性のセットされているファイルと同じように扱われます。

+Fオプションは上記のようにうまく使えないツールを胡麻化す為の機能です。 あくまで一時的に指定し、機能が不要になったら-Fに戻して下さい。 +Fのままだと何か不都合が起きるかも知れません。

なお、+F/-Fオプションは+D/-Dオプションが使用していたフラグ中のビットを流用 しているので、(V)TwentyOne.xなどで+D/-Dを指定しないで下さい。

エントリに書き込まれたアクセス時刻の無視。

MS-DOS(Windows?)で参照したファイルのエントリに、最終アクセス時刻が書き込まれる ことがあり、そのエントリがHuman68kでアクセスできなくなります。 そのデータを無視することにより、アクセスできるようにしました。

ただし、Human68kの長いファイル名の格納位置とぶつかるので完全には対処できない かも知れません。

リモートドライブからメディアバイトを渡せる。

リモートドライブ(特殊デバイス)は、DOS _GETDPBでメディアバイトを返そうとしても バッファがHuman68kにより違う値で上書きされ、渡すことができない仕様になっています。 これを、デバイスドライバがメディアバイトを渡そうとした場合はそのまま返すように 変更しました。メディアバイトを返そうとしないドライバに関しては従来通りの値を (Human68kがセットして)返します。

この機能が有効なデバイスドライバは、今のところSUSIE.X V1.21A+1以降だけしか 公開されていません。

DOS _EXECpath=ディレクトリを検索する不具合。

DOS _EXEC{2;pathchk}のパス検索において、

  • 環境変数pathが設定されていない。
  • 実行ファイル名の指定にパス名が含まれない。
  • 指定した実行ファイルがカレントディレクトリにない。

という場合に、path=ディレクトリを検索してしまう(path=\実行ファイル名 という引数でDOS _FILESが実行される)不具合を修正します。

標準のHuman68kではファイル名に=が使えないため必ずエラーになりますが、従来の TwentyOneを+Sオプション指定で組み込んでいてpath=ディレクトリに実行ファイルが 存在する場合は、検索成功となってしまいます。

オプション一覧

全てのオプションは大文字小文字を同一視します。

+V / -V   詳細表示モードにする / しない。
+C / -C   大文字小文字を区別する / しない。
+S / -S   特殊な文字を使用可能にする / しない。
+P / -P   ピリオドを複数使用使用可能にする / しない。
+T / -T   ファイル名を 21 文字認識する / 11 文字認識する。
+F / -F   読み込み専用ファイルをアーカイブ属性と見なす / 見なさない。
+R / -R   '/' を SYSROOT に展開する / しない。
+W / -W   大文字小文字不一致を警告する / しない。
+Y / -Y   '\' を SYSROOT に展開する / しない。
+A / -A   VFAT は短縮名を返す / VFAT ファイル名を返す。
-B=<num>  バッファ数(EXBUF)の指定。

標準設定は+T -VCSPFRWYA -B=256です。組み込み時に設定状況を表示しないため、 +Vは指定しても動作に違いはありませんが、TW136C14の実行ファイルを使う場合は +V/-Vの設定が反映されます。

SYSROOT

+R、+YオプションはSYSROOTが直接指定できるようになったのにともない、従来の (V)TwentyOne.xとは機能が有効になるタイミングが違っているので注意して下さい。

(V)TwentyOne.x では、

  • 環境変数 SYSROOT が設定されている
  • +R、+rの状態になっている(または、今そうした)

という条件を両方満たさなければ有効にならないため、CONFIG.SYSでのdevice=行で +R、+rを指定しても、あとで環境変数SYSROOTを設定してからもう一度(V)TwentyOne.x を実行しなければなりませんでした。

しかし、(V)TwentyOne.sysではCONFIG.SYSのdevice=行で+R、+Yオプションとともに SYSROOTを指定すると、ドライバが組み込まれた瞬間から有効になります。

CONFIG.SYSの以後の行などでファイル名を/\から始めていると、パス名が指す ディレクトリが違うものになって実行ファイルがロードできなくなってしまうので 注意して下さい。

この違いが良く分からない場合は、CONFIG.SYSやAUTOEXEC.BATでは全てドライブ名からの フルパスでファイル名を記述するようにしてください。

専用ツール

実行ファイルの機能を削除したので、代わりにオプションやSYSROOTの設定、表示を行う ツールtwon.rを用意しました。

基本的には(V)TwentyOne.xと同じように使えますが、以下の違いがあります。

  • オプションは(V)TwentyOne.sysに準じます。もちろん+O/-Oも使えます。

    ただし-Bオプションは指定できません。

  • +-以外の引数はSYSROOTの指定と見なして内部バッファに転送します。

    SYSROOTの指定は必ずD:/の形から始めて下さい。例外として、SYSROOTを取り消す 場合は空の引数を渡します。

  • 引数に--sysrootだけを指定するとSYSROOTを表示します。

    SYSROOTが空の場合は空行を表示します。

  • 引数を指定しなかった場合は現在の設定状況を表示します。

    左から+-に設定しているオプション、バッファ数、SYSROOTです。 +D/-Dは削除されているので表示されません。

  • (V)TwentyOne.sysが組み込まれていなければエラーメッセージを表示して終了する。

HUPAIR 準拠、--helpや--versionオプションも使えます。 +O/-O/--sysrootはそれ以前のオプションを無視して、表示した後すぐに終了するので 単独で指定してください。

(V)TwentyOne.xよりtwopt.r + sysroot.rと言った方が近いです。

既知の不具合

現在、以下の不具合が判明していますが、修正できていません。

  • VFATのファイルをハードディスクにコピーしようとすると、時々VFATの方にある ファイル名がハードディスク上に出現してしまうことがある。

著作権及び配布規定

配布規定についてはTwentyOne.X Ver 1.36cに準じます。
詳しくはアーカイブファイルTWON136C.LZH内のreadme.docならびに、 TW136C14.LZH内のVTwentyOne.docを参照してください。

連絡先

TcbnErik / https://github.com/kg68k/twentyonesys