Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .386
- .model flat, stdcall
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;includem biblioteci, si declaram ce functii vrem sa importam
- includelib msvcrt.lib
- extern exit: proc
- extern malloc: proc
- extern memset: proc
- includelib canvas.lib
- extern BeginDrawing: proc
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;declaram simbolul start ca public - de acolo incepe executia
- public start
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;sectiunile programului, date, respectiv cod
- .data
- ;aici declaram date
- window_title DB "Ken Ken",0
- area_width EQU 800
- area_height EQU 500
- area DD 0
- verif_inafara DD 0;variabila pentru verificare click in matrice
- counter DD 0 ; numara evenimentele de tip timer
- ;;;;;;;;;;;;;;;;;;;;;
- X0 DD 100 ;coordonatele punctului din stanga tablei de unde incepe sa fie desenata
- Y0 DD 100 ;;; -
- X_0_width EQU 40 ;dimensiune patrat din tabel
- X_0_height EQU 39 ;
- X_matrix DD 0
- Y_matrix DD 0
- ;;;;;;;;;;;;;;;;;;;;;
- arg1 EQU 8
- arg2 EQU 12
- arg3 EQU 16
- arg4 EQU 20
- symbol_width EQU 10
- symbol_height EQU 20
- include digits.inc
- include letters.inc
- .code
- ; procedura make_text afiseaza o litera sau o cifra la coordonatele date
- ; arg1 - simbolul de afisat (litera sau cifra)
- ; arg2 - pointer la vectorul de pixeli
- ; arg3 - pos_x
- ; arg4 - pos_y
- make_text proc
- push ebp
- mov ebp, esp
- pusha
- mov eax, [ebp+arg1] ; citim simbolul de afisat
- cmp eax, 'A'
- jl make_digit
- cmp eax, 'Z'
- jg make_digit
- sub eax, 'A'
- lea esi, letters
- jmp draw_text
- make_digit:
- cmp eax, '0'
- jl make_space
- cmp eax, '9'
- jg make_space
- sub eax, '0'
- lea esi, digits
- jmp draw_text
- make_space:
- mov eax, 26 ; de la 0 pana la 25 sunt litere, 26 e space
- lea esi, letters
- draw_text:
- mov ebx, symbol_width
- mul ebx
- mov ebx, symbol_height
- mul ebx
- add esi, eax
- mov ecx, symbol_height
- bucla_simbol_linii:
- mov edi, [ebp+arg2] ; pointer la matricea de pixeli
- mov eax, [ebp+arg4] ; pointer la coord y
- add eax, symbol_height
- sub eax, ecx
- mov ebx, area_width
- mul ebx
- add eax, [ebp+arg3] ; pointer la coord x
- shl eax, 2 ; inmultim cu 4, avem un DWORD per pixel
- add edi, eax
- push ecx
- mov ecx, symbol_width
- bucla_simbol_coloane:
- cmp byte ptr [esi], 0
- je simbol_pixel_alb
- mov dword ptr [edi], 0
- jmp simbol_pixel_next
- simbol_pixel_alb:
- mov dword ptr [edi], 0FFFFFFh
- simbol_pixel_next:
- inc esi
- add edi, 4
- loop bucla_simbol_coloane
- pop ecx
- loop bucla_simbol_linii
- popa
- mov esp, ebp
- pop ebp
- ret
- make_text endp;;;;;;;;;;;;;;;;;pana aici e ok
- ; un macro ca sa apelam mai usor desenarea simbolului
- make_text_macro macro symbol, drawArea, x, y
- push y
- push x
- push drawArea
- push symbol
- call make_text
- add esp, 16
- endm;;;;;;;;;;;;;;;;;;pana aici e ok
- desenare_linie_verticala macro x,y
- LOCAL construire,sfarsit
- pusha
- mov EAX,y
- mov EDX,area_width
- mul EDX
- add EAX,x
- shl EAX,2
- mov ECX,0
- construire:
- add eax,area_width*4
- mov ebx,[area]
- mov dword ptr[ebx+eax],00008Bh
- add ECX,1
- cmp ecx,360
- je sfarsit
- jmp construire
- sfarsit:
- popa
- ENDM
- desenare_linie_verticala_tastatura macro x,y
- LOCAL construire,sfarsit
- pusha
- mov EAX,y
- mov EDX,area_width
- mul EDX
- add EAX,x
- shl EAX,2
- mov ECX,0
- construire:
- add eax,area_width*4
- mov ebx,[area]
- mov dword ptr[ebx+eax],00008Bh
- add ECX,1
- cmp ecx,120
- je sfarsit
- jmp construire
- sfarsit:
- popa
- ENDM
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- desenare_linie_orizontala macro x,y
- LOCAL construire,sfarsit
- pusha
- mov EAX,y
- mov EDX,area_width
- mul EDX
- add EAX,x
- shl EAX,2
- mov ECX,0
- construire:
- mov ebx,[area]
- add eax,4
- mov dword ptr[ebx+eax],0000FFh
- add ECX,1
- cmp ecx,360
- je sfarsit
- jmp construire
- sfarsit:
- popa
- endm
- desenare_linie_orizontala_tastatura macro x,y
- LOCAL construire,sfarsit
- pusha
- mov EAX,y
- mov EDX,area_width
- mul EDX
- add EAX,x
- shl EAX,2
- mov ECX,0
- construire:
- mov ebx,[area]
- add eax,4
- mov dword ptr[ebx+eax],0000FFh
- add ECX,1
- cmp ecx,120
- je sfarsit
- jmp construire
- sfarsit:
- popa
- ENDM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- verificare_matrice proc
- push ebp
- mov ebp,esp
- mov edx,[ebp + arg3];
- mov ebx,[ebp + arg2];
- mov edi,edx
- cmp ebx,X0
- jl nuepetabla
- mov eax,9
- mov esi,X_0_width
- mul esi
- add eax,X0
- cmp eax,ebx
- jge nuepetabla
- ;Y
- mov edx,edi
- cmp edx,Y0
- jl nuepetabla
- mov eax,9
- mov ecx,X_0_width
- mul ecx
- add eax,Y0
- mov edx,edi
- cmp eax,edx
- jge nuepetabla
- mov edx, 1
- mov verif_inafara, 1
- jmp gata
- nuepetabla:
- make_text_macro '1',area,30,30
- mov edx, 0
- mov verif_inafara, 0 ;; verif_inafara=0 ; nu ne aflam pe tabla de joc
- gata:
- make_text_macro '3',area,50,50
- mov esp,ebp
- pop ebp
- ret
- verificare_matrice endp
- ; functia de desenare - se apeleaza la fiecare click
- ; sau la fiecare interval de 200ms in care nu s-a dat click
- ; arg1 - evt (0 - initializare, 1 - click, 2 - s-a scurs intervalul fara click)
- ; arg2 - y
- ; arg3 - x
- draw proc
- push ebp
- mov ebp, esp
- pusha
- mov eax, [ebp+arg1]
- cmp eax, 1
- jz evt_click
- cmp eax, 2
- jz evt_timer ; nu s-a efectuat click pe nimic
- ;mai jos e codul care intializeaza fereastra cu pixeli albi
- mov eax, area_width
- mov ebx, area_height
- mul ebx
- shl eax, 2
- push eax
- push 255; culoarea alba
- push area
- call memset
- add esp, 12
- ; Desenam matricea
- desenare_linie_orizontala 100,100
- desenare_linie_orizontala 100,140
- desenare_linie_orizontala 100,180
- desenare_linie_orizontala 100,220
- desenare_linie_orizontala 100,260
- desenare_linie_orizontala 100,300
- desenare_linie_orizontala 100,340
- desenare_linie_orizontala 100,380
- desenare_linie_orizontala 100,420
- desenare_linie_orizontala 100,460
- desenare_linie_verticala 100,100
- desenare_linie_verticala 140,100
- desenare_linie_verticala 180,100
- desenare_linie_verticala 220,100
- desenare_linie_verticala 260,100
- desenare_linie_verticala 300,100
- desenare_linie_verticala 340,100
- desenare_linie_verticala 380,100
- desenare_linie_verticala 420,100
- desenare_linie_verticala 460,100
- ;Desenare tastatura
- desenare_linie_orizontala_tastatura 560,200
- desenare_linie_orizontala_tastatura 560,240
- desenare_linie_orizontala_tastatura 560,280
- desenare_linie_orizontala_tastatura 560,320
- desenare_linie_verticala_tastatura 560,200
- desenare_linie_verticala_tastatura 600,200
- desenare_linie_verticala_tastatura 640,200
- desenare_linie_verticala_tastatura 680,200
- jmp afisare_litere
- evt_click:
- mov edi, area
- mov ebx,[ebp+arg3];x eax=x
- mov edx,[ebp+arg2];y ecx=y
- call verificare_matrice
- ;mov edx,0
- ;mov esi,area_width
- ;mul esi
- ;shl eax,2; inmultim cu 4 pentru a sarii
- ;;add eax,edi
- ;linie_o:
- ;mov dword ptr [eax+ecx*4],0FF00FFh;aici ne va pune linia orizontala
- ;loop linie_o
- ;mov edi,area
- ;mov ecx,[ebp+arg3];x
- ;mov eax,[ebp+arg2];y` `
- ;shl eax,2
- ;add eax,area;pointer spre matrice
- ;mov edi,area_width;lungimea liniei
- ;shl edi,2
- ;
- ;linie_v:
- ;mov dword ptr[eax],0FF00FFh
- ;add eax,edi
- ;loop linie_v
- evt_timer:
- inc counter
- afisare_litere:
- ;afisam valoarea counter-ului curent (sute, zeci si unitati)
- mov ebx, 10
- mov eax, counter
- ;cifra unitatilor
- mov edx, 0
- div ebx
- add edx, '0'
- make_text_macro edx, area, 30, 10
- ;cifra zecilor
- mov edx, 0
- div ebx
- add edx, '0'
- make_text_macro edx, area, 20, 10
- ;cifra sutelor
- mov edx, 0
- div ebx
- add edx, '0'
- make_text_macro edx, area, 10, 10
- ;scriem un mesaj
- afisare_text:
- make_text_macro 'K', area, 240, 60
- make_text_macro 'E', area, 250, 60
- make_text_macro 'N', area, 260, 60
- make_text_macro 'K', area, 280, 60
- make_text_macro 'E', area, 290, 60
- make_text_macro 'N', area, 300, 60
- ;Scriem tastatura
- make_text_macro '1', area, 575, 210
- make_text_macro '2', area, 615, 210
- make_text_macro '3', area, 655, 210
- make_text_macro '4', area, 575, 250
- make_text_macro '5', area, 615, 250
- make_text_macro '6', area, 655, 250
- make_text_macro '7', area, 575, 290
- make_text_macro '8', area, 615, 290
- make_text_macro '9', area, 655, 290
- final_draw:
- popa
- mov esp, ebp
- pop ebp
- ret
- draw endp
- start:
- ;alocam memorie pentru zona de desenat
- mov eax, area_width
- mov ebx, area_height
- mul ebx
- shl eax, 2
- push eax
- call malloc
- add esp, 4
- mov area, eax
- ;apelam functia de desenare a ferestrei
- ; typedef void (*DrawFunc)(int evt, int x, int y);
- ; void __cdecl BeginDrawing(const char *title, int width, int height, unsigned int *area, DrawFunc draw);
- push offset draw
- push area
- push area_height
- push area_width
- push offset window_title
- call BeginDrawing
- add esp, 20
- ;terminarea programului
- push 0
- call exit
- end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement