17710535830256-png.7467


Автор: [TapeLoader]
Специально для журнала «РетроКом»


🔍 Пролог. Код, которого нет​

Представьте картину: 1986 год. Молодой программист Джонатан "Джоффа" Смит сидит в офисе Ocean Software и на ассемблере Z80 пишет код для игры Green Beret. Он не думает о том, что через 40 лет его исходники станут музейным экспонатом. Он думает о том, как уместить четыре уровня в 48 килобайт и заставить игру работать с частотой 25 кадров в секунду.

Проходят десятилетия. Джоффы Смита нет в живых. Оригинальные исходники утеряны — стерты с дискет, сгнили на кассетах, выброшены при переездах.

Но Green Beret живёт. Исходный код восстановлен по машинному коду, откомментирован, выложен на GitHub и доступен каждому .

Как это стало возможным? Кто эти люди, которые собирают рассыпавшуюся мозаику битов? И зачем они это делают?

🧬 Почему исходники исчезают​

Эпоха без архивации​

В 1980-е и 1990-е годы никто не думал о сохранении исходного кода. Программисты работали на машинах, за которые сегодня коллекционеры отдают сотни фунтов. Исходники хранились на тех же дискетах и кассетах, что и сами программы. Никакого GitHub, никакого облака, никаких бэкапов.

Что происходило с исходниками:
  • Случайное стирание — автор случайно форматировал дискету
  • Уход автора — программист умирал или уходил из индустрии, исходники оставались в никуда
  • Коммерческая тайна — компании хранили исходники, но после банкротства они исчезали
  • Физическая деградация — дискеты рассыпались, кассеты размагничивались
  • Доработки без исходников — программу дописывали прямо в машинном коде, и исходник устаревал
Автор статьи в Info Guide #06 описывает типичную ситуацию: "Много уже давно начатых проектов простаивает. Авторы, навсегда уходя в даун, забрасывают свои утилиты, плюют на пользователей и стирают исходники. У вас душа не болит за эти программы? Иногда не хватает, казалось бы, мелочи-другой, а написаны горы кода, заново делать то же самое обидно..."

Ирония судьбы​

Парадокс: иногда декомпиляция происходила по недоразумению. Программисты считали исходники утерянными и начинали восстановление с нуля, а потом выяснялось, что оригинальный код всё это время лежал у них на полке. Так случилось с движком JPEG в программе JPEGIF laboratory, с архиватором UnRar и с ассемблером ALASM .

В случае с ALASM ситуация была особенно забавной: исходники считались утерянными, программу много раз "ломали" и дописывали прямо в машинном коде, без исходника. Когда оригинал нашелся, он оказался бесполезен — настолько код ушел вперед .

🛠️ Инструментарий реконструктора​

От дампа к исходнику​

Процесс восстановления начинается с получения дампа памяти — точной копии машинного кода, который выполнялся на Z80. Как получить этот дамп?
  1. Из эмулятора — загрузить игру в эмуляторе и выгрузить память в файл
  2. С реального железа — использовать отладчик (STS в ПЗУ, теневой сервис-минитор)
  3. С кассеты — оцифровать запись в формат TZX/TAP и извлечь кодовые блоки
Автор статьи в Info Guide советует: "Прервите загрузчик нужной вам программы после распаковки всех кодовых блоков, выгрузите главный кодовый блок (программу как таковую) с нужным стартовым адресом. Этот блок вы будете декомпилировать" .

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-кодов
С помощью SkoolKit были восстановлены такие легендарные игры, как Skool Daze, Back to Skool, Contact Sam Cruise, Manic Miner и Jet Set Willy .

🔬 Методология: как это делается​

Процесс восстановления исходного кода — это не просто техническая операция, а настоящее детективное расследование. Вот основные этапы, описанные в Info Guide #06 .

Этап 1: Получение дампа​

"Программу во время работы лучше не выгружать — она может быть в это время неполноценная, с уничтоженной инициализацией, неправильным содержимым переменных и т.п." — предупреждает автор .

Если в программе используются сложные структуры, расположенные вне кода (например, заголовки форматов), нужно добавить в конец дампа нули, чтобы потом не искать вручную все обращения к внешним данным .

Этап 2: Первичный дизассемблерный анализ​

Загрузив дамп в ZXD, реконструктор вручную помечает, где код, а где данные. Это критически важный этап — если ошибиться, дальнейший анализ пойдет по ложному пути.

"Чем больше вы их исправите еще в ZXD, тем меньше придется вручную переводить из ассемблера в коды и обратно на следующих этапах, в ALASM" .

