クソアぷり
頭が悪いので、今週も毎週投稿streak維持のためのタイムリミットが迫ってきた…
Q. 何を書こう?
A. 短時間で簡単に書けて文字数が稼げるもの…プログラムを書こう!
Q. どういうプログラムを書こう?
A. クソアプリを作ろう!
というわけで、IchigoJam でクソアプリ「クソアぷり」を作ってみた。
キーを押すと「ぷりっ」と💩が落ちてきて、積もっていくというアプリである。小学生ってこういうの好きなんでしょ?
※IchigoJamはjig.jpの登録商標です。
1マスバージョン
10 ' クソ アプリ
20 POKE #700,16,124,198,124,198,124,254,0
30 IF VER()>=13224 W=POS(3):H=POS(4) ELSE W=32:H=24
40 S=2
50 CLS:CLT
60 IF INKEY()=0 GOTO 120
70 C=0
80 FOR I=0 TO W-1
90 IF SCR(I,0)=0 [C]=I:C=C+1
100 NEXT
110 IF C>0 POKE #900+[RND(C)],#E0
120 IF TICK()<S WAIT 1:GOTO 60
130 CLT
140 FOR Y=H-2 TO 0 STEP -1
150 FOR X=0 TO W-1
160 IF SCR(X,Y) AND SCR(X,Y+1)=0 POKE #900+(Y+1)*W+X,SCR(X,Y):POKE #900+Y*W+X,0
170 NEXT
180 NEXT
190 GOTO 60
うーん…頭が悪いからか、8×8ドットだと💩の表現がちょっと難しいかな…
2マスバージョン
10 ' クソ アプリ 2
20 POKE #700,1,3,4,8,8,31,32,32,0,128,64,32,32,240,8,8,32,95,128,128,128,64,63,0,8,244,2,2,2,4,248,0
30 IF VER()>=13224 W=POS(3):H=POS(4) ELSE W=32:H=24
40 S=2
50 CLS:CLT
60 IF INKEY()=0 GOTO 120
70 C=0
80 FOR I=0 TO W-1 STEP 2
90 IF SCR(I,1)=0 [C]=I:C=C+1
100 NEXT
110 IF C>0 P=#900+[RND(C)]:POKE P,#E0,#E1:POKE P+W,#E2,#E3
120 IF TICK()<S WAIT 1:GOTO 60
130 CLT
140 FOR Y=H-2 TO 1 STEP -1
150 FOR X=0 TO W-1
160 IF SCR(X,Y) AND SCR(X,Y+1)=0 POKE #900+(Y+1)*W+X,SCR(X,Y):POKE #900+Y*W+X,SCR(X,Y-1):POKE #900+(Y-1)*W+X,0
170 NEXT
180 NEXT
190 GOTO 60
16×16ドットを使えることで、一気に💩の表現がしやすくなった。
クソだった
適当に作った結果、今回のプログラムはクソ遅いものになってしまった。
名実ともにクソである。
OneFiveCrowd では快適に実行できたが、IchigoJam R でも遅かった。そのためスクリーンショットが撮りやすかった。
マシン語の導入
いくらクソアプリとはいえ、「クソだった」で投げっぱなしではさすがにアレなので、落下処理をマシン語に置き換えることにより高速化を行った。
その結果、通常の IchigoJam では💩を落とす際の落下位置候補の列挙処理が重く、処理落ちが目立ってしまった。
しかし、IchigoJam R では違和感なく実行することができた。
上の2マスバージョンでは、💩が中途半端な状態になっている時間を減らすため、1マスバージョンとは落下処理のプログラムを変えた。
しかし、マシン語は十分高速であると考えられるので、落下処理は1マスバージョンと2マスバージョンで共通とした。
1マスバージョン
10 ' クソ アプリ (マシンゴ)
20 POKE #700,16,124,198,124,198,124,254,0
30 POKE #720,183,47,27,224,151,5,0,0,147,133,197,29,3,214,133,255,131,214,165,253,179,6,214,2,174,150,145,142,253,22,51,135,198,0,3,69,7,0,1,233,3,197,6,0,9,197,35,0,167,0,35,128,6,0,227,227,213,254
40 POKE #75A,130,128,104,161,94,160,2,140,67,136,83,67,91,24,155,26,1,59,152,92,0,66,5,209,24,120,0,66,2,208,152,84,0,32,24,112,139,66,243,216,112,71
50 IF VER()>=13224 W=POS(3):H=POS(4) ELSE W=32:H=24
60 S=2
70 CLS:CLT
80 IF INKEY()=0 GOTO 140
90 C=0
100 FOR I=0 TO W-1
110 IF SCR(I,0)=0 [C]=I:C=C+1
120 NEXT
130 IF C>0 POKE #900+[RND(C)],#E0
140 IF TICK()<S WAIT 1:GOTO 80
150 CLT
160 X=USR(#720)
170 GOTO 80
2マスバージョン
10 ' クソ アプリ 2 (マシンゴ)
20 POKE #700,1,3,4,8,8,31,32,32,0,128,64,32,32,240,8,8,32,95,128,128,128,64,63,0,8,244,2,2,2,4,248,0
30 POKE #720,183,47,27,224,151,5,0,0,147,133,197,29,3,214,133,255,131,214,165,253,179,6,214,2,174,150,145,142,253,22,51,135,198,0,3,69,7,0,1,233,3,197,6,0,9,197,35,0,167,0,35,128,6,0,227,227,213,254
40 POKE #75A,130,128,104,161,94,160,2,140,67,136,83,67,91,24,155,26,1,59,152,92,0,66,5,209,24,120,0,66,2,208,152,84,0,32,24,112,139,66,243,216,112,71
50 IF VER()>=13224 W=POS(3):H=POS(4) ELSE W=32:H=24
60 S=2
70 CLS:CLT
80 IF INKEY()=0 GOTO 140
90 C=0
100 FOR I=0 TO W-1 STEP 2
110 IF SCR(I,1)=0 [C]=I:C=C+1
120 NEXT
130 IF C>0 P=#900+[RND(C)]:POKE P,#E0,#E1:POKE P+W,#E2,#E3
140 IF TICK()<S WAIT 1:GOTO 80
150 CLT
160 X=USR(#720)
170 GOTO 80
マシン語のソースコード
ORG #720
IF M0 GOTO @M0PROGRAM
MODE RV32C
R11 = @VRAM ' R11 = first byte of VRAM
R12 = [R11 + -8]W ' R12 = W
R13 = [R11 + -38]W
R13 = R12 * R13
R13 += R11
R13 -= R12 ' R13 = work pointer (loop)
@LOOP
R13 += -1
R14 = R13 + R12
R10 = [R14 + 0]
IF R10 GOTO @NOFALL
R10 = [R13 + 0]
IF !R10 GOTO @NOFALL
[R14 + 0] = R10
[R13 + 0] = R0
@NOFALL
IF LTU(R11, R13) GOTO @LOOP
RET
MODE M0
@M0PROGRAM
R1 = @VRAM ' R1 = first byte of VRAM
R0 = @VAR_G
R2 = [R0 + 16]W ' R2 = W
R3 = [R0 + 1]W
R3 *= R2
R3 = R3 + R1
R3 = R3 - R2 ' R3 = work pointer (loop)
@M0LOOP
R3 -= 1
R0 = [R3 + R2]
R0 & R0
IF !0 GOTO @M0NOFALL
R0 = [R3]
R0 & R0
IF 0 GOTO @M0NOFALL
[R3 + R2] = R0
R0 = 0
[R3] = R0
@M0NOFALL
R3 - R1
IF HI GOTO @M0LOOP
RET
ORG #8D8
@VAR_G
ORG #900
@VRAM
' ABCDEFGHIJKLMNOPQRSTUVWXYZ
ライセンス
今回のプログラムは、CC0 1.0 でライセンスする。
この記事が気に入ったらサポートをしてみませんか?