====== Глава XI ====== |{{..author_files:011.msx|}}|{{..author_files:011.txt|}}|[[..011|]]| @@ -1,13 +1,12 @@ -c1E +\/d Г Л А В А XI. РАБОТА С ВИДЕОПАМЯТЬЮ И ВИДЕОПРОЦЕССОРОМ - +\/d- Надо понять тот минимум, на котором покоится мир, и все избыточное безжалостно отсекать (бритва Оккама). У.Оккам - XI.1. В и д е о п а м я т ь П р о ц е с с о р (англ. "processor", от "process" - "обрабатывать") - @@ -35,7 +34,7 @@ └──────────────────────────────────────────────────────────────────┘ Прежде чем Вы попытаетесь непосредственно воздействовать на "содержи- мое" экрана дисплея, хорошо разберитесь в назначении Таблиц VRAM! - Далее в тексте Вам часто будут встречаются следующие аббревиатуры: + Далее в тексте Вам часто будут встречаться следующие аббревиатуры: ┌────────────┬──────────────────────────────────────────────────────────┐ │Аббревиатура│ Что Вам необходимо з а п о м н и т ь! │ ├────────────┼──────────────────────────────────────────────────────────┤ @@ -49,28 +48,25 @@ │ PT │ "Palette Table" - "Таблица палитры" │ └────────────┴──────────────────────────────────────────────────────────┘ - XI.1.1. П с е в д о п е р е м е н н а я BASE Псевдопеременная BASE используется для чтения начальных адресов Таблиц VRAM, а также для их "перемещения" в видеопамяти. - α) Вначале о синтаксисе псевдопеременной BASE,используемой как функция: - BASE(N) + α) Вначале о синтаксисе псевдопеременной 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 │ - └─────────────────────────────────────────────────────────────┘ + Функция 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 │ И м я Таблицы │ @@ -86,9 +82,8 @@ го выполним команду: PRINT HEX$(BASE(5*2+1)) 2000 ▲ ▲ Ok Режим экрана──┘ └── Номер Таблицы - - Следующая табличка позволяет найти начальный адрес Т а б л и ц ы VRAM -с номером T для режима SCREEN M: + Следующая табличка позволяет найти начальный адрес Таблицы VRAM с номе- +ром T для режима SCREEN M: ┌───────┬──────┬──────┬──────┬──────┬──────┐ │ М \ Т │0(PNT)│ 1(CT)│2(PGT)│3(SAT)│4(SGT)│ ├───────┼──────┼──────┼──────┼──────┼──────┤ @@ -144,11 +139,11 @@ β) А теперь -синтаксис псевдопеременной BASE,используемой в л е в о й части оператора присваивания: BASE(N)= 1024*A - или BASE(N)=&H400*A + или BASE(N)=&H400*A , где: N - арифметическое выражение, целая часть значения которого долж- на принадлежать отрезку [0,19]. Значение N - это номер Т а б л и ц ы VRAM; A - арифметическое выражение,целая часть значения которого, умно- -женная на число 1024, определяет новый начальный адрес таблицы VRAM с но- +женная на число 1024, определяет новый начальный адрес Таблицы VRAM с но- мером N (1Кбайт = 1024 байтам). Значение A должно принадлежать отрезку [0,15] для компьютеров серий MSX-1 и MSX-2. ┌──────────┬───┬─────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┐ @@ -179,11 +174,10 @@ │ Число разрешенных│ 4 │ 2 │ 1 │ 1 │ 1 │ 1 │ 4 │ 4 │ 2 │ 2 │ │ экранных страниц │ Используется BASE ├───┤Используется SET PAGE │ └──────────────────┴─────────────────────────┘ └──────────────────────┘ - П р и м е р. Запись нескольких экранных с т р а н и ц в режиме ─────────── SCREEN 0 и их переключение. Стандартный начальный адрес для Таблицы PNT в режиме SCREEN 0 равен 0. -"Передвинем" эту таблицу вначале к адресу &H2000, а затем к адресу &H2400. +"Передвинем" эту Таблицу вначале к адресу &H2000, а затем к адресу &H2400. Идентифицируем экранные страницы ("что-нибудь" на них напишем!), а затем будем переключаться с одной страницы на другую путем переопределения нача- ла Таблицы PNT в строках 100 и 110. @@ -193,10 +187,10 @@ │ &HF924, &HF926 и &HF928 соответственно,и занимают по два байта каждый.│ └───────────────────────────────────────────────────────────────────────┘ Эти значения не могут быть изменены оператором BASE: Вы должны сделать -это с а м и (строка 110). Если Вы это не сделаете, то выход в непосредст- -венный режим работы будет возможен только из н у л е в о й страницы, а -выйти на нее из другой страницы можно осуществить, если набрать "вслепую" -команду SCREEN М , где М - номер режима. +это с а м и (строка 110). В противном случае выход в непосредственный ре- +жим работы будет возможен только из н у л е в о й страницы, а выйти на +нее из другой страницы можно осуществить, если набрать "вслепую" команду + SCREEN М , где М - номер режима. 10 SCREEN 0:WIDTH 40 20 FOR I=0 TO 2 30 GOSUB 100:GOSUB 200 '──▶ @@ -255,7 +249,6 @@ ния данных при помощи оператора VPOKE, когда RAM почти полностью исполь- зована! Однако при таком методе необходимо постоянно пользоваться нулевым текстовым режимом экрана - при смене режима Ваши данные будут уничтожены. - П р и м е р 1. "Спрячем" числовой массив (кстати,а где оператор DIM ?!) ───────────── в видеопамяти, а затем "извлечем его" оттуда. 10 SCREEN 0:WIDTH 40:ADR=4096 'Начальный адрес хранения данных в VRAM @@ -274,7 +267,6 @@ 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 @@ -297,14 +289,13 @@ соб хранения данных в видеопамяти может быть весьма полезным,особенно для больших программ! - XI.1.3. Т е к с т о в ы е р е ж и м ы + XI.1.3. Т е к с т о в ы е р е ж и м ы Они мастера накапливать факты, а вот извлечь из них пользу им удается не всегда. - Конан Дойль. Морской договор - + А.Конан Дойль. Морской договор Введем понятия о б щ е й ширины (высоты) экрана и д о с т у п н о й ширины (высоты) экрана. @@ -334,22 +325,19 @@ └───┴───┴─────┴───┴───┘└────┴────┴─────┴────┴────┘└───┴───┴─────┴───┴───┘ ┌─────────────────────────────────────────────────────────────────────┐ │ Чтобы изобразить символ в нужном месте экрана,используйте оператор: │ - │ VPOKE BASE(5*T)+W,K │ + │ VPOKE BASE(5*T)+W,K , │ │ где: T - номер режима экрана (0 или 1); │ │ W - номер позиции символа на экране; │ │ K - код ASCII символа. │ └─────────────────────────────────────────────────────────────────────┘ - П р и м е р 1. Вывести "A" (код ASCII 65) в 8-й строке и 10-м столб- ───────────── це экрана SCREEN 0: 10 SCREEN 0:WIDTH 40 20 VPOKE BASE(5*T)+40*8+10,65 ▲ ▲ Номер строки экрана─┘ └─ Номер столбца экрана - Описанная возможность позволяет,например, выводить информацию в те мес- та экрана, которые н е д о с т у п н ы для вывода оператором PRINT. - П р и м е р 2. Обратите внимание на то, что общая ширина экрана и до- ───────────── ступная ширина экрана - различны! 10 TIME=0:INTERVAL ON:ON INTERVAL=60 GOSUB 100 @@ -360,7 +348,6 @@ ASC(":") 130 VPOKE 43+J,ASC(MID$(RIGHT$("0"+MID$(STR$(T2),2),2),J+1)):NEXT:RETU RN - Оказывается, можно одновременно "хранить" содержимое нескольких экран- ных с т р а н и ц , причем в любой момент можно "открыть" любую страницу и "прочесть" ее содержимое. @@ -370,7 +357,7 @@ ┌─────────────────────────────────────────────────────────────┐ │ Вы всегда можете изобразить любой символ в нужном месте │ │ л ю б о й экранной страницы при помощи оператора: │ - │ VPOKE 4096*T*(N+1)^2+W,K │ + │ VPOKE 4096*T*(N+1)^2+W,K , │ │ где: T - номер с т р а н и ц ы; │ │ N - режим экрана (0 или 1); │ │ W - номер позиции символа на экране; │ @@ -379,13 +366,12 @@ При этом Вы сможете увидеть содержимое только нулевой страницы. Чтобы "просмотреть содержимое" других страниц, воспользуйтесь псевдо- переменной BASE. - П р и м е р 3. "Полистаем" экранные страницы! ───────────── NEW Ok ┌─ Код символа "SPACE"("пробел") 10 FOR T=1 TO 3 ▼ - 20 FOR D=0 TO 959:VPOKE 4096*T+D,32:NEXT D 'Очистка T-ой страницы + 20 FOR D=0 TO 959:VPOKE 4096*T+D,32:NEXT D 'Очистка T-й страницы 30 PRINT "Введите"T"слово";:INPUT A$ 40 PRINT "С какого места печатать?" 50 INPUT "X(от 0 до 39)";VX:INPUT "Y(от 0 до 23)";VY @@ -399,63 +385,73 @@ 97 NEXT T 100 A$=INPUT$(1):BASE(0)=0:POKE &HF923,0 'Вывод "содержимого" 0-й стра ницы - В н и м а н и е! Страницы могут быть "засорены" посторонней информаци- ей, оставшейся от прежнего обращения к ним. Ваши сообщения могут затерять- ся среди этого "мусора". Поэтому рекомендуем своевременно заботиться о чи- стоте страниц (посмотрите на строку 20 примера 3)! - Приведем структуру Taблицы имен образов (PNT) для 80-символьного режи- ма SCREEN 0 в соответствии с расположением символов на экране дисплея: ┌─────────────┐ - │ 0-й байт │ - код символа в 0-ой строке и 0-ом столбце экрана + │ 0-й байт │ - код символа в 0-й строке и 0-м столбце экрана ├─────────────┤ - │ 1-й байт │ - код символа в 0-ой строке и 1-ом столбце экрана + │ 1-й байт │ - код символа в 0-й строке и 1-м столбце экрана ├─────────────┤ - │ ··· │ + │ ··· │ ··· ├─────────────┤ - │ 79-й байт │ - код символа в 0-ой строке и 79-ом столбце экрана + │ 79-й байт │ - код символа в 0-й строке и 79-м столбце экрана ├─────────────┤ - │ 80-й байт │ - код символа в 1-ой строке и 0-ом столбце экрана + │ 80-й байт │ - код символа в 1-й строке и 0-м столбце экрана ├─────────────┤ │ ··· │ ├─────────────┤ - │ 1919-й байт │ - код символа в 23-ой строке и 79-ом столбце экрана + │ 1919-й байт │ - код символа в 23-й строке и 79-м столбце экрана └─────────────┘ - Приведем структуру Taблицы имен образов (PNT) для режима SCREEN 1 в со- ответствии с расположением символов на экране дисплея: + ┌─────────────┐ - │ 0-й байт │ - код символа в 0-ой строке и 0-ом столбце экрана + │ 0-й байт │ - код символа в 0-й строке и 0-м столбце экрана ├─────────────┤ - │ 1-й байт │ - код символа в 0-ой строке и 1-ом столбце экрана + │ 1-й байт │ - код символа в 0-й строке и 1-м столбце экрана ├─────────────┤ - │ ··· │ + │ ··· │ ··· ├─────────────┤ - │ 31-й байт │ - код символа в 0-ой строке и 31-ом столбце экрана + │ 31-й байт │ - код символа в 0-й строке и 31-м столбце экрана ├─────────────┤ - │ 32-й байт │ - код символа в 1-ой строке и 0-ом столбце экрана + │ 32-й байт │ - код символа в 1-й строке и 0-м столбце экрана ├─────────────┤ - │ ··· │ + │ ··· │ ··· ├─────────────┤ - │ 767-й байт │ - код символа в 23-ой строке и 31-ом столбце экрана + │ 767-й байт │ - код символа в 23-й строке и 31-м столбце экрана └─────────────┘ + Структуру Taблицы имен образов(PNT) для 40-символьного режима SCREEN 0 в соответствии с расположением символов на экране дисплея Вы теперь легко изобразите самостоятельно! + Информация о символах, имеющихся на клавиатуре компьютера, находится в ROM, начиная с адреса &H1BBF, и занимает 2 Кбайта памяти. При переходе в режимы SCREEN 0 или SCREEN 1 эта информация автоматически копируется в ви- деопамять, инициализируя тем самым Таблицу шаблонов образов (PGT). - Место в ROM и видеопамяти, предназначенное для записи о д н о г о сим- -вола, занимает в о с е м ь байтов. + + Адрес ячейки, начиная с которой хранится информация о символах, можно +узнать в системной области RAM. В ячейках &HF920 и &HF921 хранится адрес +(по умолчанию - &H1BBF),а в ячейке &HF91F - номер слота памяти, в которой +находятся шаблоны символов (о слотах см. в Приложении 1). Поэтому понятно, +что шаблоны символов для инициализации видеопамяти можно хранить как в +ROM, так и в RAM. + + Место в ROM, RAM и видеопамяти, предназначенное для записи о д н о г о +символа, занимает в о с е м ь байтов. + ┌──────────────────────────────────────────────────────────────┐ │ Адрес начала места, отведенного для символа в видеопамяти, │ │ можно определить обращением к функции BASE: │ - │ BASE(5*N+2)+K*8 │ + │ BASE(5*N+2)+K*8 , │ │ где: N - номер режима экрана (0 или 1); │ │ K - код ASCII символа. │ └──────────────────────────────────────────────────────────────┘ + Приведем пример "хранения" информации о символе в ROM и VRAM (справа для каждого байта выписан его шестнадцатеричный код, который и задает со- держимое данного байта): @@ -477,7 +473,6 @@ 7-й байт │ │ █ │ █ │ │ │ █ │ █ │ │ &H66 └───┴───┴───┴───┴───┴───┴───┴───┘ 8 4 2 1 8 4 2 1 - Расскажем Вам о том, как можно получить "содержимое" конкретного байта видеопамяти. Разобьем каждый байт на две половинки (два полубайта). Под рисунком для каждого полубайта изображено по 4 числа (каждое из них назо- @@ -486,7 +481,7 @@ D,E,F). Код байта получим, если справа от кода левого полубайта напишем код правого полубайта, а слева - символ "&H". В н и м а н и е! Только режим SCREEN 0, а в компьютере серии MSX-2 так- -же и режимы SCREEN 6 и SCREEN 7, поддерживают вывод символов размером 6╳8 +же и режимы SCREEN 6 и SCREEN 7, поддерживает вывод символов размером 6╳8 точек; остальные режимы используют размер 8╳8. Приведем пример вывода од- ного и того же символа в двух режимах: @@ -511,32 +506,43 @@ Важно отметить, что в языке MSX-BASIC есть возможность программным пу- тем создавать "собственные" символы (отличные от стандартных!). Взгляните -на приведенные ниже примеры. Код ASCII символа "у"┐ - +на приведенные ниже примеры. + Код ASCII символа "у"┐ П р и м е р 4. 5 SCREEN 0:WIDTH 40 ▼ ───────────── 10 FOR I=0 TO 7:READ M:VPOKE 2048+213*8+I,M:NEXT 20 DATA &H00,&H00,&H42,&H81,&H81,&H81,&H99,&H66 - Данные в операторе DATA опеределяют шестнадцатеричные коды каждого бай- та "нового" символа. Число 213 в операторе VPOKE означает, что "построен- ному" нами символу присваивается код ASCII, равный 213. Если раньше коду 213 соответствовал символ "у", то теперь это место занял символ, который мы "сконструировали". Поэтому в тех местах экрана дисплея, где встречался символ "у", Вы увидете новый символ. - - П р и м е р 5. 5 SCREEN 0:WIDTH 80 - ───────────── 10 FOR I=0 TO 7:READ M:VPOKE &h1000+213*8+I,M:NEXT + ∗ + П р и м е р 4 . 5 SCREEN 0:WIDTH 80 + ────────────── 10 FOR I=0 TO 7:READ M:VPOKE &h1000+213*8+I,M:NEXT 20 DATA &H00,&H00,&H42,&H81,&H81,&H81,&H99,&H66 + П р и м е р 5. Пример иллюстрирует возможность хранения шаблонов сим- + ───────────── волов в RAM. + 10 CLEAR 200,&HE800 'Место в RAM для шаблонов символов + 20 FOR T=0 TO 2047:POKE &HE800+T,PEEK(&H1BBF+T):NEXT + 30 FOR I=0 TO 7:READ M:POKE &HE800+213*8+I,M:NEXT + 40 DATA &H00,&H00,&H42,&h81,&H81,&H81,&H99,&H66 + 50 POKE &HF91F,&H8B 'Номер с л о т а памяти + 60 POKE &HF920,0:POKE &HF921,&HE8 'Начальный адрес ячеек памяти,в ко + торых располагаются шаблоны символов + 70 'А теперь посмотрим! + 80 SCREEN 0:WIDTH 80:PRINT CHR$(213):A$=INPUT$(1) + 90 SCREEN 0:WIDTH 40:PRINT CHR$(213):A$=INPUT$(1) + 100 SCREEN 1:PRINT CHR$(213):A$=INPUT$(1) + П р и м е р 6. 5 PRINT"Вводите последовательно байты шаблона символа:" ───────────── 10 FOR I=0 TO 7:INPUT T(I):NEXT 20 INPUT"Введите код изменяемого символа";K% 30 FOR I=0 TO 7:VPOKE 2048+K%*8+I,T(I):NEXT - Отметим, что вместо переменной K% можно использовать любое арифметичес- кое выражение, целая часть значения которого определяет код ASCII заменя- емого символа. А теперь взгляните на следующую программу! - П р и м е р 7. Изображение "псевдослучайных" символов. ───────────── 10 P=RND(-TIME):FOR I=0 TO 7:T(I)=INT(255*RND(1)):NEXT 20 K=INT(223*RND(1)+31) @@ -547,7 +553,6 @@ │ Таблица шаблонов образов (PGT) инициализируется вновь данными из ROM! │ └───────────────────────────────────────────────────────────────────────┘ Еще ряд примеров на изменение шаблонов символов: - П р и м е р 8 [76]. "Мелкие" и обычные буквы латинского алфавита. ────────────────── 40 SCREEN 0:KEY OFF @@ -588,7 +593,6 @@ 430 DATA 00,00,88,50,20,50,88,00:'X 440 DATA 00,00,88,50,20,20,20,00:'Y 450 DATA 00,00,F8,10,20,40,F8,00:'Z - П р и м е р 9. Автограф программиста! ───────────── 10 COLOR15,1,1:SCREEN 1 @@ -606,7 +610,6 @@ CHR$(43)+CHR$(44)+CHR$(45)+CHR$(46)+CHR$(47) 70 LOCATE 2,2:PRINTA$ 80 GOTO 80 - П р и м е р 10. "Изготовление" "т о л с т ы х" символов! ────────────── 5 SCREEN 1:A1=0:A2=255 ' Имеющийся шаблон символа сдвигается @@ -614,13 +617,10 @@ 20 D=VPEEK(X):VPOKE X,D OR D/2' "старым". 30 NEXT - Целью придумавших систему было, очевидно, скрыть, что в этих значках содержится ка- кой-то смысл. - Конан Дойль. Пляшущие человечки - - + А.Конан Дойль. Пляшущие человечки П р и м е р 11. Б е г у щ и й человечек. ────────────── 5 COLOR 15,1,1:CLS:INPUT"Укажите желаемую скорость движения человечка @@ -638,7 +638,6 @@ 166 IF Y=27 THEN Y=0 170 NEXT:Y=Y+1:A$=INKEY$:IF A$=" " THEN END 171 GOTO 150 '──▶ - Приведем шаблоны четырех символов из шести,сформированных в данной про- грамме: ┌───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┬───┬───┬───┐ @@ -681,7 +680,6 @@ из 32 байтов Таблицы CT действует на группу из 8 символов, причем за цвет и з о б р а ж е н и я данной группы "отвечает" старший полубайт, а млад- ший полубайт "отвечает" за цвет ф о н а символов. - Б а й т Т а б л и ц ы CT ┌──────────────────────────────────┬───────────────────────────┐ │ Цвет изображения восьми символов │ Цвет фона восьми символов │ @@ -708,11 +706,10 @@ 90 FOR K=1 TO 25:NEXT K 100 NEXT J 110 NEXT I - П р и м е р 14. Изменение цвета курсора (напомним Вам, что код ASCII ────────────── символа "█" равен 255). SCREEN 1:VPOKE &H201F,&HFF - Далее, команда VPOKE BASE(1*5+1)+255\8,&H28 задает цвет курсора и цвет, + Далее команда VPOKE BASE(1*5+1)+255\8,&H28 задает цвет курсора и цвет, которым через курсор "просвечивается" тот символ, на который курсор "нало- жен". Если оба этих цвета совпадают, то сам курсор и символ сливаются, со- здавая иллюзию непрозрачности курсора. @@ -720,7 +717,6 @@ │ Обратите внимание на тот факт, что Таблица CT в режиме SCREEN 1 │ │ инициализируется оператором COLOR . │ └───────────────────────────────────────────────────────────────────┘ - П р и м е р 15. Не поленитесь, наберите приведенную ниже программу. ────────────── Затем включите принтер, вставьте лист бумаги и запус- тите программу. Результаты ее работы пригодятся Вам в дальнейшем! @@ -785,16 +781,14 @@ ─────────────────────────────────┼─────────────────────────┤ 540 RETURN - XI.1.4. Р е ж и м ы SCREEN 2 и SCREEN 4 + XI.1.4. Р е ж и м ы SCREEN 2 и SCREEN 4 Есть медленно и умеренно, не пить во время еды, тщательно разжевывать пищу и с легко- стью вставать из-за стола с чувством, что мог бы съесть еще. Ж.Фрумузак - - Разделим экран (размером 256╳192 точек) на к в а д р а т ы размером по 8╳8 точек. Легко подсчитать, что мы получим 768 таких квадратов.Каждый из них имеет свой номер, который хранится в Таблице PNT. А так как макси- @@ -807,13 +801,17 @@ ┌───────────────────────────────────────────────────────────────────┐ │ Адрес байта PNT, отвечающего за к в а д р а т с номером n2, │ │ вычисляется при помощи арифметического выражения: │ - │ BASE(5·N) + 256·n1 + n2 │ + │ BASE(5·N) + 256·n1 + n2 , │ │ где: N - номер режима SCREEN (2 или 4); │ │ n1 - номер трети таблицы PNT, в которой находится квадрат; │ │ n2 - номер квадрата. │ └───────────────────────────────────────────────────────────────────┘ Соответственно Таблице PNT, весь экран также разбивается на три области (каждая размером 256╳64 точек), которые мы будем называть о к н а м и. + + + + ┌───┬───┬─────────────────────┬───┐ │ 0 │ 1 │··· ···│ 31│ ├───┴───┘ └───┤ @@ -833,17 +831,17 @@ ├───┬───┐ ┌───┤ │224│225│··· ···│255│ └───┴───┴─────────────────────┴───┘ - Если мы захотим изменить "что-нибудь" в Таблице PNT, это немедленно ска- + Если мы захотим что-то изменить в Таблице PNT, то это немедленно ска- жется на изображении в соответствующем окне. - Таблица PNT редко используется при составлении программ. Более того,мож- -но рассматривать структуру экрана, "забыв" о делении экрана на окна. Доста- -точно при этом мысленно пронумеровать квадраты экрана от 0 до 767. + Таблица PNT редко используется при составлении программ. Более того, +можно рассматривать структуру экрана, "забыв" о делении экрана на окна. +Достаточно при этом мысленно пронумеровать квадраты экрана от 0 до 767. + Покажем, как можно использовать Таблицу PNT для копирования изображения в пределах о д н о г о экранного окна. Пусть, например, Вам нужно скопи- ровать изображение из квадрата с номером A в квадрат с номером B.Для этого в байт Таблицы PNT, отвечающий за квадрат с номером B, поместите номер ква- драта A. Этого достаточно для того, чтобы произошел процесс копирования! - П р и м е р 1. ───────────── 10 COLOR 1,15:SCREEN 2 @@ -851,18 +849,19 @@ 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-м квадрате + 50 GOTO 50 'в 40-м квадратах + Если же Вы захотите скопировать какой-либо элемент в другое о к н о экрана, то Вам поможет работа с Таблицами PGT и CT,к рассмотрению которых мы и переходим. @@ -870,10 +869,11 @@ будем называть л и н и я м и . Информация о каждой линии (1 байт) содержится в Таблице PGT. Следовательно, объем этой Таблицы равен 768╳8 = 6144 байтам. + ┌───────────────────────────────────────────────────────────┐ │ Адрес байта Таблицы PGT, отвечающего за расположение │ │ л и н и и вычисляется при помощи арифметического │ - │ выражения BASE(5·N+2) + (256·n1+n2)·8 + k │ + │ выражения BASE(5·N+2) + (256·n1+n2)·8 + k , │ │ где: N - номер режима SCREEN; │ │ n1 - номер окна; │ │ n2 - номер квадрата в этом окне; │ @@ -882,7 +882,6 @@ Отметим, что если в Таблице PNT были изменения, то могут возникнуть за- труднения при попытке "нарисовать" что-либо в квадрате с измененным номе- ром. - П р и м е р 3. ───────────── 10 COLOR 1,15:SCREEN 2 @@ -890,6 +889,7 @@ 30 A$=INPUT$(1) 'Ждем нажатия клавиши! 40 LINE(64,8)-(71,15),,BF 'Попытка вывести изображение в квадрате 50 GOTO 50 '40 не привела к ожидаемому результату! + Так как информация о линии хранится в одном байте, то каждой точке ли- нии соответствует определенный бит этого байта. Оказывается, что "высве- тить точку на экране" - это значит установить нужный бит в 1,"стереть точ- @@ -923,20 +923,20 @@ ┌─────────────────────────────────────────────────────────────┐ │ одновременно на экране может быть не б о л е е 16 цветов │. └─────────────────────────────────────────────────────────────┘ -┌───────────────────────────────────────────────────────────────────────┐ -│Вследствие этого,изменение цвета одной точки приводит к переопределению│ -│ цвета и з о б р а ж е н и я в с е й линии! │ -└───────────────────────────────────────────────────────────────────────┘ + ┌──────────────────────────────────────────────────────────────────┐ + │ Вследствие этого изменение цвета одной точки приводит к │ + │ переопределению цвета и з о б р а ж е н и я в с е й линии! │ + └──────────────────────────────────────────────────────────────────┘ + ┌───────────────────────────────────────────────────────────┐ │ Адрес байта Таблицы CT, отвечающего за ц в е т линии, │ │ вычисляется при помощи арифметического выражения: │ - │ BASE(5·N+1) + (256·n1+n2)·8 + k │ + │ 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. @@ -947,7 +947,6 @@ 50 VPOKE A,&H3F 60 GOTO 60 А теперь - давно обещанный Вам пример... - П р и м е р 5. Копирование содержимого 0-го квадрата из 0-го окна в ────────────── содержимое 0-го квадрата 2-го окна 10 COLOR 15,1,1:SCREEN2 @@ -956,10 +955,9 @@ 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 @@ -987,6 +985,7 @@ вечающего за данную точку ("т о ч н а я настройка"). Трудность состоит в несоответствии номеров битов в байте и значений Х-координат тех точек, за которые этот байт отвечает: + ┌────────────┬───┬───┬───┬───┬───┬───┬───┬───┐ │ Х MOD 8 │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ ├────────────┼───┼───┼───┼───┼───┼───┼───┼───┤ @@ -1003,14 +1002,12 @@ └───────────────────────────────────────────┘ И...точка появится в требуемом месте экрана. 4. Наконец, изменим цвет изображения выведенной точки: - ┌────────────────────────────────┐ - │ А д р е с = А д р е с + &h2000 │ - └────────────────────────────────┘ ┌────────────────────────────────────────────────────┐ + │ А д р е с = А д р е с + &h2000 │ + │ │ │ VPOKE А д р е с, VPEEK(А д р е с) MOD 16 + COL*16 │ , └────────────────────────────────────────────────────┘ где COL - номер цвета. - Опишем алгоритм работы видеопроцессора при выводе содержимого квадрата 8╳8 на графические экраны SCREEN 2 или SCREEN 4. Предположим, что нам известно местоположение данного квадрата на экра- @@ -1045,16 +1042,14 @@ │ "Запишем" информацию о цвете в Таблицу 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) будет раскрашен в нужные │ -│ Вам цвета │ +│ в результате квадрат (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 не изменялась) + вает" байт номер 69 в окне 1 Таблицы PNT и находит значение N (N=69, + если Таблица PNT не изменялась) 30 FOR I=0 TO 7 40 VPOKE(&H800+N*8+I),&B11100011'Таблица PGT разделена на три окна,каж дое из которых содержит по 2048 байтов. Следовательно, окно 1 этой Таб @@ -1068,8 +1063,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 'Формируем "содерж - имое" квадрата + 40 VPOKE(BASE(5*2+2)+(Y\8)*2048+A*8+I),&b11100011 + 'Формируем "содержимое" квадрата 50 NEXT 60 GOTO 60 @@ -1078,8 +1073,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 'Формируем "содерж - имое" квадрата + 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 ' "Раскрасим" квадрат @@ -1090,7 +1085,6 @@ (X,Y), в которой Х изменяется от 0 до 255, а Y от 0 до 191. Следующий при- мер иллюстрирует, как эта система координат соотносится с делением экрана на квадраты. - П р и м е р 10. ────────────── 10 SCREEN 2:X=100:Y=75 @@ -1108,6 +1102,7 @@ 110 GOTO 110 Сначала будет нарисована белая точка на черном фоне. Когда Вы нажмете любую клавишу, эта точка приобретет красный цвет. + При программировании на MSX-BASIC этот способ формирования изображения применяется редко. Однако, если Вы хотите нарисовать что-либо с помощью программы на м а ш и н н о м я з ы к е, то приведенный выше алгоритм @@ -1157,7 +1152,6 @@ мен значений между ячейками видеопамяти! 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) @@ -1173,6 +1167,7 @@ *2+2)+6144+I):NEXT 90 A$=INPUT$(1) 'Программа работает ≈ 5 минут + XI.1.5. Р е ж и м SCREEN 3 Как и в режиме SCREEN 2, экран в режиме SCREEN 3 разбит на к в а д р а- @@ -1180,7 +1175,6 @@ л и н и и толщиной четыре точки (на экране расположено 32╳48 "толстых" линий). Каждая из этих "толстых" линий разбита на две "большие" точки (4╳4 "маленьких" точек). - ──▲──┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ │ │ │ │ │ │ │ │ │ │████│◀── "Маленькая" │ │────│────│────│────│ │────│────│────│────│ точка @@ -1201,14 +1195,12 @@ ├────┴────┴────┴────┘ └────┴────┴────┴────┤ │◀─────────────"Длина" линии ─────────────▶│ - Каждая из "больших" точек может быть раскрашена только в о д и н цвет. Попытка расположить в "большой" точке "маленькую" точку другого цвета при- ведет к и з м е н е н и ю цвета в с е й "большой" точки. Информация о цвете "толстой" линии находится в Таблице PGT, причем ле- вый полубайт байта PGT кодирует цвет левой "большой" точки "толстой" ли- нии, а правый полубайт отвечает за цвет правой "большой" точки. - Б а й т PGT ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ 1 │ 0 │ 0 │ 0 │ 1 │ 0 │ 1 │ 0 │ @@ -1216,12 +1208,10 @@ └──────▲──────┘ └──────▲──────┘ │ │ Цвет левой "большой" точки Цвет правой "большой" точки - ┌─────────────────────────────────────────────────────────────┐ │ Поскольку один байт Таблицы 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)) @@ -1244,7 +1234,7 @@ ├────┼────┼────┼─────┼────┤ 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│ Выполнив эту программу Вы можете + │ 5 │ 13 │ 21 │ ... │ 253│ Выполнив эту программу, Вы сможете ├────┼────┼────┼─────┼────┤ убедиться в правильности заполнения дан- │ 6 │ 14 │ 22 │ ··· │ 254│ ной таблички. ├────┼────┼────┼─────┼────┤ @@ -1267,7 +1257,6 @@ ┌──┬──┬──┬─▼┬──┬──┬──┬──┐ │ 1│ 0│ 0│ 0│ 0│ 0│ 1│ 0│ └──┴──┴──┴──┴──┴──┴──┴──┘ - Байт из Таблицы PGT (в нем хранится цвет "толстой" линии с номером 1302) Приведем таблицу, по которой можно определить адрес байта Таблицы PGT, отвечающего за точку (X,Y), в режимах 2÷4 : @@ -1278,10 +1267,8 @@ ├──────────────┼────────────────────────────────────────────┤ │ 3 │ BASE(5*3+2)+(Х\8)*8+(Y\32)*256+(Y\4) MOD 8 │ └──────────────┴────────────────────────────────────────────┘ - П р и м е р 1. Заполнение экрана черными и белыми клетками в шахматном ───────────── порядке. - 10 'Шахматная доска 20 COLOR 15,1,1:CLS:SCREEN 3 50 FOR I=0 TO 7 STEP 2 60 VPOKE I,&HF1:VPOKE I+1,&H1F @@ -1291,26 +1278,34 @@ 100 NEXT 110 GOTO 110 - Таблица PGT разбита на 192 "кусочка" размером по 8 байт. Каждый "кусо- -чек" отвечает за 4 квадрата размером 2╳2 "больших" точки (такой квадрат -называется и м е н е м). Упомянутые 4 имени имеют один и тот же номер, + Таблица 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). + + ┌─────────────────────────────────────────────────────────────┐ + │ Следовательно, весь экран разбит на ч е т ы р е о к н а │ + └─────────────────────────────────────────────────────────────┘ +(понятие экранного окна см. в описании режима 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 ├────┼────┼────┼─────┼────┤ + N │ │ │ │ │ │ ├────┼────┼────┼─────┼────┤ ─┐ │ 0 │ 8 │ 16 │ ··· │ 248│ │ ├────┼────┼────┼─────┼────┤ ├─ Имя с номером N для окна 0 @@ -1340,8 +1335,8 @@ └────┴────┴────┴─────┴──▲─┘ ─┘ └─ Имя с номером 191 - Приведем структуру PNT с номерами имен и их расположением на экране: + Приведем структуру PNT с номерами имен и их расположением на экране: 0 1 2 3 . . . 31 ◀─ Номер столбца ┌───┬───┬───┬───┬───┬───┬───┬────┐ 0 │ 0 │ 1 │ 2 │ 3 │...│...│...│ 31 │ Окно 0: строки 0,4, 8,12,16,20 @@ -1363,14 +1358,12 @@ 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 │ + │ BASE(5*3+0)+(Y╲4)*32+X . │ + │ Это имя находится в окне с номером Y MOD 4 . │ └─────────────────────────────────────────────────────────────────┘ - П р и м е р 2. ───────────── 10 COLOR 15,1,1:CLS:SCREEN 3 @@ -1399,6 +1392,8 @@ Вначале приведем важную табличку, которая поможет Вам определить адрес байта Таблицы PNT, отвечающего за точку с координатами (X,Y), в различных режимах SCREEN: + + ┌────────────┬──────────────────────────────┐ │Режим экрана│ А д р е с б а й т а в PNT │ ├────────────┼──────────────────────────────┤ @@ -1408,8 +1403,8 @@ │ SCREEN 8 │ BASE(5*8)+(256/1)*Y+(X\1) │ └────────────┴──────────────────────────────┘ - 1. В режиме SCREEN 5 экран разделен на 212 строк, состоящих из 256 то- -чек каждая, или на 192 строки, состоящих из 256 точек каждая. + 1. В режиме SCREEN 5 экран разделен на 212 строк (или на 192 строки), +состоящих из 256 точек каждая. Совокупность двух точек по горизонтали будем называть л и н и е й (точ- ки 0 и 1 образуют 1-ю линию , точки 2 и 3 - 2-ю линию ,..., точки 254 и 255 - 128-ю линию). @@ -1420,7 +1415,6 @@ Первый байт Таблицы PNT "хранит" информацию о цвете первой линии пер- вой строки экрана, второй байт - о цвете второй линии той же строки,и так далее: - 1-й байт Таблицы PNT 2-й байт Таблицы PNT ┌─────────────────┬─────────────────┐┌─────────────────┬─────────────────┐ │ Цвет 1-й точки │ Цвет 2-й точки ││ Цвет 1-й точки │ Цвет 2-й точки │ @@ -1430,7 +1424,6 @@ │ Таблица PNT инициализируется цветом фона, который │ │ устанавливается оператором COLOR │ └────────────────────────────────────────────────────────┘ - П р и м е р 1. Изобразим в режиме SCREEN 5 точку с координатами (X,Y) ────────────── белым цветом. 10 COLOR 15,4,7:INPUT"X,Y";X,Y @@ -1439,12 +1432,9 @@ ▼▼ 40 IF XMOD2=0 THEN C=&HF4 ELSE C=&H4F'Если не будет этого условия, то изобразятся д в е соседние точки - 50 VPOKE AD,C 'Вы легко можете убедиться,что этот оператор эквивален - тен оператору PSET(X,Y),15. + 50 VPOKE AD,C ' Этот оператор эквивалентен оператору PSET(X,Y),15. 60 GOTO 60 - Приведем схематическое изображение PNT для режима SCREEN 5. - ┌──────────────┐ │ 0-й байт │- отвечает за точки с координатами (0,0) и (1,0) ├──────────────┤ @@ -1463,20 +1453,19 @@ │ 27135-й байт │- отвечает за точки с координатами (254,211) и (255,211) └──────────────┘ - 2. В режиме SCREEN 6 экран имеет 212 строк из 512 точек или 192 строки -по 512 точек в каждой строке. Количество байтов в Таблице PNT точно такое -же, как и в Таблице PNT режима SCREEN 5: информация об одной строке экра- -на кодируется в 128 байтах. + 2. В режиме SCREEN 6 экран имеет 212 строк (или 192 строки) по 512 то- +чек в каждой строке. Количество байтов в Таблице PNT точно такое же,как и +в Таблице PNT режима SCREEN 5: информация об одной строке экрана кодирует- +ся в 128 байтах. Л и н и я в режиме SCREEN 6 состоит из четырех точек и кодируется в о д н о м байте. А тогда п а л и т р а каждой точки кодируется в двух битах, а так как из двух двоичных цифр можно составить только четыре ком- -бинации (00,01,10,11), то каждую точку экрана можно раскрасить не более, +бинации (00,01,10,11), то каждую точку экрана можно раскрасить не более чем ч е т ы р ь м я различными способами. Так, например, оператор VPOKE 0,&B11100100 присваивает палитру 3 первой точке первой линии, палитру 2 - второй точке первой линии, палитру 1 - третьей точке первой линии и палитру 0 - четвер- той точке первой линии. - Б а й т Т а б л и ц ы PNT ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ 1 │ 1 │ 1 │ 0 │ 0 │ 1 │ 0 │ 0 │ @@ -1486,53 +1475,50 @@ Палитра Палитра Палитра Палитра первой второй третьей четвертой точки точки точки точки - ┌──────────────────────────────────────────────────────┐ │ Таблица PNT инициализируется последними двумя │ - │ битами цвета фона, задаваемого в операторе COLOR │ + │ битами цвета фона, задаваемого в операторе COLOR. │ └──────────────────────────────────────────────────────┘ Поясним сказанное примером. Если цвет фона имеет номер 13=&B1101, то в каждый байт Таблицы PNT будет занесено число &B01010101 (четыре раза пов- торяются последние два бита кода цвета фона). Приведем схематическое изображение PNT для режима SCREEN 6. ┌─────────┬─────────┬─────────┬─────────┐ - │ (0,0) │ (1,0) │ (2,0) │ (3,0) │ 0-й байт + 0-й байт │ (0,0) │ (1,0) │ (2,0) │ (3,0) │ ├─────────┼─────────┼─────────┼─────────┤ - │ (4,0) │ (5,0) │ (6,0) │ (7,0) │ 1-й байт + 1-й байт │ (4,0) │ (5,0) │ (6,0) │ (7,0) │ ├─────────┼─────────┼─────────┼─────────┤ - │ ··· │ ··· │ ··· │ ··· │ ··· + ··· │ ··· │ ··· │ ··· │ ··· │ ├─────────┼─────────┼─────────┼─────────┤ - │ (508,0) │ (509,0) │ (510,0) │ (511,0) │ 127-й байт + 127-й байт │ (508,0) │ (509,0) │ (510,0) │ (511,0) │ ├─────────┼─────────┼─────────┼─────────┤ - │ (0,1) │ (1,1) │ (2,1) │ (3,1) │ 128-й байт + 128-й байт │ (0,1) │ (1,1) │ (2,1) │ (3,1) │ ├─────────┼─────────┼─────────┼─────────┤ - │ ··· │ ··· │ ··· │ ··· │ ··· + ··· │ ··· │ ··· │ ··· │ ··· │ ├─────────┼─────────┼─────────┼─────────┤ - │(508,211)│(509,211)│(510,211)│(511,211)│ 27135-й байт + 27135-й байт │(508,211)│(509,211)│(510,211)│(511,211)│ └─────────┴─────────┴─────────┴─────────┘ - 3. Как и в режиме SCREEN 6,в режиме SCREEN 7 на экране расположено 212 -строк, состоящих из 512 точек каждая, или 512 строк, состоящих из 192 -строк каждая. Однако, один байт Таблицы PNT кодирует л и н и ю, состоя- -щую из д в у х точек: старшие четыре бита определяют палитру левой точ- -ки, младшие четыре - палитру правой точки. - + 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 Кбайт! +должна иметь объем не менее 128 Кбайтов! Режим SCREEN 7 аналогичен режиму SCREEN 5, за исключением того, что в режиме SCREEN 7 в строке экрана в два раза б о л ь ш е точек. ┌────────────────────────────────────────────────────────┐ │ Таблица PNT инициализируется цветом фона, который │ - │ устанавливает оператор COLOR │ + │ устанавливает оператор COLOR . │ └────────────────────────────────────────────────────────┘ Приведем схематическое изображение PNT для режима SCREEN 7. ┌──────────────┐ @@ -1558,10 +1544,10 @@ Л и н и я состоит из одной-единственной точки. Цвет линии здесь уже определяется не кодом палитры, а непосредственным заданием "смеси" основ- ных цветов. Этот оригинальный способ кодирования цвета требует по одному -б а й т у (!) на линию, а, значит, на точку! Поэтому Таблица PNT имеет +б а й т у (!) на линию, а значит, на точку! Поэтому Таблица PNT имеет объем 212·256=54272 байта. Уже отсюда становится понятно, что для использования этого режима VRAM -должна иметь объем не менее 128 Кбайт! +должна иметь объем не менее 128 Кбайтов! Информация о линии с координатами (X,Y) находится по адресу X+256·Y в Таблице PNT. Для высвечивания этой линии достаточно занести по этому ад- @@ -1573,7 +1559,6 @@ зеленого ("Green"), красного ("Red") и синего ("Blue") цветов соответст- венно. Например, цвету с номером 187=&b10111011 соответствует следующее "содержимое" байта Таблицы PNT: - Б а й т Т а б л и ц ы PNT ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ 1 │ 0 │ 1 │ 1 │ 1 │ 0 │ 1 │ 1 │ @@ -1583,6 +1568,7 @@ зеленого красного синего цвета цвета цвета + ┌────────────────────────────────────────────────────────┐ │ При инициализации байты Таблицы PNT получают номер │ │ цвета фона (который изменяется в пределах от 0 до 255).│ @@ -1606,9 +1592,10 @@ │ 54271-й байт │- отвечает за точку с координатами (256,211) └──────────────┘ + XI.1.7. Т а б л и ц а п а л и т р (д л я к о м п ь ю т е р о в MSX-2) - Независимо от режима SCREEN, Таблица PT занимает в видеопамяти объем + Независимо от режима SCREEN Таблица PT занимает в видеопамяти объем 32 байта. "Местоположение" этой Таблицы зависит от режима SCREEN. ┌────────────────────────┬──────────┬─────────────────────────┐ │ Р е ж и м │ А д р е с│ К о м м е н т а р и й │ @@ -1627,7 +1614,7 @@ Каждая из палитр закодирована в д в у х байтах. ┌──────────────────────────────────────────────────────────────────────┐ │ Адрес AD первого байта палитры N в Таблице PT вычисляется по формуле:│ - │ AD=A0+2·N │ + │ AD=A0+2·N , │ │ где А0-адрес начала Таблицы PT (например,в режиме SCREEN 1 Таблица PT│ │ начинается по адресу &h2020). │ └──────────────────────────────────────────────────────────────────────┘ @@ -1636,6 +1623,12 @@ 0÷2 - пропорцию с и н е г о цвета. Байт Таблицы PT с адресом AD+1 опре- деляет пропорцию зеленого цвета, закодированную в битах 0÷2 : + + + + + + 7 6 5 4 3 2 1 0 ◀── Номера битов ┌───┬───┬───┬───┬───┬───┬───┬───┐ AD │ │ ∗ │ ∗ │ ∗ │ │ ∗ │ ∗ │ ∗ │◀──────┐ @@ -1648,7 +1641,6 @@ └───┴───┴───┴───┴───┴───┴───┴───┘ └─────▲─────┘ └── Зеленый цвет ("Green") - П р и м е р 2. "Чтение" Таблицы палитр в режиме SCREEN 1. Выполнив ────────────── программу, Вы узнаете, каким образом оператор SCREEN инициализирует Таблицу PT. @@ -1663,7 +1655,6 @@ Отметим, что оператор COLOR=(···) переопределяет байты Таблицы PT в со- ответствии с указанной палитрой. - П р и м е р 3. Изменим Таблицу PT и вновь "прочитаем" ее. ───────────── 10 COLOR 1,15,7:SCREEN 1 @@ -1678,14 +1669,13 @@ меняется и цвет бордюра! Разумеется, палитры в Таблице PT могут быть изменены и операторами -VPOKE. Однако, следует отметить, что изменение Таблицы PT операторами +VPOKE. Однако следует отметить, что изменение Таблицы PT операторами VPOKE само по себе не приводит к изменению цветов. Для считывания содержи- мого Таблицы PT и присвоения цвета новой палитре существует специальный оператор. Его синтаксис предельно прост: ┌─────────────────┐ │ COLOR = RESTORE │ . └─────────────────┘ - П р и м е р 4. ───────────── 10 COLOR 1,15,7:SCREEN 1 @@ -1708,7 +1698,6 @@ Вопрос в том, кто за это отвечает? Шалтай-Болтай - XI.1.8. С п р а й т ы Видеопроцессор имеет д в а режима отображения спрайтов. Режим отобра- @@ -1720,7 +1709,7 @@ Если же в Вашей программе присутствует один из операторов: SCREEN 4,SCREEN 5,SCREEN 6,SCREEN 7,SCREEN 8, то Вы находитесь в р е ж и м е с п р а й т о в 2. - Вкратце напомним уже известные нам результаты. + Вкратце напомним уже известные Вам результаты. В р е ж и м е с п р а й т о в 1 на экран одновременно можно вывес- ти 32 спрайта с номерами от 0 до 31. Спрайты с м е н ь ш и м и номерами имеют более высокий приоритет. На одной горизонтальной линии экрана разме- @@ -1734,11 +1723,12 @@ Кроме того, если на одной горизонтальной линии находятся п я т ь или более спрайтов, то 6-й бит регистра состояния будет установлен в 1,а пять младших битов зафиксируют номер пятого спрайта. + В р е ж и м е с п р а й т o в 2 на экран одновременно можно вывес- ти 32 спрайта, пронумерованных от 0 до 31. Спрайты с м е н ь ш и м и но- мерами имеют более высокий приоритет.На одной горизонтальной линии экрана изображается до в о с ь м и спрайтoв с высшим приоритетoм, а в перекры- -вающийся части спрайты с меньшим приоритетом не видны. +вающейся части спрайты с меньшим приоритетом не видны. Столкновение д в у х спрайтов обнаруживается по состоянию 5-го бита регистра состояния с номером 0 (он устанавливается в 1). Интересно отме- тить, что в этом случае координаты столкновения фиксируются в регистрах @@ -1747,21 +1737,19 @@ или более спрайтов, то 6-й бит регистра состояния с номером 0 будет уста- новлен в 1, а 5 младших битов этого регистра зафиксируют номер девятого спрайта. + В режимах SCREEN 1 ÷ SCREEN 3 спрайты задаются при помощи двух Таблиц: 1) Таблицы ш а б л о н о в спрайтов (SGT); 2) Таблицы а т р и б у т о в спрайтов (SAT); В режимах SCREEN 4 ÷ SCREEN 8 дополнительно используется еще и 3) Таблица ц в е т о в спрайтов (SCT). - В этом разделе мы расскажем Вам о каждой Таблице. - - Ш а б л о н (от нем. Schablone-образец, модель), + Ш а б л о н (от нем. Schablone-образец, модель)- пластина с вырезами, очертания которых соответ- ствуют контуру чертежа, изделия и т.п. Советский Энциклопедический Словарь - 1. Таблица SGT содержит образы спрайтов (которые ниже мы будем назы- вать ш а б л о н а м и), установленные оператором SPRITE$(N)= с т р о к о в о е в ы р а ж е н и е @@ -1771,7 +1759,7 @@ руют всю видеопамять. 2048 байтов Таблицы SGT позволяют хранить информацию о 256 шаблонах спрайтов, если в т о р ы м параметром в операторе SCREEN является 0 или -1, и информацию о 64-х шаблонах, если этот параметр равен 2 или 3. +1, и информацию о 64 шаблонах, если этот параметр равен 2 или 3. Адрес шаблона спрайта в Таблице SGT, созданного при помощи оператора SPRITE$(N)=···, вычисляется по формуле: ┌───────────────────────────────────┐ @@ -1780,18 +1768,19 @@ │ где А0 - адрес начала Таблицы SGT│ . └───────────────────────────────────┘ Напомним Вам,что начальный адрес Таблицы SGT для разных режимов SCREEN -возвращает функция BASE(): BASE(M*5+4) +возвращает функция BASE(): BASE(M*5+4) , где M - номер режима SCREEN. ┌──────────────────────────────────────────────────────────────┐ - │ Байты шаблона записаны в Таблице SGT в том же порядке, как │ + │ Байты шаблона записаны в Таблице 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) + ───▲── + П р и м е р 1. └─ BASE(1*5+4) + ────────────── 10 SCREEN 1,0 20 A$="Microsoft" 8 байтов 8 байтов 8 байтов 30 FORI=1TOLEN(A$):┌────────────────┬────────────────┬────────────────┐ @@ -1802,14 +1791,15 @@ 70 PRINT SPRITE$(2) BASE(1*5+4)+8*2 - Атрибут (от лат. Attribuo - придаю, наделяю), необходимое,сущест- - венное, неотъемлемое свойство объекта. - Советский Энциклопедический Словарь + Атрибут (от лат. Attribuo - придаю, наделяю) - + необходимое, существенное, неотъемлемое свойст- + во объекта. + Советский Энциклопедический Словарь 2. В 128 байтах Таблицы атрибутов спрайтов (Таблицы SAT) кодируется ин- формация о с п о с о б е вывода образов (шаблонов) спрайтов на экран.По- -скольку одновременно на экране могут отображаться не более 32 спрайтов,то +скольку одновременно на экране может отображаться не более 32 спрайтов,то атрибуты одного спрайта кодируются в 128/32 = 4 байтах. Вероятно, Вас заинтересует их содержимое? Поспешим удовлетворить Ваше любопытство: @@ -1818,8 +1808,10 @@ │ Первый байт │ Второй байт │ Третий байт │ Четвертый байт│ └──────▲───────┴───────▲──────┴───────▲──────┴────────▲──────┘ │ │ │ │ - Координата Y Координата X Номер шаблона Номер - (0÷255) (0÷255) в SGT (0÷255) палитры + Координата Y Координата X Номер шаблона Номер палитры (для режимов + (0÷255) (0÷255) в SGT (0÷255) SCREEN 1 ÷ SCREEN 3) + Цвет изображения (для режи- + мов SCREEN 4 ÷ SCREEN 8) Отметим, что если величина Y-координаты спрайта равна 216,то все спрай- ты с меньшим приоритетом не будут отображаться. Например, если Y-координа- @@ -1828,24 +1820,20 @@ Если размер спрайта - 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 для какого-нибудь вы- -бранного спрайта. - + Рассмотрим подробнее содержимое ч е т в е р т о г о байта Таблицы +SAT для какого-нибудь выбранного спрайта. ┌───┬───┬───┬───┬───┬───┬───┬───┐ Старший бит│ │ 0 │ 0 │ 0 │ Цвет спрайта │ Младший бит └─▲─┴───┴───┴───┴───┴───┴───┴───┘ @@ -1857,7 +1845,6 @@ Старший бит этого байта называется с и н х р о н и з и р у ю щ и м. Если его значение равно 1 , то положение спрайта смещается в л е в о на 32 точки. - П р и м е р 3. "Работа" синхронизирующего бита. ───────────── 20 COLOR 1,15,15 @@ -1872,21 +1859,18 @@ 80 A$=INPUT$(1) 90 VPOKE 6915,&B00001000 100 END - Разумеется, при программировании на языке MSX-BASIC лучше использовать оператор PUT SPRITE, а не последовательность операторов VPOKE. ┌──────────────────────────────────────────────────────────────┐ - │ Однако, последовательность операторов VPOKE гораздо проще │ + │ Однако последовательность операторов VPOKE гораздо проще │ │ моделировать на м а ш и н н о м я з ы к е, чем оператор │ │ PUT SPRITE │ └──────────────────────────────────────────────────────────────┘ Более того,знание структуры Таблицы SAT позволяет "прочитать" атрибуты спрайта непосредственно из п а м я т и ! - П р и м е р 4. Превращение белого спрайта в черный и наоборот. ───────────── - 10 COLOR 1,4,8:SCREEN 1,1 - 20 SPRITE$(0)=STRING$(8,255) + 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 @@ -1894,8 +1878,6 @@ 110 RETURN ──────────▲───────── │ &b00001111 XOR &b00001110 = &b00000001 ──▶ цвет 1 - - Оператор SCREEN инициализирует четыре байта Таблицы SAT, кодирующих ат- рибуты одного спрайта, следующим образом: ┌──────────────┬──────────────┬──────────────┬───────────────┐ @@ -1904,7 +1886,6 @@ │ │ │ │ Координата Y Координата X Номер шаблона Текущий цвет в Таблице SGT изображения - К о о р д и н а т а Y отображения спрайта по умолчанию приведена в следующей табличке (из нее видно, что при таких Y неважно, каково Х): ┌──────────────────┬─────┬─────┐ @@ -1926,23 +1907,18 @@ номером N равна 209 (в режимах SCREEN 1,SCREEN 2,SCREEN 3) или 217 (в ре- жимах SCREEN 4,SCREEN 5,SCREEN 6,SCREEN 7,SCREEN 8),то этот спрайт не ото- бражается на экране. Самое интересное заключается в том, что не отобража- -ются и все остальные спрайты с номерами, большими, чем N. - +ются и все остальные спрайты с номерами, большими чем N. П р и м е р 5. ───────────── - 10 DIM X(3):SCREEN 2,0 - 20 A$="ЧЧЧЧЧЧЧЧ":Y=0 + 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 - 50 PUT SPRITE 3,(X(3),Y),15,3 + 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 │. └───────────────────────────────────────────────────────────────┘ @@ -1959,54 +1935,48 @@ ┌────────────────────────────────────────────────────────────┐ │ Адрес байта, начиная с которого располагается информация о │ │ ц в е т е спрайта в Таблице SCT, вычисляется по формуле: │ - │ AD = A0 + 16·SN │ + │ 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-ти с т а р ш и х полубайтов... +отводятся т о л ь к о 16 младших полубайтов 16 байтов SCT,отводимых для +одного шаблона. + Опишем содержимое оставшихся 16 с т а р ш и х полубайтов... Оказывается с их помощью можно разрешить или запретить приоритеты спрай- тов, обработать определенным образом столкновения и задать или отменить так называемое "опережение" для спрайта. - Изобразим схематически Таблицу SCT... - - Н о м е р а б и т о в - ┌────┬────┬────┬────┬───┬───┬───┬───┐ - │ 7 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │ 0 │ - ├────┼────────────┼───┴───┴───┴───┤ - 0 байт│ │ │ │ 0 │ Код цвета │ Спр.лин. 1 для спрайта 0 - ├────┼────┼────┼────┼───────────────┤ - 1 байт│ │ │ │ 0 │ Код цвета │ Спр.лин. 2 для спрайта 0 - ├────┴────┴────┴────┴───────────────┤ + ┌───┬───┬───┬───┬───┬───┬───┬───┐ + │ 7 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │ 0 │ Н о м е р а б и т о в + ├───┼─────────┼───┴───┴───┴───┤ + 0-й байт│ │ │ │ 0 │ Код цвета │ Спр.линия 1 для спрайта 0 + ├───┼───┼───┼───┼───────────────┤ + 1-й байт│ │ │ │ 0 │ Код цвета │ Спр.линия 2 для спрайта 0 + ├───┴───┴───┴───┴───────────────┤ ··· │ ··· ··· │ ··· - ├────┬────┬────┬────┬───────────────┤ - 15 байт│ │ │ │ 0 │ Код цвета │ Спр.лин. 16 для спрайта 0 - ├────┴────┴────┴────┼───────────────┤ + ├───┬───┬───┬───┬───────────────┤ + 15-й байт│ │ │ │ 0 │ Код цвета │ Спр.линия 16 для спрайта 0 + ├───┴───┴───┴───┼───────────────┤ │ ··· │ ··· │ - ├────┬────┬────┬────┼───────────────┤ - 496 байт│ │ │ │ 0 │ Код цвета │ Спр.лин. 1 для спрайта 31 - ├────┼────┼────┼────┼───────────────┤ - 497 байт│ │ │ │ 0 │ Код цвета │ Спр.лин. 2 для спрайта 31 - ├────┴────┴────┴────┼───────────────┤ + ├───┬───┬───┬───┼───────────────┤ + 496-й байт│ │ │ │ 0 │ Код цвета │ Спр.линия 1 для спрайта 31 + ├───┼───┼───┼───┼───────────────┤ + 497-й байт│ │ │ │ 0 │ Код цвета │ Спр.линия 2 для спрайта 31 + ├───┴───┴───┴───┼───────────────┤ ··· │ ··· │ ··· │ - ├────┬────┬────┬────┼───────────────┤ - 511 байт│ │ │ │ 0 │ Код цвета │ Спр.лин. 16 для спрайта 31 - └──▲─┴──▲─┴──▲─┴────┴───────────────┘ + ├───┬───┬───┬───┼───────────────┤ + 511-й байт│ │ │ │ 0 │ Код цвета │ Спр.линия 16 для спрайта 31 + └─▲─┴─▲─┴─▲─┴───┴───────────────┘ │ │ └─ Бит IC (определитель столкновений):1-нет, 0-да; - │ └────── Бит CC (разрешение приоритета) :0-нет, 1-да; - └─────────── Бит EC ("опережение") :1- да, 0-нет. - + │ └───── Бит CC (разрешение приоритета) :0-нет, 1-да; + └───────── Бит EC ("опережение") :1- да, 0-нет. В режиме спрайтов 2, если СС-бит Таблицы SCT установлен в 1, порядок приоритетности спрайтов для данной спрайтовой линии о т м е н я е т с я . Спрайтовая линия, для которой бит СС установлен в 1 , будет отображаться @@ -2014,21 +1984,20 @@ Отметим, что и в этом случае, если на одной линии экрана более 8 спрай- тов, то д е в я т ы й спрайт и все последующие не будут изображаться на экране дисплея. - Более того не фиксируется столкновение спрайта, для которого с SCT бит + Более того,не фиксируется столкновение спрайта, для которого с SCT бит СС установлен в 1, с другим спрайтом (даже если у этого спрайта в SCT бит СС установлен в 0). В этом случае для пересекающихся спрайтов над их цве- товыми кодами производится логическая операция OR. Говорят, что в режиме SCREEN 6 цвет фона и цвета спрайтов подвергаются -а п п а р а т н о м у т и л и н г у. Эти цвета кодируются четыремя би- +а п п а р а т н о м у т и л и н г у. Эти цвета кодируются четырьмя би- тами: два с т а р ш и х бита определяют код цвета нечетных точек, а два м л а д ш и х бита определяют код цвета четных точек по X-координате (от 0 до 511). В режиме SCREEN 6 размер одной точки спрайта в 2 раза больше,чем у гра- -фической точки (пикселя), однако, за счет наличия аппаратного тилинга, од- +фической точки (пикселя), однако за счет наличия аппаратного тилинга, од- на точка спрайта может обладать двумя цветами одновременно (четные и не- четные точки фонового цвета могут быть определены таким же образом). - ┌─────────────────── Четные точки (0,2,...,510) │ ┌────────────── Нечетные точки (1,3,...,511) ┌──▼─┬──▼─┐ @@ -2059,6 +2028,13 @@ SPRITE$()). В режиме SCREEN 8 цвета спрайта фиксированы и не зависят от регистра палитры. Цвета спрайта в режиме SCREEN 8 показаны на следующей таблице. + + + + + + + ┌─────────────────┬─────────────┬─────────────┬────────────┐ │ Код цвета │ Зеленый │ Красный │ Синий │ │ С3 С2 С1 С0 │ G2 G1 G0 │ R2 R1 R0 │ B2 B1 B0 │ @@ -2084,6 +2060,7 @@ │ 1 1 1 1 │ 1 1 1 │ 1 1 1 │ 1 1 1 │ └─────────────────┴─────────────┴─────────────┴────────────┘ + XI.1.9. С л о т ы в и д е о п а м я т и Вся видеопамять на компьютерах серии MSX-2 разбита на два больших учас- @@ -2091,7 +2068,7 @@ видеопамяти (по аналогии с участками RAM и ROM объемом по 64 Кбайта, назы- ваемыми с л о т а м и памяти). На компьютерах серии MSX-1 имеется толь- ко один слот VRAM объемом в 16 Кбайтов. - Для того, чтобы переключиться с работы со слотом 0 на работу со слотом + Для того чтобы переключиться с работы со слотом 0 на работу со слотом 1, достаточно выполнить оператор: α) SET PAGE 2 или SET PAGE 3 в режимах SCREEN 5 и SCREEN 6; β) SET PAGE 1 в режимах SCREEN 7 и SCREEN 8. @@ -2113,6 +2090,9 @@ │ от &H18000 │ от &H8000 │ │ │ │ до &H1FFFF │ до &HFFFF │ │ SET PAGE 3 │ └────────────┴────────────┴────────┴─────────────┘ + + + ┌────────────┬────────────┬────────┬─────────────┐ │ Физические │ Логические │ Номера │ Способ вклю-│ Для │ адреса │ адреса │ слотов │ чения слота │ режимов @@ -2123,8 +2103,7 @@ │ от &H10000 │ от &H0000 │ │ │ │ до &H1FFFF │ до &HFFFF │ Слот 1 │ SET PAGE 1 │ └────────────┴────────────┴────────┴─────────────┘ - Отметим также, что в режимах SCREEN 0 ÷ SCREEN 4 работа со слотом 1 за- -прещена. + XI.1.10. П о р т ы, о т в е ч а ю щ и е за р а б о т у @@ -2143,7 +2122,6 @@ │ OUT &H99, С т а р ш и й байт номера ячейки OR &H40 │ │ OUT &H98, Ч и с л о │ └──────────────────────────────────────────────────────────┘ - П р и м е р. ─────────── 10 SCREEN 0:CLS:KEYOFF @@ -2161,7 +2139,7 @@ └────────────────────────────────────────────────────┘ Важно отметить следующее. Изменение содержимого видеопамяти или видео- процессора приводит к немедленной корректировке содержимого экрана. Одна- -ко, отсюда вовсе не следует истинность обратного утверждения. +ко отсюда вовсе не следует истинность обратного утверждения. ┌────────────────────────────────────────────────────────────────────┐ │ Изменение "содержимого" экрана не всегда приводит к изменению VRAM.│ └────────────────────────────────────────────────────────────────────┘ @@ -2170,7 +2148,9 @@ деле состояние экрана изменяют п о р т ы ввода-вывода с адресами &H98, &H99, &H9A и &H9B. На эти порты можно "воздействовать" оператором VPOKE. В этом случае сигнал из VRAM сразу же поступает в порт, а тот,в свою оче- -редь изменяет "рисунок" на экране. +редь, изменяет "рисунок" на экране. + + ┌───────────┐ │ Э к р а н │ @@ -2183,7 +2163,6 @@ ┌──────────────┐ ┌───────────┐ ◀── │Видеопроцессор│─▶│Видеопамять│ ◀── Оператор VPOKE └──────────────┘ └───────────┘ ◀── - Если же воздействовать непосредственно на порт оператором OUT,минуя ви- деопамять, то могут возникнуть следующие ситуации: 1) если адрес VRAM принадлежит отрезку [0,&H3FFE], то после записи опе- @@ -2192,7 +2171,6 @@ 2) если адрес VRAM принадлежит отрезку [&H3FFF,&HFFFF], то после запи- си оператором OUT в ячейку с этим адресом ее содержимое можно прочесть только функцией INP. - П р и м е р. Сравните результаты работы этой программы на компьютерах ─────────── серий MSX-1 и MSX-2 ! 10 CALL NETEND @@ -2205,10 +2183,8 @@ 80 CALL NETINI:'Отмена действия команды CALL NETEND - XI.2. РАБОТА С ВИДЕОПРОЦЕССОРОМ - Четыре величайших изобретения в истории человечества: 1) колесо; 2) электрическая лампочка; @@ -2217,7 +2193,6 @@ авторами. М.Уэйт, С.Прата, Д.Мартин - Работа с псевдопеременными BASE и VDP - весьма эффективное средство уп- равления видеопамятью. Однако при использовании этих средств нужно быть крайне осторожным, ибо малейшая ошибка в программировании может сделать @@ -2235,15 +2210,15 @@ воляющие значительно быстрее записывать информацию в регистры и читать ин- формацию из регистров. Регистры 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, и серии + Б) по способу доступа: + 1) разрешены чтение и запись на компьютерах и серии MSX-1 и серии MSX-2 (регистры 0÷7); 2) разрешены чтение и запись на компьютерах MSX-2 и только запись на компьютерах MSX-1 (регистры 8÷23); @@ -2260,7 +2235,6 @@ ние параметра N должно быть равно номеру регистра; β) если используется регистр с номером из диапазона [8,23] (для ком- пьютера MSX-2), то N=RG+1, где RG - номер регистра. - Теперь мы расскажем Вам о способах з а п и с и в регистры MSX-VDP: 1) запись с использованием псевдопеременной VDP. Этот способ является самым простым: оператор ┌─────────────┐ @@ -2271,58 +2245,55 @@ зывает на номер регистра MSX-VDP, причем: α) если используется регистр с номером из диапазона [0,7], то значе- ние параметра N должно быть равно номеру регистра; - β) если используется регистр с номером из диапазона [8,23], либо из + β) если используется регистр с номером из диапазона [8,23] либо из диапазона [32,46] (для компьютера MSX-2), то N=RG+1, где RG - номер регис- тра; M - арифметическое выражение, целая часть значения которого при- надлежит отрезку [0,255], позволяет поместить значение выражения M в регистр VDP; - 2) запись через п о р т ы ввода-вывода (для всех регистров). Этот способ заключается в использовании порта с номером &H99, связываю- -щего видеопроцессор с центральным процессором MSX-компьютера (Z-80). Что- +щего видеопроцессор с центральным процессором MSX-компьютера (Z80). Что- бы записать число A в регистр MSX-VDP с номером N, примените следующие операторы: ┌────────────────────────────────────────┐ │ OUT &H99,A:OUT &H99,RG OR &H80 │ . └────────────────────────────────────────┘ - Данные операторы последовательно выводят данные и номер регистра в -порт 99h. - + Они последовательно выводят данные и номер регистра в порт 99h. Номер бита 7 6 5 4 3 2 1 0 ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ Первый байт │ Д а н н ы е │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ Второй байт │ 1 │ 0 │ Н о м е р р е г и с т р а │ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ - З а м е ч а н и е. Будьте особенно внимательными при обращении к видео- -процессору из подпрограммы обработки прерываний. +процессору из подпрограммы обработки прерываний; 3) к о с в е н н а я запись в регистры MSX-VDP. Про нее будет расска- зано в разделе XI.2.6 . - Напомним, что если Вы работаете с компьютером серии MSX-2, то перед на- -бором программы, использующей порты ввода-вывода, нужно выполнить команду + Напомним, если Вы работаете с компьютером серии MSX-2,то перед набором +программы, использующей порты ввода-вывода, нужно выполнить команду + ┌─────────────┐ │ CALL NETEND │ . └─────────────┘ - XI.2.1. Р е г и с т р ы у с т а н о в к и р е ж и м а + XI.2.1. Р е г и с т р ы у с т а н о в к и р е ж и м а + Нехватка информации восполняется избытком интуиции. М.Мишин - Перейдем теперь к описанию "содержимого" некоторых регистров VDP. Вначале напомним Вам принятую нумерацию битов в байте: - ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐ │ 7-й бит│ 6-й бит│ 5-й бит│ 4-й бит│ 3-й бит│ 2-й бит│ 1-й бит│ 0-й бит│ └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘ + Р е г и с т р 0. ─────────────── ┌─────┬────────┬─────────────────────────────────────────────────────┐ @@ -2350,7 +2321,7 @@ П р и м е р. 10 OUT &H99,VDP(0) OR 16:OUT &H99,0 OR &H80 'Отключение ─────────── клавиатуры! - +\page Р е г и с т р 1. ─────────────── ┌─────┬────────┬─────────────────────────────────────────────────────┐ @@ -2378,9 +2349,7 @@ │ 0 │ 0 │ Нормальный размер спрайтов │ ратор SCREEN ,n │ │ │ 1 │ "Увеличение" размера спрайтов │ │ └─────┴────────┴──────────────────────────────────┴──────────────────┘ - Назначение 6-го бита регистра 1 иллюстрируется примерами 1 и 2: - П р и м е р 1. ┌─ OFF ───────────── α) 10 SCREEN 2 β) 10 SCREEN 2 ▼ 15 ::::::::::::::::: 15 VDP(1)=&B10100000 @@ -2396,12 +2365,10 @@ Перед записью в регистр лучше всего сначала прочитать его текущее со- держимое, а лишь затем с помощью логических операций AND, OR и XOR устано- вить или "сбросить" нужные биты. - - П р и м е р 2. Включение и выключение экрана дисплея - ───────────── VDP(1)=VDP(1) XOR 64 + П р и м е р 2. Включение и выключение экрана дисплея: + ───────────── VDP(1)=VDP(1) XOR 64 . Эта команда включает экран, если он был выключен, и наоборот. А теперь разберемся с н у л е в ы м битом регистра 1 ... - П р и м е р 3. Изменение размера спрайта без очистки шаблонов. ───────────── 10 SCREEN 2,1 @@ -2441,10 +2408,9 @@ │ 1) установить биты M1,M2,M3,M4,M5; │ │ 2) установить начальные адреса Таблиц VRAM в регистрах базовых │ │ адресов; │ -│ 3) заполнить таблицы видеопамяти необходимыми данными; │ +│ 3) заполнить Таблицы видеопамяти необходимыми данными; │ │ 4) занести в ячейку памяти с адресом &HFCAF номер режима SCREEN. │ └──────────────────────────────────────────────────────────────────────┘ - Р е г и с т р 8. ─────────────── ┌─────┬────────┬─────────────────────────────────────────────────────┐ @@ -2496,7 +2462,6 @@ отображаются спрайты всех цветов. Участки спрайтов с нулевым цветом на эк- ране по-прежнему не отображаются. Но если спрайты пересекаются "невидимы- ми" частями, то столкновение спрайтов б у д е т у с т а н о в л е н о . - П р и м е р 4. ───────────── 10 COLOR =(0,2,4,7) 'Изменим палитру нулевого цвета @@ -2556,10 +2521,8 @@ 50 VPOKE T,32:NEXT - XI.2.2. Р е г и с т р ы б а з о в ы х а д р е с о в - Мы находимся в положении, несколько аналогич- ном положению человека, держащего в руках связку ключей и пытающегося открыть одну за @@ -2568,17 +2531,14 @@ двери, но сомнения относительно взаимноодно- значного соответствия между ключами и дверя- ми у него остаются. - Юджин Вигнер - - - Адрес байта видеопамяти кодируется 17-ю двоичными цифрами, которые мы -будем обозначать Ai , где i=0,1,2,...,16, причем через A16 будем обозна- -чать с т а р ш и й бит, через A0 - м л а д ш и й бит. + Ю.Вигнер + Адрес байта видеопамяти кодируется 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. ┌───────────────────────────────────────────────────────┐ @@ -2590,7 +2550,6 @@ реса Таблицы 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$ 'Читаем @@ -2605,12 +2564,10 @@ Регистры с номерами 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 @@ -2627,7 +2584,6 @@ лицы 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$ @@ -2641,12 +2597,10 @@ Регистры с номерами 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 @@ -2660,14 +2614,13 @@ Ok └─────────┘ 11 и 5 ┌───────────────────────────────────────────────────────────────────────┐ │ З а м е ч а н и е. С Таблицей SAT связана Таблица SCT, адрес которой│ -│ получается вычитанием 512 байт из начального адреса Таблицы SAT. │ +│ получается вычитанием 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$ 'Читаем @@ -2681,14 +2634,12 @@ Ok └─────┘ ┌────────────────────────────────────────────────────────────────────┐ │ Отметим, что при использовании этих регистров рекомендуется │ - │ м а с к и р о в а т ь ненужные в текущем режиме отображения биты │ + │ м а с к и р о в а т ь ненужные в текущем режиме отображения биты. │ └────────────────────────────────────────────────────────────────────┘ - XI.2.3. Р е г и с т р ы ц в е т о в - - Вы знаете отличительные способности животного, называемого раком? - Да, конечно. Рак - это рыба к р а с н о г о @@ -2697,19 +2648,15 @@ о раке ... Студенческий фольклор - α) Регистр с номером 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 │ @@ -2717,16 +2664,14 @@ └────────────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ 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 │ + │ Содержимое седьмого регистра инициализируется оператором COLOR .│ └───────────────────────────────────────────────────────────────────┘ β) В 80-символьном режиме SCREEN 0 существует явление, которое мы назо- вем м и г а н и е м . Информация о символах, которые должны мигать, нахо- @@ -2749,7 +2694,7 @@ Ч а с т о т о й в к л ю ч е н и я м и г а н и я назовем промежуток времени, в течение которого текст и фон приобретают цвет мигания. Ч а с т о т о й в ы к л ю ч е н и я м и г а н и я будем называть -промежуток времени, в течении которого текст и фон приобретают основной +промежуток времени, в течение которого текст и фон приобретают основной цвет. Единица измерения частоты мигания равна 1/6 секунды.Максимально возмож- ный период мигания составляет 5 секунд (15/6 секунд на включение мигания @@ -2758,7 +2703,6 @@ Регистр с номером д в е н а д ц а т ь MSX-VDP содержит информацию о цвете мигания текста и фона. Старший полубайт этого регистра отвечает за цвет мигания текста, а младший полубайт отвечает за цвет мигания фона. - Р е г и с т р с номером 12 (регистр цвета текста/фона) ┌────────────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │ Номер бита │ 7 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │ 0 │ @@ -2766,27 +2710,25 @@ └────────────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ биты TC3,TC2,TC1,TC0 определяют цвет части 1 шаблона; биты BC3,BC2,BC1,BC0 определяют цвет части 0 шаблона. - Если в режиме SCREEN 1 установлен признак мерцания, то цвета из этого -регистра и из регистра с номером 7 поочередно отбражаются. +регистра и из регистра с номером 7 поочередно отображаются. За частоту мигания "отвечает" регистр с номером т р и н а д ц а т ь, причем в его старшем полубайте хранится информация о частоте включения ми- гания, а в младшем - информация о частоте выключения мигания. - Р е г и с т р с номером 13 (регистр периода мерцания) ┌────────────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │ Номер бита │ 7 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │ 0 │ │ Имя бита │ ON3 │ ON2 │ ON1 │ ON0 │ OF3 │ OF2 │ OF1 │ OF0 │ └────────────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ -биты ON3,ON2,ON1,ON0 определяют период отборажения для четной страницы; +биты ON3,ON2,ON1,ON0 определяют период отображения для четной страницы; биты ОF3,OF2,OF1,OF0 определяют период отображения для нечетной страницы. - В режимах растровой графики (SCREEN 5÷SCREEN 8) попеременно сменяются две страницы памяти. Данные помещаются в этот регистр для установления отображаемой страницы как нечетной страницы для начала мерцания. Этот ре- гистр используется также в режиме SCREEN 1. + Приведем табличку... ┌──────────────────────┬────────────┬──────────────────────┬────────────┐ │ Содержимое полубайта │ Время (мс) │ Содержимое полубайта │ Время (мс) │ @@ -2801,13 +2743,9 @@ │ 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. ───────────── - NEW - Ok 10 SCREEN 0:WIDTH 80 'Установка режима для мигания 20 FOR T=2048 TO 2048+269:VPOKE T,0:NEXT 'Очистка Таблицы мигания 30 LINEINPUT "Введите слово:";B$ @@ -2816,17 +2754,15 @@ 60 INPUT "Цвет фона для мигания";MF 70 INPUT "Частота включения мигания (от 0 до 15)";TN 80 INPUT "Частота выключения мигания (от 0 до 15)";TK - 90 VPOKE 2048+10*Y+X/8,&B11111111 'Будуть мигать 8 символов + 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 │─┐ │ │─┐ @@ -2837,14 +2773,13 @@ ├─────────────┤ │ │ Страница 1 │─┘ │ Страница 3 │─┘ │ │ └─────────────┘ └────────────┘ - Период отображения,находящийся в промежутке между 166 мсек и 2053 мсек, + Период отображения, находящийся в промежутке между 166 мс и 2053 мс, может быть определен для каждой страницы. Для этого необходимо: 1) задать базовый адрес Таблицы имен шаблонов н е ч е т н о й стра- ницы (регистр с номером 2); 2) задать время включения (интервал, в течение которого отображается ч е т н а я страница) и время выключения (интервал, в течение которого отображается н е ч е т н а я страница) в регистре с номером 13. - Р е г и с т р с номером 13 (регистр периода мерцания) ┌────────────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │ Номер бита │ 7 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │ 0 │ @@ -2852,30 +2787,26 @@ └────────────┴──▲──┴─────┴─────┴──▲──┴──▲──┴─────┴─────┴──▲──┘ └─────────────────┘ └─────────────────┘ Время включения Время выключения - - 3) После этого начнется процесс мигания. - + 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 :' рисуем окружность побольше + 50 CIRCLE (254,106),60,15 :' рисуем окружность большего радиуса 60 VDP(13+1)=&H11 :' Включим смену страниц 70 :' Окружность п у л ь с и р у е т ! - 80 A$=INPUT$(1) :' Немного подождем... + 80 A$=INPUT$(1) :' Ждем нажатия любой клавиши... 90 VDP(13+1)=0 :' Выключим смену страниц Опишем еще один способ осуществления смены двух графических страниц на -экране. - Бит ЕО (второй бит регистра с номером 9), используется для поперемен- -ной демонстрации д в у х графических страниц экрана с частотой 60 Гц. +экране. Бит ЕО (второй бит регистра с номером 9) используется для попере- +менной демонстрации д в у х графических страниц экрана с частотой 60 Гц. Для этого необходимо: 1) задать базовый адрес Таблицы имен шаблонов н е ч е т н о й страни- цы (регистр с номером 2); 2) установить в т о р о й бит регистра с номером 9 в 1. - П р и м е р 4. ───────────── 10 SCREEN 7:VDP(10)=0 :' Режим растровой графики (SCREEN 5÷8) @@ -2892,7 +2823,6 @@ 81 :' Эта возможность используется в программе PAINTER 82 :' (меню Tool.Show Canvas) 90 A$=INPUT$(1) :' З а д е р ж к а - Кроме того,видеопроцессор поддерживает функцию черезстрочного отображе- ния. Отображение первого и второго п о л е й на одной и той же странице можно получить, установив бит IL (третий бит регистра с номером 9) в 1. @@ -2902,7 +2832,6 @@ 2) установить бит ЕО (второй бит регистра с номером 9) в 1; 3) задать базовый адрес Таблицы имен шаблонов нечетной страницы (ре- гистр с номером 2). - П р и м е р 5. ───────────── 10 COLOR 15,1,1: SCREEN 7 ' Режим растровой графики @@ -2917,7 +2846,6 @@ 34 'Линии накладываются друг на друга на 1/2 (!) точки 40 A$=INPUT$(1) ' Задержка 41 VDP(9+1)=0 ' Выключим мигание - δ) Регистр с номером 20 называется регистром цветовой вспышки 1. Регистр с номером 21 называется регистром цветовой вспышки 2. Регистр с номером 22 называется регистром цветовой вспышки 3. @@ -2937,6 +2865,7 @@ указанные величины затем возвращаются в исходное состояние, то будет полу- чен обычный сигнал "цветовой вспышки" на NTSC-видеовыходе. + XI.2.4. Р е г и с т р ы у п р а в л е н и я э к р а н о м Регистрами у п р а в л е н и я э к р а н о м будем называть регист- @@ -2945,17 +2874,15 @@ α) Использование регистра с номером в о с е м н а д ц а т ь дает возможность центрирования изображения относительно электронно-лучевой трубки дисплея: - Р е г и с т р с н о м е р о м 18 ┌──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┐ - │ │ Параметр смещения │ │ Параметр смешения │ + │ │ Параметр смещения │ │ Параметр смещения │ │ │ вверх-вниз │ │ вправо-влево │ └──▲───┴──────┴──────┴──────┴──▲───┴──────┴──────┴──────┘ │ │ Флаг смещения вверх-вниз: Флаг смещения вправо-влево: 1 означает смещение экрана вниз; 1 означает смещение экрана вправо; 0 означает смещение экрана вверх 0 означает смещение экрана влево - А теперь посмотрите на фрагмент алгоритма нахождения величины смещения экрана, который записан на школьном алгоритмическом языке: если Флаг смещения = 1 @@ -2966,28 +2893,22 @@ │ ───── │ все ─── - П р и м е р 1. Сдвинем экран влево на 2 точки и вниз на 5 точек. ───────────── 10 VDP(18+1)=&B10110010 ▲└▲┘▲└▲┘ Смещение экрана вниз ─┘ │ │ └─ 2 точки 5=8-3 ───┘ └─── Смещение экрана влево - На компьютерах MSX-2 по умолчанию "содержимое" регистра с номером 18 -по умолчанию задается оператором - SET ADJUST (X,Y) +по умолчанию задается оператором 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 ┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌─┬─┬─┬─┬─┬─┬─┬─┐ │█│ │ │ │█│ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │█│ │█│ │ │ │ @@ -2999,7 +2920,6 @@ │█│ │ │ │█│ │ │ │ │ │ │ │ │ │ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │ │ │█│ │ │ │ │ │ │ │ │ │ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │ │ │█│ │ │ │ │█│ │ │ │█│ │ │ │ └─┴─┴─┴─┴─┴─┴─┴─┘ └─┴─┴─┴─┴─┴─┴─┴─┘ └─┴─┴─┴─┴─┴─┴─┴─┘ └─┴─┴─┴─┴─┴─┴─┴─┘ - VDP(23+1)=4 VDP(23+1)=5 VDP(23+1)=6 VDP(23+1)=7 ┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌─┬─┬─┬─┬─┬─┬─┬─┐ │█│ │█│ │█│ │ │ │ │█│█│ │█│█│ │ │ │ │█│ │ │ │█│ │ │ │ │ │ │ │ │ │ │ │ │ @@ -3011,11 +2931,9 @@ │█│ │ │ │█│ │ │ │ │█│ │█│ │█│ │ │ │ │█│ │█│ │█│ │ │ │ │█│█│ │█│█│ │ │ │ │█│ │█│ │█│ │ │ │ │█│ │█│ │█│ │ │ │ │█│█│ │█│█│ │ │ │ │█│ │ │ │█│ │ │ │ └─┴─┴─┴─┴─┴─┴─┴─┘ └─┴─┴─┴─┴─┴─┴─┴─┘ └─┴─┴─┴─┴─┴─┴─┴─┘ └─┴─┴─┴─┴─┴─┴─┴─┘ - П р и м е р. ─────────── - 5 SCREEN 0 - 10 CLS:KEYOFF + 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 @@ -3023,15 +2941,13 @@ 60 NEXT J 70 IF INKEY$="" THEN 30 80 VDP(23+1)=0:END - В г р а ф и ч е с к и х режимах регистр с номером 23 предоставляет другую интересную возможность. Вначале следует вспомнить, что доступная высота графического экрана равна 192 или 212 линиям (в зависимости от де- -вятого регистра MSX-VDP). Однако, Вы можете, воздействуя на VRAM (исполь- +вятого регистра MSX-VDP). Однако Вы можете, воздействуя на VRAM (исполь- зуя, например, оператор VPOKE), сформировать шаблоны 256 линий, просмот- рев которые Вы можете, использовав регистр с номером 23. Понять, как это происходит, Вы можете из следующих рисунков: - VDP(23+1)=0: ┌─────────────────┐ Y=0 │ Видимые линии │ ├─────────────────┤ Y=192 или 212 @@ -3045,8 +2961,6 @@ ├─────────────────┤ Y=200 │ Видимые линии │ └─────────────────┘ Y=255 - - XI.2.5. Н е к о т о р ы е р е г и с т р ы д о с т у п а Имеется возможность изменить палитру некоторого цвета. @@ -3067,12 +2981,11 @@ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴──────┘ ┌──────────────────────────────────────────────────────────────────────┐ │ Для изменения цвета надо набрать последовательно команды (операторы):│ - │ VDP(16+1)=C:OUT &H9A,16*R+B:OUT &H9A,G │ + │ VDP(16+1)=C:OUT &H9A,16*R+B:OUT &H9A,G , │ │ где: C - номер цветовой палитры, которую Вы хотите изменить; │ │ R,B,G - числа, определяющие соотношение красного, синего и │ │ зеленого цветов в палитре. │ └──────────────────────────────────────────────────────────────────────┘ - П р и м е р 2. ───────────── COLOR 15,3 @@ -3081,7 +2994,6 @@ Ok Отметим, что для компьютеров MSX-1 этот способ изменения цветов являет- ся единственно возможным! - П р и м е р 3. ───────────── 10 COLOR 8,15,0:KEY OFF:SCREEN 1 @@ -3093,20 +3005,20 @@ Регистр с номером с е м н а д ц а т ь хранит информацию о к о с в е н- н о м доступе в регистры 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 │ @@ -3114,7 +3026,6 @@ │ 40 OUT &H9B, Число для регистра с номером N+2 │ │ 50 ' ··· │ └───────────────────────────────────────────────────────────────────┘ - П р и м е р 4. ───────────── 5 SCREEN 1:COLOR 15,0,8 @@ -3133,10 +3044,10 @@ Косвенный доступ к регистрам видеопроцессора применяется тогда, когда необходимо записать информацию в несколько регистров, адреса которых идут п о д р я д. При этом запись через порт с адресом &H9B будет происходить -до тех пор, пока не будет сделана новая установка на косвеннвй доступ. - ┌──────────────────────────────────────────────────────────────────────┐ - │ Данные в 17-ом регистре не могут быть изменены косвенной адресацией! │ - └──────────────────────────────────────────────────────────────────────┘ +до тех пор, пока не будет сделана новая установка на косвенный доступ. + ┌────────────────────────────────────────────────────────────────────┐ + │ Данные в 17-м регистре не могут быть изменены косвенной адресацией!│ + └────────────────────────────────────────────────────────────────────┘ XI.2.6. Д о с т у п к в и д е о п а м я т и @@ -3144,12 +3055,10 @@ Р е г и с т р 14 (регистр базового адреса доступа к VRAM). ───────────────── Этот регистр видеопроцессора используется при доступе к видеопамяти. -Если Вы располагаете видеопамятью объемом до 16 Кбайт, то использование +Если Вы располагаете видеопамятью объемом до 16 Кбайтов, то использование этого регистра не имеет смысла, так как в нем хранятся с т а р ш и е би- ты текущего адреса видеопамяти. - Р е г и с т р с н о м е р о м 14 - Номера битов 7 6 5 4 3 2 1 0 ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │ 0 │ 0 │ 0 │ 0 │ 0 │ A16 │ A15 │ A14 │ @@ -3158,21 +3067,18 @@ видеопамяти (A16, A15, A14). Сейчас мы расскажем, как обратиться к л ю б о й ячейке видеопамяти. На компьютерах серии MSX-2 существует 2 типа видеопамяти: VRAM и ERAM. -VRAM ("Video RAM") имеет объем в 128 Кб, а ERAM ("Expanded RAM") - 64 Кб. -Информация о том, какая видеопамять используется в настоящий момент, хра- -нится в регистре с номером 45. +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∗∗∗ ▲▲▲ @@ -3191,7 +3097,6 @@ ││└───────── A5 │└────────── A6 └─────────── A7 - 4) установите биты A8÷A13 счетчика адреса и признак чтения или записи посредством вывода данных в порт &H99: OUT &H99,&B∗∗∗∗∗∗∗∗ @@ -3204,12 +3109,10 @@ ││└───────── A13 ├┼────────── 00 - признак чтения └┴────────── 01 - признак записи - - 5) А теперь остается прочитать или записать данные в нужный байт: + 5) а теперь остается прочитать или записать данные в нужный байт: A=INP(&H98) - ч т е н и е OUT &H98,A - з а п и с ь - - 6) После чтения или записи данных содержимое адресного счетчика автома- + 6) после чтения или записи данных содержимое адресного счетчика автома- тически увеличивается на единицу. При этом, если есть перенос из бита A13, то в режимах SCREEN 4÷8 происходит увеличение содержимого регистра с номе- ром 14. В режимах SCREEN 1÷3 и в 40-символьном режиме SCREEN 0 увеличения @@ -3222,12 +3125,11 @@ XI.2.7. Р е г и с т р ы с т а т у с а - Кроме регистров MSX-VDP, видеопроцессор работает с группой регистров, -называемыми регистрами с т а т у с а. Данные регистры содержат информацию -о состоянии видеопроцессора. Из них информацию можно только ч и т а т ь. + Кроме регистров MSX-VDP видеопроцессор работает с группой регистров, +называемых регистрами с т а т у с а. Эти регистры содержат информацию о +состоянии видеопроцессора. Из них информацию можно только ч и т а т ь. Текущий номер регистра статуса записывается в регистр VDP с номером п я т н а д ц а т ь (регистр-указатель регистра состояния). - Номера битов 7 6 5 4 3 2 1 0 ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │ 0 │ 0 │ 0 │ 0 │ Номер регистра статуса│ @@ -3237,14 +3139,13 @@ ми 0,1,2,3,...,9) вначале нужно установить номер регистра статуса в реги- стре с номером 15, а затем прочесть данные через порт &H99. ┌───────────────────────────────────────────────────────────────────┐ - │ Для записи в переменную W числа из регистра статуса с номером S, │ + │ Для записи в переменную W числа из регистра статуса с номером S │ │ выполните следующие действия: │ │ VDP(15+1)=S:W=INP(&H99):VDP(15+1)=0 │ └───────────────────────────────────────────────────────────────────┘ Р е г и с т р с т а т у с а н о м е р 0. ────────────────────────────────────────── - 7 6 5 4 3 2 1 0 ┌──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┐ │ │ │ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ @@ -3252,20 +3153,18 @@ │ │ │ └───▲──────────────────────────────┘ │ │ │ └ Экранный номер пятого или девятого │ │ │ (в зависимости от режима SCREEN) спрайта в строке - │ │ └─── Флаг, указывающий на столкновение 2-х спрайтов + │ │ └─── Флаг, указывающий на столкновение 2 спрайтов │ └───────── Флаг обнаружения пятого (или девятого) спрайта │ в с т р о к е └──────────────── Флаг прерывания от вертикального сканирования (после чтения регистра состояния 0 данный флаг сбрасывается) - Если бит СС=0 и высвечиваемые части шаблонов спрайтов перекрываются,то устанавливается столкновение спрайтов. Если столкновение спрайтов обнару- жено, то бит 5 регистра статуса с номером 0 устанавливается в 1. Этот бит устанавливается в 0 после чтения регистра статуса с номером 0. Использование регистра статуса с номером 0 рассмотрим на примерах. - П р и м е р 1. ───────────── 10 SCREEN 1,2 @@ -3275,7 +3174,6 @@ 50 VDP(15+1)=0:Z=INP(&H99) AND 32 60 IF Z<>0 THEN PRINT "Столкновение состоялось!" 70 NEXT - П р и м е р 2. ───────────── 10 SCREEN 1:KEYOFF @@ -3290,7 +3188,6 @@ 90 NEXT 100 GOTO 50 110 DATA 255,255,195,195,195,195,255,255 - П р и м е р 3. ───────────── 10 SCREEN1,2 @@ -3303,14 +3200,13 @@ 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-ый спрайт в строке!" + 80 ? RIGHT$("00000000"+BIN$(Z),8);"◀─ Появился 5-й спрайт в строке!" Отметим, что содержимое регистра статуса с номером 0 можно прочесть не только функцией INP, но и при помощи псевдопеременной VDP: ┌────────────┐ │ A = VDP(8) │ . └────────────┘ - П р и м е р 4. Управление столкновениями спрайтов. ────────────── 20 SCREEN 2,2 @@ -3321,19 +3217,17 @@ 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. НЕСТАНДАРТНЫЕ РЕЖИМЫ ВИДЕОПРОЦЕССОРА Боги открыли людям не все. В поиск пустившись,люди сами открыли немало. Ксенофан - XI.3.1. Р е ж и м SCREEN 4 н а к о м п ь ю т е р а х MSX-1 Для Вас, наверное, окажется неожиданностью, что на компьютерах MSX-1 @@ -3357,6 +3251,7 @@ процессору: ┌──────────────┐ │ VDP(0)=2 │ . └──────────────┘ + Учтите, что режим SCREEN 4 на компьютерах серии MSX-1 имеет некоторые о с о б е н н о с т и: 1) происходит частичное "наложение" Таблиц SAT и SCT на Таблицу PNT, @@ -3373,7 +3268,6 @@ ред обращением к Таблице атрибутов спрайтов (SAT). А теперь взгляните на - П р и м е р 1. Вы, конечно, помните, что текущий адрес Таблицы PNT хра- ───────────── нится в рабочей области по адресам &HF922 и &HF923 . 10 SCREEN 2,2 @@ -3406,7 +3300,6 @@ тов в с т р о к е , так как Вам, наверное, известно,что режимы SCREEN 4 ÷ SCREEN 8 предоставляют такую возможность! - XI.3.2. Т е к с т о в о - г р а ф и ч е с к и е р е ж и м ы Мы опишем здесь два текстово-графических режима: @@ -3417,7 +3310,7 @@ ┌───────────────────────────────┐ │ SCREEN 1:DEFUSR=&H7E:A=USR(0) │ . └───────────────────────────────┘ - Однако прежде чем начать "работать" в этом режиме, его надо инициализи- + Однако,прежде чем начать "работать" в этом режиме, его надо инициализи- ровать следующим образом: ┌──────────────────────────────────────────────────────────────────┐ │ 10 SCREEN1:WIDTH 32 │ @@ -3436,7 +3329,6 @@ Не беда, что для инициализации требуется более двух минут. При соответ- ствующей подготовке Вы сможете написать программу в машинных кодах, кото- рая будет работать в несколько десятков раз быстрее: - П р и м е р 1. Смотрите и завидуйте! ───────────── 100 CLEAR 100,&HD000 @@ -3446,9 +3338,7 @@ 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-й б а й т @@ -3468,7 +3358,6 @@ │ в о с ь м и │ в о с ь м и │ │ символов символов │ └─────────────┴─────────────┘ - 2. Режим SCREEN 1-2 имеет трехоконную структуру(как и режим SCREEN 2): Внимательно изучите следующую табличку: ┌───────┬─────────────────────────────────────────────────────────────┐ @@ -3485,21 +3374,19 @@ │ &H1900│ Таблица имен образов (строки 8÷15) │ │ &H1A00│ Таблица имен образов (строки 16÷23) │ │ &H1B00│ Таблица атрибутов спрайтов │ -│ &H2000│ Таблица цветов символов,расположенных с 0-ой по 7-ю строку. │ +│ &H2000│ Таблица цветов символов, расположенных с 0-й по 7-ю строку.│ │ │ На каждый символ отводится 8 байтов. На каждую строку симво-│ │ │ ла отводится 1 байт, старший полубайт которого отвечает за │ │ │ цвет установленных битов в Таблице шаблонов символов │ -│ &H2800│ Таблица цветов символов,расположенных с 8-ой по 15-ю строку │ -│ &H3000│ Таблица цветов символов,расположенных с 16-ой по 23-ю строку│ +│ &H2800│ Таблица цветов символов, расположенных с 8-й по 15-ю строку │ +│ &H3000│ Таблица цветов символов, расположенных с 16-й по 23-ю строку│ │ &H3800│ Таблица шаблонов спрайтов │ └───────┴─────────────────────────────────────────────────────────────┘ - 3. В режиме SCREEN 1-2 разрешено использование как текстовых,так и гра- фических операторов, т.о. "совмещенный" режим SCREEN 1-2 может находиться в двух "состояниях". - В о - п е р в ы х, это - т е к с т о в ы й режим.В нем "работают" все -операторы текстового экрана. Однако, он отличается от текстового режима +операторы текстового экрана. Однако он отличается от текстового режима SCREEN 1 в следующих моментах: 1) весь экран разбит на т р и горизонтальных окна; 2) символ, вообще говоря, раскрашен о д н о в р е м е н н о в 16 цве- @@ -3509,7 +3396,7 @@ ┌──────────────────────────────────────────────────────────────────┐ │ Для изменения цвета какой-либо строки любого символа в любой │ │ трети экрана, примените оператор: │ - │ VPOKE BASE(5+1)+2048*N+8*K+S,&HIF │ + │ VPOKE BASE(5+1)+2048*N+8*K+S,&HIF , │ │ где: N - номер окна экрана; │ │ K - код ASCII символа; │ │ S - номер строки символа; │ @@ -3524,9 +3411,7 @@ │ S - номер строки символа; │ │ ∗∗∗∗∗∗∗∗ - двоичное представление шаблона строки символа. │ └──────────────────────────────────────────────────────────────────┘ - Приведем несколько примеров: - П р и м е р 2. Полюбуйтесь на ц в е т н о й курсор! ───────────── 10 FOR X=0 TO 2 @@ -3535,18 +3420,13 @@ 40 VPOKE A+Y,Y*16 50 NEXT Y 60 NEXT X - - П р и м е р 3. А вот "переливание" латинских букв "А" в верхней трети - ────────────── экрана! + П р и м е р 3. А вот "переливание" латинских букв "А" в верхней тре- + ────────────── ти экрана! 10 FOR A=0 TO 8 - 20 FOR X=0 TO 7 - 30 VPOKE &H2000+65*8+X,(X+A)*16 - 40 NEXT X + 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-й цвет @@ -3555,13 +3435,11 @@ 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 @@ -3584,8 +3462,8 @@ можно одновременно и рисовать, и выводить текст. Для этого предварительно решите, в какой части экрана (одной или нескольких) Вы будете рисовать, а в какой - писать. - Для того, чтобы рисовать в какой-либо части экрана, ее надо предвари- -тельно подготовить следующим образом: + Для того чтобы рисовать в какой-либо части экрана,ее надо предваритель- +но подготовить следующим образом: ┌────────────────────────────────────────────────────┐ │ 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 │ @@ -3596,7 +3474,7 @@ Таким образом, Вы инициализируете участки Таблиц PNT, CT и PGT,отвечаю- щие за изображение в нужном окне экрана. Теперь в приготовленной части экрана можно применять графические опера- -торы. Однако, их можно применять только после выполнения оператора: +торы. Однако их можно применять только после выполнения оператора: ┌───────────────┐ │ POKE &HFCAF,2 │ . └───────────────┘ @@ -3605,13 +3483,13 @@ │ POKE &HFCAF,1 │ . └───────────────┘ Если Вы его не выполните, то произойдет переход в режим SCREEN 1 ! + Нужно постоянно помнить о том, что Ваши рисунки могут "портиться", так как любой символ, напечатанный в графической части экрана, портит рисунок. -Однако, рисунок можно восстановить, применив операторы: +Однако рисунок можно восстановить, применив операторы: ┌─────────────────────────────────────────────┐ │ FOR T=0 TO 255:VPOKE BASE(5)+256*N+T,T:NEXT │ └─────────────────────────────────────────────┘ - П р и м е р 7. В верхней части экрана - г р а ф и ч е с к и й режим! ───────────── 10 CLS @@ -3646,7 +3524,7 @@ │ 140 VDP(5)=52:POKE &HF929,&H1A 'Приведем в порядок SAT │ │ 150 VDP(0)=4:CLS:NEW │ └──────────────────────────────────────────────────────────────────┘ - Все сказанное о режиме SCREEN 1-2, распространяется и на режим SCREEN + Все сказанное о режиме SCREEN 1-2 распространяется и на режим SCREEN 1-4. Остается только добавить, что структура видеопамяти в "совмещенном" режиме SCREEN 1-4 полностью совпадает со структурой VRAM в режиме SCREEN4 для компьютеров серии MSX-1. {{tag> }}