※信用してると痛い目みるよっ!※


共通


どちらも$43*0〜にハードウェアへの命令内容を入れます

区別方法はDMAなら$420Bに、HDMAなら$420Cにセットしたbitに対応するアドレスのが実行されます

LDA #%00000101

STA $420B

これだとbit1とbit3がセットされているので$4300〜と$4320〜に設定したDMAが実行されます

 

---使うアドレス---

$43*0

bit7     セットするとPPU→CPUへと転送、クリアするとCPU→PPUへと転送。

          多分DMAのVRAM読込時にセットするくらいです

bit6     HDMA専用で、セットすると間接アドレス方式で処理を行う。

          やったことないし試す気も今のところないからあとしらん

bit5     未使用

bit4     セットすると$43*2-4で設定したアドレスの読込み方を自動デクリメントにします

             例:これをセットすると$711000の次は$710FFFを読込む

bit3     セットすると$43*2-4で設定したアドレスを変化させずに同一データを転送し続けます。

bit0-2  転送方式

             000  1アドレス1バイト書き

             001  2アドレス1バイト書き

             010  1アドレス2バイト書き(HDMA時用でDMAだと000と変わりません)

             011  2アドレス2バイト書き

             100  4アドレス1バイト書き

$43*1

対象PPUアドレスを指定($21**の**の部分を指定)

$43*2-4

パレットデータがある場所などの対象アドレスを指定。

$43*5-7

DMAでは$4305-6で転送量を指定(例外として#$0000と入れると#$10000の転送を行います)

HDMAでは間接アドレス方式でのアドレス?

$43*8-9

CPUアドレス。弄ったことないしよく知らん

$43*A

HDMA専用。同上

 


DMA


DMAはハードウェアに処理を行わせることで高速なデータ転送を行うもので

VBlank中に6kb強のデータを転送することが可能です

DMAは$420Bに値を入れると同時に処理を実行します

---主に使うPPUアドレス---

$2104

$2102-3で指定したOAM_RAMにデータを書き込む

普通に使うなら↑に#$0000をいれて指定RAMから#$0220分転送を行います

最初の#$0200でタイル・XY位置・priority等、残りの#$0020でスプライトのサイズを指定しています

$2118-9

$2116-7で指定したVRAMにデータを書き込む

$2115の設定によってタイル情報($2118)だけの書換やpriority等($2119)だけの書換も可能

 $2122

$2121で指定したCG_RAMにデータを書き込む

パレット全部書き換えるなら$2121に#$00を入れて#$0200分の転送を行えばおk

$2139-A

$2116-7で指定したVRAMからデータを読み出す

こちらも$2115の設定あるかな?てか必須じゃないし使い道が他と比べて余りない?

 

 GFXデータを書き換える処理の例

上の処理を使って画面に表示されているタイルマップを弄ることもできます

また、タイルマップを弄る場合は転送方式($43*0)を変えることで

「タイル番号のみ」「パレットや反転、優先度のみ」を変える転送を行うことも出来ます

 


HDMA


HDMAはHがついている通りHBlank中に処理を行うDMAです

1ライン毎にPPUの設定を変更することができます

---wikiにあるしHDMAはそんな弄ったことないから後回し---