Subversion Repositories Kolibri OS

Rev

Rev 8993 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;*****************************************************************************
  2. ; Color Dialog - for Kolibri OS
  3. ; Copyright (c) 2013, Marat Zakiyanov aka Mario79, aka Mario
  4. ; All rights reserved.
  5. ;
  6. ; Redistribution and use in source and binary forms, with or without
  7. ; modification, are permitted provided that the following conditions are met:
  8. ;        * Redistributions of source code must retain the above copyright
  9. ;          notice, this list of conditions and the following disclaimer.
  10. ;        * Redistributions in binary form must reproduce the above copyright
  11. ;          notice, this list of conditions and the following disclaimer in the
  12. ;          documentation and/or other materials provided with the distribution.
  13. ;        * Neither the name of the <organization> nor the
  14. ;          names of its contributors may be used to endorse or promote products
  15. ;          derived from this software without specific prior written permission.
  16. ;
  17. ; THIS SOFTWARE IS PROVIDED BY Marat Zakiyanov ''AS IS'' AND ANY
  18. ; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  19. ; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  20. ; DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
  21. ; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  22. ; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  23. ; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  24. ; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25. ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  26. ; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27. ;*****************************************************************************
  28. ;---------------------------------------------------------------------
  29. ;Some documentation for memory
  30. ;
  31. ;area name db 'FFFFFFFF_color_dialog',0 ; FFFFFFFF = PID
  32. ;
  33. ; communication area data
  34. ; flag  ; +0
  35. ; dw 0   ; 0 - empty, 1 - OK, color selected
  36. ;          2 - use another method/not found program, 3 - cancel
  37. ;
  38. ; type of dialog:  0-Palette&Tone
  39. ; dw 0 ; +2
  40. ;
  41. ; window X size ; +4
  42. ; dw 0
  43. ;
  44. ; window X position ; +6
  45. ; dw 0
  46. ;
  47. ; window y size ; +8
  48. ; dw 0
  49. ;
  50. ; window Y position ; +10
  51. ; dw 0
  52. ;
  53. ; ColorDialog WINDOW SLOT ; +12
  54. ; dd 0
  55. ;
  56. ; Color type ; +16
  57. ; dd 0
  58. ;
  59. ; Color value ; +20
  60. ; dd 0
  61.  
  62. ; First start flag ; +24
  63. ; dd 0 ; 0 - first start, 1 - subsequent starts
  64. ;
  65. ; Old colors ; +28
  66. ; rd 10
  67. ;
  68. ; Free area ; +68
  69. ;---------------------------------------------------------------------
  70.   use32
  71.   org    0
  72.   db     'MENUET01'
  73.   dd     1, START, IM_END, I_END, stacktop, param, path
  74. ;---------------------------------------------------------------------
  75. include '../../macros.inc'
  76. include '../../proc32.inc'
  77. include '../../KOSfuncs.inc'
  78. include '../../load_lib.mac'
  79. include '../../develop/libraries/box_lib/trunk/box_lib.mac'
  80. ;include 'lang.inc'
  81. ;include '../../debug.inc'
  82. @use_library
  83. ;---------------------------------------------------------------------
  84. p_start_x = 10
  85. p_start_y = 10
  86.  
  87. p_size_x = 20
  88. p_size_y = 256
  89. ;--------------------------------------
  90. t_start_x = 40
  91. t_start_y = 10
  92. ;--------------------------------------
  93. w_start_x = 200
  94. w_start_y = 200
  95.  
  96. w_size_x = 400
  97. w_size_y = 350
  98. ;--------------------------------------
  99. c_start_x = t_start_x + p_size_y + 10
  100. c_start_y = 10
  101.  
  102. c_size_x = 27
  103. c_size_y = 20
  104. ed_size_x = 53
  105. ;---------------------------------------------------------------------
  106. x_minimal_size equ 350
  107. y_minimal_size equ 250
  108. ;---------------------------------------------------------------------
  109. START:
  110.         mcall   SF_SYS_MISC,SSF_HEAP_INIT
  111.         ;mcall  SF_KEYBOARD,SSF_SET_INPUT_MODE,1
  112.         mcall   SF_SET_EVENTS_MASK,EVM_REDRAW+EVM_KEY+\
  113.                 EVM_BUTTON+EVM_MOUSE+EVM_MOUSE_FILTER
  114. ;--------------------------------------
  115. load_libraries  l_libs_start,end_l_libs
  116.         test    eax,eax
  117.         jnz     button.exit_2
  118. ;--------------------------------------
  119.         call    get_communication_area
  120.         call    get_active_pocess
  121.         call    clear_colors_history
  122.         xor     eax,eax
  123.         mov     al,p_size_x
  124.         mov     [palette_SIZE_X],eax
  125.         mov     ax,p_size_y
  126.         mov     [palette_SIZE_Y],eax
  127.         mov     [tone_SIZE_X],eax
  128.         mov     [tone_SIZE_Y],eax
  129.        
  130.         ;set the last used color as a current one
  131.         mov     eax,[communication_area]
  132.         add     eax,28
  133.         mov     eax,[eax]
  134.         mov     [selected_color],eax
  135.         mov     [tone_color],eax
  136.         call    prepare_scrollbars_position_from_color
  137. ;--------------------------------------
  138.         mov     ecx,[palette_SIZE_Y]
  139.         imul    ecx,[palette_SIZE_X]
  140.         lea     ecx,[ecx*3]
  141.         inc     ecx     ;reserve for stosd
  142.         mcall   SF_SYS_MISC,SSF_MEM_ALLOC
  143.         mov     [palette_area],eax
  144. ;--------------------------------------
  145.         call    create_palette
  146. ;--------------------------------------
  147.         mov     ecx,[tone_SIZE_Y]
  148.         imul    ecx,[tone_SIZE_X]
  149.         lea     ecx,[ecx*3]
  150.         inc     ecx     ;reserve for stosd
  151.         mcall   SF_SYS_MISC,SSF_MEM_ALLOC
  152.         mov     [tone_area],eax
  153. ;--------------------------------------
  154.         call    create_tone
  155. ;---------------------------------------------------------------------
  156. align 4
  157. red:
  158.         call    draw_window
  159. ;---------------------------------------------------------------------
  160. align 4
  161. still:
  162.         mcall   SF_WAIT_EVENT
  163.  
  164.         cmp     eax,1
  165.         je      red
  166.  
  167.         cmp     eax,2
  168.         je      key
  169.  
  170.         cmp     eax,3
  171.         je      button
  172.  
  173.         cmp     eax,6
  174.         je      mouse
  175.  
  176.         jmp     still
  177. ;---------------------------------------------------------------------
  178. align 4
  179. button:
  180.         mcall   SF_GET_BUTTON
  181.  
  182.         cmp     ah, 2
  183.         je      palette_button
  184.  
  185.         cmp     ah, 3
  186.         je      tone_button
  187.  
  188.         cmp     ah, 4
  189.         je      color_button
  190.  
  191.         cmp     ah, 30
  192.         jb      @f
  193.  
  194.         cmp     ah, 39
  195.         ja      @f
  196.  
  197.         sub     ah,30
  198.        
  199.         ;click on a colors History
  200.         movzx   eax,ah
  201.         shl     eax,2
  202.         add     eax,[communication_area]
  203.         add     eax,28
  204.         mov     eax,[eax]
  205.         mov     [selected_color],eax
  206.         call    prepare_scrollbars_position_from_color
  207.         call    draw_selected_color
  208.         call    draw_scrollbars
  209.         jmp     still
  210. ;--------------------------------------
  211. align 4
  212. @@:
  213.         cmp     ah, 1
  214.         jne     still
  215. ;--------------------------------------
  216. align 4
  217. .exit:
  218.         mov     eax,[communication_area]
  219.         mov     [eax],word 3
  220.         jmp     @f
  221. ; dps "CD flag value: cancel "
  222. ;--------------------------------------
  223. align 4
  224. .exit_1:
  225. ;--------------------------------------
  226.         call    scroll_colors_history
  227. ;--------------------------------------
  228. align 4
  229. @@:
  230. ;       mov     ax,[eax]
  231. ;       and     eax,0xffff
  232. ; dps "CD flag value: "
  233. ; dpd eax
  234. ; newline
  235.  
  236.         call    get_window_param
  237.         mov     ebx,[communication_area]
  238.         mov     ecx,procinfo
  239. ;       mov     eax,[window_x]
  240.         mov     eax,[ecx+process_information.box.left]
  241.         shl     eax,16
  242.         add     eax,[ecx+process_information.box.width]
  243.         mov     [ebx+4],eax
  244. ;       mov     eax,[window_y]
  245.         mov     eax,[ecx+process_information.box.top]
  246.         shl     eax,16
  247.         add     eax,[ecx+process_information.box.height]
  248.         mov     [ebx+8],eax
  249. ;--------------------------------------
  250. align 4
  251. .exit_2:
  252.         mcall   SF_TERMINATE_PROCESS
  253. ;---------------------------------------------------------------------
  254. align 4
  255. get_window_param:
  256.         mcall   SF_THREAD_INFO,procinfo,-1
  257.         mov     eax,[ebx+process_information.client_box.height]
  258.         inc     eax
  259. ;       mov     [window_high],eax
  260.         mov     eax,[ebx+process_information.client_box.width]
  261.         inc     eax
  262. ;       mov     [window_width],eax
  263.         mov     eax,dword[ebx+process_information.wnd_state]
  264. ;       mov     [window_status],eax
  265.         ret
  266. ;---------------------------------------------------------------------
  267. align 4
  268. get_communication_area:
  269.         movzx   eax,byte[param]
  270.         test    eax,eax
  271.         jz      @f
  272.         mcall   SF_SYS_MISC,SSF_MEM_OPEN,param,,0x01
  273.         mov     [communication_area],eax
  274. ;       movzx   ebx,word [eax+2]
  275. ;       mov     [color_dialog_type],ebx
  276.  
  277.         mov     ebx,[eax+4]
  278. ;       cmp     bx,word x_minimal_size ;300
  279. ;       jb      @f
  280.         mov     bx,510
  281.         mov     [window_x],ebx
  282.         mov     ebx,[eax+8]
  283. ;       cmp     bx,word y_minimal_size ;200
  284. ;       jb      @f
  285.         mov     bx,340
  286.         mov     [window_y],ebx
  287. @@:
  288.         ret
  289. ;---------------------------------------------------------------------
  290. align 4
  291. get_active_pocess:
  292.         mcall   SF_THREAD_INFO,procinfo,-1
  293.         mov     ecx,[ebx+process_information.PID]
  294.         mcall   SF_SYSTEM,SSF_GET_THREAD_SLOT
  295.         mov     [active_process],eax    ; WINDOW SLOT
  296.         mov     ebx,[communication_area]
  297.         test    ebx,ebx
  298.         jz      .1
  299.         mov     [ebx+12],eax    ; WINDOW SLOT to com. area
  300. .1:
  301.         ret
  302. ;---------------------------------------------------------------------
  303. align 4
  304. clear_colors_history:
  305.         mov     edi,[communication_area]
  306.         cmp     [edi+24],dword 1
  307.         je      @f
  308.         mov     [edi+24],dword 1
  309.         add     edi,28
  310.         mov     ecx,10
  311.         cld
  312.         mov     eax,0x06BEEE
  313.         rep     stosd
  314. @@:
  315.         ret
  316. ;---------------------------------------------------------------------
  317. align 4
  318. scroll_colors_history:
  319.         mov     edi,[communication_area]
  320.         add     edi,28
  321.         mov     eax,[selected_color]
  322.         cmp     [edi],eax
  323.         je      @f
  324.         mov     ecx,9
  325.         mov     esi,edi
  326.         add     esi,32
  327.         add     edi,36
  328.         std
  329.         rep     movsd
  330.         mov     edi,[communication_area]
  331.         mov     [edi+28],eax
  332. @@:
  333.         ret
  334. ;---------------------------------------------------------------------
  335. align 4
  336. palette_button:
  337.         mcall   SF_MOUSE_GET,SSF_WINDOW_POSITION
  338.         and     eax,0xffff
  339.         sub     eax,p_start_y
  340.         imul    eax,p_size_x
  341.         lea     eax,[eax+eax*2]
  342.         add     eax,[palette_area]
  343.         mov     eax,[eax]
  344.         mov     [tone_color],eax
  345.         mov     [selected_color],eax
  346.         call    prepare_scrollbars_position_from_color
  347.         call    create_and_draw_tone
  348.         call    draw_selected_color
  349.         call    draw_scrollbars
  350.         jmp     still
  351. ;---------------------------------------------------------------------
  352. align 4
  353. tone_button:
  354.         mcall   SF_MOUSE_GET,SSF_WINDOW_POSITION
  355.         mov     ebx,eax
  356.         and     eax,0xffff
  357.         shr     ebx,16
  358.         sub     eax,t_start_y
  359.         imul    eax,p_size_y
  360.         sub     ebx,t_start_x
  361.         add     eax,ebx
  362.         lea     eax,[eax+eax*2]
  363.         add     eax,[tone_area]
  364.         mov     eax,[eax]
  365.         mov     [selected_color],eax
  366.         call    prepare_scrollbars_position_from_color
  367.         call    draw_selected_color
  368.         call    draw_scrollbars
  369.         jmp     still
  370. ;---------------------------------------------------------------------
  371. align 4
  372. color_button:
  373.         mov     eax,[communication_area]
  374.         mov     [eax],word 1
  375.         mov     ebx,[selected_color]
  376.         and     ebx,0xffffff
  377.         mov     [eax+20],ebx
  378. ; dps "CD flag value: OK "
  379.         jmp     button.exit_1
  380. ;---------------------------------------------------------------------
  381. align 4
  382. prepare_scrollbars_position_from_color:
  383. ; in: eax = selected color
  384.         movzx   ebx,al
  385.         inc bl
  386.         neg bl
  387.         mov     [scroll_bar_data_blue.position],ebx
  388.         shr     eax,8
  389.         mov     bl,al
  390.         inc bl
  391.         neg bl
  392.         mov     [scroll_bar_data_green.position],ebx
  393.         shr     eax,8
  394.         mov     bl,al
  395.         inc bl
  396.         neg bl
  397.         mov     [scroll_bar_data_red.position],ebx
  398.         ret
  399. ;---------------------------------------------------------------------
  400. align 4
  401. prepare_color_from_scrollbars_position:
  402. ; out: ebx = selected color
  403.         mov     eax,[scroll_bar_data_red.position]
  404.         inc al
  405.         neg al
  406.         movzx   ebx,al
  407.         shl     ebx,8
  408.         mov     eax,[scroll_bar_data_green.position]
  409.         inc al
  410.         neg al
  411.         mov     bl,al
  412.         shl     ebx,8
  413.         mov     eax,[scroll_bar_data_blue.position]
  414.         inc al
  415.         neg al
  416.         mov     bl,al
  417.         ret
  418. ;---------------------------------------------------------------------
  419. align 4
  420. key:
  421.         mcall   SF_GET_KEY
  422.        
  423.         test word[edit1.flags],10b ;ed_focus
  424.         jne @f
  425.         cmp     ah,027  ; Esc
  426.         je      button.exit
  427.         jmp still
  428. @@:
  429.         stdcall [edit_box_key], edit1
  430.         stdcall conv_str_to_int, [edit1.text]
  431.         cmp [selected_color],eax
  432.         je still
  433.         mov     [selected_color],eax
  434.         call    prepare_scrollbars_position_from_color
  435.         ;call   draw_selected_color
  436.         mcall   SF_DRAW_RECT,<c_start_x,c_size_x>,<c_start_y,c_size_y>,[selected_color]
  437.         call    draw_scrollbars
  438.         jmp     still
  439. ;---------------------------------------------------------------------
  440. align 4
  441. mouse:
  442.         cmp     [scroll_bar_data_red.delta2],0
  443.         jne     .red
  444.         cmp     [scroll_bar_data_green.delta2],0
  445.         jne     .green
  446.         cmp     [scroll_bar_data_blue.delta2],0
  447.         jne     .blue
  448. ;--------------------------------------
  449. align 4
  450. .red:
  451.         stdcall [scrollbar_ver_mouse], scroll_bar_data_red
  452.         cmp     [scroll_bar_data_red.delta2],0
  453.         jne     @f
  454. ;--------------------------------------
  455. align 4
  456. .green:
  457.         stdcall [scrollbar_ver_mouse], scroll_bar_data_green
  458.         cmp     [scroll_bar_data_green.delta2],0
  459.         jne     @f
  460. ;--------------------------------------
  461. align 4
  462. .blue:
  463.         stdcall [scrollbar_ver_mouse], scroll_bar_data_blue
  464.         cmp     [scroll_bar_data_blue.delta2],0
  465.         jne     @f
  466. ;--------------------------------------
  467. align 4
  468. @@:
  469.         stdcall [edit_box_mouse], edit1
  470.         call    prepare_color_from_scrollbars_position
  471.         cmp     [selected_color],ebx
  472.         je      still
  473.         mov     [selected_color],ebx
  474.         call    draw_selected_color
  475.         jmp     still
  476. ;---------------------------------------------------------------------
  477. align 4
  478. draw_selected_color:
  479.         mcall   SF_DRAW_RECT,<c_start_x,c_size_x>,<c_start_y,c_size_y>,[selected_color]
  480.         stdcall hex_in_str, sz_0x,[selected_color],6
  481.         mov byte[sz_0x+6],0
  482.         stdcall [edit_box_set_text],edit1,sz_0x
  483.         stdcall [edit_box_draw],edit1
  484.         ret
  485. ;---------------------------------------------------------------------
  486. align 4
  487. create_and_draw_tone:
  488.         call    create_tone
  489.         call    draw_tone
  490.         ret
  491. ;---------------------------------------------------------------------
  492. align 4
  493. draw_tone:
  494.         mcall   SF_PUT_IMAGE_EXT,[tone_area],<[tone_SIZE_X],[tone_SIZE_Y]>,<t_start_x,t_start_y>,24
  495.         ret
  496. ;---------------------------------------------------------------------
  497. align 4
  498. draw_scrollbars:
  499.         stdcall [scrollbar_ver_draw], scroll_bar_data_red
  500.         stdcall [scrollbar_ver_draw], scroll_bar_data_green
  501.         stdcall [scrollbar_ver_draw], scroll_bar_data_blue
  502.         ret
  503. ;---------------------------------------------------------------------
  504. align 4
  505. draw_history_frame:
  506.         mov     [frame_data.x],dword (c_start_x+c_size_x+ed_size_x+10*2)*65536+80
  507.         mov     [frame_data.y],dword (p_start_y+5)*65536+(p_size_y-5)
  508.  
  509.         mov     [frame_data.draw_text_flag],dword 1
  510.  
  511.         mov     [frame_data.text_pointer],dword history_text
  512.         stdcall [Frame_draw], frame_data
  513.         ret
  514. ;---------------------------------------------------------------------
  515. align 4
  516. draw_button_row:
  517.         mov     edx,0x60000000 + 30             ; BUTTON ROW
  518. ;       mov     ebx,220*65536+14
  519.         mov     ebx,(c_start_x+c_size_x+ed_size_x+10*3)*65536+14
  520.         mov     ecx,25*65536+14
  521.         mov     eax,SF_DEFINE_BUTTON
  522. ;-----------------------------------
  523. align 4
  524. .newb:
  525.         mcall
  526.         add     ecx,24*65536
  527.         inc     edx
  528.         cmp     edx,0x60000000 + 39
  529.         jbe     .newb
  530.         ret
  531. ;---------------------------------------------------------------------
  532. align 4
  533. draw_color_value:
  534.         movzx ebx,word[frame_data.x_start]
  535.         shl ebx,16
  536.         add ebx,(22 shl 16)+39
  537.         mov     ecx,28*65536+11
  538.         mov     edx,0xffffff
  539.         mov     eax,SF_DRAW_RECT
  540.         mov     edi,10
  541.         mov     esi,[communication_area]
  542.         add     esi,28
  543. ;-----------------------------------
  544. align 4
  545. @@:
  546.         mcall
  547.         pusha
  548.         lea     edx,[ebx+(2 shl 16)]
  549.         shr     ecx,16
  550.         mov     dx,cx
  551.         add     dx,2
  552.         mov     ecx,[esi]
  553.         and     ecx,0xffffff
  554.         mcall   SF_DRAW_NUMBER,0x00060100,,,0
  555.         popa
  556.  
  557.         add     ecx,24*65536
  558.         add     esi,4
  559.         dec     edi
  560.         jnz     @b
  561.  
  562.         ret
  563. ;---------------------------------------------------------------------
  564. align 4
  565. draw_colours:
  566.         mov     edi,10
  567.         mov     esi,[communication_area]
  568.         add     esi,28
  569. ;       mov     ebx,220*65536+14
  570.         mov     ebx,(c_start_x+c_size_x+ed_size_x+10*3)*65536+14
  571.         mov     ecx,27*65536+14
  572.         mov     eax,SF_DRAW_RECT
  573.         mov     [frame_data.draw_text_flag],dword 0
  574. ;--------------------------------------
  575. align 4
  576. newcol:
  577.         mov     edx,[esi]
  578.         mcall
  579.  
  580.         push    ebx ecx
  581.  
  582.         sub     ebx,2 shl 16
  583.         add     bx,4
  584.         sub     ecx,2 shl 16
  585.         add     cx,4
  586.  
  587.         mov     [frame_data.x],ebx
  588.         mov     [frame_data.y],ecx
  589.  
  590.         stdcall [Frame_draw], frame_data
  591.  
  592.         pop     ecx ebx
  593.  
  594.         add     ecx,24*65536
  595.         add     esi,4
  596.  
  597.         dec     edi
  598.         jnz     newcol
  599.  
  600.         ret
  601. ;----------------------------------------------------------------------
  602. align 4
  603. draw_window:
  604.         mcall   SF_REDRAW,SSF_BEGIN_DRAW
  605. ;       mcall   SF_CREATE_WINDOW, <w_start_x,w_size_x>, <w_start_y,w_size_y>, 0x33AABBCC,,title
  606.         xor     esi,esi
  607.         mcall   SF_CREATE_WINDOW,[window_x],[window_y], 0x34EEEeee,,title
  608.         mcall   SF_DEFINE_BUTTON,<p_start_x,[palette_SIZE_X]>,<p_start_y,[palette_SIZE_Y]>,0x60000002
  609.         mcall   ,<t_start_x,[tone_SIZE_X]>,<t_start_y,[tone_SIZE_Y]>,0x60000003
  610.         mcall   ,<296,80>,<280,22>,4,0x37A4D4
  611.         mcall   ,<402,80>,        ,1
  612.         mcall   SF_DRAW_TEXT,<332,289>,0x802C7B9E,OK_Cancel
  613.         mcall   ,<331,288>,0x80FFFfff
  614.         xor     ebp,ebp
  615.         mcall   SF_PUT_IMAGE_EXT,[palette_area],<[palette_SIZE_X],[palette_SIZE_Y]>,<p_start_x,p_start_y>,24
  616.         call    draw_tone
  617.         call    draw_selected_color
  618.         xor     eax,eax
  619.         inc     eax
  620.         mov     [scroll_bar_data_red.all_redraw],eax
  621.         mov     [scroll_bar_data_green.all_redraw],eax
  622.         mov     [scroll_bar_data_blue.all_redraw],eax
  623.         call    draw_scrollbars
  624.         call    draw_history_frame
  625.         call    draw_button_row
  626.         call    draw_colours
  627.         call    draw_color_value
  628.         mcall   SF_REDRAW,SSF_END_DRAW
  629.         ret
  630. ;---------------------------------------------------------------------
  631. align 4
  632. proc hex_in_str, buf:dword,val:dword,zif:dword
  633. pushad
  634.         mov edi,[buf]
  635.         mov ecx,[zif]
  636.         add edi,ecx
  637.         dec edi
  638.         mov ebx,[val]
  639.  
  640.         .cycle:
  641.                 mov al,bl
  642.                 and al,0xf
  643.                 cmp al,10
  644.                 jl @f
  645.                         add al,'A'-'0'-10
  646.                 @@:
  647.                 add al,'0'
  648.                 mov byte[edi],al
  649.                 dec edi
  650.                 shr ebx,4
  651.         loop .cycle
  652. popad
  653.         ret
  654. endp
  655. ;---------------------------------------------------------------------
  656. ;input:
  657. ; buf - pointer to a hexadecimal string
  658. ;output:
  659. ; eax - number
  660. align 4
  661. proc conv_str_to_int uses ebx ecx esi, buf:dword
  662.         xor eax,eax
  663.         xor ebx,ebx
  664.         mov esi,[buf]
  665.  
  666.         .cycle_16:
  667.                 mov bl,byte[esi]
  668.                 cmp bl,'0'
  669.                 jl @f
  670.                 cmp bl,'f'
  671.                 jg @f
  672.                 cmp bl,'9'
  673.                 jle .us1
  674.                         cmp bl,'A'
  675.                         jl @f ;skip the chars not in between '9' and 'A'
  676.                 .us1: ;составное условие
  677.                 cmp bl,'F'
  678.                 jle .us2
  679.                         cmp bl,'a'
  680.                         jl @f ;skip the chars not in between 'F' and 'a'
  681.                         sub bl,32 ;convert symbols to uppercase for convenience
  682.                 .us2: ;составное условие
  683.                         sub bl,'0'
  684.                         cmp bl,9
  685.                         jle .cor1
  686.                                 sub bl,7 ;convert 'A' to '10'
  687.                         .cor1:
  688.                         shl eax,4
  689.                         add eax,ebx
  690.                         inc esi
  691.                         jmp .cycle_16
  692.         @@:
  693.         cmp ecx,0 ;if the number is negative
  694.         jne @f
  695.                 sub ecx,eax
  696.                 mov eax,ecx
  697.         @@:
  698.         ret
  699. endp
  700. ;---------------------------------------------------------------------
  701. include 'palette.inc'
  702. ;---------------------------------------------------------------------
  703. include 'tone.inc'
  704. ;---------------------------------------------------------------------
  705. include 'i_data.inc'
  706. ;---------------------------------------------------------------------
  707. IM_END:
  708. ;---------------------------------------------------------------------
  709. include 'u_data.inc'
  710. ;---------------------------------------------------------------------
  711. I_END:
  712. ;---------------------------------------------------------------------
  713.