Subversion Repositories Kolibri OS

Rev

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