(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
* * *