024 X1 暴走特急SOS

*eX1turboを使用
  部屋のデフラグ(?)でX1のソフトが少し出てきた まぁ出てきたんだから部屋の奥の奥にしまう前に イメージ化しちゃおうかなというのが今回の目的 CZ−8RL1をWIN98で制御するのは部品を買うだけで放置 面倒なので直接wav化してロードで失敗 出来るだけ楽をしようと音量だけ大きくして変換 世の中はそー上手くいく事もあって成功したのである さぁ牛だ!の例え(?)のよーに 次はtap化となるわけだがここで失敗 wav化成功でとりあえず奥にしまえるので 目的は果たしたのだけど何故失敗したのか気になった 取り出した時に足を何か踏んづけて出血したのに気づかなかったため 後で床掃除もするハメになるのは数時間後のことである   この物語はポンコツX1ユーザーの 華麗にて波乱なる日々のドラマである(嘘)     1.まずはどんなファイルがあるのか?   結論から書くとファイルは2本で ローダ、暗号化されたメインプログラムの2本の構成 ローダはショートタイプで X1のIPLは0FF00H以降かつ1ページ(256バイト)のバイナリファイルは ショートタイプとしてロード終了後、テープは巻き戻さない ショートタイプ以外はロード終了後、テープは巻き戻しのコマンドが実行される が、実はあまり関係ないのである     2.どうせローダでナンかしてんでしょ?   ナンもしないならバイナリファイル1本で済むわけで ナンかしているに決まっていると考えるのが普通 まずJODAN−DOSでCLOADを使いローダのを調べる    ファイル名EXPRESS、  ロード0FFDEH、長さ000D5H、  実行0FFE7H   ん、0FFDEHから始まっているつーことは0FFFFHを越えて 0000H以降もまたいでロードするつーわけでして そこの部分を抜き出し逆アセンブルするんだけど またいでいる為、分割して逆アセンブルで実行場所を見る    AFFE7:LD  A,01DH        OUT (000H),A        JP  00FAH   LD命令とOUT命令はこの場合 I/Oポートは01D00Hをとして01DHを出力している OUT(nn),Aは ポート Annと16ビットアドレスになる これでIPL ROMの選択され00FAH(エラールーチン)に 飛ぶようになる これで終了なわけでないし、本当はココじゃあない このスタートアドレスがダミーな訳で じゃあ何処に飛ぶのかというと、 スタック領域をロードで上書きするパターン IPL ROMはSP=0で。ロード終了はPOP HL、BC、RETとなる スタック領域は0FFFFH〜0FFF8Hまでとなるが実際には少し違う    DFFF8:DW 00008H ;HL用データ  DFFFA:DW 01E1DH ;BC用データ  DFFFC:DW 0FFDEH ;RET用 (ロード終了後ココへ飛ぶ)  DFFFE:DW 00002H  D0000:DW 00008H     3.でナンかしてたし    0FFDEHではIPL ROMをOFFにしてオールRAM BC=01E1DHはIPL ROMをOFFのI/Oポート HL=00008Hはローダ本体のアドレスで データアドレス下位 XOR データで 暗号化されたデータをプログラムに変換する 0008:61なら008H XOR 061Hなので069H... これを00008H〜000FFHまで変換される このルーチンはコレだけでRETしているので 00002Hに戻るというか飛ぶ    A0002:LD A,002H ;CMT 02:READ        JP 00ADH 00ADHではSUB CPUに CMTコマンド0E9H,002Hを送ってRET ここでSP=0(0FFFFH)を越えて 00000Hに示している00008Hに飛ぶ こーやって色々解析させないよーにするのもよくある事で 個人的には面倒くさいなぁと 4.何故tap化出来なかったのか?  暗号化されたローダ部分はプログラムになって ゲーム本体をロードするに必要な部分は全て解析出来る ゲーム本体は サイズ、ロードアドレス、ゲームプログラム、チェックサム、実行アドレス とまあこんな感じで格納されているのも解る ゲームプログラムは勿論暗号化されておりローダ部分と同じく    下位アドレス XOR データ   となっている(少し残念) 後はIOCSに近いプログラムなのでコレというものはなかった が、よーく見ると1バイトロード(0008EH)で  ’1’のパルスならビットデータは0  ’0’のパルスならビットデータは1、チェックサムINC と逆になっている この逆になっている部分がtap化失敗の原因なのかなぁ? 波形が同じだと変換するだろうし多分違う 考えられるのはパルスでHからLになりディレイをとって その時のパルスがHかLでロードでのビットデータの判断をしている IOCS(00641H)ではA=023HのDEC Aのループで ローダ (00083H)ではA=02EH、NOPのDEC Aのループ IOCSはサブルーチンコールだけど ローダーではLからHになったついでに見ているので CALL、RETの部分がない分を差し引いても ループ値の差が11なのでかなり違う 本当なら計算すりゃあイイんだけど面倒 でもまぁこの部分だろーなぁ 通常はノーマルフォーマット変換だけだもんなぁ というわけで確認の為、失敗したtapファイルをロードして 途中でDebuggerでメモリを除いてみたらロードされてんの メッセージデータも読めるしプログラムとしても読めるし じゃあ何故失敗したのかは不明のまま... チェックサムのカウントがおかしいんだろうと...        :        : まぁここまでやったんだから、おまけでディスクコンバート eX1turboでローダーを読み終えたら、 Debuggerでローダ部分を無限ループするように書き換える 0045:18 FEでロードアドレス、長さをレジスタを見て入手 もう一度最初からロードして今度は0069:18 FEで同様に実行アドレスを入手 つまりゲーム自体は00100H〜0817FH、実行アドレス00100Hと判明 データをDebuggerでW 0100 817Fを実行してゲーム本体抽出 そのバイナリをX1DiskExplorerでディスクファイル化してOK ファイル化して稀にWIDTH40にしないソフトもありますが このソフトでは気にする事はありません   ↑ ファイル化すればJORDAN−DOSで起動可     肝心のゲームは2つのシーンで ITAエクスプレスの車上から始まり車内に入るまでと 車内で鍵を取り操縦席までいくまでとなる X1用なのでキー操作は面倒でJOYパッド(スティック)も今一つで 移動はJOYパッドで、攻撃はキーボードで出来るのが幸い   ゲーム自体はシンプルなアクションゲームとしても面白いし 演出も短く良くまとまっている スペリングミスはまぁ置いといて 空飛ぶコブラは謎ではある、 そのコブラで攻撃するとき立っちゃうので 乗っ取りギャングのナイフ攻撃に当たる場合があるので そーゆシステムなので注意 警告が出たらしゃがんでやり過ごす 当時のパソコンゲームでは中々のものです  
前に戻る Homeに戻る