Введение: Зачем понадобились TZX и TAP?
В эпоху ZX Spectrum (1980-е) основной носитель данных — обычная компакт-кассета. Компьютер записывал на неё данные в виде последовательности импульсов разной длины. Каждая программа, будь то игровой «loader» или текст на BASIC, представляла собой уникальную «песню» из этих импульсов.С появлением эмуляторов в 1990-х годах возникла проблема: как сохранить эти аудиоданные в цифровом виде? Первым решением стал простой формат TAP (Tape), который фиксировал длину импульсов. Однако он не мог корректно сохранить многие сложные методы защиты от копирования, использующие нестандартные скорости загрузки, паузы или специальные сигналы.
Формат TZX (Tape Image for ZX Spectrum) был создан в 1996-97 годах как универсальный контейнер, способный сохранить любую кассетную запись со 100% точностью, включая все тонкости оригинального «железа». Если TAP — это фотография процесса загрузки, то TZX — это его полная видеозапись со всеми деталями.
Формат TAP: Простота и ограничения
Формат TAP был разработан Гунарсом Бриедисом (Gunar`s Briedis) для эмулятора ZX32. Это первый широко принятый формат образов кассет.Структура TAP-файла
Файл представляет собой простую последовательность блоков данных. Каждый блок имеет следующую структуру:| Смещение | Длина (байт) | Описание |
|---|---|---|
| 0x00 | 2 | Длина этого блока данных (младший байт первый, Little Endian) |
| 0x02 | N | Непосредственно данные блока (как они были на кассете) |
Принцип работы
- Компьютер (или эмулятор) читает первые два байта, определяя длину следующего фрагмента.
- Считываются N байт данных.
- Процесс повторяется до конца файла.
- Биту 0 соответствуют 2 импульса (высокий/низкий уровень) общей длиной ~855 тактов процессора Z80 (при стандартной скорости).
- Биту 1 соответствуют 2 импульса общей длиной ~1710 тактов (вдвое дольше).
Формат TZX: Универсальный контейнер для кассетного наследия
Формат TZX был создан Томашем Вилладжи (Tomasz Viladys) при участии сообщества энтузиастов. Его философия — не просто хранить данные, а точно воспроизводить временную шкалу и все характеристики оригинального аудиопотока с кассеты.Структура заголовка TZX
Каждый TZX-файл начинается со специальной сигнатуры, идентифицирующей его тип и версию.| Смещение | Длина | Значение | Описание |
|---|---|---|---|
| 0x00 | 7 байт | ZXTape! | Сигнатура формата (ASCII-строка) |
| 0x07 | 1 байт | 0x1A | Маркер конца заголовка (Ctrl+Z) |
| 0x08 | 1 байт | 0x01 | Мажорный номер версии формата (напр., 1) |
| 0x09 | 1 байт | 0x14 | Минорный номер версии формата (напр., 20 для версии 1.20) |
После заголовка идёт последовательность блоков данных. Ключевая мощь TZX заключается в разнообразии этих блоков. На сегодняшний день спецификация определяет более 20 различных типов блоков.
Основные типы блоков в TZX (выдержка из спецификации)
Вот некоторые из самых важных и показательных типов блоков, демонстрирующих возможности формата:| ID (Hex) | Название блока | Краткое назначение | Почему это важно |
|---|---|---|---|
| 0x10 | Standard Speed Data Block | Блок стандартных данных (аналог TAP) | Базовый блок для обычных программ. |
| 0x11 | Turbo Speed Data Block | Блок данных с настраиваемой скоростью | Позволяет точно сохранить игры с ускоренной или замедленной загрузкой. |
| 0x12 | Pure Tone | Генерирует тон заданной длины и частоты | Используется для создания лидирующих сигналов (пилотонов) перед данными. |
| 0x13 | Pulse Sequence | Последовательность импульсов произвольной длины | Критически важен для воспроизведения нестандартных аппаратных защит. |
| 0x14 | Pure Data Block | Блок данных с точными параметрами | Хранит данные, где важна длительность не только импульсов, но и пауз. |
| 0x20 | Pause (Stop the Tape) | Команда паузы/остановки ленты | Эмулирует нажатие STOP на магнитофоне между частями записи. |
| 0x21 | Group Start | Начало именованной группы блоков | Позволяет логически группировать части многочастейной записи (Игра + Trainer). |
| 0x22 | Group End | Конец группы блоков | |
| 0x30 | Text Description | Текстовое описание | Позволяет добавить комментарии, информацию о дампе, авторские права. |
| 0x32 | Archive Info | Расширенная информация об архиве | Может содержать год выпуска, издателя, тип ПО, жанр, системные требования. |
| 0x35 | Custom Info Block | Блок для произвольных данных | Предоставляет разработчикам инструментов гибкость для своих нужд. |
Пример: Анатомия блока стандартных данных (ID 0x10)
Этот блок наиболее близок к тому, как работает TAP, но в рамках контейнера TZX.
Код:
+------------------+ Байт 0x10 (ID блока)
| Длина паузы | 2 байта (длительность паузы ПОСЛЕ этого блока, в миллисекундах)
+------------------+
| Длина данных | 2 байта (N = длина следующего за заголовком фрагмента данных)
+------------------+
| |
| Данные (N) | Непосредственно данные программы
| |
+------------------+
Детальная структура и контрольная сумма в формате TAP
Пользователь абсолютно прав. Формат .TAP сложнее, чем просто «длина + данные». Он напрямую имитирует структуру данных, как они записывались на кассету ZX Spectrum, включая механизм проверки ошибок.Согласно спецификации (источник: ZX Spectrum FAQ / Reference), каждый блок данных в .TAP-файле точно соответствует одному кассетному блоку, который компьютер записывал или считывал. Эта структура включает в себя два типа блоков и обязательную контрольную сумму.
1. Структура ПОЛНОГО кассетного блока в TAP-файле
Внутри одного блока .TAP, заданного двухбайтовой длиной, находится следующий набор данных:Где:
- Длина блока (Little Endian): Длина всего последующего содержимого, включая флаг, данные и контрольную сумму. То есть: Длина = 1 + N + 1.
- Флаг (Flag): Определяет тип данных в блоке.
- 0x00 (HEADER): Блок содержит заголовок программы (имя, тип, параметры загрузки).
- 0xFF (DATA): Блок содержит непосредственно байты программы (код) или числового массива.
- Данные: Полезная нагрузка. Для HEADER — это 17 байт структурированной информации. Для DATA — это байты самой программы.
- Контрольная сумма (Checksum): Рассчитывается как байт XOR всех байтов в поле Данные. Для HEADER — XOR 17 байт. Для DATA — XOR всех N байт кода.
2. Детальный разбор структуры HEADER-блока (Флаг = 0x00)
Если флаг указывает на заголовок, то поле данных всегда имеет длину 17 байт и следующую структуру:| Смещение | Длина | Описание |
|---|---|---|
| 0 | 1 байт | Тип файла: 0=Программа, 1=Числовой массив, 2=Символьный массив, 3=Блок кода. |
| 1 | 10 байт | Имя файла в кодировке ZX Spectrum (обычно заполнено до длины пробелами). |
| 11 | 2 байта | Длина поля данных следующего DATA-блока (для типов 1,2,3). Для типа 0 (программа) — длина программы. |
| 13 | 2 байта | Параметр 1: - Для программы ( 0): Адрес автостарта (обычно 0x8000 для RUN).- Для блока кода ( 3): Адрес загрузки. |
| 15 | 2 байта | Параметр 2: - Для программы ( 0): Длина программы (дублирует поле по смещению 11).- Для блока кода ( 3): Обычно 0x8000 (не используется). |
Пример: HEADER для простой программы BASIC будет содержать длину программы, её имя и адрес автостарта 0x8000.
3. Практическое значение контрольной суммы
- Обнаружение ошибок чтения: Контрольная сумма была основным механизмом защиты от помех на кассете. Современные .TAP-файлы, созданные с правильной контрольной суммой, гарантируют, что эмулятор (или программатор ПЗУ) будет вести себя так же, как оригинальный ROM Spectrum.
- Валидация файлов: Утилиты для работы с .TAP (например, tapinfo) проверяют контрольные суммы, чтобы определить целостность архива. Битый .TAP-файл с неверной суммой может не загрузиться даже в эмуляторе.
- Отличие от «сырых» данных: Простая последовательность байтов программы без заголовков и контрольных сумм — это не валидный .TAP. Именно наличие этой структуры делает .TAP полноценным форматом образа кассеты, а не просто контейнером.
Сравнительная таблица: TAP vs TZX
| Критерий | Формат TAP | Формат TZX |
|---|---|---|
| Основная цель | Простое хранение данных кассеты | Точное сохранение сигнала кассеты |
| Поддержка скоростей | Только одна, стандартная | Любые скорости (Turbo, Slow, настраиваемые) |
| Специальные сигналы | Нет | Да (Pure Tone, Pulse Sequences) |
| Паузы и управление | Ограниченно | Полный контроль (паузы, остановки, группы) |
| Метаданные | Нет | Богатые (описание, информация об архиве) |
| Сложность обработки | Очень простая | Сложная, требует полноценного «виртуального магнитофона» |
| Типичное использование | Простые программы, файлы BASIC | Игры с защитой, коммерческий софт, архивные дампы |
| Структура блока | Жёсткая: Длина + [Флаг + Данные + Контр. сумма] | Гибкая: ID блока + Длина + Специфичные данные |
| Контроль ошибок | Встроенная байт-XOR сумма в каждом блоке | Зависит от типа блока. Данные копируются «как есть», включая оригинальные ошибки с кассеты. |
| Типы данных | Два типа: HEADER (0x00) и DATA (0xFF) | Более 20 типов (тон, пауза, данные со скоростью и др.) |
| Проверка целостности | Возможна на уровне логики данных (проверить сумму) | Возможна только на уровне контейнера (целостность потока байтов) |
Практическое значение для сообщества
Создание и поддержка формата TZX решили несколько фундаментальных задач:- Сохранение цифрового наследия: Благодаря TZX удалось сделать и сохранить точные дампы тысяч игр, которые в формате TAP были бы искажены или вообще неработоспособны.
- Развитие точной эмуляции: Эмуляторы, поддерживающие TZX (такие как Fuse, SpecEmu, ZXSpin), смогли достичь невиданной ранее точности в воспроизведении процесса загрузки, вплоть до характерных «скрипов» и пауз оригинальных кассет.
- Исследование защит: Формат стал инструментом для изучения исторических методов защиты ПО. Анализируя блоки Pulse Sequence или Pure Tone в дампе редкой игры, энтузиасты могут понять, как работала оригинальная защита.
- Создание новых «релизов»: Демосцена и ретро-разработчики используют TZX для распространения своих новых игр и демо, точно контролируя, как их творение будет «звучать» при загрузке.
Работа с форматами сегодня
Современный инструментарий для работы с TZX/TAP обширен:- Эмуляторы: Практически все современные эмуляторы ZX Spectrum (Fuse, Retro Virtual Machine) поддерживают оба формата, но TZX является предпочтительным для архивов.
- Конвертеры: Существуют утилиты (like tzx2wav, tap2tzx) для преобразования между TZX, TAP и реальными аудиофайлами (WAV), которые можно записать на кассету и загрузить на реальный Spectrum.
- Анализаторы: Специализированные программы (например, TzxDupe) позволяют просматривать внутреннюю структуру TZX-файла, изучать типы блоков и их параметры.
Заключение
Эволюция от TAP к TZX — это путь от простой оцифровки данных к комплексному сохранению цифрового артефакта во всей его сложности. TAP был важным первым шагом, но именно TZX, с его философией абсолютной точности и расширяемой структурой, стал тем стандартом, который позволил сохранить «живой звук» эпохи ZX Spectrum для будущих поколений.Если вы сегодня загружаете в эмуляторе классическую игру и слышите точь-в-точь тот же скрип, те же паузы и тот же ритм загрузки, что и на настоящем компьютере 40 лет назад, — это заслуга именно формата TZX и сообщества, которое его создало и поддерживает.
Статья составлена на основе анализа официальной спецификации формата TZX (версия 1.20) с сайта World of Spectrum (https://worldofspectrum.net/TZXformat.html).