IPLwareアプリ IntVectC と連携した高速なディスク再起動
[ DiskBoot ]Version 3.01
Copyright(C) 2022-24 まりも(DOSsoft)
これはきわめて個人的な用途で作った高速再起動プログラムです。普通の方々には 有名なHSBで 用が足りますから、あえてこのプログラムを使う必要はありません。
なのにこのようなものを作ったのは、個人的な作業の過程で HSBがうまく動かないことが増えてきたためです。機種に極めて依存しハードウェアを操作しまくるIPLwareアプリケーションの開発においては、HSBが想定しないハードウェア状態となることが 普通で、HSBが動作しないか再起動できないということが多くなりました。その原因のいくつかは、HSBの詳細なオプションで回避もできますが、ご承知のようにHSBではオプションが多く、目的に合うものをみつけることが難しくなっています。またHSBにはソースがありますが、膨大でどこを変更すれば問題を回避できるかを探すのも大変です。
IPLwareの開発作業においての再起動は、ほとんどの場合ディスクのブートからの再起動(固定ディスク起動メニューの実行やフロッピーディスクからの起動)で十分であり、ハードウェアのリセットを必要とする場合はそもそもHSBを使わずともリセットを掛ければすみます。
HSBを利用する個人的な理由は、HSB H あるいは HSB F というディスクブートのオプションによる再起動でした。IPLwareアプリケーションの開発では仮想86モードも基本的に使用しないので、HSB でリアルモードに戻る機能も必要としていません。つまりディスクリブート機能だけを持ったプログラムがあれば、多機能すぎるHSBを利用しなくても問題ないのです。
そういった事情からこのプログラムを作りました。
うまくディスクブートからの再起動をするには、次のような条件が必要です。
(1)割込ベクタ00h〜1Fh(できれば3Fhまで)はDOS起動前の状態に戻す
(2)システム共通域(0:400〜5FFのメモリ)もDOSが変更する前の状態に戻す
(3)レジスタ条件 DS=0, AX=ブート先の指定 で jmp FD80:27EChを実行
(4)仮想86モードやプロテクトモードからリアルモードに戻す
これらを満たせばディスクリブートできます。
IPLwareの段階では(4)の仮想86モード下にいることはないので(1)-(3)だけをおこなっておくことにしますが、(1)はDOSが起動してからでは手遅れですので、IPLwareとして割込ベクタの00-1Fhを保存するプログラムを活用することにします。 SVINTVECおよびINTVECTGがそれでした。しかし保存先がディスク上ということで読み出しが簡便でなく、グラフィックメモリへの保存も確実ではありません。そこで「外字メモリ領域」の後ろのほうを使用するように変更した INTVECTC.BIN というプログラムを今回作成し、IPLwareアプリケーションとして実行するようにしました。
ディスクリブートプログラムは 外字メモリに予め保存された割込ベクタ情報と(2)のいくつかの情報を引き出して、もとの状態にセットします。その後(3)でディスクリブートを掛けます。こうすることでHSBによるディスクブートと同等のことが実現できます。
バージョン 1.20からは、MS-DOS 6.20のEMM386(仮想86モード)下から復帰してリブートできるようにしました。しかし他のEMM386などではリブートに失敗する可能性が大きいです。
バージョン 3.00からは、(2)のシステムワークエリアのうちSCSIのパラメータテーブルは全て保存するようにしています。またカスタマイズプログラム SETSYSWK.EXE が付属し、システムワークエリアの任意のアドレスを追加、登録できるようになりました。
アーカイブを解凍すると次のファイルが得られます。
まずIntVectC.BIN をIPLware、あるいはOSFD-IPLwareとして実行した状態にしておきます。そのあとDOSを起動し、必要な時点で DISKBOOT.EXE を実行すればディスクからのリブートとなります。コマンドラインオプション無しの場合は、
FD --> HD#1 --> HD#2 --> SCSI の順に起動可能IPLの存在を探して起動します。
以下のコマンドラインオプションを付けると、指定のデバイスのIPL実行からのディスクブートとなります。例えばSCSIから起動するときは DISKBOOT S とします。指定したのにそのデバイスが存在しないと起動できず、ハングアップします。フロッピーディスクの場合、実行時点でメディアが挿入されている必要があります。
ノーマルモードとは違ってコマンドラインオプションによる起動デバイス選択はできません。前回起動時がHDの場合(IPLwareを入れていれば当然これ)、内蔵-->SCSIの順に検索されてIPLwareと起動メニューからのリブートとなります。詳しくは後の【5.注意点】もお読みください。
この節は上級者向けに書いたものなので、読んで頂かなくてもかまいません。冒頭で述べた(2)のシステム共通域とは、16bitリアルモード時の物理アドレスの0000:0400h〜0000:05FFh までのエリアです。
このうちどのデータを保存して再起動するのがよいか、完全にはわかっていません。かといって全エリアを外字領域に保存することはできません。そこで取捨選択できるようにしました。SETSYSWK.EXE というプログラムを実行すると、カレントディレクトリ上にある DISKBOOT.EXEとINTVECTC.BIN をカスタマイズできます。既に10個のアドレスが登録されていますが、これに追加、削除することが可能です。最大28個までのアドレスを登録できます。
SETSYSWK.EXE をコマンドオプション無しで実行すると、システム共通域のうち保存されるアドレスが表示されます。実行後とくに何も起こりません。確認の必要があるときに使ってください。
SETSYSWK.EXE +0596
のように + のあと16進数でアドレスを指定すると、それが登録されます。最大28個登録できます。
いっぽう
SETSYSWK.EXE -0596
のように - のあと16進数でアドレスを指定すると、登録されているものが削除されます。リストに無いものを指定するとエラーで何もせず終了となります。
SETSYSWK.EXE を - または + オプションつきで実行すると、 DISKBOOT.EXEとINTVECTC.BINが更新されます。更新された INTVECTC.BINは再度IPLwareまたはOSFDIPLwareで組み込み直す必要があります。そうしないとDISKBOOT.EXEとの整合が取れなくなってしまいます。カスタマイズ内容の整合性には十分注意してください。上級者むけオプションですので、整合性チェックの機能はつけておりません。
バージョン3.00のINTVECTC.BIN は バージョン1.xxのDISKBOOT.EXE とは互換性がありません。本バージョンDISKBOOT.EXEを使うためには、かならず本バージョンのINTVECTC.BINを組み込み直してください。
使用する外字の文字コード範囲は、本バージョンからはかなり削減されています。ノーマルモードでは7774h〜777Dhまでの10文字ぶんです。ハイレゾモードでは7659h〜765Dhの5文字ぶんです。
当該外字メモリが未使用状態のときは、DISKBOOT.EXE はエラーメッセージを表示し実行を中止します。おそらくIPLwareでIntVectCが事前に実行されていなかったことを意味します。また旧いバージョンのINTVECTC.BIN を使っているのに本バージョンのDISKBOOT.EXE を実行した場合も、エラーとなり実行されません。
IntVectCより前に実行される他のIPLwareアプリケーションで割込ベクタとシステム共通域を変更するものがあった場合、なんらかの影響を受けてリブートに失敗する可能性があります。とくにそのようなアプリを削除や変更したあとには起こり得ます。したがってよくわからないIPLwareアプリケーションの組み込み状況を変えたときは、一度はハードウェアリセットを掛けておくのが安全です。
このプログラムで再起動を繰り返すと、14回くらいで正常に再起動できなくなることがあるようです。そのときはハードウェア的にリセットして再起動してください。
仮想86モードからの再起動では失敗することがあるかもしれません。これはEMMに依存する点も大きいです。int 1Fh, AX=8C00h を正しく実装したEMMでない場合はハングアップすると思われます。MATE-Rでも再起動に失敗するようです。
EPSON製の98互換機では、コマンドラインオプションなしで実行するとうまく動作しないとの情報を得ています。ブート先を指定すれば動作するそうです。注意を促すため、EPSON機であるというメッセージは出るようにしています。
ハイレゾモードのときは、ブートデバイスの選択はリセット直後のキー押下状態で指定されます。CTRL押しでFD起動強制、ESCで起動メニュー強制、F1キー以降は領域の「起動セレクタ」として設定されている番号と対応します。これをエミュレートする方法(たぶん隠れメモリスイッチにいったん記録される)がよくわかっていないため本プログラムでは、コマンドライン指定での対応はしていません。HDから起動していた場合は内蔵-->SCSIの順に検索され、FDから起動していた場合はFDだけからブートします。IPLwareでintvectcを入れているはずですから、HDの検索とリブートが行われます。なおハイレゾでIDEとSCSIを両方接続している場合、両方のIPLwareが実行されることがあります。二度連続して実行すると正しく動作しないIPLwareアプリケーションがあるときは片方を動作停止にしてください。intvectcについては多重に実行されてもとくに問題はありません。
ディスクの再起動ではなくて、システム全体の再起動をしたほうがよい場合というのも当然あります。基本的にはリセットボタンを押すことで再起動できます。しかしメモリのチェックなど無駄な時間がかかることになるので、ソフト的にではあるけれどもハードウェアを完全に初期化して再起動したいということもあります。その場合は同梱されている REBOOT.EXE をコマンドラインから実行してください。詳しくは REBOOT.TXT のほうをお読みください。なお気軽にソフトウェアリブートを使うことは多いと思いますが、ハードウェア的にはどこまで初期化されるのかは98の機種世代によって異なります。これも詳しくはREBOOT.TXT をお読みください。
ソフトリブートの機能をもつプログラムは世の中にたくさんありますが、PCIバス搭載機の登場時期より古くから存在するツールでは、完全なハードウェアリセットができない可能性があるので、本プログラム reboot の存在意義はあると思います。
機種 | CバスのRESET#信号(B34番) | リブート時点で FFFF:0に現れているメモリ | 拡張BIOS域D0000-DFFFF |
80286機 | 出力なし(リセットされない) | SYSTEM BIOS (ROM) | 常にROM(RAMなし) |
386/486前期機種 | 出力なし(リセットされない) | SYSTEM BIOS (通常はRAM) | 一部機種ではRAMのまま |
486後期(非PCI)機種 | 出力有り(リセットされる) | SYSTEM BIOS (通常はRAM) | ROM |
PCIバス搭載機種 | 出力有り(リセットされる) | ITF(ROM) | ROM |
このソフトウェアを、不特定多数のダウンロードできる場所へ「転載」することは、禁止とします。リンク先の紹介については、なんら制限はありません。プログラムの著作権は主張しておきますが、基本的にフリーソフトウェアです。
このソースファイルを改良して何か別の作品を公開する場合は、それを明記していただくことを希望します。ソースファイルを版案して何かを創作すること自体はなんら妨げらられることはありませんので、自由にやっていただいて構いません。たとえばこのプログラムをDOS常駐型にし、キーボード割り込みint 09hをフックして特定のキーを押すとディスクブートするというようなものに改良することも可能でしょう。
動作不具合のご報告は歓迎いたします。
システムが起動しなくなったことや、それに付随した逸失利益、精神的損害について、作者は一切責任は負わないものとします。これらの点を了承いただけない方には、使用(ソースファイル含む)を認めません。
まりも(連絡先メールアドレスはホームページ上で)