#

Программирование - О мультиколоре вообще и программе MC24 в частности.

<b>Программирование</b> - О мультиколоре вообще и программе MC24 в частности.
 О мультиколоре вообще и 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) таких процедур нет,
хотя  присутствуют уже статичные полосы на
бордере. Возможно, для выяснения этих воп-
росов следует хорошенько порыться в подбо-
рках <Sinclair User>  или <Your Sinclair>,
но на русском языке эти журналы не издава-
лись,а достать оригинал проблематично. По-
сему, только факты:
   Большинство  известных классических му-
льтиколоров датируется 1985-86 гг.,как го-
дами наибольшего спектрумовского <бума>.
   Иногда  мультиколорное знакоместо заме-
няло полосы на бордюре - этот эффект испо-
льзован в копировщике <Last hope>.
   В играх <Venom strikes back>,<Puzznic>,
<Little  Puff> бегающие мультиколорные по-
лоски присутствуют в игровом меню.В <Monty
run> они есть в меню выбора предметов.
   Программы  тогдашних корифеев машинного
кода (Джеймса Хатчби,братьев Оливер), да и
все испанские программы  обходятся без му-
льтиколорных эффектов.Пренебрежение ли это
или затруднения с освоением эффекта - неи-
звестно.
   Позже  в странах Восточной Европы нача-
лись реальные эксперименты в этой области.
Полоски  старались уже делать горизонталь-
ными и совместить с бордерными. (Хотя бор-
дерные  полоски уже пробовали совмещать со
стандартным экраном: 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 повторена  в EMERGENGY
(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
     83-color/2 (Mortal Kombat)
     83-MC 1x8/2
     83-MC 2x8/2
     83-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
     83 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 (чанки)

   Вполне возможно, что я что-то забыл или
упустил из виду. Если так, то сообщите мне
об этом, пожалуйста.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Крутые глюки - о хорошей телефоной связи.
Про педиков - они ебутся!
Юмор - анекдоты.
Игротека - описание игры The Scoched Earth. Пара секретов по игре Mortal Kombat.
News - выпущен ZX-Guide#4.5, выпустили RiP#15, прошли CAFe и Paradox, Nik-O выступил с идеей провести виртуальное пати.

В этот день...   20 апреля