Этап 3: Сборка и проверка​

Полученные тексты загружаются в ассемблер (обычно ALASM) и компилируются. На этом этапе реконструктор постоянно сверяет результат с оригинальным дампом.

Ключевое правило: НИЧЕГО НЕ МЕНЯЙТЕ В ПРОГРАММЕ НА ЭТАПЕ СБОРКИ!

Автор делится горьким опытом: *"PT3 (самую мою первую декомпиляцию) я не сравнивал. Из-за этого сохранил больше ста промежуточных версий декомпилированных исходников (вдруг затру или попорчу что-то - откуда взять, с чем сверить?) Потом в течение кучи версий разгребал ошибки. Урок мне и вам"* .

Для сравнения используются специальные программы — "File Comparer". Автор рекомендует программу от Mayhem .

Этап 4: Именование меток​

Машинный код оперирует адресами. Человеку удобнее работать с именами. Реконструктор даёт меткам осмысленные имена:
  • CLS — процедура очистки экрана
  • DHL — какая-то подпрограмма с регистровой парой HL
  • _867F — локальная метка (не используется вне процедуры)
Для определения частоты использования меток используется хитрый приём: символ L в имени заменяется на что-то другое, и программа перекомпилируется. Количество ошибок показывает, сколько раз метка используется .

Этап 5: Анализ констант​

Константы переводятся в удобный вид: если байт используется как буква — он должен быть буквой, если как число — числом. Иногда десятичное представление понятнее шестнадцатеричного .

Этап 6: Обработка особых случаев​

В процессе всплывают странности:
  • а) ручная разметка части кода как данных
  • б) код, работающий с неправильных адресов (DISP)
  • в) области, перезаписываемые данными во время выполнения
  • г) адреса, которые на самом деле являются константами
Каждый случай требует индивидуальной проверки. В ALASM есть текстовый поиск — он помогает найти все обращения к подозрительной метке .

🎮 Кейс: 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 playerVolga SoftZS (Самара)ZIP-депакер основан на декомпилированном коде
JPEGIF laboratorySam StyleSam StyleНачинался с декомпиляции JPEG viewer'а by Alien Factory

Manic Miner и Skool Daze​

Отдельного упоминания заслуживают полные дизассемблирования культовых игр, созданные с помощью SkoolKit:
  • Manic Miner — первая игра Мэттью Смита, полностью задокументирована
  • Jet Set Willy — продолжение, также доступно в виде исходников
  • Skool Daze и Back to Skool — легендарные школьные симуляторы
На основе этих дизассемблирований были созданы даже современные ремейки. Например, Pyskool — переосмысление Skool Daze на Python с использованием Pygame, полностью основанное на восстановленном коде оригинала .

🌍 Сообщество и архивы​

World of Spectrum​

Главный архив всего, что связано с ZX Spectrum — World of Spectrum (WoS), основанный Мартином ван дер Хейде в 1995 году .

Сайт содержит:
  • Более 10 000 игр
  • Более 2000 текстовых квестов
  • Более 11 000 утилит и образовательных программ
  • Архивы журналов, книг, работ демосцены
WoS получил официальное разрешение от Amstrad на распространение ПЗУ Spectrum, что делает эмуляцию полностью легальной .

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 BeretJonathan Smith1986GitHub: Paulie68000/ZXSpectrumGreenBeret
Manic MinerMatthew Smith1983SkoolKit disassembly
Jet Set WillyMatthew Smith1984SkoolKit disassembly
Skool DazeMicrosphere1984SkoolKit disassembly, Pyskool remake
Back to SkoolMicrosphere1985SkoolKit disassembly, Pyskool remake
Contact Sam CruiseMicrosphere1986SkoolKit disassembly
ALASM??????Восстановлен сообществом
PT3??????Восстановлен автором Info Guide
ZX Word??????Восстановлен ZS из Самары
JPEGIF laboratorySam Style???Начинался с декомпиляции

🔗 Источники и дополнительное чтение​

  • Info Guide #06: Декомпиляция программ ZX Spectrum для Возрождения
  • GitHub: ZXSpectrumGreenBeret — полностью восстановленный исходный код
  • World of Spectrum — крупнейший архив материалов по ZX Spectrum
  • SkoolKit — инструментарий для дизассемблирования
  • Pyskool — ремейк Skool Daze на Python
  • ZX Online — легальная дистрибуция современных игр

© 2026, журнал «РетроКом». Эта статья — посвящение всем, кто восстанавливает код. Вы — археологи цифровой эпохи, и ваша работа бесценна.