1988スタイルのバグを修正





私は80年代に、家庭用コンピューターが不思議から主流に変わった10年間で育ちました。 私の小学校には、いくつかのPhillips P2000Tホームコンピューターと、Apple Macintoshがいくつかありました。 私の友人はCommodore 64を持っていて、その上で私たちはゲームをしていました。ある日、父は財政を管理するためにCommodore 128を購入しました。アプローチは近づいています:「壊れていません-修正しないでください。」)



C128のほぼ直後に、C64を購入しました。 C128はビジネスに、C64はエンターテイメントに使用されました。 Space Taxi、Super Cycle、Velocipede、Last Ninja II、Electrixなどのゲームをプレイしたことをはっきりと覚えています。 さらに、このコンピューターでプログラミングを学び始めました。



World Wide Webが発明されるまでに数年が残っていたため、プログラミングの研究は主に本や雑誌を読むことについてでした。 多くの場合、コンピューター雑誌は、読者が転載する必要のあるソースコードのリストを発行しました。 結果は、ゲーム、ディスクをコピーするためのユーティリティ、GEOSの描画プログラム、または-たいていの場合- タイプミスのために何らかの形で動作するものなど、何でもかまいません。 ある時点で、雑誌はリストの発行を開始し、各行の横にチェックサムが示されました。 各入力行のチェックサムをチェックする特別なプログラムがありました。 このようなプログラムは大いに役立ちました。 しかし、それでも、コンピューターの歴史の中でコンピュータープログラムをコピーする最も遅く、エラーが発生しやすい方法の1つでした。 それにもかかわらず、プロセスは非常に興味深いものでした(少なくとも、私にはそう思われました)。



そのような雑誌の1つは、 コモドールドシエ 、「 コモドールのアクティブオーナー向けの実用的な雑誌」で、1984年から1988年に発行されました。 最後になった17日には、リリースにはかなり興味深いゲームのリストが含まれていました。 これはBlindgangerと呼ばれ、オランダ語では「 c 」を意味しますが、ブラインドという言葉の意味もここで使用されました。



画像

Commodore Dossierの第17号の表紙



おやすみなさい、ゲームの盲目のヒーローは目を覚まし、彼がどういうわけか都市下水道に入ったことがわかります。 プレイヤーの仕事は、彼が杖で作った音だけを使って、彼を通りに戻すことです。



パイプの清潔を過度に気遣う市の下水道サービスは、5 ごとに水を排出します。 私たちの盲目のヒーローは、退院するたびに下水道の別の場所に彼を放り込み、そこから再び出口を探し始めなければなりません。 3回目の排水の後、ゲームは終了します。 プレイヤーは、出口の場所と訪れた場所を示す下水道地図を見ることができます。



1988年の秋頃、コンピューターにリストを入力して、ゲームを開始しました。 満月の前に完全に黒い画面で飛ぶコウモリのスプライトアニメーションが含まれていました。 しかし、私は管理を理解できませんでした。 下水道マップは確かに役立ちましたが、何か問題がありました。 地図上で訪問済みとしてマークされた場所は、私が旅行した経路に似ていませんでした。 さらに、壁までも頻繁に訪れました。



画像

元のゲームの下水道カードの例



数回の試行の後、私はあきらめて何か他のことをしましたが、地図と不明瞭な管理の問題を思い出しました。 それで、 コモドールドシエのこの問題のスキャンに出くわしたとき、私はそれをきっぱりと扱う時間であることに気づきました。



もちろん、開始する前に、リスト全体を再度運転する必要がありました 。 その後、1988年に、 コモドールドシエで発行されたチェックサムユーティリティがありませんでした。 私の不注意とタイプミスのために下水道カードが混同されたのでしょうか?



簡単なGoogle検索で、CHECKSUM DOSSIERプログラムでディスクイメージに移動しました。 それは有望に思えます! チェックするために、私はプログラムを開始し、 Blindgangerリストから短い行を印刷しました:「240 RETURN」。その横にチェックサム「7E」が示されました。 次に、文字列自体とチェックサムにタイプミスを挿入しようとしました。 どちらの場合も、メッセージ「FOUT IN REGEL」、つまり「ERROR IN LINE」が画面に表示されました。 いいね!



画像

可愛いじゃない?



このプログラムでは、リスト全体を紹介しました。 スキャンされたログの一部の行は不十分に読み取られたため、ユーティリティは不可欠であることが判明しました。 多くの場合、文字列とチェックサムの組み合わせについて、一致するまでさまざまなオプションを選択する必要がありました。 まあ、これまでのところとても良い。 今、私は間違いなく元のコピーを手に入れました。 もちろん、このコピーには、1988年に私に発生したバグはありません。 しかし... 彼らはそうでした



理由を見つけるために、画面に下水道マップを示すコードを見つける必要がありました。 マップは、ゲームの終了時、つまり、プレーヤーが出口を見つけたとき、または3回目の排水が行われた後に表示されます。 2番目のケースに焦点を当て、BASICリストで0または3の番号を探し始めました。



