MSX2グラフィックZ80プログラミング講座 -HI- 

グラフィックツールを堅く考えることはない、グラフィックの道具になればいいと思う。
インターフェイスを覚えるより必要なモノだけを作る。プロらしい手法…

去年の11月までEX講座をやっていました。今年は少しハイレベルなHI講座をひらいて
MSX2パソコンのグラフィックを解説していきます。

MSX-DOS(2)から グラフィックを使う。CALSLT
VRAMのアドレス操作、 スロット指定、ほぉじゃぁでBIOS解析、新BIOS
BASICリストのプロテ クト、文字の入出力、SHEM、算術演算シフト、条件分岐
PABLICと EXTRN、DEの拡張プログラム、スプライトの設定、表示、移動

第10回 プログラムにプロテクトをかける

これまでのあらすじ
アセンブラソースをMSXBASICで動くアセンブラに実行してみた。
ところが、このアセンブラはMSX1用のもので、うまく実行できなかった。
MSXBASICのマシン語をあきらめて、しかたなくMSX−DOSの環境を続けることにした。
そして、MSXBASICで実行するBIOSをMSX-DOSに移した。
ほぉじゃぁを使ってBIOSをプログラム出力して解析に入った。
これで頻繁に使うBIOSはスロットを切り替えることなく使うことができるようになった。
予定は大きく変わり講座のタイトルが残った。
プロテクトといえばCRCエラーのセクタを作って
マスターディスクと判別すると正常起動するというものがありましたね。
今回はMSXBASICリストにプロテクトをかけます。
まずプログラムを入力してみます。

LD A,(8001h)
CP 00h
JP NZ,0D009h
RET
CALL 00C0h
LD A,00h
LD (8001h).A
RET

100 SCREEN1:CLEAR,&HD000
110 GOSUB 130:POKE&H8000,0
120 DEFUSR=&HD000:A=USR(0):END
130 'MAC DATA in MEMORY
140 I$="3A0180"
150 I$=I$+"FE00"
160 I$=I$+"C209D0"
170 I$=I$+"C9"
180 I$=I$+"CDC000"
190 I$=I$+"3E00"
200 I$=I$+"320180"
210 I$=I$+"C9"
220 L=LEN(I$)\2
230 FORI=1TOL
240 R$=LEFT$(I$,2):I$=MID$(I$,3)
250 POKE&HD000+(I-1),VAL("&h"+R$)
260 NEXT
270 RETURN

8001hの数値を00hに書きます。
簡単なプロテクトですが、100行以降が表示されません。
この状態で保存すればよいでしょう。
海外のプログラムで1行目以降が表示されない
BASICプログラムがあったりします。
もっと工夫すればいろいろとできそうです。

番外編でしたが、次回はMSX-DOSで数値を変えられるように
簡単にINPUT方式でカスタマイズ化してみます。
BlueMSXで新BIOSはメモリが大きすぎるために
動作しませんでしたが、これはスタックエラーでミスでした^^;ボリボリかじる
当分はBDOSは使いませんので
BASICのマシン語でも使うことができます。

第11回 数値を変えられるようにカスタマイズ化する

