Слой 2 (он же Layer 2 или Canvas)
Слой 2 предоставляет дополнительный экранный слой с разрешением 256x192 и 256 цветами, 320x256 и 256 цветами или 640x256 и 16 цветами, в котором каждый пиксель окрашивается индивидуально. Слой 2 может отображаться вместо, позади или над слоем, сгенерированным ULA/Tilemap.
Экран Слоя 2 занимает 48 КБ или 80 КБ, которые хранятся в 3 (или 5) последовательных банках. По умолчанию NextZXOS/NextBASIC использует банки 9-11 для видимого и “теневого” экрана Слоя 2 (аппаратное обеспечение после включения по умолчанию использует 8-10 для отображаемого и 11-13 для теневого экрана, но это изменяется при загрузке NextZXOS). Их можно настроить с помощью Регистра страниц ОЗУ Слоя 2 ($12) и Регистра теневых страниц ОЗУ Слоя 2 ($13) (избегайте использования банков 5, 7 и 8 в качестве экрана Слоя 2, если вы не знакомы с SRAM и BRAM платы и тем, как память экрана ULA имеет особую обработку в ПЛИС Next).
Каждому пикселю Слоя 2 назначается 1 байт видеопамяти (в режимах 8bpp). Это означает, что Слой 2 потребляет в общей сложности 48 КБ (256x192) или 80 КБ (320x256). Поскольку банки Spectrum имеют размер 16 КБ, режим Слоя 2 256x192 разделен по горизонтали на 3 банка по 64 строки в каждом, каждый из которых составляет ровно 16 КБ. Режим 320x256 (и 640x256) делится вертикально на 5 банков по 64 (128) столбца в каждом.
Слой 2 управляется через Порт доступа к Слою 2 ($123B / 4667) и Регистр управления Слоем 2 ($70), порт имеет следующую битовую карту:
Бит | Описание |
---|---|
7-6 | Выбор банка Video RAM (страничная запись/чтение) |
5-4 | Зарезервировано, записать 0 |
3 | Использовать теневой Слой 2 для подкачки страниц - Регистр теневых страниц ОЗУ Слоя 2 ($13) |
2 | Включить пейджинг только для чтения Слоя 2 |
1 | Слой 2 виден - Регистр страниц ОЗУ Слоя 2 ($12) Начиная с ядра 3.0 этот бит имеет зеркало в Регистре управления дисплеем 1 ($69) |
0 | Включить пейджинг только для записи Слоя 2 |
Когда бит 0 $123B установлен в 1, доступ к соответствующей области видеопамяти Слоя 2 (как установлено битами 6-7) осуществляется записью в слот 1, т.е. в область памяти $0000-$3fff (см. Схема памяти). Это предотвращает любой конфликт, поскольку эта область обычно является ROM и, следовательно, бесполезна для записи. Однако вы не можете ЧИТАТЬ содержимое Слоя 2 через это отображение! Чтение адресов в этом диапазоне будет считывать значения из страницы ROM (или банка RAM, если в режиме AllRam), которые были бы отображены там обычно, если бы пейджинг Слоя 2 был отключен.
Когда бит 2 $123B установлен в 1 (новая функция ядра 3.0), та же область $0000-$3fff переназначается для чтения, что позволяет получить доступ для чтения к банку Слоя 2, выбранному битами 3,6 и 7 (в то время как запись по-прежнему будет выполняться на обычную страницу ROM/RAM).
Если установлены оба бита 0 и 2, вы создаете альтернативное отображение RAM для чтения и записи памяти (технически идентичное отображению, выполняемому регистрами MM0+MMU1).
Банк 5 и первая половина Банка 7, при доступе обычными средствами (пейджинг MMU, отображение памяти по умолчанию, DMA), затмеваются быстрой памятью BRAM внутри чипа FPGA, которая затем используется для создания экрана ULA и графики Tilemap (также известной как “Слой 3”) - не используя чип памяти SRAM в этой конкретной области. Этот Слой 2 (отображение и видимые данные) является единственным исключением, обходящим этот механизм и обращающимся к Банку 5 и Банку 7 в микросхеме SRAM основной памяти (что дает вам дополнительные 16+8 КБ “секретной” памяти и еще больше головной боли авторам эмуляторов). Если вы не уверены, что это значит, просто избегайте использования банка 5 и 7 для Слоя 2, используйте значения больше/равные 8 (и избегайте также Банка 8, если вы не хотите уничтожить переменные теплого перезапуска/мягкого сброса NextBASIC).
Биты 6 и 7 содержат номер, какая треть Слоя 2 должна быть отображена (0..2), или (новая функция ядра 3.0), когда установлено значение 3, вся область Слоя 2 размером 48 КБ отображается в область $0000-$bfff (убедитесь, что ваш код, стек и прерывания хорошо справятся с таким новым отображением).
В последних ядрах 3.x есть еще одна новая функциональность, позволяющая установить переменную смещения банка от 0 до 7. Это смещение в дальнейшем применяется к банку, выбранному для записи/чтения (путем записи значения 0..7 в порт с установленным битом 4 (поэтому его значение 16..23). Если вы установили, например, 16 КБ для записи первого банка, первый банк — 9 и используете значение 21 для настройки смещения банка (+5 смещения), банк, отображаемый в адресную область $0000..$3FFF, будет 14 (9+5). Таким образом, вы можете отобразить полные 80 КБ данных пикселей в нижнее окно 16 КБ (или нижнее окно 48 КБ), используя разные смещения.
Используйте Регистр управления Слоем 2 ($70), чтобы выбрать конкретный режим Layer2 и изменить смещение палитры (добавляется к четырем старшим битам каждого пикселя). Не забудьте правильно настроить окно отсечения Слоя 2 для каждого режима (Регистр окна отсечения Слоя 2 ($18)).
Вы по-прежнему можете использовать обычные порты банков для переключения одного из банков Слоя 2 в слот для C000 (или использовать регистры ZX Next MMU для отображения этой RAM в других регионах). Это позволит вам читать и записывать память как обычно. Возможность записи в Слой 2 через запись в слот 1 предоставляется для удобства и для того, чтобы графические данные можно было легко копировать из расширенных банков RAM.
Пиксели рисуются в Слой 2 путем записи в соответствующую область RAM. Пиксели Слоя 2 в режиме 256x192 расположены в порядке чтения на английском языке без ULA-стиля перемежения. Поскольку на строку приходится 256 пикселей, а при использовании доступа через слот 1 порт памяти начинается с $0000, старший байт адреса точно равен координате Y (в пределах выбранной трети экрана), а младший байт точно равен координате X.
В режиме 320x256 (8bpp) пиксели хранятся в памяти сверху вниз и слева направо (второй байт — первый пиксель во второй строке, 256-й байт — второй пиксель в первой строке). Поскольку на столбец приходится 256 пикселей, старший байт адреса может представлять координату X (только определенный их диапазон, так как весь диапазон 0..319 не помещается в 8 бит), а младший байт адреса — координата Y. Общий объем памяти для пикселей составляет 80 КБ (пять банков 16 КБ) и может быть отображен в память либо MMU, либо функцией смещения банка Порта доступа к Слою 2 ($123B / 4667).
В режиме 640x256 (4bpp) пиксели хранятся идентично режиму 320x256, но каждый байт содержит два пикселя. Верхний полубайт (верхние четыре бита) образуют “левый” пиксель, а нижний полубайт образуют “правый” пиксель, поэтому первые 256 байтов будут отображаться в виде двух столбцов на экране, а не одного.
Обратите внимание, что вам потребуется вручную очистить экран Слоя 2 перед рисованием на нем, так как он может содержать случайные данные при запуске машины.
Системные регистры Регистр смещения X Слоя 2 ($16), Регистр старшего байта смещения X Слоя 2 ($71) и Регистр смещения Y Слоя 2 ($17) применяют сдвиг пикселей ко всему содержимому Слоя 2, позволяя создавать эффекты прокрутки.
Начиная с ядра 3.0 на видимость Слоя 2 не влияет использование теневого экрана ZX128 ULA (Bank 7).
Устаревшая информация для ядра 2.x (ограничение было снято в ядре 3.0): видимый Слой 2 приведет к замедлению процессора до 7 МГц.
Чтобы использовать схему с двойной буферизацией для Слоя 2, подумайте о том, что Регистр страниц ОЗУ Слоя 2 ($12) связан с дисплеем (т. е. должен быть изменен для отображения нового Слоя 2, когда новое изображение уже подготовлено) (или он может быть изменен также во время кадра для составления окончательного изображения из различных областей памяти), в то время как Регистр теневых страниц ОЗУ Слоя 2 ($13) связан только с функциональностью записи поверх ROM (Порт доступа к Слою 2 ($123B / 4667)).