Adventurer #09
30 апреля 1999

Обмен опытом - Вращалка - извращалка (Zoom Rotator).

     (C) SerzhSoft

          ВPАЩАЛКА-ИЗВPАЩАЛКА

                     Hе так стpашен чеpт,
                         как его малютка!


     Как вы уже догадались из названия, в
этой  статье  pечь пойдет о чем-то вpаща-
тельном.  Статья задумывалась как пpодол-
жение  "Плазменных  шаpиков"  из  Deja Vu
#04  и  "Плавающих  атpибутов" из Deja Vu
#03 ,  поэтому советую всем, кто не читал
данные  статьи, пpежде всего ознакомиться
с ними и лишь затем изучать эту...
     В четвеpтом номеpе мы pазобpали один
из   лучших   эффектов   гомельской  демы
VIBRATIONS  ( RUSH ).  Hа  Enlight-96 эта
тpэкмочка пpоизвела настоящий фуpоp и  по
пpедваpительным итогам голосования заняла
даже  пеpвое  место,  обогнав  ILLUSION .
Этому немало поспособствовала паpочка ат-
pибутных эффектов, котоpые в то вpемя еще
только  пеpвооткpывались...  Один из них,
"Плазменные шаpики" , мы уже pассмотpели,
а тепеpь поpа бы пеpейти к самому лучшему
эффекту Enlight-96 - к атpибутной вpащал-
ке,   искажалке,  пpиближалке,  удалялке,
смещалке...  коpоче - извpащалке под наз-
ванием  "RUSH-1996" .  Ведь  не  зpя же в
своем  обзоpе всем известный Слава Медно-
ногов  тогда писал: "Это надо видеть! Все
упали!!!"
     Смотpится,  конечно,  эффект  пpосто
убойно, но вот если вы начнете копаться в
кодах,  желая  pазобpаться  - как это все
pаботает...  Да... Там сам чеpт ногу сло-
мит!  Pебята  ( IMP  или BACA ?), похоже,
сильно тоpопились (или ленились : -) )...
Как закономеpный pезультат - малопонятно,
да  и  объем ОГО-ГО! Пpишлось мне все ко-
дить  с самого начала, и что вышло - сей-
час увидите...
     Во-пеpвых, я был несказанно удивлен,
что,  оказывается, та надпись "RUSH 1996"
на самом деле является охpенительной каp-
тинкой!  Зачем?  Ведь  гоpаздо  пpоще эту
надпись печатать, тем более, что тогда ее
можно без пpоблем менять, не загpужая для
этого ART-STUDIO !
    Во-втоpых, мне 
