Ассемблер. Эмулятор огня
Помогите пожаулйста, у меня есть программа эмулирующая огонь, нужно добавить:
чтобы можно было регуировать высоту огня, и кто может закоментить эту прогу, коменты можно совсем расчитанные под начинающего програмиста
Код:
.model small
.stack 100h
.data
red db 0
green db 0
blue db 0
color db 0
background db 0
speed dw 1
palette label byte
i=0
rept 8
db 0, 0, i*2
i=i+1
endm
i=0
rept 8
db i*2, 0, 16-2*i
i=i+1
endm
i=0
rept 16
db 16+47*i/16, 0, 0
i=i+1
endm
i=0
rept 48
db 63, 21*i/16, 0
i=i+1
endm
i=0
rept 48
db 63, 63, 21*i/24
i=i+1
endm
db 179*3 dup(63)
buffer db 320*200 dup(0)
seed dw 1
exit_msg db " the end", 13, 10,'$'
.code
.386
start:
;установка видео режима 320*200*256
mov ax, 0013h
int 10h
;установка новой палитря
mov ax, @data
mov ds, ax
mov dx, 03C8h
xor al,al
out dx,al
inc dx
mov cx, 256*3
mov si, offset palette
set_pal:
mov al, [si]
cmp background,48
jb vivod
cmp color,0
je _red
cmp color,1
je _green
cmp color,2
je _blue
jmp vivod
_red:
add al,red
cmp al,64
jb @1
sub al,64
@1:
mov color,1
jmp vivod
_green:
add al,green
cmp al,64
jb @2
sub al,64
@2: mov color,2
jmp vivod
_blue:
add al, blue
cmp al,64
jb @3
sub al,64
@3:
mov color,0
vivod:
inc background
out dx, al
inc si
dec cx
jnz set_pal
mov background,0
mov ax, 0040h
mov es, ax
mov ax, es:[006Ch]
mov seed, ax
mov ax, 0A000h
mov es, ax
;бегаем до нажатия ESC
main:
;генерация огня
mov di, offset buffer
add di, 320*198
mov dx, 320
gen_fire:
;
mov ax, seed
mov cx, 8
new_bit:
mov bx, ax
and bx, 002Dh
xor bh, bl
clc
jpe shift
stc
shift: rcr ax, 1
dec cx
jnz new_bit
mov seed, ax
mov [di], ax
inc di
dec dx
jnz gen_fire
;
mov di, offset buffer
add di, 320*198+1
mov dx, 320-2
blur_line:
xor ax, ax
xor bx, bx
mov al, [di-1]
mov bl, [di]
add ax, bx
mov bl, [di+1]
add ax, bx
mov bl, [di+2]
add ax, bx
shr ax, 2
mov [di], al
inc di
dec dx
jnz blur_line
;
mov si, offset buffer
add si, 321
mov cx, 320*199
xor bx, bx
align 2
blur_fire:
xor ax, ax
add al, [si+321]
adc ah, bl
add al, [si+319]
adc ah, bl
add al, [si-1]
adc ah, bl
add al, [si+1]
adc ah, bl
ifdef eight
add al, [si-321]
adc ah, bl
add al, [si+321]
adc ah, bl
add al, [si-319]
adc ah, bl
add al, [si+319]
adc ah, bl
shr ax, 3
else
shr ax, 2
endif
test ax, ax
jz skip
dec al
align 2
skip:
mov [si-320], al
inc di
inc si
dec cx
jnz blur_fire
;pause
mov cx, speed
mov ah, 86h
int 15h
mov dx, 03DAh
vrtl1:
in al, dx
test al, 8
jnz vrtl1
vrtl2:
in al, dx
test al, 8
jnz vrtl2
mov si, offset buffer
xor di, di
mov cx, 320*100
rep movsw
;проверка на нажатие ESC
in al, 60h
cmp al,4eh
je speed_minus
cmp al,4Ah
je speed_plus
cmp al,13h
je __red
cmp al,22h
je __green
cmp al,30h
je __blue
cmp al,14h
je ___red
cmp al,23h
je ___green
cmp al,31h
je ___blue
jmp _esc
speed_minus:
add speed,5
jmp main
speed_plus:
sub speed,5
jmp main
__red:
mov al,red
inc al
mov red,al
jmp start
___red:
mov al,red
dec al
mov red,al
jmp start
__green:
mov al,green
inc al
mov green,al
jmp start
___green:
mov al,green
dec al
mov green,al
jmp start
__blue:
mov al,blue
inc al
mov blue,al
jmp start
___blue:
mov al,blue
dec al
mov blue,al
jmp start
_esc:
cmp al, 81h
jnz main
;возвражение в текстовый режим
mov ax, 0003h
int 10h
;сообщение по завершению программы
mov ah, 9
mov dx, offset exit_msg
int 21h
;выход
mov ax, 4C00h
int 21h
end start
|