今まではBASICでスプライトを定義しておいて、
マシン語を呼び出して、
スプライトを動かす部分のみをマシン語かしていましたが、
今回はマシン語でスプライトの定義をします。
では例のごとく、MSXPENでやりたいと思います。
(MSXPEN.comは、ブラウザでできるWebMSX(エミュ)を利用し、
アセンブラもコーディングできるというサイトです^^)
アセンブラソースコード
;ワークエリア
RG0SAV:EQU 0xF3DF
;VRAMアドレス
V_SPATR:EQU 0x1B00
V_SP:EQU 0x3800
;BIOS
LDIRVM:EQU 0x005C
CHGMOD:EQU 0x005F
ORG 0xD000 ;アドレスのD000H(16進数のD000)にプログラムを書き込む
;SCREEN1,2
LD A,(RG0SAV+1)
OR 2
LD (RG0SAV+1),A
LD A,1
CALL CHGMOD
;SPRITE
LD HL,DAT
LD DE,V_SP
LD BC,20H
CALL LDIRVM
LD HL,ATR
LD DE,V_SPATR
LD BC,04H
CALL LDIRVM
RET
DAT:
DB $00,$00,$A7,$AF,$BF,$9F,$9D,$9D,$9F,$8F,$87,$80,$E7,$E1,$86,$00,$00,$00,$F2,$FA,$FE,$FC,$DC,$DC,$FC,$FF,$FB,$11,$7B,$CE,$30,$30
ATR:
DB $40,$80,$00,$0F
MSXマシン語でのスプライト 解説
まず、SCREEN1,2に設定します。
;SCREEN1,2
LD A,(RG0SAV+1)
OR 2
LD (RG0SAV+1),A
LD A,1
CALL CHGMOD
この部分です。
その解説はこちらへ。
スプライトの設定
;SPRITE
以降になります。
まず簡単に説明をしますと、
BASICでは、
データを読み込んで
SPRITE$で定義をする方法が有名です。
それを
PUT SPRITEで表示ですね。
マシン語はその方法ではありません。
スプライトの設定と表示ですが、
BASICでも、VRAMに直接書き込む方法というのがあります。
マシン語はその方法しかできません。
まずは、BASICでVRAM操作を勉強することをオススメします^^
VRAMについて
まずスプライトの形の設定です。
3800H番地〜 スプライトパターンジェネレータ
ここにスプライトパターン0から順に入れていきます。
LD HL,DAT
LD DE,V_SP
LD BC,20H
CALL LDIRVM
大切なのが
CALL LDIRVMです。
この上の3つはこのBIOSのための準備です。
アドレス 005C
LDIRVM
メモリからVRAMへブロック転送する。
HL 転送元の先頭アドレス
DE 転送先の先頭アドレス
BC 転送するバイト数
リターンパラメータ 無し
HLレジスタに値を入れる
HLレジスタに、スプライトパターンが入っている先頭アドレスを
入れます。
DAT: DB $00,$00,$A7,$AF,$BF,$9F,$9D,$9D, $9F,$8F,$87,$80,$E7,$E1,$86,$00, $00,$00,$F2,$FA,$FE,$FC,$DC,$DC, $FC,$FF,$FB,$11,$7B,$CE,$30,$30
DATが自分でつけたラベル?名です。
呼び出す時にこの名前を使います。
DBはデータを置く、のかな。
BASICでいうDATAですね。
アセンブラでは、勝手にどこかのアドレスにデータを置いてくれます^^
今回は、自分でつけた名前のDATをHLにいれてやれば、
データの先頭アドレスをHLに設定したことになります。
($は16進数です。)
LD HL,DAT
DEレジスタに値を入れる
アドレスは先頭のEQUで設定しておきます。
V_SP:EQU 0x3800
(V_SPは勝手につけた名前です^^)
DEに、VRAMのアドレスの3800H(スプライトのパターンが入っている場所)を
設定します。
(16進数の表現は色々ありますね〜。
0x〇〇だったり、$〇〇だったり、〇〇Hだったりと)
LD DE,V_SP
BCレジスタに値を入れる
BCレジスタにデータの量を設定。
スプライトのパターン(形)のデータは、16進数では32個(32バイト)です。
32を16進数で20Hです。
LD BC,20H
この3つを各レジスタに設定してから
BIOSのLDIRVMを呼びます。
これで形を設定しました。
ついで、
スプライトの座標などの設定
1B00H番地〜 スプライトアトリビュート
です。
LD HL,ATR
LD DE,V_SPATR
LD BC,04H
CALL LDIRVM
例によってBIOSのLDIRVMを呼びます。
VRAMに書き込む命令?ですね。
先ほどと同じです。
LDIRVM
メモリからVRAMへブロック転送する。
HL 転送元の先頭アドレス
DE 転送先の先頭アドレス
BC 転送するバイト数
HLレジスタに値を入れる
ATR: DB $40,$80,$00,$0F
を下の方に書いておきます。
順番が大切です。
$40はY座標、$80はX座標、
$00はスプライト0に設定するスプライトパターンです。
(今回は0。)
$0Fは色です。
LD HL,ATR
DEレジスタに値を入れる
V_SPATR:EQU 0x1B00
EQUでVRAMのアドレスを設定しておきます。
LD DE,V_SPATR
BCレジスタに値を入れる
そして、
転送データ量です。
LD BC,04H
04Hは、10進数で4です。4バイト!
まとめ
こちらで実行できます。
https://msxpen.com/codes/-LhaVfwG6gZz8nrLu3HF
(リンク先にソースコードもあります)
スプライトの設定はできました。
以前にやったスプライトの移動と組み合わせてください(・∀・)
近いうちにこれらをまとめて、
マシン語でスプライトの設定と、スプライトの移動と、歩行アニメーション
のソースコードを書きたいと思います。
組み合わせるだけですが(*^^*)
ps
只今、MSXでBEEPさんに応募するためにゲームを作っています。
やっとハイドライドタイプのスクロールが出来たところです。
間に合うかなぁ^^;
画面切り替えスクロールもいつか書いていきたいと思います。
HTML5で多色刷り用のMSX1 PCGのお絵かきツールを作っています。
複雑な機能を実装する気はありませんが、
こちらもいずれ公開したいと思います^^
自作MSXゲームがいっぱい公開される日を願っています(*´ω`*)
それでは〜。