USB を使用中にマシンを高速再起動するのは注意が必要です。 高速再起動とは、HSB や QRBT 等の再起動ツールによる再起動のことです。 環境にもよりますが、十分注意しましょう。 ---- USB を使用中は、USB のデータ入出力に使う特殊なメモリ空間が 通常のメモリ空間に配置されています。 その状態のまま高速再起動すると、 特殊なメモリ空間が他のプログラム等に割り当てられる可能性があります。 運良くプログラムが暴走してくれれば気付きますが、 大概運良くないので気付きません。 ---- 当方でも暫く気付かずそのまま使っていました。 ディスクキャッシュのチェックサムが異常になったので気付きました(^^; ---- BIOS が USB に対応しているなら、 高速再起動でも適切に初期化される可能性あるかも知れませんが、 PC-98x1 の場合、そんな BIOS のマシンはないでしょう。 『USB を使ったらリセットして再起動』 するのが無難に思えます。 ---- そこで、リセットせずに高速再起動で何とかすべく、 USB を初期化するプログラムを作りました。 つまり、USB に使う特殊なメモリ空間を通常のメモリ空間に戻します。 本格的な初期化ではなく、最小限の初期化です。 ---- ■ OHCI の場合 具体的には、 (念のため) HcCommandStatus = 1 HcControl = 0 (念のため) HcHCCA = 0 とするだけです。 結果として Functional State が USBReset になります。 ---- ■ UHCI の場合 具体的には、 USBCommand = 0 (念のため) USBCommand = 2 (念のため) FrameListBaseAddress = 0 とするだけです。 結果として Schedule が Stop になります。 ---- ■ EHCI の場合 具体的には、 USBCommand = 00080000h (念のため) USBCommand = 00080002h (念のため) FrameListBaseAddress = 0 とするだけです。 結果として Schedule が Stop になります。 ---- 他のドライバを組み込む前に、 |DEVICE = USBINIT.COM INIT というように実行します。 初期化するかどうか (Y/[N])? で確認したい場合は YN を指定し、 |DEVICE = USBINIT.COM INIT YN というように実行します。 ---- DEBUG を指定するとレジスタのダンプを表示します。 表示内容をファイルに保存したい場合、 |DEVICE = USBINIT.COM INIT DEBUG > ファイル |DEVICE = USBINIT.COM INIT DEBUG >> ファイル というように、> や >> でリダイレクトして下さい。 |DEVICE = USBINIT.COM INIT > NUL というように、NUL にリダイレクトすると、表示も保存もされません。 なお、リダイレクトした場合、YN は Y として自動的に進みます。 ---- 一応、コマンドラインでも実行出来ますが、 なるべく、メモリマネージャを組み込む前に実行しましょう。 EMM386,LEMM の場合、組み込み後も実行出来ますが、 だからといって、組み込み前の実行は必要ないという意味ではありません。 メモリマネージャの誤動作を防ぐため、 メモリマネージャを組み込む前に一度は実行しましょう。 |