カスタマイズファイルというのは、プログラムのコードを書き換えて
画面を変えたり、設定を変えることができるファイルです。
カスタマイザはこのカスタマイズできる実行ファイルを読み込み、
カスタマイズファイルの設定に書き換えるソフトです。
最近ではレベル100にするなどコード本がありますよね、
そういったプログラムの設定を変えることができるものをそう呼びました。
ファイル名はCNFファイルまたはCFGファイルがあればカスタマイズできます。
M80とL80のコマンド入力はなれてきたでしょうか?
次のコマンドでショートカットに挑戦してみましょう。
コマンドラインから
COPY CON M.BAT
M80 =%1.mac
L80 %1,%1 /N/E
^Z([Ctrl]+[Z]

これでM TEST.MACと入力するとTEST.COMができます。
今回はデバッグ作業しやすいように
INPUT命令のBIOSを使って気軽に色を変えて楽しみたいと思います。
前々回からの新BIOSのチェックをBlueMSXでも試しましたが問題ありませんでした。
サンプルファイルのダウンロードもやっていきたいと思います。

1文字の入力待ち(CHGET:009FH)

一文字の文字表示(CHPUT:00A2H)

このBIOSを使います。入力した文字がAレジスタに入って文字を表示します。
同時にメモリへ入れます。0300hをワークエリアにします。

INP_D:  EQU 0300h

           LD   HL,INP_D
           LD   IX,009Fh
           CALL I_BIOS
           LD  (HL),A
           LD   IX,00A2h
           CALL I_BIOS
           LD   IX,009Fh
           CALL I_BIOS
           INC HL
           LD (HL),A
           LD IX,00A2h
           CALL I_BIOS
 
次回はSHEMを使って0300hのワークエリアを見てみます。

第12回 SHEMを使って数値を確認する

今回はSHEMを使ってデバッグをします。
初めてSHEMを使う場合はSHEMの環境を作ります。
SHEMが別のディレクトリがA:\SHEM\にある場合は
A>A:\SHEM\ SHEM
で起動することができます。
[CTRL]+[L]でCOMファイルをロードします。
[CTRL]+[D]でアセンブラを見てみましょう。
[CTRL]+[ESC]でMSX-DOS2へ戻ります。
もし、Windowsのショートカットが効いていて
MSX-DOS2に戻れない場合は
[CTRL]+[E]でCOMMAND2.COMをロードさせて実行します。


INP_D:  EQU 0300h

           LD   HL,INP_D
           LD   IX,009Fh
           CALL I_BIOS
           LD  (HL),A
           LD   IX,00A2h
           CALL I_BIOS
           LD   IX,009Fh
           CALL I_BIOS
           INC HL
           LD (HL),A
           LD IX,00A2h
           CALL I_BIOS

[CTRL]+[E]でプログラムを実行します。
これで0300hのダンプに文字が2バイト入ったことがわかりました。

1chipMSXでSHEM環境を作る:
http://www.geocities.jp/fullmsx2/u-yan/shem.html

第13回 新BIOSを使って2色の模様を作ってみる

次にASCIIコードを数値に変換されるための処理が必要になります。
BASICで試してみます。A(アンサー)をAレジスタにたとえます。
PRINT ASC("0")
Ok
今回のプログラムはキャリー(C)を使った分岐を使っています。
0(ゼロ)はコード48ですから48(30H)を引きます。0から9まではOKです。
PRINT ASC("9")-48
9
48以下は-1はFF以下となりますから、範囲外のC_CD2になります。
次にAは17となります。さらに7を引きます。AからFまではOKです。
PRINT ASC("A")-48-7
10
ここでも15以上は範囲外のC_CD2になります。
10〜F0は算術シフト命令をSLAを4回使います。
130ならば、1から10,100と3から30と0と文字から数へ変えることを
PCでjはFがF0,F00,F000,F0000となります。
このようにビットが左へ動くSLA(:シフトレフトアリスメティック)を
使います。

次に0〜Fを最後に加えます。0302hに変換した数を入れておきます。

;ConvertCode
             LD HL,INP_D
             LD A,(HL)
             CALL C_CD
             SLA A
             SLA A
             SLA A
             SLA A
             LD B,A
             INC HL
             LD A,(HL)
      CALL C_CD
             ADD A,B
             INC HL
             LD (HL),A
             JP SCR5
;Character to Value
C_CD:
             SUB 30h
             CP 10
             JP NC,C_CD1
      RET
C_CD1:
             SUB 7
             CP 16
             JP NC,C_CD2
             RET
C_CD2:
             XOR A
          RET

プログラムができました!
今回は今までのプログラムをパックしました。
MACファイル、COMファイルも入れてみました。

<< grp-b3.lzh を ダウンロード >>

今回はC(キャリー)の条件分岐を使いましたが、
ちょっとクセがある命令で、何をやっているのか馴染めませんでした。
SHEMで[CTRL]+[G]で0100Hと表示されますので、[RETURN](Enter)キーを押します。
これでMSX-DOS2に戻らなくても再度プログラムの実行ができます。
こんな感じでSTEPごとにレジスタを確認しながらデバッグしていきました。
SUPER-X、SHEMも使えるようになってきたと思います。
次回は新BIOSからVRAMデータを読み取って任意の数値へ変えるプログラムを作ります。

第14回 カラー変換プログラムを作る

とにかくMSX-DOS2のマシン語はMSXBASICよりもハードルが高いです。
この回が終われば初級は修了とします。そして、この回は修了検定(おい)です。
簡単なテストというよりも実地試験というものか、悪く言えば解説の手抜きかなと。
今回はMSX2テクニカルハンドブックに馴染むためのものです。
問題は簡単ですから、なくてもよいです。

まず、SCREEN1に戻るBIOS命令部に読み込みを加えます。
これはSCR5以下のものをコピペします。
次にVRAMの書き込みを読み込みに変えます。
一部分を書きました。読み込んだデータがAレジスタに入っているならば
       CP  88h
       JP  Z,WR_AA

WR_AA:
       LD A,AAh
       RET
とします。WR_AAにはVRAM書き込みをどこかに加えてください。
プログラムを実行して88を入力するとAAになるには赤が黄色に変わることになります。
ですから、プログラムは同じようなプログラムを2回を作っていけばよいでしょう。

次回は中級編に入り、BASICを越えたマシン語らしい解説にはいります。
スプライトの設定、ビット操作、マシン語のワークエリアを中心とした講座に入ります。
答え合わせも行います。

第15回 PUBLICとEXTRN擬似命令を使う 次へ