🎯 Введение: Эпоха сжатия данных на 8-битной скорости​

Конец 1980-х и особенно 1990-е годы стали эпохой компьютерного «самиздата». Данные передавались через BBS (электронные доски) на скорости 2400 бод, а главной валютой обмена были дискеты ёмкостью 720 КБ. В этих условиях каждый килобайт имел значение, а термин «архиватор» ассоциировался не с WinRAR, а с умением упаковать коллекцию программ в один файл для удобства передачи.

Формат .SCL (предположительно, от Sinclair Compressed Library) родился как ответ на эту потребность в экосистеме TR-DOS — самой популярной дисковой операционной системы для ZX Spectrum. В отличие от своего собрата .TRD, который является точной, посекторной копией дискеты со всеми пустыми областями, .SCL — это продуманный архивный формат. Он сохраняет лишь суть — файлы и их каталоговую структуру, — отбрасывая всё лишнее, но сохраняя логику дискового хранения.

Простая аналогия: Если .TRD — это точная фотография полки с книгами (вместе с пустым пространством), то .SCL — это инвентарная опись этих книг, где для каждой указана полка и ряд. Для чтения опись бесполезна, но для переезда (передачи по модему) она незаменима.

📐 Техническая спецификация формата .SCL (исправленная и дополненная)​

Формат .SCL представляет собой жёстко структурированный двоичный файл, состоящий из заголовка, каталога, области данных и контрольной суммы. Его ключевая особенность — сохранение принципа секторного выравнивания, как на реальном диске TR-DOS.

1. Заголовок архива (9 байт)​

Файл однозначно идентифицируется своей сигнатурой.
СмещениеДлинаЗначение / Описание
0x008 байтСигнатура. Всегда ASCII-символы: "SINCLAIR". Это основной маркер формата.
0x081 байтКоличество файлов (NumFiles) в архиве. Допустимые значения: от 1 до 128.

Важно: Ранние описания могли указывать иную сигнатуру (0xFD, 0x06), но общепринятым и используемым всеми современными утилитами стандартом является именно строка "SINCLAIR".

2. Таблица описателей файлов (File Descriptors)​

Сразу после заголовка следует непрерывная таблица, содержащая ровно 16 байт на каждый файл. Эта запись является точной копией элемента каталога TR-DOS.

Структура дескриптора (16 байт):
СмещениеДлинаСодержимое (семантика TR-DOS)
0x001 байтПервый символ имени / Флаг. 0x00 — запись свободна, 0x01 — файл удалён, любое другое — первый символ имени.
0x018 байтСимволы имени 2-9 в ASCII. Дополняются пробелами (0x20).
0x091 байтТип/расширение файла. Закодирован одним символом:
"B" — Бейсик-программа
"C" — Код (машинная программа)
"D" — Числовой массив данных
"#" — Блок байтов (двоичный файл)
0x0A2 байтаДлина файла в байтах (Little Endian). Это реальный размер данных без учёта выравнивания.
0x0C2 байтаАдрес загрузки в памяти. Актуально для типов "C" и "#".
0x0E2 байтаПараметр. Зависит от типа:
- Для "B": Номер строки для автостарта (обычно 0x8000 = RUN)
- Для "C": Адрес запуска программы.

Общий размер таблицы: NumFiles * 16 байт.

3. Выравнивание каталога и начало данных​

Ключевой момент, который часто упускают: Архив имитирует структуру диска. Данные не могут начинаться посреди сектора.
  1. Рассчитывается размер служебной области: 9 + (NumFiles * 16) байт.
  2. Эта величина округляется ВВЕРХ до ближайшего кратного 256 (размеру одного сектора TR-DOS).
  3. Получившееся значение — это смещение в байтах от начала файла до данных первого файла.
Пример: Для 10 файлов размер служебной области = 9 + 160 = 169 байт. Ближайшее кратное 256 — это 256. Значит, между концом каталога и началом данных будет 87 байт заполнителя (padding), обычно нулей (0x00).

4. Область данных файлов с секторным выравниванием​

Данные каждого файла записываются последовательно, но с соблюдением жесткого правила выравнивания по границе 256-байтных секторов.
  • Каждый файл начинается с новой секторной границы.
  • Если фактические данные файла не заполняют последний сектор до конца, оставшаяся часть сектора дополняется нулевыми байтами (0x00).
  • Следующий файл всегда начинается со следующего сектора.
Формула для расчета смещения файла i (где i = 0 для первого файла):
Смещение_Файла_i = Выравненное_Смещение_Каталога + SUM(Выровненный_Размер_Файла_j) для j=0..i-1
где Выровненный_Размер_Файла = ((Длина_Файла + 255) / 256) * 256 (целочисленное деление с округлением вверх).

5. Контрольная сумма (2 байта)​

В самом конце .SCL-файла, после данных последнего выровненного файла, расположена контрольная сумма.

  • Алгоритм: 16-битная сумма (addition) всех байтов файла от начала ("SINCLAIR") и до конца данных последнего файла (включая все байты выравнивания!). Сама контрольная сумма в расчете не участвует.
  • Назначение: Проверка целостности архива после передачи по ненадёжному каналу связи. Утилиты конвертации (например, scl2trd) должны проверять эту сумму перед обработкой.

🧩 Визуализация полной структуры .SCL​

