XI.1.3. Т е к с т о в ы е р е ж и м ы Они мастера накапливать факты, а вот извлечь из них пользу им удается не всегда. Конан Дойль. Морской договор Введем понятия о б щ е й ширины (высоты) экрана и д о с т у п н о й ширины (высоты) экрана. Д о с т у п н а я ширина экрана - это область экрана, "доступная" тек- стовому курсору. Ее размер устанавливается оператором WIDTH. О б щ а я ширина экрана однозначно определяется оператором SCREEN. В режиме SCREEN 1 она равна 32 символам. В режиме SCREEN 0 она устанавливается равной 40 символам, если аргу- мент в операторе WIDTH ≤ 40 и равной 80 символам в противном случае. Общая в ы с о т а экрана для текстовых режимов равна 24 символам, од- нако для режимов SCREEN 0 (80 символов) и SCREEN 1 она может быть равной 26.5 символам. ┌──────────────────────────────────────────────────────┐ │ Для расположения символов в нужном Вам месте экрана │ │ используйте Таблицу имен образов (PNT)! │ └──────────────────────────────────────────────────────┘ На рисунках показана нумерация возможных позиций курсора на текстовых экранах: SCREEN 0(40 символов) SCREEN 0(80 символов) SCREEN 1 высота экрана - 24 симв. высота экрана - 24 симв. ┌───┬───┬─────┬───┬───┐┌────┬────┬─────┬────┬────┐┌───┬───┬─────┬───┬───┐ │ 0 │ 1 │ ··· │ 38│ 39││ 0 │ 1 │ ··· │ 78 │ 79 ││ 0 │ 1 │ ··· │ 30│ 31│ ├───┴───┘ └───┴───┤├────┴────┘ └────┴────┤├───┴───┘ └───┴───┤ │ ··· ··· ··· ││ ··· ··· ··· ││ ··· ··· ··· │ ├───┬───┐ ┌───┬───┤├────┬────┐ ┌────┬────┤├───┬───┐ ┌───┬───┤ │920│921│ ··· │958│959││1840│1841│ ··· │1918│1919││744│745│ ··· │766│767│ └───┴───┴─────┴───┴───┘└────┴────┴─────┴────┴────┘└───┴───┴─────┴───┴───┘ ┌─────────────────────────────────────────────────────────────────────┐ │ Чтобы изобразить символ в нужном месте экрана,используйте оператор: │ │ 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 20 GOTO 20 'Место для основной программы. 100 WIDTH 28:T1=INT(TIME/3600):T2=T2+1:IF T2=60 THEN T2=0 110 FOR J=0 TO 1 120 VPOKE 40+J,ASC(MID$(RIGHT$("0"+MID$(STR$(T1),2),2),J+1)):VPOKE 42, ASC(":") 130 VPOKE 43+J,ASC(MID$(RIGHT$("0"+MID$(STR$(T2),2),2),J+1)):NEXT:RETU RN Оказывается, можно одновременно "хранить" содержимое нескольких экран- ных с т р а н и ц , причем в любой момент можно "открыть" любую страницу и "прочесть" ее содержимое. Вывод информации на нулевую страницу предполагает использование опера- торов PRINT или VPOKE. Для остальных же страниц вывод информации операто- ром PRINT невозможен, и поэтому приходится пользоваться оператором VPOKE. ┌─────────────────────────────────────────────────────────────┐ │ Вы всегда можете изобразить любой символ в нужном месте │ │ л ю б о й экранной страницы при помощи оператора: │ │ VPOKE 4096*T*(N+1)^2+W,K │ │ где: T - номер с т р а н и ц ы; │ │ N - режим экрана (0 или 1); │ │ W - номер позиции символа на экране; │ │ K - код ASCII символа. │ └─────────────────────────────────────────────────────────────┘ При этом Вы сможете увидеть содержимое только нулевой страницы. Чтобы "просмотреть содержимое" других страниц, воспользуйтесь псевдо- переменной 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-ой страницы 30 PRINT "Введите"T"слово";:INPUT A$ 40 PRINT "С какого места печатать?" 50 INPUT "X(от 0 до 39)";VX:INPUT "Y(от 0 до 23)";VY 60 FOR B=1 TO LEN(A$) 70 VPOKE 4096*T+40*VY+VX+B,ASC(MID$(A$,B,1))'Запись на T-ю страницу 80 NEXT B:NEXT T 90 FOR T=1 TO 3:Z$=INPUT$(1): BASE(0)=4096*T '4096=&H1000 ──▶ &H10 00 95 POKE &HF923, &H10*T: POKE &HF922, 0*T 'Чтение с экрана ──▲─── ───▲── └ Адрес старшего байта└ Адрес младшего байта 97 NEXT T 100 A$=INPUT$(1):BASE(0)=0:POKE &HF923,0 'Вывод "содержимого" 0-й стра ницы В н и м а н и е! Страницы могут быть "засорены" посторонней информаци- ей, оставшейся от прежнего обращения к ним. Ваши сообщения могут затерять- ся среди этого "мусора". Поэтому рекомендуем своевременно заботиться о чи- стоте страниц (посмотрите на строку 20 примера 3)! Приведем структуру Taблицы имен образов (PNT) для 80-символьного режи- ма SCREEN 0 в соответствии с расположением символов на экране дисплея: ┌─────────────┐ │ 0-й байт │ - код символа в 0-ой строке и 0-ом столбце экрана ├─────────────┤ │ 1-й байт │ - код символа в 0-ой строке и 1-ом столбце экрана ├─────────────┤ │ ··· │ ├─────────────┤ │ 79-й байт │ - код символа в 0-ой строке и 79-ом столбце экрана ├─────────────┤ │ 80-й байт │ - код символа в 1-ой строке и 0-ом столбце экрана ├─────────────┤ │ ··· │ ├─────────────┤ │ 1919-й байт │ - код символа в 23-ой строке и 79-ом столбце экрана └─────────────┘ Приведем структуру Taблицы имен образов (PNT) для режима SCREEN 1 в со- ответствии с расположением символов на экране дисплея: ┌─────────────┐ │ 0-й байт │ - код символа в 0-ой строке и 0-ом столбце экрана ├─────────────┤ │ 1-й байт │ - код символа в 0-ой строке и 1-ом столбце экрана ├─────────────┤ │ ··· │ ├─────────────┤ │ 31-й байт │ - код символа в 0-ой строке и 31-ом столбце экрана ├─────────────┤ │ 32-й байт │ - код символа в 1-ой строке и 0-ом столбце экрана ├─────────────┤ │ ··· │ ├─────────────┤ │ 767-й байт │ - код символа в 23-ой строке и 31-ом столбце экрана └─────────────┘ Структуру Taблицы имен образов(PNT) для 40-символьного режима SCREEN 0 в соответствии с расположением символов на экране дисплея Вы теперь легко изобразите самостоятельно! Информация о символах, имеющихся на клавиатуре компьютера, находится в ROM, начиная с адреса &H1BBF, и занимает 2 Кбайта памяти. При переходе в режимы SCREEN 0 или SCREEN 1 эта информация автоматически копируется в ви- деопамять, инициализируя тем самым Таблицу шаблонов образов (PGT). Место в ROM и видеопамяти, предназначенное для записи о д н о г о сим- вола, занимает в о с е м ь байтов. ┌──────────────────────────────────────────────────────────────┐ │ Адрес начала места, отведенного для символа в видеопамяти, │ │ можно определить обращением к функции BASE: │ │ BASE(5*N+2)+K*8 │ │ где: N - номер режима экрана (0 или 1); │ │ K - код ASCII символа. │ └──────────────────────────────────────────────────────────────┘ Приведем пример "хранения" информации о символе в ROM и VRAM (справа для каждого байта выписан его шестнадцатеричный код, который и задает со- держимое данного байта): ┌───┬───┬───┬───┬───┬───┬───┬───┐ 0-й байт │ │ │ │ │ │ │ │ │ &H00 ├───┼───┼───┼───┼───┼───┼───┼───┤ 1-й байт │ │ │ │ │ │ │ │ │ &H00 ├───┼───┼───┼───┼───┼───┼───┼───┤ 2-й байт │ │ █ │ │ │ │ │ █ │ │ &H42 ├───┼───┼───┼───┼───┼───┼───┼───┤ 3-й байт │ █ │ │ │ │ │ │ │ █ │ &H81 ├───┼───┼───┼───┼───┤───┼───┼───┤ 4-й байт │ █ │ │ │ │ │ │ │ █ │ &H81 ├───┼───┼───┼───┼───┼───┼───┼───┤ 5-й байт │ █ │ │ │ │ │ │ │ █ │ &H81 ├───┼───┼───┼───┼───┼───┼───┼───┤ 6-й байт │ █ │ │ │ █ │ █ │ │ │ █ │ &H99 ├───┼───┼───┼───┼───┼───┼───┼───┤ 7-й байт │ │ █ │ █ │ │ │ █ │ █ │ │ &H66 └───┴───┴───┴───┴───┴───┴───┴───┘ 8 4 2 1 8 4 2 1 Расскажем Вам о том, как можно получить "содержимое" конкретного байта видеопамяти. Разобьем каждый байт на две половинки (два полубайта). Под рисунком для каждого полубайта изображено по 4 числа (каждое из них назо- вем "весом"). Код полубайта получим суммированием "весов" точек, содержа- щихся в нем (напомним шестнадцатеричные цифры: 0,1,2,3,4,5,6,7,8,9,A,B,C, D,E,F). Код байта получим, если справа от кода левого полубайта напишем код правого полубайта, а слева - символ "&H". В н и м а н и е! Только режим SCREEN 0, а в компьютере серии MSX-2 так- же и режимы SCREEN 6 и SCREEN 7, поддерживают вывод символов размером 6╳8 точек; остальные режимы используют размер 8╳8. Приведем пример вывода од- ного и того же символа в двух режимах: SCREEN 0 SCREEN 1 ┌───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┼───┼───┤ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┼───┼───┤ │ │ █ │ │ │ │ │ │ │ █ │ │ │ │ │ █ │ │ ├───┼───┼───┼───┼───┼───┼ ├───┼───┼───┼───┼───┼───┼───┼───┤ │ █ │ │ │ │ │ │ │ █ │ │ │ │ │ │ │ █ │ ├───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┼───┼───┤ │ █ │ │ │ │ │ │ │ █ │ │ │ │ │ │ │ █ │ ├───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┼───┼───┤ │ █ │ │ │ │ │ │ │ █ │ │ │ │ │ │ │ █ │ ├───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┼───┼───┤ │ █ │ │ │ █ │ █ │ │ │ █ │ │ │ █ │ █ │ │ │ █ │ ├───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┼───┼───┤ │ │ █ │ █ │ │ │ █ │ │ │ █ │ █ │ │ │ █ │ █ │ │ └───┴───┴───┴───┴───┴───┘ └───┴───┴───┴───┴───┴───┴───┴───┘ Важно отметить, что в языке MSX-BASIC есть возможность программным пу- тем создавать "собственные" символы (отличные от стандартных!). Взгляните на приведенные ниже примеры. Код 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 20 DATA &H00,&H00,&H42,&H81,&H81,&H81,&H99,&H66 П р и м е р 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) 30 FOR I=0 TO 7:VPOKE 2048+K*8+I,T(I):NEXT:PRINT K,CHR$(K) После выполнения этой программы нажмите на кнопку RESET. ┌───────────────────────────────────────────────────────────────────────┐ │ Отметим, что при выполнении оператора SCREEN 0 (или SCREEN 1) │ │ Таблица шаблонов образов (PGT) инициализируется вновь данными из ROM! │ └───────────────────────────────────────────────────────────────────────┘ Еще ряд примеров на изменение шаблонов символов: П р и м е р 8 [76]. "Мелкие" и обычные буквы латинского алфавита. ────────────────── 40 SCREEN 0:KEY OFF 50 BASE(2)=2048 60 PRINT"Загрузка данных":PRINT 70 FOR I=4616 TO 4823 80 READ A$:VPOKE I,VAL("&h"+A$) 90 VPOKE I+256,VAL("&h"+A$) 100 NEXT 120 PRINT"Нажмите клавишу для изменения" 130 PRINT" набора символов" 140 A$=INPUT$(1) 160 BASE(2)=4096 180 ' Б у к в ы а л ф а в и т а 200 DATA 00,00,70,88,F8,88,88,00:'A 210 DATA 00,00,F0,48,70,48,F0,00:'B 220 DATA 00,00,78,80,80,80,78,00:'C 230 DATA 00,00,F0,88,88,88,F0,00:'D 240 DATA 00,00,F0,80,E0,80,F0,00:'E 250 DATA 00,00,F0,80,E0,80,80,00:'F 260 DATA 00,00,78,80,B8,88,70,00:'G 270 DATA 00,00,88,88,F8,88,88,00:'H 280 DATA 00,00,70,20,20,20,70,00:'I 290 DATA 00,00,70,20,20,A0,E0,00:'J 300 DATA 00,00,90,A0,C0,A0,90,00:'K 310 DATA 00,00,80,80,80,80,F8,00:'L 320 DATA 00,00,88,D8,A8,88,88,00:'M 330 DATA 00,00,88,C8,A8,98,88,00:'N 340 DATA 00,00,F8,88,88,88,F8,00:'O 350 DATA 00,00,F0,88,F0,80,80,00:'P 360 DATA 00,00,F8,88,A8,90,E8,00:'Q 370 DATA 00,00,F8,88,F8,A0,90,00:'R 380 DATA 00,00,78,80,70,08,F0,00:'S 390 DATA 00,00,F8,20,20,20,20,00:'T 400 DATA 00,00,88,88,88,88,70,00:'U 410 DATA 00,00,88,88,90,A0,40,00:'V 420 DATA 00,00,88,88,A8,D8,88,00:'W 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 20 J=33:KEYOFF 30 DATA 0000000000000003,00001E214346E098,0000000000000000,0001010101 097595,C850408000000000,0409090701010262,840404081C026291,02024444645 05162,89A1C10F32C20206,000000E010080810,938584C870000000,010284780000 0000,0202010000000000,0A33C20000000000,906000000 40 READ A$:FOR T=2 TO 16 STEP 2:VPOKE8*J+T/2-1,VAL("&h"+MID$(A$,T-1, 2)):NEXT 50 IF J<47 THEN J=J+1:GOTO 40 60 A$=CHR$(33)+CHR$(34)+CHR$(35)+CHR$(36)+CHR$(37)+CHR$(29)+CHR$(29) +CHR$(29)+CHR$(29)+CHR$(29)+CHR$(31)+CHR$(38)+CHR$(39)+CHR$(40)+CHR$ (41)+CHR$(42)+CHR$(29)+CHR$(29)+CHR$(29)+CHR$(29)+CHR$(29)+CHR$(31)+ 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 ' Имеющийся шаблон символа сдвигается 10 FOR X=A1*8 TO A2*8+7 ' на один разряд и складывается со 20 D=VPEEK(X):VPOKE X,D OR D/2' "старым". 30 NEXT Целью придумавших систему было, очевидно, скрыть, что в этих значках содержится ка- кой-то смысл. Конан Дойль. Пляшущие человечки П р и м е р 11. Б е г у щ и й человечек. ────────────── 5 COLOR 15,1,1:CLS:INPUT"Укажите желаемую скорость движения человечка (чем больше число - тем меньше скорость)";C 10 CLS:SCREEN 1,2,90:DIM A$(50):J=100 30 DATA 0C0C7ADE38EC8406,03030E171607050A,0000010301000701 60 DATA C0C0808080C08080,0000000101000000,3030E078606050A0 90 READA$:FOR T=2 TO 16 STEP 2:VPOKE 8*J+T/2-1,VAL("&h"+MID$(A$,T-1,2 )):NEXT 100 IF J<105 THEN J=J+1:GOTO 90 '──▶ 110 A$(0)=CHR$(100)+" ":A$(1)=CHR$(101)+" ":A$(2)=CHR$(102)+CHR$(103) 140 A$(3)=CHR$(104)+CHR$(105) 150 FOR I=0 TO 3:LOCATE Y,7:PRINT" ";A$(I) 165 FOR W=0 TO C:NEXT 166 IF Y=27 THEN Y=0 170 NEXT:Y=Y+1:A$=INKEY$:IF A$=" " THEN END 171 GOTO 150 '──▶ Приведем шаблоны четырех символов из шести,сформированных в данной про- грамме: ┌───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ █ │ █ │ │ │0C 03│ │ │ │ │ │ │ █ │ █ │ ├───┼───┼───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┼───┼───┤ │ │ │ │ │ █ │ █ │ │ │0C 03│ │ │ │ │ │ │ █ │ █ │ ├───┼───┼───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┼───┼───┤ │ │ █ │ █ │ █ │ █ │ │ █ │ │7A 0E│ │ │ │ │ █ │ █ │ █ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┼───┼───┤ │ █ │ █ │ │ █ │ █ │ █ │ █ │ │DE 17│ │ │ │ █ │ │ █ │ █ │ █ │ ├───┼───┼───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┼───┼───┤ │ │ │ █ │ █ │ █ │ │ │ │38 16│ │ │ │ █ │ │ █ │ █ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┼───┼───┤ │ █ │ █ │ █ │ │ █ │ █ │ │ │EC 07│ │ │ │ │ │ █ │ █ │ █ │ ├───┼───┼───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┼───┼───┤ │ █ │ │ │ │ │ █ │ │ │84 05│ │ │ │ │ │ █ │ │ █ │ ├───┼───┼───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┼───┼───┤ │ │ │ │ │ │ █ │ █ │ │06 0A│ │ │ │ │ █ │ │ █ │ │ └───┴───┴───┴───┴───┴───┴───┴───┘ └───┴───┴───┴───┴───┴───┴───┴───┘ ┌───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ │ │00 C0│ █ │ █ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┼───┼───┤ │ │ │ │ │ │ │ │ │00 C0│ █ │ █ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┼───┼───┤ │ │ │ │ │ │ │ │ █ │01 80│ █ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┼───┼───┤ │ │ │ │ │ │ │ █ │ █ │03 80│ █ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┼───┼───┤ │ │ │ │ │ │ │ │ █ │01 80│ █ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┼───┼───┤ │ │ │ │ │ │ │ │ │00 C0│ █ │ █ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┼───┼───┤ │ │ │ │ │ │ █ │ █ │ █ │07 80│ █ │ │ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┼───┼───┤ ├───┼───┼───┼───┼───┼───┼───┼───┤ │ │ │ │ │ │ │ │ █ │01 80│ █ │ │ │ │ │ │ │ │ └───┴───┴───┴───┴───┴───┴───┴───┘ └───┴───┴───┴───┴───┴───┴───┴───┘ В режиме SCREEN 1 Таблица цветов (CT) позволяет, вообще говоря, выво- дить текст, символы которого имеют разные цвета. Однако,учтите,что каждый из 32 байтов Таблицы CT действует на группу из 8 символов, причем за цвет и з о б р а ж е н и я данной группы "отвечает" старший полубайт, а млад- ший полубайт "отвечает" за цвет ф о н а символов. Б а й т Т а б л и ц ы CT ┌──────────────────────────────────┬───────────────────────────┐ │ Цвет изображения восьми символов │ Цвет фона восьми символов │ └──────────────────────────────────┴───────────────────────────┘ П р и м е р 12. Вывод семи первых прописных букв латинского алфавита ────────────── и символа "@" в "инвертированном" цвете: 10 SCREEN 1:COLOR 15,4,7 20 VPOKE &H2008,&H4F Адрес Таблицы CT (&H2000+8) связан с символами, у которых коды ASCII принадлежат отрезку [64,71] (символы @,A,B,C,D,E,F,G). Если Вы хотите на- печатать в "инвертированном" цвете символ "H" (восьмую букву латинского алфавита),то адрес &H2009 видеопамяти должен быть загружен значением &H4F. Это приведет к выводу в "инвертированном" цвете восьми символов: H,I,J,K, L,M,N,O. П р и м е р 13. Изменение цвета символов (напомним,что начальный адрес ────────────── Таблицы цветов &H2000 = 8192). 40 SCREEN 1:COLOR 15,4,4 50 FOR I=0 TO 255:PRINT CHR$(I);:NEXT 60 FOR I=0 TO 255 70 FOR J=8192 TO 8223 80 VPOKE J,I 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 задает цвет курсора и цвет, которым через курсор "просвечивается" тот символ, на который курсор "нало- жен". Если оба этих цвета совпадают, то сам курсор и символ сливаются, со- здавая иллюзию непрозрачности курсора. ┌───────────────────────────────────────────────────────────────────┐ │ Обратите внимание на тот факт, что Таблица CT в режиме SCREEN 1 │ │ инициализируется оператором COLOR . │ └───────────────────────────────────────────────────────────────────┘ П р и м е р 15. Не поленитесь, наберите приведенную ниже программу. ────────────── Затем включите принтер, вставьте лист бумаги и запус- тите программу. Результаты ее работы пригодятся Вам в дальнейшем! 10 KEYOFF:CLS 120 LOCATE 0,12,0:PRINT CHR$(27);"MFirst page ";:MP=1:INPUT MP:IF MP<1 OR MP>6 GOTO 120 130 PRINT:PRINT:POKE &HF418,1:DEFUSR=&H156 140 LPRINT CHR$(27);"c1";CHR$(27);"p0";CHR$(27);"T15";CHR$(27);">";CHR $(27);"Q"; 150 IF MP=1 THEN I=0:LPRINT CHR$(27);"E (c) LHsoft ver.2":LPRINT C HR$(27);"Q" ELSE I=43*MP-45 160 P=MP 170 GOSUB 460 180 IF P=1 THEN K=41 ELSE K=43 190 FOR N=1 TO K 200 GOSUB 260 210 I=I+1 220 NEXT N 230 LPRINT"└────┴─────┴────┴──────┴──────┴──────┴──────┴──────┴──────┴ ─────────────────────────────────┴─────────────────────────┘ 240 LPRINT CHR$(12);:IF P<6 THEN PRINT CHR$(27);"MPut in a new sheet " ;:QQ=USR(0):Q$=INPUT$(1):P=P+1:GOTO 170 250 CLS:KEYON:END 260 LPRINT"│ │ │ │ │ │ │ │ │ │ │ │ 270 LPRINT"│ │ "; 280 LPRINTUSING("###");I; 290 A1=I*8:A0=A1+2048:LPRINT" │ ";RIGHT$("0"+HEX$(I),2);" │";A0;"│ 0"; HEX$(A0);" │ "; 300 LPRINTUSING("####");A1; 310 LPRINT" │ ";RIGHT$("000"+HEX$(A1),4);" │"; 320 IF IMOD8=0 THEN LPRINT 8192+I/8;"│ ";HEX$(&H2000+I/8);" │";ELSE LP RINT" │ │"; 330 FOR T=0 TO 7:LPRINTUSING(" ###");PEEK(&H1BBF+I*8+T);:NEXT 340 LPRINT" │ "; 350 FOR T=0 TO 7:LPRINT RIGHT$("0"+HEX$(PEEK(&H1BBF+I*8+T)),2);" ";:NE XT 360 LPRINT"│";CHR$(13);" ";CHR$(27);"N";CHR$(27);"S0008"; 370 M=128 380 FOR K1=0 TO 7 390 D=0 400 FOR K2=7 TO 0 STEP-1 410 D=D*2 420 IF PEEK(&H1BBF+I*8+K2)ANDM THEN D=D+1 430 NEXT K2:LPRINT CHR$(D);:M=M/2:NEXT K1 440 LPRINT CHR$(27);"Q" 450 RETURN 460 PRINT CHR$(27);"MCurrent page is";P; 470 LPRINT"┌────┬──────────┬───────────────────────────┬─────────────┬ ───────────────────────────────────────────────────────────┐ 480 LPRINT"│ │ Код │ Адрес в PGT │ Адрес в CT │ │ 490 LPRINT"│Сим-│ ├─────────────┬─────────────┼─────────────┤ Стандартное значение │ 500 LPRINT"│вол │ ASCII │ SCREEN 0 │ SCREEN 1 │ SCREEN 1 │ │ 510 LPRINT"│ ├─────┬────┼──────┬──────┼──────┬──────┼──────┬──────┼ ─────────────────────────────────┬─────────────────────────┤ 520 LPRINT"│ │ дес.│шест│ дес. │ шест.│ дес. │ шест.│ дес. │ шест.│ десятичное │ шестнадцатеричное │ 530 LPRINT"├────┼─────┼────┼──────┼──────┼──────┼──────┼──────┼──────┼ ─────────────────────────────────┼─────────────────────────┤ 540 RETURN