ZX Review #11-12
26 ноября 1997

Этюды - Полезные советы. Быстрая переброска экрана.

<b>Этюды</b> - Полезные советы. Быстрая переброска экрана.
   А теперь - несколько полезных
советов  любителям   музыкальных
DEMO:
   EYE ACHE 2 -  если  во  время
подгрузки с диска  музыка  начи-
нает тормозить, попробуйте пере-
писать программу на диск  с  че-
редованием секторов = 1  (обяза-
тельно в начало диска!)
   RAGE - если при запуске удер-
живать  нажатой  клавишу   SPACE
(или запустить программу в режи-
ме 48K), можно прочитать интере-
сный текст, в котором содержится
несколько советов начинающим де-
момейкерам.

           *   *   *

(c) Иван Рощин, Москва, 1997

   Быстрая переброска экрана

   Известно, что  пересылка  со-
держимого экранной памяти (#1800
байтов) занимает больше времени,
чем промежуток между двумя  пре-
рываниями.  Тем  не  менее, если
изображение должно изменяться не
каждые 1/50 секунды, а  хотя  бы
каждые 1/25 секунды, есть способ
так выполнить пересылку, что по-
ка луч  рисует текущий кадр - мы
видим первую картинку; когда луч
рисует следующий кадр - мы видим
уже вторую картинку.
   Рассмотрим, в чем заключается
этот способ. Пусть в видеопамяти
(#4000-#5800)  находится  первая
картинка. После прихода импульса
прерывания луч начинает рисовать
изображение, начиная с  верхнего
края экрана, рисует бордюр  и  в
конце концов прорисовывает самую
верхнюю строку малого экрана.

  ┌────────────────────┐\
  │       бордюр       │ │
  │  ┌──────────────┐  │ │
  │  │              │  │ │
  │  │              │  │ │телевизионный
  │  │ малый  экран │  │ │экран
  │  │              │  │ │
  │  │              │  │ │
  │  └──────────────┘  │ │
  │                    │ │
  └────────────────────┘/

   Вот тут-то мы и начинаем  пе-
ребрасывать вторую  картинку  из
буфера  в  видеопамять, строго в
том же порядке, как она  изобра-
жается на экране (т.е. по  лини-
ям, сверху вниз). Поскольку  луч
формирует  изображение  быстрее,
чем мы обновляем содержимое  ви-
деопамяти, на экране будет изоб-
ражена первая картинка.
   Переброска картинки продолжа-
ется до того, как луч  прорисует
весь  экран.  Посчитаем, сколько
это займет времени: весь экран -
320 строк, верхняя часть  бордю-
ра - 80 строк, и еще одну строку
мы специально  пропустили.  Т.к.
время прорисовки одной  строки -
224 такта, получаем (320-81)*224
=53536 тактов. За это время, ко-
нечно, полностью обновить видео-
память не получится, но это пока
и не нужно.
   После того, как луч  прорису-
ет весь экран, поступит  следую-
щий импульс прерывания, и начнет
прорисовываться следующий  кадр.
Пока луч  рисует  верхнюю  часть
бордюра и верхнюю  часть  малого
экрана  (т.е. уже вторую картин-
ку), мы, не теряя времени, пере-
брасываем в видеопамять оставшу-
юся часть второй картинки. Пере-
броска должна быть завершена  до
того момента, как луч начнет ри-
совать нижнюю строку малого  эк-
рана, т.е. процедура  переброски
должна укладываться в 53536+(80+
192-1)*224=114240 тактов. А это-
го с избытком  хватит  даже  для
переброски картинки вместе с ат-
рибутами (в этом случае процеду-
ра должна пересылать по  очереди
8 линий картинки и атрибуты  для
этих 8 линий).
   Это расчеты  для  "Пентагона-
128". Фирменный Спектрум отлича-
ется от него по следующим  пара-
метрам:  верхняя  часть  бордюра
составляет 64 строки вместо 80 и
на экране 312 строк вместо  320.
Чтобы процедура переброски рабо-
тала и на нем, она должна  зани-
мать не более  (312-81)*224+(64+
191)*224=108864 тактов. Но этого
все  равно  хватает, даже учиты-
вая, что при  записи/чтении  ви-
деопамяти ULA  тормозит  процес-
сор.  А вот если  процессор, на-
оборот, будет  работать  быстрее
(турбированный Спектрум), проце-
дура переброски может и не  дать
нужного  результата.  Чтобы  она
правильно работала и в этом слу-
чае, нужно, чтобы она "укладыва-
лась в прерывание"  и  завершала
свою работу до того, как  начнет
прорисовываться нижняя линия ма-
лого экрана).

   А теперь - две программы, вы-
полняющие одну и ту  же  задачу:
каждые  1/25  секунды они меняют
цвет экрана с белого на черный и
наоборот. Первая  программа  ис-
пользует LDIR, а вторая работает
по рассмотренному выше  алгорит-
му. Почувствуйте разницу!

   Программа 1:
140.
        LD      HL,#8000 ;1-я картинка
        LD      (HL),0
        LD      DE,#8001
        LD      BC,#17FF
        LDIR

        LD      HL,#9800 ;2-я картинка
        LD      (HL),#FF
        LD      DE,#9801
        LD      BC,#17FF
        LDIR

L1      HALT
        LD      HL,#8000
        LD      DE,#4000
        LD      BC,#1800
        LDIR
        HALT
        LD      HL,#9800
        LD      DE,#4000
        LD      BC,#1800
        LDIR

        XOR     A
        IN      A,(254)
        CPL
        AND     31
        JR      Z,L1
        RET


   Программа 2:

