Advertisement
Guest User

Untitled

a guest
May 22nd, 2018
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .386
  2. .model flat, stdcall
  3. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  4.  
  5. ;includem biblioteci, si declaram ce functii vrem sa importam
  6. includelib msvcrt.lib
  7. extern exit: proc
  8. extern malloc: proc
  9. extern memset: proc
  10.  
  11. includelib canvas.lib
  12. extern BeginDrawing: proc
  13. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  14.  
  15. ;declaram simbolul start ca public - de acolo incepe executia
  16. public start
  17. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  18.  
  19. ;sectiunile programului, date, respectiv cod
  20. .data
  21. ;aici declaram date
  22. window_title DB "Exemplu proiect desenare",0
  23. area_width EQU 1200
  24. area_height EQU 700
  25.  
  26. selectie_width EQU 80
  27. selectie_height EQU 60
  28. area DD 0
  29. deltay DD 0
  30. deltax DD 0
  31. deltaerr DD 0.0
  32. errorr DD 0.0
  33. unu dd 1.0
  34. zerocinci dd 0.5
  35. click DD 0
  36. semn DD 0
  37. x DD 0
  38. y DD 0
  39. forma DD 0
  40.  
  41. counter DD 0 ; numara evenimentele de tip timer
  42.  
  43. arg1 EQU 8
  44. arg2 EQU 12
  45. arg3 EQU 16
  46. arg4 EQU 20
  47.  
  48. symbol_width EQU 10
  49. symbol_height EQU 20
  50. include digits.inc
  51. include letters.inc
  52. include linie.inc
  53. include patrat.inc
  54. include cerc.inc
  55. .code
  56. ; procedura make_text afiseaza o litera sau o cifra la coordonatele date
  57. ; arg1 - simbolul de afisat (litera sau cifra)
  58. ; arg2 - pointer la vectorul de pixeli
  59. ; arg3 - pos_x
  60. ; arg4 - pos_y
  61. make_text proc
  62.     push ebp
  63.     mov ebp, esp
  64.     pusha
  65.    
  66.     mov eax, [ebp+arg1] ; citim simbolul de afisat
  67.     cmp eax, 'A'
  68.     jl make_digit
  69.     cmp eax, 'Z'
  70.     jg make_digit
  71.     sub eax, 'A'
  72.     lea esi, letters
  73.     jmp draw_text
  74. make_digit:
  75.     cmp eax, '0'
  76.     jl make_space
  77.     cmp eax, '9'
  78.     jg make_space
  79.     sub eax, '0'
  80.     lea esi, digits
  81.     jmp draw_text
  82. make_space:
  83.     mov eax, 26 ; de la 0 pana la 25 sunt litere, 26 e space
  84.     lea esi, letters
  85.    
  86. draw_text:
  87.     mov ebx, symbol_width
  88.     mul ebx
  89.     mov ebx, symbol_height
  90.     mul ebx
  91.     add esi, eax
  92.     mov ecx, symbol_height
  93. bucla_simbol_linii:
  94.     mov edi, [ebp+arg2] ; pointer la matricea de pixeli
  95.     mov eax, [ebp+arg4] ; pointer la coord y
  96.     add eax, symbol_height
  97.     sub eax, ecx
  98.     mov ebx, area_width
  99.     mul ebx
  100.     add eax, [ebp+arg3] ; pointer la coord x
  101.     shl eax, 2 ; inmultim cu 4, avem un DWORD per pixel
  102.     add edi, eax
  103.     push ecx
  104.     mov ecx, symbol_width
  105. bucla_simbol_coloane:
  106.     cmp byte ptr [esi], 0
  107.     je simbol_pixel_alb
  108.     mov dword ptr [edi], 0
  109.     jmp simbol_pixel_next
  110. simbol_pixel_alb:
  111.     mov dword ptr [edi], 0FFFFFFh
  112. simbol_pixel_next:
  113.     inc esi
  114.     add edi, 4
  115.     loop bucla_simbol_coloane
  116.     pop ecx
  117.     loop bucla_simbol_linii
  118.     popa
  119.     mov esp, ebp
  120.     pop ebp
  121.     ret
  122. make_text endp
  123.  
  124. ; un macro ca sa apelam mai usor desenarea simbolului
  125. make_text_macro macro symbol, drawArea, x, y
  126.     push y
  127.     push x
  128.     push drawArea
  129.     push symbol
  130.     call make_text
  131.     add esp, 16
  132. endm
  133.  
  134. make_selectie proc
  135.     push ebp
  136.     mov ebp, esp
  137.     pusha
  138.    
  139.     mov eax, [ebp+arg1] ; citim simbolul de afisat
  140.     cmp eax, 'L'
  141.     je linie_S
  142.     cmp eax, 'P'
  143.     je patrat_S
  144.     cmp eax, 'C'
  145.     je cerc_S
  146. linie_S:
  147.     mov eax,0
  148.     lea esi, linie
  149.     jmp draw_selectie
  150. patrat_S:
  151.     mov eax,0
  152.     lea esi, patrat
  153.     jmp draw_selectie
  154.    
  155. cerc_S:
  156.     mov eax,0
  157.     lea esi, cerc
  158.     jmp draw_selectie
  159.    
  160.    
  161. draw_selectie:
  162.     mov ebx, selectie_width
  163.     mul ebx
  164.     mov ebx, selectie_height
  165.     mul ebx
  166.     add esi, eax
  167.     mov ecx, selectie_height
  168. bucla_selectie_linii:
  169.     mov edi, [ebp+arg2] ; pointer la matricea de pixeli
  170.     mov eax, [ebp+arg4] ; pointer la coord y
  171.     add eax, selectie_height
  172.     sub eax, ecx
  173.     mov ebx, area_width
  174.     mul ebx
  175.     add eax, [ebp+arg3] ; pointer la coord x
  176.     shl eax, 2 ; inmultim cu 4, avem un DWORD per pixel
  177.     add edi, eax
  178.     push ecx
  179.     mov ecx, selectie_width
  180. bucla_selectie_coloane:
  181.     cmp byte ptr [esi], 0
  182.     je selectie_pixel_alb
  183.     mov dword ptr [edi], 0
  184.     jmp selectie_pixel_next
  185. selectie_pixel_alb:
  186.     ;mov dword ptr [edi], 0FFFFFFh
  187. selectie_pixel_next:
  188.     add esi, 4
  189.     add edi, 4
  190.     loop bucla_selectie_coloane
  191.     pop ecx
  192.     loop bucla_selectie_linii
  193.     popa
  194.     mov esp, ebp
  195.     pop ebp
  196.     ret
  197. make_selectie endp
  198.  
  199. ; un macro ca sa apelam mai usor desenarea simbolului
  200. make_selectie_macro macro symbol, drawArea, x, y
  201.     push y
  202.     push x
  203.     push drawArea
  204.     push symbol
  205.     call make_selectie
  206.     add esp, 16
  207. endm
  208. ; functia de desenare - se apeleaza la fiecare click
  209. ; sau la fiecare interval de 200ms in care nu s-a dat click
  210. ; arg1 - evt (0 - initializare, 1 - click, 2 - s-a scurs intervalul fara click)
  211. ; arg2 - x coloana
  212. ; arg3 - y linia
  213. draw proc
  214.     push ebp
  215.     mov ebp, esp
  216.     pusha
  217.    
  218.     mov eax, [ebp+arg1]
  219.     cmp eax, 1
  220.     jz evt_click
  221.     cmp eax, 2
  222.     jz evt_timer ; nu s-a efectuat click pe nimic
  223.     ;mai jos e codul care intializeaza fereastra cu pixeli albi
  224.     mov eax, area_width
  225.     mov ebx, area_height
  226.     mul ebx
  227.     shl eax, 2
  228.     push eax
  229.     push 255
  230.     push area
  231.     call memset
  232.     add esp, 12
  233.     mov [click],0
  234.     mov [forma],0
  235.     make_selectie_macro 'L',area,0,0
  236.     make_selectie_macro 'P',area,80,0
  237.     make_selectie_macro 'C',area,160,0
  238.     jmp final_draw
  239.    
  240.    
  241.    
  242. evt_click:
  243.     push ecx
  244.         mov eax, [ebp+arg3]
  245.         mov ecx, area_width
  246.         mul ecx
  247.         add eax, [ebp+arg2]
  248.         shl eax,2
  249.         mov ecx, area
  250.         add ecx, eax
  251.         mov dword ptr [ecx],1h
  252.         pop ecx
  253.     mov eax, [ebp+arg3]  ;y linie
  254.     cmp eax,selectie_height
  255.     jg next
  256.     mov ebx,[ebp+arg2] ;x
  257.     cmp ebx,80
  258.     jg next_p
  259.     mov [forma],1 ;forma linie
  260.     jmp final_draw
  261. next_p:
  262.     cmp ebx,160
  263.     jg next_c
  264.     mov [forma],2 ;forma patrat
  265.     jmp final_draw
  266. next_c:
  267.     cmp ebx,240
  268.     jg next
  269.     mov [forma],3 ;forma cerc
  270.     jmp final_draw
  271. next:
  272.     cmp forma,1
  273.     je draw_linie
  274.     cmp forma,2
  275.     je draw_patrat
  276.     cmp forma,3
  277.     je draw_cerc
  278.     ;cmp forma,0
  279.     jmp final_draw
  280.    
  281. draw_linie:
  282.     cmp click,0
  283.     je click1
  284.        
  285. make_text_macro '0',area,10,10
  286.         mov [click],0
  287.         ;Bresenham
  288.         mov eax, x
  289.         sub eax,[ebp+arg2] ;deltax
  290.         mov [deltax],eax
  291.         mov ebx, y
  292.         sub ebx,[ebp+arg3] ;deltay
  293.         mov [deltay],ebx
  294.         mov eax, y
  295.         cmp eax,[ebp+arg3]
  296.         jg semn1
  297.         mov [semn],0
  298.        
  299.         jmp semn2
  300.     semn1:
  301.         mov [semn],0
  302.     semn2:
  303.         finit
  304.         fld deltax
  305.         fld deltay
  306.         fdiv
  307.         fabs
  308.         fist [deltaerr]  ;deltaerr
  309.         mov [errorr],0
  310.         finit
  311.         fld deltax
  312.         fabs
  313.         fist [deltax]
  314.         mov ecx,deltax
  315.         mov eax, y
  316.         mov edx,0
  317.         loop1:
  318.             push eax
  319.             push ecx
  320.             ;mov edx,eax
  321.             mov ecx, area_width
  322.             mov edx,0
  323.             mul ecx
  324.             pop ecx
  325.             mov edx,ecx
  326.             add edx,x
  327.             add eax,edx
  328.             shl eax,2
  329.             mov edx,area
  330.             add edx, eax
  331.             mov dword ptr[edx],0h
  332.             pop eax
  333.             mov ebx,errorr
  334.             add ebx,deltaerr
  335.             mov [errorr],ebx
  336.             begin:
  337.                 cmp semn,1
  338.                 je semn0
  339.                 add [y],1
  340.                 jmp semn3
  341.             semn0:
  342.                 sub [y],1
  343.             semn3:
  344.                 finit
  345.                 fld errorr
  346.                 fsub unu
  347.                 fist [errorr]
  348.                 mov ebx,errorr
  349.                 cmp ebx,zerocinci
  350.                 jg begin
  351.             loop loop1
  352.         mov [click],0
  353.         jmp final_draw
  354.     click1:
  355.         mov [click],1
  356.         push ecx
  357.         mov ecx,[ebp+arg2]
  358.         mov [x],ecx
  359.         mov ecx,[ebp+arg3]
  360.         mov [y],ecx
  361.         pop ecx
  362.     jmp final_draw
  363. draw_patrat:
  364.  
  365.     jmp final_draw
  366. draw_cerc:
  367.  
  368.     jmp final_draw
  369. evt_timer:
  370.    
  371.    
  372.    
  373.  
  374. final_draw:
  375.     popa
  376.     mov esp, ebp
  377.     pop ebp
  378.     ret
  379. draw endp
  380.  
  381. start:
  382.     ;alocam memorie pentru zona de desenat
  383.     mov eax, area_width
  384.     mov ebx, area_height
  385.     mul ebx
  386.     shl eax, 2
  387.     push eax
  388.     call malloc
  389.     add esp, 4
  390.     mov area, eax
  391.     ;apelam functia de desenare a ferestrei
  392.     ; typedef void (*DrawFunc)(int evt, int x, int y);
  393.     ; void __cdecl BeginDrawing(const char *title, int width, int height, unsigned int *area, DrawFunc draw);
  394.     push offset draw
  395.     push area
  396.     push area_height
  397.     push area_width
  398.     push offset window_title
  399.     call BeginDrawing
  400.     add esp, 20
  401.    
  402.     ;terminarea programului
  403.     push 0
  404.     call exit
  405. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement