PC-98のITF/BIOS のROMについて

Copyright(C) 2022-23 まりも (DOSsoft)

■ PC-9800シリーズのファームウェア ROMの歴史

 PC-9800シリーズではシステムBIOSのROMが絶対番地F0000〜FFFFFhに存在し、E8000〜EFFFFhにはN88 BASICのROMが存在します(初代9801だけはE0000-E7FFFにもROMを搭載できる)。これらの合計は96KBになります。8086 CPUマシンでは、電源投入またはハードウェアリセット後にはFFFF:0000(FFFF0h)にある命令から実行される仕様となっているため、1MB空間の最上位にはファームウェアROMが必ず存在し、起動直後から実行すべき命令が書かれています。PC/ATであってもこれは同じです。

 後の機種では、電源投入後の初期化動作にさまざまなことが必要となってきて、システムBIOSの裏に別バンクでITF(Initial Test Firmware)を備えるようになります。最初の搭載機は不明ですが(98XAか?)おおむね80286搭載機からです。32KBが追加で必要となりましたが、PC-9801Vmで16色モードが登場してE0000h〜E7FFFhはそれに割り当てられたことから、ITFのためにアドレスを増やすことはできず、F8000h〜の32KBをバンク切り替えでITFとシステムBIOSとが入れ替わる方式となりました。この時代には合計で1Mbit(128KB)のROMが必要となりました。

 80386機の頃になるとITFのほかにSASIやSCSI,オンボードのサウンドBIOSを持つ必要が生じたほか、9801DシリーズからはDIPスイッチのソフトウェア化によりシステムセットアップメニューが登場し、システム起動のための純粋なITFの他にもROMが必要となりました。そのためITFのバンクを複数持つことになります。I/Oポート 043FhにE0〜EEhまでの偶数値を出力することで8個のバンクに切り替わるという方式が、その頃に確立しました。これは基本的に最後の98に至るまで踏襲されることになります。これによりROMの容量は2Mbit(256KB)となりました。それでも80386の頃にはITFと内蔵機器BIOS以外のかなりの部分が未使用でした。

 i486機になるとCPUの初期テストの内容が増え、さらにはPnPの機能が搭載されることで、大幅にITFの内容が増えます。PCI搭載機に至ってはPCI BIOSを持つことになります。P6系CPU搭載機ではCPUのマイクロコードアップデートまで持つことになり、256KBでも足らないくらいとなりました。

 なお80386搭載機の時代からは、システムBIOSのROMといっても、システム起動後にはROMの内容がRAMに転送されて実行されるようになっています。RAM上のほうがBIOSファンクションが高速に実行できるからです。C0000-DFFFFhの拡張ROMエリアでも、拡張BIOSをRAMに転送して高速化している場合があります。

