Спрайты
ZX Spectrum Next имеет аппаратную систему спрайтов со следующими характеристиками:
- Всего 128 спрайтов
- Область отображения 320×256, перекрывающая ULA экран на 32 пикселя с каждой стороны
- Минимум 100 спрайтов на строку развертки†
- Выбор из 512 цветов для каждого пикселя
- Размер каждого спрайта 16×16 пикселей, но спрайты могут быть увеличены в 2, 4 или 8 раз по горизонтали и вертикали
- Спрайты могут быть зеркально отражены и повернуты
- Спрайты могут быть сгруппированы вместе для формирования более крупных спрайтов под управлением одного якоря
- 16K памяти паттернов может содержать 64 8-битных изображений спрайтов или 128 4-битных изображений спрайтов и комбинации между ними
- Смещение палитры для каждого спрайта позволяет спрайтам использовать общие изображения, но раскрашивать их по-разному
- Интерфейс nextreg позволяет copper перемещать спрайты во время видеокадра
† Гарантируется отображение минимум 100 спрайтов 16×16 в любой строке развертки. Любые дополнительные спрайты не будут отображаться аппаратно, что гарантирует, что спрайты не будут частично прорисованы.
Фактический предел определяется количеством тактов с частотой 28 МГц в строке развертки. Аппаратное обеспечение спрайтов способно прорисовать один пиксель за такт и использует один такт для проверки каждого спрайта. Поскольку количество тактов в строке развертки варьируется в зависимости от таймингов видео (HDMI, VGA), количество пикселей, которые можно прорисовать, также варьируется, но минимум составит 1600 пикселей на строку, включая такты накладных расходов, необходимые для проверки 100 спрайтов. Поскольку спрайты, увеличенные по горизонтали, включают прорисовку большего количества пикселей, спрайты x2 x4 x8 требуют больше тактов для прорисовки, и наличие этих спрайтов в строке приведет к уменьшению общего количества спрайтов, которые можно прорисовать.
Содержание
- Паттерны спрайтов
Паттерны спрайтов
Паттерны спрайтов - это изображения, которые может принимать каждый спрайт. Изображения хранятся в памяти объемом 16 КБ внутри FPGA и идентифицируются по номеру паттерна. Конкретный спрайт выбирает паттерн, сохранив номер паттерна в своих атрибутах.
Все спрайты имеют размер 16×16 пикселей, но бывают двух видов: 4-битные и 8-битные. Разрядность описывает, сколько бит используется для кодирования цвета каждого пикселя.
8-битный спрайт использует целый байт для окраски каждого из своих пикселей, так что каждый пиксель может быть одним из 256 цветов. В этом случае спрайту размером 16×16 требуется 256 байт памяти паттернов для хранения своего изображения.
4-битный спрайт использует полубайт для окраски каждого из своих пикселей, так что каждый пиксель может быть одним из 16 цветов. В этом случае спрайту 16×16 требуется всего 128 байт памяти паттернов для хранения своего изображения.
Память паттернов объемом 16 КБ может содержать любую комбинацию этих изображений, будь то 128 байт или 256 байт, и их расположение в памяти паттернов описывается номером паттерна. Этот номер паттерна состоит из 7 бит, биты называются следующим образом:
Номер паттерна
N5 N4 N3 N2 N1 N0 N6
N6, несмотря на название, является младшим значащим битом.
Этот 7-битный номер паттерна может идентифицировать 128 паттернов в памяти паттернов 16k, каждый из которых имеет размер 128 байт. Таким образом, все 7 бит используются для 4-битных спрайтов.
Для 8-битных спрайтов N6=0 всегда. Остальные 6 бит могут идентифицировать 64 паттерна, каждый из которых имеет размер 256 байт.
Биты N5:N0,N6 хранятся в атрибутах конкретного спрайта, чтобы идентифицировать, какое изображение использует спрайт.
8-битные паттерны спрайтов
Изображение размером 16×16 пикселей использует 8 бит для каждого пикселя, поэтому каждый пиксель может быть одним из 256 цветов. Один цвет указывает на прозрачность, и он запрограммирован в регистре индекса прозрачности спрайта (nextreg 0x4B). По умолчанию прозрачный индекс равен 0xE3.
В качестве примера 8-битного спрайта давайте посмотрим на спрайт ниже:
Пример паттерна
Используя палитру по умолчанию, которая инициализируется цветами RGB332 от 0 до 255, шестнадцатеричные значения для этого паттерна, расположенные в массиве 16×16, показаны ниже:
04040404040404E3E3E3E3E3E3E3E3E3
04FFFFFFFFFF04E3E3E3E3E3E3E3E3E3
04FFFBFBFBFF04E3E3E3E3E3E3E3E3E3
04FFFBF5F5FBFF04E3E3E3E3E3E3E3E3
04FFFBF5A8A8FBFF04E3E3E3E3E3E3E3
04FFFFFBA844A8FBFF04E3E3E3E3E3E3
040404FFFBA844A8FBFF04E3E3E3E3E3
E3E3E304FFFBA84444FBFF04E304E3E3
E3E3E3E304FFFB444444FBFF044D04E3
E3E3E3E3E304FFFB44444444FA4D04E3
E3E3E3E3E3E304FFFB44FFF54404E3E3
E3E3E3E3E3E3E304FF44F5A804E3E3E3
E3E3E3E3E3E3E3E304FA4404A804E3E3
E3E3E3E3E3E3E3044D4D04E304F504E3
E3E3E3E3E3E3E3E30404E3E3E304FA04
E3E3E3E3E3E3E3E3E3E3E3E3E3E30404
Здесь 0xE3 используется в качестве прозрачного индекса.
Эти 256 байт будут храниться в памяти паттернов в порядке слева направо, сверху вниз.
4-битные паттерны спрайтов
Изображение размером 16×16 пикселей использует 4 бита для каждого пикселя, поэтому каждый пиксель может быть одним из 16 цветов. Один цвет указывает на прозрачность, и он запрограммирован в нижних 4 битах регистра индекса прозрачности спрайтов (nextreg 0x4B). По умолчанию значение прозрачности равно 0x3. Обратите внимание, что тот же регистр используется совместно с 8-битными паттернами для идентификации прозрачного индекса.
Поскольку каждый пиксель занимает только 4 бита, два пикселя хранятся в каждом байте. Самый левый пиксель хранится в верхних 4 битах, а самый правый пиксель — в нижних 4 битах.
В качестве примера мы будем использовать то же изображение спрайта, которое было представлено в примере 8-битного паттерна. Здесь сохраняются только нижние 4 бита каждого пикселя, чтобы ограничить цвет каждого пикселя до 4 битов:
4444444333333333
4FFFFF4333333333
4FBBBF4333333333
4FB55BF433333333
4FB588BF43333333
4FFB848BF4333333
444FB848BF433333
3334FB844BF43433
33334FB444BF4D43
333334FB4444AD43
3333334FB4F54433
33333334F4584333
333333334A448433
33333334DD434543
33333333443334A4
3333333333333344
0x3 используется в качестве прозрачного индекса.
Эти 128 байт будут храниться в памяти паттернов в порядке слева направо, сверху вниз.
Фактический цвет, который появится на экране, будет зависеть от палитры, описанной ниже. Палитра по умолчанию, скорее всего, не создаст подходящие цвета для 4-битных спрайтов.
Палитра спрайтов
Каждый пиксель изображения спрайта имеет 8 бит для 8-битных паттернов или 4 бита для 4-битных паттернов. Значение пикселя известно как индекс цвета пикселя. Этот индекс цвета объединяется со смещением палитры спрайта. Смещение палитры представляет собой 4-битное значение, добавленное к верхним 4 битам индекса цвета пикселя. Цель смещения палитры состоит в том, чтобы позволить спрайту изменить цвет изображения.
Окончательный индекс цвета спрайта, сгенерированный аппаратным обеспечением спрайта, является суммой индекса пикселя и 4-битного смещения палитры. В картинках с использованием двоичной математики:
8-битный спрайт
PPPP0000
+ IIIIIIII
----------
SSSSSSSS
4-битный спрайт
PPPP0000
+ 0000IIII
----------
SSSSSSSS = PPPPIIII
Где «PPPP» — это 4-битное смещение палитры из атрибутов спрайта, а «I» обозначает значение пикселя из паттерна спрайта. Окончательный индекс спрайта представлен 8-битным значением «SSSSSSSS».
Для 4-битных спрайтов смещение палитры можно рассматривать как выбор одной из 16 различных 16-цветных палитр.
Этот окончательный 8-битный индекс спрайта затем передается через палитру спрайтов, которая действует как таблица поиска, возвращающая 9-битный цвет RGB333, связанный с индексом спрайта.
При включении питания палитра спрайтов инициализируется таким образом, что индекс спрайта проходит без изменений и, следовательно, интерпретируется как цвет RGB332. Отсутствующий третий синий бит генерируется как логическое ИЛИ двух других синих битов. Короче говоря, для 8-битных спрайтов индекс спрайта также действует как цвет при использовании палитры по умолчанию.
Атрибуты спрайтов
Атрибуты спрайта — это список свойств, определяющих, как и где рисуется спрайт.
Каждый спрайт описывается 4 или 5 байтами атрибутов, перечисленными ниже:
Атрибут спрайта 0
X X X X X X X X
Младшие восемь бит координаты X спрайта. Девятый бит находится в атрибуте спрайта 2.
Атрибут спрайта 1
Y Y Y Y Y Y Y Y
Младшие восемь бит координаты Y спрайта. Девятый бит является необязательным и находится в атрибуте 4.
Атрибут спрайта 2
P P P P XM YM R X8/PR
P = 4-битное смещение палитры XM = 1, чтобы зеркально отразить изображение спрайта по горизонтали YM = 1, чтобы зеркально отразить изображение спрайта по вертикали R = 1 для поворота изображения спрайта на 90 градусов по часовой стрелке X8 = Девятый бит координаты X спрайта PR = 1, чтобы указать, что P является относительным для смещения палитры якоря (только для относительных спрайтов)
Поворот применяется перед зеркальным отображением. Относительные спрайты, описанные ниже, заменяют X8 на PR.
Все возможности флагов поворота, зеркального отображения по X и зеркального отображения по Y.
Атрибут спрайта 3
V E N5 N4 N3 N2 N1 N0
V = 1, чтобы сделать спрайт видимым E = 1, чтобы включить байт атрибута 4 N = Паттерн спрайта для использования 0-63
Если E=0, спрайт полностью описывается атрибутами спрайта 0-3. Паттерн спрайта является 8-битным и идентифицируется паттерном N=0-63. Спрайт является якорем и не может быть сделан относительным. Спрайт отображается так, как если бы атрибут спрайта 4 был равен нулю.
Если E=1, спрайт дополнительно описывается атрибутом спрайта 4.
Атрибут спрайта 4
A. Расширенный спрайт-якорь
H N6 T X X Y Y Y8
H = 1, если паттерн спрайта 4-битный N6 = 7-й бит паттерна, если паттерн спрайта 4-битный T = 0, если относительные спрайты имеют композитный тип, иначе 1 для унифицированного типа XX = Увеличение в направлении X (00 = 1x, 01 = 2x, 10 = 4x, 11 = 8x) YY = Увеличение в направлении Y (00 = 1x, 01 = 2x, 10 = 4x, 11 = 8x) Y8 = Девятый бит координаты Y спрайта
{H,N6} не должно быть равно {0,1}, так как эта комбинация используется для обозначения относительного спрайта.
B. Относительный спрайт, композитный тип
0 1 N6 X X Y Y PO
N6 = 7-й бит паттерна, если паттерн спрайта 4-битный XX = Увеличение в направлении X (00 = 1x, 01 = 2x, 10 = 4x, 11 = 8x) YY = Увеличение в направлении Y (00 = 1x, 01 = 2x, 10 = 4x, 11 = 8x) PO = 1, чтобы указать, что номер паттерна спрайта является относительным для якоря
C. Относительный спрайт, унифицированный тип
0 1 N6 0 0 0 0 PO
N6 = 7-й бит паттерна, если паттерн спрайта 4-битный PO = 1, чтобы указать, что номер паттерна спрайта является относительным для якоря
Область отображения для спрайтов составляет 320×256. Координата X спрайта состоит из девяти бит, в диапазоне 0-511, а координата Y является необязательно снова девятью битами в диапазоне 0-511 или восемью битами в диапазоне 0-255. Полный диапазон 0-511 переносится по обеим осям, что означает, что спрайт шириной 16 пикселей, нарисованный в координате X 511, увидит, что его первый пиксель не отображается (координата 511), а следующие пиксели отображаются в координатах 0-14.
Вся область отображения видна в VGA. Однако дисплей HDMI короче по вертикали, поэтому восемь верхних строк пикселей (Y = 0-7) и восемь нижних строк пикселей (Y = 248-255) не будут видны на дисплее HDMI.
Спрайты могут быть полностью описаны атрибутами спрайта 0-3, если бит E в атрибуте спрайта 3 равен нулю. Эти спрайты совместимы с исходным модулем спрайтов из версий ядра, предшествующих 2.00.26.
Если установлен бит E, то активируется пятый атрибут спрайта, атрибут спрайта 4. Этот атрибут вводит масштабирование, 4-битные паттерны и относительные спрайты. Масштабирование объяснять не нужно, а 4-битные паттерны были описаны в последнем разделе. Относительные спрайты описаны в следующем разделе.
Относительные спрайты
Обычные спрайты (спрайты, которые не являются относительными) известны как спрайты-якоря. Поскольку модуль спрайтов рисует спрайты в порядке 0-127 (всего 128 спрайтов), он внутренне хранит характеристики последнего увиденного спрайта-якоря. Если следующие спрайты являются относительными, они наследуют некоторые из этих характеристик, что позволяет относительным спрайтам иметь, среди прочего, координаты, относительные к якорю. Это означает, что перемещение спрайта-якоря также приводит к перемещению его родственников вместе с ним.
Существует два типа поддерживаемых относительных спрайтов, известных как «Композитные спрайты» и «Унифицированные спрайты». Тип определяется якорем в бите T атрибута спрайта 4.
A. Композитные спрайты
Модуль спрайтов записывает следующую информацию из якоря:
- Anchor.visible
- Anchor.X
- Anchor.Y
- Anchor.palette_offset
- Anchor.N (номер паттерна)
- Anchor.H (указывает, использует ли спрайт 4-битные паттерны)
Эти записанные элементы не используются композитными спрайтами:
- Anchor.rotate
- Anchor.xmirror
- Anchor.ymirror
- Anchor.xscale
- Anchor.yscale
Якорь определяет, используют ли все его относительные спрайты 4-битные паттерны или нет.
Видимость конкретного относительного спрайта является результатом логического И операции видимости якоря с видимостью относительного спрайта. Другими словами, если якорь невидим, то и все его родственники тоже.
Относительные спрайты имеют координаты X и Y только 8-битные (девятые биты взяты для других целей). Это знаковое смещение от координаты X,Y якоря. Перемещение якоря перемещает всех его родственников вместе с ним.
Если у относительного спрайта установлен PR бит в атрибуте спрайта 2, то смещение палитры якоря добавляется к относительному спрайту, чтобы определить активное смещение палитры для относительного спрайта. В противном случае относительный спрайт использует собственное смещение палитры как обычно.
Если у относительного спрайта установлен PO бит в атрибуте спрайта 4, то номер паттерна якоря добавляется к относительному спрайту, чтобы определить паттерн, используемый для отображения. В противном случае относительный спрайт использует собственный номер паттерна как обычно. Цель состоит в том, чтобы предоставить метод для легкой анимации большого спрайта путем манипулирования номером паттерна в якоре.
Композитный спрайт похож на коллекцию независимых спрайтов, привязанных к якорю.
B. Унифицированные спрайты
Унифицированные спрайты являются дальнейшим расширением композитного типа. Та же информация записывается из якоря, и применяется то же поведение, которое описано в композитных спрайтах.
Разница в том, что коллекция якоря и родственников рассматривается так, как если бы это был один спрайт 16×16. Биты поворота, зеркала и масштабирования якоря применяются ко всем его родственникам. Поворот якоря приводит к повороту всех родственников вокруг якоря. Зеркальное отображение якоря приводит к зеркальному отображению родственников вокруг якоря. Аппаратное обеспечение спрайтов автоматически отрегулирует координаты X,Y и биты поворота, масштабирования и зеркала всех родственников в соответствии с настройками в якоре.
Унифицированные спрайты следует определять так, как если бы все его части имели размер 16×16, при этом якорь контролирует внешний вид целого.
Унифицированный спрайт похож на большую версию отдельного спрайта 16×16, контролируемую якорем.
Программирование спрайтов
Спрайты создаются через три порта ввода/вывода и интерфейс nextreg.
Статус спрайта/Выбор слота ($303B / 12347) (W)
X S S S S S S S
N6 X N N N N N N
Запись в этот порт имеет два эффекта.
Во-первых, он выбирает один из 128 спрайтов для записи атрибутов спрайта через порт 0x57.
Во-вторых, он выбирает один из 128 4-битных паттернов в памяти паттернов для записи паттернов спрайта через порт 0x5B. Показанный бит N6 является младшим значащим в 7-битном номере паттерна и всегда должен быть равен нулю при выборе одного из 64 8-битных паттернов, обозначенных N.
Загрузка атрибутов спрайта ($xx57 / 87) (W)
После выбора спрайта через порт 0x303B его атрибуты можно записывать в этот порт один байт за другим. Спрайты могут иметь либо четыре, либо пять байтов атрибутов, и внутренний указатель атрибута перейдет к следующему спрайту после записи этих четырех-пяти байтов атрибутов. Это означает, что вы можете выбрать спрайт через порт 0x303B и записать атрибуты для любого количества последовательных спрайтов. Указатель атрибута будет переходить от спрайта 127 к спрайту 0.
Загрузка паттерна спрайта ($xx5B / 91) (W)
После выбора номера паттерна через порт 0x303B в этот порт можно записать паттерн размером 256 или 128 байт. Внутренний указатель паттерна автоматически увеличивается после каждой записи, поэтому можно записать столько последовательных паттернов, сколько требуется. Внутренний указатель паттерна будет автоматически переходить от паттерна 127 к паттерну 0 (4-битные паттерны) или от паттерна 63 к паттерну 0 (8-битные паттерны).
Статус спрайта/Выбор слота ($303B / 12347) (R)
0 0 0 0 0 0 M C
M = 1, если превышено максимальное количество спрайтов на строку C = 1, если какие-либо два отображаемых спрайта сталкиваются на экране
Чтение этого порта автоматически сбрасывает биты M и C.
Помимо интерфейса ввода-вывода, существует интерфейс nextreg для атрибутов спрайта. Интерфейс nextreg позволяет copper манипулировать спрайтами и предоставляет программе произвольный доступ к отдельным байтам атрибутов спрайта.
(R/W) 0x34 (52) => Номер спрайта Если номер спрайта синхронизирован с портом ввода-вывода 0x303B (бит 4 nextreg 0x09 установлен) bits 7 = Смещение адреса паттерна (добавьте 128 к адресу паттерна) bits 6-0 = Номер спрайта 0-127, Номер паттерна 0-63 Выбирает, чьи атрибуты спрайта подключены к следующим регистрам. Эффективно выполняет вывод в порт 0x303B с тем же значением В противном случае bit 7 = Игнорируется bits 6-0 = Номер спрайта 0-127 Выбирает, чьи атрибуты спрайта подключены к следующим регистрам. Бит 7 всегда считывается как ноль.
Этот nextreg может работать в двух режимах.
Если установлен бит 4 nextreg 0x09, то этот регистр остается синхронизированным с портом ввода-вывода 0x303B. Запись в этот nextreg эквивалентна записи в порт 0x303B и наоборот. В этом режиме интерфейс ввода-вывода и интерфейс nextreg точно эквивалентны.
Если бит 4 nextreg 0x09 сброшен, то интерфейс nextreg отключается от порта ввода-вывода 0x303B. Этот nextreg используется для выбора конкретного спрайта 0-127, и это полностью независимо от спрайта, выбранного для интерфейса ввода-вывода. Эта независимость позволяет copper, например, манипулировать другими спрайтами, чем процессор, использующий интерфейс ввода-вывода.
(W) 0x35 (53) => Атрибут спрайта 0 (W) 0x75 (117) => Атрибут спрайта 0 с автоматическим постинкрементом Номера спрайта bits 7-0 = LSB координаты X
Запись в nextreg 0x75 также увеличивает выбранный спрайт в nextreg 0x34.
(W) 0x36 (54) => Атрибут спрайта 1 (W) 0x76 (118) => Атрибут спрайта 1 с автоматическим постинкрементом Номера спрайта bits 7-0 = LSB координаты Y
Запись в nextreg 0x76 также увеличивает выбранный спрайт в nextreg 0x34.
(W) 0x37 (55) => Атрибут спрайта 2 (W) 0x77 (119) => Атрибут спрайта 2 с автоматическим постинкрементом Номера спрайта bits 7-4 = Смещение палитры, добавленное к верхним 4 битам индекса цвета спрайта bit 3 = Зеркальное отображение по X bit 2 = Зеркальное отображение по Y bit 1 = Поворот bit 0 = MSB координаты X
Запись в nextreg 0x77 также увеличивает выбранный спрайт в nextreg 0x34.
(W) 0x38 (56) => Атрибут спрайта 3 (W) 0x78 (120) => Атрибут спрайта 3 с автоматическим постинкрементом Номера спрайта bit 7 = Флаг видимости (1 = отображается) bit 6 = Расширенный атрибут (1 = Атрибут спрайта 4 активен) bits 5-0 = Паттерн, используемый спрайтом (0-63)
Запись в nextreg 0x78 также увеличивает выбранный спрайт в nextreg 0x34.
(W) 0x39 (57) => Атрибут спрайта 4 (W) 0x79 (121) => Атрибут спрайта 4 с автоматическим постинкрементом Номера спрайта 4-битные спрайты bit 7 = H (1 = спрайт использует 4-битные паттерны) bit 6 = N6 (0 = использовать первые 128 байт паттерна, иначе использовать последние 128 байт) bit 5 = 1, если относительные спрайты являются композитными, 0, если относительные спрайты являются унифицированными Масштабирование bits 4-3 = Масштабирование по X (00 = 1x, 01 = 2x, 10 = 4x, 11 = 8x) bits 2-1 = Масштабирование по Y (00 = 1x, 01 = 2x, 10 = 4x, 11 = 8x) bit 0 = MSB координаты Y Относительный режим включается, если H,N6 = 01. Формат байта для относительных спрайтов описан выше.
Запись в nextreg 0x79 также увеличивает выбранный спрайт в nextreg 0x34.
Глобальное управление спрайтами
Следующие nextreg также представляют интерес для спрайтов.
Регистр периферийного устройства 4 ($09) (09) bit 7 = Настройка Mono для AY 2 (1 = mono, 0 default) bit 6 = Настройка Mono для AY 1 (1 = mono, 0 default) bit 5 = Настройка Mono для AY 0 (1 = mono, 0 default) bit 4 = Синхронизация идентификатора спрайта (1 = Nextreg 0x34 и IO Port 0x303B синхронизированы, 0 default) bit 3 = Отключает порт Kempston ($DF), если установлено bit 2 = Отключает порты divMMC ($E3, $E7, $EB), если установлено bits 1-0 = Строки развертки (0 после PoR или Hard-reset) 00 = Строки развертки выключены 01 = Строки развертки 75% 10 = Строки развертки 50% 11 = Строки развертки 25%
Бит 4 определяет, работают ли интерфейс ввода-вывода и интерфейс nextreg синхронно.
Системный регистр спрайтов и слоев ($15) (21) bit 7 = Режим LoRes, 128 x 96 x 256 цветов (1 = включено) bit 6 = Приоритет спрайта (1 = спрайт 0 сверху, 0 = спрайт 127 сверху) bit 5 = Включить обрезку спрайтов в режиме over border (1 = включено) bits 4-2 = Установите приоритеты слоев: Значение по умолчанию после сброса — 000, спрайты поверх слоя 2, поверх графики ULA. 000 – S L U 001 – L S U 010 – S U L 011 – L U S 100 – U S L 101 – U L S 110 – S(U+L) ULA и слой 2 объединены, цвета ограничены до 7 111 – S(U+L-5) ULA и слой 2 объединены, цвета ограничены до [0,7] bit 1 = Over border (1 = yes) (Обратно в 0 после сброса) bit 0 = Спрайты видимы (1 = видны) (Обратно в 0 после сброса)
Бит 0 должен быть установлен, чтобы спрайты были видимыми.
Установка бита 1 позволяет спрайтам быть видимыми в области границы. Когда этот бит сброшен, спра
Этот документ неполный и вскоре будет пересоздан