Scenergy #02
31 декабря 1999

Coding - ZXA library: библиотека, предназначенная для создания и проигрывания анимаций.

<b>Coding</b> - ZXA library: библиотека, предназначенная для создания и
проигрывания анимаций.
               ZXA library


              0. Вступление

 Как  вы, наверняка уже догадались - здесь
я буду рассказывать вам о том что же такое
ZXA  library  и как вы можете использовать
ее в своих программах.

 Однако  для  начала, если вы еще этого не
сделали   -  я  настоятельно  советую  вам
прочитать статью "Упаковка анимаций в JAM"
для  того чтобы  понимать, о чем конкретно
пойдет разговор дальше. Кроме того было бы
очень  хорошо,  если  бы  вы также заранее
прочитали  статью "О библиотеках". Если же
вы все это уже сделали - читайте дальше.

            1. Общие сведения

 Итак,  что  же  такое  ZXA  library.  Это
свободно   распространяемая  в  исходниках
библиотека, предназначенная для создания и
проигрывания  анимаций. Библиотека состоит
из 2 частей:
 1) Упаковщик и вьюер анимаций.  Эта часть
библиотеки написана на Borland Pascal v7.0
на PC.
 2) Плееры анимаций. Эта часть написана на
Speccy в TASM v4.12 by RST7/CBS.
 Т.о.  для  того чтобы использовать данную
библиотеку  вам,  к сожалению, обязательно
придется   иметь  доступ  к  PC  (или  его
эмулятору).  Однако  если подумать, то это
не  такое  уж  невыполнимое  условие - все
равно  анимации, как правило, создаются не
на Speccy,  а на более мощных машинах. Для
работы  упаковщика и вьюера анимаций будет
достаточно  любого  PC, начиная с 386-го с
1mb  памяти и 256кб VGA видеокартой. Кроме
того, пойдет и любой эмулятор PC для Amiga
или Apple Macintosh.
 Кроме  того, для  того чтобы использовать
ZXA library вам придется работать в TASM'е
или  же  попытаться  портировать  ее в тот
ассемблер,  в  котором вы работаете. Здесь
дело  в том, что ZXA library написана так,
как, по-моему, должна  быть написана любая
хорошая   библиотека   -  она  может  быть
полностью   переконфигурирована  для  нужд
конкретного пользователя без вмешательства
в ее код. Естественно, что все это сделано
за  счет макросов и условной компиляции, а
это на данный момент поддерживают в полной
мере  только два ассемблера: TASM v4.12 by
RST7/CBS и ALASM v4.2 by Alem (modified by
KVA/E-Mage). В принципе ZXA library вполне
может  быть  перенесена в ALASM v4.2 почти
не   потеряв  своей  гибкости  (все  будет
работать  за исключением одной вещи, но об
этом  ниже). Однако я не стал этого делать
из-за нехватки времени, а также из-за того
что  существующий  конвертор  в  ALASM  не
поддерживает расширения синтаксиса ALASM'а
версии 4.2.

 Несмотря на то, что библиотека состоит из
2  частей  -  здесь будет подробно описана
только  та  часть,  что  касается  Speccy.
Описание  упаковщика и вьюера анимаций для
PC  вы  найдете  в приложении, в архивах с
программами и исходниками для PC.

 Все   компоненты  библиотеки  помещены  в
приложение и представляют собой 4 архива:

ZXApcEXE.ZIP - Откомпилированные и готовые
 к использованию файлы упаковщика и вьюера
 анимаций.  Будут  полезны для тех, кто не
 хочет разбираться с работой упаковщика, а
 хочет  просто  использовать его для своих
 нужд.
ZXApcSRC.ZIP - Исходные тексты  упаковщика
 и вьюера анимаций для PC. Необходимы тем,
 кто  захочет  разобраться  в их работе и,
 возможно, использовать для своих целей.
ZXAanims.ZIP - Несколько примеров анимаций
 для демонстрации работы библиотеки. Могут
 быть  использованы  как для PC, так и для
 Speccy.
ZXA_src .ZIP - Исходники самой ZXA library
 и нескольких примеров для демонстрации ее
 возможностей.

ZXApcEXE.ZIP   и   ZXApcSRC.ZIP  упакованы
PKZIP'ом на PC, ZXAanims.ZIP и ZXA_src.ZIP
упакованы ZxZip'ом.

        2. Возможности библиотеки

 ZXA  library  предоставляет  пользователю