■ 使われたROMチップの変遷

 PC-9800シリーズは16bit幅データバス機ですので、拡張バスのレベルでは16bitのデータ信号線を持っています。80286までの機種ではCPUから出るデータ信号線と一致しています。ROMのチップも基本的に16本のデータ信号線が必要です。しかしPC-9800シリーズのはじめの頃には8bit幅のROMしかなかったので、8bit幅のROMを2個単位で並べて接続していました。80286機の時代にはROMの容量も小さかったので、27C256というROMを4組(合計で128KB)使用していた機種もあります。8バンクのITFを持つ機種では最低2Mbit必要ですので、80286の後期から80386機では基本的に1MbitのROMが2個使用されています。

 80386 DX機では32本のデータ線がありますが、ROMについては4個並べたような実装の機種はおそらく存在していません。80386 SXにあるようなバスのダウンサイジング回路を入れて、16bitを2回アクセスするような形で読み出していました。

 i486機の時代になると16bit幅のROMが採用されるようになります。B-FELOW/A-MATE初代の機種からは日電μPD27C4000という、4Mbit(512KB)のチップが使われるようになってきました。あまり一般的でなく高価なROMチップですが、A-mateではハイレゾモードの追加により256KBでは足らなくなったこと、Canbe/Multiでは起動時グラフィック画面のデータが必要となったこと、部品実装面積の削減の必要などから、このチップの採用となったと想像されます。またこのチップはマスクROM(製造時から変更できないROM)の23C2000〜23C4000とピン配置が一致のようですから、マスクROMを使うことも視野に入れて採用したということも考えられます。B-mate、B-FELLOWでは半分しか使用されず無駄ですが、回路設計や関連するファームウェアの設計の流用のため共通の仕様とするメリットはあったでしょう。実際、数多く発売されたB-mate/FELLOW第2世代あたりではマスクROMがよく使われていますので、無駄でもなかったといえます。  

 i486機もそろそろ終わりを告げようという頃、Pentium搭載機であるPC-9821Anが登場します。最大の特徴は、ROMに書き換え可能なフラッシュROMが搭載されたことです。当時のフラッシュROMは8bit幅で512K〜1Mbit程度のものが普通だったはずですが、安価なそれらを組み合わせて使うということはせず、日電μPD27C4000とピン配置や使い方の互換性の高いintel 28F400BX-Tが採用されました。当時としては非常に高価なチップであったはずです。  

 An以降の全ての機種ではEPROMは一切採用されなくなり、一気にintel 28F400BX-Tまたは200BX-TのフラッシュROM搭載に移りました(FC98シリーズについては一気にではないかもしれない)。直後に登場したX-mateシリーズや初代PCI搭載のXa,Xf,Xtと続きます。Multi/Canbeは Cx,Cb,Cfの時からフラッシュROMに置き換わりました。それ以降PCI搭載を経て最後の機種まで同じフラッシュROMが使用されます。ただしintel以外の「完全互換品」としてマイクロン製の物や「ほぼ互換品」のAMD製Am29F400BB,200BBおよび富士通製MBM29F200T*,400T*もセカンドソースとして用いられるようになります。

 PC-9800シリーズでも、PCIバス搭載機からはNEC独自回路ではなくCPU周辺チップセットが流用されるようになります。チップセットにはROMの接続回路も含まれており、そこではバスのダウンサイジングにより8bit幅でアクセスできるようになっています。このため98でも8bitのROMが接続できたはずです。しかしどういうわけか intel 28F200BX-T/400BX-Tおよびそのほぼ互換品が最後の機種まで採用されました。このROMは8bit幅としても使用できるモードがあるため使用できたのですが、コスト的には意味のあることではありません。供給の都合(部品を大量に購入していたなど)で採用されたに過ぎないと考えられます。したがってPCIチップセット機では、信号線の対応をはかりさえすれば、8bitのフラッシュROMを接続できます。

■ ITF/BIOSのROM内容の構成

 以下はI/Oポート043FhにE0〜EEを出力し8個のバンク切り替えでROMが読み出せる機種についての考察です。この手順で読み出せるのは32KBのブロックです。バンク番号0..7はそれに対応したI/Oポート043Fhに出力する値 E0〜EEの順序でもあります。E0でBANK0、E2でBANK1...E8でBANK4...EEでBANK7が出現します。

 最初にCPUアドレス空間のF8000hに現れるのがBANK4のITFです。システム起動完了(ディスクブートの段階)頃には、BANK5がE8000hからのROM BASIC、BANK6とBANK7とがF0000hからのシステムBIOSを構成します。その他のBANK0,1,2,3は機種によって空であったり、起動中に一時的に実行されたり、IDE BIOSのように拡張ROMアドレスのところに現れたりと、さまざまです。

 いっぽう各バンクがROMの物理アドレス上でどういう順序で格納されているかは、ROMライタなどで直に読んでみないことにはわかりません。順序がわからないと、ROMライタで同じ物を作ることもできませんし、フラッシュROMに書き込むにしても、順序を間違ったものを書き込んでしまえば一発で起動できなくなってしまいます。したがってなんとしても物理配置は事前に知っておかなければならない情報なのです。

■ 27C010など2個を搭載した機種のROM内容の構成 2023年3月1日,12月20日追記

 PC-9801RA,RS,RLおよびDXからFAまでの機種では8bit幅の27C010が2個搭載されています。2個併せて全容量は2Mbitです。

これらの機種では ROMの物理アドレスの内容はBANK0..7のバンク番号昇順となっています。内容としては BANK4がITF,N88 BASICおよびSYSTEM BIOSがBANK5,6,7です。BANK0..3はほとんどデータがありませんが、BANK2のオフセット7000hから4KBのSASI BIOSがあります。内蔵26相当SOUND BIOSはBANK1の後半、オフセット4000hからのところにあります。なお9801DXではBANK2の前半にも同じ内容のSOUND BIOSがありました。

 物理配置と出現するCPUアドレスの間には関係がみられます。物理アドレス0をCPUアドレスのC0000hに位置づけると、ITF以外のバンクはオフセット位置が対応します。ITFのBANK4に限りI/O 043Dhを制御することによりF8000hの裏に現れますが、9801/E/F/Mの頃にはE0000hに出てもよい設計であった可能性があります。  

 なおハイレゾモードを持つRLではハイレゾモード用のROMが別途存在し、27C512が2個となっています。下位の64KBにはF000:0000から現れるSYSTEM BIOSが、最上位32KBにはITFが格納されています。それらの中間の32KBは未使用です。XL^2のハイレゾも同様と考えられますが、後述のようにA-mateのハイレゾモードとは大きく異なります。

