====== Yamaha V9938 (VDP) ====== Видеопроцессор (VDP), используемый в большинстве компьютеров [[msx:msx_2]] и [[msx:msx_1.5|]]. Разрешения прогрессивной развертки: ^ Размер экрана ^ Число цветов ^ Объём видеопамяти на страницу \\ (кбайт) ^ |512×212|4 из 512|32 | |512×212|16 из 512|64| |256×212|16 из 512|32| |256×212|256|64| Разрешение чересстрочной развертки: ^ Размер экрана ^ Число цветов ^ Объём видеопамяти на страницу \\ (кбайт) ^ |512×424|4 из 512|64| |512×424|16 из 512|128| |256×424|16 из 512|64| |256×424|256|128| Аппаратно–реализованные функции: * Чтение и установка точки * Поиск цвета в строке (влево/вправо, с установкой условия поиска: если равно, если не равно) * Линия * Заполнение прямоугольной области (с указанием цвета) * Копирование (и быстрое копирование) заданной прямоугольной области видеопамяти * Пересылка данных из (в) прямоугольной области видеопамяти, через ЦП * Применение логических операций (NOT, AND, OR, XOR, ID), для указанных выше функций. **{{yamaha_v9938.pdf|Yamaha_V9938_MSX-Video Technical Data Book (1985-08).pdf}}** {{anchor:programmers-guide}} ====== Руководство программиста ====== На основе **%%V9938 MSX-VIDEO Technical Data Book Programmer’s Guide%%** (переписано и отредактировано Евгением Бричковым): * {{v9938-programmers-guide.pdf|редакция 1.01d от 2020-09-06}} * {{v9938-programmers-guide_20220313.pdf|редакция 1.01e от 2022-03-13}} (отличия в страницах: 3, 25, 28, 29, 33, 34, 37, 38, 41, 42, 46, 49, 54, 58, 62) * {{v9938-programmers-guide_20220621.pdf|редакция 1.01f от 2022-06-21}} (отличия в страницах: 3, 16, 21, 72, 79, 82, 108) [[http://rs.gr8bit.ru/Documentation/V9938-programmers-guide.pdf|оригинал]] Выражаем огромную благодарность **Dolphin_Soft** за помощь в переводе, исправлении и дополнении этих материалов. ~~TOC_HERE~~ ~~TOC wide~~ {{anchor:definitions}} ====== Определения ====== |<100% 20% 80%>| |Атрибут|Свойство объекта, которое определяет как объект выглядит на экране. Атрибутом может быть цвет, положение объекта или значение определённого цвета пикселя.| |Задний план|Объект или свойство, которое воспринимается как фоновое по отношению к другому свойству или объекту. Например, для символа, отображаемого на экране, говорят, что пиксели его изображения имеют цвет переднего плана, а другие пиксели — цвет фона. В случае спрайтов можно сказать, что они появляются на переднем плане по отношению к шаблонам шрифтов, поскольку спрайты перекрывают изображения шрифта.| |Столкновение|Говорят, что спрайты сталкиваются, когда их точки с цветовым кодом 1 (проще говоря — точки, обозначенные двоичной единицей в их таблице генератора спрайтов) перекрываются. В некоторых случаях такое поведение может быть изменено в пользу или смешивания цветов спрайтов для получения псевдо-цветных спрайтов.| |Цвет|Свойство пикселя на экране. Цвет пикселя может поступать из различных источников: из глобального регистра цветов, из таблицы цветов шаблона или из таблицы цветов спрайта. Цвета также могут быть закодированы в регистрах палитры путем настройки красного, зеленого и синего компонентов — в этом случае, если таблица цветов шаблонов и спрайтов остается неизменной, фактические цвета, связанные с ними, могут отличаться| |Команда|Функция, выполняемая средствами VDP совместно с ЦП, или независимо от ЦП и параллельно с ним для достижения большей производительности.| |Расширение VRAM|Часть ОЗУ может быть использована для хранения данных регистров ввода/вывода и не является необходимой для правильной работы VDP. Максимальный размер ОЗУ расширения — 64 кбайт. Из–за особого назначения этой оперативной памяти она редко используется в программах.| |Макет (layout)|Карта шаблонов или спрайтов, которые определяют, где отображать конкретный объект или какой объект должен отображаться в определенной позиции. В случае шаблонов (шрифта) [[#pgt|Таблица знакогенератора]] определяет внешний вид шрифта, но для отображения этих шаблонов в определенном месте программист должен поместить его номер в Таблицу макетов шаблонов (Pattern Layout Table) в соответствующем месте.| |Знакогенератор|Это генератор символов. Специализированное аппаратное устройство, предназначенное для преобразования кода символа в его графическое представление, высвечивающееся на экране монитора в соответствии таблице шаблонов. В V9938 также используется для отображения тайлов.| |{{anchor:pgt}} Таблица знакогенератора \\ (Pattern generator Table)|Место в VRAM, где хранятся шаблоны (шрифт). Каждый шаблон имеет номер от PN0 до PN255. Адрес таблицы знакогенератора хранится в регистре [[#R4]].| |{{anchor:symbol}} Символ|Элемент текстового экрана, имеющий уникальный код (0…255), связанный с графическим представлением, заданном в [[#pgt|таблице знакогенератора]] в соответствии его коду| |Объект|Шаблон шрифта или спрайт.| |Шаблон (pattern)|Набор свойств объекта, определяющий его внешний вид. Объектом может быть шаблон шрифта или шаблон спрайта.| |Порт|Это схемотехническое решение с определенным системным адресом по которому ЦП обменивается данными с VDP. \\ VDP имеет четыре порта, порт 0 — это порт чтения/записи данных, порт 1 — порт настройки регистра записи и доступа к статусным регистрам, порт 2 — регистры палитры, а порт 3 — порт косвенной адресации регистров управления VDP.| |Регистр|Это область памяти в VDP для управления им. К регистрам можно получить прямой или косвенный доступ. Есть регистры управления, цвета, состояния.| |RGB|Эта аббревиатура образована названиями базовых цветов красный, зелёный и синий. Этот термин можно использовать для описания аппаратного решения, которое использует три аналоговых сигнала; или описать цветовой состав для пикселя. Обратите внимание, что при кодировании RGB в регистрах палитры VDP используются 3 бита для каждого основного цвета, а при кодировании RGB в режиме [[#G7|Graphic7]] красный и зеленый занимают по 3 бита, а синий — только 2 бита.| |Тайл (tile)|То же, что и шаблон шрифта+цветовые атрибуты| |VRAM|Видеопамять с произвольным доступом — это набор ячеек памяти, используемых VDP для хранения информации об изображении, отображаемом на экране. Доступ к VRAM осуществляется для отображения изображения, а также для его изменения. Изображение отображается постоянно, когда включен VDP. V9938 может иметь от 16 до 128 Кбайт видеопамяти и в зависимости от организации и размера памяти может не работать должным образом в определенных режимах. См. Описание бита VR регистра [[#R8]] для получения дополнительной информации.| {{anchor:n1}} ====== Глава 1. Основы ввода/вывода ====== {{anchor:n11}} ===== 1.1 Доступ к регистрам управления (R) ===== V9938 имеет 4 порта: порт 0 – порт 3; номер порта выбирается адресными строками VDP A0 и A1. В таблице ниже также показано распределение адресов портов для MSX–совместимого компьютера. |<80%>| ^ № порта ^ A1 ^ A0 ^ Операция ^ Режим ^ Основной порт MSX ^ | 0 | 0 | 0 |Данные VRAM|запись и чтение| 0×98 | | 1 | 0 | 1 |Регистр состояния|чтение| 0×99 | |:::|:::|:::|Адрес VRAM|запись|:::| |:::|:::|:::|Регистр управления|:::|:::| | 2 | 1 | 0 |Регистры палитры|:::| 0x9A | | 3 | 1 | 1 |Регистр косвенной адресации|:::| 0x9B | Есть два способа передачи данных в регистры управления (с R0 по R46). {{anchor:n111}} ==== 1.1.1 Прямой доступ к регистрам VDP ==== Последовательно выведите данные и номер регистра в порт 1. Порядок чтения и записи при работе с портами VDP очень важен, поэтому вы должны иметь в виду, что этот порядок может быть потенциально прерван процедурой прерывания ЦП, которая может писать или читать данные портов VDP и таким образом, нарушать правильную последовательность. Поэтому используйте режим DI (запретить прерывания) в начале и EI (разрешить прерывания) в конце цикла работы с VDP (подробнее об этом [[microprocessor_kit_z80-book1:06#n61|здесь]]). Байт данных записывается первым (биты D0–D7), а номер регистра записывается после байта данных (биты R0–R5). Если между этими двумя операциями произойдет прерывание, связанное с операциями VDP, это может привести к непредсказуемым результатам. |<100% 10% 10% 5% 5% 5% 5% 5% 5% 5% 5% 30%>| | старший бит|^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**Порт 1**| первый байт| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |данные| |:::| второй байт| 1 | 0 | R5 | R4 | R3 | R2 | R1 | R0 |№ регистра| {{anchor:n112}} ==== 1.1.2. Косвенный доступ к регистрам через регистр R17 (регистр управления указателем) ==== Установите номер регистра в регистр [[#R17]], используя прямую адресацию, а затем отправьте данные в порт 3. Старший бит значения, записанного в регистр [[#R17]] (AII), управляет автоинкрементом номера регистра. Если этот бит установлен, после каждой записи данных, номер регистра управления инкрементируется; в противном случае, значение номера регистра управления, указанного в регистре [[#R17]] остаётся неизменным. Режим автоинкремента полезен для последовательного заполнения регистров управления VDP. |<100% 10% 10% 5% 5% 5% 5% 5% 5% 5% 5% 30%>| | старший бит|^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R17**|| AII | 0 | R5 | R4 | R3 | R2 | R1 | R0 |№ регистра| | || |!@1| |`|auto_increment|auto_increment{text-align:left;background-color:#ffff9a}=Автоинкрименторование: \\ 0 — включено \\ 1 — выключено||||||||| |**Порт 3**| первый байт| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |данные| |:::| второй байт| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |:::| |:::| … |||||||||:::| |:::| nый байт| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |:::| __//Примечание://__ //данные в [[#R17]] не могут быть изменены косвенной адресацией.// {{anchor:n12}} ===== 1.2. Доступ к регистрам палитры ===== Чтобы установить данные в регистры палитры (от P1 до P15), вы должны сначала установить номер регистра палитры в регистре [[#R16]] (указатель адреса цветовой палитры), а затем записать два байта данных (в определенном порядке) в порт 2. Каждый цвет состоит из 3—х наборов по 3 бита для красного, зелёного и синего составляющих цвета (значение 0…7). __//Примечание://__ //После записи двух байт данных в порт 2 номер регистра палитры (указатель) в [[#R16]] автоматически увеличивается.// |<100% 10% 10% 5% 5% 5% 5% 5% 5% 5% 5% 30%>| | старший бит|^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R16**|| 0 | 0 | 0 | 0 | C3 | C2 | C1 | C0 |№ палитры| | ||||||||||| |**Порт 2**| первый байт| 0 | R2 | R1 | R0 | 0 | B2 | B2 | B0 |данные 1| |:::|:::| | @#ff2424:Красный ||| | @#2424ff:Cиний |||:::| |:::| второй байт| 0 | 0 | 0 | 0 | 0 | G2 | G1 | G0 |данные 2| |:::|:::| ||||| @#24db24:Зелёный |||:::| {{anchor:n13}} ===== 1.3. Доступ к регистрам состояния ===== Чтобы прочитать регистры состояния (от S0 до S9), вы должны сначала установить номер регистра в [[#R15]] (указатель регистра состояния), а затем прочитать данные из порта №1. |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R15 (запись)**| 0 | 0 | 0 | 0 | S3 | S2 | S1 | S0 |№ регистра состояния| |**Порт 1 (чтение)**| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |чтение данных| {{anchor:n14}} ===== 1.4. Доступ к видеопамяти (VRAM) ===== К VDP можно подключить видеопамять размером 128 Кбайт плюс расширение VRAM объемом 64 Кбайта. карта памяти показана ниже. |<50% 35% 30% 35%>| | Адрес ||| ^ Видео ОЗУ \\ (используется для отображения) \\ \\ 128 Кбайт | 0x1FFFF \\ ↑ \\ ↑ \\ ↑ \\ ↑ \\ 0x10000 | | ^:::| 0x0FFFF \\ ↑ \\ ↑ \\ ↑ \\ ↑ \\ 0x00000 ^ Расширение VRAM \\ (Дополнительные 64кб, подключаемые к VDP по линии CASX, без возможности отображения на экране) | Для доступа к памяти используйте следующий порядок действий: \\ 1. [[#n14s1|Выберите нужную область памяти (видео память (VRAM) или расширение VRAM)]]. \\ 2. [[#n14s2|Установите счетчик адреса (биты A16…A14)]]. \\ 3. [[#n14s3|Установите счетчик адреса (биты A7…A0)]]. \\ 4. [[#n14s4|Установите счетчик адреса (биты A13…A8) и укажите, какой будет следующая команда чтение или запись данных]]. \\ 5. [[#n14s5|Выполните чтение/запись данных в память]]. {{anchor:​n14s1}} **Шаг 1: Выбор нужной области памяти (видео память (VRAM) или расширение VRAM)** \\ Программы обычно пользуются видеопамятью,​ поэтому повторный выбор области памяти требуется редко. Это бывает нужно, если вашей программе потребуется доступ к расширению ОЗУ. После выполнения необходимых операций с расширением ОЗУ убедитесь,​ что вы снова выбрали видеопамять (VRAM). |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R45 (запись)**| 0 | MXC | MXD | MXS | DIY | DIX | EQ | MAJ |Регистр аргументов| | || |!@1| |`|bank|bank{text-align:left;background-color:#ffff9a}=MXC: \\ 0 — Видео память (VRAM) \\ 1 — Расширение VRAM|||||||| {{anchor:n14s2}} **Шаг 2: Установка счетчика адреса (биты A16…A14)** \\ VDP может логически адресовать 128 Кбайт в диапазоне адресов 0x00000–0x1FFFF через 17 бит адреса, задаваемые через A16…A0. На этом шаге мы устанавливаем биты A16…A14, записывая их в [[#R14]] (регистр базового адреса доступа к VRAM). |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R14**| 0 | 0 | 0 | 0 | 0 | A16 | A15 | A14 |Базовый регистр| {{anchor:n14s3}} **Шаг 3: Установка счетчика адреса (биты A7…A0)** \\ Установите младшие восемь бит A7…A0 счетчика адресов, записав данные в порт 1. |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**Порт 1**| A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 | A7…A0| {{anchor:n14s4}} **Шаг 4: Установка счетчика адресов (биты A13…A8) и режима работы порта 1 ** \\ Установите оставшиеся шесть бит A13…A8 счетчика адресов, записав данные в порт. Также следует указать, какая операция с памятью будет выполняться — чтение или запись. Это очень важно, так как если вы укажете, что следующей операцией будет «чтение», VDP предварительно выберет значение из памяти (заданное ранее заданным адресом) и будет готов к чтению данных от ЦП. Если вы этого не сделаете и не выдадите команду чтения, VDP может не получить достаточно времени для чтения данных из VRAM, а ЦП может получить недопустимые данные. Если вы укажете, что следующей командой будет «запись», тогда VDP не будет выполнять предварительную выборку я вместо этого будет ожидает запись. |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**Порт 1**| 0 | W | A13 | A12 | A11 | A10 | A9 | A8 |A13…A8| | || |!@1| |`|mode|mode{text-align:left;background-color:#ffff9a}=Следующая команда: \\ 0 — если режим чтения \\ 1 — если режим записи|||||||| {{anchor:n14s5}} **Шаг 5: Чтение или запись данных в память** \\ Важно знать, что после каждой операции чтения или записи данных порта 0 счетчик адресов увеличивается. Это очень полезно, когда вам нужно последовательно читать или записывать в память. Однако вы должны следить за временем, чтобы у VDP было достаточно времени для записи кэшированных данных или чтения запрошенных данных. Пожалуйста, обратите внимание на временные задержки. |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**Порт 0**| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |Байт данных| {{anchor:n2}} ====== Глава 2. Назначение регистров ====== {{anchor:n21}} ===== 2.1. Регистры состояния VDP (S) от 0 до 9 ===== Эти регистры только для чтения и используются для получения данных о текущих статусах VDP. {{anchor:s0}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**S0**| F | 5S | C | 5SN |||||Регистр состояния 0| |<100% 5% 5% 90%>| |7|**F**|**Статус прерывания вертикальной развертки** \\ При чтении S0 он сбрасывается.| |6|**SS**|**Статус переполнения количества спрайтов в строке** \\ 5 (или 9 в режиме SM2) спрайтов находятся на одной горизонтальной линии| |5|**C**|**Признак столкновения** \\ Столкнулись два спрайта| |4…0|**5SN**|**Номер спрайта, вызвавшего переполнение в строке**| {{anchor:s1}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**S1**| FL | LPS | ID # ||||| FH |Регистр состояния 1| |<100% 5% 5% 90%>| |7|**FL**|**Световое перо.** \\ Индикатор того, что световое перо обнаруживает свет. Если установлен бит IE2, возникает прерывание. Сброс при чтении S1. \\ //Кнопка мыши 2//. Признак, нажатия на 2–ю кнопку мыши. Сброс при чтении S1 не происходит. | |6|**LPS**|**Кнопка светового пера.** \\ Признак, нажатия на кнопку светового пера \\ //Кнопка мыши 1.// Признак, нажатия на 1–ю кнопку мыши \\ Сброс при чтении S1 не происходит.| |5…1|**ID #**|**Номер модели видеоконтроллера** \\ 1 — 9938 \\ 2 — 9958| |0|**FH**|**Прерывание строчной развертки**. \\ Происходит при достижении лучом номера строки, указанной в [[#R19]]. Состояние сбрасывается при чтении S1 \\ Этот механизм называется — Программируемое строчное прерывание.| {{anchor:s2}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**S2**| TR | VR | HR | BD | 1 | 1 | EO | CE |Регистр состояния 2| |<100% 5% 5% 90%>| |7|**TR**|**Признак готовности к передаче данных.** \\ Указание для ЦП от готовности к следующей передаче. \\ 0 — VDP не готов \\ 1 — VDP готов| |6|**VR**|**Признак начала вертикальной перетрассировки луча.** \\ Устанавливается при сканировании VBLANK области экрана, т.е. при вертикальной перетрассировке луча, пока прорисовывается нижняя и верхняя границы экрана.| |5|**HR**|**Признак начала горизонтальной перетрассировки луча.** Устанавливается при сканировании HBLANK области экрана, т.е. когда прорисовываются правая и левая границы экрана.| |4|**BD**|**Статус обнаружения цвета.** \\ При выполнении команды поиска этот бит устанавливается в 1, если был обнаружен указанный цвет.| |1|**EO**|**Статус отображения поля.** \\ 0 — чётное поле \\ 1 — нечётное поле| |0|**CE**|**Признак загруженности.** \\ 0 — VDP в режиме ожидания команд \\ 1 — VDP выполняет текущую команду| {{anchor:s3}} {{anchor:s4}} {{anchor:s5}} {{anchor:s6}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**S3**| X7 | X6 | X5 | X4 | X3 | X2 | X1 | X0 |Младшие разряды регистра колонок| |**S4**| 1 | 1 | 1 | 1 | 1 | 1 | 1 | X8 |Старшие разряды регистра колонок| |**S5**| Y7 | Y6 | Y5 | Y4 | Y3 | Y2 | Y1 | Y0 |Младшие разряды регистра строк| |**S6**| 1 | 1 | 1 | 1 | 1 | 1 | Y9 | Y8 |Старшие разряды регистра строк| Вышеупомянутые регистры S3…S6 содержат информацию о координатах положения столкновения спрайтов, положения светового пера или относительного движения мыши. {{anchor:s7}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**S7**| C7 | C6 | C5 | C4 | C3 | C2 | C1 | C0 |Статус цвета| Регистр используется при выполнении команд "POINT" и "VRAM to CPU" и содержит данные VRAM. {{anchor:s8}} {{anchor:s9}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**S8**| BX7 | BX6 | BX5 | BX4 | BX3 | BX2 | BX1 | BX0 |Младшие разряды закодированного цвета по X| |**S9**| 1 | 1 | 1 | 1 | 1 | 1 | 1 | BX8 |Старшие разряды закодированного цвета по X| Когда команда поиска выполняется и кодированный цвет был обнаружен (см. [[#S2]]), этот регистр содержит его координату X. {{anchor:n22}} ===== 2.2. Регистры управления VDP ===== Регистры VDP находятся в диапазонах: от 0 до 23 и от 32 до 46. {{anchor:n221}} ==== 2.2.1. Регистры управления видеорежимами ==== {{anchor:r0}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R0**| 0 | DG | IE2 | IE1 | M5 | M4 | M3 | 0 | | |<100% 10% 90%>| |DG|//Режим графического планшета//: устанавливает шину цвета в режим ввода или вывода| |IE2|Разрешить прерывания от светового пера| |IE1|Разрешить прерывание начала горизонтальной перетрассировки луча| |M5|Биты управления режимом экрана (см. [[#n3|главу "Режимы экрана"]])| |M4|:::| |M3|:::| {{anchor:r1}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R1**| 0 | BL | IE0 | M1 | M2 | 0 | SI | MAG | | |<100% 10% 90%>| |BL|Управление отображением: \\ 0 — изображение выключено \\ 1 — изображение включено| |IE0|Разрешить прерывание начала вертикальной перетрассировки луча| |M1|Биты управления режимом экрана (см. [[#n3|главу "Режимы экрана"]])| |M2|:::| |SI|//Размер спрайтов//: \\ 0 — 8×8 \\ 1 — 16×16| |MAG|//Увеличение спрайта//: \\ 1 — спрайты увеличены (в два раза)| {{anchor:r8}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R8**| MS | LP | TP | CB | VR | 0 | SPD | BW | | |<100% 10% 90%>| |MS|//Мышь//: \\ 0 — устанавливает шину цвета в режим вывода и отключает мышь \\ 1 — устанавливает шину цвета в режим ввода и включает мышь| |LP|//Световое перо//: \\ 0 — выключить \\ 1 — включить| |TP|Переключает режим палитры для цвета с кодом 0| |CB|//Шина цвета//: \\ 0 — режим вывода \\ 1 — режим ввода| |VR|Выбор типа и организации VRAM: \\ 0 — 16Кб×1бит или 16Кб×4бит \\ 1 — 64Кб×1бит или 64Кб×4бит| |SPD|//Отключение спрайтов//: \\ 1 — спрайты не отображаются и связанные c ними функции обработки спрайтовых таблиц не выполняются| |BW|Черно–белый режим: \\ 0 — отключён \\ 1 — вывод изображения в 32 оттенках серого| {{anchor:r9}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R9**| LN | 0 | S1 | S0 | IL | E0 | *NT | DC | | |<100% 10% 90%>| |LN|Строка (количество точек по вертикали): \\ 0 — 192 \\ 1 — 212| |S1|Режим совмещённого вывода: \\ 00 — Передний план (по умолчанию) \\ 01 — Digitizer или Superimposition \\ 10 — Внешний видеосигнал| |S0|:::| |IL|//Чересстрочная развёртка//: \\ 0 — выключена \\ 1 — включена | |EO|//Режим чередования видеостраниц чётная/нечётная//: \\ 0 — отображение одной видеостраницы \\ 1 — чередование двух видеостраниц| |*NT|Режим выхода RGB: \\ 0 — NTSC (262 линий, 60 Гц) \\ 1 — PAL (313 линий, 50 Гц)| |DC|//*DLCLK (источник тактирования VDP)//: \\ 0 — внешний \\ 1 — внутренний| {{anchor:n222}} ==== 2.2.2. Регистры установки базовых адресов таблиц ==== При отображении информации на экране VDP использует цвет, спрайты и другую информацию из видеопамяти. Важно установить правильные начальные адреса таких структур в VRAM путем записи в указанные регистры базовых адресов таблиц. __//Примечание://__ //Важно, чтобы неиспользуемые биты были установлены в 0.// |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R2\_\_\_(ТNT)**| 0 | A16 | A15 | A14 | A13 | A12 | A11 | A10 |Таблица имён {{anchor:r2}}| |**R3\_\_\_(ТCT)**| A13 | A12 | A11 | A10 | A9 | A8 | A7 | A6 |Таблица цветов тайлов (тайловая окраска) {{anchor:r3}}| |**R10\_(ТCT)**| 0 | 0 | 0 | 0 | 0 | A16 | A15 | A14 |Старшие разряды TCT {{anchor:r10}}| |**R4\_\_\_(TPT)**| 0 | 0 | A16 | A15 | A14 | A13 | A12 | A11 |[[#pgt|Таблица знакогенератора]] {{anchor:r4}}| |**R5\_\_\_(SAT)**| A14 | A13 | A12 | A12 | A10 | A9 | A8 | A7 |Таблица атрибутов спрайтов [[#n222fn1|∗]] {{anchor:r5}}| |**R11\_(SAT)**| 0 | 0 | 0 | 0 | 0 | 0 | A16 | A15 |Старшие разряды SAT {{anchor:r11}}| |**R6\_\_\_(SPT)**| 0 | 0 | A16 | A15 | A14 | A13 | A12 | A11 |Таблица шаблонов спрайтов {{anchor:r6}}| {{anchor:n222fn1}} ∗ В режиме SM2 спрайтового движка, SAT так же указывает на SCT — Таблицу цветов спрайтов (спрайтовая окраска). Адрес SCT равен полному адресу SAT, минус 512 байт. {{anchor:n223}} ==== 2.2.3. Регистры управления цветом ==== Регистры цвета используются для управления цветом текста и фона экрана, миганием и другими функциями. {{anchor:r7}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R7**| @#cdffff:TC3 | @#cdffff:TC2 | @#cdffff:TC1 | @#cdffff:TC0 | @#ffff9a:BD3 | @#ffff9a:BD2 | @#ffff9a:BD1 | @#ffff9a:BD0 |Цвет текста и полей экрана| |:::| @#cdffff:Цвет текста в режимах [[#Text1]] и [[#Text2]] |||| @#ffff9a:Цвет бордюра/фона экрана ||||:::| {{anchor:r12}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R12**| @#cdffff:T23 | @#cdffff:T22 | @#cdffff:T21 | @#cdffff:T20 | @#ffff9a:BD3 | @#ffff9a:BD2 | @#ffff9a:BD1 | @#ffff9a:BD0 |Цвет текста и фона в области мигания| |:::| @#cdffff:Цвет текста в области мигания |||| @#ffff9a:Цвет фона области мигания ||||:::| В режиме [[#Text2]], если атрибуты для мигания установлены, цвет, установленный в этом регистре R12 и в регистре [[#R7]], то [[#n326|текст отображается попеременно (мигает)]]. {{anchor:r13}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R13**| @#cdffff:ON3 | @#cdffff:ON2 | @#cdffff:ON1 | @#cdffff:ON0 | @#ffff9a:OF3 | @#ffff9a:OF2 | @#ffff9a:OF1 | @#ffff9a:OF0 |Регистр периода мигания | |:::| @#cdffff:Время отображения чётной страницы |||| @#ffff9a:Время отображения нечётной страницы ||||:::| В режиме [[#Text2]] и в режимах от Graphic4 до Graphic7 две страницы могут попеременно отображаться (мигать). Для управления используете регистр [[#R13]]. {{anchor:r20}} {{anchor:r21}} {{anchor:r22}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R20**| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |Регистр синхронизации цвета 1| |**R21**| 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 |Регистр синхронизации цвета 2| |**R22**| 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |Регистр синхронизации цвета 3| Вышеуказанные значения регистров цветовой синхронизации устанавливаются при включении питания. Если все биты во всех трех регистрах установлены в 0, то цветной сигнал на выходе композитного видео будет отсутствовать. Если значения возвращаются к вышеуказанным значениям, VDP начнет генерировать нормальный сигнал цветовой синхронизации. {{anchor:n224}} ==== 2.2.4. Регистр управления смещением видеобуфера ==== Регистры дисплея используются для управления положением изображения на экране. {{anchor:r18}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R18**| @#cdffff:V3 | @#cdffff:V2 | @#cdffff:V1 | @#cdffff:V0 | @#ffff9a:H3 | @#ffff9a:H2 | @#ffff9a:H1 | @#ffff9a:H0 |Регистр настройки дисплея| Через [[#R18]] устанавливается горизонтальное и вертикальное смещения изображения на экране. Смотри таблицу ниже: | | Значение ||||||| |:::| 7 | … | 1 | 0 | 15 | … | 8 | | Горизонталь | Лево | … | … | Центр | … | … | Право | | Вертикаль | Верх | … | … | ::: | … | … | Низ | {{anchor:n225}} ==== 2.2.5. Регистр управления вертикальной прокруткой ==== {{anchor:r23}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R23**| DO7 | DO6 | DO5 | DO4 | DO3 | DO2 | DO1 | DO0 |Регистр управления вертикальной прокруткой| [[#R23]] устанавливает значение первой строки для отображения на экране. Размер виртуального экрана составляет 256 строк, размер видимого вертикального экрана может составлять 192 или 212 в зависимости от бита LN регистра [[#R9]]. Установка в [[#R23]] значение, отличное от 0, может отображать не инициализированные части памяти, которые могут выглядеть как мусор. Отображение виртуального экрана выполняется циклически, это означает, что при увеличении значения в [[#R23]] верх виртуального экрана появляется внизу видимого экрана. __//Примечание://__ //В текстовых режимах [[#Text1]] и [[#Text2]], вертикальная прокрутка вместо видеобуфера прокручивает шаблоны внутри знакомест.// Пример использования регистра прокрутки: |<100% 50% 50%>| | {{p214_1.png|}} | {{p214_2.png|}} | | Исходное изображение в режиме [[#G1|Graphic1]] | Адрес экрана, горизонтальная линия сканирования равна 256 точек, режим [[#G1|Graphic1]], верхняя часть появляется снизу | |Изображения “Auf Wiedersehen Monty”, являются собственностью Gremlin Graphics. Используется в здесь только в образовательных целях.|| {{anchor:n226}} ==== 2.2.6. Регистр установки номера линии экрана, для прерывания вертикальной развертки ==== При разрешённых прерываниях вертикальной развертки, когда луч достигнет строки с номером, записанном в [[#R19]], произойдет вызов обработчика прерывания. |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R19**| IL7 | IL6 | IL5 | IL4 | IL3 | IL2 | IL1 | IL0 |Регистр линии развёртки| VDP создаёт прерывание, когда начинает отображать соответствующую строку развертки, если бит 4 (IE1) регистра [[#R0]] установлен в 1. Запишите значение в этот регистр [[#R19]], и когда VDP начнёт отображать указанную строку, он установит бит 0 (FH) регистра состояния [[#S1]] в 1. {{anchor:n227}} ==== 2.2.7. Регистры доступа ==== Регистры доступа это регистры, которые используются для доступа к другим регистрам VDP или VRAM. Это регистры [[#R14]], [[#R15]], [[#R16]] и [[#R17]]. {{anchor:r14}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R14**| 0 | 0 | 0 | 0 | 0 | A16 | A15 | A14 |Базовый регистр доступа к VRAM | R14 содержит три старших бита адреса доступа к VRAM. Во всех режимах, кроме [[#G1|Graphic1]], [[#G2|Graphic2]], [[#MC|MultiColor]] и [[#Text1]], если из–за автоинкримента адреса в битах A13...A0, есть флаг переноса из бита адреса A13, значение в этом регистре R14 автоматически инкрементируется. {{anchor:r15}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R15**| 0 | 0 | 0 | 0 | S3 | S2 | S1 | S0 |Селектор регистра состояния| R15 указывает на соответствующий регистр состояния (S0…S9). {{anchor:r16}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R16**| 0 | 0 | 0 | 0 | C3 | C2 | C1 | C0 |Селектор выбора номера цвета для изменения палитры| [[#R16]] указывает на соответствующий регистр палитры цветов (P0…P15), к которому необходимо получить доступ. {{anchor:r17}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R17**| AII | 0 | RS5 | RS4 | RS3 | RS2 | RS1 | RS0 |Селектор регистра управления| [[#R17]] это регистр, используемый для косвенного доступа к другим регистрам VDP. Он также имеет флаг автоинкремента (AII), который используется для автоинкремента номера регистра при обращении. Такой механизм очень удобен для автоматического последовательного заполнения регистров данными. Например при использовании функций (см. ниже). {{anchor:n228}} ==== 2.2.8. Регистры аргументов функции ==== Регистры аргументов функции используются при вызове функции VDP. Подробности использования этих регистров будут рассмотрены ниже. {{anchor:r32}} {{anchor:r33}} {{anchor:r34}} {{anchor:r35}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R32**| SX7 | SX6 | SX5 | SX4 | SX3 | SX2 | SX1 | SX0 |Младшие разряды исходного X| |**R33**| 0 | 0 | 0 | 0 | 0 | 0 | 0 | SX8 |Старшие разряды исходного X| |**R34**| SY7 | SY6 | SY5 | SY4 | SY3 | SY2 | SY1 | SY0 |Младшие разряды исходного Y| |**R35**| 0 | 0 | 0 | 0 | 0 | 0 | SY9 | SY8 |Старшие разряды исходного Y| {{anchor:r36}} {{anchor:r37}} {{anchor:r38}} {{anchor:r39}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R36**| DX7 | DX6 | DX5 | DX4 | DX3 | DX2 | DX1 | DX0 |Младшие разряды целевого X| |**R37**| 0 | 0 | 0 | 0 | 0 | 0 | 0 | DX8 |Старшие разряды целевого X| |**R38**| DY7 | DY6 | DY5 | DY4 | DY3 | DY2 | DY1 | DY0 |Младшие разряды целевого Y| |**R39**| 0 | 0 | 0 | 0 | 0 | 0 | DY9 | DY8 |Старшие разряды целевого Y| {{anchor:r40}} {{anchor:r41}} {{anchor:r42}} {{anchor:r43}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R40**| NX7 | NX6 | NX5 | NX4 | NX3 | NX2 | NX1 | NX0 |Младшие разряды числа точек X| |**R41**| 0 | 0 | 0 | 0 | 0 | 0 | 0 | NX8 |Старшие разряды числа точек X| |**R42**| NY7 | NY6 | NY5 | NY4 | NY3 | NY2 | NY1 | NY0 |Младшие разряды числа точек Y| |**R43**| 0 | 0 | 0 | 0 | 0 | 0 | NY9 | NY8 |Старшие разряды числа точек Y| {{anchor:r44}} {{anchor:r45}} |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R44**| CH3 | CH2 | CH1 | CH0 | CL3 | CL2 | CL1 | CL0 |Регистр цвета| |**R45**| 0 | MXC | MXD | MXS | DIY | DIX | EQ | MAJ |Регистр расширенных свойств вызываемой функции| {{anchor:n229}} {{anchor:r46}} ==== 2.2.9. Регистр вызова функции ==== |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R46**| CM3 | CM2 | CM1 | CM0 | LO3 | LO2 | LO1 | LO0 |Регистр вызова функции| При обращении к этому регистру, происходит запуск указанной в нем функции с заданными аргументами в регистрах 32…45 или остановки выполнения текущей функции. {{anchor:n3}} ====== Глава 3. Режимы экрана ====== {{anchor:n31}} {{anchor:text1}} ===== 3.1. Режим Text1 ===== |<60% 60% 40%>| ^Характеристики^^ |Размер шаблона с точках (Ш×В)|6×8| |Число шаблонов|256| |Размер экрана, в шаблонах (Ш×В)|Значение бита LN регистра [[#R9]] определяет размер: \\ 0 — 40×24 \\ 1 — 40×26.5| |Цвета шаблона|Два цвета из 512 (на экран)| |Размер VRAM на экран|4 Кбайта| |<60% 60% 40%>| ^Управление^^ |Адрес шаблонов шрифта| Таблица знакогенератора [[#R4]]| |Адрес макета экрана|Таблица имён [[#R2]]| |Цвет текста (ненулевые биты шаблона = 1)|Четыре старшие бита [[#R7]]| |Цвета фона (нулевые биты шаблона = 0)|Четыре младшие бита [[#R7]]| |<60% 20% 10% 10% 10% 10% 10%>| ^Установка режима^^^^^^ |Бит|M5 ([[#R0]])|M4 ([[#R0]])|M3 ([[#R0]])|M2 ([[#R1]])|M1 ([[#R1]])| |Значение| 0 | 0 | 0 | 0 | 1 | |<60% 60% 40%>| ^Значения по умолчанию в [[msx:basic:|]]^^ |Номер экрана|0| |Ширина|1…40| |[[#n312|Таблица знакогенератора]]|0x00800…0x00FFF| |[[#n313|Макет экранной страницы]]|0x00000…0x003BF| {{anchor:n312f1}} __//Примечание//__: При установке в режиме Text1 размера экрана 26.5 строк таблица макетов шаблонов (Pattern Layout Table) после адреса 0x003FF переходит снова к адресу 0, поэтому в нижней части экрана будет отображаться небольшой кусок верхней части экрана. VDP(10)=130 {{vdp10_130.png|}} {{anchor:n312}} ==== 3.1.2. Таблица знакогенератора ==== Адрес таблицы знакогенератора задается регистром [[#R4]]. Шрифт, отображаемый на экране для каждого шаблона [[#pgt|таблицы знакогенератора]], состоит из 8 байт, при этом отображается 6 старших бит, а 2 младших бита не отображаются. Байты шаблонов шрифта идут в таблице последовательно по 8 на символ. Таким образом, адрес нужного символа вычисляется как: ''ADR=TPT_Addr+C*8'' (адрес [[#pgt|таблицы знакогенератора]]+код символа*8) Пример таблицы знакогенератора приведен ниже: |<70% 15% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| ^ Адрес |:::|:::|:::|:::|:::|:::|:::|:::^ Описание | |0| | | @#000000:██ | | | | ╳ | ╳ |Шаблон 0 (PN0)| |1| | @#000000:██ | | @#000000:██ | | | ╳ | ╳ |:::| |2| @#000000:██ | | | | @#000000:██ | | ╳ | ╳ |:::| |3| @#000000:██ | | | | @#000000:██ | | ╳ | ╳ |:::| |4| @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | | ╳ | ╳ |:::| |5| @#000000:██ | | | | @#000000:██ | | ╳ | ╳ |:::| |6| @#000000:██ | | | | @#000000:██ | | ╳ | ╳ |:::| |7| | | | | | | ╳ | ╳ |:::| |8| @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | | | ╳ | ╳ |Шаблон 1 (PN1)| |9| @#000000:██ | | | | @#000000:██ | | ╳ | ╳ |:::| |10| @#000000:██ | | | | @#000000:██ | | ╳ | ╳ |:::| |11| @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | | | ╳ | ╳ |:::| |12| @#000000:██ | | | | @#000000:██ | | ╳ | ╳ |:::| |13| @#000000:██ | | | | @#000000:██ | | ╳ | ╳ |:::| |14| @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | | | ╳ | ╳ |:::| |15| | | | | | | ╳ | ╳ |:::| | |||||||||| | … | … |||||||| … | | |||||||||| |2040| @#000000:██ | | @#000000:██ | | @#000000:██ | | ╳ | ╳ |Шаблон 255 (PN255)| |2041| | @#000000:██ | | @#000000:██ | | @#000000:██ | ╳ | ╳ |:::| |2042| @#000000:██ | | @#000000:██ | | @#000000:██ | | ╳ | ╳ |:::| |2043| | @#000000:██ | | @#000000:██ | | @#000000:██ | ╳ | ╳ |:::| |2044| @#000000:██ | | @#000000:██ | | @#000000:██ | | ╳ | ╳ |:::| |2045| | @#000000:██ | | @#000000:██ | | @#000000:██ | ╳ | ╳ |:::| |2046| @#000000:██ | | @#000000:██ | | @#000000:██ | | ╳ | ╳ |:::| |2047| | @#000000:██ | | @#000000:██ | | @#000000:██ | ╳ | ╳ |:::| {{anchor:n313}} ==== 3.1.3. Макет экранной страницы ==== FIXME Начальный адрес макета экранной страницы хранится в регистре [[#R2]]. Макет экранной страницы представляет собой текстовую страницу 40×24 (или 40×27 если бит LN регистра [[#R9]] установлен), которая является картой кодов символов, которые VDP во время отображения, аппаратно подставляет из таблицы знакогенератора. Каждое место на экране содержит код (номер) шаблона из [[#pgt|таблицы знакогенератора]], отображаемого в соответствующем месте. Адрес для изменения или считывания кода в нужной позиции макета экранной страницы, получается простым вычислением: ''Addr=TNT_Addr+Y*40+X'' Схема распределения относительных адресов в макете экранной страницы приведена ниже: |<70% 5% 5% 5% 5% 5% 5% 5% 5%>| | ^ Колонки (X) ^|||||| ^ Строки (Y) ^ 0 ^ 1 ^ 2 ^ 3 ^ … ^ … ^ 39 ^ ^ 0 | 0 | 1 | 2 | 3 | … | … | 39 | ^ 1 | 40 | 41 | 42 | 43 | … | … | 79 | ^ | ||||||| ^ … | … | … | … | … | … | … | … | ^ | ||||||| ^ 22 | 880 | 881 | 882 | 883 | … | … | 919 | ^ 23 | 920 | 921 | 922 | 923 | … | … | 959 | {{anchor:n314}} ==== 3.1.4. Регистры настройки цвета ==== FIXME Настройки цвета находятся в регистре [[#R7]]. Биты TC3…TC0 определяют цвет ненулевых пикселей символа, заданных в таблице генератора шаблонов, биты BD3…BD0 определяют цвет прозрачных (или фоновых) пикселей. __//Примечание://__ //Цвет бордюров экрана в режиме [[#Text1]], всегда совпадает с цветом фона.// {{anchor:n315}} ==== 3.1.5. Пример многостраничного распределения видеопамяти для режима Text1 ==== FIXME Каждая страница содержит своё определение шаблонов символов, и свой макет экрана: |<100% 10% 20% 70%>| | 0x00000 \\ \\ \\ \\ 0x003BF| [[#n313|Макет экранной страницы]] \\ 0 \\ (40*24=960 байт) \\ (LN: 40*27=1080 байт) | |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 10%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**[[#R2|R2 (ТNT)]]**| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | |:::| | A16 | A15 | A14 | A13 | A12 | A11 | A10 |:::| | | … | … | … | | 0x00800 \\ \\ \\ \\ 0x00FFF| [[#n312|Таблица знакогенератора]] \\ 0 \\ (256*8=2048 байт) | |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 10%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**[[#R4|R4 (TPT)]]**| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | | |:::| | | A16 | A15 | A14 | A13 | A12 | A11 |:::| | | 0x01000 \\ \\ \\ \\ 0x013BF| [[#n313|Макет экранной страницы]] \\ 1 \\ (40*24=960 байт) \\ (LN: смотри [[# n312f1|примечание]]) | |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 10%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**[[#R2|R2 (ТNT)]]**| 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | | |:::| | A16 | A15 | A14 | A13 | A12 | A11 | A10 |:::| | | … | … | … | | 0x01800 \\ \\ \\ \\ 0x01FFF| [[#n312|Таблица знакогенератора]] \\ 1 \\ (256*8=2048 байт) | |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 10%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**[[#R4|R4 (TPT)]]**| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | | |:::| | | A16 | A15 | A14 | A13 | A12 | A11 |:::| | | \_ \\ \_ … \\ \_ | … | … | | 0x1FFFF| |Таким же образом можно выделить максимум 32 страницы, если к VDP подключено 128 Кбайт.| {{anchor:n321}} {{anchor:text2}} ===== 3.2. Режим Text2 ===== FIXME |<60% 60% 40%>| ^Характеристики^^ |Размер шаблона с точках (Ш×В)|6×8| |Число шаблонов|256| |Размер экрана, в шаблонах (Ш×В)|Значение бита LN регистра [[#R9]] определяет размер: \\ 0 — 80×24 \\ 1 — 80×26.5| |Цвета шаблона|Два цвета из 512 (на экран) или четыре при использовании мигания| |Размер VRAM на экран|8 Кбайт| |<60% 60% 40%>| ^Управление^^ |Адрес шаблонов шрифта|[[#n322|Таблица знакогенератора]]| |Адрес макета экрана|Таблица имен [[#R2]]| |Цвет текста (ненулевые биты шаблона = 1)|Четыре старшие бита [[#R7]]| |Цвета фона (нулевые биты шаблона = 0)|Четыре младшие бита [[#R7]]| |Цвет текста в области мигания|Четыре старшие бита [[#R12]]| |Цвет фона области мигания|Четыре младшие бита [[#R12]]| |<60% 20% 10% 10% 10% 10% 10%>| ^Установка режима^^^^^^ |Бит|M5 ([[#R0]])|M4 ([[#R0]])|M3 ([[#R0]])|M2 ([[#R1]])|M1 ([[#R1]])| |Значение| 0 | 1 | 0 | 0 | 1 | Число строк задаётся битом LN регистра [[#R9]]: |<25% 20% 80%>| ^Значение^Число строк^ |0|24| |1|26.5| |<60% 60% 40%>| ^Значения по умолчанию в [[msx:basic:|]]^^ |Номер видеорежима |0| |Адрес [[#n322|таблицы знакогенератора]]|0x01000…0x017FF| |Адрес [[#n323|макета экранной страницы]]|0x00000…0x0077F \\ 0x00000…0x0086F| |Адрес [[#n324|таблицы атрибутов мигания]]|0x00800…0x008EF \\ 0x00800…0x0090D| {{anchor:n322}} ==== 3.2.2. Таблица знакогенератора ==== FIXME Организация таблицы генератора шаблонов такая же, как в режиме [[#n312|Text1]]. {{anchor:n323}} ==== 3.2.3. Макет экранной страницы ==== FIXME Макет экранной страницы представляет собой карту экрана (для каждого изображения на экране). Каждая ячейка таблицы содержит код шаблона, отображаемого в соответствующем месте экрана. Эта таблица состоит из 80×24 байт, которые являются кодами (номерами) шаблонов из таблицы знакогенератора. Важно, что если бит LN [[#R9]] установлен в 1, то отображается 26 с половиной строк. Этот бит отвечает за отображение 212 строк на экране, а значит высота экрана в строках текста равна 212/8=26.5, что составляет 2160 байт экранной области. Адрес макета экранной страницы хранится в регистре [[#R2]], два младших бита регистра, всегда равны 1. |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R2\_\_\_(ТNT)**| 0 | A16 | A15 | A14 | A13 | A12 | 1 | 1 |Таблица имён| Схема распределения относительных адресов в макете экранной страницы приведена ниже: |<70% 5% 5% 5% 5% 5% 5% 5% 5%>| | ^ Колонки (X) ^|||||| ^ Строки (Y) ^ 0 ^ 1 ^ 2 ^ 3 ^ … ^ … ^ 79 ^ ^ 0 | 0 | 1 | 2 | 3 | … | … | 79 | ^ 1 | 80 | 81 | 82 | 83 | … | … | 159 | ^ | ||||||| ^ … | … | … | … | … | … | … | … | ^ | ||||||| ^ 25 | 2000 | 2001 | 2002 | 2003 | … | … | 2079 | ^ 26 | 2080 | 2081 | 2082 | 2083 | … | … | 2159 | ^ 27 | 2160 | 2061 | 2062 | 2063 | … | … | 2239 | {{anchor:n324}} ==== 3.2.4. Регистры цвета ==== FIXME Настройки цвета находятся в регистре [[#R7]]. Биты TC3…TC0 определяют цвет ненулевых пикселей символа, заданных в таблице генератора шаблонов, биты BD3…BD0 определяют цвет прозрачных (или фоновых) пикселей. __//Примечание://__ //В режиме [[#Text2]], цвет бордюра всегда равен цвету фона.// Цвета текста и фона в области мигания определяются в [[#R12]]. {{anchor:n325}} ==== 3.2.5. Атрибуты области мигания ==== FIXME Каждая позиция на экране имеет отдельный бит для атрибута мигания, и если этот бит установлен на 1, мигание будет применено к рисунку, помещенному в эту область в [[#n313|таблице макетов шаблонов]]. Начальный адрес таблицы задаётся в регистрах [[#R3]] и [[#R10]]. |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R3\_\_\_(ТCT)**| A13 | A12 | A11 | A10 | A9 | 1 | 1 | 1 |Таблица цветов тайлов (тайловая окраска)| |**R10\_(ТCT)**| 0 | 0 | 0 | 0 | 0 | A16 | A15 | A14 |Старшие разряды TCT| Структура таблицы цветов приведена ниже. |<100% 15% 7% 7% 7% 7% 7% 7% 7% 7% 30%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |0| (0,0) | (1,0) | (2,0) | (3,0) | (4,0) | (5,0) | (6,0) | (7,0) | | |1| (8,0) | (9,0) | (10,0) | (11,0) | (12,0) | (13,0) | (14,0) | (15,0) |:::| | … | … | … | … | … | … | … | … | … |:::| | … | … | … | … | … | … | … | … | … |:::| | … | … | … | … | … | … | … | … | … |:::| |269| (72,26) | (73,26) | (74,26) | (75,26) | (76,26) | (77,26) | (78,26) | (79,26) |:::| {{anchor:n326}} ==== 3.2.6. Настройка периода мигания ==== FIXME Поочередно будут отображаться цветовые коды, заданные в регистрах [[#R7]] и [[#R12]]; Частоту мигания (время включения и выключения) можно задать через регистр [[#R13]]. | | | |,|-|-|-|-|-|.| | | | | |,|-|-| |R7|!| |R12| |!| |R7| |!|R12|R12{border-color:white}=[[#R12]]|R7{border-color:white}=[[#R7]] | |-|-|'| | | | | |`|-|-|-|-|-|'| | | | |!|~@8|Even|~@2|!|~@8|Odd|~@2|!|Even{border-color:white}=Чётнная страница|Odd{border-color:white}=Нечётнная страница Значения времени для NTSC рассчитываются по формуле: ''T=(166.9*X)/1000'' (время в секундах), \\ где ''X'', это длительность включения/отключения, определенная в [[#R13]] Если длительность включения равна 15, а длительность отключения равна 0, атрибуты области мигания включены постоянно. {{anchor:n327}} ==== 3.2.7. Пример распределения видеопамяти ==== FIXME Пример распределения видеопамяти для режима Text2: |<100% 10% 20% 70%>| | 0x00000 \\ \\ \\ \\ 0x00870| [[#n313|Макет экранной страницы]] \\ 0 \\ (80*24=1920 байт) \\ (LN: 80*27=2160 байт) | |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 10%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**[[#R2|R2 (ТNT)]]**| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | | |:::| | A16 | A15 | A14 | A13 | A12 | | |:::| | | … | … | … | | 0x00A00 \\ \\ \\ \\ 0x00B0E| Таблица цветов \\ 0 \\ (80*24/8=240 байт) \\ (LN: 80*27/8=270 байт) | |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 10%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**[[#R3|R3 (ТCT)]]**| 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | | |:::| A13 | A12 | A11 | A10 | A9 | | | | | | | … | … | … | | 0x01000 \\ \\ \\ \\ 0x01800| [[#pgt|Таблица знакогенератора]] \\ 0 \\ (256*8=2048 байт) | |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 10%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**[[#R10|R10 (ТCT)]]**| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | |:::| | | | | | A16 | A15 | A14 |:::| | | … | … | |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 10%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**[[#R4|R4 (TPT)]]**| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | | |:::| | | A16 | A15 | A14 | A13 | A12 | A11 |:::| | | 0x02000 \\ \\ \\ \\ 0x02870| Макет экранной страницы \\ 1 | | | … | … | … | | 0x02A00 \\ \\ \\ \\ 0x02B0E| Таблица цветов \\ 1 | | | … | … | … | | 0x03000 \\ \\ \\ \\ 0x037FF| [[#pgt|Таблица знакогенератора]] \\ 1 | | \_ \\ \_ … \\ \_ | … | … | | 0x04000 \\ \\ \\ \\ 0x1FFFF| |Таким же образом можно выделить максимум 16 страниц, если к VDP подключено 128 Кбайт.| {{anchor:n33}} {{anchor:mc}} ===== 3.3. Режим MultiColor (MC) ===== FIXME |<60% 60% 40%>| ^Характеристики^^ |Размер экрана, в цветных блоках (Ш×В)|Значение бита LN регистра [[#R9]] определяет размер: \\ 0 — 64×48 \\ 1 — 64×53| |Цвета блоков|16 из 512 цветов| |Режим спрайтов|[[#sm1|Sprite mode 1]]| |Размер VRAM на экран|4 Кбайт| |<60% 60% 40%>| ^Управление^^ |Шаблон шрифта|[[#n331|Таблица знакогенератора]]| |Расположение шаблона экрана |Имя таблицы шаблона| |Цвет фона|Четыре младшие бита [[#R7]]| |Спрайты|VRAM sprite attribute table \\ VRAM sprite pattern table| |<60% 20% 10% 10% 10% 10% 10%>| ^Установка режима^^^^^^ |Бит|M5 ([[#R0]])|M4 ([[#R0]])|M3 ([[#R0]])|M2 ([[#R1]])|M1 ([[#R1]])| |Значение| 0 | 0 | 0 | 1 | 0 | |<60% 60% 40%>| ^Значения по умолчанию в [[msx:basic:|]]^^ |Номер видеорежима|3| |[[#n312|Таблица знакогенератора]]|0x00000…0x007FF| |[[#n313|Макет экранной страницы]]|0x00800…0x00AFF \\ 0x00800…0x00B5F| |Шаблоны спрайтов|0x03800…0x03FFF| |Атрибуты спрайтов|0x01B00…0x01B7F| {{anchor:n331}} ==== 3.3.1. Таблица знакогенератора ==== FIXME Каждый шаблон [[#pgt|таблицы знакогенератора]] состоит из четырех цветовых блоков. Эти шаблоны имеют размер 8×8 для экрана размером 256×192 точек. |<25%>| | |~@8| |Dots| |~@2|Dots{border-color:white}=8 точек || | Блок A | Блок B | | |:@1| | | |Dots|Dots{border-color:white}=8 точек | | | |:@4| | | Блок C | Блок D |:::| Для каждого блока A, B, C и D можно указать шестнадцать цветов. Для каждого шаблона используются два байта. |<75% 10% 5% 5% 5% 5% 5% 5% 5% 5% 15%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| | | Код цвета A |||| Код цвета B |||| | |:::| Код цвета C |||| Код цвета D ||||:::| Для каждого шаблона предусмотрено четыре цветовых блока (8 байтов). Определенный цветовой блок используется для отображения в зависимости от координаты Y. |<100% 5% 5% 5% 1% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит|||^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |Имя шаблона| A | B | | Код цвета A |||| Код цвета B ||||Цвет шаблона, если Y=0, 4, 8, 12, 16 или 20| |:::| C | D |:::| Код цвета C |||| Код цвета D ||||:::| |:::| |||||||||||| |:::| E | F | | Код цвета E |||| Код цвета F ||||Цвет шаблона, если Y==1, 5, 9, 13, 17 или 21| |:::| G | H |:::| Код цвета G |||| Код цвета H ||||:::| |:::| |||||||||||| |:::| I | J | | Код цвета I |||| Код цвета J ||||Цвет шаблона, если Y=2, 6, 10, 14, 18 или 22| |:::| K | L |:::| Код цвета K |||| Код цвета L ||||:::| |:::| |||||||||||| |:::| M | N | | Код цвета M |||| Код цвета N ||||Цвет шаблона, если Y=3, 7, 11, 15, 19 или 23| |:::| O | P |:::| Код цвета O |||| Код цвета P ||||:::| Адрес начала таблицы генератора шаблонов задаётся в регистре [[#R4]]. {{anchor:n332}} ==== 3.3.2. Макет экранной страницы ==== FIXME Макет экранной страницы представляет собой карту экрана (для каждого экрана), содержащую один байт для каждого местоположения экрана. Каждый байт определяет уникальный номер шаблона. Адрес макета экранной страницы храниться в регистре [[#R2]]. |<70% 5% 5% 5% 5% 5% 5% 5% 5%>| | ^ Колонки (X) ^|||||| ^ Строки (Y) ^ 0 ^ 1 ^ 2 ^ 3 ^ … ^ … ^ 31 ^ ^ 0 | 0 | 1 | 2 | 3 | … | … | 31 | ^ 1 | 32 | 33 | 34 | 35 | … | … | 63 | ^ | ||||||| ^ … | … | … | … | … | … | … | … | ^ | ||||||| ^ 22 | 704 | 705 | 706 | 707 | … | … | 735 | ^ 23 | 736 | 737 | 738 | 739 | … | … | 767 | {{anchor:n333}} ==== 3.3.3. Регистры цвета ==== FIXME Цвет фона экрана, можно задать, указав значение в битах BD3…BD0 в регистре [[# R7]]. Обратите внимание, что значения бит TC3…TC0 регистра [[#R7]] игнорируются. {{anchor:n334}} ==== 3.3.4. Спрайты ==== FIXME Адрес начала таблицы атрибутов спрайта в задаётся в регистрах [[#R5]] и [[#R11]]; адрес начала таблицы генератора спрайтов в регистре [[#R6]]. Подробную информацию о спрайтах см. В разделе [[#sm1|Sprite mode 1]]. {{anchor:n335}} ==== 3.3.5. Пример распределения видеопамяти ==== FIXME Пример распределения видеопамяти для режима MultiColor |<100% 10% 20% 70%>| | 0x00000 \\ \\ \\ \\ 0x003FF| Sprite generator table \\ 0 \\ (128*8=1024 байт) |В этом режиме доступна только половина от максимально возможного количества спрайтов — от 0 до 127. Спрайты с номерами 128-255 перекрывают таблицу макетов шаблонов (Pattern Layout Table).| | 0x00400 \\ \\ \\ \\ 0x006FF| Макет экранной страницы \\ 0 \\ (32*24=768 байт) \\ (LN: 32*27=864 байт) |Хотя доступен режим 26.5 строк, пространство над 24 строками в этом макете перекрывает таблицу атрибутов спрайта.| | 0x00700 \\ \\ \\ \\ 0x0077F| Sprite attribute table \\ 0 \\ (32*4=128 байт) | | | … | … |:::| | 0x08000 \\ \\ \\ \\ 0x00FFF| [[#pgt|Таблица знакогенератора]] \\ 0 \\ (256*8=2048 байт) |:::| | \_ \\ \_ … \\ \_ | … |Таким же образом можно выделить максимум 32 страницы, если к VDP подключено 128 Кбайт.| | \\ \\ \\ \\ 0x1FFFF| |:::| {{anchor:n34}} {{anchor:g1}} ===== 3.4. Режим Graphic1 (G1) ===== FIXME |<60% 60% 40%>| ^Характеристики^^ |Размер шаблона с точках (Ш×В)|8×8| |Число шаблонов|256| |Размер экрана, в шаблонах (Ш×В)|Значение бита LN регистра [[#R9]] определяет размер: \\ 0 — 32×24 (256×192 точки) \\ 1 — 32×26.5 (256×212 точек)| |Цвета шаблона|16 цветов из 512 (на экран)| |Режим спрайтов|[[#sm1|Sprite mode 1]]| |Размер VRAM на экран|4 Кбайта| |<60% 60% 40%>| ^Управление^^ |Шаблоны тайлов|[[#n341|Таблица знакогенератора]]| |Расположение шаблона экрана |Макет экрана| |Pattern color codes 1 & 0|Specified as a group for each 8-bit pattern in color table| |Цвета фона|Четыре младшие бита [[#R7]]| |Спрайты|VRAM sprite attribute table \\ VRAM sprite pattern table| |<60% 20% 10% 10% 10% 10% 10%>| ^Установка режима^^^^^^ |Бит|M5 ([[#R0]])|M4 ([[#R0]])|M3 ([[#R0]])|M2 ([[#R1]])|M1 ([[#R1]])| |Значение| 0 | 0 | 0 | 0 | 0 | |<60% 60% 40%>| ^Значения по умолчанию в [[msx:basic:|]]^^ |Номер видеорежима|1| |[[#n341|Таблица знакогенератора]]|0x00000…0x007FF| |[[#n342|Макет экранной страницы]]|0x01800…0x01AFF \\ 0x01800…0x01B5F| |Pattern colors|0x02000…0x0201F| |Sprite patterns|0x03800…0x03FFF| |Sprite attributes|0x01B00…0x01B7F| {{anchor:n341}} ==== 3.4.1. Таблица знакогенератора ==== FIXME Шрифт, отображаемый на экране для каждого шаблона [[#pgt|таблицы знакогенератора]], состоит из 8 байтов, при этом отображаются все 8 бит каждого байта. Пример [[#pgt|таблицы знакогенератора]] приведен ниже. |<70% 15% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| ^ Адрес |:::|:::|:::|:::|:::|:::|:::|:::^ Описание | |0| | | @#000000:██ | @#000000:██ | @#000000:██ | | | |Шаблон 0 (PN0)| |1| | @#000000:██ | | | | @#000000:██ | | |:::| |2| @#000000:██ | | | | | | @#000000:██ | |:::| |3| @#000000:██ | | | | | | @#000000:██ | |:::| |4| @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | |:::| |5| @#000000:██ | | | | | | @#000000:██ | |:::| |6| @#000000:██ | | | | | | @#000000:██ | |:::| |7| | | | | | | | |:::| |8| @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | | |Шаблон 1 (PN1)| |9| @#000000:██ | | | | | | @#000000:██ | |:::| |10| @#000000:██ | | | | | | @#000000:██ | |:::| |11| @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | | |:::| |12| @#000000:██ | | | | | | @#000000:██ | |:::| |13| @#000000:██ | | | | | | @#000000:██ | |:::| |14| @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | | |:::| |15| | | | | | | | |:::| | |||||||||| | … | … |||||||| … | | |||||||||| |2040| @#000000:██ | | @#000000:██ | | @#000000:██ | | @#000000:██ | |Шаблон 255 (PN255)| |2041| | @#000000:██ | | @#000000:██ | | @#000000:██ | | @#000000:██ |:::| |2042| @#000000:██ | | @#000000:██ | | @#000000:██ | | @#000000:██ | |:::| |2043| | @#000000:██ | | @#000000:██ | | @#000000:██ | | @#000000:██ |:::| |2044| @#000000:██ | | @#000000:██ | | @#000000:██ | | @#000000:██ | |:::| |2045| | @#000000:██ | | @#000000:██ | | @#000000:██ | | @#000000:██ |:::| |2046| @#000000:██ | | @#000000:██ | | @#000000:██ | | @#000000:██ | |:::| |2047| | @#000000:██ | | @#000000:██ | | @#000000:██ | | @#000000:██ |:::| {{anchor:n342}} ==== 3.4.2. Макет экранной страницы ==== FIXME Макет экранной страницы представляет собой карту экрана (для каждого экрана), содержащую один байт для каждого местоположения экрана. В этой таблице есть 32×24 (767) ячеек, в которых могут отображаться определенные шаблоны. Каждый байт определяет уникальный номер шаблона. Адрес макета экранной страницы храниться в регистре [[#R2]] и соответствует ячейке (0, 0) с адресом 0, см. ниже. |<70% 5% 5% 5% 5% 5% 5% 5% 5%>| | ^ Колонки (X) ^|||||| ^ Строки (Y) ^ 0 ^ 1 ^ 2 ^ 3 ^ … ^ … ^ 31 ^ ^ 0 | 0 | 1 | 2 | 3 | … | … | 31 | ^ 1 | 32 | 33 | 34 | 35 | … | … | 63 | ^ | ||||||| ^ … | … | … | … | … | … | … | … | ^ | ||||||| ^ 22 | 704 | 705 | 706 | 707 | … | … | 735 | ^ 23 | 736 | 737 | 738 | 739 | … | … | 767 | {{anchor:n343}} ==== 3.4.3. Регистры цвета ==== FIXME Цвет фона экрана можно задать, указав значение в битах BD3…BD0 биты в регистре [[#R7]]. Обратите внимание, что биты TC3…TC0 регистра [[#R7]] игнорируются. {{anchor:n344}} ==== 3.4.4. Таблица цвета ==== FIXME Адрес начала таблицы цвета задаётся в регистрах [[#R3]] и [[#R10]]. --- // GreyWolf 2021-06-05 22:45// Эта таблица повторяет части таблицы по ссылкам |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R3\_\_\_(ТCT)**| A13 | A12 | A11 | A10 | A9 | A8 | A7 | A6 |Таблица цветов тайлов (тайловая окраска)| |**R10\_(ТCT)**| 0 | 0 | 0 | 0 | 0 | A16 | A15 | A14 |Старшие разряды TCT| Размер таблицы цветов составляет 32 байта, каждый байт организован так же, как регистр R # 7 (FC - цвет переднего плана, BC - цвет фона). Шаблонам 0…7 присваивается первый цвет. из таблицы цветов шаблонам 8…15 назначается второй цвет из таблицы цветов и т.д., а шаблонам 0xF8…0xFF назначается 31-й цвет из таблицы цветов. Структура таблицы цветов представлены в таблице ниже. |<100% 15% 7% 7% 7% 7% 7% 7% 7% 7% 30%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |0| FC3 | FC2 | FC1 | FC0 | BC3 | BC2 | BC1 | BC0 |Цвет для шаблонов 0…7| |1| FC3 | FC2 | FC1 | FC0 | BC3 | BC2 | BC1 | BC0 |Цвет для шаблонов 8…15| | … | … | … | … | … | … | … | … | … |:::| | … | … | … | … | … | … | … | … | … |:::| | … | … | … | … | … | … | … | … | … |:::| |31| FC3 | FC2 | FC1 | FC0 | BC3 | BC2 | BC1 | BC0 |Цвет для шаблонов 0xF8…0xFF| {{anchor:n345}} ==== 3.4.5. Спрайты ==== FIXME Адрес начала таблицы атрибутов спрайта в задаётся в регистрах [[#R5]] и [[#R11]]; адрес начала аблицы генератора спрайтов в регистре [[#R6]]. Подробную информацию о спрайтах см. в разделе [[#sm1|Sprite mode 1]]. {{anchor:n346}} ==== 3.4.6. Пример распределения видеопамяти ==== FIXME Пример распределения видеопамяти для режима Graphic1 |<100% 10% 20% 70%>| | 0x00000 \\ \\ \\ \\ 0x003FF| Sprite generator table \\ 0 \\ (128*8=1024 байт) |В этом режиме доступна только половина от максимально возможного количества спрайтов — от 0 до 127. Спрайты с номерами 128-255 перекрывают таблицу макетов шаблонов (Pattern Layout Table).| | 0x00400 \\ \\ \\ \\ 0x006FF| Макет экранной страницы \\ 0 \\ (32*24=768 байт) \\ (32*27=864 байт) |Хотя доступен режим 26.5 строк, пространство над 24 строками в этом макете перекрывает таблицу атрибутов спрайта.| | 0x00700 \\ \\ \\ \\ 0x0077F| Sprite attribute table \\ 0 \\ (32*4=128 байт) | | | 0x00780 \\ \\ \\ \\ 0x0079F| Color table \\ 0 \\ (256/8=32 байт) | | | … | … | | | 0x08000 \\ \\ \\ \\ 0x00FFF| [[#n341|Таблица знакогенератора]] \\ 0 \\ (256*8=2048 байт) |:::| | \_ \\ \_ … \\ \_ | … |Таким же образом можно выделить максимум 32 страницы, если к VDP подключено 128 Кбайт.| | \\ \\ \\ \\ 0x1FFFF| |:::| {{anchor:n35}} {{anchor:g2}} {{anchor:g3}} ===== 3.5. Режимы Graphic2 (G2) и Graphic3 (G3) ===== FIXME |<60% 60% 40%>| ^Характеристики^^ |Размер шаблона с точках (Ш×В)|8×8| |Число шаблонов|768 (по 256 на 1⁄3 экрана)| |Размер экрана, в шаблонах (Ш×В)|32×24 (256×192 точки) [[#n35fn1|∗]]| |Цвета шаблона|16 цветов из 512 (на экран)| |Режим спрайтов|Graphic2 — [[#sm1|Sprite mode 1]] \\ Graphic3 — [[#sm2|Sprite mode 2]]| |Размер VRAM на экран|16 Кбайт| {{anchor:n35fn1}} ∗ Режимы Graphic2 и Graphic3 идентичны, за исключением режима спрайтов. |<60% 60% 40%>| ^Управление^^ |Шаблон шрифта|Таблица знакогенератора| |Расположение шаблона экрана |Имя таблицы шаблона| |Pattern color codes 1 & 0|Specified as a group for each 8-bit pattern in color table| |Цвета фона|Четыре младшие бита [[#R7]]| |Спрайты|VRAM sprite attribute table \\ VRAM sprite pattern table| |<60% 20% 10% 10% 10% 10% 10%>| ^Установка режима Graphic2^^^^^^ |Бит|M5 ([[#R0]])|M4 ([[#R0]])|M3 ([[#R0]])|M2 ([[#R1]])|M1 ([[#R1]])| |Значение| 0 | 0 | 1 | 0 | 0 | |<60% 20% 10% 10% 10% 10% 10%>| ^Установка режима Graphic3^^^^^^ |Бит|M5 ([[#R0]])|M4 ([[#R0]])|M3 ([[#R0]])|M2 ([[#R1]])|M1 ([[#R1]])| |Значение| 0 | 1 | 0 | 0 | 0 | |<60% 40% 30% 30%>| ^Значения по умолчанию в [[msx:basic:|]]^ Graphic2 ^ Graphic3 ^ |Номер видеорежима| 2 | 4 | |Таблица знакогенератора| 0x00000…0x017FF || |Макет экранной страницы| 0x01800…0x01AFF || |Pattern colors| 0x02000…0x037FF || |Sprite patterns| 0x03800…0x03FFF || |Sprite attributes|0x01B00…0x01B7F|0x01E00…0x01E7F| |Sprite colors| — |0x01C00…0x01DFF| {{anchor:n35fn1}} ∗ В режиме 212 строки (бит LN регистра [[#R9]] равен 1) дополнительные 20 строк отображаются как пустые с цветной рамкой, невозможно отобразить что-либо в этом пространстве. {{anchor:n351}} ==== 3.5.1. Макет экранной страницы ==== FIXME В отличие от других режимов, в этом режиме экран разделен по вертикали на три части. Каждая часть имеет свою таблицу знакогенератора и таблицы цветов, но все они, одна за другой, используют одну и ту же таблицу макетов шаблонов. Структура экрана представлена ниже. |<70% 5% 5% 5% 5% 5% 5% 5% 5% 10%>| | ^ Колонки (X) ^|||||| | ^ Строки (Y) ^ 0 ^ 1 ^ 2 ^ 3 ^ … ^ … ^ 31 ^:::| ^ 0 | 0, 0 | 1, 0 | 2, 0 | 3, 0 | … | … | 31, 0 | Верхняя \\ 1/3 \\ экрана | ^ 1 | 0, 1 | 1, 1 | 2, 1 | 3, 1 | … | … | 31, 1 |:::| ^ … | … | … | … | … | … | … | … |:::| ^ 7 | 0, 7 | 1, 7 | 2, 7 | 3, 7 | … | … | 31, 7 |:::| ^ | ||||||| ^ 8 | 0, 8 | 1, 8 | 2, 8 | 3, 8 | … | … | 31, 8 | Средняя \\ 1/3 \\ экрана | ^ … | … | … | … | … | … | … | … |:::| ^ 15 | 0, 15 | 1, 15 | 2, 15 | 3, 15 | … | … | 31, 15 |:::| ^ | ||||||| ^ 16 | 0, 16 | 1, 16 | 2, 16 | 3, 16 | … | … | 31, 16 | Нижняя \\ 1/3 \\ экрана | ^ … | … | … | … | … | … | … | … |:::| ^ 22 | 0, 22 | 1, 22 | 2, 22 | 3, 22 | … | … | 31, 22 |:::| ^ 23 | 0, 23 | 1, 23 | 2, 23 | 3, 23 | … | … | 31, 23 |:::| |<100% 10% 45% 45%>| | ^ [[#pgt|Таблица знакогенератора ]] ^ Pattern color table | | 0x00000 \\ \\ \\ \\ 0x007FF| Верхняя 1/3 || |:::|Pattern images of the screen (256)| Pattern colors of the screen (256)| | 0x00800 \\ \\ \\ \\ 0x00FFF| Средняя 1/3 || |:::|Pattern images of the screen (256)|Pattern colors of the screen (256)| | 0x01000h \\ \\ \\ \\ 0x017FF| Нижняя 1/3 || |:::|Pattern images of the screen (256)|Pattern colors of the screen (256)| {{anchor:n352}} ==== 3.5.2 Таблица знакогенератора ==== FIXME Шрифт, отображаемый на экране для каждого шаблона [[#pgt|таблицы знакогенератора]] для каждой 1/3 экрана, состоит из 8 байтов, при этом отображаются все 8 бит каждого байта. Адрес [[#pgt|таблицы знакогенератора]]: |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 10%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**[[#R4]]**| 0 | 0 | A16 | A15 | A14 | A13 | 1 | 1 | | The pattern layout table is a map of the screen (per screen image). Every byte location of the screen contains code of the pattern displayed at respective location. This table has three 32*8 locations (upper, middle and lower) arranged consecutively where defined patterns can be displayed. Pattern layout table base address is stored in register R#2, and corresponds to the cell (0, 0) with address 0 in the picture below. Example of pattern generator table is provided below. Color table identifies color 1 (upper four bits) and color 0 (lower four bits) for every row of the pattern. Пример [[#pgt|таблицы знакогенератора]] приведен ниже. |<100% 11% 3% 3% 3% 3% 3% 3% 3% 3% 12% %11 3% 3% 3% 3% 3% 3% 3% 3% %11>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| ^ Адрес |:::|:::|:::|:::|:::|:::|:::|:::^ Описание ||:::|:::|:::|:::|:::|:::|:::|:::^ Адрес | |0| | | @#000000:██ | @#000000:██ | @#000000:██ | | | | Шаблон 0 (PN0) ||1|1|1|1|0|0|0|0| 0| |1| | @#000000:██ | | | | @#000000:██ | ||:::|:::|1|1|1|1|0|0|0|0| 1| |2| @#000000:██ | | | | | | @#000000:██ | |:::|:::|1|1|1|1|0|0|0|0| 2| |3| @#000000:██ | | | | | | @#000000:██ | |:::|:::|1|1|1|1|0|0|0|0| 3| |4| @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | |:::|:::|1|1|1|1|0|0|0|0| 4| |5| @#000000:██ | | | | | | @#000000:██ | |:::|:::|1|1|1|1|0|0|0|0| 5| |6| @#000000:██ | | | | | | @#000000:██ | |:::|:::|1|1|1|1|0|0|0|0| 6| |7| | | | | | | | |:::|:::|1|1|1|1|0|0|0|0| 7| |8| @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | | | Шаблон 1 (PN1) ||1|1|1|1|0|0|0|0| 8| |9| @#000000:██ | | | | | | @#000000:██ | |:::|:::|1|1|1|1|0|0|0|0| 9| |10| @#000000:██ | | | | | | @#000000:██ | |:::|:::|1|1|1|1|0|0|0|0| 10| |11| @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | | |:::|:::|1|1|1|1|0|0|0|0| 11| |12| @#000000:██ | | | | | | @#000000:██ | |:::|:::|1|1|1|1|0|0|0|0| 12| |13| @#000000:██ | | | | | | @#000000:██ | |:::|:::|1|1|1|1|0|0|0|0| 13| |14| @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | | |:::|:::|1|1|1|1|0|0|0|0| 14| |15| | | | | | | | |:::|:::|1|1|1|1|0|0|0|0| 15| | |||||||||||||||||||| | … | … |||||||| … || … |||||||| … | | |||||||||||||||||||| |2040| @#000000:██ | | @#000000:██ | | @#000000:██ | | @#000000:██ | | Шаблон 255 (PN255) ||1|1|1|1|0|0|0|0| 2040| |2041| | @#000000:██ | | @#000000:██ | | @#000000:██ | | @#000000:██ |:::|:::|1|1|1|1|0|0|0|0| 2041| |2042| @#000000:██ | | @#000000:██ | | @#000000:██ | | @#000000:██ | |:::|:::|1|1|1|1|0|0|0|0| 2042| |2043| | @#000000:██ | | @#000000:██ | | @#000000:██ | | @#000000:██ |:::|:::|1|1|1|1|0|0|0|0| 2043| |2044| @#000000:██ | | @#000000:██ | | @#000000:██ | | @#000000:██ | |:::|:::|1|1|1|1|0|0|0|0| 2044| |2045| | @#000000:██ | | @#000000:██ | | @#000000:██ | | @#000000:██ |:::|:::|1|1|1|1|0|0|0|0| 2045| |2046| @#000000:██ | | @#000000:██ | | @#000000:██ | | @#000000:██ | |:::|:::|1|1|1|1|0|0|0|0| 2046| |2047| | @#000000:██ | | @#000000:██ | | @#000000:██ | | @#000000:██ |:::|:::|1|1|1|1|0|0|0|0| 2047| | | |||||||| || @#ffff9a:Цвет (часть 1) |||| @#cdffff:Цвет (часть 0) |||| | {{anchor:n353}} ==== 3.5.3. Таблица цвета ==== FIXME Адрес начала таблицы цвета задаётся в регистрах [[#R3]] и [[#R10]]. |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R3\_\_\_(ТCT)**| A13 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |Таблица цветов тайлов (тайловая окраска)| |**R10\_(ТCT)**| 0 | 0 | 0 | 0 | 0 | A16 | A15 | A14 |Старшие разряды TCT| {{anchor:n354}} ==== 3.5.4 Регистры цвета ==== FIXME You can set color of the margin of the screen (backdrop color) specifying BD3...BD0 bits in register R#7. Note that bits TC3...TC0 of R#7 are ignored. {{anchor:n355}} ==== 3.5.5 Спрайты ==== FIXME Set the start address of the sprite attribute table in registers [[#R5]] and [[#R11]]; set start address of the sprite pattern generator table in register [[#R6]]. For details about sprites in [[#g2|Graphic2]] mode, please refer to section [[#sm1|Sprite mode 1]]; for details about sprites in [[#g3|Graphic3]] mode, please refer to section [[#sm2|Sprite mode 2]] {{anchor:n356}} ==== 3.5.6 Пример распределения видеопамяти ==== FIXME |<100% 10% 20% 20%>| | ^ [[#pgt|Таблица знакогенератора]] || | 0x00000 \\ \\ \\ \\ 0x007FF| Верхняя 1/3 \\ (256*8=2048 байт) || | 0x00800 \\ \\ \\ \\ 0x00FFF| Средняя 1/3 \\ (256*8=2048 байт) || | 0x01000 \\ \\ \\ \\ 0x017FF| Нижняя 1/3 \\ (256*8=2048 байт)[[#n356fn1|∗]] || | ^ [[#g2|Graphic2]] ^ [[#g3|Graphic3]] | | 0x01800 \\ \\ \\ \\ 0x01BFF| Sprite pattern table \\ (128*8=1024 байт)[[#n356fn2|∗∗]] | Sprite pattern table \\ (128*8=1024 байт)[[#n356fn2|**]] | | 0x01C00 \\ \\ \\ \\ 0x01C7F| Sprite attribute table \\ (32*4=128 байт) | Sprite color table \\ (32*16=512 байт) | | 0x01C80 \\ \\ \\ \\ 0x01DFF| --- |:::| | 0x01E00 \\ \\ \\ \\ 0x01E7F|:::| Sprite attribute table\\ (32*4=128 байт) | | \\ \\ \\ \\ 0x01FFF|:::| --- | | … | … || | ^ Pattern color table || | 0x02000 \\ \\ \\ \\ 0x027FF| Верхняя 1/3 \\ (256*8=2048 байт) || | 0x02800 \\ \\ \\ \\ 0x02FFF| Средняя 1/3 \\ (256*8=2048 байт) || | 0x03000 \\ \\ \\ \\ 0x037FF| Нижняя 1/3 \\ (256*8=2048 байт)[[#n356fn1|∗]] || | 0x03800 \\ \\ \\ \\ 0x03AFF| Pattern layout table \\ (256*8=2048 байт)[[#n356fn1|∗]] || | \_ \\ \_ … \\ \_ | … || | 0x04000 \\ \\ \\ \\ 0x1FFFF|Таким же образом можно выделить максимум 8 страниц, если к VDP подключено 128 Кбайт.|| {{anchor:n356fn1}} ∗ В режиме 212 строки (бит LN регистра [[#R9]] равен 1) дополнительные 20 строк отображаются как пустые с цветной рамкой, невозможно отобразить что-либо в этом пространстве. {{anchor:n356fn2}} ∗∗ В этом режиме доступна только половина от максимально возможного количества спрайтов — от 0 до 127. Спрайты с номерами 128-255 перекрывают таблицу макетов шаблонов (Pattern Layout Table). {{anchor:n36}} {{anchor:g4}} ===== 3.6. Режим Graphic4 (G4) ===== FIXME |<60% 60% 40%>| ^Характеристики^^ |Размер экрана, в точках (Ш×В)|Значение бита LN регистра [[#R9]] определяет размер: \\ 0 — 256×192 \\ 1 — 256×212| |<60% 60% 40%>| ^Управление^^ |Расположение шаблона экрана |Имя таблицы шаблона| |Цвета фона|Четыре младшие бита [[#R7]]| |Спрайты|VRAM sprite attribute table \\ VRAM sprite pattern table| |<60% 20% 10% 10% 10% 10% 10%>| ^Установка режима Graphic4^^^^^^ |Бит|M5 ([[#R0]])|M4 ([[#R0]])|M3 ([[#R0]])|M2 ([[#R1]])|M1 ([[#R1]])| |Значение| 0 | 1 | 1 | 0 | 0 | |<60% 40% 30%>| ^Значения по умолчанию в [[msx:basic:|]]| |Номер видеорежима| 5 | |Макет экранной страницы| 0x00000…0x069FF | |Sprite patterns| 0x07800…0x07FFF | |Sprite attributes| 0x07600…0x0767F | |Sprite colors| 0x07400…0x075FF | {{anchor:n361}} ==== 3.6.1. Макет экранной страницы ==== FIXME The pattern layout table is a map of the screen (per screen image). Every byte location of the screen contains color codes for two dots. This is bitmap graphics mode, and there’s no pattern generator table. |<70% 5% 5% 5% 5% 5% 5% 5% 5% 1%>| | ^ Колонки (X) ^|||||| | ^ Строки (Y) ^ 0 ^ 1 ^ 2 ^ 3 ^ … ^ … ^ 255 |:::| ^ 0 | 0,0 | 1,0 | 2,0 | 3,0 | … | … | 255,0 |:::| ^ 1 | 0,1 | 1,1 | 2,1 | 3,1 | … | … | 255,1 |:::| ^ | |||||||:::| ^ … | … | … | … | … | X, Y | … | … |:::| ^ | |||||||:::| ^ 191 | 0,191 | 1,191 | 2,191 | … | … | … | 255,191 |LN=0| ^ | ||||||| | ^ … | … | … | … | … | … | … | … |:::| ^ | ||||||| ^ 211 | 0,211 | 1,211 | 2,211 | … | … | … | 255,211 |LN=1| |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |0 | @#ffff9a:Код цвета для (0,0) |||| @#CCFFCC:Код цвета для (1,0) ||||Адрес начала| |1 | @#ffff9a:Код цвета для (2,0) |||| @#CCFFCC:Код цвета для (3,0) |||| | | … | … |||| … ||||:::| |127 | @#ffff9a:Код цвета для (254,0) |||| @#CCFFCC:Код цвета для (255,0) ||||:::| |128 | @#ffff9a:Код цвета для (0,1) |||| @#CCFFCC:Код цвета для (1,1) ||||:::| | … | … |||| … ||||:::| |27134 | @#ffff9a:Код цвета для (252,211) |||| @#CCFFCC:Код цвета для (253,211) ||||:::| |27135 | @#ffff9a:Код цвета для (254,211) |||| @#CCFFCC:Код цвета для (255,211) ||||:::| Pattern layout table base address is stored in register R#2, and corresponds to the cell (0, 0) in the picture above. |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R2\_\_\_(ТNT)**| 0 | A16 | A15 | 1 | 1 | 1 | 1 | 1 |Таблица имён| {{anchor:n362}} ==== 3.6.2. Регистры цвета ==== FIXME You can set color of the margin of the screen (backdrop color) specifying BD3...BD0 bits in register R#7. Note that bits TC3...TC0 of R#7 are ignored. {{anchor:n363}} ==== 3.6.3. Спрайты ==== FIXME Set the start address of the sprite attribute table in registers [[#R5]] and [[#R11]]; set start address of the sprite pattern generator table in register [[#R6]]. For details about sprites please refer to section [[#sm2|Sprite mode 2]] |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R5\_\_\_(SAT)**| A14 | A13 | A12 | A12 | A10 | A9 | A8 | A7 |Таблица атрибутов спрайтов| |**R11\_(SAT)**| 0 | 0 | 0 | 0 | 0 | 0 | A16 | A15 |Старшие разряды SAT| |**R6\_\_\_(SPT)**| 0 | 0 | A16 | A15 | A14 | A13 | A12 | A11 |Таблица шаблонов спрайтов| {{anchor:n364}} ==== 3.6.4.Пример распределения видеопамяти ==== FIXME Пример распределения видеопамяти для режима Graphic4 |<100% 10% 20% 70%>| | 0x00000 \\ \\ \\ \\ | Pattern name table \\ (256*192/2=24576 байт) \\ (256*212/2=27136 байт) | | | 0x02000 \\ \\ \\ \\ | |:::| | 0x04000 \\ \\ \\ 0x05FFF| 192 lines |:::| | 0x06000 \\ \\ \\ 0x069FF| 212 lines |:::| | 0x06A00 \\ \\ \\ 0x06FFF| — |:::| | 0x07000 \\ \\ \\ 0x077FF| Sprite pattern table \\ (256*8=2048 байт) |:::| | 0x00780 \\ \\ \\ 0x079FF| Sprite color table \\ (32*16=512 байт) |:::| | 0x07A00 \\ \\ \\ 0x07A7F| Sprite attribute table \\ (32*4=128 байт) |:::| | 0x07A80 \\ \\ \\ 0x07FFF| — |:::| | \_ \\ \_ … \\ \_ | … |Таким же образом можно выделить максимум 4 страницы, если к VDP подключено 128 Кбайт.| | 0x08000 \\ \\ \\ 0x1FFFF| |:::| {{anchor:n37}} {{anchor:g5}} ===== 3.7. Режимы Graphic5 (G5) ===== FIXME |<60% 60% 40%>| ^Характеристики^^ |Размер экрана, в точках (Ш×В)|Значение бита LN регистра [[#R9]] определяет размер: \\ 0 — 512×192 \\ 1 — 512×212| |Pattern colors|4 colors out of 512 (per screen)| |Режим спрайтов|[[#sm2|Sprite mode 2]]| |Размер VRAM на экран|32 Кбайта| |<60% 60% 40%>| ^Управление^^ |Расположение шаблона экрана |Имя таблицы шаблона| |Цвета фона|Четыре младшие бита [[#R7]]| |Спрайты|VRAM sprite attribute table \\ VRAM sprite pattern table| |<60% 20% 10% 10% 10% 10% 10%>| ^Установка режима Graphic5^^^^^^ |Бит|M5 ([[#R0]])|M4 ([[#R0]])|M3 ([[#R0]])|M2 ([[#R1]])|M1 ([[#R1]])| |Значение| 1 | 0 | 0 | 0 | 0 | |<60% 40% 30%>| ^Значения по умолчанию в [[msx:basic:|]]| |Номер видеорежима| 6 | |Макет экранной страницы| 0x00000…0x069FF | |Sprite patterns| 0x07800…0x07FFF | |Sprite attributes| 0x07600…0x0767F | |Sprite colors| 0x07400…0x075FF | {{anchor:n371}} ==== 3.7.1. Макет экранной страницы ==== FIXME The pattern layout table is a map of the screen (per screen image). Every byte location of the screen contains color codes for four dots. This is bitmap graphics mode, and there’s no pattern generator table. |<70% 5% 5% 5% 5% 5% 5% 5% 5% 1%>| | ^ Колонки (X) ^|||||| | ^ Строки (Y) ^ 0 ^ 1 ^ 2 ^ 3 ^ … ^ … ^ 511 |:::| ^ 0 | 0,0 | 1,0 | 2,0 | 3,0 | … | … | 511,0 |:::| ^ 1 | 0,1 | 1,1 | 2,1 | 3,1 | … | … | 511,1 |:::| ^ | |||||||:::| ^ … | … | … | … | … | X, Y | … | … |:::| ^ | |||||||:::| ^ 191 | 0,191 | 1,191 | 2,191 | … | … | … | 511,191 |LN=0| ^ | ||||||| | ^ … | … | … | … | … | … | … | … |:::| ^ | ||||||| ^ 211 | 0,211 | 1,211 | 2,211 | … | … | … | 511,211 |LN=1| |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |0 | @#ffff9a:Код цвета для (0,0) || @#CCFFCC:Код цвета для (1,0) || @#ffff9a:Код цвета для (2,0) || @#CCFFCC:Код цвета для (3,0) ||Адрес начала| |1 | @#ffff9a:Код цвета для (4,0) || @#CCFFCC:Код цвета для (5,0) || @#ffff9a:Код цвета для (6,0) || @#CCFFCC:Код цвета для (7,0) || | | … | … || … || … || … ||:::| |127 | @#ffff9a:Код цвета для (508,0) || @#CCFFCC:Код цвета для (509,0) || @#ffff9a:Код цвета для (510,0) || @#CCFFCC:Код цвета для (511,0) ||:::| |128 | @#ffff9a:Код цвета для (0,1) || @#CCFFCC:Код цвета для (1,1) || @#ffff9a:Код цвета для (2,1) || @#CCFFCC:Код цвета для (3,1) ||:::| | … | … || … || … || … ||:::| |27135 | @#ffff9a:Код цвета для (508,211) || @#CCFFCC:Код цвета для (509,211) || @#ffff9a:Код цвета для (510,211) || @#CCFFCC:Код цвета для (511,211) ||:::| Pattern layout table base address is stored in register R#2, and corresponds to the cell (0, 0) in the picture above. |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R2\_\_\_(ТNT)**| 0 | A16 | A15 | 1 | 1 | 1 | 1 | 1 |Таблица имён| {{anchor:n372}} ==== 3.7.2. Регистры цвета ==== FIXME You can set color of the margin of the screen (backdrop color) specifying BD3...BD0 bits in register R#7. Note that bits TC3...TC0 of R#7 are ignored. {{anchor:n373}} ==== 3.7.3. Спрайты ==== FIXME Set the start address of the sprite attribute table in registers R#5 and R#11; set start address of the sprite pattern generator table in register R#6. For details about sprites please refer to section [[#sm2|Sprite mode 2]]. |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R5\_\_\_(SAT)**| A14 | A13 | A12 | A12 | A10 | 1 | 1 | 1 |Таблица атрибутов спрайтов| |**R11\_(SAT)**| 0 | 0 | 0 | 0 | 0 | 0 | A16 | A15 |Старшие разряды SAT| |**R6\_\_\_(SPT)**| 0 | 0 | A16 | A15 | A14 | A13 | A12 | A11 |Таблица шаблонов спрайтов| {{anchor:n374}} ==== 3.7.4. Hardware tiling function ==== FIXME VDP can only display 4 solid colors in G5 mode however pixels are so small that combination of two pixels from the set of those 4 solid colors possible produces another visible color, a mixture of the applied two. This feature is only available in G5 mode, and is applied to the sprites and to the screen border color. G5 has 512 pixels in its X-axis, but sprites’ X-coordinate is between 0 and 255. This means that for single sprite dot there’re two font pattern dots, and from forn pattern point of view sprite of 8*8 has size of 16*8. SM2 sprite color table uses 4 bits for each line of sprite. For every dot in sprite pattern table defined as “1” in sprite image bitmap, lower two bits from this 4-bit set define color of odd pixels of the sprite, and higher two bits from this set define color of even pixels of the sprite. In the example above imagine that palette color 1 is set to red (7, 0, 0) and color 3 set to blue (0, 0, 7). FIXME FIXME VDP может отображать только 4 сплошных цвета в режиме G5, однако пиксели настолько малы, что комбинация двух пикселей из набора этих 4 возможных сплошных цветов дает другой видимый цвет, смесь примененных двух. Такое поведение характерно только в режиме G5 и применяется к спрайтам и цвету бордюра экрана, т.к. в этом режиме ширина экрана (ось X) 512 пикселей, но ширина таблицы спрайтов 256 пикселей (0…255). Это означает, что для одного пикселя спрайта есть два пикселя в [[#pgt|таблице знакогенератора]], а с точки зрения шаблона [[#symbol|сивола]], спрайт размером 8×8 имеет размер 16×8 пикселов. Таблица цветов спрайта в [[#sm2|режиме спрайтов 2]] использует 4 бита для каждой строки спрайта. Для каждого пиксела в таблице шаблонов спрайтов, определенной как 1 в битовой карте изображения спрайта, два младших бита из этого 4-битного набора определяют цвет нечетных пикселей спрайта, а два старших бита из этого набора определяют цвет четных пикселей спрайта. В приведенном выше примере представьте, что цвет 1 палитры установлен на красный (7, 0, 0), а цвет 3 установлен на синий (0, 0, 7). |<100% 11% 3% 3% 3% 3% 3% 3% 3% 3% 12% %11 3% 3% 3% 3% 3% 3% 3% 3% %11>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| ^ Адрес |:::|:::|:::|:::|:::|:::|:::|:::^ Описание ||:::|:::|:::|:::|:::|:::|:::|:::^ Адрес | |0| | | | @#000000:██ | @#000000:██ | | | |Шаблон спрайта (8×8)|Цвета спрайта| ╳ | ╳ | ╳ | 0 | @#FF0000:0 | @#FF0000:1 | @#0000FF:1 | @#0000FF:1 | 0| |1| | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | |:::|:::| ╳ | ╳ | ╳ | 0 | @#FF0000:0 | @#FF0000:1 | @#0000FF:1 | @#0000FF:1 | 1| |2| @#000000:██ | @#000000:██ | @#000000:██ | | | @#000000:██ | @#000000:██ | @#000000:██ |:::|:::| ╳ | ╳ | ╳ | 0 | @#FF0000:0 | @#FF0000:1 | @#0000FF:1 | @#0000FF:1 | 2| |3| @#000000:██ | @#000000:██ | | @#000000:██ | @#000000:██ | | @#000000:██ | @#000000:██ |:::|:::| ╳ | ╳ | ╳ | 0 | @#FF0000:0 | @#FF0000:1 | @#0000FF:1 | @#0000FF:1 | 3| |4| @#000000:██ | @#000000:██ | | @#000000:██ | @#000000:██ | | @#000000:██ | @#000000:██ |:::|:::| ╳ | ╳ | ╳ | 0 | @#FF0000:0 | @#FF0000:1 | @#0000FF:1 | @#0000FF:1 | 4| |5| @#000000:██ | @#000000:██ | @#000000:██ | | | @#000000:██ | @#000000:██ | @#000000:██ |:::|:::| ╳ | ╳ | ╳ | 0 | @#FF0000:0 | @#FF0000:1 | @#0000FF:1 | @#0000FF:1 | 5| |6| | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | @#000000:██ | |:::|:::| ╳ | ╳ | ╳ | 0 | @#FF0000:0 | @#FF0000:1 | @#0000FF:1 | @#0000FF:1 | 6| |7| | | | @#000000:██ | @#000000:██ | | | |:::|:::| ╳ | ╳ | ╳ | 0 | @#FF0000:0 | @#FF0000:1 | @#0000FF:1 | @#0000FF:1 | 7| |<100% 50% 50%>| |Фактическое представление спрайта на экране в режиме G5 |<100% 5% 5% 5% 5% 5% 5% 5% 5% 5% 5% 5% 5% 5% 5% 5% 5%>| ^ 7 ^^ 6 ^^ 5 ^^ 4 ^^ 3 ^^ 2 ^^ 1 ^^ 0 ^^ | | | | | | | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | | | | | | | | | | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | | | | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | | | | | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | | | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | | | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | | | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | | | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | | | | | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | | | | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | | | | | | | | | | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | @#FF0000:█ \\ █ | @#0000FF:█ \\ █ | | | | | | | |Восприятие изображения спрайта в режиме G5((на экране CRT монитора)) |<100% 5% 5% 5% 5% 5% 5% 5% 5% 5% 5% 5% 5% 5% 5% 5% 5%>| ^ 7 ^^ 6 ^^ 5 ^^ 4 ^^ 3 ^^ 2 ^^ 1 ^^ 0 ^^ | | | | | | | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | | | | | | | | | | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | | | | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | | | | | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | | | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | | | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | | | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | | | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | | | | | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | | | | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | | | | | | | | | | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | @#FF00FF:█ \\ █ | | | | | | | | \\ {{ :msx:yamaha_v9938:374.bas|Пример}} \\ [[+tab|wmsx>?DISK_FILES=/_media/msx/yamaha_v9938/374.bas&BASIC_RUN=374.bas|Открыть в WebMSX]] {{anchor:n375}} ==== 3.7.5.Пример распределения видеопамяти ==== FIXME Пример распределения видеопамяти для режима [[#g5|Graphic5]]: |<100% 10% 20% 70%>| | 0x00000 \\ \\ \\ \\ | Pattern name table \\ (512*192/4=24576 байт) \\ (512*212/4=27136 байт) | | | 0x02000 \\ \\ \\ \\ |:::|:::| | 0x04000 \\ \\ \\ 0x05FFF| 192 lines |:::| | 0x06000 \\ \\ \\ 0x069FF| 212 lines |:::| | 0x06A00 \\ \\ \\ 0x06FFF| — |:::| | 0x07000 \\ \\ \\ 0x077FF| Sprite pattern table \\ (256*8=2048 байт) |:::| | 0x00780 \\ \\ \\ 0x079FF| Sprite color table \\ (32*16=512 байт) |:::| | 0x07A00 \\ \\ \\ 0x07A7F| Sprite attribute table \\ (32*4=128 байт) |:::| | 0x07A80 \\ \\ \\ 0x07FFF| — |:::| | \_ \\ \_ … \\ \_ | … |Таким же образом можно выделить максимум 4 страницы, если к VDP подключено 128 Кбайт.| | 0x08000 \\ \\ \\ 0x1FFFF| |:::| {{anchor:n38}} {{anchor:g6}} ===== 3.8. Режимы Graphic6 (G6) ===== FIXME |<60% 60% 40%>| ^Характеристики^^ |Размер экрана, в точках (Ш×В)|Значение бита LN регистра [[#R9]] определяет размер: \\ 0 — 512×192 \\ 1 — 512×212| |Pattern colors|16 colors out of 512 (per screen)| |Режим спрайтов|[[#sm2|Sprite mode 2]]| |Размер VRAM на экран|64 Кбайта| |<60% 60% 40%>| ^Управление^^ |Расположение шаблона экрана |Имя таблицы шаблона| |Цвета фона|Четыре младшие бита [[#R7]]| |Спрайты|VRAM sprite attribute table \\ VRAM sprite pattern table| |<60% 20% 10% 10% 10% 10% 10%>| ^Установка режима Graphic5^^^^^^ |Бит|M5 ([[#R0]])|M4 ([[#R0]])|M3 ([[#R0]])|M2 ([[#R1]])|M1 ([[#R1]])| |Значение| 1 | 0 | 1 | 0 | 0 | |<60% 40% 30%>| ^Значения по умолчанию в [[msx:basic:|]]| |Номер видеорежима| 7 | |Макет экранной страницы| 0x00000…0x0D3FF | |Sprite patterns| 0x0F000…0x07FFF | |Sprite attributes| 0x0FA00…0x0FA7F | |Sprite colors| 0x0F800…0x0F9FF | {{anchor:n381}} ==== 3.8.1. Макет экранной страницы ==== FIXME The pattern layout table is a map of the screen (per screen image). Every byte location of the screen contains color codes for two dots. This is bitmap graphics mode, and there’s no pattern generator table. |<70% 5% 5% 5% 5% 5% 5% 5% 5% 1%>| | ^ Колонки (X) ^|||||| | ^ Строки (Y) ^ 0 ^ 1 ^ 2 ^ 3 ^ … ^ … ^ 511 |:::| ^ 0 | 0,0 | 1,0 | 2,0 | 3,0 | … | … | 511,0 |:::| ^ 1 | 0,1 | 1,1 | 2,1 | 3,1 | … | … | 511,1 |:::| ^ | |||||||:::| ^ … | … | … | … | … | X, Y | … | … |:::| ^ | |||||||:::| ^ 191 | 0,191 | 1,191 | 2,191 | … | … | … | 511,191 |LN=0| ^ | ||||||| | ^ … | … | … | … | … | … | … | … |:::| ^ | ||||||| ^ 211 | 0,211 | 1,211 | 2,211 | … | … | … | 511,211 |LN=1| |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |0 | @#ffff9a:Код цвета для (0,0) |||| @#CCFFCC:Код цвета для (1,0) ||||Адрес начала| |1 | @#ffff9a:Код цвета для (2,0) |||| @#CCFFCC:Код цвета для (3,0) |||| | | … | … |||| … ||||:::| |255 | @#ffff9a:Код цвета для (510,0) |||| @#CCFFCC:Код цвета для (511,0) ||||:::| |256 | @#ffff9a:Код цвета для (0,1) |||| @#CCFFCC:Код цвета для (1,1) ||||:::| | … | … |||| … ||||:::| |54270 | @#ffff9a:Код цвета для (508,211) |||| @#CCFFCC:Код цвета для (509,211) ||||:::| |54271 | @#ffff9a:Код цвета для (510,211) |||| @#CCFFCC:Код цвета для (511,211) ||||:::| Pattern layout table base address is stored in register R#2, and corresponds to the cell (0, 0) in the picture above. This only one bit A16 controls the video page being displayed. |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R2\_\_\_(ТNT)**| 0 | 0 | A16 ((Note that in G6 and G7 modes location of bit A16 differs from its location in other modes)) | 1 | 1 | 1 | 1 | 1 |Таблица имён| {{anchor:n382}} ==== 3.8.2. Регистры цвета ==== FIXME You can set color of the margin of the screen (backdrop color) specifying BD3...BD0 bits in register R#7. Note that bits TC3...TC0 of R#7 are ignored. {{anchor:n383}} ==== 3.8.3. Спрайты ==== FIXME Set the start address of the sprite attribute table in registers R#5 and R#11; set start address of the sprite pattern generator table in register R#6. For details about sprites please refer to section [[#sm2|Sprite mode 2]]. |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R5\_\_\_(SAT)**| A14 | A13 | A12 | A12 | A10 | 1 | 1 | 1 |Таблица атрибутов спрайтов| |**R11\_(SAT)**| 0 | 0 | 0 | 0 | 0 | 0 | A16 | A15 |Старшие разряды SAT| |**R6\_\_\_(SPT)**| 0 | 0 | A16 | A15 | A14 | A13 | A12 | A11 |Таблица шаблонов спрайтов| {{anchor:n384}} ==== 3.8.4.Пример распределения видеопамяти ==== FIXME Пример распределения видеопамяти для режима [[#g6|Graphic6]]: |<100% 10% 20% 70%>| | 0x00000 \\ \\ \\ \\ | Pattern name table \\ (512*192/2=49152 байт) \\ (512*212/2=54272 байт) | | | 0x04000 \\ \\ \\ \\ |:::|:::| | 0x08000 \\ \\ \\ | 192 lines |:::| | 0x0C000 \\ \\ \\ \\ | 212 lines |:::| | 0x0D400 \\ \\ \\ 0x0F000| — |:::| | 0x0F000 \\ \\ \\ 0x0F7FF| Sprite pattern table \\ (256*8=2048 байт) |:::| | 0x0F800 \\ \\ \\ 0x0F9FF| Sprite color table \\ (32*16=512 байт) |:::| | 0x0FA00 \\ \\ \\ 0x00FA7F| Sprite attribute table \\ (32*4=128 байт) |:::| | 0x07A80 \\ \\ \\ 0x0FFFF| — |:::| | \_ \\ \_ … \\ \_ | … |Таким же образом можно выделить максимум 4 страницы, если к VDP подключено 128 Кбайт.| | 0x10000 \\ \\ \\ 0x1FFFF| |:::| {{anchor:n39}} {{anchor:g7}} ===== 3.9. Режимы Graphic7 (G7) ===== FIXME |<60% 60% 40%>| ^Характеристики^^ |Размер экрана, в точках (Ш×В)|Значение бита LN регистра [[#R9]] определяет размер: \\ 0 — 256×192 \\ 1 — 256×212| |Pattern colors|256 colors (per screen)| |Режим спрайтов|[[#sm2|Sprite mode 2]]| |Размер VRAM на экран|64 Кбайта| |<60% 60% 40%>| ^Управление^^ |Расположение шаблона экрана |Имя таблицы шаблона| |Цвета фона|Четыре младшие бита [[#R7]]| |Спрайты|VRAM sprite attribute table \\ VRAM sprite pattern table| |<60% 20% 10% 10% 10% 10% 10%>| ^Установка режима Graphic5^^^^^^ |Бит|M5 ([[#R0]])|M4 ([[#R0]])|M3 ([[#R0]])|M2 ([[#R1]])|M1 ([[#R1]])| |Значение| 1 | 1 | 1 | 0 | 0 | |<60% 40% 30%>| ^Значения по умолчанию в [[msx:basic:|]]| |Номер видеорежима| 8 | |Макет экранной страницы| 0x00000…0x0D3FF | |Sprite patterns| 0x0F000…0x0F7FF | |Sprite attributes| 0x0FA00…0x0FA7F | |Sprite colors| 0x0F800…0x0F9FF | {{anchor:n391}} ==== 3.9.1. Макет экранной страницы ==== FIXME The pattern layout table is a map of the screen (per screen image). Every byte location of the screen contains color code for one single dot. This is bitmap graphics mode, and there’s no pattern generator table. |<70% 5% 5% 5% 5% 5% 5% 5% 5% 1%>| | ^ Колонки (X) ^|||||| | ^ Строки (Y) ^ 0 ^ 1 ^ 2 ^ 3 ^ … ^ … ^ 255 |:::| ^ 0 | 0,0 | 1,0 | 2,0 | 3,0 | … | … | 255,0 |:::| ^ 1 | 0,1 | 1,1 | 2,1 | 3,1 | … | … | 255,1 |:::| ^ | |||||||:::| ^ … | … | … | … | … | X, Y | … | … |:::| ^ | |||||||:::| ^ 191 | 0,191 | 1,191 | 2,191 | … | … | … | 255,191 |LN=0| ^ | ||||||| | ^ … | … | … | … | … | … | … | … |:::| ^ | ||||||| ^ 211 | 0,211 | 1,211 | 2,211 | … | … | … | 255,211 |LN=1| |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |0 | @#339933:Зелёный (0,0) ||| @#CC0000:Красный (0,0) ||| @#0e34f1:Синий (0,0) ||Адрес начала| |1 | @#339933:Зелёный (1,0) ||| @#CC0000:Красный (1,0) ||| @#0e34f1:Синий (1,0) || | | … | … ||| … ||| … ||:::| |255 | @#339933:Зелёный (255,0) ||| @#CC0000:Красный (255,0) ||| @#0e34f1:Синий (255,0) ||:::| |256 | @#339933:Зелёный (0,1) ||| @#CC0000:Красный (0,1) ||| @#0e34f1:Синий (0,1) ||:::| | … | … ||| … ||| … ||:::| |54270 | @#339933:Зелёный (254,211) ||| @#CC0000:Красный (254,211) ||| @#0e34f1:Синий (254,211) ||:::| |54271 | @#339933:Зелёный (254,211) ||| @#CC0000:Красный (254,211) ||| @#0e34f1:Синий (254,211) ||:::| Pattern layout table base address is stored in register R#2, and corresponds to the cell (0, 0) in the picture above. This only one bit A16 controls the video page being displayed. |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R2\_\_\_(ТNT)**| 0 | 0 | A16 ((Note that in G6 and G7 modes location of bit A16 differs from its location in other modes)) | 1 | 1 | 1 | 1 | 1 |Таблица имён| {{anchor:n392}} {{anchor:n382}} ==== 3.9.2. Регистры цвета ==== FIXME You can set color of the margin of the screen (backdrop color) specifying all the 8 bits in register R#7 (256 possible colors in total). |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R7**| @#ffff9a:DB7 | @#ffff9a:DB6 | @#ffff9a:DB5 | @#ffff9a:DB4 | @#ffff9a:BD3 | @#ffff9a:BD2 | @#ffff9a:BD1 | @#ffff9a:BD0 |Цвет текста и полей экрана| |:::| @#ffff9a:Цвет бордюра |||| @#ffff9a:Цвет фона экрана ||||:::| {{anchor:n393}} ==== 3.9.3. Спрайты ==== FIXME Set the start address of the sprite attribute table in registers R#5 and R#11; set start address of the sprite pattern generator table in register R#6. For details about sprites please refer to section [[#sm2|Sprite mode 2]]. |<100% 10% 5% 5% 5% 5% 5% 5% 5% 5% 35%>| | старший бит^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 |младший бит| |**R5\_\_\_(SAT)**| A14 | A13 | A12 | A12 | A10 | 1 | 1 | 1 |Таблица атрибутов спрайтов| |**R11\_(SAT)**| 0 | 0 | 0 | 0 | 0 | 0 | A16 | A15 |Старшие разряды SAT| |**R6\_\_\_(SPT)**| 0 | 0 | A16 | A15 | A14 | A13 | A12 | A11 |Таблица шаблонов спрайтов| {{anchor:n394}} ==== 3.9.4.Пример распределения видеопамяти ==== FIXME Пример распределения видеопамяти для режима [[#g7|Graphic7]]: |<100% 10% 20% 70%>| | 0x00000 \\ \\ \\ \\ | Pattern name table \\ (512*192/2=49152 байт) \\ (512*212/2=54272 байт) | | | 0x04000 \\ \\ \\ \\ |:::|:::| | 0x08000 \\ \\ \\ \\ | 192 lines |:::| | 0x0C000 \\ \\ \\ \\ | 212 lines |:::| | 0x0D400 \\ \\ \\ \\ | |:::| | 0x0F000 \\ \\ \\ 0x0F7FF| Sprite pattern table \\ (256*8=2048 байт) |:::| | 0x0F800 \\ \\ \\ 0x0F9FF| Sprite color table \\ (32*16=512 байт) |:::| | 0x0FA00 \\ \\ \\ \\ 0x0FA7F| Sprite attribute table \\ (32*4=128 байт) |:::| | 0x0FA80 \\ \\ \\ \\ 0x0FFFF| — |:::| | \_ \\ \_ … \\ \_ | … |Таким же образом можно выделить максимум 2 страницы, если к VDP подключено 128 Кбайт.| | 0x10000 \\ \\ \\ 0x1FFFF| |:::| {{anchor:n4}} ====== 4. Команды ====== {{anchor:n41}} ===== 4.1. Типы команд ===== FIXME Commands are used to perform specific complex operations on the video memory, and thus on the image displayed on the screen. See the list of available commands in the table below. ^Command name^Destination^Source^Unit^Mnemonic^ CM3 ^ CM2 ^ CM1 ^ CM0 ^ |High-speed move|VRAM|CPU|Byte|**HMMC***| 1 | 1 | 1 | 1 | |:::|VRAM|VRAM|:::|**YMMM***| 1 | 1 | 1 | 0 | |:::|VRAM|VRAM|:::|**HMMM**| 1 | 1 | 0 | 1 | |:::|VRAM|VDP|:::|**HMMV**| 1 | 1 | 0 | 0 | |Logical move|VRAM|CPU|Dot|**LMMC**| 1 | 0 | 1 | 1 | |:::|CPU|VRAM|:::|**LMCM**| 1 | 0 | 1 | 0 | |:::|VRAM|VRAM|:::|**LMMM**| 1 | 0 | 0 | 1 | |:::|VRAM|VRAM|:::|**LMMV**| 1 | 0 | 0 | 0 | |Line|VRAM|VDP|:::|**LINE**| 0 | 1 | 1 | 1 | |Search|VRAM|VDP|:::|**SRCH**| 0 | 1 | 1 | 0 | |Pset|VRAM|VDP|:::|**PSET**| 0 | 1 | 0 | 1 | |Point|VDP|VRAM|:::|**POINT**| 0 | 1 | 0 | 0 | |Invalid| |||| 0 | 0 | 1 | 1 | |:::|:::|:::|:::|:::| 0 | 0 | 1 | 0 | |:::|:::|:::|:::|:::| 0 | 0 | 0 | 1 | |Stop| |||**STOP**| 0 | 0 | 0 | 0 | *In G4 and G6 modes, the lower one bit, and in G5 mode, the lower two bits are lost in registers related to X-coordinate (DX, NX) The process of execution of VDP commands consists of several steps: * Ensure that current mode is G4 – G7. In other modes result is not guaranteed * Check the bit 0 (CE, command execution) flag in status register S#2 to be 0. If it’s 1, then previous command is in progress and program needs to wait for completion or issue STOP command * Set necessary parameters for command execution in registers R#32 to R#45 as * necessary. It is easy to write whole the set of values to registers using indirect * register addressing mode with auto-increment turned on * Write command code to the R#46 (CMR, command register) * Wait till command execution is completed by checking bit 0 (CE) of S#2 to be 0 * If current command needs to be aborted, execute STOP command {{anchor:n42}} ===== 4.2. Page concept ===== FIXME As we have already seen, programmer can have several options to place tables in the video memory by altering base address registers. In some modes there’re more options (like in Text 1 there’re 32 options and in GRAPHICS7 there’re only 2 options). This introduces a concept of the page defined by where VDP currently operates and where it takes information for picture display from. Page concept is stricter in relation to VDP commands. VRAM access is defined by X and Y coordinates, and not by physical address within VRAM. Coordinate X is specified by 9 bits, and can be in range of 0...511, coordinate Y is specified by 10 bits, and can be in range of 0...1023. See the table below for VRAM paging in various video modes. |<80% 10% 10% 10% 10% 10% 10% 10%>| ^ Режим \\ [[#G4|Graphic4]] ||^ Адрес ^ Режим \\ [[#G5|Graphic5]] ||| |(0, 0) | | (255, 0)| **0x0000** |(0, 0) | | (511, 0)| | Страница 0 ||| | Страница 0 ||| |(0, 255) | | (255, 255)|:::|(0, 255) | | (511, 255)| | ||| | ||| |(0, 256) | | (255, 256)| **0x08000** |(0, 256) | | (511, 256)| | Страница 1 ||| | Страница 1 ||| |(0, 511) | | (255, 511)|:::|(0, 511) | | (511, 511)| | ||| | ||| |(0, 512) | | (255, 512)| **0x10000** |(0, 512) | | (511, 512)| | Страница 2 ||| | Страница 2 ||| |(0, 767) | | (255, 767)|:::|(0, 767) | | (511, 767)| | ||| | ||| |(0, 768) | | (255, 768)| **0x18000** |(0, 768)) | | (511, 768)| | Страница 3 ||| | Страница 3 ||| |(0, 1023) | | (255, 1023)| **0x1FFFF** |(0, 1023) | | (511, 1023)| |<80% 10% 10% 10% 10% 10% 10% 10%>| ^ Режим \\ [[#G7|Graphic7]] ||^ Адрес ^ Режим \\ [[#G6|Graphic6]] ||| |(0, 0) | | (255, 0)| **0x0000** |(0, 0) | | (511, 0)| | Страница 0 ||| | Страница 0 ||| |(0, 255) | | (255, 255)|:::|(0, 255) | | (511, 255)| | ||| | ||| |(0, 256) | | (255, 256)| **0x10000** |(0, 256) | | (511, 256)| | Страница 1 ||| | Страница 1 ||| |(0, 511) | | (255, 511)| **0x1FFFF** |(0, 511) | | (511, 511)| In G4 and G5 modes there’re four pages; in G6 and G7 modes there’re only two pages. For example, setting Y coordinate in G5 mode to 658 will automatically choose page #2 with specific translated initial VRAM address. Note that VDP is capable of displaying maximum of 212 lines, and programmer has an option to use register R#23 to set visible screen window position within active page. {{anchor:n43}} ===== 4.3. Logical operations ===== FIXME When executing logical commands LINE, PSET and LOGICAL MOVE, it is possible to define logical operation to be done on the color of the pixels. The four bits identifying the logical operation should be written in lower four bits of R#46 (command register) together with the command code. ^Name^Operation^LO3^LO2^LO1^LO0^ |IMP|DC=SC|0|0|0|0| |AND|DC=SC&DC|0|0|0|1| |OR|%%DC=SC|DC%%|0|0|1|0| |XOR|%%DC=SC^DC%%|0|0|1|1| |NOT|DC=!SC|0|1|0|0| |Invalid||0|1|0|1| |:::||0|1|1|0| |:::||0|1|1|1| |TIMP|If SC=0 then DC=DC else DC=SC|1|0|0|0| |TAND|If SC=0 then DC=DC else %%DC=SC&DC%%|1|0|0|1| |TOR|If SC=0 then DC=DC else %%DC=SC|DC%%|1|0|1|0| |TXOR|If SC=0 then DC=DC else %%DC=SC^DC%%|1|0|1|1| |TNOT|If SC=0 then DC=DC else DC=!SC|1|1|0|0| |Invalid||1|1|0|1| |:::||1|1|1|0| |:::||1|1|1|1| *SC = source color code *DC = destination color code {{anchor:n46}} ===== 4.6. States of the registers after command execution ===== FIXME Setting up VDP registers for command execution is a significant task for programmer and CPU, and it will be wise to use already existing values in the registers for the next command execution or for further work with video memory. For this purpose programmer should know the resulting states of most important VDP registers. Please see the table below. Note that if program is going to use sequence of the VDP commands which use resulting values of registers from previous commands, it is important to disable interrupts so that interrupt handler routing would not accidentally change values in VDP registers and thus break the whole command sequence. CMR H is a higher nibble of the command register [[#R46]]; CMR L is a lower nibble of the command register [[#R46]]. ARG is an argument register [[#R45]]. The resulting values of SY*, DY* and NY* are in dots and can be calculated using equations below: * If DIY=0 then SY*=SY+N; DY*=DY+N * If DIY=1 then SY*=SY-N; DY*=DY-N * NY*=NY-N LINE command = -> if MAJ=0 then N=N-1 ???? |<70% 5% 5% 5% 5% 5% 5% 5% 5% 5% 5% 5%>| | ^ SX ^ SY ^ DX ^ DY ^ NX ^ NY ^ CLR ^ CMR H ^ CMR L ^ ARG ^ ^HMMC| – | – | – | ∗ | – | # | – | 0 | – | – | ^YMMM| – | ∗ | – | ∗ | – | # | – | 0 | – | – | ^HMMM| – | ∗ | – | ∗ | – | # | – | 0 | – | – | ^HMMV| – | – | – | ∗ | – | # | – | 0 | – | – | ^LMMC| – | – | – | ∗ | – | # | – | 0 | – | – | ^LMCM| – | ∗ | – | – | – | # | – | 0 | – | – | ^LMMM| – | ∗ | – | ∗ | – | # | – | 0 | – | – | ^LMMV| – | – | – | ∗ | – | # | – | 0 | – | – | ^LINE| – | – | – | ∗ | – | – | – | 0 | – | – | ^SRCH| – | – | – | – | – | – | – | 0 | – | – | ^PSET| ∗ | – | – | – | – | – | – | 0 | – | – | ^POINT| – | – | – | – | – | – | ∗ | 0 | – | – | Легенда: | – |Unchanged| | ∗ |Coordinate at the command end (SY*, DY*) or color code| | # |Count (NY*) when the end of the screen was detected| ====== Ссылки ====== * [[wpru>Yamaha_V9938|Yamaha V9938]] * [[msxorg>wiki/Yamaha_V9938|Yamaha V9938]] * [[http://map.grauw.nl/resources/|Resources - MSX Assembly Page]] * [[http://map.grauw.nl/articles/vdp-vram-timing/vdp-timing.html|V9938 VRAM timings]] * [[http://www.bitsavers.org/pdf/yamaha/Yamaha_V9938_MSX-Video_Technical_Data_Book_Aug85.pdf]] ---- [[msxorg>/forum/msx-talk/software/why-lower-bits-of-vdp-reg2-are-filled-with-ones|Why lower bits of VDP reg#2 are filled with one's? | MSX Resource Center]] {{tag>MSX Hardware}}