5.新しいカスタムブロックを作ってみよう3
JSR命令を使ったブロックを作ってみましょう。
up_down.txtというファイルを作り、以下の内容を書き込みます。
JSR SBR_UP
RTS
JSR SBR_DOWN
RTS
SBR_UP:
LDA #$C0
STA $7D ;y方向速度
RTS
SBR_DOWN:
LDA #$40
STA $7D ;y方向速度
RTS
●JSRルーチンの修正
JSR命令は引数として、呼び出し先のルーチンの絶対アドレスモードのアドレスを指定しますが、
blktoolがこのブロックソースをROMのどこに挿入するか分からないので、
このアドレスをブロックソースの開始アドレスを$000000とした時の呼び出し先のルーチンのアドレス、
すなわちbinファイルのバイナリエディタ上でのアドレスに修正する必要があります。
ところが、TRASMを使用する場合は開始アドレスを$000000に指定しようとしてもエラーが出ます。
SNESアドレス表記でのROMアドレスは$**8000〜$**FFFFで、有効なROMアドレスではないからです。
よって、開始アドレスは一番小さい値でも$008000しか指定できません。
なお、xkasは$000000を開始アドレスに指定できるので問題ありません。
Reloc Offsetの設定までとばして下さい。
TRASMを使う場合は手動で修正してやる必要があります。
JSRの引数のアドレスは全て$8000ずつ多くなってるので、$8000引いてやればいいのです。
binファイルをバイナリエディタで開いてJSR命令の箇所を探し出し、以下のように修正します。
●Reloc Offsetの設定
さて、この時点でJSRの引数のアドレスは、ブロックソースの開始アドレスを$000000とした、
すなわちバイナリエディタ上でのアドレスです。
これを有効なアドレスにするには、実際にソースを挿入する箇所のアドレスを
この引数のアドレスに加えればいいわけです。
この処理は、blktoolがブロックをROMに挿入する際に自動的に行ってくれます。
しかしながら、blktoolはソース中のどこにJSR命令の引数のアドレスがあるのかが分かりません。
その場所をユーザが指定してやる必要があります。
それがReloc Offsetです。
今回のソースでは、JSR命令の引数のアドレスは下の2箇所にあります。
このアドレスのバイナリエディタ上での位置を、16進数のままでカンマで区切ってReloc Offsetに追加します。
他のoffsetと違い、10進数では無いので気をつけてください。
最後のカンマも忘れないでください。
JSR命令に限らず、絶対アドレスモードや絶対アドレスインデクスモードでソース中のアドレスを指定する場合は
全てこれらの処理をし、その場所をReloc Offsetに加える必要があります。