이 프로젝트는 SkoolKit을 사용하여 Denton Designs의 클래식 ZX Spectrum 48K 게임 The Great Escape를 원본 게임의 테이프 이미지에서 상호 참조되고 주석이 달린 HTML 디스어셈블리 및 전체 어셈블리 소스 코드로 리버스 엔지니어링합니다.
The Great Escape 는 1986년에 출시된 48K ZX Spectrum용 아이소메트릭 3D 탈옥 게임으로, 나치 포로 수용소에서 탈출하려는 포로를 플레이하게 됩니다. 이것은 가장 잘 알려진 Spectrum 게임 중 하나이며 저자가 어떻게 그 모든 마법을 48K ZX Spectrum에 담을 수 있었는지 알고 싶습니다.
여기에서 현재 버전의 분해를 읽어보세요. 이는 어셈블리 목록일 뿐만 아니라 게임 그래픽, 캐릭터, 아이템, 애니메이션 및 게임 작동에 대한 다양한 기타 세부 정보를 디코딩했습니다.
디스어셈블리는 소스 트리의 헤드보다 뒤처질 수 있습니다. 업데이트된 빌드를 푸시할 때까지 최신 변경 사항이 적용되지 않을 수 있습니다.
나의 첫 번째 목표는 완전히 문서화된 게임 분해를 구축하는 것입니다. SkoolKit을 사용하면 원본 게임의 정확한 이미지를 재구성하는 데 적합한 주석이 달린 어셈블리 목록과 HTML 형식의 상세한 상호 참조 분해를 모두 구축할 수 있습니다.
두 번째는 주석이 달린 어셈블리를 원래 게임과 똑같이 동작하는 C 소스 코드로 변환하는 것입니다. 진행 중인 재구현 프로젝트는 이 저장소에 있으며 두 프로젝트는 동시에 진행됩니다.
SkoolKit은 Richard Dymond가 작성한 ZX Spectrum 소프트웨어를 분해하기 위한 독보적인 Python 툴킷입니다.
상호 참조된 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년 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/)에 프로젝트에 대한 대규모 글을 썼습니다.