学研の4ビットマイコンGMC-4で爆弾ゲームを作ってみた。
爆弾ゲーム
爆弾の前にスイッチが何個か並んでいる。
そのうち1個だけ、押すと爆弾が爆発するスイッチがある。
- 複数人で遊ぶ場合
- まだ押されていないスイッチを順番に1個ずつ押していく。
- 爆弾を爆発させた人が負け。
- 1人で遊ぶ場合
- スイッチを押していく。
- 爆弾を爆発させたらゲームオーバー。
- 爆弾を爆発させずに押していないスイッチを1個だけにできたらクリア。
仕様
実行開始後、何かキーを押すとゲームが開始し、2進LEDが全て点灯する。
ゲーム中、点灯している2進LEDがまだ押されていないスイッチを表す。
0~6の数字キーを押すことで、スイッチを押す。
まだ押されていないスイッチを押したとき、それが爆弾を爆発させるスイッチではなかった場合は、短い音を鳴らす。
爆弾を爆発させるスイッチだった場合は、7セグメントLEDにそのスイッチの番号を表示し、エラー音を鳴らす。
プログラム
以下のプログラムは、MikeAssembler でアセンブルできる。
target gmc4
; 爆発スイッチの位置をランダムで選ぶため、スタートボタン待機
TIY 6
start_wait_loop:
AIY -1
JUMP random_no_return
TIY 6
random_no_return:
KA
JUMP start_wait_loop
start_release_wait_loop:
KA
JUMP start_release_wait_loop_end
JUMP start_release_wait_loop
start_release_wait_loop_end:
; 爆発スイッチの位置を[7]に格納する
CY
TIY 7
AM
; [0]~[6]を「押されていない」に設定し、2進LEDを点灯する
; (爆発スイッチの位置0~6は、2倍してキャリーが出ない)
led_init_loop:
AIY -1
AM
CAL SETR
CIY 0
JUMP led_init_loop
; メインループ
game_loop:
KA
; 範囲外や既に押された所なら、再入力させる
; 1回押されたら押された所になるので、押し待ち・離し待ちは不要
; …と思ったが、FX-マイコン シミュレータでは押してなくてもAレジスタが前回入力値になってしまう
JUMP game_loop
AIA 0x10 - 7
JUMP game_loop
AIA 7
CY
MA
; 0~6(押されていない)の時は飛ばない、F(押された)の時は飛ぶ
M+
JUMP game_loop
; 新しいスイッチが押された
CY
TIY 7
M-
CIA 0
JUMP safe_process
; 押されたのは爆発スイッチだった
M-
AO
CAL ERRS
game_end:
JUMP game_end
safe_process:
; 押されたことを記録し、2進LEDを消灯する
M-
CY
TIA 0xF
AM
CAL RSTR
CAL SHTS
JUMP game_loop
以下は、このプログラムの機械語表現である。
| 0 1 2 3 4 5 6 7 8 9 A B C D E F
--+-----------------------------------
0 | A 6 B F F 0 9 A 6 0 F 0 2 0 F 1
1 | 4 F 0 D 3 A 7 4 B F 4 E 1 D 0 F
2 | 1 8 0 F 2 2 9 9 F 2 2 9 7 3 5 6
3 | F 2 2 3 A 7 7 C 0 F 4 3 7 1 E 8
4 | F 4 0 7 3 8 F 4 E 2 E 9 F 2 2