XI.1.9. С л о т ы в и д е о п а м я т и Вся видеопамять на компьютерах серии MSX-2 разбита на два больших учас- тка объемом по 64 Кбайта каждый. Эти участки будем называть с л о т а м и видеопамяти (по аналогии с участками RAM и ROM объемом по 64 Кбайта, назы- ваемыми с л о т а м и памяти). На компьютерах серии MSX-1 имеется толь- ко один слот VRAM объемом в 16 Кбайтов. Для того, чтобы переключиться с работы со слотом 0 на работу со слотом 1, достаточно выполнить оператор: α) SET PAGE 2 или SET PAGE 3 в режимах SCREEN 5 и SCREEN 6; β) SET PAGE 1 в режимах SCREEN 7 и SCREEN 8. После этого оператором VPOKE и функцией VPEEK можно работать с логически- ми адресами видеопамяти. В помощь Вам предлагаем следующие таблички: ┌────────────┬────────────┬────────┬─────────────┐ │ Физические │ Логические │ Номера │ Способ вклю-│ Для │ адреса │ адреса │ слотов │ чения слота │ режимов ├────────────┼────────────┼────────┼─────────────┤ SCREEN 5 │ от &H00000 │ от &H0000 │ │ │ и │ до &H07FFF │ до &H7FFF │ │ SET PAGE 0 │ SCREEN 6 ├────────────┼────────────┤ Слот 0 ├─────────────┤ │ от &H08000 │ от &H8000 │ │ │ │ до &H0FFFF │ до &HFFFF │ │ SET PAGE 1 │ ├────────────┼────────────┼────────┼─────────────┤ │ от &H10000 │ от &H0000 │ │ │ │ до &H17FFF │ до &H7FFF │ │ SET PAGE 2 │ ├────────────┼────────────┤ Слот 1 ├─────────────┤ │ от &H18000 │ от &H8000 │ │ │ │ до &H1FFFF │ до &HFFFF │ │ SET PAGE 3 │ └────────────┴────────────┴────────┴─────────────┘ ┌────────────┬────────────┬────────┬─────────────┐ │ Физические │ Логические │ Номера │ Способ вклю-│ Для │ адреса │ адреса │ слотов │ чения слота │ режимов ├────────────┼────────────┼────────┼─────────────┤ SCREEN 7 │ от &H00000 │ от &H0000 │ │ │ и │ до &H0FFFF │ до &HFFFF │ Слот 0 │ SET PAGE 0 │ SCREEN 8 ├────────────┼────────────┼────────┼─────────────┤ │ от &H10000 │ от &H0000 │ │ │ │ до &H1FFFF │ до &HFFFF │ Слот 1 │ SET PAGE 1 │ └────────────┴────────────┴────────┴─────────────┘ Отметим также, что в режимах SCREEN 0 ÷ SCREEN 4 работа со слотом 1 за- прещена. XI.1.10. П о р т ы, о т в е ч а ю щ и е за р а б о т у с в и д е о п а м я т ь ю Другой способ доступа к видеопамяти заключается в работе с п о р т а - м и ввода-вывода. Этот способ очень часто используется при написании про- грамм в машинных кодах. ┌────────────────────────────────────────────────────────────────────┐ │ Напомним, что перед использованием команды (оператора) OUT на ком- │ │ пьютерах серии MSX-2 необходимо выполнить команду CALL NETEND │ └────────────────────────────────────────────────────────────────────┘ α) Для з а п и с и числа в ячейку видеопамяти примените серию команд: ┌──────────────────────────────────────────────────────────┐ │ OUT &H99, М л а д ш и й байт номера ячейки │ │ OUT &H99, С т а р ш и й байт номера ячейки OR &H40 │ │ OUT &H98, Ч и с л о │ └──────────────────────────────────────────────────────────┘ П р и м е р. ─────────── 10 SCREEN 0:CLS:KEYOFF 20 OUT &H99,0:OUT &H99,0 OR &H40 30 FOR I=1 TO 20 40 READ R$:R=ASC(R$):OUT &H98,R 50 NEXT I:PRINT 'Попробуйте убрать в этой строке оператор PRINT 60 DATA Г,р,у,п,п,о,в,а,я," ",п,е,р,е,с,ы,л,к,а,! β) Для ч т е н и я числа из ячейки видеопамяти, примените следующие команды: ┌────────────────────────────────────────────────────┐ │ OUT &H99, М л а д ш и й байт номера ячейки │ │ OUT &H99, С т а р ш и й байт номера ячейки │ │ A=INP(&H98) │ └────────────────────────────────────────────────────┘ Важно отметить следующее. Изменение содержимого видеопамяти или видео- процессора приводит к немедленной корректировке содержимого экрана. Одна- ко, отсюда вовсе не следует истинность обратного утверждения. ┌────────────────────────────────────────────────────────────────────┐ │ Изменение "содержимого" экрана не всегда приводит к изменению VRAM.│ └────────────────────────────────────────────────────────────────────┘ Если Вы не будете в программе "работать" с портами ввода-вывода,то мож- но утверждать, что VRAM и VDP "управляют" "содержимым" экрана.На самом же деле состояние экрана изменяют п о р т ы ввода-вывода с адресами &H98, &H99, &H9A и &H9B. На эти порты можно "воздействовать" оператором VPOKE. В этом случае сигнал из VRAM сразу же поступает в порт, а тот,в свою оче- редь изменяет "рисунок" на экране. ┌───────────┐ │ Э к р а н │ └───▲─▲─▲───┘ │ │ │ ┌─────────────────────────────┐ ◀── │ П о р т ы ввода-вывода │ ◀── Оператор OUT └────▲─▲─▲────────────▲─▲─▲───┘ ◀── │ │ │ │ │ │ ┌──────────────┐ ┌───────────┐ ◀── │Видеопроцессор│─▶│Видеопамять│ ◀── Оператор VPOKE └──────────────┘ └───────────┘ ◀── Если же воздействовать непосредственно на порт оператором OUT,минуя ви- деопамять, то могут возникнуть следующие ситуации: 1) если адрес VRAM принадлежит отрезку [0,&H3FFE], то после записи опе- ратором OUT в ячейку с этим адресом ее содержимое можно прочесть как функ- цией INP, так и функцией VPEEK; 2) если адрес VRAM принадлежит отрезку [&H3FFF,&HFFFF], то после запи- си оператором OUT в ячейку с этим адресом ее содержимое можно прочесть только функцией INP. П р и м е р. Сравните результаты работы этой программы на компьютерах ─────────── серий MSX-1 и MSX-2 ! 10 CALL NETEND 20 INPUT"Младший байт";N1:INPUT"Старший байт";N2:INPUT"Значение";D 30 PRINT"Старое значение:"; 40 OUT&H99,N1:OUT&H99,N2:PRINT INP(&H98) 50 OUT&H99,N1:OUT&H99,N2 OR&H40:OUT&H98,D 60 PRINT"Новое значение:"; 70 OUT&H99,N1:OUT&H99,N2:PRINT INP(&H98) 80 CALL NETINI:'Отмена действия команды CALL NETEND XI.2. РАБОТА С ВИДЕОПРОЦЕССОРОМ Четыре величайших изобретения в истории человечества: 1) колесо; 2) электрическая лампочка; 3) микрокомпьютер; 4) руководства по микрокомпьютерам вместе с их авторами. М.Уэйт, С.Прата, Д.Мартин Работа с псевдопеременными BASE и VDP - весьма эффективное средство уп- равления видеопамятью. Однако при использовании этих средств нужно быть крайне осторожным, ибо малейшая ошибка в программировании может сделать экран "неуправляемым", что вынудит Вас нажать кнопку "RESET"! Мы познакомим Вас с несколькими сравнительно "безопасными" примерами. Более детальная информация о способах работы с видеопамятью содержится в книгах [65,89] (если Вы, конечно, сможете их раздобыть!). Работой видеопамяти управляет специальный процессор,который называется в и д е о п р о ц е с с о р о м. Видеопроцессор "работает" с двумя груп- пами восьмибитовых р е г и с т р о в: 47 регистров MSX-VDP и 16 регистров статуса. Р е г и с т р - электронное устройство для временного хранения информа- ции во время ее обработки. Регистры называют часто сверхоперативной па- мятью, т.к. для регистров используются специальные электронные схемы, поз- воляющие значительно быстрее записывать информацию в регистры и читать ин- формацию из регистров. Регистры MSX-VDP можно разделить на несколько категорий: α) по назначению: 1) регистры у с т а н о в к и р е ж и м а (0, 1, 8, 9); 2) регистры б а з о в ы х а д р е с о в (2÷6, 10, 11); 3) регистры ц в е т о в (7, 12, 13, 20÷22); 4) регистры у п р а в л е н и я э к р а н о м (18, 19, 23); 5) регистры д о с т у п а (14÷17); 6) регистры к о м а н д (32÷46); β) по способу доступа: 1) разрешены чтение и запись на компьютерах и серии MSX-1, и серии MSX-2 (регистры 0÷7); 2) разрешены чтение и запись на компьютерах MSX-2 и только запись на компьютерах MSX-1 (регистры 8÷23); 3) разрешена только з а п и с ь (регистры 32÷46). Для ч т е н и я "содержимого" регистров VDP предназначена одноимен- ная псевдопеременная, используемая в правой части оператора присваивания. Ее синтаксис: ┌─────────────┐ │ VDP(N) │ , └─────────────┘ где: VDP("ViDeo Processor") - служебное слово; N - арифметическое выражение, целая часть значения которого ука- зывает на номер регистра MSX-VDP, причем: α) если используется регистр с номером из диапазона [0,7], то значе- ние параметра N должно быть равно номеру регистра; β) если используется регистр с номером из диапазона [8,23] (для ком- пьютера MSX-2), то N=RG+1, где RG - номер регистра. Теперь мы расскажем Вам о способах з а п и с и в регистры MSX-VDP: 1) запись с использованием псевдопеременной VDP. Этот способ является самым простым: оператор ┌─────────────┐ │ VDP(N) = M │ , └─────────────┘ где: VDP("ViDeo Processor") - служебное слово; N - арифметическое выражение, целая часть значения которого ука- зывает на номер регистра MSX-VDP, причем: α) если используется регистр с номером из диапазона [0,7], то значе- ние параметра N должно быть равно номеру регистра; β) если используется регистр с номером из диапазона [8,23], либо из диапазона [32,46] (для компьютера MSX-2), то N=RG+1, где RG - номер регис- тра; M - арифметическое выражение, целая часть значения которого при- надлежит отрезку [0,255], позволяет поместить значение выражения M в регистр VDP; 2) запись через п о р т ы ввода-вывода (для всех регистров). Этот способ заключается в использовании порта с номером &H99, связываю- щего видеопроцессор с центральным процессором MSX-компьютера (Z-80). Что- бы записать число A в регистр MSX-VDP с номером N, примените следующие операторы: ┌────────────────────────────────────────┐ │ OUT &H99,A:OUT &H99,RG OR &H80 │ . └────────────────────────────────────────┘ Данные операторы последовательно выводят данные и номер регистра в порт 99h. Номер бита 7 6 5 4 3 2 1 0 ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Первый байт │ Д а н н ы е │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ Второй байт │ 1 │ 0 │ Н о м е р р е г и с т р а │ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ З а м е ч а н и е. Будьте особенно внимательными при обращении к видео- процессору из подпрограммы обработки прерываний. 3) к о с в е н н а я запись в регистры MSX-VDP. Про нее будет расска- зано в разделе XI.2.6 . Напомним, что если Вы работаете с компьютером серии MSX-2, то перед на- бором программы, использующей порты ввода-вывода, нужно выполнить команду ┌─────────────┐ │ CALL NETEND │ . └─────────────┘ XI.2.1. Р е г и с т р ы у с т а н о в к и р е ж и м а Нехватка информации восполняется избытком интуиции. М.Мишин Перейдем теперь к описанию "содержимого" некоторых регистров VDP. Вначале напомним Вам принятую нумерацию битов в байте: ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ │ 7-й бит│ 6-й бит│ 5-й бит│ 4-й бит│ 3-й бит│ 2-й бит│ 1-й бит│ 0-й бит│ └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ Р е г и с т р 0. ─────────────── ┌─────┬────────┬─────────────────────────────────────────────────────┐ │Номер│Значение│ │ │бита │ бита │ К о м м е н т а р и й │ ├─────┼────────┼─────────────────────────────────────────────────────┤ │ 7 │ 0 │ Не используется │ ├─────┼────────┼─────────────────────────────────────────────────────┤ │ 6 │ 1 │ Устанавливает цветовую шину в режиме ввода и вводит │ │ │ │ данные в видеопамять │ │─────┼────────┼─────────────────────────────────────────────────────┤ │ 5 │ 1 │ Бит "IE2": Запретить прерывания от светового пера │ │ │ 0 │ Разрешить прерывания от светового пера │ │─────┼────────┼─────────────────────────────────────────────────────┤ │ 4 │ 1 │ Бит "IE1": Запретить прерывание от горизонтального │ │ │ │ сканирования линии по "IE1" и отключить │ │ │ │ сигналы с клавиатуры │ │ │ 0 │ Разрешить прерывания по "IE1" │ ├─────┼────────┼─────────────────────────────────────────────────────┤ │ 3 │ │ Бит "M5" установки графических режимов │ │ 2 │ │ Бит "M4" установки графических режимов │ │ 1 │ │ Бит "M3" установки графических режимов │ │ 0 │ │ Внешний видеосигнал (бит "IV") │ └─────┴────────┴─────────────────────────────────────────────────────┘ П р и м е р. 10 OUT &H99,VDP(0) OR 16:OUT &H99,0 OR &H80 'Отключение ─────────── клавиатуры! Р е г и с т р 1. ─────────────── ┌─────┬────────┬─────────────────────────────────────────────────────┐ │Номер│Значение│ │ │бита │ бита │ К о м м е н т а р и й │ ├─────┼────────┼─────────────────────────────────────────────────────┤ │ 7 │ 0 │ Не используется │ ├─────┼────────┼─────────────────────────────────────────────────────┤ │ 6 │ │ Применение аналогично нажатию кнопки POWER дисплея: │ │ │ 0 │ изображение отключено │ │ │ 1 │ изображение включено │ ├─────┼────────┼─────────────────────────────────────────────────────┤ │ 5 │ 0 │ Бит "IE0": Запретить прерывание от горизонтального │ │ │ │ сканирования линии по "IE0" и отключить │ │ │ │ сигналы с клавиатуры │ │ │ 1 │ Разрешить прерывания по "IE0" │ ├─────┼────────┼─────────────────────────────────────────────────────┤ │ 4 │ │ Бит "M1" установки графических режимов │ │ 3 │ │ Бит "M2" установки графических режимов │ │ 2 │ 0 │ Не используется │ ├─────┼────────┼──────────────────────────────────┬──────────────────┤ │ 1 │ 0 │ Размер спрайтов 8╳8 │Использование этих│ │ │ 1 │ Размер спрайтов 16╳16 │ битов позволяет │ ├─────┼────────┼──────────────────────────────────┤ моделировать опе-│ │ 0 │ 0 │ Нормальный размер спрайтов │ ратор SCREEN ,n │ │ │ 1 │ "Увеличение" размера спрайтов │ │ └─────┴────────┴──────────────────────────────────┴──────────────────┘ Назначение 6-го бита регистра 1 иллюстрируется примерами 1 и 2: П р и м е р 1. ┌─ OFF ───────────── α) 10 SCREEN 2 β) 10 SCREEN 2 ▼ 15 ::::::::::::::::: 15 VDP(1)=&B10100000 20 CIRCLE(125,95),90 20 CIRCLE(125,95),90 30 PAINT STEP(0,0) 30 PAINT STEP(0,0) 35 ::::::::::::::::: 35 VDP(1)=&B11100000 40 GOTO 40 40 GOTO 40 ▲ γ) 10 SCREEN 2 └─ ON 15 OUT &H99,&B10100000:OUT &H99,1 OR &H80 20 CIRCLE(125,95),90:PAINT STEP (0,0) 35 VDP(1)=&B11100000 40 GOTO 40 Перед записью в регистр лучше всего сначала прочитать его текущее со- держимое, а лишь затем с помощью логических операций AND, OR и XOR устано- вить или "сбросить" нужные биты. П р и м е р 2. Включение и выключение экрана дисплея ───────────── VDP(1)=VDP(1) XOR 64 Эта команда включает экран, если он был выключен, и наоборот. А теперь разберемся с н у л е в ы м битом регистра 1 ... П р и м е р 3. Изменение размера спрайта без очистки шаблонов. ───────────── 10 SCREEN 2,1 20 SPRITE$(0)="0123456789ABCDEF" 30 PUT SPRITE 0,(50,50),,0 40 FOR I=1 TO 1000:NEXT 50 VDP(1)=VDP(1) XOR 1 'Эта команда переключает масштаб спрайтов без 60 GOTO 60 'очистки шаблонов А теперь замените строку 50 на строку 50 OUT &H99,VDP(1) XOR 1:OUT &H99,1 OR &H80 и выполните программу. Биты "M1","M2","M3","M4","M5" "отвечают" за выбор режима экрана: ┌────────────────────────┬───────────────────────┐ │ Биты и их значение │ Р е ж и м │ ├────┬────┬────┬────┬────┤ │ │ M1 │ M2 │ M3 │ M4 │ M5 │ видеопроцессора │ ├────┼────┼────┼────┼────┼───────────────────────┤ │ 1 │ 0 │ 0 │ 0 │ 0 │ SCREEN 0 (40 символов)│ │ 1 │ 0 │ 0 │ 1 │ 0 │ SCREEN 0 (80 символов)│ │ 0 │ 0 │ 0 │ 0 │ 0 │ SCREEN 1 │ │ 0 │ 0 │ 1 │ 0 │ 0 │ SCREEN 2 │ │ 0 │ 1 │ 0 │ 0 │ 0 │ SCREEN 3 │ │ 0 │ 0 │ 0 │ 1 │ 0 │ SCREEN 4 │ │ 0 │ 0 │ 1 │ 1 │ 0 │ SCREEN 5 │ │ 0 │ 0 │ 0 │ 1 │ 1 │ SCREEN 6 │ │ 0 │ 0 │ 1 │ 0 │ 1 │ SCREEN 7 │ │ 0 │ 0 │ 1 │ 1 │ 1 │ SCREEN 8 │ └────┴────┴────┴────┴────┴───────────────────────┘ Изменять содержимое битов "M1","M2","M3","M4" и "M5" не рекомендуется! Эти биты используются видеопроцессором при инициализации режима SCREEN, однако следует помнить, что для полной инициализации этого надостаточно! Легко, например, проверить, что команда VDP(0)=4 не устанавливает пол- ностью 80-символьный режим SCREEN 0. Зато чтение этих битов поможет Вам "вспомнить", в каком режиме SCREEN Вы работаете в данный момент. ┌──────────────────────────────────────────────────────────────────────┐ │ Для полной инициализации экрана нужно выполнить следующие действия: │ │ 1) установить биты M1,M2,M3,M4,M5; │ │ 2) установить начальные адреса Таблиц VRAM в регистрах базовых │ │ адресов; │ │ 3) заполнить таблицы видеопамяти необходимыми данными; │ │ 4) занести в ячейку памяти с адресом &HFCAF номер режима SCREEN. │ └──────────────────────────────────────────────────────────────────────┘ Р е г и с т р 8. ─────────────── ┌─────┬────────┬─────────────────────────────────────────────────────┐ │Номер│Значение│ │ │бита │ бита │ К о м м е н т а р и й │ ├─────┼────────┼─────────────────────────────────────────────────────┤ │ 7 │ 1 │ Цветовая шина устанавливается на режим в в о д а │ │ │ │ и разрешается использование манипулятора MSX-MOUSE │ │ │ 0 │ Цветовая шина устанавливается на режим в ы в о д а │ │ │ │ и запрещается использование манипулятора MSX-MOUSE │ ├─────┼────────┼─────────────────────────────────────────────────────┤ │ 6 │ 1 │ Разрешается обработка светового пера │ │ │ 0 │ Запрещается обработка светового пера │ ├─────┼────────┼─────────────────────────────────────────────────────┤ │ │ │ Бит с именем TP │ │ │ │ Устанавливается цвет кода 0 в цветовой палитре: │ │ 5 │ 1 │ α) изображение 0-го цвета имеет цвет 0 из Таблицы PT│ │ │ 0 │ β) изображение 0-го цвета имеет цвет бордюра │ ├─────┼────────┼─────────────────────────────────────────────────────┤ │ 4 │ │ Моделирует оператор SET VIDEO ,,n : │ │ │ 1 │ происходит вывод данных на видеомагнитофон │ │ │ 0 │ происходит ввод данных от внешнего TV-источника или │ │ │ │ от компьютера; │ ├─────┼────────┼─────────────────────────────────────────────────────┤ │ 3 │ │ Содержимое бита изменять не рекомендуется! │ │ │ 1 │ Размер видеопамяти ≥64 Кб (для компьютеров MSX-2) │ │ │ 0 │ Размер видеопамяти ≤64 Кб (для компьютеров MSX-1) │ ├─────┼────────┼─────────────────────────────────────────────────────┤ │ 2 │ 0 │ Не используется │ ├─────┼────────┼─────────────────────────────────────────────────────┤ │ 1 │ 1 │ Запрещается отображение спрайтов │ │ │ 0 │ Разрешается отображение спрайтов │ ├─────┼────────┼─────────────────────────────────────────────────────┤ │ 0 │ 1 │ Установить черно-белый режим с 32 градациями тона │ │ │ 0 │ Установить цветовой режим │ └─────┴────────┴─────────────────────────────────────────────────────┘ По умолчанию 5-й бит регистра с номером 8 равен 0. В этом случае объ- ект нулевого цвета будет окрашиваться цветом бордюра (т.е. будет п р о - з р а ч н ы м). Участки спрайтов с нулевым цветом на экране не отображают- ся. Но если спрайты пересекаются "невидимыми" частями, то столкновение спрайтов не будет установлено. Для получения на экране одновременно 16 цветов необходимо, чтобы бордюр был окрашен в н у л е в о й цвет. Если 5-й бит 8-го регистра равен 1, то объект нулевого цвета не будет окрашиваться цветом бордюра (если, конечно, бордюр сам не окрашен в нуле- вой цвет). Код цвета 0 будет кодом, который определяется в регистре палит- ры (только в режиме SCREEN 8 R=0, G=0, B=0). На экране одновременно могут отображаться 16 цветов, причем в области, отличной от бордюра; более того, отображаются спрайты всех цветов. Участки спрайтов с нулевым цветом на эк- ране по-прежнему не отображаются. Но если спрайты пересекаются "невидимы- ми" частями, то столкновение спрайтов б у д е т у с т а н о в л е н о . П р и м е р 4. ───────────── 10 COLOR =(0,2,4,7) 'Изменим палитру нулевого цвета 20 COLOR 1,15,8:SCREEN 2 30 VDP(8+1)=8 'Инициализация 8-го регистра 40 CIRCLE (90,90),45,0 'Изображение имеет цвет бордюра 50 A$=INPUT$(1) 60 VDP(8+1)=&B00101000 'Бордюр окрашен в 8-й цвет, 70 GOTO 70 'а изображение - в нулевой