XI.3. НЕСТАНДАРТНЫЕ РЕЖИМЫ ВИДЕОПРОЦЕССОРА Боги открыли людям не все. В поиск пустившись,люди сами открыли немало. Ксенофан XI.3.1. Р е ж и м SCREEN 4 н а к о м п ь ю т е р а х MSX-1 Для Вас, наверное, окажется неожиданностью, что на компьютерах MSX-1 можно использовать режимы SCREEN 4 ÷ SCREEN 8. Доступ к этим режимам осу- ществляется путем непосредственной записи в регистры видеопроцессора. Режим SCREEN 4 вызывается из режима SCREEN 2 путем обращения к видео- процессору: ┌──────────────┐ │ VDP(0)=4 │ . └──────────────┘ При этом изображение, нарисованное в режиме SCREEN 2,останется на экра- не. Этот режим выгодно отличается возможностями работы со спрайтами. Приведем начальные адреса Таблиц VRAM, отвечающих за спрайты, в этом режиме: ┌──────────────────┬─────────────────────────┐ │ И м я Таблицы │ Начальный адрес Таблицы │ ├──────────────────┼─────────────────────────┤ │ SGT │ &H3800 │ │ SAT │ &H1A00 │ │ SCT │ &H1800 │ └──────────────────┴─────────────────────────┘ Чтобы вернуться в режим SCREEN 2, достаточно снова обратиться к видео- процессору: ┌──────────────┐ │ VDP(0)=2 │ . └──────────────┘ Учтите, что режим SCREEN 4 на компьютерах серии MSX-1 имеет некоторые о с о б е н н о с т и: 1) происходит частичное "наложение" Таблиц SAT и SCT на Таблицу PNT, что приводит к искажению неподвижного изображения.Поэтому необходимо "спа- сти" Таблицу PNT, т.е. передвинуть ее на свободное место в видеопамяти; 2) при переходе в этот режим возникает несоответствие между начальным адресом Таблицы SAT, возвращаемым псевдопеременной BASE(13),и тем же адре- сом,хранящимся в рабочей области RAM. Поместите поэтому в рабочую область RAM по адресам &HF928 и &HF929 число, записанное в псевдопеременной BASE(13); 3) образы спрайтов выводятся на экран уже на стадии формирования спрай- товых переменных.Единственный способ избавиться от этого - временно отклю- чить изображение (без очистки экрана) и включить его непосредственно пе- ред обращением к Таблице атрибутов спрайтов (SAT). А теперь взгляните на П р и м е р 1. Вы, конечно, помните, что текущий адрес Таблицы PNT хра- ───────────── нится в рабочей области по адресам &HF922 и &HF923 . 10 SCREEN 2,2 20 'Инициализация режима SCREEN 4 50 VDP(2)=7:POKE &HF923,&H1C 'Передвинем Таблицу PNT 60 VDP(5)=52:POKE &HF929,&H1A 'Приведем в порядок SAT 65 VDP(0)=4 'Установим режим SCREEN 4 70 'Основная программа 75 VDP(1)=VDP(1) XOR 64 'Отключим изображение 80 CIRCLE(100,100),50,15 90 FOR X=0 TO 8 100 SPRITE$(X)=STRING$(32,255):NEXT 'Сформируем спрайты 110 FOR Y=0 TO 15:V=INT(RND(1)*16) 120 FOR X=0 TO 8 130 VPOKE &H1800+X*16+Y,V 'Раскрасим спрайты, используя Таблицу SCT 140 NEXT X,Y 150 VDP(1)=VDP(1) XOR64 'Включим изображение 160 PUT SPRITE 8,(70,30),,0 170 X=128:Y=96 180 A=STICK(0) 190 IF A=1 OR A=2 OR A=8 THEN Y=Y-2 200 IF A=2 OR A=3 OR A=4 THEN X=X+2 210 IF A=4 OR A=5 OR A=6 THEN Y=Y+2 220 IF A=6 OR A=7 OR A=8 THEN X=X-2 230 FOR Z=0 TO 7 240 PUT SPRITE Z,(X-Z*17,Y),,0 'В о с е м ь спрайтов в строке! 250 NEXT Z 260 GOTO 180 Вас, конечно, не удивляет тот факт, что на экране - в о с е м ь спрай- тов в с т р о к е , так как Вам, наверное, известно,что режимы SCREEN 4 ÷ SCREEN 8 предоставляют такую возможность! XI.3.2. Т е к с т о в о - г р а ф и ч е с к и е р е ж и м ы Мы опишем здесь два текстово-графических режима: α) режим SCREEN 1-2 ("совмещенный" режим SCREEN 1 и SCREEN 2); β) режим SCREEN 1-4 ("совмещенный" режим SCREEN 1 и SCREEN 4). "Совмещенный" режим SCREEN 1-2 устанавливается операторами: ┌───────────────────────────────┐ │ SCREEN 1:DEFUSR=&H7E:A=USR(0) │ . └───────────────────────────────┘ Однако прежде чем начать "работать" в этом режиме, его надо инициализи- ровать следующим образом: ┌──────────────────────────────────────────────────────────────────┐ │ 10 SCREEN1:WIDTH 32 │ │ 20 DEFUSR=&H7E:A=USR(0) 'Установили совмещенный режим │ │ 30 'Считываем шаблоны символов из ROM в Таблицу PGT │ │ 40 FOR T=0 TO 2 │ │ 50 FOR K=0 TO 2047 │ │ 60 VPOKE BASE(7)+2048*T+K,PEEK(&H1BBF+K) │ │ 70 NEXT K,T │ │ 80 'Инициализируем цвета символов в Таблице CT │ │ 90 FOR I=0 TO 6143:VPOKE BASE(6)+I,&HF4:NEXT I │ │ 100 'Установим форму курсора во 2-м и 3-м окне экрана │ │ 110 FOR Y=1 TO 2:FOR X=0 TO 7:VPOKE &H800*Y+255*8+X,255:NEXT X,Y │ │ 120 NEW │ └──────────────────────────────────────────────────────────────────┘ Не беда, что для инициализации требуется более двух минут. При соответ- ствующей подготовке Вы сможете написать программу в машинных кодах, кото- рая будет работать в несколько десятков раз быстрее: П р и м е р 1. Смотрите и завидуйте! ───────────── 100 CLEAR 100,&HD000 110 SCREEN 1:WIDTH 32:DEFUSR=&H7E:A=USR(0) 120 A$="21000011BF1B1ACD1CD03EF0CBECCD1CD0CBAC13237CD608C206D0C9 47CD4D00CBDC78CD4D00CB9CCBE478CD4D00CBA4C9" 130 FOR X=0 TO 48:POKE &HD000+X,VAL("&h"+MID$(A$,X*2+1,2)):NEXT 140 DEFUSR=&HD000:A=USR(0) 150 FOR Y=1 TO 2:FOR X=0 TO 7:VPOKE &H800*Y+255*8+X,255:NEXT X,Y Поговорим об о с о б е н н о с т я х режима SCREEN 1-2 : 1. Данный режим позволяет формировать многоцветные символы, причем ин- формация о цветах каждого из них хранится в в о с ь м и байтах Таблицы CT: 1-й б а й т ··· 8-й б а й т ┌─────────────┬─────────────┬─────┬─────────────┬─────────────┐ │ Код цвета Код цвета │ │ Код цвета Код цвета │ │ изображения │ ф о н а │ │ изображения │ ф о н а │ │ для первой для первой │ ··· │ для восьмой для восьмой │ │ строки │ строки │ │ строки │ строки │ │ символа символа │ │ символа символа │ └─────────────┴─────────────┴─────┴─────────────┴─────────────┘ Проведем аналогию с режимом SCREEN 1: 1-й б а й т CT ┌─────────────┬─────────────┐ │ Код цвета Код цвета │ │ изображения │ ф о н а │ │ для первых для первых │ │ в о с ь м и │ в о с ь м и │ │ символов символов │ └─────────────┴─────────────┘ 2. Режим SCREEN 1-2 имеет трехоконную структуру(как и режим SCREEN 2): Внимательно изучите следующую табличку: ┌───────┬─────────────────────────────────────────────────────────────┐ │ Адрес │ К о м м е н т а р и й │ ├───────┼─────────────────────────────────────────────────────────────┤ │ &H0000│ Таблица шаблонов образов, расположенных в верхней части │ │ │ экрана, т.е. с 0-й по 7-ю строку. На каждый символ отводит- │ │ │ ся 8 байтов │ │ &H0800│ Таблица шаблонов символов, расположенных в средней части │ │ │ экрана, т.е. с 8-й по 15-ю строку │ │ &H1000│ Таблица шаблонов символов, расположенных в нижней части │ │ │ экрана, т.е. с 16-й по 23-ю строку │ │ &H1800│ Таблица имен образов (строки 0÷7) │ │ &H1900│ Таблица имен образов (строки 8÷15) │ │ &H1A00│ Таблица имен образов (строки 16÷23) │ │ &H1B00│ Таблица атрибутов спрайтов │ │ &H2000│ Таблица цветов символов,расположенных с 0-ой по 7-ю строку. │ │ │ На каждый символ отводится 8 байтов. На каждую строку симво-│ │ │ ла отводится 1 байт, старший полубайт которого отвечает за │ │ │ цвет установленных битов в Таблице шаблонов символов │ │ &H2800│ Таблица цветов символов,расположенных с 8-ой по 15-ю строку │ │ &H3000│ Таблица цветов символов,расположенных с 16-ой по 23-ю строку│ │ &H3800│ Таблица шаблонов спрайтов │ └───────┴─────────────────────────────────────────────────────────────┘ 3. В режиме SCREEN 1-2 разрешено использование как текстовых,так и гра- фических операторов, т.о. "совмещенный" режим SCREEN 1-2 может находиться в двух "состояниях". В о - п е р в ы х, это - т е к с т о в ы й режим.В нем "работают" все операторы текстового экрана. Однако, он отличается от текстового режима SCREEN 1 в следующих моментах: 1) весь экран разбит на т р и горизонтальных окна; 2) символ, вообще говоря, раскрашен о д н о в р е м е н н о в 16 цве- тов (по два цвета на линию); 3) один и тот же символ (определяемый кодом АSCII), может быть различ- ным по начертанию и цвету в трех различных окнах экрана. ┌──────────────────────────────────────────────────────────────────┐ │ Для изменения цвета какой-либо строки любого символа в любой │ │ трети экрана, примените оператор: │ │ VPOKE BASE(5+1)+2048*N+8*K+S,&HIF │ │ где: N - номер окна экрана; │ │ K - код ASCII символа; │ │ S - номер строки символа; │ │ I - цвет изображения; │ │ F - цвет фона. │ └──────────────────────────────────────────────────────────────────┘ ┌──────────────────────────────────────────────────────────────────┐ │ Для изменения шаблона одной строки символа используйте оператор │ │ VPOKE BASE(5+2)+2048*N+8*K+S,&B∗∗∗∗∗∗∗∗ ,│ │ где: N - номер окна экрана; │ │ K - код ASCII символа; │ │ S - номер строки символа; │ │ ∗∗∗∗∗∗∗∗ - двоичное представление шаблона строки символа. │ └──────────────────────────────────────────────────────────────────┘ Приведем несколько примеров: П р и м е р 2. Полюбуйтесь на ц в е т н о й курсор! ───────────── 10 FOR X=0 TO 2 20 A=&H2000+&H800*X+255*8 30 FOR Y=0 TO 7 40 VPOKE A+Y,Y*16 50 NEXT Y 60 NEXT X П р и м е р 3. А вот "переливание" латинских букв "А" в верхней трети ────────────── экрана! 10 FOR A=0 TO 8 20 FOR X=0 TO 7 30 VPOKE &H2000+65*8+X,(X+A)*16 40 NEXT X 50 NEXT A 60 GOTO 10 Чтобы прекратить процесс "переливания", нажмите клавиши "CTRL"+"STOP". П р и м е р 4. Вместо буквы "W" в верхнем углу экрана Вы увидете... ───────────── "яблоко"! 10 OUT&H99,6:OUT&H99,144:OUT&H98,16*4:OUT&H98,2 'Изменим 6-й цвет 20 A$="3C7E307830787E3C8484B8B8B8866414" 30 FOR X=0 TO 7 40 VPOKE 87*8+X,VAL("&H"+MID$(A$,X*2+1,2)) 50 VPOKE &H2000+87*8+X,VAL("&H"+MID$(A$,2*X+17,2)) 60 NEXT X П р и м е р 5. "Т о л с т ы е" символы - только в верхней трети экрана! ───────────── 10 FOR X=&HFFTO &H7F7 20 A=VPEEK(X):VPOKE X,A OR A/2 30 NEXT X П р и м е р 6. Теперь повращаем "трубу" вокруг своей оси! ───────────── 10 FOR I=0 TO 7:VPOKE 8*43+I,255:NEXT 20 CLS:PRINT"++++++++++++++++++++++++++++++" 30 FOR F=7 TO 0 STEP -1 40 VPOKE &H2000+&H800*0+8*43+F,&H71 50 IF F=7 THEN W=0 ELSE W=F+1 60 VPOKE &H2000+&H800*0+8*43+W,&H51 70 IF W=7 THEN WC=0 ELSE WC=W+1 80 VPOKE &H2000+&H800*0+8*43+WC,&H41 90 IF WC=7 THEN JC=0 ELSE JC=WC+1 100 VPOKE &H2000+&H800*0+8*43+JC,&H51 110 IF JC=7 THEN JJ=0 ELSE JJ=JC+1 120 VPOKE &H2000+&H800*0+8*43+JJ,&H71 130 IF JJ=7 THEN YJ=0 ELSE YJ=JJ+1 140 VPOKE &H2000+&H800*0+8*43+YJ,&HF1 150 NEXT:GOTO 30 В о - в т о р ы х , режим SCREEN 1-2 - это графический режим,в котором можно одновременно и рисовать, и выводить текст. Для этого предварительно решите, в какой части экрана (одной или нескольких) Вы будете рисовать, а в какой - писать. Для того, чтобы рисовать в какой-либо части экрана, ее надо предвари- тельно подготовить следующим образом: ┌────────────────────────────────────────────────────┐ │ FOR T=0 TO 255 :VPOKE BASE(5)+256*N+T,T :NEXT │ │ FOR T=0 TO 2047:VPOKE BASE(5+1)+2048*N+T,&HF4:NEXT │ │ FOR T=0 TO 2047:VPOKE BASE(5+2)+2048*N+T,0 :NEXT │ , └────────────────────────────────────────────────────┘ где N - номер части экрана, в которой Вы хотите применить графические опе- раторы. Таким образом, Вы инициализируете участки Таблиц PNT, CT и PGT,отвечаю- щие за изображение в нужном окне экрана. Теперь в приготовленной части экрана можно применять графические опера- торы. Однако, их можно применять только после выполнения оператора: ┌───────────────┐ │ POKE &HFCAF,2 │ . └───────────────┘ Для выхода в т е к с т о в ы й режим "пригодится" оператор: ┌───────────────┐ │ POKE &HFCAF,1 │ . └───────────────┘ Если Вы его не выполните, то произойдет переход в режим SCREEN 1 ! Нужно постоянно помнить о том, что Ваши рисунки могут "портиться", так как любой символ, напечатанный в графической части экрана, портит рисунок. Однако, рисунок можно восстановить, применив операторы: ┌─────────────────────────────────────────────┐ │ FOR T=0 TO 255:VPOKE BASE(5)+256*N+T,T:NEXT │ └─────────────────────────────────────────────┘ П р и м е р 7. В верхней части экрана - г р а ф и ч е с к и й режим! ───────────── 10 CLS 20 FOR X=0 TO 255:VPOKE &H1800+X,X:NEXT 30 FOR X=0 TO &H7FF:VPOKE X,0:NEXT 40 LOCATE 5,10:PRINT"Вверху графика!" 50 POKE &HFCAF,2 60 LINE (20,10)-(100,40),15,BF 70 CIRCLE (80,30),40,8 80 POKE &HFCAF,1 Рассмотрим теперь "совмещенный" режим SCREEN 1-4. Единственное отличие режима SCREEN 1-4 от режима SCREEN 1-2 состоит в том, что в нем разрешена работа с м н о г о ц в е т н ы м и спрайтами (как и в режиме SCREEN 4). Инициализируется режим SCREEN 1-4 следующим образом: ┌──────────────────────────────────────────────────────────────────┐ │ 10 SCREEN 1:WIDTH 32 │ │ 15 'Установим режим SCREEN 1-2 │ │ 20 DEFUSR=&H7E:A=USR(0) │ │ 30 'Считываем шаблоны символов из ROM в Таблицу PGT │ │ 40 FOR T=0 TO 2 │ │ 50 FOR K=0 TO 2047 │ │ 60 VPOKE BASE(7)+2048*T+K,PEEK(&H1BBF+K) │ │ 70 NEXT K,T │ │ 80 'Инициализируем цвета символов в Таблице CT │ │ 90 FOR I=0 TO 6143:VPOKE BASE(6)+I,&HF4:NEXT I │ │ 100 'Установим форму курсора во 2-м и 3-м окнах экрана │ │ 110 FOR Y=1 TO 2:FOR X=0 TO 7:VPOKE &H800*Y+255*8+X,255:NEXT X,Y │ │ 115 'Теперь установим режим SCREEN 1-4 │ │ 120 VDP(2)= 7:POKE &HF923,&H1C 'Передвинем Таблицу PNT │ │ 140 VDP(5)=52:POKE &HF929,&H1A 'Приведем в порядок SAT │ │ 150 VDP(0)=4:CLS:NEW │ └──────────────────────────────────────────────────────────────────┘ Все сказанное о режиме SCREEN 1-2, распространяется и на режим SCREEN 1-4. Остается только добавить, что структура видеопамяти в "совмещенном" режиме SCREEN 1-4 полностью совпадает со структурой VRAM в режиме SCREEN4 для компьютеров серии MSX-1.