SSブログ

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

この記事は一度公開してから間違いに気づき、非公開とし、1日かけて間違いを直して公開したら、また間違っていた。だから記事が出て、消えて、また出て、しばらくしたら中身が書き換わったというとんでもない記事だ。やる気はまだまだあるんだが、脳ミソが疲れてバカになっているらしい。ちょうど「テニス・テニス2」の解析が終わったので、私はしばらくの間別の作業をして脳ミソをリフレッシュしたほうがいいのかもしれない。

この記事には、自分用の記録をそのまま出すことになった。その関係で、環境依存文字が使われている。ご勘弁いただきたい。



追っかけ8-1
「テニス・テニス2」の全PICファイルにパレットを適用してGIFファイルとして書き出す作業を終えた私は、「テニス・テニス2」と別れる前にもうひとつだけやっておきたいことがあった。
ゲーム内で2けたの半角数字を表示すると、10の位の値のかわりに1の位の値が表示されてしまう。たとえば下の画面の左上の場合、
tt66.png
この55日とは、実際には15日か25日のどちらかだ。ここだけでなく、ゲーム内で2けたの半角数字を表示する時はすべて同様の現象が起きる。この現象を直せないだろうか。

私はまず、画面に文字を表示するルーチンを見た。データセグメントにはゲームで使われる文字列がShiftJIS文字コードで格納されている。それを画面に表示するルーチンとして、追っかけ2-3aで、ShiftJIS文字コードをJIS文字コードに変換するルーチンと、キャラクタジェネレータからCGウィンドウ経由で文字フォントを取得するルーチンが解析済みだ。私は、この辺りに問題があるに違いないと考えた。追っかけ2-3aの文字フォント取得ルーチン(サブルーチン9B6EHの一部)が、2バイト文字にしか対応していないことを発見した。ここに問題があるのかもしれない。

次に私は、読み込む文字列のほうはどうなっているかと調べた。いったい2けたの半角数字部分はどういうデータになっているのか。普通の1バイトのASCII文字コードが2つ続いているのか、そうではないのか。Windowsの「メモ帳」にT.EXEを読み込んで中を見ると、ゲーム内のカレンダーをあらわす文字列がある。それをPrintScreenしたものが、下の画像だ。4月1日の大会開始セレモニーから10月10日の決勝戦までが見える。この部分の文字列では、1日をあらわすデータの最初に月(2バイトの全角数字)、続いて日(2バイトの全角数字)、続いて曜日(2バイトの全角文字)があることがわかる。ただし日は、1けたの数字ならば良いが、2けたの数字だと'・'になっている(緑下線と赤下線は、後の図と対応している):
tt67.png
tt68.png
この結果を出すには注意しなければならなかった。私ははじめ、T.EXEを直接バイナリエディタで開くと2バイト文字が表示されずこの部分を見つけるのが大変なので、「メモ帳」に読み込んでこの部分以外を削除し保存してからバイナリエディタで開いた。すると、上の'・'はどれも81H,45H、つまり中点の'・'の文字コードだった。私はこれのせいで遠回りをしてしまったが、どうやら「メモ帳」で保存するさいにコードが変わってしまったらしい。T.EXEをバイナリエディタで直接開いて同じ部分を見つけると、上の図のとおりに場所により'・'の文字コードは異なっていた。試行錯誤の途中で調査した他の場所の結果も出そう:
tt69.png
tt70.png
tt71.png

tt72.png
tt73.png

大会開始セレモニーのアナウンスの中に"10月10日"があり、これがゲームの表示では"00月00日"になる。そこはどうか。T.EXEをバイナリエディタに読み込み、他になさそうな文字として直前の'集'を検索することでたどり着いた:
tt74.png

