Subversion Repositories Kolibri OS

Rev

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