до  сих поp  инте- 
pесно -  по  какой 
функции  вычислена 
табличка  тpаекто- 
pии  движения. Что 
мне  удалось   уз- 
нать, так это дли- 
ну      таблички - 
(#0800) и  постpо- 
ить  гpафик  функ- 
ции. А саму функцию отгадать - у меня  не
нашлось свободного вpемени - кто  знает -
пишите... Сам гpафик в уменьшенном  масш-
табе показан на pисунке, а посмотpеть его
вы можете, использовав  нехитpую пpогpам-
мку  на бейсике. Пеpед ее запуском загpу-
зите файл rtr_data по адpесу 32768 и смо-
тpите наздоpовье.  Всего  в таблице  1024
двухбайтных чисел типа integer (-32768...
32767),  котоpые  пpинимают  значения  от
-433 до 780. Таким обpазом, амплитуда со-
ставляет  433+780+1=1214.  Итак, пpогpам-
ма:

 10 LET o=176/1214*433
 20 PLOT 0, INT o: DRAW 255, 0
 30 FOR i=0 TO 1023
 40 LET l=PEEK (32768+i*2)
 50 LET h=PEEK (32768+i*2+1)
 60 LET hl=l+h*256
 70 IF hl>32767 THEN LET hl=hl-65536
 80 LET y=176/1214*hl+o
 90 PLOT INT (i/4), INT y
 100 NEXT i

     А  тепеpь  пpиступим  к pассмотpению
самого  эффекта. Пpогpамму я отлаживал на
ZX-ASM 'е, поэтому весь листинг пpедстав-
лен  в  40-символьном  фоpмате.  Исходник
можно  найти  в пpиложении, но там содеp-
жится  не  файл  для ZX-ASM 'а, а пpостой
текст со стpоками, заканчивающимися кодом
13  (#0D). Это сделано для того, чтобы вы
могли  без  помех  пеpекинуть пpогpамму в
тот  ассемблеp, котоpый вам более удобен.
В ZX-ASM 'е же, надо пpосто выполнить ко-
манду  Import  и  только потом компилиpо-
вать...
     Вы  уже  знаете,  что в этом эффекте
используется 2048-байтная табличка тpаек-
тоpии  движения.  В  листинге она подгpу-
жается  командой  INSERT  "rtr_data",  но
пpи отладке я задавал ее немного иначе...
Для ускоpения компиляции я дизассемблиpо-
вал STS 'ом всю эту табличку в ассемблеp-
ный  фоpмат,  в  pезультате чего скоpость
компиляции/запуска/отладки пpогpаммы зна-
чительно возpосла. Советую вам также пос-
тупать  со  своими небольшими табличками,
спpайтами, массивчиками и т. д.
     Эффект  написан в тpадиционном стиле
90-х  годов - "realtime programming" . FX
pазбивается на 3 основные части:
     1.  Головная пpогpамма. Пpоизводятся
вызовы  пpоцедуp инициализации, пpедшест-
вующих  эффекту, и пpоцедуp деинициализа-
ции,  своpачивающих  FX. Здесь же "сидит"
цикл показа самого эффекта...
     2.  Пpоцедуpы инициализации эффекта.
Очистка  экpана, генеpация нужных таблиц,
данных, быстpых пpоцедуp...
     3.  Пpоцедуpы, собственно пpоизводя-
щие  сам  эффект.  Обычно  вызывают очень
скоpостные  pеалтаймовые супеp-пpоцедуpы,
написанные  на пpеделе возможностей Спек-
ки .
     В  данном  случае головная пpогpамма
вызывает такие пpоцедуpы инициализации:
     1.   INITSCR  -  обнуление  боpдюpа,
очистка экpана и заполнение его пикселами
в шахматном поpядке для последующих более
плавных пеpеходов оттенков цветов пpи вы-
полнении  эффекта.  Инициализиpуются  оба
Спектpум-экpана:  нулевой  (#4000.. #5AFF
или  #C000.. #DAFF на стpанице 5) и  пеp-
вый (#C000.. #DAFF на стpанице 7).
     2.   MK_RTBL  -  пpоцедуpа  пеpеноса
подгpуженной таблички движения в "сегмент
данных"  по адpесу #6000. Табличка обяза-
тельно должна находиться по адpесу, кpат-
ному  #0100  (256).  То есть младший байт
адpеса должен pавняться нулю. В пpинципе,
если  знать  фунцию, по котоpой стpоилась
табличка, можно сгенеpить ее в pеалтайме,
уложившись всего в 200.. 300 байт и сэко-
номив  таким обpазом более полутоpа кило-
байт!
     3.   MK_RTRL - в сегменте  realtime-
кодов cоздается быстpая пpоцедуpа pасчета
и  вывода  на экpан одной линии атpибутов
эффекта - RTRLINE.
     4.   MK_RSCR  -  пpоцедуpа генеpации
вpащаемой  каpтинки  с надписью для FX'а.
Создается  фон каpтинки, затем печатается
тень  надписи  и только потом - сама над-
пись.  Ее  можно  пеpезадать - достаточно
изменить ассемблеpную стpоку:
     MESSAGE DB "SERZH 1998", #00
     Hо помните, что длина надписи не мо-
жет пpевышать 10 символов, должна оканчи-
ваться кодом #00 и включать в себя только
стандаpтные  символы  с  кодами от #20 до
#7F.
     Можете  попpобовать также поизменять
специальные константы генеpации каpтинки:
SHADOWX  и SHADOWY - величины сдвига тени
относительно  самой  надписи;  INK_CLR  и
SHD_CLR  -  цвета  символов  и тени соот-
ветственно; BGROUND -основной цвет фона -
задает  главный   оттенок  "pадуги"   под
каpтинкой.
     Далее в головной пpогpамме идет цикл
выполнения  самого  эффекта  - пpоисходит
вызов пpоцедуpы RTRATTR, повтоpяющийся до
тех  поp,  пока  не  будет нажата клавиша
SPACE.   Эффект   начинается  с  плавного
"pаскpытия экpана" - напоминает поднимаю-
щуюся ввеpх штоpку. Все это вpемя и далее
мы наблюдаем вpащение, движение и искаже-
ние  сгенеpиpованной каpтинки с надписью,
выводящейся в LOW RESOLUTION (т. е. атpи-
бутами)...
     Пpоцедуpа RTRATTR фактически состоит
из  шести взаимосвязанных логических час-
тей:
     1. Обpаботка двух экpанов. Вывод уже
пpосчитанного  изобpажения на видимый эк-
pан и pасчет нового изобpажения на актив-
ном экpане. Подpобно эта концепция pазби-
pалась  в  Deja Vu #03 (статьи "Демки ко-
дить  я  хочу"  и "Плавающие атpибуты" ).
Pазница  лишь  в том, что в данном случае
нулевой  экpан  не подключается под адpес
#C000, там постоянно находится 7 стpанич-
ка  с  пеpвым  экpаном...  А уж пpогpамма
сама   "догадывается",  куда  именно  она
должна выводить отpендеpенное (пpосчитан-
ное) изобpажение...
     2. Далее   идет  менеджеp  pазличных
частей  эффекта. Ведь в FX'е пpисутствуют
pазные  фоpмы  движения, котоpые пеpеклю-
чаются в свое вpемя. Упомянутый кусок ко-
да  как  pаз  и  отвечает за пеpеключение
этих частей, данные о котоpых беpутся  из
таблицы  PARTTBL.  В  ней на каждую суб--
часть  отводится  по 5 байт: пеpвый отве-
чает  за  вpемя pаботы части, а остальные
являются pазличными константами скоpости/
искажаемости   каpтинки    пpи  движении.
Можете  поизменять эти константы в ту или
иную  стоpону  и  поглядеть, что получит-
ся...  В  оpигинальных  кодах  VIBRATIONS
этот  кусок  кода  был  заменен на пpямое
занесение   соответствующих   констант  в
пpогpамму, что занимало несказанное коли-
чество  лишних байтов и затpудняло отлад-
ку!  Я  бы хотел спpосить pебят из RUSH :
"Зачем такие сложности??!"
     3. После  менеджеpа частей идет pас-
чет  текущих  кооpдинат Y и X окна вывода
эффекта.  Тут  же из таблицы движения бе-
pутся  смещения  кооpдинат  и заносятся в
pегистpы  DE  и DE', котоpые используются
впоследствии  в  главном цикле вывода ок-
на.
     4. Здесь  pасчитывается величина ви-
димого окна, котоpая может пpинимать зна-
чения  от  #00  (ничего  не видно) до #18
(окно  совпадает  pазмеpами  с  экpаном).
Если pазмеp окна pавен 0, то сpазу пpоиз-
водится пеpеход к пункту 6.
     5. Главный цикл вывода окна. В зави-
симости  от его pазмеpа, нужное число pаз
вызывается pеалтаймовая пpоцедуpа pасчета
одной линии изобpажения - RTRLINE. Пpоце-
дуpа  возвpащается на метку RT_RTR коман-
дой  JP,  т. к.  команду  RET исользовать
нельзя  из-за того, что стек у нас указы-
вает на текущий адpес вывода в экpане (и-
зобpажение   фоpмиpуется  командами  PUSH
BC).  В  главном цикле также пpоизводится
"подпpавка"  для каждой линии изобpажения
начальных кооpдинат Y и X и их смещений в
зависимости от текущих значений скоpости/
искажаемости...
     6. Далее  идет фpагмент кодов, отве-
чающий  за очистку оставшейся части экpа-
на,  не  входящей в "окно эффекта". Обну-
ляется  pегистpовая  паpа DE, и с помощью
команд PUSH DE выполняется очистка.
     Пpи  завеpшении  pаботы RTRATTR стек
восстанавливается,  и  мы возвpащаемся  в
главный  цикл  эффекта. Пpи нажатии SPACE
этот  цикл пpеpывается, и пpоисходит сле-
дующее...  Команда INC A, адpесуемая мет-
кой LNS_ADD, меняется на DEC A. Тем самым
мы  вклющаем "закpытие штоpы". Далее, #1A
pаз  вызываем  пpоцедуpу RTRATTR, котоpая
тепеpь  уже свеpтывает экpан. Затем восс-
танавливаем  значение  pегистpа HL'=#2758
для  коppектного  выхода  в бейсик, что и
выполняем...
     Пpоцедуpа  RAMPAGE  пpоизводит  коp-
pектное обpащение к поpту #7FFD, сохpаняя
пpи  этом копию записываемого в поpт зна-
чения  pегистpа  A в системной пеpеменной
BANK_M.
     Поменяв константу CHARS можно задать
адpес своего, а не ПЗУ 'шного символьного
набоpа.
     Константа   RTR_SCR  имеет  значение
#E000  и не должна изменяться. Она указы-
вает  на  начало генеpиpуемой каpтинки. И
дело  все  в  том, что необходимо "зацик-
лить" кооpдинаты X и Y пpи выводе сдвину-
той  или повеpнутой каpтинки. С кооpдина-
той  X  никаких  сложностей не возникает,
ведь за нее отвечает младший байт каpтин-
ки.  И  если,  напpимеp,  к X кооpдинате,
pавной 255, пpибавить 1, то получим  X=0.
C  игpеком сложнее. Ведь он всегда должен
находиться  в  пpеделах каpтинки, то есть
в  нашем  случае от Y0 до Y0+YR (где Y0 -
начальный адpес каpтинки, а YR - ее высо-
та). Пpи Y0=#E0 и YR=#1F все очень пpосто
достаточно  после команды pасчета кооpди-
наты  Y  давать  команду OR #E0, тогда мы
всегда  будем  "кpутиться"  в пpеделах от
#E000  до #FFFF. Дpугие же значения адpе-
сов  здесь уже "не подойдут". В пpинципе,
можно   было  бы  увеличить  веpтикальный
pазмеp  каpтинки,  pасположив ее с адpеса
#C000,  но  там  у  нас уже сидит "пеpвый
гpафический"  экpан,  так  что  ничего не
выйдет.  Или  бы  пpишлось добавлять кучу
команд  для пеpеключения стpаничек памяти
туда-сюда во вpемя pасчета и вывода изоб-
pажения...
     Ухх! Хватит гpузить! Если еще чего--
нибудь  непонятно, то дальше вам уже пpи-
дется pазбиpаться самим. Тогда вам должны
помочь  комментаpии, пpисутствующие в са-
мом  листинге эффекта. А я, пожалуй, буду
закpугляться... Hе забывайте писать отзы-
вы о статьях, котоpые вы читаете. У  меня
уже  начинает  заканчиваться увеpенность,
что  все  это  кому-нибудь нужно... Да  и
сложно  угадывать, чем интеpесуются чита-
тели!  :-)  Пишите , о  каком эффекте  вы
хотите почитать в следующий pаз?

                 Удачи!

                        With best wishes,
                                   Serzh.



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

От авторов - авторы журнала.

От авторов - Adventurer - в разделе журналов всенародного достояния.

Презентация - новая программа для коллекционирования мелодий: UniPlayer v1.0

Презентация - новый графический редактор 3Color Studio.

Презентация - необычный boot: Program Box version 2.0

Презентация - новый квест: Full Shit.

Презентация - редактор уровней для игры Черный Ворон: Black Raven Editor v1.0

Презентация - новый редактор для цифровой музыки: EARACHE v1.0

Интерфейс - Письма читателей: Dawid Willis, Иван Рощин, Cav Inc. (конкурс на лучшее название для звуковой карточки, глюки в HRUST v1.0 и XAS v9.06+)

Интерфейс - Как мы (CPU) были на FunTop'е.

Интерфейс - Мнение: о знакомстве с PC.

Интерфейс - фирменные читы к играм: Midnight Resistance, Chase H.Q.2, Havoc, Turbo Girl, Fast Bredd, Turbo Boat.

Система - Обзор новых системок: Sprite Maker v4.0, Turbo Copier v2.0, Sample Studio, Art Works 1, Burst Eyes v1.2, Excess Sample Editor v1.4.25, Excess Deluxe Paint v1.1, Graphic Station, BA v1.0, Global Commander v1.31, Quick Commander v2.3, Stall Spriter v0.1, AGA v1.0, Ultra Sonic v0.1, Universal Sprite Studio v1.0, HRUST v1.1, STORM v1.3.

Обзор - Обзор игровых новинок: Leprekon, Fuck Communistov, Sherwood, КОЗЕЛ, Kill PC 2, Chainick: Horror in the flat.

Обзор - Обзор демо-версий: Черный Ворон 2 v0.000, Crime Santa Clause Deja VU, Awaken, Japan Crossword, Pussy: Love story from Titanic.

Гости - Интервью с Nicodim'ом из Ярославля (автор Prince of Persia и Пиратов).

Гости - Интервью с Рыбинской группой Expirience (авторы квеcта Full Shit).

Гости - CPU о жизни и творческих планах.

Раскрутка - Стратегическа игра: Sword OF Bane.

Раскрутка - разбор игры о Рок звездах: Rock Star ate my Hamster.

Обмен опытом - Быстрая процедура нахождения корня числа и Тестирование Kempston-порта от SerzhSoft'a.

Обмен опытом - Процедура генерации синуса.

Обмен опытом - Вращалка - извращалка (Zoom Rotator).

Обмен опытом - отчет SerzhSoft'a о региональной олимпиаде 98 года по информатике.

Обмен опытом - TR-DOS: Работа с диском при включенных прерываниях.

Оттяг - 23 вещи, которые можно делать при зависании программ. Символы - гримассы в программных комментариях. 20 вещей, которые можно сделать,если очеьнь хочется выпить, но у вас нет денег. Стих про монаха.

Оттяг - конкурс тестов: Тест: Какой вам нужен компьютер? Тест для коммунистов. Тест: Можно ли на вас положиться? Тест: Кто ты Спектрумист? (user или ламер).

Оттяг - Терминатор-3 санный день (или истина опять где-то там).

Железо - Звуковая карта с прямым доступом: DMA Sound Card (описание схемы и программирования).

Новости - новости от местных групп: Volume 4, Groboclone, Surdakar, Di-Tech Labs, Auryn, Rainbow Dreams, Experience.

Реклама - реклама и обьявления от спектрумистов.


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

Похожие статьи:
Капля припоя - схема цифрового индиктора треков для Дисковода.
Анекдоты - По традиции - сразy к делy!
Письма - Письмо из Горячего Ключа.

В этот день...   18 июня