ГЛАВА 16
ЦВЕТА
Краткое содержание: цхк, PAPER, FLASH, BRIGHT, INVERSE.
OVER, BORDER, ATTR.
Выполним следующую программу:
10 FOR m=0 TO I: BRIGHT 1
20 FOR n-1 TO 10
30 FOR c=4) TO 7
40 PAPER c: PRIN1.....: REM 4 coloured spaces
50 NEXT c: NEXT n: NEXT in
60 FOR m=0 TO 1: BRIGHT m: PAPER 7
70 FOR сЧ) TO 3 .
80 INK c: PRINT c;" "; REM 3 spaces
90 NEXT c: PAPER 0
100 FOR TO 7
110 INK c: PRINT c;" ": REM 3 spaces
120 NEXT c: NEXT m
130 PAPER 7: INK 0: BRIGHT 0
Она продемонстрирует Вам возможности вывода компьютером ZX
SPECTRUM на цветной телевизор восьми цветов (включая чёрный и белый) и .
двух уровней яркости. Если телевизор чёрно-белый. Вы увидите различные
градации серого цвета.
Ниже дана кодировка цветов:
• 0 - черный
• 1 - синий
• 2 - красный
• 3 - фиолетовый
• 4 - зеленый
• 5 - голубой
• 6 - жёлтый
• 7 - белый
Для чёрнотбелого телевизора этот ряд представляет собой последова-
тельность перехода серых полутонов от чёрного до белого.
Для использования цветов уясним строение графического экрана. Он
состоит из 768 позиций (24 строки по 32 знакоместа), каждая из которых
представляет из себя матрицу 8 на 8 пикселей. Вспомним
• 0 - белая точка
• 1 - черная точка
Позиция символа (знакоместа) также рассматривается с зтих позиций:
INK - цвет тона, PAPER - цвет фона. Т.о. знакоместо состоит из INK и PAPER
(рисунок на бумаге). Можно также говорить об INK и PAPER обычной и повы-
шенной яркости, а также мерцающих и немерцающих. Все это имеет следу-
ющую кодировку:
• 1) для знакоместа (8 на 8 пикселей) форму символа определяют
чистые и закрашенные точки (0 и 1), цвета фона и тона определяются
PAPER и INK.
• 2) цвета фона и тона кодируются от 0 до 7 каждый.
• 3) яркость: 0 - обычная; 1 - повышенная.
Заметим, что для одного знакоместа в 64 пикселя мы не моЖем уста-
новить более одного цвета для фона и одного цвета для тона.
Это же относится и к яркости, и к мерцанию. Цвет, яркость и мерцание
задаются для знакоместа (а не для отдельного пикселя) и являются его
атрибутами. Для измёнения этих атрибутов предназначены операторы: INK,
PAPER, BRIGHT, FLASH.
- Выполним:
PAPER 5
Теперь вывод будет осуществляться на голубой фон (т.к. 5 - код голубого
цвета).
Формат операторов:
PAPER число от 0 до 7
INK число от 0 до 7
BRIGHT 0 или 1 (0 - выкл. 1 - вкл.)
FLASH 0 или 1 (0 - выкл, I - вкл.)
Отметим, что использование чисел больших, чем указывалось выше, до-
пустимо, но дает другой эффект. К примеру, "8" может использоваться во
всех четырех операторах как средство, позволяющее использовать значение
ранее установленных атрибутов. Так,
PAPER 8
не изменит цвета фона (т.к. такого цвета нет), а поможет выяснить для
себя значение предыдущего PAPER. Операторы: INK 8, BRIGHT 8. FLASH 8
используют значения этих атрибутов.
"9" может использоваться только для INK и PAPER, как средство "контр-
аста". Цвета INK и PAPER которые Вы используете, должны быть контрастны
;руг другу, так, к белому цвету подходят темные тона: чёрный, синий, крас-
ой, фиолетовый: к чёрному цвету подходят светлые тона: зеленый, голубой,
кёлтый, белый.
Выполним:
INK 9: FOR с=0 ТО 7: PAPER с: PRINT с: NEXT с
Можно запустить программу, выдающую на экран дисплея цветные пол-
исы:
INK 9: PAPER 8: PRINT AT 0,0;: FOR n=l TO 1000:
PRINT n;: NEXT n
Цвет фона будет контрастен цвету тона в каждой выводимой позиции.
Цветной телевизор построен на способности человеческого глаза
воспринимать только три первичных цвета - синий, красный и зелёный.
Другие цвета образуются из их сочетаний К примеру, фиолетовый цвет
образуется как комбинация синего с красным (код фиолетового цвета 3. он
является суммой кодов синего 1 и красного 2).
Видеть все восемь цветов на одном участке экрана невозможно, т.к. это
будет тёмное пятно. Но там, где цвета частично накладываются друг на друга,
мы увидим цветовую гамму. В качестве примера выполним программу
(отметим, что INK получена с использованием SHIFT и "8м в [Gj-режиме):
10 BORDER 0: PAPER 0: INK 7: CLS :
20 FOR a-1 TO 6
30 PRINT TAB 6; INK
1;"U [][][][][][][] [1П [}[][][][][][][!":
REM 18 ink squares
40 NEXT a
50 LET dataline=200
60 GO SUB 1000
70 LET dataline-210
80 GO SUB 1000
90 STOP
200 DATA 2,3,7,5,4
210 DATA 2,2,6,4,4
1000 FOR ael TO 6
1010 RESTORE dataline
1020 FOR b=l TO 5
1030 READ c: PRINT INK c;" [] [][][] [] []": REM 6 ink square
1040 NEXT b: PRINT : NEXT a
1050 RETURN
Существует функция ATTR, позволяющая определить, какие атрибуты
были заданы для позиции экрана. Это сложная фунция, и она будет рассмот-
рена в конце главы.
Операторы: INVERSE и OVER не управляют атрибутами, но тем не ме-
нее определяют способ вывода на экран. В этих операторах используются
значения параметров 0 и 1.
Если Вы дадите: INVERSE 1, то выводимый символ изменит свою обыч-
ную форму (вывод будет осуществляться7- в негативном изображении). В
обычном виде мы пишем чёрным по белому, в инверсном - белым по чёрно-
му
Оператор OVER 1 устанавливает режим расширенного вывода. В обыч-
ном режиме при выводе символа на знакоместо, там стирается всё выведен-
ное ранее. При расширенном выводе можно накладывать символы друг на
друга. Это позволяет выводить составные символы, например, стилизован-
ные шрифты.
Программа для вывода готического шрифта:
10 OVER 1
20 FOR n=l ТО 32
30 PRINT "О"; CHR$ 8;........;
40 NEXT n
Отметим, что управляющий символ CHRS 8 возвращает на одну
позицию.
Возможен ещё один способ использования INK и PAPER. Их можно
вводить как параметры PRINT. Точно так же можно использовать и другие
операторы, рассмотренные в этой главе, отметим при этом, что их действие
распространяется только до конца PRINT.
В примере:
PRINT PAPER 6;"Х";: PRINT "Y"
только "X" будет выведен на жёлтый фон.
INK и другие операторы не действуют в нижней части экрана, предназ-
наченной для ввода команд и INPUT-данных. Для изменения цветов в этой
части экрана служит оператор:
BORDERп
где п - код цвета от 0 до 7.
Возможны мерцание .и повышенная яркость, для этого используйте со-
ответствующие параметры в INPUT (наподобие PRINT). Эти параметры дей-
ствуют до конца оператора или до тех пор, пока запрашиваемые данные не
будут введены.
Выполним:
INPUT FLASH 1; INK 1 ;"What is your number ?";n
Возможно изменение цветов и с помощью управляющих символов,
подобных управляющим символам для AT и TAB в главе 15.
CHR$ 16 соответствует INK
CHR$ 17 соответствует PAPER
CHR$ 18 соответствует FLASH
CHR$ 19 соответствует BRIGHT
CHR$ 20 соответствует INVERSE
CHR$ 21 соответствует OVER
Так:
PRINT CHR$ 16+CHR$9
то же, что и
PRINT INK 9
Можно пользоваться либо управляющими символами, либо операто-
рами. Их можно ставить как после номера строки, так и в конце строки. Для
удобства можно пользоваться в расширенном режиме [Е] цифрами. Цифры
от "О" до "7" устанавливают цвет INK, если CAPS SHIFT нажата, и цвет
PAPER, если не нажата. Если нажать цифру в [Ej-режиме, то будут введены
CHRS 17 и CHRS "код цвета". Если в это время была нажата САРъ SHIFT, то
будут введены CHRS 16 и CHRS "код цвета".
Если Вы захотите уничтожить вводимое, то нажмите DELETE два раза.
После первого раза на экране высветится знак вопроса, или что-нибудь ещё,
не пугайтесь и нажмите DELETE ещё раз. Управление курсором тоже не
работает обычным образом до тех пор пока курсор не выйдет к предыдущему
символу.
Действия в расширенном режиме [Е]:
• 8 даёт CHRS 19 и CHRS 0 - нормальная яркость
• 9 даёт CHRS 19 и CHRS 1 - повышенная яркость
• CAPS SHIFT 8 даёт CHRS 18 и CHRS 0 - не мерцающее
• CAPS SHIFT 9 даёт CHRS 18 и CHRS 1 - мерцающее
в [Lj-режиме:
• CAPS SHIFT 3 даёт CHRS 20 и CHRS 0 - обычный ввод
• CAPS SHIFT 4 даёт CHRS 20 и CHRS 1 - негативный ввод
(инверсный)
[К], [L], [С] |
[0] |
IE] |
НЕТ |
SYMBOL |
CAPS |
НЕТ |
г
ЛЮБОЙ ! НЕТ |
CAPS |
SYMBOL |
■ |
1 |
EDIT |
**** **** |
**** j **** ******** |
ФОН ГОЛУБОЙ |
ТОН ГОЛУБОЙ |
DEF FN |
2 |
|
CAPS LOCK |
**** **** |
**** **** ******** ******** |
ФОН КРАСНЫЙ |
ТОН КРАСНЫЙ |
FN |
3 |
# |
TRUE VIDEO |
|
******** ******** |
ФОН ФИОЛЕТО ВЫЙ |
.ТОН ФИОЛЕТО ВЫЙ |
LINE OPEN |
4 |
$ |
INVERS VIDEO |
**** **** |
******** ******** **** **** |
ФОН ЗЕЛЁНЫЙ |
ТОН ЗЕЛЁНЫЙ |
5 |
% |
КУРСОР ВЛЕВО |
**** **** **** **** |
**** **** **** **** |
ФОН СИНИЙ |
ТОН СИНИЙ |
CLOSE |
6 |
@ |
КУРСОР ВНИЗ |
**** ****
**** **** |
**** ****
**** **** |
ФОН ЖЁЛТЫЙ |
ТОН ЖЁЛТЫЙ |
MOVE PAGE |
7 |
' |
КУРСОР ВВЕРХ |
**** **** |
**** . **** |
ФОН БЕЛЫЙ |
ТОН БЕЛЫЙ |
ERASE |
8 |
( |
КУРСОР ВПРАВО |
|
******** |
НОРМАЛ. ЯРКОСТЬ |
НОРМАЛ. МЕРЦАН. |
POINT |
9 |
) |
ГРАФИЧ. РЕЖИМ |
ГРАФИЧ. ВЫХОД |
ГРАФИЧ. ВЫХОД |
ПОВЫШ. ЯРКОСТЬ |
С
МЕРЦАН. |
CAT |
10 |
- |
DELETE |
DELETE |
DELETE |
ФОН ЧЁРНЫЙ |
ТОН ЧЁРНЫЙ |
FORMAT |
Функция ATTR имеет следующий формат:
ATTR ("строка","столбец").
Значение двух параметров функции подобно значению параметров в
AT, в результате выполнения будут выведены значения атрибутов для соот-
ветствующей позиции экрана. Выводимый результат - это число, представля-
ющее сумму четырех чисел:
• 1) 128 - если знакоместо мерцающее, 0 - если обычное
• 2) 64 - если повышенная яркость, 0 - если обычная
• 3) 8 * код цвета фона
• 4) код цвета тона
7 bit |
6 bit |
5 bit |
4 bit |
3 bit |
2 bit |
1 bit |
Obit |
FLASH |
BRIGHT |
PAPER |
INK |
ATTR = 128*FLASH + 64*BRIGHT + 8*PAPER + INK
FLASH -0, 1
BRIGHT »0, 1
PAPER e 0 ... 7
INK -0... 7
|
|
|
|
INK |
|
|
|
|
PAPER |
|
|
|
|
|
|
|
|
N bit 76 |
|
black |
blue |
red |
magent |
green |
cyan |
yellow |
white |
|
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
00 |
black |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
01 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
10 |
|
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
11 |
|
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
00 |
blue |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
01 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
10 |
|
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
11 |
|
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
00 |
red |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
01 |
|
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
10 |
|
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
11 |
|
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
00 |
magent |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
01 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
10 |
|
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
11 |
|
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
00 |
green |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
01 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
10 |
|
224 |
225 |
226 |
227 |
228 |
229 |
300 |
231 |
11 |
|
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
00' |
cyan |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
01 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
10 |
|
232' |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
11 |
|
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
00 |
yellow |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
01 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
10 |
|
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
11 |
|
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
00 |
white |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
01 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
10 |
|
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
11 |
Пример: знакоместо мерцающее, обычной яркости, жёлтый фон, синий
тон
128 + 0+ (8 * 6) + 1 - 177
Проверим это, выполнив:
PRINT AT 0,0; FLASH 1; PAPER 6; INK 1;" ";ATTR (0,0)
УПРАЖНЕНИЯ
1) PRINT "B"; CHR$ 8; OVER 1;"/";
Здесь "/" перечеркнет "В". Этим способом можно выводить слова из
комбинированных знаков на ZX SPECTRUM: два фона или два тона дают
фон, один из них дает тон. Это интересное свойство, если Вы повторите вы-
вод одного символа дважды, то он не будет отображен.
Так, если дать:
PRINT CHR$ 8; OVER 1;"/"
дополнительно к описанному выше утверждению, то мы в результате
увидим "В" не перечеркнутое "/". Так ли это?
2) выполним:
PAPER 0: INK 0
Действуют ли эти операторы в нижней части экрана?
Что мы увидим, если добавить
BORDER 0?
3) выполним программу:
10 POKE 22527+RND*704,RND*127
20 GO ТО 10
Результатом программы явится смена цветов знакомест, распределен-
ных по экрану случайным образом. Возможно, Вы увидите смену цветов на
диагональных ступенях. Это является следствием того, что мы пользуемся
квазислучайным распределением, которое лишь приближённо восп-
роизводит случайное распределение.
4) введем вручную или с помощью оператора LOAD программу для вво-
да шахматных фигур из главы 14 и введём программу разбивки экрана под
шахматную доску:
5 REM Draw blankboard
10 LET bb-1: LET bw»2: REM red and blue for board
15 PAPER bw: INK bb: CLS
20 PLOT 79,128: REM border
30 DRAW 65,0: DRAW 0,-65
40 DRAW -65,0: DRAW 0,65
50 PAPER bb
60 REM board
70 FOR n=0 TO 3: FOR m=0 TO 3
80 PRINT AT 6+2*n,l l+2*m;" "
90 PRINT AT 7+2*n,10+2*m;" "
100 NEXT m: NEXT n
110 PAPER 8
120 LET pw=6: LET pb»5: REM colours of white and black pieces
200 DIM b$(8,8): REM positions of pieces
205 REM set up initial position
210 LET b$ (1 )ss"RNBQKBNR": REM little line 240
220 LET b$(2)="PPPPPPPP": REM little line 230
230 LET b$(7)="PPPPPPPP": REM big line 220
240 LET b$(8)="RNBQKBNR": REM big line 210
300 REM display board
310 FOR n=l TO 8: FOR т=1 TO 8
320 LET bcCODE b$(n,m): INK pw
325 IF bc-CODE " " THEN GO TO 350: REM space
330 IF bc>CODE "Z" THEN INK pb: LET bc=bc-32: REM lower
case for black
340 LET bc=bc+79: REM convert to graphics
350 PRINT AT 5+n,9+m; CHR$ be
360 NEXT m: NEXT n
400 PAPER 7: INK 0