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.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября