|
Buzz
#10
16 сентября 1997 |
|
Ассмблер - Красивый эффект "Горение спрайта".

╔═────────────────────────────────────────────────────────────═╗
│ *** АССЕМБЛЕР *** │
╚═────────────────────────────────────────────────────────────═╝
(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.
Другие статьи номера:
Похожие статьи:
В этот день... 26 октября