ユーザー操作
目次
6502基本
こちらは、テーブルを使って少し高速化しています。
LDA GAMEPAD ; 4
TAY ; 2
AND #3 ; 2
BEQ UD ; 3 / 2
TAX ; 2
LDA TABLE-1,X ;4
CLC ; 2
ADC MX ; 4
STA MX ; 4
UD:
TYA ;2
AND #$0C ; 2
BEQ TRGA ; 3 / 2
TAX ; 2
LDA TABLE-4,X ;4
CLC ; 2
ADC MY ; 4
STA MY ; 4
TRGA:
LDA PAD_NEW ; 4
ROL A ; 2
BCC TRGB ; 3 / 2
INC TR ; 6
TRGB:
ROL A ; 2
BCC END ; 3 / 2
LDA #0 ; 2
STA TR ; 3
END:
TABLE:
DB -2,2,0,0,2
テーブルは読出しアドレスをうまく細工して、5バイトに納めています。
実は、これを Z80 に移植しようとしたのだけど、逆に遅くなってしまうのであきらめました。
うまくやれば出来ると思うのだけど、どうも Z80 は苦手…
こちらも、クロックはひたすら数えるしかありません。
何も押されていない時、 32 クロック
右下と A が押されたとき、67 クロック。
左上と B が押されたとき、66 クロック
総計で 165 クロックです。
BIT命令
2014.8.13 午前追記
BIT 命令を使うと TRGA 以下が速くなる、と言う投稿を頂きました。
該当部分のみ示します。
TRGA:
BIT PAD_NEW ; 4
BPL TRGB ; 3 / 2
INC TR ; 6
TRGB:
BVC END ; 3 / 2
LDA #0 ; 2
STA TR ; 3
END:
…恥ずかしながら僕、BIT 命令を「A レジスタを破壊しない AND 命令」くらいに思っていました。
改めて調べると、BIT は次のような命令です。
・A とメモリの間で、AND 演算を行うが、結果を残さない。
・結果がゼロかどうかで、Z フラグが変化する。
・演算相手のメモリの最上位ビットが N フラグに入る。
・演算相手のメモリの、最上位の次のビットが V フラグに入る。
僕は AND する命令だと思っていたけど、ここで使っているのは後ろの二つの機能。
僕のプログラムでは、メモリの上位2ビットを調べるのに、Aレジスタに値を取り出してからローテートを2回使っていました。しかし BIT を使うとメモリを直接調べ、上位2ビットの調査結果をフラグに残してくれます。それでいて、実行速度はメモリから値を取り出すのと同じです。
これで、必ず通っている A B ボタンの調査時間が 4クロック減りました。
何も押されていない時、 28 クロック
右下と A が押されたとき、63 クロック。
左上と B が押されたとき、62 クロック
総計で 153 クロックです。
テーブル巨大化
Z80 のようにテーブルを大きくすればもっと速い、と言う投稿です。
まぁ、大きいと言っても 23 バイト。たいしたサイズではありません。条件分岐が減ってプログラムも短くなってますし。
LDX GAMEPAD ;4
LDA TABLE,X ;4
CLC ;2
ADC MX ;4
STA MX ;4
LDA TABLE+11,X ;4
CLC ;2
ADC MY ;4
STA MY ;4
TRGA:
BIT PAD_NEW ;4
BPL TRGB ;3/2
INC TR ;6
TRGB:
BVC END ;3/2
LDA #0 ;2
STA TR ;3
END:
TABLE:
DB 0, 2,-2, 0, 0, 2,-2, 0, 0, 2,-2,
DB 0, 0, 0, 0, 2, 2, 2, 2, -2,-2,-2,-2
何も押されていない時、 42 クロック
右下と A が押されたとき、47 クロック。
左上と B が押されたとき、46 クロック
総計で 135クロックです。
これ、最初に「方向キーが押されたか」を確認して、何も押されていない時は処理を飛ばしてしまえば、押されていない時の処理がもっと高速になります。
その代り、下の二つの処理は少しクロック数が増えるけど、高速化の効果の方が大きい。
さらに、B を押したときの処理を先にやって、B が押されたときは A を見ないようにすればもっと早くなる。(Z80 ではそうやっています)
でも、その改良は今はやめておきます。ルールとして「3つの処理の合計」にしてしまったけど、本当は「どのような状況でも時間があまり変わらない」というのは、ゲームのプログラムとしては理想の一つだから。
このプログラム、方向キーをどのように押しても速度がかわらず、A を押すと 5 クロック、Bを押すと 4 クロック増加するだけになっています。なかなか理想的なプログラムです。