OAMは0x0700_0000-0700_03ff
にあります。 サイズは1KBです。
このメモリ領域には、128個のOBJのそれぞれの位置、サイズ、色深度などのスプライトの使用に必要な属性(アトリビュート)が格納されています。さらに、32個のOBJに対する伸縮回転パラメータが格納されています。
OAMはOBJ0
からOBJ127
まで分けられています。各エントリは2バイトのプロパティが3つあるので6バイトですが、間にOBJの伸縮回転パラメータ(ParamN
)が格納されています。これらはOAMのOBJとは結びついていません。
Offset | Memory
------------------
0 +--------+
| OBJ0 |
6 | ------ |
| Param0 |
8 | ------ |
| OBJ1 |
14 | ------ |
| Param1 |
16 | ------ |
| OBJ2 |
22 | ------ |
| ... |
| ... |
| ... |
1024 +--------+
bit | 内容 |
---|---|
0-7 | Y座標 (0-255) |
8 | 伸縮回転フラグ(0=無効, 1=有効) |
9 | サイズ2倍フラグ(伸縮回転フラグが1のとき, 1=2倍) or OBJ非表示フラグ(伸縮回転フラグが0のとき, 1=非表示) |
10-11 | OBJモード (0=通常, 1=半透明, 2=OBJウィンドウ, 3=指定不可) |
12 | OBJモザイク (0=無効, 1=有効) |
13 | カラーパレット (0=16色/16パレット, 1=256色/1パレット) |
14-15 | OBJ Shape (0=正方形, 1=横長, 2=縦長, 3=指定不可) |
注意: 大きいOBJ(Y方向のサイズがサイズ2倍フラグによって128px)が Y>128 に存在するとき Y>-128として扱われます。 つまりOBJは画面の上の方に表示され、下の方には表示されません。
伸縮回転が有効(Attr0のbit8が1)
bit | 内容 |
---|---|
0-8 | X座標 (0-511) |
9-13 | 伸縮回転パラメータ番号 (0-31) |
14-15 | OBJサイズ (0-3, Attr0のOBJ Shapeに依存) |
伸縮回転が無効(Attr0のbit8が0)
bit | 内容 |
---|---|
0-8 | X座標 (0-511) |
9-11 | 使用しない |
12 | X反転 |
13 | Y反転 |
14-15 | OBJサイズ (0-3, Attr0のOBJ Shapeに依存) |
OBJサイズ(bit14-15)
OBJサイズ | 正方形 | 横長 | 縦長 |
---|---|---|---|
0 | 8x8 | 16x8 | 8x16 |
1 | 16x16 | 32x8 | 8x32 |
2 | 32x32 | 32x16 | 16x32 |
3 | 64x64 | 64x32 | 32x64 |
bit | 内容 |
---|---|
0-9 | タイル番号 (0-1023) |
10-11 | 対BG優先度 (0-3; 0=Highest) |
12-15 | パレット番号 (0-15) (256色/1パレットのときは使用しない) |
OBJモード(Attr0のbit10-11)は
- 通常(0)
- 半透明(1)
- OBJウィンドウ(2)
のどれかになります。
半透明モードのとき、OBJはBLDCNTレジスタの値に関係なくアルファブレンドの第1ターゲットとして使われます。詳しくはブレンドを参照してください。
OBJウィンドウモードのときは、OBJは表示されず、代わりに透明でないピクセルはOBJウィンドウのマスクとして使用されます。詳しくはLCD制御レジスタとWINOUTを見てください。
Attr2のbit0-9で指定するタイル番号は通常0-1023まで指定可能ですが、場合によっては制限が加わる時があります。
- 256色/1パレットのとき: 偶数のタイル番号のみを使用することができ、タイル番号の下位ビットは0にする必要があります。 2次元マッピングモード(後述)では、このビットは完全に無視されます。
- BGモード3-5のときつまりビットマップモードのとき: タイル番号は512から1023までしか指定できません。これはOBJの下位16KBがフレームバッファとして使われているからです。0-511を指定したときは無視され非表示になります。
Attr2の対BG優先度がBG制御レジスタのbit0-1で指定するBGレイヤの優先度と同じ場合、OBJのほうが優先され、そのBGレイヤの上に表示されます。
OBJ同士の優先度と混同しないように注意してください。
例として、OBJ0の対BG優先度=1 で OBJ1の対BG優先度=0 の場合を考えてみましょう
1行に同時に表示可能なスプライトの数のところでも述べたようにOBJ同士ではOBJ0が最も優先度が高いです。
なのでOBJ同士が重なった時は OBJ0 > OBJ1 ですが、対BG優先度を見ると BG0 > OBJ0、OBJ1 > BG0となり奇妙なことになってしまいます。
上で述べたようにOAMの各エントリの間には空白の領域がありました。 これらの 128×16bit はOBJの伸縮回転パラメータを格納するのに使われます。
4つの16bitパラメータ(PA,PB,PC,PD)で各OBJの伸縮回転に関するプロパティを定義しています。
-1st Group: PA=07000006, PB=0700000E, PC=07000016, PD=0700001E
-2nd Group: PA=07000026, PB=0700002E, PC=07000036, PD=0700003E
-...
のように配置されています。
伸縮回転パラメータ用のメモリ領域は全部で 128×16bitであり、1つのOBJにつき4×16bitなので全部で 32個のOBJ の伸縮回転パラメータを持つことができます。
伸縮回転を使用する各OBJは、上記の32のパラメータグループの中から任意のものを選択することができます。
これはアトリビュート1のbit9-13でOBJと紐づけられます。
個別のPA,PB,PC,PD値の意味はBGの場合と同じです。
OBJの伸縮回転時の基準点はOBJの座標に等しくなります。
またOBJを回転させる際はOBJの真ん中を軸として回転させることになります。例えば 8×32の場合、(4, 16)
が軸になって回転します。
これは伸縮回転が有効なOBJに対するフラグです。
- フラグが0: スプライトを回転させて、(回転していない場合の)通常サイズの長方形の領域の内側に表示します。回転されたスプライトの端がその領域の外に出てしまうと、その端は見えなくなってしまいます。
- フラグが1: スプライトを回転させた後,(回転していない場合の)2倍のサイズのの矩形領域の内側に表示します.これにより,回転したスプライトの端が通常のサイズの範囲外に出てしまっても,スプライトの端が見えるようになります。
ただし、例えば8x32ピクセルのスプライトを90度回転させた場合、サイズ2倍の領域は16×64と32に満たないので、スプライトの一部が切り取られてしまいます。