■ μPD27C4000採用機種のROM内容の構成

 拙作ITF/BIOSファイル化ツール「getitf98」ではBANK0.BIN〜BANK7.BINの32KBのファイル8つが生成されます。このバンク番号の順序は、μPD27C4000搭載機では格納物理アドレスの昇順と実は一致しています。つまりBANK0.BINが最低アドレスにあり、BANK1.BINがその上のアドレスにある、というわけです。GETITF98では 通常 2Mbitまでしかデータが出力されませんが、基本的にノーマルモードの起動に必要な部分は2Mbit以内にあるため、A-mateとMulti/Canbeを除けば最上位にBANK7.BINがあります。

 初代を除くA-mateでは、上半の2Mbitには主にハイレゾモードで使われるITF/BIOSが存在していると考えられます。その一部はI/Oポート043Fhの制御では読めず、直接拡張ROM域に現れるものとなるようです。それらはSASI BIOS、SCSI BIOS、IDE BIOSなどです。ハイレゾのIDE BIOSがバンクデータのオフセット6000hから格納されているのは、本体のE6000hにIDE BIOSが出現することと関連ありそうです。回路的には当該バンクの基底をE0000hに割り付けるという簡単なもので済むからです。実際にはE0000〜E5FFFFhにはテキストVRAMやCGWINDOWのSRAMが優先的に接続されるようになっているので問題ないのでしょう。

 ノーマルモードではBANK2のオフセット7000hからSASI BIOSが格納されていますが、これもBANK2の基底をD0000hにすれば拡張ROM域の所定位置のD7000hから出現するわけで、回路と対応した配置と考えられます。また後続するアドレスのD8000hにはBANK3のIDE BIOSが配置されますが、BANK3の先頭にIDE BIOSが格納されるようになったのは、BANK2からの連続性という回路上の都合も関係ありそうです。

 (2023年3月1日追記)初代A-mateについては、上位2Mbitにハイレゾモードのデータが「ほとんど」入っていません。ハイレゾボードには27C2001というROMが1個載っておりITFやSYSTEM BIOSはここにあると思われます。初代A-mateではここを参照しているはずです。しかし2代目A-mate(Af/Ap2/As2)からは本体のROMの上位にあるデータが使われているのではないかと考えられます。

■ フラッシュROM採用機種のROM内容の構成

 ところがフラッシュROM採用機ではバンク番号昇順とはなっていません。BANK3が最低位にあり、BANK4が最高位にあるというように変更されました。 各BANKのうちで最初にF8000エリアに出現するのはBANK4の内容です。最も重要なバンクです。その番号(すなわち選択するI/Oの出力値E8h)についてはNECは変更しなかったようです。たぶんITFコードの開発上仕様を変えたくなかったためでしょう。

 PC/AT互換機のITF/BIOSにおいてもITFが最初に実行されるような部分は重要です。そこの一部には誤りの絶対にないコードを書き入れておきたいところです。たとえばフロッピーからITF/BIOSのデータをロードして書き換えるようなコードです。そうしておけば万一BIOSデータにバグがあっても、書き直すことで修正できます。そのようなコードの格納部は壊されない(書き換えられない)ようになっていたほうが安全です。

 そのためintel 28Fシリーズには「ブートブロック」という機構が用意されており、NECが採用した28F200BX-Tおよび400BX-Tでは、最上位の32KBを細かくわけて、8+8+16KBのブロックで消去管理ができるようになっています。また最上位の16KB(BOOT BLOCK)にはハードウェア的に書き込み保護ができる仕組みが備わっています。この仕組みをうまく活用すれば、たとえば絶対に消去されず何があっても再起可能なコードをその16KBのブロックに入れておくなどして、バグのあるデータを書き込んだことによる再起不能を避けることができます。おそらくはそれを目的として、X-mateおよびPCIチップセット搭載機からは、もっとも重要なITFのあるBANK4を最上位の32KBに配置するように変更されたのだと推測できます。

 しかし98では実際にはそのようなブロック管理に対応するようなITFコードには全くなっていません。ITF起動中に上下の16KBの間を行ったり来たりすることは頻繁にあるスパゲッティプログラムとなっています。したがって上位16KBを書き込み保護したとしても意味がない状態です。とくにPCIチップセット搭載機では時代が進むほどスパゲッティの混み入りがひどくなる傾向があります。Mate-Rに至っては、ブートブロックを保護するジャンパピンすら廃止されています。NECはITFの開発にあたりあまり既存のソースをいじらずに、追加した部分はジャンプしてパッチあてをするというようなやりかたを取っていたのでしょう。  

