Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ;Hello world example
  2.  
  3. use32
  4.         db      'MENUET01'
  5.         dd      1
  6.         dd      start
  7.         dd      i_end
  8.         dd      0x1000
  9.         dd      0x1000
  10.         dd      0
  11.         dd      0
  12.  
  13. TRUE    =     1
  14. FALSE   =     0
  15.  
  16. include 'libGUI.inc'
  17.  
  18. start:
  19.         ;load libGUI labrari
  20.         push NULL  ;use default system path to library
  21.         call LoadLibGUI
  22.         ;create main window
  23.         CreateWindow
  24.         mov [window],eax
  25.         ;change size of main window
  26.         SetWindowSizeRequest [window],320,57
  27.         ;set callback function for button close window
  28.         SetCallbackFunction [window],DELETE_EVENT,callback_func_delete_window,NULL
  29.  
  30.         ;create control Text
  31.         mov [pbdata.x],5
  32.         mov [pbdata.y],5
  33.         mov [pbdata.wight],300;use default system libGUI font
  34.         mov [pbdata.height],25;use background for text
  35.         mov [pbdata.progress],dword 0.0
  36.         CreateProgressBar pbdata
  37.         mov [progress_bar],eax
  38.  
  39.         ;create timer for update progress level each 50 milliseconds
  40.         SetTimerCallbackForFunction [window],5,progress_bar_callback,[progress_bar]
  41.  
  42.         ;pack control Text in window
  43.         PackControls [window],[progress_bar]
  44.  
  45.         ;redraw progress bar automatically each 50 milleseconds
  46.         SetProgressBarPulse [progress_bar],5
  47.  
  48.         ;start libGUI main loop
  49.         LibGUImain [window]
  50.  
  51.  
  52. ;void progress_bar_callback(void *data)
  53. progress_bar_callback:
  54.  
  55.         mov eax,[esp+4];pointer to control progress bar
  56.  
  57.         mov ecx,[eax+HEADER_SIZE];progress
  58.         mov [progress],ecx
  59.         mov [increment],dword 0.01
  60.         mov [digit],100
  61.  
  62.         fld dword[increment]
  63.         fld dword[progress]
  64.         fadd st0,st1
  65.         fst dword [progress]
  66.         fild dword[digit]
  67.         fmul st0,st1
  68.         fistp dword[digit]
  69.         fstp st0  ;free progress
  70.         fstp st0  ;free increment
  71.  
  72.         cmp [progress],dword 1.0
  73.         jl no_max_progress
  74.                 mov [progress],dword 0.0
  75.         no_max_progress:
  76.  
  77.         mov ecx,[progress]
  78.         mov [eax+HEADER_SIZE],ecx ;save new value of progress
  79.  
  80.         ;print progressvalue in string
  81.         push ebx ;save befor use
  82.  
  83.         mov eax,txt
  84.         add eax,9
  85.         mov ebx,eax ;save eax
  86.  
  87.         push eax
  88.         push [digit]
  89.         call dec_to_str
  90.  
  91.         add ebx,eax
  92.         mov [ebx],byte '%'
  93.         mov [ebx+1],byte 0
  94.  
  95.         pop ebx
  96.  
  97.         ;set text for progress bar
  98.         ProgressBarSetText [progress_bar],txt
  99.  
  100.         ret
  101.  
  102. ;void callback_func_delete_window(header_t *control,void *data)
  103. callback_func_delete_window:
  104.  
  105.         mov eax,[esp+4] ;control
  106.  
  107.         QuitLibGUI eax
  108.  
  109.         ret
  110.  
  111. ;int dectostr(int digit,char *str)
  112. dec_to_str:
  113.         mov eax,[esp+4];digit
  114.         mov ecx,[esp+8];string
  115.  
  116.         push ebx esi edi ;save befor use
  117.  
  118.         cmp eax,10
  119.         jl print_digit
  120.  
  121.         mov ebx,eax ;save digit
  122.         mov edi,1
  123.         mov esi,10
  124.         next_i_div:
  125.                 cdq        ;extend to edx:eax
  126.                 idiv esi   ;eax=eax/esi
  127.                 test eax,eax
  128.                 jz no_mul_ten
  129.                        imul edi,esi ;edi=edi*10
  130.                 no_mul_ten:
  131.                 mov eax,edx ;eax=eax % 10
  132.         cmp eax,esi
  133.         jae next_i_div
  134.  
  135.         test eax,eax
  136.         jnz no_multyple_10
  137.                 ;print digit in string
  138.                 mov [ecx],byte '1'
  139.                 inc ecx
  140.                 mov eax,ebx ;eax=digit
  141.                 next_i_str_:
  142.                         cdq         ;extend to edx:eax
  143.                         idiv edi    ;eax=eax/edi
  144.  
  145.                         mov [ecx],byte '0'
  146.  
  147.                         inc ecx
  148.                         mov eax,edx ;eax=eax % edi
  149.                 cmp eax,10
  150.                 jae next_i_str_
  151.                 dec ecx
  152.         jmp exit_multyple
  153.         no_multyple_10:
  154.                 ;print digit in string
  155.                 mov eax,ebx ;eax=digit
  156.                 next_i_str:
  157.                         cdq         ;extend to edx:eax
  158.                         idiv edi    ;eax=eax/edi
  159.  
  160.                         add al,byte '0' ;al='0'+digit
  161.                         mov [ecx],byte al
  162.  
  163.                         inc ecx
  164.                         mov eax,edx ;eax=eax % edi
  165.                 cmp eax,10
  166.                 jae next_i_str
  167.         print_digit:
  168.  
  169.         add al,byte '0'
  170.         mov [ecx],byte al
  171.  
  172.         exit_multyple:
  173.         mov eax,ecx
  174.  
  175.         pop edi esi ebx
  176.  
  177.         sub eax,[esp+8] ;number of printed simbols
  178.         inc eax
  179.  
  180.         ret 8
  181.  
  182. align 4
  183. ;----------------data-----------------
  184. txt             db 'PROGRESS ',0,0,0,0,0,0
  185. pbdata          gui_progress_bar_data_t
  186. window          rd 1
  187. progress_bar    rd 1
  188. progress        rd 1
  189. increment       rd 1
  190. digit           rd 1
  191. i_end: