SHIROのIchigoJam日記

マイコン「IchigoJam」(イチゴジャム)の電子工作とプログラミングをメインに

IchigoJam Rの速度検証

CPUがRISC-Vに換わったIchigoJamの新世代バージョン「IchigoJam R」β版が出荷開始!
IchigoJam 組み立て済完成品 R | Programming Club Network
福野さんのブログ記事はこちら。
IchigoJam BASIC 1.5β1、USBキーボード対応 RISC-V版 IchigoJam Rβ 出荷スタート!

何と言っても「旧バージョンに比べて10倍速い」という動作速度がどんなものか、気になります。
「見せてもらおうか、10倍の速度とやらを!」(笑)
いろいろなプログラムを動かしてみた動画はこちら。

課題1:円描画


三角関数を使って円を描いて塗りつぶします。
IchigoJam Sだと5~6秒、Rでは1秒くらいです。

10 CLV:CLS
20 FOR T=0 TO 359
30 X=COS(T)/12
40 Y=SIN(T)/12
50 DRAW X+32,Y+24
60 NEXT
70 FOR T=0 TO 359
80 X=COS(T)/12
90 Y=SIN(T)/12
100 DRAW 32,24,X+32,Y+24
110 NEXT

課題2:ライフゲーム


有名な生物シミュレーション。ライフ(■)が増えたり減ったりします。
生死のルールは、自分の上下左右斜めの8箇所にあるライフが

  • 0~1個…死ぬ
  • 2個…そのまま
  • 3個…新しく生まれる
  • 4~8個…死ぬ

これを全てのドットで計算するので、時間がかかります。
IchigoJam Sだと1世代進むのに約90秒、Rでは10秒くらいです。

1 '*LIFE PC
2 CLV
3 '@RESTART
4 FORZ=50TO97:[Z]=(RND(256)<<8)+RND(256):NEXT:BEEP:GSB27
5 '@LOOP
6 L=0:K=0
7 FORY=0TO23:FORX=0TO31:C=0
8 FORE=-1TO1:FORD=-1TO1
9 U=(X+D)&31
10 V=Y+E:V=V+24*((V<0)-(V>23))
11 Z=V*2+U/16:M=1<<(U%16)
12 B=[Z]&M:C=C+(B<>0)
13 NEXT:NEXT
14 Z=Y*2+X/16:M=1<<(X%16)
15 B=[Z]&M
16 IFBB=1:C=C-1
17 Q=0
18 IFC=2Q=B
19 IFC=3Q=1
20 IFQ[Z+50]=[Z+50]|M
21 IFB<>QK=1
22 L=L+Q
23 NEXT:NEXT
24 GSB27
25 IFL>0&&K>0GOTO5
26 GOTO3
27 '@PRTLIFE
28 CLS:A=#900
29 FORZ=50TO97:D=[Z]:[Z-50]=D:[Z]=0:FORX=0TO15
30 B=D&1:POKEA,B
31 A=A+1:D=D>>1
32 NEXT:NEXT:RTN

課題3:3Dかわくだり


おなじみのかわくだりゲームが、3Dっぽい視点で遊べます。
105行のWAITは、IchigoJam Sでは「WAIT 0」、Rでは「WAIT 4」にしてください。
Sだとゲームとしてはかなり遅いですが、RではWAIT 4を入れてちょうどいいです。

10 '*Kawakudari 3D
20 CLV:CLS:CLT:X=16:Y=22
30 LC 0,5:FOR I=0 TO 31:?CHR$(140);:NEXT
40 FOR R=0 TO 15
50 LC 15-R,R+6:?CHR$(134)
60 LC 16+R,R+6:?CHR$(137)
70 NEXT
80 IF X=[16] GOTO 190
90 X=X-BTN(28)+BTN(29)
100 LC X,Y:?"O";
105 WAIT 0
110 [0]=RND(32)
120 COPY #821,#81F,-32
130 FOR R=1 TO 16
140 A=#9D0+R*31:B=R*2:S=[R]*B/32
150 POKE A,0:COPY A+1,A,B-1
160 POKE A+S,42
170 NEXT
180 GOTO 80
190 BEEP 30,30
200 LC X,Y:?"X";
210 LC 0,0:?TICK()/60

課題4:いちがめ


同じコマ(数字)が2個以上隣り合っている所でスペースキーを押すと、コマが消えて点数が入ります。消えた部分は詰められます。ある程度以上コマを消すとその面はクリアで、次の面ではコマの種類が増えます。
IchigoJam Sだとコマを消す処理でちょっと待たされますが、Rではさくさく動いて快適に遊べます。

