前々々回の講座「8ビットから4ビットに分ける」の続きです。VRAMのデータを読み出して、
たとえば0Fhでしたら、色コード0hとFhを得るためのプログラムをつくりました。
ちょっとスプライトの話をします。ビットマップのほかVRAMにはスプライトにもエリアがあります。
SPRITE$(1)と指定してデータを入れますが、
SCREEN5のVRAMに直接書き込むなら、
&H7800からスプライトパターンジェネレータというエリアに書き込みます。
第2パラメータをSCREEN5,2と設定しないと16ドットデータになりませんので注意が必要です。
16ドットの場合は左半分と右半分で32バイト(8ドットが4つの&H20)のデータになります。
さて、今回はいよいよ、ビットマップの読み書きをBIOSを通してやってみたいと思います。
まず、「BASICではどのようなプログラムになるのか?」を書きたいと思います。
10 SCREEN 5
20 PSET(100,100),&HF
30 I$=Input$(1)
というプログラムを
10 SCREEN 5
20 PSET(100,100),&HF
30 C=POINT(100,100)
40 SCREEN 0
50 PRINT C
60 I$=INPUT$(1)
のようなプログラミングを
ちょっと長くなりますがマシン語で設定をしてみます。
MSX2テクニカルハンドブックか
MSXマガジン永久保存版3号のp188に載っています。
このBIOSではVDPを変えることができるコマンドがあります。
以前にDEFUSR=&H7E:A=USR(0)で多色刷りモードにする
コマンドはVRAMがSCREEN1でVDPがSCREEN2になりますね。
最初に手書きかテキストで入力しながらプログラムを組みます。
このBIOSのエントリを使います。
CHGMOD:005Fh
NRDVRM:0174h
NWRVRM:0177h
0D000hにこのプログラムがあるので、
さらにデータエリアを0D100hに設定します。
これは私が設定したので、0D200hでも0D400hでも
アドレスはどこでも設定できます。
(HL)はPOKE命令として見てください。
0D100 X座標(100=64h)
0D101 Y座標(100=64h)
0D102 色コード(15=0Fh)
LD A,05h
CALL 005Fh
LD A,64h
LD HL,0D100h
LD (HL),A
LD A,64h
LD HL,0D101h
LD (HL),A
LD A,0Fh
LD HL.0D102h
LD (HL),A
ここまでで、画面をSCREEN5に切り替えて
0D100hと0D101hに100、0D102hに15を入れました。
さて、ここからが山場です。
SCREEN5は256×212ですが、VRAMマップは
128バイトが各212バイトの構成です。なお、SCREEN7は512バイトですね。
X座標の100は50バイト目に書き込むことになります。
この50を出すことにします。カウントはBレジスタにします。
これを2で割ります。カウント(INC B)しながら-2、(DEC 2)して
CP 2としてNC(ノンキャリア)であれば繰り返し(ループ)で計算します。
そうすると、Bが50と出ます。CP 2でZフラグ(余り1)が成立する場合は
101とかになるわけですね。
さらに、Y座標でY座標の計算を入れます。
こんな具合にVRAMの書き込みアドレスを確定していきます。
もう1つの山は座標が0(ゼロ)というのがあります。
これがPCでは厄介なもので0÷0=×と計算できないゼロ割りになってしまいます。
要するに計算をしないで答えになる例外を考えます。
たとえば1~20の通常は合計を出すとして、4の項目にデータがなく割り算が数式にある時などに
DIV/0と表示されて、Excelなどで集計ができないエラーがありますね。
これもプログラムします。やっぱり長いので^^;
次回は計算をしてアドレスを出すことにします。では。
と、いいながら大きな問題がありました。
SCREEN5は1バイトを2ドットにしているので、たとえば100と101の2つの座標のある
アドレスの部分書き換えになります。
34hとういうデータに1ドットにfhを加えるとf4hか3fhになります。
問題はこの4hと3hを読みこまないとf0hとか0fhになって正しく表示できませんね。
MSXBASICではINSTRだったりMID$だったりするイメージが浮かんだりして
見えない岩山が出てきたようです。はたして、SCREEN5の読み書きはいつできるのか?(おい)
短くできるか難題のような感じです。「MSXBASICはすごくラクなんだ」と実感します。
と、いうわけでやっぱりラクをするには「BITかな?」は避けて通れませんね。
8ビットレジスタと16ビットレジスタの連携したプログラムも考えてみます。
※コメント投稿者のブログIDはブログ作成者のみに通知されます