Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Ассемблер. Эмулятор огня (http://www.tehnari.ru/f41/t74358/)

Женя_RU 02.06.2012 00:02

Ассемблер. Эмулятор огня
 
Помогите пожаулйста, у меня есть программа эмулирующая огонь, нужно добавить:
чтобы можно было регуировать высоту огня, и кто может закоментить эту прогу, коменты можно совсем расчитанные под начинающего програмиста
Код:

        .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


kreol 02.06.2012 14:22

возможно смогу помочь, только что это за ассемблер?

Женя_RU 04.06.2012 01:01

Это TASM, наиболее важно понять как работает это кусок кода:
Код:

        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



Часовой пояс GMT +4, время: 12:53.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.