Hatena::ブログ(Diary)

SHIROのモバイル日記 RSSフィード Twitter

2017-09-22

[]IchigoTrek-4K

IchigoJamのICを大容量版に変えた「IchigoJam拡張版」が試用できるようになっています。
私も以前いただいたIC基板(ICはLPC1115/303)が手元にあったので、試してみました。
プログラムメモリが1KB→4KB、配列変数の個数が102個→614個に拡大します。
f:id:shiro0922:20170626004252j:image:w360

この環境を活かしたプログラムとして、昔懐かしいスタートレック風ゲーム「IchigoTrek-4K」を作ってみました。
(今は著作権が厳しいので、いろいろ名前を変えました)
IchigoJamもついに4Kだ!(メモリが)
f:id:shiro0922:20170922003936p:image:w640

遊び方

  • あなたは宇宙船Ichigo-1(イチゴ1号)の船長です。あなたに与えられたミッションは、指定された年限内に全宇宙のエイリアンを破壊することです。
  • 宇宙は8×8のクォドラント(星域)に分かれており、クォドラント内は8×8のセクター(区域)に分かれています。
  • Ichigo-1の機器・コマンドは以下のとおりです。
    • ロングレンジセンサー(Long Range Sensor)
      • 全宇宙のクォドラント情報を表示します。3桁の数字は、1桁目がエイリアン数、2桁目が基地の数(全宇宙で3カ所)、3桁目が星の数です。なお、Ichigo-1が既に訪問したクォドラント、および隣接したクォドラントの情報しか表示されません。
    • ショートレンジセンサー(Short Range Sensor)
      • Ichigo-1がいるクォドラント内のセクター情報が表示されます。イチゴマークがIchigo-1、エイリアンマークがエイリアン、「*」は星、「B」は基地です。
    • 1:ワープエンジン(Warp Engine):所要時間1年
      • 他のクォドラントへワープ航法で移動します。行き先のクォドラントを(X,Y)座標(それぞれ1〜8)で指定します。宇宙の外へは移動できません。
    • 2:インパルスエンジン(Impulse Engine):所要時間0.3年
      • 他のセクターへ通常航法で移動します。行き先のセクターを(X,Y)座標(それぞれ1〜8)で指定します。座標にマイナスの値、あるいは9以上の値を入れると、隣接するクォドラントへ移動できます。
    • 3:フェイザー砲(Phaser Cannon):所要時間0.1年
      • クォドラント内のエイリアンや星に対して、エネルギーを放射して攻撃します。投入するエネルギー量を入力します。対象が複数ある場合は、エネルギーが等配分されます。エイリアンは80〜120ポイント以上(ランダム)、星は100ポイント以上をぶつければ破壊できます。基地は攻撃対象になりません。
    • 4:光子魚雷(Photon Torpedo):所要時間0.1年
      • クォドラント内のエイリアンや星に対して、魚雷で攻撃します。目標のセクターを(X,Y)座標(それぞれ1〜8)で指定します。初期保有数は5発で、発射すると1発ずつ減ります。基地は攻撃対象になりません。
    • 5:ウェイト(Wait):所要時間0.5年
      • 何もせずに0.5年待ちます。故障した機器の回復を待ちたい時などに使います。この機能は故障しません。
  • エイリアンの攻撃、機器故障
    • クォドラント内にエイリアンがいる場合は、攻撃を受けてエネルギーを消耗します。
      その際に機器が故障して使えなくなることがあります。故障した機器は時間が経つと回復します。基地に入港する(隣接したセクターに移動する)と、全ての機器が修理され、エネルギーや光子魚雷もフル充填されます。
      なお、たまにMr.Fukunoが現れて、すぐに直してくれることがあります(^_^)
  • 終了条件
  • その他
    • 時により宇宙嵐(Space storm)が発生して、機器が損傷することがあります。
    • ワープエンジン・インパルスエンジン・フェイザー砲・光子魚雷のパラメータ入力時に「0」を入力すると、キャンセルとなってコマンド入力に戻ります。時間やエネルギーも消費しません。

私が初めて「スタートレック」ゲームを遊んだのは、PC-8001の16KB版でした。
メモリ4KBでどうかと思ったのですが、8割方の機能を載せられました。
私は作りながらつい熱中して遊んでしまいましたが、今時の子ども達はこうした古典的なゲームを面白いと思ってくれるかな?

プログラムリスト

(9/22修正)フェイザー砲のエネルギー計算のバグを修正、宇宙嵐を追加、光子魚雷の最大数を5発にするなどゲームバランスの調整

