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

先日書き込んだ「宝探しゲーム」。
作ったときのメモがもう一枚出てきました。二人用に改造したバージョンです。

; 宝探しゲーム 2人プレイ用
; 出題者がボタン(0〜F)のいずれか1箇所に宝物を埋める。
; プレイヤーは、埋められている宝を決められた回数以内に掘り当てれば勝ち。
;
;<ゲーム準備 2人プレイ用>
; 出題者のキー入力(宝を埋める場所の指定)が行われるまで待つ。
; プレイヤーが間違えても良い回数は3回
L_STDBY:
; キーが押されるまで待ち、入力された値を表示してメモリ5Fに格納する
	TIY	F	; YrにFを代入
L_WAIT:
	KA		; キー入力した値(0-F)をArに代入
	JUMP	L_WAIT	; キーが押されていなければL_WAITへ
	AO		; Arの値を7segLEDに表示
	AM		; メモリ50+Yr(F)にArの値を代入する
; メモリ5DにArを2回右シフトした値(埋めた位置のY座標)を代入する
	CAL	SIFT	; Arを右シフト(前がAMなので実行Flag=1)
	TIY	D	; YrにDを代入、実行フラグ=1
	CAL	SIFT	; Arを右シフト
	AM		; メモリ50+Y(D)にArの値を代入
; 間違えても良い回数をArに設定
	TIA	3	; Arに3を代入
;<以下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へ

準備部分だけが1人プレイ用と異なります。
探索部分は1人プレイ用、2リプレイ用で共通というところがポイント。


コードは以下のとおり。
探索部分のコードがずれないようにしたので、ダンプ上でも、1人プレイ用と2人プレイ用の違いはメモリ02〜10の内容だけ。

00:A F 0 F 0 2 1 4
08:E 6 A D E 6 4 8
10:3 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でプログラムがスタートします。
最初に、出題者が宝を埋める場所として任意のボタン(0〜F)を押します。
7segLEDに埋めた場所が一旦表示され、Long音がなって探索開始。
(ここまでボタンや表示がプレイヤーに見えないように操作)
探索中は、7SegLEDには残りの間違えてもよい回数が表示されます。
プレイヤーは宝を掘るため、埋まっていると思う場所の数字ボタン(0〜F)を押します。
見事、宝にヒットしたらEnd音が鳴り、探索終了。
間違えた場合、警告音が宝の埋まっている場所のヒントになります。
Short音が1回なら今掘った位置と縦か横が同じ、2回なら縦も横も違います。
間違えるたびに残りの間違えても良い回数が減っていき、
0のときに間違えるとゲームオーバー。エラー音が鳴ります。
ヒットでもゲームオーバーでも、確認のために7segLEDに宝の埋まっていた場所が表示され、最初に戻ります。