PC-98が持つFD loaderの機能と仕様

Version 1.10 Copyright (C) 2017,26 まりも(DOSsoft)

FDloaderの仕様

FDローダ機能で読み込み実行をするフロッピーは、次のように、案外簡単な仕様しか決められていないようです。

<フロッピー仕様>

・2HD 1024B/s, 8セクタ、いわゆる1.25MBフォーマットであること
・NEC 5.0な仕様のFAT12ファイルシステム(普通にformatすればそうなります)
・IPL,FAT×2,directoryの次、11セクタ目からプログラムが連続で書かれていること
 (これはDOSのIO.SYSの先頭位置と同じで、空のFDに最初にファイルを書き込めばここに位置する)

<プログラム仕様>

・先頭はジャンプコード3バイト(near)か、ジャンプ(short), nop命令の3バイト
・3バイト目から 'ROM' の3文字、6文字目からはどうやら任意
・12バイト目からワード幅で、プログラム全体のキロ(1024)バイトサイズ=占有セクタ数
・14バイト目から、全バイトのワードチェックサムを9821hにするWORD値

たったこれだけを満たせば、勝手にロードし、実行してしまいます。
                ORG 0h              
start:          JMP pstart1         ; offset 00h jmp near code
                DB  "ROM"           ; offset 03h identifier of this program
                DB  "PC9821"        ; offset 06h OEM signature ? (size 6B)
FD_data_size    DW  0000h           ; offset 0Ch Data size by KB
CheckSum9821h   DW  0000h           ; offset 0Eh 全WORDチェックサムを9821hにする所
pstart1:        ここから任意のプログラム・コード

ですのでどんなプログラムでも書いてよいのですが、BIOSコールが一切使えない(割り込みベクタが未設定状態)、多くの周辺ハードウェアが未初期化である、という厳しい条件でのプログラムとなります。グラフィック画面もそのままでは表示できません。ディスプレイコントローラ周辺のI/Oを適切に処理しないといけないようです。キーボード入力もBIOSが使えませんので、41h,43hのポートを操作する必要があります。とりあえずレガシーな98の機能だけは使えるようです。PCIデバイスは、ホストブリッジの最低限、Cバスブリッジの最低限しか初期化されていません。

 プログラムの開始条件もよくわかっておらず、機種によっても異なるようです。たぶん仕様で間違いないのは、FDローダの開始点(CS:IP)が0060:0000であり、CS=DS=ES=0060hであることです。これはDOSのIO.SYSや、さまざまなIPLとよく似ています。割り込みベクタやBIOSワークエリアは未設定ですが、それらに影響を与えない仕様となっているようです。FDローダの開始時点でのレジスタの値を知るプログラム(**)を使うと機種毎の違いがわかります。

 ロード実行開始時のSS:SPは機種により異なるようです。0000:0A05などとなっている例もありました。この場合、スタックの基底と0060:からのプログラム領域とがほぼ重なり、データやコードが400バイトより大きくなると衝突してしまいます。DOSのCOMファイル型プログラムを前提に設計しているとDS=SS、SP=64KB最大限 ですので、予期せぬバグが発生するかもしれません。スタックポインタの数ワード上のメモリの内容がゼロであることから、FDローダはITFのROMコードから絶対ジャンプ命令(jmp 0060:0000h)で飛んできたのであって、スタックはこの時点で全く設定されていない、ということが推測できます。SS:SPの初期値は不定と考えるべきです。したがってスタックはそのまま使うのではなく、アプリケーションプログラム自身で再設定して切り替えることが必須となります。

 なおBIOSワークエリアで設定済みなのは、 0501h(値04h)と0455h (値C0h)だけです。前者は初期の9801からある1MB以内のメモリサイズ表示フラグで、640KB OKであることを意味しているだけです。後者は知られていませんが、0455h bit6はFDローダで実行中を示すフラグと見られます。Undocumented9821によれば、bit7は「システムセットアップメニュー表示後起動時に1」ということになっていますが、FDローダ開始時においてもこのbitは1です。

(**)<2026-4-20追記>REGPR.BINのFD作成法
REGPR.BINをダウンロードする

セクタ長1024バイト8セクタの1232KBフォーマット、つまりFORMAT.EXE /M でフォーマットされたフロッピーにREGPR.BINをコピーしてください。既にファイルで使用状態ですと正しい位置にコピーされません。また一度ファイル削除して空にした場合もそうなる可能性があるため、一度メディアを抜いてからまたセットした状態にしてください。作成されたFDをFDローダの手順で起動します。なおこのFDは通常のブートでは何も起こりません(NEC純正 FORMAT.EXE でフォーマットした場合はNO SYSTEM FILEでビープ音がする)ので注意してください。

更新履歴

2026-4-20 レジスタダンププログラムの追加、スタックについての注意記述の追加

[戻る]