1 '*IchigoTrek-4K
2 CLV:CLS:A=20+RND(8):Z=(A+3+RND(6))*10
3 FORI=1TO3:GSB28:[J]=[J]+16:NEXT:J=J-64:R=J/8:Q=J-R*8:GSB30
4 FORI=1TOA:GSB28:[J]=[J]+256:NEXT
5 FORJ=64TO127:[J]=[J]+RND(6):NEXT
6 FORC=48TO57:FORB=0TO7:POKE(C+192)*8+B,~PEEK(C*8+B):NEXT:NEXT
7 E=3000:T=5:GSB34
8 [128]=A:[129]=Z
9 [130]="Long Range Sensor":[131]=16:[134]=45
10 [135]="Short Range Sensor":[136]=17:[139]=48
11 [140]="Warp Engine":[141]=10:[142]=10:[144]=67
12 [145]="Impulse Engine":[146]=13:[147]=3:[149]=70
13 [150]="Phaser Cannon":[151]=12:[152]=1:[154]=80
14 [155]="Photon Torpedo":[156]=13:[157]=1:[159]=89
15 [160]="Wait":[161]=3:[162]=5:[164]=96
16 GSB29:?">Command=";:INPUTC:IFC<1ORC>5CONT
17 D=C+2:IF[128+D*5]>0GSB108:GOTO16
18 BEEP:?"---";:GSB43:?"---"
19 GSB[129+D*5]:IF!CGOTO16
20 W=[127+D*5]:Z=Z-W:GSB29
21 IFA<=0GOTO25
22 IFE<=0ORZ<=0GOTO27
23 GSB109:GSB103:GSB115
24 GOTO16
25 GSB118:?"### Mission completed!! ###"
26 S=[128]*Z/10*Z:?"Your Score=";S:END
27 GSB117:?"* Mission failed *":END
28 J=64+RND(64):IF[J]&16CONT ELSERTN
29 GSB45:GSB48:GSB51:WAIT60:POKE#B40,0:COPY#B41,#B40,191:LC0,18:RTN
30 FORI=-1TO1:FORJ=-1TO1:M=Q+I:IFM<0||M>7GOTO33
31 N=R+J:IFN<0||N>7GOTO33
32 K=M+N*8+64:[K]=[K]|4096
33 NEXT:NEXT:RTN
34 FORI=0TO63:[I]=46:NEXT
35 S=Q+R*8+64:L=[S]&#F00/256:K=237:IFLGSB40
36 L=[S]&#F0/16:K=66:IFLGSB40
37 L=[S]&15:K=42:IFLGSB40
38 X=RND(8):Y=RND(8):IF[X+Y*8]<>46GOTO38
39 RTN
40 FORI=1TOL
41 J=RND(64):IF[J]<>46GOTO41
42 [J]=K:NEXT:RTN
43 J=125+D*5:K=[J]:L=[J+1]:GSB44:RTN
44 FORI=0TOL:?CHR$(PEEK(K+I));:NEXT:RTN
45 LC0,0:FORK=64TO127:IF[K]&4096&&(![133])?HEX$([K],3);ELSE?"***";
46 ?" ";:NEXT:IF[133]RTN
47 LCQ*4,R:S=Q+R*8:?HEX$([S+64],3):I=#900+S*4:FORJ=0TO2:POKEI+J,PEEK(I+J)+192:NEXT:RTN
48 FORJ=0TO7:LC0,J+9:FORI=0TO7:IF[138]?"*";ELSE?CHR$([I+J*8]);
49 NEXT:NEXT:IF![138]LCX,Y+9:?CHR$(255)
50 RTN
51 LC9,9:?"Quadrant(";Q+1;",";R+1;")"
52 LC9,10:?"Sector (";X+1;",";Y+1;")"
53 LC9,12:?"Energy =";E;" "
54 LC9,13:?"Torpedo=";T;" "
55 LC9,15:?"Years =";Z/10;".";Z%10;" "
56 LC9,16:?"Aliens =";A;" "
57 LC23,9:?"Status--"
58 LC23,10:?" LRS "
59 LC23,11:?" SRS "
60 LC23,12:?"1WpE "
61 LC23,13:?"2IpE "
62 LC23,14:?"3Psr "
63 LC23,15:?"4Tpd "
64 LC23,16:?"5Wit"
65 FORI=1TO6:J=[128+I*5]:IFJLC23,9+I:?"*":LC28,9+I:?J/10;".";J%10
66 NEXT:RTN
67 GSB97:IF!CRTN
68 M=Q-U:N=R-V:E=E-(ABS(M)+ABS(N))*50
69 Q=U:R=V:GSB30:GSB118:GSB34:GSB74:RTN
70 GSB99:IF!CRTN
71 GSB118:M=X-U:N=Y-V:E=E-(ABS(M)+ABS(N))*30:X=U:Y=V
72 M=Q-(U<0&&Q>0)+(U>7&&Q<7):N=R-(V<0&&R>0)+(V>7&&R<7)
73 IFQ<>M||R<>NQ=M:R=N:GSB34:GSB30
74 GSB48:B=0:FORI=-1TO1:FORJ=-1TO1:U=X+I:IFU<0||U>7GOTO77
75 V=Y+J:IFV<0||V>7GOTO77
76 IF[U+V*8]=66B=1
77 NEXT:NEXT:IF!BRTN
78 GSB29:GSB118:?"Docked, all fixed!":E=3000:T=5
79 FORI=1TO7:[128+I*5]=0:NEXT:RTN
80 ?"Energy=";:INPUTP:IFP<0||P>ECONT
81 IF!PC=0:RTN
82 E=E-P:S=64+Q+R*8:O=[S]&#F00/256+[S]&15:IFOF=P/OELSEF=100
83 FORJ=0TO7:FORI=0TO7:K=I+J*8
84 IF[K]=237&&(80+RND(40)<F)GSB87
85 IF[K]=42&&99<FGSB88
86 NEXT:NEXT:RTN
87 GSB118:?CHR$(237);"destroyed. ";:[K]=46:A=A-1:[S]=[S]-256:RTN
88 GSB118:?"*destroyed. ";:[K]=46:[S]=[S]-1:RTN
89 IF!TC=0:RTN
90 GSB99:IFU<0||U>8||V<0||V>8CONT
91 IF!CRTN
92 T=T-1:K=U+V*8:S=64+Q+R*8
93 IF[K]=237GSB87
94 IF[K]=42GSB88
95 RTN
96 ?"0.";[162];" year passed...":RTN
97 K="Quadrant":L=7:GSB100:IFU<0||U>8||V<0||V>8CONT
98 RTN
99 K="Sector":L=5:GSB100:RTN
100 ?"For ";:GSB44:?":X(1-8)=";:INPUTU:IF!UC=0:RTN
101 ?"For ";:GSB44:?":Y(1-8)=";:INPUTV:IF!VC=0
102 U=U-1:V=V-1:RTN
103 K=[Q+R*8+64]&#F00/256:IF!KRTN
104 M=0:FORI=1TOK:GSB117:?"Alien's attack! ";:N=RND(100):M=M+N*I:E=E-N:NEXT:GSB29
105 IFRND(200)>MRTN
106 D=RND(6)+1:I=128+D*5:IF[I]CONT
107 [I]=RND(30)+10
108 P=[128+D*5]:GSB117:GSB43:?" is damaged!":?P/10;".";P%10;" year for repair.":GSB29:RTN
109 FORD=1TO7:J=128+D*5:IF![J]GOTO112
110 IF!RND(10)GSB113:GOTO112
111 [J]=[J]-W:IF[J]<=0GSB114
112 NEXT:RTN
113 ?CHR$(255);"Mr.Fukuno appeared!"
114 GSB118:[J]=0:GSB43:?" is fixed!":GSB29:RTN
115 IF!RND(20)?"*Space storm!*":GSB106
116 RTN
117 FORB=1TO10:BEEP30,1:WAIT2:NEXT:RTN
118 FORB=1TO3:BEEP10,2:WAIT7:NEXT:RTN
MixJuiceでもダウンロードできます。
?"MJ GET comich.net/ichigojam/ichigotrek4k.txt"

