Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
msx:basic_dialogue_programming_language:011 [2022-10-01 12:54] GreyWolf [XI.2.3. Регистры цветов] |
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> |
Четыре величайших изобретения в истории человечества: | Четыре величайших изобретения в истории человечества: | ||
- колесо; | - колесо; | ||
Строка 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> | ||
Строка 2512: | Строка 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> | ||
Строка 2632: | Строка 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> |
— Вы знаете отличительные способности животного, называемого раком?\\ | — Вы знаете отличительные способности животного, называемого раком?\\ | ||
— Да, конечно. Рак — это рыба //красного цвета//, которая ходит боком.\\ | — Да, конечно. Рак — это рыба //красного цвета//, которая ходит боком.\\ | ||
Строка 2785: | Строка 2786: | ||
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 Гц. | + | |
Для этого необходимо: | Для этого необходимо: | ||
Строка 2819: | Строка 2818: | ||
Отображение чётной страницы в первом поле и нечётной страницы во втором поле можно получить, выполнив следующее: | Отображение чётной страницы в первом поле и нечётной страницы во втором поле можно получить, выполнив следующее: | ||
1) установить бит IL (третий бит регистра с номером 9) в 1; | 1) установить бит IL (третий бит регистра с номером 9) в 1; | ||
- | 2) установить бит ЕО (второй бит регистра с номером 9) в 1; | + | 2) установить бит EO (второй бит регистра с номером 9) в 1; |
3) задать базовый адрес Таблицы имён шаблонов нечётной страницы (регистр с номером 2). | 3) задать базовый адрес Таблицы имён шаблонов нечётной страницы (регистр с номером 2). | ||
Строка 2888: | Строка 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> | ||
Строка 2936: | Строка 2944: | ||
</code> | </code> | ||
- | В //графических// режимах регистр с номером 23 предоставляет другую интересную возможность. Вначале следует вспомнить, что доступная высота графического экрана равна 192 или 212 линиям (в зависимости от девятого регистра VDP). Однако, Вы можете, воздействуя на VRAM (используя, например, оператор ''VPOKE''), сформировать шаблоны 256 линий, просмотрев которые Вы можете, использовав регистр с номером 23. Понять, как это происходит, Вы можете из следующих рисунков: | + | В //графических// режимах регистр с номером 23 предоставляет другую интересную возможность. Вначале следует вспомнить, что доступная высота графического экрана равна 192 или 212 линиям (в зависимости от девятого регистра VDP). Однако Вы можете, воздействуя на VRAM (используя, например, оператор ''VPOKE''), сформировать шаблоны 256 линий, просмотрев которые Вы можете, использовав регистр с номером 23. Понять, как это происходит, Вы можете из следующих рисунков: |
<code> | <code> | ||
Строка 3039: | Строка 3047: | ||
</WRAP> | </WRAP> | ||
- | <WRAP centeralign>Данные в 17–ом регистре не могут быть изменены косвенной адресацией!</WRAP> | + | <WRAP centeralign>Данные в 17–м регистре не могут быть изменены косвенной адресацией!</WRAP> |
{{anchor:n1126}} | {{anchor:n1126}} | ||
Строка 3101: | Строка 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–го регистра не происходит. |
Из сказанного следует, что если нужно записать информацию в несколько подряд расположенных ячеек видеопамяти, достаточно установить лишь начальный адрес этой группы ячеек. | Из сказанного следует, что если нужно записать информацию в несколько подряд расположенных ячеек видеопамяти, достаточно установить лишь начальный адрес этой группы ячеек. | ||
Строка 3112: | Строка 3120: | ||
==== XI.2.7. Регистры статуса ==== | ==== XI.2.7. Регистры статуса ==== | ||
- | Кроме регистров VDP, видеопроцессор работает с группой регистров, называемыми регистрами //статуса//. Данные регистры содержат информацию о состоянии видеопроцессора. Из них информацию можно только //читать//. | + | Кроме регистров VDP, видеопроцессор работает с группой регистров, называемыми регистрами //статуса//. Эти регистры содержат информацию о состоянии видеопроцессора. Из них информацию можно только //читать//. |
Текущий номер регистра статуса записывается в регистр VDP с номером //пятнадцать// (регистр–указатель регистра состояния). | Текущий номер регистра статуса записывается в регистр VDP с номером //пятнадцать// (регистр–указатель регистра состояния). | ||
Строка 3121: | Строка 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 | ||
Строка 3136: | Строка 3144: | ||
│ │ │ └ Экранный номер пятого или девятого | │ │ │ └ Экранный номер пятого или девятого | ||
│ │ │ (в зависимости от режима SCREEN) спрайта в строке | │ │ │ (в зависимости от режима SCREEN) спрайта в строке | ||
- | │ │ └─── Флаг, указывающий на столкновение 2–х спрайтов | + | │ │ └─── Флаг, указывающий на столкновение 2 спрайтов |
│ │ | │ │ | ||
│ └───────── Флаг обнаружения пятого (или девятого) спрайта в строке | │ └───────── Флаг обнаружения пятого (или девятого) спрайта в строке | ||
Строка 3179: | Строка 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) | ||
Строка 3186: | Строка 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> | ||
Строка 3220: | Строка 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> |
Боги открыли людям не все.\\ | Боги открыли людям не все.\\ | ||
В поиск пустившись, люди сами открыли немало. | В поиск пустившись, люди сами открыли немало. | ||
Строка 3302: | Строка 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> | ||
Строка 3325: | Строка 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) | ||
Строка 3368: | Строка 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 цветов (по два цвета на линию); | ||
Строка 3477: | Строка 3487: | ||
в какой — писать. | в какой — писать. | ||
- | Для того, чтобы рисовать в какой–либо части экрана, её надо предварительно подготовить следующим образом: | + | Для того чтобы рисовать в какой–либо части экрана, её надо предварительно подготовить следующим образом: |
<WRAP group> | <WRAP group> | ||
<WRAP half column> | <WRAP half column> | ||
Строка 3494: | Строка 3504: | ||
Таким образом, Вы инициализируете участки Таблиц PNT, CT и PGT, отвечающие за изображение в нужном окне экрана. | Таким образом, Вы инициализируете участки Таблиц PNT, CT и PGT, отвечающие за изображение в нужном окне экрана. | ||
- | Теперь в приготовленной части экрана можно применять графические операторы. Однако, их можно применять только после выполнения оператора: | + | Теперь в приготовленной части экрана можно применять графические операторы. Однако их можно применять только после выполнения оператора: |
<WRAP group> | <WRAP group> | ||
<WRAP half column> | <WRAP half column> | ||
Строка 3521: | Строка 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 | ||
Строка 3561: | Строка 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}} |