index
ハードウエアの概要

このページは、何が書いてあるのかざっと目を通しておき、後でプログラミングするときに、必要個所を詳しく読んでください。

cubeGBAの仕様

下図のように2プロセッサアーキテクチャとなっています。Z80はGameboyとの互換のために必要となります。ここでは、ARM7TDMIをターゲットとして開発を行います(TDMIのアーキテクチャについては各自で調べてみよう)。メモリは1クロックサイクルでアクセス可能な内部RAMと、アクセスに3クロックサイクル必要な外部RAM、およびLCD表示用のVRAM(Video RAM)に分かれています。プログラムは外部RAMに配置されます。

GBA ArchitectureCPU core
GBAの構造ARM7アーキテクチャ

cubeメモリマップ

GBAでは、IOの制御もメモリと同じアドレス空間上に配置されたIOレジスタを通して行います。下記のメモリマップを覚えているのはつらいので、ヘッダーファイルに記載して使用します。

種類先頭アドレス容量バス幅説明
スプライト(OAM)0x0700 00001kB32bitオブジェクトと背景を重ねる機能
VRAM0x0600 000096kB16bitLCD に表示するデータを入れる
パレット0x0500 00001kB16bit256色分色を記憶しておくことができる
IOレジスタ0x0400 00001kB32bitLCD などの IO 機能を制御するレジスタ
内部RAM0x0300 000032kB32bitARM 内蔵の高速メモリ
外部RAM0x0200 0000256kB16bitプログラムを入れる外部メモリ
BIOS0x0000 000016kB32bit起動プログラムやファンクションコールを実装したROM
ROMまたはFlashメモリカートリッジは、0x0800 0000 以降に配置。

cubeグラフィクスの構成

LCDの背景表示方法には、ビットマップ・モード(各ピクセルに色を設定)とタイル・モード(8x8pixのタイルを並べる)があります。モードの種類は0〜5までありますが、ここではモード0(タイル)とモード3(ビットマップ)を使用します。

1.ビットマップモード(MODE 3)におけるデータの構造

MODE 3 では、1枚の背景(BG2)とその上のオブジェクト(背景の上に表示されるキャラクタ)で画面が構成されます。背景は、ビットマップ表示のため高精細な画像表示に向いています。RGBデータは、上位ビットからBGRの順になっていることに注意してください。

VRAM mapping

2.ビットマップモードにおける VRAM フレームバッファの構成

データ内容先頭アドレス容量バス幅
Objectデータ0x0614 000016kB2Byte
BG2 RGBデータ0x0600 000080kB2Byte

3.タイルモード(MODE 0)におけるデータの構造

MODE 0 では、4枚の背景(BG0〜BG3)を切り替えながら使用できます。背景は、タイル(8x8pix)を並べたマップ(最大64x64tile)により構成されます。

Tile Screen

4.タイルモードにおける VRAM フレームバッファの構成

タイルモードでは、VRAMをタイルデータ(16kByte単位)とマップデータ(2kByte単位)で共有しますので、各データサイズを計算して、アドレスがが互いに重ならないように注意する必要があります。

先頭アドレス
(容量)
タイルデータブロック番号タイルデータブロック番号先頭アドレス
(容量)
0x0601 0000
(32k Byte)
オブジェクトデータ
0x0600 C000
(16k Byte)
タイルブロック 3 マップブロック 310x0600 F800 (2k Byte)
マップブロック 300x0600 F000 (2k Byte)
マップブロック 290x0600 E800 (2k Byte)
マップブロック 280x0600 E000 (2k Byte)
マップブロック 270x0600 D800 (2k Byte)
マップブロック 260x0600 D000 (2k Byte)
マップブロック 250x0600 C800 (2k Byte)
マップブロック 240x0600 C000 (2k Byte)
0x0600 8000
(16k Byte)
タイルブロック 2 マップブロック 230x0600 B800 (2k Byte)
マップブロック 220x0600 B000 (2k Byte)
マップブロック 210x0600 A800 (2k Byte)
マップブロック 200x0600 A000 (2k Byte)
マップブロック 190x0600 9800 (2k Byte)
マップブロック 180x0600 9000 (2k Byte)
マップブロック 170x0600 8800 (2k Byte)
マップブロック 160x0600 8000 (2k Byte)
0x0600 4000
(16k Byte)
タイルブロック 1 マップブロック 150x0600 7800 (2k Byte)
マップブロック 140x0600 7000 (2k Byte)
マップブロック 130x0600 6800 (2k Byte)
マップブロック 120x0600 6000 (2k Byte)
マップブロック 110x0600 5800 (2k Byte)
マップブロック 100x0600 5000 (2k Byte)
マップブロック 90x0600 4800 (2k Byte)
マップブロック 80x0600 4000 (2k Byte)
0x0600 0000
(16k Byte)
タイルブロック 0 マップブロック 70x0600 3800 (2k Byte)
マップブロック 60x0600 3000 (2k Byte)
マップブロック 50x0600 2800 (2k Byte)
マップブロック 40x0600 2000 (2k Byte)
マップブロック 30x0600 1800 (2k Byte)
マップブロック 20x0600 1000 (2k Byte)
マップブロック 10x0600 0800 (2k Byte)
マップブロック 00x0600 0000 (2k Byte)
0x0500 0000
(512 Byte)
背景パレットデータ (15bit BGR)
※ 0x0600 0000 からの各メモリブロックは、タイルデータかマップデータのどちらかに割り当てられる。

