スプライトのY座標系統

2次元なコンピュータグラフィックの場合、縦座標は上から下に行くのが普通ですが、ほとんどのスプライト属性は逆方向の下から上へ行きます。なんでそうなるのか自分はわからなかったのですが、落ち着いて考えるとわかりました。

  • sprite atributte position Y と display scanline counter を加算する (ここでは両方とも8bitとする)
  • 加算値の bit7:0 が 0 であったら(たぶんcarry は無視)で sprite hit となる
  • sprite の height が 16bit で zoom がなければ bit3:0 がそのまま offset となる

とても合理的ですね。これに気づかず、vram から scratch ram に取り込むときに xor で反転して、hit = display == position とか offset = display - position を使うから無駄な回路を作ってたり、不必要に難しくなってました。

これと似た方式として display scanline counter 更新時に scratch ram の position Y を全て increment する方式も考えたのですが、描画途中に attribute を書き換えるようなテクニックなり、CPU との同期を取るのに不都合だったのでなしにしました。

linebuffer + zoom down ありの場合は、ちょっと特殊で全ビットを 0 比較するまではいいのですが、次の offset が += 1 ではない場合がありますので下位ビットで offset y の算出ができません。これはやはり、offset y 専用のバッファが必要です。

framebuffer の場合は ... 縦座標を上から下に置いた方がいいんじゃないのかな? zoom up sprite を使う回路を作らないと気が回らないです。