Buzz #10
16 сентября 1997

Ассмблер - Красивый эффект "Горение спрайта".

<b>Ассмблер</b> - Красивый эффект
╔═────────────────────────────────────────────────────────────═╗
│                     *** АССЕМБЛЕР ***                        │
╚═────────────────────────────────────────────────────────────═╝

(c) Paracels & DYK.
    
   Появление этой рубрики связано с ее необычайной популярностью
во всех компьютерных изданиях. Мы решили не обделять Вас - наших
читателей этой радостью, но хотим сказать, что вовсе  не претен-
дуем на звание крутых кодеров и т.п.
   Мы решили не учить Вас  ассемблеру, так как  сейчас его знает
каждый (или почти каждый), а просто приводить assm'овские тексты
некрторых эффектов и пояснения к ним.
   Мы надеемся, что в эту рубрику будет попадать все, что связа-
но с  ассемблером: эффекты, полезные  программки, xor'ки  и т.п.
Что же конкретно  будет печаться в рубрике 'АССЕМБЛЕР', зависит,
в первую очередь, от нас и, конечно, от Вас.
   Возможно, ведя эту рубрику, мы сами научимся чему-нибудь кру-
тому и поделимся с Вами, а пока приводим текст простого  но кра-
сивого эффекта 'ГОРЕНИЯ СПРАЙТА'. Поснения  напротив строк помо-
гут Вам лучше разобраться в работе эффекта.
   Эффект  основан на  обработке спрайта  логическими операциями
AND, OR и  XOR, благодаря  которым  и  получается  огонь. Размер
спрайта  Вы  можете задать  в переменных  X_SIZE и Y_SIZE. Meтка
SHIT указывает на начало вашего спрайта (здесь он хранится в ви-
де списка DEFB байт, Вы же можете подгружать его INCBIN'ом).
   Еще один нюанс: при создании своего спрайта оставляйте сверху
запас в 2-3 знакоместа для того, чтобы горящие "угольки" отлета-
ли повыше, что будет смотреться очень красиво.
   А вот и сам текст...

X_SIZE  EQU 4           ;Размер спрайта по X (в знакоместах).
Y_SIZE  EQU 32          ;Размер спрайта по Y (в пикселах).

        ORG 25000
LOOP    EI
        HALT
        DI
        CALL GOREN         ;Вызов подпрограммы горения спрайта.
        LD A,#7F
        IN A,(#FE)         ;Опрос <SPACE>.
        RRA
        JR C,LOOP
        EI
        RET 

GOREN   LD HL,SHIT         ;Адрес спрайта.
        EXX
        LD C,0
        LD DE,16384        ;Адрес экрана для печати спрайта.
        LD L,E
        LD H,D
X_COOR  PUSH DE
        LD B,X_SIZE
X_COOR2 EXX
        LD A,R             ;Берем "случайное" число в А, заносим
        LD E,A             ;в Е. эндим А числом 7 и заносим в D.
        AND 7
        LD D,A
        EX DE,HL           ;HL=адрес экрана, DE=адрес спрайта.
        XOR (HL)           ;Ксорим А содержимым экрана, увели-
        INC L              ;чиваем адрес в HL и делаем OR содер-
        OR (HL)            ;жимым HL.

        EX DE,HL           ;HL=адрес спрайта, DE=адрес экрана.

        EXX                ;Сменяем регистры: HL=DE=адрес экрана
                           ;(в данном случае #4000/16384).

        EX DE,HL           ;HL=#4000, DE=#4000.
        AND (HL)           ;Эндим А содержимым экрана.
        EX DE,HL           ;HL=#4000, DE=#4000.

        EXX                ;Сменяем регистры: HL=адрес спрайта,
                           ;DE=адрес экрана.

        OR (HL)            ;Эндим А байтом спрайта,
        INC HL             ;увеличиваем адрес в HL.
        EXX                ;Сменяем регистры: HL=#4000, DE=#4000
        LD (HL),A          ;Заносим в (HL) (HL=#4000) содержимое
                           ;регистра А, т.е. заносим на экран.

        INC E              ;Увеличиваем L и E: DE=#4001,
        INC L              ;HL=#4001

        DJNZ X_COOR2       ;Уменьшаем B; если не ноль, то пере-
                           ;ходим на X_COOR2

        POP DE             ;Восстанавливаем DE. DE=#4000.
        LD L,E             ;L=E=#00
        LD H,D             ;H=D=#40

        CALL INC_DE        ;Переходим на подпрограмму получения
                           ;нижнего адреса экрана.

        INC C              ;Увеличиваем C,
        LD  A,C	           ;заносим в А и сравниваем с высотой
        CP  Y_SIZE         ;вашего спрайта по Y.
        JR  NZ,X_COOR      ;Если не ноль, т.е. C не равно Y, то
                           ;переходим на X_COOR.

        EXX                ;Сменяем регистры.
        RET
 
;Подпрограмма получения нижнего адреса экрана в DE.
INC_DE  INC D
        LD  A,D
        AND 7
        RET NZ
        LD  A,E
        ADD A,32
        LD  E,A
        RET C
        LD  A,D
        SUB 8
        LD  D,A
        RET

SHIT    DEFB    0,0,0,0,0,0,0,0
        DEFB    0,0,0,0,0,0,0,0
        DEFB    0,0,0,0,0,0,0,0
        DEFB    0,0,0,0,0,0,0,0
        DEFB    0,0,0,0,0,0,0,0
        DEFB    0,0,0,0,0,0,0,0
        DEFB    0,0,0,0,0,0,0,0
        DEFB    0,0,0,0,0,0,0,0
        DEFB    102,253,153,240,102,193,155,0
        DEFB    102,193,155,0,102,193,155,0
        DEFB    102,193,155,0,102,193,155,0
        DEFB    102,193,155,0,60,241,251,112
        DEFB    102,193,155,48,102,193,155,48
        DEFB    102,193,155,48,102,193,155,48
        DEFB    102,193,155,48,102,193,155,48
        DEFB    102,193,153,240,0,0,0,0

   Ну что ж, желаем УДАЧИ !!!

                                                 Paracels & DYK.



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

Enlight'97 - Краткий отчет от ROM Corp.

Newness - Описание программы Paracels Alkatraz Protection v2.0

Rants & Raves - Что мы используем при создании газеты ?..

TOP TEN - Лучшая десятка системных программ.

Авторы

Анекдоты - 9 анекдотов...

Ассмблер - Красивый эффект "Горение спрайта".

Въедем - Описание игры : How to be a complete bastard.

Наши новости - Игра Sex Bomber от Melted Show.

Новелла - Компьютерная новелла "The Neverending Story" часть 1

Обзорчик - Обзор игровых программ: Starglider, Scramble Spirits, The Acid game 1-4, Narcopolice, Slaine.

От авторов - Небольшой юбилей газеты.

Отдохнем ?! - Прикольный рассказик "Мелкий".

Содержание


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

Похожие статьи:
Реклама - реклама и объявления.
А за базаР... - письмо от юзера из Иркутска.
Вступление - От авторов.

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