これらの調査からわかるのは、
"10"がEBH,A8H
"11"がEBH,A9H
"12"がEBH,AAH
"13"がEBH,ABH
"14"がEBH,ACH
"15"がEBH,ADH
"28"がEBH,BAH
"29"がEBH,BBH
規則性があることはわかった。私が思いつく範囲で可能性を列挙し考えた。
①ShiftJIS文字コード表のこの場所に2けたの数字が登録されている可能性→そんなものは登録されていなかった。
②ShiftJIS文字コードをJIS文字コードに変換した時のこの場所に2けたの数字が登録されている可能性→JIS文字コード表にも、(○つき数字を除いて)2けたの数字というものはなかった。
③PC-9801のキャラクタジェネレータが、上記のコードに対応して2けたの数字フォントを出力する仕様になっている可能性→昔のワープロソフトがJIS文字コード表で空いている場所に独自のフォントを設定していたことから類推するに、その可能性はある。
④このソフトがユーザー定義文字として、この文字コードに2けた数字のフォントを登録した可能性→PC-9801のユーザー定義文字の文字コードは76H,20H以降。(テクニカルデータブックでは7620Hと書かれているが、これだとリトルエンディアンである8086系プロセッサでは20H,76Hの順と思われてしまう。でも実際には第1バイト76H,第2バイト20Hだから、私は7620Hというまぎらわしい記述をしたくない。)この76H,20HはJIS文字コードであり、これをShiftJIS文字コードに変換するとEBH,9EH。この可能性が正解らしい。
⑤このゲームの文字列表示ルーチンがEBHを見つけると、2バイト文字表示とは別処理に分岐して2けたの数字を表示する→上の④が正解とわかるまでは、この⑤も本気で考え、今までの解析結果を見直した。もちろん、文字列表示ルーチンを調べてもそのような分岐は見当たらなかった。

こうして、④、つまりユーザー定義文字の表示に問題があることがわかった。ではその問題点は、ゲームソフトの側にあるのか、それともエミュレータの側にあるのか。実はこの記述にたどり着くまでに色々と回り道をして調査したので、結論はもう出ている。

私は今まで、フロッピーディスクから作ったディスクイメージをT98NEXTで運用しゲームを起ち上げていた。これをNeko Project IIに変更してみた。すると2けたの数字が正しく表示されるではないか:
tt75.png
tt76.png
とはいえ、Neko Project II独自の問題点も見つかった。ストーリーモードの冒頭にあるスクロールが表示されない。
tt77.png

これではっきりしたことがある。2けたの数がおかしく表示されるのは、ゲームソフトの問題点ではなかった。エミュレータT98NEXTの問題だ。

このゲーム「テニス・テニス2」にかんしては、T98NEXTはユーザー定義文字の表示がうまく行かず、Neko Project IIはスクロールがうまく行かない。私は2つのエミュレータの動作の違いを見て、エミュレータはとても良く出来ているが実機とまったく同じではなくそれぞれに個性があるという現実を改めて思い出した。

これで、ゲーム内で2けたの半角数字を表示すると10の位の値のかわりに1の位の値が表示されるという問題は、エミュレータを変えなければ解決せず、エミュレータを変えれば解決するという(あまり喜ばしくない)結論に至った。ここから先は余談だが、私はNeko Project IIでスクロールが表示されない件がどうにかならないかと考えた。私が使っているNeko Project IIはver. 0.83で、以前に私がエミュレータについて色々調べた時にはこれが最新バージョンだった。しかし今ネット検索したら、現在の最新バージョンはver. 0.86と書いてある。ver. 0.86で試してみたが、結果は同じだった。実機から作ったBIOS.ROMをNeko Project IIの実行可能ファイルと同じ場所に置くと使用されるそうなので試してみた。メニューの[Other]-[About]でbios.romを確認。しかし結果は同じだった。これで、Neko Project IIでは「テニス・テニス2」のスクロールは表示できないという(これも喜ばしくない)結論に至った。

コメント(1) 

コメント 1

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

この記事は内容が二転三転して結論がガラリと変わってしまったので、2016年8月25日13時48分以前にお読みの方はたいへんすみませんが再度内容(と結論)の確認をお願いします。
by blueclouds (2016-08-25 13:48)