ニャオニャオ21世紀

レトロゲーム(MSX、PCエンジン、セガサターン)と、MSXぽいアプリ開発と、最新ゲーム(PS4、SWITCH)、身体(身体意識など)、ライフハックほか雑記を綴っています

WebMSXでMSX BASICの自作ゲーム作成!第十弾。 圧倒的速さ!マシン語で画面切り替え!(URLクリックで実行できます)

前回までマシン語入門で、BASICの中からマシン語を呼び出すというのを

やっていましたが、

今回は実際にプログラムしてみました。

まずは、以前書いたBASICでの画面切り替えを試してみてください。

f:id:nyaonyaokun:20180304134207p:plain

 

http://webmsx.org/?DISKA_URL=http://goods.heteml.jp/msx/move6dot (8).dsk

 

それでは、今回画面切り替えにマシン語を使ったものをどうぞ。

 

http://webmsx.org/?DISKA_URL=http://goods.heteml.jp/msx/move6dot (8).dsk

 

 

 

 

 

速い! ∑(゚◇゚///)ドキュ→ン

一瞬で表示されました!

確かに、ゲームが始まるまでの時間は遅くなりましたが、

画面切り替えは一瞬です!!

 

すごい!

これがマシン語の力か!

マシン語と言ったって、たった26文字ですよ!

すごいー!

 

感動はそのへんにしておいて、ソースコードの解説をします。

 

5 CLEAR 200,&HC000:COLOR 15,5,1
10 SCREEN2:SCREEN1,2,0:DEFINTA-Z
:KEYOFF:WIDTH32:LOCATE14,4:PRINT
"wait"
15 DEFUSR=&H7E:A=USR(0)
20 H2 = 1:X=112:Y=160:XX=4:YY=4:
DIM A1(20):SS=19:DIMR(16,12)
30 FOR J=0 TO 7:S$="":FOR I=1 TO
32:READD$:S$=S$+CHR$(VAL("&H"+D$
)):NEXT:SPRITE$(J)=S$:NEXT
40 FOR K=0 TO SS:A1(K)=65+K:NEXT

41 D$="":RESTORE 1000
44 FOR K=0 TO SS
49 D$=""
50 FOR I=0 TO 7
60 READ D$,C$
70 VPOKE A1(K)*8+I,VAL("&b"+D$)
72 VPOKE &H800+A1(K)*8+I,VAL("&b
"+D$)
74 VPOKE &H1000+A1(K)*8+I,VAL("&
b"+D$)
90 VPOKE &H2000+A1(K)*8+I,VAL("&
h"+C$)
92 VPOKE &H2800+A1(K)*8+I,VAL("&
h"+C$)
94 VPOKE &H3000+A1(K)*8+I,VAL("&
h"+C$)
96 NEXT
99 NEXT
130 DEFUSR1=&HD000
140 RESTORE990
150 READ B$:FOR I=0 TO 12:POKE &
HD000+I,VAL("&H"+MID$(B$,I*2+1,2)):NEXT
159 FOR I=0 TO1535:POKE &HC000+I,32:NEXT
160 CLS:RESTORE 3000
161 DA=768:FOR Z=0 TO 1
163 FOR I=0 TO 11:READ M$:FOR K=
0 TO 15:R(K,I)=ASC(MID$(M$,K+1,1
)):NEXT:NEXT
165 FOR I=0 TO 11:FOR K=0 TO 15:
IF R(K,I)<>48THEN BX=K*2:BY=I*2:
E=R(K,I):GOSUB 560:NEXT:NEXT ELS
E NEXT:NEXT
166 NEXT
167 U=USR1(&HC000)
170 S=STICK(0) OR STICK(1):TG=ST
RIG(0) OR STRIG(1)
180 IF JF<>1 THEN XX=0
185 XA=X:YA=Y
190 IF S=3 THEN XX=8
200 IF S=7 THEN XX=-8
210 X=X+XX
220 '
230 '

240 H2=-H2:IF JF=1 THEN H2=-1
250 IF S=3 AND H2=1 THEN H=0
260 IF S=3 AND H2=-1 THEN H=4
270 IF S=7 AND H2=1 THEN H=1
280 IF S=7 AND H2=-1 THEN H=5
290 IF X<0 THEN X=240:U=USR1(&HC000)
300 IF X>240 THEN X=0:CLS:U=USR1(&HC300)
310 IF JF=1 THEN 340
320 IF TG=0 THEN 390
330 JF=1:JY=-16:JC=3
340 IF JC=0 THEN 370
350 IF TG=0 THEN JC=0:GOTO 370
360 JC=JC-1
370 IF JC=0 AND JY<8 THEN JY=JY+4
380 Y=Y+JY
390 X2=(X-XX)\8:Y2=Y\8:Y3=(Y-JY)\8:IF J
F=0 THEN JY=0
391 'PUTSPRITE 0,(XA,YA),7,H
392 'PUTSPRITE 1,(XA,YA),11,H+2
400 AD = &H1800+(X\8)+(Y\8)*32

410 AE=&H1800+(

(X+15)\8)+(Y\8)*32
420 IF XX>0 AND VPEEK(AE)>=A1(0) THEN X
=X2*8:XX=0
430 IF XX>0 AND VPEEK(AE+32)>=A1(0) THE
N X=X2*8:XX=0
440 IF XX<0 AND VPEEK(AD)>=A1(0) THEN X
=X2*8
450 IF XX<0 AND VPEEK(AD+32)>=A1(0) THE
N X=X2*8:XX=0
460 AD = &H1800+(X\8)+(Y\8)*32
470 AE=&H1800+(

(X+15)\8)+(Y\8)*32
480 IF JY<0 AND VPEEK(AD)>=A1(0) THEN Y
=Y3*8:JF=0:JY=0
490 IF JY<0 AND VPEEK(AE)>=A1(0)THEN Y=
Y3*8:JF=0:JY=0
500 IF JY>=0 AND VPEEK(AD+64)>=A1(0) TH
EN Y=Y2*8:JF=0:GOTO 530

510 IF JY>=0 AND VPEEK(AE+64)>=A1(0) TH
EN Y=Y2*8:JF=0:GOTO 530

520 IF JF=0 THEN JF=1:JC=0:JY=0
539 PUTSPRITE 0,(X,Y),7,H
540 PUTSPRITE 1,(X,Y),11,H+2
550 GOTO 170
560 POKE &HC000+DA*Z + 32*BY + BX,E
570 POKE &HC000+DA*Z + 32*BY+BX+1,E+1
580 POKE &HC000+DA*Z + 32*(BY+1)+BX,E+2
590 POKE &HC000+DA*Z + 32*(BY+1)+BX+1,E+3
600 RETURN

800 DATA 2E,2D,67,7E,78,7C,38,06,16,17,
0F,14,1D,07,0F,0F,F0,F8,80,00,00,00,00,
00,E0,70,70,20,50,80,80,E0
省略
870 DATA 00,00,00,08,0A,1B,0F,07,00,00,
00,03,03,00,00,00,00,04,04,0C,00,80,80,
80,00,00,00,00,00,00,00,00

990 DATA 2AF8F7110018010003CD5C00C9

1000 DATA 00000100,1f
1010

省略
2590 DATA 11111000,c5
3000 DATA 0000000000000000
3010 DATA 0000000000000000
3020 DATA 0000000000000000
3030 DATA 00000AAA00000000
3040 DATA AA000000000AAA00
3050 DATA 0000000000000000
3060 DATA 000000E000000000
3070 DATA 0000E0I000000000
3080 DATA 0000IEI000000000
3090 DATA Q0Q0III000000MMM
3100 DATA 0QQQIII0000MMMMM
3110 DATA MMMMMMMMMMMMMMMM

3115'

3120 DATA 0000000000000000
3130 DATA 0000000000000000
3140 DATA 0000000000000000
3150 DATA 0000000000Q00000
3160 DATA 0000000000Q00000
3170 DATA 000000AA00Q00000
3180 DATA 0000000000Q00000
3190 DATA 0000AA0000Q00000
3200 DATA 0000000000Q00000
3210 DATA MMM0000000Q00000
3220 DATA MMMMM00000Q00000
3230 DATA MMMMMMMMMMMMMMMM

 

マシン語部分は、こちらの解説へどうぞ!

www.nyaonyao21.com

 

www.nyaonyao21.com

 

www.nyaonyao21.com

 

www.nyaonyao21.com

 

それほど難しいことはしていません。

ただ、メモリに置いておいたマップデータを

VRAM(表示画面のデータが入っている)へ転送するだけです。

ただマシン語で一括で転送するので速いのです。

(今回のマシン語は、転送しているだけ)

 

マップをメモリに書き込むのはBASICでやっています。

今回はそこだけですね。

 

では解説を続けます。

 

130 DEFUSR1=&HD000

マシン語を入れたメモリの先頭アドレスを宣言しています。

DEFUSR1

でなぜ1なのかというと、既にキャラクターの多色刷りで

DEFUSR0を使っているからです。

 

15 DEFUSR=&H7E:A=USR(0)

ここですね。

 

140 RESTORE990

990行にマシン語の入ったDATA文を置いています。



150 READ B$:FOR I=0 TO 12:POKE &
HD000+I,VAL("&H"+MID$(B$,I*2+1,2)):NEXT

メモリに、

アドレスの&HD000から順にマシン語を入れていきます。

たったそれだけです。

 

 

VALは数字にする命令。

この場合は&Hがついているので数字の16進数にしています。

データ文から取ってきたのはB$へいれています、つまり文字列なのです。

($は文字の変数に つける。)

 

MID$( 文字列, 先頭文字位置, 取得する文字数 )は、

文字を抜き出す命令です。

 

MID$(B$,I*2+1,2)

16進数を2文字づつメモリにいれていくから、

2文字づつ取っていっています。

 

 

159 FOR I=0 TO1535:POKE &HC000+I,32:NEXT

メモリのアドレス&HC000から、

2画面 分の1536バイト(screen1の1画面分は768バイト)に

キャラクターコードの、32を入れておきます。

キャラクターコード 32はスペースです。

 

 

前回は

VPOKEでVRAMに画面データを書き込んでいたところを

今回は、

RAM(メモリ)に変更しました。

 

560 POKE &HC000+DA*Z + 32*BY + BX,E
570 POKE &HC000+DA*Z + 32*BY+BX+1,E+1
580 POKE &HC000+DA*Z + 32*(BY+1)+BX,E+2
590 POKE &HC000+DA*Z + 32*(BY+1)+BX+1,E+3

 

DAは768で、

Z=0で1画面目、

Z=1で2画面目を

書き込んでいます。

 

本当はこんな風にやらないほうがいいのかもしれません。

1画面づつ入れていくのではなく、全体のマップデータを書き込んでやったほうが

いいのかもしれません。

でもそうなってくるとマシン語のところも変えないといけないのかな?

スクロールをやるなら、今回のプログラムではまずいです。

あくまで一番簡単な画面切り替えのプログラムです。

 

 

今回のプログラムの課題は、始まるまでが遅いこと。

よくMSX FANなどの雑誌に載っていたプログラムだと、

キャラクター定義もマシン語でやっていますね。

それも考慮にいれないといけませんねぇ〜。

 

このゲームをどんなゲームにするかですが、

魔城伝説1を横画面にしたような感じにしようと思います。

シンプルなゲームにするので、武器の切り替えとか、パネルとかは無しの方向で。

画面切り替え式のTiny魔界村みたいな感じにしようかなぁ。

 

BASICでどこまで出来るのかわからないですけど^^

敵を出したり、矢を飛ばしたりしたら、速度はどうなるんでしょうね〜。

出来ない場合は、マシン語を入れるなり、企画を変更するなりしていきたいと

思います。

では〜。 

 

 

MSX FANに載っているBASICとマシン語の解説は すばらしいです。

 勉強するにはいい雑誌です。

msx・fan | 通販ショップの駿河屋

 

PS.最近、駿河屋さんのアフィリエイトをはじめました。 なにぶん貧乏なので

ご利用いただけると嬉しいです^^

 

次のページ 

www.nyaonyao21.com


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

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