ソースリスト

IJUtilitiesで変換する前の、ラベルあり・行番号無しのリストです。詳しく中身を知りたい人は参考にしてください。4KB目一杯なので、圧縮されていて読みづらいですが…。

'*IchigoTrek-4K
CLV:CLS:A=20+RND(8):Z=(A+3+RND(6))*10
FORI=1TO3:GSB@RNDB:[J]=[J]+16:NEXT:J=J-64:R=J/8:Q=J-R*8:GSB@VISITQ
FORI=1TOA:GSB@RNDB:[J]=[J]+256:NEXT
FORJ=64TO127:[J]=[J]+RND(6):NEXT
FORC=48TO57:FORB=0TO7:POKE(C+192)*8+B,~PEEK(C*8+B):NEXT:NEXT
E=3000:T=5:GSB@SETSEC
[128]=A:[129]=Z
[130]="Long Range Sensor":[131]=16:[134]=GOTO@LRS
[135]="Short Range Sensor":[136]=17:[139]=GOTO@SRS
[140]="Warp Engine":[141]=10:[142]=10:[144]=GOTO@WPE
[145]="Impulse Engine":[146]=13:[147]=3:[149]=GOTO@IPE
[150]="Phaser Cannon":[151]=12:[152]=1:[154]=GOTO@PSR
[155]="Photon Torpedo":[156]=13:[157]=1:[159]=GOTO@TPD
[160]="Wait":[161]=3:[162]=5:[164]=GOTO@WIT
@GAMELOOP
GSB@CLC:?">Command=";:INPUTC:IFC<1ORC>5CONT
D=C+2:IF[128+D*5]>0GSB@PRTDMG:GOTO@GAMELOOP
BEEP:?"---";:GSB@PRTD:?"---"
GSB[129+D*5]:IF!CGOTO@GAMELOOP
W=[127+D*5]:Z=Z-W:GSB@CLC
IFA<=0GOTO@WIN
IFE<=0ORZ<=0GOTO@GOVER
GSB@DMG:GSB@ATA:GSB@STORM
GOTO@GAMELOOP
@WIN
GSB@BEEPP:?"### Mission completed!! ###"
S=[128]*Z/10*Z:?"Your Score=";S:END
@GOVER
GSB@BEEPD:?"* Mission failed *":END
@RNDB
J=64+RND(64):IF[J]&16CONT ELSERTN
@CLC
GSB@LRS:GSB@SRS:GSB@PANEL:WAIT60:POKE#B40,0:COPY#B41,#B40,191:LC0,18:RTN
@VISITQ
FORI=-1TO1:FORJ=-1TO1:M=Q+I:IFM<0||M>7GOTO@VISITQ1
N=R+J:IFN<0||N>7GOTO@VISITQ1
K=M+N*8+64:[K]=[K]|4096
@VISITQ1
NEXT:NEXT:RTN
@SETSEC
FORI=0TO63:[I]=46:NEXT
S=Q+R*8+64:L=[S]&#F00/256:K=237:IFLGSB@SETS
L=[S]&#F0/16:K=66:IFLGSB@SETS
L=[S]&15:K=42:IFLGSB@SETS
@SETSEC1
X=RND(8):Y=RND(8):IF[X+Y*8]<>46GOTO@SETSEC1
RTN
@SETS
FORI=1TOL
@SETS1
J=RND(64):IF[J]<>46GOTO@SETS1
[J]=K:NEXT:RTN
@PRTD
J=125+D*5:K=[J]:L=[J+1]:GSB@PRTSTR:RTN
@PRTSTR
FORI=0TOL:?CHR$(PEEK(K+I));:NEXT:RTN
@LRS
LC0,0:FORK=64TO127:IF[K]&4096&&(![133])?HEX$([K],3);ELSE?"***";
?" ";:NEXT:IF[133]RTN
LCQ*4,R:S=Q+R*8:?HEX$([S+64],3):I=#900+S*4:FORJ=0TO2:POKEI+J,PEEK(I+J)+192:NEXT:RTN
@SRS
FORJ=0TO7:LC0,J+9:FORI=0TO7:IF[138]?"*";ELSE?CHR$([I+J*8]);
NEXT:NEXT:IF![138]LCX,Y+9:?CHR$(255)
RTN
@PANEL
LC9,9:?"Quadrant(";Q+1;",";R+1;")"
LC9,10:?"Sector (";X+1;",";Y+1;")"
LC9,12:?"Energy =";E;" "
LC9,13:?"Torpedo=";T;" "
LC9,15:?"Years =";Z/10;".";Z%10;" "
LC9,16:?"Aliens =";A;" "
LC23,9:?"Status--"
LC23,10:?" LRS "
LC23,11:?" SRS "
LC23,12:?"1WpE "
LC23,13:?"2IpE "
LC23,14:?"3Psr "
LC23,15:?"4Tpd "
LC23,16:?"5Wit"
FORI=1TO6:J=[128+I*5]:IFJLC23,9+I:?"*":LC28,9+I:?J/10;".";J%10
NEXT:RTN
@WPE
GSB@INQ:IF!CRTN
M=Q-U:N=R-V:E=E-(ABS(M)+ABS(N))*50
Q=U:R=V:GSB@VISITQ:GSB@BEEPP:GSB@SETSEC:GSB@IPEB:RTN
@IPE
GSB@INS:IF!CRTN
GSB@BEEPP:M=X-U:N=Y-V:E=E-(ABS(M)+ABS(N))*30:X=U:Y=V
M=Q-(U<0&&Q>0)+(U>7&&Q<7):N=R-(V<0&&R>0)+(V>7&&R<7)
IFQ<>M||R<>NQ=M:R=N:GSB@SETSEC:GSB@VISITQ
@IPEB
GSB@SRS:B=0:FORI=-1TO1:FORJ=-1TO1:U=X+I:IFU<0||U>7GOTO@IPEB1
V=Y+J:IFV<0||V>7GOTO@IPEB1
IF[U+V*8]=66B=1
@IPEB1
NEXT:NEXT:IF!BRTN
GSB@CLC:GSB@BEEPP:?"Docked, all fixed!":E=3000:T=5
FORI=1TO7:[128+I*5]=0:NEXT:RTN
@PSR
?"Energy=";:INPUTP:IFP<0||P>ECONT
IF!PC=0:RTN
E=E-P:S=64+Q+R*8:O=[S]&#F00/256+[S]&15:IFOF=P/OELSEF=100
FORJ=0TO7:FORI=0TO7:K=I+J*8
IF[K]=237&&(80+RND(40)<F)GSB@DESA
IF[K]=42&&99<FGSB@DESS
NEXT:NEXT:RTN
@DESA
GSB@BEEPP:?CHR$(237);"destroyed. ";:[K]=46:A=A-1:[S]=[S]-256:RTN
@DESS
GSB@BEEPP:?"*destroyed. ";:[K]=46:[S]=[S]-1:RTN
@TPD
IF!TC=0:RTN
GSB@INS:IFU<0||U>8||V<0||V>8CONT
IF!CRTN
T=T-1:K=U+V*8:S=64+Q+R*8
IF[K]=237GSB@DESA
IF[K]=42GSB@DESS
RTN
@WIT
?"0.";[162];" year passed...":RTN
@INQ
K="Quadrant":L=7:GSB@INXY:IFU<0||U>8||V<0||V>8CONT
RTN
@INS
K="Sector":L=5:GSB@INXY:RTN
@INXY
?"For ";:GSB@PRTSTR:?":X(1-8)=";:INPUTU:IF!UC=0:RTN
?"For ";:GSB@PRTSTR:?":Y(1-8)=";:INPUTV:IF!VC=0
U=U-1:V=V-1:RTN
@ATA
K=[Q+R*8+64]&#F00/256:IF!KRTN
M=0:FORI=1TOK:GSB@BEEPD:?"Alien's attack! ";:N=RND(100):M=M+N*I:E=E-N:NEXT:GSB@CLC
IFRND(200)>MRTN
@DDMG
D=RND(6)+1:I=128+D*5:IF[I]CONT
[I]=RND(30)+10
@PRTDMG
P=[128+D*5]:GSB@BEEPD:GSB@PRTD:?" is damaged!":?P/10;".";P%10;" year for repair.":GSB@CLC:RTN
@DMG
FORD=1TO7:J=128+D*5:IF![J]GOTO@DMG1
IF!RND(10)GSB@DMGF:GOTO@DMG1
[J]=[J]-W:IF[J]<=0GSB@DMGX
@DMG1
NEXT:RTN
@DMGF
?CHR$(255);"Mr.Fukuno appeared!"
@DMGX
GSB@BEEPP:[J]=0:GSB@PRTD:?" is fixed!":GSB@CLC:RTN
@STORM
IF!RND(20)?"*Space storm!*":GSB@DDMG
RTN
@BEEPD
FORB=1TO10:BEEP30,1:WAIT2:NEXT:RTN
@BEEPP
FORB=1TO3:BEEP10,2:WAIT7:NEXT:RTN

