オーバーフロー/0除算を回避するROMアプリケーション DIV0ROM Version 1.10B
使用説明書 Copyright(C) 2021 まりも
■ このプログラムの意義と問題の背景
「オーバーフロー/0除算を回避するROMアプリケーション」というタイトルではなにを目的とするのかわかりづらいと思います。端的に言えば、IDEやSCSIのDISK BIOSに起因するHDDの容量上限を超えた場合のハングアップを回避するROMアプリケーションです。
DISK BIOSの容量上限を超えるディスクドライブを接続した場合、発生しているのは、実はケタあふれする除算です。ディスクドライブの総論理ブロック数からC/H/S方式に変換する過程で、シリンダ数を計算するところでは、H*Sの積で16bit除算するのが一般的ですが、この値が小さすぎるか論理ブロック数が大き過ぎるとき、除算の結果が16bitに収まらなくなります。
このような除算オーバーフローの発生や0除算の際には、intel 80x86プロセッサでは割り込み00番のために用意された番地に飛ぶという仕組みになっています。ところがITFやROMが実行される段階では、このためのルーチンは用意されておらず、デタラメなところにジャンプしてそのままハングアップするのが普通です(非常に運がよいと通常のシステム起動ルーチンに戻ってくることもありますが)。
本プログラムは、自分のROM内に用意した除算回避ルーチンを、ブートROMが呼ばれる初期の段階で割り込み00番の処理ルーチンを割り込みベクタに登録するという動作をします。そのあとDISK BIOSが除算エラーを発生させても、いったん除算回避ルーチンに飛んだ後は、除算を起こした命令の次に戻って、そのままシステム起動を継続できるようになります。
割った値(商)が大きすぎるのが原因でエラーが起こるわけですから、除算回避ルーチンは、とりあえず16bitの最大値をもって商とするようにしています。
以上により、DISK BIOSでの上限を超えるディスクドライブを接続してもハングアップは起こさないようになります。ただし上限を変更するものではありませんから、上限ぴったりの容量で切られた状態での使用となります。それでもディスクドライブの容量を気にせず接続でき、上限までは普通に使えるのはメリットでしょう。
しかも本プログラムの方法は特定の98機種には依存しません(その代わりCPUに依存する可能性があります)。本プログラムを入れたROMボードはとても汎用的に使えるという利点があります。
■ 使用法
【ROMに書き入れる】ROMへの書き込みには一般にROMライタが必要です。その使用方法はROMライタ固有の事項ですので、ここでは説明できません。ROMライタが無くてもRealtek8139ネットワークカードを応用してROMに書き込む方法も私のサイトで紹介していますので、 参考にしてください。それができないか面倒であるという方向けに、頒布も計画中です。
40pinの16bit(ワード)幅のROMに焼く場合は、DIV0ROM.BIN を使用します。いっぽう、多くのCバスボードで使用されている8bit(バイト)幅の28pin ROMを2個使用した物の場合は、それぞれのROMに、DIV0ROM.EVNとDIV0ROM.ODDを書き込んでください。DIV0ROM.EVNの入ったROMは偶数アドレス側ソケットに、DIV0ROM.ODDは奇数アドレス側ソケットに装着します。どちらかが偶数で他方が奇数ですので、1/2の確率でうまく行くでしょう。ROMに貼ってあったシールやソケットのシルク印刷、プリントパターンなどから判断できる場合もあります。00,01などという番号がシールにある場合、まず00が偶数側です。
■ 動作
通常はこのボードを挿しておいてもとくに反応は起こりません。システム起動中に除算エラーなどは起こらないからです。しかしDISK BIOSが除算エラーを起こした場合には、本プログラムのROMルーチンが呼ばれて動作します。「容量上限を超えたディスクドライブが接続されています」という表示が画面右上に出て、Beepが数百ミリ秒程度鳴動します。その後システムの起動は継続されて、問題となるディスクドライブについては、DISK BIOSにおける諸元は65534シリンダとなっているはずです。具体的容量は、それとヘッド数、セクタ数の積によって決まります。
バージョン1.10からは、除算エラーを発生させたプログラムの実行セグメント位置によって、画面表示の色分けをするようにしました。
DC00 シアン
D000 シアン
D800 白
D700 緑
D600 シアン
4000未満 赤
1000未満 黄色
本プログラムの仕事は、どんな容量のディスクドライブをつないでもハングアップしないようにするところまでです。本来の容量を使い切る最適な動作のためには、IPLwareである 「IDE-BIOS-LBAパッチ」(リウ様 twitter D@drachen6jp の作品)の併用をお勧めします。容量問題に限らず、とくにCompactFlashを使い場合には必須のツールです。
【2024年98の日に追記】リウ様のサイトが新たに発足しましたのでそちらのリンクも記載しておきます。IDE-BIOS-LBA-Patchです。
■ 注意点
Windows NT 、Windows2000のディスク管理では、ほんとうの容量が取得されているため、BIOSでの容量上限より後方に空きエリアが見えます。そこを領域確保できそうになりますが、上限を超えたエリアを絶対に確保してはいけません。なぜなら、確保すると65536シリンダ以上に相当するところをパーティションテーブルに記述するためです。このとき32bitのシリンダ番地で内部的には扱っていますが、記述できるのは16bitとなるため桁が落とされてしまいます。つまり0シリンダから確保されているという情報が書き込まれてしまいます。これと既存の領域とが重複になることから、パーティションが破壊されます。
本プログラムが対応するのは、シリンダ数を求めるための除算です。DISK BIOSが「シリンダ番地」をLBA番地から変換するときに発生する除算には対応しません。これが発生するのは、実際にディスクアクセスを実行した場合ですが、それはDOSや他のOSが起動するとき、あるいは起動した後です。そのときには除算例外のルーチンはOSによって上書きされており、本プログラムは効力を持ちません。具体的にこれに該当する除算問題は、
・IDE BIOSが544MB上限といわれる機種での544MB〜4351MBへのアクセス
・SCSI BIOSに1GB(8192)上限問題があるとされるボードでの、その容量以上へのアクセス
で発生します。これらの問題はディスクブートまでの間に発生するのではないため、案外気がつかれない場合があります。いずれにしても本プログラムの対象外です。しかしIPLブートの段階までにハングアップ起こさないので、IPLwareでの対応が可能であり、すでにそのようなプログラムは用意されています(REI、EXIDE544、E10PAT、 SCSI_RAMなど)。本プログラムはわずか400バイト足らずの大きさしかありませんが、拡張ROM域は4KBのブロック1個を占有します。CバスボードのためこのROM域は取り消すことができず、DOS起動後にはUMBのエリアを狭くするだけの存在となります。EMM386.EXEを使用する場合は、本プログラムのあるROM番地をUMBエリアとして含むように明示的に指定してください(EN=範囲指定)。自動では、ROMがあるものとしてUMBのエリアから外されます。そのようなことから、ROMアドレスとしてはノーマルモードではD000:0000hに置くのが無駄が少なくてよいでしょう。D700:0000hに置くことができるボードであればそれもよいでしょう。なおDOS以外のOSではとくにこのことは問題とはなりません。
本プログラムの動作はCPUに依存する可能性があります。Pentium、i486では問題なく動作していましたが、8086やV30,V33HLなどではどうなるか不明です。
DISK BIOSが引き起こす容量問題以外で、システム起動中に除算エラーが起こることはあり得ないはずですが、可能性はゼロではありません。もし起きた場合でも本プログラムの想定しない事象ですので、本プログラムの処理結果が最適ではない可能性があります。
■ EXIDE543.ROMについて
DIV0ROMだけの機能では物足りませんので、オンボードIDEドライブの容量上限が543MBとなっている機種において4351MBまで拡大する機能を合わせたものも用意しました。ROM543.LZHを解凍して得られる EXIDE543.ROMがそれです。使用目的としてはEXIDE543の文書のほうを参照してください。使い方はDIV0ROMと同じです。8bit幅用のROMデータは EXIDE543.EVNとEXIDE543.ODDです。ただし0除算発生源の色分けはおこなわず、またメッセージ表示場所も最下行に変更となっています。なおEXIDE543.ROMはPC-9801USには対応していないようです。
■ お約束
本ソフトの著作権は、作者である「まりも」 が有します。DIV0ROM.BIN 他については、私的な使用は自由ですが、再配布を認めません。すなわち、このソフトウェアによるパッチをあてたROM、およびROMを載せた状態のボードを譲渡・販売・流通させることは固く禁じます。ROM焼きの役務代行業者などにROMデータを送付することも同様です。個人的使用にとどめてください。これが守られていない場合は著作権の侵害と見なします。
したがって、このソフトウェア全体を、不特定多数のダウンロードできる場所へ「転載」することも、禁止とします。しかしリンク先の紹介についてはなんら制限はありません。
本プログラムにはソースプログラムが付属します(1.10から)。アセンブルソースを改良・翻案して何かを創作すること自体はなんら妨げられることはありませんので自由にやっていただいて構いませんが、大部分を流用した二次創作を公開する場合は、そのことを明記していただくことを希望します。
プログラムは、ある程度のテストを経て公開していますが、動作が完璧に行なわれるということを、作者は保証するものではありません。ユーザがプログラムを組み込んだことによる起動不能などのトラブルの補償には一切応じません。
システムが起動しなくなったことや、それに付随した逸失利益、精神的損害について、作者は一切責任は負わないものとします。これらの点を了承できない方には、使用(ソースファイル含む)を認めません。
まりも (連絡先メールアドレスはホームページ上で) ■改版履歴
年月日 版 内容 2021. 3. 1 1.00 新規 2021. 8. 1 1.10 0除算発生源のセグメントを色分け表示する機能の追加、beep音を長くした 2022.10.10 1.10B EXIDE543のROM版も同梱とした