MSX2グラフィックプログラミング講座 -HI-
グラフィックツールを堅く考えることはない、グラフィックの道具になればいいと思う。
インターフェイスを覚えるより必要なモノだけを作る。プロらしい手法…
去年の11月までEX講座をやっていました。今年は少しハイレベルなHI講座をひらいて
MSX2パソコンのグラフィックを解説していきます。
講座では1ページで4または5講座ごとになっています。
・MSX-DOS(2)から
グラフィックを使う。CALSLT
・VRAMのアドレス操作、
スロット指定、ほぉじゃぁでBIOS解析、新BIOS
・BASICリストのプロテ
クト、文字の入出力、SHEM、算術演算シフト、条件分岐
・PABLICと
EXTRN、DEの拡張プログラム、スプライトの設定、表示、移動
第1回 MSX-DOS(2)のマシン語の開発環境を作る
これまで別講座でマシン語適当講座を解説していきました。
この講座では適当に気軽に使うことをコンセプトにしてみました。
好評だったので、いろいろと書き加えていくと
おもしろくなってきた感じがしてきました。
是非、マシン語適当講座とマシン語BASIC中級編などをごらんください。
さて、第1回目はいよいよMSX-DOSのプログラミングを始めていきます。
マシン語の講座の前回はBIOSを使ってグラフィック画面を白で塗りつぶすことを
行いました。
やはり、好評で、「MSX-DOSでどうやってグラフィックを使うのですか?」
という質問があって「インタースロットコールを使ってBIOSを
呼び出す方法があります。」と、回答しました。
やはりMSXのプログラミングのFAQなのかな…と、思って
今回はカンタンにMSX-DOSからBASICのマシン語につなげてみることにしました。
今回の環境はディスアセンブラからアセンブラに変えてみます。
さらにM80,L80のMSX-DOS TOOLSが必要になります。
私の環境は1chipMSXですからMSX-DOS2のKIDをエディタにします。
ファイルに入れるものはM80.COMとL80.COMとKID.COMです。
例えばTEST.MACを実行する場合は
M80 =TEST.MAC
L80 TEST,TEST /N/E
でよいです。
次回はKID.COMの使い方とBIOSの使い方です。
第2回 MSX-DOSでBIOSを使う
私はKID.COMでプログラミングしています。当時MARIO-NETのMARIOさんにお会いして、
ねっとちゃんぷらすのホストプログラムを見たりして遊んでました。
その時にたしか、日本国憲法のテキストでしたか、KID.COMで書いた話とか、
ANSIのESCシーケンスの使い方を教えてくださいました。それから愛用しているエディタです。
KIDを起動する前にMSX-DOS2でMODE 80を実行します。
次にKID TEST.MACと入力します。
これで、テキストエディタを起動すると80×24ラインで表示されます。
テキストの行コピーはコピーを始める行でF5キーを押します。
範囲を指定してRETURN(Enter)キーで削除するか、コピーするかを決めます。
ペーストは貼り付けを始める行で[CTRL}+[@]を使います。
[CTRL]+[P]で最終行、[CTRL]+[R]でページもどし、[CTRL]+[C]でページ送りで
とりあえずはこれだけ覚えればよいです。
プログラムの書き方は[TAB]を加えなくてもよいです。0301CHでも0301Chでもかまいません。
さて、今回はMSX-DOSのスロット構成をさらっとはなします。
MSXのスロットは16KBの4ページ(セグメント)になっています。
BASICではROM,ROM.RAM,RAMとなっています。
プログラムはRAMの8000hから始まり32KBを使っていますね。
MSX-DOSではRAM,RAM,RAM,RAMで64KBを使うことができます。
プログラムはRAMの0100hから始まります。
ですから、BASICの2倍以上の領域があります。
DRAMを使ったプログラムというのはこの構成と思います。
またROMよりRAMは高速ですから、
MSXturboRでDRAMに転送して動作させるという話がありましたね。
MSXBASICのBIOSはROMをCALLしてプログラムを動作させます。
MSX-DOSにはBIOSはありません。そこで、自動的にコールする時に
スロットを切り替えるインタースロットコールを使います。
次回はインタースロットコールをうまく使ってコマンドプロンプトで遊んでみます。
Z80マシン語:MSX-DOS上級編
http://www.geocities.jp/fullmsx2/u-yan/mon.html
第3回 CALSLTを試してみる
回答はできて実証してみたい気持ちがあるのですが、
部分的にやっても正直わからないのが普通と思います。
BIOSはスロットが異なるので別のメモリスロットのプログラムを呼び出す
インタースロットコールのCALSLTを使います。
-MSXBASICでプログラミングする場合-
BIOSはMSXBASICのスロット構成のROM2ページ、RAM2ページ
で直接使用することができます。
SUPER-Xでアセンブラソースリストをメモリに書き込み、
インタースロットコールのLD IX,00CFhはCALL 00CFhに書き換えて
CALL I_BIOSを削除することでBIOSで動作できます。
アセンブラによってはテキストエディタで行番号を加えて
MSXBASICでロード時間はかかりますができます。
これからの解説ではインタースロットコール(I_BIOS)などは
このように書き換えを行えばMSXBASICでも動作可能になります。
指定されたスロットのプログラムを呼び出す:CALSLT(001CH)
CALSLTはMSX-DOSにあるので使うことができます。
何とかBASICのように楽しくプログラミングできないか考えてみました。
私ふうに書くと暗号のようになってしまいますが、
I_BIOS: LD IY,(0FCC0H)
CALL 001Ch
RET
のサブルーチンを先に書いておきます。
IYはMSX-DOSのFCC0Hをロードさせています。
ファンクションキーを消す:ERAFNK(00CCH)
読みはイレーズファンクションキーと呼びます。
ファンクションキーを表示:DSPFNK(00CFH)
読みはディスプレイファンクションキーと呼びます。
これをKEYONとKEYOFFしてみましょう。
KEYON.MACには
LD IX,00CFh
CALL I_BIOS
RET
I_BIOS: LD IY,(0FCC0H)
CALL 001Ch
RET
KEYOFF.MACには
LD IX,00CCh
CALL I_BIOS
RET
I_BIOS: LD IY,(0FCC0H)
CALL 001Ch
RET
として、保存してみましょう。M80,L80を使って第2回のとおりに実行してみましょう。
今回はわかりやすいサンプルを作ってみました。
もし、MSX-DOS2でファンクションキーを使うようでしたら、FSW倉庫でさがしてみてください。
このようにBIOSを使う度にインタースロットコールを通して使えば
MSXBASICのプログラムを使うことができます。
次回はいよいよVRAMにアクセスして白を塗りつぶします。
FSW倉庫:MERON氏作特設コーナー
http://sakuramail.net/fswold/meron.html
第4回 VRAMにアクセスするその1
前回はMSX-DOS(2)でファンクションキーの表示/非表示を行ってみました。
例えばMODEコマンドにMODE 80とするとWIDTH 80と同じことができます。
でも、よく考えるとMODEコマンドの第1パラメータが80になったりしています。
例えばTYPE GRP.MACと、よく見れば第1パラメータがファイル名になっています。
システムスクラッチエリアは000h〜0100hまでの範囲です。
MSX-DOS(2)で使うBDOSはこのエリアの0005hのサブルーチン(システムコール)
しますが、5CHと6CHにコマンドのパラメータ(引数)が入ります。また、
コマンドを省いた部分が0080hに格納されているようです。
さておき、VRAMをアクセスするにはSCREEN命令を宣言する必要があります。
今回はSCREEN番号を入れるBIOSを解説します。
今まではMSXBASICからSCREENを使って、その後にマシン語を実行しました。
今回はMSXBASICのプログラムの代わりに使います。
I_BIOSのインタースロットコールはこれから使っていきますので、
おまじないのように覚えておくとよいでしょう。
スクリーンモードを変える:CHGMOD(005FH)
読みはチェンジモードでよいでしょう。
Aレジスタに数値を入れてSCREENを設定します.
MSXBASICでマシン語の場合は今までどおりに
CALL 005Fhでよいです。
LD A,05h
LD IX,005Fh
CALL I_BIOS
RET
I_BIOS: LD IY,(0FCC0H)
CALL 001Ch
RET
これでモードが変わりました。
この後に前回のBIOSをコールしているCALLを
LD IX、CALL I_BIOSスタイルに変えます。
;MSX-GRAPHIC TEST PROGRAM
PUSH IX
PUSH IY
;SCREEN5
LD A,5
LD IX,005Fh
CALL I_BIOS
LD BC,00000h
LD DE,0D400h
LD H,B
LD L,C
;VRAM_ON
LD IX,00171h
CALL I_BIOS
LOOP:
;VRAM_WRITE
LD A,0FFh
LD IX,00177h
CALL I_BIOS
;ADR+1
INC HL
LD A,H
CP D
JP Z,ADRCLK
JP LOOP
ADRCLK:
LD A,L
CP E
JP Z,P_END
JP LOOP
P_END:
POP IY
POP IX
;SCREEN1
LD A,1
LD IX,005Fh
CALL I_BIOS
RET
;InterSlotCall_BIOS
I_BIOS:
LD IY,(0FCC0H)
CALL 001Ch
RET
END
実行できるMACソースを貼り付けてみました。
実行するとSCREEN5に白のFFhを塗りつぶします。
しばらくするとSCREEN1に戻りコマンドプロンプトになります。
次の講座も準備中です!
第5回 VRAMのアドレス操作をマスターする 次の講座へ