2017-09-10

[]パンチカードJam PCB

以前作った「パンチカードJam」のその後です。
有志の方にPCB(プリント基板)をデザインしていただいて、スイッチサイエンスPCBで発注。それを使ってコンパクトな一体型にしてみました。
f:id:shiro0922:20170909225625j:image:w360

プレイ動画はこちら。
D

発注したPCB基板。
f:id:shiro0922:20170910211450j:image:w360

全体をタッパーのふたにくっつけたので、タッパー本体をかぶせればそのまま持ち歩けます。
f:id:shiro0922:20170909225752j:image:w360

画面もちゃんとシステムっぽく表示するようにしました。
f:id:shiro0922:20170910232114p:image:w360

カードを読み込むと、そのプログラム行を表示します。
f:id:shiro0922:20170910232150p:image:w360

「やってみる」(RUN)カードで、プログラムを実行します。実行中の行を順番に表示します。
f:id:shiro0922:20170910232217p:image:w360

「やめる」(ESC)カードで、プログラムが停止します。
f:id:shiro0922:20170910232249p:image:w360

「けす」(CLS)カードで、画面がクリアされます。
f:id:shiro0922:20170910232317p:image:w360

「みる」(LIST)カードで、プログラムリストを表示します。
f:id:shiro0922:20170910232355p:image:w360

