学研の4ビットマイコン GMC-4 で、LEDを以下のように点灯させる。
- 左から右に1個流れていく。
- 右端に着いたら、そこで止まってまた新しい光が左から来る。
- 新しい光は既にある光の1個前で止まる。さらに新しい光が左から来る。
- 全ての枠が埋まったら、右の光から順に1個ずつ右にはけていく。
このようなパターンで光っている自動販売機があったかなあ。
プログラム
以下のプログラムは、MikeAssembler でアセンブルできる。
target gmc4
start:
; メモリに右端の位置を記録する
TIA 0
TIY 4 ; 記録するメモリの位置 兼 1回の待ち時間
AM
CY
CAL TIMR
loop1_1:
; 左端を点灯する
TIY 6
CAL SETR
loop1_2:
CAL TIMR
; 右端か判定する
CY
M-
CIA 0
JUMP loop1_continue
; 右端に着いたので、右端を1個左にして左端から再開する
TIA 1
M+
AM
CY
CIY 7
JUMP loop1_1
; 右端が一番左の時まで終わったので、後半へ
; ここにJUMP命令を置いて後半に飛ばすかわりに、ここに直接後半のコードを書く
; メモリに左端の位置を記録する
CY
TIA 0
AM
CY
loop2:
CAL TIMR
; 消灯し、それが右端かを判定する
CAL RSTR
AIY -1
JUMP loop2_continue
; 右端だったので、左端を1個左にして左端から再開する
CY
TIA 1
M+
AM
CY
CIY 7
JUMP loop2
; 左端が一番左の時まで終わったので、前半へ
CAL TIMR
JUMP start
loop2_continue:
; 右端じゃなかったので、点灯する位置を1個右にずらす
CAL SETR
JUMP loop2
; 前半のコードの続き
loop1_continue:
M-
CY
; 点灯する位置を右に1個ずらす
CAL RSTR
AIY -1
CAL SETR
JUMP loop1_2
以下は、このプログラムの機械語表現である。
| 0 1 2 3 4 5 6 7 8 9 A B C D E F
--+-----------------------------------
0 | 8 0 A 4 4 3 E C A 6 E 1 E C 3 7
1 | C 0 F 4 2 8 1 6 4 3 D 7 F 0 8 3
2 | 8 0 4 3 E C E 2 B F F 3 D 3 8 1
3 | 6 4 3 D 7 F 2 4 E C F 0 0 E 1 F
4 | 2 4 7 3 E 2 B F E 1 F 0 C