024 X1 暴走特急SOS
*eX1turboを使用
部屋のデフラグ(?)でX1のソフトが少し出てきた
まぁ出てきたんだから部屋の奥の奥にしまう前に
イメージ化しちゃおうかなというのが今回の目的
CZ−8RL1をWIN98で制御するのは部品を買うだけで放置
面倒なので直接wav化してロードで失敗
出来るだけ楽をしようと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 ;POP HL データ
DFFFA:DW 01E1DH ;POP 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パッドで、攻撃はキーボードで出来るのが幸い
ゲーム自体はシンプルなアクションゲームとしても面白いし
演出も短く良くまとまっている
スペリングミスはまぁ置いといて
空飛ぶコブラは謎ではある、
そのコブラで攻撃するとき立っちゃうので
乗っ取りギャングのナイフ攻撃に当たる場合があるので
そーゆシステムなので注意
警告が出たらしゃがんでやり過ごす
当時のパソコンゲームでは中々のものです
5.*** 追記 ***
なんか簡単にtap化出来るとの事で
聞いた通り、Dump List Editorで
wavからtapファイルで1発OKらしいので
試してみたらガッテン、tap化出来た
つまりココでやった事の大半は無意味という事になります
:
:
まぁJODAN−DOSの為のファイル化をやっただけでも
救いがあった...
前に戻る
Homeに戻る