следующий набор функций:
 - Проигрывание анимаций в 3 режимах:
   - Обычные анимации
   - Interlaced анимации
   - C64 like анимации
 - Любой  из  перечисленных  выше  плееров
   может  работать  как  с  одним, так и с
   двумя   экранами.  В  последнем  случае
   возможна   также  автоматическая  смена
   видимого экрана после вывода очередного
   кадра.  При  выводе  анимации  на  один
   экран можно выбирать - на какой именно.
 - Любой тип анимаций  может быть проигран
   в любой последовательности кадров.
 - Анимации  можно  размещать в страничной
   памяти (даже если анимация выводится на
   два экрана).
 - Есть режим при котором все используемые
   таблицы  и  процедуры  располагаются  в
   нижней  памяти  (#6000-#7FFF)  для того
   чтобы   освободить   больше  места  под
   размещение анимации.
 - Анимация может быть  разделена в памяти
   на  несколько  частей,  эти  части даже
   могут  располагаться в разных страницах
   памяти!
 - Размер проигрываемой анимации ограничен
   256 кадрами.
 - Размер кадра анимации  для Interlaced и
   C64 like плееров  может быть любым, для
   нормального плеера, при выводе анимации
   с использованием  обоих экранов  размер
   кадра  в  распакованном состоянии может
   быть  не более #1280 байт (это примерно
   24x24 или 32x18 знакомест).
 - Все плееры  используют стек для доступа
   к   данным,   однако  есть  возможность
   использовать специальный обработчик IM2
   для предотвращения порчи информации при
   приходе  прерывания.  Т.о.  все  плееры
   можно  использовать  при включенных IM2
   прерываниях.
 - Вся  настройка   параметров  библиотеки
   осуществляется   через  переопределение
   конфигурационных переменных БЕЗ какого-
   либо вмешательства в код библиотеки!
 - В случае некорректного задания значений
   параметров конфигурации, при компиляции
   будет  выдано соответствующее сообщение
   и даны рекомендации  по его устранению.
   Кстати, именно это невозможно сделать в
   ALASM'е.
 - Тексты  всех  модулей библиотеки хорошо
   комментированы и имеют краткое описание
   особенностей работы с каждым из них.
 - Вместе с кодом модулей  библиотеки идет
   несколько  примеров  их  использования.
   Посмотрев  на  них  можно  увидеть, что
   количество   кода,   необходимого   для
   проигрывания   анимации   составляет  в
   среднем всего 20-30 строк.
 - Время  распаковки  кадра  для  тестовых
   анимаций  на Pentagon'е составляет чуть
   более прерывания.

 ZXA library состоит из следующих модулей:
MEMORY.A   - Макробиблиотека,  реализующая
             механизм распределения памяти
             в программе.
ZXA_EQUS.A - Этот файл содержит в себе все
             конфигурационные  переменные,
             необходимые  для всех модулей
             ZXA library.
ZXA_1.A    - Плеер  обычных  и  interlaced
             анимаций на одном экране.
ZXA_2.A    - Плеер  обычных  и  interlaced
             анимаций на двух экранах.
ZXA_C64.A  - Плеер C64 like анимаций.
ZXA_CODE.A - Набор дополнительных процедур
             необходимых для плееров.
EXAMPLE1.A - Пример  проигрывания  обычной
             или interlaced анимации.
EXAMPLE2.A - Пример проигрывания  C64 like
             анимации.
EXAMPLE3.A - Пример проигрывания анимации,
             состоящей из двух кусков.

       3. Использование библиотеки.

 Для того чтобы использовать ZXA library в
своих программах вам необходимо:
 - Создать и подгрузить ZXA анимацию.
 - Подключить к своему коду файлы:
   - MEMORY.A  и  ZXA_EQUS.A.   Эти  файлы
     обеспечат создание всего необходимого
     для нормальной настройки и компиляции
     всех модулей ZXA library.
   - Один из плееров: ZXA_1.A, ZXA_2.A или
     ZXA_C64.A.  Какой  именно плеер нужно
     подключить - зависит  от того,  каким
     способом была упакована анимация.
   - ZXA_CODE.A для  создания  необходимых
     для работы плееров процедур.
 - Сконфигурировать  код  плееров  под то,
   как  именно они должны работать в вашей
   программе.
 - Написать кусок кода для инициализации и
   проигрывания анимации.
 - При  необходимости  добавить  к  своему
обработчику  прерываний  код для коррекции
данных  на  стеке, испорченных при приходе
прерывания.

 Пример кода для проигрывания анимации:

;Подключаем файлы с необходимыми описаниями
        .INCLUDE MEMORY
        .INCLUDE ZXA_EQUS

        ORG #8000
;Инициализируем код плеера
        LD HL,ANIMATION    ;В HL - указатель на анимацию
        CALL ZXA_INIT