■ 過渡期のAnのROM内容の構成

 すでに述べたように、μPD27C4000採用機では バンク番号昇順に格納され、フラッシュROM採用機ではBANK4がトップに来る配置となっています。ところが過渡期のPC-9821Anでは、フラッシュROMにもかかわらず格納順序はμPD27C4000採用機と同じとなっていることがわかりました。これはAnがまさに最初の機種だからということもあるでしょうし、書き込み保護の機構が備わっていないのでBANK4をトップに持ってくる意味が無かったためということもあると考えられます。Anではジャンパピンの操作でROM書き換えモードに移行してしまいます。発売が近い時期のCx・Cb・CfやAp3・As3ではどうなっているか調べる必要がありそうです。

■ フラッシュROMのモードが8bitか16bitか

 μPD27C4000には読み出し時に8bit幅で扱えるモードが備わっています。BYTE#/WORDというピンがそれです。このピンの電位がどうなっているか調べればデータ幅のモードがわかります。どうやら98各機種では常時Hレベルのようです。それであれば常時WORDモードでアクセスされています。

 同様のモード切替はintel 28F200BX-T/400BX-Tにもあります。486 X-mate機やPCIチップセット機を調べた限りではLレベルで、常にBYTEアクセスのようです。それを裏付けるように、データピンの上位8ビットであるD8〜D15には配線が来ていません。いっぽうA-mateのフラッシュ機であるAn,Ap3で調べた限りでは、常時WORDアクセスとなっていました。A-mateでは旧来のμPD27C4000採用機の構造を色濃く残していたわけです。これについても発売が近い時期のCx・Cb・Cfがどうなっているかは気になるところです。

■ 4MbitフラッシュROM採用機

 Mate-Rのうちタワー型のRvではマイクロコードアップデートの部分や拡張APICの部分が2MbitのROMでは収まらなかったためか、4Mbitが使われています。ITFでは上位下位2Mbitを切り替える操作が行われています。わたしの手中にはないですがPCIバスを潜在的に持つCanbe各機種でも4MbitのROMが使われているとのことです。上位下位切り替えの仕組みはRvと同じであるようです。GETITF98ではそれらには対応しており、BANK8からBANKFまでが追加されます。なおBANK4が最上位のブートブロックに来るという配置は守られているため、BANK8-Fが下位側に配置されています。

■ まとめ

 PC-9800シリーズのITF/BIOSのROMの特徴について長々と綴ってきましたが、まとめると次の表のようになります。とにかくNECはコスト度外視で互換性重視であったといえます。よけいな変更を加えないようにしてきました。そのような中でフラッシュROMの採用やPCIチップセットの登場は大事件で、大きな変更をしなければなりませんでした。このため大別して2種類のROMチップおよびROM内容構成があるというわけです。PC-9821Anがどっちつかずの特別な仕様である背景もそこにあります。
機種ROMチップバンク番号と物理アドレス上の配置データ幅
80286機9801VX,RXなど
(ハイレゾは不明)
27C256×4個
(内蔵HDD用は別)
? ITFは1バンクのみ8bit×2
9801RA〜FA
(RXは除く)
27C010×2個バンク番号の昇順8bit×2
A,B-mate,FELLOW
(第1,2世代)
27C4000,23C4000バンク番号の昇順16bit
Anのみ?28F400BX-Tバンク番号の昇順16bit
X-mate,B3,B4-FELLOW, Canbe,PCI機28F400BX-T,200BX-T
ほぼ互換品
29F200-T*
低位からバンク (B,A,9,8,F,E,D,C),3,2,1,0,7,6,5,4の順8bit

 なおこの記事は、各機種について一応のハードウェア的およびソフトウェア的調査をして書かれたものですが、事実関係の誤りや推論の誤りを含んでいる可能性はあります。たとえばROMの書き換えなどに参考にする場合は、ご自身の責任で実機をよく調べたうえでおこなってください。この記事の誤りについて筆者はいっさい責任は負いません。

 更新履歴

2022. 3.27 最初

2023. 1. 7 RLについての記述追加(しかし事実誤認あり↓で訂正)

2023. 3. 1 9801RA〜RL〜FAまでの機種のROMについて記述追加、RLに関する情報の訂正

2023.12.20 9801RA〜RL〜FAまでの機種のROMについて記述追加

[戻る]