Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
msx:basic_dialogue_programming_language:011 [2022-10-01 12:44] GreyWolf [XI.1.10. Порты, отвечающие за работу с видеопамятью] |
msx:basic_dialogue_programming_language:011 [2023-02-19 16:23] (текущий) GreyWolf |
||
---|---|---|---|
Строка 6: | Строка 6: | ||
<WRAP group 99%> | <WRAP group 99%> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
Надо понять тот минимум, на котором покоится мир, и всё избыточное безжалостно отсекать (бритва Оккама).<WRAP rightalign> | Надо понять тот минимум, на котором покоится мир, и всё избыточное безжалостно отсекать (бритва Оккама).<WRAP rightalign> | ||
—//У.Оккам// | —//У.Оккам// | ||
Строка 300: | Строка 300: | ||
<WRAP group 99%> | <WRAP group 99%> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
Они мастера накапливать факты, а вот извлечь из них пользу им удаётся не всегда. | Они мастера накапливать факты, а вот извлечь из них пользу им удаётся не всегда. | ||
<WRAP rightalign> | <WRAP rightalign> | ||
Строка 647: | Строка 647: | ||
<WRAP group 99%> | <WRAP group 99%> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
Целью придумавших систему было, очевидно, скрыть, что в этих значках содержится какой–то смысл.<WRAP rightalign> | Целью придумавших систему было, очевидно, скрыть, что в этих значках содержится какой–то смысл.<WRAP rightalign> | ||
—//А.Конан Дойль. Пляшущие человечки// | —//А.Конан Дойль. Пляшущие человечки// | ||
Строка 800: | Строка 800: | ||
<WRAP group 99%> | <WRAP group 99%> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
Есть медленно и умеренно, не пить во время еды, тщательно разжёвывать пищу и с лёгкостью вставать из–за стола с чувством, что мог бы съесть ещё. | Есть медленно и умеренно, не пить во время еды, тщательно разжёвывать пищу и с лёгкостью вставать из–за стола с чувством, что мог бы съесть ещё. | ||
<WRAP rightalign> | <WRAP rightalign> | ||
Строка 1692: | Строка 1692: | ||
Как видите, байты, соответствующие палитре 7, изменяются; немедленно изменяется и цвет бордюра! | Как видите, байты, соответствующие палитре 7, изменяются; немедленно изменяется и цвет бордюра! | ||
+ | {{anchor:color_restore}} | ||
Разумеется, палитры в Таблице PT могут быть изменены и операторами ''VPOKE''. Однако следует отметить, что изменение Таблицы PT операторами ''VPOKE'' само по себе не приводит к изменению цветов. Для считывания содержимого Таблицы PT и присвоения цвета новой палитре существует специальный оператор. Его синтаксис предельно прост: | Разумеется, палитры в Таблице PT могут быть изменены и операторами ''VPOKE''. Однако следует отметить, что изменение Таблицы PT операторами ''VPOKE'' само по себе не приводит к изменению цветов. Для считывания содержимого Таблицы PT и присвоения цвета новой палитре существует специальный оператор. Его синтаксис предельно прост: | ||
<WRAP group> | <WRAP group> | ||
Строка 1727: | Строка 1728: | ||
<WRAP group 99%> | <WRAP group 99%> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
Вопрос в том, кто за это отвечает? | Вопрос в том, кто за это отвечает? | ||
<WRAP rightalign> | <WRAP rightalign> | ||
Строка 1768: | Строка 1769: | ||
<WRAP group 99%> | <WRAP group 99%> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
//Шаблон// (от нем. Schablone — образец, модель) — пластина с вырезами, очертания которых соответствуют контуру чертежа, изделия и т.п.<WRAP rightalign> | //Шаблон// (от нем. Schablone — образец, модель) — пластина с вырезами, очертания которых соответствуют контуру чертежа, изделия и т.п.<WRAP rightalign> | ||
—//Советский Энциклопедический Словарь// | —//Советский Энциклопедический Словарь// | ||
Строка 1833: | Строка 1834: | ||
<WRAP group 99%> | <WRAP group 99%> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
Атрибут (от лат. Attribuo — придаю, наделяю), необходимое, существенное, неотъемлемое свойство объекта. | Атрибут (от лат. Attribuo — придаю, наделяю), необходимое, существенное, неотъемлемое свойство объекта. | ||
<WRAP rightalign> | <WRAP rightalign> | ||
Строка 2191: | Строка 2192: | ||
<WRAP group 99%> | <WRAP group 99%> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
Четыре величайших изобретения в истории человечества: | Четыре величайших изобретения в истории человечества: | ||
- колесо; | - колесо; | ||
Строка 2260: | Строка 2261: | ||
* N — арифметическое выражение, целая часть значения которого указывает на номер регистра VDP, причём: | * N — арифметическое выражение, целая часть значения которого указывает на номер регистра VDP, причём: | ||
* α) если используется регистр с номером из диапазона [0,7], то значение параметра N должно быть равно номеру регистра; | * α) если используется регистр с номером из диапазона [0,7], то значение параметра N должно быть равно номеру регистра; | ||
- | * β) если используется регистр с номером из диапазона [8,23], либо из диапазона [32,46] (для компьютера [[msx:msx_2]]), то N=RG+1, где RG — номер регистра; | + | * β) если используется регистр с номером из диапазона [8,23] либо из диапазона [32,46] (для компьютера [[msx:msx_2]]), то N=RG+1, где RG — номер регистра; |
* M — арифметическое выражение, целая часть значения которого принадлежит отрезку [0,255], | * M — арифметическое выражение, целая часть значения которого принадлежит отрезку [0,255], | ||
позволяет поместить значение выражения M в регистр VDP; </WRAP> | позволяет поместить значение выражения M в регистр VDP; </WRAP> | ||
- <WRAP> запись через //порты// ввода–вывода (для всех регистров). | - <WRAP> запись через //порты// ввода–вывода (для всех регистров). | ||
- | Этот способ заключается в использовании порта с номером &H99, связывающего видеопроцессор с центральным процессором MSX–компьютера (Z–80). Чтобы записать число A в регистр VDP с номером N, примените следующие операторы: | + | Этот способ заключается в использовании порта с номером &H99, связывающего видеопроцессор с центральным процессором MSX–компьютера (Z80). Чтобы записать число A в регистр VDP с номером N, примените следующие операторы: |
<WRAP group> | <WRAP group> | ||
<WRAP half column> | <WRAP half column> | ||
Строка 2277: | Строка 2278: | ||
</WRAP> | </WRAP> | ||
- | Данные операторы последовательно выводят данные и номер регистра в порт 99h. | + | Они последовательно выводят данные и номер регистра в порт 99h. |
^Номер бита^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 ^ | ^Номер бита^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 ^ | ||
^Первый байт| данные |||||||| | ^Первый байт| данные |||||||| | ||
Строка 2285: | Строка 2286: | ||
- <WRAP> //косвенная// запись в регистры VDP. Про неё будет рассказано в [[#XI.2.6. Доступ к видеопамяти|разделе XI.2.6.]]. | - <WRAP> //косвенная// запись в регистры VDP. Про неё будет рассказано в [[#XI.2.6. Доступ к видеопамяти|разделе XI.2.6.]]. | ||
- | Напомним, что если Вы работаете с компьютером серии [[msx:msx_2]], то перед набором программы, использующей порты ввода–вывода, нужно выполнить команду | + | Напомним, если Вы работаете с компьютером серии [[msx:msx_2]],то перед набором программы, использующей порты ввода–вывода, нужно выполнить команду |
<WRAP group> | <WRAP group> | ||
<WRAP half column> | <WRAP half column> | ||
Строка 2304: | Строка 2305: | ||
<WRAP group 99%> | <WRAP group 99%> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
Нехватка информации восполняется избытком интуиции. | Нехватка информации восполняется избытком интуиции. | ||
<WRAP rightalign> | <WRAP rightalign> | ||
Строка 2383: | Строка 2384: | ||
{{anchor:e1121-02}} __//Пример 2//__. Включение и выключение экрана дисплея \\ {{.examples:1121-02.bas|}} \\ [[+tab|wmsxbpge>1121-02.bas]] | {{anchor:e1121-02}} __//Пример 2//__. Включение и выключение экрана дисплея \\ {{.examples:1121-02.bas|}} \\ [[+tab|wmsxbpge>1121-02.bas]] | ||
+ | <WRAP group> | ||
+ | <WRAP half column> | ||
<code> | <code> | ||
VDP(1)=VDP(1) XOR 64 | VDP(1)=VDP(1) XOR 64 | ||
</code> | </code> | ||
+ | </WRAP> | ||
+ | . | ||
+ | <WRAP half column> | ||
+ | |||
+ | </WRAP> | ||
+ | </WRAP> | ||
+ | |||
Эта команда включает экран, если он был выключен, и наоборот. | Эта команда включает экран, если он был выключен, и наоборот. | ||
Строка 2428: | Строка 2438: | ||
- установить биты M1, M2, M3, M4, M5; | - установить биты M1, M2, M3, M4, M5; | ||
- установить начальные адреса Таблиц VRAM в регистрах базовых адресов; | - установить начальные адреса Таблиц VRAM в регистрах базовых адресов; | ||
- | - заполнить таблицы видеопамяти необходимыми данными; | + | - заполнить Таблицы видеопамяти необходимыми данными; |
- занести в ячейку памяти с адресом &HFCAF номер режима ''SCREEN''. | - занести в ячейку памяти с адресом &HFCAF номер режима ''SCREEN''. | ||
Строка 2503: | Строка 2513: | ||
<WRAP group 99%> | <WRAP group 99%> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
Мы находимся в положении, несколько аналогичном положению человека, держащего в руках связку ключей и пытающегося открыть одну за другой несколько дверей. Рано или поздно ему всегда удаётся подобрать ключ к очередной двери, но сомнения относительно взаимнооднозначного соответствия между ключами и дверями у него остаются. | Мы находимся в положении, несколько аналогичном положению человека, держащего в руках связку ключей и пытающегося открыть одну за другой несколько дверей. Рано или поздно ему всегда удаётся подобрать ключ к очередной двери, но сомнения относительно взаимнооднозначного соответствия между ключами и дверями у него остаются. | ||
<WRAP rightalign> | <WRAP rightalign> | ||
- | —//Юджин Вигнер// | + | —//Ю.Вигнер// |
</WRAP></WRAP> | </WRAP></WRAP> | ||
</WRAP></WRAP> | </WRAP></WRAP> | ||
- | Адрес байта видеопамяти кодируется 17–ю двоичными цифрами, которые мы будем обозначать Ai, где i=0,1,2,…,16, причём через A16 будем обозначать //старший// бит, через A0 — //младший// бит. | + | Адрес байта видеопамяти кодируется 17 двоичными цифрами, которые мы будем обозначать Ai, где i=0,1,2,…,16, причём через A16 будем обозначать //старший// бит, через A0 — //младший// бит. |
^Старший бит| A16 | A15 | A14 | A13 | A12 | A11 | A10 | A9 | A8 | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 ^Младший бит| | ^Старший бит| A16 | A15 | A14 | A13 | A12 | A11 | A10 | A9 | A8 | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 ^Младший бит| | ||
Строка 2623: | Строка 2633: | ||
<WRAP group 99%> | <WRAP group 99%> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
— Вы знаете отличительные способности животного, называемого раком?\\ | — Вы знаете отличительные способности животного, называемого раком?\\ | ||
— Да, конечно. Рак — это рыба //красного цвета//, которая ходит боком.\\ | — Да, конечно. Рак — это рыба //красного цвета//, которая ходит боком.\\ | ||
Строка 2734: | Строка 2744: | ||
70 INPUT "Частота включения мигания (от 0 до 15)";TN | 70 INPUT "Частота включения мигания (от 0 до 15)";TN | ||
80 INPUT "Частота выключения мигания (от 0 до 15)";TK | 80 INPUT "Частота выключения мигания (от 0 до 15)";TK | ||
- | 90 VPOKE 2048+10*Y+X/8,&B11111111 'Будуть мигать 8 символов | + | 90 VPOKE 2048+10*Y+X/8,&B11111111 'Будут мигать 8 символов |
100 CLS:LOCATE X,Y:PRINT B$ | 100 CLS:LOCATE X,Y:PRINT B$ | ||
110 COL=16*MI+MF:TIM=16*TN+TK | 110 COL=16*MI+MF:TIM=16*TN+TK | ||
Строка 2756: | Строка 2766: | ||
</code> | </code> | ||
- | Период отображения,находящийся в промежутке между 166 мсек и 2053 мсек, может быть определён для каждой страницы. Для этого необходимо: | + | Период отображения,находящийся в промежутке между 166 мс и 2053 мс, может быть определён для каждой страницы. Для этого необходимо: |
- задать базовый адрес Таблицы имён шаблонов //нечётной// страницы (регистр с номером 2); | - задать базовый адрес Таблицы имён шаблонов //нечётной// страницы (регистр с номером 2); | ||
- <WRAP>задать время включения (интервал, в течение которого отображается //чётная// страница) и время выключения (интервал, в течение которого отображается //нечётная// страница) в регистре с номером 13. | - <WRAP>задать время включения (интервал, в течение которого отображается //чётная// страница) и время выключения (интервал, в течение которого отображается //нечётная// страница) в регистре с номером 13. | ||
Строка 2765: | Строка 2775: | ||
^Назначение|Время включения||||Время выключения|||| | ^Назначение|Время включения||||Время выключения|||| | ||
</WRAP> | </WRAP> | ||
- | - После этого начнётся процесс мигания. | + | - после этого начнётся процесс мигания. |
{{anchor:e1123-03}} __//Пример 3//__. \\ {{.examples:1123-03.bas|}} \\ [[+tab|wmsxbpge>1123-03.bas]] | {{anchor:e1123-03}} __//Пример 3//__. \\ {{.examples:1123-03.bas|}} \\ [[+tab|wmsxbpge>1123-03.bas]] | ||
Строка 2773: | Строка 2783: | ||
30 CIRCLE (254,106),30,15 :' рисуем окружность | 30 CIRCLE (254,106),30,15 :' рисуем окружность | ||
40 SET PAGE 1,1: CLS :' А на странице 1 | 40 SET PAGE 1,1: CLS :' А на странице 1 | ||
- | 50 CIRCLE (254,106),60,15 :' рисуем окружность побольше | + | 50 CIRCLE (254,106),60,15 :' рисуем окружность большего радиуса |
60 VDP(13+1)=&H11 :' Включим смену страниц | 60 VDP(13+1)=&H11 :' Включим смену страниц | ||
70 :' Окружность п у л ь с и р у е т ! | 70 :' Окружность п у л ь с и р у е т ! | ||
- | 80 A$=INPUT$(1) :' Немного подождем... | + | 80 A$=INPUT$(1) :' Ждем нажатия любой клавиши... |
90 VDP(13+1)=0 :' Выключим смену страниц | 90 VDP(13+1)=0 :' Выключим смену страниц | ||
</code> | </code> | ||
- | Опишем ещё один способ осуществления смены двух графических страниц на экране. | + | Опишем ещё один способ осуществления смены двух графических страниц на экране. Бит EO (второй бит регистра с номером 9), используется для попеременной демонстрации //двух// графических страниц экрана с частотой 60 Гц. |
- | + | ||
- | Бит ЕО (второй бит регистра с номером 9), используется для попеременной демонстрации //двух// графических страниц экрана с частотой 60 Гц. | + | |
Для этого необходимо: | Для этого необходимо: | ||
Строка 2810: | Строка 2818: | ||
Отображение чётной страницы в первом поле и нечётной страницы во втором поле можно получить, выполнив следующее: | Отображение чётной страницы в первом поле и нечётной страницы во втором поле можно получить, выполнив следующее: | ||
1) установить бит IL (третий бит регистра с номером 9) в 1; | 1) установить бит IL (третий бит регистра с номером 9) в 1; | ||
- | 2) установить бит ЕО (второй бит регистра с номером 9) в 1; | + | 2) установить бит EO (второй бит регистра с номером 9) в 1; |
3) задать базовый адрес Таблицы имён шаблонов нечётной страницы (регистр с номером 2). | 3) задать базовый адрес Таблицы имён шаблонов нечётной страницы (регистр с номером 2). | ||
Строка 2879: | Строка 2887: | ||
На компьютерах [[msx:msx_2]] по умолчанию "содержимое" регистра с номером 18 по умолчанию задаётся оператором | На компьютерах [[msx:msx_2]] по умолчанию "содержимое" регистра с номером 18 по умолчанию задаётся оператором | ||
+ | <WRAP group> | ||
+ | <WRAP half column> | ||
<code> | <code> | ||
SET ADJUST (X,Y) | SET ADJUST (X,Y) | ||
</code> | </code> | ||
+ | </WRAP> | ||
+ | . | ||
+ | <WRAP half column> | ||
+ | |||
+ | </WRAP> | ||
+ | </WRAP> | ||
+ | |||
Значения выражений X и Y принадлежат отрезку [-7,8]. | Значения выражений X и Y принадлежат отрезку [-7,8]. | ||
</WRAP> | </WRAP> | ||
Строка 2927: | Строка 2944: | ||
</code> | </code> | ||
- | В //графических// режимах регистр с номером 23 предоставляет другую интересную возможность. Вначале следует вспомнить, что доступная высота графического экрана равна 192 или 212 линиям (в зависимости от девятого регистра VDP). Однако, Вы можете, воздействуя на VRAM (используя, например, оператор ''VPOKE''), сформировать шаблоны 256 линий, просмотрев которые Вы можете, использовав регистр с номером 23. Понять, как это происходит, Вы можете из следующих рисунков: | + | В //графических// режимах регистр с номером 23 предоставляет другую интересную возможность. Вначале следует вспомнить, что доступная высота графического экрана равна 192 или 212 линиям (в зависимости от девятого регистра VDP). Однако Вы можете, воздействуя на VRAM (используя, например, оператор ''VPOKE''), сформировать шаблоны 256 линий, просмотрев которые Вы можете, использовав регистр с номером 23. Понять, как это происходит, Вы можете из следующих рисунков: |
<code> | <code> | ||
Строка 3030: | Строка 3047: | ||
</WRAP> | </WRAP> | ||
- | <WRAP centeralign>Данные в 17–ом регистре не могут быть изменены косвенной адресацией!</WRAP> | + | <WRAP centeralign>Данные в 17–м регистре не могут быть изменены косвенной адресацией!</WRAP> |
{{anchor:n1126}} | {{anchor:n1126}} | ||
Строка 3092: | Строка 3109: | ||
└────────── 01 — признак записи | └────────── 01 — признак записи | ||
</code> | </code> | ||
- | - А теперь остаётся прочитать или записать данные в нужный байт: <code> | + | - а теперь остаётся прочитать или записать данные в нужный байт: <code> |
A=INP(&H98) — чтение | A=INP(&H98) — чтение | ||
OUT &H98,A — запись | OUT &H98,A — запись | ||
</code> | </code> | ||
- | - После чтения или записи данных содержимое адресного счётчика автоматически увеличивается на единицу. При этом, если есть перенос из бита A13, то в режимах ''SCREEN'' 4–8 происходит увеличение содержимого регистра с номером 14. В режимах ''SCREEN'' 1–3 и в 40–символьном режиме ''SCREEN 0'' увеличения содержимого 14–го регистра не происходит. | + | - после чтения или записи данных содержимое адресного счётчика автоматически увеличивается на единицу. При этом, если есть перенос из бита A13, то в режимах ''SCREEN'' 4–8 происходит увеличение содержимого регистра с номером 14. В режимах ''SCREEN'' 1–3 и в 40–символьном режиме ''SCREEN 0'' увеличения содержимого 14–го регистра не происходит. |
Из сказанного следует, что если нужно записать информацию в несколько подряд расположенных ячеек видеопамяти, достаточно установить лишь начальный адрес этой группы ячеек. | Из сказанного следует, что если нужно записать информацию в несколько подряд расположенных ячеек видеопамяти, достаточно установить лишь начальный адрес этой группы ячеек. | ||
Строка 3103: | Строка 3120: | ||
==== XI.2.7. Регистры статуса ==== | ==== XI.2.7. Регистры статуса ==== | ||
- | Кроме регистров VDP, видеопроцессор работает с группой регистров, называемыми регистрами //статуса//. Данные регистры содержат информацию о состоянии видеопроцессора. Из них информацию можно только //читать//. | + | Кроме регистров VDP, видеопроцессор работает с группой регистров, называемыми регистрами //статуса//. Эти регистры содержат информацию о состоянии видеопроцессора. Из них информацию можно только //читать//. |
Текущий номер регистра статуса записывается в регистр VDP с номером //пятнадцать// (регистр–указатель регистра состояния). | Текущий номер регистра статуса записывается в регистр VDP с номером //пятнадцать// (регистр–указатель регистра состояния). | ||
Строка 3112: | Строка 3129: | ||
Для доступа к регистрам //состояния// видеопроцессора (с номерами 0,1,2,3,…,9) вначале нужно установить номер регистра статуса в регистре с номером 15, а затем прочесть данные через порт &H99. | Для доступа к регистрам //состояния// видеопроцессора (с номерами 0,1,2,3,…,9) вначале нужно установить номер регистра статуса в регистре с номером 15, а затем прочесть данные через порт &H99. | ||
- | Для записи в переменную W числа из регистра статуса с номером S, выполните следующие действия: | + | Для записи в переменную W числа из регистра статуса с номером S выполните следующие действия: |
<code> | <code> | ||
VDP(15+1)=S:W=INP(&H99):VDP(15+1)=0 | VDP(15+1)=S:W=INP(&H99):VDP(15+1)=0 | ||
Строка 3127: | Строка 3144: | ||
│ │ │ └ Экранный номер пятого или девятого | │ │ │ └ Экранный номер пятого или девятого | ||
│ │ │ (в зависимости от режима SCREEN) спрайта в строке | │ │ │ (в зависимости от режима SCREEN) спрайта в строке | ||
- | │ │ └─── Флаг, указывающий на столкновение 2–х спрайтов | + | │ │ └─── Флаг, указывающий на столкновение 2 спрайтов |
│ │ | │ │ | ||
│ └───────── Флаг обнаружения пятого (или девятого) спрайта в строке | │ └───────── Флаг обнаружения пятого (или девятого) спрайта в строке | ||
Строка 3170: | Строка 3187: | ||
<code> | <code> | ||
10 SCREEN1,2 | 10 SCREEN1,2 | ||
- | 20 SPRITE$(1)="Проверка":SPRITE$(2)="появления":SPRITE$(3)="пятого":SPRITE$(4)="спрайта":SPRITE$(5)="в строке" | + | 20 SPRITE$(1)="Проверка":SPRITE$(2)="появления":SPRITE$(3)="пятого": |
+ | SPRITE$(4)="спрайта":SPRITE$(5)="в строке" | ||
30 PUT SPRITE0,(10,80),,5:PUT SPRITE1,(20,80),,4:PUT SPRITE2,(30,80),,3:PUT SPRITE3,(40,80),,2 | 30 PUT SPRITE0,(10,80),,5:PUT SPRITE1,(20,80),,4:PUT SPRITE2,(30,80),,3:PUT SPRITE3,(40,80),,2 | ||
40 VDP(15+1)=0:Z=INP(&H99) | 40 VDP(15+1)=0:Z=INP(&H99) | ||
Строка 3177: | Строка 3195: | ||
60 PUT SPRITE4,(50,80),,1 | 60 PUT SPRITE4,(50,80),,1 | ||
70 VDP(15+1)=0:Z=INP(&H99) | 70 VDP(15+1)=0:Z=INP(&H99) | ||
- | 80 ? RIGHT$("00000000"+BIN$(Z),8);"◀─ Появился 5-ый спрайт в строке!" | + | 80 ? RIGHT$("00000000"+BIN$(Z),8);"◀─ Появился 5-й спрайт в строке!" |
</code> | </code> | ||
Строка 3211: | Строка 3229: | ||
<WRAP group 99%> | <WRAP group 99%> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
Боги открыли людям не все.\\ | Боги открыли людям не все.\\ | ||
В поиск пустившись, люди сами открыли немало. | В поиск пустившись, люди сами открыли немало. | ||
Строка 3293: | Строка 3311: | ||
</WRAP> | </WRAP> | ||
- | {{anchor:e1132-00}}Однако прежде чем начать "работать" в этом режиме, его надо инициализировать следующим образом: | + | {{anchor:e1132-00}}Однако, прежде чем начать "работать" в этом режиме, его надо инициализировать следующим образом: |
\\ {{.examples:1132-00.bas|}} \\ [[+tab|wmsxbpge>1132-00.bas]] | \\ {{.examples:1132-00.bas|}} \\ [[+tab|wmsxbpge>1132-00.bas]] | ||
<code> | <code> | ||
Строка 3316: | Строка 3334: | ||
100 CLEAR 100,&HD000 | 100 CLEAR 100,&HD000 | ||
110 SCREEN 1:WIDTH 32:DEFUSR=&H7E:A=USR(0) | 110 SCREEN 1:WIDTH 32:DEFUSR=&H7E:A=USR(0) | ||
- | 120 A$="21000011BF1B1ACD1CD03EF0CBECCD1CD0CBAC13237CD608C206D0C947CD4D00CBDC78CD4D00CB9CCBE478CD4D00CBA4C9" | + | 120 A$="21000011BF1B1ACD1CD03EF0CBECCD1CD0CBAC13237CD608C |
+ | 206D0C947CD4D00CBDC78CD4D00CB9CCBE478CD4D00CBA4C9" | ||
130 FOR X=0 TO 48:POKE &HD000+X,VAL("&h"+MID$(A$,X*2+1,2)):NEXT | 130 FOR X=0 TO 48:POKE &HD000+X,VAL("&h"+MID$(A$,X*2+1,2)):NEXT | ||
140 DEFUSR=&HD000:A=USR(0) | 140 DEFUSR=&HD000:A=USR(0) | ||
Строка 3359: | Строка 3378: | ||
| &H1A00 |Таблица имён образов (строки 16–23)| | | &H1A00 |Таблица имён образов (строки 16–23)| | ||
| &H1B00 |Таблица атрибутов спрайтов| | | &H1B00 |Таблица атрибутов спрайтов| | ||
- | | &H2000 |Таблица цветов символов, расположенных с 0–ой по 7–ю строку.\\ На каждый символ отводится 8 байтов. На каждую строку символа отводится 1 байт, старший полубайт которого отвечает за цвет установленных бит в Таблице шаблонов символов| | + | | &H2000 |Таблица цветов символов, расположенных с 0–й по 7–ю строку.\\ На каждый символ отводится 8 байтов. На каждую строку символа отводится 1 байт, старший полубайт которого отвечает за цвет установленных бит в Таблице шаблонов символов| |
- | | &H2800 |Таблица цветов символов, расположенных с 8–ой по 15–ю строку| | + | | &H2800 |Таблица цветов символов, расположенных с 8–й по 15–ю строку| |
- | | &H3000 |Таблица цветов символов, расположенных с 16–ой по 23–ю строку| | + | | &H3000 |Таблица цветов символов, расположенных с 16–й по 23–ю строку| |
| &H3800 |Таблица шаблонов спрайтов| | | &H3800 |Таблица шаблонов спрайтов| | ||
</WRAP> | </WRAP> | ||
- В режиме ''SCREEN'' 1–2 разрешено использование как текстовых,так и графических операторов, т.е. "совмещённый" режим ''SCREEN'' 1–2 может находиться в двух "состояниях". | - В режиме ''SCREEN'' 1–2 разрешено использование как текстовых,так и графических операторов, т.е. "совмещённый" режим ''SCREEN'' 1–2 может находиться в двух "состояниях". | ||
- | //Во–первых//, это — //текстовый// режим.В нем "работают" все операторы текстового экрана. Однако, он отличается от текстового режима ''SCREEN 1'' в следующих моментах: | + | //Во–первых//, это — //текстовый// режим.В нем "работают" все операторы текстового экрана. Однако он отличается от текстового режима ''SCREEN 1'' в следующих моментах: |
- весь экран разбит на //три// горизонтальных окна; | - весь экран разбит на //три// горизонтальных окна; | ||
- символ, вообще говоря, раскрашен //одновременно// в 16 цветов (по два цвета на линию); | - символ, вообще говоря, раскрашен //одновременно// в 16 цветов (по два цвета на линию); | ||
Строка 3468: | Строка 3487: | ||
в какой — писать. | в какой — писать. | ||
- | Для того, чтобы рисовать в какой–либо части экрана, её надо предварительно подготовить следующим образом: | + | Для того чтобы рисовать в какой–либо части экрана, её надо предварительно подготовить следующим образом: |
<WRAP group> | <WRAP group> | ||
<WRAP half column> | <WRAP half column> | ||
Строка 3485: | Строка 3504: | ||
Таким образом, Вы инициализируете участки Таблиц PNT, CT и PGT, отвечающие за изображение в нужном окне экрана. | Таким образом, Вы инициализируете участки Таблиц PNT, CT и PGT, отвечающие за изображение в нужном окне экрана. | ||
- | Теперь в приготовленной части экрана можно применять графические операторы. Однако, их можно применять только после выполнения оператора: | + | Теперь в приготовленной части экрана можно применять графические операторы. Однако их можно применять только после выполнения оператора: |
<WRAP group> | <WRAP group> | ||
<WRAP half column> | <WRAP half column> | ||
Строка 3512: | Строка 3531: | ||
Нужно постоянно помнить о том, что Ваши рисунки могут "портиться", так как любой символ, напечатанный в графической части экрана, портит рисунок. | Нужно постоянно помнить о том, что Ваши рисунки могут "портиться", так как любой символ, напечатанный в графической части экрана, портит рисунок. | ||
- | Однако, рисунок можно восстановить, применив операторы: | + | Однако рисунок можно восстановить, применив операторы: |
<code> | <code> | ||
FOR T=0 TO 255:VPOKE BASE(5)+256*N+T,T:NEXT | FOR T=0 TO 255:VPOKE BASE(5)+256*N+T,T:NEXT | ||
Строка 3552: | Строка 3571: | ||
</code> | </code> | ||
- | Все сказанное о режиме ''SCREEN'' 1–2, распространяется и на режим ''SCREEN'' 1–4. Остаётся только добавить, что структура видеопамяти в "совмещённом" режиме ''SCREEN'' 1–4 полностью совпадает со структурой VRAM в режиме ''SCREEN 4'' для компьютеров серии [[msx:msx_1]]. | + | Все сказанное о режиме ''SCREEN'' 1–2 распространяется и на режим ''SCREEN'' 1–4. Остаётся только добавить, что структура видеопамяти в "совмещённом" режиме ''SCREEN'' 1–4 полностью совпадает со структурой VRAM в режиме ''SCREEN 4'' для компьютеров серии [[msx:msx_1]]. |
{{anchor:examples11}} | {{anchor:examples11}} |