ニャオニャオ21世紀

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

WebMSXでMSX BASICの自作ゲーム作成!第12弾。 BLOADでMAPデータの読み込み。(URLクリックで実行できます)






WebMSXでMSX BASICのゲームを作ろう!第12弾。

今回は、RUNした直後の待ち時間を減らすために、

BLOADでMAPデータの読み込みをします。

 

本当は速くなっていないのです;

ただ、WebMSXでは早いだけなんです。(30秒ほど早いです)

実機でやった場合は、ディスクから、マップデータを直接メモリに

読み込んでいます。

テープの場合は、テープより読み込みます。

 

WebMSXの場合は、HDDなので早いのです。

 

前回のは、DATA文から読み込んだマップデータを、

POKEでメモリに書き込んでいました。

今回のは、ディスクより直接、マップデータを、

メモリに直接読み込みます。

 

どっちがいいかなんですよね〜。

URLクリックでできます。

 

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

 

 

f:id:nyaonyaokun:20180318113509p:plain

 

今回は特になにもやっていません。

あらかじめ保存しておいたマップファイルを読み込んでいるだけです。

(横は8画面分にしました)

 

ソースコードを、 

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=&HBFED
140 RESTORE990
150 READ B$:FOR I=0 TO 12:POKE &
HBFED+I,VAL("&H"+MID$(B$,I*2+1,2
)):NEXT
155 BLOAD"STAGE1.BIN"

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:IF ST>0 TH
EN ST=ST-1:GOSUB 610
300 IF X>240 THEN X=0:IF ST<7 TH
EN ST=ST+1:GOSUB 610
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<16 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)>=A
1(0) THEN Y=Y2*8:JF=0:GOTO 531
510 IF JY>=0 AND VPEEK(AE+64)>=A
1(0) THEN Y=Y2*8:JF=0:GOTO 532
520 IF JF=0 THEN JF=1:JC=0:JY=0
530 GOTO 539
531 IF VPEEK(AD+32)>=A1(0) THEN
Y=(Y2-1)*8:JF=0:GOTO 539
532 IF VPEEK(AE+32)>=A1(0) THEN
Y=(Y2-1)*8:JF=0:GOTO 539
534 '
539 PUTSPRITE 0,(X,Y),7,H
540 PUTSPRITE 1,(X,Y),11,H+2

550 GOTO 170

610 CLS
611 PUTSPRITE 0,(X,Y),7,H
612 PUTSPRITE 1,(X,Y),11,H+2
620 U=USR1(&HC000+768*ST)
630 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

 

 

 

130 DEFUSR1=&HBFED

ここが前回と違うのは、マシン語のメモリ上の位置を移動させただけです。

 

155 BLOAD"STAGE1.BIN"

STAGE1.BINというマップデータを読み込んでいます。

 

 マップデータファイルを作る

まず、電源をOFF(WebMSXの)にしてから作るといいと思います。

ステージファイルを作るために、

まずメモリにステージデータをいれます。

(この以下のプログラムは、MAPMAKE.BASファイルというファイル名で作りました。) 


