Автор: [TapeLoader]
Специально для журнала «РетроКом»
Пролог. Код, которого нет
Представьте картину: 1986 год. Молодой программист Джонатан "Джоффа" Смит сидит в офисе Ocean Software и на ассемблере Z80 пишет код для игры Green Beret. Он не думает о том, что через 40 лет его исходники станут музейным экспонатом. Он думает о том, как уместить четыре уровня в 48 килобайт и заставить игру работать с частотой 25 кадров в секунду.Проходят десятилетия. Джоффы Смита нет в живых. Оригинальные исходники утеряны — стерты с дискет, сгнили на кассетах, выброшены при переездах.
Но Green Beret живёт. Исходный код восстановлен по машинному коду, откомментирован, выложен на GitHub и доступен каждому .
Как это стало возможным? Кто эти люди, которые собирают рассыпавшуюся мозаику битов? И зачем они это делают?
Почему исходники исчезают
Эпоха без архивации
В 1980-е и 1990-е годы никто не думал о сохранении исходного кода. Программисты работали на машинах, за которые сегодня коллекционеры отдают сотни фунтов. Исходники хранились на тех же дискетах и кассетах, что и сами программы. Никакого GitHub, никакого облака, никаких бэкапов.Что происходило с исходниками:
- Случайное стирание — автор случайно форматировал дискету
- Уход автора — программист умирал или уходил из индустрии, исходники оставались в никуда
- Коммерческая тайна — компании хранили исходники, но после банкротства они исчезали
- Физическая деградация — дискеты рассыпались, кассеты размагничивались
- Доработки без исходников — программу дописывали прямо в машинном коде, и исходник устаревал
Ирония судьбы
Парадокс: иногда декомпиляция происходила по недоразумению. Программисты считали исходники утерянными и начинали восстановление с нуля, а потом выяснялось, что оригинальный код всё это время лежал у них на полке. Так случилось с движком JPEG в программе JPEGIF laboratory, с архиватором UnRar и с ассемблером ALASM .В случае с ALASM ситуация была особенно забавной: исходники считались утерянными, программу много раз "ломали" и дописывали прямо в машинном коде, без исходника. Когда оригинал нашелся, он оказался бесполезен — настолько код ушел вперед .
Инструментарий реконструктора
От дампа к исходнику
Процесс восстановления начинается с получения дампа памяти — точной копии машинного кода, который выполнялся на Z80. Как получить этот дамп?- Из эмулятора — загрузить игру в эмуляторе и выгрузить память в файл
- С реального железа — использовать отладчик (STS в ПЗУ, теневой сервис-минитор)
- С кассеты — оцифровать запись в формат TZX/TAP и извлечь кодовые блоки
ZX Turbo Disassembler (ZXD)
Ключевой инструмент реконструктора — ZX Turbo Disassembler Алексея Иноземцева. Эта программа позволяет загрузить дамп памяти и автоматически преобразовать машинный код в мнемоники ассемблера.Автор Info Guide описывает рабочий процесс: "Пометьте средствами ZXD все данные (однобайтные DEFB, двухбайтные DEFW и длинные подгружаемые INCL), чтобы отделить их от кодов Z80. После первой грубой расстановки нажмите Make Labels в меню, и по меткам наверняка сможете найти ошибки в своем разбиении" .
SkoolKit — современный подход
Для более серьёзных проектов существует SkoolKit — коллекция утилит для дизассемблирования спектрумовских игр в формат "skool", который затем можно преобразовать в HTML-документацию или в пересобираемый ASM-файл .SkoolKit умеет:
- Конвертировать TAP/TZX в снапшоты
- Дизассемблировать SNA, Z80 и SZX форматы
- Отличать код от данных, используя карту выполнения, созданную эмулятором
- Создавать гиперссылки между подпрограммами
- Генерировать списки багов, фактов и POKE-кодов
Методология: как это делается
Процесс восстановления исходного кода — это не просто техническая операция, а настоящее детективное расследование. Вот основные этапы, описанные в Info Guide #06 .Этап 1: Получение дампа
"Программу во время работы лучше не выгружать — она может быть в это время неполноценная, с уничтоженной инициализацией, неправильным содержимым переменных и т.п." — предупреждает автор .Если в программе используются сложные структуры, расположенные вне кода (например, заголовки форматов), нужно добавить в конец дампа нули, чтобы потом не искать вручную все обращения к внешним данным .
Этап 2: Первичный дизассемблерный анализ
Загрузив дамп в ZXD, реконструктор вручную помечает, где код, а где данные. Это критически важный этап — если ошибиться, дальнейший анализ пойдет по ложному пути."Чем больше вы их исправите еще в ZXD, тем меньше придется вручную переводить из ассемблера в коды и обратно на следующих этапах, в ALASM" .
Этап 3: Сборка и проверка
Полученные тексты загружаются в ассемблер (обычно ALASM) и компилируются. На этом этапе реконструктор постоянно сверяет результат с оригинальным дампом.Ключевое правило: НИЧЕГО НЕ МЕНЯЙТЕ В ПРОГРАММЕ НА ЭТАПЕ СБОРКИ!
Автор делится горьким опытом: *"PT3 (самую мою первую декомпиляцию) я не сравнивал. Из-за этого сохранил больше ста промежуточных версий декомпилированных исходников (вдруг затру или попорчу что-то - откуда взять, с чем сверить?) Потом в течение кучи версий разгребал ошибки. Урок мне и вам"* .
Для сравнения используются специальные программы — "File Comparer". Автор рекомендует программу от Mayhem .
Этап 4: Именование меток
Машинный код оперирует адресами. Человеку удобнее работать с именами. Реконструктор даёт меткам осмысленные имена:- CLS — процедура очистки экрана
- DHL — какая-то подпрограмма с регистровой парой HL
- _867F — локальная метка (не используется вне процедуры)
Этап 5: Анализ констант
Константы переводятся в удобный вид: если байт используется как буква — он должен быть буквой, если как число — числом. Иногда десятичное представление понятнее шестнадцатеричного .Этап 6: Обработка особых случаев
В процессе всплывают странности:- а) ручная разметка части кода как данных
- б) код, работающий с неправильных адресов (DISP)
- в) области, перезаписываемые данными во время выполнения
- г) адреса, которые на самом деле являются константами
Кейс: Green Beret (Jonathan Smith)
Один из самых впечатляющих примеров реконструкции — восстановление исходного кода игры Green Beret, созданной Джонатаном "Джоффой" Смитом в 1986 году для Imagine Software .Проект на GitHub (Paulie68000/ZXSpectrumGreenBeret) представляет собой полностью восстановленный и задокументированный исходный код — третий в серии восстановленных игр Джоффы .
Что удалось узнать из кода?
Благодаря реконструкции мы теперь знаем, как Джоффа творил свою магию:Общие рутины (JOFFRUTS) — у Смита был набор общих процедур, которые он использовал во всех своих играх. Это позволяло ему выдавать конверсии с невероятной скоростью .
Экономия памяти на загрузчике — код для выбора метода управления и переопределения клавиш хранился в backbuffer'е игры. Как только игрок определялся с управлением, этот код и графика перезаписывались игрой .
Хитрости со скроллингом — игровое поле кажется высотой 144 пикселя (18 символов), но на самом деле игра прокручивает только 8 символов (64 пикселя). "Небо" (верхние 9 символов) статично, и только иногда, когда карта требует большей высоты (например, для ракетных шахт), игра вручную дописывает верхушки объектов прямо в "небо" .
Оптимизация спрайтов — в отличие от других игр Смита, спрайты в Green Beret не хранятся вместе с масками. Маски отдельно, спрайты отдельно. Почему? Чтобы использовать одни и те же маски для героя и врагов. Некоторые "вырезы" вокруг спрайтов кажутся слишком щедрыми — это было сделано специально, чтобы маски подходили всем .
Сжатие уровней — карты уровней сжаты до предела. Один байт данных уровня может описывать либо один тайл 8x8, либо целый блок тайлов размером до 32x32. Несколько декодеров распаковывают карту на лету .
Забавные находки
"Никто не заметил в рецензиях, но рекорд никогда не обновляется. Он установлен на 33,000 в начале игры, и хотя код проверяет счёт для выдачи новых жизней, строка рекорда никогда не обновляется" .Багу 40 лет, и только реконструкция исходного кода позволила его обнаружить!
Глава 5. Известные восстановленные проекты
Список программ, которые были восстановлены методом декомпиляции, впечатляет :| Программа | Оригинальный автор | Кто восстановил | Примечание |
|---|---|---|---|
| ALASM | ??? | Сообщество | Исходники считались утерянными, программу много раз дописывали в машинном коде |
| PT3 | ??? | Автор статьи из Info Guide | Первая декомпиляция автора, больше 100 промежуточных версий |
| PkUnZip | ??? | ??? | Декомпилирован |
| UnRar | ??? | ??? | Декомпилирован по недоразумению |
| RIP | ??? | ??? | Декомпилирован |
| Pusher | ??? | Оригинальный автор | Автор случайно стер исходник и восстановил декомпиляцией |
| ZX Word | ??? | ZS (Самара) | Адаптирован на основе декомпилированного авторского кода |
| MMCM player | Volga Soft | ZS (Самара) | ZIP-депакер основан на декомпилированном коде |
| JPEGIF laboratory | Sam Style | Sam Style | Начинался с декомпиляции JPEG viewer'а by Alien Factory |
Manic Miner и Skool Daze
Отдельного упоминания заслуживают полные дизассемблирования культовых игр, созданные с помощью SkoolKit:- Manic Miner — первая игра Мэттью Смита, полностью задокументирована
- Jet Set Willy — продолжение, также доступно в виде исходников
- Skool Daze и Back to Skool — легендарные школьные симуляторы
Сообщество и архивы
World of Spectrum
Главный архив всего, что связано с ZX Spectrum — World of Spectrum (WoS), основанный Мартином ван дер Хейде в 1995 году .Сайт содержит:
- Более 10 000 игр
- Более 2000 текстовых квестов
- Более 11 000 утилит и образовательных программ
- Архивы журналов, книг, работ демосцены
ZX-Art и Info Guide
Русскоязычное сообщество также активно участвует в сохранении наследия. Сайт ZX-Art содержит огромное количество материалов, включая электронные журналы, такие как Info Guide, откуда взята ценнейшая статья по декомпиляции .Современные форумы
Жизнь продолжается. В 2024 году, на фоне блокировок западных платформ, российские спектрумисты создали новую площадку — dragons-world.ru/forum, где программисты обмениваются опытом и исходниками .ZX Online — легальная дистрибуция
Интересный проект — ZX Online, где игры распространяются легально, с согласия авторов. Часть прибыли уходит разработчикам. В 2021 году через сайт прошло почти 4 миллиона рублей, 80% из которых выплачено авторам .
Почему они это делают?
Неравнодушие
"У вас душа не болит за эти программы?" — спрашивает автор Info Guide .И в этом вопросе — вся суть. Люди, восстанавливающие код, делают это не за деньги. Они делают это потому, что не могут иначе. Эти программы — часть их жизни, часть их молодости, часть культуры.
Образование
Исходники великих программистов — лучший учебник. Благодаря реконструкции Green Beret мы знаем, как Джоффа Смит оптимизировал код, как он экономил память, как он жонглировал спрайтами. Новое поколение разработчиков учится на этих примерах.Память
Когда умирает программист, умирает и его знание. Исходники — единственное, что остаётся. "Авторы, навсегда уходя в даун, забрасывают свои утилиты, плюют на пользователей и стирают исходники" .Реконструкторы возвращают эти программы к жизни. Они сохраняют память о тех, кто уже не может говорить сам.
Вызов
Наконец, это просто интересно. Разобраться в чужом коде, написанном 40 лет назад, понять ход мыслей автора, найти его ошибки и гениальные решения — что может быть увлекательнее для настоящего программиста?
Тёмная сторона: трудности и подводные камни
Ошибки дизассемблера
ZXD содержит ошибки. Например, "отрицательные смещения для IX и IY у него увеличены на 256". Если не знать этого, можно долго гадать, почему код не компилируется .Ложные метки
В процессе декомпиляции всплывают метки, которые вообще не должны быть метками:- а) вручную размеченный кусок кода как данные
- б) код, работающий с неправильных адресов (DISP)
- в) области, перезаписываемые во время выполнения
- г) константы, похожие на адреса
Несовместимость форматов
ZXD 1.0 выгружает текст в формате ZX-ASM со специальными табуляциями. Перед загрузкой в ALASM этот текст нужно обрабатывать — заменять табуляции пробелами. Автор делал это в ACEdit .Переполнение памяти
При попытке дизассемблировать большие программы в STS или DASM память под метки кончалась в самый неподходящий момент .
Эпилог. Код как артефакт
В 1986 году никто не думал, что машинный код станет музейным экспонатом. Джоффа Смит просто делал свою работу — писал игры, чтобы мальчишки по всему миру сбегали с уроков и играли в Green Beret.Прошли десятилетия. Джоффы нет. Его компьютера нет. Оригинальных дискет нет.
Но код живёт. Кто-то сел, загрузил дамп в дизассемблер, прошёлся по каждой инструкции, назвал метки, написал комментарии, выложил на GitHub. И теперь любой желающий может не просто поиграть в Green Beret, а понять, как она работает. Увидеть те самые хитрости с прокруткой, масками спрайтов и сжатием уровней.
Код Джоффы стал учебником для нового поколения программистов. И это — лучший памятник, который можно придумать.
Как сказано в Info Guide: "Так вот, давным-давно существует возможность оживить любой когда-либо написанный для ZX Spectrum проект!" .
И пока есть люди, которые этим занимаются, ни один проект не умрёт по-настоящему.
Список восстановленных игр и программ (упомянутых в статье)
| Название | Оригинальный автор | Год | Где искать исходники |
|---|---|---|---|
| Green Beret | Jonathan Smith | 1986 | GitHub: Paulie68000/ZXSpectrumGreenBeret |
| Manic Miner | Matthew Smith | 1983 | SkoolKit disassembly |
| Jet Set Willy | Matthew Smith | 1984 | SkoolKit disassembly |
| Skool Daze | Microsphere | 1984 | SkoolKit disassembly, Pyskool remake |
| Back to Skool | Microsphere | 1985 | SkoolKit disassembly, Pyskool remake |
| Contact Sam Cruise | Microsphere | 1986 | SkoolKit disassembly |
| ALASM | ??? | ??? | Восстановлен сообществом |
| PT3 | ??? | ??? | Восстановлен автором Info Guide |
| ZX Word | ??? | ??? | Восстановлен ZS из Самары |
| JPEGIF laboratory | Sam Style | ??? | Начинался с декомпиляции |
Источники и дополнительное чтение
- Info Guide #06: Декомпиляция программ ZX Spectrum для Возрождения
- GitHub: ZXSpectrumGreenBeret — полностью восстановленный исходный код
- World of Spectrum — крупнейший архив материалов по ZX Spectrum
- SkoolKit — инструментарий для дизассемблирования
- Pyskool — ремейк Skool Daze на Python
- ZX Online — легальная дистрибуция современных игр
© 2026, журнал «РетроКом». Эта статья — посвящение всем, кто восстанавливает код. Вы — археологи цифровой эпохи, и ваша работа бесценна.