「サーチの小技」の編集履歴(バックアップ)一覧はこちら
「サーチの小技」(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-&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>>>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-&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>>>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>