Видеорежимы
ULA - это чип Spectrum, отвечающий за видео и ввод. Enhanced ULA добавляет дополнительные видеорежимы и функции к стандартному Spectrum.
ULA расшифровывается как “Uncommitted Logic Array” (Нефиксированная логическая матрица) и относится к производственному процессу. Это не связано с видеоповедением чипа. Сам чип является заказным.
Содержание
Видеорежим Spectrum
Стандартный Spectrum имеет только один видеорежим с разрешением 256x192 (не считая рамки) и 15 цветами. Этот экран далее разделен на 8x8 “ячейки attributes”, поэтому разрешение ячейки attribute составляет 32x24.
ULA считывает память из 16k-Bank 5 или 16k-Bank 7 в зависимости от настройки в Control Memory Paging ($7FFD / 32765). Если вы не занимались хитрыми манипуляциями с картой памяти или используете режим Spectrum 48k, то экранная память будет начинаться с $4000.
При наличии одного бита на пиксель каждый байт представляет 8 пикселей (т.е. одну строку ячейки attribute). Каждая экранная строка хранится в прямом порядке слева направо, поэтому 32 байта, начиная с $4000, представляют все пиксели в первой строке экрана. Каждый бит 1 означает, что пиксель рисуется цветом “ink”; бит 0 означает, что он рисуется цветом “paper”. Какие это цвета, указано в блоках attributes, описанных ниже.
К сожалению, хотя столбцы экрана расположены в прямом порядке, строки - нет. Экран из 192 строк вертикально разделен на три части, каждая из которых содержит 64 строки (или 8 ячеек attributes). Эти три трети хранятся последовательно в памяти, но внутри каждой трети порядок не такой, как вы ожидаете. Вы ожидаете, что он будет хранить первую строку первой ячейки, вторую строку первой ячейки … до восьмой строки первой ячейки, затем первую строку второй ячейки. Вместо этого сортировка инвертирована. Итак, он хранит первую строку первой ячейки, затем первую строку второй ячейки, затем первую строку третьей ячейки и так далее … до первой строки восьмой ячейки, за которой следует вторая строка первой ячейки!
Это означает, что получение адреса начала данной строки может быть сложной задачей. Spectrum Next предоставляет opcode PIXELAD для автоматического выполнения необходимого преобразования. Это можно сделать вручную, разбив номер строки (0-191) на биты, как описано ниже.

