Skip to content

Latest commit

 

History

History
152 lines (103 loc) · 7.09 KB

oam.md

File metadata and controls

152 lines (103 loc) · 7.09 KB

OAM - スプライト属性メモリ

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    +--------+

⌚️ OBJアトリビュート(OBJn)

OBJアトリビュート0 (R/W)

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は画面の上の方に表示され、下の方には表示されません。

OBJアトリビュート1 (R/W)

伸縮回転が有効(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

OBJアトリビュート2 (R/W)

bit 内容
0-9 タイル番号 (0-1023)
10-11 対BG優先度 (0-3; 0=Highest)
12-15 パレット番号 (0-15) (256色/1パレットのときは使用しない)

OBJモード

OBJモード(Attr0のbit10-11)は

  • 通常(0)
  • 半透明(1)
  • OBJウィンドウ(2)

のどれかになります。

半透明モードのとき、OBJはBLDCNTレジスタの値に関係なくアルファブレンドの第1ターゲットとして使われます。詳しくはブレンドを参照してください。

OBJウィンドウモードのときは、OBJは表示されず、代わりに透明でないピクセルはOBJウィンドウのマスクとして使用されます。詳しくはLCD制御レジスタWINOUTを見てください。

OBJのタイル番号

Attr2のbit0-9で指定するタイル番号は通常0-1023まで指定可能ですが、場合によっては制限が加わる時があります。

  • 256色/1パレットのとき: 偶数のタイル番号のみを使用することができ、タイル番号の下位ビットは0にする必要があります。 2次元マッピングモード(後述)では、このビットは完全に無視されます。
  • BGモード3-5のときつまりビットマップモードのとき: タイル番号は512から1023までしか指定できません。これはOBJの下位16KBがフレームバッファとして使われているからです。0-511を指定したときは無視され非表示になります。

対BG優先度

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となり奇妙なことになってしまいます。

💠 伸縮回転パラメータ(ParamN)

上で述べたようにOAMの各エントリの間には空白の領域がありました。 これらの 128×16bit はOBJの伸縮回転パラメータを格納するのに使われます。

PA,PB,PC,PD (R/W)

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)が軸になって回転します。

サイズ2倍フラグ (アトリビュート0のbit9)

これは伸縮回転が有効なOBJに対するフラグです。

  • フラグが0: スプライトを回転させて、(回転していない場合の)通常サイズの長方形の領域の内側に表示します。回転されたスプライトの端がその領域の外に出てしまうと、その端は見えなくなってしまいます。
  • フラグが1: スプライトを回転させた後,(回転していない場合の)2倍のサイズのの矩形領域の内側に表示します.これにより,回転したスプライトの端が通常のサイズの範囲外に出てしまっても,スプライトの端が見えるようになります。

ただし、例えば8x32ピクセルのスプライトを90度回転させた場合、サイズ2倍の領域は16×64と32に満たないので、スプライトの一部が切り取られてしまいます。