ニャオニャオ21世紀

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

EMUでMSX BASIC言語!第九弾。 MAPをDATA文より持ってくる。遅い^^(URLクリックで実行できます)

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

今日はマップをDATA文より取得します。

前回までは、LOCATE、PRINTで表していました。

かなりアナログな方法だったのですけど、

意外や意外、表示は一瞬でした。

しかし今回、マップデータを読み込みで表示したところ

かなり遅くなってしまいました^^

これぞ、BASIC!

っていうスピードです。

 

URLクリックで実行できます。

 

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

 

f:id:nyaonyaokun:20180304134207p:plain

 

ちなみに、右へ進むと、画面切り替えで隣のステージへいけるように

してみました。

(これから益々遅くなることを危惧して、キャラは8ドット移動です。)

 

表示をVRAMに書き込んでやっているのは、

今後、一部マシン語で使うときに、やりやすくなるように、です。

マシン語にはBIOSに、メモリのデータを一括でVRAMに移すことが

できるらしいので、期待しております!

 

そーいえば、当時、マシン語を使ったプログラムはあんまり打ち込んだ

ことがなかったので、どのくらい速くなるのか、

まったくの未知数です^^

 

今回のマップ読み込みは、圧縮的なことはしておりません

(そもそもよくわからないし)

ではソースコードを。


5 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:DIM R(16,12)
30 FOR J=0 TO 7:S$="":FOR I=1 TO32:READ
D$: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
100 CLS:RESTORE 3000
110 FOR I=0 TO 11:READ M$:FOR K=0 TO 15
:R(K,I)=ASC(MID$(M$,K+1,1)):NEXT:NEXT
120 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 ELSE NEXT:NEXT
170 S=STICK(0) OR STICK(1):TG=STRIG(0)
OR STRIG(1)
180 IF JF<>1 THEN XX=0
185 XA=X:YA=Y
190 IF S=3 THEN XX=6
200 IF S=7 THEN XX=-6
210 X=X+XX
220 'IF S=1 THEN Y=Y-YY

230 'IF S=5 THEN Y=Y+YY
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=0
300 IF X>240 THEN X=0:CLS:GOTO110
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 VPOKE &H1800 + 32*BY + BX,E
570 VPOKE &H1800+ 32*BY+BX+1,E+1
580 VPOKE &H1800 + 32*(BY+1)+BX,E+2
590 VPOKE &H1800 + 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
810 DATA 0F,1F,01,00,00,00,00,00,07,0E,
0E,04,0A,01,01,07,74,B4,E6,7E,1E,3E,1C,
60,68,E8,F0,28,B8,E0,F0,F0
820 DATA 10,10,18,00,01,01,01,00,00,00,
00,03,00,00,00,00,00,00,10,50,D8,F0,E0,
00,00,00,00,00,00,00,00,00
830 DATA 00,00,08,0A,1B,0F,07,00,00,00,
00,00,00,00,00,00,08,08,18,00,80,80,80,
00,00,00,00,C0,00,00,00,00
840 DATA 00,1E,5D,4B,7E,78,7C,38,06,0D,
1D,0D,16,2B,38,1E,00,E0,F8,80,00,00,00,
00,00,E0,F0,30,20,D4,3C,38
850 DATA 00,07,1F,01,00,00,00,00,00,07,
0F,0C,04,2B,3C,1C,00,78,BA,D2,7E,1E,3E,
1C,60,B0,B8,B0,68,D4,1C,78
860 DATA 00,20,20,30,00,01,01,01,00,00,
00,00,00,00,00,00,00,00,00,10,50,D8,F0,
E0,00,00,00,C0,C0,00,00,00
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
1000 DATA 00000100,1f
1010 DATA 00000100,15
1020 DATA 00000100,15
1030 DATA 11111111,15
1040 DATA 00100000,15
1050 DATA 00100000,15
1060 DATA 00100000,14
1070 DATA 11111111,15
1075 '
1080 DATA 00000100,1f
1090 DATA 00000100,15
1100 DATA 00000100,15
1110 DATA 11111111,15
1120 DATA 00100000,15
1130 DATA 00100000,15

1140 DATA 00100000,14
1150 DATA 11111111,15
1155 '
1160 DATA 00000000,15
1170 DATA 00000000,15
1180 DATA 00000000,15
1190 DATA 00000000,15
1200 DATA 00000000,15
1210 DATA 00000000,15
1220 DATA 00000000,15
1230 DATA 00000000,15
1235 '
1240 DATA 00000000,15
1250 DATA 00000000,15
1260 DATA 00000000,15
1270 DATA 00000000,15
1280 DATA 00000000,15
1290 DATA 00000000,15
1300 DATA 00000000,15
1310 DATA 00000000,15
1315 '
1320 DATA 00000000,ef
1330 DATA 11111111,ee
1340 DATA 01100110,1f
1350 DATA 11111111,ee
1360 DATA 01100110,1f
1370 DATA 11111111,ef
1380 DATA 10011000,5f
1390 DATA 10000000,5e
1395 '
1400 DATA 00000000,ef
1410 DATA 11111111,ee
1420 DATA 01100110,1f
1430 DATA 11111111,ee

1440 DATA 01100110,1f
1450 DATA 11111111,ef
1460 DATA 00011001,5f
1470 DATA 00000001,5e
1475 '
1480 DATA 11001000,5f
1490 DATA 11001000,5f
1500 DATA 11001000,5f
1510 DATA 11001000,5f
1520 DATA 11001000,5f
1530 DATA 11001000,5f
1540 DATA 11001000,5f
1550 DATA 11001000,5f
1555 '
1560 DATA 00010011,5e
1570 DATA 00010011,5e
1580 DATA 00010011,5e
1590 DATA 00010011,5e
1600 DATA 00010011,5e
1610 DATA 00010011,5e
1620 DATA 00010011,5e
1630 DATA 00010011,5e
1635 '
1640 DATA 11001000,5f
1650 DATA 11001000,5f
1660 DATA 11001000,5f
1670 DATA 11001000,5f
1680 DATA 11001000,5f
1690 DATA 11001000,5f
1700 DATA 11001000,5f
1710 DATA 11001000,5f
1715 '
1720 DATA 00010011,5e
1730 DATA 00010011,5e
1740 DATA 00010011,5e
1750 DATA 00010011,5e
1760 DATA 00010011,5e
1770 DATA 00010011,5e
1780 DATA 00010011,5e

1790 DATA 00010011,5e
1795 '
1800 DATA 11001000,5f
1810 DATA 11001000,5f
1820 DATA 11001000,5f
1830 DATA 11001000,5f
1840 DATA 11001000,5f
1850 DATA 11001000,5f
1860 DATA 11001000,5f
1870 DATA 11001000,5f
1875 '
1880 DATA 00010011,5e
1890 DATA 00010011,5e
1900 DATA 00010011,5e
1910 DATA 00010011,5e
1920 DATA 00010011,5e
1930 DATA 00010011,5e
1940 DATA 00010011,5e
1950 DATA 00010011,5e
1955 '
1960 DATA 00000100,1e
1970 DATA 00000100,18
1980 DATA 00000100,16
1990 DATA 11111111,15
2000 DATA 00100000,23
2010 DATA 00001000,a3
2020 DATA 01000010,c3
2030 DATA 10000010,c3
2035 '
2040 DATA 00000100,1e
2050 DATA 00000100,18
2060 DATA 00000100,16
2070 DATA 11111111,15
2080 DATA 00100000,23
2090 DATA 00001000,a3
2100 DATA 01000010,c3
2110 DATA 10000010,c3

2115 '
2120 DATA 00000100,23
2130 DATA 00100000,c3
2140 DATA 10000100,c3
2150 DATA 10010011,c3
2160 DATA 00001000,23
2170 DATA 00100100,c3
2180 DATA 10000000,c3
2190 DATA 00001000,c3
2195 '
2200 DATA 00000100,23
2210 DATA 00100000,c3
2220 DATA 10000100,c3
2230 DATA 10010011,c3
2240 DATA 00001000,23
2250 DATA 00100100,c3
2260 DATA 10000000,c3
2270 DATA 00001000,c3
2275 '
2280 DATA 00001111,35
2290 DATA 00111111,35
2300 DATA 01110111,35