10 CLEAR 200,&HC000:DEFINTA-Z
20 DIMR(16,12)
159 FOR I=0 TO6144:POKE &HC000+
I,32:NEXT
160 CLS:RESTORE 3000
161 DA=768:FOR Z=0 TO 7
163 FOR I=0 TO 11:READ M$:FOR K=
0 TO 15:R(K,I)=ASC(MID$(M$,K+1,1
)):NEXT:NEXT
164 FOR I=0 TO 11:FOR K=0 TO 15:
IF R(K,I)<>48 THEN BX=K*2:BY=I*2
:E=R(K,I):GOSUB 560:NEXT:NEXT EL
SENEXT:NEXT
166 NEXT
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
3000 DATA E000000000000000
3010 DATA I000000000000000
3020 DATA I000000000000000
3030 DATA I0000AAA00000000
3040 DATA IA000000000AAA00
3050 DATA I000000000000000
3060 DATA I00000E000000000
3070 DATA I000E0I000000000
3080 DATA I000IEI000000000
3090 DATA I0Q0III000000MMM
3100 DATA IQQ0III0000MMMMM
3110 DATA MMMMMMMMMMMMMMMM
3120 DATA 0000000000000000
3130 DATA 0000000000000000
3140 DATA AAA0000000000000
3150 DATA 00AAA00000000000
3160 DATA 0000AA0000000000
3170 DATA 0000000000000000
3180 DATA 0000000000000000
3190 DATA 0000AAA000000000
3200 DATA 0000000000Q00000
3210 DATA MMM0000000Q00000
3220 DATA MMMMM00000Q00000
3230 DATA MMMMMMMMMMMMMMMM
3240 DATA 0000000000000000
3250 DATA 0000000000000000
3260 DATA 0000000000000000
3270 DATA AAA0000000000000
3280 DATA 0000000000AAAAAA
3290 DATA 00000AA000000000
3300 DATA 0000000000000000
3310 DATA 0000000000000000
3320 DATA 0000EEEEEEE00000
3330 DATA 0000IIIIIII00000
3340 DATA 0000IIIIIII00000
3350 DATA MMMMMMMMMMMMMMMM
3360 DATA 0000000000000000
3370 DATA 0000000000000000
3380 DATA 000000AA00000000
3390 DATA 0000000000000000
3400 DATA AAAA000000000000
3410 DATA 000000Q000000000
3420 DATA 00000QQ000000000
3430 DATA 0000QQQ000000000
3440 DATA 000QQQQAAAAA0000
3450 DATA 00QQQQQ000000000
3460 DATA 0QQQQQQ000000000
3470 DATA MMMMMMMMMMMMMMMM
3480 DATA 0000000000000000
3490 DATA 0000000000000000
3500 DATA 000000AA00000000
3510 DATA 0000000000000000
3520 DATA 0000000000000000
3530 DATA 0000000000000000
3540 DATA 0000000000000000
3550 DATA 0000000000000000
3560 DATA 0000000AAAAA00E0
3570 DATA 00000000000000I0
3580 DATA 00Q0Q0Q0000000I0
3590 DATA MMMMMMMMMMMMMMMM
3600 DATA 0000000000000000
3610 DATA 0000000000000000
3620 DATA 000000AA00000000
3630 DATA 0000000000000000
3640 DATA 0000000000000000
3650 DATA 0000000000000000
3660 DATA 0000000000000000
3670 DATA 00000AAA00000000
3680 DATA 00000A00000AQQQ0
3690 DATA 000AAA0AAAAAQQQ0
3700 DATA 000000000000QQQ0
3710 DATA MMMMMMMMMMMMMMMM
3720 DATA 0000000000000000
3730 DATA 0000000000000000
3740 DATA 0000000000000000
3750 DATA 0000000000000000
3760 DATA 0000000000000000
3770 DATA 0000000000000000
3780 DATA 0000000000000000
3790 DATA 0000AAAAAAAAA000
3800 DATA 0000000000Q00000
3810 DATA 00AAAAAA00Q00A00
3820 DATA 0000000000Q00000
3830 DATA MMMMMMMMMMMMMMMM
3840 DATA 000000000000000E
3850 DATA 000000000000000I
3860 DATA 000000000000000I
3870 DATA 000000000000000I
3880 DATA 0000000000000EEI
3890 DATA 0000E000E00EEIII
3900 DATA 0000I000I00IIIII
3910 DATA 000AI000I0AIIIII
3920 DATA 0000I000I00IIIII
3930 DATA 0A00IAA0AA0IIIII
3940 DATA 0000I000000IIIII
3950 DATA MMMMMMMMMMMMMMMM

これは&HC000 ~ &HD800に

マップデータを入れています。

 

メモリにデータをいれたら、

今度は、STAGE1.BINファイルを作ります。

 

BSAVE"STAGE1.BIN",&HC000,&HD800

とやると、

&HC000 ~ &HD800のメモリがファイルに保存されます。

 

今回はこれだけです。

まぁ、WebMSXでやる分には、早くなるだけメリットがあるかな?

実機でディスクからマップデータを次から次へと読み込むのにも

使えますね。

ディスクさえあればメガROMみたいなゲームがつくれますね。

でもMSX1でディスクってハードル高いなぁ。

MSX2でもディスクが動かなくなってきてるし…。

 

SDカードをカートリッジにいれるのが欲しいです。

海外のやつしかないのがなぁ。

個人輸入しないといけないのが、ね。

 

公式で出てくれると嬉しいのですが。

MSX3といい、公式発表がなかなかないのが残念ですねぇ。

もっとMSXが盛り上がってくるといいんですけど。

 

キャラクターの書き換えデータも、外部ファイルにしてしまえば、

すくなくともWebMSXでは早くなるので

検討したいと思います。

 

500~532行で、ジャンプで地面のめり込みをなくす調整をしました。

610行〜とかの、水色の行は、前回の画面切り替えのプログラムです。

 

よかったら確認して見てください。

では〜。

スポンサーリンク

 

 

 

www.nyaonyao21.com


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

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