ホームに戻る
GBAメモ
以下のサイトを見て書いた覚え書きです。
http://www.work.de/nocash/gbatek.htm
CPU
ARM ARM7TDMI 32bit RISC CPU, 16.78MHz, 32bit
内部メモリ
BIOS ROM 16 KBytes
作業用 RAM 288 KBytes (32K in-chip + 256K on-board)
VRAM 96 KBytes
背景モード 0,1,2
06000000-0600FFFF 64 KBytes タイル、マップ用
06010000-06017FFF 32 KBytes スプライト用
背景モード 3
06000000-06013FFF 80 KBytes ビットマップ用 (使用するのは 75 KBytes)
06014000-06017FFF 16 KBytes スプライト用
背景モード 4,5
06000000-06009FFF 40 KBytes フレーム 0 ビットマップ用
0600A000-06013FFF 40 KBytes フレーム 1 ビットマップ用
06014000-06017FFF 16 KBytes スプライト用
OAM 1 KByte (128 OBJs 3x16bit, 32 OBJ-Rotation/Scalings 4x16bit)
07000000-070003FF 1 KByte OAM スプライト用
Palette RAM 1 KByte (256 色 背景用、256 色 スプライト用)
05000000-050001FF - 背景パレット (512 Bytes, 256 色)
05000200-050003FF - スプライトパレット (512 Bytes, 256 色)
ビデオ
ディスプレイ 240x160 ピクセル (2.9 inch TFT color LCD display)
水平
可視領域 240 ドット, 57.221 us, CPU 960 cycles - 78%
水平ブランク 68 ドット, 16.212 us, CPU 272 cycles - 22%
合計 308 ドット, 73.433 us, CPU 1232 cycles - 周波数 13.620 kHz
垂直
可視領域 160 ライン, 11.749 ms, CPU 197120 cycles - 70%
垂直ブランク 68 ライン, 4.994 ms, CPU 83776 cycles - 30%
合計 228 ライン, 16.743 ms, CPU 280896 cycles - 周波数 59.737 Hz
背景レイヤー 最大 4 背景
背景タイプ タイル/マップ, もしくは ビットマップ
色数 256 色, 16 色/16 パレット, 32768 色
スプライト 256 色, 16 色/16 パレット
スプライトサイズ 12 種類 (最小 8x8 最大 64x64 ドット)
スプライト/画面 最大 128 個
スプライト/ライン 最大 128 個 (8x8 ドット)
表示優先度 スプライト: 0-127, スプライト/背景: 0-3, 背景: 0-3
エフェクト 回転/拡大, 半透過, ブライター/ダーカー, モザイク, ウィンドウ
サウンド
アナログ 4 チャンネル
デジタル 2 DMAサウンドチャンネル
出力 外部スピーカー、ヘッドホン
キー
ゲームパッド 4 方向キー, 6 ボタン
通信
通信ポート 複数通信モード, 4 プレイヤー通信, 1 カードリッヂプレイ
外部メモリ
ゲームパック 最大 32MB ROM or flash ROM + 最大 64K SRAM
電源
バッテリー 15 時間連続使用
アダプター 3.3V 直流
0x04000000 ディスプレイコントロール
0-2 背景モード (0-5=背景モード 0-5, 6-7=使用しない)
3 使用しない
4 表示フレームの選択 (0-1=背景 0 か 1) (背景モード 4,5 のみ)
5 水平ブランク間アクセス許可 (1=水平ブランク中はスプライト処理をしない)
6 スプライトの配置方法 (0=2次元, 1=1次元)
7 強制ブランク(1=強制白ブランク)
8 背景 0 の表示 (0=表示しない, 1=表示する)
9 背景 1 の表示 (0=表示しない, 1=表示する)
10 背景 2 の表示 (0=表示しない, 1=表示する)
11 背景 3 の表示 (0=表示しない, 1=表示する)
12 スプライトの表示 (0=表示しない, 1=表示する)
13 ウィンドウ 0 の使用 (0=使用しない, 1=使用する)
14 ウィンドウ 1 の使用 (0=使用しない, 1=使用する)
15 スプライトウィンドウの使用 (0=使用しない, 1=使用する)
背景モード
モード 回転/拡大 背景 Size タイル数 色数 機能
0 No 0123 256x256..512x515 1024 16/16..256/1 SFMABP
1 Mixed 012- (背景 0 と 1 はモード 1, 背景 2 はモード 2)
2 Yes --23 128x128..1024x1024 256 256/1 S-MABP
3 Yes --?- 240x160 1 32768 --MABP
4 Yes --?? 240x160 2 256/1 --MABP
5 Yes --?? 160x128 2 32768 --MABP
S:スクロール, F:反転, M:モザイク, A:半透過, B:ブライト, P:優先順位指定
0x04000004 ディスプレイブランク
0 垂直ブランクフラグ (読み込みのみ) (1=垂直ブランク中)
1 水平ブランクフラグ (読み込みのみ) (1=水平ブランク中)
2 垂直カウントフラグ (読み込みのみ) (1=カウントが一致)
3 垂直割り込み (1=許可)
4 水平割り込み (1=許可)
5 垂直カウント使用 (1=許可)
6 使用しない
8-15 垂直カウントを設定 (0-227)
垂直カウントは走査ラインが一致する行を指定する
0x04000006 垂直カウント
0-7 現在の走査ライン (読み込みのみ) (0-227)
8-15 使用しない
0x04000008 背景 1
0x0400000A 背景 2
0x0400000C 背景 3
0x0400000E 背景 4
0-1 表示優先度 (0-3, 0=最優先)
2-3 タイルデータブロック (0-3, 16 KBytes 単位) (タイル背景のみ)
4-5 使用しない (0 であること)
6 モザイク (0=使用しない, 1=使用する)
7 色数/パレット (0=16色/16パレット, 1=256色/1パレット)
8-12 マップブロック (0-31, 2 KBytes 単位) (タイル背景のみ)
13 背景繰り返し (0=繰り返さない, 1=繰り返す 回転/拡大背景のみ)
14-15 背景サイズ (0-3: 次を参照)
タイルモード 回転モード
0 256x256 (2K) 128x128 (256 bytes)
1 512x256 (4K) 256x256 (1K)
2 256x512 (4K) 512x512 (4K)
3 512x512 (8K) 1024x1024 (16K)
0x04000010 背景 0 X 方向スクロール (タイルモード)
0x04000012 背景 0 Y 方向スクロール (タイルモード)
0x04000014 背景 1 X 方向スクロール (タイルモード)
0x04000016 背景 1 Y 方向スクロール (タイルモード)
0x04000018 背景 2 X 方向スクロール (タイルモード)
0x0400001A 背景 2 Y 方向スクロール (タイルモード)
0x0400001C 背景 3 X 方向スクロール (タイルモード)
0x0400001E 背景 3 Y 方向スクロール (タイルモード)
0-8 スクロール値 (0-511)
9-15 使用しない
X 方向は +1 で左へスクロール
Y 方向は +1 で上へスクロール
0x04000020 背景 2 の 水平ラインの傾き dx (回転モード)
0x04000020 背景 2 の 垂直ラインの傾き dmx (回転モード)
0x04000020 背景 2 の 水平ラインの傾き dy (回転モード)
0x04000020 背景 2 の 垂直ラインの傾き dmy (回転モード)
0-15 符号付き固定小数 下位 8 ビットは小数点以下である
回転の中心はモニターの左上である。
水平方向の傾きは y = (dy/dx)x であり、
垂直方向は y = (dmy/dmy)x であるから、
反時計周りに45度の回転の場合 dy = 1, dx = 1, dmy = -1, dmx = 1
として y = (1/1)x と y = (-1/1)x の傾きとなる。
大きさに関しては x^2 * y^2 = z^2 に従い、
例えば1辺の長さが 100 のものは回転すると 141.42 となる。
0x04000028 背景 2 の X 方向スクロール 下位 16 ビット (回転モード)
0x0400002A 背景 2 の X 方向スクロール 上位 12 ビット (回転モード)
0x0400002C 背景 2 の Y 方向スクロール 下位 16 ビット (回転モード)
0x0400002E 背景 2 の Y 方向スクロール 上位 12 ビット (回転モード)
0-27 符号付き固定小数 下位 8 ビットは小数点以下である
28-31 使用しない
X 方向は +1 で左へスクロール
Y 方向は +1 で上へスクロール
0x04000030 背景 3 の 水平ラインの傾き dx (回転モード)
0x04000030 背景 3 の 垂直ラインの傾き dmx (回転モード)
0x04000030 背景 3 の 水平ラインの傾き dy (回転モード)
0x04000030 背景 3 の 垂直ラインの傾き dmy (回転モード)
0x04000038 背景 3 の X 方向スクロール 下位 16 ビット (回転モード)
0x0400003A 背景 3 の X 方向スクロール 上位 12 ビット (回転モード)
0x0400003C 背景 3 の Y 方向スクロール 下位 16 ビット (回転モード)
0x0400003E 背景 3 の Y 方向スクロール 上位 12 ビット (回転モード)
説明は背景 2 の場合と同じ
0x04000040 ウィンドウ 0 水平方向
0x04000042 ウィンドウ 1 水平方向
0-7 X2, 右端座標
8-15 X1, 左端座標
0x04000044 ウィンドウ 0 垂直方向
0x04000046 ウィンドウ 1 垂直方向
0-7 Y2, 下部座標
8-15 Y1, 上部座標
0x04000048 ウィンドウ内部設定
0-3 ウィンドウ 0 BG0-BG3 表示フラグ (0=非表示, 1=表示)
4 ウィンドウ 0 スプライト表示フラグ (0=非表示, 1=表示)
5 ウィンドウ 0 エフェクト有効フラグ (0=無効, 1=有効)
6-7 使用しない
8-11 ウィンドウ 1 BG0-BG3 表示フラグ (0=非表示, 1=表示)
12 ウィンドウ 1 スプライト表示フラグ (0=非表示, 1=表示)
13 ウィンドウ 1 エフェクト有効フラグ (0=無効, 1=有効)
14-15 使用しない
0x0400004A ウィンドウ外部設定、スプライト内部設定
0-3 ウィンドウ外部 BG0-BG3 表示フラグ (0=非表示, 1=表示)
4 ウィンドウ外部 スプライト表示フラグ (0=非表示, 1=表示)
5 ウィンドウ外部 エフェクト有効フラグ (0=無効, 1=有効)
6-7 使用しない
8-11 スプライトウィンドウ BG0-BG3 表示フラグ (0=非表示, 1=表示)
12 スプライトウィンドウ スプライト表示フラグ (0=非表示, 1=表示)
13 スプライトウィンドウ エフェクト有効フラグ (0=無効, 1=有効)
14-15
0x0400004C モザイク
0-3 背景モザイク水平サイズ
4-7 背景モザイク垂直サイズ
8-11 スプライトモザイク水平サイズ
12-15 スプライトモザイク垂直サイズ
例えばサイズを 5 とすると、0-5 のピクセルが 0 のピクセルと同色になる。
0x04000050 カラーエフェクト
0 1st 背景 0
1 1st 背景 1
2 1st 背景 2
3 1st 背景 3
4 1st スプライト
5 1st 最下面
6-7 エフェクト選択
0 = なし
1 = 半透過
2 = 徐々に白く
3 = 徐々に黒く
8 2nd 背景 0
9 2nd 背景 1
10 2nd 背景 2
11 2nd 背景 3
12 2nd スプライト
13 2nd 最下面
14-15 使用しない
0x04000052 半透過
0-4 1st の透過率 (0..16 = 0/16..16/16, 17..31=16/16)
5-7 使用しない
8-12 2nd の透過率 (0..16 = 0/16..16/16, 17..31=16/16)
13-15 使用しない
1st が 2nd よりも上部にくること。
最上部の 1st がエフェクト対象となり、
2nd は 1st のすぐ下のものがエフェクト対象となる。
1st と 1st が重なる場合はエフェクト無効となり
上にある 1st の色がそのまま表示される。
表示される色 = 1st の色 * 1st の透過率 + 2nd の色 * 2nd の透過率
(表示される色成分が 31 を超える場合は 31 となる)
0x04000054 徐々に白く(黒く)
0-4 変化率 (0..16 = 0/16..16/16, 17..31=16/16)
5-15 使用しない
表示される色 = 1st の色 + (31 - 1st の色) * 変化率 (徐々に白く)
表示される色 = 1st の色 + (1st の色) * 変化率 (徐々に黒く)
マップデータ
タイルモード
0-9 タイル番号 (0-1023)
10 水平反転 (0=反転しない, 1=反転する)
11 垂直反転 (0=反転しない, 1=反転する)
12-15 パレット番号 (0-15) (256色/1パレットでは使用しない)
回転/拡大モード
0-7 タイル番号 (0-255)
色データ
0-4 赤成分 (0-31)
5-9 緑成分 (0-31)
10-14 青成分 (0-31)
15 使用しない
パレット 0 は透過色である。
ただし、あるドットに透明色しか描画されないときには、
最終的にパレット 0 の色が選択され塗られる。
スプライトデータ
1つめのスプライトデータは 07000000 から 6 バイト
2つめのスプライトデータは 07000008 から 6 バイト
3つめのスプライトデータは 07000010 から 6 バイト
以降、続く・・・。
このままだと隙間が 2 バイトずつできるようだが、
これは隙間を4つ使って1つの回転データとして利用する。
1つめの回転データ dx=07000006, dmx=0700000E, dy=07000016, dmy=0700001E
2つめの回転データ dx=07000026, dmx=0700002E, dy=07000036, dmy=0700003E
以降、続く・・・。
回転はスプライトを中心に回転する。
ただしもともとの表示領域を出ることはできない。
例えば拡大無しで45度回転したとしても、
角が元の四角領域を出てしまった場合、その角は欠けてしまう。
2倍フラグを用いれば2倍の領域まで表示する。
最初の 2 バイト
0-7 Y座標 (0-255)
8 回転/拡大フラグ (0=オフ, 1=オン)
9 倍サイズフラグ (0=通常, 1=2倍) (回転/拡大フラグが 1 のとき)
9 表示フラグ (0=表示する, 1=表示しない) (回転/拡大フラグが 0 のとき)
10-11 スプライトモード (0=通常, 1=半透過, 2=ウィンドウ, 3=使用しない)
半透過はスプライトを 1st として半透過するモード
ウィンドウはスプライトを表示せず 0 でないビットをマスクするモード
12 スプライトモザイク (0=オフ, 1=オン)
13 パレット選択 (0=16色/16パレット, 1=256色/1パレット)
14-15 スプライトの形状 (0=正方形,1=横長,2=縦長,3=使用しない)
2番目の 2 バイト
0-8 X座標 (0-255)
9-13 回転データの選択 (0-31) (回転/拡大フラグが 1 のとき)
9-11 使用しない (回転/拡大フラグが 0 のとき)
12 水平反転 (0=反転しない, 1=反転する)
13 垂直反転 (0=反転しない, 1=反転する)
14-15 スプライトのサイズ (0-3, 下を参照)
サイズ 正方形 横長 縦長
0 8x8 16x8 8x16
1 16x16 32x8 8x32
2 32x32 32x16 16x32
3 64x64 64x32 32x64
3番目の 2 バイト
0-9 タイル番号 (0-1023)
10-11 背景に対する優先度 (0-3; 0=最優先)
12-15 パレット番号 (0-15) (256色/1パレットでは使用しない)
スプライトのタイルの配置方法は1次元で 1024*1 2次元で 32*32 と、
ディスプレイの設定のところで選択が可能である。
例えば1次元では 2*2 のタイルは 0x00 0x01 0x02 0x03 となるが
2次元では 0x00 0x01 0x10 0x11 となるので注意が必要である。
サウンド
0x04000060 チャンネル 1 スウィープ
0-2 スウィープシフト (n=0-7) (下の式を参照)
3 スウィープは増加か減衰か? (0=増加, 1=減衰)
4-6 スィープ時間 (0:スウィープ無効 1-7:1..7 * 7.8ms)
7-15 使用しない
X(t) = X(t-1) +/- X(t-1)/2^n (X は周波数、t は時間、n は上を参照)
0x04000062 チャンネル 1 トーン
0-5 音の長さ (64-n)/256s (0-63)
6-7 デューティー比 (0-3, 下を参照)
8-10 エンベロープ変化率 n/64s (0:エンベロープ無し、n:1-7)
11 エンベロープ変化 (0=減衰, 1=増加)
12-15 エンベロープの初期音量 (0:音なし、1-15)
デューティー比:
0: 12.5% ( -_______-_______-_______ )
1: 25% ( --______--______--______ )
2: 50% ( ----____----____----____ ) (通常)
3: 75% ( ------__------__------__ )
0x04000064 チャンネル 1 音色
0-10 周波数 131072/(2048-n)Hz (0-2047)
11-13 使用しない
14 音の長さフラグ (1=トーンの長さの設定で音を止める)
15 初期化 (1=音を再開)
0x04000068 チャンネル 2 トーン
0x0400006C チャンネル 2 音色
スウィープが使えないこと以外はチャンネル 1 と同じ
0x04000070 チャンネル 3 波形再生
0-4 使用しない
5 波形領域 (0=2 * 4bit * 32samples, 1=4bit * 64samples)
6 バンク切り替えスイッチ (0-1)
7 チャンネル 3 スイッチ (0=ストップ, 1=再生)
8-15 使用しない
波形領域はスイッチでバンクの切り替えが可能。
選択されている現在のバンクが再生の対象となり、
もう一方のバンクは読み書きの対象となる。
再生中の読み書きは推奨されない。
0x04000072 チャンネル 3 音の長さと音量
0-7 音の長さ (256-n)/256s (0-255)
8-12 使用しない
13-14 音量 (0=音なし, 1=100%, 2=50%, 3=25%)
15 音量 (0=13-14 の設定を使用, 1=13-14 に関わらず 75%)
0x04000074 チャンネル 3 音色
0-10 周波数 131072/(2048-n) Hz (0-2047)
11-13 使用しない
14 長さフラグ (1=音の長さの設定で音を止める)
15 初期化 (1=音を再開)
0x04000090 チャンネル 3 波形 0 下位
0x04000092 チャンネル 3 波形 0 上位
0x04000094 チャンネル 3 波形 1 下位
0x04000096 チャンネル 3 波形 1 上位
0x04000098 チャンネル 3 波形 2 下位
0x0400009A チャンネル 3 波形 2 上位
0x0400009C チャンネル 3 波形 3 下位
0x0400009E チャンネル 3 波形 3 上位
周波数の計算をする場合
FFFFFFFF00000000FFFFFFFF00000000
以上の波形で 131072/(2048-n) Hz となる
FFFFFFFFFFFFFFFF0000000000000000
この波形では 65536/(2048-n) Hz である
0x04000078 チャンネル 4 ノイズの長さとエンベロープ
0-5 音の長さ (64-n)/256s (0-63)
6-7 使用しない
8-10 エンベロープ時間 n/64s (0:エンベロープなし, n:1-7)
11 エンベロープ方向 (0=減衰, 1=増加)
12-15 エンベローブの音量 (0:音なし, 1-15)
0x0400007C チャンネル 4 音色
0-2 周波数 下式を参照 (r)
3 ? (0=15 bits, 1=7 bits 1 ではよりトーンに近くなる)
4-7 下式を参照 (s)
8-13 使用しない
14 長さフラグ (1=音の長さの設定で音を止める)
15 初期化 (1=音を再開)
Frequency = 524288 Hz / r / 2^(s+1) ;r=0 であれば r=0.5 に置き換える
0x04000080 サウンド チャンネル 1-4 コントロール
0-2 チャンネル 1-4 の右音量 (0-7)
3 使用しない
4-6 チャンネル 1-4 の左音量 (0-7)
7 使用しない
8-11 チャンネル 1-4 のサウンド有効フラグ 右 (0=無効, 1=有効)
12-15 チャンネル 1-4 のサウンド有効フラグ 左 (0=無効, 1=有効)
0x04000082 サウンド チャンネル A, B コントロール
0-1 チャンネル 1-4 音量 (0=25%, 1=50%, 2=100%, 3=使用しない)
2 チャンネル A 音量 (0=50%, 1=100%)
3 チャンネル B 音量 (0=50%, 1=100%)
4-7 使用しない
8 チャンネル A 有効フラグ 右 (0=無効, 1=有効)
9 チャンネル A 有効フラグ 左 (0=無効, 1=有効)
10 チャンネル A タイマ選択 (0=タイマ 0, 1=タイマ 1)
11 チャンネル A FIFO リセット (1=リセット)
12 チャンネル B 有効フラグ 右 (0=無効, 1=有効)
13 チャンネル B 有効フラグ 左 (0=無効, 1=有効)
14 チャンネル B タイマ選択 (0=タイマ 0, 1=タイマ 1)
15 チャンネル B FIFO リセット (1=リセット)
0x04000084 サウンドスイッチ
0 チャンネル 1 使用フラグ (1=使用中 読み込みのみ)
1 チャンネル 2 使用フラグ (1=使用中 読み込みのみ)
2 チャンネル 3 使用フラグ (1=使用中 読み込みのみ)
3 チャンネル 4 使用フラグ (1=使用中 読み込みのみ)
4-6 使用しない
7 サウンドスイッチ (0: すべてのサウンドをオフ)
8-15 使用しない
0x04000088 サウンドPWMコントロール
0-9 バイアスレベル (初期値=200h, 通常は変更の必要がない)
10-13 使用しない
14-15 下を参照 (初期値=0, 0-3)
0 9bit / 32.768kHz (チャンネル A,B に最適)
1 8bit / 65.536kHz
2 7bit / 131.072kHz
3 6bit / 262.144kHz (チャンネル 1-4 に最適)
0x040000A0 チャンネル A FIFOバッファ 0, 1
0x040000A2 チャンネル A FIFOバッファ 2, 3
0x040000A4 チャンネル B FIFOバッファ 0, 1
0x040000A6 チャンネル B FIFOバッファ 2, 3
DMA転送による波形再生が2チャンネル。
1サンプルは符号あり 8 ビット値、バッファは FIFO である。
チャンネルAはタイマー0(もしくは1)とDMA1を使用する。
チャンネルBはタイマー1(もしくは0)とDMA2を使用する。
DMA転送元は波形データを転送先は FIFO アドレスを指定する。
タイマーを開始すれば自動的に転送が開始される。
タイマーの1カウントで1つの 8 ビット値を FIFO に転送する。
再生位置はタイマーかDMAの割り込みでカウントできる。
DMA
0x040000B0, 0x040000B2 DMA 0 転送元アドレス (内部メモリ)
0x040000BC, 0x040000BE DMA 1 転送元アドレス (任意メモリ)
0x040000C8, 0x040000CA DMA 2 転送元アドレス (任意メモリ)
0x040000D4, 0x040000D6 DMA 3 転送元アドレス (任意メモリ)
0x040000B4, 0x040000B6 DMA 0 転送先アドレス (内部メモリ)
0x040000C0, 0x040000C2 DMA 1 転送先アドレス (内部メモリ)
0x040000CC, 0x040000CE DMA 2 転送先アドレス (内部メモリ)
0x040000D8, 0x040000DA DMA 3 転送先アドレス (任意メモリ)
0x040000B8 DMA 0 カウント (14 bit, 1..0x4000)
0x040000C4 DMA 1 カウント (14 bit, 1..0x4000)
0x040000D0 DMA 2 カウント (14 bit, 1..0x4000)
0x040000DC DMA 3 カウント (16 bit, 1..0x10000)
0x040000BA DMA 0 コントロール (最優先, 水平ブランク時など)
0x040000C6 DMA 1 コントロール (サウンドなど)
0x040000D2 DMA 2 コントロール (サウンドなど)
0x040000DE DMA 3 コントロール (ゲームパック)
0-4 使用しない
5-6 転送先 (0=増加, 1=減少, 2=固定, 3=増加/リロード)
7-8 転送元 (0=増加, 1=減少, 2=固定, 3=使用しない)
9 DMAリピート (0=Off, 1=On) (ビット 11 が 1 なら 0 であるべき)
10 DMA転送幅 (0=16bit, 1=32bit)
11 ゲームパック DRQ (0=通常, 1=DRQ モード, DMA3 のみ)
12-13 DMAタイミング (0=すぐに, 1=垂直ブランク, 2=水平ブランク, 3=特殊)
14 割り込み (0=無効, 1=有効)
15 DMAスイッチ (0=オフ, 1=オン)
DMAタイミングの「特殊」はDMA 1 と 2 では FIFO バッファを指す。
DMA 3 では外部ハードウェアからのビデオキャプチャなど。
DMA 0 ではDMAタイミングで「特殊」を指定できない。
0x04000100 タイマー 0 カウンタ
0-15 ターマーの初期値 (0-65535)
0x04000102 タイマー 0 コントロール
0-1 タイマー間隔 (0=F/1, 1=F/64, 2=F/256, 3=F/1024, F = 16.78MHz)
2 カウントタイミング (0=自タイマー, 1=ひとつ下のタイマー)
3-5 使用しない
6 割り込み許可 (0=許可しない, 1=許可する)
7 タイマースイッチ (0=停止, 1=作動)
8-15 使用しない
タイマーはオーバーフローによって割り込みができる。
オーバーフロー後は初期値にリセットされる。
カウントタイミングにはひとつ下のタイマーがオーバーフローするたびに、
1つカウントするという方法が選択できる。
タイマー 0 には下のタイマーが存在せずこの方法は使えない。
タイマー 0 とタイマー 1 はサウンドで専用であるが、
もちろんその他の用途で使用しても差し支えない。
以下タイマーもタイマー 0 と使い方は同じである。
0x04000104 タイマー 1 カウンタ
0x04000106 タイマー 1 コントロール
0x04000108 タイマー 2 カウンタ
0x0400010A タイマー 2 コントロール
0x0400010C タイマー 3 カウンタ
0x0400010E タイマー 3 コントロール
0x04000130 キー入力
0 Aボタン (0=押す, 1=離す)
1 Bボタン (0=押す, 1=離す)
2 セレクトボタン (0=押す, 1=離す)
3 スタートボタン (0=押す, 1=離す)
4 右キー (0=押す, 1=離す)
5 左キー (0=押す, 1=離す)
6 上キー (0=押す, 1=離す)
7 下キー (0=押す, 1=離す)
8 Rボタン (0=押す, 1=離す)
9 Lボタン (0=押す, 1=離す)
10-15 使用しない
0x04000132 キー割り込み
0 Aボタン (0=無視, 1=選択)
1 Bボタン (0=無視, 1=選択)
2 セレクトボタン (0=無視, 1=選択)
3 スタートボタン (0=無視, 1=選択)
4 右キー (0=無視, 1=選択)
5 左キー (0=無視, 1=選択)
6 上キー (0=無視, 1=選択)
7 下キー (0=無視, 1=選択)
8 Rボタン (0=無視, 1=選択)
9 Lボタン (0=無視, 1=選択)
10-15 使用しない
14 割り込みフラグ (0=無効, 1=有効)
15 割り込み方式 (0=OR, 1=AND)
割り込み方式はORで通常のキー検出となるが、
ANDで同時押し検出が可能となる。
0x04000134 通信モード
0-14 使用しない
15 双方向モードでは必ず 0 であること
0x04000128 双方向通信コントロール
0 SC (0=外部, 1=内部)
1 SC 周波数 (0=256KHz, 1=2MHz)
2 SI を読む (0=Low, 1=High) (読み込みのみ)
3 SO をアクティブに (0=Low, 1=High)
4-6 使用しない
7 スタートビット (0=非アクティブ, 1=アクティブ)
8-11 使用しない
12 転送幅 (0=8bit, 1=32bit)
13 双方向モードでは 0 であること
14 割り込みフラグ (0=無効, 1=有効)
15 使用しない
マスターは内部、スレーブは外部クロックを選択。
マスターは SC 周波数を 256KHz とする。
スレーブの SC 周波数は設定しても無視される。
1Pをマスター、2Pをスレーブにつなぐ。
通信ケーブルは双方向通信の場合は「A」でなく「C」にすること。
マスターとスレーブの初期設定
1、0x04000134 のビット 15 をクリア。
2、スタートビットをクリア。
3、転送モード(8ビットか32ビットか)を選択。
4、マスターは内部、スレーブは外部クロックを選択。
5、スタートビットをセット。
この状態でマスターは SI=0 SO=1 スタートビット=0
この状態でスレーブは SI=1 SO=0 スタートビット=1
転送手順(1回の転送。以降これを繰り返す。)
1、送信するデータをセット。
2、スレーブのスタートビットを 1 に。
3、スレーブは準備ができたらSOを 0 に。
(このとき自動的にマスターのSIが 0 になる)
4、マスターのスタートビットを 1 に。
5、割り込みが起こるかスタートビットが 0 になる。
6、スレーブのSOを 1 に。
7、受信したデータを取り出す。
転送領域は8ビットと32ビットで異なる。
0x04000120 32ビット転送下位16ビット
0x04000122 32ビット転送上位16ビット
0x0400012A 8ビット転送(下位8ビットのみ使用)
0x04000200 割り込みスイッチ
0 垂直ブランク (0=無効)
1 水平ブランク (0=無効)
2 垂直カウント (0=無効)
3 タイマー 0 (0=無効)
4 タイマー 1 (0=無効)
5 タイマー 2 (0=無効)
6 タイマー 3 (0=無効)
7 通信 (0=無効)
8 DMA 0 (0=無効)
9 DMA 1 (0=無効)
10 DMA 2 (0=無効)
11 DMA 3 (0=無効)
12 キーパッド (0=無効)
13 ゲームパック (0=無効)
14-15 使用しない
各用途での割り込みフラグもオンにするのを忘れないこと。
0x04000202 割り込みスイッチ
0 垂直ブランク (1=割り込みあり)
1 水平ブランク (1=割り込みあり)
2 垂直カウント (1=割り込みあり)
3 タイマー 0 (1=割り込みあり)
4 タイマー 1 (1=割り込みあり)
5 タイマー 2 (1=割り込みあり)
6 タイマー 3 (1=割り込みあり)
7 通信 (1=割り込みあり)
8 DMA 0 (1=割り込みあり)
9 DMA 1 (1=割り込みあり)
10 DMA 2 (1=割り込みあり)
11 DMA 3 (1=割り込みあり)
12 キーパッド (1=割り込みあり)
13 ゲームパック (1=割り込みあり)
14-15 使用しない
0x04000208 割り込みマスター
0 割り込みマスター (0=無効, 1=有効)
1-15 使用しない
割り込み関数を用意し、
void IRQ_Handler();
以下のように登録する。
*(u32*)0x03007FFC = (u32)IRQ_Handler;