2024年6月5日水曜日

V-RAM変換

MZ-2000からPasopia7のV-RAMアドレス変換について考えてみる

MZ-2000のV-RAMグラフィックは、アドレスC000h-FFFFhに割り当てられていて
80char(1char=8bitで640ドット)ごとに1行ずつ配置されている。
右のアドレスは+1で、1行下は+80(50h)という普通(?)の配列。

Pasopia7のV-RAMアドレスは以前も紹介したが、かなり独特。
アドレス8000h-BFFFhに割り当てられていて、キャラクタ(8バイト)単位で配置。
右のアドレスは+8、1行下は+1だがキャラクタの最終行だった場合は+633(0279h)加算される

MZ-2000のV-RAMアドレスからPasopia7のアドレスへの変換を考えてみる。
V-RAMバンク領域は16Kバイトでアドレスは2バイトなので、32Kバイトの変換テーブルを作るのが速度的には理想だが、今回は厳しいので4Kバイトの変換テーブルで考える。

変換テーブルは16char単位で作成する。1行80char÷16=5charぶんのアドレスを格納。
1画面200行なので、1000char分の変換テーブルになる。

1char分のデータは、Pasopia7のV-RAMアドレス2バイト+Y行数(0-199)1バイト+X列数(0-79)1バイトの合計4バイト

MZ-2000のV-RAMアドレスを16で割って、変換テーブルのインデックスにする。
変換テーブルから取得したアドレスに、16で割った余り×8を加算するとPasopia7のV-RAMアドレスになる。

それでも割り算などの処理が入るので、1回の変換に250clock程かかってしまう。
もっといい方法もあるかもしれないが、一旦はこれで変換ロジックは完成。
最初のV-RAMアドレスだけテーブル変換し、その後は差分の加算で対処する。

V-RAMアドレスの左右アドレスを取得する場合は、単純に±8バイト。
上下アドレスは少し面倒で、変換テーブルからY行数を取得し、bit2-0=000(0)なら上のアドレスは-633、bit2-0=111(7h or Fh)なら下のアドレスは+633、それ以外は±1で上下アドレスは取得できる。
変換テーブルにX列のデータも格納しておいたが、今回は使っていない。

あと1charデータのビット並びが逆になっているのも注意。
MZ-2000の場合はbit0が左に表示される。例えば■□□□ ■■□■の並びでデータを表示する場合、V-RAMへセットするデータはB1h(1011 0001)。
Pasopia7の場合はbit0が右。V-RAMへセットするデータは8Dh(1000 1101)。

ビット反転は、ここのサイトを参考にさせてもらいました。助かりました。
少しでも速度を確保したいので、起動時にキャラクタのデータが格納されている領域を一括してビット反転。
が、ここに悲劇がありました。
データの隙間に、ロジックを埋め込んではいけない。。


0 件のコメント:

コメントを投稿