Subversion Repositories Kolibri OS

Rev

Rev 8288 | Rev 8996 | 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.         ;mov     ah,0
  160.         ;jmp     button.history_click
  161. ;---------------------------------------------------------------------
  162. align 4
  163. still:
  164.         mcall   SF_WAIT_EVENT
  165.  
  166.         cmp     eax,1
  167.         je      red
  168.  
  169.         cmp     eax,2
  170.         je      key
  171.  
  172.         cmp     eax,3
  173.         je      button
  174.  
  175.         cmp     eax,6
  176.         je      mouse
  177.  
  178.         jmp     still
  179. ;---------------------------------------------------------------------
  180. align 4
  181. button:
  182.         mcall   SF_GET_BUTTON
  183.  
  184.         cmp     ah, 2
  185.         je      palette_button
  186.  
  187.         cmp     ah, 3
  188.         je      tone_button
  189.  
  190.         cmp     ah, 4
  191.         je      color_button
  192.  
  193.         cmp     ah, 30
  194.         jb      @f
  195.  
  196.         cmp     ah, 39
  197.         ja      @f
  198.  
  199.         sub     ah,30
  200.        
  201. .history_click:
  202.         movzx   eax,ah
  203.         shl     eax,2
  204.         add     eax,[communication_area]
  205.         add     eax,28
  206.         mov     eax,[eax]
  207.         mov     [selected_color],eax
  208.         call    prepare_scrollbars_position_from_color
  209.         call    draw_selected_color
  210.         call    draw_scrollbars
  211.         jmp     still
  212. ;--------------------------------------
  213. align 4
  214. @@:
  215.         cmp     ah, 1
  216.         jne     still
  217. ;--------------------------------------
  218. align 4
  219. .exit:
  220.         mov     eax,[communication_area]
  221.         mov     [eax],word 3
  222.         jmp     @f
  223. ; dps "CD flag value: cancel "
  224. ;--------------------------------------
  225. align 4
  226. .exit_1:
  227. ;--------------------------------------
  228.         call    scroll_colors_history
  229. ;--------------------------------------
  230. align 4
  231. @@:
  232. ;       mov     ax,[eax]
  233. ;       and     eax,0xffff
  234. ; dps "CD flag value: "
  235. ; dpd eax
  236. ; newline
  237.  
  238.         call    get_window_param
  239.         mov     ebx,[communication_area]
  240.         mov     ecx,procinfo
  241. ;       mov     eax,[window_x]
  242.         mov     eax,[ecx+process_information.box.left]
  243.         shl     eax,16
  244.         add     eax,[ecx+process_information.box.width]
  245.         mov     [ebx+4],eax
  246. ;       mov     eax,[window_y]
  247.         mov     eax,[ecx+process_information.box.top]
  248.         shl     eax,16
  249.         add     eax,[ecx+process_information.box.height]
  250.         mov     [ebx+8],eax
  251. ;--------------------------------------
  252. align 4
  253. .exit_2:
  254.         mcall   SF_TERMINATE_PROCESS
  255. ;---------------------------------------------------------------------
  256. align 4
  257. get_window_param:
  258.         mcall   SF_THREAD_INFO,procinfo,-1
  259.         mov     eax,[ebx+process_information.client_box.height]
  260.         inc     eax
  261. ;       mov     [window_high],eax
  262.         mov     eax,[ebx+process_information.client_box.width]
  263.         inc     eax
  264. ;       mov     [window_width],eax
  265.         mov     eax,dword[ebx+process_information.wnd_state]
  266. ;       mov     [window_status],eax
  267.         ret
  268. ;---------------------------------------------------------------------
  269. align 4
  270. get_communication_area:
  271.         movzx   eax,byte[param]
  272.         test    eax,eax
  273.         jz      @f
  274.         mcall   SF_SYS_MISC,SSF_MEM_OPEN,param,,0x01
  275.         mov     [communication_area],eax
  276. ;       movzx   ebx,word [eax+2]
  277. ;       mov     [color_dialog_type],ebx
  278.  
  279.         mov     ebx,[eax+4]
  280. ;       cmp     bx,word x_minimal_size ;300
  281. ;       jb      @f
  282.         mov     bx,510
  283.         mov     [window_x],ebx
  284.         mov     ebx,[eax+8]
  285. ;       cmp     bx,word y_minimal_size ;200
  286. ;       jb      @f
  287.         mov     bx,340
  288.         mov     [window_y],ebx
  289. @@:
  290.         ret
  291. ;---------------------------------------------------------------------
  292. align 4
  293. get_active_pocess:
  294.         mcall   SF_THREAD_INFO,procinfo,-1
  295.         mov     ecx,[ebx+process_information.PID]
  296.         mcall   SF_SYSTEM,SSF_GET_THREAD_SLOT
  297.         mov     [active_process],eax    ; WINDOW SLOT
  298.         mov     ebx,[communication_area]
  299.         test    ebx,ebx
  300.         jz      .1
  301.         mov     [ebx+12],eax    ; WINDOW SLOT to com. area
  302. .1:
  303.         ret
  304. ;---------------------------------------------------------------------
  305. align 4
  306. clear_colors_history:
  307.         mov     edi,[communication_area]
  308.         cmp     [edi+24],dword 1
  309.         je      @f
  310.         mov     [edi+24],dword 1
  311.         add     edi,28
  312.         mov     ecx,10
  313.         cld
  314.         mov     eax,0x06BEEE
  315.         rep     stosd
  316. @@:
  317.         ret
  318. ;---------------------------------------------------------------------
  319. align 4
  320. scroll_colors_history:
  321.         mov     edi,[communication_area]
  322.         add     edi,28
  323.         mov     eax,[selected_color]
  324.         cmp     [edi],eax
  325.         je      @f
  326.         mov     ecx,9
  327.         mov     esi,edi
  328.         add     esi,32
  329.         add     edi,36
  330.         std
  331.         rep     movsd
  332.         mov     edi,[communication_area]
  333.         mov     [edi+28],eax
  334. @@:
  335.         ret
  336. ;---------------------------------------------------------------------
  337. align 4
  338. palette_button:
  339.         mcall   SF_MOUSE_GET,SSF_WINDOW_POSITION
  340.         and     eax,0xffff
  341.         sub     eax,p_start_y
  342.         imul    eax,p_size_x
  343.         lea     eax,[eax+eax*2]
  344.         add     eax,[palette_area]
  345.         mov     eax,[eax]
  346.         mov     [tone_color],eax
  347.         mov     [selected_color],eax
  348.         call    prepare_scrollbars_position_from_color
  349.         call    create_and_draw_tone
  350.         call    draw_selected_color
  351.         call    draw_scrollbars
  352.         jmp     still
  353. ;---------------------------------------------------------------------
  354. align 4
  355. tone_button:
  356.         mcall   SF_MOUSE_GET,SSF_WINDOW_POSITION
  357.         mov     ebx,eax
  358.         and     eax,0xffff
  359.         shr     ebx,16
  360.         sub     eax,t_start_y
  361.         imul    eax,p_size_y
  362.         sub     ebx,t_start_x
  363.         add     eax,ebx
  364.         lea     eax,[eax+eax*2]
  365.         add     eax,[tone_area]
  366.         mov     eax,[eax]
  367.         mov     [selected_color],eax
  368.         call    prepare_scrollbars_position_from_color
  369.         call    draw_selected_color
  370.         call    draw_scrollbars
  371.         jmp     still
  372. ;---------------------------------------------------------------------
  373. align 4
  374. color_button:
  375.         mov     eax,[communication_area]
  376.         mov     [eax],word 1
  377.         mov     ebx,[selected_color]
  378.         and     ebx,0xffffff
  379.         mov     [eax+20],ebx
  380. ; dps "CD flag value: OK "
  381.         jmp     button.exit_1
  382. ;---------------------------------------------------------------------
  383. align 4
  384. prepare_scrollbars_position_from_color:
  385. ; in: eax = selected color
  386.         movzx   ebx,al
  387.         inc bl
  388.         neg bl
  389.         mov     [scroll_bar_data_blue.position],ebx
  390.         shr     eax,8
  391.         mov     bl,al
  392.         inc bl
  393.         neg bl
  394.         mov     [scroll_bar_data_green.position],ebx
  395.         shr     eax,8
  396.         mov     bl,al
  397.         inc bl
  398.         neg bl
  399.         mov     [scroll_bar_data_red.position],ebx
  400.         ret
  401. ;---------------------------------------------------------------------
  402. align 4
  403. prepare_color_from_scrollbars_position:
  404. ; out: ebx = selected color
  405.         mov     eax,[scroll_bar_data_red.position]
  406.         inc al
  407.         neg al
  408.         movzx   ebx,al
  409.         shl     ebx,8
  410.         mov     eax,[scroll_bar_data_green.position]
  411.         inc al
  412.         neg al
  413.         mov     bl,al
  414.         shl     ebx,8
  415.         mov     eax,[scroll_bar_data_blue.position]
  416.         inc al
  417.         neg al
  418.         mov     bl,al
  419.         ret
  420. ;---------------------------------------------------------------------
  421. align 4
  422. key:
  423.         mcall   SF_GET_KEY
  424.        
  425.         test word[edit1.flags],10b ;ed_focus
  426.         jne @f
  427.         cmp     ah,027  ; Esc
  428.         je      button.exit
  429.         jmp still
  430. @@:
  431.         stdcall [edit_box_key], edit1
  432.         stdcall conv_str_to_int, [edit1.text]
  433.         cmp [selected_color],eax
  434.         je still
  435.         mov     [selected_color],eax
  436.         call    prepare_scrollbars_position_from_color
  437.         ;call   draw_selected_color
  438.         mcall   SF_DRAW_RECT,<c_start_x,c_size_x>,<c_start_y,c_size_y>,[selected_color]
  439.         call    draw_scrollbars
  440.         jmp     still
  441. ;---------------------------------------------------------------------
  442. align 4
  443. mouse:
  444.         cmp     [scroll_bar_data_red.delta2],0
  445.         jne     .red
  446.         cmp     [scroll_bar_data_green.delta2],0
  447.         jne     .green
  448.         cmp     [scroll_bar_data_blue.delta2],0
  449.         jne     .blue
  450. ;--------------------------------------
  451. align 4
  452. .red:
  453.         stdcall [scrollbar_ver_mouse], scroll_bar_data_red
  454.         cmp     [scroll_bar_data_red.delta2],0
  455.         jne     @f
  456. ;--------------------------------------
  457. align 4
  458. .green:
  459.         stdcall [scrollbar_ver_mouse], scroll_bar_data_green
  460.         cmp     [scroll_bar_data_green.delta2],0
  461.         jne     @f
  462. ;--------------------------------------
  463. align 4
  464. .blue:
  465.         stdcall [scrollbar_ver_mouse], scroll_bar_data_blue
  466.         cmp     [scroll_bar_data_blue.delta2],0
  467.         jne     @f
  468. ;--------------------------------------
  469. align 4
  470. @@:
  471.         stdcall [edit_box_mouse], edit1
  472.         call    prepare_color_from_scrollbars_position
  473.         cmp     [selected_color],ebx
  474.         je      still
  475.         mov     [selected_color],ebx
  476.         call    draw_selected_color
  477.         jmp     still
  478. ;---------------------------------------------------------------------
  479. align 4
  480. draw_selected_color:
  481.         mcall   SF_DRAW_RECT,<c_start_x,c_size_x>,<c_start_y,c_size_y>,[selected_color]
  482.         stdcall hex_in_str, sz_0x,[selected_color],6
  483.         mov byte[sz_0x+6],0
  484.         stdcall [edit_box_set_text],edit1,sz_0x
  485.         stdcall [edit_box_draw],edit1
  486.         ret
  487. ;---------------------------------------------------------------------
  488. align 4
  489. create_and_draw_tone:
  490.         call    create_tone
  491.         call    draw_tone
  492.         ret
  493. ;---------------------------------------------------------------------
  494. align 4
  495. draw_tone:
  496.         mcall   SF_PUT_IMAGE_EXT,[tone_area],<[tone_SIZE_X],[tone_SIZE_Y]>,<t_start_x,t_start_y>,24
  497.         ret
  498. ;---------------------------------------------------------------------
  499. align 4
  500. draw_scrollbars:
  501.         stdcall [scrollbar_ver_draw], scroll_bar_data_red
  502.         stdcall [scrollbar_ver_draw], scroll_bar_data_green
  503.         stdcall [scrollbar_ver_draw], scroll_bar_data_blue
  504.         ret
  505. ;---------------------------------------------------------------------
  506. align 4
  507. draw_history_frame:
  508.         mov     [frame_data.x],dword (c_start_x+c_size_x+ed_size_x+10*2)*65536+80
  509.         mov     [frame_data.y],dword (p_start_y+5)*65536+(p_size_y-5)
  510.  
  511.         mov     [frame_data.draw_text_flag],dword 1
  512.  
  513.         mov     [frame_data.text_pointer],dword history_text
  514.         stdcall [Frame_draw], frame_data
  515.         ret
  516. ;---------------------------------------------------------------------
  517. align 4
  518. draw_button_row:
  519.         mov     edx,0x60000000 + 30             ; BUTTON ROW
  520. ;       mov     ebx,220*65536+14
  521.         mov     ebx,(c_start_x+c_size_x+ed_size_x+10*3)*65536+14
  522.         mov     ecx,25*65536+14
  523.         mov     eax,SF_DEFINE_BUTTON
  524. ;-----------------------------------
  525. align 4
  526. .newb:
  527.         mcall
  528.         add     ecx,24*65536
  529.         inc     edx
  530.         cmp     edx,0x60000000 + 39
  531.         jbe     .newb
  532.         ret
  533. ;---------------------------------------------------------------------
  534. align 4
  535. draw_color_value:
  536.         movzx ebx,word[frame_data.x_start]
  537.         shl ebx,16
  538.         add ebx,(22 shl 16)+39
  539.         mov     ecx,28*65536+11
  540.         mov     edx,0xffffff
  541.         mov     eax,SF_DRAW_RECT
  542.         mov     edi,10
  543.         mov     esi,[communication_area]
  544.         add     esi,28
  545. ;-----------------------------------
  546. align 4
  547. @@:
  548.         mcall
  549.         pusha
  550.         lea     edx,[ebx+(2 shl 16)]
  551.         shr     ecx,16
  552.         mov     dx,cx
  553.         add     dx,2
  554.         mov     ecx,[esi]
  555.         and     ecx,0xffffff
  556.         mcall   SF_DRAW_NUMBER,0x00060100,,,0
  557.         popa
  558.  
  559.         add     ecx,24*65536
  560.         add     esi,4
  561.         dec     edi
  562.         jnz     @b
  563.  
  564.         ret
  565. ;---------------------------------------------------------------------
  566. align 4
  567. draw_colours:
  568.         mov     edi,10
  569.         mov     esi,[communication_area]
  570.         add     esi,28
  571. ;       mov     ebx,220*65536+14
  572.         mov     ebx,(c_start_x+c_size_x+ed_size_x+10*3)*65536+14
  573.         mov     ecx,27*65536+14
  574.         mov     eax,SF_DRAW_RECT
  575.         mov     [frame_data.draw_text_flag],dword 0
  576. ;--------------------------------------
  577. align 4
  578. newcol:
  579.         mov     edx,[esi]
  580.         mcall
  581.  
  582.         push    ebx ecx
  583.  
  584.         sub     ebx,2 shl 16
  585.         add     bx,4
  586.         sub     ecx,2 shl 16
  587.         add     cx,4
  588.  
  589.         mov     [frame_data.x],ebx
  590.         mov     [frame_data.y],ecx
  591.  
  592.         stdcall [Frame_draw], frame_data
  593.  
  594.         pop     ecx ebx
  595.  
  596.         add     ecx,24*65536
  597.         add     esi,4
  598.  
  599.         dec     edi
  600.         jnz     newcol
  601.  
  602.         ret
  603. ;----------------------------------------------------------------------
  604. align 4
  605. draw_window:
  606.         mcall   SF_REDRAW,SSF_BEGIN_DRAW
  607. ;       mcall   SF_CREATE_WINDOW, <w_start_x,w_size_x>, <w_start_y,w_size_y>, 0x33AABBCC,,title
  608.         xor     esi,esi
  609.         mcall   SF_CREATE_WINDOW,[window_x],[window_y], 0x34EEEeee,,title
  610.         mcall   SF_DEFINE_BUTTON,<p_start_x,[palette_SIZE_X]>,<p_start_y,[palette_SIZE_Y]>,0x60000002
  611.         mcall   ,<t_start_x,[tone_SIZE_X]>,<t_start_y,[tone_SIZE_Y]>,0x60000003
  612.         mcall   ,<296,80>,<280,22>,4,0x37A4D4
  613.         mcall   ,<402,80>,        ,1
  614.         mcall   SF_DRAW_TEXT,<332,289>,0x802C7B9E,OK_Cancel
  615.         mcall   ,<331,288>,0x80FFFfff
  616.         xor     ebp,ebp
  617.         mcall   SF_PUT_IMAGE_EXT,[palette_area],<[palette_SIZE_X],[palette_SIZE_Y]>,<p_start_x,p_start_y>,24
  618.         call    draw_tone
  619.         call    draw_selected_color
  620.         xor     eax,eax
  621.         inc     eax
  622.         mov     [scroll_bar_data_red.all_redraw],eax
  623.         mov     [scroll_bar_data_green.all_redraw],eax
  624.         mov     [scroll_bar_data_blue.all_redraw],eax
  625.         call    draw_scrollbars
  626.         call    draw_history_frame
  627.         call    draw_button_row
  628.         call    draw_colours
  629.         call    draw_color_value
  630.         mcall   SF_REDRAW,SSF_END_DRAW
  631.         ret
  632. ;---------------------------------------------------------------------
  633. align 4
  634. proc hex_in_str, buf:dword,val:dword,zif:dword
  635. pushad
  636.         mov edi,[buf]
  637.         mov ecx,[zif]
  638.         add edi,ecx
  639.         dec edi
  640.         mov ebx,[val]
  641.  
  642.         .cycle:
  643.                 mov al,bl
  644.                 and al,0xf
  645.                 cmp al,10
  646.                 jl @f
  647.                         add al,'A'-'0'-10
  648.                 @@:
  649.                 add al,'0'
  650.                 mov byte[edi],al
  651.                 dec edi
  652.                 shr ebx,4
  653.         loop .cycle
  654. popad
  655.         ret
  656. endp
  657. ;---------------------------------------------------------------------
  658. ;input:
  659. ; buf - pointer hexadecimal string
  660. ;output:
  661. ; eax - number
  662. align 4
  663. proc conv_str_to_int uses ebx ecx esi, buf:dword
  664.         xor eax,eax
  665.         xor ebx,ebx
  666.         mov esi,[buf]
  667.  
  668.         .cycle_16:     ;считывание 16-ричных цифр
  669.                 mov bl,byte[esi]
  670.                 cmp bl,'0'
  671.                 jl @f
  672.                 cmp bl,'f'
  673.                 jg @f
  674.                 cmp bl,'9'
  675.                 jle .us1
  676.                         cmp bl,'A'
  677.                         jl @f ;отсеиваем символы >'9' и <'A'
  678.                 .us1: ;составное условие
  679.                 cmp bl,'F'
  680.                 jle .us2
  681.                         cmp bl,'a'
  682.                         jl @f ;отсеиваем символы >'F' и <'a'
  683.                         sub bl,32 ;переводим символы в верхний регистр, для упрощения их последущей обработки
  684.                 .us2: ;составное условие
  685.                         sub bl,'0'
  686.                         cmp bl,9
  687.                         jle .cor1
  688.                                 sub bl,7 ;convert 'A' to '10'
  689.                         .cor1:
  690.                         shl eax,4
  691.                         add eax,ebx
  692.                         inc esi
  693.                         jmp .cycle_16
  694.         @@:
  695.         cmp ecx,0 ;если число отрицательное
  696.         jne @f
  697.                 sub ecx,eax
  698.                 mov eax,ecx
  699.         @@:
  700.         ret
  701. endp
  702. ;---------------------------------------------------------------------
  703. include 'palette.inc'
  704. ;---------------------------------------------------------------------
  705. include 'tone.inc'
  706. ;---------------------------------------------------------------------
  707. include 'i_data.inc'
  708. ;---------------------------------------------------------------------
  709. IM_END:
  710. ;---------------------------------------------------------------------
  711. include 'u_data.inc'
  712. ;---------------------------------------------------------------------
  713. I_END:
  714. ;---------------------------------------------------------------------
  715.