ユーザー操作
目次
テーブル参照
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 に影響を与えてしまいます。
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ユーザーではないのですが、あのプログラムには、ただ驚愕しました。