cubeLCDコントロールレジスタ

LCD表示モードの指定は、アドレス 0x0400 0000 のLCDコントロールレジスタで行います。また、同時に背景(BG0〜BG3)かオブジェクト(背景の上に表示するキャラクタ)かも指定します。

LCD control register

LCDコントロールレジスタの設定例
STATEHEXBinaryDescription
Default0x00800000 0000 1000 0000bit7=1:強制白塗り
MODE 30x04030000 0100 0000 0011bit10:BG2の背景を使用
bit0-2:モード3
MODE 00x01000000 0001 0000 0000bit8:BG0の背景を使用
bit0-2:モード0
※背景は0〜3まであるが、MODE 3ではBG2のみ使用可

LCDコントロールレジスタへの書き込み方法

定数・マクロ定義
typedef	unsigned	short	hword;		// 16bit integer

#define	gba_reg(p)	*((volatile hword*) p)	// load to conrtol register
#define	IO_BASE		0x0400 000		// IO base address
#define	LCD_CTL		(IO_base + 0)		// LCD control register address

#define LCD_BG0		0x0100			// Enable BG0 plane
#define LCD_BG2		0x0400			// Enable BG2 plane
#define LCD_MODE0	0			// LCD mode 0
#define LCD_MODE3	3			// LCD mode 3

実行文の例
gba_reg(LCD_CTL) = LCD_BG2 | LCD_MODE3;	// MODE 3 + BG2 ON

上の実行文は gba_reg(p) マクロを利用して、*((volatile hword*) 0x04000000) = 0x0400|0x0003; に置き換えられます。ここで、
0x0400 ==0000 0100 0000 0000
0x0003 ==0000 0000 0000 0011
であることから、アドレス 0x0400 0000 のコントロールレジスタに、0000 0100 0000 0011 (MODE 3) が書き込まれます。このマクロの仕組みは、下図のように汎用レジスタを介したメモリ番地の参照となっており、C言語によるハードウエア制御の基本形ですので覚えておいてください。

LCD control register reference

cube背景コントロールレジスタ

MODE 0 では、タイルやマップ(タイルを並べて作った背景画面)の使い方を指定するため、背景コントロールレジスタを設定します。背景はBG0〜BG3の4枚があり、それぞれに対応する背景コントロールレジスタがあります。

Background control register

仮想スクリーンサイズの定義
bit 14-bit 15Virtual Screen Size
00256x256pix (32x32 tiles)
01512x256pix (64x32 tiles)
10256x512pix (32x64 tiles)
11512x512pix (64x64 tiles)

カラーモード
bit 14-bit 15Virtual Screen Size
016色x16パレット
1256色x1パレット

表示優先順位
bit 0-bit 1Background priority
通常 BG0-BG3全て 00 で使用BG0 > BG1 > BG2 > BG3

設定例
STATEHEXBinaryDescription
Default0x00000000 0000 0000 0000仮想スクリーン32x32tile, カラー16色
example 10x1C800001 1100 1000 0000仮想スクリーン32x32tile, カラー256色,
タイルブロック0を使用, マップブロック28 (11100)を使用

