🎯 Введение: Не состояние, а процесс

Все форматы, которые мы рассматривали ранее — .TZX, .SNA, .Z80, .TRD — так или иначе сохраняют данные или состояние системы в определённый момент времени. .RZX радикально отличается. Он не отвечает на вопрос «что?», а отвечает на вопрос «как?».

Формат .RZX (Recording ZX) — это формат записи действий пользователя. По сути, это макрокоманда, киносъёмка игрового процесса или скрипт с точной привязкой ко времени. Он фиксирует каждое нажатие клавиши, движение джойстика и даже момент сброса (RESET) с точностью до такта процессора, позволяя впоследствии абсолютно точно воспроизвести весь сеанс работы с эмулятором.

Его создание было продиктовано двумя основными потребностями сообщества:

  1. Верификация и тестирование эмуляторов: Можно ли считать эмулятор идеальным, если он не может в точности повторить запись игры, сделанную на другом эмуляторе или реальном железе?
  2. Сохранение и обмен игровыми прохождениями (longplays): Как доказать, что вы прошли игру без читов, и поделиться своим мастерством?

📜 История создания: Рождение стандарта

Формат .RZX был разработан в 2001 году группой энтузиастов во главе с Гарри О'Доннелом (Harry O'Donnell). Работа велась в тесном сотрудничестве с разработчиками ведущих эмуляторов того времени: Fuse, Spectaculator, Z80 и других.

Философия создания: Создать открытый, хорошо документированный формат, который стал бы единым стандартом для всех эмуляторов, прекратив «войну форматов» в этой нише. И это удалось — .RZX поддерживается всеми основными эмуляторами и по сей день.

Исходный код эталонного кодека и спецификации были опубликованы на сайте www.rzxarchive.co.uk, который стал центральным архивом для таких записей.

🔬 Архитектура формата: Контейнер с блоками

.RZX — это формат-контейнер, состоящий из последовательности блоков данных, очень похожий по идеологии на .TZX. Каждый блок имеет свой идентификатор и длину.

Структура заголовка RZX (блок 0x54 'RZXH')

Файл всегда начинается с сигнатуры и основного заголовка.
СмещениеДлинаЗначение / Описание
0x004 байтаСигнатура: ASCII-символы "RZX!".
0x041 байтМажорная версия формата (например, 0x01).
0x051 байтМинорная версия формата (например, 0x20 для версии 1.20).
0x064 байтаCRC32 заголовка. Для контроля целостности.
0x0A2 байтаДлина этого блока заголовка (обычно 0x00 0x1C = 28 байт).
0x0C4 байтаКоличество кадров записи (frames). Основная единица времени в RZX (обычно 50 Гц = 1/50 сек).
0x104 байтаСоздатель записи. Код программы-рекодера (например, 0x00 0x00 0x00 0x01 для Fuse).
0x141 байтФлаги записи (например, строгий режим, наличие snapshots).
0x1523 байтаРезерв для будущего использования.

Ключевые типы блоков данных в RZX-файле

После заголовка идут различные блоки, описывающие сценарий записи.
ID (Hex)Имя блокаНазначение
0x80SNAPSHOTВстраиваемый снапшот. Содержит полный снимок состояния системы (обычно в формате .Z80 или .SNA), с которого начинается воспроизведение. Критически важен!
0x81INPUT RECORDINGСамая важная часть — запись ввода. Содержит упакованные данные о всех действиях пользователя за определённый интервал времени.
0x82SECURITY SIGNATUREЦифровая подпись. Используется для верификации, что запись не была изменена после создания (для speedrun).
0x83CREATOR INFOИнформация о создателе. Может содержать имя автора, комментарии, эмулятор, версию.
0x84LEGACY SNAPSHOTУстаревший снапшот. Для совместимости со старыми версиями.

Детализация блока INPUT RECORDING (0x81)

Это сердце файла. Он содержит поток так называемых «изменений» (mutations). Каждая мутация — это событие, произошедшее в определённый момент времени (привязанное к конкретному такту эмуляции).

Структура потока ввода:
  1. Заголовок блока: ID (0x81) + длина блока.
  2. Последовательность кадров (frames): Время разбито на интервалы (по умолчанию 1/50 или 1/60 секунды, в зависимости от видеорежима).
  3. Внутри каждого кадра — список событий, каждое из которых содержит:
    • Смещение в тактах от начала кадра, когда произошло событие.
    • Тип события (например: 0x01 — нажатие клавиши, 0x02 — отпускание клавиши, 0x04 — сброс (RESET), 0x10 — чтение из порта Kempston джойстика и т.д.).
    • Данные события (например, код нажатой клавиши в матрице Spectrum).
Важный принцип: Запись ведётся не в абсолютных кодах клавиш, а в сырых (raw) значениях портов ввода. Это гарантирует, что воспроизведение будет корректным на любой модели Spectrum (с разной раскладкой клавиатуры) и с любым эмулятором, который точно эмулирует аппаратный ввод.

⚙️ Как работает запись и воспроизведение: Магия детерминизма

Процесс записи:

  1. Эмулятор в режиме записи (Record) начинает с сохранения снапшота текущего состояния.
  2. Далее он перехватывает все низкоуровневые события ввода с точной фиксацией момента (номера такта Z80), когда они произошли.
  3. Эти события упаковываются и периодически записываются в файл .RZX вместе с информацией о количестве прошедших тактов.
  4. В конце создаётся итоговый файл, содержащий начальный снапшот и всю ленту событий.

