自機8方向移動操作

GARUDAでは自機・敵機ともに、向きや移動方向を角度(一周128分割)で示します。
移動パラメータをX移動量&Y移動量で保持するよりも、角度&速度で保持した方が、ホーミングや
画像回転のあるこの作品では都合が良いからです。
方向値は、画面下方向を0として、右下16、右32、右上48というように、反時計回りで増加します。
(grotateの角度パラメータは時計回りなので、符号反転して与えます)
で、ここで一つ問題があります。
キー入力はstick命令でやっています。
stick命令で取得した入力値、下位4ビットが矢印キーの情報であることは言うまでもないですが、
方向値として使用するためには、下位4ビット=8のとき角度0、同3で角度80というように、
変則的な変換を行わなければ成りません。

矢印キー 無し  ←  ↑  ←↑ →  ←→ ↑→ ←↑
↓  ←↓ ↑↓ ←↑
→↓ ←→
↑→
全部
下位4ビット 0 1 2 3 4 5 6 7 8 9 A B C D E F
方向値 - 96 64 80 32 - 48 (64) 0 112 - - 16 (0) - -

「-」は左右同時押しとか全部押しなど、方向値を定めなくてもよいところ。


この変換を行うロジックとして考えたのがこれ。方向値eedと、速度eed.1を計算します。
kdir="D6452D3407DD10DD"
eed=16*peek(kdir,ky&15) ,(eed<896)*500


AXにして93バイト。
方向値の元になる値を文字列で用意し、「下位4ビット」番目のアスキーコード値を取り出して16倍。
今計算したeedが896("8"のコードの16倍)より小さいなら、速度=500。それ以外は停止。
方向値が128を越えるけど、後の作りが一周128で対応する角度の方向値としてみなすので問題なし。
("D"は方向値として$44*16&$FF→$40=64で、内部的には停止時の方向は上になっています。)