前回の内容では何もしないソフトでした。
それではつまらないので、今回は何かを出したいと思います。
GBAでのマップファイルを見ると
- 0x04000000〜:メモリマップド・I/O
- 0x06000000〜:VRAM
が割り当てられています。ここをいじることで画面に表示するソフトができるわけですね。
んで、GBAの仕様で割り当てられている(定義されている)アドレスは”gba.h”ファイルとして定義されており、国内やら海外にあるリストを提示しているWebサイトから取得することができます。ただ、各自いろいろな種類があるので王道なものがありません。まあDefineの塊なのでいやなら書き換えちゃえばいいんですよね。
何が定義されているかはDefineの塊で、その詳細はテキストエディターで”gba.h”を見てもらうということで。(手を抜いているなー(^_^;))
んで変数の型は、ここで定義されているものを使用します。
変数の型はこのヘッダーファイルにて
| Cの型 |
"gba.h"での定義 |
| unsigned char |
u8 |
| unsigned short int |
u16 |
| unsigned int |
u32 |
| unisged long long int |
u64 |
と定義されていますので、インクルードするからには今後コレを用いて書きたいと思います。 |
【ビデオモード】
GBAのソフトでまず考えなければならないのは、ビデオモードです。 海外Webでの手持ちの資料(英文)だと、モードが0〜5まであるみたいですね。
大きく分けてテキスト画面(モード0〜2)とビットマップ画面(モード3〜5)があります。
テキスト画面はいままでのGBの描写のやり方で、細かなタイルを貼る描写です。BGも複数持つことができる反面、色数は256色と少な目。
ビットマップ画面色数は多いのですが、BG画面は1つしかとることができません。
つたない英語読解能力で見てみますと。
- モード0:4つのBG(バックグランド)をもてる。
「拡大縮小・回転」機能できず。
- モード1:さらにBGが2つのモードと1つのモードの2種類がある。
2つのモードにすると「拡大縮小・回転」機能ができず。
1つのモードではできる。
- モード2:BGが2つ持ってる。
そのかわり、定義できるキャラクタ数がモード0・1より少ない。
両方「拡大縮小」「回転」機能あり。
- モード3:扱いが簡単。一般に用いられる240x160ビットマップ画面。
VRAMアドレスが0x060000〜0x06012BFFまで。これがそのまま1ドット1アドレスになっている。
1ドットあたり16bit(※)の色データが割り振れる。そのうち青・緑・赤が各5bit(=32階調)づつなので32^3で32768色のカラー画像が表示することができる。
んでも、1画面(BG2のみ)しかもてない。(+_+)
んで1ページあたりのフレームバッファーはデカ過ぎ。アニメーションとかするにはむいていない。
画像データをワークRAMへコピーできるオプションあり。これをVRAMへ戻せもできる。
(※)各色5bit(32階調)づつ割り振られている。
| F |
EDCBA |
98765 |
43210 |
| - |
Blue |
Green |
Red |
240x160x16bit(=2byte)=76800byte=0x12C00byteという式が裏付けられるわけだ。
- モード4:240x160の「8bitパレット(256の色ポインタ)」を用いたビットマップ画面。
モード3よりフレームバッファ数が2つである(モード3は1つ)が、その分同時発色が256色まで。(モード3,5は32768色。色が少ない分バッファーが多く取れる。)
スタートアドレスは「0x06000000」または「0x0600A000」(※)。
これはLCDレジスタ(REG_DSIPCNT)のBit4をセットすることで選択可能。(Bit3=0:0x06000000,=1:0x0600A000)
テクニックを必要とする。
パレットは「0x05000000」から配置され32768色中256個メモれる。
(※)240x160x1byte(256の色ポインタ)=38400byte≒0xA000byteという式が裏付けられるわけだ。
- モード5:モード3と16bit色のビットマップ画面同じなのですが、解像度が160x128になっていて小さいものになっています。その分フレームバッファ数が2つあります。(モード3は1つ。解像度が小さい分、バッファーが多く取れている。)
この小さいサイズは画面向かって左上からこのサイズで表示されるようです。
つーわけで0〜5の6モードをGBAに設定する場合「レジスタREG_DISPCNT(0x04000000)」のBit2〜0の3bitをもってして設定します。
| Define |
Address |
内容16bit振り分け |
| REG_DSIPCNT |
0x04000000 |
| F |
E |
D |
C |
B |
A |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
210 |
| W |
V |
U |
S |
L |
K |
J |
I |
F |
D |
B |
A |
C |
M |
M:ビデオモード0〜5
C:GBCモード。GBAなので‘0‘
A:ビデオモード4のスタートアドレスセレクト
B:Hブランク中のスプライト描写(0=する,1=しない)
D:スプライト蓄積モード
0=1次元、1=2次元
F:描写を止める。このときVRAMへのアクセスが可能となる。
I:1=GB0を表示する
J:1=GB1を表示する
K:1=GB2を表示する
L:1=GB3を表示する
S:1=スプライトを表示する
U:Window 0が可能
V:Window 1が可能
W:スプライトが可能 |
その他0x04000008〜36はBG画面への修飾レジスタに割り振られている。 |
【ビデオモード実験ソフト】
以上のことを踏まえて、なんかソフトを作ってみましょうか。
『1画面グラフィック表示』っつーのをやってみたいと思います。
前回Cファイルを改造しましょうか。
で、肝心のグラフィック画面はモード3が手っ取り早いのでコレを用いてやってみます。モード3はBG2の1画面しかないのでこれを「REG_DSIPCNT」へ設定しています。
-
まず、VRAMに流し込むデータを作らなければなりません。
右の絵(240x160)を作ってみました。(”fight.bmp”)
- このビットマップ画像は24bitのカラーなので、そのままでは使えましぇーん。
GBAは1ドットが16bitカラーですから。
そのため、データのコンバートが必要になるわけです。
巷ではBITMAPファイルのデータコンバートソフトがあるみたいですね。
んでも「ないモノは作る”わたなべ工房”」。変換ソフトを作っちゃいました。ヾ(≧▽≦)ノギャハハ☆
- で、この画面をC言語のROMデータ(16bitのデータ配列)として変換したものをインクルードします。>”fight.h”
- この固定されたデータ(fight[])をVRAM(0x06000000〜)に1ドットづつ入れていくという単純極まりないソフトになっています。
- このソフトではVRAMに一つ一つ代入していきましたけれど、GBAにはDMA(ダイナミック・メモリ・アクセス)機能があるので、コレを用いればあっという間にデータを流し込めます。(やってません)海外のWebサイトでも、こっちのほうが”Cool”と言っています。(確かに便利なコマンドがあるのに1点1点打ち込むのは馬鹿馬鹿しいもんねぇ。)
- また、描写時の絵のちらつきをなくすためにVブランクの間に書く(0x04000004の値)のも”あり”ですね。(やってません)

