このプロジェクトは、SkoolKit を使用して、Denton Designs の古典的な ZX Spectrum 48K ゲーム The Great Escape を、オリジナル ゲームのテープ イメージから相互参照および注釈付きの HTML 逆アセンブリおよび完全なアセンブリ ソース コードにリバース エンジニアリングします。
The Great Escapeは、1986 年にリリースされた 48K ZX Spectrum 用のアイソメトリック 3D 脱獄ゲームで、ナチスの捕虜収容所から脱出しようとする捕虜を演じます。これは Spectrum ゲームの中でも最も評価の高いゲームの 1 つであり、作者がどのようにしてあの魔法を 48K ZX Spectrum に詰め込んだのか知りたいと思っています。
逆アセンブリの最新バージョンについては、こちらをご覧ください。これは単なるアセンブリ リストではありません。デコードされたゲーム グラフィックス、キャラクター、アイテム、アニメーション、およびゲームの仕組みに関するその他のさまざまな詳細が含まれています。
逆アセンブリはソース ツリーの先頭よりも遅れる可能性があることに注意してください。更新されたビルドをプッシュするまで、最新の変更が反映されない可能性があります。
私の最初の目標は、完全に文書化されたゲームの逆アセンブリを作成することです。 SkoolKit を使用すると、元のゲームの正確なイメージを再構築するのに適した注釈付きアセンブリ リストと、HTML 形式での詳細な相互参照逆アセンブリの両方を構築できます。
2 つ目は、注釈付きアセンブリを、元のゲームとまったく同じように動作する C ソース コードに変換することです。進行中の再実装プロジェクトはこのリポジトリに存在し、2 つのプロジェクトは並行して進行します。
SkoolKit は、Richard Dymond によって作成された ZX Spectrum ソフトウェアを逆アセンブルするための比類のない Python ツールキットです。
SkoolKit は、相互参照された HTML 逆アセンブリの生成に加えて、注釈付きアセンブリ リストも生成できます。これを使用して、ゲームをエミュレータにロードできる .TAP ファイルに再構築できます。これを使用すると、ゲームを変更したり、30 年前のバグを修正したりできます。
git clone https://github.com/dpt/The-Great-Escape.git
cd <cloned repo>
make disasm
すべてがうまくいけば、次のような出力が表示されます。
$ make disasm
tap2sna.py --output-dir build @TheGreatEscape.t2s && mv build/TheGreatEscape.z80 build/TheGreatEscape.pristine.z80
Downloading http://www.worldofspectrum.org/pub/sinclair/games/g/GreatEscapeThe.tzx.zip
Extracting The Great Escape.tzx
Writing build/TheGreatEscape.z80
mkdir -p build
sna2skool.py --hex --sft TheGreatEscape.sft build/TheGreatEscape.pristine.z80 > TheGreatEscape.skool
Using skool file template: TheGreatEscape.sft
skool2html.py --hex --asm-labels --rebuild-images TheGreatEscape.skool
Using ref files: TheGreatEscape.ref, TheGreatEscapeBugs.ref, TheGreatEscapeChangelog.ref, TheGreatEscapeFacts.ref, TheGreatEscapeGame.ref, TheGreatEscapeGlossary.ref, TheGreatEscapeGraphics.ref
Parsing TheGreatEscape.skool
Output directory: build/TheGreatEscape
Copying /usr/local/lib/python3.7/site-packages/skoolkit/resources/skoolkit.css to skoolkit.css
Copying TheGreatEscape.css to TheGreatEscape.css
Copying static-images/BarbedWire.png to static-images/BarbedWire.png
Copying static-images/GameWindow.png to static-images/GameWindow.png
Copying static-images/JoystickControls.png to static-images/JoystickControls.png
Writing disassembly files in asm
Writing maps/all.html
Writing maps/routines.html
Writing maps/data.html
Writing maps/messages.html
Writing maps/unused.html
Writing buffers/gbuffer.html
Writing reference/bugs.html
Writing reference/changelog.html
Writing reference/facts.html
Writing reference/glossary.html
Writing graphics/glitches.html
Writing Intro.html
Writing Controls.html
Writing Completion.html
Writing Characters.html
Writing Items.html
Writing Masks.html
suggested width 17 > actual 16
Writing RoomObjects.html
Writing Rooms.html
Writing Map.html
Writing index.html
build/TheGreatEscape/index.html
を開いて、詳しく見てみましょう。 make tap
build/TheGreatEscape.tap
をビルドしますmake z80
使用して .z80 イメージを構築します。上記のいずれのステップでも、その前のステップが自動的に呼び出されます。
make skool
-- .skool ファイルを構築します。TheGreatEscape.skool
を編集するmake tap
build/TheGreatEscape.tap
をリロードしますskool ファイルが好みではなく、通常のアセンブリ リストを好む場合: make asm
build/TheGreatEscape.asm
をビルドします。これをたとえば Pasmo に渡してバイナリを構築できます。
ゲームのリバース エンジニアリングは現在完了していますが、逆アセンブリの精度と可読性を向上させるための作業が引き続き行われます。
これは、2016 年 1 月にこのプロジェクトについて同僚に行ったプレゼンテーションのスライドです。
ABug ユーザー グループに対するプロジェクトに関する 2020 年のプレゼンテーション用に書かれた、より最近更新されたバージョンもあります: http://abug.org.uk/index.php/2020/07/04/the-great-escape-risc -os-変換-デビッド-トーマス/
2019 年に、私は自分のウェブサイト http://www.davespace.co.uk/the.great.escape/ でこのプロジェクトについて大々的に記事を書きました。