85DATA HOMEへ
MYCAR情報掲示板BLOGプロフィール

HOME → ソフトウェア → X1でゼビウスを作る Ver.2

[第1回]  CRTC設定による2ドットスクロールとVRAM計算

 以前のバージョン(以降「Ver.1」と書きます) と大きく異なるのは、スクロール方式です。Ver.1はタイルパターンとの併用による1プレーンの差分描画方式でした。(詳細はこちらに書いてあります)

 中々良いアイデアだとは思っていたのですが、1プレーンだけのスクロールでは随分と貧相な画面になっていました。
スクロール方式を変更し、「見た目」の改善を図ってみます。
これにより、大幅にプログラム変更が発生してしまうので、「Ver.2」と命名してみた訳です。

はっきり言って「他機種」に移植するようなもの・・・・・いや、それは大げさか。

「AE85改AE86を製作する」労力と、「AE86の主要機関 (エンジン・ミッション・サスペンション・ブレーキ周りなど)を全ての総脱着する」労力の違いのようなものでしょうか。・・・・・いや、ますます分かりづらい例えになってしまった。

(1) 画面モードを160×200ドットにしてスクロールさせる。

CRTCレジスタ(R1:水平表示文字数)を20にする事により、160×200ドット 4画面にする事が出来ます。
なお、表示画面の切り替えは(従来通り)CRTCレジスタ (R12:スタートアドレス上位 ,R13:スタートアドレス下位)の設定により行います。
4画面モードの場合、スタートアドレスは以下の通りです。

1画面:$0000
2画面:$0200※
3画面:$0400※
4画面:$0600※

※1画面目のスタートアドレスから+オフセットという意味です。

この4画面に2ドットずつ、ずれた背景画面を描画して画面を切り替えます。

        

そして、4画面目の表示の後(6ドットスクロールした後)に、1画面目のスタートアドレスを−20 (スタートアドレス値は$FFECとなる) すると、8ドット下にずれた1画面目が表示されます。
そして、新たなマップチップを上部に描画させます。

これで、連続して2ドットスクロールして「見える」ようになるのです。

4画面のループを繰り返す毎にスタートアドレスは変化しますので、描画するVRAMアドレス計算が煩雑にはなります。

(2) スタートアドレスからVRAMアドレスを計算

以下の表はスタートアドレスとVRAMアドレス (Rプレーンの場合) の値を示しています。

これを見るとスタートアドレスが-2060と+8180の時のVRAMアドレスが一致している事が分かります。
よって、-20ずつ減算して-2060になったら+8180に戻す事にしました。
(そのまま回し続けても良さそうなのですが・・・)


-2060〜+8180ならば(20単位での増減なので)512パターンしかありません。
メモリに余裕があればテーブル利用が高速なのですが、今回はメモリに"全く"余裕が無いので計算方式とします。
(2Byteなのでテーブル容量は1024KBが必要。容量的に問題無ければテーブル利用が良さそう)

スタートアドレスから画面左上のVRAMアドレス(Rプレーン)への計算は以下の通りとしました。
(もうちょっと簡易に計算は出来ます)

さらに、座標(X,Y)による描画先のVRAMアドレスは以下ループバックを考慮する必要があります。

下表はスタータアドレスが+2020の場合のVRAMアドレスを示しています。
画面左上のVRAM開始アドレスが$87E4になります。

仮に$BFECから描画を開始した場合、右隣は+1加算すれば良いだけですが、通常通り(普通のVRAMの並びと同様に) VRAM計算を行うと$8800 (下記 d ) になり、正しい位置に描画が出来ません。
よって、下記の考慮が必要です。

もう一例 $87FFから描画を開始した場合です。

1ライン下の計算においては、通常通りと変化は無く問題ありませんが、右隣は普通に+1加算しただけでは、$8800になってしまいます。

このループバック処理を行うのは、画面左上のVRAM開始アドレスが$860C以下であれば、考慮する必要はありません。 ($860C = $8800-20×25)

全ての処理において、ループバック処理をしていたのでは、速度的に不利です。
キャラクタの描画やマップチップの描画において、あらかじめ画面左上のVRAM開始アドレスを計算し、ループバックの有無により描画ルーチンを変化させています。