Advertisement
Guest User

Untitled

a guest
May 21st, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.79 KB | None | 0 0
  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 "Ken Ken",0
  23. area_width EQU 800
  24. area_height EQU 500
  25. area DD 0
  26. verif_inafara DD 0;variabila pentru verificare click in matrice
  27.  
  28. counter DD 0 ; numara evenimentele de tip timer
  29. ;;;;;;;;;;;;;;;;;;;;;
  30. X0 DD 100 ;coordonatele punctului din stanga tablei de unde incepe sa fie desenata
  31. Y0 DD 100 ;;; -
  32.  
  33.  
  34. X_0_width EQU 40 ;dimensiune patrat din tabel
  35. X_0_height EQU 39 ;
  36. X_matrix DD 0
  37. Y_matrix DD 0
  38. ;;;;;;;;;;;;;;;;;;;;;
  39.  
  40. arg1 EQU 8
  41. arg2 EQU 12
  42. arg3 EQU 16
  43. arg4 EQU 20
  44.  
  45. symbol_width EQU 10
  46. symbol_height EQU 20
  47. include digits.inc
  48. include letters.inc
  49.  
  50. .code
  51. ; procedura make_text afiseaza o litera sau o cifra la coordonatele date
  52. ; arg1 - simbolul de afisat (litera sau cifra)
  53. ; arg2 - pointer la vectorul de pixeli
  54. ; arg3 - pos_x
  55. ; arg4 - pos_y
  56. make_text proc
  57. push ebp
  58. mov ebp, esp
  59. pusha
  60.  
  61. mov eax, [ebp+arg1] ; citim simbolul de afisat
  62. cmp eax, 'A'
  63. jl make_digit
  64. cmp eax, 'Z'
  65. jg make_digit
  66. sub eax, 'A'
  67. lea esi, letters
  68. jmp draw_text
  69. make_digit:
  70. cmp eax, '0'
  71. jl make_space
  72. cmp eax, '9'
  73. jg make_space
  74. sub eax, '0'
  75. lea esi, digits
  76. jmp draw_text
  77. make_space:
  78. mov eax, 26 ; de la 0 pana la 25 sunt litere, 26 e space
  79. lea esi, letters
  80.  
  81. draw_text:
  82. mov ebx, symbol_width
  83. mul ebx
  84. mov ebx, symbol_height
  85. mul ebx
  86. add esi, eax
  87. mov ecx, symbol_height
  88. bucla_simbol_linii:
  89. mov edi, [ebp+arg2] ; pointer la matricea de pixeli
  90. mov eax, [ebp+arg4] ; pointer la coord y
  91. add eax, symbol_height
  92. sub eax, ecx
  93. mov ebx, area_width
  94. mul ebx
  95. add eax, [ebp+arg3] ; pointer la coord x
  96. shl eax, 2 ; inmultim cu 4, avem un DWORD per pixel
  97. add edi, eax
  98. push ecx
  99. mov ecx, symbol_width
  100. bucla_simbol_coloane:
  101. cmp byte ptr [esi], 0
  102. je simbol_pixel_alb
  103. mov dword ptr [edi], 0
  104. jmp simbol_pixel_next
  105. simbol_pixel_alb:
  106. mov dword ptr [edi], 0FFFFFFh
  107. simbol_pixel_next:
  108. inc esi
  109. add edi, 4
  110. loop bucla_simbol_coloane
  111. pop ecx
  112. loop bucla_simbol_linii
  113. popa
  114. mov esp, ebp
  115. pop ebp
  116. ret
  117. make_text endp;;;;;;;;;;;;;;;;;pana aici e ok
  118.  
  119. ; un macro ca sa apelam mai usor desenarea simbolului
  120. make_text_macro macro symbol, drawArea, x, y
  121. push y
  122. push x
  123. push drawArea
  124. push symbol
  125. call make_text
  126. add esp, 16
  127. endm;;;;;;;;;;;;;;;;;;pana aici e ok
  128.  
  129.  
  130. desenare_linie_verticala macro x,y
  131.  
  132. LOCAL construire,sfarsit
  133.  
  134. pusha
  135. mov EAX,y
  136. mov EDX,area_width
  137. mul EDX
  138. add EAX,x
  139. shl EAX,2
  140. mov ECX,0
  141. construire:
  142. add eax,area_width*4
  143. mov ebx,[area]
  144. mov dword ptr[ebx+eax],00008Bh
  145. add ECX,1
  146. cmp ecx,360
  147. je sfarsit
  148. jmp construire
  149. sfarsit:
  150. popa
  151.  
  152. ENDM
  153. desenare_linie_verticala_tastatura macro x,y
  154.  
  155. LOCAL construire,sfarsit
  156.  
  157. pusha
  158. mov EAX,y
  159. mov EDX,area_width
  160. mul EDX
  161. add EAX,x
  162. shl EAX,2
  163. mov ECX,0
  164. construire:
  165. add eax,area_width*4
  166. mov ebx,[area]
  167. mov dword ptr[ebx+eax],00008Bh
  168. add ECX,1
  169. cmp ecx,120
  170. je sfarsit
  171. jmp construire
  172. sfarsit:
  173. popa
  174.  
  175. ENDM
  176. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  177. desenare_linie_orizontala macro x,y
  178.  
  179. LOCAL construire,sfarsit
  180.  
  181. pusha
  182. mov EAX,y
  183. mov EDX,area_width
  184. mul EDX
  185. add EAX,x
  186. shl EAX,2
  187. mov ECX,0
  188. construire:
  189.  
  190. mov ebx,[area]
  191. add eax,4
  192. mov dword ptr[ebx+eax],0000FFh
  193. add ECX,1
  194. cmp ecx,360
  195. je sfarsit
  196. jmp construire
  197. sfarsit:
  198. popa
  199. endm
  200. desenare_linie_orizontala_tastatura macro x,y
  201.  
  202. LOCAL construire,sfarsit
  203.  
  204. pusha
  205. mov EAX,y
  206. mov EDX,area_width
  207. mul EDX
  208. add EAX,x
  209. shl EAX,2
  210. mov ECX,0
  211. construire:
  212.  
  213. mov ebx,[area]
  214. add eax,4
  215. mov dword ptr[ebx+eax],0000FFh
  216. add ECX,1
  217. cmp ecx,120
  218. je sfarsit
  219. jmp construire
  220. sfarsit:
  221. popa
  222.  
  223. ENDM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  224. verificare_matrice proc
  225. push ebp
  226. mov ebp,esp
  227. mov edx,[ebp + arg3];
  228. mov ebx,[ebp + arg2];
  229. mov edi,edx
  230. cmp ebx,X0
  231. jl nuepetabla
  232. mov eax,9
  233. mov esi,X_0_width
  234. mul esi
  235. add eax,X0
  236. cmp eax,ebx
  237. jge nuepetabla
  238. ;Y
  239. mov edx,edi
  240. cmp edx,Y0
  241. jl nuepetabla
  242. mov eax,9
  243. mov ecx,X_0_width
  244. mul ecx
  245. add eax,Y0
  246. mov edx,edi
  247. cmp eax,edx
  248. jge nuepetabla
  249. mov edx, 1
  250. mov verif_inafara, 1
  251. jmp gata
  252.  
  253. nuepetabla:
  254. make_text_macro '1',area,30,30
  255. mov edx, 0
  256. mov verif_inafara, 0 ;; verif_inafara=0 ; nu ne aflam pe tabla de joc
  257. gata:
  258. make_text_macro '3',area,50,50
  259. mov esp,ebp
  260. pop ebp
  261. ret
  262. verificare_matrice endp
  263. ; functia de desenare - se apeleaza la fiecare click
  264. ; sau la fiecare interval de 200ms in care nu s-a dat click
  265. ; arg1 - evt (0 - initializare, 1 - click, 2 - s-a scurs intervalul fara click)
  266. ; arg2 - y
  267. ; arg3 - x
  268. draw proc
  269. push ebp
  270. mov ebp, esp
  271. pusha
  272.  
  273. mov eax, [ebp+arg1]
  274. cmp eax, 1
  275. jz evt_click
  276. cmp eax, 2
  277.  
  278. jz evt_timer ; nu s-a efectuat click pe nimic
  279. ;mai jos e codul care intializeaza fereastra cu pixeli albi
  280. mov eax, area_width
  281. mov ebx, area_height
  282. mul ebx
  283. shl eax, 2
  284. push eax
  285. push 255; culoarea alba
  286. push area
  287. call memset
  288. add esp, 12
  289. ; Desenam matricea
  290. desenare_linie_orizontala 100,100
  291. desenare_linie_orizontala 100,140
  292. desenare_linie_orizontala 100,180
  293. desenare_linie_orizontala 100,220
  294. desenare_linie_orizontala 100,260
  295. desenare_linie_orizontala 100,300
  296. desenare_linie_orizontala 100,340
  297. desenare_linie_orizontala 100,380
  298. desenare_linie_orizontala 100,420
  299. desenare_linie_orizontala 100,460
  300.  
  301.  
  302.  
  303. desenare_linie_verticala 100,100
  304. desenare_linie_verticala 140,100
  305. desenare_linie_verticala 180,100
  306. desenare_linie_verticala 220,100
  307. desenare_linie_verticala 260,100
  308. desenare_linie_verticala 300,100
  309. desenare_linie_verticala 340,100
  310. desenare_linie_verticala 380,100
  311. desenare_linie_verticala 420,100
  312. desenare_linie_verticala 460,100
  313. ;Desenare tastatura
  314.  
  315. desenare_linie_orizontala_tastatura 560,200
  316. desenare_linie_orizontala_tastatura 560,240
  317. desenare_linie_orizontala_tastatura 560,280
  318. desenare_linie_orizontala_tastatura 560,320
  319.  
  320. desenare_linie_verticala_tastatura 560,200
  321. desenare_linie_verticala_tastatura 600,200
  322. desenare_linie_verticala_tastatura 640,200
  323. desenare_linie_verticala_tastatura 680,200
  324.  
  325. jmp afisare_litere
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332. evt_click:
  333. mov edi, area
  334. mov ebx,[ebp+arg3];x eax=x
  335. mov edx,[ebp+arg2];y ecx=y
  336. call verificare_matrice
  337. ;mov edx,0
  338. ;mov esi,area_width
  339. ;mul esi
  340. ;shl eax,2; inmultim cu 4 pentru a sarii
  341. ;;add eax,edi
  342.  
  343. ;linie_o:
  344. ;mov dword ptr [eax+ecx*4],0FF00FFh;aici ne va pune linia orizontala
  345. ;loop linie_o
  346. ;mov edi,area
  347. ;mov ecx,[ebp+arg3];x
  348. ;mov eax,[ebp+arg2];y` `
  349. ;shl eax,2
  350. ;add eax,area;pointer spre matrice
  351. ;mov edi,area_width;lungimea liniei
  352. ;shl edi,2
  353. ;
  354.  
  355. ;linie_v:
  356. ;mov dword ptr[eax],0FF00FFh
  357. ;add eax,edi
  358. ;loop linie_v
  359.  
  360. evt_timer:
  361. inc counter
  362.  
  363. afisare_litere:
  364. ;afisam valoarea counter-ului curent (sute, zeci si unitati)
  365. mov ebx, 10
  366. mov eax, counter
  367. ;cifra unitatilor
  368. mov edx, 0
  369. div ebx
  370. add edx, '0'
  371. make_text_macro edx, area, 30, 10
  372. ;cifra zecilor
  373. mov edx, 0
  374. div ebx
  375. add edx, '0'
  376. make_text_macro edx, area, 20, 10
  377. ;cifra sutelor
  378. mov edx, 0
  379. div ebx
  380. add edx, '0'
  381. make_text_macro edx, area, 10, 10
  382.  
  383. ;scriem un mesaj
  384. afisare_text:
  385. make_text_macro 'K', area, 240, 60
  386. make_text_macro 'E', area, 250, 60
  387. make_text_macro 'N', area, 260, 60
  388. make_text_macro 'K', area, 280, 60
  389. make_text_macro 'E', area, 290, 60
  390. make_text_macro 'N', area, 300, 60
  391. ;Scriem tastatura
  392. make_text_macro '1', area, 575, 210
  393. make_text_macro '2', area, 615, 210
  394. make_text_macro '3', area, 655, 210
  395. make_text_macro '4', area, 575, 250
  396. make_text_macro '5', area, 615, 250
  397. make_text_macro '6', area, 655, 250
  398. make_text_macro '7', area, 575, 290
  399. make_text_macro '8', area, 615, 290
  400. make_text_macro '9', area, 655, 290
  401.  
  402.  
  403. final_draw:
  404. popa
  405. mov esp, ebp
  406. pop ebp
  407. ret
  408. draw endp
  409.  
  410. start:
  411. ;alocam memorie pentru zona de desenat
  412. mov eax, area_width
  413. mov ebx, area_height
  414. mul ebx
  415. shl eax, 2
  416. push eax
  417. call malloc
  418. add esp, 4
  419. mov area, eax
  420. ;apelam functia de desenare a ferestrei
  421. ; typedef void (*DrawFunc)(int evt, int x, int y);
  422. ; void __cdecl BeginDrawing(const char *title, int width, int height, unsigned int *area, DrawFunc draw);
  423. push offset draw
  424. push area
  425. push area_height
  426. push area_width
  427. push offset window_title
  428. call BeginDrawing
  429. add esp, 20
  430.  
  431. ;terminarea programului
  432. push 0
  433. call exit
  434. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement