サーチの小技

「サーチの小技」の編集履歴(バックアップ)一覧はこちら

サーチの小技」(2010/01/18 (月) 18:10:35) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

<div><a title="サーチの小技 (23d)" href="http://www24.atwiki.jp/ds_dat2/pages/19.html"><br /></a></div> <p> </p> <div>ちょっとイレギュラーな小技ばっかを書く予定。<br /> どう利用するかは各人でガンガレ。</div> <p> </p> <div>現在のネタは以下の4つ。</div> <ul><li>タッチした座標の検出</li> <li>垂直ブランク割り込みの無効化(高速化コードの基礎の基礎)</li> <li>ボタン連打コードのサーチ</li> <li>スローモーションコードの作成方法</li> </ul><p> </p> <hr /><p> </p> <h3 id="id_176228c6">タッチした座標の検出</h3> <div>本来はARM7でXKEYSレジスタ(アドレス04000136)にアクセスしないとダメだが、<br /> そこに格納されてる値から必要なデータを取り出すのは超マンドクセ。<br /> 素直に「絶対座標」がほしいならno$gbaで<span style="color:rgb(0,0,255);"><span style="font-weight:bold;">画面をタッチしたまま F1 を押す</span></span>といい。<br /> これでヘルプ表示でエミュレーションが停止するので、タッチ情報などもそのまんま止まるんだぜ。</div> <p> </p> <div>大抵、ゲーム中では「どこかでタッチ情報を処理」しているので、<br /> それを一時的に保持しているアドレスがヒットするはず。<br /> ちなみにDSのスクリーン解像度は 256×192 なのでこれに近い値のものを探すべし。</div> <p> </p> <div><タッチ!カービィでそれを検証></div> <p> </p> <div>下で敵にボコボコにされてるカービィは無視して、適当な場所をクリックしながらF1。<br /> エミュレーションが止まるので、emuhasteからクリック場所を基準に増加 or 減少で絞り込み。<br /> 俺の環境だとX座標がアドレス 020D9576 、Y座標が020D9578 にそれっぽい値が入った。<br /> (他にも色々いっぱいヒットしてるけど)。</div> <p> </p> <div>変動アドレスかもしれんけど、そのときはそのときで考える!!<br /> まあ、これらの値は2バイト(WORD)サイズだった。</div> <p> </p> <hr /><p> </p> <h3 id="id_4c202dd0">垂直ブランク割り込みの無効化(高速化コードの基礎の基礎)</h3> <div>プログラム内に存在するthumbコードから以下の箇所を探す</div> <pre> 2200 mov r2,0x00<br />DF05 swi #0x05<br />(※ndsdis2ではthumbコードを吐けないので注意) </pre> <div>最も簡単な方法としては、DSエミュレータで起動後にhasteDSもしくはemuhasteで16進数 "002205DF" をパラメータサーチ。<br /> →2箇所以上該当するので、そのアドレスに対して 00002200 を書き込むコードを実行する。</div> <p> </p> <div>(例)直感ヒトフデの場合 "002205DF"がアドレス 02000350 と 0238BD44 に合計2個ヒット。<br /> 改造コードはこうなる。<br /> 02000350 00002200<br /> 0238BD44 00002200</div> <p> </p> <div>なお、ゲームによってはこれで高速化することもあるが、何も起こらない場合もある。</div> <p> </p> <hr /><p> </p> <h3 id="id_395cdb45">ボタン連打コードのサーチ</h3> <div>DSのボタン入力情報はアドレス04000130と04000136に格納されている。<br /> んで、連打というのは「ボタン押して離してまた押して…」の繰り返しであり、<br /> 必ずプログラム側が「離して」という部分を判断している(はず)。<br /> この「離して」の判断を押しっぱなしでも有効にするのが「ボタン連打コードのサーチ」である。</div> <p> </p> <div>※当然ながらゲームごとにボタン処理のルーチンが異なるため、ここで紹介している方法では連打できない場合もある。</div> <p> </p> <div>とりあえず「ぷよぷよフィーバー」で実験。</div> <p> </p> <div>対戦が始まったら…<br /> Aボタン(に割り当てたキー)を押しながらF1キーを押してヘルプ表示(停止)→値 "01" を検索。<br /> Bボタン(に割り当てたキー)を押しながらF1キーを押してヘルプ表示(停止)→値 "02" を検索。<br /> 何も押さずに値 "00" を検索。<br /> ↓以下の4つのアドレスに該当<br /> 0212C848<br /> 0212C84A<br /> 021454D8<br /> 021454DA</div> <p> </p> <div>これらのアドレスを判定しているルーチンをいじれば連打状態にできると思うが、<br /> ぷよフィだと<br /> 2212C848 00000000<br /> 2212C84A 00000000<br /> 221454D8 00000000<br /> 221454DA 00000000<br /> こんな感じで00(何も押さない)を書き込むことで、<br /> 1.ユーザがボタンを押す<br /> 2.ゲーム中の"ボタンを押した際の処理"を実行<br /> 3.改造ツール側が"00"を書き込む<br /> 4.ボタンを放したと判断される</div> <p><br /> という流れが発生し、ボタンを押しっぱなしでもぷよがぐるぐる回るようになる。<br /> ゲームによっては00,01,02ではなくビット反転した値(FF,FE,FD)で処理している可能性もあるので注意。</p> <p> </p> <hr /><p> </p> <h3>スローモーションコードの作成方法</h3> <p><br /> 過去ログ7から引用</p> <dl><dt>663 :<font color="#008000"><strong>前スレ346</strong></font>:2007/11/15(木) 01:14:41 ID:Te+tUkrg</dt> <dd>とりあえず書いたので投稿します。<br /> 高速化とは対照的な「自作ルーチン埋込」の技術を応用したスローモーションコードの作成法です。<br /> スローモーション機能付きのマジコンを持っていない、または持っているけどスローモーションの<br /> ON/OFFをもっと手軽に切り替えたいという場合に有効。<br /><br /> スローモーションは時間稼ぎをするプログラムを挿入し、故意に処理落ちを発生させることで実現できます。<br /> では実際に「超執刀 カドゥケウス (アトラス ベストコレクション)」でスローモーションコードを作ってみます。<br /> とりあえず逆アセンブルして04000130を検索すると以下の部分でヒット。<br /> :02000F34 E59F10D8 ldr r1,[r15, #+0xd8]    ;r15+0xd8=*(02001014)=#67109168(0x04000130)<br /> :02000F38 E59F00D8 ldr r0,[r15, #+0xd8]    ;r15+0xd8=*(02001018)=#41942952(0x027fffa8)<br /> :02000F3C E1D130B0 ldrh r3,[r1, #+0x0]    ;r1+0x0=*(04000130)=#0(0x00000000)<br /> :02000F40 E1D010B0 ldrh r1,[r0, #+0x0]    ;r0+0x0=*(027fffa8)=#1916546356(0x723c2d34)<br /> :02000F44 E59F20D0 ldr r2,[r15, #+0xd0]    ;r15+0xd0=*(0200101c)=#35515132(0x021deafc)<br /> :02000F48 E59F00D0 ldr r0,[r15, #+0xd0]    ;r15+0xd0=*(02001020)=#12287(0x00002fff)<br /> :02000F4C E1831001 orr r1,r3,r1<br /> :02000F50 E0211000 eor r1,r1,r0<br /> :02000F54 E0010000 and r0,r1,r0<br /> :02000F58 E1A01800 mov r1,r0,lsl #0x10   ;r1=805240832(0x2fff0000)<br /><br /> 上記の部分から以下のことが読み取れる。<br /> 1. この部分は通常なら毎秒60回実行される。<br /> 2. プログラムカウンタが$02000F58に来ている時点ではr3レジスタにキーデータが格納されている。<br /> 3. アドレス$02000F58から追加ルーチンへ飛ばしても追加ルーチンの最後で mov r1,r0,lsl #0x10<br /> を実行すれば追加ルーチンではr1レジスタを自由に使用できる。<br /><br /> この3つの条件を頭に入れながら$02000F58の部分に時間稼ぎをするプログラムを挿入する。<br /> $021BD9E0 - $021BD9FCの部分が空き領域として使えるので追加ルーチンはこの部分に埋め込めます。<br /><br /> 02000F58 EA06F2A0  b $021BD9E0      ;追加ルーチンへジャンプ<br /><br /> 021BD9E0 E3130C01  tsts r3, #$0100    ;Rボタンをチェックして<br /> 021BD9E4 0A000003  beq $021BD9F8    ;押されていたら潰した命令を実行して復帰<br /><br /> Rボタンが押されていなければ時間稼ぎをする<br /> 021BD9E8 E3A01A40  mov r1, #$00040000 ;r1 = #$00040000<br /> 021BD9EC E2411001  sub r1, r1, #$01    ;r1 = r1 - #$01<br /> 021BD9F0 E3510000  cmps r1, #$00     ;r1 = #$00 かチェック<br /> 021BD9F4 1AFFFFFC  bne $021BD9EC    ;r1 = #$00 ならループ脱出<br /><br /> 021BD9F8 E1A01800  mov r1, r0, lsl #$10  ;潰した命令を実行<br /> 021BD9FC EAF90D56  b $02000F5C     ;追加ルーチンから復帰<br /><br /> このままでも動くけどARDSの機能を利用して無駄を省いてコード完成。<br /> 超執刀 カドゥケウス (アトラス ベストコレクション) AKDJ BA5320CB<br /> スローモーション1/2<br /> 52000F58 E1A01800<br /> E21BD9E0 00000020<br /> E3130C01 0A000003<br /> E3A01A40 E2411001<br /> E3510000 1AFFFFFC<br /> E1A01800 EAF90D56<br /> 02000F58 EA06F2A0<br /> D0000000 00000000<br /> ※ゲームの速度が通常の1/2になります。Rボタンを押している間は通常の速度になります。</dd> </dl><p>過去ログ8から引用</p> <dl><dt>854 :<font color="#008000"><strong>名無しさん@お腹いっぱい。</strong></font>:2008/01/06(日) 04:34:02 ID:1ItsVXNi</dt> <dd>前スレのスローモーションコードの作り方を参考に<br /> 眼力トレーニングでスローモーションコード作ろうとしているのですが<br /><br /> :0201245C E59F1260 ldr r1,[r15, #+0x260] ;r15+0x260=*(020126c4)=#67109168(0x04000130)<br /> :02012460 E59F0250 ldr r0,[r15, #+0x250] ;r15+0x250=*(020126b8)=#41942952(0x027fffa8)<br /> :02012464 E1D130B0 ldrh r3,[r1, #+0x0] ;r1+0x0=*(04000130)=#0(0x00000000)<br /> :02012468 E1D010B0 ldrh r1,[r0, #+0x0] ;r0+0x0=*(027fffa8)=#1347436608(0x50504040)<br /> :0201246C E59F0254 ldr r0,[r15, #+0x254] ;r15+0x254=*(020126c8)=#12287(0x00002fff)<br /> :02012470 E59F223C ldr r2,[r15, #+0x23c] ;r15+0x23c=*(020126b4)=#34712596(0x0211ac14)<br /> :02012474 E1831001 orr  r1,r3,r1<br /> :02012478 E0211000 eor  r1,r1,r0<br /> :0201247C E0010000 and  r0,r1,r0<br /> :02012480 E1A01800 mov  r1,r0,lsl #0x10 ;r1=805240832(0x2fff0000)<br /><br /> $02106090-&amp;021060ACの部分が空き領域として使えそうなので、ここに追加ルーチン埋め込もうとしているのですが<br /><br /> 02012480 ????????  b $02106090   ;追加ルーチンへジャンプ<br /><br /> 02106090 E3130C01  tsts r3, #$0100    ;Rボタンをチェックして<br /> 02106094 0A000003  beq $021060A8    ;押されていたら潰した命令を実行して復帰<br /><br /> Rボタンが押されていなければ時間稼ぎをする<br /> 02106098 E3A01A40  mov r1, #$00040000 ;r1 = #$00040000<br /> 0210609C E2411001  sub r1, r1, #$01    ;r1 = r1 - #$01<br /> 021060A0 E3510000  cmps r1, #$00     ;r1 = #$00 かチェック<br /> 021060A4 1AFFFFFC  bne $0210609C    ;r1 = #$00 ならループ脱出<br /><br /> 021060A8 E1A01800  mov r1, r0, lsl #$10  ;潰した命令を実行<br /> 021060AC ????????  b $02012484      ;追加ルーチンから復帰<br /><br /> と、????????のとこの、追加ルーチンへジャンプと、復帰の値の算出方法がわからなくて詰まってます。<br /> どなたかご存知でしたら教えて頂きたいです。</dd> <dt>857 :<font color="#008000"><strong>名無しさん@お腹いっぱい。</strong></font>:2008/01/06(日) 10:12:02 ID:Q9egwDtY</dt> <dd>&gt;&gt;854<br /> b命令のコードはEAxxxxxx。<br /> プラス方向へのジャンプの値は『(飛び先-コード実行位置)/4 - 2』で求められる。<br /> (例):02012480 b $02106090<br /> →EA000000 + (02106090-02012480)/4 - 2<br /> →EA000000 + 3CF02<br /> →EA03CF02<br /><br /> マイナス方向へのジャンプは『(飛び先アドレス-命令実行アドレス-8)/4』で求められる。<br /> (例):021060AC b $02012484<br /> →EA000000 + (02012484-021060AC-8)/4<br /> →EA000000 + 3FFFFFFFFFFC30F4<br /> →EA000000 + FC30F4 ※下6桁のみを切り出す<br /> →EAFC30F4<br /><br /> でも常駐ルーチンはアドレス02000000に配置したほうが良いと思う。</dd> </dl>
<div><a title="サーチの小技 (23d)" href="http://www24.atwiki.jp/ds_dat2/pages/19.html"><br /></a></div> <p> </p> <div>ちょっとイレギュラーな小技ばっかを書く予定。<br /> どう利用するかは各人でガンガレ。</div> <p> </p> <div>現在のネタは以下の4つ。</div> <ul><li>タッチした座標の検出</li> <li>垂直ブランク割り込みの無効化(高速化コードの基礎の基礎)</li> <li>ボタン連打コードのサーチ</li> <li>スローモーションコードの作成方法</li> </ul><p> </p> <hr /><p> </p> <h3 id="id_176228c6">タッチした座標の検出</h3> <div>本来はARM7でXKEYSレジスタ(アドレス04000136)にアクセスしないとダメだが、<br /> そこに格納されてる値から必要なデータを取り出すのは超マンドクセ。<br /> 素直に「絶対座標」がほしいならno$gbaで<span style="color:rgb(0,0,255);"><span style="font-weight:bold;">画面をタッチしたまま F1 を押す</span></span>といい。<br /> これでヘルプ表示でエミュレーションが停止するので、タッチ情報などもそのまんま止まるんだぜ。</div> <p> </p> <div>大抵、ゲーム中では「どこかでタッチ情報を処理」しているので、<br /> それを一時的に保持しているアドレスがヒットするはず。<br /> ちなみにDSのスクリーン解像度は 256×192 なのでこれに近い値のものを探すべし。</div> <p> </p> <div><タッチ!カービィでそれを検証></div> <p> </p> <div>下で敵にボコボコにされてるカービィは無視して、適当な場所をクリックしながらF1。<br /> エミュレーションが止まるので、emuhasteからクリック場所を基準に増加 or 減少で絞り込み。<br /> 俺の環境だとX座標がアドレス 020D9576 、Y座標が020D9578 にそれっぽい値が入った。<br /> (他にも色々いっぱいヒットしてるけど)。</div> <p> </p> <div>変動アドレスかもしれんけど、そのときはそのときで考える!!<br /> まあ、これらの値は2バイト(WORD)サイズだった。</div> <p> </p> <hr /><p> </p> <h3 id="id_4c202dd0">垂直ブランク割り込みの無効化(高速化コードの基礎の基礎)</h3> <div>プログラム内に存在するthumbコードから以下の箇所を探す</div> <pre> 2200 mov r2,0x00<br />DF05 swi #0x05<br />(※ndsdis2ではthumbコードを吐けないので注意) </pre> <div>最も簡単な方法としては、DSエミュレータで起動後にhasteDSもしくはemuhasteで16進数 "002205DF" をパラメータサーチ。<br /> →2箇所以上該当するので、そのアドレスに対して 00002200 を書き込むコードを実行する。</div> <p> </p> <div>(例)直感ヒトフデの場合 "002205DF"がアドレス 02000350 と 0238BD44 に合計2個ヒット。<br /> 改造コードはこうなる。<br /> 02000350 00002200<br /> 0238BD44 00002200</div> <p> </p> <div>なお、ゲームによってはこれで高速化することもあるが、何も起こらない場合もある。</div> <p> </p> <hr /><p> </p> <h3 id="id_395cdb45">ボタン連打コードのサーチ</h3> <div>DSのボタン入力情報はアドレス04000130と04000136に格納されている。<br /> んで、連打というのは「ボタン押して離してまた押して…」の繰り返しであり、<br /> 必ずプログラム側が「離して」という部分を判断している(はず)。<br /> この「離して」の判断を押しっぱなしでも有効にするのが「ボタン連打コードのサーチ」である。</div> <p> </p> <div>※当然ながらゲームごとにボタン処理のルーチンが異なるため、ここで紹介している方法では連打できない場合もある。</div> <p> </p> <div>とりあえず「ぷよぷよフィーバー」で実験。</div> <p> </p> <div>対戦が始まったら…<br /> Aボタン(に割り当てたキー)を押しながらF1キーを押してヘルプ表示(停止)→値 "01" を検索。<br /> Bボタン(に割り当てたキー)を押しながらF1キーを押してヘルプ表示(停止)→値 "02" を検索。<br /> 何も押さずに値 "00" を検索。<br /> ↓以下の4つのアドレスに該当<br /> 0212C848<br /> 0212C84A<br /> 021454D8<br /> 021454DA</div> <p> </p> <div>これらのアドレスを判定しているルーチンをいじれば連打状態にできると思うが、<br /> ぷよフィだと<br /> 2212C848 00000000<br /> 2212C84A 00000000<br /> 221454D8 00000000<br /> 221454DA 00000000<br /> こんな感じで00(何も押さない)を書き込むことで、<br /> 1.ユーザがボタンを押す<br /> 2.ゲーム中の"ボタンを押した際の処理"を実行<br /> 3.改造ツール側が"00"を書き込む<br /> 4.ボタンを放したと判断される</div> <p><br /> という流れが発生し、ボタンを押しっぱなしでもぷよがぐるぐる回るようになる。<br /> ゲームによっては00,01,02ではなくビット反転した値(FF,FE,FD)で処理している可能性もあるので注意。</p> <p> </p> <hr /><p> </p> <h3>スローモーションコードの作成方法</h3> <p><br /> 過去ログ7から引用</p> <dl><dt>663 :<font color="#008000"><strong>前スレ346</strong></font>:2007/11/15(木) 01:14:41 ID:Te+tUkrg</dt> <dd>とりあえず書いたので投稿します。<br /> 高速化とは対照的な「自作ルーチン埋込」の技術を応用したスローモーションコードの作成法です。<br /> スローモーション機能付きのマジコンを持っていない、または持っているけどスローモーションの<br /> ON/OFFをもっと手軽に切り替えたいという場合に有効。<br /><br /> スローモーションは時間稼ぎをするプログラムを挿入し、故意に処理落ちを発生させることで実現できます。<br /> では実際に「超執刀 カドゥケウス (アトラス ベストコレクション)」でスローモーションコードを作ってみます。<br /> とりあえず逆アセンブルして04000130を検索すると以下の部分でヒット。<br /> :02000F34 E59F10D8 ldr r1,[r15, #+0xd8]    ;r15+0xd8=*(02001014)=#67109168(0x04000130)<br /> :02000F38 E59F00D8 ldr r0,[r15, #+0xd8]    ;r15+0xd8=*(02001018)=#41942952(0x027fffa8)<br /> :02000F3C E1D130B0 ldrh r3,[r1, #+0x0]    ;r1+0x0=*(04000130)=#0(0x00000000)<br /> :02000F40 E1D010B0 ldrh r1,[r0, #+0x0]    ;r0+0x0=*(027fffa8)=#1916546356(0x723c2d34)<br /> :02000F44 E59F20D0 ldr r2,[r15, #+0xd0]    ;r15+0xd0=*(0200101c)=#35515132(0x021deafc)<br /> :02000F48 E59F00D0 ldr r0,[r15, #+0xd0]    ;r15+0xd0=*(02001020)=#12287(0x00002fff)<br /> :02000F4C E1831001 orr r1,r3,r1<br /> :02000F50 E0211000 eor r1,r1,r0<br /> :02000F54 E0010000 and r0,r1,r0<br /> :02000F58 E1A01800 mov r1,r0,lsl #0x10   ;r1=805240832(0x2fff0000)<br /><br /> 上記の部分から以下のことが読み取れる。<br /> 1. この部分は通常なら毎秒60回実行される。<br /> 2. プログラムカウンタが$02000F58に来ている時点ではr3レジスタにキーデータが格納されている。<br /> 3. アドレス$02000F58から追加ルーチンへ飛ばしても追加ルーチンの最後で mov r1,r0,lsl #0x10<br /> を実行すれば追加ルーチンではr1レジスタを自由に使用できる。<br /><br /> この3つの条件を頭に入れながら$02000F58の部分に時間稼ぎをするプログラムを挿入する。<br /> $021BD9E0 - $021BD9FCの部分が空き領域として使えるので追加ルーチンはこの部分に埋め込めます。<br /><br /> 02000F58 EA06F2A0  b $021BD9E0      ;追加ルーチンへジャンプ<br /><br /> 021BD9E0 E3130C01  tsts r3, #$0100    ;Rボタンをチェックして<br /> 021BD9E4 0A000003  beq $021BD9F8    ;押されていたら潰した命令を実行して復帰<br /><br /> Rボタンが押されていなければ時間稼ぎをする<br /> 021BD9E8 E3A01A40  mov r1, #$00040000 ;r1 = #$00040000<br /> 021BD9EC E2411001  sub r1, r1, #$01    ;r1 = r1 - #$01<br /> 021BD9F0 E3510000  cmps r1, #$00     ;r1 = #$00 かチェック<br /> 021BD9F4 1AFFFFFC  bne $021BD9EC    ;r1 = #$00 ならループ脱出<br /><br /> 021BD9F8 E1A01800  mov r1, r0, lsl #$10  ;潰した命令を実行<br /> 021BD9FC EAF90D56  b $02000F5C     ;追加ルーチンから復帰<br /><br /> このままでも動くけどARDSの機能を利用して無駄を省いてコード完成。<br /> 超執刀 カドゥケウス (アトラス ベストコレクション) AKDJ BA5320CB<br /> スローモーション1/2<br /> 52000F58 E1A01800<br /> E21BD9E0 00000020<br /> E3130C01 0A000003<br /> E3A01A40 E2411001<br /> E3510000 1AFFFFFC<br /> E1A01800 EAF90D56<br /> 02000F58 EA06F2A0<br /> D0000000 00000000<br /> ※ゲームの速度が通常の1/2になります。Rボタンを押している間は通常の速度になります。</dd> </dl><p>過去ログ8から引用</p> <dl><dt>854 :<font color="#008000"><strong>名無しさん@お腹いっぱい。</strong></font>:2008/01/06(日) 04:34:02 ID:1ItsVXNi</dt> <dd>前スレのスローモーションコードの作り方を参考に<br /> 眼力トレーニングでスローモーションコード作ろうとしているのですが<br /><br /> :0201245C E59F1260 ldr r1,[r15, #+0x260] ;r15+0x260=*(020126c4)=#67109168(0x04000130)<br /> :02012460 E59F0250 ldr r0,[r15, #+0x250] ;r15+0x250=*(020126b8)=#41942952(0x027fffa8)<br /> :02012464 E1D130B0 ldrh r3,[r1, #+0x0] ;r1+0x0=*(04000130)=#0(0x00000000)<br /> :02012468 E1D010B0 ldrh r1,[r0, #+0x0] ;r0+0x0=*(027fffa8)=#1347436608(0x50504040)<br /> :0201246C E59F0254 ldr r0,[r15, #+0x254] ;r15+0x254=*(020126c8)=#12287(0x00002fff)<br /> :02012470 E59F223C ldr r2,[r15, #+0x23c] ;r15+0x23c=*(020126b4)=#34712596(0x0211ac14)<br /> :02012474 E1831001 orr  r1,r3,r1<br /> :02012478 E0211000 eor  r1,r1,r0<br /> :0201247C E0010000 and  r0,r1,r0<br /> :02012480 E1A01800 mov  r1,r0,lsl #0x10 ;r1=805240832(0x2fff0000)<br /><br /> $02106090-&amp;021060ACの部分が空き領域として使えそうなので、ここに追加ルーチン埋め込もうとしているのですが<br /><br /> 02012480 ????????  b $02106090   ;追加ルーチンへジャンプ<br /><br /> 02106090 E3130C01  tsts r3, #$0100    ;Rボタンをチェックして<br /> 02106094 0A000003  beq $021060A8    ;押されていたら潰した命令を実行して復帰<br /><br /> Rボタンが押されていなければ時間稼ぎをする<br /> 02106098 E3A01A40  mov r1, #$00040000 ;r1 = #$00040000<br /> 0210609C E2411001  sub r1, r1, #$01    ;r1 = r1 - #$01<br /> 021060A0 E3510000  cmps r1, #$00     ;r1 = #$00 かチェック<br /> 021060A4 1AFFFFFC  bne $0210609C    ;r1 = #$00 ならループ脱出<br /><br /> 021060A8 E1A01800  mov r1, r0, lsl #$10  ;潰した命令を実行<br /> 021060AC ????????  b $02012484      ;追加ルーチンから復帰<br /><br /> と、????????のとこの、追加ルーチンへジャンプと、復帰の値の算出方法がわからなくて詰まってます。<br /> どなたかご存知でしたら教えて頂きたいです。</dd> <dt>857 :<font color="#008000"><strong>名無しさん@お腹いっぱい。</strong></font>:2008/01/06(日) 10:12:02 ID:Q9egwDtY</dt> <dd>&gt;&gt;854<br /> b命令のコードはEAxxxxxx。<br /> プラス方向へのジャンプの値は『(飛び先-コード実行位置)/4 - 2』で求められる。<br /> (例):02012480 b $02106090<br /> →EA000000 + (02106090-02012480)/4 - 2<br /> →EA000000 + 3CF02<br /> →EA03CF02<br /><br /> マイナス方向へのジャンプは『(飛び先アドレス-命令実行アドレス-8)/4』で求められる。<br /> (例):021060AC b $02012484<br /> →EA000000 + (02012484-021060AC-8)/4<br /> →EA000000 + 3FFFFFFFFFFC30F4<br /> →EA000000 + FC30F4 ※下6桁のみを切り出す<br /> →EAFC30F4<br /><br /> でも常駐ルーチンはアドレス02000000に配置したほうが良いと思う。</dd> </dl>

表示オプション

横に並べて表示:
変化行の前後のみ表示:
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。