Subversion Repositories Kolibri OS

Rev

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