GMC-4用「宝探しゲーム」

GMC-4とは、4ビットマイコン、学研「大人の科学マガジン Vol.24」の付録です。
半年くらい前に長男が買ったのを引っ張り出してきました。
買った当初、長男がプリセットか雑誌についてきたサンプルしかやらないようだったので、ちょっと借りて命令表とにらめっこでプログラムを書いてみたのです。
大人の科学ですから。
命令の少なさとクセのある実行フラグに痺れました。


先日、そのとき書いたメモが出てきたので、久しぶりに打ち込んでみました。
下がそのコード。当時は紙に手書きでハンドアセンブルでした。

; 宝探しゲーム 1人プレイ用
; ボタン(0〜F)のいずれか1箇所にランダムに埋められている宝を掘り当てる。
; 乱数の代わりとして、キー入力があるまで加算を繰り返す方法を採用。
;
;<ゲーム準備 1人プレイ用>
; 宝を埋める場所を変更しながら、キー入力が行われるまで待つ。
; キー入力された値は間違えても良い回数として使用する。
L_STDBY:
; メモリ5Fの内容に1加算する
	TIY	F	; YrにFを代入
	MA		; Arにメモリ50+Yr(F)の値を代入
	AIA	1	; Arに1を加算
	AM		; メモリ50+Y(F)にArの値を代入、実行Flag=1
; メモリ5DにArを2回右シフトした値(埋めた位置のY座標)を代入する
	CAL	SIFT	; Arを右シフト(前がAMなので実行Flag=1)
	TIY	D	; YrにDを代入、実行フラグ=1
	CAL	SIFT	; Arを右シフト
	AM		; メモリ50+Y(D)にArの値を代入
; キー入力があるまでL_STDBYから繰り返す
	KA		; キー入力した値(0-F)をArに代入
	JUMP	L_STDBY	; キーが押されていなければL_STDBYへ
;<以下1P2P共通>
; ここでArの値は間違えても良い回数を示す。
	CAL	LONS	; Long音を鳴らす(ゲームスタート)
L_DSPST:
; 間違えても良い回数を表示
	AO		; Arの値を7segLEDに表示
; Arを各用途に使用するので、Brへ間違えても良い回数を退避
	CH		; ArとBrの値を交換、YrとZrの値を交換
; チェックする場所のキー入力があるまで待つ
L_TRY:
	KA		; キー入力した値(0-F)をArに代入
	JUMP	L_TRY	; キーが押されていなければL_TRYへ
; メモリ5Eにチェックする場所の値を保管する。
	TIY	E	; YrにEを代入する
	AM		; メモリ50+Yr(E)にArの値を代入する
; 完全一致チェック
; 掘った場所と埋めた場所の番地の比較を行う
; 計算の結果、Arには埋めた場所と掘った場所の番地の差が代入される
	TIY	F	; YrにFを代入する
	M-		; Arに メモリ50+Yr(F)の値-Arの値 を代入
	CIA	0	; Arと0を比較
	JUMP	L_CHKXY	; 一致しないならL_CHKXYへ
; 正解したのでエンド音を鳴らして後処理へ
	CAL	ENDS	; エンド音を鳴らす
	JUMP	L_FIN	; L_FINへ
L_CHKXY:
;  XYの一致チェック
; 同じX座標に埋められているかを調べる
; この時点でArは埋めた場所と掘った場所の番地の差なので、
; Arの下位2bitが00であればX座標が一致している。
;  ワークにメモリ5Cを使って、Arの値を4倍し上位2bitを除外する。
	TIY	C	; YrにCを代入する
	AM		; メモリ50+Yr(C)にArの値を代入する
	M+		; Arに メモリ50+Yr(C)の値+Arの値 を代入
	M+		; Arに メモリ50+Yr(C)の値+Arの値 を代入
	M+		; Arに メモリ50+Yr(C)の値+Arの値 を代入
;  Arが0ならX座標が一致している。異なっている場合、警告する。
	CIA	0	; Arと0を比較
	CAL	SHTS	; 一致していないならShort音を鳴らす
; 同じY座標に埋められているかを調べる
;  チェックする位置の上位2bitと埋めた位置の下位2bitを比較
;  Arにチェックする位置を代入
	TIY	E	; YrにEを代入する
	MA		; Arにメモリ50+Yr(E)の値を代入
;  Arの下位2bitを除外し、メモリ5Dの値から引いた値をArに代入
	CAL	SIFT	; Arを右シフト(前がAMなので実行Flag=1)
	TIY	D	; YrにDを代入、実行フラグ=1
	CAL	SIFT	; Arを右シフト
	M-		; Arに メモリ50+Yr(D)の値-Arの値 を代入
;  Arが0ならY座標が一致している。異なっている場合、警告する。
	CIA	0	; Arと0を比較
	CAL	SHTS	; 一致していないならShort音を鳴らす
; 正解しなかったので、間違えても良い回数の残りを1減算し
; GameOverしたかを調べる
;  間違えても良い回数はBrに退避していたのでA
	CH		; ArとBrの値を交換、YrとZrの値を交換
;  1減算の代わりとしてFを足す
	AIA	F	; ArにFを足す
;  桁上がりしたときは、Fを足す前のArが0でなかったことを意味する
	JUMP	L_DSPST	; 桁上がりなら探索続行、L_DSPSTへ
;  間違えても良い回数を超えても正解しなかったのでGameOver
	CAL	ERRS	; エラー音を鳴らす。
; 後処理
L_FIN:
;  正解、GameOverいずれの場合も、埋めた場所を確認するため
;  メモリ5Fの値を表示
	TIY	F	; YrにFを代入する
	MA		; Arにメモリ50+Yr(F)の値を代入
	AO		; Arの値を7segLEDに表示
;  次ゲームの準備
	JUMP	L_STDBY	; L_STDBYへ

自分で言うのもなんですが、表示や音もけっこう工夫していて盛り沢山な機能です。


コードは以下のとおり。プログラムできる領域をフルに使っています。

00:A F 5 9 1 4 E 6
08:A D E 6 4 0 F 0
10:0 E A 1 2 0 F 1
18:5 A E 4 A F 7 C
20:0 F 2 9 E 7 F 4
28:9 A C 4 6 6 6 C
30:0 E 9 A E 5 E 6
38:A D E 6 7 C 0 E
40:9 2 9 F F 1 3 E
48:8 A F 5 1 F 0 0


遊び方。
コードを入力したあと、1、RUNでプログラムがスタートします。
最初に、間違えても良い回数として、任意の数字ボタンを押します。
Long音がなって探索開始。
プレイヤーは宝を掘るため、埋まっていると思う場所の数字ボタン(0〜F)を押します。
見事、宝にヒットしたらEnd音が鳴り、探索終了。
間違えた場合、警告音が宝の埋まっている場所のヒントになります。
Short音が1回なら今掘った位置と縦か横が同じ、2回なら縦も横も違います。
間違えるたびに残りの間違えても良い回数(探索中は7segLEDに表示)が減っていき、
0のときに間違えるとゲームオーバー。エラー音が鳴ります。
ヒットでもゲームオーバーでも、確認のために7segLEDに宝の埋まっていた場所が表示され、最初に戻ります。