Код:
[ Заголовок (10b) ] [ Каталог (16b * N) ] [ Выравнивание_Каталога (0..255b) ]
       |                      |                         |
       v                      v                         v
  "SINCLAIR"+N           Дескриптор 0               Нули (0x00)
                        Дескриптор 1
                           ...
                        Дескриптор N-1
-------------------------------------------------------------------- (граница сектора)
[ Данные Файла 0 ] [ Выравнивание_Файла0 ] [ Данные Файла 1 ] [ Выравнивание_Файла1 ] ...
--------------------------------------------------------------------
[ ... ] [ Данные Файла N-1 ] [ Выравнивание_ФайлаN-1 ] [ Контрольная сумма (2b) ]

⚙️ Как работают утилиты:​

Алгоритм конвертации .SCL → .TRD, который реализует утилита scl2trd:

  1. Проверка: Чтение заголовка, проверка сигнатуры "SINCLAIR".
  2. Верификация: Расчет и проверка контрольной суммы файла.
  3. Создание образа диска: Создаётся заготовка .TRD-файла (обычно 655360 или 737280 байт, заполненных нулями или пустыми значениями).
  4. Формирование каталога: В первый сектор образа записывается заголовок TR-DOS (с меткой диска, если она была извлечена из имени архива или задана иначе) и преобразованные дескрипторы файлов.
  5. Распределение данных: Файлы из .SCL распаковываются (с учётом выравнивания) и записываются в свободные сектора образа .TRD в соответствии с алгоритмом размещения TR-DOS, формируя таблицу размещения файлов (FAT) в памяти эмулятора ОС.
  6. Финализация: Записываются служебные параметры в нулевой сектор (количество файлов, количество занятых секторов).
Обратный процесс (trd2scl) выполняет эти действия в обратном порядке: читает каталог .TRD, извлекает данные файлов, выравнивает их, рассчитывает и добавляет контрольную сумму, создавая компактный архив.

🔄 Сравнительная таблица: .SCL vs .TRD (с учётом правок)​

КритерийФормат .TRDФормат .SCL
ПриродаПосекторный образ диска. Аппаратно-ориентированный.Архив файлов с метаданными. Программно-ориентированный.
СтруктураЖёсткая сетка 80×2×16 секторов. Все сектора присутствуют.Гибкая: заголовок + каталог + данные, выровненные по секторам.
РазмерФиксированный: 655360 (640K) или 737280 (720K) байт.Переменный. Всегда меньше .TRD, так как нет пустых секторов между файлами.
Выравнивание данныхЕстественное, по определению.Явное. Каждый файл дополняется нулями до границы 256 байт.
Контроль целостностиНа уровне логики файловой системы TR-DOS.2-байтовая арифметическая контрольная сумма в конце файла.
Прямое использованиеМожно смонтировать в эмуляторе или записать на реальный диск.Нельзя использовать напрямую. Требует конвертации в .TRD.
Основное назначениеИсполнение: Загрузка и запуск программ.Транспортировка и хранение: Передача по сетям, создание бэкапов, архивация.

🛠️ Практическое применение и исторический контекст​

Почему .SCL стал популярен?​

  1. Экономия места на BBS: Скачивание одного 300 КБ .SCL вместо пяти 640 КБ .TRD экономило часы модемного времени.
  2. Удобство создания сборников: С помощью файловых менеджеров Spectrum (таких как популярный «Hobbit» или «Z», «ZXY») пользователь мог прямо на реальном Spectrum, не имея ПК, отобрать файлы в память и сохранить их в виде моноблока .SCL на виртуальный диск, создавая тематические сборники.
  3. Аппаратная независимость от Gotec: Как верно указал пользователь, аппаратные эмуляторы дисководов (на базе Gotec, DivIDE) часто работали только с .TRD. Необходимость конвертации .SCL → .TRD породила спрос на утилиты типа scl2trd, которые выполняли эту операцию на ПК перед записью на SD-карту.

Современное применение​

  • Основной формат онлайн-архивов: Крупнейшие репозитории софта для Spectrum (World of Spectrum) до сих пор хранят коллекции в .SCL как в основном, наиболее экономичном формате.
  • Удобство для разработчиков: Создатели новых ретро-игр часто распространяют свои работы в .SCL, так как это один файл, содержащий все необходимые компоненты (загрузчик, основной код, данные).

💎 Заключение: Бесшумный герой цифровой археологии​

Формат .SCL — это не просто «сжатый .TRD». Это инженерное решение, рождённое в условиях жёстких ограничений. Он воплощает в себе принципы, актуальные и сегодня: эффективное использование пространства, избыточность для контроля ошибок и чёткая, однозначная структура.

Благодаря своей продуманности, особенно наличию контрольной суммы и секторного выравнивания, он обеспечил не только компактность, но и надёжность, позволившую тысячам программ дойти до наших дней без искажений. Работа таких утилитариев, как scl2trd, написанных энтузиастами для преодоления аппаратных ограничений, — яркое свидетельство живучести и важности этого скромного формата в экосистеме ZX Spectrum.

.SCL — это мост. Мост между миром реального «железа» Spectrum и миром персональных компьютеров. Мост между эпохой дискет и эпохой интернета. И этот мост был построен на фундаменте восьми байт: SINCLAIR.