OPASによるプログラミング!

BASICでドット単位のスクロールをしよう

 まず、前回でも少し触れておきましたが、OPASとはフォント書き換えの改良版のようなものです。
 フォント書き換えでは、ゲームで使用する場合、開始前に必要なキャラクタのデータをメモリ上に書き込んでいきます。当然のことながら、横6ドット分のデータが1つのキャラクタになるわけですが、カナというのは64文字(内部的にはアスキーコードA0h〜DFhをカナとして考えるため)しかないので、64文字分つまり、384バイトを越えるグラフィックは取り扱えないことになります。
 簡単なゲームならこれで問題ないのですが、少し規模の大きいゲーム(グラフィックデータ量の多いゲーム)ならもうアウトです。例えばRPGで24×24ドットで敵キャラのグラフィックを表示する場合、1体につき72バイトのデータ量になるために、5体分しか取り扱うことができません。しかし、OPASを使用すれば、32Kバイトのメモリがあれば、405体の敵キャラを取り扱うことが可能なのです。
 なぜ、そんなことができるのかというと、リアルタイムにフォント書き換えを行っているからです。

 ここまであまり深く考えずに読んできた人は「32Kバイトものデータをリアルタイムに書き込んでいたらかえって遅くなるのでは・・・」と思うかも知れません。それは、もっともな意見ですがここでは不適切です。それは、なぜかというと次からの文章を読んでもらえたら分かります。

 では、OPASの具体的な使用例としてドット単位にスクロールさせる方法を書きましょう。
 次のリストはGPRINTによるスクロールプログラムです。
(メイン部分は10行のみ)

10 CLS :FOR I=0 TO 960:GCURSOR (60,31):FOR J=0 TO 59:A=PEEK (&BF800+I+J):GPRINT A;:NEXT :NEXT :END
20 *AREA POKE &BFE03,&1A,&FD,&B,0,4,0:CALL &FFFD8
30 *SET A=RND -1:FOR I=0 TO 169:A=RND 4:FOR J=0 TO 5:Z=VAL ("&"+MID$ ("000000000000408040804080182CDEFB3C184080C0804000",A*12+J*2-11,2)):POKE &BF800+I*6+J,Z:NEXT :NEXT

 まず、実行前にグラフィックデータ格納用としてマシン語エリアを1Kバイト以上確保してください。分からない人は「RUN*AREA」としてください。次に「RUN*SET」としてデータを作成してください。あとはRUNをすれば画面下部(60×8ドット)がスクロールします。

 とはいうもののメインルーチン1回につき1秒も時間がかかっているので、遅すぎて話になりません。これは、PRINT文のスクロールでよく使われる、MID$を使うことで数倍の高速化は見込めます。しかし、MID$で扱える文字数の関係から126バイト分のグラフィックデータしか扱えないのでここでは取り上げていません。
 次が今回のポイントとなるOPAS使用リストです。先程のプログラムの10行目を次のように変更してください。

10 CLS :OPEN "SCRN:"FOR OUTPUT AS#1:FOR I=0 TO 960:A=&F800+I-102:X=A/256:POKE &BFC93,A-INT X*256,X,&B:LOCATE 10,3:PRINT #1,"アイウエオカキクケコ":NEXT :END

 このプログラムを実行すれば分かりますが、先程のGPRINTのものと比べて20倍速くなっています。しかも、表示よりもアドレス計算の方が時間がかかっているので、この部分を使用するゲーム内容によって最適化すれば更に2倍以上の高速化が望めます。さらに言うとPRINT#は表示する量が増えれば増えるほど高速化されるので、画面の大部分をスクロールさせるようなプログラムだとGPRINTの100倍速になってしまうのです。
 では、ここでOPASの方のリストを見ていくとしましょう。このリストを見て、奇妙なことはありませんか?PRINTで表示している内容は固定化されているのに実際に表示されている内容は変化(スクロール)していますね。
 実はこれこそが「OPAS」の正体(?)なのです。PRINT文の表示内容を変えずに、3バイトのポインタアドレス(BFC93h〜BFC95h)を変えるだけで様々なグラフィックを表示できるのです。これが別名「リアルタイムフォント書き換え」の所以です。
 通常のフォント書き換えやPCGなどでは1つの文字(アスキーキャラクタ)が1つのグラフィックキャラクタに対応していますが、OPASは1対多で対応しています。だからこそ、64文字制限がほとんどなくメモリをフルに使えるのです。
 ただし、多少、無駄遣いとも言えなくはないですが・・・(笑)。
 しかし、たった3バイトの書き換えで瞬時に画面を変えることができるのです。PC−98などではVRAMを複数画面分持っているのでたいしたことのような感じですが、CPUの遅いポケコンでできるというのは非常に大きなアドバンテージになります。しかも、前回も書いたように本体の標準機能なので追加プログラムは不要なのです。はっきり言って使わないのは損です

 ここまで読んで、まだ、なぜスクロール出来るのか不思議に思っている人のために少し補足を書いておきます。 BASICで手軽にスクロールするには先程も少し触れたようにMID$を使います。

10 A$="(ここに適当に100文字くらい何か文字をいれてね)" 
20 FOR Z=1 TO LEN A$-9
30 B$=MID$ (A$,Z,10)
40 LOCATE 10,3:PRINT B$
50 FOR I=1 TO 200:NEXT
60 NEXT

 30行目のMID$が全体の中からどの部分を表示するのかを決めているのですが、これと同じようなことをPOKE文で3バイト書き換えることで行っているのです(ちょっと違いますが感覚としてはそんな感じ(笑))。だからこそ、メモリの制限がなく、さらに簡単なのです。


さらにOPASを活用したい人へ→OPAS応用編


RETURN

inserted by FC2 system