ニャオニャオ21世紀

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

スポンサーリンク

WebMSXでMSX BASICの自作ゲーム作成!第14弾。 さらに早く!キャラクターパターンを読み込んで、前回より8.5秒短縮!(URLクリックで実行できます)

スポンサーリンク

WebMSXでMSX BASICの自作ゲーム作成!第14弾。

前回は3秒縮めましたが、今回はさらに8.5秒ほど短縮しました!

全部で11.5秒縮めたことになります!

 

今回は、

BSAVEでメモリを保存したファイルを、読み込んでVRAMに書きました。

キャラクターパターンそのものを書き込んだファイルを

読み込んでいます。

 

以前は、キャラクターをDATA文より読み込んで書き込むのを

やっていたのですが、それだけで8.5秒もかかっていたことになります。

 

例によって、実機だとあまり意味がないのですが;

 

まぁ、このブログを読んでくれている人のほとんどが、

エミュレータのWebMSXで動かしているので、まぁ意味があるといえば

あるのかな。

 

実機でもディスクだったら、

ステージごとに、キャラクターや

ステージを読み込むというプログラムなので意味があるプログラムかもしれません。

 

テープだとどうなるのかな?

ステージごとにテープでロード?

ありえない^^

テープ版レリクスって、たくさん読み込んでいたような。あんな感じ?

でもアクションゲームでは無しでしょう^^

 

 

しかし今回は時間がかかりました;

暴走につぐ暴走で、バグがとれないのです。

マシン語に不慣れなのと、メモリはどこまで書き込めるのかが

よく分かっていなかったのが原因です。

 

ちなみに今作っているのは、MSX1で、32Kバイト以上です。

まだまだ分かっていないことが多くて。

ディスク搭載機は、メモリはどこまで使えるのか?とか

あまりよくわかっていない状態です。

もっと調べてみないと;

 

マシン語は、DATA文にいれた文字数と、アドレスとの関係で

とても手間取ってしまいました。

アドレスはまだまだ慣れていないなぁ。

 

そんなこんなで苦労しましたが、ちょっと試してみてくださいm(. .)m

URLクリックで実行できます。(webMSXが起動します)

iphoneとかでも試すことができます。

 

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

 

一番最初のと比べてみてください。

下のは、以前のバージョンです。

MAPは今回の半分の4画面です。8画面だったら更に20秒ほどかかるのかな。

 

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

 

 

  

f:id:nyaonyaokun:20180327005613p:plain

 

どうでしょうか?

この差はすごくないでしょうか?^^

でもエミュだからなんですけどね〜;

 

 ソースコードを。

 

 5 CLEAR 200,&HB800:COLOR 15,5,1
10 SCREEN2:SCREEN1,2,0:DEFINTA-Z
:KEYOFF:WIDTH32:LOCATE14,4:PRINT
"wait"

15 DEFUSR=&H7E:DEFUSR3=&HB7E6:DE
FUSR4=&HB7F3

16 DEFUSR1=&HB800:DEFUSR2=&HB861

17 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 '
44 '
49 '
50 '
60 '
70 '

72 '
74 '
90 '
92 '
94 '
96 '
99 '

