ユーザー操作
前の例題で使った GAMEPAD と PAD_NEW を使って、ユーザー操作を実現します。
と言っても例題なので、座標を想定した変数を増減するだけですが。
目次
Z80 vs 6502 トップページ(別ページ)
概要
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 クロックです。