Mode3-5はビットマップに基づいた描画を行うのでビットマップモードと呼ばれています。
タイルモード(Mode0-2)と違って、BGレイヤという概念はありません。
この形式はVRAMに値を書き込むと、それがそのまま画面に反映されます。
ビットマップ形式ではVRAMのうち80KBを背景描画に使うので、OBJタイルデータの格納に使えるのは残りの16KBだけになります。
ビットマップモードを利用しているゲーム
ビットマップモードは低速なので、GBAのほとんどのゲームはタイルモードを使用しています。
ほとんどの場合、ビットマップモードが使われるのは、1枚の画像を表示する用途や3Dゲームのような動的な画面を必要とするゲーム(V-Rally3など)です。
参考: https://www.coranac.com/tonc/text/bitmaps.htm
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 */ },
}
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で指定します。
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
に拡大されて画面に表示されます。