Buzz
#11
22 октября 1997 |
|
Ассемблер - Эффект "пламени".
___ _ --/ · - = Ё │<A│< Р\/ЛИ│Ь 8 ╫((ЕМБЛЕРЕ /80 Ё = - · / /-- ▓▓░ ▓▓▓▓▓▓▓▓▓▓▓▓▓ ░▓▓ ▓▓▓▓░ ▓▓░ ░▓▓ ░▓▓ ▓▓░ ▓▓░ ▓▓▓▓▓▓▓▓▓ ░▓▓ ░▓▓▓▓ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▓▓░ ▓▓░ ░▓▓ ░▓▓ ░▓▓ ░▓▓ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▓▓▓▓▓▓░ ▓▓░ ░▓▓ ░▓▓▓▓▓▓ ░▓▓ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▓▓░ ░▓▓ ░▓▓ ░▓▓ ░▓▓ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▓▓░ ▓▓░▓▓ ░▓▓ ░▓▓ ░▓▓ ▓▓░ RULEZ! ▓▓▓ ░▓▓ ░▓▓ ░▓▓ (C) SYRUS & SENAT Привет всем ! Сегодня с вами в рубрике "АССЕМБЛЕР" мы, т.е. SYRUS & SENAT надеемся,что все,что мы тут понаписали не окажется для Вас безинтересным. Безмерно порадовавшись созданию этой рубрики, мы с живейшим интересом откликнулись на предложение написать несколько чего- нибудь. И сегодня,мы предлагаем Вам поджечь экран вашего устрой- ства видеовывода. Для этого Вам не понадобятся спички,зажигалки, горюче-смазочные материалы и прочие хорошо воспламеняющиеся пре- дметы, а всего лишь: а) голова, чтобы думать; б) руки, чтобы писать то, что надумаете; в) хороший ассемблер для объединения усилий предыдущих членов, с целью осуществления поджога вышеназванного устройства видео- вывода без вывода оного из строя. Ну вот вроде-бы и все, что Вам сегодня понадобится. Итак нач- нем ... Сразу хочется отметить, что FLAME здорово смотрится на более "крутых" тачках нежли SPECTRUM (например на AMIGA (просто улет) или pC (фу, какая гадость)). На SPECCY же, в силу того, что у него бедные цветовые возможности и в силу довольно солидной ре- сурсоемкости самого эффекта, результат конечно-же похуже,но все- равно впечатляющий. Итак начнем с палитры цветов. Расширить ее можно с примене- нием сетки на графическом экране (пиксели в шахматном порядке). Хотя конечно это не заменит "чистый" цвет, но все-таки. Получить "новый" цвет можно комбинированием цветов INK и PAPER. Здесь возможны два варианта: а) плавный переход от красного до белого (через оттенки красного и желтого); б) просто много цветов. На каком варианте Вы остановитесь - это дело вашего вкуса. Итак, палитра у Вас готова, теперь следует продублировать (утроить ..., или ничего не делать - это подбираете опытным пу- тем) каждый элемент палитры, и палитра готова. Теперь, обсчет. Для начала,Вам потребуется два предварительно очищенных буфера размером (SIZE_X+2)*(SIZE_Y+2) каждый (откуда берется +2 Вам станет ясно позже), где: SIZE_X - размер области по горизонтали; SIZE_Y - размер по вертикали. Наконец, мы вплотную приблизились к самой процедуре обсчета точки. Вот ее текст: LD A,(HL) ;Регистр HL указывает на BUFFER1. INC HL ;Регистр DE - на BUFFER2+1. ADD A,(HL) INC HL ADD A,(HL) ADD HL,BC ;Регистр BC=SIZE_X+2. ADD A,(HL) DEC HL DEC HL ADD A,HL ADD HL,BC ADD A,(HL) INC HL ADD A,(HL) INC HL ADD A,(HL) OR A RRA RRA RRA AND INT ;INT - интенсивность горения (не со- LD (DE),A ;ветуем брать больше, чем число цве- ;тов в палитре). Теперь, когда Вы примерно поняли суть работы процедуры, сле- дует объяснить поподробнее, как же все-таки она работает. Итак: 1) Берется точка в BUFFER1 (точнее, не берется ее значение, а берется она за исходную) 2) Суммируются восемь значений, распологающихся в BUFFER1 во- круг исходной точки (см.рис. 1) ┌───┬───┬───┐ │ 1 │ 2 │ 3 │ 0 - исходная точка. ├───┼───┼───┤ │ 5 │ 0 │ 4 │ 1...8 - суммируемые точки. ├───┼───┼───┤ │ 6 │ 7 │ 8 │ рис. 1 └───┴───┴───┘ 3) Полученный результат делится на 8 и помещается в BUFFER2 плюс смещение, равное смещению исходной точки в BUFFER1. 4) Последовательно обсчитываются все точки в BUFFER1 (окно обсчета равно SIZE_X*SIZE_Y) 5) BUFFER2 выводится на экран. Порядок вывода следующий: а) берется байт из BUFFER2, его значение будет равно смещению в палитре; б) по этому смещению в палитре берется "цвет"; в) цвет выводится на экран; г) Меняем местами BUFFER1 и BUFFER2, т.е. меняем в программе адреса BUFFER1 на BUFFER2 и наоборот. Да, чуть не забыли, перед началом всех этих действий нужно нижнюю строку буферов заполнить случайными числами(значение этих чисел будет влиять на интенсивность огня). Хочется добавить, что приведенная здесь процедура обсчета будет работать где-то прерывания за 3 (весь экран атрибутов). Гораздо приятнее эффект смотрится за два (в этой процедуре огро- мный простор для оптимизации). Ну а уж, если кто-нибудь каким-то чудом умудрится уложиться в одно, то это будет просто класс (мы, как не пахали, быстрее 100000 тактов дело не пошло). Ну ладно,за сим низко кланяемся и до новых встреч. Искренни ваши SYRUS & SENAT from ETERNITY INDUSTRY. P.S. Специально для BUZZ'a.
Другие статьи номера:
Похожие статьи:
В этот день... 5 ноября