ベースポインタ固定法(詳細)
<<応用>>
メセタ変更を例に応用方法を記述します。
この方法を使うと20行もあったコードがわずか6行で済み
仕組みもとっても単純です。
説明の内容が少し専門的で難しくなってしまったので
とりあえずやってみたいという人は下の「簡単な利用方法」へ
読み進めてください。
[手持ちメセタを256にするコード]
0E04ADCC
0001002C
024E5F80
8C006000
0200636C
00000100
〜各部解説〜
コード適応部分
0E04ADCC
0001002C
ここでは0Eコードが使われています
0Eコードの概要は次の通りです。
0Ennxxxx
qqaaaaaa
8Caaaaaa にある WORD を調べ xxxxと比べて、
qq が
00 = 同じ
01 = 違う
場合に下のnn行のコードを発動する
つまり
8C01002CHのワードデータ(2バイト)が
ADCCHと一致した場合
以下4行(0Eコード部分を除く)の
コードが発動することになります。
この部分の役割はPSOプログラムに
プログラムをチェックする機能があり
(本当は暗号化されたプログラムを展開しなおす機能らしい)
それが終了すると
8C01002Cからのワードデータが
ADCCに変化することを利用し
チェック後にコードを適応する為の
物のようです。
もしかすると今回の手法ではこの部分は不要かも
知れません。(未確認)
ベースポインタ固定部分
024E5F80
8C006000
02コード使用してますね。
02コードの概要は次の通りです
02aaaaaa
xxxxxxxx
8Caaaaaaに
ロングワードデータ
xxxxxxxx
を書き込む
つまり
キャラクタへのベースポインタ(8C4E5F80)に
空きメモリのアドレス(80006000)を
書き込むことにより
ベースポインタを固定化してしまうのです。
この部分が今回の手法の中核になります。
データ操作部
0200636C
00000100
02コードですので
8C00636C
(固定化したベースポインタ(8C006000)+手持ちメセタへのオフセット(36C))に
ワードデータで100(10進では256)メセタを書き込みます。
02コードは発動中ずっと有効ですので事実上手持ちメセタは
256に固定することになるでしょう。
<<簡単な利用方法>>
よく分からないという方はこんな感じで応用できますよ。
Barubary氏の情報によるとメセタは次のようになっています
long meseta; // 36C
0E04ADCC
0001002C
024E5F80
8C006000
XXYYYYYY
ZZZZZZZZ
XXには書き込むデータが
ロングワード(4バイト)の時02
ワード(2バイト)の時01
バイト(1バイト)の時00
が入ります。
今回は02ですね。
YYYYYYには
6000+オフセットを書きます
今回は00636Cですね。
ZZZZZZZZに書き込む値を16で書きます。
256メセタの場合16進では100Hなので
今回は00000100となります。
後はいろいろ試してみてくださいね。
<<技術的な事>>
原理について以下にで簡単に説明します。
理解するにはC言語等のプログラミングの知識が
必要となります。
[これまでの方法]
ベースポインタ(以下BP)の値はPSOのプログラムによって決定
*(BP + 36CH) = 100;
この場合、正しいデータ操作を行うには
BPを読み出して計算しないと無理なので
その仕組みをプログラムとして記述し
コードにする必要がありました。
[ベースポインタ固定の場合]
BP=8C006000H
XTコードによりベースポインタの先を未使用領域固定してしまいます。
(8C006000H〜は使用していないメモリ領域です)
これにより式を展開すると以下の通りに成ります。
*(BP + 36CH) = 100H;
↓
*(8C006000H + 36CH) = 100H;
↓
*(8C00636CH) = 100H;
こうすることによりBPを参照することなくデータ操作が可能になります。
(XTの基本機能のみで記述可能)
<<最後に>>
もっと分かりやすく書ければよかったのですが
あんまり凝ると発表する前に力尽きてしまうので
こんなところでお許しください。
質問やそれへの解答(私以外が解答することも含む)等で
新たなコミュニティが生まれていくともっと楽しいかもね。
皆さんの反応お持ちしております。
利用は自己責任でお願いします。
れおりな@る〜なてぃあ
│back│top│