きみしねにスローモーション機能を実装してみる (Lボタンで発動するように) なお、ゲーム中はスタートボタンでポーズが可能なので、 キー入力は常時取得していると予想される。 <初期準備> キー入力処理 :0200FF1C E59F20DC ldr r2,[r15, #+0xdc] ;r15+0xdc=*(02010000)=#67109168(0x04000130) :0200FF20 E59F10DC ldr r1,[r15, #+0xdc] ;r15+0xdc=*(02010004)=#41942952(0x027fffa8) :0200FF24 E1D230B0 ldrh r3,[r2, #+0x0] ;r2+0xb0=*(040001e8)=#0(0x00000000) :0200FF28 E1D120B0 ldrh r2,[r1, #+0x0] ;r1+0xb0=*(02800060)=#1451(0x000005ab) :0200FF2C E59F10D4 ldr r1,[r15, #+0xd4] ;r15+0xd4=*(02010008)=#12287(0x00002fff) この流れからしてアドレス0200FF1Cの時点でr1,r2,r3は自由に変更できることがわかる。 どこの領域を利用するか? :0206AF10 00000000 andeq r0,r0,r0 〜〜 :0206B5D8 00000000 andeq r0,r0,r0 この1736バイト範囲が謎のnullブロックになっている。 前半は念のため触れないようにし、アドレス0206B500〜0206B5D8の範囲を使用する。 キー入力処理の1行目を変更(0206B500-0200FF1C)/4-2=16D77 :0200FF1C EA016D77 b 0206B500 <自作処理作成> 潰した処理と同じようにr2にアドレス04000130の内容を入れるが、 本来の間接参照がそのまま使えないため、テーブルを新たに作成して参照する。 ldr r1,[r15,#+{命令実行アドレスから参照値までの距離}-8] :0206B500 E59F2020 ldr r2,[r15,#+0x20] :0206B528 04000130 キー判定 :0206B504 E5921001 ldr r1,[r2, #+0x1] ;r1にLRボタンの内容を入れる :0206B508 E2011002 and r1,r1,#0x2 ;andマスクでLボタンのみを抽出 :0206B50C E3510000 cmp r1,#0x0 ;もし0(押下)でなければ :0206B510 1A000003 bne 0206B524 ;最終処理までジャンプ ---ウェイト用ループ :0206B514 E3A03601 mov r3,#0x100000 ;r3にループ回数を入れる(1048576回) :0206B518 E2811001 add r1,r1,#0x1 ;r1+=1 :0206B51C E1510003 cmp r1,r3 ;if(r1!=r3) :0206B520 1AFFFFFB bne 0206B514 ;空ループ ---帰る :0206B524 EAFE927D b 0200FF20 ;元の処理に帰る <改造コード> #SFX_CODE_TEXT #対象ファイル= "APRJ.NDS" 13F1C-776D01EA 6F500-20209FE5 6F504-011092E5 6F508-021001E2 6F50C-000051E3 6F510-0300001A 6F514-0136A0E3 6F518-011081E2 6F51C-030051E1 6F520-FBFFFF1A 6F524-7D92FEEA 6F528-30010004