学研の4ビットマイコン GMC-4 でルーレットを作ってみた。
仕様
- ボタンを押している間、LEDの点灯位置がぐるぐる回る。
- ボタンを離すとLEDの点灯位置の移動が遅くなり、しばらくすると止まって抽選結果が確定する。
プログラム
最初のループ main_loop
でキーが押されるのを待ちながらYレジスタの値を2ずつ増やす。
ボタンが押されたら、1ビット右シフトして8を足し、8~15の乱数として扱う。
その後、update_loop
でLEDの点灯位置を変えながらループを行う。
7個の2進LEDに加え、7セグメントLEDも点灯対象とするため、場合分けして処理する。
ボタンが押されている間は、CAL TIMR
命令により約0.1秒間隔で点灯位置を変える。
ボタンが離されると、間隔を約0.3秒にし、止まるまでの移動回数を減算しながら移動するようにする。
この回数には main_loop
で生成した乱数を用いる。
移動回数を使い切ると、エンド音を鳴らして抽選結果の確定を知らせる。
以下のプログラムは、MikeAssembler でアセンブルできる。
target gmc4
; Z = ルーレット位置
TIY 0
CH
; A = キーが離されたフラグ 兼 ウェイト時間
; Y = キーが離された後の更新回数カウンタ
TIY 0
main_loop:
AIY 2
KA
JUMP main_loop
CY
CAL SIFT
AIA 8
CY
TIA 0
update_loop:
CAL TIMR
CH
; これまでの位置を消灯し、次の位置に移動する
CIY 7
JUMP off_binled
CAL RSTO
TIY 0
JUMP on_led
off_binled:
CAL RSTR
AIY 1
on_led:
; 新しい位置を点灯する
CIY 7
JUMP on_binled
TIA 8
AO
JUMP led_done
on_binled:
CAL SETR
led_done:
CH
; キー判定・更新制御
CIA 0
JUMP after_key_release
KA
JUMP key_released
TIA 0
JUMP update_loop
key_released:
TIA 2
after_key_release:
AIY -1
JUMP update_loop
CAL ENDS
JUMP main_loop
以下は、このプログラムの機械語表現である。
| 0 1 2 3 4 5 6 7 8 9 A B C D E F
--+-----------------------------------
0 | A 0 2 A 0 B 2 0 F 0 5 3 E 6 9 8
1 | 3 8 0 E C 2 D 7 F 2 2 E 0 A 0 F
2 | 2 6 E 2 B 1 D 7 F 3 1 8 8 1 F 3
3 | 3 E 1 2 C 0 F 4 4 0 F 4 2 8 0 F
4 | 1 3 8 2 B F F 1 3 E 7 F 0 5