bamboo’s blog

Bambooの気まぐれブログ

3DSのスレッド遅延処理(ASM)

前回の記事では入力キーの判定をASMコードに埋め込み、フラッシュ表示を行うという内容を扱った。(まだ読んでいない方はこちら)
今回はスレッド遅延処理を前回のコードを用いて実装してみる。

方法

svc命令の一種であるSleepThreadを使用する。引数に遅延させたい時間を指定することで、一定時間スレッドの更新を停止できる。ここで注意しなければならないのは、引数の値はナノ秒(10億分の1秒)で指定されるということである。

コード

コードは以下の通り。例えばZの部分を3B9ACA00 00000000とすると、フラッシュ表示が消えるまでに1秒間の遅延が発生する。内部では0x000000003B9ACA00ナノ秒として処理されており、これは秒に変換すると1秒である。

F0F00000 00000044 // 0x44yte
E1CF02D8 E59F2020
E1D220B0 E1DF32B4
E1120003 13A01000
E5801000 E5801800
E1CF01D0 0F00000A
E12FFF1E 90146000
90202204 01XXXXXX
0000YYYY ZZZZZZZZ
ZZZZZZZZ 00000000

X: カラーコード(BGR指定)
Y: キーコード
Z: 遅延時間(ナノ秒)

解説

処理内容は以下の通り。

E1CF02D8    ldrd r0, [pc, #0x28]
E59F2020    ldr r2, [pc, #0x20]
E1D220B0    ldrh r2, [r2]
E1DF32B4    ldrh r3, [pc, #0x24]
E1120003    tst r2, r3
13A01000    movne r1, #0
E5801000    str r1, [r0]
E5801800    str r1, [r0, #0x800]
E1CF01D0    ldrd r0, [pc, #0x10]
0F00000A    svceq #0xA
E12FFF1E    bx lr
90146000    .word 0x90146000
90202204    .word 0x90202204
01XXXXXX    .word 0x1XXXXXX
0000YYYY    .short 0xYYYY
ZZZZZZZZ    .word 0xZZZZZZZZ
ZZZZZZZZ    .word 0xZZZZZZZZ

全て説明すると長くなるため、前回作成した部分については割愛。新たに追加した部分を見てみる。

ldrd r0, [pc, #0x10]

r0・r1にZの部分を読み込む。これがSleepThreadの引数となる。

svceq #0xA

条件が等しい場合、svc命令0xA番を実行する。ここでいう条件とは、r2の値が0と等しいか、すなわち指定したキーコードが入力されているかということである。入力されている場合はこの命令が実行される。ちなみにsvc命令0xA番はSleepThreadにあたる。

参考:3dbrew