SHIROのIchigoJam日記

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

新・IchigoJam名札

皆さん、明けましておめでとうございます。
2019年もよろしくお願いします。

これまで展示会やイベントなどで首から下げていた「IchigoJam名札」ですが、ハードに持ち歩いたせいか、液晶モニタが映らなくなってしまいました。
ちょっと強化して、新しい名札を作ってみました。

f:id:shiro0922:20190110220329j:plain

秋月電子A基板用アクリルパネルを装着して、IchigoJamや液晶モニタを保護。見た目もカッコよくなりました。
ただ、おかげでIchigoJamの電源スイッチに指が届かなくなり、やむなく別にスライドスイッチを付けました(^_^;)

下半分の基板は、専用プリント基板を起こしました。
今回はEEPROMも搭載して、多数のプログラムを載せられるようになりました(^_^)v

f:id:shiro0922:20190110223249p:plain

f:id:shiro0922:20190110225124p:plain

あとは、今まで作ってきたプログラムを、ジョイスティック&ボタン操作に改造して移植しました。

基板データ

*この基板ガーバーデータは、CC BYライセンスとします。どうぞご利用ください。

(C) 2018 Shiro Saito (https://www.ichigojaman.jp)

メニュープログラム

f:id:shiro0922:20190110223529p:plain
ジョイスティックの操作で、数字を「00」~「99」の範囲で変更します。
Aボタンを押すと、スロット100~199のプログラムを起動します。

1 '*PCN Selecter
2 CLV:VIDEO 1:CLS:OUT1,-1:OUT2,-1
3 LET[0],#0080,#0808,#0FF8,#7FFF,#0220,#0808,#0140,#0000
4 LET[8],#0080,#3E2A,#0140,#223E,#0E38,#2208,#F007,#BE3E
5 LET[16],#17F4,#2214,#1004,#2263,#1FFC,#3E49,#1084,#222A
6 LET[24],#12A4,#221C,#1494,#222A,#2084,#4249,0,0
7 LET[32],0,0,#7191,#087F,#4A51,#0849,#4A19,#0E49
8 LET[40],#7215,#087F,#4213,#0849,#4251,#0849,#4191,#7F7F
9 A=#900:FORY=0TO23:FORX=0TO1:M=#8000
10 FORB=0TO15:D=([Y*2+X]&M)!=0:POKEA,D:M=M>>1:A=A+1:NEXT
11 NEXT:NEXT
12 IF!BTN()CONT
13 BEEP:CLS:WAIT30
14 LET[0],7,5,5,5,7,4,4,4,4,4,7,4,7,1,7,7,4,7,4,7,5,5,7,4,4
15 LET[25],7,1,7,4,7,7,1,7,5,7,7,5,5,4,4,7,5,7,5,7,7,5,7,4,7
16 N=0:GSB26
17 I=(512-ANA(5))/256
18 J=(ANA(6)-512)/256
19 N=N+I+J*10
20 IFN<0N=N+100
21 IFN>99N=N-100
22 GSB26
23 IF!BTN()GOTO17
24 BEEP:CLS:SRNDTICK()
25 LRUNN+100
26 M=N/10:O=12:GSB28
27 M=N%10:O=16:GSB28:RTN
28 FORY=0TO4:D=[M*5+Y]:LCO,10+Y
29 FORX=0TO2:?CHR$(D%2);:D=D/2:NEXT
30 ?CHR$(28,28,28,31);:NEXT:RTN

かわくだり

f:id:shiro0922:20190110223657p:plain
おなじみのかわくだりです。ジョイスティックの左右で自キャラを移動させて、岩を避けながら川を下ります。岩に当たるとゲームオーバーで、下った秒数が左下に表示されます。
Aボタンでリプレイ、Bボタンで名札に戻ります。

10 CLS:CLT:X=16
20 I=(512-ANA(5))/256:X=X+I:X=X&31
30 IF SCR(X,5) GOTO 80
40 LC X,5:?"O"
50 LC RND(32),23:?"*"
60 WAIT 3
70 GOTO 20
80 ?TICK()/60
90 IF BTN() RUN
100 IF IN(1) GOTO 90 ELSE LRUN 0

シューティング

f:id:shiro0922:20190110224034p:plain
上空のUFOを撃ち落とすシューティングゲームです。
ジョイスティックの左右で砲台を移動させて、Aボタンでビームを発射します。
UFOに下まで侵略されるとゲームオーバーです。
Aボタンでリプレイ、Bボタンで名札に戻ります。

10 '*SHOOTING j
20 CLS:CLV:OUT 1,-1
30 LOCATE 0,0
40 ?S
50 X=16:Y=23
60 LOCATE X,Y
70 ?"A";
72 U=RND(31):V=0
74 LOCATE U,V
76 ?CHR$(241);
80 '*GAMELOOP
90 LOCATE X,Y
100 ?" ";
105 K=(512-ANA(5))/256
110 IF K=-1 AND X>0 THEN X=X-1
120 IF K=1 AND X<30 THEN X=X+1
130 LOCATE X,Y
140 ?"A";
142 IF BTN()=1 THEN GOSUB 240
145 GOSUB 160
148 WAIT 3
150 IF V<23 THEN GOTO 80
152 BEEP 30,30
153 LOCATE 0,0:?S
154 LOCATE 12,12
156 ?"GAME OVER!":WAIT 30
158 IF BTN() RUN
159 IF !IN(1) LRUN0 ELSE GOTO 158
160 '*UFO
170 LOCATE U,V
180 ?" ";
190 U=U+RND(3)-1
192 IF U<0 THEN U=0
194 IF U>30 THEN U=30
200 V=V+RND(3)-1
201 IF RND(10)=0 V=V+1
202 IF V<0 THEN V=0
204 IF V>23 THEN V=23
210 LOCATE U,V
220 ?CHR$(241);
230 RETURN
240 '*BEAM
250 B=X
260 FOR C=Y-1 TO V STEP -1
270 LOCATE B,C
280 ?"|";
285 WAIT 2
290 LOCATE B,C
300 ?" ";
310 NEXT
320 IF B<>U THEN RETURN
330 '*HIT
340 BEEP
350 LOCATE U,V
360 ?"*";
362 S=S+10
364 LOCATE 0,0
366 ?S
370 WAIT 20
380 LOCATE U,V
390 ?" ";
395 U=RND(31):V=0
400 RETURN

スキー

f:id:shiro0922:20190110224145p:plain
ジョイスティックの左右で自キャラを移動させて、ポールの間をくぐってください。ポールに当たるとゲームオーバーです。
Aボタンでリプレイ、Bボタンで名札に戻ります。

10 '*SKI*
20 CLS
30 CLV:OUT 1,-1
40 X=15
50 Y=3
60 P=12
70 W=7
80 C=0
90 @GAMELOOP
100 LOCATE X,Y
110 PRINT " "
120 I=(512-ANA(5))/256
130 IF I=-1 AND X>1 THEN X=X-1
140 IF I=1 AND X<30 THEN X=X+1
150 GOSUB @POLE
160 D=SCR(X,Y)
170 LOCATE X,Y
180 PRINT CHR$(250)
190 IF D=95 THEN BEEP:S=S+1
200 LOCATE 0,0
210 PRINT S
220 IF D=124 THEN GOTO @OVER
230 W=7-S/20
240 IF W<3 THEN W=3
250 WAIT 3
260 GOTO @GAMELOOP
270 @OVER
280 LOCATE X,Y
290 PRINT "X"
300 BEEP 30,30
310 @RLOOP
320 IF BTN() RUN
330 IF IN(1) GOTO @RLOOP ELSE LRUN 0
340 @POLE
350 C=C+1
360 IF C<10 THEN LOCATE 0,23:PRINT:RETURN
370 P=P+RND(3)-1
380 IF P<0 THEN P=0
390 IF P+W>30 THEN P=30-W
400 LOCATE P,23
410 PRINT "|";
420 FOR I=1 TO W-2
430 PRINT "_";
440 NEXT
450 PRINT "|"
460 C=0
470 RETURN

ジャンプアクション

f:id:shiro0922:20190110224245p:plain
敵のエイリアン「@」を避けつつ、コイン「$」を取ってください。
ジョイスティックの左右で左右移動、上下ではしごの上り下り、Aボタンでジャンプです。
エイリアンに当たるとゲームオーバーです。
Aボタンでリプレイ、Bボタンで名札に戻ります。

1 CLV:OUT1,-1:OUT2,-1:LET[90],30,6,-1,0,14,1,30,22,-1
2 CLS:FORJ=7TO23STEP8:LC0,J:FORI=0TO30:?CHR$(1);:NEXT:NEXT
3 FORJ=7TO22:LC7,J:?"H":LC23,J:?"H":NEXT:GSB19:X=0:Y=22:J=0
4 K=(512-ANA(5))/256:IFJOR(Y%8=6)U=X-(K=-1)*(X>0)+(K=1)*(X<30)
5 V=Y:IFJGOTO8
6 L=(512-ANA(6))/256:V=Y-(L=-1)*(H=72)+(L=1)*(SCR(X,Y+1)=72)
7 IFBTN()*(H<>72)J=1:G=-3
8 V=V+G*J:G=G+J:LCX,Y:?CHR$(H);:H=SCR(U,V):IFH=36BEEP:S=S+1:GSB19:H=0
9 LCU,V:?CHR$(250);:X=U:Y=V
10 IFH=64M=1
11 IFY%8=6J=0
12 IFRND(40)=0GSB25
13 FORA=0TO15STEP5:IF[A]GSB22
14 IF(![A])*(!RND(20))GSB20
15 NEXT:IF!MGOTO4
16 BEEP30,30:LC11,11:?"GAME OVER":WAIT30
17 IFBTN()RUN
18 IFIN(1)GOTO17 ELSELRUN0
19 LC0,0:?"SCORE ";S:RTN
20 R=RND(3)*3:[A+1]=[90+R]:[A+2]=[91+R]:[A+4]=SCR([A+1],[A+2]):IF[A+4]RTN
21 [A]=1:[A+3]=[92+R]:LC[A+1],[A+2]:?"@";:RTN
22 D=[A+1]+[A+3]:E=[A+2]:LC[A+1],[A+2]:?CHR$([A+4]);:IF(D<0)OR(D>30)[A]=0:RTN
23 [A+4]=SCR(D,E):LCD,E:?"@";:IF[A+4]=250M=1
24 [A+1]=D:[A+2]=E:RTN
25 B=RND(31):C=8*RND(3):IFSCR(B,C)GOTO25
26 LCB,C:?"$":RTN

100mダッシュ

f:id:shiro0922:20190110224337p:plain
Aボタンを連打して100m走ってください。ゴールするとタイムが表示されます。
タイトル画面でBボタンを押すと名札に戻ります。

10 '*100m Dash Event
20 VIDEO 3:CLV
30 @TITLE
40 CLS
50 LC 2,0:?"*100m Dash*"
60 LC 6,3:?"TIME"
70 LC 6,4:?T/60;".";T%60/6;
80 WAIT 120
90 LC 5,7:?"READY?";
100 IF BTN() CONT
110 @SLOOP
120 IF IN(1)=0 LRUN 0
130 IF !BTN() GOTO @SLOOP
140 CLS
150 LC 0,1:?CHR$(251)
160 LC 4,7:?"|";
170 LC 0,0
180 FOR T=3 TO 1 STEP -1
190 ?T;" ";:BEEP:WAIT 60
200 NEXT
210 ?"GO!":BEEP 10,60
220 LC 1,1:CLT
230 FOR R=1 TO 100
240 IF !BTN() CONT
250 IF BTN() CONT
260 ?CHR$(8,46,251);
270 NEXT
280 T=TICK()
290 ?" GOAL!";
300 BEEP 10,60:WAIT 60
310 GOTO @TITLE

ブロックくずし

f:id:shiro0922:20190110224440p:plain
ジョイスティックの左右でパドルを動かして、ボールを打ち返してください。
3回ミスするとゲームオーバーです。
Aボタンでリプレイ、Bボタンで名札に戻ります。

1 '* KBlock j
2 CLV:OUT1,-1
3 B=3:POKE#700,0,127,127,127,127,127,127,0,0,254,254,254,254,254,254,0
4 CLS:X=5:Y=10:D=1:E=1:C=#E9:GSB18:P=15:GSB23
5 LC1,23:?"SCORE ";S;:LC20,23:IFB>1FORI=1TOB-1:?CHR$(C);:NEXT
6 FORJ=0TO21:LC1,J:?CHR$(1):LC30,J:?CHR$(1):NEXT:GSB19
7 U=X+D:V=Y+E:IFV>-1ELSEV=RND(3)/2:E=1:R=0:GOTO7
8 WAIT2:IFSCR(U,V)<>1GOTO13
9 IFU<2BEEP20:D=1:GOTO7
10 IFU>29BEEP20:D=-1:GOTO7
11 BEEP30:E=-1:D=((U-P)>3)*2-1:R=0:IF!LO=0:GSB19
12 GOTO7
13 GSB22:GSB18:IF2<VANDV<7AND!RGSB20
14 X=U:Y=V:GSB18:GSB22:IFY<22GOTO7
15 BEEP30,60:WAIT60:B=B-1:IFB>0O=1:GOTO4
16 IFBTN()RUN
17 IFIN(1)GOTO16 ELSELRUN0
18 A=#900+X+Y*32:POKEA,C^PEEK(A):RTN
19 L=0:FORJ=0TO3:LC2,J+3:FORI=0TO13:A=I+J*14:[A]=[A]*O:?CHR$(#E0*![A],#E1*![A]);:L=L+![A]:NEXT:NEXT:RTN
20 I=(U-2)/2:J=V-3:A=I+J*14:IF[A]RTN
21 BEEP10:[A]=1:LCI*2+2,V:?CHR$(0,0);:R=1:E=-E:S=S+1:LC7,23:?S;:L=L-1:RTN
22 K=(512-ANA(5))/256:Q=P-(K=-1)*(P>1)+(K=1)*(P<25):IFQ=PWAIT1:RTNELSEP=Q
23 LCP-1,22:?CHR$(0,1,1,1,1,1,1,0);:RTN

落ち物パズル

f:id:shiro0922:20190110224611p:plain
上から落ちてくるブロックを左右に動かして、うまく積み重ねてください。横1列が揃うとその列は消えます。
Aボタンを押すと、ブロックが上下反転します。
ブロックが上まで積み上がるとゲームオーバーです。
Aボタンでリプレイ、Bボタンで名札に戻ります。

1 '*Fall j
2 CLV:CLS:OUT1,-1:OUT2,-1
3 FORJ=0TO13:[J]=513:Q=[J]:GSB23:NEXT:[14]=1023:Q=[14]:GSB23
4 LC0,16:?"SCORE 0":T=30
5 G=0:A=RND(15)+1:B=(A&3)*16:C=(A&12)*4:Y=0:IF!CGSB24
6 GSB21:IF(B&[0])OR(C&[1])GOTO18
7 FORK=0TOT:IF!BTN()GOTO9
8 GSB24:GSB21:GOTO13
9 I=(512-ANA(5))/256:IF!IGOTO13
10 D=B<<I:E=C<<I
11 IF(D&[Y])OR(E&[Y+1])GOTO13
12 GSB22:B=D:C=E:GSB21
13 NEXT:V=Y+1:IF(B&[V])OR(C&[V+1])GSB26
14 IF!GGOTO17
15 IFG=2GOTO18
16 IFG=1GOTO5
17 GSB22:Y=V:GSB21:GOTO7
18 BEEP30,30
19 IFBTN()RUN
20 IFIN(1)GOTO19 ELSELRUN0
21 LC0,Y:Q=[Y]|B:GSB23:Q=[Y+1]|C:GSB23:RTN
22 LC0,Y:Q=[Y]:GSB23:Q=[Y+1]:GSB23:RTN
23 FORI=0TO9:?CHR$(Q&1);:Q=Q>>1:NEXT:?:RTN
24 IF!BRTN
25 A=B:B=C:C=A:RTN
26 BEEP30,5:[Y]=[Y]|B:W=Y+1:[W]=[W]|C:P=1
27 IF[W]=1023&&W<14GSB31 ELSEW=Y
28 IF[W]=1023GSB31
29 G=1:IFY<2G=2
30 RTN
31 BEEP:[W]=513:Q=[W]:LC0,W:GSB23
32 S=S+P:LC6,16:?S:T=T-P*2:P=P+2:IFT<0T=0
33 FORZ=WTO1STEP-1:[Z]=[Z-1]:Q=[Z]:LC0,Z:GSB23:NEXT
34 LC0,0:Q=513:GSB23:RTN