|
ZX Format
#05
11 декабря 1996 |
|
Программистам - обмен опытом: Об эффектах на бордюре и кое о чём ещё.

Об эффектах на бордюре и кое о чём ещё.
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 ) или после небольшой задержки
(длительность зависит от количества так-
тов текущей команды которые осталось вы-
полнить).
На этом всё .
Если у вас есть что добавить по этому
вопросу, то напишите в редакцию и подели-
тесь своими познаниями.
Другие статьи номера:
Похожие статьи:
В этот день... 17 ноября