プログラムをぜんぶけす」(NEW)カードで、プログラムを消去します。
LISTやRUNをしても、何も起きなくなります。
f:id:shiro0922:20170910232430p:image:w360

命令表の改訂版。LISTとCLSコマンドを追加しました。
やっぱりLISTが表示されると、プログラミングしている気分になりますね(^_^)
f:id:shiro0922:20170910232515p:image:w360

システムプログラムはこちら。容量が増えたので2スロットに分けました。

●本体プログラム(スロット0)

1 CLS:?"***Punch Card Jam***"
2 CLV:FORP=1TO6:OUTP,-1:NEXT:BEEP
3 '@RESET
4 OUT0:Z=0:L=0
5 '@OK
6 ?CHR$(8);:?"OK":?CHR$(1);
7 IF!IN(11)CONT
8 '@ICARD
9 R=1:GSB41
10 IFC=0&&O=0GOTO8
11 ?CHR$(8);:IF!CGOTO23
12 IFTGSB21 ELSEGSB18
13 FORB=1TOZ:BEEP20,5:WAIT20:NEXT
14 GOTO34
15 '@ICARDEND
16 IF!IN(11)CONT
17 ?CHR$(1);:GOTO8
18 '@ICARDN
19 Z=Z+1:[Z]=C*16+O:IFC=8L=L+1:[80+L]=Z
20 ?"read> ";Z*10;" ";:RTN
21 '@ICARDT
22 [Z]=[Z]|((C*16+O)<<8):T=0:RTN
23 '@COM
24 BEEP30,30:IFO=1?"RUN":R=0:GOTO29
25 IFO=2?"LIST":R=2:GOTO29
26 IFO=3?"NEW":GOTO3
27 IFO=4CLS:GOTO5
28 GOTO8
29 '@GO
30 A=0
31 '@GLOOP
32 A=A+1:IFA>ZGOTO5
33 C=[A]&#F0/16:O=[A]&15:?CHR$(8);A*10;" ";
34 '@GDO
35 IFC=15&&O=15LRUN1,150
36 LRUN1,C*10
37 '@GLOOPEND
38 IFT&&(R!=1)C=([A]&#F000)>>12:O=([A]&#F00)>>8:T=0:GOTO34
39 GSB41:IFC=15&&O=15BEEP30,30:?"ESC":GOTO5
40 ?CHR$(1);:GOTO31
41 '@RCARD
42 C=0:O=0:IFIN(11)RTNELSECLT
43 '@RCARD1
44 IFIN(11)RTN
45 IFTICK()<120GOTO43
46 FORP=1TO4:C=C*2+IN(P):O=O*2+IN(P+4):NEXT:RTN

●コマンド解析ルーチン(スロット1)
1 '*Punch Card Jam(1)
10 @LED
11 ?"LED ";O:IFR=1LRUN0,15
12 IFR=2LRUN0,37
13 LEDO:LRUN0,37
20 @WAIT
21 ?"WAIT ";O*60:IFR=1LRUN0,15
22 IFR=2LRUN0,37
23 WAITO*60:LRUN0,37
30 @BEEP
31 ?"BEEP":IFR=1LRUN0,15
32 IFR=2LRUN0,37
33 BEEP:LRUN0,37
80 @LABEL
81 ?"@";O:IFR=1LRUN0,15
82 LRUN0,37
90 @GOTOL
91 ?"GOTO @";O:IFR=1LRUN0,15
92 IFR=2LRUN0,37
93 A=[80+O]-1:LRUN0,37
100 @IFBTN
101 ?"IF BTN()=";O;" THEN ";:T=1:IFR=1LRUN0,15
102 IFR=2LRUN0,37
103 T=(BTN()=O):IF!T?
104 LRUN0,37
120 @FOR
121 ?"FOR I=1 TO ";O:IFR=1LRUN0,15
122 IFR=2LRUN0,37
123 I=1:J=O:S=A:LRUN0,37
130 @NEXT
131 ?"NEXT":IFR=1LRUN0,15
132 IFR=2LRUN0,37
133 I=I+1:IFI<=JA=S
134 LRUN0,37
150 @END
151 ?"END":IFR=1LRUN0,15
152 IFR=2LRUN0,37
153 A=Z:LRUN0,37

2017-09-09

[]micro:bitで連打ゲーム

f:id:shiro0922:20170909143432j:image:w360
話題の教育用マイコンmicro:bit」を入手したので、試してみました。
日本でも最近発売されたのですが、品薄でなかなか手に入らないので、本家・イギリスから取り寄せました。

f:id:shiro0922:20170909143500j:image:w360
セット内容は、ボード本体、単4電池×2のボックス、USBケーブル。
電池ボックスは、面倒なので両面テープでボードに貼り付けてしまいました。

f:id:shiro0922:20170909170644p:image:w360
プログラムは、PCのブラウザ上で作ります。
https://makecode.microbit.org/
ブロックをドラッグして組み合わせてプログラミングします。
左側のmicro:bitの表示ですぐシミュレート動作するので、プログラムの動きがすぐ確かめられます。

作ったプログラムは、「ダウンロード」ボタンをクリックすると、「〜.hex」というファイルでPCにダウンロードできます。
micro:bitをUSBケーブルで接続すると、USBメモリのようにWindowsのドライブとして見えるので、そこへ「〜.hex」ファイルをドラッグしてコピーすると転送されます。
(複数ファイルを転送されるのを防ぐためか、転送後のファイルはWindowsで表示されません)
プログラムが転送されると、micro:bitは自動的にそのプログラムを起動します。
micro:bit裏面のリセットスイッチを押すと、リセットされて再度プログラムを起動します。

さっそくIchigoDotでおなじみの「連打ゲーム」を作ってみました。
プレイ動画はこちら。
D

プログラムはこんな感じです。
f:id:shiro0922:20170909170819p:image:w360
基本的にイベントドリブン型のプログラミングで、ボタン入力検知がイベント発生になっていて、「もしボタンが押されたら〜」の条件判断ブロックがありません。
さらにタイマーが無いので、かなり作りづらかったです。

hexファイルをダウンロードしたい人はこちら。
http://comich.net/microbit/renda.hex

2017-09-05

[]IchigoDotSサイネージ

9/17(日)に開催される「NT名古屋2017」にて、共同出展でIchigoJam工作物を並べることになりました。
その展示に向けて、デジタルサイネージ(看板)を作ってみました。
D

以前にも工作した8×8LEDマトリックスゲーム機「IchigoDotS」を横に4個並べて、IchigoJamからシリアルでコマンドを送って制御しています。
f:id:shiro0922:20170905141158j:image:w360

今回はIchigoDotSをディスプレイとして使うので、LPC1114の足を逆折りする裏技で、LEDマトリックスと同じ面にICを付けて薄型化しています。ブザー・押しボタン・電池も無し。
f:id:shiro0922:20170905154023j:image:w360

看板として考えると、もう少し明るくても良かったかも。今後の課題です。
f:id:shiro0922:20170905143008j:image:w360

サイネージのプログラムはこちら。
「IchigoJam」のロゴと、共同出展者の方の「FRISKアンプ」を表示しています。

1 '*IchigoDotS Signage
2 VIDEO0:WAIT60:UART1:CLS:?
3 '@START
4 GSB38
5 LET[0],#5F,#40,#5C,#54,#40,#5F,#44,#5C
6 LET[8],#40,#5D,#00,#5C,#54,#7C,#00,#5C
7 LET[16],#54,#5C,#40,#50,#5F,#40,#5C,#54
8 LET[24],#5C,#50,#44,#5C,#44,#5C,#44,#5C
9 GSB28:WAIT180
10 FORF=1TO3
11 GSB38:WAIT30
12 GSB32:WAIT30
13 NEXT
14 WAIT180
15 '@FRISKAMP
16 GSB38
17 LET[0],#7F,#09,#09,#00,#7F,#09,#76,#00
18 LET[8],#7F,#00,#26,#49,#32,#00,#7F,#08
19 LET[16],#14,#63,#00,#7E,#09,#7E,#00,#7F
20 LET[24],#02,#0C,#02,#7F,#00,#7F,#09,#06
21 GSB28:WAIT180
22 FORF=1TO3
23 GSB38:WAIT30
24 GSB32:WAIT30
25 NEXT
26 WAIT180
27 GOTO3
28 '@PRTWAIT
29 FORB=0TO31
30 ?"MATLED PUSH ";[B]:WAIT10
31 NEXT:RTN
32 '@PRTNOWAIT
33 FORC=0TO3
34 ?"MATLED SHOW ";
35 FORB=0TO7
36 ?HEX$([C*8+B],2);
37 NEXT:?:NEXT:RTN
38 '@PRTCLR
39 FORI=1TO4
40 ?"MATLED SHOW 0000000000000000"
41 NEXT:RTN

材料

2017-08-21

[]パンチカードJam

IchigoJamのアンプラグドプログラミング教材として使われている、Jammy! Programing.KIDSのカトラリーカード
f:id:shiro0922:20170821014840p:image:w360

しかし、「ただカードを並べるだけじゃ面白くない。やっぱりコンピュータが動かないと」と思い、カードにパンチ穴を開けて、IchigoJamに読み込ませてプログラミングするシステムを作ってみました。
f:id:shiro0922:20170821100434j:image:w360
「昔のプログラミングは、穴の開いたカードをこうやってコンピュータに読み込ませてたんだよ」と、コンピュータの歴史を学ぶ教材になるかもしれません。

紹介動画を作りましたので、まずごらんください。
D

カードの準備

カードの上辺8カ所にパンチ穴を開けます。これが8bitの命令になります。
f:id:shiro0922:20170821100612j:image:w360
穴が開いたビットは「1」、開いていないビットは「0」です。
上位4bitがコマンド、下位4bitがオペランド引数)です。
命令は以下のように割り振りました。
f:id:shiro0922:20170821011309p:image:w360
カトラリーカード・Basic(基本)の7割方の命令を実装しています。
いくつかのビット列は今後の命令拡張を考えて空けてありますが、カード入力でそんなに複雑なプログラムは作らないと思うので、この程度の命令で十分ではないでしょうか。

