[Перевод] Как работал графический чип Super Nintendo: руководство по Super PPU
Описание концепций PPU
Super PPU
Super »Picture Processing Unit» — чип видеоконтроллера, обрабатывающий тайловую графику, плоскости скроллинга и спрайты SNES. По функциям схож с PPU консоли NES.
VRAM
VideoRAM — ОЗУ, используемое Super PPU. Содержит тайлы. В каждом режиме экрана используется собственный размер тайлов. Обычно это 8×8 или 16×16 пикселей на тайл. VRAM имеет объём 64 КБ.
OAM
«Object Attribute Memory» — содержит данные определений спрайтов. Может содержать данные не более чем 128 спрайтов. Схожа с OAM в NES, но более совершенная.
Данные OAM, хранящиеся для каждого спрайта
- Позиция спрайта по X (9 бит, 0–511 или $00-$1FF)
- Позиция спрайта по Y (8 бит, 0–239 или $00-$EF). Значения 0–239 находятся на экране, от -63 до -1 — «выше экрана», поэтому нижняя часть спрайта видна сверху экрана. Это подразумевает, что очень большой спрайт может начинаться внизу и заканчиваться наверху.
- ID первого тайла спрайта. 8-битный индекс
- Таблица имён спрайта
- ID палитры, используемой спрайтом (0–7/$00-$07). Спрайты используют индексы субпалитр в последних 8 субпалитрах, поэтому на самом деле используется ID, равный 7+N
- Размер спрайта. 1 бит: 0=для текущего режима доступен спрайт меньшего размера (обычно 1 тайл 16×16 пикселей), 1=для текущего режима доступен спрайт большего размера (обычно 4 тайлов (2×2 тайлов 16×16 пикселей))
- Приоритет спрайта. Приоритет в OAM: 2 бита; эти биты определяют приоритет спрайта относительно плоскостей фона (см. ниже раздел о плоскостях графики). Приоритет относительно других спрайтов. Нулевой спрайт в OAM имеет наивысший приоритет. Первый спрайт в OAM имеет более низкий приоритет. Второй — ещё более низкий, и так далее.
OAM Viewer эмулятора No$sns (SMW)
Два основных типа машин
NTSC-консоли
- «Super Nintendo (SNES)», 60-герцовые машины, в основном продававшиеся в США. Разрешение экрана 256×224 пикселя (как и у NTSC NES)
PAL-консоли
- «Super Famicom (SFC)», 50-герцовые машины, продававшиеся во всём остальном мире. Разрешение экрана 256×240 пикселей (как и у PAL Famicom)
Слева: NTSC Super Nintendo (Model 1), справа: PAL Super Famicom
Тайловые карты
SNES имела 7 разных «режимов» обработки фонов
- Они назывались Mode 0–7. Mode 1 имел режим варьирования. У Mode 7 был подрежим Mode 7 Ext. BG. В каждом режиме было своё количество доступных плоскостей фонов. У каждого режима было собственное количество цветов для плоскостей фонов, доступных в этом режиме. Свойства рендеринга каждого из фонов немного отличались. Во всех режимах и во всех плоскостях графики индекс цвета 0 в любой субпалитре всегда обозначал прозрачный цвет.
Сводная таблица режимов
4 плоскости графики
SNES могла обрабатывать до 4 плоскостей графики, имевших названия BG1-BG4. Эти плоскости графики могли прокручиваться (скроллиться).
Размеры тайловых карт
- Тайловые карты плоскостей скроллинга могли иметь размер 32×32, 32×64, 64×32 или 64×64 тайлов. В зависимости от размера каждого блока тайловой карты (блоки по 16×16 px/1 тайл или 32×32/2×2 тайлов), размер тайловой карты мог меняться от 256×256 до 1024×1024 пикселей
- Более подробную информацию о размерах тайлов в тайловых картах см. в разделе «Tile Maps & Character Maps» этой статьи
Свойства каждого тайла в тайловой карте
- V/HFlip тайла (отражение по вертикали/горизонтали)
- Приоритет тайла (низкий/высокий)
- Номер палитры (3 бита, 0–7/$00-$07). Плоскости используют первые 8 субпалитр CGRAM; вторые 8 субпалитр используются для спрайтов (OAM)
- ID тайла
Tilemap viewer для 4 фонов (BG) в SWM
Видеорежимы
Mode 0
- 4 фона (BG), каждый с 4 цветами
- Приоритет BG (спереди назад)
Mode 1
- 2 BG c 16 цветами
- 1 BG с 4 цветами
- Приоритет BG (спереди назад). Приоритет варьируется в зависимости от состояния бита 3 в регистре $2105.
Mode 2
- 2 BG с 16 цветами каждый
- Приоритет BG (спереди назад)
- Первый режим со «смещением на тайл» (подробнее см. в Mode 2)
Mode 3
- 1 BG с 256 цветами
- 1 BG с 16 цветами
- Приоритет BG (спереди назад)
- Доступен Direct Color Mode (регистр $2130)
Mode 4
- 1 BG с 256 цветами
- 1 BG с 4 цветами
- Приоритет BG (спереди назад)
- Второй режим со «смещением на тайл» (подробнее см. в Mode 4)
Mode 5
- 1 BG с 16 цветами
- 1 BG с 4 цветами
- Приоритет BG (спереди назад)
- «Mode 5 отличается от предыдущих режимов. Вместо стандартного тайла шириной 8/16 пикселей он всегда использует тайл шириной 16 пикселей (высота по-прежнему может быть 8 или 16) и пользуется только половиной пикселей (начиная с нуля, чётные пиксели для подэкранных тайлов, нечётные — для тайлов основного экрана). Затем он переключается в псевдо-hires для рендеринга растровой строки шириной 512-пикселя. Кроме того, если включен Interlace mode (см. бит 0 в регистре $2133), то экран в высоту вместо 224 или 239 составляет 448 или 478 полустрок. В каждом кадре отрисовываются или чётные, или нечётные строки, что определяется битом 7 в регистре $213f. Это также означает, что $212c и $212d можно присвоить одинаковое значение, чтобы получить «ожидаемый» дисплей».
Mode 6
- 1 BG с 16 цветами
- Приоритет BG (спереди назад)
- Особые свойства: как и Mode 5, имеет определённые отличия. Как и Mode 2, тоже является режимом со «смещением на тайл». «Однако стоит помнить, что в Mode 6 всегда используются тайлы шириной 8 пикселя (16 полупикселей), что относится к BG3, а также к BG1. Невозможно применить смещение к тайлу в 8 полупикселей или к области шириной 16 пикселей (только если не использовать два значения смещений для двух 8-пиксельных областей).»
Mode 7
- 1 BG с 256 цветами
- Сильно отличающийся режим; позволяет выполнять матричные преобразования слоя BG
- Используется для эффекта псевдо-3D в таких играх, как Super Mario Kart, FZero, и т.д.
- Все подробности см. в Mode 7
CGRAM
«Color Graphics RAM»
- Содержит информацию о цвете для палитр
- В сумме содержит 256 ($FF) записей цветов палитр.
- Каждый графический режим разделяет 256 записей палитр на подпалитры, в каждой из которых по N цветов. N зависит от видеорежима. По умолчанию каждая субпалитра состоит из 16 цветов (256 цветов/16 цветов на субпалитру = 16 субпалитр). По умолчанию первые 8 субпалитр (с ID 0–7/$00-$07, ID записей палитр 0–63/$00-$3F) используются для тайлов переднего плана (FG), а последние 8 субпалитр (ID субпалитр 8–16/$08-$10, ID записей палитр 64–127 или $40-$80) — для спрайтовых объектов. Первый цвет в субпалитре рендерится прозрачным для тайлов/спрайтов, использующих эту субпалитру
- 15-битный формат цвета BGR. Каждая запись цвета в CGRAM имеет формат 2 байта («слово») и вид 0BBBBBGG GGGRRRRR (B=биты синего, G=биты зелёного, R=биты красного). 16 бит, первый бит не используется, поэтому остаётся 15-битный диапазон цветов. Каждый компонент цвета (B, G, R) имеет значение в интервале 0–31 (десятичные) или $00-$1F (шестнадцатеричные)
Разбивка палитры SNES (Super Mario World в Palette viewer эмулятора no$sns)
Рекомендуемые инструменты для отладки и создания графики
Поиск хорошего ПО для создания ретро-графики, разделения пиксель-арта на тайлы и снижения количества цветов для обработки в различных видеорежимах SNES может оказаться сложным процессом. Ниже представлен список рекомендуемого ПО для работы с ретро-графикой и специализированных эмуляторов, позволяющих исследовать содержимое VRAM и плоскости.
ПО для графики:
YY-CHR
Irfanview
- Программа для просмотра/редактирования общего назначения, имеет плагины и широкую поддержку множества типов файлов
- Может редактировать, экспортировать и импортировать палитры, а также увеличивать/уменьшать количество цветов в изображениях и отображать это количество
- Свободное и открытое ПО
- Имеет PNG-плагин для изменения изменения глубины цвета с сохранением порядка палитры
- Домашняя страница
Рекомендуемые специализированные эмуляторы для отладки Super PPU
No$sns
- Эмулятор SNES, предназначенный для отладки
- Может эмулировать homebrew-прототипы SNES-CD Super Disc
- Может отображать состояние машины/ЦП
- На лету отображает слои BG
- Может отображать на лету OAM
- Может отображать содержимое тайлов VRAM в различных режимах цвета
- Может отображать содержимое CGRAM
- Информация
Higan
- Эмулятор различных ретро-консолей
- Имеет очень точную эмуляцию циклов оборудования SNES; используется для эмуляции/отладки аппаратных проблем SNES
- Информация