電源が ON になった時、ゲームボーイ内部にある ROM の 0 番地から処理が開始されます。
1. まず、このプログラムは、
カートリッジの $0104 から $0133 に配置されている、任天堂ロゴ画像を描画します。
ロゴ画像は画面上から画面中央に向かってスクロールします。
スピーカーからピコーンという音がなります。
2. 次に、 $0104 から $0133 のロゴ画像のデータを、内部 ROM のデータの内容と比較します。
同じ内容でない場合、ゲームボーイの動作を停止させます。
同じ内容だった場合、次に進みます。
3. 次に、 $0134 から $014D のそれぞれのバイトを足し合わせます。
さらに合計値に対して、 10 進数で 25 を足します。
その値の、一番小さいバイトの値が 0 でない場合、ゲームボーイの動作を停止させます。
値が 0 だった場合、次に進みます。
4. 内部 ROM の動作は終了して、カートリッジの $0100 からプログラムを開始します。
レジスタの値は、次のように初期化されます。
AF = $01B0
BC = $0013
DE = $00D8
HL = $014D
Stack Pointer = $FFFE
[$FF05] = $00 ; TIMA
[$FF06] = $00 ; TMA
[$FF07] = $00 ; TAC
[$FF10] = $80 ; NR10
[$FF11] = $BF ; NR11
[$FF12] = $F3 ; NR12
[$FF14] = $BF ; NR14
[$FF16] = $3F ; NR21
[$FF17] = $00 ; NR22
[$FF19] = $BF ; NR24
[$FF1A] = $7F ; NR30
[$FF1B] = $FF ; NR31
[$FF1C] = $9F ; NR32
[$FF1E] = $BF ; NR33
[$FF20] = $FF ; NR41
[$FF21] = $00 ; NR42
[$FF22] = $00 ; NR43
[$FF23] = $BF ; NR30
[$FF24] = $77 ; NR50
[$FF25] = $F3 ; NR51
[$FF26] = $F1-GB, $F0-SGB ; NR52
[$FF40] = $91 ; LCDC
[$FF42] = $00 ; SCY
[$FF43] = $00 ; SCX
[$FF45] = $00 ; LYC
[$FF47] = $FC ; BGP
[$FF48] = $FF ; OBP0
[$FF49] = $FF ; OBP1
[$FF4A] = $00 ; WY
[$FF4B] = $00 ; WX
[$FFFF] = $00 ; IE
レジスタの値は、ゲームボーイのバージョンによって異なるところがあります。
A レジスタの値は、
ゲームボーイカラーまたはゲームボーイアドバンスから起動した場合、
カラー対応ゲームでは 11h になります。
また、 B レジスタのビット 0 の値が、ゲームボーイカラーでは 0、
ゲームボーイアドバンスでは 1 になります。
内部 RAM の値は、ランダムな値になります。
エミュレータの場合は $00 で初期化することが多いです。
実機ではカートリッジ RAM も、最初はランダムな値が入っています。
ROM のプログラムで値をセットした場合にのみ、他の値が入ることになります。
エミュレータの実装時は、任天堂ロゴを表示する処理を飛ばして、
プログラムカウンタを 0100h に設定するところから (上記の 4. から) 起動できると思います。
最終更新:2017年08月30日 19:12