プログラム作り

カードを並べて、プログラムを作ります。
例として、IchigoJamのLEDを点滅させて永久ループするプログラムを作ります。
f:id:shiro0922:20170821100723j:image:w360

10 @1
20 LED 1
30 WAIT 60
40 LED 0
50 WAIT 60
60 GOTO @1

プログラム読み込み

IchigoJamに接続したカードリーダー基板で、プログラムのカードを1枚ずつ読み込ませます。
f:id:shiro0922:20170821100810j:image:w360

カードリーダー基板にはフォトリフレクターが9個並んでいます。
左4個が上位4bit(コマンド)読み取り、その右4個が下位4bit(オペランド)読み取り、一番右はカードの有無を検知します。
f:id:shiro0922:20170821184805p:image:w360

回路図は以下のとおりです。
f:id:shiro0922:20170821011537p:image:w360

プログラムの実行

「うごかしてみる」(RUN)のカードを読み込ませると、プログラムを実行します。
途中で止めたい場合は「やめる」(ESC)カードを読み込ませます。

実行が終わると、最初に戻ります。再度「うごかしてみる」カードを読み込ませれば実行できます。
プログラムをぜんぶけす」(NEW)カードでプログラムをクリアできます。

システムプログラム

パンチカードJam」のプログラムは以下のとおりです。
わかりやすくするためにラベルを残しています。

