ユーザー操作

目次

概要

Z80基本

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

6502基本

BIT命令テーブル巨大化

速度判定


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 は苦手…


6502 でアセンブラを覚え、インデックスを使うと遅い Z80 で挫折し、再びインデックスが普通に使える 68000 で再勉強したもので…

こちらも、クロックはひたすら数えるしかありません。


何も押されていない時、 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 クロック増加するだけになっています。なかなか理想的なプログラムです。


次ページ: 速度判定


前ページ 1 2 3 4 次ページ

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

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

-- share --

0000

-- follow --




- Reverse Link -