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

           *   *   *





Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Новости - Работа над игрой Rusted Souls дошла до 4-го уровня, я сделал автоматическую определялку модели Спектрума, сделали поддержку цифрового звука в Pro Tracker 3.x
Посмеемся - цитаты из школьных сочинений.
Реклама - б/у технику от 286 до P6, литература и комплеткующие, запись программ на заказ!

В этот день...   20 сентября