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