Процесс воспроизведения:

  1. Эмулятор в режиме воспроизведения (Playback) загружает начальный снапшот из файла .RZX, приводя систему в точное исходное состояние.
  2. Затем он начинает пошаговую эмуляцию, строго следуя временной шкале из файла.
  3. В моменты времени, указанные в записи, эмулятор применяет события ввода (нажимает и отпускает виртуальные клавиши) вместо того, чтобы опрашивать реальную клавиатуру пользователя.
  4. Если эмуляция идеальна, то через N тактов состояние эмулируемой машины будет бит в бит совпадать с состоянием машины, на которой велась запись.
Именно это делает RZX бесценным для тестирования: Если два разных эмулятора, загрузив один и тот же .RZX-файл, приходят к разным результатам, значит, хотя бы один из них содержит ошибку эмуляции.

🏆 Культурное значение: Спидраннинг и архив мастерства

Формат .RZX вышел за рамки чисто технического инструмента и породил целую субкультуру.

1. RZX как стандарт для спидраннинга на ZX Spectrum

Сообщество спидраннеров (скоростного прохождения) Spectrum быстро приняло .RZX в качестве золотого стандарта доказательства. Чтобы заявить о рекорде, необходимо предоставить .RZX-файл, который любой может проверить на своём эмуляторе.
  • Прозрачность: Любой может убедиться, что не использовались читы, сохранения или модификации игры.
  • Воспроизводимость: Рекорд можно «пересмотреть» как кино, изучая тактику.
  • Архив рекордов: Существуют сайты (например, тот же rzxarchive.co.uk), где хранятся записи лучших прохождений десятков игр.

2. Сохранение исторических артефактов

В .RZX записаны не только рекорды, но и:
  • Первые прохождения сложных игр.
  • Демонстрации скрытого контента (например, как увидеть «пасхальное яйцо»).
  • Записи с оригинального железа, сделанные через специальные адаптеры (важно для верификации эмуляции).

3. Инструмент реверс-инжиниринга

Изучая .RZX сложного игрового момента, разработчики эмуляторов могут понять, какое именно неэмулируемое поведение «ломает» воспроизведение, и исправить ошибку.

🔧 Работа с RZX: Практическое руководство

Создание записи (на примере эмулятора Fuse):

  1. Загрузите игру (например, с .TZX-файла).
  2. В меню выберите Media > Recording > Record....
  3. Укажите имя .RZX-файла. Эмулятор автоматически создаст снапшот и начнёт запись.
  4. Играйте. Все ваши действия записываются.
  5. Для остановки выберите Media > Recording > Stop.

Воспроизведение записи:

  1. В меню Fuse выберите Media > Recording > Play....
  2. Укажите .RZX-файл.
  3. Эмулятор загрузит начальное состояние и начнёт автоматическое проигрывание. Вы увидите «призрака», играющего за вас.

Конвертация и анализ:

Существуют утилиты командной строки из пакета rzxtools, позволяющие:

  • rzxinfo — вывести подробную информацию о файле.
  • rzxdump — преобразовать запись в текстовый формат (последовательность событий).
  • rzx2wav — преобразовать .RZX (вместе с привязанным снапшотом) обратно в .WAV-файл, как если бы игра шла с кассеты (для загрузки на реальный Spectrum).

⚖️ Сравнение с аналогами и уникальность


Формат / ПодходПринцип работыПреимуществаНедостатки
.RZXЗапись низкоуровневых событий ввода + начальный снапшот.Абсолютная точность, независимость от эмулятора, малый размер файла, идеален для тестирования и спидранна.Бесполезен без точного эмулятора; не содержит видео.
Видеозапись (AVI, MP4)Запись итогового видеосигнала.Универсальная воспроизводимость на любом плеере.Огромный размер, невозможно проверить на честность, зависит от скорости записи.
Скринкаст + снапшотВидео + приложенный файл состояния.Можно увидеть процесс и загрузить сохранение.Нет гарантии, что видео и снапшот синхронны; размер.
Инпут-реплей в современных эмуляторахАналогичен RZX, но в проприетарном формате эмулятора.Часто удобнее в использовании.Непереносимость между разными эмуляторами.

💎 Заключение: Больше чем файл — философия точности

Формат .RZX — это воплощение стремления сообщества ретрокомпьютинга к совершенству, прозрачности и сохранению. Он решает фундаментальную проблему: как объективно доказать, что что-то было сделано внутри виртуальной машины.

Он стоит на трёх китах:
  1. Детерминизм: Верит в то, что при идентичных начальных условиях и идентичных входных данных цифровая система даст идентичный результат.
  2. Верификация: Предоставляет инструмент для беспристрастной проверки этого результата.
  3. Наследие: Позволяет сохранять не просто данные, а сам процесс — мастерство игрока, хак программиста, глюк железа — в виде, который можно воспроизвести через десятилетия.
В мире, полном субъективных впечатлений и ностальгии, .RZX остаётся холодным, точным и неоспоримым цифровым нотариусом, фиксирующим подвиги в электронной вселенной ZX Spectrum.

Статья составлена на основе официальной спецификации формата RZX версии 1.20, документации эмулятора Fuse и материалов архива rzxarchive.co.uk.