🎯 Введение: Самое ценное изображение​

В эпоху 8-битных компьютеров экран был не просто средством вывода информации — это было произведение инженерного искусства. Магия ZX Spectrum заключалась в том, как он из скромных 6912 байт памяти создавал узнаваемые, наполненные цветом и характером изображения. Сохранить это изображение — значит сохранить кульминационный момент игрового подвига или результат часов творческой работы в графическом редакторе.

Формат .SCR (Screen или Screenshot) — это, по сути, прямой дамп видеопамяти ZX Spectrum. Он появился как естественное решение для сохранения экранных изображений и стал стандартом де-факто, пережив десятилетия благодаря своей абсолютной простоте и прозрачности.

Если TZX — это сложная аудиозапись, а Z80 — полный слепок системы, то SCR — это моментальный снимок экрана в его самом чистом виде.

🔬 Анатомия формата: 6912 байт ностальгии​

Гениальность формата SCR в его отсутствии формата как такового. Файл .SCR не имеет заголовка, сигнатуры или метаданных. Это просто необработанная копия видеопамяти ZX Spectrum, записанная подряд в одном файле.

📐 Структура памяти экрана ZX Spectrum​

Чтобы понять .SCR, нужно понять организацию видеопамяти. Она разделена на три четкие области, которые в файле .SCR следуют строго друг за другом:
ОбластьРазмерАдреса в памяти SpectrumСодержимое
Битмап (Bitmap)6144 байта (6 КБ)0x4000 — 0x57FFЧёрно-белая информация о пикселях
Атрибуты цвета (Attributes)768 байт0x5800 — 0x5AFFЦветовая информация для знакомест 8×8 пикселей
Бесполезные байты (Unused)768 байт0x5B00 — 0x5CFFНе используется для отображения (часто содержит мусор)

Итого: 6144 + 768 + 768 = 7680 байт. Именно такого размера должен быть правильный, полный файл .SCR.

Однако многие утилиты и архивы (включая World of Spectrum) часто хранят усечённую версию размером 6912 байт (6144 + 768), игнорируя неиспользуемую область. Оба варианта считаются корректными, но полная 7680-байтная версия является технически более точной.

🧩 Детализация: Как устроен битмап​

Битмап (6144 байт) организован не интуитивно, что является фирменной особенностью Spectrum. Пиксельная информация хранится построчно, но строки идут в «зеброобразном» порядке.
  1. Экран делится на 24 строки по 8 пикселей в высоту (24 × 8 = 192 пикселя).
  2. В каждой такой строке хранятся 32 байта (32 × 8 = 256 пикселей в ширину).
  3. Порядок строк в памяти: 0, 8, 16, 1, 9, 17, 2, 10, 18... и так далее.
Эта «странная» организация была компромиссом для упрощения аппаратного генератора изображения, но она же создавала уникальный «spectrum-стиль» и усложняла жизнь программистам.

🎨 Детализация: Система атрибутов цвета​

Область атрибутов (768 байт) определяет цвет для каждого знакоместа 8×8 пикселей.
Каждый байт атрибута имеет следующую структуру:
Код:
7 6 5 4 3 2 1 0  (биты)
| | | | | | | |
| | | | | | | +-- Бит 0: Яркость (0=нормальная, 1=яркая)
| | | | | | +---- Бит 1: Красный (R)
| | | | | +------ Бит 2: Зелёный (G)
| | | | +-------- Бит 3: Синий (B)
| | | +---------- Бит 4: Флаг мигания (0=нет, 1=да)
| | +------------ Бит 5: Красный фона (R)
| +-------------- Бит 6: Зелёный фона (G)
+---------------- Бит 7: Синий фона (B)

  • Биты 1-3: Цвет чернил (красный, зелёный, синий). Комбинации дают 7 цветов + прозрачный (000).
  • Биты 5-7: Цвет бумаги (фона). Аналогично 7 цветов + чёрный (000).
  • Бит 0: Увеличивает яркость выбранного цвета чернил и фона.
  • Бит 4: Если установлен, цвета чернил и фона меняются местами с частотой ~1.5 Гц.
Знаменитый «цветовой конфликт» (color clash) возникает именно потому, что цвет задаётся не для пикселя, а для целого блока 8×8. Если в таком блоке нужно было использовать больше двух цветов, возникали артефакты, ставшие визитной карточкой эстетики Spectrum.

⚙️ Сравнение SCR с другими графическими форматами​

