学研の4ビットマイコン GMC-4 で、10進数で表示するカウンタを作ってみた。
仕様
- 799までカウント可能。超えた場合の動作は保証しない。
- 2進LEDの上位に100の位、2進LEDの下位に10の位、7セグメントLEDに1の位を表示する。
- Fキーを押すとカウント値をリセットする(0にする)。
- F以外の数字キーを押すとカウントを進める(カウント値に1を足す)。
実装方針
- データメモリの0xD番地に1の位を、0xE番地に10の位を、0xF番地に100の位を保存する。
- これにより、
CAL DSPR
命令で10の位と100の位をそのまま表示できる。
- これにより、
- カウントアップ時、まず7を足す。
- キャリーがあった場合、元の値が9(以上)であったことを意味するので、0を格納して桁上り処理を行う。
- キャリーが無かった場合、6を引いて1を足した状態にし、結果を格納する。
実装
以下のコードは、MikeAssemblerでアセンブルできる。
target gmc4
; 2進LED上位 / 0xF番地 : 100の位
; 2進LED下位 / 0xE番地: 10の位
; 7セグメントLED / 0xD番地 : 1の位
START:
; 初期化
TIA 0
TIY 0xD
AM
TIY 0xE
AM
TIY 0xF
AM
SHOW_DATA:
; カウント値の表示
TIY 0xD
MA
AO
CAL DSPR
; キーが離されるのを待つ
KEY_RELEASE_WAIT:
KA
JUMP KEY_INPUT_WAIT
JUMP KEY_RELEASE_WAIT
; キー入力を待つ
KEY_INPUT_WAIT:
KA
JUMP KEY_INPUT_WAIT
; Fが入力された場合は、カウントをリセットする
CIA 0xF
JUMP NOT_RESET
JUMP START
NOT_RESET:
; カウントアップ処理
TIY 0xD
MA
AIA 7
JUMP CARRY_10
AIA -6
AM
JUMP SHOW_DATA
CARRY_10:
TIA 0
AM
TIY 0xE
MA
AIA 7
JUMP CARRY_100
AIA -6
AM
JUMP SHOW_DATA
CARRY_100:
TIA 0
AM
TIY 0xF
MA
AIA 1
AM
JUMP SHOW_DATA
以下がこのプログラムの機械語表現である。
| 0 1 2 3 4 5 6 7 8 9 A B C D E F
--+-----------------------------------
0 | 8 0 A D 4 A E 4 A F 4 A D 5 1 E
1 | D 0 F 1 8 F 1 1 0 F 1 8 C F F 2
2 | 4 F 0 0 A D 5 9 7 F 3 2 9 A 4 F
3 | 0 B 8 0 4 A E 5 9 7 F 4 3 9 A 4
4 | F 0 B 8 0 4 A F 5 9 1 4 F 0 B
実行結果
カウントとリセットができている。