ニャオニャオ21世紀

アイデア。レトロゲーム(MSX、PCエンジン、ファミコン、メガドライブセガサターン)と、MSXのゲーム開発と、最新ゲーム(PS4、SWITCH)、身体(身体意識など)、ライフハック、電子工作ほか雑記を綴っています

MSX マシン語(アセンブラ)のスプライトの定義方法 初心者歓迎!

MSXの機体の情報が一杯 これは必見の書籍!! 僕らの好きなMSXハードカタログ

今までは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

この部分です。

 

その解説はこちらへ。

www.nyaonyao21.com

 

 

スプライトの設定

;SPRITE

以降になります。

 

まず簡単に説明をしますと、

BASICでは、

データを読み込んで

SPRITE$で定義をする方法が有名です。

それを

PUT SPRITEで表示ですね。

 

マシン語はその方法ではありません。

 

スプライトの設定と表示ですが、

BASICでも、VRAMに直接書き込む方法というのがあります。

マシン語はその方法しかできません。

まずは、BASICでVRAM操作を勉強することをオススメします^^

 

VRAMについて

www.nyaonyao21.com

 

まずスプライトの形の設定です。

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です。

2進数、8進数、10進数、16進数相互変換ツール

 

LD BC,20H

 

 

この3つを各レジスタに設定してから

BIOSのLDIRVMを呼びます。

 

これで形を設定しました。

 

ついで、

スプライトの座標などの設定

1B00H番地〜 スプライトアトリビュート

です。

www.nyaonyao21.com

 

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

(リンク先にソースコードもあります)

 

スプライトの設定はできました。

以前にやったスプライトの移動と組み合わせてください(・∀・)

www.nyaonyao21.com

 

 

www.nyaonyao21.com

 

近いうちにこれらをまとめて、

マシン語でスプライトの設定と、スプライトの移動と、歩行アニメーション

のソースコードを書きたいと思います。

組み合わせるだけですが(*^^*)

 

ps

只今、MSXでBEEPさんに応募するためにゲームを作っています。

やっとハイドライドタイプのスクロールが出来たところです。

間に合うかなぁ^^;

 

画面切り替えスクロールもいつか書いていきたいと思います。

 

HTML5で多色刷り用のMSX1 PCGのお絵かきツールを作っています。

複雑な機能を実装する気はありませんが、

こちらもいずれ公開したいと思います^^

 

自作MSXゲームがいっぱい公開される日を願っています(*´ω`*)

それでは〜。


「ニャオニャオ21世紀は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」

当サイトは第三者配信の広告サービス「Google Adsense グーグルアドセンス」を利用しています。 広告配信事業者は、ユーザーの興味に応じた広告を表示するためにCookie(クッキー)を使用することがあります。 Cookie(クッキー)を無効にする設定およびGoogleアドセンスに関する詳細は「広告 – ポリシーと規約 – Google」をご覧ください