電源ON時の処理

電源が 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