Из журнала ZX Format #5, Санкт-Петербург, 12.12.1996 Об эффектах на бордюре и кое о чём ещё. (C) MIK 20.10.1996 _________________________________________ Идея данной статьи родилась после прочте- ния некоторых статей, опубликованых в ZX-РЕВЮ, посвящённых BORDER эффектам. В результате ознакомления с ними у меня сложилось впечатление, что либо я подошёл к данным вопросам как-то не так, либо ав- торы статей (не в обиду им сказано) не знают достаточно по этой теме, либо скры- вают такую "секретную" информацию. Далее я постараюсь как можно подробнее разоб- рать принцип создания упомянутых эффек- тов. Сразу прошу прощения за то, что могу упустить кое какие мелочи так-как мне они представляются очевидными вещами. Итак начнём : Глава I. Самые простые эффекты . Самое простое , что удалось придумать так сходу оказалось BASICом : 10 BORDER 1: BORDER 2 : BORDER 3 : BORDER 4: BORDER 5 : GOTO 10 Результатом данного действа окажутся цветные полосы мигающие по BORDERу . На- баловавшись этой программой вы несомненно придёте к выводу о том , что было-бы не- дурно прибить их намертво к определённым местам на BORDERе. Так как эксперементы с молотком и гвоздями вряд ли помогут, придётся рассмотреть программное решение этой простой (!) проблемы. Но для начала немного ликбеза : Компьютер всё время занимается тем, что строит картинку на на вашем (да и на моём тоже) экране. Происходит это так : С при- ходом кадрового синхроимпульса (попросту сигнала, означающего что луч, формирующий картинку, находится в верхнем левом углу экрана) микросхема ULA (не ищите её на плате, если у вас не фирменный SPECTRUM) начинает передавать информацию о том, что именно надо построить. Эту информацию она получает из двух источников - порта #FE (254), а вернее от трёх его младших битов и из экранной области. Дeлает это ULA всё время но на разных компьютерах по разно- му, в большинстве машин каждые 4 такта процессора (точнее за время равное выпол- нению 4 тактов процессора) формируется информация в специальном регистре (к ре- гистрам процессора не имеет никакого от- ношения) о 8 точках которые предстоит построить, независимо от того относятся они к BORDERу или к основному экрану. В компьютере PENTAGON для бордюра данное правило не соблюдается, при построении его области информация о каждой точке за- ного запрашивается из порта #FE. Смысл сказанного будет пояснён далее при разбо- ре на примерах. Информация строится по строкам сверху вниз. На построение каждой строки тратит- ся определённое время, строго фиксирова- ное для данного компьютера (обычно 220 или 224 такта). Всего строится 312 или 320 строк. Нетрудно заметить, что коли- чество тактов которыми располагает про- цессор, есть произведение числа строк на число тактов в строке. Быстродействие то- го же пресловутого PENTAGONA - результат 320 строк * 224 такта в строке. Вышеизложенное повторяется 50 раз в се- кунду, всё время пока конпьютер не выклю- чат или он сам не сломается. Но существу- ет ещё один процесс повторяющийся 50 раз в секунду и аппаратно привязаный (?) к первому, а именно - обработка прерываний. Совкупность изложенной информации позво- ляет мне надеятся, что всё сказаное далее будет вами понято. Глава II . Твёрдо стояшие полосы на бодюре Сразу приведу пример, а потом его поясню. ORG 25000 DI LD HL,#B200 ;Установим LD DE,#B201 ;2ой режим LD BC,256 ;прерываний LD (HL),#B3 LD A,H LD I,A LDIR LD A,#C9 ;Обработчик состоит LD (#B3B3),A ;из одной команды RET IM 2 LOOP EI HALT DI LD B,255 ;Экран начал L1 LD A,1 ;строиться OUT (#FE),A ; синхронно с NOP ;ним работает NOP ;программа. NOP ;Здесь первая DJNZ L1 ;линия. DEC B L2 LD A,2 OUT (#FE),A ;А здесь рисуем NOP ; вторую. NOP NOP DJNZ L2 DEC B L3 LD A,3 OUT (#FE),A ;Далее третья. NOP NOP NOP DJNZ L3 DEC B L4 LD A,4 OUT (#FE),A ;Ещё одна. NOP NOP NOP DJNZ L4 DEC B L5 LD A,5 OUT (#FE),A ;И ещё. NOP NOP NOP DJNZ L5 DEC B L6 LD A,6 OUT (#FE),A NOP NOP NOP DJNZ L6 DEC B L7 LD A,7 OUT (#FE),A ;Последняя. NOP NOP NOP DJNZ L7 LD A,#7F ;Интересуемся IN A,(#FE) ;не нажата ли RRA ;ANY KEY . JP C,LOOP ;Если нет - всё IM 1 ;заново , RET ;иначе назад в ; TASM. Пояснения : 1.Команды NOP нужны для растягивания ли- ний по величине. 2.Часть программы находящуюся после ко- манды HALT можно при незначительных изме- нениях сделать обработчиком прерываний, и полосы будут работать паралельно с основ- ной программой. 3.Программа жестко привязана во времени (к сигналу INT), выполняется при каждом перестроении экрана, и каждый раз занима- ет одинаковое число тактов . Если что-то осталось непонятным, то ещё раз внимательно взгляните на программу или (что ещё лучше) попробуйте её изме- нять и посмотрите что выйдет. Глава III . Просто другая глава . Разобравшись с рисованием горизонтальных линий, можно заняться изображением верти- кальных линий. Но здесь поджидает один облом : заглянув в таблицу, в которой расписаны такты для каждой команды (т.е в приложение 1 в книге "Как написать игру на ассемблере" ) вы узнаёте, что самая быстрая команда работы с портами занимает 12 тактов CPU, а значит, как не старайся, чёрточки уже 24 точек не изобразить. Те- перь о самой технологии рисования верти- кальных линий. 1. Киньте в порт #FE какой-нибудь цвет, например белый. 2. Сразу за этим пошлите цвет который бу- дет фоновым (черный) 3. Выдержите паузу равную число тактов за которые строится строка в вашем компьюте- ре, минус число тактов потраченое на пункты один и два . 4 Повторите пункты 1-3 Поясняю на примере : Начало как и в прошлом примере ............ LOOP EI HALT ; далее совсем иначе LD D,7 LD E,0 LD A,80 LD C,#FE MAX OUT (C),D ; 12 тактов OUT (C),E ; 12 тактов OUT (C),D ; 12 тактов OUT (C),E ; 12 тактов OUT (C),D ; 12 тактов OUT (C),E ; 12 тактов OUT (C),D ; 12 тактов OUT (C),E ; 12 тактов OUT (C),D ; 12 тактов OUT (C),E ; 12 тактов OUT (C),D ; 12 тактов OUT (C),E ; 12 тактов OUT (C),D ; 12 тактов OUT (C),E ; 12 тактов OUT (C),D ; 12 тактов OUT (C),E ; 12 тактов ; Итого уже 192 такта NOP ; 4 такта NOP ; 4 такта NOP ; 4 такта DEC A ; 4 такта JR NZ,MAX ; 12 тактов ; в сумме набежало 220 тактов т.е. ; столько сколько по времени тратит ; мой компьютер на построение одной ; строки LD A,#7F IN A,(#FE) RRA JP C,LOOP IM 1 RET По идее после запуска программы вы должны получить вертикальные полосы вверху экра- на, если полосы скошены вбок то измените число NOPов внутри цикла (увеличте или уменьшите). Возможен вариант что полосы будут зверским образом дергаться (если у вас PENTAGON,то такого никогда не будет) выход из этого положения таков : вставить после HALTа команду (или команды) выпол- няющуюся за время не кратное 4-м тактам. Например попробуйте : LD A,(0) 13 тактов 3*4+1 или DEC DE 6 тактов 4+2 или ADC A,(HL) 7 тактов 4+3 Наверняка поможет ! Фактически о бордюрных эффектах говорить больше нечего. Последнее замечание : пос- ле прихода сигнала INT управление обра- ботчику прерываний будет передано сразу (если INT пришёл во время выполнения ко- манды HALT ) или после небольшой задержки (длительность зависит от количества так- тов текущей команды которые осталось вы- полнить). На этом всё . Если у вас есть что добавить по этому вопросу, то напишите в редакцию и подели- тесь своими познаниями. _________________________________________