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 レジスタダンププログラムの追加、スタックについての注意記述の追加