GAME68クロスコンパイラを書いてみた(2) (ベーシックマスター開発 その21)

2024/08/16BASICMASTER, 昔のパソコン

前回記事で「区切りとして github に置きました。この版はこれで終わりにして、第2版を作ろう」と書いたのですが、2週間で書いた割には意外に実用になるので、バグ修正と高速化を1週間ほど頑張ってみました。

現在では、ASCII 1979年7月号P.26(エンサイクロペディア・アスキー Vol.4 P.213)の「GAME80コンパイラ」記事に掲載されている「スターファイヤー」ゲームも動くようになっています。

私にはインタプリタの速さでちょうど良いぐらいで、コンパイルすると速すぎてゲームになりません。記事にも書かれているように、コンパイラの速さを活かして、敵機の数を増やすなどの改造を行なった方が良いです。

スターファイヤーゲームの修正点

ASCII 1979年7月号の「スターファイヤー」はTK-80BS用なので、そのままでは動作しません。下記の修正を行なっています。

TK-80BSは画面横幅が32文字で、ベーシックマスターと同じなので移植はやりやすいです。
縦幅は16行で、ベーシックマスター(24行)よりも小さく、そのためスターファイヤーの画面も下1/3が空いています。この部分にゲーム画面を拡大するのも面白いと思います。


--- starfire.game.orig	2024-08-15 23:34:24
+++ starfire.game	2024-08-15 23:34:14
@@ -1,22 +1,23 @@
-10** STAR FIRE **
+10** STAR FIRE ** ASCII 1979.7 P.26 / Encyclopedia ASCII Vol.4 P.213
 20 E=0 G=0 H=0
 40 SCORE=0 FUEL=600
-50 V=$7E00 KEY=$7DFC P=$847D
-60 >=$FA6C
+49* V:VRAM TOP, KEY:TK-80BS key in port, P:cursor X,Y (BS:1 origin,BM:0 origin)
+50 V=$0100 KEY=$7DFC P=$000F
+60 >=$FFEF
 70 LOCK=0 TOPEDO=0
-80 P:1)=16
+80 P:1)=16-1
 90 X='30 Y='15-1
 100 B=Y*32+X-1+V
-110 R:0)=$A8 B:1)=$CA B:2)=$A7
+110 B:0)=$8A B:1)=$94 B:2)=$88
 120 ;=L>0 L=L+1 #=200
-130 ;=(X=15)*(Y=7) L=1 P:0)=1 "LOCKED!!" #=200
+130 ;=(X=15)*(Y=7) L=1 P:0)=1-1 "LOCKED!!" #=200
 140 X=X+'3-2 Y=Y+'3-2
-200 P:0)=12
+200 P:0)=12-1
 210 "SCORE:" ?(4)=S
 220 " FUEL:" ?(4)=F
 240 ;=F<1 #=5000
 250 F=F-1
-300 A=K:0) ;=L #=350
+300 A=[ ;=L #=350
 310 ;=A="I" Y=Y+1
 320 ;=A="J" X=X+1
 330 ;=A="K" X=X-1
@@ -25,7 +26,7 @@
 360 ;=(A="F")*T #=4000
 400 ;=L<4 #=500
 410 L=0 X=X+'3-2 Y=Y+'3-2
-420 P:0)=1 "        "
+420 P:0)=1-1 "        "
 500 ;=L !=3000
 510 ;=L=0 !=3050
 520 C=(+(X-15)<5)*(+(Y-7)<4)
@@ -36,32 +37,32 @@
 960 ;=(Y<0)+(Y>14) H=H+1 #=90
 990 #=100
 3000** LOCK TARGET**
-3010 N=$8B M=$9A !=3100
+3010 N=$86 M=$85 !=3100
 3020 N=$20 M=$20 #=3100
 3050** TARGET SCOPE **
-3060 N=$A4 M=$A4
+3060 N=$80 M=$80
 3100 I=143,207 V:I)=N @=I+32
 3110 I=271,335 V:I)=N @=I+32
 3120 I=234,237 V:I)=M @=I+1
 3130 I=241,244 V:I)=M @=I+1
 3140 ]
 3200** TARGET INDICATER **
-3210 N=$A7 M=$A5 !=3300
-3220 V:Y*32+21)=$BC
-3230 V:X+352)=$BD
+3210 N=$88 M=$8B !=3300
+3220 V:Y*32+21)=$7B
+3230 V:X+352)=$7E
 3240 ]
 3250** OFF INDICATER **
 3260 N=$20 M=$20
 3300 I=149,341 V:I)=N @=I+32
 3310 I=362,372 V:I)=M @=I+1
 3320 ]
-4000 T=0 N=$B3 M=$B6 !=4300
+4000 T=0 N=$FC M=$FD !=4300
 4010 ;=V:239)=" " #=4200
-4100 V:206)=$FA V:207)=$FA
-4110 V:238)=$FA V:239)=$FA
-4120 V:240)=$FA V:270)=$FA
-4130 V:272)=$FA
-4150 P:0)=1 "GOT HIM!!"
+4100 V:206)=$9D V:207)=$9D
+4110 V:238)=$9D V:239)=$9D
+4120 V:240)=$9D V:270)=$9D
+4130 V:272)=$9D
+4150 P:0)=1-1 "GOT HIM!!"
 4160 S=S+50
 4170 I=1,1000 @=I+1
 4180 G=G+1
@@ -73,7 +74,7 @@
 4310 @ V:I)=N V:J)=M
 4320 I=I-31 J=J-33 @=(I=239)
 4330 ]
-5000 P(0)=$508
+5000 P(0)=$508-$101 >=$FFEF
 5010 "*** GAME OVER ***"//
 5020 "GET SHOT:   " ?=G /
 5030 "MISS SHOT:  " ?=E /

コンパイラの改善点

  • “…" と / の連続を許すようにした。小手先の誤魔化しなので、救えないパターンもありそう。
  • 負数の除算、MODの最適化が誤っていた。インタプリタでは、負数の除算は正数同士の演算結果に符号をつけるようになっていたので、それに合わせた。遅くなった。MODも同様で、剰余は正の値になるようにした。
  • 乗除算・乱数を高速なルーチンに差し替え
  • その他、バグ修正・姑息な高速化


資料