1 '*P.Card Jam
2 CLV:FORP=1TO6:OUTP,-1:NEXT
3 '@NEW
4 ?:?"*NEW*":OUT0:Z=0:L=0
5 '@OK
6 ?:?"*OK*":BEEP30,30
7 IF!IN(11)CONT
8 '@ICARD
9 GSB54
10 IFC=0&&O=0GOTO8
11 IF!CGOTO17
12 Z=Z+1:[Z]=C*16+O:IFC=8L=L+1:[80+L]=Z
13 ?" ->inp [";Z;"]"
14 FORB=1TOZ:BEEP10,5:WAIT20:NEXT
15 IF!IN(11)CONT
16 GOTO8
17 '@COM
18 IFO=3GOTO3
19 IFO!=1GOTO8
20 ?:?"*RUN*":BEEP30,30:A=0
21 '@RLOOP
22 A=A+1:IFA>ZGOTO5
23 C=[A]&#F0/16:O=[A]&15
24 ?"run [";A;"] ";C;":";O
25 IFC=1GSB36
26 IFC=2GSB38
27 IFC=3GSB40
28 IFC=9GSB42
29 IFC=10GSB44
30 IFC=12GSB47
31 IFC=13GSB49
32 IFC=15&&O=15GSB52
33 GSB54
34 IFC=15&&O=15GOTO5
35 GOTO21
36 '@LED
37 LEDO:RTN
38 '@WAIT
39 WAITO*60:RTN
40 '@BEEP
41 BEEP:RTN
42 '@GOTOL
43 A=[80+O]:RTN
44 '@IFBTN
45 IFBTN()!=OA=A+1
46 RTN
47 '@FOR
48 I=1:J=O:S=A:RTN
49 '@NEXT
50 I=I+1:IFI<=JA=S
51 RTN
52 '@END
53 A=Z:RTN
54 '@RCARD
55 C=0:O=0:IFIN(11)RTNELSECLT
56 '@RCARD1
57 IFIN(11)RTN
58 IFTICK()<120GOTO56
59 FORP=1TO4:C=C*2+IN(P):O=O*2+IN(P+4):NEXT
60 ?C;":";O;:RTN

材料

ダウンロード
リンク集
アクセスカウンター