ZX Review
#7-8-9-10
08 ноября 1997 |
|
Форум - Эффекты на бордюре и Multicolor.
(c) Плясунов Д., г.Казань В 3-м номере за 96 год (раз- дел "Этюды") HACKER JOHN спраши- вал об эффектах на бордюре в INSULT MD. Я хотел бы поделиться этим с читателями РЕВЮ. А начну с основ: давно уже не секрет, что в каждом компьютере есть сигнал КАДРОВОГО СИНХРОИМ- ПУЛЬСА. По его приходу ULA начи- нает развертывать изображение на мониторе, причем скорость раз- вертки равна 8 пикселам на 4 такта процессора (или 2 пиксе- лам на такт). Такая работа пов- торяется 50 раз в секунду. Од- новременно с приходом КСИ при- ходит сигнал INT (точнее будет сказать, что причиной появления сигнала INT и является сигнал КСИ. Ну а подробно об этом бу- дет сказано ниже). И хотелось бы немного поправить VOLGAsoft'а: изображение на экране начинает строиться не по сигналу INT, а по сигналу КСИ! Почему я это вы- делил, я сейчас подробно расска- жу, т.к. считаю это очень важ- ным. Во всех компьютерах сигнал INT строится по сигналу КСИ, а схемы формирования могут быть различными: где сигнал строится по переднему фронту КСИ, где по заднему, где подсчет строк идет в начале, а где в конце (никог- да не поймешь "создателей")... Прим. ред.: Все вполне объяснимо: для упрощения схемы на пентагонах сигнал INT формируется с приходом (передний фронт) КСИ, что оказалось очень удобным при прог- раммировании. Не нужно просчитывать задер- жки. А в стандартной машине INT формирует- ся по заднему фронту КСИ. Последнее реше- ние более трудно для кодера, но зато есть совместимость с зарубежными программами, использующими мультиколор. Существуют еще несколько способов формирования INT'а, но рассматривать их в данной статье нет смыс- ла. Ну и, соответственно, время между приходом КСИ и образова- нием INT может быть различным! А поэтому MULTICOLOR, написанный на одном типе компьютера, не бу- дет работать на другом. Из-за этого и мерцают спрайты на мед- ленных компьютерах (типа PROFI, ATM), например в BOOT'е у VAV'а пропадает MC на PROFI. Сейчас уже стали появлятся демошки, где перед запуском вам сначала пред- ложат совместить линии на BOR- DER'е с экранными (ECHOLOGY+, KSAGIFT). Прим. ред.: Последующая информация от- части повторяет уже опубликованные нами материалы по MULTICOLOR'у, но мы решили дать ее полностью, так как она дается в более простой (приближенной к конкретной задаче) форме. А теперь непосредственно об экране: как уже не раз писалось на страницах РЕВЮ, экран состоит из линий по 224 такта каждая (про 217 я не знал). См. рис.1. Всего таких линий должно быть 312 (у PENTAGON'а 320, но это не опасно). Умножив, получим, что длина прерывания равна 69888 (у PENTAGON'а - 71680). Но не толь- ко в этом отличие компьютеров. К примеру, у RST7 PENTAGON, но не у всех будет правильно идти скрытая часть INSULT'а, а вызва- но это следующим фактом: на его компьютере INT образуется по пе- реднему фронту КСИ, а на других типах PENTAGON'а - по заднему, вот и не совпадает BORDER. ┌──────────────────────────┐ │ │ │ Border │ │ ┌──────────────────┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ Screen │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └──────────────────┘ │ │ │ │ │ └──────────────────────────┘ │ 224 такта │ Рис.1. С теорией вроде бы все. Те- перь буковки: было отмечено, что скорость развертки равна 2 пик- селам на 1 такт. Отсюда следует, что если мы будем менять цвет бордюра очень быстро, то можно добиться интересных эффектов. Рассмотрим команду OUT (C),A: эта самая быстрая команда от- правки в порт, и занимает она 12 тактов (есть еще быстрее: OUT (#FE),A - 11 тактов, но пока сменишь аккумулятор, сколько времени пройдет...), поэтому ми- нимально возможная "точка" на бордюре составляет 2*12=24 пик- села, или 3 знакоместа. Вот из таких точек и будет наша буков- ка. А теперь пример программы, выводящей букву A на бордюр: ** * * Шаблон буквы: * * **** * * * *140. ORG #8000 LD HL,#FE00 ;заполнение области размером 257 байт LD DE,#FE01 ;байтом #FF. LD BC,#100 LD (HL),#FF LDIR LD HL,#FFFF ;адрес обработки прерывания LD (HL),#C9 ;здесь стоит только команда RET DI ;инициализация IM 2 LD A,#FE LD I,A IM 2 EI LOOP HALT ;ждем прихода INT EI LD BC,#200 ;это величина задержки WAIT DEC BC ;один проход цикла занимает 28 LD A,B ;тактов. Это дает некоторое OR C ;преимущество т.к. увеличив значение NOP ;BC на 8, задержка увеличится на 224 JP NZ,WAIT ;такта, т.е. на 1 пиксел вниз. LD BC,#00FE ;C-порт бордюра, B-цвет всего бордюра LD DE,#0206 ;буква будет желтой на красном фоне. OUT (C),D ;верхняя полоса буквы OUT (C),E ;всего 12*4=48 тактов OUT (C),E OUT (C),D OUT (C),B ;дальше черный цвет, и еще 12 тактов LD A,10 ;задержка до следующей линии 7 тактов WAIT_1 DEC A ;(4+10)*10=140 тактов JP NZ,WAIT_1 ;Итого: 48+12+7+140=207 тактов RET NZ ;Команды-пустышки, дополняющие до 224 INC HL ;5+6+6=17 тактов INC HL ;17+207=224 такта. Линия закончена! OUT (C),E ;дальше идет вторая линия OUT (C),D ;далее по аналогии, столько раз, OUT (C),D ;какой высоты у вас буква. OUT (C),E OUT (C),B ........................... ;здесь могут быть другие действия ........................... LD A,#7F ;опрос клавиши пробел IN A,(#FE) RRA JP C,LOOP DI ;восстановление режима прерываний. LD A,#3F LD I,A IM 1 EI RET 2 Процедура рисования точки в 78 тактов. Для работы этой процедуры нужна табличка в 1 Кбайт. Идею мне подкинул мой друг, выцепив ее из какой-то игрушки. 140. Входные данные: B - координата Y, C - координата X. PLOT LD H,#FA ;с адреса #FA00 находится таблица LD L,B LD B,(HL) ;старший байт уже сформирован INC H LD A,(HL) INC H LD L,C OR (HL) LD C,A INC H LD A,(BC) ;объединяем экранный байт с OR (HL) ;получившимся LD (BC),A ;и обратно его в экран RET 2 А теперь программа, формирую- щая таблицу в памяти: 140. CREAT LD HL,#FA00 ;адрес начала таблицы ;должен быть "круглым" числом LD C,#40 CALL CREAT_1 LD C,#48 CALL CREAT_1 LD C,#50 CALL CREAT_1 140. LD L,B INC H XOR A LD C,#20 LOOP_1 LD B,#08 LOOP_2 LD (HL),A INC HL DJNZ LOOP_2 ADD A,#20 DEC C JR NZ,LOOP_1 LOOP_3 LD B,8 LOOP_4 LD (HL),A INC HL DJNZ LOOP_4 LD A,#80 LOOP_5 LD (HL),A INC HL RRCA DJNZ LOOP_5 RET CREAT_1 LD B,#40 LD A,C LOOP_6 LD (HL),A INC L INC A AND #07 OR C DJNZ LOOP_6 RET 2 Еще хотелось бы пару слов сказать про команду HALT. Выпол- нение зтой команды аналогично выполнению серии команд NOP до прихода прерывания. Когда прихо- дит прерывание, процессор снача- ла ДОВЫПОЛНЯЕТ команду, на кото- рой он прервался, а только по- том переходит на прерывание. Ко- манда NOP четырехтактовая, поэ- тому при выполнении команды HALT может возникнуть 4 ситуации: когда INT пришел после выполне- ния 1 такта NOP, двух тактов, трех тактов и полного выполне- ния этой команды. Поэтому длина всей нашей процедуры должна быть кратна четырем тактам. Если же этого не будет, то INT будет приходить с разной задержкой от 0 до 3 тактов, что отразится дрожанием буквы на бордюре. И еще один момент. Всегда пи- шите синхронизаторы для ваших эффектов на бордюре, для мульти- колора и для эффектов с двумя экранами (шторка и т.п.). По просьбе автора мы публику- ем его адрес: 420073 г.Казань, ул.Гвардейская, д.32, комн.323, Плясунову Дмит- рию. INTERNET E-Mail: pavel@open.ksu. ras.ru * * *
Другие статьи номера:
Похожие статьи:
В этот день... 9 октября