bamboo’s blog

Bambooの気まぐれブログ

入力キー判定を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 RegistersLCD Registers