PIF Boot ROMとは

pif-nus.jpg

N64のメモリー領域の割り当ては下記一覧のようになっており

	0x00000000 to 0x03EFFFFF RDRAM Memory
	0x03F00000 to 0x03FFFFFF RDRAM Registers
	0x04000000 to 0x040FFFFF SP Registers
	0x04100000 to 0x041FFFFF DP Command Registers
	0x04200000 to 0x042FFFFF DP Span Registers
	0x04300000 to 0x043FFFFF MIPS Interface (MI) Registers
	0x04400000 to 0x044FFFFF Video Interface (VI) Registers
	0x04500000 to 0x045FFFFF Audio Interface (AI) Registers
	0x04600000 to 0x046FFFFF Peripheral Interface (PI) Registers
	0x04700000 to 0x047FFFFF RDRAM Interface (RI) Registers
	0x04800000 to 0x048FFFFF Serial Interface (SI) Registers
	0x04900000 to 0x04FFFFFF Unused
	0x05000000 to 0x05FFFFFF Cartridge Domain 2 Address 1
	0x06000000 to 0x07FFFFFF Cartridge Domain 1 Address 1
	0x08000000 to 0x0FFFFFFF Cartridge Domain 2 Address 2
	0x10000000 to 0x1FBFFFFF Cartridge Domain 1 Address 2
	0x1FC00000 to 0x1FC007BF PIF Boot ROM
	0x1FC007C0 to 0x1FC007FF PIF RAM
	0x1FC00800 to 0x1FCFFFFF Reserved
	0x1FD00000 to 0x7FFFFFFF Cartridge Domain 1 Address 3
	0x80000000 to 0xFFFFFFFF External SysAD Device

その中の、0x1FC00000〜0x1FC007BFまでの1984バイトの領域をPIF Boot ROMやPIF ROMなどと呼んでいる。

PIF ROMは、PIFがCPUでNMIを解放した後、データを送信し、0xBFC00000からコードの実行を開始します(32ビットモードではコールドリセット、ソフトリセット、およびNMI例外がこのアドレスにベクトル化されます)。基本的に、PIF ROMはn64を起動し、ROMに有効なブートコード(CIC)とチェックサムがあることを検証します(ROMの最初の0x1000バイト)。 80000300で、ブートストラップは起動時にPIF(Peripheral Interface)およびCICから返されたいくつかの値を80000300にコピーします。

IMEMおよびDMEMがクリアされる直前にPIF BootROMの一部はRSP IMEMで実行され、ゲームエントリポイントにジャンプし、80000300〜80000343までの状態フラグを生成します。

0x80000400(物理アドレス0x400) が、標準の起動場所です。すべてのR4xxxシリーズプロセッサは、例外ハンドラに最初の0x200のRAMを使用します。

物理メモリの最初の0x400には、割り込みベクターテーブル(および最初の0x180はプロセッサー例外ベクター)と構成パラメーターが含まれています。

「割り込みベクターテーブル」は、割り込みハンドラのリストを割り込み要求のリストに関連付けるデータ構造です。

簡単に言えば、割り込みと例外ハンドラの両方がプログラムの流れを変更します。

割り込みは、カートリッジの問題(周辺装置割込み)、Pre-nmi(リセットタイプ)などの外部イベントを処理します。

例外は、ゼロ除算など命令フォールトを処理します。

Nintendo 64の割り込みと例外について注意すべきことの1つは、R4300iアーキテクチャはそれらのハンドラーが本質的に1つであり、2つは一意のマスクを持っているだけなので、それらを区別しないことです。

しかし、このような状況以外の用途では、個々のハンドラを持っています。

それに加えて、CICチップはブートロケーション/エントリポイントを再配置することができます。

Nintendo 64 ROMで0x8(word長)に移動して、アドレスをコピーし、それをブレークポイント(行ブレーク)することで、コードセグメントの開始位置を見つけることができます。 そこにあるwordデータは、実際のゲームコードの開始点へのポインタです。

それ以前はすべてブートストラップ関連であり、ほとんどの場合、どのゲームでも同じです。 64DDを使用するゲームでは、参照用に元ディスクのディスクヘッダーのコピーを800001A0に保持します。

参考サイト

N64 Memory - en64 wiki

N64 Memory#Boot_Strap - en64 wiki

SI Registers Detailed#PIF_Usage - en64 wiki

n64dev/pif.S at master · mikeryan/n64dev · GitHub

(WIP) UltraPIF - Multi Region N64 PIF Replacement - Eure Projekte - Circuit-Board

UltraCIC: Reversing the Nintendo 64 Copy Protection Chip

Console Protocols - PIF Stage 1 & 2