1 '*Ichigame for 1.3
2 CLV:LET[91],-1,0,1,0,0,-1,0,1:J=15
3 CLS:L=256:W=J:M=S%7+3:P=0:Q=J
4 FORY=0TOJ:FORX=0TOJ:?RND(M)+1;:NEXT:?:NEXT:GSB10
5 LCP,Q,1:K=INKEY()*2-60:IFABS(K)>4GOTO5
6 IFK=4GSB11:IFL<=M*2BEEP10,30:WAIT99:S=S+1:GOTO3
7 X=P+[K+95]:Y=Q+[K+96]:IFSCR(X,Y)P=X:Q=Y
8 IF!GGOTO5
9 BEEP30,30:LC0,19:END
10 LC0,18:?"Stage:";S;" Score:";T;" Last:";L;" ":RTN
11 U=P:V=Q:N=SCR(U,V):C=0:[C]=U+V*16:H=1:GSB26:IF!CRTN
12 BEEP:B=0
13 B=B+1:U=[B]&15:V=[B]/16:GSB26:IFB<CGOTO13
14 I=C-2:T=T+I*I:L=L-C:GSB10
15 FORB=0TOC:X=[B]&15:FORY=JTO0STEP-1
16 IFSCR(X,Y)=42FORZ=YTO0STEP-1:POKE#900+X+Z*32,SCR(X,Z-1):NEXT:Y=Y+1
17 NEXT:NEXT:IF!LRTN
18 FORX=WTO0STEP-1
19 IFSCR(X,J)ELSEFORY=JTO0STEP-1:LCX,Y:FORZ=XTOW:?CHR$(SCR(Z+1,Y));:NEXT:NEXT:W=W-1
20 NEXT:C=0:H=0
21 FORU=0TOW:FORV=JTO0STEP-1
22 N=SCR(U,V):IF!NGOTO24
23 GSB26:IFCU=W:V=0
24 NEXT:NEXT:IF!CG=1
25 P=0:Q=15:RTN
26 FORD=91TO97STEP2:X=U+[D]:Y=V+[D+1]
27 IFSCR(X,Y)=NC=C+1:[C]=X+Y*16:IFHLCX,Y:?"*"
28 NEXT:RTN

課題5:3D迷路


プログラムはこちらの記事を参照してください。3ファイル使います。
なんちゃって3D迷路 - SHIROのIchigoJam日記
IchigoJam Sだと「がんばって迷路を描いてるな」という感じですが、Rではさくさく移動できて、迷路探索に集中できます。

課題6:横シューティングゲーム


以前に作って、IchigoJam Sではあまりに遅くてお蔵入りしたプログラム。アプリ版やラズパイ版では普通に遊べます。
動画の字幕にも書きましたが、ビームを発射すると、動かしながらビームの数×敵の数だけの当たり判定を毎回するので、全体の動きがかなり遅くなります。プログラムをちょっと見直した方がいいかもしれません。1kバイト目一杯で、これ以上増やせないのですが…

1 '*H Shooting
2 CLV:CLS:?"SCORE 0":X=0:Y=12
3 FORE=14TO22STEP4:GSB8:FORB=3TO9STEP3:IF[B]GSB12
4 NEXT:B=(E-10)/4*3:IF![B]&&BTN(32)GSB11
5 IF[E]GSB15 ELSEIF!RND(30)GSB14
6 NEXT:IF!MGOTO3
7 BEEP30,30:LCX,Y:?"*";:LC7,12:?"GAME OVER":CLK:END
8 U=X-BTN(28)*(X>0)+BTN(29)*(X<30):V=Y-BTN(30)*(Y>1)+BTN(31)*(Y<22)
9 LCX,Y:?CHR$(0);:X=U:Y=V:IFSCR(X,Y)=237M=1:RTN
10 LCX,Y:?CHR$(243);:RTN
11 [B]=1:[B+1]=X+1:[B+2]=Y:LC[B+1],[B+2]:?"-";:RTN
12 C=[B+1]:D=[B+2]:LCC,D:?CHR$(0);:C=C+1:[B+1]=C:IFC>30[B]=0:RTN
13 LCC,D:?"-";:GSB19:RTN
14 [E]=1:[E+1]=30:[E+2]=RND(22)+1:[E+3]=RND(2)*2-1:LC[E+1],[E+2]:?CHR$(237);:RTN
15 F=[E+1]:G=[E+2]:LCF,G:?CHR$(0);:F=F-1:IFF<0[E]=0:RTN
16 G=G+[E+3]:IFG<1ORG>22[E+3]=-[E+3]:CONT
17 [E+1]=F:[E+2]=G:IFX=F&&Y=GM=1:RTN
18 LCF,G:?CHR$(237);:GSB19:RTN
19 K=0:FORI=14TO22STEP4:FORJ=3TO9STEP3:IF[I]&&[J]&&[I+1]=[J+1]&&[I+2]=[J+2]K=I:L=J
20 NEXT:NEXT:IF!KRTN
21 [K]=0:[L]=0:LC[K+1],[K+2]:?"*";:BEEP:S=S+1:LC6,0:?S:LC[K+1],[K+2]:?CHR$(0);:RTN