sprite 実装完了


昨日の状態からキャラクタ ROM とパレット RAM をつないだらわりとうまくいったので、手直しをした。そのあと sprite 単体から tilemap をつけて一通り完了。video を一通り実装したので、今回の目的は達成できたのでおしまい。

sprite 仕様関連

  • キャラクタ ROM
    • ROM は 4 つに別れているので、ROM の 同じ data bit 4bpp とする
    • 1キャラ は 16x16 dot で、 8x8 dot の chip を 4つ並べたもので、アドレスの順に chip を下記に並べたもの
0|2
    1. -
1|3
    • width, height の最小値は16x16で最大値は128x128. 最大時の 16x16 dot のキャラクタを下記の順番に並べ、それより小さい場合は左上を基準に描画しない。
00|08|10 18|20 28 30 38
                                            • -
01|09| 19| 39
                                            • -
02| | | 03|0b| 1b| 3b
                                            • -
04| | | 05| | | 06| | | 07|0f| 1f| 3f
    • 上記から charcter ROM の address bit の振り方は下記から算出できる。
20:5  index[15:0] + {10'h000, offset_xf[6:4], offset_yf[6:4]}
4     offset_xf[3]
3:0   offset_yf[3:0]

index: sprite map の charcter index
offset_xf: sprite chip offset, x 座標で flip 時は bit 反転をする
offset_yf: offset_xf の y 座標のもの
  • 座標
    • x 座標は 0 から 10'h3ff を持ち、 10'h140 から 10'h2bf が可視領域 (左から右)
    • y 座標は 0 から 9'h1ff を持ち、 9'h17f から 9'h080 が可視領域. (下から上なので注意)

解決すべきこと

  • priority bit と各レイヤの重ね順の調査。現時点では適当。
  • 透過の判定はキャラクタが持つのか,パレットが持つのか。みる感じ後者っぽいので、その場合は tile用パレットとsprite用パレットを別にしないといけない。
  • CPU が 16bit little endian なので VRAM がおかしくならないようにバイトオーダーを調べる。
  • 可視領域の座標。現時点ではこれもかなり適当。
  • 遅延算出はいらないので早い verilog シミュレータを探す。コンパイルし忘れも多いので、Makefile で連携できるやつがよい。 Icalus Verilog を検討したい。