XI.2.4. Р е г и с т р ы у п р а в л е н и я э к р а н о м Регистрами у п р а в л е н и я э к р а н о м будем называть регист- ры с номерами 18, 19, 23. Эти регистры используются для управления отобра- жением на дисплее. α) Использование регистра с номером в о с е м н а д ц а т ь дает возможность центрирования изображения относительно электронно-лучевой трубки дисплея: Р е г и с т р с н о м е р о м 18 ┌──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┐ │ │ Параметр смещения │ │ Параметр смешения │ │ │ вверх-вниз │ │ вправо-влево │ └──▲───┴──────┴──────┴──────┴──▲───┴──────┴──────┴──────┘ │ │ Флаг смещения вверх-вниз: Флаг смещения вправо-влево: 1 означает смещение экрана вниз; 1 означает смещение экрана вправо; 0 означает смещение экрана вверх 0 означает смещение экрана влево А теперь посмотрите на фрагмент алгоритма нахождения величины смещения экрана, который записан на школьном алгоритмическом языке: если Флаг смещения = 1 ──── │ то Величина смещения = 8 - параметр смещения │ ── │ иначе Величина смещения = параметр смещения │ ───── │ все ─── П р и м е р 1. Сдвинем экран влево на 2 точки и вниз на 5 точек. ───────────── 10 VDP(18+1)=&B10110010 ▲└▲┘▲└▲┘ Смещение экрана вниз ─┘ │ │ └─ 2 точки 5=8-3 ───┘ └─── Смещение экрана влево На компьютерах MSX-2 по умолчанию "содержимое" регистра с номером 18 по умолчанию задается оператором SET ADJUST (X,Y) Значения выражений X и Y принадлежат отрезку [-7,8]. β) Можно установить прерывание в момент, когда видeопроцессор начинает сканировать определенную линию. Для получения прерывания используется ре- гистр с номером д е в я т н а д ц а т ь, в котором хранится номер линии. γ) Р е г и с т р 23. ──────────────── Взгляните на рисунок, и Вы увидите, как изменяется изображение симво- лов на т е к с т о в о м экране в зависимости от содержимого 23-го ре- гистра (значимыми при этом являются только три младших бита): VDP(23+1)=0 VDP(23+1)=1 VDP(23+1)=2 VDP(23+1)=3 ┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌─┬─┬─┬─┬─┬─┬─┬─┐ │█│ │ │ │█│ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │█│ │█│ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │█│ │█│ │ │ │ │█│ │█│ │█│ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │█│ │█│ │ │ │ │█│ │█│ │█│ │ │ │ │█│█│ │█│█│ │ │ │ │█│ │█│ │█│ │ │ │ │█│ │█│ │█│ │ │ │ │█│█│ │█│█│ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │█│ │█│ │ │ │ │█│█│ │█│█│ │ │ │ │█│ │ │ │█│ │ │ │ │ │ │ │ │ │ │ │ │ │█│█│ │█│█│ │ │ │ │█│ │ │ │█│ │ │ │ │ │ │ │ │ │ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │ │ │█│ │ │ │ │ │ │ │ │ │ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │ │ │█│ │ │ │ │ │ │ │ │ │ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │ │ │█│ │ │ │ └─┴─┴─┴─┴─┴─┴─┴─┘ └─┴─┴─┴─┴─┴─┴─┴─┘ └─┴─┴─┴─┴─┴─┴─┴─┘ └─┴─┴─┴─┴─┴─┴─┴─┘ VDP(23+1)=4 VDP(23+1)=5 VDP(23+1)=6 VDP(23+1)=7 ┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌─┬─┬─┬─┬─┬─┬─┬─┐ │█│ │█│ │█│ │ │ │ │█│█│ │█│█│ │ │ │ │█│ │ │ │█│ │ │ │ │ │ │ │ │ │ │ │ │ │█│█│ │█│█│ │ │ │ │█│ │ │ │█│ │ │ │ │ │ │ │ │ │ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │ │ │█│ │ │ │ │ │ │ │ │ │ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │ │ │█│ │ │ │ │ │ │ │ │ │ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │█│ │█│ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │█│ │█│ │ │ │ │█│ │█│ │█│ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │█│ │█│ │ │ │ │█│ │█│ │█│ │ │ │ │█│█│ │█│█│ │ │ │ │█│ │█│ │█│ │ │ │ │█│ │█│ │█│ │ │ │ │█│█│ │█│█│ │ │ │ │█│ │ │ │█│ │ │ │ └─┴─┴─┴─┴─┴─┴─┴─┘ └─┴─┴─┴─┴─┴─┴─┴─┘ └─┴─┴─┴─┴─┴─┴─┴─┘ └─┴─┴─┴─┴─┴─┴─┴─┘ П р и м е р. ─────────── 5 SCREEN 0 10 CLS:KEYOFF 20 FOR I=0 TO 5:PRINT "▧▨▧▨▧":NEXT 30 FOR J=0 TO 7 40 FOR K=0 TO 10:NEXT K 50 VDP(23+1)=J 60 NEXT J 70 IF INKEY$="" THEN 30 80 VDP(23+1)=0:END В г р а ф и ч е с к и х режимах регистр с номером 23 предоставляет другую интересную возможность. Вначале следует вспомнить, что доступная высота графического экрана равна 192 или 212 линиям (в зависимости от де- вятого регистра MSX-VDP). Однако, Вы можете, воздействуя на VRAM (исполь- зуя, например, оператор VPOKE), сформировать шаблоны 256 линий, просмот- рев которые Вы можете, использовав регистр с номером 23. Понять, как это происходит, Вы можете из следующих рисунков: VDP(23+1)=0: ┌─────────────────┐ Y=0 │ Видимые линии │ ├─────────────────┤ Y=192 или 212 │ Невидимые линии │ └─────────────────┘ Y=255 VDP(23+1)=200: ┌─────────────────┐ Y=0 │ Видимые линии │ ├─────────────────┤ Y=136 или 156 │ Невидимые линии │ ├─────────────────┤ Y=200 │ Видимые линии │ └─────────────────┘ Y=255 XI.2.5. Н е к о т о р ы е р е г и с т р ы д о с т у п а Имеется возможность изменить палитру некоторого цвета. Для установки данных в д е в я т и б и т о в ы е регистры палитры видеопроцессора (с номерами от 0 до 15) следует вначале установить номер регистра палитры в регистре с номером ш е с т н а д ц а т ь , а затем по- следовательно вывести д в а байта данных (по порядку) через порт &H9A. Номера битов 7 6 5 4 3 2 1 0 ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬──────┐ Р е г и с т р 16│ 0 │ 0 │ 0 │ 0 │Н о м е р п а л и т р ы│ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴──────┘ ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬──────┐ П о р т &H9A │ 0 │ К р а с н ы й │ 0 │ С и н и й │ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴──────┘ ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬──────┐ П о р т &H9A │ 0 │ 0 │ 0 │ 0 │ 0 │ З е л е н ы й │ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴──────┘ ┌──────────────────────────────────────────────────────────────────────┐ │ Для изменения цвета надо набрать последовательно команды (операторы):│ │ VDP(16+1)=C:OUT &H9A,16*R+B:OUT &H9A,G │ │ где: C - номер цветовой палитры, которую Вы хотите изменить; │ │ R,B,G - числа, определяющие соотношение красного, синего и │ │ зеленого цветов в палитре. │ └──────────────────────────────────────────────────────────────────────┘ П р и м е р 2. ───────────── COLOR 15,3 Ok VDP(16+1)=3:OUT &H9A,64:OUT &H9A,3 Ok Отметим, что для компьютеров MSX-1 этот способ изменения цветов являет- ся единственно возможным! П р и м е р 3. ───────────── 10 COLOR 8,15,0:KEY OFF:SCREEN 1 20 FOR R=0 TO 7:FOR G=0 TO 7:FOR B=0 TO 7 30 OUT &H99,0:OUT &H99,16 OR &H80:OUT &H9A,16*R+B:OUT &H9A,G 40 LOCATE 10,10:?"R="R:LOCATE 10,11:?"G="G:LOCATE 10,12:?"B="B 50 FOR T=1 TO 500:NEXT T:NEXT B,G,R Регистр с номером с е м н а д ц а т ь хранит информацию о к о с в е н- н о м доступе в регистры MSX-VDP. Взгляните на его содержимое: 7 6 5 4 3 2 1 0 ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │ ∗ │ 0 │ Н о м е р р е г и с т р а │ └──▲──┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ ├──── 0 : автоинкрементирование з а п р е щ е н о; └──── 1 : автоинкрементирование р а з р е ш е н о. В соответствии со значением 7-го бита регистра 17 содержимое этого регистра может автоматически увеличиваться. Если автoинкрементирование за- прещено, то содержимое 17-го регистра останется прежним. Приведем два способа к о с в е н н о й з а п и с и в видеопроцессор с использованием регистра с номером 17: ┌───────────────────────────────────────────────────────────────────┐ α)│ 10 VDP(17+1)=N OR &H80'или OUT &H99,N OR &H80:OUT &H99,17 OR &H80 │ │ 20 OUT &h9B, Число для регистра с номером N │ │ 30 OUT &h9B, Число для регистра с номером N+1 │ │ 40 OUT &H9B, Число для регистра с номером N+2 │ │ 50 ' ··· │ └───────────────────────────────────────────────────────────────────┘ П р и м е р 4. ───────────── 5 SCREEN 1:COLOR 15,0,8 10 VDP(17+1)=8 OR &H40 'Установка регистра с номером 17 на косвенный 'доступ 20 OUT &H9B,VDP(8+1) OR &H20 'Цвет 0 из Таблицы палитр 30 OUT &H9B,VDP(9+1) OR &H80 'На экране - 26.5 строк ┌───────────────────────────────────────────────────────────────────┐ β)│ 10 VDP(17+1)=N 'или OUT &H99,N:OUT &H99,17 OR &H80 │ │ 20 OUT &H9B, Число для регистра N │ │ 30 OUT &H9B, Число для регистра N │ │ 40 OUT &H9B, Число для регистра N │ │ 50 ' ··· │ └───────────────────────────────────────────────────────────────────┘ Косвенный доступ к регистрам видеопроцессора применяется тогда, когда необходимо записать информацию в несколько регистров, адреса которых идут п о д р я д. При этом запись через порт с адресом &H9B будет происходить до тех пор, пока не будет сделана новая установка на косвеннвй доступ. ┌──────────────────────────────────────────────────────────────────────┐ │ Данные в 17-ом регистре не могут быть изменены косвенной адресацией! │ └──────────────────────────────────────────────────────────────────────┘ XI.2.6. Д о с т у п к в и д е о п а м я т и Р е г и с т р 14 (регистр базового адреса доступа к VRAM). ───────────────── Этот регистр видеопроцессора используется при доступе к видеопамяти. Если Вы располагаете видеопамятью объемом до 16 Кбайт, то использование этого регистра не имеет смысла, так как в нем хранятся с т а р ш и е би- ты текущего адреса видеопамяти. Р е г и с т р с н о м е р о м 14 Номера битов 7 6 5 4 3 2 1 0 ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │ 0 │ 0 │ 0 │ 0 │ 0 │ A16 │ A15 │ A14 │ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ В регистре с номером 14 устанавливаются три старших бита адреса ячейки видеопамяти (A16, A15, A14). Сейчас мы расскажем, как обратиться к л ю б о й ячейке видеопамяти. На компьютерах серии MSX-2 существует 2 типа видеопамяти: VRAM и ERAM. VRAM ("Video RAM") имеет объем в 128 Кб, а ERAM ("Expanded RAM") - 64 Кб. Информация о том, какая видеопамять используется в настоящий момент, хра- нится в регистре с номером 45. Доступ к видеопамяти осуществляется в следующей последовательности: 1) выберите т и п видеопамяти: VDP(45+1)=&B0∗∗∗∗∗∗∗ ▲└──▲─┘ │ └── эти биты используются для других целей ├────── 1 - если используется ERAM └────── 0 - если используется VRAM Отметим, что содержимое регистра с номером 45 не меняется при очеред- ном обращении к памяти. 2) установите биты A14÷A16 адреса видеопамяти: VDP(14+1)=&B00000∗∗∗ ▲▲▲ A16 ───┘│└─── A14 └──── A15 3) установите биты A0÷A7 счетчика адреса посредством вывода данных в порт &H99: OUT &H99,&B∗∗∗∗∗∗∗∗ ▲▲▲▲▲▲▲▲ │││││││└──── A0 ││││││└───── A1 │││││└────── A2 ││││└─────── A3 │││└──────── A4 ││└───────── A5 │└────────── A6 └─────────── A7 4) установите биты A8÷A13 счетчика адреса и признак чтения или записи посредством вывода данных в порт &H99: OUT &H99,&B∗∗∗∗∗∗∗∗ ▲▲▲▲▲▲▲▲ │││││││└──── A8 ││││││└───── A9 │││││└────── A10 ││││└─────── A11 │││└──────── A12 ││└───────── A13 ├┼────────── 00 - признак чтения └┴────────── 01 - признак записи 5) А теперь остается прочитать или записать данные в нужный байт: A=INP(&H98) - ч т е н и е OUT &H98,A - з а п и с ь 6) После чтения или записи данных содержимое адресного счетчика автома- тически увеличивается на единицу. При этом, если есть перенос из бита A13, то в режимах SCREEN 4÷8 происходит увеличение содержимого регистра с номе- ром 14. В режимах SCREEN 1÷3 и в 40-символьном режиме SCREEN 0 увеличения содержимого 14-го регистра не происходит. Из сказанного следует, что если нужно записать информацию в несколько подряд расположенных ячеек видеопамяти, достаточно установить лишь началь- ный адрес этой группы ячеек. XI.2.7. Р е г и с т р ы с т а т у с а Кроме регистров MSX-VDP, видеопроцессор работает с группой регистров, называемыми регистрами с т а т у с а. Данные регистры содержат информацию о состоянии видеопроцессора. Из них информацию можно только ч и т а т ь. Текущий номер регистра статуса записывается в регистр VDP с номером п я т н а д ц а т ь (регистр-указатель регистра состояния). Номера битов 7 6 5 4 3 2 1 0 ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │ 0 │ 0 │ 0 │ 0 │ Номер регистра статуса│ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ Для доступа к регистрам с о с т о я н и я видеопроцессора (с номера- ми 0,1,2,3,...,9) вначале нужно установить номер регистра статуса в реги- стре с номером 15, а затем прочесть данные через порт &H99. ┌───────────────────────────────────────────────────────────────────┐ │ Для записи в переменную W числа из регистра статуса с номером S, │ │ выполните следующие действия: │ │ VDP(15+1)=S:W=INP(&H99):VDP(15+1)=0 │ └───────────────────────────────────────────────────────────────────┘ Р е г и с т р с т а т у с а н о м е р 0. ────────────────────────────────────────── 7 6 5 4 3 2 1 0 ┌──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┐ │ │ │ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ └───▲──┴───▲──┴──▲───┴──────┴──────┴──────┴──────┴──────┘ │ │ │ └───▲──────────────────────────────┘ │ │ │ └ Экранный номер пятого или девятого │ │ │ (в зависимости от режима SCREEN) спрайта в строке │ │ └─── Флаг, указывающий на столкновение 2-х спрайтов │ └───────── Флаг обнаружения пятого (или девятого) спрайта │ в с т р о к е └──────────────── Флаг прерывания от вертикального сканирования (после чтения регистра состояния 0 данный флаг сбрасывается) Если бит СС=0 и высвечиваемые части шаблонов спрайтов перекрываются,то устанавливается столкновение спрайтов. Если столкновение спрайтов обнару- жено, то бит 5 регистра статуса с номером 0 устанавливается в 1. Этот бит устанавливается в 0 после чтения регистра статуса с номером 0. Использование регистра статуса с номером 0 рассмотрим на примерах. П р и м е р 1. ───────────── 10 SCREEN 1,2 20 SPRITE$(2)="Проверка":SPRITE$(3)="на столкновение" 30 FOR T=1 TO 130 40 PUT SPRITE 2,(T,80):PUT SPRITE 3,(240-T,80) 50 VDP(15+1)=0:Z=INP(&H99) AND 32 60 IF Z<>0 THEN PRINT "Столкновение состоялось!" 70 NEXT П р и м е р 2. ───────────── 10 SCREEN 1:KEYOFF 20 FOR I=0 TO 7:READ E:VPOKE &H3800+I,E:NEXT 30 A0=BASE(1*5+3):AD=A0+4*1:AP=A0+4*2 40 VPOKE AP,50:VPOKE AP+1,100:VPOKE AP+2,0:VPOKE AP+3,15 50 FOR X=0 TO 255 60 VPOKE AD,50:VPOKE AD+1,X:VPOKE AD+2,0:VPOKE AD+3,15 70 VDP(15+1)=0:Z=INP(&H99) AND 32 80 IF Z<>0 THEN LOCATE 1,1:PRINT"столкновение":FOR L=0 TO 100:NEXT:LOC ATE1,1:PRINT" " 90 NEXT 100 GOTO 50 110 DATA 255,255,195,195,195,195,255,255 П р и м е р 3. ───────────── 10 SCREEN1,2 20 SPRITE$(1)="Проверка":SPRITE$(2)="появления":SPRITE$(3)="пятого":SP RITE$(4)="спрайта":SPRITE$(5)="в строке" 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) 50 PRINT RIGHT$("00000000"+BIN$(Z),8) 55 A$=INPUT$(1) 60 PUT SPRITE4,(50,80),,1 70 VDP(15+1)=0:Z=INP(&H99) 80 ? RIGHT$("00000000"+BIN$(Z),8);"◀─ Появился 5-ый спрайт в строке!" Отметим, что содержимое регистра статуса с номером 0 можно прочесть не только функцией INP, но и при помощи псевдопеременной VDP: ┌────────────┐ │ A = VDP(8) │ . └────────────┘ П р и м е р 4. Управление столкновениями спрайтов. ────────────── 20 SCREEN 2,2 30 SPRITE$(0)=STRING$(32,255) 40 PUT SPRITE 0,(112,80),1,0 50 PUT SPRITE 1,(10,80),8,0 60 IF (VDP(8)AND32)=32 THEN GOTO 90 70 PUT SPRITE 1,STEP(1,0),8,0 80 GOTO 60 90 BEEP:GOTO 90 З а м е ч а н и е. Назначения битов регистров статуса с номерами 1,2,3, 4,5,6,7,8,9 рассмотрены в Приложении 2. Там же рассмотрены назначения би- тов командных регистров с номерами 32,33,...,45,46.