XI.1.7. Т а б л и ц а п а л и т р (д л я к о м п ь ю т е р о в MSX-2) Независимо от режима SCREEN, Таблица PT занимает в видеопамяти объем 32 байта. "Местоположение" этой Таблицы зависит от режима SCREEN. ┌────────────────────────┬──────────┬─────────────────────────┐ │ Р е ж и м │ А д р е с│ К о м м е н т а р и й │ │────────────────────────┼──────────┼─────────────────────────┤ │ SCREEN 0 (40 символов) │ &H0400 │ Не используется в MSX-1 │ │ SCREEN 0 (80 символов) │ &H0800 │ │ │ SCREEN 1 │ &H2020 │ Не используется в MSX-1 │ │ SCREEN 2 │ &H1B80 │ Не используется в MSX-1 │ │ SCREEN 3 │ &H2020 │ Не используется в MSX-1 │ │ SCREEN 4 │ &H1E80 │ │ │ SCREEN 5 │ &H7680 │ │ │ SCREEN 6 │ &H7680 │ Используются палитры 0÷3│ │ SCREEN 7 │ &HFA80 │ │ │ SCREEN 8 │ &HFA80 │ Не используется │ └────────────────────────┴──────────┴─────────────────────────┘ Каждая из палитр закодирована в д в у х байтах. ┌──────────────────────────────────────────────────────────────────────┐ │ Адрес AD первого байта палитры N в Таблице PT вычисляется по формуле:│ │ AD=A0+2·N │ │ где А0-адрес начала Таблицы PT (например,в режиме SCREEN 1 Таблица PT│ │ начинается по адресу &h2020). │ └──────────────────────────────────────────────────────────────────────┘ По адресу AD в Таблице PT находится байт, который мы назовем "красный- синий". Биты 4÷6 этого байта определяют пропорцию к р а с н о г о,а биты 0÷2 - пропорцию с и н е г о цвета. Байт Таблицы PT с адресом AD+1 опре- деляет пропорцию зеленого цвета, закодированную в битах 0÷2 : 7 6 5 4 3 2 1 0 ◀── Номера битов ┌───┬───┬───┬───┬───┬───┬───┬───┐ AD │ │ ∗ │ ∗ │ ∗ │ │ ∗ │ ∗ │ ∗ │◀──────┐ └───┴───┴───┴───┴───┴───┴───┴───┘ │ └─────▲─────┘ └─────▲─────┘ │ Два │ │ ◀── последовательных Красный цвет ("Red") Синий цвет ("Blue") │ байта ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ Таблицы PT AD+1 │ │ │ │ │ │ ∗ │ ∗ │ ∗ │◀──────┘ └───┴───┴───┴───┴───┴───┴───┴───┘ └─────▲─────┘ └── Зеленый цвет ("Green") П р и м е р 2. "Чтение" Таблицы палитр в режиме SCREEN 1. Выполнив ────────────── программу, Вы узнаете, каким образом оператор SCREEN инициализирует Таблицу PT. 10 COLOR 1,15,7:SCREEN 1 20 ' ::::::::::::::: 30 FOR N=0 TO 15 40 AD=&H2020+2*N 50 RB=VPEEK(AD):G=VPEEK(AD+1)'Обратите внимание на мнемонику имен: 'RB и G! 60 PRINT N;TAB(4);HEX$(RB);HEX$(G) 70 NEXT Отметим, что оператор COLOR=(···) переопределяет байты Таблицы PT в со- ответствии с указанной палитрой. П р и м е р 3. Изменим Таблицу PT и вновь "прочитаем" ее. ───────────── 10 COLOR 1,15,7:SCREEN 1 20 GOSUB 30:COLOR=(7,7,2,7):GOSUB 30:COLOR=(7,7,7,4):GOSUB 30:END 30 FOR N=0 TO 15 40 AD=&H2020+2*N 50 RB=VPEEK(AD):G=VPEEK(AD+1) 60 PRINT N;TAB(4);HEX$(RB);HEX$(G) 70 NEXT 80 A$=INPUT$(1):CLS:RETURN Как видите, байты, соответствующие палитре 7,изменяются; немедленно из- меняется и цвет бордюра! Разумеется, палитры в Таблице PT могут быть изменены и операторами VPOKE. Однако, следует отметить, что изменение Таблицы PT операторами VPOKE само по себе не приводит к изменению цветов. Для считывания содержи- мого Таблицы PT и присвоения цвета новой палитре существует специальный оператор. Его синтаксис предельно прост: ┌─────────────────┐ │ COLOR = RESTORE │ . └─────────────────┘ П р и м е р 4. ───────────── 10 COLOR 1,15,7:SCREEN 1 20 GOSUB 30:VPOKE &H2020+14,&H77:VPOKE &H2020+15,2 25 COLOR=RESTORE:GOSUB 30:END 30 FOR N=0 TO 15 40 AD=&H2020+2*N 50 RB=VPEEK(AD):G=VPEEK(AD+1) 60 PRINT N;TAB(4);HEX$(RB);HEX$(G) 70 NEXT 80 A$=INPUT$(1):CLS:RETURN ┌──────────────────────────────────────────────────┐ │ Для инициализации Таблицы PT используются: │ │ α) оператор SCREEN ; │ │ β) оператор COLOR=NEW ; │ │ γ) оператор COLOR (без параметров!) . │ └──────────────────────────────────────────────────┘ Вопрос в том, кто за это отвечает? Шалтай-Болтай XI.1.8. С п р а й т ы Видеопроцессор имеет д в а режима отображения спрайтов. Режим отобра- жения спрайтов выбирается автоматически в соответствии с выбранным Вами режимом SCREEN. Если в Вашей программе присутствует один из операторов: SCREEN 1,SCREEN 2,SCREEN 3, то Вы находитесь в р е ж и м е с п р а й т о в 1. Если же в Вашей программе присутствует один из операторов: SCREEN 4,SCREEN 5,SCREEN 6,SCREEN 7,SCREEN 8, то Вы находитесь в р е ж и м е с п р а й т о в 2. Вкратце напомним уже известные нам результаты. В р е ж и м е с п р а й т о в 1 на экран одновременно можно вывес- ти 32 спрайта с номерами от 0 до 31. Спрайты с м е н ь ш и м и номерами имеют более высокий приоритет. На одной горизонтальной линии экрана разме- щается до ч е т ы р е х спрайтов с высшим приоритетом, а в пересекающей- ся части спрайты с более низким приоритетом становятся невидимыми. Когда два спрайта с т а л к и в а ю т с я , т.е.пересекаются запол- ненные части их образов (если сталкиваются два спрайта, шаблоны которых занулены,или спрайты сталкиваются зануленными участками шаблонов,то столк- новение не обнаруживается), тогда бит 5 регистра состояния с номером 0 ус- танaвливается в 1. Кроме того, если на одной горизонтальной линии находятся п я т ь или более спрайтов, то 6-й бит регистра состояния будет установлен в 1,а пять младших битов зафиксируют номер пятого спрайта. В р е ж и м е с п р а й т o в 2 на экран одновременно можно вывес- ти 32 спрайта, пронумерованных от 0 до 31. Спрайты с м е н ь ш и м и но- мерами имеют более высокий приоритет.На одной горизонтальной линии экрана изображается до в о с ь м и спрайтoв с высшим приоритетoм, а в перекры- вающийся части спрайты с меньшим приоритетом не видны. Столкновение д в у х спрайтов обнаруживается по состоянию 5-го бита регистра состояния с номером 0 (он устанавливается в 1). Интересно отме- тить, что в этом случае координаты столкновения фиксируются в регистрах состояния с номерами от 3 до 5. Вдобавок, если на одной горизонтальной линии экрана появляются девять или более спрайтов, то 6-й бит регистра состояния с номером 0 будет уста- новлен в 1, а 5 младших битов этого регистра зафиксируют номер девятого спрайта. В режимах SCREEN 1 ÷ SCREEN 3 спрайты задаются при помощи двух Таблиц: 1) Таблицы ш а б л о н о в спрайтов (SGT); 2) Таблицы а т р и б у т о в спрайтов (SAT); В режимах SCREEN 4 ÷ SCREEN 8 дополнительно используется еще и 3) Таблица ц в е т о в спрайтов (SCT). В этом разделе мы расскажем Вам о каждой Таблице. Ш а б л о н (от нем. Schablone-образец, модель), пластина с вырезами, очертания которых соответ- ствуют контуру чертежа, изделия и т.п. Советский Энциклопедический Словарь 1. Таблица SGT содержит образы спрайтов (которые ниже мы будем назы- вать ш а б л о н а м и), установленные оператором SPRITE$(N)= с т р о к о в о е в ы р а ж е н и е Эта Таблица инициализируется нулями оператором SCREEN, причем оператор SCREEN ,T приводит к исчезновению спрайтов с экрана, сохраняя при этом на экране остальную информацию, а операторы SCREEN M,T и SCREEN M инициализи- руют всю видеопамять. 2048 байтов Таблицы SGT позволяют хранить информацию о 256 шаблонах спрайтов, если в т о р ы м параметром в операторе SCREEN является 0 или 1, и информацию о 64-х шаблонах, если этот параметр равен 2 или 3. Адрес шаблона спрайта в Таблице SGT, созданного при помощи оператора SPRITE$(N)=···, вычисляется по формуле: ┌───────────────────────────────────┐ │ A0 +8·N или │ │ A0+32·N , │ │ где А0 - адрес начала Таблицы SGT│ . └───────────────────────────────────┘ Напомним Вам,что начальный адрес Таблицы SGT для разных режимов SCREEN возвращает функция BASE(): BASE(M*5+4) где M - номер режима SCREEN. ┌──────────────────────────────────────────────────────────────┐ │ Байты шаблона записаны в Таблице SGT в том же порядке, как │ │ и байты (символы!) значения строкового выражения, стоящего │ │ в правой части оператора SPRITE$(N)=··· │ └──────────────────────────────────────────────────────────────┘ Теперь, надеемся, Вам понятно, что действие, например, операторов: SCREEN 1:SPRITE$(0)=STRING(8,255) эквивалентно действию цикла: FOR I=0 TO 7:VPOKE &H3800+I,255:NEXT П р и м е р 1. ───▲── ────────────── └─ BASE(1*5+4) 10 SCREEN 1,0 20 A$="Microsoft" 8 байтов 8 байтов 8 байтов 30 FORI=1TOLEN(A$):┌────────────────┬────────────────┬────────────────┐ B$=MID$(A$,I,1) │ "Место" в SGT │ "Место" в SGT │ "Место в SGT │ 50 VPOKEBASE(1*5+4)│для 0-го спрайта│для 1-го спрайта│для 2-го спрайта│ +8*2+(I-1),ASC(B$) └────────────────┴────────────────┴▲───────────────┘ 60 NEXT │ 70 PRINT SPRITE$(2) BASE(1*5+4)+8*2 Атрибут (от лат. Attribuo - придаю, наделяю), необходимое,сущест- венное, неотъемлемое свойство объекта. Советский Энциклопедический Словарь 2. В 128 байтах Таблицы атрибутов спрайтов (Таблицы SAT) кодируется ин- формация о с п о с о б е вывода образов (шаблонов) спрайтов на экран.По- скольку одновременно на экране могут отображаться не более 32 спрайтов,то атрибуты одного спрайта кодируются в 128/32 = 4 байтах. Вероятно, Вас заинтересует их содержимое? Поспешим удовлетворить Ваше любопытство: Б а й т ы Таблицы SAT ┌──────────────┬──────────────┬──────────────┬───────────────┐ │ Первый байт │ Второй байт │ Третий байт │ Четвертый байт│ └──────▲───────┴───────▲──────┴───────▲──────┴────────▲──────┘ │ │ │ │ Координата Y Координата X Номер шаблона Номер (0÷255) (0÷255) в SGT (0÷255) палитры Отметим, что если величина Y-координаты спрайта равна 216,то все спрай- ты с меньшим приоритетом не будут отображаться. Например, если Y-координа- та спрайта с номером 10 равна 216,то спрайты с номерами от 10 до 31 не бу- дут отображаться. Если размер спрайта - 16╳16, то,как известно, одному спрайту соответст- вуют ч е т ы р е номера шаблонов спрайта. В этом случае можно задать лю- бой из четырех номеров шаблонов спрайта! Таким образом, если мы обозначим A0 - начальный адрес Таблицы SAT, то оператор PUT SPRITE SN,(X,Y),C,NP эквивалентен следующим операторам: AD=A0+4*SN:VPOKE AD,Y:VPOKE AD+1,X:VPOKE AD+2,NP:VPOKE AD+3,C ▲ ▲ ▲ ▲ ▲ └─!!! └─!!! └─!!! └─!!! └─!!! П р и м е р 2. 10 COLOR 1,15,8:SCREEN 1,1:SPRITE$(20)="СПРАЙТ!" ───────────── 20 PUT SPRITE 2,(165,38),7,20 30 ? "X=";VPEEK(6921):? "Y="VPEEK(6920):?"Цвет номер"; VPEEK(6923):?"Шаблон";VPEEK(6922) 40 FOR T=0 TO 8:? CHR$(VPEEK(14336+VPEEK(6922)*8+T));: NEXT Рассмотрим подробнее четвертый байт Таблицы SAT для какого-нибудь вы- бранного спрайта. ┌───┬───┬───┬───┬───┬───┬───┬───┐ Старший бит│ │ 0 │ 0 │ 0 │ Цвет спрайта │ Младший бит └─▲─┴───┴───┴───┴───┴───┴───┴───┘ └── Синхронизирующий бит (его имя EC) Его м л а д ш и е четыре бита определяют текущий ц в е т спрайта (для высвечиваемых точек шаблона). Невысвечиваемые точки шаблона "окраше- ны" в прозрачный цвет. Старший бит этого байта называется с и н х р о н и з и р у ю щ и м. Если его значение равно 1 , то положение спрайта смещается в л е в о на 32 точки. П р и м е р 3. "Работа" синхронизирующего бита. ───────────── 20 COLOR 1,15,15 30 SCREEN 1,3:WIDTH 30 40 SPRITE$(0)=STRING$(32,255) 50 PUT SPRITE 0,(80,80),8,0 60 VPOKE 6915,&B10001000 61 ' ▲ 63 ' │──────────── 1 - координаты спрайта (X-32,Y) 65 ' └──────────── 0 - координаты спрайта (X,Y) 70 LOCATE 2,8,0:PRINT"Нажмите клавишу" 80 A$=INPUT$(1) 90 VPOKE 6915,&B00001000 100 END Разумеется, при программировании на языке MSX-BASIC лучше использовать оператор PUT SPRITE, а не последовательность операторов VPOKE. ┌──────────────────────────────────────────────────────────────┐ │ Однако, последовательность операторов VPOKE гораздо проще │ │ моделировать на м а ш и н н о м я з ы к е, чем оператор │ │ PUT SPRITE │ └──────────────────────────────────────────────────────────────┘ Более того,знание структуры Таблицы SAT позволяет "прочитать" атрибуты спрайта непосредственно из п а м я т и ! П р и м е р 4. Превращение белого спрайта в черный и наоборот. ───────────── 10 COLOR 1,4,8:SCREEN 1,1 20 SPRITE$(0)=STRING$(8,255) 30 PUT SPRITE 0,(115,80),15,0 40 IF INKEY$="" THEN 40 50 GOSUB 100:GOTO 40 100 VPOKE &H1B03,VPEEK(&H1B03) XOR 14 'BASE(1*5+3) ──▶ &H1B00 110 RETURN ──────────▲───────── │ &b00001111 XOR &b00001110 = &b00000001 ──▶ цвет 1 Оператор SCREEN инициализирует четыре байта Таблицы SAT, кодирующих ат- рибуты одного спрайта, следующим образом: ┌──────────────┬──────────────┬──────────────┬───────────────┐ │ Первый байт │ Второй байт │ Третий байт │ Четвертый байт│ └──────▲───────┴───────▲──────┴───────▲──────┴────────▲──────┘ │ │ │ │ Координата Y Координата X Номер шаблона Текущий цвет в Таблице SGT изображения К о о р д и н а т а Y отображения спрайта по умолчанию приведена в следующей табличке (из нее видно, что при таких Y неважно, каково Х): ┌──────────────────┬─────┬─────┐ │ Серия компьютера │MSX-1│MSX-2│ │──────────────────┼─────┼─────┤ │ Р е ж и м экрана│ Y │ Y │ │──────────────────┼─────┼─────┤ │ SCREEN 1 │ 209 │ 209 │ │ SCREEN 2 │ 209 │ 209 │ │ SCREEN 3 │ 209 │ 209 │ │ SCREEN 4 │ │ 217 │ │ SCREEN 5 │ │ 217 │ │ SCREEN 6 │ │ 217 │ │ SCREEN 7 │ │ 217 │ │ SCREEN 8 │ │ 217 │ └──────────────────┴─────┴─────┘ С учетом значения координаты Y спрайт является н е в и д и м ы м. Ко- ордината Y обладает интересной особенностью. Если Y-координата спрайта с номером N равна 209 (в режимах SCREEN 1,SCREEN 2,SCREEN 3) или 217 (в ре- жимах SCREEN 4,SCREEN 5,SCREEN 6,SCREEN 7,SCREEN 8),то этот спрайт не ото- бражается на экране. Самое интересное заключается в том, что не отобража- ются и все остальные спрайты с номерами, большими, чем N. П р и м е р 5. ───────────── 10 DIM X(3):SCREEN 2,0 20 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 60 PUT SPRITE 2,(X(2),Y),8,2 70 Y=Y+1:IF Y>208 THEN BEEP:A$=INPUT$(1):END 'Исчезли два спрайта! 80 GOTO 60 "Э к р а н н ы й" н о м е р спрайта по умолчанию равен номеру шабло- на спрайта. Ц в е т о м спрайта по умолчанию является текущий цвет изображения. ┌───────────────────────────────────────────────────────────────┐ 3. │ Таблица SCT используется только в режимах SCREEN 4 ÷ SCREEN 8 │. └───────────────────────────────────────────────────────────────┘ Базовый адрес Таблицы цветов спрайтов (SCT) будет всегда автоматически вычисляться вычитанием числа 512 из базового адреса Таблицы атрибутов спрайтов (SAT). С помощью SCT можно моделировать оператор COLOR SPRITE$(), который,как Вы, конечно, помните, позволяет определить цвет для высвечиваемых точек шаблона спрайта для к а ж д о й спрайтовой линии (цвет невысвечиваемых точек шаблона спрайта всегда п р о з р а ч н ы й). Так как для каждого из 32 спрайтов необходимо хранить информацию макси- мум о 16 спрайтовых линиях различного цвета, эта Таблица занимает 32·16 = 512 байтов VRAM . ┌────────────────────────────────────────────────────────────┐ │ Адрес байта, начиная с которого располагается информация о │ │ ц в е т е спрайта в Таблице SCT, вычисляется по формуле: │ │ AD = A0 + 16·SN │ │ где: A0 - адрес начала Таблицы SCT; │ │ SN - номер шаблона спрайта . │ └────────────────────────────────────────────────────────────┘ П р и м е р 6. Вторая спрайтовая линия изображения девятого спрайта ───────────── раскрашена восьмым цветом. 10 COLOR 15,1,8:SCREEN 4,0 20 SPRITE$(3)="пример":PUT SPRITE 9,(40,80),15,3 40 VPOKE &H1C00+16*9+2,8 50 GOTO 50 Заметим, что для информации о цвете шаблона спрайта размером 8╳8 точек отводятся т о л ь к о 16 младших полубайтов 16-ти байтов SCT, отводимых для одного шаблона. Опишем содержимое оставшихся 16-ти с т а р ш и х полубайтов... Оказывается с их помощью можно разрешить или запретить приоритеты спрай- тов, обработать определенным образом столкновения и задать или отменить так называемое "опережение" для спрайта. Изобразим схематически Таблицу SCT... Н о м е р а б и т о в ┌────┬────┬────┬────┬───┬───┬───┬───┐ │ 7 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │ 0 │ ├────┼────────────┼───┴───┴───┴───┤ 0 байт│ │ │ │ 0 │ Код цвета │ Спр.лин. 1 для спрайта 0 ├────┼────┼────┼────┼───────────────┤ 1 байт│ │ │ │ 0 │ Код цвета │ Спр.лин. 2 для спрайта 0 ├────┴────┴────┴────┴───────────────┤ ··· │ ··· ··· │ ··· ├────┬────┬────┬────┬───────────────┤ 15 байт│ │ │ │ 0 │ Код цвета │ Спр.лин. 16 для спрайта 0 ├────┴────┴────┴────┼───────────────┤ │ ··· │ ··· │ ├────┬────┬────┬────┼───────────────┤ 496 байт│ │ │ │ 0 │ Код цвета │ Спр.лин. 1 для спрайта 31 ├────┼────┼────┼────┼───────────────┤ 497 байт│ │ │ │ 0 │ Код цвета │ Спр.лин. 2 для спрайта 31 ├────┴────┴────┴────┼───────────────┤ ··· │ ··· │ ··· │ ├────┬────┬────┬────┼───────────────┤ 511 байт│ │ │ │ 0 │ Код цвета │ Спр.лин. 16 для спрайта 31 └──▲─┴──▲─┴──▲─┴────┴───────────────┘ │ │ └─ Бит IC (определитель столкновений):1-нет, 0-да; │ └────── Бит CC (разрешение приоритета) :0-нет, 1-да; └─────────── Бит EC ("опережение") :1- да, 0-нет. В режиме спрайтов 2, если СС-бит Таблицы SCT установлен в 1, порядок приоритетности спрайтов для данной спрайтовой линии о т м е н я е т с я . Спрайтовая линия, для которой бит СС установлен в 1 , будет отображаться только на горизонтальных линиях,где существуют спрайты с низшими номерами. Отметим, что и в этом случае, если на одной линии экрана более 8 спрай- тов, то д е в я т ы й спрайт и все последующие не будут изображаться на экране дисплея. Более того не фиксируется столкновение спрайта, для которого с SCT бит СС установлен в 1, с другим спрайтом (даже если у этого спрайта в SCT бит СС установлен в 0). В этом случае для пересекающихся спрайтов над их цве- товыми кодами производится логическая операция OR. Говорят, что в режиме SCREEN 6 цвет фона и цвета спрайтов подвергаются а п п а р а т н о м у т и л и н г у. Эти цвета кодируются четыремя би- тами: два с т а р ш и х бита определяют код цвета нечетных точек, а два м л а д ш и х бита определяют код цвета четных точек по X-координате (от 0 до 511). В режиме SCREEN 6 размер одной точки спрайта в 2 раза больше,чем у гра- фической точки (пикселя), однако, за счет наличия аппаратного тилинга, од- на точка спрайта может обладать двумя цветами одновременно (четные и не- четные точки фонового цвета могут быть определены таким же образом). ┌─────────────────── Четные точки (0,2,...,510) │ ┌────────────── Нечетные точки (1,3,...,511) ┌──▼─┬──▼─┐ │ │ │ Д в е графические точки └────┴────┘ ┌────┬────┐ │ │ │ О д н а точка спрайта └──▲─┴─▲──┘ │ │ ┌───┬───┐ ┌───┬───┐ │ █ │ █ │ │ █ │ █ │ Биты, определяющие цвета спрайта └───┴───┘ └───┴───┘ Приведем табличку начальных адресов Таблиц SCT для различных режимов: ┌────────────┬─────────────┐ │ Р е ж и м │ А д р е с │ ├────────────┼─────────────┤ │ SCREEN 4 │ &H1C00 │ │ SCREEN 5 │ &H7400 │ │ SCREEN 6 │ &H7400 │ │ SCREEN 7 │ &HF800 │ │ SCREEN 8 │ &HF800 │ └────────────┴─────────────┘ Отметим, что 16 байтов Таблицы SCT, отвечающих за цвет спрайта,первона- чально инициализируются текущим цветом изображения или цветом, заданным в операторе PUT SPRITE. "Содержимое" этих байтов может быть переопределено непосредственно операторами VPOKE или оператором COLOR SPRITE() (COLOR SPRITE$()). В режиме SCREEN 8 цвета спрайта фиксированы и не зависят от регистра палитры. Цвета спрайта в режиме SCREEN 8 показаны на следующей таблице. ┌─────────────────┬─────────────┬─────────────┬────────────┐ │ Код цвета │ Зеленый │ Красный │ Синий │ │ С3 С2 С1 С0 │ G2 G1 G0 │ R2 R1 R0 │ B2 B1 B0 │ ├─────────────────┼─────────────┼─────────────┼────────────┤ │ 0 0 0 0 │ 0 0 0 │ 0 0 0 │ 0 0 0 │ │ 0 0 0 1 │ 0 0 0 │ 0 0 0 │ 0 1 0 │ │ 0 0 1 0 │ 0 0 0 │ 0 1 1 │ 0 0 0 │ │ 0 0 1 1 │ 0 0 0 │ 0 1 1 │ 0 1 0 │ │ │ │ │ │ │ 0 1 0 0 │ 0 1 1 │ 0 0 0 │ 0 0 0 │ │ 0 1 0 1 │ 0 1 1 │ 0 0 0 │ 0 1 0 │ │ 0 1 1 0 │ 0 1 1 │ 0 1 1 │ 0 0 0 │ │ 0 1 1 1 │ 0 1 1 │ 0 1 1 │ 0 1 0 │ │ │ │ │ │ │ 1 0 0 0 │ 1 0 0 │ 1 1 1 │ 0 1 0 │ │ 1 0 0 1 │ 0 0 0 │ 0 0 0 │ 1 1 1 │ │ 1 0 1 0 │ 0 0 0 │ 1 1 1 │ 0 0 0 │ │ 1 0 1 1 │ 0 0 0 │ 1 1 1 │ 1 1 1 │ │ │ │ │ │ │ 1 1 0 0 │ 1 1 1 │ 0 0 0 │ 0 0 0 │ │ 1 1 0 1 │ 1 1 1 │ 0 0 0 │ 1 1 1 │ │ 1 1 1 0 │ 1 1 1 │ 1 1 1 │ 0 0 0 │ │ 1 1 1 1 │ 1 1 1 │ 1 1 1 │ 1 1 1 │ └─────────────────┴─────────────┴─────────────┴────────────┘