Rev 9241 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
31 | halyavin | 1 | ;lang equ ru ; ru en fr ge fi |
2 | |||
3 | ; |
||
4 | ; Assembler |
||
5 | ; SMALL |
||
6 | ; CODE |
||
7 | ; Libary |
||
8 | ; |
||
9241 | leency | 9 | ; Ver 0.17 (for FASM v1.54 or higer) |
10 | ; |
||
31 | halyavin | 11 | |
9241 | leency | 12 | macro movt op1,op2 |
31 | halyavin | 13 | { |
9241 | leency | 14 | if op2 eq |
15 | ;display 'not set' |
||
31 | halyavin | 16 | else |
9241 | leency | 17 | if op1 eq op2 |
18 | display '+' |
||
19 | ;display 'skip mov ' # `op1 # ',' # `op2 , 10,13 |
||
31 | halyavin | 20 | else |
9241 | leency | 21 | mov op1,op2 |
31 | halyavin | 22 | end if |
23 | end if |
||
24 | } |
||
25 | |||
9241 | leency | 26 | macro clear_buffer buffer, buf_size, value |
27 | { |
||
28 | movt edi,buffer ; edi = buffer adress |
||
29 | movt ecx,buf_size ; ecx = buffer size |
||
30 | movt al,value |
||
31 | call clear_buffer_proc |
||
31 | halyavin | 32 | |
9241 | leency | 33 | if ~ defined clear_buffer_used |
34 | clear_buffer_used equ 1 |
||
35 | jmp @f |
||
36 | clear_buffer_proc: |
||
37 | mov ah,al |
||
38 | push ax |
||
39 | shl eax,16 |
||
40 | pop ax ; eax = al:al:al:al |
||
41 | push ecx |
||
42 | shr ecx,2 ; ecx = ecx/4 when we use stosd |
||
43 | cld ; set direction flag |
||
44 | rep stosd |
||
45 | pop ecx |
||
46 | and ecx,011b ; last two bits |
||
47 | rep stosb |
||
48 | ret |
||
49 | @@: |
||
50 | end if |
||
51 | } |
||
31 | halyavin | 52 | |
9241 | leency | 53 | ; draw_button - function for draw button with label placed at center |
31 | halyavin | 54 | |
9241 | leency | 55 | macro draw_button button_id,x,y,xs,ys,text,button_color,text_color |
31 | halyavin | 56 | { |
9241 | leency | 57 | local end_of_data,label |
58 | jmp end_of_data |
||
59 | label db text ;arg label |
||
60 | end_of_data: |
||
61 | words2reg ebx,x,xs ; ebx = x * 65536 + xsize |
||
62 | words2reg ecx,y,ys ; ecx = y * 65536 + ysize |
||
63 | mov edx,button_id |
||
64 | mov esi,button_color |
||
65 | push dword end_of_data-label |
||
66 | push dword text_color |
||
67 | push dword label |
||
68 | call draw_button_proc |
||
69 | if ~ defined draw_button_used |
||
70 | draw_button_used equ 1 |
||
71 | jmp @f |
||
72 | draw_button_proc: |
||
73 | mov eax,8 ; eax = 8 add button function |
||
74 | mcall |
||
31 | halyavin | 75 | |
9241 | leency | 76 | mov esi,[esp+12] ; esi = lenght of label |
77 | mov eax,esi |
||
78 | mov edx,6 ; 6 - width of one char |
||
79 | mul edx ; eax = size of label in pixels (chars number * 6) |
||
31 | halyavin | 80 | |
9241 | leency | 81 | sub bx,ax |
82 | shr bx,1 |
||
83 | mov edi,ebx |
||
84 | shr edi,16 |
||
85 | add bx,di |
||
31 | halyavin | 86 | |
9241 | leency | 87 | sub cx,7 |
88 | shr cx,1 |
||
89 | mov edi,ecx |
||
90 | shr edi,16 |
||
91 | add cx,di |
||
31 | halyavin | 92 | |
9241 | leency | 93 | shl ebx,16 |
94 | mov bx,cx ; ebx = bx * 65536 + edx |
||
31 | halyavin | 95 | |
9241 | leency | 96 | mov ecx,[esp+8] ; text color |
97 | mov edx,[esp+4] ; set address of label |
||
98 | mov eax,4 ; eax = 4 draw label function |
||
99 | mcall |
||
100 | ret 3*4 |
||
101 | @@: |
||
102 | end if |
||
31 | halyavin | 103 | } |
104 | |||
9241 | leency | 105 | ; scan_event - Scan event without wait |
106 | macro scan_event redraw,key,button |
||
107 | { |
||
108 | mov eax,11 |
||
109 | mcall |
||
110 | dec eax |
||
111 | jz redraw |
||
112 | dec eax |
||
113 | jz key |
||
114 | dec eax |
||
115 | jz button |
||
116 | } |
||
31 | halyavin | 117 | |
9241 | leency | 118 | ; wait_event - Wait for event |
119 | macro wait_event redraw,key,button |
||
31 | halyavin | 120 | { |
9241 | leency | 121 | mov eax,10 |
122 | mcall |
||
123 | dec eax |
||
124 | jz redraw |
||
125 | dec eax |
||
126 | jz key |
||
127 | dec eax |
||
128 | jz button |
||
129 | } |
||
31 | halyavin | 130 | |
9241 | leency | 131 | ; time_event - Wait for event with timeout |
132 | macro time_event xfps,noevent,redraw,key,button |
||
133 | { |
||
134 | mov eax,23 |
||
135 | mov ebx,xfps |
||
136 | mcall |
||
137 | ;cmp eax,0 |
||
138 | ;je noevent |
||
139 | dec eax |
||
140 | js noevent |
||
141 | jz redraw |
||
142 | dec eax |
||
143 | jz key |
||
144 | dec eax |
||
145 | jz button |
||
146 | } |
||
31 | halyavin | 147 | |
9241 | leency | 148 | ; function for set ascii or scan code keyboard input mode |
149 | macro keyboard_set_input_mode mode |
||
150 | { |
||
151 | mov eax,66 ; eax = 66 - keyboard service function |
||
152 | mov ebx,1 ; ebx = 1 - sub function for set input mode for keyboard |
||
153 | mov ecx,mode ; ecx = mode 0 - ASCII; 1 - scan codes; |
||
154 | mcall |
||
31 | halyavin | 155 | } |
156 | |||
9241 | leency | 157 | ; function for read layout to 128 byte array |
158 | macro keyboard_get_layout layout_type, layout_array |
||
31 | halyavin | 159 | { |
9241 | leency | 160 | mov eax,26 ; eax = 26 - hardware service function |
161 | mov ebx,2 ; ebx = 2 - subfunction for get keyboard layout |
||
162 | mov ecx,layout_type ; ecx = layout type: 1 - for normal layout |
||
163 | mov edx,layout_array ; edx = address to 128 byte array |
||
164 | mcall |
||
31 | halyavin | 165 | } |
166 | |||
9241 | leency | 167 | ; function for get key from keyboard buffer |
168 | macro window_get_key output |
||
31 | halyavin | 169 | { |
9241 | leency | 170 | mov eax,2 ; eax = 2 - get keyboard pressed key function |
171 | mcall |
||
172 | if ~output eq |
||
173 | mov output,eax |
||
174 | end if |
||
31 | halyavin | 175 | } |
176 | |||
9241 | leency | 177 | ; function for get id of button pressed in window |
178 | macro window_get_button output |
||
31 | halyavin | 179 | { |
9241 | leency | 180 | mov eax,17 ; eax = 17 - get id of pressed button function |
181 | mcall |
||
182 | if ~output eq |
||
183 | mov output,eax |
||
184 | end if |
||
31 | halyavin | 185 | } |
186 | |||
9241 | leency | 187 | macro draw_pixel x,y,color |
31 | halyavin | 188 | { |
9241 | leency | 189 | mov ebx,x |
190 | mov ecx,y |
||
191 | mov edx,color |
||
192 | mov eax,1 |
||
193 | mcall |
||
31 | halyavin | 194 | } |
195 | |||
196 | macro puttxt x,y,offs,size,color |
||
197 | { |
||
9241 | leency | 198 | words2reg ebx,x,y |
199 | mov ecx,color |
||
200 | mov edx,offs |
||
201 | mov esi,size |
||
202 | mov eax,4 |
||
203 | mcall |
||
31 | halyavin | 204 | } |
205 | |||
9241 | leency | 206 | ; window_begin_draw - Begin of draw window |
207 | macro window_begin_draw |
||
31 | halyavin | 208 | { |
9241 | leency | 209 | mov eax,12 |
210 | mov ebx,1 |
||
211 | mcall |
||
31 | halyavin | 212 | } |
213 | |||
9241 | leency | 214 | ; window_end_draw - End draw of window |
215 | macro window_end_draw |
||
31 | halyavin | 216 | { |
9241 | leency | 217 | mov eax,12 |
218 | mov ebx,2 |
||
219 | mcall |
||
31 | halyavin | 220 | } |
221 | |||
9241 | leency | 222 | ; fs_read_file - read file from file system and save it to array |
223 | ; example: |
||
9587 | vitalkrilo | 224 | ; fs_read_file '/sys/clock.bmp',load_area,temp_area |
31 | halyavin | 225 | |
9241 | leency | 226 | macro fs_read_file file_name,file_load_area,file_temp_area |
31 | halyavin | 227 | { |
9241 | leency | 228 | local open,fileinfo,string |
229 | jmp open |
||
230 | fileinfo: |
||
231 | dd 0 |
||
232 | dd 0 |
||
233 | dd 1 |
||
234 | dd file_load_area |
||
235 | dd file_temp_area |
||
236 | string: |
||
237 | db file_name,0 |
||
238 | open: |
||
239 | mov dword [fileinfo+8],1 ; how many blocks to read (1) |
||
240 | mov eax,58 |
||
241 | mov ebx,fileinfo |
||
242 | mcall |
||
243 | mov eax,[file_load_area+2] |
||
244 | shr eax,9 ; div to 512 and add 1 - for get number of blocks |
||
245 | inc eax |
||
246 | mov dword [fileinfo+8],eax |
||
247 | mov eax,58 |
||
248 | mov ebx,fileinfo |
||
249 | mcall |
||
31 | halyavin | 250 | } |
251 | |||
9241 | leency | 252 | ; random - generate random count (small) |
253 | ; example: |
||
254 | ; random 10000,eax ; generate random value from 0 to 10000 and save it in eax |
||
255 | ; note: |
||
256 | ; max_value<65536 |
||
257 | ; only modificate eax register |
||
31 | halyavin | 258 | |
9241 | leency | 259 | randomuse = 0 |
260 | macro random max_value,result |
||
31 | halyavin | 261 | { |
9241 | leency | 262 | local rxproc |
263 | randomuse = randomuse + 1 |
||
264 | jmp rxproc |
||
265 | |||
266 | if defined randomuse & randomuse = 1 |
||
267 | randomproc: |
||
268 | ;int3 |
||
269 | ;push bx |
||
270 | ;push cx |
||
271 | ;push dx |
||
272 | ;push si |
||
273 | ;push di |
||
274 | pushad |
||
275 | mov cx,ax |
||
276 | mov ax,word ptr rsx1 |
||
277 | mov bx,word ptr rsx2 |
||
278 | mov si,ax |
||
279 | mov di,bx |
||
280 | mov dl,ah |
||
281 | mov ah,al |
||
282 | mov al,bh |
||
283 | mov bh,bl |
||
284 | xor bl,bl |
||
285 | rcr dl,1 |
||
286 | rcr ax,1 |
||
287 | rcr bx,1 |
||
288 | add bx,di |
||
289 | adc ax,si |
||
290 | add bx,0x62e9 |
||
291 | adc ax,0x3619 |
||
292 | mov word ptr rsx1,bx |
||
293 | mov word ptr rsx2,ax |
||
294 | xor dx,dx |
||
295 | cmp ax,0 |
||
296 | je nodiv |
||
297 | cmp cx,0 |
||
298 | je nodiv |
||
299 | div cx |
||
300 | nodiv: |
||
301 | mov [rnd_result],dx |
||
302 | popad |
||
303 | mov eax,dword [rnd_result] |
||
304 | ret |
||
305 | ; data block after ret |
||
306 | rsx1 dw 0x4321 |
||
307 | rsx2 dw 0x1234 |
||
308 | rnd_result dw 0 |
||
309 | dw 0 |
||
310 | end if |
||
311 | |||
312 | rxproc: |
||
313 | movt eax,max_value |
||
314 | call randomproc |
||
315 | movt result,eax ;dword [rnd_result] |
||
31 | halyavin | 316 | } |
317 | |||
9241 | leency | 318 | ; close - Close application |
31 | halyavin | 319 | |
320 | macro close |
||
321 | { |
||
9241 | leency | 322 | mov eax,-1 |
323 | mcall |
||
31 | halyavin | 324 | } |
325 | |||
9241 | leency | 326 | ; delay - Create delay 1/100 sec |
327 | ; example: |
||
328 | ; delay 100 ;delay 2 sec 1/100*200=2 sec |
||
31 | halyavin | 329 | |
330 | macro delay arg1 |
||
331 | { |
||
9241 | leency | 332 | mov eax,5 |
333 | mov ebx,arg1 |
||
334 | mcall |
||
31 | halyavin | 335 | } |
336 | |||
9241 | leency | 337 | ; window - Draw window |
338 | ; window Xstart,Ystart,'Text',Color |
||
339 | ; example: |
||
340 | ; window 10,10,640+8,480+24,window_Skinned |
||
31 | halyavin | 341 | |
342 | macro window arg1,arg2,arg3,arg4,arg5 |
||
343 | { |
||
9241 | leency | 344 | words2reg ebx,arg1,arg3 |
345 | words2reg ecx,arg2,arg4 |
||
346 | mov edx,arg5 |
||
347 | mov eax,0 |
||
348 | mcall |
||
31 | halyavin | 349 | } |
350 | |||
351 | macro colorwindow arg1,arg2,arg3,arg4,arg5,arg6,arg7 |
||
352 | { |
||
9241 | leency | 353 | mov ebx,arg1*65536+arg3 |
354 | mov ecx,arg2*65536+arg4 |
||
355 | mov edx,arg5 |
||
356 | mov esi,arg6 |
||
357 | mov edi,arg7 |
||
358 | mov eax,0 |
||
359 | mcall |
||
31 | halyavin | 360 | } |
361 | |||
9241 | leency | 362 | ;Key's scan codes |
31 | halyavin | 363 | |
9241 | leency | 364 | ErrorCode equ 0 ; 0x00 |
365 | key_Esc equ 1 ; 0x01 |
||
366 | key_1 equ 2 ; 0x02 ! |
||
367 | key_2 equ 3 ; 0x03 @ |
||
368 | key_3 equ 4 ; 0x04 # |
||
369 | key_4 equ 5 ; 0x05 $ |
||
370 | key_5 equ 6 ; 0x06 % |
||
371 | key_6 equ 7 ; 0x07 " |
||
372 | key_7 equ 8 ; 0x08 & |
||
373 | key_8 equ 9 ; 0x09 * |
||
374 | key_9 equ 10 ; 0x0A ( |
||
375 | key_0 equ 11 ; 0x0B ) |
||
31 | halyavin | 376 | |
9241 | leency | 377 | key_Backspace equ 14 ; 0x0E |
378 | key_Q equ 16 ; 0x10 |
||
379 | key_W equ 17 ; 0x11 |
||
380 | key_E equ 18 ; 0x12 |
||
381 | key_R equ 19 ; 0x13 |
||
382 | key_T equ 20 ; 0x14 |
||
383 | key_Y equ 21 ; 0x15 |
||
384 | key_U equ 22 ; 0x16 |
||
385 | key_I equ 23 ; 0x17 |
||
386 | key_O equ 24 ; 0x18 |
||
387 | key_P equ 25 ; 0x19 |
||
31 | halyavin | 388 | |
9241 | leency | 389 | key_Enter equ 28 ; 0x1C |
390 | key_A equ 30 ; 0x1E |
||
391 | key_S equ 31 ; 0x1F |
||
392 | key_D equ 32 ; 0x20 |
||
393 | key_F equ 33 ; 0x21 |
||
394 | key_G equ 34 ; 0x22 |
||
395 | key_H equ 35 ; 0x23 |
||
396 | key_J equ 36 ; 0x24 |
||
397 | key_K equ 37 ; 0x25 |
||
398 | key_L equ 38 ; 0x26 |
||
399 | key_Colon equ 39 ; 0x27 ':;' |
||
400 | key_DQuotes equ 0x28 ; 40 '"'' |
||
401 | key_Tilda equ 0x29 ; 41 '~`' |
||
402 | key_LShift equ 0x2A ; 42 |
||
403 | key_Z equ 0x2C ; 44 |
||
404 | key_X equ 0x2D ; 45 |
||
405 | key_C equ 0x2E ; 46 |
||
406 | key_V equ 0x2F ; 47 |
||
407 | key_B equ 0x30 ; 48 |
||
408 | key_N equ 0x31 ; 49 |
||
409 | key_M equ 0x32 ; 50 |
||
410 | key_Comma equ 0x33 ; 51 ',<' |
||
411 | key_Dot equ 0x34 ; 52 '.>' |
||
412 | key_Question equ 0x35 ; 53 '?/' |
||
413 | key_RShift equ 0x36 ; 54 |
||
414 | key_NumStar equ 0x37 ; 55 '*' |
||
415 | key_LAlt equ 0x38 ; 56 |
||
416 | key_Space equ 0x39 ; 57 |
||
417 | key_CapsLock equ 0x3A ; 58 |
||
418 | key_F1 equ 0x3B ; 59 |
||
419 | key_F2 equ 0x3C ; 60 |
||
420 | key_F3 equ 0x3D ; 61 |
||
421 | key_F4 equ 62 |
||
422 | key_F5 equ 63 |
||
423 | key_F6 equ 64 |
||
424 | key_F7 equ 65 |
||
425 | key_F8 equ 66 |
||
426 | key_F9 equ 67 |
||
427 | key_F10 equ 0x44 ; 68 |
||
428 | key_NumLock equ 0x45 ; 69 |
||
429 | key_ScrollLock equ 0x46 ; 70 |
||
430 | key_Up equ 0x48 ; 72 |
||
431 | key_Num8 equ 0x48 ; 72 |
||
432 | key_PageUp equ 0x49 ; 73 |
||
433 | key_Num9 equ 0x49 ; 73 |
||
434 | key_NumMinus equ 0x4A ; 74 |
||
435 | key_Left equ 0x4B ; 75 |
||
436 | key_Num4 equ 0x4B ; 75 |
||
437 | key_Num5 equ 0x4C ; 76 |
||
438 | key_Right equ 0x4D ; 77 |
||
439 | key_Down equ 0x50 ; 80 |
||
440 | key_Num2 equ 0x50 ; 80 |
||
441 | key_F11 equ 0x57 ; 87 |
||
442 | key_F12 equ 0x58 ; 88 |
||
443 | key_PA1 equ 90 ; 0x5A |
||
444 | key_Lwin equ 91 ; 0x5B |
||
445 | key_F13 equ 91 ; 0x5B |
||
446 | key_Rwin equ 92 ; 0x5C |
||
447 | key_F14 equ 92 ; 0x5C |
||
448 | key_Menu equ 93 ; 0x5D |
||
449 | key_F15 equ 93 ; 0x5D |
||
450 | key_F16 equ 99 ; 0x63 |
||
451 | key_F17 equ 100 ; 0x64 |
||
452 | key_F18 equ 101 ; 0x65 |
||
453 | key_F19 equ 102 ; 0x66 |
||
454 | key_F20 equ 103 ; 0x67 |
||
455 | key_F21 equ 104 ; 0x68 |
||
456 | key_F22 equ 105 ; 0x69 |
||
457 | key_F23 equ 106 ; 0x6A |
||
458 | key_F24 equ 107 ; 0x6B |
||
459 | key_EraseEOF equ 109 ; 0x6D |
||
460 | key_CopyPlay equ 111 ; 0x6F |
||
461 | key_CrSel equ 114 ; 0x72 |
||
462 | key_Delta equ 115 ; 0x73 |
||
463 | key_ExSel equ 116 ; 0x74 |
||
464 | key_Clear equ 118 ; 0x76 |
||
31 | halyavin | 465 | |
466 | |||
467 | |||
468 | ;Attributes |
||
469 | |||
470 | ;Window Attributes |
||
551 | spraid | 471 | window_Skinned equ 0x04000000 |
31 | halyavin | 472 | window_Type2 equ 0x02000000 |
473 | window_Type1 equ 0x00000000 |
||
474 | window_Reserve equ 0x01000000 |
||
475 | |||
9241 | leency | 476 | ;Label Attributes |
477 | ends_by_zero equ 10000000b shl 24 |
||
478 | fill_background equ 01000000b shl 24 |
||
479 | cp866_small equ 00000000b shl 24 |
||
480 | cp866 equ 00010000b shl 24 |
||
481 | utf16 equ 00100000b shl 24 |
||
482 | utf8 equ 00110000b shl 24 |
||
483 | font_size_x1 equ 00000000b shl 24 |
||
484 | font_size_x2 equ 00000001b shl 24 |
||
485 | font_size_x3 equ 00000010b shl 24 |
||
486 | font_size_x4 equ 00000011b shl 24 |
||
487 | font_size_x5 equ 00000100b shl 24 |
||
488 | font_size_x6 equ 00000101b shl 24 |
||
489 | font_size_x7 equ 00000110b shl 24 |
||
490 | font_size_x8 equ 00000111b shl 24 |
||
31 | halyavin | 491 | |
492 | ;Colors |
||
493 | cl_White equ 0x00ffffff |
||
494 | cl_Black equ 0x00000000 |
||
495 | cl_Grey equ 0x00888888 |
||
496 | cl_Red equ 0x00ff0000 |
||
497 | cl_Lime equ 0x0000ff00 |
||
9241 | leency | 498 | cl_Blue equ 0x000000ff |
499 | cl_Yellow equ 0x00ffff00 |
||
500 | cl_Cyan equ 0x0000ffff |
||
31 | halyavin | 501 | cl_Green equ 0x0000af00 |
502 | cl_Blue equ 0x000000ff |
||
503 | cl_Purple equ 0x008080ff |
||
504 | cl_Violet equ 0x008040ff |
||
9241 | leency | 505 | ;cl_Cyan equ 0x0040e0ff |
506 | |||
507 | macro wordstoreg reg,hiword,loword |
||
508 | { |
||
509 | if hiword eqtype 0 & loword eqtype 0 |
||
510 | mov reg,dword (hiword)*65536+(loword) |
||
511 | else if hiword eqtype 12 & loword eqtype eax |
||
512 | mov reg,dword (hiword)*65536 |
||
513 | add reg,dword loword |
||
514 | else if hiword eqtype 12 & loword eqtype [123] |
||
515 | mov reg,dword (hiword)*65536 |
||
516 | add reg,dword loword |
||
517 | else |
||
518 | mov reg,dword hiword |
||
519 | shl reg,16 |
||
520 | add reg,dword loword |
||
521 | end if |
||
522 | } |
||
523 | |||
524 | macro dword2reg reg,doubleword |
||
525 | { |
||
526 | if doubleword eq |
||
527 | ; not changes |
||
528 | else |
||
529 | mov reg,dword doubleword |
||
530 | end if |
||
531 | } |
||
532 | |||
533 | macro words2reg reg,hiword,lowword |
||
534 | { |
||
535 | if hiword eq |
||
536 | if lowword eq |
||
537 | ; if operators empty nothing do |
||
538 | else |
||
539 | if lowword eqtype 12/4 |
||
540 | and reg,dword 0xffff0000 |
||
541 | add reg,dword lowword |
||
542 | else |
||
543 | and reg,dword 0xffff0000 |
||
544 | add reg,dword lowword |
||
545 | end if |
||
546 | end if |
||
547 | else |
||
548 | if lowword eq |
||
549 | if hiword eqtype 12/4 |
||
550 | and reg,dword 0x0000ffff |
||
551 | add reg,dword hiword*65536 |
||
552 | else |
||
553 | shl reg,16 |
||
554 | add reg,dword hiword |
||
555 | ror reg,16 |
||
556 | end if |
||
557 | else |
||
558 | if lowword eqtype 12/4 & hiword eqtype 12/4 |
||
559 | if lowword = 0 & hiword = 0 |
||
560 | xor reg,reg |
||
561 | else |
||
562 | ; use brackets for calcualtion without error!!! |
||
563 | mov reg,dword (hiword)*65536+(lowword) |
||
564 | end if |
||
565 | else |
||
566 | mov reg,dword hiword |
||
567 | shl reg,16 |
||
568 | add reg,dword lowword |
||
569 | end if |
||
570 | end if |
||
571 | end if |
||
572 | }' |