ФорматНазначениеРазмерОсобенности
.SCRДамп видеопамяти6912/7680 байтАбсолютно точное сохранение экрана, включая атрибуты и мусор. Не требует декодера.
.RAW / .PIXРастровое изображение~16 КБЧасто содержит распакованный, линейный растровый образ экрана (256×192×1 бит). Проще для отображения на современных системах, но теряет оригинальную структуру памяти.
.PNG / .GIFСовременный растровый форматЗависит от сжатияИспользуется современными эмуляторами для скриншотов. Содержит уже обработанное, «очищенное» изображение, часто с эмуляцией цветовых конфликтов. Не является историческим форматом.

Ключевое преимущество .SCR: Это не интерпретация, а первичный источник. Любое другое представление экрана Spectrum (PNG, GIF) является производным от .SCR или эмуляции.

🛠️ Практическое применение: От 1980-х до наших дней​

Историческое использование:​

  1. Графические редакторы: Программы like Artist, Paintbox, OCP Art Studio позволяли сохранять работы прямо в .SCR.
  2. Демосцена и пиксель-арт: Художники создавали сложные изображения, используя ограничения атрибутов как творческий вызов.
  3. Игровые скриншоты: Сохранение рекордов, финальных заставок.

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

  1. Заставки (Loading screens): Многие игры при загрузке с кассеты показывали статичную картинку. Эти заставки широко архивируются в .SCR.
  2. Ресурсы для разработки: Современные ретро-разработчики используют .SCR-файлы как готовые графические ресурсы для новых игр.
  3. Кросс-платформенный просмотр: Существуют просмотрщики .SCR для Windows, macOS, Linux и даже мобильных платформ.
  4. Конвертация и обработка: Инструменты позволяют конвертировать .SCR в PNG, редактировать атрибуты, применять фильтры для сглаживания цветовых конфликтов.

Пример кода на C для отображения .SCR (упрощённый):​

C:
// Загружаем файл .SCR в буфер scr_data
unsigned char scr_data[6912];
FILE *f = fopen("screen.scr", "rb");
if (f == NULL) {
    // Обработка ошибки открытия файла
    return 1;
}
size_t bytes_read = fread(scr_data, 1, 6912, f);
if (bytes_read != 6912) {
    // Обработка ошибки чтения (файл меньше 6912 байт)
    fclose(f);
    return 1;
}
fclose(f);

// Отображаем битмап
for (int y = 0; y < 192; y++) {
    for (int x = 0; x < 32; x++) { // x в байтах (0-31)
        // *** ИСПРАВЛЕНО: Расчет адреса пиксельного байта по формуле оппонента ***
        unsigned char pixel_byte = scr_data[ ((y & 0xC0) << 5) | ((y & 0x07) << 8) | ((y & 0x38) << 2) | x ];

        // Адрес атрибута (рассчитывается линейно, как у вас и было)
        int attr_y = y / 8;
        unsigned char attr = scr_data[6144 + (attr_y * 32) + x];

        // Здесь должен быть код для рисования 8 пикселей из pixel_byte
        // с использованием цвета из attr...
    }
}

🏛️ SCR в культуре и архивации​

World of Spectrum и другие архивы хранят тысячи файлов .SCR:
  • Заставки к играм — отдельными файлами.
  • Графические работы демосцены и художников.
  • Промо-материалы и титры игр.
Это не просто данные — это визуальная летопись эпохи. Просматривая .SCR-файлы, можно изучать эволюцию пиксель-арта, приёмы работы с ограничениями и эстетику 1980-х.

💎 Заключение: Вечная простота​

Формат .SCR — это, возможно, самый чистый и долговечный формат из всего наследия ZX Spectrum. В его простоте — сила. Он не зависит от версий, сложных заголовков или алгоритмов сжатия. 6912 байт, и ничего лишнего.

Он продолжает жить, потому что решает свою задачу идеально: сохраняет магию экрана Spectrum в её самой аутентичной форме. Каждый .SCR-файл — это не просто картинка, а кусочек работающей машины, цифровая голограмма, которая в любой момент может быть оживлена эмулятором или даже записана обратно в память настоящего «Спектрума».

Как фотография сохраняет момент реального мира, так и .SCR сохраняет момент мира виртуального — со всеми его артефактами, конфликтами и неповторимым шармом.

Статья составлена на основе технической документации с World of Spectrum (worldofspectrum.net), анализа исходного кода эмуляторов и спецификаций формата.