SSブログ

孤独へ向って突っ走れ(14) [  PC-98x1(補完計画)]

今朝外出を試みた私は爪先を曲げる時の痛みのせいで家へUターンすることとなり、今日も寝たきりの生活だ。

横になる前に大急ぎでPCを起動してひとつだけ確認したことがある。1D7C:13B8に何が入っているか。それについては後で書く。話を最初から始めよう。



大変なことがわかった。私はやっぱりプログラムの迷宮で迷っていた。

まず、前の記事で書いたDOSコマンドによるファイルの読み込みの件。私の解析では、WORD PTR[1EE8]にはファイルを読み込むバッファのセグメント、WORD PTR[1EE8+2]には同じくバッファのオフセット、WORD PTR[1EE8+4]にはファイル長、[1EE8+8]からはファイル名が格納されている。で、ここはファイル名を調べるためにメモリをダンプしたのが残っていた。それを見たら、ファイル名以外は全部0だった。ありえへん!アドレス0000:0000にファイルから0バイト読み込む処理なんて。ファイル読み込みに失敗する方の分岐しかありえない。私は今まで、決して実行されない部分を一生懸命解析していたのだ。

それでは、ファイル読み込みに失敗する方の道を解析するか?いや待て。このサブルーチンはファイル読み込み用のルーチンだろうから、その先にはエラー表示が待っているだけの可能性が高い。

ここは、プログラム先頭から改めて条件分岐を探しては調べるほうがいい。

最初の条件分岐は、最初にサブルーチンへ飛んだ6FECHの少し先。私自身が次のように書いた。

CMP WORD PTR [13B8],+01
JNZ 7026
データセグメントのアドレス13B8Hからの2バイトが+01でなければ
アドレス7026Hへ飛べ
(1D7C:13B8にはまだ何か入れる命令はない。あらかじめ何かの値が入っている。)

私が横になる前にどうして1D7C:13B8を調べたかわかっただろう。で、そこに入っている値は0だった!あかん。私が一生懸命解析したコードのほとんど全部がゲームで使われないルーチンだ。

あなたはきっと、なんで私が1D7C:13B8の値を最初に調べなかったのかと思うだろう。私はずっと、dias.exeのダンプでアドレスを指定する時セグメントも指定できることを知らなかったのだ。それで愚かにも、コード解析と並行してEXEファイルのどこにデータセグメントに格納される部分があるかをネット検索し続けていた。

そんなこんなで色々あって、楽しかったけど無駄や落胆も多くて疲れた。ここから先は今までほどの頑張りは続かないだろう。またやる気が起きた時にやる。

コメント(0) 

コメント 0

コメントの受付は締め切りました