;Включаем режим прерываний IM2
        DI
        LD HL,#BE00
        LD DE,#BE01
        LD BC,#100
        LD (HL),#BF
        LDIR
        LD A,#C3           ;JP n
        LD (#BFBF),A
        LD HL,IM2          ;Указатель на обработчик прерываний
        LD (#BFC0),HL
        LD A,#BE
        LD I,A
        IM 2
        EI
;Переменная ZXA_QFRAMES содержит количество кадров
;в анимации
        LD A,(ZXA_QFRAMES)
        LD B,A
        LD C,0
LOOP    PUSH BC
        HALT
;На входе в процедуру рисования кадра анимации ZXA_DRAW_FRAME
;в регистре A необходимо передавать номер кадра анимации
;который необходимо отрисовать.
        LD A,C
        CALL ZXA_DRAW_FRAME
;Переходим к следующему кадру
        POP BC
        INC C
        DJNZ LOOP
        
;Вся анимация проиграна - выходим
        DI
        LD A,#3F
        LD I,A
        IM 1
        EI
        RET

;Подключаем код плеера и дополнительный код
        .INCLUDE ZXA_1
        .INCLUDE ZXA_CODE

;Обработчик IM2 прерываний
;Здесь есть одна тонкость. Дело в том, что обработчик
;ДОЛЖЕН быть расположен ПОСЛЕ того как будет подключен
;код плеера. Это обусловлено тем, что код восстановления
;данных запорченных стеком реализован в виде макросов и
;необходимо сделать так, чтобы на момент компиляции
;обработчика прерываний эти макросы были определены.
;Опасность ошибки заключается в том, что если они не были
;определены - их вызов будет восприниматься компилятором
;как определение метки, все будет откомпилировано без
;ошибок, а в результате мы получим нерабочий код.
IM2
;Вызов макроса, создающего код для восстановления данных
        _ZXA_IM2_START
;Здесь может располагаться все что необходимо сделать в
;обработчике прерываний.
;Вызов макроса, создающего код для восстановления данных
        _ZXA_IM2_END
;Подгружаем анимацию
ANIMATION
        .INCBIN anim

 Вот  и  все,  что необходимо сделать. Как
видите  -  все  элементарно. Правда, как и
везде,  здесь есть свои тонкости, но о них
позже.  Сейчас  необходимо  рассказать  об
общих принципах работы библиотеки и о том,
как настроить ее под ваши нужды.
            4. Принципы работы

 Библиотека  проигрывает  ZXA  анимации во
всех  форматах поддерживаемых упаковщиком,
но  с двумя ограничениями. Можно проиграть
только анимации упакованные:
 - с вертикальным кодированием кадра.
 - с независимо упакованными кадрами.
 В  принципе, упаковщик поддерживает и все
остальные методы упаковки (ключи /a и /h),
но  фактически на данный момент эти методы
не  имеют  практического значения (их даже
не поддерживает viewer на PC).
 В  принципе,  никаких особенных проблем с
тем  чтобы  сделать  поддержку  анимаций с
горизонтальным  кодированием  кадров  нет,
однако,  как  я  уже  говорил  в статье об
упаковке  анимаций  -  качество упаковки в
этом режиме значительно ниже.

 Поскольку  все  кадры  анимации упакованы
независимо  -  их  можно  распаковывать  в
любой  последовательности.  Поэтому  в ZXA
library  отсутствует  функция проигрывания
анимации, а есть только функция распаковки
кадра  по  его  номеру.  Так что для того,
чтобы  проиграть  анимацию  вам необходимо
самим  написать основной цикл проигрывания
анимации  (как  уже  было  показано выше в
примере).

 Перед  тем  как  проиграть  анимацию - ее
необходимо  зарегистрировать. Это делается
путем  вызова функции ZXA_INIT с передачей
в  HL указателя на анимацию. Если анимация
состоит  из  нескольких  фрагментов  -  их
можно  объединить  в одну большую анимацию
путем  вызова  функции  ZXA_ADD_FRAMES для
каждого из фрагментов. При этом в HL нужно
передавать   указатель   на   подключаемую
анимацию,  а  в A - номер кадра, начиная с
которого  эта  анимация  будет  вставлена.
Количество фрагментов не ограничено, а вот
общее количество кадров во всех фрагментах
ограничено 256. Общее количество  кадров в
анимации всегда можно узнать из переменной
ZXA_QFRAMES. Так что обычный фрагмент кода
для  подключения  фрагмента анимации будет
выглядеть так:

        LD HL,ANIMATION_PART
        LD A,(ZXA_QFRAMES)
        CALL ZXA_ADD_FRAMES

 Отличие  между функциями ZXA_ADD_FRAMES и
ZXA_INIT состоит в том, что ZXA_INIT кроме
всего   прочего  создает  все  необходимые
таблицы  и  процедуры,  так  что  ее нужно
вызывать  ДО  того как будет вызвана любая
другая  функция библиотеки. Также ее нужно
вызывать,  если  после  проигрывания одной
анимации вы хотите проиграть другую.

 Все плееры, входящие в состав ZXA library
требуют  для  свой  работы наличие таблицы
экранных  адресов.  Эта таблица содержит в
себе  адреса  всех  байт  экрана в которые
попадает кадр анимации, и используется для
отрисовки  кадра на экране. Размер таблицы
равен  удвоенному  размеру  распакованного
кадра,  например,  для размера кадра 10x16
знакомест размер таблицы будет равен:
           10*16*8*2=2560 байт

 Поскольку  плеерам,  по  сути,  все равно
какие  именно адреса указаны в таблице, то
можно  использовать  это  для  того  чтобы
распаковывать  анимацию  не  на экран, а в
любой  буфер.  Достаточно просто заполнить
таблицу   адресами   этого  буфера.  Также
простым  переделыванием этой таблицы можно
получить плеер для проигрывания анимаций с
горизонтальной кодировкой кадра.
 Таблица  экранных  адресов  по  умолчанию
располагается в 7 странице с адреса #DB00,
сразу  после  второго  экрана.  Однако  ее
можно  свободно переместить в любое другое
место,  где  достаточно  свободной памяти.
Единственное исключение: при использовании
любого   из   плееров   для  двух  экранов
необходимо чтобы таблица располагалась в 7
странице  (чтобы  она  была  доступна  при
отрисовке  кадра на второй экран). Кстати,
именно  из-за  этого данный плеер не может
проигрывать   анимации  с  размером  кадра
более #1280 байт, просто не хватает памяти
под размещение таблицы экранных адресов.
 Местоположение  таблицы в памяти задается
двумя конфигурационными переменными:

ZXA_TABLE_PAGE - номер страницы
ZXA_TABLE_ADR  - адрес размещения таблицы

 Кроме  таблицы  экранных  адресов плеерам
необходима  память под различные таблицы и
процедуры.   Размер   необходимой   памяти
зависит от конкретной конфигурации, но как
минимум будет занято чуть более килобайта.
Плеерам анимаций на одном экране требуется
меньше  всего памяти, да и сами они меньше
чем аналогичные двухэкранные. Больше всего
памяти  требуется плееру C64 like анимаций
т.к. в этом  случае  распаковка кадра идет
не на экран, а в буфер, а затем этот буфер
отрисовывается   на  экране.  Из-за  этого
проигрывание  C64  like  анимаций работает
немного  медленнее обычных, но это отчасти
компенсируется  тем,  что  реальный размер
кадра  в  этом  режиме в 4 раза меньше чем
видимый на экране.
 По  умолчанию  все  таблицы размещаются в
"медленной"  памяти  (#6000-#7FFF),  а все
процедуры - в "быстрой"  (#8000-#BFFF). Но
в целях экономии так нужной всем "быстрой"
памяти ZXA library имеет специальный режим
при  котором  все  - и таблицы и процедуры
размещаются  в "медленной" памяти оставляя
больше  места  для  нужд  программы.  Этот
режим включается опцией:
           ZXA_ALL_IN_SLOW=YES

         5. Настройка параметров

 Как  уже  было  сказано выше - вся работа
ZXA  library  может  контролироваться  БЕЗ
какого-либо  вмешательства  в  код модулей
библиотеки.  Все что вам нужно сделать для
конфигурирования  кода библиотеки под ваши
нужды - изменить значения конфигурационных
переменных,  отвечающих за настройку кода.

Причем  для этого  тоже  не нужно  лезть в
код - вся настройка осуществляется простым
переприсваиванием значений переменных.
 Все переменные описаны в файле ZXA_EQUS.A
и  менять  их  значения можно только ПОСЛЕ
того  как  этот  файл  подключен  к вашему
исходнику,  но ДО того как будет подключен
любой  модуль  библиотеки  содержащий код.
Кроме   ZXA_EQUS.A  необходимо  подключить
также  файл MEMORY.A. Это макробиблиотека,
отвечающая за распределение памяти во всех
модулях  библиотеки.  Оба  этих  файла  не
содержат  ни строчки кода - только макросы
и определения переменных. Т.о. их можно, и
даже  нужно,  подключать  в  самом  начале
вашего  исходника,  а  все переопределения
конфигурационных  переменных  лучше  всего
располагать  сразу  после  подгрузки  этих
модулей.  Вот  как, примерно, должен будет
выглядеть ваш исходник:

;Подгрузка модулей с необходимыми описаниями.
;Заметьте, что порядок их подгрузки должен быть именно таким!
        .INCLUDE MEMORY
        .INCLUDE ZXA_EQUS
;Все необходимые переопределения параметров библиотеки
ZXA_USE_FRAME_BUFFER=YES
ZXA_FRAME_BUFFER_SIZE=450

 Подобная последовательность действий даст
компилятору  возможность сгенерировать код
в  соответствии  с вашими настройками т.к.
все  значения  переменных будут изменены к
моменту  начала компиляции кодовых модулей
библиотеки.

 А теперь непосредственно то, о чем должна
идти речь в этом разделе.

Переменная  : ZXA_USE_FRAME_BUFFER
По умолчанию: NO
Влияет на   : ZXA_1, ZXA_2, ZXA_C64
Назначение: Отвечает за выделение в нижней
памяти  буфера  для  текущего упакованного
кадра.  Если установить ее значение в YES,
то  в  памяти  дополнительно будет выделен
буфер  и  перед  началом распаковки любого
кадра упакованные данные будут скопированы
в  него,  а затем будут распаковываться из
буфера.  Создание  этого буфера необходимо
при проигрывании анимации на двух экранах,
а  также,  если  анимация  располагается в
страничной памяти.

Переменная  : ZXA_FRAME_BUFFER_SIZE
По умолчанию: 0
Влияет на   : ZXA_1, ZXA_2, ZXA_C64
Назначение: Задает  размер  буфера  кадра.
Значение  этой  переменной  не должно быть
меньше  максимального размера упакованного
кадра  анимации,  но и не нужно его делать
слишком  большим  (лишняя  трата  памяти и
времени т.к. в буфер  перебрасывается блок
данных  размером ZXA_FRAME_BUFFER_SIZE). В
случае  если  размер  буфера будет слишком
мал - последствия могут быть фатальные.

Переменная  : ZXA_INTERLACED
По умолчанию: NO
Влияет на   : ZXA_1, ZXA_2
Назначение: Определяет  тип  анимации  для
плееров ZXA_1.A или ZXA_2.A. Установите ее
значение  в YES, если необходимо проиграть
чересстрочную анимацию. Для плеера ZXA_C64
эта переменная не нужна.

Переменная  : ZXA_ALL_IN_SLOW
По умолчанию: NO
Влияет на   : ZXA_1, ZXA_2, ZXA_C64
Назначение: Если значение  этой переменной
установлено в YES - таблицы  и  процедуры,
создаваемые любым плеером  будут размещены
в медленной памяти (#6000-#7FFF). Если NO,
то  таблицы  будут размещаться в медленной
памяти, а процедуры - в быстрой.

Переменная  : ZXA_LARGE_ANIMATION
По умолчанию: NO
Влияет на   : ZXA_1, ZXA_2, ZXA_C64
Назначение: При  необходимости   проиграть
анимацию, состоящую  из нескольких частей,
расположенных  в разных  страницах памяти,
нужно установить  значение этой переменной
в YES. При этом изменится набор параметров
для  функций  ZXA_INIT и ZXA_ADD_FRAME: на
входе,  кроме  всего  прочего,  необходимо
будет  передавать  в  регистре  C страницу
памяти, в которой расположена анимация или
ее часть. Т.е. формат вызова будет таким:

Для ZXA_INIT:        Для ZXA_ADD_FRAME:
   LD HL,ANIMATION                LD HL,ANIMATION_PART
   LD C,ANIMATION_PAGE            LD C,ANIMATION_PART_PAGE
   CALL ZXA_INIT                  LD A,(ZXA_QFRAMES)
                                  CALL ZXA_ADD_FRAMES

Переменная  : ZXA_AUTO_FLIP_SCREEN
По умолчанию: YES
Влияет на   : ZXA_2, ZXA_C64
Назначение: В  случае  если  значение этой
переменной  равно  YES,  после  распаковки
очередного кадра анимации будет переключен
видимый  экран  (после HALT'а естественно)
для  того  чтобы  отобразить результаты на
мониторе.  Это  удобно  т.к.  позволяет не
заботиться  о переключении видимых экранов
самому.  Однако,  если  это  по каким-либо
причинам  нежелательно  - можно установить
значение этой переменной в NO. Нужно также
помнить,  что  эта  переменная имеет смысл
только  для  плееров анимаций использующих
два экрана.

Переменная  : ZXA_TABLE_PAGE
По умолчанию: #17
Влияет на   : ZXA_1, ZXA_2, ZXA_C64
Назначение: Номер страницы в которой будет
создана таблица экранных адресов. Помните,
что  при  использовании  плееров  для двух
экранов   необходимо,  чтобы  таблица была
расположена в странице #17!

Переменная  : ZXA_TABLE_ADR
По умолчанию: #DB00
Влияет на   : ZXA_1, ZXA_2, ZXA_C64
Назначение: Адрес,  по  которому  в памяти
будет   располагаться   таблица   экранных
адресов.  По  умолчанию  таблица находится
непосредственно после второго экрана.
Переменная  : ZXA_USE_SECOND_SCREEN
По умолчанию: NO
Влияет на   : ZXA_1, ZXA_C64
Назначение: По умолчанию  плееры  анимаций
для  одного  экрана  используют для вывода
первый  экран  (с  адреса  #4000). Если же
установить значение этой переменной в YES,
то  вывод  будет  осуществляться на второй
экран (с адреса #C000 в страницу #17).

Переменная  : ZXA_FRAME_XS
По умолчанию: 0
Влияет на   : ZXA_C64
Назначение: Размер  кадра  анимации  по X.
Задается в знакоместах. Возможные значения
лежат в промежутке 1..16.

Переменная  : ZXA_FRAME_YS
По умолчанию: 0
Влияет на   : ZXA_C64
Назначение: Размер  кадра  анимации  по Y.
Задается  в пикселях.  Возможные  значения
лежат  в  промежутке  1..96. Значения этих
двух переменных необходимо задавать только
при  использовании ZXA_C64 плеера т.к. его
код  необходимо  подстраивать  под  размер
кадра анимации.

Переменная  : ZXA_C64_USE_BOTH_SCREENS
По умолчанию: NO
Влияет на   : ZXA_C64
Назначение: Если нужно  проиграть C64 like
анимацию  на двух экранах - установите эту
переменную в YES.

Переменная  : ZXA_CREATE_IM2_TABLE
По умолчанию: YES
Влияет на   : ZXA_1, ZXA_2, ZXA_C64
Назначение: Отвечает   за   автоматическую
генерацию  таблицы IM2 прерываний, а также
стека  для  обработчика IM2 прерывания. По
умолчанию  и  таблица  и  место  под  стек
создаются  в памяти автоматически, но если
в   вашей   программе  таблица  прерываний
должна  быть  расположена  по  конкретному
адресу  -  вы  можете  отключить генерацию
таблицы   прерываний,  установив  значение
этой переменной в NO. Однако в этом случае
вам  придется  вручную  выделить место под
стек  обработчика  прерываний  (ему  нужно
где-то 30-40 байт) и занести его указатель
в переменную ZXA_IM2_STACK:

            LD HL,MY_IM2_STACK
            LD (ZXA_IM2_STACK),HL

               6. Замечания

 В  принципе всего написанного выше вполне
хватит  для полноценного использования ZXA
library  в  ваших  программах. Но есть ряд
тонкостей в использовании этой библиотеки,
о  которых  я  не  сказал ранее. О них я и
попытаюсь рассказать в этом разделе.

                6.1 Память

 ZXA  library  написана  с  использованием
моей макробиблиотеки - менеджера памяти. О
ней  вы можете подробно прочитать в статье
Memory Management Library.
 С одной стороны это  позволяет освободить
пользователя   от   необходимости  вручную
выделять память необходимую для библиотеки
(а это достаточно непростое дело, учитывая
обилие  настроек  влияющих на количество и
размеры  выделяемых  блоков памяти). Здесь
же  весь  механизм  распределения памяти с
точки  зрения  пользователя  прозрачен  и,
кроме   того,  программа  застрахована  от
ошибок при распределении памяти.
 Однако  с  другой стороны это накладывает
некоторые  ограничения  на саму программу,
использующую эту библиотеку. Проще говоря,
все распределение памяти в вашей программе
тоже  должно  происходить только через мою
макробиблиотеку!  В  принципе,  это должно
быть  очевидным - все распределение памяти
в  программе  должно  быть  реализовано по
одному  принципу, в противном случае можно
получить  просто кучу глюков. Да и то, что
вам  придется  использовать  мой  менеджер
памяти в своей программе, я считаю большим
достоинством,  а  не  недостатком.  Дело в
том,  что  при  его  использовании процесс
распределения  памяти  в  программе  очень
сильно  облегчается  и  становится намного
более наглядным. Кроме того менеджер будет
сам  следить  за  переполнением  памяти  и
сообщать об этом на этапе компиляции, т.е.
вам,  в  случае  чего,  не придется искать
причину  глюков  в  вашей  программе из-за
того,  что  две  таблицы  перекрывают друг
друга.
 Как  вы  наверняка понимаете, в менеджере
заложена  определенная схема распределения
памяти.   И  из  этого  следует  очевидный
вывод: ваша программа должна учитывать эту
схему  распределения. Т.е. все блоки вашей
программы:   код,  память  выделяемая  под
таблицы  и процедуры, таблица прерываний и
т.п.   должны  располагаться  в  памяти  в
соответствии  с  тем,  как  это заложено в
менеджере  памяти. Спасти вас может только
то, что версия 2.0 моего менеджера памяти,
которая  и использована в этой библиотеке,
может  быть  полностью переконфигурирована
под  любую схему распределения памяти. Так
что,  в  случае, если схема распределения,
установленная в менеджере по умолчанию вам
не подходит - смело переконфигурируйте его
и  весь код библиотеки будет автоматически
подстоен  под  новую  схему  распределения
памяти.
 Кроме  того, не забудьте, что стандартная
схема  распределения памяти подразумевает,
что  свободная  память  у вас начинается с
адреса #6000, т.е. стек расположен с #5FFF
или  еще  ниже. А в стандартном загрузчике
TASM'а стек установлен на адрес #61A7, так
что  у  вас  есть  выбор: либо поправить в
загрузчике  TASM'а  CLEAR  VAL  "24999" на
CLEAR  VAL  "24575",  либо добавить в вашу
программу строку:
         SET_SLOW #61A8,#8000,NO
сразу после .INCLUDE MEMORY
 Я советую использовать первый вариант.

              6.2 Переменные

 В любом плеере ZXA library есть несколько
переменных, которые могут вам понадобиться
для  собственных  нужд.  Здесь  я  приведу
краткие описания для каждой из них:

ZXA_IM2_STACK. В эту переменную вы обязаны
занести   указатель   на  область  памяти,
которая  будет использоваться обработчиком
IM2  прерываний под стек. Это нужно делать
только  в  случае если вы установили опцию
ZXA_CREATE_IM2_TABLE=NO и к тому же хотите
использовать   макросы   _ZXA_IM2_START  и
_ZXA_IM2_END  для  восстановления  данных,
испорченных приходом прерывания.
 Размер  области памяти используемой этими
макросами  составляет  примерно  24 байта,
добавьте к этому размер стека, необходимый
для вашего кода обработчика прерываний - и
вы  получите необходимый размер стека. При
установках  по  умолчанию  размер стека не
должен превышать 62 байта!

ZXA_IS_DRAW.  В этой переменной содержится
#01, если  в данный момент идет распаковка
кадра и #00 в любом другом случае.

ZXA_QFRAMES. Эта переменная содержит номер
последнего  существующего  кадра анимации.
Всего,  как  я уже говорил, может быть 256
различных кадров произвольно расположенных
в  памяти.  Их  можно  регистрировать  под
любыми  номерами,  даже  образуя  "дыры" в
таблице кадров. И распаковывать можно кадр
с  произвольным  номером  -  в случае чего
будет  просто  распакован  пустой кадр. Но
лучше   всего   регистрировать   фрагменты
последовательно  - тогда в этой переменной
будет храниться общее число кадров.

ZXA_PAGE. В этой переменной задается номер
страницы  памяти,  в  которой  расположена
анимация. Эта переменная существует только
если   ZXA_LARGE_ANIMATION=NO,   т.к.  для
анимаций  из  нескольких фрагментов она не
имеет  смысла.  Не забывайте заносить туда
номер  страницы, если  ваша анимация лежит
не в нижней памяти!

   6.3 Проигрывание нескольких анимаций

 Если  у вас есть несколько анимаций, и вы
хотите  проиграть  их  все, используя один
плеер,  то  вы  должны выполнить несколько
условий:
 1. Как  вы  понимаете,  все  эти анимации
обязаны быть одного типа т.к. одновременно
в  ZXA  library  можно использовать только
один плеер.
 2. Если  это  обычные  или  чересстрочные
анимации, то перед проигрыванием каждой из
них  вам необходимо будет инициализировать
код  плеера  заново, вызывая ZXA_INIT. Это
необходимо,  т.к.  размер  окна  кадра для
каждой анимации может быть разным. Для C64
like  анимаций,  для которых размеры кадра
задаются  непосредственно  в  коде  это не
поможет - для них необходимо чтобы размеры
кадра у всех анимаций были одинаковыми.
 3. Если  анимация  состоит  из нескольких
фрагментов  -  размер кадра для каждого из
них  обязан  быть одинаковым! Это касается
всех типов анимаций.
 Как  добиться того чтобы размеры кадров у
разных анимаций были одинаковыми - читайте
в описании упаковщика.

              7. Заключение

 Ну вот и все. Надеюсь, что эта библиотека
пригодится  вам в ваших программах. Причем
это совсем необязательно должны быть демы,
кто  мешает,  допустим,  оформить переходы
между уровнями вашей игры простенькими, но
симпатичными анимациями.
 Но я хочу предупредить вас о двух вещах:
 1.  Не  стоит  увлекаться анимациями. Ими
можно  разнообразить  вашу  программу,  но
делать ставку только на анимацию не стоит.
 Кто-то  может обвинить нас в том, что мы,
отчасти, стали зачинщиками теперешней моды
на использование анимаций, а теперь еще, в
довершение  всего выпустили библиотеку для
проигрывания анимаций. Возможно это и так,
но  то,  что при умелом использовании дает
положительный   результат,   может  дать и
результат совершенно противоположный. Если
мы  использовали анимации - значит считали
это необходимым для демы, а вовсе не из-за
того что у нас не хватало сил написать еще
пару  эффектов. А если кто-то использует в
деме  анимации  только  ради анимаций - то
это уже не демомейкинг.
 2. Не забывайте что алгоритм упаковки, на
котором  основана  данная  библиотека  был
разработан  специально для упаковки строго
одного типа анимаций!
 Я  ни  в  коем  случае  не  претендую  на
позиционирование   этого   алгоритма   как
универсального.  Так  что  вам,  по любому
придется  использовать  его только для тех
анимаций,  на  которые  этот  алгоритм был
рассчитан    изначально.    За    качество
упаковки  всех  остальных видов анимаций я
не поручусь, более того я почти уверен что
качество  их  упаковки будет невысоким. Из
того,  что я видел, лично мне по качеству,
степени  компрессии и скорости больше всех
понравился VideoCruncher by Konex/ATS. Но,
к  сожалению, его алгоритм и/или исходники
Konex  не  пожелал  (возможно,  лишь пока)
сделать достоянием общественности. Так что
между  VideoCruncher'ом и ZXA library есть
одно  важное  отличие  в пользу последней:
ZXA  library  свободно  распространяется в
исходных текстах и с полным описанием. Так
что   пока  все  остальные  авторы  крутых
плееров   анимаций   раскачиваются  -  вам
придется пользоваться тем, что есть.

 Есть  еще  мнение  отдельных  людей,  что
распространение  исходных текстов повлечет
за собой появление кучи одинаковых, никому
не  нужных  программ  от разных ламеров не
умеющих  написать  что-то  свое.  По этому
поводу  я  могу сказать только одно: ламер
просто  не  сможет  использовать  эти (или
любые другие) исходники просто потому, что
его уровня развития на это не хватит. Зато
человеку  более  опытному наличие подобных
исходников  позволит  сэкономить  время  и
силы  и  позволит заняться не изобретением
велосипеда,  а оттачиванием  внешнего вида
своей программы.
 Так  что те, кому это понадобится, смогут
использовать  готовую библиотеку для своих
нужд. Другие смогут на ее примере увидеть,
как  можно создавать на Speccy полноценные
библиотеки. Третьи смогут, возможно, найти
что-то  новое или полезное для себя в коде
библиотеки. Вообщем многим людям она будет
полезна,  и  хотя  бы ради этого ее стоило
сделать и выпустить в свет.



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

A.O.S.S. - "Сцена больна" переживания Random'a.

A.O.S.S. - Raver рассуждает о сценовой журналистике.

A.O.S.S. - аналитическая статья о музыкальной сцене от Andy Fer.

A.O.S.S. - легко ли быть органайзером группы?

A.O.S.S. - О журналах (мысли вслух).

A.O.S.S. - о канонах демосцены на примере журнала Deja Vu #9.

A.O.S.S. - Сегодня и Завтра отечественной демосцены.

A.O.S.S. - спектрумовская банерная сеть.

Charts - all time favorites.

Charts - current rules (fall edition 1999).

Charts - indexed.

Charts - voting rules.

Coding - 16-битная процедура быстрого возведения в степень.

Coding - Flying представляет макробиблиотеку: Memory Management Library.

Coding - Texture Mapping - реализация от SaiR00S/EI.

Coding - Texture mapping + Phong shading реализация от Senat/Eternity Industry.

Coding - ZXA library: библиотека, предназначенная для создания и проигрывания анимаций.

Coding - Баг в STS?

Coding - Комментарии к исходникам, опубликованным в Scenergy #1

Coding - о библиотеках в программировании на спектруме.

Coding - Принцип упаковки анимаций в демо JAM.

Coding - процедура быстрого умножения.

Coding - разбор интро Daingy от Cryss/Razzlers.

Demo Party - Cafe'2000: Официальное приглашение

Demo Party - CC999.999 information (eng).

Demo Party - D-Man/EI: отчет о Di:Halt:99.

Demo Party - Hartman: отчет о CC'999.

Demo Party - Maxwell и Mr. John: отчет о CC'999.

Demo Party - Merlin/CC: отчет о CC'999.

Demo Party - Paradox'99 - как это было, но лучше б он mUst dIe!!!

Demo Party - PHAT'9: список посетителей.

Demo Party - POL/PHT: отчет о Doxycon '99.

Demo Party - Random/CC: обьемный отчет о CC'999.

Demo Party - SerzhSoft: сказание о CC'999.

Demo Party - Zlincon 2e3 party: минирепортаж.

Demo Party - информация о предстоящем пати PHAT'0.

Demo Party - информация по демопарти CC999.999.

Demo Party - неофициальные результаты Di:Halt'99 с коментариями Diver'a.

Demo Party - обзор демосцены за 1999 год.

Demo Party - отчет организаторов CAFe'99.

Demo Party - пресс релиз Латвийского демопати PHAT'9.

Demo Party - приглашение на латвийское демопати PHAT'9.

Demo Party - рассказ о поездке Antares в Казань на CAFe'99

Demo Party - результаты CC.999.999

Demo Party - результаты CC999.999.

Demo Party - результаты Chaos Construction 999.

Demo Party - результаты Computer Art Festival 1999.

Demo Party - результаты Doxycon'99.

Demo Party - результаты Millenium Party.

Demo Party - результаты Paradox'2k demoparty.

Demo Party - результаты Латвийского демопати PHAT'9.

Demo Party - результаты Ростовского пати Paradox'99.

Demo Party - репортаж Gasman'a с Forever 2e3.

Demo Party - репортаж с Минского демопати Millennium'2000.

Demo Party - финальные результаты Forever 2E3.

Editorial - вступительное слово от Arty.

Editorial - выступительное слово от Random.

Editorial - загоны Raver'а на тему Сцены.

Groups - анкеты действующих групп: Amaltiya Incoropration Software.

Groups - анкеты действующих групп: Antares.

Groups - анкеты действующих групп: Ascendancy Creative Labs.

Groups - анкеты действующих групп: Crushers.

Groups - анкеты действующих групп: E-mage.

Groups - анкеты действующих групп: Eternity Industry.

Groups - анкеты действующих групп: Excess team.

Groups - анкеты действующих групп: Extreme Entertainment.

Groups - анкеты действующих групп: Fatality.

Groups - анкеты действующих групп: Jupiter 77.

Groups - анкеты действующих групп: Proxima Centauri.

Groups - анкеты действующих групп: RaZZLeRs.

Groups - анкеты действующих групп: RUSH.

Groups - анкеты действующих групп: Smash Hackers Band.

Illegal Corner - Razzlers оправдываются за релиз демки First Association.

Illegal Corner - Scenergy Release Charts - конкурс крэков.

Illegal Corner - Welcome to Scenergy Release Charts (SRC).

Illegal Corner - софтография Fatality Group.

Lits - Pussy: история создания знаменитой игры от Fatality.

Lits - Scenergized beyond the belief.

Lits - speed.

Lits - история образования Ростовской ассоциации PartyZans.

Lits - история создания игры "Белый орел - товарищ известен".

Lits - рассказ о том как Fatality выпускает игрушки.

Mail Box - письма: Ellvis и Fatality довольны Scenergy #1, Ulterior поносит Antares и BrainWave, Realtimer разочарован.

News - Doom'a не будет!

News - Виртуальное пати Millennium, X-Raizor вернулся на сцену, Andrew Fer организовал новую группу, провал Германского пати Spectrology, новости от 3SC, Zero Team, Extreme.

News - мнение Megus'a о dentro compo СС'2000.

News - новости от OHG, Delta Hackers Group, Die Crupps, Волгодонских спектрумисто и от группы SpeedWay.

Scenergy - адреса для связи с редакцией.

Scenergy - благодарности соавторам журнала.

Scenergy - новое в облочке журнала.

Scenergy - обещанного видео в статьях не будет...

V.I.P. - Random берет интервью у Unbel!ever/Sage/XTM.

V.I.P. - The most noble tale of the scene.

V.I.P. - интервью с Arny и Mythos, создателями клона Elite игры Awaken.

V.I.P. - Интервью с Fatality, широко известными крэкерами и гейм-мэйкерами

V.I.P. - интервью с одним из авторов игры Elite.

V.I.P. - интервью с одним из самых прогрессивных художников на спектруме Diver/4D.

V.I.P. - Интервью, взятое у Random'а каким-то PC-журналом

Warez Pack - описание Inertia Player.

Warez Pack - описание демо 1140.

Warez Pack - описание импортной демки 'no work'.


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

Похожие статьи:
Игрушки - Monstrland.
Интервью - Юрий Матвеев (STEP).
Сатанизм - вечная ересь.
Редакция - авторы номера и адреса редакции.
Мнение - интервью с Sir Denis.

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