В этом проекте классическая игра The Great Escape для ZX Spectrum 48K от Denton Designs преобразуется из образа оригинальной игры на ленте в исходный код HTML с перекрестными ссылками и аннотациями, а также полную ассемблерную версию с использованием SkoolKit.
The Great Escape — это изометрическая 3D-игра о побеге из тюрьмы 1986 года для 48K ZX Spectrum, в которой вы играете за военнопленного, пытающегося сбежать из нацистского лагеря. Это одна из самых уважаемых игр Spectrum, и я хочу знать, как авторам удалось вместить все это волшебство в 48K ZX Spectrum.
Актуальную версию дизассемблирования читайте здесь. Это не просто ассемблерный листинг: в нем расшифрована игровая графика, персонажи, предметы, анимация и другие подробности о работе игры.
Обратите внимание, что дизассемблирование может отставать от начала дерева исходного кода: в нем могут не быть самых последних изменений, пока я не выпущу обновленную сборку.
Моя первая цель — создать полностью документированную дизассемблированную игру. SkoolKit позволяет нам создавать как аннотированный листинг сборки, подходящий для восстановления точного образа исходной игры, так и подробный дизассемблер с перекрестными ссылками в формате HTML.
Второй — преобразовать аннотированную сборку в исходный код C, который ведет себя точно так же, как исходная игра. Проект повторной реализации, находящийся в стадии разработки, находится в этом репозитории, и оба проекта выполняются в тандеме.
SkoolKit — это бесподобный набор инструментов Python для дизассемблирования программного обеспечения ZX Spectrum, написанный Ричардом Даймондом.
В дополнение к созданию дизассемблированного HTML с перекрестными ссылками SkoolKit также может создавать аннотированный ассемблерный листинг. Мы можем использовать это, чтобы собрать игру в файл .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 года.
Существует также недавно обновленная версия, написанная для презентации проекта в 2020 году группе пользователей ABug: http://abug.org.uk/index.php/2020/07/04/the-great-escape-risc. -os-conversion-дэвид-томас/
В 2019 году я написал большую статью о проекте на своем сайте: http://www.davespace.co.uk/the.great.escape/.