Subversion Repositories Kolibri OS

Rev

Rev 9241 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;lang equ ru ; ru en fr ge fi
  2.  
  3. ;
  4. ;   Assembler
  5. ;     SMALL
  6. ;       CODE
  7. ;         Libary
  8. ;
  9. ;  Ver 0.17 (for FASM v1.54 or higer)
  10. ;
  11.  
  12. macro movt op1,op2
  13. {
  14.    if op2 eq
  15.       ;display 'not set'
  16.    else
  17.       if op1 eq op2
  18.          display '+'
  19.          ;display 'skip mov ' # `op1 # ',' # `op2 , 10,13
  20.       else
  21.          mov op1,op2
  22.       end if
  23.    end if
  24. }
  25.  
  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
  32.  
  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. }
  52.  
  53. ; draw_button - function for draw button with label placed at center
  54.  
  55. macro draw_button button_id,x,y,xs,ys,text,button_color,text_color
  56. {
  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
  75.  
  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)
  80.  
  81.    sub bx,ax
  82.    shr bx,1
  83.    mov edi,ebx
  84.    shr edi,16
  85.    add bx,di
  86.  
  87.    sub cx,7
  88.    shr cx,1
  89.    mov edi,ecx
  90.    shr edi,16
  91.    add cx,di
  92.  
  93.    shl ebx,16
  94.    mov bx,cx     ; ebx = bx * 65536 + edx
  95.  
  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
  103. }
  104.  
  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. }
  117.  
  118. ; wait_event - Wait for event
  119. macro wait_event redraw,key,button
  120. {
  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. }
  130.  
  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. }
  147.  
  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
  155. }
  156.  
  157. ; function for read layout to 128 byte array
  158. macro keyboard_get_layout layout_type, layout_array
  159. {
  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
  165. }
  166.  
  167. ; function for get key from keyboard buffer
  168. macro window_get_key output
  169. {
  170.    mov  eax,2  ; eax = 2 - get keyboard pressed key function
  171.    mcall
  172.    if ~output eq
  173.       mov output,eax
  174.    end if
  175. }
  176.  
  177. ; function for get id of button pressed in window
  178. macro window_get_button output
  179. {
  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
  185. }
  186.  
  187. macro draw_pixel x,y,color
  188. {
  189.    mov ebx,x
  190.    mov ecx,y
  191.    mov edx,color
  192.    mov eax,1
  193.    mcall
  194. }
  195.  
  196. macro puttxt x,y,offs,size,color
  197. {
  198.    words2reg ebx,x,y
  199.    mov ecx,color
  200.    mov edx,offs
  201.    mov esi,size
  202.    mov eax,4
  203.    mcall
  204. }
  205.  
  206. ; window_begin_draw - Begin of draw window
  207. macro window_begin_draw
  208. {
  209.    mov eax,12
  210.    mov ebx,1
  211.    mcall
  212. }
  213.  
  214. ; window_end_draw - End draw of window
  215. macro window_end_draw
  216. {
  217.    mov eax,12
  218.    mov ebx,2
  219.    mcall
  220. }
  221.  
  222. ; fs_read_file - read file from file system and save it to array
  223. ; example:
  224. ; fs_read_file '/sys/clock.bmp',load_area,temp_area
  225.  
  226. macro fs_read_file file_name,file_load_area,file_temp_area
  227. {
  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
  250. }
  251.  
  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
  258.  
  259. randomuse = 0
  260. macro random max_value,result
  261. {
  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]
  316. }
  317.  
  318. ; close - Close application
  319.  
  320. macro close
  321. {
  322.    mov eax,-1
  323.    mcall
  324. }
  325.  
  326. ; delay - Create delay 1/100 sec
  327. ; example:
  328. ; delay 100   ;delay 2 sec 1/100*200=2 sec
  329.  
  330. macro delay arg1
  331. {
  332.    mov eax,5
  333.    mov ebx,arg1
  334.    mcall
  335. }
  336.  
  337. ; window - Draw window
  338. ; window Xstart,Ystart,'Text',Color
  339. ; example:
  340. ; window 10,10,640+8,480+24,window_Skinned
  341.  
  342. macro window arg1,arg2,arg3,arg4,arg5
  343. {
  344.    words2reg ebx,arg1,arg3
  345.    words2reg ecx,arg2,arg4
  346.    mov edx,arg5
  347.    mov eax,0
  348.    mcall
  349. }
  350.  
  351. macro colorwindow arg1,arg2,arg3,arg4,arg5,arg6,arg7
  352. {
  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
  360. }
  361.  
  362. ;Key's scan codes
  363.  
  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 )
  376.  
  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
  388.  
  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
  465.  
  466.  
  467.  
  468. ;Attributes
  469.  
  470. ;Window Attributes
  471. window_Skinned equ 0x04000000
  472. window_Type2   equ 0x02000000
  473. window_Type1   equ 0x00000000
  474. window_Reserve equ 0x01000000
  475.  
  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
  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
  498. cl_Blue   equ 0x000000ff
  499. cl_Yellow equ 0x00ffff00
  500. cl_Cyan   equ 0x0000ffff
  501. cl_Green  equ 0x0000af00
  502. cl_Blue   equ 0x000000ff
  503. cl_Purple equ 0x008080ff
  504. cl_Violet equ 0x008040ff
  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. }
  573.