行1780で変数MAALが見つかりました。これはゼロと比較されました。 この変数は、行1550で値3で初期化され、ドレインごとに減少しました。



1780 MAAL=MAAL-1:IFMAAL=0THENGOTO1810
      
      





MAALがゼロの場合、 1810〜1840行のコードブロックが実行されます。 1840行目は無限ループです。 BASICの他の3行を見ると、次の目標はメモリアドレス16540($ 409C)にあるマシンコードのルーチンであることがわかりました。



 1810 POKECROSS+4096,1 :REM MARK EXIT ON THE MAP 1820 SYS16540 :REM COPY MAP TO SCREEN 1830 POKESID+11,0:POKE53248+21,0:REM STOP SOUND AND DISABLE SPRITES 1840 GOTO1840 :REM ENDLESS LOOP
      
      





このルーチンには2つの部分があります。 最初は、メモリ領域から$ 6000から始まる1000バイトを画面上のメモリ($ 0400- $ 07E7)にコピーします。 下水道カードで画面全体(40列25行= 1000バイト)を埋めます。



結局のところ、この部分にバグはありません。 すべてのソリッドパーツが壁、「@」がパイプの水平セクション、「A」が垂直セクション、「B」から「J」がさまざまな角度と交差点を示すまで、マップは奇妙に見えるかもしれません、「K」はピット、「L」は出口です。 これらの記号は偶発的なものではありません。 スクリーンコード0〜12に対応します。マップは、ゲーム内のマップの内部表現のスクリーンへの単なるダンプです。



サブルーチンの2番目の部分は、メモリ領域から1000バイトを7000ドルからカラーRAM($ D800- $ DBE7)にコピーします。 そのため、訪問した場所はすべて黄色で塗りつぶされます。



 L40CB: LDA #$FF ; >--  -- STA $FB ; | LDA #$6F ; | STA $FC ; | LDA #$F4 ; | STA $FD ; | LDA #$D7 ; | STA $FE ; <-------------------- LDX #$04 ; >--   ----------------- L40DD: LDY #$FA ; >-- .  I --- | L40DF: LDA ($FB),Y ; ( ) | | STA ($FD),Y ; | | DEY ; | | BNE L40DF ; <------------------- | LDY #$FA ; >-- .  II ----------- | L40E8: INC $FB ; (  ) | | BNE L40EE ; | | INC $FC ; | | L40EE: INC $FD ; | | BNE L40F4 ; | | INC $FE ; | | L40F4: DEY ; | | BNE L40E8 ; <---------------------------- | DEX ; | BNE L40DD ; <-------------------------------
      
      





バイトは、250バイトの4つのブロックにコピーされます。 外側のループは、レジスタXを4〜0のカウンタとして使用します。



  LDX #$04 ; ;   ; DEX BNE L40DD
      
      





最初の内部ループは、レジスターYを#$ FA(250)から0までのカウンターとして使用します。



 L40DD: LDY #$FA L40DF: LDA ($FB),Y STA ($FD),Y DEY BNE L40DF
      
      





間接ループは、内部ループのバイトをコピーするために使用されます。 このアドレッシングモードでは、レジスタYはゼロページに格納されている16ビットの開始アドレスに追加されるオフセットとして使用されます



たとえば、 LDA ($FB),Y



コマンドLDA ($FB),Y



は次のように実行されます。





Yレジスタは250から0にカウントダウンします。インデックスとして使用されるYの最小値は1であることに注意してください。



ロードする最初のバイトは7000ドルです。 Yの最小値は1なので、 ソースの開始アドレスは$ 7000-1 = $ 6FFFに初期化する必要があります。 同様に、格納される最初のバイトは$ D800にあるため、 宛先開始アドレスは$ D800-1 = $ D7FFに初期化する必要があります。 代わりに、$ D7F4に初期化されます!



ランダムなタイプミスで、#$ FFの代わりに#$ F4を入力することはほとんどありません。 しかし、10進表記では、これは255ではなく244を入力することに対応します。ゲームの作成者は、定数255を入力するときに誤って5ではなく4をクリックしたようです。 これにより、マップで使用される色が、マップ自体に対して11ポジション移動しました。 これは、訪問した場所が地図上で誤ってマークされたことを意味します。



エラーの原因となったバイトは、BASICのリストの3670行目のデータステートメントにあります。



 3670 DATA 252,169,244,133,253
      
      





正しい値(255)に置き換えた後、下水道マップが正しく表示され始めます。 そしてそれは... 29年前に間違いを修正したことを意味します!



これを祝うために、この修正を含むオリジナルの2017ゲームのバージョンと、コードの調査中に見つかった他のバグの修正をまとめました。





Blindganger 2017は、 チェックサムを含む BASICのリストとしても利用できます 。 80年代の自分を感じるには、Commodore Dossierチェックサムユーティリティをダウンロードして実行し(以下のリンクを参照)、入力を開始してください!



後で、読みやすいように(すでに正しい)下水道マップを改善しました(下の例を参照)。





十字架は出口を示しています!



参照資料






All Articles