ホームに戻る
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;

inserted by FC2 system