Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .model small
- locals
- .stack 100h
- .386
- Mode_6 = 06h ; 640 X 200, 2 colors
- Mode_13 = 0Dh ; 320 X 200, 16 colors
- Mode_14 = 0Eh ; 640 X 200, 16 colors
- Mode_15 = 0Fh ; 640 X 350, 2 colors
- Mode_16 = 10h ; 640 X 350, 16 colors
- Mode_17 = 11h ; 640 X 480, 2 colors
- Mode_18 = 12h ; 640 X 480, 16 colors
- Mode_19 = 13h ; 320 X 200, 256 colors
- Mode_6A = 6Ah ; 800 X 600, 16 colors
- .data
- saveMode db ? ; Сохранить текущий видео режим
- temp dw ?
- half dd 0.5
- sqrt2div2 dd 0.707106781165
- video_page dd 0a0000h
- ; В 2 цветном режиме 1 = белый, в 16 цветном 1 = синий
- .code
- main proc
- mov ax,@data
- mov ds,ax
- ; Получить текущий видео режим
- mov ah,0Fh
- int 10h
- mov saveMode,al
- ; ; Переключиться в графический режим
- mov ah,0 ; установка видео режима
- mov al,Mode_17 ; номер режима
- int 10h
- finit
- ; mov ah, 05h
- ; mov al, 2
- ; int 10h
- mov ax, 100
- mov bx, 100
- mov cx, 300
- mov dx, 100
- fall:
- ; push eax
- ; mov eax, video_page
- ; xor eax, 4000h;0a000h
- ; mov video_page, eax
- ; pop eax
- call cls
- add bx, 4
- add dx, 4
- cmp bx, 480
- jge end_fall
- push cx dx ax bx
- call find_triangle_top
- pop di si
- push ax bx cx dx 4
- call koch_curve
- push cx dx si di 4
- call koch_curve
- push si di ax bx 4
- call koch_curve
- ; если делать с задержкой
- push ax cx
- mov cx, 2h
- mov ah, 86h
- int 15h
- pop cx ax
- ; push ax
- ; mov ah, 05h
- ; cmp video_page, 0A0000h
- ; je first
- ; mov al, 0
- ; jmp second
- ; first:
- ; mov al, 2
- ; second:
- ; int 10h
- ; pop ax
- jmp fall
- end_fall:
- ; ; Ожидаем нажатия клавиши
- mov ah,0
- int 16h
- ; ; Возврат в прежний видео режим
- mov ah,0 ; установить видео режим
- mov al,saveMode ; сохраненный видео режим
- int 10h
- ; ; Выход из программы
- mov ax,4c00h
- int 21h
- main endp
- cls proc far
- pusha
- push es
- xor ax, ax
- mov es, ax
- mov edi, video_page
- xor ax,ax
- mov cx,0a000h;32000d
- @@l:
- mov es:[edi], ax
- inc edi
- inc edi
- loop @@l
- pop es
- popa
- ret
- cls endp
- koch_curve proc far
- ; p1x, p1y, p2x, p2y, n
- push bp
- mov bp, sp
- push ax bx cx dx di si
- cmp word ptr [bp + 6], 0
- jg @@n_more_zero
- push word ptr [bp + 14]
- push word ptr [bp + 12]
- push word ptr [bp + 10]
- push word ptr [bp + 8]
- push 1
- call print_line
- jmp @@exit
- @@n_more_zero:
- ; dec n
- mov si, [bp + 6]
- dec si
- mov [bp + 6], si
- ;find top of triangle
- push word ptr [bp + 14]
- push word ptr [bp + 12]
- push word ptr [bp + 10]
- push word ptr [bp + 8]
- call trisection
- pop dx cx bx ax
- push ax bx cx dx
- call find_triangle_top
- pop di si
- ; recursion
- push word ptr [bp + 14] word ptr [bp + 12]
- push ax bx
- push word ptr [bp + 6]
- call koch_curve
- push ax bx si di
- push word ptr [bp + 6]
- call koch_curve
- push si di cx dx
- push word ptr [bp + 6]
- call koch_curve
- push cx dx
- push word ptr [bp + 10] word ptr [bp + 8]
- push word ptr [bp + 6]
- call koch_curve
- @@exit:
- pop si di dx cx bx ax bp
- ret 10
- koch_curve endp
- trisection proc far
- ; p1x, p1y, p2x, p2y
- push bp
- mov bp, sp
- push ax bx cx dx di si
- mov ax, [bp + 12] ; p1x
- mov bx, [bp + 10] ; p1y
- mov cx, [bp + 8] ; p2x
- mov dx, [bp + 6] ; p2y
- ; a.x a.y b.x b.y
- mov si, dx
- shl si, 1
- add si, bx
- push si
- mov si, cx
- shl si, 1
- add si, ax
- push si
- mov si, bx
- shl si, 1
- add si, dx
- push si
- mov si, ax
- shl si, 1
- add si, cx
- push si
- ; div a.x a.y b.x b.y 3
- mov bx, 3
- xor dx, dx
- pop ax
- div bx
- mov [bp + 12], ax
- xor dx, dx
- pop ax
- div bx
- mov [bp + 10], ax
- xor dx, dx
- pop ax
- div bx
- mov [bp + 8], ax
- xor dx, dx
- pop ax
- div bx
- mov [bp + 6], ax
- pop si di dx cx bx ax bp
- ret
- trisection endp
- find_triangle_top proc far
- ; p1x, p1y, p2x, p2y
- push bp
- mov bp, sp
- push ax bx cx dx si di
- ; vector m
- mov ax, [bp + 8]
- sub ax, [bp + 12]
- push ax
- mov ax, [bp + 6]
- sub ax, [bp + 10]
- push ax
- call rotate_on_60
- pop bx ax
- add ax, [bp + 12]
- add bx, [bp + 10]
- mov [bp + 12], ax
- mov [bp + 10], bx
- @@exit:
- pop di si dx cx bx ax bp
- ret 4
- find_triangle_top endp
- rotate_on_60 proc far
- ; ax, ay
- push bp
- mov bp, sp
- push ax bx cx dx si di
- fild word ptr [bp + 8]
- fld half
- fmulp
- fld sqrt2div2
- fild word ptr [bp + 6]
- fmulp
- faddp
- fild word ptr [bp + 6]
- fld half
- fmulp
- fild word ptr [bp + 8]
- fld sqrt2div2
- fmulp
- fsubp
- frndint
- fistp word ptr [bp + 6]
- frndint
- fistp word ptr [bp + 8]
- @@exit:
- pop di si dx cx bx ax bp
- ret
- rotate_on_60 endp
- print_line proc far
- ; x1, x2, y1, y2, color
- push bp
- mov bp, sp
- push ax bx cx dx si di
- mov ax, [bp + 14]
- mov bx, [bp + 10]
- cmp ax, bx
- jl @g
- mov [bp + 14], bx
- mov [bp + 10], ax
- mov ax, [bp + 12]
- mov bx, [bp + 8]
- mov [bp + 12], bx
- mov [bp + 8], ax
- @g:
- x1 equ [bp + 14]
- y1 equ [bp + 12]
- x2 equ [bp + 10]
- y2 equ [bp + 8]
- color equ [bp + 6]
- mov ax, x2
- mov bx, x1
- sub ax, bx ; ax - delta x
- mov bx, y2
- mov cx, y1
- sub bx, cx ; bx - delta y
- cmp bx, 0
- jl ydown
- cmp ax, bx
- jl up
- mov di, bx
- add di, di ; D
- xor si, si
- sub si, ax ; e
- mov cx, x1 ; x
- mov dx, y1 ; y
- push cx dx word ptr color
- call print_point
- inc cx
- @l:
- add si, di
- cmp si, 0
- jl @l1
- sub si, ax
- sub si, ax
- inc dx
- @l1:
- push cx dx word ptr color
- call print_point
- inc cx
- cmp cx, x2
- jl @l
- jmp @exitl
- up: ; то же самое, только dy > dx
- mov di, ax
- add di, di ; D
- xor si, si
- sub si, bx ; e
- mov cx, x1 ; x
- mov dx, y1 ; y
- push cx dx word ptr color
- call print_point
- inc cx
- @ll:
- add si, di
- cmp si, 0
- jl @ll1
- sub si, bx
- sub si, bx
- inc cx
- @ll1:
- push cx dx word ptr color
- call print_point
- inc dx
- cmp dx, y2
- jl @ll
- jmp @exitl
- ydown:
- neg bx
- cmp ax, bx
- jl upd
- mov di, bx
- add di, di ; D
- xor si, si
- sub si, ax ; e
- mov cx, x1 ; x
- mov dx, y1 ; y
- push cx dx word ptr color
- call print_point
- inc cx
- @ld:
- add si, di
- cmp si, 0
- jl @l1d
- sub si, ax
- sub si, ax
- dec dx
- @l1d:
- push cx dx word ptr color
- call print_point
- inc cx
- cmp cx, x2
- jl @ld
- jmp @exitl
- upd: ; то же самое, только dy > dx
- mov di, ax
- add di, di ; D
- xor si, si
- sub si, bx ; e
- mov cx, x1 ; x
- mov dx, y1 ; y
- push cx dx word ptr color
- call print_point
- dec dx
- @lld:
- add si, di
- cmp si, 0
- jl @ll1d
- sub si, bx
- sub si, bx
- inc cx
- @ll1d:
- push cx dx word ptr color
- call print_point
- dec dx
- cmp dx, y2
- jg @lld
- jmp @exitl
- @exitl:
- pop di si dx cx bx ax bp
- ret 10
- print_line endp
- print_point proc far
- ; x y color
- push bp
- mov bp, sp
- pusha
- push es
- xor ax, ax
- mov es, ax
- ; mov ax,video_page
- ; mov es,ax
- movzx eax, word ptr [bp + 8]
- mov ebx, 80
- mul ebx
- mov edi, eax
- movzx ebx, word ptr [bp + 10]
- mov ecx, ebx
- shr ebx, 3
- add edi, ebx
- and ecx, 111b
- xor ecx, 111b
- mov edx, 1
- shl edx, cl
- add edi, video_page
- mov cl, es:[edi];byte ptr es:[edi]
- or cl, dl
- mov es:[edi], cl;byte ptr es:[edi], cl
- ; mov ax, word ptr [bp + 6]
- ; mov byte ptr es:[edi], al
- pop es
- popa
- pop bp
- ret 6
- print_point endp
- print_point2 proc far
- ; x, y, color
- push bp
- mov bp, sp
- push ax bx cx dx
- mov cx, [bp + 10] ; left
- mov dx, [bp + 8] ; right
- color equ [bp + 6] ; color
- mov ah, 0ch
- mov al, color
- xor bx, bx ; видео страница
- int 10h
- pop dx cx bx ax bp
- ret 6
- print_point2 endp
- end main
Add Comment
Please, Sign In to add comment