• 追加された行はこの色です。
  • 削除された行はこの色です。
#author("2020-01-05T23:57:51+09:00;2020-01-05T23:57:15+09:00","","")
#author("2020-01-11T20:47:59+09:00","","")
#norelated

*PIF Boot ROMとは [#nd0aa7ea]

&ref(pif-nus.jpg);
#contents

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にコピーします。


PIF BootROMの一部は、IMEMおよびDMEMをクリアし、以下のゲームエントリポイント/ Devise状態フラグにジャンプする直前にRSP IMEMで実行されました。
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長)に移動して、アドレスをコピーし、それをブレークポイント(改行)することで、コードセグメントの開始位置を見つけることができます。
そこにある単語は、実際のゲームコードの開始点へのポインタです。
それ以前はすべてブートストラップ関連であり、ほとんどの場合、ゲーム間で同じです。
64DDを使用するゲームでは、参照用に元のディスクのディスクヘッダーのコピーを800001A0に保管します。


*参考サイト [#d647ce4f]
[http://en64.shoutwiki.com/wiki/N64_Memory N64 Memory - en64 wiki]

[http://en64.shoutwiki.com/wiki/N64_Memory#Boot_Strap N64 Memory#Boot_Strap - en64 wiki]

[http://en64.shoutwiki.com/wiki/SI_Registers_Detailed#PIF_Usage SI Registers Detailed#PIF_Usage - en64 wiki]

[https://github.com/mikeryan/n64dev/blob/master/src/boot/pif.S n64dev/pif.S at master · mikeryan/n64dev · GitHub]

[https://circuit-board.de/forum/index.php/Thread/24209-WIP-UltraPIF-Multi-Region-N64-PIF-Replacement/ (WIP) UltraPIF - Multi Region N64 PIF Replacement - Eure Projekte - Circuit-Board]

[https://recon.cx/2015/slides/recon2015-19-mike-ryan-john-mcmaster-marshallh-Reversing-the-Nintendo-64-CIC.pdf UltraCIC: Reversing the Nintendo 64 Copy Protection Chip]

[https://sites.google.com/site/consoleprotocols/home/techinfo/lowlevel/pif12 Console Protocols - PIF Stage 1 & 2]