\/d Г Л А В А XI. РАБОТА С ВИДЕОПАМЯТЬЮ И ВИДЕОПРОЦЕССОРОМ \/d- Надо понять тот минимум, на котором покоится мир, и все избыточное безжалостно отсекать (бритва Оккама). У.Оккам XI.1. В и д е о п а м я т ь П р о ц е с с о р (англ. "processor", от "process" - "обрабатывать") - совокупность устройств ЭВМ, выполняющих функции по преобразованию информа- ции. В зависимости от назначения различают центральные, функционально-ори- ентированные и проблемно-ориентированные процессоры. Графические возможности ПЭВМ "YAMAHA" поддерживаются функционально-ори- ентированным процессором- в и д е о п р о ц е с с о р о м .Видеопроцессор (VDP) постоянно "общается" с в и д е о п а м я т ь ю (VRAM), которая до- ступна центральному процессору через порты ввода-вывода, отвечает за изо- бражение на экране и интерпретирует находящиеся в ней данные в соответст- вии с заданным режимом SCREEN. Видеопроцессор обеспечивает отображение ин- формации, хранящейся в видеопамяти, на экран дисплея. В и д е о п а м я т ь ("Video RAM") - доступная устройству сопряжения дисплея и компьютера область оперативной памяти ЭВМ, в которой расположе- ны данные, соответствующие изображению на экране.В текстовом режиме видео- память содержит коды и атрибуты символов,в графических режимах каждой точ- ке экрана соответствует одна или несколько ячеек видеопамяти, указывающие ее цвет и яркость. Видеопамять разделена на несколько областей, называе- мых Т а б л и ц а м и , имена которых, размеры и назначение зависят от установленного режима SCREEN . ┌──────────────────────────────────────────────────────────────────┐ │ Это деление памяти автоматически выполняется оператором SCREEN, │ │ который инициализирует Таблицы видеопамяти. │ └──────────────────────────────────────────────────────────────────┘ Прежде чем Вы попытаетесь непосредственно воздействовать на "содержи- мое" экрана дисплея, хорошо разберитесь в назначении Таблиц VRAM! Далее в тексте Вам часто будут встречаться следующие аббревиатуры: ┌────────────┬──────────────────────────────────────────────────────────┐ │Аббревиатура│ Что Вам необходимо з а п о м н и т ь! │ ├────────────┼──────────────────────────────────────────────────────────┤ │ PNT │ "Pattern Name Table" - "Таблица имен образов" │ │ PGT │ "Pattern Generation Table"- "Таблица шаблонов образов" │ │ │ ("Таблица изображений") │ │ CT │ "Color Table" - "Таблица цветов" │ │ SGT │ "Sprite Generation Table" - "Таблица шаблонов спрайтов" │ │ SAT │ "Sprite Attribute Table" - "Таблица атрибутов спрайтов" │ │ SCT │ "Sprite Color Table" - "Таблица цветов спрайтов" │ │ PT │ "Palette Table" - "Таблица палитры" │ └────────────┴──────────────────────────────────────────────────────────┘ XI.1.1. П с е в д о п е р е м е н н а я BASE Псевдопеременная BASE используется для чтения начальных адресов Таблиц VRAM, а также для их "перемещения" в видеопамяти. α) Вначале о синтаксисе псевдопеременной BASE,используемой как функция BASE(N) , где: BASE ("base" - "база", "значение или адрес, относительно которого представляются другие значения и адреса") - служебное слово; N - арифметическое выражение, целая часть значения которого долж- на принадлежать отрезку [0,19] для компьютеров MSX-1 и отрезку [0,44] для компьютеров MSX-2. По значению N можно определить номер Таблицы видеопамя- ти (VRAM). Функция BASE(N), где N=M*5+T, возвращает н а ч а л ь н ы й а д р е с Таблицы с номером Т в режиме SCREEN M . Ясно, что M=N\5 и T=N MOD 5 . Номер Таблицы T принадлежит интервалу [0,4];режим экрана M может прини- мать значения 0,1,2,3,4,5,6,7,8 для компьютеров MSX-2 (0,1,2,3 для компью- теров MSX-1). Таким образом, с помощью функции BASE() можно иметь доступ не более чем к п я т и Таблицам для каждого из режимов экрана. Ниже приведены имена Таблиц, соответствующих различным значениям T: ┌───┬───────────────────────────────────────┐ │ T │ И м я Таблицы │ ├───┼───────────────────────────────────────┤ │ 0 │ PNT │ │ 1 │ CT (кроме режимов SCREEN 3,5,6,7,8 и│ │ │ 40-символьного режима SCREEN 0) │ │ 2 │ PGT (кроме режимов SCREEN 5,6,7,8) │ │ 3 │ SAT (кроме режима SCREEN 0) │ │ 4 │ SGT (кроме режима SCREEN 0) │ └───┴───────────────────────────────────────┘ Например, найдем начальный адрес Таблицы CT в режиме SCREEN 2. Для это- го выполним команду: PRINT HEX$(BASE(5*2+1)) 2000 ▲ ▲ Ok Режим экрана──┘ └── Номер Таблицы Следующая табличка позволяет найти начальный адрес Таблицы VRAM с номе- ром T для режима SCREEN M: ┌───────┬──────┬──────┬──────┬──────┬──────┐ │ М \ Т │0(PNT)│ 1(CT)│2(PGT)│3(SAT)│4(SGT)│ ├───────┼──────┼──────┼──────┼──────┼──────┤ │ 0 (40)│ 0 │ ── │ &H800│ ── │ ── │ │ 0 (80)│ 0 │ &H800│&H1000│ ── │ ── │ │ 1 │&H1800│&H2000│ 0 │&H1B00│&H3800│ │ 2 │&H1800│&H2000│ 0 │&H1B00│&H3800│ │ 3 │ &H800│ ── │ 0 │&H1B00│&H3800│ │ 4 │&H1800│&H2000│ 0 │&H1E00│&H3800│ │ 5 │ 0 │ ── │ ── │&H7600│&H7800│ │ 6 │ 0 │ ── │ ── │&H7600│&H7800│ │ 7 │ 0 │ ── │ ── │&HFA00│&HF000│ │ 8 │ 0 │ ── │ ── │&HFA00│&HF000│ └───────┴──────┴──────┴──────┴──────┴──────┘ Прочерками здесь помечены адреса Таблиц, отсутствующих в видеопамяти для данных M и T. Числа 40 и 80, стоящие в круглых скобках, указывают на ширину экрана в режиме SCREEN 0. А в этой табличке показано количество байтов в каждой из Таблиц VRAM. ┌───────┬──────┬──────┬──────┬──────┬──────┐ │ М \ Т │0(PNT)│ 1(CT)│2(PGT)│3(SAT)│4(SGT)│ ├───────┼──────┼──────┼──────┼──────┼──────┤ │ 0 (40)│ 960 │ ── │ 2048 │ ── │ ── │ │ 0 (80)│ 1920 │ 270 │ 2048 │ ── │ ── │ │ 1 │ 768 │ 32 │ 2048 │ 128 │ 2048 │ │ 2 │ 768 │ 6144 │ 6144 │ 128 │ 2048 │ │ 3 │ 768 │ ── │ 1536 │ 128 │ 2048 │ │ 4 │ 768 │ 6144 │ 6144 │ 128 │ 2048 │ │ 5 │27136 │ ── │ ── │ 128 │ 2048 │ │ 6 │27136 │ ── │ ── │ 128 │ 2048 │ │ 7 │54272 │ ── │ ── │ 128 │ 2048 │ │ 8 │54272 │ ── │ ── │ 128 │ 2048 │ └───────┴──────┴──────┴──────┴──────┴──────┘ ┌───────────────────────────────────────────────────────────────────┐ │ Внимание! Функция BASE не позволяет найти начальные адреса │ │ Таблиц PT и SCT │ └───────────────────────────────────────────────────────────────────┘ Но Вы не волнуйтесь: в следующей табличке мы приводим начальные адреса и этих Таблиц: ┌───────┬────────┬────────┐ │ Режим │ PT │ SCT │ ├───────┼────────┼────────┤ Таблица PT для всех режимов │ 0 (40)│ &H0400 │ ── │ SCREEN занимает в видеопамяти │ 0 (80)│ &H0800 │ ── │ 32 байта. │ 1 │ &H2020 │ ── │ Таблица SCT для всех режимов │ 2 │ &H1B80 │ ── │ SCREEN занимает в видеопамяти │ 3 │ &H2020 │ ── │ 512 байтов. │ 4 │ &H1E80 │ &H1C00 │ │ 5 │ &H7680 │ &H7400 │ │ 6 │ &H7680 │ &H7400 │ │ 7 │ &HFA80 │ &HF800 │ │ 8 │ &HFA80 │ &HF800 │ └───────┴────────┴────────┘ β) А теперь - синтаксис псевдопеременной BASE, используемой в левой части оператора присваивания: BASE(N)= 1024*A или BASE(N)=&H400*A , где: N - арифметическое выражение, целая часть значения которого долж- на принадлежать отрезку [0,19]. Значение N - это номер Таблицы VRAM; A - арифметическое выражение,целая часть значения которого, умно- женная на число 1024, определяет новый начальный адрес Таблицы VRAM с но- мером N (1Кбайт = 1024 байтам). Значение A должно принадлежать отрезку [0,15] для компьютеров серий MSX-1 и MSX-2. ┌──────────┬───┬─────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┐ │Значение A│ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ ├──────────┼───┼─────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┤ │ &H400·A │ 0 │&H400│&H0800│&H0C00│&H1000│&H1400│&H1800│&H1C00│&H2000│ └──────────┴───┴─────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┘ ┌──────────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┐ │Значение A│ 9 │ 10 │ 11 │ 12 │ 13 │ 14 │ 15 │ ├──────────┼──────┼──────┼──────┼──────┼──────┼──────┼──────┤ │ &H400·A │&H2400│&H2800│&H2C00│&H3000│&H3400│&H3800│&H3C00│ └──────────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┘ Если значения N или A не будут принадлежать указанным отрезкам, то ком- пьютер выдаст сообщение об ошибке: "Illegal function call". Псевдопеременная BASE, расположенная в правой части оператора присваи- вания, позволяет "перемещать" Таблицы. Она используется только в режимах SCREEN 0 ÷ SCREEN 3, и поэтому значение N должно принадлежать отрезку [0,19]. Вспомним, что в режимах SCREEN 5÷8 можно переключаться с одной экран- ной с т р а н и ц ы на другую при помощи оператора SET PAGE. Этот опера- тор, однако, не применим в режимах SCREEN 0÷4. Используя же псевдоперемен- ную BASE, можно "работать" с экранными страницами в режимах SCREEN 0÷3. В режиме SCREEN 4 работа с экранными страницами запрещена. Приведем следую- щую табличку: ┌──────────────────┬──────┬──────┬───┬───┬───┬───┬────┬─────┬─────┬─────┐ │ Р е ж и м экрана│ 0(40)│ 0(80)│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ ├──────────────────┼──────┼──────┼───┼───┼───┼───┼────┼─────┼─────┼─────┤ │ Число разрешенных│ 4 │ 2 │ 1 │ 1 │ 1 │ 1 │ 4 │ 4 │ 2 │ 2 │ │ экранных страниц │ Используется BASE ├───┤Используется SET PAGE │ └──────────────────┴─────────────────────────┘ └──────────────────────┘ П р и м е р. Запись нескольких экранных с т р а н и ц в режиме ─────────── SCREEN 0 и их переключение. Стандартный начальный адрес для Таблицы PNT в режиме SCREEN 0 равен 0. "Передвинем" эту Таблицу вначале к адресу &H2000, а затем к адресу &H2400. Идентифицируем экранные страницы ("что-нибудь" на них напишем!), а затем будем переключаться с одной страницы на другую путем переопределения нача- ла Таблицы PNT в строках 100 и 110. ┌───────────────────────────────────────────────────────────────────────┐ │ Заметим, что начальные адреса Таблиц PNT, PGT, SGT и SAT для текущего │ │ режима SCREEN хранятся в рабочей области, начиная с адресов &HF922, │ │ &HF924, &HF926 и &HF928 соответственно,и занимают по два байта каждый.│ └───────────────────────────────────────────────────────────────────────┘ Эти значения не могут быть изменены оператором BASE: Вы должны сделать это с а м и (строка 110). В противном случае выход в непосредственный ре- жим работы будет возможен только из н у л е в о й страницы, а выйти на нее из другой страницы можно осуществить, если набрать "вслепую" команду SCREEN М , где М - номер режима. 10 SCREEN 0:WIDTH 40 20 FOR I=0 TO 2 30 GOSUB 100:GOSUB 200 '──▶ 40 NEXT I 50 IF INKEY$="" THEN 50 60 I=(I+1)MOD3:GOSUB 100 '──▶ 70 GOTO 50 90 '∗∗∗∗∗ Подпрограмма 1 ∗∗∗∗∗ 100 IF I=0 THEN BASE(0)=0 ELSE BASE(0)=&H2000+(I-1)*&H400 110 IF I=0 THEN POKE &HF922,&H00:POKE &HF923,&H00 ELSE POKE &HF922,0:POKE &HF923,&H20+(I-1)*4'Запись в слово ──▲─── ───▲── ' NAMBAS Адрес младшего байта─┘ └─ Адрес старшего байта 120 RETURN '──▶ 190 '∗∗∗∗∗ Подпрограмма 2 ∗∗∗∗∗ 200 CLS:FOR J=0 TO 50:PRINT "PAGE";I;:NEXT:RETURN '──▶ XI.1.2. Ф у н к ц и я VPEEK . О п е р а т о р VPOKE Вы всегда можете посмотреть, какое число находится в той или иной ячей- ке видеопамяти. Для этого используется функция VPEEK, общий вид которой: ┌─────────────────────┐ │ VPEEK(а д р е с) │ , └─────────────────────┘ где: VPEEK ("Video RAM PEEK") - служебное слово; а д р е с - арифметическое выражение, целая часть значения которо- го принадлежит отрезку [0,16383] для компьютеров MSX-1 и [0,65535] для компьютеров MSX-2. Нарушение этого условия приводит к сообщению об ошибке "Illegal function call" . Функция VPEEK возвращает содержимое ячейки VRAM с номером "а д р е с". Действия функций VPEEK и PEEK аналогичны. Для з а п и с и данных в конкретную ячейку видеопамяти предназначен оператор VPOKE, синтаксис которого: ┌────────────────────────────────────┐ │ VPOKE а д р е с , д а н н о е │ , └────────────────────────────────────┘ где: VPOKE ("Video RAM POKE") - служебное слово; а д р е с - арифметическое выражение, целая часть значения которо- го должна принадлежать отрезку [0,16383] для компьютеров MSX-1 и отрезку [0,65535] для компьютеров MSX-2; д а н н о е - арифметическое выражение, целая часть значения кото- рого должна принадлежать отрезку [0,255]. Если хотя бы одно из значений параметров а д р е с или д а н н о е не удовлетворяет требуемым условиям, то компьютер сообщает об ошибке: "Illegal function call" . Приведем простейший пример: вначале запишем в ячейку VRAM с номером 16383 число 10 командой VPOKE 16383,10 , а затем "прочтем"содержимое этой ячейки: print VPEEK(16383) 10 Ok Думаем, Вам ясна аналогия в действиях операторов VPOKE и POKE. Если Вы посмотрите на структуру видеопамяти в различных экранных режи- мах, то заметите, что некоторые области видеопамяти не используются. Эти области могут служить в качестве дополнительного пространства для сохране- ния данных при помощи оператора VPOKE, когда RAM почти полностью исполь- зована! Однако при таком методе необходимо постоянно пользоваться нулевым текстовым режимом экрана - при смене режима Ваши данные будут уничтожены. П р и м е р 1. "Спрячем" числовой массив (кстати,а где оператор DIM ?!) ───────────── в видеопамяти, а затем "извлечем его" оттуда. 10 SCREEN 0:WIDTH 40:ADR=4096 'Начальный адрес хранения данных в VRAM 20 INPUT"Число элементов массива";N 30 FOR T=1 TO N 40 INPUT"Очередной элемент";Z 50 FOR I=0 TO 7 60 VPOKE ADR+8*T+I,PEEK(VARPTR(Z)+I) 70 NEXT I,T 80 'Выведем элементы массива на экран 90 FOR T=1 TO N 100 IF VPEEK(ADR+8*T)\128=1 THEN Z$="-." ELSE Z$="+." 'Знак числа 110 FOR I=1 TO 7 120 Z$=Z$+RIGHT$("00"+HEX$(VPEEK(ADR+8*T+I)),2) 'Мантисса числа 130 NEXT I 140 IF(VPEEK(ADR+8*T) MOD 128)\64=1 THEN Z$=Z$+"E+" ELSE Z$=Z$+"E-" 150 Z$=Z$+MID$(STR$((VPEEK(ADR+8*T)MOD 128)-64),2) 'Порядок числа 160 U=VAL(Z$):PRINT U;:NEXT T П р и м е р 2. ───────────── 10 TP=4096:SCREEN 0:WIDTH 38 30 INPUT"Имя (символ '*' - для окончания)";N$ 40 IF LEFT$(N$,1)="*"THEN 120 50 IF TP+LEN(N$)+1>16383 THEN PRINT"Память заполнена":GOTO 120 60 FOR I=1 TO LEN(N$) 70 VPOKE TP,ASC(MID$(N$,I,1)):TP=TP+1 90 NEXT 100 VPOKE TP,0:TP=TP+1 110 GOTO 30 120 CLS:I=4096 140 X=VPEEK(I) 150 IF X=0 THEN PRINT:GOTO 170 160 PRINT CHR$(X) 170 I=I+1 180 IF I6 GOTO 120 130 PRINT:PRINT:POKE &HF418,1:DEFUSR=&H156 140 LPRINT CHR$(27);"c1";CHR$(27);"p0";CHR$(27);"T15";CHR$(27);">";CHR $(27);"Q"; 150 IF MP=1 THEN I=0:LPRINT CHR$(27);"E (c) LHsoft ver.2":LPRINT C HR$(27);"Q" ELSE I=43*MP-45 160 P=MP 170 GOSUB 460 180 IF P=1 THEN K=41 ELSE K=43 190 FOR N=1 TO K 200 GOSUB 260 210 I=I+1 220 NEXT N 230 LPRINT"└────┴─────┴────┴──────┴──────┴──────┴──────┴──────┴──────┴ ─────────────────────────────────┴─────────────────────────┘ 240 LPRINT CHR$(12);:IF P<6 THEN PRINT CHR$(27);"MPut in a new sheet " ;:QQ=USR(0):Q$=INPUT$(1):P=P+1:GOTO 170 250 CLS:KEYON:END 260 LPRINT"│ │ │ │ │ │ │ │ │ │ │ │ 270 LPRINT"│ │ "; 280 LPRINTUSING("###");I; 290 A1=I*8:A0=A1+2048:LPRINT" │ ";RIGHT$("0"+HEX$(I),2);" │";A0;"│ 0"; HEX$(A0);" │ "; 300 LPRINTUSING("####");A1; 310 LPRINT" │ ";RIGHT$("000"+HEX$(A1),4);" │"; 320 IF IMOD8=0 THEN LPRINT 8192+I/8;"│ ";HEX$(&H2000+I/8);" │";ELSE LP RINT" │ │"; 330 FOR T=0 TO 7:LPRINTUSING(" ###");PEEK(&H1BBF+I*8+T);:NEXT 340 LPRINT" │ "; 350 FOR T=0 TO 7:LPRINT RIGHT$("0"+HEX$(PEEK(&H1BBF+I*8+T)),2);" ";:NE XT 360 LPRINT"│";CHR$(13);" ";CHR$(27);"N";CHR$(27);"S0008"; 370 M=128 380 FOR K1=0 TO 7 390 D=0 400 FOR K2=7 TO 0 STEP-1 410 D=D*2 420 IF PEEK(&H1BBF+I*8+K2)ANDM THEN D=D+1 430 NEXT K2:LPRINT CHR$(D);:M=M/2:NEXT K1 440 LPRINT CHR$(27);"Q" 450 RETURN 460 PRINT CHR$(27);"MCurrent page is";P; 470 LPRINT"┌────┬──────────┬───────────────────────────┬─────────────┬ ───────────────────────────────────────────────────────────┐ 480 LPRINT"│ │ Код │ Адрес в PGT │ Адрес в CT │ │ 490 LPRINT"│Сим-│ ├─────────────┬─────────────┼─────────────┤ Стандартное значение │ 500 LPRINT"│вол │ ASCII │ SCREEN 0 │ SCREEN 1 │ SCREEN 1 │ │ 510 LPRINT"│ ├─────┬────┼──────┬──────┼──────┬──────┼──────┬──────┼ ─────────────────────────────────┬─────────────────────────┤ 520 LPRINT"│ │ дес.│шест│ дес. │ шест.│ дес. │ шест.│ дес. │ шест.│ десятичное │ шестнадцатеричное │ 530 LPRINT"├────┼─────┼────┼──────┼──────┼──────┼──────┼──────┼──────┼ ─────────────────────────────────┼─────────────────────────┤ 540 RETURN XI.1.4. Р е ж и м ы SCREEN 2 и SCREEN 4 Есть медленно и умеренно, не пить во время еды, тщательно разжевывать пищу и с легко- стью вставать из-за стола с чувством, что мог бы съесть еще. Ж.Фрумузак Разделим экран (размером 256╳192 точек) на к в а д р а т ы размером по 8╳8 точек. Легко подсчитать, что мы получим 768 таких квадратов.Каждый из них имеет свой номер, который хранится в Таблице PNT. А так как макси- мальное целое число, которое можно "разместить" в одном байте памяти (в данном случае VRAM), равно 255, поэтому Таблицу PNT необходимо разбить на т р и области, каждая из которых будет отвечать за нумерацию только 256 квадратов. При установке режимов SCREEN 2 или SCREEN 4 (при инициализации) в каж- дую треть Таблицы PNT последовательно заносятся целые числа от 0 до 255. ┌───────────────────────────────────────────────────────────────────┐ │ Адрес байта PNT, отвечающего за к в а д р а т с номером n2, │ │ вычисляется при помощи арифметического выражения: │ │ BASE(5·N) + 256·n1 + n2 , │ │ где: N - номер режима SCREEN (2 или 4); │ │ n1 - номер трети таблицы PNT, в которой находится квадрат; │ │ n2 - номер квадрата. │ └───────────────────────────────────────────────────────────────────┘ Соответственно Таблице PNT, весь экран также разбивается на три области (каждая размером 256╳64 точек), которые мы будем называть о к н а м и. ┌───┬───┬─────────────────────┬───┐ │ 0 │ 1 │··· ···│ 31│ ├───┴───┘ └───┤ │ ··· О к н о 0 ···│ ├───┬───┐ ┌───┤ │224│225│··· ···│255│ ├───┼───┼─────────────────────┼───┤ │ 0 │ 1 │··· ···│ 31│ ├───┴───┘ └───┤ │ ··· О к н о 1 ···│ ├───┬───┐ ┌───┤ │224│225│··· ···│255│ ├───┼───┼─────────────────────┼───┤ │ 0 │ 1 │··· ···│ 31│ ├───┴───┘ └───┤ │ ··· О к н о 2 ···│ ├───┬───┐ ┌───┤ │224│225│··· ···│255│ └───┴───┴─────────────────────┴───┘ Если мы захотим что-то изменить в Таблице PNT, то это немедленно ска- жется на изображении в соответствующем окне. Таблица PNT редко используется при составлении программ. Более того, можно рассматривать структуру экрана, "забыв" о делении экрана на окна. Достаточно при этом мысленно пронумеровать квадраты экрана от 0 до 767. Покажем, как можно использовать Таблицу PNT для копирования изображения в пределах о д н о г о экранного окна. Пусть, например, Вам нужно скопи- ровать изображение из квадрата с номером A в квадрат с номером B.Для этого в байт Таблицы PNT, отвечающий за квадрат с номером B, поместите номер ква- драта A. Этого достаточно для того, чтобы произошел процесс копирования! П р и м е р 1. ───────────── 10 COLOR 1,15:SCREEN 2 20 LINE(8,8)-(15,15),,BF 'Сформировано изображение в квадрате 33 30 A$=INPUT$(1) 40 VPOKE &H1800+40,33 'Скопировали его в квадрат 40 50 GOTO 50 Более того, Вы можете заранее (до того, как будете что-то рисовать на экране) "размножить" по нужным адресам номер определенного блока. Далее Вам достаточно лишь заполнить изображением тот квадрат,номер которого был "размножен",и, к Вашей радости,это изображение появится и в других местах! П р и м е р 2. ───────────── 10 COLOR 1,15:SCREEN 2 20 VPOKE &H1800+40,33 'Квадрат 40 подготовлен для приема 30 A$=INPUT$(1) 'копии из квадрата 33 40 LINE(8,8)-(15,15),,BF 'Сформировано изображение в 33-м и 50 GOTO 50 'в 40-м квадратах Если же Вы захотите скопировать какой-либо элемент в другое о к н о экрана, то Вам поможет работа с Таблицами PGT и CT,к рассмотрению которых мы и переходим. Каждый квадрат 8╳8 точек разобьем на 8 горизонтальных участков,которые будем называть л и н и я м и . Информация о каждой линии (1 байт) содержится в Таблице PGT. Следовательно, объем этой Таблицы равен 768╳8 = 6144 байтам. ┌───────────────────────────────────────────────────────────┐ │ Адрес байта Таблицы PGT, отвечающего за расположение │ │ л и н и и вычисляется при помощи арифметического │ │ выражения BASE(5·N+2) + (256·n1+n2)·8 + k , │ │ где: N - номер режима SCREEN; │ │ n1 - номер окна; │ │ n2 - номер квадрата в этом окне; │ │ k - номер линии в этом квадрате. │ └───────────────────────────────────────────────────────────┘ Отметим, что если в Таблице PNT были изменения, то могут возникнуть за- труднения при попытке "нарисовать" что-либо в квадрате с измененным номе- ром. П р и м е р 3. ───────────── 10 COLOR 1,15:SCREEN 2 20 VPOKE 6144+40,VPEEK(6144+33)'Произошло изменение в Таблице PNT 30 A$=INPUT$(1) 'Ждем нажатия клавиши! 40 LINE(64,8)-(71,15),,BF 'Попытка вывести изображение в квадрате 50 GOTO 50 '40 не привела к ожидаемому результату! Так как информация о линии хранится в одном байте, то каждой точке ли- нии соответствует определенный бит этого байта. Оказывается, что "высве- тить точку на экране" - это значит установить нужный бит в 1,"стереть точ- ку с экрана" - это значит установить бит в 0 ! Если некоторый бит равен 0,то соответствующую ему точку на экране бу- дем называть точкой ф о н а, в противном случае будем называть ее точкой и з о б р а ж е н и я. Каждому байту Таблицы PGT однозначно соответствует один байт в Таблице цветов (CT), причем четыре младших бита этого байта кодируют локальный цвет ф о н а для каждой линии, а четыре старших - локальный цвет и з о- б р а ж е н и я. Например: Т о ч к и ф о н а │ │ │ │ │ ┌────┬──▼─┬──▼─┬──▼─┬────┬────┬──▼─┬──▼─┐ │ 1 │ 0 │ 0 │ 0 │ 1 │ 1 │ 0 │ 0 │ Байт PGT └──▲─┴────┴────┴────┴──▲─┴──▲─┴────┴────┘ │ │ │ Т о ч к и и з о б р а ж е н и я ┌────┬────┬────┬────┬────┬────┬────┬────┐ │ 0 │ 1 │ 0 │ 1 │ 1 │ 1 │ 0 │ 1 │ Байт CT └────┴────┴────┴────┴────┴────┴────┴────┘ └────────▲────────┘ └────────▲─────────┘ │ │ Цвет и з о б р а ж е н и я Цвет ф о н а Таким образом,точки изображения будут иметь цвет 5, а точки фона будут иметь цвет 13. Так как из четырех двоичных цифр можно составить только 16 комбинаций, то ясно, что ┌─────────────────────────────────────────────────────────────┐ │ одновременно на экране может быть не б о л е е 16 цветов │. └─────────────────────────────────────────────────────────────┘ ┌──────────────────────────────────────────────────────────────────┐ │ Вследствие этого изменение цвета одной точки приводит к │ │ переопределению цвета и з о б р а ж е н и я в с е й линии! │ └──────────────────────────────────────────────────────────────────┘ ┌───────────────────────────────────────────────────────────┐ │ Адрес байта Таблицы CT, отвечающего за ц в е т линии, │ │ вычисляется при помощи арифметического выражения: │ │ BASE(5·N+1) + (256·n1+n2)·8 + k , │ │ где: N - номер режима SCREEN; │ │ n1 - номер окна; │ │ n2 - номер квадрата в этом окне; │ │ k - номер линии в этом квадрате. │ └───────────────────────────────────────────────────────────┘ П р и м е р 4. Предположим, что Вам захотелось в 5-й линии 58-го квад- ───────────── рата 2-го окна в режиме SCREEN 2 точки 0÷3 изобразить цветом 3, а точки 4÷7 - цветом 15. 10 SCREEN 2 20 A=BASE(5*2+1)+(256*2+58)*8+5 30 B=BASE(5*2+2)+(256*2+58)*8+5 40 VPOKE B,&B11110000 50 VPOKE A,&H3F 60 GOTO 60 А теперь - давно обещанный Вам пример... П р и м е р 5. Копирование содержимого 0-го квадрата из 0-го окна в ────────────── содержимое 0-го квадрата 2-го окна 10 COLOR 15,1,1:SCREEN2 20 LINE(0,0)-(7,7),,BF 25 FOR I=0 TO 7 30 VPOKE BASE(5*2+2)+(256*2+0)*8+I,VPEEK(BASE(5*2+2)+(256*0+0)*8+I): 'Копирование изображения 35 VPOKE BASE(5*2+1)+(256*2+0)*8+I,VPEEK(BASE(5*2+1)+(256*0+0)*8+I): 'Копирование цвета 40 NEXT 50 GOTO 50 П р и м е р 6. Изобразим квадрат, стороны которого имеют разные цвета, ───────────── не используя оператор PSET. 10 SCREEN 2 14 DATA 0,5,1,37,2,37,4,37,8,165,4,165,2,165,1,21,0,5,0,5,128,133,64, 133,32,133,64,21,128,21,0,5 'Фон синего цвета 15 FOR I=0 TO 1 · 16 FOR J=0 TO 7 Точки · · Точки 20 A=BASE(5*2+2)+(256*0+I)*8+J зеленого ──▶· ·◀── красного 30 B=BASE(5*2+1)+(256*0+I)*8+J цвета · · цвета 40 READ Z,U:VPOKE A,Z:VPOKE B,U Точки ──▶· ·◀── Точки 60 NEXT J желтого · · черного 70 NEXT I цвета · цвета 80 GOTO 80 ┌──────────────────────────────────────────────────┐ │ Важно заметить, что Таблица CT инициализируется │ │ цветом ф о н а, задаваемым в операторе COLOR. │ └──────────────────────────────────────────────────┘ Опишем алгоритм установки точки в режимах SCREEN 2 и SCREEN 4. 1. Первый шаг состоит в нахождении адреса байта Таблицы PGT в зависи- мости от координат (X,Y) ("г р у б а я настройка"). ┌────────────────────────────────────────┐ │ А д р е с = ((Y\8)*32+Х\8)*8+Y MOD 8 │ └────────────────────────────────────────┘ 2. После этого нужно точно определить номер бита найденного байта, от- вечающего за данную точку ("т о ч н а я настройка"). Трудность состоит в несоответствии номеров битов в байте и значений Х-координат тех точек, за которые этот байт отвечает: ┌────────────┬───┬───┬───┬───┬───┬───┬───┬───┐ │ Х MOD 8 │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ ├────────────┼───┼───┼───┼───┼───┼───┼───┼───┤ │ Номер бита │ 7 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │ 0 │. └────────────┴───┴───┴───┴───┴───┴───┴───┴───┘ Формула, при помощи которой можно найти номер бита по Х - к о о р д и- н а т е, выглядит следующим образом: ┌──────────────────────────┐ │ NB = 2^(8+NOT(X MOD 8)) │. └──────────────────────────┘ 3. Теперь остается записать "1" в найденный бит. ┌───────────────────────────────────────────┐ │ VPOKE А д р е с, VPEEK (А д р е с) OR NB │. └───────────────────────────────────────────┘ И...точка появится в требуемом месте экрана. 4. Наконец, изменим цвет изображения выведенной точки: ┌────────────────────────────────────────────────────┐ │ А д р е с = А д р е с + &h2000 │ │ │ │ VPOKE А д р е с, VPEEK(А д р е с) MOD 16 + COL*16 │ , └────────────────────────────────────────────────────┘ где COL - номер цвета. Опишем алгоритм работы видеопроцессора при выводе содержимого квадрата 8╳8 на графические экраны SCREEN 2 или SCREEN 4. Предположим, что нам известно местоположение данного квадрата на экра- не. Пусть N - номер квадрата с координатами (X,Y) (0≤X≤31,0≤Y≤23)(номер N пока нам неизвестен!). Взгляните на рисунок: ┌───┬───┬─────────────────────┬───┐ Y=0 │ 0 │ 1 │··· ···│ 31│ · ├───┴───┘ └───┤ · │ ··· ··· │ Окно 0 · ├───┬───┐ ┌───┤ Y=7 │224│225│··· ···│255│ ├───┼───┼─────────────────────┼───┤ Y=8 │ 0 │ 1 │··· ┌───┐ ···│ 31│ · ├───┴───┘ ┼▼┼ X └───┤ · │ ··· Y───▶N│ ··· │ Окно 1 · ├───┬───┐ ┼─┼ ┌───┤ Y=15 │224│225│ ···│255│ ├───┼───┼─────────────────────┼───┤ Y=16 │ 0 │ 1 │ ···│ 31│ · ├───┴───┘ └───┤ · │ ··· ··· │ Окно 2 · ├───┬───┐ ┌───┤ Y=23 │224│225│ ···│255│ └───┴───┴─────────────────────┴───┘ ┌─────────────────────────────────────────────────────────────────────┐ │ "Посмотрев" Таблицу PNT по адресу (Y\8)*256+(YMOD8)*32+X, найдем N. │ │ "Запишем" информацию о квадрате в Таблицу PGT по адресам: │ │ (Y\8)*2048+N*8 , (Y\8)*2048+N*8+1,(Y\8)*2048+N*8+2,(Y\8)*2048+N*8+3,│ │ (Y\8)*2048+N*8+4,(Y\8)*2048+N*8+5,(Y\8)*2048+N*8+6,(Y\8)*2048+N*8+7,│ │ в результате на экране в квадрате (X,Y) Вы увидите то, что хотели! │ │ А теперь "раскрасим" изображение. │ │ "Запишем" информацию о цвете в Таблицу CT по адресам: │ │ (Y\8)*2048+N*8 , (Y\8)*2048+N*8+1,(Y\8)*2048+N*8+2,(Y\8)*2048+N*8+3,│ │ (Y\8)*2048+N*8+4,(Y\8)*2048+N*8+5,(Y\8)*2048+N*8+6,(Y\8)*2048+N*8+7,│ │ в результате квадрат (X,Y) будет раскрашен в нужные Вам цвета. │ └─────────────────────────────────────────────────────────────────────┘ П р и м е р 7. ───────────── 10 COLOR 1,15,8:SCREEN 2:X=5:Y=10 20 N=VPEEK(BASE(5*2+0)+(Y\8)*256+(YMOD8)*32+X) 'Видеопроцессор "опраши- вает" байт номер 69 в окне 1 Таблицы PNT и находит значение N (N=69, если Таблица PNT не изменялась) 30 FOR I=0 TO 7 40 VPOKE(&H800+N*8+I),&B11100011'Таблица PGT разделена на три окна,каж дое из которых содержит по 2048 байтов. Следовательно, окно 1 этой Таб лицы начинается по адресу 2048=&H800. Первый из 8 байтов квадрата, на который указывает N в окне 1, размещается в ячейке &Н800+N*8 50 NEXT 'Содержимое этих 8 байтов и будет выведено в квадрате (X,Y) 60 GOTO 60 П р и м е р 8. ───────────── 10 SCREEN 2:X=15:Y=12 20 A=VPEEK(BASE(5*2+0)+(Y\8)*256+(YMOD8)*32+X) '"Смотрим" PNT 30 FOR I=0 TO 7 40 VPOKE(BASE(5*2+2)+(Y\8)*2048+A*8+I),&b11100011 'Формируем "содержимое" квадрата 50 NEXT 60 GOTO 60 П р и м е р 9. Раскрасим выводимый квадрат 8-м и 10-м цветами. ───────────── 10 SCREEN 2:X=15:Y=12 20 A=VPEEK(BASE(5*2+0)+(Y\8)*256+(YMOD8)*32+X) '"Смотрим" Таблицу PNT 30 FOR I=0 TO 7 40 VPOKE(BASE(5*2+2)+(Y\8)*2048+A*8+I),&B11100011 'Формируем "содержимое" квадрата 50 NEXT 60 FOR I=0 TO 7 70 VPOKE(BASE(5*2+1)+(Y\8)*2048+A*8+I),&H8A ' "Раскрасим" квадрат 80 NEXT 90 GOTO 90 Однако в режимах SCREEN 2 и SCREEN 4 используется система координат (X,Y), в которой Х изменяется от 0 до 255, а Y от 0 до 191. Следующий при- мер иллюстрирует, как эта система координат соотносится с делением экрана на квадраты. П р и м е р 10. ────────────── 10 SCREEN 2:X=100:Y=75 30 N=(Y\8)*32+(X\8) 'Номер квадрата, в котором будет выведена точка 40 M=Y MOD 8 'Номер линии в квадрате 50 AP=N*8+M 'Адрес соответствующего байта в Tаблице PGT 60 VA=&b00001000 65 AC=AP+&H2000 'Для определения соответствующего адреса в Таблице 'CT прибавим &H2000 к адресу Таблицы PGT 70 VPOKE AP,VA 'Значение VA=&B00001000 загрузим в PGT 80 VPOKE AC,&HF1 'Вводим значение &HF1 в Таблицу цветов для изображ 'ения точки белого цвета на черном фоне 90 IF INKEY$="" THEN 90 100 PSET(X,Y),6 110 GOTO 110 Сначала будет нарисована белая точка на черном фоне. Когда Вы нажмете любую клавишу, эта точка приобретет красный цвет. При программировании на MSX-BASIC этот способ формирования изображения применяется редко. Однако, если Вы хотите нарисовать что-либо с помощью программы на м а ш и н н о м я з ы к е, то приведенный выше алгоритм несомненно поможет Вам! Ясно,что обладая определенным набором графических элементов, можно син- тезировать различные графические изображения. Приведем без комментариев ряд примеров: 11) Одинаковые шаблоны 20 COLOR 15,1,1:CLS:SCREEN 2:COLOR 15,1:CLS 60 FOR I=0 TO 7 70 READ A:VPOKE I,A:VPOKE I+2048,A:VPOKE I+4096,A 80 NEXT 90 FOR I=6144 TO 6144+767:VPOKE I,0:NEXT 120 FOR I=8192 TO 14435:VPOKE I,241:NEXT 150 GOTO 150 160 DATA &b11111111 170 DATA &b10011001 180 DATA &b10111101 190 DATA &b11100111 200 DATA &b11100111 210 DATA &b10111101 220 DATA &b10011001 230 DATA &b11111111 12) 10 COLOR 1,15,6:SCREEN 2 20 FOR T=8 TO 15:LINE(8,T)-(15,T),T:NEXT:A$=INPUT$(1) 30 FOR T=0 T0 7:VPOKE 2048+33*8+T,VPEEK(33*8+T):NEXT 40 A$=INPUT$(1) 50 FOR T=0 TO 7:VPOKE 10240+33*8+T,VPEEK(8192+33*8+T):NEXT 60 A$=INPUT$(1) 13) 10 'Шахматная доска! 20 INPUT "Координаты X,Y";X,Y:X=X-XMOD8:Y=Y-YMOD8 21 IF X=0 THEN X=8 22 U=Y/8*32+X/8 25 COLOR 1,15,1:SCREEN 2 30 FOR T=0 TO 3:FOR I1=0 TO 1:FOR I2=0 TO 1:FOR F=U TO U+12 STEP 4: FOR K=0 TO 1 40 VPOKE BASE(10)+(F+(64+2)*K)+I2+32*I1+128*T,VPEEK (BASE(10)):NEXT K,F,I2,I1,T 50 LINE(0,0)-(8,192),1,BF:LINE(X,Y)-STEP(128,128),1,B:A$=INPUT$(1) 14) 10 COLOR 1,15,8:SCREEN 2:LINE(0,64)-(255,127),,BF 'Фон! 20 LINE(0,64)-(7,71),8,BF 'Перемещаемый объект! 30 FOR T=1 TO 31 40 F=VPEEK(6400+T):VPOKE 6400+T,VPEEK(6400+T-1):VPOKE 6400+T-1,F'Об мен значений между ячейками видеопамяти! 50 IF T=31 THEN VPOKE 6400+T,T:VPOKE 6400,0 60 NEXT T:GOTO 30 15) 10 CLEAR 200,&HC300:SCREEN 2 20 CIRCLE(90,70),56:PAINT STEP(0,0) 'Сформировано изображение 25 'Сохраняем изображения в памяти (RAM) 30 FOR I=BASE(5*2+1) TO BASE(5*2+1)+6143:POKE &HC300-BASE(5*2+1)+I, VPEEK(I):NEXT 40 FOR I=BASE(5*2+2) TO BASE(5*2+2)+6143:POKE &HC300+6144-BASE(5*2+ 2)+I,VPEEK(I):NEXT 50 SCREEN 0 60 SCREEN 2 'Вывод изображения на экран 70 FOR I=BASE(5*2+1) TO BASE(5*2+1)+6143:VPOKE I,PEEK(&HC300-BASE(5 *2+1)+I):NEXT 80 FOR I=BASE(5*2+2) TO BASE(5*2+2)+6143:VPOKE I,PEEK(&HC300-BASE(5 *2+2)+6144+I):NEXT 90 A$=INPUT$(1) 'Программа работает ≈ 5 минут XI.1.5. Р е ж и м SCREEN 3 Как и в режиме SCREEN 2, экран в режиме SCREEN 3 разбит на к в а д р а- т ы размером 8╳8 точек (32╳24 квадрата). Каждый квадрат разобъем на две л и н и и толщиной четыре точки (на экране расположено 32╳48 "толстых" линий). Каждая из этих "толстых" линий разбита на две "большие" точки (4╳4 "маленьких" точек). ──▲──┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ │ │ │ │ │ │ │ │ │ │████│◀── "Маленькая" │ │────│────│────│────│ │────│────│────│────│ точка "Толщина"│ │ │ │ │ │ │ │ │ │ │ │ │────│────│────│────│ │────│────│────│────│ линии │ │ │ │ │ │ │ │ │ │ │ │ │────│────│────│────│ │────│────│────│────│ │ │ │ │ │ │ │ ──▼──└────┴────┴─── К В А Д Р А Т ────┴────┴────┘ ┌────┬────┬─── ────┬────┬────┐ │ │ │ │ │ │████│████│████│████│ │────│────│────│────│ │────│────│────│────│ "Толстая" │ │ │ │ │ │████│████│████│████│ ───▶ │────│────│────│────│ │────│────│────│────│ ◀── "Большая" линия │ │ │ │ │ │████│████│████│████│ точка │────│────│────│────│ │────│────│────│────│ │ │ │ │ │ │████│████│████│████│ ├────┴────┴────┴────┘ └────┴────┴────┴────┤ │◀─────────────"Длина" линии ─────────────▶│ Каждая из "больших" точек может быть раскрашена только в о д и н цвет. Попытка расположить в "большой" точке "маленькую" точку другого цвета при- ведет к и з м е н е н и ю цвета в с е й "большой" точки. Информация о цвете "толстой" линии находится в Таблице PGT, причем ле- вый полубайт байта PGT кодирует цвет левой "большой" точки "толстой" ли- нии, а правый полубайт отвечает за цвет правой "большой" точки. Б а й т PGT ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ 1 │ 0 │ 0 │ 0 │ 1 │ 0 │ 1 │ 0 │ └───┴───┴───┴───┴───┴───┴───┴───┘ └──────▲──────┘ └──────▲──────┘ │ │ Цвет левой "большой" точки Цвет правой "большой" точки ┌─────────────────────────────────────────────────────────────┐ │ Поскольку один байт Таблицы PGT кодирует цвета "толстой" │ │ линии,то эта Таблица требует 32 ╳ 48 = 1536 байтов VRAM │ └─────────────────────────────────────────────────────────────┘ П р и м е р 1. 10 SCREEN 3:OPEN"GRP:" AS#1 ───────────── 20 PSET(8,0),3:PSET(12,0),1 'Рисуем "толстую" линию 30 PSET(30,80):PRINT #1,HEX$(VPEEK(8)) 40 A$=INPUT$(1) ┌──────────────────────────────────────────────────────────────────────┐ │Оператор COLOR с последующим оператором CLS инициализируют Таблицу PGT│, └──────────────────────────────────────────────────────────────────────┘ причем все байты Таблицы PGT инициализируются цветом фона, закодированным как в левом, так и в правом полубайтах. А в следующей табличке показаны номера позиций "толстых" линий на экра- не: ┌────┬────┬────┬─────┬────┐ │ 0 │ 8 │ 16 │ ··· │ 248│ П р и м е р 2. ├────┼────┼────┼─────┼────┤ ───────────── │ 1 │ 9 │ 17 │ ··· │ 249│ NEW ├────┼────┼────┼─────┼────┤ Ok │ 2 │ 10 │ 18 │ ... │ 250│ 10 SCREEN 3 ├────┼────┼────┼─────┼────┤ 20 VPOKE BASE(5*3+2)+6,&H56 │ 3 │ 11 │ 19 │ ... │ 251│ 30 VPOKE BASE(5*3+2)+7,&H34 ├────┼────┼────┼─────┼────┤ 40 VPOKE BASE(5*3+2)+8,&H78 │ 4 │ 12 │ 20 │ ... │ 252│ 50 VPOKE BASE(5*3+2)+9,&H9A ├────┼────┼────┼─────┼────┤ 60 A$=INPUT$(1) │ 5 │ 13 │ 21 │ ... │ 253│ Выполнив эту программу, Вы сможете ├────┼────┼────┼─────┼────┤ убедиться в правильности заполнения дан- │ 6 │ 14 │ 22 │ ··· │ 254│ ной таблички. ├────┼────┼────┼─────┼────┤ │ 7 │ 15 │ 23 │ ··· │ 255│ ├────┼────┼────┼─────┼────┤ │ 256│ 264│ 272│ ··· │ 504│ ├────┼────┼────┼─────┼────┤ │ 257│ 265│ 273│ ··· │ 505│ ├────┼────┼────┼─────┼────┤ │ ···│ ···│ ···│ ··· │ ···│ ├────┼────┼────┼─────┼────┤ │ 263│ 271│ 279│ ··· │ 511│ ├────┼────┼────┼─────┼────┤ │ ···│ ···│ ···│ ··· │ ···│ ├────┼────┼────┼─────┼────┤ │1285│1293│1301│ ··· │1534│ ├────┼────┼────┼─────┼────┤ │1286│1294│1302│ ··· │1535│ └────┴────┴──│─┴─────┴────┘ ┌──┬──┬──┬─▼┬──┬──┬──┬──┐ │ 1│ 0│ 0│ 0│ 0│ 0│ 1│ 0│ └──┴──┴──┴──┴──┴──┴──┴──┘ Байт из Таблицы PGT (в нем хранится цвет "толстой" линии с номером 1302) Приведем таблицу, по которой можно определить адрес байта Таблицы PGT, отвечающего за точку (X,Y), в режимах 2÷4 : ┌──────────────┬────────────────────────────────────────────┐ │ Режим экрана │ А д р е с б а й т а в PGT │ ├──────────────┼────────────────────────────────────────────┤ │ 2 и 4 │ ((Y\8)*32+(Х\8))*8+Y MOD 8 │ ├──────────────┼────────────────────────────────────────────┤ │ 3 │ BASE(5*3+2)+(Х\8)*8+(Y\32)*256+(Y\4) MOD 8 │ └──────────────┴────────────────────────────────────────────┘ П р и м е р 1. Заполнение экрана черными и белыми клетками в шахматном ───────────── порядке. 20 COLOR 15,1,1:CLS:SCREEN 3 50 FOR I=0 TO 7 STEP 2 60 VPOKE I,&HF1:VPOKE I+1,&H1F 70 NEXT 80 FOR I=BASE(5*3+0) TO I+767 90 VPOKE I,0 100 NEXT 110 GOTO 110 Таблица PGT разбита на 192 "кусочка" размером по 8 байтов. Каждый "ку- сочек" отвечает за 4 квадрата размером 2╳2 "больших" точки (такой квад- рат называется и м е н е м).Упомянутые 4 имени имеют один и тот же номер, который записывается в Таблицу PNT. Но п е р в ы й квадрат - это имя с данным номером для строк (строка имеет высоту 2 "большие" точки) с номерами 0, 4, 8, 12, 16, 20; в т о р о й - для строк с номерами 1, 5, 9, 13, 17, 21; т р е т и й - для строк с номерами 2, 6, 10, 14, 18, 22; ч е т в е р т ы й - для строк с номерами 3, 7, 11, 15, 19, 23. ┌─────────────────────────────────────────────────────────────┐ │ Следовательно, весь экран разбит на ч е т ы р е о к н а │ └─────────────────────────────────────────────────────────────┘ (понятие экранного окна см. в описании режима SCREEN 2). ┌───────────────────────────────────────────────────────────┐ │ За имя с номером N в окне с номером M отвечают байты PGT │ │ N·8+M·2 и N·8+M·2+1, │ │ где N∈[0,191], a M∈[0,3] │ └───────────────────────────────────────────────────────────┘ Приведем структуру PGT с учетом разбивки экрана на имена и окна. ┌────┬────┬────┬─────┬────┐ Номер имени │ 0 │ 1 │ 2 │ ··· │ 15 │ N │ │ │ │ │ │ ├────┼────┼────┼─────┼────┤ ─┐ │ 0 │ 8 │ 16 │ ··· │ 248│ │ ├────┼────┼────┼─────┼────┤ ├─ Имя с номером N для окна 0 │ 1 │ 9 │ 17 │ ··· │ 249│ │ ├────┼────┼────┼─────┼────┤ ─┤ │ 2 │ 10 │ 18 │ ··· │ 250│ │ ├────┼────┼────┼─────┼────┤ ├─ Имя с номером N для окна 1 │ 3 │ 11 │ 19 │ ··· │ 251│ │ ├────┼────┼────┼─────┼────┤ ─┤ │ 4 │ 12 │ 20 │ ··· │ 252│ │ ├────┼────┼────┼─────┼────┤ ├─ Имя с номером N для окна 2 │ 5 │ 13 │ 31 │ ··· │ 253│ │ ├────┼────┼────┼─────┼────┤ ─┤ │ 6 │ 14 │ 22 │ ··· │ 254│ │ ├────┼────┼────┼─────┼────┤ ├─ Имя с номером N для окна 3 │ │ 7 │ 15 │ 23 │ ··· │ 255│ │ ─▼─ ├────┼────┼────┼─────┼────┤ ─┘ │ ···│ ···│ ···│ ··· │ ···│ ├────┼────┼────┼─────┼────┤ │ 263│ 271│ 279│ ··· │ 511│ ├────┼────┼────┼─────┼────┤ │ ···│ ···│ ···│ ··· │ ···│ ├────┼────┼────┼─────┼────┤ ─┐ │1285│1293│1301│ ··· │1534│ │ ├────┼────┼────┼─────┼────┤ ├─ Имя с номером N для окна 3 │1286│1294│1302│ ··· │1535│ │ └────┴────┴────┴─────┴──▲─┘ ─┘ └─ Имя с номером 191 Приведем структуру PNT с номерами имен и их расположением на экране: 0 1 2 3 . . . 31 ◀─ Номер столбца ┌───┬───┬───┬───┬───┬───┬───┬────┐ 0 │ 0 │ 1 │ 2 │ 3 │...│...│...│ 31 │ Окно 0: строки 0,4, 8,12,16,20 ├───┼───┼───┼───┼───┼───┼───┼────┤ 1 │ 0 │ 1 │ 2 │...│...│...│ 30│ 31 │ Окно 1: строки 1,5, 9,13,17,21 ├───┼───┼───┼───┼───┼───┼───┼────┤ 2 │ 0 │ 1 │...│...│...│ 29│ 30│ 31 │ Окно 2: строки 2,6,10,14,18,22 ├───┼───┼───┼───┼───┼───┼───┼────┤ 3 │ 0 │...│...│...│ 28│ 29│ 30│ 31 │ Окно 3: строки 3,7,11,15,19,23 ├───┼───┼───┼───┼───┼───┼───┼────┤ 4 │ 32│ 33│ 34│ 35│...│ 61│ 62│ 63 │ ├───┼───┼───┼───┼───┼───┼───┼────┤ . │...│...│...│...│...│...│...│ ...│ ├───┼───┼───┼───┼───┼───┼───┼────┤ 7 │ 32│33 │...│...│...│...│ 62│ 63 │ ├───┼───┼───┼───┼───┼───┼───┼────┤ . │...│...│...│...│...│...│...│ ...│ ├───┼───┼───┼───┼───┼───┼───┼────┤ 23│160│161│...│...│...│189│190│ 191│ ▲ └───┴───┴───┴───┴───┴───┴───┴────┘ └─ Номер строки ┌─────────────────────────────────────────────────────────────────┐ │ Номер имени в квадрате с координатами X,Y (X∈[0,31],Y∈[0,23]) │ │ хранится в ячейке VRAM с адресом: │ │ BASE(5*3+0)+(Y╲4)*32+X . │ │ Это имя находится в окне с номером Y MOD 4 . │ └─────────────────────────────────────────────────────────────────┘ П р и м е р 2. ───────────── 10 COLOR 15,1,1:CLS:SCREEN 3 20 FOR I=0 TO 1 STEP 2 30 VPOKE I,&HF1:VPOKE I+1,&H1F 'Имя 0 для окна 0 (черно-белое) 40 VPOKE I+2,&HF8:VPOKE I+3,&H8F 'Имя 0 для окна 1 (красно-белое) 45 'Имя с номером 0 для окон 2 и 3 - пустое 60 NEXT 70 FOR I=BASE(5*3+0) TO I+767 ' Заполним PNT нулями 80 VPOKE I,0 90 NEXT 95 'На экране появятся 6 (24/4) черно-белых и красно-белых полос 100 GOTO 100 XI.1.6. Р е ж и м ы SCREEN 5, SCREEN 6, SCREEN 7 и SCREEN 8 (д л я к о м п ь ю т е р о в MSX-2) ┌───────────────────────────────────────────────────────────────────────┐ │ В режимах SCREEN 5 ÷ SCREEN 8 Таблицы PGT и CT о т с у т с т в у ю т!│ └───────────────────────────────────────────────────────────────────────┘ Поэтому вся информация об изображении точек находится в Таблице PNT. В отличие от рассмотренных ранее режимов, эти режимы не имеют деления экрана на к в а д р а т ы . Вначале приведем важную табличку, которая поможет Вам определить адрес байта Таблицы PNT, отвечающего за точку с координатами (X,Y), в различных режимах SCREEN: ┌────────────┬──────────────────────────────┐ │Режим экрана│ А д р е с б а й т а в PNT │ ├────────────┼──────────────────────────────┤ │ SCREEN 5 │ BASE(5*5)+(256/2)*Y+(X\2) │ │ SCREEN 6 │ BASE(5*6)+(512/4)*Y+(X\4) │ │ SCREEN 7 │ BASE(5*7)+(512/2)*Y+(X\2) │ │ SCREEN 8 │ BASE(5*8)+(256/1)*Y+(X\1) │ └────────────┴──────────────────────────────┘ 1. В режиме SCREEN 5 экран разделен на 212 строк (или на 192 строки), состоящих из 256 точек каждая. Совокупность двух точек по горизонтали будем называть л и н и е й (точ- ки 0 и 1 образуют 1-ю линию , точки 2 и 3 - 2-ю линию ,..., точки 254 и 255 - 128-ю линию). Каждая линия кодируется в о д н о м байте, причем четыре старших би- та этого байта определяют цвет первой точки, а четыре младших - цвет вто- рой точки. Ясно, что требуется 212╳256/2=27136 байтов для хранения све- дений о цветах линий (как раз объем Таблицы PNT в режиме SCREEN 5 !). Первый байт Таблицы PNT "хранит" информацию о цвете первой линии пер- вой строки экрана, второй байт - о цвете второй линии той же строки,и так далее: 1-й байт Таблицы PNT 2-й байт Таблицы PNT ┌─────────────────┬─────────────────┐┌─────────────────┬─────────────────┐ │ Цвет 1-й точки │ Цвет 2-й точки ││ Цвет 1-й точки │ Цвет 2-й точки │ │ первой линии │ первой линии ││ второй линии │ второй линии │ └─────────────────┴─────────────────┘└─────────────────┴─────────────────┘ ┌────────────────────────────────────────────────────────┐ │ Таблица PNT инициализируется цветом фона, который │ │ устанавливается оператором COLOR │ └────────────────────────────────────────────────────────┘ П р и м е р 1. Изобразим в режиме SCREEN 5 точку с координатами (X,Y) ────────────── белым цветом. 10 COLOR 15,4,7:INPUT"X,Y";X,Y 20 SCREEN 5 ┌───────── Код цвета фона 30 AD=BASE(5*5)+Y*128+(X\2) │┌──────── Код цвета изображения ▼▼ 40 IF XMOD2=0 THEN C=&HF4 ELSE C=&H4F'Если не будет этого условия, то изобразятся д в е соседние точки 50 VPOKE AD,C ' Этот оператор эквивалентен оператору PSET(X,Y),15. 60 GOTO 60 Приведем схематическое изображение PNT для режима SCREEN 5. ┌──────────────┐ │ 0-й байт │- отвечает за точки с координатами (0,0) и (1,0) ├──────────────┤ │ 1-й байт │- отвечает за точки с координатами (2,0) и (3,0) ├──────────────┤ │ ··· │ ··· ├──────────────┤ │ 127-й байт │- отвечает за точки с координатами (254,0) и (255,0) ├──────────────┤ │ 128-й байт │- отвечает за точки с координатами (0,1) и (1,1) ├──────────────┤ │ ··· │ ··· ├──────────────┤ │ 27134-й байт │- отвечает за точки с координатами (252,211) и (253,211) ├──────────────┤ │ 27135-й байт │- отвечает за точки с координатами (254,211) и (255,211) └──────────────┘ 2. В режиме SCREEN 6 экран имеет 212 строк (или 192 строки) по 512 то- чек в каждой строке. Количество байтов в Таблице PNT точно такое же,как и в Таблице PNT режима SCREEN 5: информация об одной строке экрана кодирует- ся в 128 байтах. Л и н и я в режиме SCREEN 6 состоит из четырех точек и кодируется в о д н о м байте. А тогда п а л и т р а каждой точки кодируется в двух битах, а так как из двух двоичных цифр можно составить только четыре ком- бинации (00,01,10,11), то каждую точку экрана можно раскрасить не более чем ч е т ы р ь м я различными способами. Так, например, оператор VPOKE 0,&B11100100 присваивает палитру 3 первой точке первой линии, палитру 2 - второй точке первой линии, палитру 1 - третьей точке первой линии и палитру 0 - четвер- той точке первой линии. Б а й т Т а б л и ц ы PNT ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ 1 │ 1 │ 1 │ 0 │ 0 │ 1 │ 0 │ 0 │ └───┴───┴───┴───┴───┴───┴───┴───┘ └───▲───┘└──▲──┘└───▲───┘└──▲───┘ │ │ │ │ Палитра Палитра Палитра Палитра первой второй третьей четвертой точки точки точки точки ┌──────────────────────────────────────────────────────┐ │ Таблица PNT инициализируется последними двумя │ │ битами цвета фона, задаваемого в операторе COLOR. │ └──────────────────────────────────────────────────────┘ Поясним сказанное примером. Если цвет фона имеет номер 13=&B1101, то в каждый байт Таблицы PNT будет занесено число &B01010101 (четыре раза пов- торяются последние два бита кода цвета фона). Приведем схематическое изображение PNT для режима SCREEN 6. ┌─────────┬─────────┬─────────┬─────────┐ 0-й байт │ (0,0) │ (1,0) │ (2,0) │ (3,0) │ ├─────────┼─────────┼─────────┼─────────┤ 1-й байт │ (4,0) │ (5,0) │ (6,0) │ (7,0) │ ├─────────┼─────────┼─────────┼─────────┤ ··· │ ··· │ ··· │ ··· │ ··· │ ├─────────┼─────────┼─────────┼─────────┤ 127-й байт │ (508,0) │ (509,0) │ (510,0) │ (511,0) │ ├─────────┼─────────┼─────────┼─────────┤ 128-й байт │ (0,1) │ (1,1) │ (2,1) │ (3,1) │ ├─────────┼─────────┼─────────┼─────────┤ ··· │ ··· │ ··· │ ··· │ ··· │ ├─────────┼─────────┼─────────┼─────────┤ 27135-й байт │(508,211)│(509,211)│(510,211)│(511,211)│ └─────────┴─────────┴─────────┴─────────┘ 3. Как и в режиме SCREEN 6, в режиме SCREEN 7 на экране расположено 212 строк (или 192 строки), состоящих из 512 точек каждая. Однако один байт Таблицы PNT кодирует л и н и ю, состоящую из д в у х точек: стар- шие четыре бита определяют палитру левой точки, младшие четыре - палитру правой точки. 1-й байт Таблицы PNT 2-й байт Таблицы PNT ┌────────────────┬────────────────┐ ┌────────────────┬────────────────┐ │ Палитра первой │ Палитра второй │ │ Палитра первой │ Палитра второй │ │ точки 1-й линии│ точки 1-й линии│ │ точки 2-й линии│ точки 2-й линии│ └────────────────┴────────────────┘ └────────────────┴────────────────┘ Следовательно, каждой точке может быть присвоена любая из 16 палитр. Поскольку для кодирования номера палитры необходимо четыре бита, то Таб- лица PNT занимает объем 212╳512/2 = 54272 байта. Уже отсюда становится понятно, что для использования этого режима VRAM должна иметь объем не менее 128 Кбайтов! Режим SCREEN 7 аналогичен режиму SCREEN 5, за исключением того, что в режиме SCREEN 7 в строке экрана в два раза б о л ь ш е точек. ┌────────────────────────────────────────────────────────┐ │ Таблица PNT инициализируется цветом фона, который │ │ устанавливает оператор COLOR . │ └────────────────────────────────────────────────────────┘ Приведем схематическое изображение PNT для режима SCREEN 7. ┌──────────────┐ │ 0-й байт │- отвечает за точки с координатами (0,0) и (1,0) ├──────────────┤ │ 1-й байт │- отвечает за точки с координатами (2,0) и (3,0) ├──────────────┤ │ ··· │ ··· ├──────────────┤ │ 255-й байт │- отвечает за точки с координатами (510,0) и (511,0) ├──────────────┤ │ 256-й байт │- отвечает за точки с координатами (0,1) и (1,1) ├──────────────┤ │ ··· │ ··· ├──────────────┤ │ 54270-й байт │- отвечает за точки с координатами (508,211) и (509,211) ├──────────────┤ │ 54271-й байт │- отвечает за точки с координатами (510,211) и (511,211) └──────────────┘ 4. В режиме SCREEN 8 экран состоит из 212 строк по 256 точек в каждой или из 212 строк по 192 точки в каждой. Л и н и я состоит из одной-единственной точки. Цвет линии здесь уже определяется не кодом палитры, а непосредственным заданием "смеси" основ- ных цветов. Этот оригинальный способ кодирования цвета требует по одному б а й т у (!) на линию, а значит, на точку! Поэтому Таблица PNT имеет объем 212·256=54272 байта. Уже отсюда становится понятно, что для использования этого режима VRAM должна иметь объем не менее 128 Кбайтов! Информация о линии с координатами (X,Y) находится по адресу X+256·Y в Таблице PNT. Для высвечивания этой линии достаточно занести по этому ад- ресу значение цвета из отрезка [0,255], которое можно найти по формуле: ┌────────────────┐ │ C = 32·G+4·R+B │ , └────────────────┘ где G, R, B - значения в диапазоне от 0 до 7, определяющие интенсивность зеленого ("Green"), красного ("Red") и синего ("Blue") цветов соответст- венно. Например, цвету с номером 187=&b10111011 соответствует следующее "содержимое" байта Таблицы PNT: Б а й т Т а б л и ц ы PNT ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ 1 │ 0 │ 1 │ 1 │ 1 │ 0 │ 1 │ 1 │ └───┴───┴───┴───┴───┴───┴───┴───┘ └──────────┘ └──────────┘└──────┘ Интенсивность Интенсивность Интенсивность зеленого красного синего цвета цвета цвета ┌────────────────────────────────────────────────────────┐ │ При инициализации байты Таблицы PNT получают номер │ │ цвета фона (который изменяется в пределах от 0 до 255).│ └────────────────────────────────────────────────────────┘ Приведем схематическое изображение PNT для режима SCREEN 8. ┌──────────────┐ Базовый адрес│ 0-й байт │- отвечает за точку с координатами (0,0) PNT ├──────────────┤ │ 1-й байт │- отвечает за точку с координатами (1,0) ├──────────────┤ │ ··· │ ··· ├──────────────┤ │ 255-й байт │- отвечает за точку с координатами (255,0) ├──────────────┤ │ 256-й байт │- отвечает за точку с координатами (0,1) ├──────────────┤ │ ··· │ ├──────────────┤ │ 54270-й байт │- отвечает за точку с координатами (256,210) ├──────────────┤ │ 54271-й байт │- отвечает за точку с координатами (256,211) └──────────────┘ XI.1.7. Т а б л и ц а п а л и т р (д л я к о м п ь ю т е р о в MSX-2) Независимо от режима SCREEN Таблица PT занимает в видеопамяти объем 32 байта. "Местоположение" этой Таблицы зависит от режима SCREEN. ┌────────────────────────┬──────────┬─────────────────────────┐ │ Р е ж и м │ А д р е с│ К о м м е н т а р и й │ │────────────────────────┼──────────┼─────────────────────────┤ │ SCREEN 0 (40 символов) │ &H0400 │ Не используется в MSX-1 │ │ SCREEN 0 (80 символов) │ &H0800 │ │ │ SCREEN 1 │ &H2020 │ Не используется в MSX-1 │ │ SCREEN 2 │ &H1B80 │ Не используется в MSX-1 │ │ SCREEN 3 │ &H2020 │ Не используется в MSX-1 │ │ SCREEN 4 │ &H1E80 │ │ │ SCREEN 5 │ &H7680 │ │ │ SCREEN 6 │ &H7680 │ Используются палитры 0÷3│ │ SCREEN 7 │ &HFA80 │ │ │ SCREEN 8 │ &HFA80 │ Не используется │ └────────────────────────┴──────────┴─────────────────────────┘ Каждая из палитр закодирована в д в у х байтах. ┌──────────────────────────────────────────────────────────────────────┐ │ Адрес AD первого байта палитры N в Таблице PT вычисляется по формуле:│ │ AD=A0+2·N , │ │ где А0-адрес начала Таблицы PT (например,в режиме SCREEN 1 Таблица PT│ │ начинается по адресу &h2020). │ └──────────────────────────────────────────────────────────────────────┘ По адресу AD в Таблице PT находится байт, который мы назовем "красный- синий". Биты 4÷6 этого байта определяют пропорцию к р а с н о г о,а биты 0÷2 - пропорцию с и н е г о цвета. Байт Таблицы PT с адресом AD+1 опре- деляет пропорцию зеленого цвета, закодированную в битах 0÷2 : 7 6 5 4 3 2 1 0 ◀── Номера битов ┌───┬───┬───┬───┬───┬───┬───┬───┐ AD │ │ ∗ │ ∗ │ ∗ │ │ ∗ │ ∗ │ ∗ │◀──────┐ └───┴───┴───┴───┴───┴───┴───┴───┘ │ └─────▲─────┘ └─────▲─────┘ │ Два │ │ ◀── последовательных Красный цвет ("Red") Синий цвет ("Blue") │ байта ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ Таблицы PT AD+1 │ │ │ │ │ │ ∗ │ ∗ │ ∗ │◀──────┘ └───┴───┴───┴───┴───┴───┴───┴───┘ └─────▲─────┘ └── Зеленый цвет ("Green") П р и м е р 2. "Чтение" Таблицы палитр в режиме SCREEN 1. Выполнив ────────────── программу, Вы узнаете, каким образом оператор SCREEN инициализирует Таблицу PT. 10 COLOR 1,15,7:SCREEN 1 20 ' ::::::::::::::: 30 FOR N=0 TO 15 40 AD=&H2020+2*N 50 RB=VPEEK(AD):G=VPEEK(AD+1)'Обратите внимание на мнемонику имен: 'RB и G! 60 PRINT N;TAB(4);HEX$(RB);HEX$(G) 70 NEXT Отметим, что оператор COLOR=(···) переопределяет байты Таблицы PT в со- ответствии с указанной палитрой. П р и м е р 3. Изменим Таблицу PT и вновь "прочитаем" ее. ───────────── 10 COLOR 1,15,7:SCREEN 1 20 GOSUB 30:COLOR=(7,7,2,7):GOSUB 30:COLOR=(7,7,7,4):GOSUB 30:END 30 FOR N=0 TO 15 40 AD=&H2020+2*N 50 RB=VPEEK(AD):G=VPEEK(AD+1) 60 PRINT N;TAB(4);HEX$(RB);HEX$(G) 70 NEXT 80 A$=INPUT$(1):CLS:RETURN Как видите, байты, соответствующие палитре 7,изменяются; немедленно из- меняется и цвет бордюра! Разумеется, палитры в Таблице PT могут быть изменены и операторами VPOKE. Однако следует отметить, что изменение Таблицы PT операторами VPOKE само по себе не приводит к изменению цветов. Для считывания содержи- мого Таблицы PT и присвоения цвета новой палитре существует специальный оператор. Его синтаксис предельно прост: ┌─────────────────┐ │ COLOR = RESTORE │ . └─────────────────┘ П р и м е р 4. ───────────── 10 COLOR 1,15,7:SCREEN 1 20 GOSUB 30:VPOKE &H2020+14,&H77:VPOKE &H2020+15,2 25 COLOR=RESTORE:GOSUB 30:END 30 FOR N=0 TO 15 40 AD=&H2020+2*N 50 RB=VPEEK(AD):G=VPEEK(AD+1) 60 PRINT N;TAB(4);HEX$(RB);HEX$(G) 70 NEXT 80 A$=INPUT$(1):CLS:RETURN ┌──────────────────────────────────────────────────┐ │ Для инициализации Таблицы PT используются: │ │ α) оператор SCREEN ; │ │ β) оператор COLOR=NEW ; │ │ γ) оператор COLOR (без параметров!) . │ └──────────────────────────────────────────────────┘ Вопрос в том, кто за это отвечает? Шалтай-Болтай XI.1.8. С п р а й т ы Видеопроцессор имеет д в а режима отображения спрайтов. Режим отобра- жения спрайтов выбирается автоматически в соответствии с выбранным Вами режимом SCREEN. Если в Вашей программе присутствует один из операторов: SCREEN 1,SCREEN 2,SCREEN 3, то Вы находитесь в р е ж и м е с п р а й т о в 1. Если же в Вашей программе присутствует один из операторов: SCREEN 4,SCREEN 5,SCREEN 6,SCREEN 7,SCREEN 8, то Вы находитесь в р е ж и м е с п р а й т о в 2. Вкратце напомним уже известные Вам результаты. В р е ж и м е с п р а й т о в 1 на экран одновременно можно вывес- ти 32 спрайта с номерами от 0 до 31. Спрайты с м е н ь ш и м и номерами имеют более высокий приоритет. На одной горизонтальной линии экрана разме- щается до ч е т ы р е х спрайтов с высшим приоритетом, а в пересекающей- ся части спрайты с более низким приоритетом становятся невидимыми. Когда два спрайта с т а л к и в а ю т с я , т.е.пересекаются запол- ненные части их образов (если сталкиваются два спрайта, шаблоны которых занулены,или спрайты сталкиваются зануленными участками шаблонов,то столк- новение не обнаруживается), тогда бит 5 регистра состояния с номером 0 ус- танaвливается в 1. Кроме того, если на одной горизонтальной линии находятся п я т ь или более спрайтов, то 6-й бит регистра состояния будет установлен в 1,а пять младших битов зафиксируют номер пятого спрайта. В р е ж и м е с п р а й т o в 2 на экран одновременно можно вывес- ти 32 спрайта, пронумерованных от 0 до 31. Спрайты с м е н ь ш и м и но- мерами имеют более высокий приоритет.На одной горизонтальной линии экрана изображается до в о с ь м и спрайтoв с высшим приоритетoм, а в перекры- вающейся части спрайты с меньшим приоритетом не видны. Столкновение д в у х спрайтов обнаруживается по состоянию 5-го бита регистра состояния с номером 0 (он устанавливается в 1). Интересно отме- тить, что в этом случае координаты столкновения фиксируются в регистрах состояния с номерами от 3 до 5. Вдобавок, если на одной горизонтальной линии экрана появляются девять или более спрайтов, то 6-й бит регистра состояния с номером 0 будет уста- новлен в 1, а 5 младших битов этого регистра зафиксируют номер девятого спрайта. В режимах SCREEN 1 ÷ SCREEN 3 спрайты задаются при помощи двух Таблиц: 1) Таблицы ш а б л о н о в спрайтов (SGT); 2) Таблицы а т р и б у т о в спрайтов (SAT); В режимах SCREEN 4 ÷ SCREEN 8 дополнительно используется еще и 3) Таблица ц в е т о в спрайтов (SCT). В этом разделе мы расскажем Вам о каждой Таблице. Ш а б л о н (от нем. Schablone-образец, модель)- пластина с вырезами, очертания которых соответ- ствуют контуру чертежа, изделия и т.п. Советский Энциклопедический Словарь 1. Таблица SGT содержит образы спрайтов (которые ниже мы будем назы- вать ш а б л о н а м и), установленные оператором SPRITE$(N)= с т р о к о в о е в ы р а ж е н и е Эта Таблица инициализируется нулями оператором SCREEN, причем оператор SCREEN ,T приводит к исчезновению спрайтов с экрана, сохраняя при этом на экране остальную информацию, а операторы SCREEN M,T и SCREEN M инициализи- руют всю видеопамять. 2048 байтов Таблицы SGT позволяют хранить информацию о 256 шаблонах спрайтов, если в т о р ы м параметром в операторе SCREEN является 0 или 1, и информацию о 64 шаблонах, если этот параметр равен 2 или 3. Адрес шаблона спрайта в Таблице SGT, созданного при помощи оператора SPRITE$(N)=···, вычисляется по формуле: ┌───────────────────────────────────┐ │ A0 +8·N или │ │ A0+32·N , │ │ где А0 - адрес начала Таблицы SGT│ . └───────────────────────────────────┘ Напомним Вам,что начальный адрес Таблицы SGT для разных режимов SCREEN возвращает функция BASE(): BASE(M*5+4) , где M - номер режима SCREEN. ┌──────────────────────────────────────────────────────────────┐ │ Байты шаблона записаны в Таблице SGT в том же порядке, что │ │ и байты (символы!) значения строкового выражения, стоящего │ │ в правой части оператора SPRITE$(N)=··· │ └──────────────────────────────────────────────────────────────┘ Теперь, надеемся, Вам понятно, что действие, например, операторов: SCREEN 1:SPRITE$(0)=STRING(8,255) эквивалентно действию цикла: FOR I=0 TO 7:VPOKE &H3800+I,255:NEXT ───▲── П р и м е р 1. └─ BASE(1*5+4) ────────────── 10 SCREEN 1,0 20 A$="Microsoft" 8 байтов 8 байтов 8 байтов 30 FORI=1TOLEN(A$):┌────────────────┬────────────────┬────────────────┐ B$=MID$(A$,I,1) │ "Место" в SGT │ "Место" в SGT │ "Место в SGT │ 50 VPOKEBASE(1*5+4)│для 0-го спрайта│для 1-го спрайта│для 2-го спрайта│ +8*2+(I-1),ASC(B$) └────────────────┴────────────────┴▲───────────────┘ 60 NEXT │ 70 PRINT SPRITE$(2) BASE(1*5+4)+8*2 Атрибут (от лат. Attribuo - придаю, наделяю) - необходимое, существенное, неотъемлемое свойст- во объекта. Советский Энциклопедический Словарь 2. В 128 байтах Таблицы атрибутов спрайтов (Таблицы SAT) кодируется ин- формация о с п о с о б е вывода образов (шаблонов) спрайтов на экран.По- скольку одновременно на экране может отображаться не более 32 спрайтов,то атрибуты одного спрайта кодируются в 128/32 = 4 байтах. Вероятно, Вас заинтересует их содержимое? Поспешим удовлетворить Ваше любопытство: Б а й т ы Таблицы SAT ┌──────────────┬──────────────┬──────────────┬───────────────┐ │ Первый байт │ Второй байт │ Третий байт │ Четвертый байт│ └──────▲───────┴───────▲──────┴───────▲──────┴────────▲──────┘ │ │ │ │ Координата Y Координата X Номер шаблона Номер палитры (для режимов (0÷255) (0÷255) в SGT (0÷255) SCREEN 1 ÷ SCREEN 3) Цвет изображения (для режи- мов SCREEN 4 ÷ SCREEN 8) Отметим, что если величина Y-координаты спрайта равна 216,то все спрай- ты с меньшим приоритетом не будут отображаться. Например, если Y-координа- та спрайта с номером 10 равна 216,то спрайты с номерами от 10 до 31 не бу- дут отображаться. Если размер спрайта - 16╳16, то,как известно, одному спрайту соответст- вуют ч е т ы р е номера шаблонов спрайта. В этом случае можно задать лю- бой из четырех номеров шаблонов спрайта! Таким образом, если мы обозначим A0 - начальный адрес Таблицы SAT, то оператор PUT SPRITE SN,(X,Y),C,NP эквивалентен следующим операторам: AD=A0+4*SN:VPOKE AD,Y:VPOKE AD+1,X:VPOKE AD+2,NP:VPOKE AD+3,C ▲ ▲ ▲ ▲ ▲ └─!!! └─!!! └─!!! └─!!! └─!!! П р и м е р 2. 10 COLOR 1,15,8:SCREEN 1,1:SPRITE$(20)="СПРАЙТ!" ───────────── 20 PUT SPRITE 2,(165,38),7,20 30 ? "X=";VPEEK(6921):? "Y="VPEEK(6920):?"Цвет номер"; VPEEK(6923):?"Шаблон";VPEEK(6922) 40 FOR T=0 TO 8:? CHR$(VPEEK(14336+VPEEK(6922)*8+T));: NEXT Рассмотрим подробнее содержимое ч е т в е р т о г о байта Таблицы SAT для какого-нибудь выбранного спрайта. ┌───┬───┬───┬───┬───┬───┬───┬───┐ Старший бит│ │ 0 │ 0 │ 0 │ Цвет спрайта │ Младший бит └─▲─┴───┴───┴───┴───┴───┴───┴───┘ └── Синхронизирующий бит (его имя EC) Его м л а д ш и е четыре бита определяют текущий ц в е т спрайта (для высвечиваемых точек шаблона). Невысвечиваемые точки шаблона "окраше- ны" в прозрачный цвет. Старший бит этого байта называется с и н х р о н и з и р у ю щ и м. Если его значение равно 1 , то положение спрайта смещается в л е в о на 32 точки. П р и м е р 3. "Работа" синхронизирующего бита. ───────────── 20 COLOR 1,15,15 30 SCREEN 1,3:WIDTH 30 40 SPRITE$(0)=STRING$(32,255) 50 PUT SPRITE 0,(80,80),8,0 60 VPOKE 6915,&B10001000 61 ' ▲ 63 ' │──────────── 1 - координаты спрайта (X-32,Y) 65 ' └──────────── 0 - координаты спрайта (X,Y) 70 LOCATE 2,8,0:PRINT"Нажмите клавишу" 80 A$=INPUT$(1) 90 VPOKE 6915,&B00001000 100 END Разумеется, при программировании на языке MSX-BASIC лучше использовать оператор PUT SPRITE, а не последовательность операторов VPOKE. ┌──────────────────────────────────────────────────────────────┐ │ Однако последовательность операторов VPOKE гораздо проще │ │ моделировать на м а ш и н н о м я з ы к е, чем оператор │ │ PUT SPRITE │ └──────────────────────────────────────────────────────────────┘ Более того,знание структуры Таблицы SAT позволяет "прочитать" атрибуты спрайта непосредственно из п а м я т и ! П р и м е р 4. Превращение белого спрайта в черный и наоборот. ───────────── 10 COLOR 1,4,8:SCREEN 1,1:SPRITE$(0)=STRING$(8,255) 30 PUT SPRITE 0,(115,80),15,0 40 IF INKEY$="" THEN 40 50 GOSUB 100:GOTO 40 100 VPOKE &H1B03,VPEEK(&H1B03) XOR 14 'BASE(1*5+3) ──▶ &H1B00 110 RETURN ──────────▲───────── │ &b00001111 XOR &b00001110 = &b00000001 ──▶ цвет 1 Оператор SCREEN инициализирует четыре байта Таблицы SAT, кодирующих ат- рибуты одного спрайта, следующим образом: ┌──────────────┬──────────────┬──────────────┬───────────────┐ │ Первый байт │ Второй байт │ Третий байт │ Четвертый байт│ └──────▲───────┴───────▲──────┴───────▲──────┴────────▲──────┘ │ │ │ │ Координата Y Координата X Номер шаблона Текущий цвет в Таблице SGT изображения К о о р д и н а т а Y отображения спрайта по умолчанию приведена в следующей табличке (из нее видно, что при таких Y неважно, каково Х): ┌──────────────────┬─────┬─────┐ │ Серия компьютера │MSX-1│MSX-2│ │──────────────────┼─────┼─────┤ │ Р е ж и м экрана│ Y │ Y │ │──────────────────┼─────┼─────┤ │ SCREEN 1 │ 209 │ 209 │ │ SCREEN 2 │ 209 │ 209 │ │ SCREEN 3 │ 209 │ 209 │ │ SCREEN 4 │ │ 217 │ │ SCREEN 5 │ │ 217 │ │ SCREEN 6 │ │ 217 │ │ SCREEN 7 │ │ 217 │ │ SCREEN 8 │ │ 217 │ └──────────────────┴─────┴─────┘ С учетом значения координаты Y спрайт является н е в и д и м ы м. Ко- ордината Y обладает интересной особенностью. Если Y-координата спрайта с номером N равна 209 (в режимах SCREEN 1,SCREEN 2,SCREEN 3) или 217 (в ре- жимах SCREEN 4,SCREEN 5,SCREEN 6,SCREEN 7,SCREEN 8),то этот спрайт не ото- бражается на экране. Самое интересное заключается в том, что не отобража- ются и все остальные спрайты с номерами, большими чем N. П р и м е р 5. ───────────── 10 DIM X(3):SCREEN 2,0:A$="ЧЧЧЧЧЧЧЧ":Y=0 30 FOR I=1 TO 3:SPRITE$(I)=A$:X(I)=10*I:NEXT I 40 PUT SPRITE 1,(X(1),Y),1,1: PUT SPRITE 3,(X(3),Y),15,3: 60 PUT SPRITE 2,(X(2),Y),8,2 70 Y=Y+1:IF Y>208 THEN BEEP:A$=INPUT$(1):END 'Исчезли два спрайта! 80 GOTO 60 "Э к р а н н ы й" н о м е р спрайта по умолчанию равен номеру шабло- на спрайта. Ц в е т о м спрайта по умолчанию является текущий цвет изображения. ┌───────────────────────────────────────────────────────────────┐ 3. │ Таблица SCT используется только в режимах SCREEN 4 ÷ SCREEN 8 │. └───────────────────────────────────────────────────────────────┘ Базовый адрес Таблицы цветов спрайтов (SCT) будет всегда автоматически вычисляться вычитанием числа 512 из базового адреса Таблицы атрибутов спрайтов (SAT). С помощью SCT можно моделировать оператор COLOR SPRITE$(), который,как Вы, конечно, помните, позволяет определить цвет для высвечиваемых точек шаблона спрайта для к а ж д о й спрайтовой линии (цвет невысвечиваемых точек шаблона спрайта всегда п р о з р а ч н ы й). Так как для каждого из 32 спрайтов необходимо хранить информацию макси- мум о 16 спрайтовых линиях различного цвета, эта Таблица занимает 32·16 = 512 байтов VRAM . ┌────────────────────────────────────────────────────────────┐ │ Адрес байта, начиная с которого располагается информация о │ │ ц в е т е спрайта в Таблице SCT, вычисляется по формуле: │ │ AD = A0 + 16·SN , │ │ где: A0 - адрес начала Таблицы SCT; │ │ SN - номер шаблона спрайта . │ └────────────────────────────────────────────────────────────┘ П р и м е р 6. Вторая спрайтовая линия изображения девятого спрайта ───────────── раскрашена восьмым цветом. 10 COLOR 15,1,8:SCREEN 4,0 20 SPRITE$(3)="пример":PUT SPRITE 9,(40,80),15,3 40 VPOKE &H1C00+16*9+2,8 50 GOTO 50 Заметим, что для информации о цвете шаблона спрайта размером 8╳8 точек отводятся т о л ь к о 16 младших полубайтов 16 байтов SCT,отводимых для одного шаблона. Опишем содержимое оставшихся 16 с т а р ш и х полубайтов... Оказывается с их помощью можно разрешить или запретить приоритеты спрай- тов, обработать определенным образом столкновения и задать или отменить так называемое "опережение" для спрайта. Изобразим схематически Таблицу SCT... ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ 7 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │ 0 │ Н о м е р а б и т о в ├───┼─────────┼───┴───┴───┴───┤ 0-й байт│ │ │ │ 0 │ Код цвета │ Спр.линия 1 для спрайта 0 ├───┼───┼───┼───┼───────────────┤ 1-й байт│ │ │ │ 0 │ Код цвета │ Спр.линия 2 для спрайта 0 ├───┴───┴───┴───┴───────────────┤ ··· │ ··· ··· │ ··· ├───┬───┬───┬───┬───────────────┤ 15-й байт│ │ │ │ 0 │ Код цвета │ Спр.линия 16 для спрайта 0 ├───┴───┴───┴───┼───────────────┤ │ ··· │ ··· │ ├───┬───┬───┬───┼───────────────┤ 496-й байт│ │ │ │ 0 │ Код цвета │ Спр.линия 1 для спрайта 31 ├───┼───┼───┼───┼───────────────┤ 497-й байт│ │ │ │ 0 │ Код цвета │ Спр.линия 2 для спрайта 31 ├───┴───┴───┴───┼───────────────┤ ··· │ ··· │ ··· │ ├───┬───┬───┬───┼───────────────┤ 511-й байт│ │ │ │ 0 │ Код цвета │ Спр.линия 16 для спрайта 31 └─▲─┴─▲─┴─▲─┴───┴───────────────┘ │ │ └─ Бит IC (определитель столкновений):1-нет, 0-да; │ └───── Бит CC (разрешение приоритета) :0-нет, 1-да; └───────── Бит EC ("опережение") :1- да, 0-нет. В режиме спрайтов 2, если СС-бит Таблицы SCT установлен в 1, порядок приоритетности спрайтов для данной спрайтовой линии о т м е н я е т с я . Спрайтовая линия, для которой бит СС установлен в 1 , будет отображаться только на горизонтальных линиях,где существуют спрайты с низшими номерами. Отметим, что и в этом случае, если на одной линии экрана более 8 спрай- тов, то д е в я т ы й спрайт и все последующие не будут изображаться на экране дисплея. Более того,не фиксируется столкновение спрайта, для которого с SCT бит СС установлен в 1, с другим спрайтом (даже если у этого спрайта в SCT бит СС установлен в 0). В этом случае для пересекающихся спрайтов над их цве- товыми кодами производится логическая операция OR. Говорят, что в режиме SCREEN 6 цвет фона и цвета спрайтов подвергаются а п п а р а т н о м у т и л и н г у. Эти цвета кодируются четырьмя би- тами: два с т а р ш и х бита определяют код цвета нечетных точек, а два м л а д ш и х бита определяют код цвета четных точек по X-координате (от 0 до 511). В режиме SCREEN 6 размер одной точки спрайта в 2 раза больше,чем у гра- фической точки (пикселя), однако за счет наличия аппаратного тилинга, од- на точка спрайта может обладать двумя цветами одновременно (четные и не- четные точки фонового цвета могут быть определены таким же образом). ┌─────────────────── Четные точки (0,2,...,510) │ ┌────────────── Нечетные точки (1,3,...,511) ┌──▼─┬──▼─┐ │ │ │ Д в е графические точки └────┴────┘ ┌────┬────┐ │ │ │ О д н а точка спрайта └──▲─┴─▲──┘ │ │ ┌───┬───┐ ┌───┬───┐ │ █ │ █ │ │ █ │ █ │ Биты, определяющие цвета спрайта └───┴───┘ └───┴───┘ Приведем табличку начальных адресов Таблиц SCT для различных режимов: ┌────────────┬─────────────┐ │ Р е ж и м │ А д р е с │ ├────────────┼─────────────┤ │ SCREEN 4 │ &H1C00 │ │ SCREEN 5 │ &H7400 │ │ SCREEN 6 │ &H7400 │ │ SCREEN 7 │ &HF800 │ │ SCREEN 8 │ &HF800 │ └────────────┴─────────────┘ Отметим, что 16 байтов Таблицы SCT, отвечающих за цвет спрайта,первона- чально инициализируются текущим цветом изображения или цветом, заданным в операторе PUT SPRITE. "Содержимое" этих байтов может быть переопределено непосредственно операторами VPOKE или оператором COLOR SPRITE() (COLOR SPRITE$()). В режиме SCREEN 8 цвета спрайта фиксированы и не зависят от регистра палитры. Цвета спрайта в режиме SCREEN 8 показаны на следующей таблице. ┌─────────────────┬─────────────┬─────────────┬────────────┐ │ Код цвета │ Зеленый │ Красный │ Синий │ │ С3 С2 С1 С0 │ G2 G1 G0 │ R2 R1 R0 │ B2 B1 B0 │ ├─────────────────┼─────────────┼─────────────┼────────────┤ │ 0 0 0 0 │ 0 0 0 │ 0 0 0 │ 0 0 0 │ │ 0 0 0 1 │ 0 0 0 │ 0 0 0 │ 0 1 0 │ │ 0 0 1 0 │ 0 0 0 │ 0 1 1 │ 0 0 0 │ │ 0 0 1 1 │ 0 0 0 │ 0 1 1 │ 0 1 0 │ │ │ │ │ │ │ 0 1 0 0 │ 0 1 1 │ 0 0 0 │ 0 0 0 │ │ 0 1 0 1 │ 0 1 1 │ 0 0 0 │ 0 1 0 │ │ 0 1 1 0 │ 0 1 1 │ 0 1 1 │ 0 0 0 │ │ 0 1 1 1 │ 0 1 1 │ 0 1 1 │ 0 1 0 │ │ │ │ │ │ │ 1 0 0 0 │ 1 0 0 │ 1 1 1 │ 0 1 0 │ │ 1 0 0 1 │ 0 0 0 │ 0 0 0 │ 1 1 1 │ │ 1 0 1 0 │ 0 0 0 │ 1 1 1 │ 0 0 0 │ │ 1 0 1 1 │ 0 0 0 │ 1 1 1 │ 1 1 1 │ │ │ │ │ │ │ 1 1 0 0 │ 1 1 1 │ 0 0 0 │ 0 0 0 │ │ 1 1 0 1 │ 1 1 1 │ 0 0 0 │ 1 1 1 │ │ 1 1 1 0 │ 1 1 1 │ 1 1 1 │ 0 0 0 │ │ 1 1 1 1 │ 1 1 1 │ 1 1 1 │ 1 1 1 │ └─────────────────┴─────────────┴─────────────┴────────────┘ 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 │ └────────────┴────────────┴────────┴─────────────┘ 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-компьютера (Z80). Что- бы записать число 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 'Отключение ─────────── клавиатуры! \page Р е г и с т р 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 'а изображение - в нулевой Р е г и с т р 9. ─────────────── ┌─────┬────────┬─────────────────────────────────────────────────────┐ │Номер│Значение│ │ │бита │ бита │ К о м м е н т а р и й │ ├─────┼────────┼─────────────────────────────────────────────────────┤ │ │ │ Бит "LN" │ │ 7 │ │ Отвечает за о б щ у ю высоту экрана (за доступную│ │ │ │ высоту отвечает ячейка &hF3B1 в рабочей области RAM)│ │ │ 1 │ На экране 212 графических или 26.5 текстовых строк │ │ │ 0 │ На экране 192 графических или 24 текстовых строк │ ├─────┼────────┼─────────────────────────────────────────────────────┤ │ 6 │ 0 │ Не используется │ ├─────┼────────┼───────────────────────────────────────┬─────────────┤ │ 5 │ 1 │ Поступает сигнал только │ │ │ │ │ от внешнего TV-источника │ Эти биты │ │ │ 0 │ Разрешено изображение от компьютера │ моделируют │ ├─────┼────────┼───────────────────────────────────────┤ оператор │ │ 4 │ 1 │ Происходит смешивание изображения от│ SET VIDEO n │ │ │ │ компьютера и от TV-источника │ │ │ │ 0 │ Смешивания сигналов не происходит │ │ ├─────┼────────┼───────────────────────────────────────┼─────────────┤ │ 3 │ 1 │ Происходит "дрожание" экрана │ │ │ │ 0 │ "Дрожания" не происходит │ Эти биты │ ├─────┼────────┼───────────────────────────────────────┤ моделируют │ │ 2 │ 1 │ Происходит поочередный показ страниц │ оператор │ │ │ │ на страницах с нечетными номерами │SCREEN ,,,,,n│ │ │ │ в режимах SCREEN 5 ÷ SCREEN 8 │ (5 запятых!)│ │ │ 0 │ Отображается одна и та же страница │ │ │ │ │ на четное/нечетное поле │ │ ├─────┼────────┼───────────────────────────────────────┴─────────────┤ │ 1 │ │ Выбор системы телевидения: │ │ │ 1 │ PAL (313 линий, американский стандарт) │ │ │ 0 │ NTSC (262 линии, японский стандарт) - │ │ │ │ - только для RGB-выхода │ ├─────┼────────┼─────────────────────────────────────────────────────┤ │ 0 │ 1 │ Установка на режим в в о д а │ │ │ 0 │ Установка на режим в ы в о д а │ └─────┴────────┴─────────────────────────────────────────────────────┘ П р и м е р 5. Установим высоту экрана равной 26.5 строкам. ───────────── 10 SCREEN 0:WIDTH 80 20 VDP(9+1)=VDP(9+1) OR 128 30 POKE &hF3B1,27 40 FOR T=BASE(0)+(1920-80) TO BASE(0)+(1920-80)+240 50 VPOKE T,32:NEXT XI.2.2. Р е г и с т р ы б а з о в ы х а д р е с о в Мы находимся в положении, несколько аналогич- ном положению человека, держащего в руках связку ключей и пытающегося открыть одну за другой несколько дверей. Рано или поздно ему всегда удается подобрать ключ к очередной двери, но сомнения относительно взаимноодно- значного соответствия между ключами и дверя- ми у него остаются. Ю.Вигнер Адрес байта видеопамяти кодируется 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│ бит └───┴───┴───┴───┴───┴───┴───┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘ В регистрах базовых адресов хранятся старшие биты начальных адресов Та- блиц VRAM для текущего режима SCREEN. ┌───────────────────────────────────────────────────────┐ │ Эти регистры инициализируются псевдопеременной BASE │ . └───────────────────────────────────────────────────────┘ Отметим,что при использовании этих регистров рекомендуется маскировать н е н у ж н ы е в текущем режиме отображения биты. Регистр с номером 2 MSX-VDP содержит семь старших битов начального ад- реса Таблицы PNT: ┌─┬───┬───┬───┬───┬───┬───┬───┐ │0│A16│A15│A14│A13│A12│A11│A10│ └─┴───┴───┴───┴───┴───┴───┴───┘ П р и м е р 1. 10 SCREEN 1 ───────────── 20 A$=RIGHT$("0000000000000000"+BIN$(BASE(5*1+0)),16) 30 ?A$:B$=RIGHT$("00000000"+BIN$(VDP(2)),8):?B$ 'Читаем текущий адрес PNT run ┌──────┐ │000110│0000000000◀── Начальный адрес Таблицы PNT └──────┘ в SCREEN1 ┌──────┐ 00│000110│ ◀── Содержимое регистра с номером 2 Ok└──────┘ Регистры с номерами 10 и 3 содержат одиннадцать старших битов начально- го адреса Таблицы CT: Регистр 10 Регистр 3 ┌─┬─┬─┬─┬─┬───┬───┬───┐ ┌───┬───┬───┬───┬──┬──┬──┬──┐ │0│0│0│0│0│A16│A15│A14│ │A13│A12│A11│A10│A9│A8│A7│A6│ └─┴─┴─┴─┴─┴───┴───┴───┘ └───┴───┴───┴───┴──┴──┴──┴──┘ П р и м е р 2. 10 SCREEN 1 ───────────── 20 A$=RIGHT$("0000000000000000"+BIN$(BASE(5*1+1)),16) 30 ?A:$A$=RIGHT$("0000000000000000"+BIN$(VDP(10+1))+BIN $(VDP(3)),16):?A$ run ┌──────────┐ │0010000000│000000 ◀── Начальный адрес Таблицы CT └──────────┘ в SCREEN1 ┌──────────┐ 000000│0010000000│◀── Содержимое регистров с номерами Ok └──────────┘ 10 и 3 Регистр с номером 4 содержит шесть старших битов начального адреса Таб- лицы PGT: ┌─┬─┬───┬───┬───┬───┬───┬───┐ │0│0│A16│A15│A14│A13│A12│A11│ └─┴─┴───┴───┴───┴───┴───┴───┘ П р и м е р 3. 10 SCREEN 0:WIDTH 80 ───────────── 20 A$=RIGHT$("0000000000000000"+BIN$(BASE(5*0+2)),16) 30 ?A$:B$=RIGHT$("00000000"+BIN$(VDP(4)),8):?B$ run ┌─────┐ │00010│00000000000◀── Начальный адрес Таблицы PGT └─────┘ в SCREEN0 ┌─────┐ 000│00010│ ◀── Содержимое регистра с номером 4 Ok └─────┘ Регистры с номерами 11 и 5 содержат десять старших битов начального ад- реса Таблицы SAT: Регистр 11 Регистр 5 ┌─┬─┬─┬─┬─┬─┬───┬───┐ ┌───┬───┬───┬───┬───┬──┬──┬──┐ │0│0│0│0│0│0│A16│А15│ │А14│A13│A12│A11│A10│A9│A8│А7│ └─┴─┴─┴─┴─┴─┴───┴───┘ └───┴───┴───┴───┴───┴──┴──┴──┘ П р и м е р 4. 10 SCREEN 1 ───────────── 20 A$=RIGHT$("0000000000000000"+BIN$(BASE(5*1+3)),16) 30 ?A$:A$=RIGHT$("0000000000000000"+BIN$(VDP(1+11))+BIN $(VDP(5)),16):?A$ run ┌─────────┐ │000110110│0000000◀── Начальный адрес Таблицы SAT └─────────┘ в SCREEN1 ┌─────────┐ 0000000│000110110│◀── Содержимое регистров с номерами Ok └─────────┘ 11 и 5 ┌───────────────────────────────────────────────────────────────────────┐ │ З а м е ч а н и е. С Таблицей SAT связана Таблица SCT, адрес которой│ │ получается вычитанием 512 байтов из начального адреса Таблицы SAT. │ └───────────────────────────────────────────────────────────────────────┘ Регистр с номером 6 содержит шесть старших битов начального адреса Таб- лицы SGT: ┌─┬─┬───┬───┬───┬───┬───┬───┐ │0│0│A16│A15│A14│A13│A12│A11│ └─┴─┴───┴───┴───┴───┴───┴───┘ П р и м е р 5. 10 SCREEN 1 ───────────── 20 A$=RIGHT$("0000000000000000"+BIN$(BASE(5*1+4)),16) 30 ?A$:B$=RIGHT$("00000000"+BIN$(VDP(6)),8):?B$ 'Читаем текущий адрес SGT run ┌─────┐ │00111│00000000000◀── Начальный адрес Таблицы SGT └─────┘ в SCREEN1 ┌─────┐ 000│00111│ ◀── Содержимое регистра с номером 6 Ok └─────┘ ┌────────────────────────────────────────────────────────────────────┐ │ Отметим, что при использовании этих регистров рекомендуется │ │ м а с к и р о в а т ь ненужные в текущем режиме отображения биты. │ └────────────────────────────────────────────────────────────────────┘ XI.2.3. Р е г и с т р ы ц в е т о в - Вы знаете отличительные способности животного, называемого раком? - Да, конечно. Рак - это рыба к р а с н о г о ц в е т а, которая ходит боком. - Ну, что ж. Я вижу,что Вы кое-что з н а е т е о раке ... Студенческий фольклор α) Регистр с номером 7 видеопроцессора в режиме SCREEN 0 определяет цвет изображения и фона. Четыре старших бита этого регистра "хранят" цвет и з о б р а ж е н и я, а четыре младших ─ цвет ф о н а. Например, команда VDP(7)=&H4B в режиме SCREEN 0 эквивалентна команде COLOR 4,11 . ▲▲ Цвет изображения ──┘└── Цвет фона А команда VDP(7)=&H1F приводит к тому же результату, что и оператор COLOR 1,15 . Р е г и с т р с номером 7 (регистр цвета текста/фона) ┌────────────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │ Номер бита │ 7 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │ 0 │ │ Имя бита │ TC3 │ TC2 │ TC1 │ TC0 │ BD3 │ BD2 │ BD1 │ BD0 │ └────────────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ TC3 - ТC0 определяет цвет текста в режимах SCREEN 0 и SCREEN 1; BD3 - BD0 определяет цвет фона во всех режимах отображения В других режимах SCREEN этот регистр "хранит" цвет б о р д ю р а. П р и м е р 1. 10 COLOR 1,15,4:SCREEN 2:Z=VDP(7) ───────────── 20 SCREEN 0:PRINT Z run 4 Ok ┌───────────────────────────────────────────────────────────────────┐ │ Содержимое седьмого регистра инициализируется оператором COLOR .│ └───────────────────────────────────────────────────────────────────┘ β) В 80-символьном режиме SCREEN 0 существует явление, которое мы назо- вем м и г а н и е м . Информация о символах, которые должны мигать, нахо- дится в Таблице цветов (CT), которая занимает 270 байтов с адреса, возвра- щаемого псевдопеременной BASE(0*5+1). Рассмотрим, как она располагается. Каждая строка экрана разбивается на 10 участков по 8 квадратов (знако- мест) в каждом. За каждый из этих участков отвечает один байт, а за квад- рат, естественно, один бит. Если значение бита равно 1, то символ на соот- ветствующем знакоместе (в соответствующем квадрате) м и г а е т. В проти- вном случае мигания не происходит. Запись в Таблицу CT еще не означает, что какое-то знакоместо на экране сразу замигает. Для начала мигания необходимо обратиться к регистрам VDP, отвечающим за этот процесс. Вначале договоримся о терминологии. О с н о в н ы м цветом текста (фона) будем называть цвет, задаваемый оператором COLOR и хранящийся в 7-м регистре MSX-VDP. Ц в е т о м м и г а н и я текста (фона) будем называть цвет,который приобретает текст (фон) при мигании. Ч а с т о т о й в к л ю ч е н и я м и г а н и я назовем промежуток времени, в течение которого текст и фон приобретают цвет мигания. Ч а с т о т о й в ы к л ю ч е н и я м и г а н и я будем называть промежуток времени, в течение которого текст и фон приобретают основной цвет. Единица измерения частоты мигания равна 1/6 секунды.Максимально возмож- ный период мигания составляет 5 секунд (15/6 секунд на включение мигания и столько же на выключение мигания). Регистр с номером д в е н а д ц а т ь MSX-VDP содержит информацию о цвете мигания текста и фона. Старший полубайт этого регистра отвечает за цвет мигания текста, а младший полубайт отвечает за цвет мигания фона. Р е г и с т р с номером 12 (регистр цвета текста/фона) ┌────────────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │ Номер бита │ 7 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │ 0 │ │ Имя бита │ TC3 │ TC2 │ TC1 │ TC0 │ BC3 │ BC2 │ BC1 │ BC0 │ └────────────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ биты TC3,TC2,TC1,TC0 определяют цвет части 1 шаблона; биты BC3,BC2,BC1,BC0 определяют цвет части 0 шаблона. Если в режиме SCREEN 1 установлен признак мерцания, то цвета из этого регистра и из регистра с номером 7 поочередно отображаются. За частоту мигания "отвечает" регистр с номером т р и н а д ц а т ь, причем в его старшем полубайте хранится информация о частоте включения ми- гания, а в младшем - информация о частоте выключения мигания. Р е г и с т р с номером 13 (регистр периода мерцания) ┌────────────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │ Номер бита │ 7 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │ 0 │ │ Имя бита │ ON3 │ ON2 │ ON1 │ ON0 │ OF3 │ OF2 │ OF1 │ OF0 │ └────────────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ биты ON3,ON2,ON1,ON0 определяют период отображения для четной страницы; биты ОF3,OF2,OF1,OF0 определяют период отображения для нечетной страницы. В режимах растровой графики (SCREEN 5÷SCREEN 8) попеременно сменяются две страницы памяти. Данные помещаются в этот регистр для установления отображаемой страницы как нечетной страницы для начала мерцания. Этот ре- гистр используется также в режиме SCREEN 1. Приведем табличку... ┌──────────────────────┬────────────┬──────────────────────┬────────────┐ │ Содержимое полубайта │ Время (мс) │ Содержимое полубайта │ Время (мс) │ │ регистра 13 │ │ регистра 13 │ │ ├──────────────────────┼────────────┼──────────────────────┼────────────┤ │ 0 0 0 0 │ 0 │ 1 0 0 0 │ 1335,1 │ │ 0 0 0 1 │ 166,9 │ 1 0 0 1 │ 1501,9 │ │ 0 0 1 0 │ 333,8 │ 1 0 1 0 │ 1668,8 │ │ 0 0 1 1 │ 500,6 │ 1 0 1 1 │ 1835,7 │ │ 0 1 0 0 │ 667,5 │ 1 1 0 0 │ 2002,6 │ │ 0 1 0 1 │ 834,4 │ 1 1 0 1 │ 2169,5 │ │ 0 1 1 0 │ 1001,3 │ 1 1 1 0 │ 2336,3 │ │ 0 1 1 1 │ 1168,2 │ 1 1 1 1 │ 2503,2 │ └──────────────────────┴────────────┴──────────────────────┴────────────┘ А теперь взгляните на следующий пример. П р и м е р 2. ───────────── 10 SCREEN 0:WIDTH 80 'Установка режима для мигания 20 FOR T=2048 TO 2048+269:VPOKE T,0:NEXT 'Очистка Таблицы мигания 30 LINEINPUT "Введите слово:";B$ 40 INPUT "Где ему мигать (X,Y)";X,Y 50 INPUT "Цвет слова для мигания";MI 60 INPUT "Цвет фона для мигания";MF 70 INPUT "Частота включения мигания (от 0 до 15)";TN 80 INPUT "Частота выключения мигания (от 0 до 15)";TK 90 VPOKE 2048+10*Y+X/8,&B11111111 'Будут мигать 8 символов 100 CLS:LOCATE X,Y:PRINT B$ 110 COL=16*MI+MF:TIM=16*TN+TK 120 VDP(12+1)=COL:VDP(13+1)=TIM Для прекращения мигания поместите в старший полубайт 13-го регистра число 0. γ) Две графические страницы экрана могут отображаться п о п е р е - м е н н о (в режимах SCREEN 5 ÷ SCREEN 8). Страницы, которые будут попере- менно отображаться, расположены следующим образом: Режим SCREEN 5 и SCREEN 6 Режим SCREEN 7 и SCREEN 8 ┌─────────────┐ ┌────────────┐ │ Страница 0 │─┐ │ │─┐ ├─────────────┤ │ │ Страница 0 │ │ │ Страница 1 │─┘ │ │ │ ├─────────────┤ ├────────────┤ │ │ Страница 2 │─┐ │ │ │ ├─────────────┤ │ │ Страница 1 │─┘ │ Страница 3 │─┘ │ │ └─────────────┘ └────────────┘ Период отображения, находящийся в промежутке между 166 мс и 2053 мс, может быть определен для каждой страницы. Для этого необходимо: 1) задать базовый адрес Таблицы имен шаблонов н е ч е т н о й стра- ницы (регистр с номером 2); 2) задать время включения (интервал, в течение которого отображается ч е т н а я страница) и время выключения (интервал, в течение которого отображается н е ч е т н а я страница) в регистре с номером 13. Р е г и с т р с номером 13 (регистр периода мерцания) ┌────────────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │ Номер бита │ 7 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │ 0 │ │ Имя бита │ ON3 │ ON2 │ ON1 │ ON0 │ OF3 │ OF2 │ OF1 │ OF0 │ └────────────┴──▲──┴─────┴─────┴──▲──┴──▲──┴─────┴─────┴──▲──┘ └─────────────────┘ └─────────────────┘ Время включения Время выключения 3) после этого начнется процесс мигания. П р и м е р 3. ────────────── 10 SCREEN 7 :' Режим растровой графики (SCREEN 5÷8) 20 SET PAGE 0,0: CLS :' На странице 0 30 CIRCLE (254,106),30,15 :' рисуем окружность 40 SET PAGE 1,1: CLS :' А на странице 1 50 CIRCLE (254,106),60,15 :' рисуем окружность большего радиуса 60 VDP(13+1)=&H11 :' Включим смену страниц 70 :' Окружность п у л ь с и р у е т ! 80 A$=INPUT$(1) :' Ждем нажатия любой клавиши... 90 VDP(13+1)=0 :' Выключим смену страниц Опишем еще один способ осуществления смены двух графических страниц на экране. Бит ЕО (второй бит регистра с номером 9) используется для попере- менной демонстрации д в у х графических страниц экрана с частотой 60 Гц. Для этого необходимо: 1) задать базовый адрес Таблицы имен шаблонов н е ч е т н о й страни- цы (регистр с номером 2); 2) установить в т о р о й бит регистра с номером 9 в 1. П р и м е р 4. ───────────── 10 SCREEN 7:VDP(10)=0 :' Режим растровой графики (SCREEN 5÷8) 20 SET PAGE 0,0: CLS :' Рисуем на странице 0 30 CIRCLE (256,106),30,15 :' окружность радиусом 30 31 FOR I=1 TO 100:NEXT :' З а д е р ж к а... 40 SET PAGE 1,1: CLS :' А на странице 1 - 50 CIRCLE (256,106),60,15 :' окружность радиусом 60 51 FOR I=1 TO 100:NEXT :' З а д е р ж к а... 59 :' :' А теперь - п о м и г а е м ... 60 VDP(9+1)=&B00000100:' Включаем попеременное отображение страниц. 70 :' Окружности с двух страниц одновременно отображаются на экране ! 80 :' Недостаток: заметное мигание изображения 81 :' Эта возможность используется в программе PAINTER 82 :' (меню Tool.Show Canvas) 90 A$=INPUT$(1) :' З а д е р ж к а Кроме того,видеопроцессор поддерживает функцию черезстрочного отображе- ния. Отображение первого и второго п о л е й на одной и той же странице можно получить, установив бит IL (третий бит регистра с номером 9) в 1. Отображение четной страницы в первом поле и нечетной страницы во вто- ром поле можно получить, выполнив следующее: 1) установить бит IL (третий бит регистра с номером 9) в 1; 2) установить бит ЕО (второй бит регистра с номером 9) в 1; 3) задать базовый адрес Таблицы имен шаблонов нечетной страницы (ре- гистр с номером 2). П р и м е р 5. ───────────── 10 COLOR 15,1,1: SCREEN 7 ' Режим растровой графики 15 ' Обратите внимание на координаты линий ! 20 SET PAGE 0,0:CLS:LINE (0,100)-(511,100),15 'На странице 0 рисуем линию 30 SET PAGE 1,1:CLS:LINE (0,100)-(511,100),8 ' На 1-й странице тоже рисуем линию 31 VDP(9+1)=&B00001100 32 ' │└─────── Отображаем четную страницу в первом поле 33 ' └──────── и нечетную страницу во втором поле 34 'Линии накладываются друг на друга на 1/2 (!) точки 40 A$=INPUT$(1) ' Задержка 41 VDP(9+1)=0 ' Выключим мигание δ) Регистр с номером 20 называется регистром цветовой вспышки 1. Регистр с номером 21 называется регистром цветовой вспышки 2. Регистр с номером 22 называется регистром цветовой вспышки 3. Данные регистры инициализируются при включении компьютера следующим об- разом: ┌────────────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │ Номер бита │ 7 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │ 0 │ ├────────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │ Регистр 20 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ ├────────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │ Регистр 21 │ 0 │ 0 │ 1 │ 1 │ 1 │ 0 │ 1 │ 1 │ ├────────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │ Регистр 22 │ 0 │ 0 │ 0 │ 1 │ 0 │ 1 │ 0 │ 1 │ └────────────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ Если все величины в трех вышеуказанных регистрах равны нулю, то сигнал "цветовой вспышки" на NTSC-видеовыходе будет отсутствовать. Если же выше- указанные величины затем возвращаются в исходное состояние, то будет полу- чен обычный сигнал "цветовой вспышки" на NTSC-видеовыходе. 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: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 SCREEN 1,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. 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 SCREEN 1: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: VPOKE &H2000+65*8+X,(X+A)*16: 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.