Este proyecto realiza ingeniería inversa del clásico juego ZX Spectrum 48K de Denton Designs, The Great Escape, a partir de una imagen en cinta del juego original en un desmontaje HTML con referencias cruzadas y anotaciones y un código fuente de ensamblaje completo, utilizando SkoolKit.
The Great Escape es un juego isométrico de fuga de prisión en 3D de 1986 para el 48K ZX Spectrum en el que interpretas a un prisionero de guerra que intenta escapar de un campo de prisioneros nazi. Es uno de los juegos de Spectrum mejor considerados y quiero saber cómo los autores lograron empaquetar toda esa magia en el 48K ZX Spectrum.
Lea la versión actual del desmontaje aquí. No es sólo una lista de ensamblaje: ha decodificado gráficos del juego, personajes, elementos, animaciones y varios otros detalles sobre el funcionamiento del juego.
Tenga en cuenta que el desmontaje puede ir por detrás del encabezado del árbol de código fuente: es posible que no incluya los últimos cambios hasta que publique una compilación actualizada.
Mi primer objetivo es construir un desmontaje del juego completamente documentado. SkoolKit nos permite crear una lista de ensamblaje anotada adecuada para reconstruir una imagen exacta del juego original y un desmontaje detallado con referencias cruzadas en formato HTML.
El segundo es transformar el ensamblado anotado en código fuente C que se comporta exactamente como el juego original. El proyecto de reimplementación del trabajo en progreso se encuentra en este repositorio y los dos proyectos avanzan en conjunto.
SkoolKit es el kit de herramientas Python incomparable para desmontar el software ZX Spectrum escrito por Richard Dymond.
Además de producir el desensamblado HTML con referencias cruzadas, SkoolKit también puede producir una lista de ensamblaje anotada. Podemos usar esto para volver a ensamblar el juego en un archivo .TAP que puedes cargar en un emulador. ¡Puedes usarlo para modificar el juego y corregir errores de hace 30 años!
git clone https://github.com/dpt/The-Great-Escape.git
cd <cloned repo>
make disasm
Si todo está bien, verá resultados como:
$ 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
en tu navegador y sumérgete. make tap
construirá build/TheGreatEscape.tap
make z80
en su lugar para crear una imagen .z80 si lo prefiere.Cualquiera de los pasos anteriores invocará su paso anterior automáticamente.
make skool
- para construir el archivo .skoolTheGreatEscape.skool
make tap
build/TheGreatEscape.tap
en tu emulador Si los archivos skool no son de su agrado y prefiere una lista de ensamblaje normal: make asm
compilará build/TheGreatEscape.asm
. Luego, esto se puede pasar a Pasmo, por ejemplo, para crear un binario.
La ingeniería inversa del juego ya está completa, pero se seguirá trabajando para mejorar la precisión y legibilidad del desmontaje.
Aquí están las diapositivas de una presentación que hice a mis colegas sobre el proyecto en enero de 2016.
También hay una versión actualizada más recientemente que se escribió para una presentación de 2020 sobre el proyecto al grupo de usuarios ABug: http://abug.org.uk/index.php/2020/07/04/the-great-escape-risc -os-conversión-david-thomas/
En 2019 escribí un gran artículo sobre el proyecto en mi sitio web: http://www.davespace.co.uk/the.great.escape/