背景コントロールレジスタへの書き込み方法は、LCDコントロールレジスタへの書き込みの場合と全く同じです。

定数・マクロ定義
typedef	unsigned	short	hword;		// 16bit integer

#define	gba_reg(p)	*((volatile hword*) p)	// load to conrtol register
#define	IO_BASE		0x0400 000		// IO base address
#define	LCD_CTL		(IO_base + 0)		// LCD control register address
#define BG0_CTL		(IO_base + 8)		// BG0 control register address

#define LCD_BG0		0x0100			// Enable BG0 plane
#define LCD_BG2		0x0400			// Enable BG2 plane
#define LCD_MODE0	0			// LCD mode 0
#define LCD_MODE3	3			// LCD mode 3
#define LCD_BGTILE(n)	(n << 2)		// BG tile base block
#define LCD_BGMAP(n)	(n << 8)		// BG map base block
#define LCD_SIZE00	0x0000			// BG size 32x32tiles
#define LCD_COLOR256	0x0080			// BG 256color x 1 palette

実行文の例
gba_reg(BG0_CTL) = 	LCD_SIZE00 |		// 32x32tile
			LCD_COLOR256 |		// 256color
			LCD_BGTILE(0) |		// Tile block 0
			LCD_BGMAP(28);		// Map block 28
gba_reg(LCD_CTL) = 	LCD_MODE0 | LCD_BG0;	// MODE 0 + BG0 ON

cubeオフセットレジスタ

LCDは、デフォルトで仮想画面の左上部分(x=0〜240pix, y=0〜160pix)を表示しています。オフセットレジスタに、LCD表示部の左上角の座標(0〜511 = 9bit)を書き込むと、LCD表示部が、仮想画面上の指定座標へ移動します。

LCD offset register

cubeスプライト(オブジェクト)

GBA には、ビットマップやタイルによる背景の上へ、オブジェクトを描く機能(所謂、スプライト)があります。オブジェクトのサイズは、8x8pix〜64x64pix までです。背景用のVRAMフレームバッファとは独立したメモリ領域を割り当ててあり、オブジェクトをピクセル単位で高速に移動・回転・拡大することができます。

1.スプライトのデータ構成

Object

2.スプライトのメモリマップ

Memory map for sprites

3.キャラクタ番号の割り当て

Assignment of character number

4.Object Attribute Memory (OAM)

OAM address map

Object attributes

サイズ (Attribute 1)
00011011
形状
(Attribute 0)
008x8pix
16x16pix
32x32pix
64x64pix
0116x8pix
32x8pix
32x16pix
64x32pix
108x16pix
8x32pix
16x32pix
32x64pix

cubeキーステータスレジスタ

GBA は、L, R, A, B, Start, Select, カーソルキー(上、下、左、右)の10個の入力キーを持っています。各キーの ON/OFF 状態は、キーステータスレジスタから読み取ることができます。

Key status register

cubeタイマー

GBA は、4個のタイマーを持っています。各タイマーは、システムクロック数をカウントする16bitカウンタとして動作します。タイマーの各種モード設定は、タイマー制御レジスタで行います。また、タイマーのカウント初期値 (16bit) の設定及び現在のカウント値の読み出しは、タイマー設定レジスタにより行います。プリスケーラ値は、システムクロック(16.78MHz = 1024Hz)を何クロック毎にカウントアップするか指定します。カスケードスイッチは、タイマーのオーバフロー(桁上がり)をカスケード接続して長時間のカウントを可能にします。この場合は、プリスケーラは無効です。また、オーバフローにより割り込み発生を行うかどうかも指定できます。

タイマーの構造:
Timer

タイマー制御レジスタ:
Timer control register

制御レジスタの設定ビット
カウントイネーブル割り込み発生カスケードスイッチ
0タイマー動作0OFF0OFF
1タイマー停止1ON1ON

プリスケーラと時間の関係(システムクロック 16.78MHz)
プリスケーラ (2bit)カウントサイクル1サイクル時間16bit カウント時間
00(デフォルト)1 clock60ns3.9ms
0164 clock3.8us250ms
10256 clock15.3us1s
111024 clock61us4s

タイマー設定レジスタ:
Timer counter


お問い合わせはこちらまで: kitagawa@is.t.kanazawa-u.ac.jp

(c) Kanazawa Univ., 2004