
AIにMSXのインベーダー風ゲームを作ってもらいました(SCREEN 3・マシン語版)
毎度、rorosukeです。
前回、AIを使用してMSX BASIC+マシン語プログラムまで作れることを紹介する記事を公開しました。それがこちらです。
その「まとめ」で「本格的にMSXプログラムを作ってみたい」と言っていますが、その通りになってしまいました。
何かというと、これまでも何度か作ってきた、
スペースインベーダー風ゲーム
を作りました。その画面がこちらです。





注1:MSXPenの機種設定を「turbo R」にすると、ロード時間を短縮できる裏技があります。なお、私の環境では「turbo R」にするとゲーム速度が上がりました。これは、「turbo R」が速いというより「MSX1」モードで処理落ちしているのかもしれません(気にしないことにします)。
実行方法
本ゲームを実行してプレイするには、MSXの実機かエミュレータが必要です。実機としては、必要なRAMは32KB以上です(ただし、本プログラムコードについて、実機での動作確認はしていません)。
お勧めは、オンラインで動作するMSXPenです。難しいことは考えずに、次のプログラムへのリンクをクリックすれば、自動的に実行開始となります。動作確認はこのMSXPenで行っています。
右下のボタンで全画面表示も可能です。

自分でプログラムコードを貼り付けて実行したいときには、次をクリックして、MSXPenページにアクセスします。コードを左側にペーストして、左下の「Run」ボタンを押します。

