Wacky_rubia

снежинка

Dec 21st, 2015
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.         .model small
  2.         locals
  3.         .stack 100h
  4.         .386
  5.  
  6. Mode_6 = 06h ; 640 X 200, 2 colors
  7. Mode_13 = 0Dh ; 320 X 200, 16 colors
  8. Mode_14 = 0Eh ; 640 X 200, 16 colors
  9. Mode_15 = 0Fh ; 640 X 350, 2 colors
  10. Mode_16 = 10h ; 640 X 350, 16 colors
  11. Mode_17 = 11h ; 640 X 480, 2 colors
  12. Mode_18 = 12h ; 640 X 480, 16 colors
  13. Mode_19 = 13h ; 320 X 200, 256 colors
  14. Mode_6A = 6Ah ; 800 X 600, 16 colors
  15.  
  16.         .data
  17. saveMode db ? ; Сохранить текущий видео режим
  18.  
  19.  
  20. temp dw ?
  21. half dd 0.5
  22. sqrt2div2 dd 0.707106781165
  23. video_page dd 0A000h
  24.  
  25. ; В 2 цветном режиме 1 = белый, в 16 цветном 1 = синий
  26.  
  27.         .code
  28.  
  29. main proc
  30.         mov ax,@data
  31.         mov ds,ax
  32.  
  33. ; Получить текущий видео режим
  34.  
  35.         mov ah,0Fh
  36.         int 10h
  37.         mov saveMode,al
  38.  
  39. ; ; Переключиться в графический режим
  40.  
  41.         mov ah,0 ; установка видео режима
  42.         mov al,Mode_17 ; номер режима
  43.         int 10h
  44.  
  45.         finit
  46.  
  47.         mov ax, 100
  48.         mov bx, 100
  49.         mov cx, 400
  50.         mov dx, 100
  51.  
  52.  
  53. fall:
  54.  
  55.         push ax
  56.         mov eax, video_page
  57.         xor eax, 19600h
  58.         mov video_page, eax
  59.         pop ax
  60.  
  61.         call cls
  62.  
  63.         inc bx
  64.         inc dx
  65.  
  66.         cmp bx, 480
  67.         jge end_fall
  68.  
  69.         push cx dx ax bx
  70.         call find_triangle_top
  71.         pop di si
  72. ; ;
  73.         push ax bx cx dx 4
  74.         call koch_curve
  75.  
  76.         push cx dx si di 4
  77.         call koch_curve
  78.  
  79.         push si di ax bx 4
  80.         call koch_curve
  81. ; 10011011000000000
  82. ; 01010000000000000
  83. ; 11001011000000000
  84.         push ax
  85.         mov ah, 05h
  86.         cmp video_page, 0A000h
  87.         je first
  88.         mov al, 0
  89.         jmp second
  90. first:
  91.         mov al, 1
  92. second:
  93.         int 10h
  94.         pop ax
  95.  
  96.         jmp fall
  97.  
  98. end_fall:
  99.  
  100. ;         ; Ожидаем нажатия клавиши
  101.  
  102.         ; mov ah,0
  103.         ; int 16h
  104.  
  105. ;         ; Возврат в прежний видео режим
  106.  
  107.         mov ah,0 ; установить видео режим
  108.         mov al,saveMode ; сохраненный видео режим
  109.         int 10h
  110.  
  111. ;         ; Выход из программы
  112.  
  113.         mov ax,4c00h
  114.         int 21h
  115.  
  116.  
  117. main endp
  118.  
  119. cls proc far
  120.         pusha
  121.         push es
  122.         xor ax, ax
  123.         mov es, ax
  124.  
  125.         mov edi, video_page
  126.         xor ax,ax
  127.         mov cx,32000d
  128. @@l:
  129.         mov es:[edi], ax
  130.         inc edi
  131.         inc edi
  132.         loop @@l
  133.  
  134.         pop es
  135.         popa
  136.         ret
  137. cls endp
  138.  
  139. koch_curve proc far
  140.         ; p1x, p1y, p2x, p2y, n
  141.         push bp
  142.         mov bp, sp
  143.         push ax bx cx dx di si
  144.  
  145.         cmp word ptr [bp + 6], 0
  146.         jg @@n_more_zero
  147.  
  148.         push word ptr [bp + 14]
  149.         push word ptr [bp + 12]
  150.         push word ptr [bp + 10]
  151.         push word ptr [bp + 8]
  152.         push 1
  153.         call print_line
  154.         jmp @@exit
  155.  
  156. @@n_more_zero:
  157.  
  158. ; dec n
  159.         mov si, [bp + 6]
  160.         dec si
  161.         mov [bp + 6], si
  162.  
  163. ;find top of triangle
  164.  
  165.         push word ptr [bp + 14]
  166.         push word ptr [bp + 12]
  167.         push word ptr [bp + 10]
  168.         push word ptr [bp + 8]
  169.         call trisection
  170.         pop dx cx bx ax
  171.  
  172.         push ax bx cx dx
  173.         call find_triangle_top
  174.         pop di si
  175.  
  176. ; recursion
  177.  
  178.         push word ptr [bp + 14] word ptr [bp + 12]
  179.         push ax bx
  180.         push word ptr [bp + 6]
  181.         call koch_curve
  182.  
  183.         push ax bx si di
  184.         push word ptr [bp + 6]
  185.         call koch_curve
  186.  
  187.         push si di cx dx
  188.         push word ptr [bp + 6]
  189.         call koch_curve
  190.  
  191.         push cx dx
  192.         push word ptr [bp + 10] word ptr [bp + 8]
  193.         push word ptr [bp + 6]
  194.         call koch_curve
  195.  
  196. @@exit:
  197.         pop si di dx cx bx ax bp
  198.         ret 10
  199. koch_curve endp
  200.  
  201. trisection proc far
  202.         ; p1x, p1y, p2x, p2y
  203.         push bp
  204.         mov bp, sp
  205.         push ax bx cx dx di si
  206.  
  207.         mov ax, [bp + 12] ; p1x
  208.         mov bx, [bp + 10] ; p1y
  209.         mov cx, [bp + 8] ; p2x
  210.         mov dx, [bp + 6] ; p2y
  211.  
  212. ; a.x a.y b.x b.y
  213.  
  214.         mov si, dx
  215.         shl si, 1
  216.         add si, bx
  217.         push si
  218.  
  219.         mov si, cx
  220.         shl si, 1
  221.         add si, ax
  222.         push si
  223.  
  224.         mov si, bx
  225.         shl si, 1
  226.         add si, dx
  227.         push si
  228.  
  229.         mov si, ax
  230.         shl si, 1
  231.         add si, cx
  232.         push si
  233.  
  234. ; div a.x a.y b.x b.y 3
  235.  
  236.         mov bx, 3
  237.  
  238.         xor dx, dx
  239.         pop ax
  240.         div bx
  241.         mov [bp + 12], ax
  242.  
  243.         xor dx, dx
  244.         pop ax
  245.         div bx
  246.         mov [bp + 10], ax
  247.  
  248.         xor dx, dx
  249.         pop ax
  250.         div bx
  251.         mov [bp + 8], ax
  252.  
  253.         xor dx, dx
  254.         pop ax
  255.         div bx
  256.         mov [bp + 6], ax
  257.  
  258.  
  259.         pop si di dx cx bx ax bp
  260.         ret
  261. trisection endp
  262.  
  263. find_triangle_top proc far
  264.         ; p1x, p1y, p2x, p2y
  265.  
  266.         push bp
  267.         mov bp, sp
  268.         push ax bx cx dx si di
  269.  
  270. ; vector m
  271.  
  272.         mov ax, [bp + 8]
  273.         sub ax, [bp + 12]
  274.         push ax
  275.  
  276.         mov ax, [bp + 6]
  277.         sub ax, [bp + 10]
  278.         push ax
  279.  
  280.         call rotate_on_60
  281.  
  282.         pop bx ax
  283.  
  284.         add ax, [bp + 12]
  285.         add bx, [bp + 10]
  286.  
  287.         mov [bp + 12], ax
  288.         mov [bp + 10], bx
  289.  
  290. @@exit:
  291.         pop di si dx cx bx ax bp
  292.         ret 4
  293.  
  294. find_triangle_top endp
  295.  
  296. rotate_on_60 proc far
  297.         ; ax, ay
  298.  
  299.         push bp
  300.         mov bp, sp
  301.         push ax bx cx dx si di
  302.  
  303.         fild word ptr [bp + 8]
  304.         fld half
  305.         fmulp
  306.  
  307.         fld sqrt2div2
  308.         fild word ptr [bp + 6]
  309.         fmulp
  310.  
  311.         faddp
  312.  
  313.         fild word ptr [bp + 6]
  314.         fld half
  315.         fmulp
  316.  
  317.         fild word ptr [bp + 8]
  318.         fld sqrt2div2
  319.         fmulp
  320.  
  321.         fsubp
  322.  
  323.         frndint
  324.         fistp word ptr [bp + 6]
  325.  
  326.         frndint
  327.         fistp word ptr [bp + 8]
  328.  
  329. @@exit:
  330.         pop di si dx cx bx ax bp
  331.         ret
  332.  
  333. rotate_on_60 endp
  334.  
  335.  
  336. print_line proc far
  337.         ; x1, x2, y1, y2, color
  338.  
  339.         push bp
  340.         mov bp, sp
  341.         push ax bx cx dx si di
  342.  
  343.         mov ax, [bp + 14]
  344.         mov bx, [bp + 10]
  345.         cmp ax, bx
  346.         jl @g
  347.  
  348.         mov [bp + 14], bx
  349.         mov [bp + 10], ax
  350.         mov ax, [bp + 12]
  351.         mov bx, [bp + 8]
  352.         mov [bp + 12], bx
  353.         mov [bp + 8], ax
  354.  
  355. @g:
  356.         x1 equ [bp + 14]
  357.         y1 equ [bp + 12]
  358.         x2 equ [bp + 10]
  359.         y2 equ [bp + 8]
  360.         color equ [bp + 6]
  361.  
  362.         mov ax, x2
  363.         mov bx, x1
  364.         sub ax, bx ; ax - delta x
  365.  
  366.         mov bx, y2
  367.         mov cx, y1
  368.         sub bx, cx ; bx - delta y
  369.  
  370.         cmp bx, 0
  371.         jl ydown
  372.  
  373.         cmp ax, bx
  374.         jl up
  375.  
  376.         mov di, bx
  377.         add di, di ; D
  378.         xor si, si
  379.         sub si, ax ; e
  380.  
  381.         mov cx, x1 ; x
  382.         mov dx, y1 ; y
  383.         push cx dx word ptr color
  384.         call print_point
  385.         inc cx
  386. @l:
  387.         add si, di
  388.         cmp si, 0
  389.         jl @l1
  390.         sub si, ax
  391.         sub si, ax
  392.         inc dx
  393.  
  394. @l1:
  395.         push cx dx word ptr color
  396.         call print_point
  397.         inc cx
  398.         cmp cx, x2
  399.         jl @l
  400.  
  401.         jmp @exitl
  402. up: ; то же самое, только dy > dx
  403.         mov di, ax
  404.         add di, di ; D
  405.         xor si, si
  406.         sub si, bx ; e
  407.  
  408.         mov cx, x1 ; x
  409.         mov dx, y1 ; y
  410.         push cx dx word ptr color
  411.         call print_point
  412.         inc cx
  413. @ll:
  414.         add si, di
  415.         cmp si, 0
  416.         jl @ll1
  417.         sub si, bx
  418.         sub si, bx
  419.         inc cx
  420.  
  421. @ll1:
  422.         push cx dx word ptr color
  423.         call print_point
  424.         inc dx
  425.         cmp dx, y2
  426.         jl @ll
  427.         jmp @exitl
  428.  
  429. ydown:
  430.         neg bx
  431.         cmp ax, bx
  432.         jl upd
  433.  
  434.         mov di, bx
  435.         add di, di ; D
  436.         xor si, si
  437.         sub si, ax ; e
  438.  
  439.         mov cx, x1 ; x
  440.         mov dx, y1 ; y
  441.         push cx dx word ptr color
  442.         call print_point
  443.         inc cx
  444. @ld:
  445.         add si, di
  446.         cmp si, 0
  447.         jl @l1d
  448.         sub si, ax
  449.         sub si, ax
  450.         dec dx
  451.  
  452. @l1d:
  453.         push cx dx word ptr color
  454.         call print_point
  455.         inc cx
  456.         cmp cx, x2
  457.         jl @ld
  458.  
  459.         jmp @exitl
  460. upd: ; то же самое, только dy > dx
  461.         mov di, ax
  462.         add di, di ; D
  463.         xor si, si
  464.         sub si, bx ; e
  465.  
  466.         mov cx, x1 ; x
  467.         mov dx, y1 ; y
  468.         push cx dx word ptr color
  469.         call print_point
  470.         dec dx
  471. @lld:
  472.         add si, di
  473.         cmp si, 0
  474.         jl @ll1d
  475.         sub si, bx
  476.         sub si, bx
  477.         inc cx
  478.  
  479. @ll1d:
  480.         push cx dx word ptr color
  481.         call print_point
  482.         dec dx
  483.         cmp dx, y2
  484.         jg @lld
  485.         jmp @exitl
  486.  
  487.  
  488. @exitl:
  489.         pop di si dx cx bx ax bp
  490.         ret 10
  491.  
  492. print_line endp
  493.  
  494. print_point proc far
  495.         ; x y color
  496.         push bp
  497.         mov bp, sp
  498.         pusha
  499.         push es
  500.         xor ax, ax
  501.         mov es, ax
  502.  
  503.         ; mov ax,video_page
  504.         ; mov es,ax
  505.  
  506.         movzx eax, word ptr [bp + 8]
  507.         mov ebx, 80
  508.         mul ebx
  509.         mov edi, eax
  510.  
  511.         movzx ebx, word ptr [bp + 10]
  512.         mov ecx, ebx
  513.         shr ebx, 3
  514.         add edi, ebx
  515.  
  516.         and ecx, 111b
  517.         xor ecx, 111b
  518.         mov edx, 1
  519.         shl edx, cl
  520.  
  521.         add edi, video_page
  522.  
  523.         mov cl, es:[edi];byte ptr es:[edi]
  524.         or cl, dl
  525.         mov es:[edi], cl;byte ptr es:[edi], cl
  526.  
  527.         ; mov ax, word ptr [bp + 6]
  528.         ; mov byte ptr es:[edi], al
  529.  
  530.         pop es
  531.         popa
  532.         pop bp
  533.         ret 6
  534. print_point endp
  535.  
  536. print_point2 proc far
  537.         ; x, y, color
  538.         push bp
  539.         mov bp, sp
  540.         push ax bx cx dx
  541.  
  542.         mov cx, [bp + 10] ; left
  543.         mov dx, [bp + 8] ; right
  544.         color equ [bp + 6] ; color
  545.  
  546.         mov ah, 0ch
  547.         mov al, color
  548.         xor bx, bx ; видео страница
  549.         int 10h
  550.  
  551.         pop dx cx bx ax bp
  552.         ret 6
  553.  
  554. print_point2 endp
  555.  
  556. end main
Advertisement
Add Comment
Please, Sign In to add comment