140 RESTORE960
145 F$="":G$="":READ F$,G$:F$=F$
+G$:FOR I=0 TO25:POKE &HB7E6+I,V
AL("&H"+MID$(F$,I*2+1,2)):NEXT:P
RINT"&hb7da"
150 B$="":READ B$:FOR I=0 TO47:P
OKE &HB800+I,VAL("&H"+MID$(B$,I*
2+1,2)):NEXT:PRINT"&hb800"
151 D$="":READ D$:FOR I=0 TO48:P
OKE &HB830+I,VAL("&H"+MID$(D$,I*
2+1,2)):NEXT:PRINT"&hb830"
152 E$="":READ E$:FOR J=0 TO12:P
OKE &HB861+J,VAL("&H"+MID$(E$,J*
2+1,2)):NEXT:PRINT"vram copy"
153 BLOAD"STAGEA.BIN"
160 V=USR3(&HC000):W=USR4(&HC180
):T=USR1(0)
168 U=USR2(&HC300)
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 '
392 '
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=USR2(&HC300+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


960 DATA 2AF8F711080201A000CD5C0
0C9
970 DATA 2AF8F711082201A000CD5C0
0C9
980 DATA 21080211080A01A000CD4A0
0EBCD4D00EB23130B78B120F12108021
1081201A000CD4A00EBCD4D00EB23130
B78B120F1
985 DATA 21082211082A01A000CD4A0
0EBCD4D00EB23130B78B120F12108221
1083201A000CD4A00EBCD4D00EB23130
B78B120F1C9
990 DATA 2AF8F7110018010003CD5C0
0C9

 

スポンサーリンク

 

 

 行番号がめちゃくちゃ(飛び飛び)で申し訳ないです;

 

15 DEFUSR=&H7E:DEFUSR3=&HB7E6:DE
FUSR4=&HB7F3

 

DEFUSR3=&HB7E6

プログラムの流れ的には

DEFUSR1としたいところですがご了承ください。

(マシン語を追記していったので、順序が逆に)

 

キャラクターの書き換えにおいて。

画面は上部、中部、下部と分かれています。

前回は、

上部はDATA文から読み込んでVPOKEで書き換えて、

中部、下部はマシン語でコピーするというのをやっていました。

 

今回は、ベースとなる上部のキャラクターを、

メモリからVRAMに書き込むというのをやっています。

(メモリにはBLOADで読み込む)

 

DEFUSR3=&HB7E6

というのは、そのメモリからVRAMへ(画面の上部の部分)

書き込むマシン語の先頭アドレスです。 

 

そのマシン語を使うときは、あとにでてきますが、

USR3(引数:データの入っているメモリのアドレス)

とやります。

 

DEFUSR4=&HB7F3

こちらは、キャラクターの色を、メモリからVRAMへ

書き込みます。

 

キャラクターは形と色が、別々の場所(VRAMのアドレスが)に

入っていましたよね。

 

 

140 RESTORE960
145 F$="":G$="":READ F$,G$:F$=F$
+G$:FOR I=0 TO25:POKE &HB7E6+I,V
AL("&H"+MID$(F$,I*2+1,2)):NEXT:P
RINT"&hb7da"

 

今回のメモリよりVRAM(画面の上部部分のデータ)にコピーする

マシン語は、960行と970行のDATA文に書きました。

 

145行は、そのマシン語をメモリにPOKE(書き込む)

しています。

 

 

153 BLOAD"STAGEA.BIN"
160 V=USR3(&HC000):W=USR4(&HC180
):T=USR1(0)
168 U=USR2(&HC300)

 

153行。キャラクターデータとマップデータを読み込みます。

(メモリに直接書き込んだデータです)

 

160行。

V=USR3(&HC000):

キャラクターデータをメモリからVRAMへコピーするマシン語。

(メモリの&HC000以降に、キャラクターデータが入っています)

 

W=USR4(&HC180):

キャラクターの色データをメモリからVRAMへコピーするマシン語。

(メモリの&HC180以降に、色データが入っています)

 

T=USR1(0)

先ほどの2つのマシン語でVRAMに書き込んだデータを、

コピーしています。

(中部、下部のデータ)

 

 

168 U=USR2(&HC300)

マップを表示します。(画面の表示をしているVRAMの部分に、

データを書き込みます。)

前回と違い、

メモリの&HC300以降にデータがあります。

 

メモリとVRAMの両方のアドレスがでてきてややこしいですね。

 

メモリ

&HC000-----------------

キャクターデータ

&HC180-----------------

キャラクター色データ

&HC300-----------------

マップデータ

&HDB00-----------------

 

というふうにしました。

これは、私が勝手に置いただけです。

 

 

SCREEN 2(VRAMの構成)

 

 

文字の形の入っているパターンジェネレータテーブルは、

&H0000-------------------------------------

↓   画面上段の文字        

&H0800-------------------------------------

↓   画面中段の文字  

&H1000-------------------------------------

↓   画面下段の文字

&H1800-------------------------------------

↓ パターンネーム

↓ (画面表示)

↓ 左上から右下まで。横32x縦24=768バイト

↓ 1バイトに1文字のアスキーコードを入れます。

&H1B00------------------------------------

↓ スプライトアトリビュート

 

文字の色の入っているカラーテーブルは、

&H2000-------------------------------------

↓   画面上段の文字の色         

&H2800-------------------------------------

↓   画面中段の文字の色  

&H3000-------------------------------------

↓   画面下の文字の色 

&H3800-------------------------------------

 

↓ スプライトジェネレータ

----------------------------------------------

 

 

キャラクターデータとマップデータはどう作るか?ですが、

上部に載せたWebMSXのファイル(URL)に、

STAGEA.BIN

というのが入っています。

(control + F9でプログラムを止めて、screen1(return)とし、

FILES(return)でプログラムの一覧がでます)

 

そのファイルは、

MAPMA4.BAS

というプログラムでつくりました。

(これも入っています)

 

その作り方は、

MAPMA4.BASのプログラムをRUNし、

bsave"STAGEA.BIN",&HC000,&HDB00

でファイルを保存しました。

詳しくは前回を参照してください。

 

 

今回のプログラムでかなり早くなりましたが

(WebMSX上では^^)

さらに早く出来そうです。

スプライトデータもメモリに書き込めば!

でもちょっとそのあたりも飽きてきたので、時間に余裕があったときに

します。

 

これからはなにをしようかな?

BASICを最適化すると、少し速くなるらしいので、

そのあたりをやりたいです。

もうちょっと速くならないかなぁ。

 

では〜。

スポンサーリンク

 

 

 

 

www.nyaonyao21.com

 


スポンサーリンク

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

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