MSXPenの覚えておくと便利なキー操作
便利なキー操作をメモっておきます。
F9:ポーズ。プログラムやリスト出力の一時停止
F9+Ctrl:ストップ。プログラムやリスト出力の中断
Alt+V の後に Ctrl+V:MSX BASICへのテキストのペースト
ゲームの操作とルール
操作
移動:カーソルキー、またはジョイスティックの左右
発射:スペースキー、またはトリガーボタン
タイトル画面でスペースキーを押すとスタートします
得点
上段のインベーダー:30点
中段のインベーダー:20点
下段のインベーダー:10点
UFO:50・100・150・300点のいずれか(撃つまで分かりません)
ルール
自機は3機です。敵の弾に当たると1機失います
インベーダーを全滅させると、次のウェーブ(ステージ)に進みます。進むほど、インベーダーが下の位置から始まります
自機の前に並ぶトーチカは、自分の弾と敵の弾の両方を防ぎます。弾が当たった場所から少しずつ削れ、次のウェーブに進むと元に戻ります
UFOは画面上部に、左右どちらかからランダムで現れます。インベーダーが残り8体以上のときだけ出てきます
インベーダーが自機の高さまで降りてくると、自機が点滅したあとでゲームオーバーです。残機があっても終了します
最後の1機が撃たれたときも、自機が点滅してからゲームオーバーになります
ハイスコアは、電源を入れている間だけタイトル画面に記録されます
SCREEN 3を採用した理由
ゲーム画面を見ると、ドットがすごく粗いです。これは、MSXユーザーならご存じの、
SCREEN 3(横64 × 縦48ドット)
です。このスクリーンモードは、非常にレトロ感があって、初期ビデオゲームらしさを表現するのに向いている感じがして個人的にも大好きです。
今回はスプライトを使わず、インベーダーも自機も弾も、すべてこの粗いドットで描いています。
ただし、たくさんのインベーダーや弾をBASICだけで描き直すと、どうしても動きが遅くなります。そこで今回は、描画やゲーム進行を担当するマシン語プログラムをAIに作ってもらいました。
マシン語ルーチンを作ってもらうのは前回に続いて2回目ですが、しっかり動作しています。すごすぎますね。
高速に動く仕組み
AIに設計してもらった内容を、簡単にまとめます。
画面をいったんRAMに描く:画面を消してから一つずつ描き直す方式に比べ、ちらつきを抑えやすくなります。ただし、毎回まとめて転送するため、その分の処理時間は必要です。
インベーダーはバイト単位で描く:SCREEN 3では横2ブロックが1バイトにまとまっています。1ブロックずつ点を打つのではなく、あらかじめ用意した絵のパターンを、バイトのまま書き込んでいます
BASICは司令塔だけ:キー入力の取得、ゲームの進行、描画はすべてマシン語です。BASICは1フレームごとにマシン語を呼び出して、効果音を鳴らし、ゲームオーバーを確認するだけです
まとめ:大満足の出来
MSXのプログラムを作るとき、SCREEN 3で何かを作ってやろうと思って、最初にAIに聞いたのが次のプロンプトです。
👦
スペースインベーダーゲームのようなものを作りたいです。もしくはブロック崩しでもいいです。スプライトは使わずにドット処理だけでゲームを作りたいと考えています。
これに対して、次のような返事がきました。
💻
ブロック崩しよりスペースインベーダーの方が、64×48ブロックの画面でも作りがいがあるので、そちらで進めます。SCREEN 3の描画ライブラリ(RAM上のバッファに描いて一括転送する方式)と、ゲーム本体のマシン語をまとめて作り、エミュレータでテストしてからお渡しします。
「スペースインベーダーの方が作りがいがある」って、AIさんの意気込みがすごすぎます! そう言われたら、やっぱ作らないわけにはいきません。これが、インベーダーゲームを作った理由です。
難易度は、易しいようでステージを何面もクリアするのは難しめです(本家同様に、初期位置が下がってきます)。簡単すぎないので、シューティング好きな人なら、ある程度楽しめるかと思います。
ぜひプレイしてみてください。
以上!
プログラムコード
ゲームのコードです。マシン語プログラムは、前回同様にDATA文になっていて、起動時にメモリにローディングされるようになっています。
10 REM === SPACE INVADERS MSX1 SCREEN 3 (no sprites, machine code engine) ===
20 CLEAR 300,&HCFFF
30 DEFINT A-Z
40 HI!=0:PH=0:WB=0:SF=0
50 SCREEN 0:WIDTH 40:KEY OFF:CLS:PRINT "LOADING..."
60 GOSUB 2000
70 DEFUSR0=&HD000:DEFUSR1=&HD003
80 GOSUB 1100
90 SCREEN 3,0:COLOR 15,1,1
100 SOUND 7,&H9C:SOUND 8,0:SOUND 9,0:SOUND 10,0
110 X=USR1(0)
120 REM ---- MAIN LOOP ----
130 TIME=0
140 X=USR0(0)
150 EV=PEEK(&HE60F)
160 IF EV AND 1 THEN GOSUB 1700
170 IF EV AND 6 THEN GOSUB 1710
180 IF EV AND 8 THEN GOSUB 1720
190 IF EV AND 16 THEN GOSUB 1730 ELSE SOUND 9,0
195 IF EV AND 64 THEN GOSUB 1710:GOSUB 1750
197 GOSUB 1740
200 IF PEEK(&HE610) THEN 3000
210 IF TIME<3 THEN 210 : REM 3=20fps 2=30fps
220 GOTO 130
1100 REM ---- TITLE (text screen) ----
1110 SCREEN 1:COLOR 15,1,1:WIDTH 32:KEY OFF:CLS
1120 LOCATE 8,3:PRINT "SPACE INVADERS"
1130 LOCATE 6,5:PRINT "- SCREEN 3 EDITION -"
1140 LOCATE 6,9:PRINT "30 PTS = <o>"
1150 LOCATE 6,10:PRINT "20 PTS = {o}"
1160 LOCATE 6,11:PRINT "10 PTS = [o]"
1165 LOCATE 6,12:PRINT "50-300 = UFO"
1170 LOCATE 6,14:PRINT "CURSOR/STICK : MOVE"
1180 LOCATE 6,15:PRINT "SPACE/TRIGGER: FIRE"
1190 LOCATE 6,18:PRINT "HI-SCORE";HI!
1200 LOCATE 5,21:PRINT "PRESS SPACE TO START"
1210 IF STRIG(0) OR STRIG(1) THEN 1210
1220 IF NOT (STRIG(0) OR STRIG(1)) THEN 1220
1230 RETURN
1700 REM ---- SOUND: SHOT ----
1702 SOUND 0,40:SOUND 1,0:SOUND 11,0:SOUND 12,5:SOUND 8,16:SOUND 13,9
1704 RETURN
1710 REM ---- SOUND: EXPLOSION ----
1712 SOUND 6,18:SOUND 11,0:SOUND 12,20:SOUND 10,16:SOUND 13,9
1714 RETURN
1720 REM ---- SOUND: WAVE CLEAR ----
1722 FOR P=300 TO 60 STEP -10
1724 SOUND 2,P AND 255:SOUND 3,P\256:SOUND 9,12
1726 NEXT P:SOUND 9,0:RETURN
1730 REM ---- SOUND: MARCH ----
1732 PH=(PH+1) AND 3:P=700-PH*50
1734 SOUND 2,P AND 255:SOUND 3,P\256:SOUND 9,10:RETURN
1740 REM ---- SOUND: UFO SIREN ----
1742 IF EV AND 32 THEN WB=(WB+1) AND 3:P=400+WB*70:SOUND 0,P AND 255:SOUND 1,P\256:SOUND 8,6:SF=1:RETURN
1744 IF SF THEN SF=0:SOUND 8,0
1746 RETURN
1750 REM ---- SOUND: UFO HIT ----
1752 FOR P=100 TO 400 STEP 30
1754 SOUND 2,P AND 255:SOUND 3,P\256:SOUND 9,12
1756 NEXT P:SOUND 9,0:RETURN
2000 REM ---- LOAD MACHINE CODE (D000H) ----
2010 RESTORE 6000:A=&HD000:LN=0
2020 READ N:IF N=0 THEN LOCATE 0,3:PRINT "LOAD OK ":RETURN
2030 S=0:FOR J=1 TO N:READ D:POKE A,D:A=A+1:S=S+D:NEXT J
2035 LOCATE 0,3:PRINT "READING DATA LINE";PEEK(&HF6A3)+256*PEEK(&HF6A4);" "
2040 READ C:LN=LN+1:IF C<>S THEN PRINT "DATA ERROR LINE";5990+LN*10:END
2050 GOTO 2020
3000 REM ---- GAME OVER ----
3010 SOUND 7,&HB8:SOUND 8,0:SOUND 9,0:SOUND 10,0
3020 SC!=PEEK(&HE602)+256!*PEEK(&HE603):WV=PEEK(&HE604)+1
3030 SCREEN 1:COLOR 15,1,1:WIDTH 32:KEY OFF:CLS
3040 LOCATE 11,8:PRINT "GAME OVER"
3050 LOCATE 9,11:PRINT "SCORE";SC!
3060 LOCATE 9,13:PRINT "WAVE";WV
3070 IF SC!>HI! THEN HI!=SC!:LOCATE 9,16:PRINT "NEW HI-SCORE!"
3080 TIME=0
3090 IF TIME<180 THEN 3090
3100 GOTO 80
6000 DATA 16,195,68,208,195,6,208,62,30,50,0,230,62,3,50,1,230,1598
6010 DATA 16,175,50,2,230,50,3,230,50,4,230,50,14,230,50,15,230,1613
6020 DATA 16,50,16,230,50,80,230,50,144,230,50,145,230,50,150,230,33,1968
6030 DATA 16,128,230,6,16,119,35,16,252,237,95,50,17,230,205,223,210,2069
6040 DATA 16,205,172,212,201,221,229,175,50,15,230,205,213,211,58,150,230,2777
6050 DATA 16,183,40,23,58,14,230,183,40,6,61,50,14,230,32,5,62,1231
6060 DATA 16,1,50,16,230,205,54,214,221,225,201,58,14,230,183,40,6,1948
6070 DATA 16,61,50,14,230,24,3,205,145,208,205,244,208,205,241,210,205,2458
6080 DATA 16,239,211,205,236,212,205,92,213,205,255,213,205,54,214,221,225,3205
6090 DATA 16,201,175,205,213,0,183,32,5,62,1,205,213,0,79,214,2,1790
6100 DATA 16,254,3,48,13,58,0,230,198,2,254,60,56,19,62,59,24,1340
6110 DATA 16,15,121,214,6,254,3,48,11,58,0,230,214,2,48,1,175,1400
6120 DATA 16,50,0,230,175,205,216,0,50,71,230,62,1,205,216,0,33,1744
6130 DATA 16,71,230,182,200,58,11,230,183,192,62,1,50,11,230,58,0,1769
6140 DATA 16,230,198,2,50,12,230,62,42,50,13,230,58,15,230,246,1,1669
6150 DATA 16,50,15,230,201,58,11,230,183,200,6,2,197,58,13,230,61,1745
6160 DATA 16,50,13,230,254,6,56,36,254,8,48,6,205,78,211,183,32,1670
6170 DATA 16,26,58,12,230,95,58,13,230,87,14,255,205,239,209,183,32,1946
6180 DATA 16,10,205,134,209,183,32,4,193,16,209,201,193,175,50,11,230,2055
6190 DATA 16,201,58,6,230,71,122,144,56,75,71,230,3,254,3,40,68,1632
6200 DATA 16,120,203,63,203,63,254,4,48,59,50,64,230,58,5,230,71,1725
6210 DATA 16,123,144,250,132,209,6,0,254,6,56,5,214,6,4,24,247,1680
6220 DATA 16,254,5,48,32,120,254,8,48,27,50,65,230,58,64,230,135,1628
6230 DATA 16,135,135,71,58,65,230,128,95,22,0,33,32,230,25,126,183,1568
6240 DATA 16,200,62,1,201,175,201,58,12,230,95,58,13,230,87,205,49,1877
6250 DATA 16,209,183,200,175,119,58,10,230,61,50,10,230,58,64,230,95,1982
6260 DATA 16,22,0,33,219,209,25,126,50,71,230,205,223,209,58,15,230,1925
6270 DATA 16,246,2,50,15,230,58,65,230,71,135,128,135,71,58,5,230,1729
6280 DATA 16,128,95,58,64,230,135,135,71,58,6,230,128,87,58,71,230,1784
6290 DATA 16,111,38,0,14,0,205,164,211,62,1,201,30,20,10,10,42,1119
6300 DATA 16,2,230,95,22,0,25,48,3,33,255,255,34,2,230,201,122,1557
6310 DATA 16,214,38,56,89,254,4,48,85,50,64,230,123,214,7,56,77,1609
6320 DATA 16,6,0,254,14,56,5,214,14,4,24,247,254,7,48,62,87,1296
6330 DATA 16,120,254,4,48,56,135,135,33,96,230,133,111,58,64,230,133,1840
6340 DATA 16,111,66,62,64,4,5,40,4,203,63,24,249,95,126,163,40,1319
6350 DATA 16,28,123,47,87,126,162,119,58,64,230,129,254,4,48,11,203,1693
6360 DATA 16,121,40,3,43,24,1,35,126,162,119,62,1,201,175,201,33,1347
6370 DATA 16,96,230,6,4,62,62,119,35,62,127,119,35,119,35,62,99,1272
6380 DATA 16,119,35,16,240,201,205,216,213,254,38,216,221,33,96,230,62,2395
6390 DATA 16,7,50,114,230,6,4,197,62,38,50,115,230,6,4,197,221,1531
6400 DATA 16,126,0,183,40,66,62,64,50,112,230,175,50,113,230,58,112,1671
6410 DATA 16,230,221,166,0,40,30,58,114,230,33,113,230,134,95,58,115,1867
6420 DATA 16,230,87,205,49,209,183,40,12,58,112,230,47,71,221,126,0,1880
6430 DATA 16,160,221,119,0,58,112,230,203,63,50,112,230,58,113,230,60,2019
6440 DATA 16,50,113,230,254,7,56,199,221,35,58,115,230,60,50,115,230,2023
6450 DATA 16,193,16,171,58,114,230,198,14,50,114,230,193,16,152,201,205,2155
6460 DATA 16,38,214,111,205,38,214,230,1,103,17,160,0,25,34,83,230,1703
6470 DATA 16,201,58,80,230,183,32,54,42,83,230,43,34,83,230,124,181,1888
6480 DATA 16,192,205,223,210,58,10,230,254,8,216,205,38,214,230,1,40,2334
6490 DATA 16,12,62,249,50,81,230,62,1,50,82,230,24,10,62,63,50,1318
6500 DATA 16,81,230,62,255,50,82,230,62,1,50,80,230,201,58,82,230,1984
6510 DATA 16,71,58,81,230,128,50,81,230,254,64,40,13,254,248,40,9,1851
6520 DATA 16,58,15,230,246,32,50,15,230,201,175,50,80,230,201,58,80,1951
6530 DATA 16,230,183,200,58,81,230,79,58,12,230,145,250,154,211,254,7,2382
6540 DATA 16,48,56,175,50,80,230,205,38,214,230,3,135,95,22,0,33,1614
6550 DATA 16,156,211,25,94,35,86,213,42,2,230,25,48,3,33,255,255,1713
6560 DATA 16,34,2,230,58,15,230,246,64,50,15,230,225,58,81,230,95,1863
6570 DATA 16,22,5,14,1,205,164,211,62,1,201,175,201,50,0,100,0,1412
6580 DATA 16,150,0,44,1,34,147,230,213,58,144,230,60,230,3,50,144,1738
6590 DATA 16,230,135,135,111,38,0,17,128,230,25,62,12,119,35,209,115,1601
6600 DATA 16,35,114,35,113,62,12,50,145,230,121,183,62,11,40,2,62,1277
6610 DATA 16,9,50,146,230,201,33,128,230,6,4,17,4,0,126,183,40,1407
6620 DATA 16,1,53,25,16,248,58,145,230,183,200,61,50,145,230,201,58,1904
6630 DATA 16,10,230,183,200,58,8,230,61,50,8,230,192,205,141,212,58,2076
6640 DATA 16,9,230,238,1,50,9,230,58,15,230,246,16,50,15,230,205,1832
6650 DATA 16,78,212,58,7,230,254,1,32,16,58,5,230,145,242,58,212,1838
6660 DATA 16,58,5,230,60,50,5,230,24,33,120,33,5,230,150,242,58,1533
6670 DATA 16,212,58,5,230,61,50,5,230,24,16,58,7,230,237,68,50,1541
6680 DATA 16,7,230,58,6,230,198,2,50,6,230,205,101,210,201,33,32,1799
6690 DATA 16,230,6,32,14,0,22,1,126,183,40,3,121,178,79,122,7,1164
6700 DATA 16,87,35,16,243,121,6,0,203,63,56,3,4,24,249,120,135,1365
6710 DATA 16,95,135,131,237,68,95,121,6,7,203,127,32,4,135,5,24,1425
6720 DATA 16,248,120,135,87,135,130,87,62,59,146,79,67,201,58,10,230,1854
6730 DATA 16,203,63,203,63,60,79,58,4,230,254,4,56,2,62,3,71,1415
6740 DATA 16,121,144,56,2,32,2,62,1,50,8,230,201,33,32,230,6,1210
6750 DATA 16,32,62,1,119,35,16,252,62,32,50,10,230,62,8,50,5,1026
6760 DATA 16,230,58,4,230,254,6,56,2,62,5,135,198,9,50,6,230,1535
6770 DATA 16,62,1,50,7,230,175,50,9,230,50,11,230,50,18,230,50,1453
6780 DATA 16,21,230,50,24,230,205,79,210,205,141,212,201,58,14,230,183,2293
6790 DATA 16,192,58,10,230,183,200,205,38,214,71,58,4,230,254,3,120,2070
6800 DATA 16,48,4,230,7,24,2,230,3,192,33,18,230,6,3,126,183,1339
6810 DATA 16,40,6,35,35,35,16,247,201,229,205,38,214,230,7,79,198,1815
6820 DATA 16,24,95,22,0,6,4,33,32,230,25,126,183,32,8,123,214,1157
6830 DATA 16,8,95,16,242,225,201,120,61,50,64,230,225,62,1,119,35,1754
6840 DATA 16,121,135,71,135,128,71,58,5,230,128,198,2,119,35,58,64,1558
6850 DATA 16,230,135,135,71,58,6,230,128,198,3,119,201,221,33,18,230,2016
6860 DATA 16,6,3,221,126,0,183,40,63,221,52,2,221,126,2,254,46,1566
6870 DATA 16,56,6,175,221,119,0,24,47,60,87,221,94,1,14,1,197,1323
6880 DATA 16,205,239,209,193,183,40,6,175,221,119,0,24,26,221,126,2,1989
6890 DATA 16,254,43,56,19,58,0,230,79,221,126,1,145,56,9,254,5,1556
6900 DATA 16,48,5,197,205,175,213,193,17,3,0,221,25,16,180,201,58,1757
6910 DATA 16,1,230,61,50,1,230,32,5,62,1,50,150,230,62,30,50,1245
6920 DATA 16,14,230,175,50,11,230,50,18,230,50,21,230,50,24,230,58,1671
6930 DATA 16,15,230,246,4,50,15,230,201,33,56,230,6,3,14,8,126,1467
6940 DATA 16,183,32,15,35,13,32,248,17,240,255,25,120,183,40,14,5,1457
6950 DATA 16,24,235,120,135,135,71,58,6,230,128,198,2,201,175,201,58,1977
6960 DATA 16,10,230,183,32,19,58,4,230,60,50,4,230,205,172,212,58,1757
6970 DATA 16,15,230,246,8,50,15,230,201,205,216,213,254,44,216,62,1,2206
6980 DATA 16,50,150,230,195,189,213,58,17,230,71,135,135,128,60,50,17,1928
6990 DATA 16,230,71,237,95,168,201,205,91,214,205,197,214,205,212,214,205,2964
7000 DATA 16,95,215,205,142,215,205,92,216,205,237,216,205,171,215,205,203,3042
7010 DATA 16,217,205,5,218,205,250,215,205,120,214,201,243,237,115,76,230,2956
7020 DATA 16,49,0,230,33,0,0,6,96,229,229,229,229,229,229,229,229,2246
7030 DATA 16,16,246,237,123,76,230,251,201,58,7,0,79,12,243,175,237,2191
7040 DATA 16,121,62,64,237,121,13,33,0,224,22,6,6,0,237,179,21,1346
7050 DATA 16,32,249,251,201,123,254,64,208,122,254,48,208,15,15,15,230,2289
7060 DATA 16,31,198,224,103,123,230,62,135,135,111,122,230,7,181,111,203,2206
7070 DATA 16,67,32,12,126,230,15,119,121,135,135,135,135,182,119,201,126,1890
7080 DATA 16,230,240,177,119,201,33,7,229,6,32,17,8,0,62,34,119,1514
7090 DATA 16,25,16,252,201,42,2,230,221,33,17,215,62,1,50,66,230,1663
7100 DATA 16,62,5,50,69,230,221,94,0,221,86,1,205,27,215,229,58,1773
7110 DATA 16,66,230,95,22,1,14,15,205,39,215,225,58,66,230,198,4,1683
7120 DATA 16,50,66,230,221,35,221,35,58,69,230,61,50,69,230,32,213,1870
7130 DATA 16,201,16,39,232,3,100,0,10,0,1,0,6,0,183,237,82,1110
7140 DATA 16,56,3,4,24,248,25,201,120,103,135,135,132,33,116,218,133,1686
7150 DATA 16,111,48,1,36,6,5,126,50,70,230,35,229,123,245,58,70,1443
7160 DATA 16,230,230,4,196,148,214,28,58,70,230,230,2,196,148,214,28,2226
7170 DATA 16,58,70,230,230,1,196,148,214,241,95,20,225,16,216,201,58,2219
7180 DATA 16,1,230,183,200,71,62,46,50,66,230,58,66,230,95,28,22,1638
7190 DATA 16,2,14,3,205,148,214,29,20,205,148,214,28,205,148,214,28,1825
7200 DATA 16,205,148,214,58,66,230,198,5,50,66,230,16,221,201,58,80,2046
7210 DATA 16,230,183,200,14,8,58,81,230,95,22,6,62,62,205,59,216,1731
7220 DATA 16,58,81,230,95,22,7,62,107,195,59,216,221,33,128,230,6,1750
7230 DATA 16,4,197,221,126,0,183,202,234,215,221,94,1,221,86,2,221,2228
7240 DATA 16,126,3,183,32,20,14,11,62,84,205,243,215,62,56,205,243,1764
7250 DATA 16,215,62,84,205,243,215,195,234,215,14,9,62,85,205,243,215,2501
7260 DATA 16,62,62,205,243,215,62,85,205,243,215,17,4,0,221,25,193,2057
7270 DATA 16,16,191,201,213,205,59,216,209,20,201,58,145,230,183,200,42,2389
7280 DATA 16,147,230,62,26,50,66,230,17,100,0,205,27,215,120,183,40,1718
7290 DATA 16,7,229,205,41,216,225,24,5,62,28,50,66,230,17,10,0,1415
7300 DATA 16,205,27,215,229,205,41,216,225,69,58,66,230,95,198,4,50,2133
7310 DATA 16,66,230,22,1,58,146,230,79,195,39,215,50,70,230,62,64,1757
7320 DATA 16,50,112,230,6,7,58,112,230,103,58,70,230,164,196,148,214,1988
7330 DATA 16,58,112,230,203,63,50,112,230,28,16,234,201,221,33,96,230,2117
7340 DATA 16,62,7,50,66,230,6,4,197,62,38,50,67,230,6,4,197,1276
7350 DATA 16,221,126,0,50,70,230,58,67,230,15,15,15,230,31,198,224,1780
7360 DATA 16,103,58,66,230,230,62,135,135,111,58,67,230,230,7,181,111,2014
7370 DATA 16,58,70,230,230,64,40,4,126,246,12,119,125,198,8,111,58,1699
7380 DATA 16,70,230,15,15,15,15,230,3,205,221,216,125,198,8,111,58,1735
7390 DATA 16,70,230,15,15,230,3,205,221,216,125,198,8,111,58,70,230,2005
7400 DATA 16,230,3,205,221,216,221,35,58,67,230,60,50,67,230,193,16,2102
7410 DATA 16,158,58,66,230,198,14,50,66,230,193,16,139,201,79,126,203,2027
7420 DATA 16,73,40,2,246,192,203,65,40,2,246,12,119,201,175,50,64,1730
7430 DATA 16,230,33,44,218,58,5,230,230,1,40,4,17,36,0,25,58,1229
7440 DATA 16,64,230,254,2,56,4,17,18,0,25,58,9,230,183,40,4,1194
7450 DATA 16,17,9,0,25,34,72,230,58,64,230,95,22,0,33,141,217,1247
7460 DATA 16,25,126,50,68,230,58,64,230,135,135,71,58,6,230,128,50,1664
7470 DATA 16,67,230,58,64,230,135,135,135,95,22,0,33,32,230,25,34,1525
7480 DATA 16,74,230,58,5,230,50,66,230,175,50,65,230,42,74,230,126,1935
7490 DATA 16,183,40,19,58,67,230,87,58,66,230,95,58,68,230,79,221,1789
7500 DATA 16,42,72,230,205,145,217,42,74,230,35,34,74,230,58,66,230,1984
7510 DATA 16,198,6,50,66,230,58,65,230,60,50,65,230,254,8,56,204,1830
7520 DATA 16,58,64,230,60,50,64,230,254,4,218,241,216,201,221,119,187,2417
7530 DATA 16,51,6,3,122,15,15,15,230,31,198,224,103,123,230,62,135,1563
7540 DATA 16,135,111,122,230,7,181,111,221,126,0,161,182,119,125,198,8,2037
7550 DATA 16,111,221,126,1,161,182,119,125,198,8,111,221,126,2,161,182,2055
7560 DATA 16,119,221,35,221,35,221,35,20,16,201,201,58,11,230,183,40,1847
7570 DATA 16,17,58,12,230,95,58,13,230,87,14,15,205,148,214,20,205,1621
7580 DATA 16,148,214,221,33,18,230,6,3,221,126,0,183,40,15,221,94,1773
7590 DATA 16,1,221,86,2,14,9,205,148,214,20,205,148,214,17,3,0,1507
7600 DATA 16,221,25,16,228,201,58,14,230,183,14,3,40,5,230,2,192,1662
7610 DATA 16,14,8,58,0,230,198,2,95,22,44,205,148,214,58,0,230,1526
7620 DATA 16,95,22,45,6,5,205,148,214,28,16,250,201,15,15,0,255,1520
7630 DATA 16,255,240,240,240,240,15,15,0,255,255,240,240,0,240,0,240,2715
7640 DATA 16,0,15,255,0,255,15,240,0,240,0,15,255,0,240,240,240,2010
7650 DATA 16,0,240,240,15,255,255,15,15,15,0,240,240,15,255,255,15,2070
7660 DATA 16,0,15,0,15,0,0,255,240,15,240,255,0,15,0,0,255,1305
7670 DATA 16,240,15,15,15,7,5,5,5,7,2,6,2,2,7,7,1,341
7680 DATA 16,7,4,7,7,1,7,1,7,5,5,7,1,1,7,4,7,78
7690 DATA 16,1,7,7,4,7,5,7,7,1,1,1,1,7,5,7,5,73
7700 DATA 6,7,7,5,7,1,7,34
7710 DATA 0ファイルでの公開もしておきます。
実行に必要なのは、次のBASICコードだけです。
BASICコード(マシン語含む)
アセンブラコード(参考)
追記:続きの記事を書きました
次回「オールマシン語化の巻き」です。
iPhone + safariでプレイできました
MSXPenで動かしたゲームを、iPhoneのSafariでもプレイできましたので、紹介しておきます。
全画面モードにすると、画面上にタッチコントローラーが表示され、ゲームを操作できます。ぜひお試しください。
やり方は次の通りです。


1. MSXPenを全画面モードに切り替える
次の画面の「赤丸」部分の全画面ボタンをタップします。これは、先ほど紹介した「全画面モード」と同じボタンです。
iPhoneでは、画面上に十字キーやボタンのタッチコントローラーが表示され、ゲームを操作できます。ただし、私の環境では、この状態だとゲーム画面の上部が隠れてしまいました。

画面内をタップするとメニューがせりあがってきます。
プログラムへのリンクを押して次の画面が出てきたときには、赤丸のボタンを押してください。これで全画面モードになりますが、ゲーム画面の上部が隠れています。

2. Safariのツールバーを非表示にする
ゲーム画面をすべて表示するためには、Safariのツールバーを非表示にします。
次の画面のように、アドレスバー左側にある、「赤丸」部分のページメニューボタンをタップし、「ツールバーを非表示」を選択します。私の環境では、これでゲーム画面全体が表示されました。

過去に作ったインベーダーゲーム
私が過去に作ったインベーダーゲームの最新記事はこちらです。
#時産時利 #AI活用 #時短術 #MSX #レトロゲーム #生成AI #Claude #インベーダー #シューティングゲーム #iphone #safari #スマホ #pc