PIC1    EQU     #8000    ;1-я картинка
PIC2    EQU     #9800    ;2-я картинка

        LD      HL,PIC1
        LD      (HL),0
        LD      DE,PIC1+1
        LD      BC,#17FF
        LDIR

        LD      HL,PIC2
        LD      (HL),#FF
        LD      DE,PIC2+1
        LD      BC,#17FF
        LDIR

;Строим таблички с адресами переброски:

        LD      BC,PIC1-#4000
        LD      HL,TABL1
        LD      DE,#4000
        CALL    MAKE_T
        LD      BC,PIC2-#4000
        LD      HL,TABL2
        LD      DE,#4000
        CALL    MAKE_T

;Главный цикл программы:

LOOP1   LD      HL,TABL1
        LD      DE,BUFER+100
        LD      BC,192*4
        LDIR
        CALL    MOVER

        LD      HL,TABL2
        LD      DE,BUFER+100
        LD      BC,192*4
        LDIR
        CALL    MOVER

        XOR     A
        IN      A,(254)
        CPL
        AND     31
        JR      Z,LOOP1

;---------------------------------------
;Процедура MOVER непосредственно
;выполняет пересылку:

MOVER   HALT

;Чтобы не было задержек на обработку
;прерывания, можно поставить здесь DI
;(тогда при выходе из этой процедуры
;нужно поставить EI)

        LD      (QUIT+1),SP
        LD      SP,BUFER+100

;Задержка, пока не прорисуется 1-я строка

        LD      HL,0
        LD      DE,0
        LD      BC,#330
        LDIR

        LD      BC,#1800

;Берем со стека новые значения HL и DE,
;указывающие на следующую строку:

MMMM    POP     DE
        POP     HL

TO_LDI  LDI:LDI:LDI:LDI:LDI:LDI:LDI:LDI
        LDI:LDI:LDI:LDI:LDI:LDI:LDI:LDI
        LDI:LDI:LDI:LDI:LDI:LDI:LDI:LDI
        LDI:LDI:LDI:LDI:LDI:LDI:LDI:LDI

        JP      PE,MMMM ;продолжаем...

QUIT    LD      SP,0
        RET

;---------------------------------------
;Процедура MAKE_T строит табличку:

MAKE_T  LD      A,D
        CP      #58
        RET     Z
        LD      (HL),E
        INC     HL
        LD      (HL),D
        INC     HL
        EX      DE,HL
        ADD     HL,BC
        EX      DE,HL
        LD      (HL),E
        INC     HL
        LD      (HL),D
        INC     HL
        EX      DE,HL
        AND     A
        SBC     HL,BC
        EX      DE,HL
        INC     D
        LD      A,D
        AND     7
        JR      NZ,MAKE_T
        LD      A,E
        SUB     #E0
        LD      E,A
        JR      NC,MAKE_T
        LD      A,D
        SUB     8
        LD      D,A
        JR      MAKE_T

;---------------------------------------

TABL1   DS      192*4
TABL2   DS      192*4

;Стек для процедуры
;обработки прерываний (если во время
;работы проц. MOVER прерывания
;запрещены, он не нужен):

BUFER   DS      100

;"Одноразовая" табличка адресов строк
;(разрушается процедурой обработки
;прерываний и нуждается в обновлении):

        DS      192*4

           *   *   *




Другие статьи номера:

Авторская разработка - С.Зонов, А.Ларченко. О контроллере SMUC (HDD и IBM периферия).

Компьютерная новелла - Воины Звезд (по игре Shadowfire).

Новые программы - Обзор Digital Studio v1.12, Digital Studio Compiler v1.01

Новые программы - Обзор Xas редактор-ассемблер 128К (v5.05).

Новые программы - Обзор Музыкального редактора Instrument v3.01

Новые программы - Обзор программ FASTzasm и @-zasm.

Новые программы - Обзор программы No Kempston.

Профессиональный подход - Алгоритмы построения и прохождения Лабиринтов.

Смех без причины... - Материалы из юмористического журнала SpectrofUn.

Советы экспертов - Игра FEUD.

Советы экспертов - Игра Killed Until Dead.

Советы экспертов - Игра War in Middle Earth.

Форум - Конверсия цветной спектрумовской картинки на IBM. Конверсия ч/б картинки с IBM на ZX Spectrum.

Форум - О русификации игровых программ.

Форум - Программа детекта эмулятора.

Форум - Процедура "цветные полосы на бордюре". Снижение шума FDD.

Форум - Процедура перевода числа в десятичный вид. Процедура - сканер пароля.

Форум - Снятие защиты Microprotector'а.

Форум - Эмуляторы, которые мы выбираем: 'UKV Spectrum Debugger', 'Z80TRDOS'.

Читатель-читателю - Драйвер ввода в режимах последовательного и прямого доступа из файлов системы TR-DOS.

Этюды - Графический эффект "плазма 2".

Этюды - Графический эффект "плазма 2".

Этюды - Графический эффект "плазма".

Этюды - Полезные советы. Быстрая переброска экрана.

Этюды - Ремейк процедур 93 года.

Этюды - Эффект "пламя".


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

Похожие статьи:
Слабо пройти - Описание-прохождение игры Monstrland (миссия 3).
Информация - сегодня в приложении bodY #21.Z демоверсия игры KillPc #10.
Мозаика - НЛО-2, распространяемый в Москве. Небольшая заметка о работе Alex-BBS.

В этот день...   28 января

Релизов не было :(