ユーザー操作

前の例題で使った GAMEPAD と PAD_NEW を使って、ユーザー操作を実現します。

と言っても例題なので、座標を想定した変数を増減するだけですが。


目次

Z80 vs 6502 トップページ(別ページ)

概要

Z80基本

テーブル参照テーブル改良

6502基本

BIT命令テーブル巨大化

速度判定


概要

GAMEPAD と PAD_NEW は共に 8bit で、bit 毎に入力されたスイッチが 1 になるようになっています。上から順に以下の値です。(- の部分は不定)


A B - - 上 下 左 右


パッドの状態により以下の動作をするプログラムを作ります。


1) 上が押されている間、変数 MY を -2 する。

2) 下が押されている間、変数 MY を +2 する。

3) 左が押されている間、変数 MX を -2 する。

4) 右が押されている間、変数 MX を +2 する。

5) A ボタンが新たに押されたら、変数 TR を +1 する。

6) B ボタンが新たに押されたら、変数 TR を 0 にする。


ボタンは同時押し可能です。斜めにも押せます。ただし、上と下、右と左が同時に押されることはありません。(接触不良で同時に押されると画面ポーズしてしまうとか…はないです)

A B が同時に押された場合は、0 か 1になるようにします。(同時押しは対応しますが、判定順序は定めません)


上下左右の移動量は、2 つづつです。INC が使えない…ちょっとした意地悪ですが、実際ゲームでは1ドット単位の移動は少なかったので。


1) 何も押されていない

2) 右下と A が押された

3) 左上 と B が押された


の3状態の合計で速度を計測します。


Z80基本

ひたすら判定していくだけのプログラムです。


	LD A,(GAMEPAD) ; 13 (14)
	LD B,2 ; 7 (8)

	LD C,A ; 4 (5)
	AND 3 ; 7 (8)
	JR Z,DOWN ; 12 / 7 (13 / 8)
	AND 1 ; 7 (8)
	JR Z,LEFT ; 12 / 7 (13 / 8)

	LD A,(MX) ; 13 (14)
	ADD A,B ; 4 (5)
	JP STMX ; 10 (11)
LEFT:
	LD A,(MX) ; 13 (14)
	SUB B ; 4 (5)
STMX:
	LD (MX),A ; 13 (14)

DOWN:
	LD A,C ; 4 (5)
	AND 0CH ; 7 (8)
	JR Z,TRGA ; 12 / 7 (13 / 8)
	AND 4 ; 7 (8)
	JR Z,UP ; 12 / 7 (13 / 8)

	LD A,(MY) ; 13 (14)
	ADD A,B ; 4 (5)
	JP STMY ; 10 (11)
UP:
	LD A,(MY) ; 13 (14)
	SUB B ; 4 (5)
STMY:
	LD (MY),A ; 13 (14)

TRGA:
	LD A,(PAD_NEW) ; 13 (14)
	RLA ; 4 (5)
	LD C,A ; 4 (5)
	JR NC,TRGB ; 12 / 7 (13 / 8)
	LD A,(TR) ; 13 (14)
	INC A ; 4 (5)
TRGB:
	RL C ; 8 (10)
	JR NC,END ; 12 / 7 (13 / 8)
	XOR A ; 4 (5)
STTR:
	LD (TR),A ; 13 (14)
END:

我ながら冗長なプログラムだ…。

まぁ、基本なのでわかりやすく作ってみましたが、これはもっと縮む気がします。

クロックは、面倒だけどひたすら数えるしかありません。


何も押されていない時、 134 クロック

右下と A が押されたとき、246 クロック

左上と B が押されたとき、258 クロック


総計で 638 クロックです。


次ページ: テーブル参照


1 2 3 4 次ページ

(ページ作成 2014-08-10)
(最終更新 2014-09-02)
第2版 …他の版 初版

前記事:パッド入力     戻る     次記事:コマンド入力
トップページへ

-- share --

0010

-- follow --




- Reverse Link -