XI.1.5. Р е ж и м SCREEN 3 Как и в режиме SCREEN 2, экран в режиме SCREEN 3 разбит на к в а д р а- т ы размером 8╳8 точек (32╳24 квадрата). Каждый квадрат разобъем на две л и н и и толщиной четыре точки (на экране расположено 32╳48 "толстых" линий). Каждая из этих "толстых" линий разбита на две "большие" точки (4╳4 "маленьких" точек). ──▲──┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ │ │ │ │ │ │ │ │ │ │████│◀── "Маленькая" │ │────│────│────│────│ │────│────│────│────│ точка "Толщина"│ │ │ │ │ │ │ │ │ │ │ │ │────│────│────│────│ │────│────│────│────│ линии │ │ │ │ │ │ │ │ │ │ │ │ │────│────│────│────│ │────│────│────│────│ │ │ │ │ │ │ │ ──▼──└────┴────┴─── К В А Д Р А Т ────┴────┴────┘ ┌────┬────┬─── ────┬────┬────┐ │ │ │ │ │ │████│████│████│████│ │────│────│────│────│ │────│────│────│────│ "Толстая" │ │ │ │ │ │████│████│████│████│ ───▶ │────│────│────│────│ │────│────│────│────│ ◀── "Большая" линия │ │ │ │ │ │████│████│████│████│ точка │────│────│────│────│ │────│────│────│────│ │ │ │ │ │ │████│████│████│████│ ├────┴────┴────┴────┘ └────┴────┴────┴────┤ │◀─────────────"Длина" линии ─────────────▶│ Каждая из "больших" точек может быть раскрашена только в о д и н цвет. Попытка расположить в "большой" точке "маленькую" точку другого цвета при- ведет к и з м е н е н и ю цвета в с е й "большой" точки. Информация о цвете "толстой" линии находится в Таблице PGT, причем ле- вый полубайт байта PGT кодирует цвет левой "большой" точки "толстой" ли- нии, а правый полубайт отвечает за цвет правой "большой" точки. Б а й т PGT ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ 1 │ 0 │ 0 │ 0 │ 1 │ 0 │ 1 │ 0 │ └───┴───┴───┴───┴───┴───┴───┴───┘ └──────▲──────┘ └──────▲──────┘ │ │ Цвет левой "большой" точки Цвет правой "большой" точки ┌─────────────────────────────────────────────────────────────┐ │ Поскольку один байт Таблицы PGT кодирует цвета "толстой" │ │ линии,то эта Таблица требует 32 ╳ 48 = 1536 байтов VRAM │ └─────────────────────────────────────────────────────────────┘ П р и м е р 1. 10 SCREEN 3:OPEN"GRP:" AS#1 ───────────── 20 PSET(8,0),3:PSET(12,0),1 'Рисуем "толстую" линию 30 PSET(30,80):PRINT #1,HEX$(VPEEK(8)) 40 A$=INPUT$(1) ┌──────────────────────────────────────────────────────────────────────┐ │Оператор COLOR с последующим оператором CLS инициализируют Таблицу PGT│, └──────────────────────────────────────────────────────────────────────┘ причем все байты Таблицы PGT инициализируются цветом фона, закодированным как в левом, так и в правом полубайтах. А в следующей табличке показаны номера позиций "толстых" линий на экра- не: ┌────┬────┬────┬─────┬────┐ │ 0 │ 8 │ 16 │ ··· │ 248│ П р и м е р 2. ├────┼────┼────┼─────┼────┤ ───────────── │ 1 │ 9 │ 17 │ ··· │ 249│ NEW ├────┼────┼────┼─────┼────┤ Ok │ 2 │ 10 │ 18 │ ... │ 250│ 10 SCREEN 3 ├────┼────┼────┼─────┼────┤ 20 VPOKE BASE(5*3+2)+6,&H56 │ 3 │ 11 │ 19 │ ... │ 251│ 30 VPOKE BASE(5*3+2)+7,&H34 ├────┼────┼────┼─────┼────┤ 40 VPOKE BASE(5*3+2)+8,&H78 │ 4 │ 12 │ 20 │ ... │ 252│ 50 VPOKE BASE(5*3+2)+9,&H9A ├────┼────┼────┼─────┼────┤ 60 A$=INPUT$(1) │ 5 │ 13 │ 21 │ ... │ 253│ Выполнив эту программу Вы можете ├────┼────┼────┼─────┼────┤ убедиться в правильности заполнения дан- │ 6 │ 14 │ 22 │ ··· │ 254│ ной таблички. ├────┼────┼────┼─────┼────┤ │ 7 │ 15 │ 23 │ ··· │ 255│ ├────┼────┼────┼─────┼────┤ │ 256│ 264│ 272│ ··· │ 504│ ├────┼────┼────┼─────┼────┤ │ 257│ 265│ 273│ ··· │ 505│ ├────┼────┼────┼─────┼────┤ │ ···│ ···│ ···│ ··· │ ···│ ├────┼────┼────┼─────┼────┤ │ 263│ 271│ 279│ ··· │ 511│ ├────┼────┼────┼─────┼────┤ │ ···│ ···│ ···│ ··· │ ···│ ├────┼────┼────┼─────┼────┤ │1285│1293│1301│ ··· │1534│ ├────┼────┼────┼─────┼────┤ │1286│1294│1302│ ··· │1535│ └────┴────┴──│─┴─────┴────┘ ┌──┬──┬──┬─▼┬──┬──┬──┬──┐ │ 1│ 0│ 0│ 0│ 0│ 0│ 1│ 0│ └──┴──┴──┴──┴──┴──┴──┴──┘ Байт из Таблицы PGT (в нем хранится цвет "толстой" линии с номером 1302) Приведем таблицу, по которой можно определить адрес байта Таблицы PGT, отвечающего за точку (X,Y), в режимах 2÷4 : ┌──────────────┬────────────────────────────────────────────┐ │ Режим экрана │ А д р е с б а й т а в PGT │ ├──────────────┼────────────────────────────────────────────┤ │ 2 и 4 │ ((Y\8)*32+(Х\8))*8+Y MOD 8 │ ├──────────────┼────────────────────────────────────────────┤ │ 3 │ BASE(5*3+2)+(Х\8)*8+(Y\32)*256+(Y\4) MOD 8 │ └──────────────┴────────────────────────────────────────────┘ П р и м е р 1. Заполнение экрана черными и белыми клетками в шахматном ───────────── порядке. 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 70 NEXT 80 FOR I=BASE(5*3+0) TO I+767 90 VPOKE I,0 100 NEXT 110 GOTO 110 Таблица PGT разбита на 192 "кусочка" размером по 8 байт. Каждый "кусо- чек" отвечает за 4 квадрата размером 2╳2 "больших" точки (такой квадрат называется и м е н е м). Упомянутые 4 имени имеют один и тот же номер, который записывается в Таблицу PNT. Но п е р в ы й квадрат - это имя с данным номером для строк (строка имеет высоту 2 "большие" точки) с номерами 0, 4, 8, 12, 16, 20; в т о р о й - для строк с номерами 1, 5, 9, 13, 17, 21; т р е т и й - для строк с номерами 2, 6, 10, 14, 18, 22; ч е т в е р т ы й - для строк с номерами 3, 7, 11, 15, 19, 23. Следовательно, весь экран разбит на ч е т ы р е о к н а (понятие эк- ранного окна см. в описании режима SCREEN 2). ┌───────────────────────────────────────────────────────────┐ │ За имя с номером N в окне с номером M отвечают байты PGT │ │ N·8+M·2 и N·8+M·2+1, │ │ где N∈[0,191], a M∈[0,3] │ └───────────────────────────────────────────────────────────┘ Приведем структуру PGT с учетом разбивки экрана на имена и окна. ┌────┬────┬────┬─────┬────┐ Номер имени │ 0 │ 1 │ 2 │ ··· │ 15 │ N ├────┼────┼────┼─────┼────┤ ├────┼────┼────┼─────┼────┤ ─┐ │ 0 │ 8 │ 16 │ ··· │ 248│ │ ├────┼────┼────┼─────┼────┤ ├─ Имя с номером N для окна 0 │ 1 │ 9 │ 17 │ ··· │ 249│ │ ├────┼────┼────┼─────┼────┤ ─┤ │ 2 │ 10 │ 18 │ ··· │ 250│ │ ├────┼────┼────┼─────┼────┤ ├─ Имя с номером N для окна 1 │ 3 │ 11 │ 19 │ ··· │ 251│ │ ├────┼────┼────┼─────┼────┤ ─┤ │ 4 │ 12 │ 20 │ ··· │ 252│ │ ├────┼────┼────┼─────┼────┤ ├─ Имя с номером N для окна 2 │ 5 │ 13 │ 31 │ ··· │ 253│ │ ├────┼────┼────┼─────┼────┤ ─┤ │ 6 │ 14 │ 22 │ ··· │ 254│ │ ├────┼────┼────┼─────┼────┤ ├─ Имя с номером N для окна 3 │ │ 7 │ 15 │ 23 │ ··· │ 255│ │ ─▼─ ├────┼────┼────┼─────┼────┤ ─┘ │ ···│ ···│ ···│ ··· │ ···│ ├────┼────┼────┼─────┼────┤ │ 263│ 271│ 279│ ··· │ 511│ ├────┼────┼────┼─────┼────┤ │ ···│ ···│ ···│ ··· │ ···│ ├────┼────┼────┼─────┼────┤ ─┐ │1285│1293│1301│ ··· │1534│ │ ├────┼────┼────┼─────┼────┤ ├─ Имя с номером N для окна 3 │1286│1294│1302│ ··· │1535│ │ └────┴────┴────┴─────┴──▲─┘ ─┘ └─ Имя с номером 191 Приведем структуру PNT с номерами имен и их расположением на экране: 0 1 2 3 . . . 31 ◀─ Номер столбца ┌───┬───┬───┬───┬───┬───┬───┬────┐ 0 │ 0 │ 1 │ 2 │ 3 │...│...│...│ 31 │ Окно 0: строки 0,4, 8,12,16,20 ├───┼───┼───┼───┼───┼───┼───┼────┤ 1 │ 0 │ 1 │ 2 │...│...│...│ 30│ 31 │ Окно 1: строки 1,5, 9,13,17,21 ├───┼───┼───┼───┼───┼───┼───┼────┤ 2 │ 0 │ 1 │...│...│...│ 29│ 30│ 31 │ Окно 2: строки 2,6,10,14,18,22 ├───┼───┼───┼───┼───┼───┼───┼────┤ 3 │ 0 │...│...│...│ 28│ 29│ 30│ 31 │ Окно 3: строки 3,7,11,15,19,23 ├───┼───┼───┼───┼───┼───┼───┼────┤ 4 │ 32│ 33│ 34│ 35│...│ 61│ 62│ 63 │ ├───┼───┼───┼───┼───┼───┼───┼────┤ . │...│...│...│...│...│...│...│ ...│ ├───┼───┼───┼───┼───┼───┼───┼────┤ 7 │ 32│33 │...│...│...│...│ 62│ 63 │ ├───┼───┼───┼───┼───┼───┼───┼────┤ . │...│...│...│...│...│...│...│ ...│ ├───┼───┼───┼───┼───┼───┼───┼────┤ 23│160│161│...│...│...│189│190│ 191│ ▲ └───┴───┴───┴───┴───┴───┴───┴────┘ └─ Номер строки ┌─────────────────────────────────────────────────────────────────┐ │ Номер имени в квадрате с координатами X,Y (X∈[0,31],Y∈[0,23]) │ │ хранится в ячейке VRAM с адресом: │ │ BASE(5*3+0)+(Y╲4)*32+X │ │ Это имя находится в окне с номером Y MOD 4 │ └─────────────────────────────────────────────────────────────────┘ П р и м е р 2. ───────────── 10 COLOR 15,1,1:CLS:SCREEN 3 20 FOR I=0 TO 1 STEP 2 30 VPOKE I,&HF1:VPOKE I+1,&H1F 'Имя 0 для окна 0 (черно-белое) 40 VPOKE I+2,&HF8:VPOKE I+3,&H8F 'Имя 0 для окна 1 (красно-белое) 45 'Имя с номером 0 для окон 2 и 3 - пустое 60 NEXT 70 FOR I=BASE(5*3+0) TO I+767 ' Заполним PNT нулями 80 VPOKE I,0 90 NEXT 95 'На экране появятся 6 (24/4) черно-белых и красно-белых полос 100 GOTO 100 XI.1.6. Р е ж и м ы SCREEN 5, SCREEN 6, SCREEN 7 и SCREEN 8 (д л я к о м п ь ю т е р о в MSX-2) ┌───────────────────────────────────────────────────────────────────────┐ │ В режимах SCREEN 5 ÷ SCREEN 8 Таблицы PGT и CT о т с у т с т в у ю т!│ └───────────────────────────────────────────────────────────────────────┘ Поэтому вся информация об изображении точек находится в Таблице PNT. В отличие от рассмотренных ранее режимов, эти режимы не имеют деления экрана на к в а д р а т ы . Вначале приведем важную табличку, которая поможет Вам определить адрес байта Таблицы PNT, отвечающего за точку с координатами (X,Y), в различных режимах SCREEN: ┌────────────┬──────────────────────────────┐ │Режим экрана│ А д р е с б а й т а в PNT │ ├────────────┼──────────────────────────────┤ │ SCREEN 5 │ BASE(5*5)+(256/2)*Y+(X\2) │ │ SCREEN 6 │ BASE(5*6)+(512/4)*Y+(X\4) │ │ SCREEN 7 │ BASE(5*7)+(512/2)*Y+(X\2) │ │ SCREEN 8 │ BASE(5*8)+(256/1)*Y+(X\1) │ └────────────┴──────────────────────────────┘ 1. В режиме SCREEN 5 экран разделен на 212 строк, состоящих из 256 то- чек каждая, или на 192 строки, состоящих из 256 точек каждая. Совокупность двух точек по горизонтали будем называть л и н и е й (точ- ки 0 и 1 образуют 1-ю линию , точки 2 и 3 - 2-ю линию ,..., точки 254 и 255 - 128-ю линию). Каждая линия кодируется в о д н о м байте, причем четыре старших би- та этого байта определяют цвет первой точки, а четыре младших - цвет вто- рой точки. Ясно, что требуется 212╳256/2=27136 байтов для хранения све- дений о цветах линий (как раз объем Таблицы PNT в режиме SCREEN 5 !). Первый байт Таблицы PNT "хранит" информацию о цвете первой линии пер- вой строки экрана, второй байт - о цвете второй линии той же строки,и так далее: 1-й байт Таблицы PNT 2-й байт Таблицы PNT ┌─────────────────┬─────────────────┐┌─────────────────┬─────────────────┐ │ Цвет 1-й точки │ Цвет 2-й точки ││ Цвет 1-й точки │ Цвет 2-й точки │ │ первой линии │ первой линии ││ второй линии │ второй линии │ └─────────────────┴─────────────────┘└─────────────────┴─────────────────┘ ┌────────────────────────────────────────────────────────┐ │ Таблица PNT инициализируется цветом фона, который │ │ устанавливается оператором COLOR │ └────────────────────────────────────────────────────────┘ П р и м е р 1. Изобразим в режиме SCREEN 5 точку с координатами (X,Y) ────────────── белым цветом. 10 COLOR 15,4,7:INPUT"X,Y";X,Y 20 SCREEN 5 ┌───────── Код цвета фона 30 AD=BASE(5*5)+Y*128+(X\2) │┌──────── Код цвета изображения ▼▼ 40 IF XMOD2=0 THEN C=&HF4 ELSE C=&H4F'Если не будет этого условия, то изобразятся д в е соседние точки 50 VPOKE AD,C 'Вы легко можете убедиться,что этот оператор эквивален тен оператору PSET(X,Y),15. 60 GOTO 60 Приведем схематическое изображение PNT для режима SCREEN 5. ┌──────────────┐ │ 0-й байт │- отвечает за точки с координатами (0,0) и (1,0) ├──────────────┤ │ 1-й байт │- отвечает за точки с координатами (2,0) и (3,0) ├──────────────┤ │ ··· │ ··· ├──────────────┤ │ 127-й байт │- отвечает за точки с координатами (254,0) и (255,0) ├──────────────┤ │ 128-й байт │- отвечает за точки с координатами (0,1) и (1,1) ├──────────────┤ │ ··· │ ··· ├──────────────┤ │ 27134-й байт │- отвечает за точки с координатами (252,211) и (253,211) ├──────────────┤ │ 27135-й байт │- отвечает за точки с координатами (254,211) и (255,211) └──────────────┘ 2. В режиме SCREEN 6 экран имеет 212 строк из 512 точек или 192 строки по 512 точек в каждой строке. Количество байтов в Таблице PNT точно такое же, как и в Таблице PNT режима SCREEN 5: информация об одной строке экра- на кодируется в 128 байтах. Л и н и я в режиме SCREEN 6 состоит из четырех точек и кодируется в о д н о м байте. А тогда п а л и т р а каждой точки кодируется в двух битах, а так как из двух двоичных цифр можно составить только четыре ком- бинации (00,01,10,11), то каждую точку экрана можно раскрасить не более, чем ч е т ы р ь м я различными способами. Так, например, оператор VPOKE 0,&B11100100 присваивает палитру 3 первой точке первой линии, палитру 2 - второй точке первой линии, палитру 1 - третьей точке первой линии и палитру 0 - четвер- той точке первой линии. Б а й т Т а б л и ц ы PNT ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ 1 │ 1 │ 1 │ 0 │ 0 │ 1 │ 0 │ 0 │ └───┴───┴───┴───┴───┴───┴───┴───┘ └───▲───┘└──▲──┘└───▲───┘└──▲───┘ │ │ │ │ Палитра Палитра Палитра Палитра первой второй третьей четвертой точки точки точки точки ┌──────────────────────────────────────────────────────┐ │ Таблица PNT инициализируется последними двумя │ │ битами цвета фона, задаваемого в операторе COLOR │ └──────────────────────────────────────────────────────┘ Поясним сказанное примером. Если цвет фона имеет номер 13=&B1101, то в каждый байт Таблицы PNT будет занесено число &B01010101 (четыре раза пов- торяются последние два бита кода цвета фона). Приведем схематическое изображение PNT для режима SCREEN 6. ┌─────────┬─────────┬─────────┬─────────┐ │ (0,0) │ (1,0) │ (2,0) │ (3,0) │ 0-й байт ├─────────┼─────────┼─────────┼─────────┤ │ (4,0) │ (5,0) │ (6,0) │ (7,0) │ 1-й байт ├─────────┼─────────┼─────────┼─────────┤ │ ··· │ ··· │ ··· │ ··· │ ··· ├─────────┼─────────┼─────────┼─────────┤ │ (508,0) │ (509,0) │ (510,0) │ (511,0) │ 127-й байт ├─────────┼─────────┼─────────┼─────────┤ │ (0,1) │ (1,1) │ (2,1) │ (3,1) │ 128-й байт ├─────────┼─────────┼─────────┼─────────┤ │ ··· │ ··· │ ··· │ ··· │ ··· ├─────────┼─────────┼─────────┼─────────┤ │(508,211)│(509,211)│(510,211)│(511,211)│ 27135-й байт └─────────┴─────────┴─────────┴─────────┘ 3. Как и в режиме SCREEN 6,в режиме SCREEN 7 на экране расположено 212 строк, состоящих из 512 точек каждая, или 512 строк, состоящих из 192 строк каждая. Однако, один байт Таблицы PNT кодирует л и н и ю, состоя- щую из д в у х точек: старшие четыре бита определяют палитру левой точ- ки, младшие четыре - палитру правой точки. 1-й байт Таблицы PNT 2-й байт Таблицы PNT ┌────────────────┬────────────────┐ ┌────────────────┬────────────────┐ │ Палитра первой │ Палитра второй │ │ Палитра первой │ Палитра второй │ │ точки 1-й линии│ точки 1-й линии│ │ точки 2-й линии│ точки 2-й линии│ └────────────────┴────────────────┘ └────────────────┴────────────────┘ Следовательно, каждой точке может быть присвоена любая из 16 палитр. Поскольку для кодирования номера палитры необходимо четыре бита, то Таб- лица PNT занимает объем 212╳512/2 = 54272 байта. Уже отсюда становится понятно, что для использования этого режима VRAM должна иметь объем не менее 128 Кбайт! Режим SCREEN 7 аналогичен режиму SCREEN 5, за исключением того, что в режиме SCREEN 7 в строке экрана в два раза б о л ь ш е точек. ┌────────────────────────────────────────────────────────┐ │ Таблица PNT инициализируется цветом фона, который │ │ устанавливает оператор COLOR │ └────────────────────────────────────────────────────────┘ Приведем схематическое изображение PNT для режима SCREEN 7. ┌──────────────┐ │ 0-й байт │- отвечает за точки с координатами (0,0) и (1,0) ├──────────────┤ │ 1-й байт │- отвечает за точки с координатами (2,0) и (3,0) ├──────────────┤ │ ··· │ ··· ├──────────────┤ │ 255-й байт │- отвечает за точки с координатами (510,0) и (511,0) ├──────────────┤ │ 256-й байт │- отвечает за точки с координатами (0,1) и (1,1) ├──────────────┤ │ ··· │ ··· ├──────────────┤ │ 54270-й байт │- отвечает за точки с координатами (508,211) и (509,211) ├──────────────┤ │ 54271-й байт │- отвечает за точки с координатами (510,211) и (511,211) └──────────────┘ 4. В режиме SCREEN 8 экран состоит из 212 строк по 256 точек в каждой или из 212 строк по 192 точки в каждой. Л и н и я состоит из одной-единственной точки. Цвет линии здесь уже определяется не кодом палитры, а непосредственным заданием "смеси" основ- ных цветов. Этот оригинальный способ кодирования цвета требует по одному б а й т у (!) на линию, а, значит, на точку! Поэтому Таблица PNT имеет объем 212·256=54272 байта. Уже отсюда становится понятно, что для использования этого режима VRAM должна иметь объем не менее 128 Кбайт! Информация о линии с координатами (X,Y) находится по адресу X+256·Y в Таблице PNT. Для высвечивания этой линии достаточно занести по этому ад- ресу значение цвета из отрезка [0,255], которое можно найти по формуле: ┌────────────────┐ │ C = 32·G+4·R+B │ , └────────────────┘ где G, R, B - значения в диапазоне от 0 до 7, определяющие интенсивность зеленого ("Green"), красного ("Red") и синего ("Blue") цветов соответст- венно. Например, цвету с номером 187=&b10111011 соответствует следующее "содержимое" байта Таблицы PNT: Б а й т Т а б л и ц ы PNT ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ 1 │ 0 │ 1 │ 1 │ 1 │ 0 │ 1 │ 1 │ └───┴───┴───┴───┴───┴───┴───┴───┘ └──────────┘ └──────────┘└──────┘ Интенсивность Интенсивность Интенсивность зеленого красного синего цвета цвета цвета ┌────────────────────────────────────────────────────────┐ │ При инициализации байты Таблицы PNT получают номер │ │ цвета фона (который изменяется в пределах от 0 до 255).│ └────────────────────────────────────────────────────────┘ Приведем схематическое изображение PNT для режима SCREEN 8. ┌──────────────┐ Базовый адрес│ 0-й байт │- отвечает за точку с координатами (0,0) PNT ├──────────────┤ │ 1-й байт │- отвечает за точку с координатами (1,0) ├──────────────┤ │ ··· │ ··· ├──────────────┤ │ 255-й байт │- отвечает за точку с координатами (255,0) ├──────────────┤ │ 256-й байт │- отвечает за точку с координатами (0,1) ├──────────────┤ │ ··· │ ├──────────────┤ │ 54270-й байт │- отвечает за точку с координатами (256,210) ├──────────────┤ │ 54271-й байт │- отвечает за точку с координатами (256,211) └──────────────┘