【Mode3での1画面表示ソフト完成っ!(^.^)/】
実行ファイルとソースはこちら。
(前回と同様にcc.batを実行すれば、実行ファイルができるはずです。)
【Mode3からMode4へ】
Mode4は色を256色(32768色中)で描写できるので、前回用いた絵("fight.bmp")に何の色が使われているかとWindowsでプログラムを組んで自動計測してみたら256色以上使われていました。(^_^;)あら〜っ。
グラデーションを用いると辛いですね。ブラシとかでは色を塗らないほうがいいということだな。
んでPhotoShopで256色に減色してみたんです。>左側の絵
ブラシで塗っているグラデーションの部分の境がハッキリしました。でもあんまり代わり映えがないんで、これを表示できるようにしてみようと思っています。
当然Mode3のとき同様C言語で扱えるようにビットマップファイルのデータ化(Mode3データとは非コンパチなので)が必要になりますので、これまたWindowsでプログラムを作成してみました。 ヾ(≧▽≦)ノギャハハ☆
Mode4だと2ドットで16bitデータなので(各ドット8bit(0x00〜0xFF)←パレット番号を表す)描写速度もMode3の半分で済むことになります。ただパレットを使うのでいろんな絵を表示するにはパレット側も変更しなければならないのが面倒かな。同じパレットを使いつづけるのも手ですけれど、色管理がめんどうだし・・・・。
ほかにもいい面としてスプライト・エリアにこのデータが用いることができると。スプライトの拡大縮小・回転機能を用いることができるもんね。
【Mode4で1画面表示ソフト完成っ!(^o^)丿】
これがMode4での実行結果です。
実行ファイルとソースはこちら。
(これも同様にcc.batを実行すれば、実行ファイルができるようになっています。) |