IPLwareアプリ IntVectC と連携した高速なディスク再起動
[ DiskBoot ]Version 1.30
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)割込ベクタはDOS起動前の状態に戻す
(2)システム共通域(0:400〜のメモリ)も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からは、EMM386(仮想86モード)下から復帰してリブートできるようにしました。
まずIntVectC.BIN をIPLware、あるいはFD-IPLwareとして実行した状態にしておきます。そのあとDOSを起動し、必要な時点で diskboot.exe を実行すればディスクからのリブートとなります。コマンドラインオプション無しの場合は、
FD --> HD#1 --> HD#2 --> SCSI の順に起動可能IPLの存在を探して起動します。
以下のコマンドラインオプションを付けると、指定のデバイスのIPL実行からのディスクブートとなります。例えばSCSIから起動するときは DISKBOOT S とします。指定したのにそのデバイスが存在しないと起動できず、ハングアップします。フロッピーディスクの場合、実行時点でメディアが挿入されている必要があります。
ノーマルモードとは違ってコマンドラインオプションによる起動デバイス選択はできません。前回起動時がHDの場合(IPLwareを入れていれば当然これ)、内蔵-->SCSIの順に検索されてIPLwareと起動メニューからのリブートとなります。詳しくは次の【4.注意点】もお読みください。
仮想86モードのときはエラーメッセージがでて実行中止となります。
当該外字メモリが未使用状態のときはエラーメッセージがでて実行中止となります。おそらくIPLwareでIntVectCが事前に実行されていなかったことを意味します。
システムワークエリアとしてはハイメモリ搭載量を示す箇所しか保存していません。このため他にもDOSが変更した箇所があると、正常にリブートできないかもしれません。保存しているのは0:401h、0:594h、0:5A7h、0:5B6hだけです。いまのところこれらの他に保存すべき候補はよくわかっていません。MS-DOSが変更を加えなかったところは基本的に保存する必要がありません。強いて挙げるならMO ディスクのSCSIパラメータのところでしょう。
使用する外字の文字コード範囲は、ノーマルモードでは7770h〜7778hまでです。ハイレゾモードでは7650h〜7657Fhです。
IntVectCより前に実行される他のIPLwareアプリケーションで割込ベクタとシステム共通域を変更するものがあった場合、なんらかの影響を受けてリブートに失敗する可能性があります。とくにそのようなアプリを削除や変更したあとには起こり得ます。したがってよくわからないIPLwareアプリケーションの組み込み状況を変えたときは、一度はハードウェアリセットを掛けておくのが安全です。
このプログラムで再起動を繰り返すと、14回くらいで正常に再起動できなくなることがあるようです。そのときはハードウェア的にリセットして再起動してください。
仮想86モードからの再起動では失敗することがあるかもしれません。これはEMMに依存する点も大きいです。int 1Fh, AX=8C00h を正しく実装したEMMでない場合はハングアップすると思われます。MATE-Rでも再起動に失敗するようです。
ハイレゾモードのときは、ブートデバイスの選択はリセット直後のキー押下状態で指定されます。CTRL押しでFD起動強制、ESCで起動メニュー強制、F1キー以降は領域の「起動セレクタ」として設定されている番号と対応します。これをエミュレートする方法(たぶん隠れメモリスイッチにいったん記録される)がよくわかっていないため本プログラムでは、コマンドライン指定での対応はしていません。HDから起動していた場合は内蔵-->SCSIの順に検索され、FDから起動していた場合はFDだけからブートします。IPLwareでintvectcを入れているはずですから、HDの検索とリブートが行われます。なおハイレゾでIDEとSCSIを両方接続している場合、両方のIPLwareが実行されることがあります。二度連続して実行すると正しく動作しないIPLwareアプリケーションがあるときは片方を動作停止にしてください。intvectcについては多重に実行されてもとくに問題はありません。
ディスクの再起動ではなくて、システム全体の再起動をしたほうがよい場合というのもあります。基本的にはリセットボタンを押すことで再起動できます。しかしメモリのチェックなど無駄な時間がかかることになるので、ソフト的に再起動したいということもあります。その場合は同梱されている REBOOT.EXE をコマンドラインから実行してください。詳しくは REBOOT.TXT のほうをお読みください。なお気軽にソフトウェアリブートを使うことは多いと思いますが、ハードウェア的にはどこまで初期化されるのかは98の機種世代によって異なります(下の表)。これも詳しくはREBOOT.TXT をお読みください。なおソフトリブートの機能をもつプログラムは世の中にたくさんありますが、REBOOT.EXEは基本的にそれらと違いませんから、慣れているものをお使いいただいて構いません。
機種 | 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をフックして特定のキーを押すとディスクブートするというようなものに改良することも可能でしょう。
動作不具合のご報告は歓迎いたします。
システムが起動しなくなったことや、それに付随した逸失利益、精神的損害について、作者は一切責任は負わないものとします。これらの点を了承いただけない方には、使用(ソースファイル含む)を認めません。
まりも(連絡先メールアドレスはホームページ上で)