2310 DATA 11111111,3c
2320 DATA 11111111,3c
2330 DATA 11111011,3c
2340 DATA 11111111,2c
2350 DATA 11011111,32
2355 '
2360 DATA 11110000,35
2370 DATA 11111100,35
2380 DATA 11111110,35
2390 DATA 10111111,3c
2400 DATA 11110111,3c
2410 DATA 11111111,2c
2420 DATA 10111110,3c
2430 DATA 11101111,22
2435 '
2440 DATA 11111110,3c
2450 DATA 01111111,2c
2460 DATA 11110111,3c
2470 DATA 11011111,2c
2480 DATA 01111111,2c
2490 DATA 01111111,25
2500 DATA 00111111,c5
2510 DATA 00011111,c5
2515 '
2520 DATA 11111011,3c
2530 DATA 11111111,2c
2540 DATA 11011111,3c
2550 DATA 11111011,2c
2560 DATA 11111110,2c
2570 DATA 11111110,25
2580 DATA 11111100,c5
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

 

スポンサーリンク

 

 

では、簡単に説明を。

100 CLS:RESTORE 3000

マップデータは3000行以降に入っています。

 

110 FOR I=0 TO 11:READ M$:FOR K=0 TO 15
:R(K,I)=ASC(MID$(M$,K+1,1)):NEXT:NEXT

 

<画面構成>

16x16ドット(2文字x2文字)を1単位としてます。

データ量を減らすためです。

 

          横:16ブロック

        |ーーーーーーーー|

縦:12ブロック |        |  

        |        |

        |ーーーーーーーー|

1ブロック(16x16)は、4文字で構成されています。

その左上の文字をDATA文に入れておきます。

    A B

              C D

で構成されていたら、AをDATA文にいれておきます。

4文字を連番で形を変えています。

 

ABCDの文字を、レンガに。

EFGHの文字を、柱の上部に。

IJKLの文字を、柱に。

MNOPの文字を、地面に。

QRSTの文字を、草に。

しております。

 

R(K,I)=ASC(MID$(M$,K+1,1))

の部分は、

R ( K , I ) は、R ( X座標、Y座標 )になります。

2次元配列の座標に、一文字ずつ入れていきます。

 

120行は、

120 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):GOSUB560:NEXT:NEXT ELSE NEXT:NEXT

 

R ( X座標、Y座標 )が48(0のアスキーコード)じゃない時、

560行へ行きます。(BX、BYは2文字づつ書き換えなので、*2している)

 

 

560行はVRAMの画面構成の部分を書き換えるサブルーチンです。

560 VPOKE &H1800 + 32*BY + BX,E
570 VPOKE &H1800+ 32*BY+BX+1,E+1
580 VPOKE &H1800 + 32*(BY+1)+BX,E+2
590 VPOKE &H1800 + 32*(BY+1)+BX+1,E+3
600 RETURN

 

VRAMの&H1800から、画面の情報が入っています。

Eは、ブロックの左上のアスキーコードがはいっています。

E+1は、ブロックの右上、

E+2は、ブロックの左下、

E+3は、ブロックの右下

です。

 

 

3000行以降のDATAは、

3000行~3110行 で、スタート時のマップのデータ

3120行~3230行で、右隣のマップデータです。

 

マップの切り替えは、まだ簡易なものなので、また今度。

 

とりあえず、今後、マシン語の勉強をします。

BIOSを使うだけなので、それほど時間はかからないと思います。

(BIOSとは、初めから用意されている命令群のようなもの。速い!)

 

そろそろデータを2進数から、16進数にしないといけないですね。

見やすいけど、長すぎる;

 

ジャンプの修正もしないと…。

すこしづつやっていきます。

 

今回、かなり遅くなってしまって、ゲームとしてはなんだかなぁと

いう感じになってしまいました。

データ量を気にしなければ、以前のPRINT文の方が速いので、

そちらでやられるのもいいと思います。

 

さあ、マシン語!

楽しみすぎます〜。

 

iphoneとandroidでアプリを作りました。

MSXっぽいアプリで、横スクロールランアクションゲームです。

ボスとかはいっております。簡単操作で懐かしいを目指して作りました。

 無料です。お願いします〜〜〜^^

8bit run run go

8bit run run go

  • nao21
  • ゲーム
  • 無料

 

 

play.google.com

 

www.nyaonyao21.com

 

次のページ

www.nyaonyao21.com

 

 

スポンサーリンク

 

 

 


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

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