※信用してると痛い目みるよっ!※
共通
どちらも$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はそんな弄ったことないから後回し---