Skip to content

Latest commit

 

History

History
79 lines (52 loc) · 3.52 KB

bitmap.md

File metadata and controls

79 lines (52 loc) · 3.52 KB

Mode3,4,5

Mode3-5はビットマップに基づいた描画を行うのでビットマップモードと呼ばれています。

タイルモード(Mode0-2)と違って、BGレイヤという概念はありません。

この形式はVRAMに値を書き込むと、それがそのまま画面に反映されます。

ビットマップ形式ではVRAMのうち80KBを背景描画に使うので、OBJタイルデータの格納に使えるのは残りの16KBだけになります。

ビットマップモードを利用しているゲーム
ビットマップモードは低速なので、GBAのほとんどのゲームはタイルモードを使用しています。
ほとんどの場合、ビットマップモードが使われるのは、1枚の画像を表示する用途や3Dゲームのような動的な画面を必要とするゲーム(V-Rally3など)です。

参考: https://www.coranac.com/tonc/text/bitmaps.htm

Mode3

  0x0600_0000..0601_3FFF:  80KBのフレームバッファ0 (使えるのは75KB)
  0x0601_4000..0601_7FFF:  16KBでOBJタイルデータを格納

フレームバッファ0に書き込んだ2バイトの色データ(RGB555)がそのまま画面の対応するピクセルに出力されます。RGB555を自由に指定できるので、最大同時発色数は32768色です。

最初の480バイトは最初の行(1行=240pxなので480バイト)で、次の480バイトは次の行です。以後も同様です。

画面全体を描画するのに必要なメモリ領域は76800バイト(=75KB: 0x0600_0000..0601_2bff)で、あらかじめ用意された80KBのフレームバッファのほとんどを使用します。

  type RGB555 uint16 // 0b0BBBBBGGGGGRRRRR

  // 240 * 160 * 2 = 76800 bytes = 75KB
  var FrameBuffer0 [160][240]RGB555 = {
    { /* y=0 */ },
    { /* y=1 */ },
    ...
    { /* y=159 */ },
  }

Mode4

  0x0600_0000..0600_9FFF: 37.5KBのフレームバッファ0
  0x0600_A000..0601_3FFF: 37.5KBのフレームバッファ1
  0x0601_4000..0601_7FFF: 16KBでOBJタイルデータを格納

Mode3と違って、256色のBGパレットの色番号(1バイト、0..255)で対応するピクセルの色を指定します。

1ピクセルあたりのバイト数が1バイトで済みますが、最大同時発色数は256色です。

色番号0は透明色として扱われ、OBJをビットマップの後ろに表示することも可能です。

最初の240バイトが1行目、次の240バイトが2行目となっており以後も同様です。

このモードでは画面全体をカバーするのに必要なフレームバッファが37.5KBだけで済み、VRAM全体で2つのフレームバッファを使用することができます。

画面にどちらのフレームバッファを表示するかは、DISPCNT.4で指定します。

Mode5

  0x0600_0000..0600_9FFF: 40KBのフレームバッファ0
  0x0600_A000..0601_3FFF: 40KBのフレームバッファ1
  0x0601_4000..0601_7FFF: 16KBでOBJタイルデータを格納

Mode3同様、直接RGB555をフレームバッファに書き込むことで画面を描画します。

Mode3と違って、Mode5のフレームバッファは 160x128px分しかないですが、2つのフレームバッファを使うことができます。

GBAの解像度は 240x160pxなので160x128pxのフレームバッファの内容はハードウェアによって自動的に240x160pxに拡大されて画面に表示されます。