ユーザー操作

目次

概要

Z80基本

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

6502基本

BIT命令テーブル巨大化

速度判定


テーブル参照

2014.8.13 午前追記

自分で作ったサンプルが 6502 だけテーブルを使っていたので、Z80 でもテーブル化しました。


	LD A,(GAMEPAD) ; 13 (14)
	AND 0FH ; 7 (8)
	JR Z,TRGB ; 12 / 7 (13 / 8)

	RLA ; 4 (5)
	LD HL,TABLE ; 10 (11)
	ADD A,L ; 4 (5)
	JR NC,SKIP ; 12 / 7 (13 / 8)
	INC H ; 4 (5)
SKIP:
	LD L,A ; 4 (5)

	LD A,(MX) ; 13 (14)
	ADD A,(HL) ; 7 (8)
	LD (MX),A ; 13 (14)

	INC HL ; 6 (7)
	LD A,(MY) ; 13 (14)
	ADD A,(HL) ; 7 (8)
	LD (MY),A ; 13 (14)

TRGB:
	LD A,(PAD_NEW) ; 13 (14)
	AND 0C0H ; 7 (8)
	JR Z,END ; 12 / 7 (13 / 8)

	AND 040H ; 7 (8)
	JR Z,TRGA ; 12 / 7 (13 / 8)
	XOR A ; 4 (5)
	JMP STTR ; 10 (11)

TRGA:
	LD A,(TR) ; 13 (14)
	INC A ; 4 (5)

STTR:
	LD (TR),A ; 13 (14)
END:


TABLE:
	DB 0, 0,  2, 0,  -2, 0,  0, 0
	DB 0, 2,  2, 2,  -2, 2,  0, 2
	DB 0,-2,  2,-2,  -2,-2,  0,-2

方向キーの 4bit に対応して、MX と MY の移動量を入れたテーブルを作っているので、32バイト…とはならず、上下キーが同時に押されることは無いので 24バイトです。

(テーブルの組み方の都合で、左右キー同時押しに相当する値は入っています。使われないけど)


元プログラムでは TRGA と TRGB の同時押しの際、A で +1 の計算をして B で 0 にしていたのですが、無駄なので B が押された際は A の処理をしないことにしました。


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

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

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


総計で 521 クロックです。


テーブル改良

2014.9.2 追記

基本版とテーブル版、それぞれを改良してくださった投稿がありました。

テーブル板の改良の方が速かったので、ここではテーブル改良版のみ説明します。


	LD A,(GAMEPAD) ; 13 (14)
	AND 0Fh ; 7 (8)
	JR Z,CHKTRG ; 12 / 7 (13 / 8)

	ADD A,A ; 4 (5)
	LD L,A ; 4 (5)
	LD H,TABLE/256 ; 7 (8)

	LD BC,(MX) ; 16 (17)
	LD A,(HL) ; 7 (8)
	ADD A,C ; 4 (5)
	LD C,A ; 4 (5)
	INC L ; 4 (5)
	LD A,(HL) ; 7 (8)
	ADD A,B ; 4 (5)
	LD B,A ; 4 (5)
	LD (MX),BC ; 16 (17)

CHKTRG:
	LD A,(PAD_NEW) ; 13 (14)
	ADD A,A ; 4 (5)
	JP P,TRGA ; 10 (11)
TRGB:
	XOR A ; 4 (5)
	LD (TR),A ; 13 (14)
	JP END ; 10 (11)
TRGA:
	JR NC,END ; 12 / 7 (13 / 8)
	LD HL,TR ; 10 (11)
	INC (HL) ; 11 (12)
END:

MX:	DB	0
MY:	DB	0
TR:	DB	0

テーブル部分は改良前と同じ物とします。

実は、投稿プログラムには問題があったので少し書き変えています。そのため、当初よりも総計で 16クロック遅くなってしまっています。

これについては、後ほど説明しましょう。


元のプログラムでは、テーブルがどこにあっても良いようにアドレス計算を行っていました。

しかし、「アドレスの下位 8bit が 0 からテーブルを配置する」という前提で、計算を簡略化しています。


そして、MX と MY も連続したアドレスに配置されているのを前提に、16bit で MX MY をまとめて演算…というのが元のプログラムだったのですが、ここが問題のある個所。

例題としては、上下に応じて MY を、左右に応じて MX を増減することになっています。

しかし、まとめて演算すると、MX が 255 を超えて 0 に戻る際に、MY に影響を与えてしまいます。


例題がファミコン・MSX を想定したものだったので、画面の左右がつながった、マリオブラザースやパックマンのようなイメージで例題を出していました。
MX MY の「移動範囲」を定めていなかったのはそのためです。

上のプログラムでは、この部分を変更させてもらい、8bit 演算2回にしています。このため、8クロック遅くなっています。

例題では3回の計算の合計としていますが、このうち「ボタン入力無し」の際には影響がないため、合計で 16クロック、投稿プログラムより遅くなっています。


ボタンを押したときの処理も変更され、細かな積み重ねで高速化されています。


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

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

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


総計で 445 クロックです。




最後に、余談になってしまうのですが、投稿してくださった方、野球拳2000 for MZ-700の作者さんです。

ランダムアクセスの「テーブル参照&POP」の改良もいただいていましたが、その時は気づいていませんでした。申し訳ない。


MZ-700 をご存じない方のために書いておけば、MZ-700 は絵を表示する機能を持ちません。あらかじめ決められたキャラクターしか出ないのです。

にもかかわらず、MZ-700 でグラフィックを表示した、と言う驚きのソフトが、野球拳2000 for MZ-700 です。

僕は MZ-700ユーザーではないのですが、あのプログラムには、ただ驚愕しました。


次ページ: 6502基本


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

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

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

-- share --

0000

-- follow --




- Reverse Link -