本文會專門針對GBA tile mode下所使用的tile format做詳細的說明
VRAM layout
GBA的視訊記憶體VRAM總共有96KBytes,但是其中的佈局會根據當前的BG mode而有所改變,見下圖:
本系列文會以map data來稱呼任天堂官方手冊上的screen data,tile data稱呼character data
我們可以看到總共有四種不同的data:
- OBJ Character data
- 為存放組成obj所用的tile的記憶體位置,要注意的是tile mode下與bitmap mode下的OBJ tile area大小並不相同,這將會影響到最多能夠使用的tile數量
- BG Screen data
- 描述一個背景圖層中所有tile的組成以及屬性,要注意此區域與BG tile共用,詳細規則見下方描述
- BG Character data
- 存放組成BG圖層所用的tile的記憶體位置
- Frame buffer
- bitmap mode下的繪製區域
VRAM layout under tile mode
BG tile data以及BG map data在VRAM中的排列規則如下圖所述:
我們可以看到除了OBJ tile data之外,BG的map data跟tile
data是混在一起的,而每一個BG layer的tile data base address為 -
0x0600'0000 + BGXCNT中的Character base block欄位數值
Tile data layout
讓我們使用一個8
這個tile的pixel在GBA中會有兩種可能的色彩表示方式:
- 16色模式
- 在這個模式下,1 byte可以表示2個pixel,也就是說每個pixel的palette
color index範圍是
種,而每個完整的tile為32 bytes - 在此模式下可以透過修改Map data(或者是OAM)中的Color Palette field來實現調色盤切換,也就是各位十分熟悉的-2P色
- 256色模式
- 在此模式下,每一個pixel所佔的記憶體空間為1 byte,也就是說可以有
= 256種顏色,另外一個完整的tile為64 bytes - 由於每一個pixel的color index都完全覆蓋住palette,因此不能夠調整palette number了
Palette memory
上面有提到tile data中存放的是color index,用於在調色盤(palette)中索引出正確的顏色,palette memory的特性如下:
- 位於0x0500'0000,共0x400(1024 bytes)
- 被分為兩部分,各512 bytes
- 前512 bytes為BG palette,bg tile data中的color index會對應到此
- 後512 bytes為OBJ palette, OBJ tile data的color index會對應到此
- 每一個顏色為2 bytes,故兩個palette都是512/2 = 256色,其色彩格式如下所述
Pixel format
眾所周知,如果你想要在電腦系統中顯示顏色,必定要利用一些格式來描述你最終顯示在螢幕上的每一個pixel的顏色,常見的格式有RGB、YUV、HSV等系統
而GBA所使用的色彩系統為RGB,讓我們從binary的角度來觀察每一個pixel的資料:
上圖很清楚地描述了GBA所使用的色彩格式,R、G、B是如何被儲存的,我們可以得出以下數點結論:
1. 每個顏色(我們叫他Color channel)的寬度為5bit,總共可以有
這裡一定要特別提,我沒有打錯!! 是BGR沒有錯
我們講RGB***指的是從MSB到LSB的排列方式為R