Конфликт цветов в классической игре spectrum. Углы шлема рыцаря кажутся зелеными и красными, потому что они находятся в той же ячейке attributes, что и растение и стол соответственно.
Данные пикселей хранятся с 1-битным цветом в памяти данных пикселей. Однако цвет может варьироваться по экрану. Загвоздка в том, что вы можете установить только два цвета в пределах одной ячейки attributes - то есть области 8x8. Поскольку вы можете иметь только одно цветовое значение на ячейку 8x8, в некоторых старых играх проявлялся «конфликт цветов», когда объект или часть объекта отображались неправильным цветом, потому что его нужно было нарисовать внутри ячейки 8x8 с другим объектом другого цвета.
Данные о цвете хранятся с $5800 и далее. В отличие от данных пикселей, они хранятся в прямом порядке чтения, по одному байту на ячейку attribute, всего 768 байт. Байт представляет собой:
Бит | Функция |
---|---|
0-2 | Цвет “Ink” (цвет битов 1). От 0-7: черный, синий, красный, пурпурный, зеленый, голубой, желтый, белый. |
3-5 | Цвет “Paper” (цвет битов 0). |
6 | Флаг Bright (переключает более яркую версию обоих цветов). |
7 | Флаг Flash (переключает регулярное чередование цветов ink и paper) |
Если Enhanced ULA включен, то это больше не применяется; см. ниже.
Вычисление адресов строк в перемежающихся видеорежимах
Номер строки можно разбить на биты следующим образом:
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
---|---|---|---|---|---|---|---|
3rd | 3rd | V-Cell | V-Cell | V-Cell | Offset | Offset | Offset |
Каждая 3rd составляет 64 строки, поэтому два старших бита номера строки указывают, в какой 3rd мы находимся, причем самый высокий из них равен %10 для 128 (%11 будет 192, вне нижней части экрана). Затем каждая ячейка состоит из 8 строк, поэтому биты 3-5 номера строки дают адрес ячейки, а оставшиеся биты - строку внутри этой ячейки.
Третьи хранятся в последовательном порядке; каждая третья содержит 64 строки; и хранение линии занимает 32 байта. Это означает, что каждая третья занимает 2048 байт, поэтому число «которая третья» умножается на 2048. Добавьте $4000 для начала экрана, и это даст адрес начала целевой трети. Теперь нам нужно перейти к блоку для правильного номера строки. Для хранения верхней строки одного ряда ячеек требуется 32 байта; но поскольку все верхние строки для 8 ячеек хранятся вместе, между строками фактически 256 байт (32 * 8). Таким образом, номер строки необходимо умножить на 256 и добавить к адресу. Затем, чтобы выбрать правильную ячейку в этом блоке, номер ячейки необходимо умножить на 32 (потому что каждая строка занимает 32 байта). Итак, окончательный 16-битный адрес:
32768 | 16384 | 8192 | 4096 | 2048 | 1024 | 512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3rd | 3rd | Offset | Offset | Offset | V-Cell | V-Cell | V-Cell | 0 | 0 | 0 | 0 | 0 |
Пять младших битов этого значения затем используются для выбора между 32 горизонтальными ячейками на этой линии, что просто делается путем деления адреса пикселя на 8.
Расширенные видеорежимы
Next добавляет ряд дополнительных видеорежимов к стандартному ULA.
Двойная буферизация Timex Sinclair
Запись %001 в младшие 3 бита Timex Sinclair Video Mode Control ($xxFF / 255) изменит базовый адрес экрана на $6000 вместо $4000 (или иным образом добавит $2000 к истинному адресу доступа, переместив его во вторую половину соответствующего 16k-банка или в следующий 8k-банк). Запись %000 восстанавливает обычный базовый адрес экрана. Это позволяет использовать эту область памяти для «двойного буфера» для плавных переходов между кадрами. Обратите внимание, однако, что переключение банков Spectrum 128k также позволяет использовать двойную буферизацию (с использованием Bank 7, см. Карта памяти), но только первая половина банка 7 отражается внутри FPGA в быстрой области BRAM. Слой 2 можно использовать параллельно, только если данные слоя ULA поступают из памяти BRAM в FPGA (зеркало первой половины банка 7 является новой функцией последних ядер 3.0.x, в ядрах 2.0 использование теневого экрана ZX128 приводило к отключению слоя 2).
Режим высокого разрешения Timex Sinclair Hi-Res
Запись %110 в младшие 3 бита Timex Sinclair Video Mode Control ($xxFF / 255) изменит разрешение экрана на 512x192, удвоив разрешение по X. Он по-прежнему использует структуру двойного буфера с одним набором данных экрана по адресу $4000 и другим по адресу $6000, но теперь столбцы (один столбец = один байт = 8 пикселей) поочередно считываются из двух буферов для учета более высокого разрешения. Кроме того, attributes отключены: этот режим поддерживает только два цвета. Какие именно, можно установить, записав биты 3-5 Timex Sinclair Video Mode Control ($xxFF / 255).
Режим Timex Sinclair Hi-Color
Запись %010 в младшие 3 бита Timex Sinclair Video Mode Control ($xxFF / 255) отключит стандартную область attributes. Вместо этого область attributes устанавливается на начало с $6000 и имеет ту же перемежающуюся структуру, что и данные пикселей. Каждый байт attribute теперь применяется только к одной строке каждой ячейки, а не ко всей ячейке. Структура хранения соответствует структуре данных пикселей (включая странное чередование). Это означает, что области конфликта цветов теперь ограничены блоками 8x1 вместо блоков 8x8.
LoRes Layer/Режим Radasjimian
LoRes Layer — это режим, аналогичный «Radastanian Mode» на ZXUno, поскольку он предлагает пониженное разрешение в обмен на большее количество цветов. LoRes Layer имеет два подрежима, позволяющих использовать 16 или 256 цветов в любом месте экрана, но снижает разрешение в обоих измерениях до 128x96.
Слой LoRes включается установкой бита 7 в Sprite and Layers System Register ($15). Количество доступных цветов выбирается битом 5 в LoRes Control Register ($6A), причем 0 выбирает 256 цветов, а 1 выбирает 16 цветов.
В режиме 256 цветов каждому пикселю назначается один байт в порядке чтения (без чередования). Первые 48 строк хранятся между $4000 и $57ff (16K bank 5 $0000-$17ff), а вторые 48 - между $6000 и $77ff (16k bank 5 $2000-$37ff). Каждый байт - это индекс в палитре ULA.
В режиме 16 цветов байт соответствует паре пикселей, причем старший полубайт соответствует левому пикселю, а младший - правому. Пиксели расположены в памяти в порядке чтения (без чередования). Изображение хранится в одном из двух мест: $4000-$57ff (16K bank 5 $0000-$17ff) или $6000-$77ff (16K bank 5 $2000-$37ff). Местоположение определяется исключающим ИЛИ бита 4 LoRes Control Register ($6A) и бита 0 Timex Sinclair Video Mode Control ($xxFF / 255). Цвет каждого пикселя сочетает значение соответствующего полубайта со смещением палитры Radistan в битах 3-0 LoRes Control Register ($6A).
Enhanced ULA
Spectrum Next поставляется с Enhanced ULA, который позволяет стандартной графике Spectrum отображать 256 цветов на экране одновременно. Он использует системные Palettes так же, как Sprites и Layer 2.
Установка бита 0 Enhanced ULA Control Register ($43) включает расширенный режим ULA. В этом режиме разбивка битов Ink/Paper/FLASH/BRIGHT в ячейках attributes, приведенная выше, игнорируется. Вместо этого битовое значение, записанное в Enhanced ULA Ink Color Mask ($42), используется как битовая маска, чтобы определить, какие биты используются для индекса палитры цвета ink (она должна маскировать несколько битов со стороны LSB, например %00111111, а не %01010101 или что-то глупое подобное!), а остальные биты, с добавлением 128, используются для индекса палитры цвета paper. Маска %11111111, чтобы рассматривать все биты как ink, является допустимой; если она используется, цвет paper в каждой ячейке будет Transparency colour fallback Register ($4A) (начиная с ядра 3.0, это был индекс цвета 128 в ядре 2.0). Маска %00000000 для обработки всех битов как paper не является допустимой.
Дополнительные функции
В дополнение к Enhanced ULA, Spectrum Next добавляет Sprites, Layer 2 и Tilemap, которые не контролируются ULA.