Subversion Repositories Kolibri OS

Rev

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

  1. ;*****************************************************************************
  2. ; File Browser control for Kolibri OS
  3. ; Copyright (c) 2009-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. macro   file_browser_exit
  30. {
  31. popa        
  32. ret 4
  33. }
  34. ;*****************************************************************************
  35. macro   use_file_browser
  36. {
  37. file_browser:
  38. fb_type                         equ dword [edi]         ;dword
  39. fb_size_x                       equ [edi+4]             ;word
  40. fb_start_x                      equ [edi+6]             ;word
  41. fb_size_y                       equ [edi+8]             ;word
  42. fb_start_y                      equ [edi+10]            ;word
  43. fb_icon_size_y                  equ word [edi+12]       ;word
  44. fb_icon_size_x                  equ word [edi+14]       ;word
  45. fb_line_size_x                  equ word [edi+16]       ;word
  46. fb_line_size_y                  equ word [edi+18]       ;word
  47. fb_type_size_x                  equ word [edi+20]       ;word
  48. fb_size_size_x                  equ word [edi+22]       ;word
  49. fb_date_size_x                  equ word [edi+24]       ;word
  50. fb_attributes_size_x            equ word [edi+26]       ;word
  51. fb_icon_assoc_area              equ dword [edi+28]      ;dword
  52. fb_icon_raw_area                equ dword [edi+32]      ;dword
  53. fb_resolution_raw               equ dword [edi+36]      ;dword
  54. fb_palette_raw                  equ dword [edi+40]      ;dword
  55. fb_directory_path_area          equ dword [edi+44]      ;dword
  56. fb_file_name_area               equ dword [edi+48]      ;dword
  57. fb_select_flag                  equ dword [edi+52]      ;dword
  58. fb_background_color             equ dword [edi+56]      ;dword
  59. fb_select_color                 equ dword [edi+60]      ;dword
  60. fb_seclect_text_color           equ dword [edi+64]      ;dword
  61. fb_text_color                   equ dword [edi+68]      ;dword
  62. fb_reduct_text_color            equ dword [edi+72]      ;dword
  63. fb_marked_text_color            equ dword [edi+76]      ;dword
  64. fb_max_panel_line               equ dword [edi+80]      ;dword
  65. fb_select_panel_counter         equ dword [edi+84]      ;dword
  66. fb_folder_block                 equ dword [edi+88]      ;dword
  67. fb_start_draw_line              equ dword [edi+92]      ;dword
  68. fb_start_draw_cursor_line       equ word [edi+96]       ;word
  69. fb_folder_data                  equ dword [edi+98]      ;dword
  70. fb_temp_counter                 equ dword [edi+102]     ;dword
  71. fb_file_name_length             equ dword [edi+106]     ;dword
  72. fb_marked_file                  equ dword [edi+110]     ;dword
  73. fb_extension_size               equ dword [edi+114]     ;dword
  74. fb_extension_start              equ dword [edi+118]     ;dword
  75. fb_type_table                   equ dword [edi+122]     ;dword
  76. fb_ini_file_start               equ dword [edi+126]     ;dword
  77. fb_ini_file_end                 equ dword [edi+130]     ;dword
  78. fb_draw_scroll_bar              equ dword [edi+134]     ;dword
  79. fb_font_size_y                  equ word [edi+138]      ;dword
  80. fb_font_size_x                  equ word [edi+140]      ;dword
  81. fb_mouse_keys                   equ dword [edi+142]     ;dword
  82. fb_mouse_keys_old               equ dword [edi+146]     ;dword
  83. fb_mouse_pos                    equ dword [edi+150]     ;dword
  84. fb_mouse_keys_delta             equ dword [edi+154]     ;dword
  85. fb_mouse_key_delay              equ dword [edi+158]     ;dword
  86. fb_mouse_keys_tick              equ dword [edi+162]     ;dword
  87. fb_start_draw_cursor_line_2     equ word [edi+166]      ;dword
  88. fb_all_redraw                   equ dword [edi+168]     ;dword
  89. fb_selected_BDVK_adress         equ dword [edi+172]     ;dword
  90. fb_key_action                   equ word [edi+176]      ;word
  91. fb_key_action_num               equ word [edi+178]      ;word
  92. fb_name_temp_area               equ dword [edi+180]     ;dword
  93. fb_max_name_temp_size           equ dword [edi+184]     ;dword
  94. fb_display_name_max_length      equ dword [edi+188]     ;dword
  95. fb_draw_panel_selection_flag    equ dword [edi+192]     ;dword
  96. fb_mouse_pos_old                equ dword [edi+196]     ;dword
  97. fb_marked_counter               equ dword [edi+200]     ;dword
  98. fb_keymap_pointer               equ dword [edi+204]     ;dword
  99. ;---------------------------------------------------------------------
  100. fb_draw_panel:
  101.         pusha
  102.         mov     edi,dword [esp+36]
  103.         call    fb_clear_panel
  104.         call    fb_calc_max_panel_line
  105.         call    fb_calc_folder_sysdata
  106.         call    fb_draw_panel_selection
  107.         call    fb_draw_folder_data
  108.         call    fb_prepare_selected_BDVK_adress
  109. file_browser_exit
  110. ;---------------------------------------------------------------------
  111. fb_draw_panel_1:
  112.         pusha
  113.         mov     eax,fb_select_color
  114.         push    eax
  115.         mov     eax,fb_seclect_text_color
  116.         push    eax
  117.         mov     ax,fb_start_draw_cursor_line
  118.         push    eax
  119.         mov     eax,fb_background_color
  120.         mov     fb_select_color,eax
  121.         mov     eax,fb_text_color
  122.         mov     fb_seclect_text_color,eax
  123.         mov     ax,fb_start_draw_cursor_line_2
  124.         mov     fb_start_draw_cursor_line,ax
  125.         call    fb_draw_panel_selection
  126.         pop     eax
  127.         mov     fb_start_draw_cursor_line,ax
  128.         pop     eax
  129.         mov     fb_seclect_text_color,eax
  130.         pop     eax
  131.         mov     fb_select_color,eax
  132.         call    fb_draw_panel_selection
  133.         call    fb_draw_folder_data
  134.         popa
  135.         ret
  136. ;---------------------------------------------------------------------
  137. fb_clear_panel:
  138.         cmp     fb_all_redraw,1
  139.         jne     @f
  140.         xor     eax,eax
  141.         mov     fb_max_name_temp_size,eax
  142. @@:
  143.         ret
  144. ;---------------------------------------------------------------------
  145. fb_calc_folder_sysdata:
  146.         mov     eax,fb_folder_data
  147.         mov     eax,[eax+4]
  148.         mov     fb_folder_block,eax
  149.         ret
  150. ;---------------------------------------------------------------------
  151. fb_calc_max_panel_line:
  152.         xor     eax,eax
  153.         xor     ebx,ebx
  154.         mov     ax,fb_size_y
  155.         mov     bx,fb_line_size_y
  156.         test    ebx,ebx
  157.         jnz     @f
  158.         inc     ebx
  159. @@:
  160.         xor     edx,edx
  161.         div     ebx
  162.         mov     fb_max_panel_line,eax
  163.         ret
  164. ;---------------------------------------------------------------------
  165. fb_draw_panel_selection:
  166.         cmp     fb_all_redraw,2
  167.         je      .end
  168.         mov     eax,fb_folder_block
  169.         test    eax,eax
  170.         jz      .end
  171.         xor     eax,eax
  172.         cmp     fb_select_panel_counter,eax
  173.         je      .end
  174.         mov     eax,fb_folder_block
  175.         sub     eax,fb_start_draw_line
  176.         mov     cx,fb_start_draw_cursor_line
  177.         call    fb_for_all_panel_selection
  178.         mov     eax,fb_folder_block
  179.         dec     eax
  180.         xor     edx,edx
  181.         mov     dx,fb_line_size_y
  182.         imul    eax,edx
  183.         cmp     ax,cx
  184.         jae     @f
  185.         mov     cx,ax
  186. @@:
  187.         mov     fb_start_draw_cursor_line,cx
  188.         mov     ebx,fb_size_x
  189.         add     cx,fb_start_y
  190.         shl     ecx,16
  191.         mov     cx,fb_line_size_y
  192.         mov     edx,fb_select_color
  193.         xor     eax,eax
  194.         mov     ax,fb_icon_size_x
  195.         add     eax,2
  196.         sub     ebx,eax
  197.         shl     eax,16
  198.         push    eax
  199.         add     ebx,eax
  200.         mcall   13
  201.         pop     ebx
  202.         cmp     fb_all_redraw,0
  203.         je      .end
  204.         mov     bx,fb_start_x
  205.         ror     ebx,16
  206.         mcall   13,,,fb_background_color
  207. .end:
  208.         ret
  209. ;---------------------------------------------------------------------
  210. fb_for_all_panel_selection:
  211.         xor     edx,edx
  212.         mov     dx,fb_line_size_y
  213.         imul    eax,edx
  214.         cmp     ax,cx
  215.         jae     @f
  216.         mov     cx,ax
  217. @@:
  218.         mov     eax,fb_max_panel_line
  219.         dec     eax
  220.         imul    eax,edx
  221.         cmp     ax,cx
  222.         jae     @f
  223.         mov     cx,ax
  224. @@:
  225.         ret
  226. ;---------------------------------------------------------------------
  227. fb_draw_folder_data:
  228.         mov     eax,fb_folder_block
  229.         sub     eax,fb_max_panel_line
  230.         test    eax,0x80000000
  231.         jz      .ok_left
  232.         mov     fb_start_draw_line,0
  233.         jmp     @f
  234. .ok_left:
  235.         cmp     eax,fb_start_draw_line
  236.         jae     @f
  237.         mov     fb_start_draw_line,eax
  238. @@:
  239.         mov     bx,fb_start_x
  240.         add     bx,3
  241.         add     bx,fb_icon_size_x
  242.         shl     ebx,16
  243.         mov     bx,fb_start_y
  244.         mov     edx,fb_start_draw_line
  245.         imul    edx,304
  246.         add     edx,fb_folder_data
  247.         add     edx,32+40
  248.         xor     eax,eax
  249. .start:
  250.         pusha
  251.         mov     eax,edx
  252.         sub     eax,fb_folder_data
  253.         sub     eax,32+40
  254.         xor     edx,edx
  255.         mov     ebx,304
  256.         div     ebx
  257.         cmp     eax,fb_folder_block
  258.         je      .end_1
  259.         popa
  260.         cmp     eax,fb_max_panel_line
  261.         je      .end_2
  262.         mov     fb_marked_file,0
  263.         cmp     [edx+299-40],byte 0
  264.         je      @f
  265.         mov     fb_marked_file,1
  266. @@:
  267.         call    fb_clear_line
  268.         call    fb_draw_type_size_date
  269.         cmp     fb_all_redraw,2
  270.         je      .draw_icon
  271.         cmp     fb_all_redraw,0
  272.         je      @f
  273. .draw_icon:
  274.         call    fb_draw_icon
  275. @@:
  276.         push    eax
  277.         xor     eax,eax
  278.         mov     ax,fb_size_x
  279.         push    ebx edx
  280.         xor     ebx,ebx
  281.         mov     bx,fb_font_size_x
  282.         xor     edx,edx
  283.         div     ebx
  284.         pop     edx ebx
  285.         sub     eax,23+2+2
  286.         mov     esi,fb_file_name_length
  287.         mov     fb_temp_counter,0
  288.         mov     fb_display_name_max_length,eax
  289.         cmp     esi,eax
  290.         jbe     @f
  291.         mov     esi,eax
  292.         mov     fb_temp_counter,1
  293. @@:
  294.         cmp     fb_max_name_temp_size,esi
  295.         jae     @f
  296.         mov     fb_max_name_temp_size,esi
  297.         inc     fb_max_name_temp_size
  298. @@:
  299.         mov     ecx,fb_text_color
  300.         cmp     fb_marked_file,0
  301.         je      @f
  302.         mov     ecx,fb_reduct_text_color
  303. @@:
  304.         mov     ax,fb_line_size_y
  305.         sub     ax,fb_font_size_y
  306.         push    ebx
  307.         mov     bx,ax
  308.         shr     ax,1
  309.         test    bx,1b
  310.         jz      @f
  311.         inc     ax
  312. @@:
  313.         pop     ebx
  314.         push    ebx
  315.         add     bx,ax
  316.         call    .draw_name_temp_area
  317.         cmp     fb_temp_counter,0
  318.         jz      .continue
  319.         xor     eax,eax
  320.         mov     ax,fb_font_size_x
  321.         imul    eax,fb_display_name_max_length
  322.         shl     eax,16
  323.         push    edx
  324.         add     ebx,eax
  325.         mov     esi,2
  326.         mov     ecx,fb_reduct_text_color
  327.         mov     edx,dword fb_truncated_filename_char
  328.         mcall   4
  329.         pop     edx
  330. .continue:
  331.         pop     ebx
  332.         add     bx,fb_line_size_y
  333.         add     edx,304
  334.         pop     eax
  335.         inc     eax
  336.         jmp     .start
  337. ;--------------------------------------
  338. .draw_name_temp_area:
  339.         pusha
  340.         mov     eax,fb_max_name_temp_size
  341.         add     eax,2
  342.         sub     eax,esi
  343.         mov     ecx,esi
  344.         mov     esi,edx
  345.         mov     edi,fb_name_temp_area
  346.         cld
  347.         jcxz    @f
  348.         rep     movsb
  349.         cmp     byte [edi-1],0
  350.         jnz     @f
  351.         dec     edi
  352.         inc     eax
  353. @@:
  354.         mov     ecx,eax
  355.         shr     ecx,2
  356.         mov     eax,dword '    '
  357.         rep     stosd
  358.         popa
  359.         pusha
  360.         mov     edx,fb_name_temp_area
  361.         cmp     fb_all_redraw,2
  362.         jne     @f
  363.         mov     esi,fb_max_name_temp_size
  364.         add     esi,2
  365. @@:
  366.         bts     ecx,30
  367.         mov     eax,fb_background_color
  368.         cmp     fb_draw_panel_selection_flag,1
  369.         jne     @f
  370.         mov     eax,fb_select_color
  371. @@:
  372.         mov     edi,eax
  373.         mcall   4
  374.         popa
  375.         ret
  376. ;--------------------------------------
  377. .end_1:
  378.         popa
  379. .end_2:
  380.         cmp     fb_all_redraw,1
  381.         jne     @f
  382.         mov     ax,fb_start_y
  383.         add     ax,fb_size_y
  384.         mov     cx,bx
  385.         rol     ecx,16
  386.         mov     cx,ax
  387.         mov     eax,ecx
  388.         shr     eax,16
  389.         sub     cx,ax
  390.         cmp     cx,0
  391.         jbe     @f
  392.         mov     bx,fb_size_x
  393.         ror     ebx,16
  394.         sub     bx,fb_icon_size_x
  395.         sub     bx,3
  396.         rol     ebx,16
  397.         mov     edx,fb_background_color ;0xffffff
  398.         mcall   13
  399. @@:
  400.         ret
  401. ;---------------------------------------------------------------------
  402. fb_clear_line:
  403.         mov     fb_draw_panel_selection_flag,0
  404.         pusha
  405.         shl     ebx,16
  406.         shr     ebx,16
  407.         cmp     fb_select_panel_counter,0
  408.         je      .continue
  409.         mov     ax,fb_start_draw_cursor_line
  410.         add     ax,fb_start_y
  411.         cmp     bx,ax
  412.         jne     .continue
  413.         mov     fb_draw_panel_selection_flag,1
  414.         jmp     .end
  415. .continue:
  416.         cmp     fb_all_redraw,2
  417.         je      .end
  418.         cmp     fb_all_redraw,0
  419.         je      .end
  420.         mov     ebx,[esp+16]
  421.         mov     cx,bx
  422.         rol     ecx,16
  423.         mov     cx,fb_line_size_y
  424.         mov     bx,fb_size_x
  425.         ror     ebx,16
  426.         sub     bx,fb_icon_size_x
  427.         sub     bx,3
  428.         rol     ebx,16
  429.         mov     edx,fb_background_color
  430.         mcall   13
  431. .end:
  432.         popa
  433.         ret
  434. ;---------------------------------------------------------------------
  435. fb_draw_type_size_date:
  436.         pusha
  437.         mov     eax,fb_type_table
  438.         test    [edx-40],byte 0x10
  439.         jz      .copy_type
  440.         mov     [eax],dword '<DIR'
  441.         mov     [eax+4],word '> '
  442.         mov     fb_file_name_length,0
  443.         mov     fb_extension_size,0
  444.         jmp     .start
  445. .copy_type:
  446.         mov     [eax],dword '    '
  447.         mov     [eax+4],word '  '
  448. .start:
  449.         mov     esi,edx
  450.         xor     eax,eax
  451. @@:
  452.         cld
  453.         lodsb
  454.         test    eax,eax
  455.         jnz     @b
  456.         mov     fb_file_name_length,esi
  457.         sub     fb_file_name_length,edx
  458.         mov     fb_temp_counter,esi
  459.         test    [edx-40],byte   0x10
  460.         jnz     .size
  461.         dec     esi
  462.         dec     edx
  463. @@:
  464.         std
  465.         lodsb
  466.         cmp     esi,edx
  467.         je      .extension_size_0
  468.         cmp     al,'.'
  469.         jnz     @b
  470.         add     esi,2
  471.         mov     fb_extension_start,esi
  472.         mov     ecx,fb_temp_counter
  473.         sub     ecx,esi
  474.         inc     ecx
  475.         mov     fb_extension_size,ecx
  476.         sub     fb_file_name_length,ecx
  477.         cmp     ecx,2
  478.         ja      @f
  479.         inc     fb_file_name_length
  480. @@:
  481.         sub     ecx,2
  482.         cmp     ecx,4
  483.         jbe     @f
  484.         mov     ecx,3
  485.         mov     eax,fb_type_table
  486.         mov     [eax+3],word '..'
  487. @@:
  488.         push    edi
  489.         mov     edi,fb_type_table
  490.         cld
  491.         rep     movsb
  492.         pop     edi
  493.         inc     edx
  494.         jmp     .size
  495. .extension_size_0:
  496.         inc     edx
  497.         mov     fb_extension_size,0
  498. .size:
  499.         mov     eax,fb_type_table
  500.         test    [edx-40],byte 0x10
  501.         jz      .copy_size
  502.         mov     [eax+6],dword '----'
  503.         mov     [eax+6+4],word '- '
  504.         jmp     .date
  505. ;-----------------------------------------
  506. .call_decimal_string:
  507.         mov     ebx,fb_type_table
  508.         add     ebx,6
  509.         call    fb_decimal_string_4
  510.         mov     [ebx],dl
  511.         jmp     .size_convert_end
  512. ;-----------------------------------------
  513. .copy_size:
  514. ;/0x40000000 - Gb
  515. ;/0x100000 - Mb
  516. ;/0x400 Kb
  517.         mov     [eax+6],dword '    '
  518.         mov     [eax+6+4],word '  '
  519.         push    ebx
  520.         push    edx
  521.         mov     eax,[edx-40+32]
  522.         mov     ebx,eax
  523.         shr     eax,30 ; /(1024*1024*1024)
  524.         test    eax,eax
  525.         jz      @f
  526.         mov     dl,byte 'G'
  527.         jmp     .call_decimal_string
  528. @@:
  529.         mov     eax,ebx
  530.         shr     eax,20 ; /(1024*1024)
  531.         test    eax,eax
  532.         jz      @f
  533.         mov     dl,byte 'M'
  534.         jmp     .call_decimal_string
  535. @@:
  536.         mov     eax,ebx
  537.         shr     eax,10 ; /1024
  538.         test    eax,eax
  539.         jz      @f
  540.         mov     dl,byte 'K'
  541.         jmp     .call_decimal_string
  542. @@:
  543.         mov     eax,ebx
  544.         mov     ebx,fb_type_table
  545.         add     ebx,6
  546.         call    fb_decimal_string_4
  547. .size_convert_end:
  548.         mov     eax,fb_type_table
  549.         add     eax,6
  550.         push    edi
  551.         cmp     [eax],byte '0'
  552.         jne     @f
  553.         mov     [eax],byte ' '
  554. @@:
  555.         add     eax,3
  556. @@:
  557.         cmp     [eax+1],byte ' '
  558.         jne     @f
  559.         mov     esi,eax
  560.         mov     edi,esi
  561.         inc     edi
  562.         mov     ecx,5
  563.         std
  564.         rep     movsb
  565.         jmp     @r
  566. @@:
  567.         pop     edi
  568.         pop     edx
  569.         pop     ebx
  570. ;-----------------------------------------
  571. .date:
  572.         xor     eax,eax
  573.         mov     al,[edx-40+28]
  574.         push    ebx
  575.         mov     ebx,fb_type_table
  576.         add     ebx,12
  577.         call    fb_decimal_string_2 ; day
  578.         mov     al,[edx-40+29]
  579.         mov     ebx,fb_type_table
  580.         add     ebx,12+3
  581.         call    fb_decimal_string_2 ; month
  582.         mov     ax,[edx-40+30]
  583.         mov     ebx,fb_type_table
  584.         add     ebx,12+15
  585.         call    fb_decimal_string_4 ; year
  586.         mov     ebx,fb_type_table
  587.         mov     ax,[ebx+12+15+2]
  588.         mov     [ebx+12+6],ax
  589.         pop     ebx
  590. ;-----------------------------------------
  591.         ror     ebx,16
  592.         add     bx,fb_size_x
  593.         sub     ebx,122+12+15
  594.         rol     ebx,16
  595.         mov     ecx,fb_text_color
  596.         cmp     fb_marked_file,0
  597.         je      @f
  598.         mov     ecx,fb_reduct_text_color
  599. @@:
  600.         mov     edx,fb_type_table
  601.         mov     esi,20
  602.         mov     ax,fb_line_size_y
  603.         sub     ax,fb_font_size_y
  604.         push    ebx
  605.         mov     bx,ax
  606.         shr     ax,1
  607.         test    bx,1b
  608.         jz      @f
  609.         inc     ax
  610. @@:
  611.         pop     ebx
  612.         add     bx,ax
  613.         bts     ecx,30
  614.         mov     eax,fb_background_color
  615.         cmp     fb_draw_panel_selection_flag,1
  616.         jne     @f
  617.         mov     eax,fb_select_color
  618. @@:
  619.         mov     edi,eax
  620.         mcall   4
  621.         popa
  622.         ret
  623. ;---------------------------------------------------------------------
  624. fb_draw_icon:
  625.         pusha
  626.         xor     eax,eax
  627.         mov     ax,fb_icon_size_y
  628.         mov     ebx,fb_resolution_raw
  629.         imul    eax,ebx
  630.         mov     bx,fb_icon_size_x
  631.         imul    eax,ebx
  632.         mov     ebx,eax
  633.         shr     eax,3
  634.         test    ebx,111b
  635.         jz      @f
  636.         inc     eax
  637. @@:
  638.         test    [edx-40],byte 0x10
  639.         jnz     .draw_dir_pic
  640.         call    fb_get_icon_number
  641.         imul    ebx,eax ;16*16*3
  642.         jmp     .draw
  643. .draw_dir_pic:
  644.         xor     ebx,ebx
  645.         cmp     [edx],word '..'
  646.         jne     .draw
  647.         mov     ebx,eax ;16*16*3
  648. .draw:
  649.         add     ebx,fb_icon_raw_area
  650.         mov     cx,fb_icon_size_x
  651.         shl     ecx,16
  652.         mov     cx,fb_icon_size_y
  653.         mov     edx,[esp+16]
  654.         ror     edx,16
  655.         sub     edx,2
  656.         sub     dx,fb_icon_size_x
  657.         rol     edx,16
  658.         mov     ax,fb_line_size_y
  659.         sub     ax,fb_icon_size_y
  660.         shr     ax,1
  661.         add     dx,ax
  662.         mov     esi,fb_resolution_raw
  663.         xor     ebp,ebp
  664.         push    edi
  665.         mov     edi,fb_palette_raw
  666.         mcall   65
  667.         pop     edi
  668.         popa
  669.         ret
  670. ;---------------------------------------------------------------------
  671. ; Convert of a binary number in decimal string form
  672. ; Input:
  673. ;  AX - value
  674. ;  EBX - address of string
  675. ; Output:
  676. ;  string contains the number, marked the end of the code 0
  677. fb_decimal_string_2:
  678.         push    eax ebx ecx edx
  679.         xor     ecx,ecx
  680.         mov     [ebx],byte '0'
  681.         inc     ebx
  682. .p3:
  683.         xor     edx,edx
  684.         push    ebx
  685.         mov     ebx,10
  686.         div     ebx
  687.         pop     ebx
  688.         add     edx,48
  689.         push    edx
  690.         inc     ecx
  691.         cmp     ax,0
  692.         jne     .p3
  693.         cmp     ecx,1
  694.         jbe     .p4
  695.         mov     ecx,2
  696.         dec     ebx
  697. .p4:
  698.         pop     edx
  699.         mov     [ebx],dl
  700.         inc     ebx
  701.         loop    .p4
  702.         pop     edx ecx ebx eax
  703.         ret
  704. ;---------------------------------------------------------------------
  705. fb_decimal_string_4:
  706.         push    eax ecx edx
  707.         xor     ecx,ecx
  708.         mov     [ebx],byte '0'
  709.         inc     ebx
  710. .p3:
  711.         xor     edx,edx
  712.         push    ebx
  713.         mov     ebx,10
  714.         div     ebx
  715.         pop     ebx
  716.         add     edx,48
  717.         push    edx
  718.         inc     ecx
  719.         cmp     eax,0
  720.         jne     .p3
  721.         cmp     ecx,3
  722.         jbe     .p4
  723.         mov     ecx,4
  724.         dec     ebx
  725. .p4:
  726.         pop     edx
  727.         mov     [ebx],dl
  728.         inc     ebx
  729.         loop    .p4
  730.         pop     edx ecx eax
  731.         ret
  732. ;---------------------------------------------------------------------
  733. fb_get_icon_number:
  734.         push    eax
  735.         mov     ebp,fb_extension_size
  736.         test    ebp,ebp
  737.         je      .end
  738.         dec     ebp
  739.         test    ebp,ebp
  740.         je      .end
  741.         dec     ebp
  742.         test    ebp,ebp
  743.         je              .end
  744. @@:
  745.         mov     edx,fb_ini_file_end
  746.         sub     edx,ebp
  747.         mov     eax,fb_ini_file_start
  748.         dec     eax
  749. .search_association:
  750.         cmp     edx,eax
  751.         jbe     .end
  752.         mov     esi,fb_extension_start
  753.         inc     eax
  754.         mov     ecx,eax
  755.         mov     ebx,eax
  756.         cld
  757. .check:
  758.         lodsb
  759.         test    al,al
  760.         jz      @f
  761.         call    fb_char_toupper
  762.         shl     ax,8
  763. .search_start_of_line:
  764.         mov     al,[ebx]
  765.         inc     ebx
  766.         call    fb_char_toupper
  767.         cmp     al,ah
  768.         je      .check
  769.         mov     eax,ecx
  770.         jmp     .search_association
  771. @@:
  772.         mov     esi,ecx
  773.         add     esi,ebp
  774.         lodsb
  775.         cmp     al,byte '='
  776.         jne     .end
  777.         mov     eax,ecx
  778.         cmp     eax,fb_ini_file_start
  779.         je      @f
  780.         dec     eax
  781.         cmp [eax],byte 15
  782.         ja      .end
  783. @@:
  784.         xor     ebx,ebx
  785.         xor     eax,eax
  786.         mov     ecx,9
  787.         call    .calculate
  788.         cmp al,0x30
  789.         jb      .end
  790.         cmp     al,0x39
  791.         ja      .end
  792.         sub     eax,0x30
  793. @@:
  794.         call    .calculate_1
  795.         cmp al,0x30
  796.         jb      @f
  797.         cmp     al,0x39
  798.         ja      @f
  799.         sub     eax,0x30
  800.        
  801.         lea ebx,[ebx+ebx*4]
  802.         shl     ebx,1
  803.        
  804.         dec     ecx
  805.         jnz     @b
  806. @@:
  807.         pop     eax
  808.         ret
  809. .end:
  810.         mov     ebx,2
  811.         pop     eax
  812.         ret
  813. ;---------------------------------------------------------------------
  814. .calculate_1:
  815.         add     ebx,eax
  816. .calculate:
  817.         xor     eax,eax
  818.         cld
  819.         lodsb
  820.         ret
  821. ;---------------------------------------------------------------------
  822. fb_char_toupper:
  823. ; convert character to uppercase, using cp866 encoding
  824. ; in: al=symbol
  825. ; out: al=converted symbol
  826.         cmp     al,'a'
  827.         jb      .ret
  828.         cmp     al, 'z'
  829.         jbe     .az
  830.         cmp     al, ' '
  831.         jb      .ret
  832.         cmp     al, 'à'
  833.         jb      .rus1
  834.         cmp     al, 'ï'
  835.         ja      .ret
  836. ; 0xE0-0xEF -> 0x90-0x9F
  837.         sub     al, 'à'-''
  838. .ret:
  839.         ret
  840. .rus1:
  841. ; 0xA0-0xAF -> 0x80-0x8F
  842. .az:
  843.         and     al, not 0x20
  844.         ret
  845. ;---------------------------------------------------------------------
  846. fb_char_todown:
  847. ; convert character to lowercase, using cp866 encoding
  848. ; in: al=symbol
  849. ; out: al=converted symbol
  850.         cmp     al, 'A'
  851.         jb      .ret
  852.         cmp     al, 'Z'
  853.         jbe     .az
  854.         cmp     al, '€'
  855.         jb      .ret
  856.         cmp     al, ''
  857.         jb      .rus1
  858.         cmp     al, 'Ÿ'
  859.         ja      .ret
  860. ; 0x90-0x9F -> 0xE0-0xEF
  861.         add     al, 'à'-''
  862. .ret:
  863.         ret
  864. .rus1:
  865. ; 0x80-0x8F -> 0xA0-0xAF
  866. .az:
  867.         add     al, 0x20
  868.         ret
  869. ;---------------------------------------------------------------------
  870. fb_truncated_filename_char:
  871.         db      '..'
  872. ;---------------------------------------------------------------------
  873. ;*****************************************************************************
  874. ;*****************************************************************************
  875. ; mouse event
  876. ;*****************************************************************************
  877. ;*****************************************************************************
  878. fb_mouse:
  879.         pusha
  880.         mov     edi,dword [esp+36]
  881. ;-------------------------------------------------------
  882.         mcall   37,2
  883.         mov     ebx,fb_mouse_keys
  884.         mov     fb_mouse_keys_old,ebx
  885.         mov     fb_mouse_keys,eax
  886.        
  887.         mcall   37,1
  888.         mov     ebx,fb_mouse_pos
  889.         mov     fb_mouse_pos_old,ebx
  890.         mov     fb_mouse_pos,eax
  891.        
  892.         test    eax,0x80000000
  893.         jnz     .exit_fb
  894.         test    eax,0x8000
  895.         jnz     .exit_fb
  896.  
  897.         mov     ebx,eax
  898.         shr     ebx,16  ; x position
  899.         shl     eax,16
  900.         shr     eax,16  ; y position
  901.        
  902.         mov     cx,fb_start_x
  903.         cmp     bx,cx
  904.         jb      .exit_fb
  905.        
  906.         add     cx,fb_size_x
  907.         cmp     bx,cx
  908.         ja      .exit_fb
  909.  
  910.         mov     cx,fb_start_y
  911.         cmp     ax,cx
  912.         jb      .exit_fb
  913.        
  914.         add     cx,fb_size_y
  915.         cmp     ax,cx
  916.         ja      .exit_fb
  917.  
  918.         cmp     fb_mouse_keys,0
  919.         jz      @f
  920.         mov     fb_select_flag,1
  921. @@:
  922. ;-------------------------------------------------------        
  923.         cmp     fb_mouse_keys_delta,1
  924.         je      .enter_1
  925.  
  926.         cmp     fb_mouse_keys,0
  927.         jz      .exit_fb
  928. .start:
  929.         sub     ax,fb_start_y
  930.         xor     ebx,ebx
  931.         mov     bx,fb_line_size_y
  932.         xor     edx,edx
  933.         push    eax
  934.         div     ebx
  935.         pop     eax
  936.         sub     eax,edx
  937.         xor     edx,edx
  938.         cmp     fb_select_panel_counter,edx
  939.         jne     @f
  940.         mov     fb_mouse_keys_delta,0
  941.         jmp     .continue
  942. @@:
  943.         xor     edx,edx
  944.         cmp     fb_start_draw_cursor_line,ax
  945.         jne     @f
  946.         cmp     fb_mouse_keys,edx
  947.         jnz     .continue
  948. @@:
  949.         mov     fb_mouse_keys_delta,edx
  950. .continue:
  951.         xor     ebx,ebx
  952.         mov     bx,fb_line_size_y
  953.         imul    ebx,fb_folder_block
  954.         cmp     eax,ebx
  955.         jb      @f
  956.         xor     edx,edx
  957.         mov     dx,fb_line_size_y
  958.         sub     ebx,edx
  959.         cmp     bx,fb_start_draw_cursor_line
  960.         je      .enter
  961.         call    .store_old_cursor_line
  962.         mov     fb_start_draw_cursor_line,bx
  963.         jmp     .continue_1
  964. @@:
  965.         cmp     ax,fb_start_draw_cursor_line
  966.         je      .enter
  967.         call    .store_old_cursor_line
  968.         mov     fb_start_draw_cursor_line,ax
  969. .continue_1:
  970.         test    fb_mouse_keys,10b
  971.         jne     .mark_mouse
  972.         jmp     .enter_1
  973. .continue_2:
  974.         mov     ax,fb_start_draw_cursor_line
  975.         cmp     ax,fb_start_draw_cursor_line_2
  976.         je      .exit_fb
  977.  
  978.         call    fb_draw_panel_1
  979.         jmp     .exit_fb
  980. .enter:
  981.         cmp     fb_mouse_keys_delta,2
  982.         je      .enter_2
  983.         cmp     fb_mouse_keys_delta,1
  984.         je      .enter_1
  985.         mov     eax,fb_mouse_keys_old
  986.         cmp     fb_mouse_keys,eax
  987.         jz      .exit_fb
  988.         test    fb_mouse_keys,10b
  989.         jne     .mark_mouse
  990.         xor     edx,edx
  991.         inc     edx
  992.         mov     fb_mouse_keys_delta,edx
  993.         jmp     .exit_fb
  994. .enter_1:
  995. ;       mov     eax,fb_mouse_keys_old
  996. ;       cmp     fb_mouse_keys,eax
  997. ;       jz      .exit_fb
  998.         test    fb_mouse_keys,10b
  999.         jne     .mark_mouse
  1000.         mov     edx,2
  1001.         mov     fb_mouse_keys_delta,edx
  1002.         mcall   26,9
  1003.         add     eax,fb_mouse_key_delay
  1004.         mov     fb_mouse_keys_tick,eax
  1005.         jmp     .continue_2
  1006. .enter_2:
  1007.         mcall   26,9
  1008.         cmp     eax,fb_mouse_keys_tick
  1009.         ja      @f
  1010. ;       mov     eax,fb_mouse_pos_old
  1011. ;       cmp     eax,fb_mouse_pos
  1012. ;       jne     @f
  1013.         mov     eax,fb_mouse_keys_old
  1014.         cmp     fb_mouse_keys,eax
  1015.         jz      @f
  1016.         test    fb_mouse_keys,10b
  1017.         jne     .mark_mouse
  1018.         call    .enter_3
  1019.         jmp     .exit_fb
  1020. @@:
  1021.         xor     eax,eax
  1022.         inc     eax
  1023.         mov     fb_mouse_keys_delta,eax
  1024. ;-------------------------------------------------------
  1025. .exit_fb:
  1026.         call    fb_prepare_selected_BDVK_adress
  1027. file_browser_exit
  1028. ;-------------------------------------------------------
  1029. .mark_mouse:
  1030.         call    fb_key.mark_1
  1031.         call    fb_draw_panel_1
  1032.         xor     eax,eax
  1033.         mov     fb_mouse_keys_delta,eax
  1034.         jmp     .exit_fb       
  1035. ;-------------------------------------------------------
  1036. .enter_3:
  1037.         xor     eax,eax
  1038.         mov     fb_mouse_keys,eax
  1039.         mov     fb_mouse_keys_old,eax
  1040.         mov     eax,3
  1041.         mov     fb_mouse_keys_delta,eax
  1042.         xor     eax,eax
  1043.         mov     fb_max_name_temp_size,eax
  1044.         ret
  1045. ;-------------------------------------------------------
  1046. .store_old_cursor_line:
  1047.         push    eax
  1048.         mov     ax,fb_start_draw_cursor_line
  1049.         mov     fb_start_draw_cursor_line_2,ax
  1050.         xor     eax,eax
  1051. ;       mov     fb_mouse_keys_delta,eax
  1052.         pop     eax
  1053.         ret
  1054. ;*****************************************************************************
  1055. ;*****************************************************************************
  1056. fb_prepare_selected_BDVK_adress:
  1057.         xor     eax,eax
  1058.         mov     ax,fb_start_draw_cursor_line
  1059.         xor     ebx,ebx
  1060.         mov     bx,fb_line_size_y
  1061.         xor     edx,edx
  1062.         div     ebx
  1063.         add     eax,fb_start_draw_line
  1064.         imul    eax,304
  1065.         add     eax,32
  1066.         add     eax,fb_folder_data
  1067.         mov     fb_selected_BDVK_adress,eax
  1068.         ret
  1069. ;*****************************************************************************
  1070. ;*****************************************************************************
  1071. ; key event
  1072. ; 1 - arrow down
  1073. ; 2 - arrow up
  1074. ; 3 - PageDown
  1075. ; 4 - PageUp
  1076. ; 5 - Home
  1077. ; 6 - End
  1078. ; 7 - Enter
  1079. ; 8 - Insert (Mark)
  1080. ; 9 - Mark All
  1081. ; 10 - Unmark All
  1082. ; 11 - Invert Mark
  1083. ; 12 - Search with key
  1084. ;*****************************************************************************
  1085. ;*****************************************************************************
  1086. fb_key:
  1087.         pusha
  1088.         mov     edi,dword [esp+36]
  1089. ;-------------------------------------------------------
  1090.         xor     eax,eax
  1091.         mov     ax,fb_key_action
  1092.         shl     eax,2
  1093.         add     eax,dword fb_key_table
  1094.         cmp     eax,fb_key_table.end
  1095.         jae     .exit_fb
  1096.         cmp     [eax],dword 0
  1097.         je      .exit_fb
  1098.         jmp     dword [eax]
  1099. ;-------------------------------------------------------
  1100. .arrow_down:
  1101.         mov     ax,fb_start_draw_cursor_line
  1102.         add     ax,fb_line_size_y
  1103.         add     ax,fb_line_size_y
  1104.         cmp     ax,word fb_size_y
  1105.         ja      @f
  1106. .add_1:
  1107.         call    fb_mouse.store_old_cursor_line
  1108.         mov     ax,fb_start_draw_cursor_line
  1109.         add     ax,fb_line_size_y
  1110.         mov     fb_start_draw_cursor_line,ax
  1111.         call    fb_draw_panel_1
  1112.         jmp     .exit_fb
  1113. @@:
  1114.         mov     eax,fb_folder_block
  1115.         sub     eax,fb_max_panel_line
  1116.         test    eax,0x80000000
  1117.         jnz     .page_down_2
  1118.  
  1119.         call    .prepare_data_down
  1120.         ja      @f
  1121.  
  1122.         cmp     fb_start_draw_line,eax
  1123.         je      .exit_fb
  1124. @@:
  1125.         inc     fb_start_draw_line
  1126.         call    fb_draw_panel_3
  1127.         jmp     .exit_fb
  1128. ;-------------------------------------------------------
  1129. .arrow_up:
  1130.         mov     ax,fb_start_draw_cursor_line
  1131.         add     ax,fb_start_y
  1132.         cmp     fb_start_y,ax
  1133.         je      @f
  1134.         call    fb_mouse.store_old_cursor_line
  1135.         mov     ax,fb_start_draw_cursor_line
  1136.         sub     ax,fb_line_size_y
  1137.         mov     fb_start_draw_cursor_line,ax
  1138.         call    fb_draw_panel_1
  1139.         jmp     .exit_fb
  1140. @@:
  1141.         cmp     fb_start_draw_line,0
  1142.         je      .exit_fb
  1143.         dec     fb_start_draw_line
  1144.         call    fb_draw_panel_3
  1145.         jmp     .exit_fb
  1146. ;-------------------------------------------------------
  1147. .page_down:
  1148.         mov     eax,fb_max_panel_line
  1149.         mov     ebx,fb_folder_block
  1150.         sub     ebx,eax
  1151.         test    ebx,0x80000000
  1152.         jnz     .page_down_2
  1153.         sub     ebx,fb_start_draw_line
  1154.         cmp     ebx,eax
  1155.         ja      .page_down_3
  1156.         mov     ebx,fb_folder_block
  1157.         sub     ebx,eax
  1158.         call    .prepare_data_down
  1159.         ja      @f
  1160.         cmp     ebx,fb_start_draw_line
  1161.         je      .exit_fb
  1162. @@:
  1163.         mov     fb_start_draw_line,ebx
  1164. .page_down_0:
  1165.         dec     eax
  1166.         xor     ebx,ebx
  1167.         mov     bx,fb_line_size_y
  1168.         imul    eax,ebx
  1169. .page_down_1:
  1170.         call    fb_mouse.store_old_cursor_line
  1171.         mov     fb_start_draw_cursor_line,ax
  1172.         call    fb_draw_panel_2
  1173.         jmp     .exit_fb
  1174. .page_down_2:
  1175.         mov     eax,fb_folder_block
  1176.         sub     eax,fb_start_draw_line
  1177.         dec     eax
  1178.         xor     ebx,ebx
  1179.         mov     bx,fb_line_size_y
  1180.         imul    eax,ebx
  1181.         cmp     ax,fb_start_draw_cursor_line
  1182.         jbe     .exit_fb
  1183.         jmp     .page_down_1
  1184. .page_down_3:
  1185.         add     fb_start_draw_line,eax
  1186.         call    fb_draw_panel_2
  1187.         jmp     .exit_fb
  1188. ;-------------------------------------------------------
  1189. .prepare_data_down:
  1190.         mov     ecx,fb_folder_block
  1191.         sub     ecx,fb_start_draw_line
  1192.         dec     ecx
  1193.         xor     edx,edx
  1194.         mov     dx,fb_line_size_y
  1195.         imul    ecx,edx
  1196.         cmp     cx,fb_start_draw_cursor_line
  1197.         ret
  1198. ;-------------------------------------------------------
  1199. .page_up:
  1200.         mov     eax,fb_max_panel_line
  1201.         mov     ebx,fb_start_draw_line
  1202.         sub     ebx,eax
  1203.         test    ebx,0x80000000
  1204.         jz      @f
  1205.         cmp     fb_start_draw_line,0
  1206.         jne     .page_up_1
  1207.         cmp     fb_start_draw_cursor_line,0
  1208.         je      .exit_fb
  1209.         mov     fb_start_draw_cursor_line,0
  1210. .page_up_1:
  1211.         mov     fb_start_draw_line,0
  1212.         call    fb_draw_panel_2
  1213.         jmp     .exit_fb
  1214. @@:
  1215.         sub     fb_start_draw_line,eax
  1216.         call    fb_draw_panel_2
  1217.         jmp     .exit_fb
  1218. ;-------------------------------------------------------
  1219. .home:
  1220.         cmp     fb_start_draw_line,0
  1221.         jne     @f
  1222.         cmp     fb_start_draw_cursor_line,0
  1223.         je      .exit_fb
  1224. @@:
  1225.         mov     fb_start_draw_line,0
  1226.         mov     fb_start_draw_cursor_line,0
  1227.         call    fb_mouse.store_old_cursor_line
  1228.         call    fb_draw_panel_2
  1229.         jmp     .exit_fb
  1230. ;-------------------------------------------------------
  1231. .end:
  1232.         mov     eax,fb_folder_block
  1233.         sub     eax,fb_max_panel_line
  1234.         test    eax,0x80000000
  1235.         jnz     .page_down_2
  1236.         call    .prepare_data_down
  1237.         ja      @f
  1238.         cmp     eax,fb_start_draw_line
  1239.         je      .exit_fb
  1240. @@:
  1241.         mov     fb_start_draw_line,eax
  1242.         mov     eax,fb_max_panel_line
  1243.         jmp     .page_down_0
  1244. ;-------------------------------------------------------
  1245. .enter:
  1246.         call    fb_mouse.enter_3
  1247.         jmp     .exit_fb
  1248. ;-------------------------------------------------------
  1249. .mark:
  1250.         call    .mark_1
  1251.         jmp     .arrow_down    
  1252. ;-------------------------------------------------------
  1253. .mark_1:
  1254.         mov     eax,fb_folder_block
  1255.         test    eax,eax
  1256.         jz      .exit
  1257.  
  1258.         xor     eax,eax
  1259.         mov     ax,fb_start_draw_cursor_line
  1260.         xor     edx,edx
  1261.         xor     ebx,ebx
  1262.         mov     bx,fb_line_size_y
  1263.         div     ebx
  1264.         mov     esi,fb_start_draw_line
  1265.         add     esi,eax
  1266.         imul    esi,304
  1267.         add     esi,fb_folder_data
  1268.  
  1269.         add     esi,32+299
  1270.         mov     al,[esi]
  1271.         and     al,1
  1272.        
  1273.         test    al,al
  1274.         jnz     @f
  1275.         inc     fb_marked_counter
  1276.         jmp     .mark_2
  1277. @@:
  1278.         dec     fb_marked_counter
  1279. .mark_2:
  1280.         mov     al,[esi]
  1281.         inc     al
  1282.         and     al,1
  1283.         mov     [esi],al
  1284. .exit:
  1285.         ret
  1286. ;-------------------------------------------------------
  1287. .mark_all:
  1288.         mov     eax,fb_folder_block
  1289.         test    eax,eax
  1290.         jz      .exit_fb
  1291.  
  1292.         mov     fb_temp_counter,0
  1293. .mark_all_1:   
  1294.         mov     ebp,fb_folder_block
  1295. .mark_all_2:
  1296.         mov     ebx,ebp
  1297.         dec     ebx
  1298.         imul    ebx,304
  1299.         add     ebx,fb_folder_data
  1300.         add     ebx,32+40
  1301.         cmp     [ebx],word '..'
  1302.         jne     .mark_all_3
  1303.         cmp     [ebx+2],byte 0
  1304.         je      @f
  1305. .mark_all_3:
  1306.         call    .select_mark_action
  1307. @@:
  1308.         dec     ebp
  1309.         jnz     .mark_all_2
  1310.        
  1311.         call    fb_draw_panel_3
  1312.         cmp     fb_temp_counter,0
  1313.         jne     @f
  1314.         mov     eax,fb_folder_block
  1315.         jmp     .mark_all_4
  1316. @@:
  1317.         cmp     fb_temp_counter,1
  1318.         jne     @f
  1319.         mov     fb_marked_counter,0
  1320.         jmp     .exit_fb
  1321. @@:
  1322.         mov     eax,fb_folder_block
  1323.         sub     eax,fb_marked_counter
  1324. .mark_all_4:
  1325.         dec     eax
  1326.         mov     fb_marked_counter,eax
  1327.         jmp     .exit_fb
  1328. ;-------------------------------------------------------       
  1329. .select_mark_action:
  1330.         add     ebx,299-40
  1331.         cmp     fb_temp_counter,0
  1332.         jne     @f
  1333.         mov     [ebx],byte 1
  1334.         jmp     .select_mark_action_1
  1335. @@:
  1336.         cmp     fb_temp_counter,1
  1337.         jne     @f
  1338.         mov     [ebx],byte 0
  1339.         jmp     .select_mark_action_1
  1340. @@:
  1341.         mov     al,[ebx]
  1342.         inc     al
  1343.         and     al,1
  1344.         mov     [ebx],al
  1345. .select_mark_action_1:
  1346.         ret
  1347. ;-------------------------------------------------------
  1348. .unmark_all:
  1349.         mov     eax,fb_folder_block
  1350.         test    eax,eax
  1351.         jz      .exit_fb
  1352.  
  1353.         mov     fb_temp_counter,1
  1354.         jmp     .mark_all_1
  1355. ;-------------------------------------------------------
  1356. .invert_mark:
  1357.         mov     eax,fb_folder_block
  1358.         test    eax,eax
  1359.         jz      .exit_fb
  1360.  
  1361.         mov     fb_temp_counter,2
  1362.         jmp     .mark_all_1
  1363. ;-------------------------------------------------------
  1364. ;  * bit 0  (mask 1): left Shift is pressed
  1365. ;  * bit 1  (mask 2): right Shift is pressed
  1366. ;  * bit 2  (mask 4): left Ctrl is pressed
  1367. ;  * bit 3  (mask 8): right Ctrl is pressed
  1368. ;  * bit 4  (mask 0x10): left Alt is pressed
  1369. ;  * bit 5  (mask 0x20): right Alt is pressed
  1370. ;  * bit 6  (mask 0x40): CapsLock is on
  1371. ;  * bit 7  (mask 0x80): NumLock is on
  1372. ;  * bit 8  (mask 0x100): ScrollLock is on
  1373. ;  * bit 9  (mask 0x200): left Win is pressed
  1374. ;  * bit 10 (mask 0x400): right Win is pressed
  1375. ;-------------------------------------------------------
  1376. .search_with_key:
  1377.         mcall   66,3
  1378.         test    al,11b
  1379.         jnz     .shift_layout
  1380.  
  1381.         test    al,110000b
  1382.         jnz     .alt_layout
  1383.  
  1384.         mov     ecx,1   ; Normal
  1385.         jmp     .get_keyboard_layout
  1386.  
  1387. .shift_layout:
  1388.         mov     ecx,2   ; Shift
  1389.         jmp     .get_keyboard_layout
  1390.  
  1391. .alt_layout:
  1392.         mov     ecx,3   ; Alt
  1393. .get_keyboard_layout:
  1394.         mcall   26,2,,fb_keymap_pointer
  1395.         xor     eax,eax
  1396.         mov     ax,fb_key_action_num
  1397.         add     eax,fb_keymap_pointer
  1398.         mov     al,[eax]
  1399.         and     eax,0xff
  1400.         call    fb_char_todown
  1401.         mov     ah,al
  1402.         xor     esi,esi
  1403.         push    eax
  1404.         movzx   eax,fb_start_draw_cursor_line
  1405.         movzx   ebx,fb_line_size_y
  1406.         xor     edx,edx
  1407.         div     ebx
  1408.         add     si,ax   ;fb_start_draw_cursor_line
  1409.         pop     eax
  1410.         add     esi,fb_start_draw_line
  1411.         mov     ecx,esi
  1412.         xor     ebx,ebx
  1413.         inc     ecx
  1414.         cmp     ecx,fb_folder_block
  1415.         ja      .reset_data
  1416.  
  1417. .first_entry:
  1418.         imul    esi,304
  1419.         add     esi,fb_folder_data
  1420.         add     esi,40+32
  1421. @@:
  1422.         add     esi,304
  1423.         mov     al,[esi]
  1424.         call    fb_char_todown
  1425.         cmp     ah,al
  1426.         je      .match
  1427.  
  1428.         inc     ecx
  1429.         cmp     ecx,fb_folder_block
  1430.         jb      @b
  1431.  
  1432. .reset_data:
  1433.         xor     esi,esi
  1434.        
  1435.         dec     esi
  1436.         cmp     ebx,2
  1437.         jae     .exit_fb
  1438.  
  1439.         xor     ecx,ecx
  1440.         inc     ebx
  1441.         jmp     .first_entry
  1442.  
  1443. .match:
  1444.         mov     fb_start_draw_line,ecx
  1445.         mov     eax,fb_folder_block
  1446.         mov     ebx,fb_max_panel_line
  1447.         sub     eax,ebx
  1448.         jbe     .1
  1449.  
  1450.         cmp     eax,ecx
  1451.         jbe     @f
  1452.        
  1453.         xor     ecx,ecx
  1454.         jmp     .2
  1455. @@:
  1456.         mov     fb_start_draw_line,eax
  1457.         mov     eax,fb_folder_block
  1458.         sub     eax,ecx
  1459.  
  1460.         mov     ecx,fb_max_panel_line
  1461.         sub     ecx,eax
  1462.         jmp     .2
  1463.  
  1464. .1:
  1465.         xor     eax,eax
  1466.         mov     fb_start_draw_line,eax
  1467. .2:
  1468.         movzx   eax,fb_line_size_y
  1469.         imul    ecx,eax
  1470.         mov     fb_start_draw_cursor_line,cx
  1471.         call    fb_draw_panel_2
  1472. ;-------------------------------------------------------
  1473. .exit_fb:
  1474.         call    fb_prepare_selected_BDVK_adress
  1475. file_browser_exit
  1476. ;-------------------------------------------------------
  1477. fb_key_table:
  1478.         dd      0
  1479.         dd      fb_key.arrow_down       ; 1
  1480.         dd      fb_key.arrow_up         ; 2
  1481.         dd      fb_key.page_down        ; 3
  1482.         dd      fb_key.page_up          ; 4
  1483.         dd      fb_key.home             ; 5
  1484.         dd      fb_key.end              ; 6
  1485.         dd      fb_key.enter            ; 7
  1486.         dd      fb_key.mark             ; 8
  1487.         dd      fb_key.mark_all         ; 9
  1488.         dd      fb_key.unmark_all       ; 10
  1489.         dd      fb_key.invert_mark      ; 11
  1490.         dd      fb_key.search_with_key  ; 12
  1491. .end:
  1492.         dd      0
  1493. ;-------------------------------------------------------
  1494. fb_draw_panel_3:
  1495.         mov     eax,2
  1496.         mov     fb_all_redraw,eax
  1497.         jmp     fb_draw_panel_2.1
  1498. fb_draw_panel_2:
  1499.         xor     eax,eax
  1500.         inc     eax
  1501.         mov     fb_all_redraw,eax
  1502.         call    fb_draw_panel_selection
  1503. .1:
  1504.         call    fb_draw_folder_data
  1505.         xor     eax,eax
  1506.         mov     fb_all_redraw,eax
  1507.         inc     eax
  1508.         mov     fb_draw_scroll_bar,eax
  1509.         ret
  1510.  
  1511. }
  1512.