Wacky_rubia

tetris

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