以前のバージョン(以降「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開始アドレスを計算し、ループバックの有無により描画ルーチンを変化させています。