(V)TwentyOne.sysはTwentyOne.X Ver 1.36c +14(以下TW136C14)をベースに、 ユーザインタフェイスの変更や不具合の修正を行ったものです
このソフトウェアはディスク入出力を扱うものですので、ディスクを破壊する恐れがあります。 また、システムに深く関わるのでOSが正常に起動しなくなる恐れもあります。 組み込む前には必ずバックアップを取り、復旧が出来る状態にしておいて下さい。 無保証につき各自の責任で使用して下さい。
TW136C14にある以下の不具合が修正されています。
lndrvを常駐させると問題なく動作したものです。 (V)TwentyOne側の動作を変更することにより修正しました。 これは恐らくHuman68k内部の問題ではなく、単純に(V)TwentyOneのバグだと思います。
なお、この修正に関しては詳しく調べていないので、間違っている恐れがあります。 もしうまくいかないようでしたら報告して下さい。
dirsch = off
にすると問題なく動作したものです。
原因は多分(V)TwentyOne側にあるのだと思いますが、対策が分からなかったので
Human68kにパッチをあてました。
この修正も詳しく調べていないので間違っているかも知れません。
コマンドラインから実行できないように変更したので、それに伴ない解消しました。
複数ピリオドを使用可能にしない設定の時の動作が完全ではなかったために、 TwentyOne.xを-Pオプションで組み込んだ時にだけアクセスできる 不正なエントリを作成してしまいます(-P指定時なら削除可能)。
内部動作に若干の非互換部分があったので、これを修正しました。
Human68k version 2.03以降ではファイル名の先頭以外ならどこでも-
が使えますが、
TwentyOne.xを-Sオプションで組み込むと、-
より前に2バイト文字しかない
ファイル名だとエラーになってしまいます。
mkdir foo; echo > "foo/ bar"
とするとfoo
ディレクトリに bar
というファイルができてしまいます。
ちなみにchdir foo; rm " bar"
はできませんが、rm "foo/ bar"
なら出来ます(これも同じ原因)。
+Sのときはファイル名に半角スペースが使えますが、DOS _FILES
で検索すると
半角スペースから後ろが無くなって見えます。
実際にはディスクには半角スペースもその後の文字もきちんと記録されており、
他のDOSコールは半角スペースが含まれていてもファイル名を全て見るので、
一見ディレクトリには存在するのに扱えないファイルができてしまいます。
.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
となります。
+Sのときはファイル名に半角スペースが使えますが、DOS _NAMECK
で正規化すると
半角スペースから後ろが消えてしまいます。
パス名中にタブ記号があっても/
や\
と同じように扱われてエラーになりません。
しかし、パスデリミタとして正しく処理している訳ではないので、不正なパス名が通ってしまいます。
19文字目の.
で終わるファイル名が、ノード名=1234567890123456.8
、
拡張子=(空)として認識され、見た目のファイル名が1234567890123456.8
になります。
しかし、見た目通りのファイル名でアクセスしようとすると、ノード名=1234567890123456
、
拡張子=.8
として解釈されるので、ファイル名不一致として扱われてしまいます。
逆に、1234567890123456.8.
というファイル名で指定すればアクセスできます。
このようなファイル名は、ノード名=1234567890123456
、拡張子=.8.
として認識するようにしました。
ディレクトリエントリの参照順序が誤っていたため、abcdefg、.aaa
とabcdefg∥.aaa
が一致するものとして扱われ、その結果ファイルの排他処理が期待通りに行われなくなります。
TW136C14 にあった以下の機能は削除しました。
(V)TwentyOne.sysは純粋なデバイスドライバで、コマンドラインから実行することはできなくなりました。 オプションの設定や表示は新規作成したツールtwon.rか、TW136C14を使用して下さい。 組み込み時に使用できるオプションは+D/-D、+O/-Oが削除されています。
TW136C14では+D/-Dオプションで^Pによるプリンタ出力開始の操作を無効化・有効化 する機能がありましたが、削除されました。 オプション+D/-Dも削除されています。
Human68k version 3.02専用となります。
TW136C14では+R/+rを実行されると環境変数SYSROOTを参照して、その値を内部バッファに 転送していましたが、(V)TwentyOne.sysはコマンドラインからは実行できなくなったので、 この機能も削除されました。組み込み時に指定するか(後述)、twon.rで設定して下さい。
従来は環境変数SYSROOTが重視されていましたが、組み込み時に設定できない、 環境変数が変更されても追従しないなどの問題があるので(V)TwentyOne.sysでは 環境変数は参照しません。内部バッファに格納されたパスを以下、SYSROOTと呼びます。
TW136C14 とは以下の点が違います。
従来はどちらが/
のみを処理して、どちらが/
と\
の両方を処理するのか
紛らわしかったので、後者の機能を+y/-yに変更しました。
+r/-rとも大文字小文字は区別しません。
yはyenのyです。本当はbackslashのbにしたかったのですが、 バッファ数の指定で既に使われていたので…
TW136C14では+rを指定すると同時に+Rも指定されたことになりましたが、
/
と\
の処理は別々に設定できるようにしました。
従来の+rは+ryで等価になります。
さらに、+R/+rを指定した時に環境変数SYSROOTが参照され、また同変数が空の時は +R/+rは指定できないなど、設定が面倒だったので自由に指定できるようにしました (とはいえtwon.rを使わないと意味がありません)。
SYSROOTが空の時に+rを指定すると、フラグだけ変化して/
は処理されません。
その後にSYSROOTを設定すると/
が処理されるようになります。
なお、\
を処理するかどうかには全く影響しません。
SYSROOTが設定されている時に+rを指定すると/
が処理されるようになります。
その状態でSYSROOTを空にすると処理されなくなりますが、もう一度
SYSROOTを設定すれば処理されるようになります。
+yについても同じです。/
を処理するかどうかには全く影響しません。
(V)TwentyOne.sysでは以下の機能が追加されています。
CONFIG.SYSのdevice=
行での組み込み時、引数にパス名を指定するとそれを
SYSROOTと見なして内部バッファに転送します。
例: device = \sys\twentyone.sys +cprst c:/
$ffb0
に勝手にファンクションコールを割り当てました。
詳しくはソースコードを見て下さい。
ただしコール番号や機能については今後変更される場合があるので、
対応アプリケーションを作成する場合は注意して下さい。
bug_fixes.sを参考にパッチをpatch.sとして書き下ろしました。 TW136C14にもあった二つの修正に加えて、以下の修正を行います。
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
に含まれる以下の不具合を修正しました。
新ファイル名と同名のエントリが存在するとき、先頭FAT番号とファイルサイズの上位 ワードが等しい場合に、旧ファイル名で指定したエントリが新ファイル名で指定した 名称にリネームされる不具合。
移動先のディレクトリに空きエントリが確保できない場合、ファイルが消滅する不具合。
リネームが移動と見なされ、属性を異なる条件で検査することがある不具合。
+Pの時に作成された..foo
など、..
で始まるエントリが含まれるディレクトリを
空ディレクトリと認識して削除できてしまう不具合を修正しました。
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 _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の設定が反映されます。
+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