[FM]FULLMSX for BLOG

詳しいMSXパソコンなどの情報はホームページで!
https://fullmsx.web.fc2.com/

MSXマシン語適当講座 「ながっ!」SCREEN7,5のビットマップの読み書き ゼロ除算 その1 えーっ!

2011-11-22 18:16:21 | MSXマシン語適当講座

 前々々回の講座「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ビットレジスタの連携したプログラムも考えてみます。
 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする