002 X1 CHANGER

*eX1turboを使用
CHEANGERはI/Oで掲載されたパズルゲームとなっています 当時はX1ユーザーでないしあまり思入れはなく 某コンピュータールームにあった ATARI2800でミサイルコマンドで遊びまくり 一休みに転がっているI/O見て面白そーだなぁと思ったゲーム X1Gを買ったときに他から貰ったらあった そんなゲームだけど長いプログラムなので 打ち込まなくて大ラッキーなのある パズル要素のあるアクションと言ったほーがしっくりくるケド 攻略していくにつれて考えたりしないといけない   ゲームとしては敵キャラ、変態おじさんに捕まらないように 地面の色を塗り替えるという単純明快なのだけれども 画面の両端を押すと縦なら縦のライン、横なら横のラインが 180度回転するので中の迷路が変わるので ここで頭を使うゲームになるし結構面白い   思入れがないといいながら何故かこんな風に取り上げるかというと 記事の所にミスがあってチト困ったからである ↑この様に画面がおかしくなる場合やハングアップする場合がある   Huモニタでは問題なく動作するから構わないけど MASKモニタでは動作しないのが少し気になったのが運のツキ このゲームで使用されているPCG定義サブルーチンのアドレスが違うだけで たった1箇所の変更だけなのである HuモニタとMASKモニタを見た所、 パラメータ(使用レジスタ)は同じだけれど    ・HuモニタはBCレジスタは保存される  ・MASKモニタはBCレジスタは破壊される   これが原因で動作しないのである さらにMASKモニタのバージョンというかI/O掲載誌と市販版では モニタのエントリーアドレスが変更されているのである   つまり掲載誌通りの変更ではMASKモニタによっては動作しないし どのみちBCレジスタ破壊されていて動作不可なのである Huモニタで動かしておけば済む話だけれどコレは少し気になった 訂正記事もなさそうなので勝手にやる事に決めた で、どーせなら、どのモニタを使用しても動作するように考える でで、出来る限り元のゲームを壊さない様にする ちなみに元々のプログラムも自己書き換え(PCG定義)を行なっています   根本な問題はMASKモニタではBCレジスタ破壊が原因で動作不可なので PCG定義のコールする場所を他の安全な場所で BCレジスタ保存、PCG定義、BCレジスタ復帰、RET これを簡易的に動作チェックしてOKなのを確認する    <MASKモニタ市販版の場合>   471E:CD A0 D4   D4A0:C5 CD 35 07 C1 C9   使用しているモニタの判断をどーするかは ダンプリスト3つを見比べて 最初の00000Hからジャンプアドレスが違うので 00001H(ジャンプの下位)をみて判断する事に決定 ついでにキーボードでクリック音が鳴るのもオフにする    <モニタの違い>   Huモニタ     0000:C3 FA 00   MASK I/O版 0000:C3 99 01   MASK 市販版  0000:C3 7D 01    <クリック音フラグ オフ>   Huモニタ     0E90:01   MASK I/O版 0A22:01   MASK 市販版  09E4:01    <PCG定義のアドレス>   Huモニタ     0AAAH   MASK I/O版 0785H   MASK 市販版  0735H   素材は揃ったので後はてきとーに組みゃあーえーし コレぐらいの数十バイトならバイナリ直書きのほーが楽       :       : 最終的に出来たのが↓ D4A0:21 D9 D4 22 1F 47 3A 01 00 FE FA 28 1E FE 99 28 D4B0:0D 3E 01 32 E4 09 21 35 07 22 DB D4 18 18 3E 01 D4C0:32 22 0A 21 85 07 22 DB D4 18 0B 3E 01 32 90 0E D4D0:21 AA 0A 22 DB D4 C3 00 40 C5 CD FF FF C1 C9 00   前もってロードしたゲームプログラムを含む 04000H〜0D4DFHまでをセーブして 実行アドレスは0D4A0H 確認はCZ−8CB01 V1.0、V2.0 MASKモニタ I/O掲載版 dB−BASIC V1.0、V1.2 dB−IBASIC I/O掲載版 もっとも私自身JODAN DOSでHuモニタ込みで ディスク起動で遊んでいるので こんな事をやっても意味が無いんだよなぁ    
前に戻る Homeに戻る