Программистам - обмен опытом: Об эффектах на бордюре и кое о чём ещё.

ZX Format #05
 Об эффектах на бордюре и кое о чём ещё.

music by DNK             
(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 ) или после небольшой задержки
(длительность  зависит от количества так-
тов  текущей команды которые осталось вы-
полнить).

На этом всё .

Если  у  вас  есть  что добавить по этому
вопросу, то напишите в редакцию и подели-
тесь своими познаниями.