Из журнала ZX-Guide#2, Рязань, Ноябрь 1999 О мультиколоре вообще и MC24 в частности.  AlCo Первый вопрос,который мучает юзера,уви- девшего на экране красивый мультиколорный эффект,- как в одном знакоместе помещается столько цветов? К счастью,в последнее время программис- ты понемногу развязали свои языки (а иног- да и кое-кто из непрограммистов сам дохо- дит), и в компьютерной прессе начали появ- ляться небольшие статейки, подчас только намёки на принцип действия эффекта. Я же собираюсь проделать в этой статье объёмис- тый труд: подытожить свои и чужие достиже- ния в этой области и,конечно же,рассказать о практической стороне этого вопроса. Глава 1. Общий принцип. Эффекты мультиколорные наиболее всего близки к эффектам бордерным - по загружен- ности процессора и непереносимости на кло- ны. Близки они также к знаменитой проблеме <юлы>, или <разрыва>: когда луч развёртки догоняет построение картинки,в нижней час- ти экрана виден предыдущий кадр, тогда как наверху - нужный(или наоборот),а разделяет их полоса разрыва, или <зеркало>. В первую очередь нужно понять принцип отображения экрана. 66% времени на экране отображается либо бордюр,либо ничего (идут обратные ходы ра- звёртки).Остальное время из памяти (а точ- нее, из текущей видеостраницы) выбираются два байта:маска и атрибут,они по известным принципам накладываются и в течение 4 так- тов отображаются на экран в виде 8 точек. Из этого напрямую следует, что каждый байт атрибута читается восемь раз - явно расточительно,хотя попробуй-ка реализовать по-другому. Этим мы и пользуемся:если бай- ты атрибутов менять вовремя, то знакоместа упадут по высоте. Идеальный размер мульти- колорного знакоместа - 1x8 пикселей - на нетурбированной машине недостижим для все- го экрана. Часто используется знакоместо 2x8 - мажь хоть весь экран,еще время оста- нется. Режим 4x8 ещё проще - нужно просто переключать экранные странички. Глава 2. Константы. Перечисляем параметры развёртки у <Пен- тагона>, как наиболее стандартной машины в недалёком прошлом, но утопленной в бурном потоке тормозных клонов (в первую очередь это <Скорпион>). - Длина фрейма (сколько тактов между раз- вёртками 2 соседних кадров)- 71680 тактов. - Длина строки - 224 такта. - Прерывание начинается - с НАЧАЛА обрат- ного хода развёртки. - Строк в верхней части бордера - 64. - Строк в нижней части бордера - 48. - Всего строк на экране - 304=38*8. - Включая невидимые - 320=40*8. - Отсюда:тактов до верхнего края графиче- ского экрана - 17920=80*224. (Вообще для построения мультиколора нужно знать только две постоянные - длину строки и число так- тов до верхнего края. Последний параметр у Профи и ATM равен 14336,у остальных клонов неизвестен.) Глава 3. Классика. Дата изобретения мультиколоров неизвес- тна,равно как и неизвестен изобретатель. В пакете SuperCode(1983) таких процедур нет, хотя присутствуют уже статичные полосы на бордере. Возможно, для выяснения этих воп- росов следует хорошенько порыться в подбо- рках или , но на русском языке эти журналы не издава- лись,а достать оригинал проблематично. По- сему, только факты: Большинство известных классических му- льтиколоров датируется 1985-86 гг.,как го- дами наибольшего спектрумовского <бума>. Иногда мультиколорное знакоместо заме- няло полосы на бордюре - этот эффект испо- льзован в копировщике . В играх ,, бегающие мультиколорные по- лоски присутствуют в игровом меню.В они есть в меню выбора предметов. Программы тогдашних корифеев машинного кода (Джеймса Хатчби,братьев Оливер), да и все испанские программы обходятся без му- льтиколорных эффектов.Пренебрежение ли это или затруднения с освоением эффекта - неи- звестно. Позже в странах Восточной Европы нача- лись реальные эксперименты в этой области. Полоски старались уже делать горизонталь- ными и совместить с бордерными. (Хотя бор- дерные полоски уже пробовали совмещать со стандартным экраном: Italian SuperCar(Code Masters), тот же Venom.) Классический при- мер - 2-я часть Shock megademo (ESI, Поль- ша).Сразу оговорюсь:не они первые.Была ка- кая-то демка без музыки:на бордере и экра- не от центральной линии быстро бежали ра- дужные полоски. Наши люди быстро освоили эффект. Первая (не гарантирую!) мультиколорная картинка была в Gift MULTDEMO (Flash Inc.) Состояла она из восьмицветных точек 1x4 и имела размер 16*16 знакомест. Самой знаменитой мультиколорной картин- кой была,конечно,CodeBusters'овская.Демон- страция Satisfaction(1994) была в то время настоящим открытием. Люди липли к экранам, пытаясь понять, как же,чёрт побери,это всё сделано. Ну, не считая тех товарищей,кото- рые, не разбираясь особо в тонкостях прог- раммирования на ассемблере, просто слушали цифровой музон из другой части демо ;).Он, кстати,до сих пор непревзойдён,равно как и картинка... Картинка демонстрировалась в окне 14*14.(Почему не 16*16?Потому что шёл мэппинг,а это лишних 25 тактов на строку.) С этого времени традиции в мультиколоре задавал исключительно RST7. EYE ACHE (1996) - режим 4x4 в 8 цветов. До этого его никто (по крайней мере, неиз- вестно, кто) не использовал. А тут - Real Time MultiColor Rotator площадью две с по- ловиной тыщи точек! Zoom Rotator 4x4/8 был в BINARYLOVE(D.R.,1997).(Алгоритм,конечно, не имеет ничего общего, но главное-то - идея!) Sine Plasma в режиме 1x8 - тоже не очень плохой эффект. Повторён (на окошке в 1/4 экрана) в буржуйской демке LAZARUS. EYE ACHE 2 (1997) - 2 SinePlasm'ы в ре- жиме 2x8, который до тех пор использовался только в неплавных эффектах (см.ECHOLOGY). 3 эффекта в разрешении 4x4/8.Mars в ориги- нальном MultiColor режиме 1x8/64. Картинки в режиме 4x4/64 (штриховка по горизонтали) и одна в режиме 2x2/8 (в эпилоге почему-то названо 2x2/2048 ?-/) 1 (адын) раз где-йто использовался мер- цающий вариант 4x4/64. Sineplasma 2x4/8 повторена в TV-X (Real Masters, 1998). Ещё несколько великолепных эффектов в режиме 4x4/64 являются достой- ным украшением их демо ANAMNESIS. Глава 4. Практическая реализация. Рассмотрим реализацию мультиколора 1x8. Что требуется: после прихода прерывания обождать до верхней части экрана и в верх- нем знакоместе накидать какую-нибудь муру. До верхней части экрана должно пройти заранее известное число тактов,так что пе- рвый режим прерывания ни в коем случае ис- пользовать нельзя. Поэтому включим второй режим и повесим на него мультиколор: ATTRS EQU 0 ;АДРЕС АТРИБУТОВ МУЛЬТИКОЛОРА ORG 24576 CALL SETIM ;УСТАНОВИМ ПРЕРЫВАНИЕ CALL 8020 JR C,$-3 ;ОБОЖДЁМ ДО БРЕЙКА IM 1 RET SETIM LD HL,IMER LD DE,65524 LD BC,12 LDIR ;ПЕРЕНОС ОБРАБОТЧИКА ПРЕРЫВАНИЙ LD A,59 ;59-Й ВЕКТОР ПРЕРЫВАНИЙ LD I,A ;УКАЗЫВАЕТ НА 65535 IM 2 RET IMER PUSH AF PUSH BC PUSH HL CALL PROG POP HL POP BC POP AF RST 56 ;МОЖНО ЮЗАТЬ ИЗ БЕЙСИКА RET JR IMER PROG PUSH DE ;МОЖНО И В IMER,НО...УВИДИШЬ LD HL,679 ;ИЛИ 541 ДЛЯ ПРОФИ DEC HL LD A,H OR L JR NZ,$-3 ;ПАУЗУ,ВРОДЕ,КРУТАНУЛИ LD HL,ATTRS LD A,8 ;ОСЕМЬ СТРОК ПИХАЕМ PROG0 LD DE,#5800 ;АДРЕС АТРИБУТОВ ЭКРАНА LD BC,9 LDIR NOP DEC A JR NZ,PROG0 ;10+10+184+4+4+12=224 POP DE RET Вы не находите, что 9 CHR$ - узковато для мультиколора? Тогда заменим LDIR на LDI: PROG PUSH DE LD HL,679 DEC HL LD A,H OR L JR NZ,$-3 LD HL,ATTRS LD DE,#5800 LD A,E LD BC,#8FF ;ШОП БЭ НЕ МЕНЯЛАСЬ:) PROG0 DUP 13 LDI EDUP LD E,A DJNZ PROG0 ;=225(ПОКА НЕ СУТЬ ВАЖНО) POP DE RET Всё равно узко, но что поделаешь - цикл есть цикл, а LDI есть LDI. Следует запом- нить, что в реальных мультиколорах циклов не используют, а взамен надувают (иногда этот процесс называется DeCrunch), напри- мер, такую программу: POP HL \ LD (NN),HL | POP HL | LD (NN+2),HL | ... | 8*26+16=224 такта. POP HL |-вся эта лабуда повто- LD (NN+14),HL| ряется много раз(ско- NOP | лько строк на экране) NOP | NOP | NOP / Процесс, подобный этому, часто называют <вывод через стек>, хотя его надо скорее называть <ввод через стек>,так как настоя- щий вывод через стек идёт с помощью PUSH. Часто POP-метод используется при печати спрайтов (быстрее и одна регистровая пара освобождается). Программу, которая создаёт такие после- довательности, я обычно называю мэйкером. Вставим его в нашу программу: MAKER LD HL,TABLO LD DE,#5800 LD C,12 ;12 ЗНАКОМЕСТ В ВЫСОТУ MAK0 LD B,8 ;8 ЛИНИЙ В ЗНАКОМЕСТЕ MAK1 PUSH BC PUSH DE LD B,8 MAK2 LD (HL),225 ;POP HL INC HL LD (HL),34 ;LD (..),HL INC HL LD (HL),E INC HL LD (HL),D INC HL INC E INC E DJNZ MAK2 LD B,4 MAK3 LD (HL),0 ;NOP INC HL DJNZ MAK3 POP DE POP BC DJNZ MAK1 LD A,E ;ПЕРЕХОДИМ ADD A,32 ;К СЛЕДУЮЩЕМУ LD E,A ;ЗНАКОМЕСТУ JR NC,$+3 ;(ИЗВЕСТНАЯ ПРОЦЕДУРА INC D ;8+16->16) DEC C JR NZ,MAK0 LD (HL),49 ;LD SP, INC HL LD (PROG+2),HL INC HL INC HL LD (HL),201 ;RET RET PROG LD (0),SP ;СОХРАНЯЕМ SP (НЕ ПЗУ,COZ) LD HL,679 DEC HL LD A,H OR L JR NZ,$-3 LD SP,ATTRS TABLO Перед CALL SETIM,разумеется,должно сто- ять CALL MAKER. Таким образом (если,конечно,я не навер- тел ошибок) обычно делают мультиколор а-ля MEGASCREEN.Изменением количества (и содер- жимого) пустых команд и константы в PROG можно подстроить его под разные типы ком- пьютеров. Программу можно ещё более упростить, но тогда она нерестанет быть столь универса- льной: восьмикратное повторение идентичных команд следует заключить в цикл; тогда ра- бочая часть станет в восемь раз короче, а мэйкер даже чуть-чуть упростится. LD C,A METKA POP HL LD (NN),HL POP HL LD (NN+2),HL ... POP HL LD (NN+14),HL DEC C JR NZ,METKA NOP/4 ;СЕЙ НОП ОДИН РАЗ ЗА 4 CHR$ С помощью дополнительных ухищрений мож- но тем же методом кинуть 18CHR$ MultiColor - для этого верхние линии всех знакомест нужно заполнять атрибутами заранее,в самом начале прерывания. В одном из номеров ZX- Ревю кто-то назвал этот мультиколор самым широким из достижимых на Pentagon. Глава 5. Мультиколор в 24 CHR$. Как известно,POP-метод не есть best ме- тод.По крайней мере,я уже прошёлся по это- му вопросу в предыдущем номере журнала.Так что теперь посмотрим,на что способен PUSH. LD DE,... PUSH DE ... Очень неудобно,особенно в нашем случае, что PUSH работает в сторону уменьшения ад- ресов.Если так заполнять каждую строчку,то мы увидим на экране <юлу>. Её можно обойти несколькими способами, поэтому оставим эту проблему. Тут есть проблема посложнее. Попробуйте посчитать максимальную шири- ну мультиколора через PUSH: l = 224 / 10.5 = 21.3333!!! Что же теперь - совсем забрасывать эту идею? Не стоит, если вспомнить, что: 1) 18CHR$ MultiColor тоже <невозможен>; 2) у 128k есть вторая экранная область. Метод заключается в том,что предварите- льно заполняются ДВЕ верхние строчки в ка- ждом знакоместе,поэтому непосредственно во время построения экрана придётся обрабаты- вать всего 24 * 6 = 144 байта за 224 * 8 = 1792 такта; итого 1792 / 144 ў 12.4 тактов на байт. Вот это уже больше похоже на реаль- ность. Хотя некоторый процент времени займёт переключение экранных страничек, да и не все байты кидаются через PUSH: кое-какие и через LD... Как только луч начинает прори- совывать первый байт в знакоместной стро- ке, мультиколор вслед за ним начинает ме- нять байты на экране. После того,как стро- ка будет заполнена, заполняется строчка на другой экранной странице.Разумеется,каждые 224 такта нужно переключать экраны.Мульти- колор начинает всё больше и больше отста- вать от развёртки, и,когда она обгонит его на два круга и уже сидит у него на хвосте, он быстро выкидывает последние свои байты из индексных регистров (предварительно за- полненных, конечно). Чтобы понять, какая это красота,надо её написать самому. Исходник программы, которая реализует этот мультиколор, лежит в Барахле. Называ- ется он MC24.H. Глава 6. Мультиколор во весь экран. На каждой мультиколорной картинке попа- даются <немультиколорные> области, где ат- рибут знакоместа 1x8 совпадает с атрибутом соседнего с ним сверху знакоместа. Поэтому можно использовать движок от 18CHR$ Multi- Color, убирая в нём ненужные POP-LD. Коне- чно, не каждая картинка вытерпит такую <упаковку>,но в этом случае можно написать какой-нибудь очень умный алгоритм <оптими- зации>. В примере(STARWARS.H) процедура оптими- зации пробная и не оптимизированная :-). Помните: к эффектам этот метод неприме- ним! (Хотя, конечно, если вы...то..) Глава 7. Мультиколор 2x8. Достижим на всей площади экрана даже при внешней таблице атрибутов (чего нельзя сказать о MC24). Используется метод POP-LD без каких-либо наворотов: OUT (C),D NOP POP HL LD (#5800),HL POP HL LD (#5802),HL ... POP HL LD (#581E),HL OUT (C),E NOP POP HL LD (#D800),HL POP HL LD (#D802),HL ... POP HL LD (#D81E),HL и т.д. Как вы,наверное,уже догадались,BC долж- но быть равно 32765, D = 31, E = 23. Глава 8. Мультиколорные экранные режимы. С помощью мультиколоров и X-color'ов на Speccy возможно около 40 различных графи- ческих режимов. Перечислю их. MC значит MultiColor, т.е просто сжатое знакоместо; GREY значит цвета,получаемые с помощью штриховки; COL значит,что цвет ка- ждой точки не зависит от цветов соседних точек; OPT значит,что есть некоторые огра- ничения на отображаемую картинку.Последнее число в строчке - число<перемаргивающихся> экранов. Некоторые из режимов содержат другие режимы как подмножества.Если указано число цветов,то всегда можно использовать меньше ;). Standard screen MC 1x8 MC 2x8 MC 4x8 95-color/2 (Mortal Kombat) 95-MC 1x8/2 95-MC 2x8/2 95-MC 4x8/2 8 COL 64x192 (MULTDEMO) 8 COL 64X96 (ECHOLOGY) 8 COL 64X48 (EYE ACHE) 8 COL 32x48 8 COL 64X24 (WOLFDEMO) 64 COL 64x192/2 64 COL 64x96/2 64 COL 64x48 (EYE ACHE 2) 64 COL 32x128 (EYE ACHE 2) 256 COL 64x48/2 (4R,4G,4B,4W) 512 COL 64x48/2 (8R,8G,8B) 64 COL 32x24 (VIBRATIONS) 2 COL 512x192/2 3 OPT 256x192 4 COL 256x192/2 5 OPT 256x192/2 8 COL 256X192/3 16 COL 128x96/2 (RGBW) 81 COL 128x96/2 (3R,3G,3B,3W) 256 COL 128x96/2 (4R,4G,4B,4W) 4 COL 128x96/2 (EYE ACHE) 22 COL 128x96/2 (цветные точки) 4 COL 256X96 8 OPT 128x192 (3 цвета для 4 точек) 8 OPT 128X96 (EYE ACHE 2) 15 OPT 96x96 95 OPT 96x96 5 GREY 128x96 7 GREY 128x64 (каждый сходит 7 GREY 86x96 с ума по-своему...) 9 GREY 64x96 9 GREY 128x48 10 GREY 86x64 (SHIT 4 BRAIN) 7 GREY 128x96 (в мультиколоре) 9 BLUE 128x96 (с синим отливом) 17 GREY 64X48 (чанки) Вполне возможно, что я что-то забыл или упустил из виду. Если так, то сообщите мне об этом, пожалуйста.