0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

学研の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

実行結果

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?