Subversion Repositories Kolibri OS

Rev

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
}