入力キー判定をASMに埋め込む
GWコードには予め入力キーを判定するコードが用意されているが、今回はこれをASMコードに埋め込み、フラッシュ表示してみる。
方法
入力キーを読み取り、指定されたキーコードと等しい場合にフラッシュ表示のフラグとカラーコードを書き込む。ちなみに入力キーが書き込まれるアドレスは0x10146000、フラッシュ表示で書き込むアドレスは0x10202204(下画面は+0x800)であるが、これは物理アドレスであるため実際に読み書きする場合は論理アドレス(+0x80000000)を指定する。
コード
F0F00000 00000034 // 0x34byte E1CF02D0 E59F2018 E1D220B0 E1DF31BC E1120003 13A01000 E5801000 E5801800 E12FFF1E 90146000 90202204 01XXXXXX 0000YYYY 00000000 X: カラーコード(BGR指定) Y: キーコード
解説
処理内容は以下の通り。
E1CF02D0 ldrd r0, [pc, #0x20] E59F2018 ldr r2, [pc, #0x18] E1D220B0 ldrh r2, [r2] E1DF31BC ldrh r3, [pc, #0x1C] E1120003 tst r2, r3 13A01000 movne r1, #0 E5801000 str r1, [r0] E5801800 str r1, [r0, #0x800] E12FFF1E bx lr 90146000 .word 0x90146000 90202204 .word 0x90202204 01XXXXXX .word 0x1XXXXXX 0000YYYY .short 0xYYYY
ldrd r0, [pc, #0x20]
r0に0x90202204を、r1に0x1XXXXXXを読み込む。0x90202204はフラッシュ表示のアドレス、0x1XXXXXXはフラッシュ表示のフラグとカラーコードである。
ldr r2, [pc, #0x18]
r2に0x90146000を読み込む。これは入力キーが書き込まれるアドレス。
ldrh r2, [r2]
アドレス0x90146000にある値を読み込む。これにより現在の入力キーが取得できる。
ldrh r3, [pc, #0x1C]
r3に0xYYYを読み込む。0xYYYはフラッシュを表示する条件となるキーコード。
tst r2, r3
r2とr3の論理積をステータスフラグに反映する。
movne r1, #0
tst命令での演算結果が0でない場合、r1に0を代入する。これによりフラッシュ表示のフラグが取り消される。(指定したキーが入力されている場合はこの処理は飛ばされる。)
str r1, [r0]
r1をr0に格納。上画面にフラッシュ表示するコードが書き込まれる。
str r1, [r0, #0x800]
r1をr0+0x800の位置に格納。下画面にフラッシュ表示するコードが書き込まれる。
bx lr
サブルーチンの終了。lrに格納されているアドレスへと分岐する。
参考文献: HID Registers、LCD Registers