SHIROのIchigoJam日記

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

パンチカードJam

IchigoJamのアンプラグド・プログラミング教材として使われている、Jammy! Programing.KIDSのカトラリーカード

しかし、「ただカードを並べるだけじゃ面白くない。やっぱりコンピュータが動かないと」と思い、カードにパンチ穴を開けて、IchigoJamに読み込ませてプログラミングするシステムを作ってみました。

「昔のプログラミングは、穴の開いたカードをこうやってコンピュータに読み込ませてたんだよ」と、コンピュータの歴史を学ぶ教材になるかもしれません。

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

カードの準備

カードの上辺8カ所にパンチ穴を開けます。これが8bitの命令になります。

穴が開いたビットは「1」、開いていないビットは「0」です。
上位4bitがコマンド、下位4bitがオペランド(引数)です。
命令は以下のように割り振りました。

カトラリーカード・Basic(基本)の7割方の命令を実装しています。
いくつかのビット列は今後の命令拡張を考えて空けてありますが、カード入力でそんなに複雑なプログラムは作らないと思うので、この程度の命令で十分ではないでしょうか。

プログラム作り

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

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

プログラム読み込み

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

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

回路図は以下のとおりです。

プログラムの実行

「うごかしてみる」(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