グラⅡスレ(シューティングスレ) : ふたばに書き込む勇気がないので、ここで勝手に参加するブログ より引用
1.RAMに処理の為のエリアを確保しておく(何故か42バイト)これが画面の横1ライン分に相当する
2.確保したエリアの中で相対的に見てレーザーの始点部分に相当するアドレスに、パレット4色共黒になるような命令を書き込む
3.同じくレーザの終点部分に相当するアドレスにパレットを元に戻す命令を書き込む
それ以外の部分は、何も処理しない命令(NOP)にしておく
4.レーザーを描写するラインで走査線割り込みがかかった時に1.で確保してるエリアに実行
するとLCDCが左から右に順次画面の1ライン分を書くと同時に、
プログラムは確保したエリアの命令を順次実行する事になる
5. 2.の部分を実行するとパレットは真っ黒になり、LCDCはその時点から画面に黒のみ出力するようになる
6.次に3.の部分を実行するとパレットが元に戻り、通常の出力に戻る
7.オプションがあった場合も同様、1.とは別のエリアを確保しておき同じような処理をする
8.レーザーが敵キャラや背景など何かしらに当たった箇所にスプライトで描いたエフェクトを重ねる
GBは描画中にパレット書き換えられるのか…
ファミコンはフレームの途中でパレットを変えるのに大きな制約がある
https://wentwayup.tamaliver.jp/e448453.html
https://wentwayup.tamaliver.jp/e463913.html
パレットについても書いてる
VBlank期間の転送の詳しい話
スプライトDMA転送する際、$00で初期化すると(0,0)の位置に0番のスプライトを置くことになるので、Y座標を$efにしてさえ置けば画面に表示されることはなくなる。$f0でないのはスプライトの座標がBGより1ライン下にずれているため。
— 牧村製作所 (@makimura_mfg) 2013年4月13日
スクロールレジスタみたいな感じで、NMI明けまでに$2003をゼロにしておかないと最初の8バイトの破損が起こるってことなのかな。
— 牧村製作所 (@makimura_mfg) 2013年11月11日
その際に、DMA転送を使わない$2003、$2004レジスタでの手動でのスプライトメモリの書換だと一部のスプライトが転送できない問題があったので、二度書きレジスタ説とかタイミングの問題とかいろいろと試してみた。
— 牧村製作所 (@makimura_mfg) 2013年11月11日
$2003、$2004レジスタを使用してのスプライトメモリ書き換え後には、必ず$2003レジスタにゼロを書き込み初期化するようにしましょう。スプライトメモリの一番最後(256バイト目)を書き換えた場合には、オートインクリメントでゼロが書き込まれるので不要です。
— 牧村製作所 (@makimura_mfg) 2013年11月11日