Subversion Repositories Kolibri OS

Rev

Rev 529 | Rev 631 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. use32
  2.         db      'MENUET01'
  3.         dd      1
  4.         dd      start
  5.         dd      i_end
  6. memsize dd      mem
  7.         dd      stacktop
  8.         dd      0, app_path
  9.  
  10. version equ '0.4'
  11. version_dword equ 0*10000h + 40
  12.  
  13. include 'lang.inc'
  14. include 'font.inc'
  15. include 'sort.inc'
  16. include 'kglobals.inc'
  17. include 'dialogs.inc'
  18. include 'viewer.inc'
  19. include 'tools.inc'
  20. include 'filetool.inc'
  21.  
  22. start:
  23.         mov     edi, tolower_table
  24.         push    'A'
  25.         pop     ecx
  26.         xor     eax, eax
  27. @@:
  28.         stosb
  29.         inc     eax
  30.         loop    @b
  31.         add     al, 0x20
  32.         mov     cl, 'Z'-'A'+1
  33. @@:
  34.         stosb
  35.         inc     eax
  36.         loop    @b
  37.         sub     al, 0x20
  38.         mov     cl, '€'-'Z'-1
  39. @@:
  40.         stosb
  41.         inc     eax
  42.         loop    @b
  43.         add     al, 0x20
  44.         mov     cl, ''-'€'
  45. @@:
  46.         stosb
  47.         inc     eax
  48.         loop    @b
  49.         add     al, 0x30
  50.         mov     cl, 'Ÿ'-''+1
  51. @@:
  52.         stosb
  53.         inc     eax
  54.         loop    @b
  55.         sub     al, 0x50
  56.         mov     cl, 256-'Ÿ'-1
  57. @@:
  58.         stosb
  59.         inc     eax
  60.         loop    @b
  61.         mov     byte [edi-256+'ð'], 'ñ'
  62.         push    68
  63.         pop     eax
  64.         push    11
  65.         pop     ebx
  66.         int     0x40
  67.         call    init_console
  68.         call    draw_window
  69.         push    66
  70.         pop     eax
  71.         push    1
  72.         pop     ebx
  73.         mov     ecx, ebx
  74.         int     40h     ; set keyboard mode to scancodes
  75.         mov     eax, 200
  76.         mov     [panel1_nfa], eax
  77.         mov     [panel2_nfa], eax
  78.         mov     ecx, 200*4 + 32 + 200*304
  79.         call    pgalloc
  80.         mov     [panel1_files], eax
  81.         call    pgalloc
  82.         mov     [panel2_files], eax
  83.         test    eax, eax
  84.         jz      exit
  85.         cmp     [panel1_files], 0
  86.         jz      exit
  87.         xor     eax, eax
  88.         mov     [panel1_hPlugin], eax
  89.         mov     [panel1_parents], eax
  90.         mov     [panel1_parents_sz], eax
  91.         mov     [panel1_parents_alloc], eax
  92.         mov     [panel2_hPlugin], eax
  93.         mov     [panel2_parents], eax
  94.         mov     [panel2_parents_sz], eax
  95.         mov     [panel2_parents_alloc], eax
  96.         mov     [panel1_sortmode], al   ; sort by name
  97.         mov     [panel2_sortmode], al
  98.         mov     al, 2                   ; "á।­¨©" ä®à¬ â
  99.         mov     [panel1_colmode], eax
  100.         mov     [panel2_colmode], eax
  101.         mov     [num_screens], 1
  102.         mov     ecx, 0x1000
  103.         call    pgalloc
  104.         mov     [screens], eax
  105.         test    eax, eax
  106.         jz      exit
  107.         mov     ecx, panels_vtable
  108.         mov     [eax], ecx
  109.         mov     [active_screen_vtable], ecx
  110. ; load libini.obj and kfar.ini
  111.         mov     eax, libini_name
  112.         mov     esi, ini_import
  113.         push    3
  114.         pop     ebp     ; we use version 3 of libini
  115.         call    load_dll_and_import
  116.         test    eax, eax
  117.         jnz     .noini
  118.         mov     edi, app_path
  119.         or      ecx, -1
  120.         repnz   scasb
  121.         mov     dword [edi-1], '.ini'
  122.         mov     byte [edi+3], 0
  123.         push    1
  124.         push    dword aConfirmDelete
  125.         push    dword aConfirmations
  126.         push    dword app_path
  127.         call    [ini.get_int]
  128.         mov     [bConfirmDelete], al
  129.         push    0
  130.         push    dword aConfirmDeleteIncomplete
  131.         push    dword aConfirmations
  132.         push    dword app_path
  133.         call    [ini.get_int]
  134.         mov     [bConfirmDeleteIncomplete], al
  135.         push    2
  136.         push    aLeftViewMode
  137.         push    aPanels
  138.         push    app_path
  139.         call    [ini.get_int]
  140.         cmp     eax, 1
  141.         jb      @f
  142.         cmp     eax, 4
  143.         ja      @f
  144.         mov     [panel1_colmode], eax
  145. @@:
  146.         push    2
  147.         push    aRightViewMode
  148.         push    aPanels
  149.         push    app_path
  150.         call    [ini.get_int]
  151.         cmp     eax, 1
  152.         jb      @f
  153.         cmp     eax, 4
  154.         ja      @f
  155.         mov     [panel2_colmode], eax
  156. @@:
  157.         mov     ecx, 0x1000
  158.         call    xpgalloc
  159.         test    eax, eax
  160.         jz      .skip_assoc
  161.         mov     [associations], eax
  162.         push    enum_associations_callback
  163.         push    aAssociations
  164.         push    app_path
  165.         call    [ini.enum_keys]
  166. .skip_assoc:
  167.         xor     ebp, ebp
  168.         xor     esi, esi
  169. .shortcut_loop:
  170.         mov     edi, saved_file_name
  171.         push    dword nullstr
  172.         push    512
  173.         push    edi
  174.         push    dword aShortcut
  175.         push    dword aFolderShortcuts
  176.         push    dword app_path
  177.         call    [ini.get_str]
  178.         cmp     byte [edi], 0
  179.         jz      .shortcut_cont
  180.         or      ecx, -1
  181.         xor     eax, eax
  182.         repnz   scasb
  183.         not     ecx
  184.         cmp     ecx, 2
  185.         jz      @f
  186.         cmp     byte [edi-2], '/'
  187.         jnz     @f
  188.         mov     byte [edi-2], 0
  189.         dec     ecx
  190. @@:
  191.         mov     al, [aShortcut.d]
  192.         push    esi
  193.         inc     esi
  194.         mov     [FolderShortcuts+(eax-'0')*4], esi
  195.         lea     esi, [esi+ecx-1]
  196.         push    esi
  197.         and     esi, 0xFFF
  198.         cmp     esi, ecx
  199.         pop     esi
  200.         ja      .norealloc
  201.         mov     edx, ebp
  202.         mov     ecx, esi
  203.         call    xpgrealloc
  204.         test    eax, eax
  205.         jnz     @f
  206.         pop     esi
  207.         mov     edi, FolderShortcuts
  208.         mov     ecx, 10
  209.         rep     stosd
  210.         jmp     .skip_shortcuts
  211. @@:
  212.         mov     ebp, eax
  213. .norealloc:
  214.         pop     edi
  215.         add     edi, ebp
  216.         mov     ecx, saved_file_name
  217. @@:
  218.         mov     al, [ecx]
  219.         inc     ecx
  220.         stosb
  221.         test    al, al
  222.         jnz     @b
  223. .shortcut_cont:
  224.         inc     [aShortcut.d]
  225.         cmp     [aShortcut.d], '9'
  226.         jbe     .shortcut_loop
  227.         mov     esi, FolderShortcuts
  228.         mov     ecx, 10
  229.         dec     ebp
  230. .l3:
  231.         lodsd
  232.         test    eax, eax
  233.         jz      @f
  234.         add     [esi-4], ebp
  235. @@:
  236.         loop    .l3
  237. .skip_shortcuts:
  238. ; load plugins
  239.         push    enum_plugins_callback
  240.         push    aPlugins
  241.         push    app_path
  242.         call    [ini.enum_keys]
  243. .noini:
  244.         mov     esi, def_left_dir
  245.         mov     edi, panel1_dir
  246. @@:
  247.         lodsb
  248.         stosb
  249.         test    al, al
  250.         jnz     @b
  251.         mov     esi, def_right_dir
  252.         mov     edi, panel2_dir
  253. @@:
  254.         lodsb
  255.         stosb
  256.         test    al, al
  257.         jnz     @b
  258.         call    draw_keybar
  259.         call    draw_cmdbar
  260.         mov     [prev_dir], 0
  261.         mov     ebp, panel1_data
  262.         call    calc_colwidths
  263.         call    read_folder
  264.         call    draw_panel
  265.         mov     [bSilentFolderMode], 1
  266.         mov     ebp, panel2_data
  267.         call    calc_colwidths
  268.         call    read_folder
  269.         call    draw_panel
  270. event:
  271.         push    10
  272.         pop     eax
  273.         int     40h
  274.         dec     eax
  275.         jz      redraw
  276.         dec     eax
  277.         jz      key
  278. ; button - we have only one button, close
  279. exit:
  280. ; close all screens
  281. @@:
  282.         mov     ecx, [num_screens]
  283.         mov     eax, [screens]
  284.         mov     ebp, [eax+ecx*8-4]
  285.         mov     eax, [eax+ecx*8-8]
  286.         push    ebp
  287.         call    [eax+screen_vtable.OnExit]
  288.         pop     ecx
  289.         call    pgfree
  290.         dec     [num_screens]
  291.         jnz     @b
  292. ; unload all plugins
  293.         mov     ecx, [num_plugins]
  294.         imul    esi, ecx, PluginInfo.size
  295.         add     esi, [plugins]
  296. .unload:
  297.         dec     ecx
  298.         js      .unload_done
  299.         sub     esi, PluginInfo.size
  300.         push    ecx esi
  301.         call    [esi+PluginInfo.unload]
  302.         pop     esi ecx
  303.         jmp     .unload
  304. .unload_done:
  305. if 0    ; commented due to bug in libini
  306.         cmp     [ini.set_int], aIniSetInt
  307.         jz      .nosave
  308.         push    [panel1_colmode]
  309.         push    aLeftViewMode
  310.         push    aPanels
  311.         push    app_path
  312.         call    [ini.set_int]
  313.         push    [panel2_colmode]
  314.         push    aRightViewMode
  315.         push    aPanels
  316.         push    app_path
  317.         call    [ini.set_int]
  318. .nosave:
  319. end if
  320. if CHECK_FOR_LEAKS
  321.         mov     ecx, [panel1_files]
  322.         call    pgfree
  323.         mov     ecx, [panel2_files]
  324.         call    pgfree
  325.         mov     ecx, [screens]
  326.         call    pgfree
  327.         mov     ecx, [associations]
  328.         call    pgfree
  329.         mov     ecx, [console_data_ptr]
  330.         call    pgfree
  331.         mov     ecx, [MemForImage]
  332.         call    pgfree
  333.         mov     esi, FolderShortcuts
  334.         push    10
  335.         pop     ecx
  336. @@:
  337.         lodsd
  338.         test    eax, eax
  339.         jnz     @f
  340.         loop    @b
  341.         jmp     .nofreefs
  342. @@:
  343.         mov     ecx, eax
  344.         call    pgfree
  345.         mov     ecx, [plugins]
  346.         call    pgfree
  347.         mov     ecx, [panel1_parents]
  348.         call    pgfree
  349.         mov     ecx, [panel2_parents]
  350.         call    pgfree
  351. .nofreefs:
  352.         mov     eax, [numallocatedregions]
  353.         test    eax, eax
  354.         jz      @f
  355.         mov     edi, allocatedregions
  356.         int3
  357.         jmp     $
  358. @@:
  359. end if
  360.         or      eax, -1
  361.         int     40h
  362. redraw:
  363. ; query kbd state from OS
  364.         mov     al, 66
  365.         push    3
  366.         pop     ebx
  367.         int     0x40
  368.         and     eax, 0x3F
  369.         cmp     al, [ctrlstate]
  370.         mov     [ctrlstate], al
  371.         jz      @f
  372.         call    draw_keybar
  373. @@:
  374.         mov     al, 9
  375.         mov     ebx, procinfo
  376.         or      ecx, -1
  377.         int     40h
  378. ; test if rolled up
  379. ; height of rolled up window is [skinh]+3
  380.         mov     eax, [ebx+46]
  381.         sub     eax, [skinh]
  382.         cmp     eax, 5
  383.         ja      @f
  384.         mov     al, 12
  385.         push    1
  386.         pop     ebx
  387.         int     0x40
  388.         xor     eax, eax
  389. ; ebx, ecx, edi are ignored by function 0 after first redraw
  390.         mov     edx, 0x53000000
  391.         int     0x40
  392.         mov     al, 12
  393.         inc     ebx
  394.         int     0x40
  395.         jmp     event
  396. @@:
  397.         xor     ecx, ecx
  398.         mov     eax, [ebx+42]
  399.         mov     [wnd_width], eax
  400.         sub     eax, 5*2-1
  401.         jae     @f
  402.         xor     eax, eax
  403. @@:
  404.         cdq
  405.         mov     esi, font_width
  406.         div     esi
  407.         cmp     eax, 54
  408.         jae     @f
  409.         mov     al, 54
  410.         mov     ch, 1
  411. @@:
  412.         cmp     eax, 255
  413.         jbe     @f
  414.         mov     eax, 255
  415.         mov     ch, 1
  416. @@:
  417.         cmp     eax, [cur_width]
  418.         mov     [cur_width], eax
  419.         setnz   cl
  420.         or      cl, ch
  421.         test    edx, edx
  422.         mov     [fill_width], edx
  423.         setnz   ch
  424.         mov     eax, [ebx+46]
  425.         mov     [wnd_height], eax
  426.         sub     eax, [skinh]
  427.         sub     eax, 5-1
  428.         jns     @f
  429.         xor     eax, eax
  430. @@:
  431.         cdq
  432.         mov     esi, font_height
  433.         div     esi
  434.         cmp     eax, 8
  435.         jae     @f
  436.         mov     al, 8
  437.         mov     cl, 1
  438. @@:
  439.         cmp     eax, 255
  440.         jbe     @f
  441.         mov     eax, 255
  442.         mov     cl, 1
  443. @@:
  444.         mov     [fill_height], edx
  445.         cmp     eax, [cur_height]
  446.         mov     [cur_height], eax
  447.         jnz     .resize
  448.         test    cl, cl
  449.         jnz     .resize
  450.         test    edx, edx
  451.         setnz   cl
  452.         or      cl, ch
  453.         jz      @f
  454.         test    byte [ebx+70], 1
  455.         jnz     @f
  456. .resize:
  457.         push    67
  458.         pop     eax
  459.         or      ebx, -1
  460.         or      ecx, -1
  461.         mov     edx, [cur_width]
  462.         imul    edx, font_width
  463.         add     edx, 5*2-1
  464.         mov     esi, [cur_height]
  465.         imul    esi, font_height
  466.         add     esi, [skinh]
  467.         add     esi, 5-1
  468.         int     40h
  469. .resize_draw:
  470.         mov     ecx, [MemForImage]
  471.         call    pgfree
  472.         and     [MemForImage], 0
  473.         call    init_console
  474. ;        call    draw_window
  475.         call    draw_keybar
  476.         mov     ebp, [active_screen_data]
  477.         mov     eax, [active_screen_vtable]
  478.         call    dword [eax+screen_vtable.OnRedraw]
  479.         jmp     event
  480. @@:
  481.         call    draw_window
  482.         jmp     event
  483. alt_f9:
  484.         cmp     [saved_width], -1
  485.         jz      @f
  486.         mov     eax, [saved_width]
  487.         mov     [cur_width], eax
  488.         or      [saved_width], -1
  489.         mov     eax, [saved_height]
  490.         mov     [cur_height], eax
  491.         or      [saved_height], -1
  492.         jmp     redraw.resize
  493. @@:
  494.         push    48
  495.         pop     eax
  496.         push    5
  497.         pop     ebx
  498.         int     0x40
  499.         push    eax
  500.         sub     eax, [esp+2]
  501.         inc     eax
  502.         movzx   eax, ax
  503.         sub     eax, 10
  504.         xor     edx, edx
  505.         mov     ecx, font_width
  506.         div     ecx
  507.         xchg    [cur_width], eax
  508.         mov     [saved_width], eax
  509.         mov     eax, ebx
  510.         shr     ebx, 16
  511.         sub     eax, ebx
  512.         sub     eax, 5-1
  513.         sub     eax, [skinh]
  514.         xor     edx, edx
  515.         mov     ecx, font_height
  516.         div     ecx
  517.         xchg    [cur_height], eax
  518.         mov     [saved_height], eax
  519.         mov     ecx, ebx
  520.         pop     ebx
  521.         shr     ebx, 16
  522.         mov     edx, [cur_width]
  523.         imul    edx, font_width
  524.         add     edx, 5*2-1
  525.         mov     esi, [cur_height]
  526.         imul    esi, font_height
  527.         add     esi, [skinh]
  528.         add     esi, 4
  529.         push    67
  530.         pop     eax
  531.         int     0x40
  532.         jmp     redraw.resize_draw
  533. key:
  534.         mov     al, 2
  535.         int     40h
  536.         test    al, al
  537.         jnz     event
  538.         xchg    al, ah
  539.         cmp     al, 0xE0
  540.         jnz     @f
  541.         mov     [bWasE0], 1
  542.         jmp     event
  543. @@:
  544.         xchg    ah, [bWasE0]
  545.         mov     ebp, [active_screen_data]
  546.         mov     edx, [active_screen_vtable]
  547.         cmp     al, 0x1D
  548.         jz      .ctrl_down
  549.         cmp     al, 0x9D
  550.         jz      .ctrl_up
  551.         cmp     al, 0x2A
  552.         jz      .lshift_down
  553.         cmp     al, 0xAA
  554.         jz      .lshift_up
  555.         cmp     al, 0x36
  556.         jz      .rshift_down
  557.         cmp     al, 0xB6
  558.         jz      .rshift_up
  559.         cmp     al, 0x38
  560.         jz      .alt_down
  561.         cmp     al, 0xB8
  562.         jz      .alt_up
  563.         call    [edx+screen_vtable.OnKey]
  564.         jmp     event
  565. .ctrl_down:
  566.         test    ah, ah
  567.         jnz     .rctrl_down
  568.         or      [ctrlstate], 4
  569.         jmp     .keybar
  570. .rctrl_down:
  571.         or      [ctrlstate], 8
  572.         jmp     .keybar
  573. .ctrl_up:
  574.         test    ah, ah
  575.         jnz     .rctrl_up
  576.         and     [ctrlstate], not 4
  577.         jmp     .keybar
  578. .rctrl_up:
  579.         and     [ctrlstate], not 8
  580. .keybar:
  581.         call    draw_keybar
  582.         call    draw_image
  583. @@:     jmp     event
  584. .lshift_down:
  585. ; ignore E0 2A sequence
  586. ; e.g. arrow keys with NumLock on generate sequence E0 2A E0 xx / E0 xx+80 E0 AA
  587. ; where xx is scancode, so we can safely ignore E0 2A
  588.         test    ah, ah
  589.         jnz     @b
  590.         or      [ctrlstate], 1
  591.         jmp     .keybar
  592. .lshift_up:
  593. ; ignore E0 AA sequence
  594.         test    ah, ah
  595.         jnz     @b
  596.         and     [ctrlstate], not 1
  597.         jmp     .keybar
  598. .rshift_down:
  599.         or      [ctrlstate], 2
  600.         jmp     .keybar
  601. .rshift_up:
  602.         and     [ctrlstate], not 2
  603.         jmp     .keybar
  604. .alt_down:
  605.         test    ah, ah
  606.         jnz     .ralt_down
  607.         or      [ctrlstate], 0x10
  608.         jmp     .keybar
  609. .ralt_down:
  610.         or      [ctrlstate], 0x20
  611.         jmp     .keybar
  612. .alt_up:
  613.         test    ah, ah
  614.         jnz     .ralt_up
  615.         and     [ctrlstate], not 0x10
  616.         jmp     .keybar
  617. .ralt_up:
  618.         and     [ctrlstate], not 0x20
  619.         jmp     .keybar
  620.  
  621. process_ctrl_keys:
  622.         cmp     byte [esi], 0
  623.         jz      .done
  624.         push    ecx
  625.         cmp     al, [esi]
  626.         jz      .check
  627. .cont:
  628.         pop     ecx
  629.         add     esi, 8
  630.         jmp     process_ctrl_keys
  631. .done:
  632.         stc
  633.         ret
  634. .check:
  635.         mov     cl, 0
  636.         call    .check_ctrlkey
  637.         jc      .cont
  638.         mov     cl, 2
  639.         call    .check_ctrlkey
  640.         jc      .cont
  641.         mov     cl, 4
  642.         call    .check_ctrlkey
  643.         jc      .cont
  644.         pop     ecx
  645.         call    dword [esi+4]
  646.         clc
  647.         ret
  648. .check_ctrlkey:
  649.         push    eax edx
  650.         movzx   edx, [ctrlstate]
  651.         shr     edx, cl
  652.         add     cl, cl
  653.         movzx   eax, word [esi+2]
  654.         shr     eax, cl
  655.         and     eax, 15
  656.         cmp     al, ctrlkey_tests_num
  657.         jae     .fail
  658.         xchg    eax, edx
  659.         and     al, 3
  660.         call    [ctrlkey_tests + edx*4]
  661.         cmp     al, 1
  662.         pop     edx eax
  663.         ret
  664. .fail:
  665.         stc
  666.         pop     edx eax
  667.         ret
  668.  
  669. ctrlkey_test0:
  670.         test    al, al
  671.         setz    al
  672.         ret
  673. ctrlkey_test1:
  674.         test    al, al
  675.         setnp   al
  676.         ret
  677. ctrlkey_test2:
  678.         cmp     al, 3
  679.         setz    al
  680.         ret
  681. ctrlkey_test3:
  682.         cmp     al, 1
  683.         setz    al
  684.         ret
  685. ctrlkey_test4:
  686.         cmp     al, 2
  687.         setz    al
  688.         ret
  689.  
  690. enum_associations_callback:
  691. ; LongBool __stdcall callback(f_name,sec_name,key_name);
  692. ; [esp+4] = f_name, [esp+8] = sec_name, [esp+12] = key_name
  693.         mov     esi, [esp+12]
  694.         mov     edi, esi
  695. @@:
  696.         lodsb
  697.         test    al, al
  698.         jnz     @b
  699.         sub     esi, edi        ; esi = size of key name
  700.         push    nullstr
  701.         push    1024
  702.         push    saved_file_name
  703.         push    edi
  704.         push    dword [esp+16+8]
  705.         push    dword [esp+20+4]
  706.         call    [ini.get_str]
  707.         test    eax, eax
  708.         jnz     .ret
  709.         mov     eax, saved_file_name
  710. @@:
  711.         inc     esi
  712.         inc     eax
  713.         cmp     byte [eax-1], 0
  714.         jnz     @b
  715. ; esi = total size of entry
  716.         push    esi
  717.         add     esi, [associations_size]
  718.         mov     ecx, [associations_allocated]
  719. @@:
  720.         cmp     esi, ecx
  721.         jbe     @f
  722.         add     ecx, ecx
  723.         jmp     @b
  724. @@:
  725.         pop     esi
  726.         cmp     [associations_allocated], ecx
  727.         jz      @f
  728.         mov     [associations_allocated], ecx
  729.         mov     edx, [associations]
  730.         call    xpgrealloc
  731.         mov     [associations], eax
  732.         test    eax, eax
  733.         jz      .err
  734. @@:
  735.         mov     eax, esi
  736.         mov     esi, edi
  737.         mov     edi, [associations]
  738.         add     edi, [associations_size]
  739.         dec     edi
  740.         add     [associations_size], eax
  741. @@:
  742.         lodsb
  743.         stosb
  744.         test    al, al
  745.         jnz     @b
  746.         mov     esi, saved_file_name
  747. @@:
  748.         lodsb
  749.         stosb
  750.         test    al, al
  751.         jnz     @b
  752. .ret:
  753.         mov     al, 1
  754.         ret     12
  755. .err:
  756.         mov     ecx, edx
  757.         call    pgfree
  758.         xor     eax, eax
  759.         ret     12
  760.  
  761. enum_plugins_callback:
  762. ; LongBool __stdcall callback(f_name,sec_name,key_name);
  763. ; [esp+4] = f_name, [esp+8] = sec_name, [esp+12] = key_name
  764.         push    nullstr
  765.         push    1024
  766.         push    saved_file_name
  767.         push    dword [esp+12+12]
  768.         push    dword [esp+16+8]
  769.         push    dword [esp+20+4]
  770.         call    [ini.get_str]
  771.         test    eax, eax
  772.         jnz     .ret
  773.         mov     esi, saved_file_name
  774.         cmp     byte [esi], '/'
  775.         jz      .absolute
  776. ; convert path to absolute
  777.         mov     edi, execdata
  778.         push    esi
  779. @@:
  780.         lodsb
  781.         stosb
  782.         test    al, al
  783.         jnz     @b
  784.         pop     edi
  785.         mov     esi, app_path
  786.         push    esi
  787.         xor     ecx, ecx
  788. @@:
  789.         lodsb
  790.         test    al, al
  791.         jz      @f
  792.         cmp     al, '/'
  793.         jnz     @b
  794.         mov     ecx, esi
  795.         jmp     @b
  796. @@:
  797.         pop     esi
  798.         sub     ecx, esi
  799.         rep     movsb
  800.         mov     esi, execdata
  801. .z:
  802.         cmp     word [esi], '.'
  803.         jz      .ret
  804.         cmp     word [esi], './'
  805.         jnz     @f
  806.         add     esi, 2
  807.         jmp     .z
  808. @@:
  809.         cmp     word [esi], '..'
  810.         jnz     .c
  811.         cmp     byte [esi+2], 0
  812.         jz      .ret
  813.         cmp     byte [esi+2], '/'
  814.         jnz     .c
  815.         add     esi, 3
  816. @@:
  817.         dec     edi
  818.         cmp     edi, saved_file_name
  819.         jbe     .ret
  820.         cmp     byte [edi-1], '/'
  821.         jnz     @b
  822.         jmp     .z
  823. .c:
  824.         lodsb
  825.         stosb
  826.         test    al, al
  827.         jz      @f
  828.         cmp     edi, saved_file_name+1024
  829.         jb      .c
  830.         mov     esi, execdata
  831.         call    load_dll_and_import.big
  832. .ret:
  833.         mov     al, 1
  834.         ret     12
  835. @@:
  836. .absolute:
  837. ; allocate space for plugin info
  838.         mov     eax, [num_plugins]
  839.         inc     eax
  840.         mov     [num_plugins], eax
  841.         imul    ecx, eax, PluginInfo.size
  842.         cmp     ecx, [alloc_plugins]
  843.         jbe     .norealloc
  844.         mov     edx, [plugins]
  845.         call    xpgrealloc
  846.         test    eax, eax
  847.         jnz     @f
  848. .dec_ret:
  849.         dec     [num_plugins]
  850.         jmp     .ret
  851. @@:
  852.         mov     [plugins], eax
  853.         lea     eax, [ecx+0xFFF]
  854.         and     eax, not 0xFFF
  855.         mov     [alloc_plugins], eax
  856. .norealloc:
  857.         mov     esi, [plugins]
  858.         lea     esi, [esi+ecx-PluginInfo.size]
  859. ; load plugin DLL
  860.         or      ebp, -1
  861.         mov     eax, saved_file_name
  862.         call    load_dll_and_import.do
  863.         test    eax, eax
  864.         jnz     .dec_ret
  865. ; find exported functions
  866.         mov     eax, aVersion
  867.         call    load_dll_and_import.find_exported_function
  868.         jnc     @f
  869.         xor     eax, eax
  870. @@:
  871. MIN_INTERFACE_VER = 1
  872. MAX_INTERFACE_VER = 1
  873.         cmp     eax, MIN_INTERFACE_VER
  874.         jae     @f
  875.         cmp     eax, MAX_INTERFACE_VER
  876.         jbe     @f
  877.         push    aIncompatibleVersion
  878. .cantload:
  879.         push    saved_file_name
  880.         push    aCannotLoadPlugin
  881.         mov     eax, esp
  882.         push    ContinueBtn
  883.         push    1
  884.         push    eax
  885.         push    3
  886.         call    SayErr
  887.         add     esp, 12
  888.         jmp     .dec_ret
  889. @@:
  890.         mov     edi, esi
  891.         mov     esi, plugin_exported
  892. .import:
  893.         lodsd
  894.         test    eax, eax
  895.         jz      .import_done
  896.         call    load_dll_and_import.find_exported_function
  897.         jnc     @f
  898.         mov     eax, [esi-4+plugin_exported_default-plugin_exported]
  899. @@:
  900.         stosd
  901.         jmp     .import
  902. .import_done:
  903. ; initialize plugin
  904.         mov     eax, aPluginLoad
  905.         call    load_dll_and_import.find_exported_function
  906.         jc      .ok
  907.         push    kfar_info
  908.         call    eax
  909.         cmp     eax, 1
  910.         jb      .ok
  911.         ja      .dec_ret
  912.         push    aInitFailed
  913.         jmp     .cantload
  914. .ok:
  915.         mov     al, 1
  916.         ret     12
  917.  
  918. plugin_unload_default:
  919.         ret
  920.  
  921. OpenFilePlugin_default:
  922. GetFiles_default:
  923.         xor     eax, eax
  924.         ret     20
  925.  
  926. ClosePlugin_default:
  927.         ret     4
  928.  
  929. GetOpenPluginInfo_default:
  930.         ret     8
  931.  
  932. SetFolder_default:
  933. open_default:
  934.         xor     eax, eax
  935.         ret     12
  936.  
  937. new_screen:
  938. ; in: ecx=sizeof(screen data), edx->vtable
  939. ; out: ebp=pointer or NULL, eax!=0 if successful
  940. ; destroys ebx,ecx
  941.         call    xpgalloc
  942.         test    eax, eax
  943.         jnz     @f
  944.         ret
  945. @@:
  946.         mov     ebp, eax
  947.         mov     eax, [screens]
  948.         mov     ecx, [num_screens]
  949.         inc     ecx
  950.         shl     ecx, 3
  951.         test    ecx, 0xFFF
  952.         jnz     .norealloc
  953.         push    edx
  954.         mov     edx, eax
  955.         call    xpgrealloc
  956.         pop     edx
  957.         test    eax, eax
  958.         jnz     @f
  959.         mov     ecx, ebp
  960.         call    pgfree
  961.         xor     eax, eax
  962.         ret
  963. @@:
  964.         mov     [screens], eax
  965. .norealloc:
  966.         inc     [num_screens]
  967.         mov     [eax+ecx-8], edx
  968.         mov     [eax+ecx-4], ebp
  969.         mov     eax, [num_screens]
  970.         dec     eax
  971.         mov     [active_screen], eax
  972.         mov     [active_screen_vtable], edx
  973.         mov     [active_screen_data], ebp
  974.         jmp     draw_keybar
  975.  
  976. next_screen:
  977.         mov     eax, [active_screen]
  978.         inc     eax
  979.         cmp     eax, [num_screens]
  980.         jnz     @f
  981.         xor     eax, eax
  982. @@:     mov     [active_screen], eax
  983.         jmp     change_screen
  984.  
  985. delete_active_screen:
  986.         mov     edi, [screens]
  987.         mov     eax, [active_screen]
  988.         shl     eax, 3
  989.         add     edi, eax
  990.         push    dword [edi+4]
  991.         lea     esi, [edi+8]
  992.         mov     ecx, [num_screens]
  993.         sub     ecx, [active_screen]
  994.         dec     ecx
  995.         add     ecx, ecx
  996.         rep     movsd
  997.         dec     [num_screens]
  998.         mov     ecx, [num_screens]
  999.         shl     ecx, 3
  1000.         test    ecx, 0xFFF
  1001.         jnz     .norealloc
  1002.         mov     edx, [screens]
  1003.         call    pgrealloc               ; must succeed, because we decrease size
  1004.         mov     [screens], eax
  1005. .norealloc:
  1006.         pop     ecx
  1007.         call    pgfree
  1008.         and     [active_screen], 0
  1009.  
  1010. change_screen:
  1011.         pusha
  1012.         mov     eax, [active_screen]
  1013.         mov     esi, [screens]
  1014.         mov     ebp, [esi+eax*8+4]
  1015.         mov     eax, [esi+eax*8]
  1016.         mov     [active_screen_vtable], eax
  1017.         mov     [active_screen_data], ebp
  1018.         call    draw_keybar
  1019.         call    [eax+screen_vtable.OnRedraw]
  1020.         popa
  1021.         ret
  1022.  
  1023. F12:
  1024.         mov     eax, [cur_width]
  1025.         add     eax, 8
  1026.         mov     esi, eax
  1027.         mul     [num_screens]
  1028.         mov     ecx, eax
  1029.         call    xpgalloc
  1030.         test    eax, eax
  1031.         jnz     @f
  1032.         ret
  1033. @@:
  1034.         mov     ebx, eax
  1035.         mov     edi, eax
  1036.         xor     ecx, ecx
  1037. .next:
  1038.         xor     eax, eax
  1039.         stosd
  1040.         inc     ecx
  1041.         cmp     ecx, [num_screens]
  1042.         jz      @f
  1043.         lea     eax, [edi+esi-4]
  1044.         mov     dword [edi-4], eax
  1045. @@:
  1046.         xor     eax, eax
  1047.         stosd
  1048.         dec     ecx
  1049.         jz      @f
  1050.         lea     eax, [edi-8]
  1051.         sub     eax, esi
  1052.         mov     dword [edi-4], eax
  1053. @@:
  1054.         mov     al, '&'
  1055.         stosb
  1056.         cmp     ecx, 36
  1057.         jae     .noletter
  1058.         lea     eax, [ecx+'0']
  1059.         cmp     al, '9'
  1060.         jbe     @f
  1061.         add     al, 7
  1062. @@:
  1063.         stosb
  1064.         mov     al, '.'
  1065.         stosb
  1066.         jmp     .letter_done
  1067. .noletter:
  1068.         mov     al, ' '
  1069.         stosb
  1070.         stosb
  1071. .letter_done:
  1072.         mov     al, ' '
  1073.         stosb
  1074.         pushad
  1075.         mov     eax, [screens]
  1076.         mov     ebp, [eax+ecx*8+4]
  1077.         mov     eax, [eax+ecx*8]
  1078.         mov     ecx, [cur_width]
  1079.         sub     ecx, 12
  1080.         call    [eax + screen_vtable.getname]
  1081.         popad
  1082.         sub     edi, 4
  1083.         add     edi, [cur_width]
  1084.         inc     ecx
  1085.         cmp     ecx, [num_screens]
  1086.         jb      .next
  1087.         mov     eax, [active_screen]
  1088.         mul     esi
  1089.         add     eax, ebx
  1090.         push    1
  1091.         push    dword aScreens
  1092.         push    eax
  1093.         call    menu
  1094.         cmp     eax, -1
  1095.         jz      @f
  1096.         sub     eax, ebx
  1097.         div     esi
  1098.         mov     [active_screen], eax
  1099. @@:
  1100.         mov     ecx, ebx
  1101.         call    pgfree
  1102.         jmp     change_screen
  1103.  
  1104. panels_OnKey:
  1105.         mov     ebp, [active_panel]
  1106.         mov     ecx, [ebp + panel1_index - panel1_data]
  1107.         mov     edx, [ebp + panel1_start - panel1_data]
  1108.         mov     ebx, [ebp + panel1_colst - panel1_data]
  1109.         add     ebx, edx
  1110.         mov     esi, panels_ctrlkeys
  1111.         jmp     process_ctrl_keys
  1112. .ret:
  1113.         ret
  1114. .up:
  1115.         jecxz   .ret
  1116.         dec     ecx
  1117.         mov     [ebp + panel1_index - panel1_data], ecx
  1118.         cmp     ecx, edx
  1119.         jae     .done_redraw
  1120.         mov     [ebp + panel1_start - panel1_data], ecx
  1121. .done_redraw:
  1122. ;        call    draw_panel
  1123. ;        ret
  1124.         jmp     draw_panel
  1125. .insert:
  1126.         lea     eax, [ecx*4]
  1127.         add     eax, [ebp + panel1_files - panel1_data]
  1128.         mov     eax, [eax]
  1129.         cmp     word [eax+40], '..'
  1130.         jnz     @f
  1131.         cmp     byte [eax+42], 0
  1132.         jz      .insert.down
  1133. @@:
  1134.         xor     byte [eax+303], 1
  1135.         mov     edx, [eax+32]
  1136.         test    byte [eax+303], 1
  1137.         mov     eax, [eax+36]
  1138.         jnz     .insert.increase
  1139.         sub     dword [ebp + panel1_selected_size - panel1_data], edx
  1140.         sbb     dword [ebp + panel1_selected_size+4 - panel1_data], eax
  1141.         dec     [ebp + panel1_selected_num - panel1_data]
  1142.         jmp     .insert.down
  1143. .insert.increase:
  1144.         add     dword [ebp + panel1_selected_size - panel1_data], edx
  1145.         adc     dword [ebp + panel1_selected_size+4 - panel1_data], eax
  1146.         inc     [ebp + panel1_selected_num - panel1_data]
  1147. .insert.down:
  1148.         inc     ecx
  1149.         cmp     ecx, [ebp + panel1_numfiles - panel1_data]
  1150.         jae     .done_redraw
  1151.         jmp     @f
  1152. .down:
  1153.         inc     ecx
  1154.         cmp     ecx, [ebp + panel1_numfiles - panel1_data]
  1155.         jae     .ret
  1156. @@:
  1157.         mov     [ebp + panel1_index - panel1_data], ecx
  1158.         cmp     ecx, ebx
  1159.         jb      .done_redraw
  1160.         sub     ecx, [ebp + panel1_colst - panel1_data]
  1161.         inc     ecx
  1162.         mov     [ebp + panel1_start - panel1_data], ecx
  1163.         jmp     .done_redraw
  1164. .left:
  1165.         test    ecx, ecx
  1166.         jnz     @f
  1167.         ret
  1168. @@:
  1169.         mov     eax, [ebp + panel1_colsz - panel1_data]
  1170.         sub     ecx, eax
  1171.         jae     @f
  1172.         xor     ecx, ecx
  1173. @@:
  1174.         mov     [ebp + panel1_index - panel1_data], ecx
  1175. .finalize_left:
  1176.         cmp     ecx, edx
  1177.         jae     .done_redraw
  1178.         sub     edx, eax
  1179.         jae     @f
  1180.         xor     edx, edx
  1181. @@:
  1182.         mov     [ebp + panel1_start - panel1_data], edx
  1183.         jmp     .done_redraw
  1184. .pgup:
  1185.         mov     eax, [ebp + panel1_colst - panel1_data]
  1186.         dec     eax
  1187.         jnz     @f
  1188.         inc     eax
  1189. @@:
  1190.         test    ecx, ecx
  1191.         jnz     @f
  1192.         ret
  1193. @@:
  1194.         sub     ecx, eax
  1195.         jae     @f
  1196.         xor     ecx, ecx
  1197. @@:
  1198.         mov     [ebp + panel1_index - panel1_data], ecx
  1199.         dec     ecx
  1200.         jmp     .finalize_left
  1201. .right:
  1202.         mov     eax, [ebp + panel1_colsz - panel1_data]
  1203.         add     ecx, eax
  1204.         cmp     ecx, [ebp + panel1_numfiles - panel1_data]
  1205.         jb      @f
  1206.         mov     ecx, [ebp + panel1_numfiles - panel1_data]
  1207.         dec     ecx
  1208. @@:
  1209.         mov     [ebp + panel1_index - panel1_data], ecx
  1210. .finalize_right:
  1211.         cmp     ecx, ebx
  1212.         jb      .done_redraw
  1213.         add     ebx, eax
  1214.         cmp     ebx, [ebp + panel1_numfiles - panel1_data]
  1215.         jbe     @f
  1216.         mov     ebx, [ebp + panel1_numfiles - panel1_data]
  1217. @@:
  1218.         sub     ebx, [ebp + panel1_colst - panel1_data]
  1219.         jae     @f
  1220.         xor     ebx, ebx
  1221. @@:
  1222.         mov     [ebp + panel1_start - panel1_data], ebx
  1223.         jmp     .done_redraw
  1224. .pgdn:
  1225.         mov     eax, [ebp + panel1_colst - panel1_data]
  1226.         dec     eax
  1227.         jnz     @f
  1228.         inc     eax
  1229. @@:
  1230.         add     ecx, eax
  1231.         cmp     ecx, [ebp + panel1_numfiles - panel1_data]
  1232.         jb      @f
  1233.         mov     ecx, [ebp + panel1_numfiles - panel1_data]
  1234.         dec     ecx
  1235. @@:
  1236.         mov     [ebp + panel1_index - panel1_data], ecx
  1237.         inc     ecx
  1238.         jmp     .finalize_right
  1239. .tab:
  1240.         xor     [active_panel], panel1_data xor panel2_data
  1241.         call    draw_cmdbar
  1242.         call    draw_panel
  1243.         mov     ebp, [active_panel]
  1244.         jmp     .done_redraw
  1245. .home:
  1246.         and     [ebp + panel1_start - panel1_data], 0
  1247.         and     [ebp + panel1_index - panel1_data], 0
  1248.         jmp     .done_redraw
  1249. .end:
  1250.         mov     eax, [ebp + panel1_numfiles - panel1_data]
  1251.         dec     eax
  1252.         mov     [ebp + panel1_index - panel1_data], eax
  1253.         inc     eax
  1254.         sub     eax, [ebp + panel1_colst - panel1_data]
  1255.         jae     @f
  1256.         xor     eax, eax
  1257. @@:
  1258.         mov     [ebp + panel1_start - panel1_data], eax
  1259.         jmp     .done_redraw
  1260. .enter:
  1261.         call    get_curfile_folder_entry
  1262.         test    byte [ecx], 10h
  1263.         jnz     .enter_folder
  1264. ; todo: add <Enter> handling on plugin panel
  1265.         cmp     [ebp + panel1_hPlugin - panel1_data], 0
  1266.         jnz     .ret
  1267. ; generate full file name
  1268.         lea     esi, [ebp + panel1_dir - panel1_data]
  1269.         mov     edi, execdata
  1270. @@:
  1271.         lodsb
  1272.         test    al, al
  1273.         jz      @f
  1274.         stosb
  1275.         cmp     edi, execdataend-1
  1276.         jae     .bigfilename
  1277.         jmp     @b
  1278. @@:
  1279.         lea     esi, [ecx+40]
  1280.         mov     al, '/'
  1281.         stosb
  1282. @@:
  1283.         lodsb
  1284.         stosb
  1285.         cmp     edi, execdataend
  1286.         ja      .bigfilename
  1287.         test    al, al
  1288.         jnz     @b
  1289. ; try to open file and look for all plugins
  1290.         push    O_READ
  1291.         push    execdata
  1292.         call    open
  1293.         test    eax, eax
  1294.         jz      .noplugins      ; if can't open, just try to execute
  1295.         mov     esi, eax        ; save handle
  1296.         push    filedata_buffer_size
  1297.         push    filedata_buffer
  1298.         push    esi
  1299.         call    read
  1300.         mov     edi, eax        ; save size of read data
  1301. ; test for Kolibri executable
  1302.         cmp     eax, 24h
  1303.         jb      .enter.noexec
  1304.         cmp     dword [filedata_buffer], 'MENU'
  1305.         jnz     @f
  1306.         cmp     word [filedata_buffer+4], 'ET'
  1307.         jnz     @f
  1308. .close_run:
  1309.         push    esi
  1310.         call    close
  1311.         jmp     .run_app
  1312. @@:
  1313.         cmp     dword [filedata_buffer], 'KPCK'
  1314.         jnz     @f
  1315.         cmp     dword [filedata_buffer+12], 0x26914601
  1316.         jz      .close_run
  1317. @@:
  1318. .enter.noexec:
  1319.         mov     ecx, [num_plugins]
  1320.         mov     edx, [plugins]
  1321.         sub     edx, PluginInfo.size
  1322. .plugloop:
  1323.         add     edx, PluginInfo.size
  1324.         dec     ecx
  1325.         js      .plugdone
  1326.         pushad
  1327.         push    edi
  1328.         push    filedata_buffer
  1329.         call    get_curfile_folder_entry
  1330.         push    ecx
  1331.         push    execdata
  1332.         push    esi
  1333.         call    [edx+PluginInfo.OpenFilePlugin]
  1334.         mov     [esp+28], eax
  1335.         popad
  1336.         test    eax, eax
  1337.         jz      .plugloop
  1338.         cmp     eax, -1
  1339.         jnz     .pluginok
  1340.         push    esi
  1341.         call    close
  1342.         ret
  1343. .pluginok:
  1344. ; save current directory and set root directory of hPlugin
  1345.         mov     edi, eax        ; save handle
  1346.         mov     esi, execdata
  1347. @@:
  1348.         lodsb
  1349.         test    al, al
  1350.         jnz     @b
  1351.         sub     esi, execdata-9
  1352. ; allocate esi bytes in buffer 'parents'
  1353.         mov     ecx, [ebp + panel1_parents_sz - panel1_data]
  1354.         add     ecx, esi
  1355.         cmp     ecx, [ebp + panel1_parents_alloc - panel1_data]
  1356.         jbe     .enter.norealloc
  1357.         push    edx
  1358.         mov     edx, [ebp + panel1_parents - panel1_data]
  1359.         call    xpgrealloc
  1360.         pop     edx
  1361.         test    eax, eax
  1362.         jnz     @f
  1363.         push    edi
  1364.         call    [edx+PluginInfo.ClosePlugin]
  1365.         ret
  1366. @@:
  1367.         mov     [ebp + panel1_parents - panel1_data], eax
  1368. .enter.norealloc:
  1369.         mov     [ebp + panel1_parents_sz - panel1_data], ecx
  1370. ; save current state to the end of buffer
  1371.         sub     ecx, esi
  1372.         add     ecx, [ebp + panel1_parents - panel1_data]
  1373.         xchg    edx, [ebp + panel1_hPlugin - panel1_data]
  1374.         mov     [ecx], edx
  1375.         xchg    edi, [ebp + panel1_hFile - panel1_data]
  1376.         mov     [ecx+4], edi
  1377.         mov     byte [ecx+8], 0
  1378.         lea     edi, [ecx+9]
  1379.         lea     ecx, [esi-9]
  1380.         mov     esi, execdata
  1381.         rep     movsb
  1382.         mov     word [ebp + panel1_dir - panel1_data], '/'
  1383.         mov     eax, [ebp + panel1_hPlugin - panel1_data]
  1384.         lea     ebx, [ebp + panel1_plugin_info - panel1_data]
  1385.         and     dword [ebx], 0
  1386.         push    ebp
  1387.         push    ebx
  1388.         push    [ebp + panel1_hFile - panel1_data]
  1389.         call    [eax+PluginInfo.GetOpenPluginInfo]
  1390.         pop     ebp
  1391.         call    get_curfile_folder_entry
  1392.         mov     esi, ecx
  1393.         mov     edi, left_dotdot_entry
  1394.         cmp     ebp, panel1_data
  1395.         jz      @f
  1396.         add     edi, right_dotdot_entry-left_dotdot_entry
  1397. @@:
  1398.         mov     ecx, 10
  1399.         rep     movsd
  1400.         mov     byte [edi-40], 10h      ; attributes: folder
  1401.         mov     eax, '..'
  1402.         stosd
  1403.         jmp     .reread
  1404. .plugdone:
  1405.         push    esi
  1406.         call    close
  1407. .noplugins:
  1408. ; run program or association
  1409.         call    get_curfile_folder_entry
  1410.         call    find_extension
  1411.         jc      .run_app
  1412. .run_association:
  1413.         cmp     byte [edi], 0
  1414.         jz      .l1
  1415.         cmp     byte [edi], ';'
  1416.         jnz     @f
  1417. .l1:
  1418.         ret
  1419. @@:
  1420.         mov     esi, edi
  1421. @@:
  1422.         lodsb
  1423.         test    al, al
  1424.         jz      @f
  1425.         cmp     al, ';'
  1426.         jnz     @b
  1427.         dec     esi
  1428.         mov     byte [esi], 0
  1429.         mov     [restore_semicolon], esi
  1430. @@:
  1431. .run_association2:
  1432.         mov     [execparams], execdata
  1433.         mov     [execptr], edi
  1434.         jmp     .dorun
  1435. .run_app:
  1436.         mov     [execptr], execdata
  1437.         and     [execparams], 0
  1438. .dorun:
  1439. ; for fasm call - special handling, because
  1440. ; 1) fasm command line convention is different : fasm infile,outfile[,path] rather than tinypad infile
  1441. ; 2) fasm will probably create new file in directory, so we want to reload panel data
  1442.         xor     edx, edx
  1443.         cmp     [execparams], edx
  1444.         jz      .nofasm
  1445.         mov     esi, [execptr]
  1446. @@:
  1447.         lodsb
  1448.         test    al, al
  1449.         jnz     @b
  1450.         mov     eax, [esi-5]
  1451.         or      eax, 0x20202020
  1452.         cmp     eax, 'fasm'
  1453.         jnz     .nofasm
  1454.         cmp     edi, execdata+(execdataend-execdata)/2
  1455.         ja      .bigfilename
  1456.         mov     esi, execdata
  1457. @@:
  1458.         lodsb
  1459.         stosb
  1460.         test    al, al
  1461.         jnz     @b
  1462.         mov     byte [esi-1], ','
  1463.         inc     edx
  1464. ; output file: no extension if input file has extension, '.bin' otherwise
  1465.         push    edi
  1466. @@:
  1467.         dec     edi
  1468.         cmp     byte [edi], '.'
  1469.         jz      .ptfound
  1470.         cmp     byte [edi], '/'
  1471.         jnz     @b
  1472.         pop     edi
  1473.         cmp     edi, execdataend-4
  1474.         ja      .bigfilename
  1475.         mov     dword [edi-1], '.bin'
  1476.         mov     byte [edi+3], 0
  1477.         jmp     .nofasm
  1478. .ptfound:
  1479.         mov     byte [edi], 0
  1480.         pop     edi
  1481. .nofasm:
  1482.         mov     ebx, execinfo
  1483. ; if command line is more than 256 symbols, the kernel will truncate it
  1484. ; we do not want this!
  1485. ; N.B. We know that command line is either NULL or execdata, which is always ASCIIZ string,
  1486. ;      but can be up to 1023 symbols
  1487.         mov     esi, [ebx+8]
  1488.         test    esi, esi
  1489.         jz      .cmdlinelenok
  1490. @@:
  1491.         lodsb
  1492.         test    al, al
  1493.         jnz     @b
  1494.         sub     esi, [ebx+8]
  1495.         dec     esi
  1496.         cmp     esi, 256
  1497.         ja      .bigcmdline
  1498. .cmdlinelenok:
  1499.         push    70
  1500.         pop     eax
  1501.         int     40h
  1502.         xor     esi, esi
  1503.         xchg    esi, [restore_semicolon]
  1504.         test    esi, esi
  1505.         jz      @f
  1506.         mov     byte [esi], ';'
  1507. @@:
  1508.         neg     eax
  1509.         js      @f
  1510.         call    get_error_msg
  1511.         push    eax
  1512.         push    dword aRunError
  1513.         mov     eax, esp
  1514.         push    ContinueBtn
  1515.         push    1
  1516.         push    eax
  1517.         push    2
  1518.         call    SayErr
  1519.         pop     eax
  1520.         pop     eax
  1521.         ret
  1522. @@:
  1523.         test    edx, edx
  1524.         jz      @f
  1525.         push    5
  1526.         pop     eax
  1527.         push    20
  1528.         pop     ebx
  1529.         int     0x40
  1530.         jmp     .ctrl_r
  1531. @@:
  1532.         ret
  1533. .bigfilename3:
  1534.         pop     esi
  1535. .bigfilename2:
  1536.         pop     esi
  1537. .bigfilename:
  1538.         mov     eax, aFileNameTooBig
  1539. .l2:
  1540.         xor     esi, esi
  1541.         xchg    esi, [restore_semicolon]
  1542.         test    esi, esi
  1543.         jz      @f
  1544.         mov     byte [esi], ';'
  1545. @@:
  1546.         push    eax
  1547.         mov     eax, esp
  1548.         push    ContinueBtn
  1549.         push    1
  1550.         push    eax
  1551.         push    1
  1552.         call    SayErr
  1553.         pop     eax
  1554.         ret
  1555. .bigcmdline:
  1556.         mov     eax, aCmdLineTooBig
  1557.         jmp     .l2
  1558. .bigfoldername2:
  1559.         mov     esi, prev_dir
  1560.         lea     edi, [ebp + panel1_dir - panel1_data]
  1561. @@:
  1562.         lodsb
  1563.         stosb
  1564.         test    al, al
  1565.         jnz     @b
  1566. .bigfoldername:
  1567.         mov     eax, aFolderNameTooBig
  1568.         jmp     .l2
  1569. .enter_folder:
  1570.         lea     esi, [ecx+40]
  1571.         cmp     word [esi], '..'
  1572.         jnz     @f
  1573.         cmp     byte [esi+2], 0
  1574.         jz      .dotdot
  1575. @@:
  1576.         push    esi
  1577.         lea     esi, [ebp + panel1_dir - panel1_data]
  1578.         mov     edi, prev_dir
  1579. @@:
  1580.         lodsb
  1581.         stosb
  1582.         test    al, al
  1583.         jnz     @b
  1584.         lea     edi, [esi-1]
  1585.         lea     edx, [ebp + panel1_dir - panel1_data + 1024]
  1586.         cmp     esi, edx
  1587.         pop     esi
  1588.         jae     .bigfoldername
  1589.         mov     al, '/'
  1590.         cmp     [edi-1], al
  1591.         jz      @f
  1592.         stosb
  1593. @@:
  1594.         lodsb
  1595.         cmp     edi, edx
  1596.         jae     .bigfoldername2
  1597.         stosb
  1598.         test    al, al
  1599.         jnz     @b
  1600.         mov     eax, [ebp + panel1_hPlugin - panel1_data]
  1601.         test    eax, eax
  1602.         jz      .reread
  1603.         push    ebp
  1604.         lea     esi, [ebp + panel1_dir - panel1_data]
  1605.         push    esi
  1606.         add     ecx, 40
  1607.         push    ecx
  1608.         push    [ebp + panel1_hFile - panel1_data]
  1609.         call    [eax+PluginInfo.SetFolder]
  1610.         pop     ebp
  1611.         test    al, al
  1612.         jnz     .reread
  1613.         mov     esi, prev_dir
  1614.         lea     edi, [ebp + panel1_dir - panel1_data]
  1615. @@:
  1616.         lodsb
  1617.         stosb
  1618.         test    al, al
  1619.         jnz     @b
  1620. .retd:
  1621.         ret
  1622. .reread:
  1623.         call    read_folder
  1624. .done_cmdbar:
  1625.         call    draw_cmdbar
  1626.         jmp     .done_redraw
  1627. .dotdot:
  1628.         lea     edi, [ebp + panel1_dir - panel1_data]
  1629.         cmp     word [edi], '/'
  1630.         jnz     .dotdot_noroot
  1631.         cmp     [ebp + panel1_hPlugin - panel1_data], 0
  1632.         jz      .retd
  1633.         call    close_plugin_panel
  1634.         jmp     .dotdot
  1635. .dotdot_noroot:
  1636.         mov     edx, edi
  1637.         mov     al, 0
  1638.         or      ecx, -1
  1639.         repnz   scasb
  1640.         dec     edi
  1641.         mov     al, '/'
  1642.         std
  1643.         repnz   scasb
  1644.         cld
  1645.         inc     edi
  1646.         cmp     edi, edx
  1647.         jnz     @f
  1648.         inc     edi
  1649. @@:
  1650.         push    dword [edi]
  1651.         mov     byte [edi], 0
  1652.         push    edi
  1653.         mov     eax, [ebp + panel1_hPlugin - panel1_data]
  1654.         test    eax, eax
  1655.         jz      .dotdot_native
  1656.         push    ebp
  1657.         lea     esi, [ebp + panel1_dir - panel1_data]
  1658.         push    esi
  1659.         push    aDotDot
  1660.         push    [ebp + panel1_hFile - panel1_data]
  1661.         call    [eax+PluginInfo.SetFolder]
  1662.         pop     ebp
  1663.         test    al, al
  1664.         jnz     .dotdot_native
  1665.         pop     edi
  1666.         pop     dword [edi]
  1667.         ret
  1668. .dotdot_native:
  1669.         call    read_folder
  1670.         pop     edi
  1671.         pop     dword [edi]
  1672.         push    edi
  1673.         cmp     byte [edi], '/'
  1674.         jnz     @f
  1675.         inc     edi
  1676. @@:
  1677.         mov     edx, [ebp + panel1_files - panel1_data]
  1678.         mov     ecx, [ebp + panel1_numfiles - panel1_data]
  1679. .scanloop:
  1680.         mov     esi, [edx]
  1681.         add     esi, 40
  1682.         push    esi edi
  1683. @@:
  1684.         lodsb
  1685.         call    match_symbol
  1686.         jnz     @f
  1687.         inc     edi
  1688.         test    al, al
  1689.         jnz     @b
  1690. @@:
  1691.         pop     edi esi
  1692.         jz      .scanfound
  1693.         add     edx, 4
  1694.         loop    .scanloop
  1695.         jmp     .scandone
  1696. .scanfound:
  1697.         sub     edx, [ebp + panel1_files - panel1_data]
  1698.         shr     edx, 2
  1699.         mov     [ebp + panel1_index - panel1_data], edx
  1700.         sub     edx, [ebp + panel1_colst - panel1_data]
  1701.         jb      .scandone
  1702.         inc     edx
  1703.         mov     [ebp + panel1_start - panel1_data], edx
  1704. .scandone:
  1705.         pop     edi
  1706.         mov     byte [edi], 0
  1707.         jmp     .done_cmdbar
  1708. .ctrl_f39:
  1709.         sub     al, 0x3D
  1710.         add     al, al
  1711.         mov     ah, [ebp + panel1_sortmode - panel1_data]
  1712.         and     ah, 0xFE
  1713.         cmp     al, ah
  1714.         jnz     @f
  1715.         and     [ebp + panel1_sortmode - panel1_data], 1
  1716.         or      al, [ebp + panel1_sortmode - panel1_data]
  1717.         xor     al, 1
  1718. @@:
  1719.         mov     [ebp + panel1_sortmode - panel1_data], al
  1720.         mov     eax, [ebp + panel1_index - panel1_data]
  1721.         mov     ecx, [ebp + panel1_files - panel1_data]
  1722.         push    dword [ecx+eax*4]
  1723.         push    ecx
  1724.         call    sort_files
  1725.         pop     edi
  1726.         pop     eax
  1727.         or      ecx, -1
  1728.         repnz   scasd
  1729.         not     ecx
  1730.         dec     ecx
  1731.         mov     [ebp + panel1_index - panel1_data], ecx
  1732.         sub     ecx, [ebp + panel1_start - panel1_data]
  1733.         jb      .less_start
  1734.         sub     ecx, [ebp + panel1_colst - panel1_data]
  1735.         jae     .gr_end
  1736. @@:     jmp     .done_redraw
  1737. .less_start:
  1738.         add     [ebp + panel1_start - panel1_data], ecx
  1739.         jmp     @b
  1740. .gr_end:
  1741.         inc     ecx
  1742.         add     [ebp + panel1_start - panel1_data], ecx
  1743.         jmp     @b
  1744. .alt_f12:
  1745.         mov     ebp, panel1_data
  1746.         cmp     al, 0x3B
  1747.         jz      @f
  1748.         mov     ebp, panel2_data
  1749. @@:
  1750. ; get drives list
  1751.         mov     ebx, dirinfo
  1752.         mov     [ebx+dirinfo.size-dirinfo], 1
  1753.         mov     [ebx+dirinfo.dirdata-dirinfo], driveinfo
  1754.         mov     [ebx+dirinfo.name-dirinfo], tmpname
  1755.         mov     byte [tmpname], '/'
  1756.         xor     edx, edx
  1757.         xor     ecx, ecx
  1758. .drive_loop_e:
  1759.         mov     byte [tmpname+1], 0
  1760.         push    70
  1761.         pop     eax
  1762.         int     40h
  1763.         mov     ebx, dirinfo
  1764.         test    eax, eax
  1765.         jnz     .drive_loop_e_done
  1766.         mov     esi, driveinfo+32+40
  1767.         mov     edi, tmpname+1
  1768. @@:
  1769.         lodsb
  1770.         stosb
  1771.         test    al, al
  1772.         jnz     @b
  1773.         push    [ebx+dirinfo.first-dirinfo]
  1774.         and     [ebx+dirinfo.first-dirinfo], 0
  1775. .drive_loop_i:
  1776.         push    70
  1777.         pop     eax
  1778.         int     40h
  1779.         mov     ebx, dirinfo
  1780.         test    eax, eax
  1781.         jnz     .drive_loop_i_done
  1782.         add     ecx, 32+8
  1783.         push    ecx
  1784.         and     ecx, 0xFFF
  1785.         cmp     ecx, 32+8
  1786.         pop     ecx
  1787.         ja      @f
  1788.         call    xpgrealloc
  1789.         mov     edx, eax
  1790.         test    eax, eax
  1791.         jnz     @f
  1792.         pop     eax
  1793.         ret
  1794. @@:
  1795.         lea     edi, [edx+ecx-32]
  1796.         mov     esi, tmpname
  1797. @@:
  1798.         lodsb
  1799.         test    al, al
  1800.         jz      @f
  1801.         stosb
  1802.         jmp     @b
  1803. @@:
  1804.         mov     esi, driveinfo+32+40
  1805.         mov     al, '/'
  1806.         stosb
  1807. @@:
  1808.         lodsb
  1809.         stosb
  1810.         test    al, al
  1811.         jnz     @b
  1812.         inc     [ebx+dirinfo.first-dirinfo]
  1813.         jmp     .drive_loop_i
  1814. .drive_loop_i_done:
  1815.         pop     [ebx+dirinfo.first-dirinfo]
  1816.         inc     [ebx+dirinfo.first-dirinfo]
  1817.         jmp     .drive_loop_e
  1818. .drive_loop_e_done:
  1819.         and     [ebx+dirinfo.first-dirinfo], 0
  1820.         mov     edi, edx
  1821.         xor     esi, esi
  1822.         add     ecx, edx
  1823. @@:
  1824.         and     dword [edi], 0
  1825.         mov     dword [edi+4], esi
  1826.         mov     esi, edi
  1827.         add     edi, 32+8
  1828.         cmp     edi, ecx
  1829.         jae     @f
  1830.         mov     [esi], edi
  1831.         jmp     @b
  1832. @@:
  1833.         mov     ecx, edx
  1834.         lea     edi, [ebp + panel1_dir - panel1_data]
  1835.         cmp     [ebp + panel1_hPlugin - panel1_data], 0
  1836.         jz      .find_cur_drive_loop
  1837.         mov     edi, [ebp + panel1_parents - panel1_data]
  1838.         add     edi, 8
  1839. .find_cur_drive_loop:
  1840.         push    edi
  1841.         lea     esi, [ecx+8]
  1842. @@:
  1843.         lodsb
  1844.         test    al, al
  1845.         jz      .cur_drive_found
  1846.         call    match_symbol
  1847.         jnz     @f
  1848.         inc     edi
  1849.         jmp     @b
  1850. @@:
  1851.         cmp     dword [ecx], 0
  1852.         jz      @f
  1853.         pop     edi
  1854.         mov     ecx, [ecx]
  1855.         jmp     .find_cur_drive_loop
  1856. @@:
  1857.         mov     ecx, edx
  1858. .cur_drive_found:
  1859.         pop     edi
  1860.         push    1
  1861.         push    aDrive
  1862.         push    ecx
  1863.         mov     eax, [ebp + panel1_height - panel1_data]
  1864.         sub     eax, 2
  1865.         jae     @f
  1866.         add     eax, 2
  1867. @@:
  1868.         push    eax
  1869.         push    [ebp + panel1_width - panel1_data]
  1870.         push    [ebp + panel1_top - panel1_data]
  1871.         push    [ebp + panel1_left - panel1_data]
  1872.         call    menu_centered_in
  1873.         cmp     eax, -1
  1874.         jnz     @f
  1875.         mov     ecx, edx
  1876.         call    pgfree
  1877.         ret
  1878. @@:
  1879.         push    eax
  1880.         call    close_plugin_panels
  1881.         lea     edi, [ebp + panel1_dir - panel1_data]
  1882.         push    edi
  1883.         mov     esi, edi
  1884.         mov     edi, prev_dir
  1885.         mov     ecx, 1024/4
  1886.         rep     movsd
  1887.         pop     edi
  1888.         pop     esi
  1889.         add     esi, 8
  1890. @@:
  1891.         lodsb
  1892.         stosb
  1893.         test    al, al
  1894.         jnz     @b
  1895.         mov     ecx, edx
  1896.         call    pgfree
  1897.         call    read_folder
  1898.         jmp     .done_redraw
  1899. .shift_f5:
  1900. ; todo: copy to plugin panel
  1901.         cmp     [ebp + panel1_hPlugin - panel1_data], 0
  1902.         jz      @f
  1903.         ret
  1904. @@:
  1905.         mov     esi, ebp
  1906.         cmp     [ebp + panel1_selected_num - panel1_data], 0
  1907.         jnz     .f5_2
  1908.         call    get_curfile_folder_entry
  1909.         lea     esi, [ecx+40]
  1910.         mov     edi, CopyDestEditBuf
  1911.         mov     eax, CopyDestEditBuf.length
  1912.         stosd
  1913.         scasd
  1914.         xor     eax, eax
  1915.         stosd
  1916.         mov     edx, edi
  1917. @@:
  1918.         lodsb
  1919.         test    al, al
  1920.         jz      .f5_common
  1921.         stosb
  1922.         jmp     @b
  1923. .f5:
  1924. ; todo: copy to plugin panel
  1925.         mov     esi, ebp
  1926.         xor     esi, panel1_data xor panel2_data
  1927.         cmp     [esi + panel1_hPlugin - panel1_data], 0
  1928.         jz      .f5_2
  1929.         ret
  1930. .f5_2:
  1931.         mov     eax, [ebp + panel1_hPlugin - panel1_data]
  1932.         mov     [source_hModule], eax
  1933.         mov     eax, [ebp + panel1_hFile - panel1_data]
  1934.         mov     [source_hPlugin], eax
  1935.         mov     eax, left_dotdot_entry
  1936.         cmp     ebp, panel1_data
  1937.         jz      @f
  1938.         add     eax, right_dotdot_entry-left_dotdot_entry
  1939. @@:
  1940.         mov     [default_attr], eax
  1941.         add     esi, panel1_dir - panel1_data
  1942.         mov     edi, CopyDestEditBuf
  1943.         mov     eax, CopyDestEditBuf.length
  1944.         stosd
  1945.         scasd
  1946.         xor     eax, eax
  1947.         stosd
  1948.         mov     edx, edi
  1949. @@:
  1950.         lodsb
  1951.         test    al, al
  1952.         jz      @f
  1953.         cmp     edi, CopyDestEditBuf+12+511
  1954.         jae     .bigfoldername
  1955.         stosb
  1956.         jmp     @b
  1957. @@:
  1958.         mov     al, '/'
  1959.         stosb
  1960. .f5_common:
  1961.         mov     byte [edi], 0
  1962.         sub     edi, edx
  1963.         mov     [edx-8], edi
  1964.         mov     edi, CopySourceTextBuf
  1965.         mov     esi, aCopy1
  1966. @@:
  1967.         lodsb
  1968.         test    al, al
  1969.         jz      @f
  1970.         stosb
  1971.         jmp     @b
  1972. @@:
  1973.         mov     eax, [ebp + panel1_selected_num - panel1_data]
  1974.         test    eax, eax
  1975.         jz      .f5_noselected1
  1976.         mov     ebx, eax
  1977.         push    10
  1978.         pop     ecx
  1979.         push    -'0'
  1980. @@:
  1981.         xor     edx, edx
  1982.         div     ecx
  1983.         push    edx
  1984.         test    eax, eax
  1985.         jnz     @b
  1986. @@:
  1987.         pop     eax
  1988.         add     al, '0'
  1989.         jz      @f
  1990.         stosb
  1991.         jmp     @b
  1992. @@:
  1993. if lang eq ru
  1994.         mov     dword [edi], ' í«¥'
  1995.         mov     dword [edi+4], '¬¥­â'
  1996.         add     edi, 8
  1997.         cmp     ebx, 1
  1998.         jz      @f
  1999.         mov     al, ' '
  2000.         stosb
  2001.         cmp     ebx, 4
  2002.         jbe     @f
  2003.         mov     word [edi-1], '®¢'
  2004.         inc     edi
  2005. @@:
  2006. else
  2007.         mov     dword [edi], ' ite'
  2008.         mov     byte [edi+4], 'm'
  2009.         add     edi, 5
  2010.         cmp     ebx, 1
  2011.         jz      @f
  2012.         mov     al, 's'
  2013.         stosb
  2014. @@:
  2015. end if
  2016.         jmp     .f5_selected1
  2017. .f5_noselected1:
  2018.         mov     al, '"'
  2019.         stosb
  2020.         call    get_curfile_folder_entry
  2021.         lea     esi, [ecx+40]
  2022.         lea     eax, [esi+1]
  2023. @@:
  2024.         inc     esi
  2025.         cmp     byte [esi-1], 0
  2026.         jnz     @b
  2027.         sub     esi, eax
  2028.         xchg    eax, esi
  2029.         dec     esi
  2030.         mov     edx, [cur_width]
  2031.         sub     edx, 50
  2032.         sub     eax, edx
  2033.         jbe     @f
  2034.         add     esi, eax
  2035.         mov     al, '.'
  2036.         stosb
  2037.         stosb
  2038.         stosb
  2039. @@:
  2040.         lodsb
  2041.         test    al, al
  2042.         jz      @f
  2043.         stosb
  2044.         jmp     @b
  2045. @@:
  2046.         mov     al, '"'
  2047.         stosb
  2048. .f5_selected1:
  2049.         mov     esi, aCopy2
  2050. @@:
  2051.         lodsb
  2052.         stosb
  2053.         test    al, al
  2054.         jnz     @b
  2055.         mov     ebx, copy_dlgdata
  2056.         mov     eax, [cur_width]
  2057.         sub     eax, 12
  2058.         mov     [ebx + dlgtemplate.width], eax
  2059.         dec     eax
  2060.         dec     eax
  2061.         mov     [ebx - copy_dlgdata + copy_dlgdata.width2], eax
  2062.         mov     [ebx - copy_dlgdata + copy_dlgdata.width3], eax
  2063.         shr     eax, 1
  2064.         dec     eax
  2065.         dec     eax
  2066.         mov     [ebx - copy_dlgdata + copy_dlgdata.copy_x2], eax
  2067.         sub     eax, aCopyLength-1
  2068.         mov     [ebx - copy_dlgdata + copy_dlgdata.copy_x1], eax
  2069.         add     eax, aCopyLength+3
  2070.         mov     [ebx - copy_dlgdata + copy_dlgdata.cnl_x1], eax
  2071.         add     eax, aCancelBLength - 1
  2072.         mov     [ebx - copy_dlgdata + copy_dlgdata.cnl_x2], eax
  2073.         mov     byte [ebx - copy_dlgdata + copy_dlgdata.flags0], 0xC
  2074.         and     byte [ebx - copy_dlgdata + copy_dlgdata.flags1], not 4
  2075.         and     byte [ebx - copy_dlgdata + copy_dlgdata.flags2], not 4
  2076.         push    ebx
  2077.         call    DialogBox
  2078.         cmp     eax, copy_dlgdata.copy_btn
  2079.         jnz     .ret2
  2080. ; Š®¯¨à㥬
  2081.         mov     esi, CopyDestEditBuf+12
  2082.         mov     edi, esi
  2083.         xor     eax, eax
  2084.         or      ecx, -1
  2085.         repnz   scasb
  2086.         dec     edi
  2087.         dec     edi
  2088.         cmp     edi, esi
  2089.         jb      .ret2
  2090.         mov     [bEndSlash], 0
  2091.         cmp     byte [edi], '/'
  2092.         jnz     @f
  2093.         cmp     edi, esi
  2094.         jz      @f
  2095.         mov     byte [edi], 0
  2096.         dec     edi
  2097.         mov     [bEndSlash], 1
  2098. @@:
  2099. ; …᫨ ¯ãâì ­¥ ­ ç¨­ ¥âáï á® á«íè , áç¨â ¥¬ ¥£® ®â­®á¨â¥«ì­® ⥪ã饩 ¯ ¯ª¨
  2100.         cmp     byte [esi], '/'
  2101.         jz      .copy_absolute_path
  2102.         push    esi
  2103.         push    edi
  2104.         lea     edi, [ebp + panel1_dir - panel1_data]
  2105.         or      ecx, -1
  2106.         xor     eax, eax
  2107.         repnz   scasb
  2108.         not     ecx
  2109.         pop     edi
  2110.         push    edi
  2111.         add     edi, ecx
  2112.         cmp     edi, CopyDestEditBuf+12+513
  2113.         pop     edi
  2114.         jb      @f
  2115.         pop     esi
  2116.         jmp     .bigfilename
  2117. @@:
  2118.         lea     edx, [edi+2]
  2119.         sub     edx, esi
  2120.         lea     edi, [edi+ecx+1]
  2121.         xchg    ecx, edx
  2122.         std
  2123.         lea     esi, [esi+ecx-1]
  2124.         rep     movsb
  2125.         cld
  2126.         pop     edi
  2127.         lea     esi, [ebp + panel1_dir - panel1_data]
  2128.         push    edi
  2129.         mov     ecx, edx
  2130.         rep     movsb
  2131.         mov     byte [edi-1], '/'
  2132.         pop     esi
  2133. .copy_absolute_path:
  2134. ; ‘­ ç «  ᮧ¤ ñ¬ ¢á¥ ¢ë襫¥¦ é¨¥ ¯ ¯ª¨, ª®â®àë¥ ¥éñ ­¥ áãé¥áâ¢ãîâ
  2135. ; ®á«¥¤­¨© ¨§ í«¥¬¥­â®¢ ¬®¦¥â ¡ëâì ª ª ä ©«®¬, â ª ¨ ¯ ¯ª®©;
  2136. ; ä®àá¨à㥬 ¯ ¯ªã ¢ á«ãç ¥, ¥á«¨ å®âï ¡ë ®¤¨­ ¨§ ¨áâ®ç­¨ª®¢ ï¥âáï ¯ ¯ª®©
  2137.         xor     edx, edx
  2138.         cmp     [ebp + panel1_selected_num - panel1_data], 0
  2139.         jz      .f5_noselected2
  2140.         mov     ecx, [ebp + panel1_numfiles - panel1_data]
  2141.         mov     edi, [ebp + panel1_files - panel1_data]
  2142. .scanselected2:
  2143.         mov     eax, [edi]
  2144.         add     edi, 4
  2145.         test    byte [eax+303], 1
  2146.         jz      @f
  2147.         test    byte [eax], 10h
  2148.         jz      @f
  2149.         inc     edx
  2150. @@:
  2151.         loop    .scanselected2
  2152.         jmp     .f5_selected2
  2153. .f5_noselected2:
  2154.         call    get_curfile_folder_entry
  2155.         test    byte [ecx], 10h
  2156.         setnz   dl
  2157. .f5_selected2:
  2158.         xor     eax, eax
  2159.         mov     edi, esi
  2160. .countslashloop:
  2161.         cmp     byte [edi], '/'
  2162.         jnz     @f
  2163.         inc     eax
  2164.         mov     ecx, edi
  2165. @@:
  2166.         inc     edi
  2167.         cmp     byte [edi], 0
  2168.         jnz     .countslashloop
  2169.         mov     [bNeedRestoreName], 0
  2170. ; "/file-system/partition" folders already exist, so we don't need to create them
  2171.         cmp     eax, 2
  2172.         jbe     .createupdone
  2173. ; we interpret destination as folder if edx!=0 or bEndSlash!=0
  2174.         test    edx, edx
  2175.         jnz     @f
  2176.         cmp     [bEndSlash], 0
  2177.         jnz     @f
  2178.         mov     edi, ecx
  2179.         dec     eax
  2180. @@:
  2181.         mov     [attrinfo.name], esi
  2182.         mov     ecx, eax
  2183. ; ¨é¥¬ ¯®á«¥¤­îî ¯ ¯ªã, ª®â®à ï ¥éñ áãé¥áâ¢ã¥â
  2184. .createuploop1:
  2185.         cmp     eax, 2
  2186.         jbe     .createupdone1
  2187.         mov     dl, [edi]
  2188.         mov     byte [edi], 0
  2189.         push    eax
  2190.         push    70
  2191.         pop     eax
  2192.         mov     ebx, attrinfo
  2193.         int     0x40
  2194.         test    eax, eax
  2195.         pop     eax
  2196.         mov     byte [edi], dl
  2197.         jnz     .createupcont1
  2198.         test    byte [attrinfo.attr], 10h
  2199.         jnz     .createupdone1
  2200. ; the item required to be a folder, but is file
  2201.         push    aNotFolder
  2202.         push    esi
  2203.         mov     eax, esp
  2204.         push    ContinueBtn
  2205.         push    1
  2206.         push    eax
  2207.         push    2
  2208.         call    SayErr
  2209.         pop     eax
  2210.         pop     eax
  2211. .ret3:
  2212.         ret
  2213. .createupcont1:
  2214.         dec     eax
  2215. @@:
  2216.         dec     edi
  2217.         cmp     byte [edi], '/'
  2218.         jnz     @b
  2219.         jmp     .createuploop1
  2220. .createupdone1:
  2221. ; ᮧ¤ ñ¬ ¢á¥ ¯ ¯ª¨, ª®â®àë¥ ­ ¬ ­ã¦­ë
  2222.         cmp     eax, ecx
  2223.         jae     .createupdone
  2224. @@:
  2225.         inc     edi
  2226.         cmp     byte [edi], 0
  2227.         jz      @f
  2228.         cmp     byte [edi], '/'
  2229.         jnz     @b
  2230. @@:
  2231.         mov     dl, byte [edi]
  2232.         mov     byte [edi], 0
  2233.         push    eax
  2234.         push    RetryOrCancelBtn
  2235.         push    2
  2236.         call    makedir
  2237.         mov     byte [edi], dl
  2238.         mov     [bNeedRestoreName], 1
  2239.         pop     eax
  2240.         jnz     .ret3
  2241.         inc     eax
  2242.         jmp     .createupdone1
  2243. .createupdone:
  2244.         mov     dl, 1
  2245.         cmp     byte [edi], 1
  2246.         sbb     eax, -1
  2247.         cmp     eax, 2
  2248.         jbe     .docopy
  2249.         mov     [attrinfo.attr], 0      ; assume zero attributes if error
  2250.         push    70
  2251.         pop     eax
  2252.         mov     ebx, attrinfo
  2253.         int     0x40
  2254.         test    [attrinfo.attr], 10h
  2255.         setnz   dl
  2256. .docopy:
  2257.         call    get_curfile_folder_entry
  2258.         mov     eax, ecx
  2259.         cmp     [bNeedRestoreName], 0
  2260.         jz      @f
  2261.         cmp     [bEndSlash], 0
  2262.         jnz     @f
  2263.         cmp     [ebp + panel1_selected_num - panel1_data], 0
  2264.         jnz     @f
  2265.         test    byte [eax], 10h
  2266.         jz      @f
  2267.         mov     dl, 0
  2268. @@:
  2269. ; ­ ç¨­ ¥¬ ᮡá⢥­­® ª®¯¨à®¢ ­¨¥
  2270.         mov     [bDestIsFolder], dl
  2271.         mov     [copy_bSkipAll], 0
  2272.         mov     [copy_bSkipAll2], 0
  2273.         mov     [copy_bSkipAll3], 0
  2274.         test    [ebp + panel1_plugin_flags - panel1_data], 2
  2275.         jnz     .copy_GetFiles
  2276.         cmp     [ebp + panel1_selected_num - panel1_data], 0
  2277.         jnz     .f5_selected3
  2278.         call    copy_file
  2279. .copydone:
  2280.         push    ebp
  2281.         call    .ctrl_r
  2282.         pop     ebp
  2283.         xor     ebp, panel1_data xor panel2_data
  2284.         jmp     .ctrl_r
  2285. .f5_selected3:
  2286.         mov     ecx, [ebp + panel1_numfiles - panel1_data]
  2287.         mov     esi, [ebp + panel1_files - panel1_data]
  2288. .f5_selected_copyloop:
  2289.         lodsd
  2290.         test    byte [eax+303], 1
  2291.         jz      .f5_selected_copycont
  2292.         mov     [bDestIsFolder], dl
  2293.         call    copy_file
  2294.         ja      .f5_multiple_cancel
  2295.         and     byte [eax+303], not 1
  2296.         pushad
  2297.         call    draw_panel
  2298.         cmp     [bNeedRestoreName], 0
  2299.         jz      @f
  2300.         mov     esi, CopyDestEditBuf+12
  2301.         call    delete_last_name_from_end
  2302. @@:
  2303.         popad
  2304. .f5_selected_copycont:
  2305.         loop    .f5_selected_copyloop
  2306. .f5_multiple_cancel:
  2307.         jmp     .copydone
  2308. .copy_GetFiles:
  2309.         mov     ecx, [ebp + panel1_selected_num - panel1_data]
  2310.         cmp     ecx, 1
  2311.         adc     ecx, 0
  2312.         shl     ecx, 2
  2313.         call    xpgalloc
  2314.         test    eax, eax
  2315.         jnz     @f
  2316.         ret
  2317. @@:
  2318.         push    ebp eax ; save
  2319.         push    copy_AddDir     ; adddir
  2320.         push    copy_AddFile    ; addfile
  2321.         push    eax             ; items
  2322.         shr     ecx, 2
  2323.         push    ecx             ; NumItems
  2324.         push    [ebp + panel1_hFile - panel1_data]
  2325.         mov     edi, eax
  2326.         call    get_curfile_folder_entry
  2327.         mov     [edi], ecx
  2328.         cmp     [ebp + panel1_selected_num - panel1_data], 0
  2329.         jz      .cgf1
  2330.         mov     esi, [ebp + panel1_files - panel1_data]
  2331.         mov     ecx, [ebp + panel1_numfiles - panel1_data]
  2332. .cgf0:
  2333.         lodsd
  2334.         test    byte [eax+303], 1
  2335.         jz      @f
  2336.         stosd
  2337. @@:
  2338.         loop    .cgf0
  2339. .cgf1:
  2340.         mov     eax, [ebp + panel1_hPlugin - panel1_data]
  2341.         call    [eax+PluginInfo.GetFiles]
  2342.         pop     ecx ebp
  2343.         call    pgfree
  2344.         jmp     .copydone
  2345.  
  2346. .f3:
  2347.         call    view_file
  2348. .ret2:
  2349.         ret
  2350. .f8_has_selected:
  2351.         mov     edi, saved_file_name+511
  2352.         mov     byte [edi], 0
  2353.         mov     eax, [ebp + panel1_selected_num - panel1_data]
  2354. if lang eq ru
  2355.         cmp     eax, 1
  2356.         jz      @f
  2357.         dec     edi
  2358.         mov     byte [edi], ' '
  2359.         cmp     eax, 4
  2360.         jbe     @f
  2361.         dec     edi
  2362.         mov     word [edi], '®¢'
  2363. @@:
  2364.         mov     dword [edi-4], '¬¥­â'
  2365.         mov     dword [edi-8], ' í«¥'
  2366.         sub     edi, 8
  2367. else
  2368.         cmp     eax, 1
  2369.         jz      @f
  2370.         dec     edi
  2371.         mov     byte [edi], 's'
  2372. @@:
  2373.         mov     dword [edi-4], 'item'
  2374.         mov     byte [edi-5], ' '
  2375.         sub     edi, 5
  2376. end if
  2377.         xor     edx, edx
  2378.         push    10
  2379.         pop     ecx
  2380. @@:
  2381.         div     ecx
  2382.         add     dl, '0'
  2383.         dec     edi
  2384.         mov     [edi], dl
  2385.         xor     edx, edx
  2386.         test    eax, eax
  2387.         jnz     @b
  2388.         push    edi
  2389.         push    aConfirmDeleteText
  2390.         mov     eax, esp
  2391.         push    DeleteOrCancelBtn
  2392.         push    2
  2393.         push    eax
  2394.         push    2
  2395.         push    aDeleteCaption
  2396.         call    Message
  2397.         add     esp, 8
  2398.         test    eax, eax
  2399.         jnz     .ret2
  2400.         mov     [del_bSkipAll], 0
  2401.         mov     ecx, [ebp + panel1_numfiles - panel1_data]
  2402.         jecxz   .ret2
  2403.         mov     esi, [ebp + panel1_files - panel1_data]
  2404. .f8_loop:
  2405.         lodsd
  2406.         test    byte [eax+303], 1
  2407.         jz      @f
  2408.         call    delete_file
  2409.         ja      .f8_multiple_cancel
  2410. @@:
  2411.         loop    .f8_loop
  2412. .f8_multiple_cancel:
  2413.         jmp     .copydone
  2414. .f8:
  2415. ; todo: delete files from plugin panel
  2416.         cmp     [ebp + panel1_hPlugin - panel1_data], 0
  2417.         jz      @f
  2418.         ret
  2419. @@:
  2420.         cmp     [ebp + panel1_selected_num - panel1_data], 0
  2421.         jnz     .f8_has_selected
  2422.         call    get_curfile_folder_entry
  2423.         cmp     [bConfirmDelete], 0
  2424.         jz      .f8_allowed
  2425.         lea     eax, [ecx+40]
  2426.         push    eax
  2427.         mov     esi, aConfirmDeleteText
  2428.         mov     edi, aConfirmDeleteTextBuf
  2429.         push    edi
  2430. @@:
  2431.         lodsb
  2432.         stosb
  2433.         test    al, al
  2434.         jnz     @b
  2435.         dec     edi
  2436.         mov     esi, aDeleteFolder
  2437.         test    byte [ecx], 10h
  2438.         jnz     @f
  2439.         mov     esi, aDeleteFile
  2440. @@:
  2441.         lodsb
  2442.         stosb
  2443.         test    al, al
  2444.         jnz     @b
  2445.         mov     eax, esp
  2446.         push    DeleteOrCancelBtn
  2447.         push    2
  2448.         push    eax
  2449.         push    2
  2450.         push    aDeleteCaption
  2451.         call    Message
  2452.         add     esp, 8
  2453.         test    eax, eax
  2454.         jz      .f8_allowed
  2455.         ret
  2456. .f8_allowed:
  2457.         mov     [del_bSkipAll], 0
  2458.         mov     eax, ecx
  2459.         call    delete_file
  2460.         jmp     .copydone
  2461. .ctrl_r:
  2462. ; Rescan panel
  2463. ;       call    read_folder
  2464. ;       jmp     .done_redraw
  2465.         mov     eax, [ebp + panel1_index - panel1_data]
  2466.         push    eax
  2467.         call    get_curfile_name
  2468.         mov     esi, ecx
  2469.         mov     edi, saved_file_name
  2470. @@:
  2471.         lodsb
  2472.         stosb
  2473.         test    al, al
  2474.         jnz     @b
  2475.         push    [ebp + panel1_start - panel1_data]
  2476.         call    read_folder
  2477.         pop     [ebp + panel1_start - panel1_data]
  2478.         pop     [ebp + panel1_index - panel1_data]
  2479.         or      eax, -1
  2480. @@:
  2481.         inc     eax
  2482.         cmp     eax, [ebp + panel1_numfiles - panel1_data]
  2483.         jae     .ctrl_r.notfound
  2484.         mov     ecx, [ebp + panel1_files - panel1_data]
  2485.         mov     esi, [ecx+eax*4]
  2486.         add     esi, 40
  2487.         mov     edi, saved_file_name
  2488.         call    strcmpi
  2489.         jnz     @b
  2490. .ctrl_r.found:
  2491.         mov     [ebp + panel1_index - panel1_data], eax
  2492. .ctrl_r.notfound:
  2493.         mov     eax, [ebp + panel1_numfiles - panel1_data]
  2494.         dec     eax
  2495.         cmp     [ebp + panel1_index - panel1_data], eax
  2496.         jbe     @f
  2497.         mov     [ebp + panel1_index - panel1_data], eax
  2498. @@:
  2499.         mov     eax, [ebp + panel1_index - panel1_data]
  2500.         cmp     [ebp + panel1_start - panel1_data], eax
  2501.         jbe     @f
  2502.         mov     [ebp + panel1_start - panel1_data], eax
  2503. @@:
  2504.         inc     eax
  2505.         sub     eax, [ebp + panel1_colst - panel1_data]
  2506.         jae     @f
  2507.         xor     eax, eax
  2508. @@:
  2509.         cmp     [ebp + panel1_start - panel1_data], eax
  2510.         jae     @f
  2511.         mov     [ebp + panel1_start - panel1_data], eax
  2512. @@:
  2513.         mov     eax, [ebp + panel1_numfiles - panel1_data]
  2514.         sub     eax, [ebp + panel1_colst - panel1_data]
  2515.         jbe     @f
  2516.         cmp     [ebp + panel1_start - panel1_data], eax
  2517.         jbe     @f
  2518.         mov     [ebp + panel1_start - panel1_data], eax
  2519. @@:
  2520.         jmp     .done_redraw
  2521. .menu:
  2522. ; todo: context menu for plugin panel
  2523.         cmp     [ebp + panel1_hPlugin - panel1_data], 0
  2524.         jz      @f
  2525.         ret
  2526. @@:
  2527. ; display context menu
  2528. ; ignore folders
  2529.         call    get_curfile_folder_entry
  2530.         test    byte [ecx], 10h
  2531.         jz      @f
  2532. .menuret:
  2533.         ret
  2534. @@:
  2535.         call    find_extension
  2536.         jc      .menuret
  2537. ; known extension
  2538. @@:
  2539.         cmp     byte [edi], 0
  2540.         jz      .menuret
  2541.         cmp     byte [edi], ';'
  2542.         jz      @f
  2543.         inc     edi
  2544.         jmp     @b
  2545. @@:
  2546.         inc     edi
  2547. @@:
  2548.         inc     edi
  2549.         cmp     byte [edi-1], ' '
  2550.         jz      @b
  2551.         cmp     byte [edi-1], 9
  2552.         jz      @b
  2553.         dec     edi
  2554.         cmp     byte [edi], 0
  2555.         jz      .menuret
  2556.         mov     ecx, esi
  2557. @@:
  2558.         inc     ecx
  2559.         cmp     byte [ecx-1], 0
  2560.         jnz     @b
  2561.         sub     ecx, esi        ; ecx = ¤«¨­  ¨¬¥­¨ ä ©« +1 = ¤«¨­  § £®«®¢ª +1
  2562.         cmp     ecx, 15
  2563.         jb      @f
  2564.         mov     cl, 15
  2565. @@:
  2566.         xor     edx, edx
  2567.         xor     ebp, ebp
  2568.         push    edx
  2569. .menucreateloop:
  2570.         mov     eax, edi
  2571.         xor     ebx, ebx
  2572. @@:
  2573.         cmp     byte [edi], ','
  2574.         jz      @f
  2575.         cmp     byte [edi], bl
  2576.         jz      @f
  2577.         inc     edi
  2578.         jmp     @b
  2579. @@:
  2580.         xchg    bl, [edi]
  2581.         pushad
  2582.         push    nullstr
  2583.         push    1024
  2584.         push    saved_file_name
  2585.         push    eax
  2586.         push    aMenu
  2587.         push    app_path
  2588.         call    [ini.get_str]
  2589.         popad
  2590.         mov     [edi], bl
  2591.         mov     eax, saved_file_name
  2592. @@:
  2593.         cmp     byte [eax], 0
  2594.         jz      .menucreatecont
  2595.         cmp     byte [eax], ','
  2596.         jz      @f
  2597.         inc     eax
  2598.         jmp     @b
  2599. @@:
  2600.         mov     byte [eax], 0
  2601.         push    eax
  2602.         sub     eax, saved_file_name-1
  2603.         cmp     eax, ecx
  2604.         ja      @f
  2605.         mov     eax, ecx
  2606. @@:
  2607.         xchg    eax, [esp]
  2608.         inc     eax
  2609.         push    eax
  2610. @@:
  2611.         inc     eax
  2612.         cmp     byte [eax-1], 0
  2613.         jnz     @b
  2614.         sub     eax, [esp]
  2615.         add     [esp+4], eax
  2616.         pop     eax eax
  2617.         add     eax, 8
  2618.         add     ebp, eax
  2619.         push    ebp
  2620.         and     ebp, 0xFFF
  2621.         cmp     ebp, eax
  2622.         pop     ebp
  2623.         ja      @f
  2624.         push    eax
  2625.         xchg    edx, [esp+4]
  2626.         push    ecx
  2627.         mov     ecx, ebp
  2628.         call    xpgrealloc
  2629.         pop     ecx
  2630.         pop     edx
  2631.         xchg    edx, [esp]
  2632.         test    eax, eax
  2633.         xchg    eax, [esp]
  2634.         jz      .menucreated
  2635. @@:
  2636.         neg     eax
  2637.         add     eax, ebp
  2638.         add     eax, [esp]
  2639.         and     dword [eax], 0
  2640.         and     dword [eax+4], 0
  2641.         test    edx, edx
  2642.         jz      @f
  2643.         sub     eax, [esp]
  2644.         mov     [edx], eax
  2645.         add     eax, [esp]
  2646.         sub     edx, [esp]
  2647.         mov     [eax+4], edx
  2648. @@:
  2649.         mov     edx, eax
  2650.         push    esi edi
  2651.         mov     esi, saved_file_name
  2652.         lea     edi, [eax+8]
  2653. @@:
  2654.         lodsb
  2655.         stosb
  2656.         test    al, al
  2657.         jnz     @b
  2658.         push    esi
  2659.         sub     esi, saved_file_name
  2660.         sub     esi, ecx
  2661.         jae     .menunoadd
  2662.         neg     esi
  2663. @@:
  2664.         mov     byte [edi-1], ' '
  2665.         stosb
  2666.         dec     esi
  2667.         jnz     @b
  2668. .menunoadd:
  2669.         pop     esi
  2670. @@:
  2671.         lodsb
  2672.         stosb
  2673.         test    al, al
  2674.         jnz     @b
  2675.         pop     edi esi
  2676. .menucreatecont:
  2677.         inc     edi
  2678.         cmp     byte [edi-1], ','
  2679.         jz      .menucreateloop
  2680. .menucreated:
  2681.         test    edx, edx
  2682.         jz      .menuret_free
  2683.         and     dword [edx], 0
  2684.         pop     edx
  2685.         mov     ecx, edx
  2686.         add     [ecx], edx
  2687. @@:
  2688.         mov     ecx, [ecx]
  2689.         cmp     dword [ecx], 0
  2690.         jz      @f
  2691.         add     [ecx], edx
  2692.         add     [ecx+4], edx
  2693.         jmp     @b
  2694. @@:
  2695.         add     [ecx+4], edx
  2696.         push    edx
  2697.         push    1
  2698.         push    esi
  2699.         push    edx
  2700.         call    menu
  2701.         cmp     eax, -1
  2702.         jz      .menuret_free
  2703.         lea     edi, [eax+8]
  2704. @@:
  2705.         inc     edi
  2706.         cmp     byte [edi-1], 0
  2707.         jnz     @b
  2708.         mov     ebp, [active_panel]
  2709.         call    get_curfile_folder_entry
  2710.         call    .run_association2
  2711. .menuret_free:
  2712.         pop     ecx
  2713.         jmp     pgfree
  2714. .f7:
  2715.         mov     dword [CopyDestEditBuf], CopyDestEditBuf.length
  2716.         and     dword [CopyDestEditBuf+4], 0
  2717.         and     dword [CopyDestEditBuf+8], 0
  2718.         mov     byte [CopyDestEditBuf+12], 0
  2719.         mov     ebx, mkdir_dlgdata
  2720.         mov     eax, [cur_width]
  2721.         sub     eax, 12
  2722.         mov     [ebx + dlgtemplate.width], eax
  2723.         dec     eax
  2724.         dec     eax
  2725.         mov     [ebx - mkdir_dlgdata + mkdir_dlgdata.width2], eax
  2726.         shr     eax, 1
  2727.         dec     eax
  2728.         dec     eax
  2729.         mov     [ebx - mkdir_dlgdata + mkdir_dlgdata.cont_x2], eax
  2730.         sub     eax, a_ContinueLength-1
  2731.         mov     [ebx - mkdir_dlgdata + mkdir_dlgdata.cont_x1], eax
  2732.         add     eax, a_ContinueLength+3
  2733.         mov     [ebx - mkdir_dlgdata + mkdir_dlgdata.cnl_x1], eax
  2734.         add     eax, aCancelBLength - 1
  2735.         mov     [ebx - mkdir_dlgdata + mkdir_dlgdata.cnl_x2], eax
  2736.         mov     byte [ebx - mkdir_dlgdata + mkdir_dlgdata.flags0], 0xC
  2737.         and     byte [ebx - mkdir_dlgdata + mkdir_dlgdata.flags1], not 4
  2738.         and     byte [ebx - mkdir_dlgdata + mkdir_dlgdata.flags2], not 4
  2739.         push    ebx
  2740.         call    DialogBox
  2741.         cmp     eax, mkdir_dlgdata.cont_btn
  2742.         jnz     .ret2
  2743.         mov     esi, CopyDestEditBuf+12
  2744.         cmp     byte [esi], 0
  2745.         jz      .ret2
  2746.         cmp     byte [esi], '/'
  2747.         jz      .mkdir_absolute_path
  2748.         push    esi
  2749.         lea     edi, [ebp + panel1_dir - panel1_data]
  2750.         or      ecx, -1
  2751.         xor     eax, eax
  2752.         repnz   scasb
  2753.         not     ecx
  2754.         mov     edi, esi
  2755. @@:
  2756.         cmp     byte [edi+1], 0
  2757.         jz      @f
  2758.         inc     edi
  2759.         jmp     @b
  2760. @@:
  2761.         push    edi
  2762.         add     edi, ecx
  2763.         cmp     edi, CopyDestEditBuf+12+513
  2764.         pop     edi
  2765.         jb      @f
  2766.         pop     esi
  2767.         jmp     .bigfilename
  2768. @@:
  2769.         lea     edx, [edi+2]
  2770.         sub     edx, esi
  2771.         lea     edi, [edi+ecx+1]
  2772.         xchg    ecx, edx
  2773.         std
  2774.         lea     esi, [esi+ecx-1]
  2775.         rep     movsb
  2776.         cld
  2777.         pop     edi
  2778.         lea     esi, [ebp + panel1_dir - panel1_data]
  2779.         push    edi
  2780.         mov     ecx, edx
  2781.         rep     movsb
  2782.         mov     byte [edi-1], '/'
  2783.         pop     esi
  2784. .mkdir_absolute_path:
  2785.         push    RetryOrCancelBtn
  2786.         push    2
  2787.         call    makedir
  2788.         jmp     .copydone
  2789. .change_mode:
  2790.         dec     eax
  2791.         mov     [ebp + panel1_colmode - panel1_data], eax
  2792.         call    calc_colwidths
  2793.         jmp     draw_panel
  2794. .quick_jump:
  2795.         dec     eax
  2796.         cmp     al, 10
  2797.         jnz     @f
  2798.         xor     eax, eax
  2799. @@:
  2800.         mov     eax, [FolderShortcuts+eax*4]
  2801.         test    eax, eax
  2802.         jnz     @f
  2803.         ret
  2804. @@:
  2805.         push    eax
  2806.         call    close_plugin_panels
  2807.         lea     esi, [ebp + panel1_dir - panel1_data]
  2808.         push    esi
  2809.         mov     edi, prev_dir
  2810. @@:
  2811.         lodsb
  2812.         stosb
  2813.         test    al, al
  2814.         jnz     @b
  2815.         pop     edi esi
  2816. @@:
  2817.         lodsb
  2818.         stosb
  2819.         test    al, al
  2820.         jnz     @b
  2821.         jmp     .reread
  2822. .greyplus:
  2823.         push    0
  2824.         mov     ecx, aSelect
  2825.         jmp     @f
  2826. .greyminus:
  2827.         push    1
  2828.         mov     ecx, aDeselect
  2829. @@:
  2830.         mov     eax, mark_dlgdata
  2831.         mov     [eax+mark_dlgdata.title-mark_dlgdata], ecx
  2832.         mov     [eax+mark_dlgdata.flags-mark_dlgdata], 0xC
  2833.         mov     edi, enter_string_buf+12
  2834.         mov     dword [edi-12], 512
  2835.         mov     dword [edi-8], 1
  2836.         and     dword [edi-4], 0
  2837.         mov     word [edi], '*'
  2838.         push    eax
  2839.         call    DialogBox
  2840.         inc     eax
  2841.         jnz     @f
  2842. .noselect:
  2843.         pop     eax
  2844.         ret
  2845. @@:
  2846.         xor     eax, eax
  2847.         mov     esi, edi
  2848. @@:
  2849.         lodsb
  2850.         mov     al, [tolower_table+eax]
  2851.         mov     [esi-1], al
  2852.         test    al, al
  2853.         jnz     @b
  2854. @@:
  2855.         mov     ecx, [ebp + panel1_numfiles - panel1_data]
  2856.         mov     ebx, [ebp + panel1_files - panel1_data]
  2857.         jecxz   .noselect
  2858.         mov     eax, [ebx]
  2859.         cmp     word [eax+40], '..'
  2860.         jnz     .selectloop
  2861.         cmp     byte [eax+42], 0
  2862.         jnz     .selectloop
  2863.         dec     ecx
  2864.         jz      .noselect
  2865.         add     ebx, 4
  2866. .selectloop:
  2867.         xor     eax, eax
  2868.         mov     esi, [ebx]
  2869.         add     esi, 40
  2870.         mov     edx, lower_file_name-1
  2871. @@:
  2872.         lodsb
  2873.         inc     edx
  2874.         mov     al, [tolower_table+eax]
  2875.         mov     [edx], al
  2876.         test    al, al
  2877.         jnz     @b
  2878.         mov     esi, lower_file_name
  2879.         call    match_mask_rev_lowercase
  2880.         jc      @f
  2881.         mov     esi, [ebx]
  2882.         mov     eax, [esi+32]
  2883.         cmp     byte [esp], 0
  2884.         jz      .doselect
  2885.         test    byte [esi+303], 1
  2886.         jz      @f
  2887.         and     byte [esi+303], not 1
  2888.         sub     dword [ebp + panel1_selected_size - panel1_data], eax
  2889.         mov     eax, [esi+36]
  2890.         sbb     dword [ebp + panel1_selected_size+4 - panel1_data], eax
  2891.         dec     dword [ebp + panel1_selected_num - panel1_data]
  2892.         jmp     @f
  2893. .doselect:
  2894.         test    byte [esi+303], 1
  2895.         jnz     @f
  2896.         or      byte [esi+303], 1
  2897.         add     dword [ebp + panel1_selected_size - panel1_data], eax
  2898.         mov     eax, [esi+36]
  2899.         adc     dword [ebp + panel1_selected_size+4 - panel1_data], eax
  2900.         inc     dword [ebp + panel1_selected_num - panel1_data]
  2901. @@:
  2902.         add     ebx, 4
  2903.         dec     ecx
  2904.         jnz     .selectloop
  2905.         pop     eax
  2906.         jmp     .done_redraw
  2907. .greyasterisk:
  2908.         mov     ecx, [ebp + panel1_numfiles - panel1_data]
  2909.         mov     esi, [ebp + panel1_files - panel1_data]
  2910.         jecxz   .galoopdone
  2911. .galoop:
  2912.         lodsd
  2913.         cmp     word [eax+40], '..'
  2914.         jnz     @f
  2915.         cmp     byte [eax+42], 0
  2916.         jz      .gacont
  2917. @@:
  2918.         xor     byte [eax+303], 1
  2919.         mov     edx, [eax+32]
  2920.         test    byte [eax+303], 1
  2921.         jz      .gadel
  2922.         add     dword [ebp + panel1_selected_size - panel1_data], edx
  2923.         mov     edx, [eax+36]
  2924.         adc     dword [ebp + panel1_selected_size+4 - panel1_data], edx
  2925.         inc     dword [ebp + panel1_selected_num - panel1_data]
  2926.         jmp     .gacont
  2927. .gadel:
  2928.         sub     dword [ebp + panel1_selected_size - panel1_data], edx
  2929.         mov     edx, [eax+36]
  2930.         sbb     dword [ebp + panel1_selected_size+4 - panel1_data], edx
  2931.         dec     dword [ebp + panel1_selected_num - panel1_data]
  2932. .gacont:
  2933.         loop    .galoop
  2934. .galoopdone:
  2935.         jmp     .done_redraw
  2936.  
  2937. @@:
  2938.         call    close_plugin_panel
  2939. close_plugin_panels:
  2940.         cmp     [ebp + panel1_hPlugin - panel1_data], 0
  2941.         jnz     @b
  2942.         ret
  2943.  
  2944. close_plugin_panel:
  2945. ; close plugin and restore old directory
  2946.         mov     esi, [ebp + panel1_parents - panel1_data]
  2947.         add     esi, [ebp + panel1_parents_sz - panel1_data]
  2948. @@:
  2949.         dec     esi
  2950.         cmp     byte [esi-1], 0
  2951.         jnz     @b
  2952.         push    esi
  2953.         lea     edi, [ebp + panel1_dir - panel1_data]
  2954. @@:
  2955.         lodsb
  2956.         stosb
  2957.         test    al, al
  2958.         jnz     @b
  2959.         pop     esi
  2960.         sub     esi, 9
  2961.         mov     edx, [esi]      ; hPlugin
  2962.         mov     ebx, [esi+4]    ; hFile
  2963.         sub     esi, [ebp + panel1_parents - panel1_data]
  2964.         mov     [ebp + panel1_parents_sz - panel1_data], esi
  2965.         xchg    edx, [ebp + panel1_hPlugin - panel1_data]
  2966.         xchg    ebx, [ebp + panel1_hFile - panel1_data]
  2967.         push    edx ebx
  2968.         lea     ebx, [ebp + panel1_plugin_info - panel1_data]
  2969.         and     dword [ebx], 0
  2970.         mov     eax, [ebp + panel1_hPlugin - panel1_data]
  2971.         test    eax, eax
  2972.         jz      @f
  2973.         push    ebp
  2974.         push    ebx
  2975.         push    [ebp + panel1_hFile - panel1_data]
  2976.         call    [eax+PluginInfo.GetOpenPluginInfo]
  2977.         pop     ebp
  2978. @@:
  2979.         pop     ebx edx
  2980.  
  2981. close_handle_if_unused:
  2982. ; edx=hPlugin, ebx=hFile
  2983.         push    ebp
  2984.         xor     ecx, ecx
  2985. @@:
  2986.         mov     eax, [screens]
  2987.         mov     ebp, [eax+ecx*8+4]
  2988.         mov     eax, [eax+ecx*8]
  2989.         call    [eax+screen_vtable.IsHandleUsed]
  2990.         jz      .used
  2991.         inc     ecx
  2992.         cmp     ecx, [num_screens]
  2993.         jb      @b
  2994.         push    ebx
  2995.         call    [edx+PluginInfo.ClosePlugin]
  2996. .used:
  2997.         pop     ebp
  2998.         ret
  2999.  
  3000. panels_IsHandleUsed:
  3001. ; edx=hPlugin, ebx=hFile
  3002.         mov     ebp, panel1_data
  3003.         call    .1
  3004.         jz      .ret
  3005.         mov     ebp, panel2_data
  3006.  
  3007. .1:
  3008.         cmp     edx, [ebp+panel1_hPlugin-panel1_data]
  3009.         jnz     @f
  3010.         cmp     ebx, [ebp+panel1_hFile-panel1_data]
  3011.         jz      .ret
  3012. @@:
  3013.         mov     esi, [ebp + panel1_parents_sz - panel1_data]
  3014.         test    esi, esi
  3015.         jnz     @f
  3016.         inc     esi
  3017. .ret:
  3018.         ret
  3019. @@:
  3020.         add     esi, [ebp + panel1_parents - panel1_data]
  3021. @@:
  3022.         dec     esi
  3023.         cmp     byte [esi-1], 0
  3024.         jnz     @b
  3025.         sub     esi, 9
  3026.         cmp     edx, [esi]      ; hPlugin
  3027.         jnz     .no
  3028.         mov     ebx, [esi+4]    ; hFile
  3029.         jz      .ret
  3030. .no:
  3031.         cmp     esi, [ebp + panel1_parents - panel1_data]
  3032.         jnz     @b
  3033.         inc     esi
  3034.         ret
  3035.  
  3036. panels_OnExit:
  3037. ; close plugin panels
  3038.         mov     ebp, panel1_data
  3039.         call    close_plugin_panels
  3040.         mov     ebp, panel2_data
  3041.         call    close_plugin_panels
  3042.         ret
  3043.  
  3044. panels_OnRedraw:
  3045.         call    draw_cmdbar
  3046.         mov     ebp, panel1_data
  3047.         call    calc_colwidths
  3048.         call    draw_panel
  3049.         mov     ebp, panel2_data
  3050.         call    calc_colwidths
  3051.         call    draw_panel
  3052.         ret
  3053.  
  3054. init_console:
  3055.         mov     ecx, [console_data_ptr]
  3056.         call    pgfree
  3057.         mov     eax, [cur_width]
  3058.         mul     [cur_height]
  3059.         mov     ecx, eax
  3060.         push    ecx
  3061.         shl     ecx, 2
  3062.         call    pgalloc
  3063.         pop     ecx
  3064.         test    eax, eax
  3065.         jz      exit
  3066.         mov     [console_data_ptr], eax
  3067.         mov     edi, eax
  3068.         mov     ax, 0720h
  3069.         rep     stosw
  3070.         mov     [panel1_left], ecx
  3071.         mov     [panel1_top], ecx
  3072.         mov     [panel2_top], ecx
  3073.         mov     eax, [cur_width]
  3074.         inc     eax
  3075.         shr     eax, 1
  3076.         mov     [panel1_width], eax
  3077.         mov     [panel2_left], eax
  3078.         sub     eax, [cur_width]
  3079.         neg     eax
  3080.         mov     [panel2_width], eax
  3081.         mov     eax, [cur_height]
  3082.         dec     eax
  3083.         dec     eax
  3084.         mov     [panel1_height], eax
  3085.         mov     [panel2_height], eax
  3086.         ret
  3087.  
  3088. get_curfile_folder_entry:
  3089.         mov     ecx, [ebp + panel1_index - panel1_data]
  3090.         shl     ecx, 2
  3091.         add     ecx, [ebp + panel1_files - panel1_data]
  3092.         mov     ecx, [ecx]
  3093.         ret
  3094. get_curfile_name:
  3095.         call    get_curfile_folder_entry
  3096.         add     ecx, 40
  3097.         ret
  3098.  
  3099. panels_getname:
  3100. if lang eq ru
  3101.         mov     eax, ' ­¥'
  3102.         stosd
  3103.         mov     eax, '«¨  '
  3104.         stosd
  3105.         mov     eax, '    '
  3106.         stosd
  3107.         stosb
  3108. else
  3109.         mov     eax, 'Pane'
  3110.         stosd
  3111.         mov     eax, 'ls  '
  3112.         stosd
  3113.         mov     eax, '    '
  3114.         stosd
  3115.         stosb
  3116. end if
  3117.         sub     ecx, 13
  3118.         mov     ebp, [active_panel]
  3119.         push    3
  3120.         pop     edx
  3121.         cmp     [ebp + panel1_hPlugin - panel1_data], 0
  3122.         jz      .native
  3123.         mov     esi, [ebp + panel1_parents - panel1_data]
  3124.         add     esi, [ebp + panel1_parents_sz - panel1_data]
  3125. @@:
  3126.         dec     esi
  3127.         cmp     byte [esi-1], 0
  3128.         jz      @f
  3129.         cmp     byte [esi-1], '/'
  3130.         jnz     @b
  3131. @@:
  3132.         push    ecx edi
  3133.         shr     ecx, 1
  3134. @@:
  3135.         lodsb
  3136.         test    al, al
  3137.         jz      @f
  3138.         stosb
  3139.         loop    @b
  3140. @@:
  3141.         sub     edi, [esp]
  3142.         sub     [esp+4], edi
  3143.         add     [esp], edi
  3144.         pop     edi ecx
  3145.         lea     esi, [ebp + panel1_dir - panel1_data]
  3146.         cmp     byte [esi+1], 0
  3147.         jnz     @f
  3148.         inc     esi
  3149. @@:
  3150.         jmp     .main
  3151. .native:
  3152.         lea     esi, [ebp + panel1_dir - panel1_data]
  3153. @@:
  3154.         lodsb
  3155.         stosb
  3156.         dec     ecx
  3157.         test    al, al
  3158.         jz      @f
  3159.         cmp     al, '/'
  3160.         jnz     @b
  3161.         dec     edx
  3162.         jnz     @b
  3163. @@:
  3164.         test    al, al
  3165.         jnz     @f
  3166.         dec     esi
  3167.         dec     edi
  3168. @@:
  3169. .main:
  3170.         push    esi
  3171. @@:
  3172.         lodsb
  3173.         test    al, al
  3174.         jnz     @b
  3175.         dec     esi
  3176.         mov     ebx, esi
  3177.         sub     ebx, [esp]
  3178.         dec     esi
  3179.         push    esi
  3180.         mov     esi, [ebp + panel1_index - panel1_data]
  3181.         shl     esi, 2
  3182.         add     esi, [ebp + panel1_files - panel1_data]
  3183.         mov     esi, [esi]
  3184.         add     esi, 40
  3185.         push    esi
  3186. @@:
  3187.         lodsb
  3188.         test    al, al
  3189.         jnz     @b
  3190.         add     ebx, esi
  3191.         sub     ebx, [esp]
  3192.         dec     esi
  3193.         cmp     ebx, ecx
  3194.         jbe     @f
  3195.         mov     al, '.'
  3196.         stosb
  3197.         stosb
  3198.         stosb
  3199.         sub     ecx, 3
  3200.         mov     ebx, ecx
  3201. @@:
  3202.         add     edi, ebx
  3203.         inc     ecx
  3204.         std
  3205. @@:
  3206.         movsb
  3207.         dec     ecx
  3208.         jz      .nodir
  3209.         cmp     esi, [esp]
  3210.         jae     @b
  3211.         mov     esi, [esp+4]
  3212.         mov     al, '/'
  3213.         stosb
  3214.         dec     ecx
  3215.         jz      .nodir
  3216. @@:
  3217.         cmp     esi, [esp+8]
  3218.         jb      .nodir
  3219.         movsb
  3220.         loop    @b
  3221. .nodir:
  3222.         cld
  3223.         pop     eax
  3224.         pop     eax
  3225.         pop     eax
  3226.         ret
  3227.  
  3228. draw_window:
  3229.         push    12
  3230.         pop     eax
  3231.         push    1
  3232.         pop     ebx
  3233.         int     40h
  3234.         mov     al, 48
  3235.         mov     bl, 4
  3236.         int     40h
  3237.         mov     [skinh], eax
  3238.         mov     ebx, [cur_width]
  3239.         imul    ebx, font_width
  3240.         add     ebx, 100*65536 + 5*2-1
  3241.         mov     ecx, [cur_height]
  3242.         imul    ecx, font_height
  3243.         lea     ecx, [eax+ecx+5-1+100*65536]
  3244.         xor     eax, eax
  3245.         mov     edx, 0x53000000
  3246.         mov     edi, header
  3247.         int     40h
  3248.         mov     al, 13
  3249.         xor     edx, edx
  3250.         cmp     [fill_width], 0
  3251.         jz      @f
  3252.         mov     ebx, [wnd_width]
  3253.         sub     ebx, [fill_width]
  3254.         sub     ebx, 5-1
  3255.         shl     ebx, 16
  3256.         mov     bx, word [fill_width]
  3257.         mov     ecx, [skinh-2]
  3258.         mov     cx, word [wnd_height]
  3259.         sub     cx, word [skinh]
  3260.         sub     cx, 5-1
  3261.         int     0x40
  3262. @@:
  3263.         cmp     [fill_height], 0
  3264.         jz      @f
  3265.         xor     edx, edx
  3266.         mov     ebx, 50000h
  3267.         mov     bx, word [wnd_width]
  3268.         sub     ebx, 9
  3269.         mov     ecx, [wnd_height]
  3270.         sub     ecx, [fill_height]
  3271.         sub     ecx, 5-1
  3272.         shl     ecx, 16
  3273.         mov     cx, word [fill_height]
  3274.         int     0x40
  3275. @@:
  3276. ;        xor     ecx, ecx
  3277. ;        call    draw_image
  3278.         mov     al, 65
  3279.         mov     ebx, [MemForImage]
  3280.         test    ebx, ebx
  3281.         jz      @f
  3282.         mov     ecx, [cur_width]
  3283.         imul    ecx, font_width*10000h
  3284.         mov     cx, word [cur_height]
  3285.         imul    cx, font_height
  3286.         mov     edx, [skinh]
  3287.         add     edx, 5*10000h
  3288.         mov     esi, 8
  3289.         mov     edi, console_colors
  3290.         xor     ebp, ebp
  3291.         int     0x40
  3292. @@:
  3293.         mov     al, 12
  3294.         push    2
  3295.         pop     ebx
  3296.         int     40h
  3297.         ret
  3298.  
  3299. draw_image.nomem:
  3300.         mov     al, 13
  3301.         xor     edx, edx
  3302.         mov     ebx, [cur_width]
  3303.         imul    ebx, font_width
  3304.         add     ebx, 5*65536
  3305.         mov     ecx, [skinh-2]
  3306.         mov     cx, word [cur_height]
  3307.         imul    cx, font_height
  3308.         int     40h
  3309.         mov     al, 4
  3310.         mov     ebx, 32*65536+32
  3311.         mov     ecx, 0xFFFFFF
  3312.         mov     edx, nomem_draw
  3313.         push    nomem_draw.size
  3314.         pop     esi
  3315.         int     40h
  3316.         ret
  3317.  
  3318. draw_image:
  3319.         mov     [bMemForImageValidData], byte 1
  3320.         cmp     [MemForImage], 0
  3321.         jnz     .allocated
  3322. ; allocate memory for image
  3323.         mov     ecx, [cur_width]
  3324.         imul    ecx, [cur_height]
  3325.         imul    ecx, font_width*font_height
  3326.         call    pgalloc
  3327.         test    eax, eax
  3328.         jz      draw_image.nomem
  3329.         mov     [MemForImage], eax
  3330.         mov     [bMemForImageValidData], byte 0
  3331. .allocated:
  3332.         and     [max_x], 0
  3333.         or      [min_x], -1
  3334.         and     [max_y], 0
  3335.         or      [min_y], -1
  3336.         mov     eax, [cursor_y]
  3337.         mul     [cur_width]
  3338.         add     eax, [cursor_x]
  3339.         add     eax, eax
  3340.         add     eax, [console_data_ptr]
  3341.         xchg    [cur_cursor_pos], eax
  3342.         mov     [old_cursor_pos], eax
  3343.         mov     edi, [MemForImage]
  3344.         mov     esi, [console_data_ptr]
  3345.         mov     ecx, [cur_height]
  3346. .lh:
  3347.         push    ecx
  3348.         mov     ecx, [cur_width]
  3349. .lw:
  3350.         push    ecx
  3351.         mov     eax, [cur_width]
  3352.         imul    eax, [cur_height]
  3353.         mov     ebx, [esi]
  3354.         cmp     [bMemForImageValidData], 0
  3355.         jz      @f
  3356.         cmp     esi, [cur_cursor_pos]
  3357.         jz      @f
  3358.         cmp     esi, [old_cursor_pos]
  3359.         jz      @f
  3360.         cmp     bx, [eax*2+esi]
  3361.         jnz     @f
  3362.         inc     esi
  3363.         inc     esi
  3364.         jmp     .skip_symbol
  3365. @@:
  3366.         mov     [eax*2+esi], bx
  3367.         cmp     ecx, [min_x]
  3368.         ja      @f
  3369.         mov     [min_x], ecx
  3370. @@:
  3371.         cmp     ecx, [max_x]
  3372.         jb      @f
  3373.         mov     [max_x], ecx
  3374. @@:
  3375.         mov     eax, [esp+4]
  3376.         mov     [min_y], eax
  3377.         cmp     eax, [max_y]
  3378.         jb      @f
  3379.         mov     [max_y], eax
  3380. @@:
  3381.         push    edi
  3382.         xor     eax, eax
  3383.         mov     al, [esi+1]
  3384.         and     al, 0xF
  3385.         mov     ebx, eax
  3386.         mov     al, [esi+1]
  3387.         shr     al, 4
  3388.         mov     ebp, eax
  3389.         sub     ebx, ebp
  3390.         lodsb
  3391.         inc     esi
  3392. if font_width > 8
  3393.         lea     edx, [eax+eax+font]
  3394. else
  3395.         lea     edx, [eax+font]
  3396. end if
  3397. .sh:
  3398.         mov     ecx, [edx]
  3399. repeat font_width
  3400.         shr     ecx, 1
  3401.         sbb     eax, eax
  3402.         and     eax, ebx
  3403.         add     eax, ebp
  3404.         mov     [edi+%-1], al
  3405. end repeat
  3406.         mov     eax, [cur_width]
  3407. ;        imul    eax, font_width
  3408. ;        add     edi, eax
  3409. if font_width = 6
  3410.         lea     eax, [eax*2+eax]
  3411.         lea     edi, [edi+eax*2]
  3412. else if font_width = 7
  3413.         lea     edi, [edi+eax*8]
  3414.         sub     edi, eax
  3415. else if font_width = 8
  3416.         lea     edi, [edi+eax*8]
  3417. else if font_width = 9
  3418.         lea     edi, [edi+eax*8]
  3419.         add     edi, eax
  3420. else if font_width = 10
  3421.         lea     eax, [eax*4+eax]
  3422.         lea     edi, [edi+eax*2]
  3423. else
  3424. Unknown font_width value!
  3425. end if
  3426. if font_width > 8
  3427.         add     edx, 256*2
  3428.         cmp     edx, font+256*2*font_height
  3429. else
  3430.         add     edx, 256
  3431.         cmp     edx, font+256*font_height
  3432. end if
  3433.         jb      .sh
  3434.         pop     edi
  3435. .skip_symbol:
  3436.         pop     ecx
  3437.         add     edi, font_width
  3438.         dec     ecx
  3439.         jnz     .lw
  3440.         mov     eax, [cur_width]
  3441.         imul    eax, (font_height-1)*font_width
  3442.         add     edi, eax
  3443.         pop     ecx
  3444.         dec     ecx
  3445.         jnz     .lh
  3446. ; cursor
  3447.         mov     eax, [cursor_y]
  3448.         inc     eax
  3449.         jz      .nocursor
  3450.         mul     [cur_width]
  3451.         imul    eax, font_height*font_width
  3452.         mov     edx, [cursor_x]
  3453.         inc     edx
  3454.         imul    edx, font_width
  3455.         add     eax, edx
  3456.         add     eax, [MemForImage]
  3457.         mov     edx, [cur_width]
  3458.         imul    edx, font_width
  3459.         neg     edx
  3460.         mov     ecx, (font_height*15+50)/100
  3461. .cursor_loop:
  3462.         push    ecx
  3463.         mov     ecx, font_width
  3464.         add     eax, edx
  3465.         push    eax
  3466. @@:
  3467. ;        add     byte [eax-1], 0x10
  3468.         xor     byte [eax-1], 7
  3469.         sub     eax, 1
  3470.         loop    @b
  3471.         pop     eax
  3472.         pop     ecx
  3473.         loop    .cursor_loop
  3474. .nocursor:
  3475.         cmp     [min_y], -1
  3476.         jz      .nodraw
  3477.         mov     ecx, [cur_width]
  3478.         mov     ebx, [cur_height]
  3479.         mov     eax, ebx
  3480.         sub     ebx, [max_y]
  3481.         sub     eax, [min_y]
  3482.         sub     eax, ebx
  3483.         inc     eax
  3484.         imul    ebp, eax, font_height
  3485.         mov     edx, ecx
  3486.         sub     edx, [max_x]
  3487.         imul    edx, font_width
  3488.         mov     eax, edx
  3489.         shl     edx, 16
  3490.         imul    dx, bx, font_height
  3491.         imul    ebx, [cur_width]
  3492.         mov     ecx, [max_x]
  3493.         sub     ecx, [min_x]
  3494.         inc     ecx
  3495.         imul    ecx, font_width*10000h
  3496.         add     ecx, ebp
  3497.         imul    ebx, font_width*font_height
  3498.         add     ebx, [MemForImage]
  3499.         add     ebx, eax
  3500.         add     edx, [skinh]
  3501.         add     edx, 5*10000h
  3502.         imul    esi, [cur_width], font_width
  3503.         mov     ebp, ecx
  3504.         shr     ebp, 16
  3505.         sub     esi, ebp
  3506.         mov     ebp, esi
  3507.         push    65
  3508.         pop     eax
  3509.         mov     edi, console_colors
  3510.         push    8
  3511.         pop     esi
  3512.         int     40h
  3513. .nodraw:
  3514.         ret
  3515.  
  3516. get_console_ptr:
  3517. ; in: eax=x, edx=y
  3518. ; out: edi->console data
  3519.         push    edx
  3520.         imul    edx, [cur_width]
  3521.         add     edx, eax
  3522.         mov     edi, [console_data_ptr]
  3523.         lea     edi, [edi + edx*2]
  3524.         pop     edx
  3525.         ret
  3526.  
  3527. draw_keybar:
  3528.         pushad
  3529.         xor     eax, eax
  3530.         test    [ctrlstate], 3
  3531.         jz      @f
  3532.         inc     eax
  3533. @@:
  3534.         test    [ctrlstate], 0xC
  3535.         jz      @f
  3536.         or      al, 2
  3537. @@:
  3538.         test    [ctrlstate], 0x30
  3539.         jz      @f
  3540.         or      al, 4
  3541. @@:
  3542.         imul    eax, 6*12
  3543.         mov     esi, [active_screen_vtable]
  3544.         mov     esi, [esi+screen_vtable.keybar]
  3545.         add     esi, eax
  3546.         xor     ecx, ecx
  3547.         inc     ecx
  3548.         xor     eax, eax
  3549.         mov     edx, [cur_height]
  3550.         dec     edx
  3551.         call    get_console_ptr
  3552.         push    6
  3553.         pop     ebx
  3554.         mov     eax, [cur_width]
  3555.         sub     eax, 11+9+3*2+6
  3556.         cmp     eax, 7*11
  3557.         jl      @f
  3558.         cdq
  3559.         mov     bl, 11
  3560.         div     ebx
  3561.         mov     ebx, eax
  3562. @@:
  3563.         xor     edx, edx
  3564. .l:
  3565.         add     edx, 7
  3566.         cmp     cl, 10
  3567.         jb      @f
  3568.         inc     edx
  3569. @@:
  3570.         cmp     edx, [cur_width]
  3571.         ja      .ret
  3572.         cmp     cl, 10
  3573.         jae     .twodig
  3574.         lea     eax, [ecx+'0']
  3575.         stosb
  3576.         mov     al, [keybar_number_color]
  3577.         stosb
  3578.         jmp     .cmn
  3579. .twodig:
  3580.         mov     al, cl
  3581.         cbw
  3582.         div     [_10]
  3583.         add     al, '0'
  3584.         stosb
  3585.         mov     al, [keybar_number_color]
  3586.         stosb
  3587.         xchg    al, ah
  3588.         add     al, '0'
  3589.         stosw
  3590. .cmn:
  3591.         mov     ah, [keybar_name_color]
  3592.         push    ecx
  3593.         mov     cl, 6
  3594. @@:
  3595.         lodsb
  3596.         stosw
  3597.         loop    @b
  3598.         mov     al, ' '
  3599.         lea     ecx, [ebx-6]
  3600.         cmp     byte [esp], 12
  3601.         jz      .ret_pop
  3602.         add     edx, ecx
  3603.         rep     stosw
  3604.         pop     ecx
  3605.         inc     edx
  3606.         cmp     edx, [cur_width]
  3607.         ja      .ret
  3608.         mov     ah, [keybar_bgr_color]
  3609.         stosw
  3610.         inc     ecx
  3611.         jmp     .l
  3612. .ret_pop:
  3613.         pop     ecx
  3614. .ret:
  3615.         cmp     byte [edi-2], ' '
  3616.         jnz     @f
  3617.         dec     edi
  3618.         dec     edi
  3619. @@:
  3620.         push    edi
  3621.         xor     eax, eax
  3622.         mov     edx, [cur_height]
  3623.         call    get_console_ptr
  3624.         mov     ecx, edi
  3625.         pop     edi
  3626.         sub     ecx, edi
  3627.         shr     ecx, 1
  3628.         mov     al, ' '
  3629.         mov     ah, [keybar_name_color]
  3630.         rep     stosw
  3631. .done:
  3632.         popad
  3633.         ret
  3634.  
  3635. draw_cmdbar:
  3636.         mov     esi, [active_panel]
  3637.         add     esi, panel1_dir - panel1_data
  3638.         xor     eax, eax
  3639.         mov     edx, [cur_height]
  3640.         dec     edx
  3641.         dec     edx
  3642.         call    get_console_ptr
  3643.         mov     ah, [cmdbar_prefix_color]
  3644.         mov     ecx, [cur_width]
  3645.         dec     ecx
  3646. @@:
  3647.         lodsb
  3648.         test    al, al
  3649.         jz      @f
  3650.         stosw
  3651.         loop    @b
  3652. @@:
  3653.         mov     al, '>'
  3654.         stosw
  3655.         mov     al, ' '
  3656.         mov     ah, [cmdbar_normal_color]
  3657.         rep     stosw
  3658.         ret
  3659.  
  3660. draw_border:
  3661.         push    edi
  3662.         mov     al, 0xC9
  3663.         stosw
  3664.         mov     al, 0xCD
  3665.         lea     ecx, [ebx-2]
  3666.         rep     stosw
  3667.         mov     al, 0xBB
  3668.         stosw
  3669.         pop     edi
  3670.         add     edi, [cur_width]
  3671.         add     edi, [cur_width]
  3672.         lea     ecx, [edx-2]
  3673. .l:
  3674.         push    edi
  3675.         mov     al, 0xBA
  3676.         stosw
  3677.         mov     al, 0x20
  3678.         push    ecx
  3679.         lea     ecx, [ebx-2]
  3680.         rep     stosw
  3681.         pop     ecx
  3682.         mov     al, 0xBA
  3683.         stosw
  3684.         pop     edi
  3685.         add     edi, [cur_width]
  3686.         add     edi, [cur_width]
  3687.         loop    .l
  3688.         mov     al, 0xC8
  3689.         stosw
  3690.         mov     al, 0xCD
  3691.         lea     ecx, [ebx-2]
  3692.         rep     stosw
  3693.         mov     al, 0xBC
  3694.         stosw
  3695.         ret
  3696.  
  3697. calc_colwidths:
  3698. ; in: ebp->panel data
  3699.         imul    esi, [ebp + panel1_colmode - panel1_data], PanelMode.size
  3700.         add     esi, colmodes
  3701.         lodsd
  3702.         mov     ecx, eax
  3703.         lea     edx, [ecx-1]
  3704.         xor     ebx, ebx
  3705.         add     esi, PanelMode.ColumnWidths-4
  3706.         push    ecx esi
  3707.         xor     eax, eax
  3708. .loop:
  3709.         lodsb
  3710.         add     edx, eax
  3711.         cmp     al, 1
  3712.         adc     ebx, 0
  3713.         loop    .loop
  3714.         pop     esi ecx
  3715.         lea     edi, [ebp + panel1_colwidths - panel1_data]
  3716.         test    ebx, ebx
  3717.         jz      .loop2
  3718.         mov     eax, [ebp + panel1_width - panel1_data]
  3719.         dec     eax
  3720.         dec     eax
  3721.         sub     eax, edx
  3722.         jae     @f
  3723.         xor     eax, eax
  3724. @@:
  3725.         xor     edx, edx
  3726.         div     ebx
  3727.         test    eax, eax
  3728.         jnz     @f
  3729.         xor     edx, edx
  3730.         inc     eax
  3731. @@:
  3732.         push    eax
  3733. .loop2:
  3734.         movzx   eax, byte [esi]
  3735.         inc     esi
  3736.         test    eax, eax
  3737.         jnz     @f
  3738.         pop     eax
  3739.         push    eax
  3740.         dec     ebx
  3741.         cmp     ebx, edx
  3742.         jae     @f
  3743.         inc     eax
  3744. @@:
  3745.         stosd
  3746.         loop    .loop2
  3747.         pop     eax
  3748.         and     dword [edi], 0
  3749.         ret
  3750.  
  3751. GetPanelTitle_default:
  3752.         mov     edi, [esp+8]
  3753.         mov     ecx, 1024
  3754.         mov     esi, [esp+12]
  3755.         test    esi, esi
  3756.         jz      .nohost
  3757.         mov     edx, esi
  3758. @@:
  3759.         lodsb
  3760.         test    al, al
  3761.         jz      @f
  3762.         cmp     al, '/'
  3763.         jnz     @b
  3764.         mov     edx, esi
  3765.         jmp     @b
  3766. @@:
  3767.         mov     esi, edx
  3768. @@:
  3769.         lodsb
  3770.         stosb
  3771.         test    al, al
  3772.         loopnz  @b
  3773.         dec     edi
  3774.         inc     ecx
  3775. .nohost:
  3776.         mov     esi, [esp+16]
  3777.         cmp     word [esi], '/'
  3778.         jz      .nodir
  3779. @@:
  3780.         lodsb
  3781.         stosb
  3782.         test    al, al
  3783.         loopnz  @b
  3784.         dec     edi
  3785. .nodir:
  3786.         mov     byte [edi], 0
  3787.         ret     10h
  3788.  
  3789. draw_panel:
  3790.         mov     eax, [ebp + panel1_left - panel1_data]
  3791.         mov     edx, [ebp + panel1_top - panel1_data]
  3792.         call    get_console_ptr
  3793. ; draw border
  3794.         mov     ah, [panel_border_color]
  3795.         mov     ebx, [ebp + panel1_width - panel1_data]
  3796.         mov     edx, [ebp + panel1_height - panel1_data]
  3797.         call    draw_border
  3798.         push    eax
  3799.         mov     eax, [ebp + panel1_left - panel1_data]
  3800.         mov     edx, [ebp + panel1_top - panel1_data]
  3801.         add     edx, [ebp + panel1_height - panel1_data]
  3802.         sub     edx, 3
  3803.         call    get_console_ptr
  3804.         pop     eax
  3805.         mov     al, 0xC7
  3806.         stosw
  3807.         mov     al, 0xC4
  3808.         lea     ecx, [ebx-2]
  3809.         rep     stosw
  3810.         mov     al, 0xB6
  3811.         stosw
  3812.  
  3813.         imul    esi, [ebp + panel1_colmode - panel1_data], PanelMode.size
  3814.         add     esi, colmodes
  3815.         lodsd
  3816.         mov     ecx, eax        ; number of columns
  3817.         lea     ebx, [ebp + panel1_colwidths - panel1_data]
  3818.         mov     eax, [ebp + panel1_left - panel1_data]
  3819.         inc     eax
  3820.         mov     [column_left], eax
  3821.         mov     eax, [ebp + panel1_top - panel1_data]
  3822.         inc     eax
  3823.         mov     [column_top], eax
  3824.         mov     eax, [ebp + panel1_height - panel1_data]
  3825.         sub     eax, 4
  3826.         mov     [column_height], eax
  3827.         dec     eax
  3828.         mov     [ebp + panel1_colsz - panel1_data], eax
  3829.         and     [ebp + panel1_colst - panel1_data], 0
  3830.         mov     eax, [ebp + panel1_start - panel1_data]
  3831.         mov     [column_index], eax
  3832.         mov     [last_column_index], eax
  3833. .columns_loop:
  3834.         push    ecx
  3835.         mov     eax, [ebx]
  3836.         add     ebx, 4
  3837.         mov     [column_width], eax
  3838.         cmp     ecx, 1
  3839.         jz      .skip_right_border
  3840.         add     eax, [column_left]
  3841.         mov     edx, [ebp + panel1_top - panel1_data]
  3842.         call    get_console_ptr
  3843.         mov     ah, [panel_header_color]
  3844.         mov     al, 0xD1
  3845.         mov     [edi], ax
  3846.         add     edi, [cur_width]
  3847.         add     edi, [cur_width]
  3848.         mov     ecx, [column_height]
  3849.         mov     al, 0xB3
  3850. @@:
  3851.         mov     [edi], ax
  3852.         add     edi, [cur_width]
  3853.         add     edi, [cur_width]
  3854.         loop    @b
  3855.         mov     al, 0xC1
  3856.         stosw
  3857. .skip_right_border:
  3858.         mov     eax, [column_left]
  3859.         mov     edx, [column_top]
  3860.         call    get_console_ptr
  3861. ; § £®«®¢®ª á⮫¡æ 
  3862.         push    edi
  3863.         mov     edx, [esi]
  3864.         and     edx, 0xF
  3865.         mov     edx, [column_headers+edx*4]
  3866.         movzx   ecx, byte [edx]
  3867.         inc     edx
  3868.         cmp     ecx, [column_width]
  3869.         jb      @f
  3870.         mov     ecx, [column_width]
  3871. @@:
  3872.         push    ecx
  3873.         sub     ecx, [column_width]
  3874.         neg     ecx
  3875.         shr     ecx, 1
  3876.         mov     al, ' '
  3877.         mov     ah, [column_header_color]
  3878.         rep     stosw
  3879.         pop     ecx
  3880.         jecxz   .skipcopyhdr
  3881.         push    ecx
  3882. @@:
  3883.         mov     al, [edx]
  3884.         inc     edx
  3885.         stosw
  3886.         loop    @b
  3887.         pop     ecx
  3888. .skipcopyhdr:
  3889.         sub     ecx, [column_width]
  3890.         neg     ecx
  3891.         inc     ecx
  3892.         shr     ecx, 1
  3893.         mov     al, ' '
  3894.         rep     stosw
  3895.         pop     edi
  3896.         add     edi, [cur_width]
  3897.         add     edi, [cur_width]
  3898. ; á ¬ á⮫¡¥æ
  3899.         mov     eax, [esi]
  3900.         and     eax, 0xF
  3901.         push    ebx esi
  3902.         call    dword [draw_column_proc+eax*4]
  3903.         pop     esi ebx
  3904.         inc     esi
  3905.         mov     eax, [column_width]
  3906.         inc     eax
  3907.         add     [column_left], eax
  3908.         pop     ecx
  3909.         dec     ecx
  3910.         jnz     .columns_loop
  3911. ; ‡ £®«®¢®ª ¯ ­¥«¨ (⥪ãé ï ¯ ¯ª )
  3912.         lea     esi, [ebp + panel1_dir - panel1_data]
  3913.         mov     eax, [ebp + panel1_hPlugin - panel1_data]
  3914.         test    eax, eax
  3915.         jz      .native
  3916.         push    ebp
  3917.         push    esi
  3918.         mov     esi, [ebp + panel1_parents - panel1_data]
  3919.         add     esi, [ebp + panel1_parents_sz - panel1_data]
  3920. @@:
  3921.         dec     esi
  3922.         cmp     byte [esi-1], 0
  3923.         jnz     @b
  3924.         push    esi
  3925.         push    execdata
  3926.         push    [ebp + panel1_hFile - panel1_data]
  3927.         call    [eax+PluginInfo.GetPanelTitle]
  3928.         pop     ebp
  3929.         mov     esi, execdata
  3930. .native:
  3931.         mov     edi, cur_header
  3932.         mov     ecx, [ebp + panel1_width - panel1_data]
  3933.         sub     ecx, 7
  3934.         movsb
  3935. @@:
  3936.         lodsb
  3937.         stosb
  3938.         dec     ecx
  3939.         test    al, al
  3940.         jz      .header_created
  3941.         cmp     al, '/'
  3942.         jnz     @b
  3943.         mov     edx, esi
  3944. @@:
  3945.         lodsb
  3946.         test    al, al
  3947.         jnz     @b
  3948.         sub     esi, edx
  3949.         dec     esi
  3950.         cmp     esi, ecx
  3951.         jbe     @f
  3952.         mov     word [edi], '..'
  3953.         mov     byte [edi+2], '.'
  3954.         add     edi, 3
  3955.         sub     ecx, 3
  3956.         add     edx, esi
  3957.         sub     edx, ecx
  3958. @@:
  3959.         mov     esi, edx
  3960. @@:
  3961.         lodsb
  3962.         stosb
  3963.         dec     ecx
  3964.         test    al, al
  3965.         jnz     @b
  3966. .header_created:
  3967.         mov     edx, [ebp + panel1_top - panel1_data]
  3968.         mov     eax, [ebp + panel1_left - panel1_data]
  3969.         shr     ecx, 1
  3970.         lea     eax, [eax+ecx+3]
  3971.         call    get_console_ptr
  3972.         mov     ah, [panel_active_header_color]
  3973.         cmp     ebp, [active_panel]
  3974.         jz      @f
  3975.         mov     ah, [panel_header_color]
  3976. @@:
  3977.         mov     al, ' '
  3978.         stosw
  3979.         mov     esi, cur_header
  3980. @@:
  3981.         lodsb
  3982.         test    al, al
  3983.         jz      @f
  3984.         stosw
  3985.         jmp     @b
  3986. @@:
  3987.         mov     al, ' '
  3988.         stosw
  3989.         mov     edx, [ebp + panel1_top - panel1_data]
  3990.         inc     edx
  3991.         mov     eax, [ebp + panel1_left - panel1_data]
  3992.         inc     eax
  3993.         call    get_console_ptr
  3994.         movzx   eax, [ebp + panel1_sortmode - panel1_data]
  3995.         mov     al, [compare_names+eax]
  3996.         stosb
  3997.         mov     eax, [ebp + panel1_selected_num - panel1_data]
  3998.         test    eax, eax
  3999.         jz      .skip_selected_info
  4000. ; ˆ­ä®à¬ æ¨ï ® ¢ë¤¥«¥­­ëå ä ©« å
  4001.         push    dword [ebp + panel1_selected_size+4 - panel1_data]
  4002.         push    dword [ebp + panel1_selected_size - panel1_data]
  4003.         call    fill_total_info
  4004.         mov     eax, [ebp + panel1_width - panel1_data]
  4005.         sub     eax, 2
  4006.         cmp     ecx, eax
  4007.         jbe     @f
  4008.         mov     ecx, eax
  4009.         mov     edi, saved_file_name+512
  4010.         sub     edi, eax
  4011.         mov     byte [edi], '.'
  4012.         mov     word [edi+1], '..'
  4013. @@:
  4014.         mov     esi, edi
  4015.         sub     eax, ecx
  4016.         shr     eax, 1
  4017.         inc     eax
  4018.         add     eax, [ebp + panel1_left - panel1_data]
  4019.         mov     edx, [ebp + panel1_top - panel1_data]
  4020.         add     edx, [ebp + panel1_height - panel1_data]
  4021.         sub     edx, 3
  4022.         call    get_console_ptr
  4023.         mov     ah, [panel_numselected_color]
  4024. @@:
  4025.         lodsb
  4026.         stosw
  4027.         loop    @b
  4028. .skip_selected_info:
  4029. ; ˆ­ä®à¬ æ¨ï ®¡ ®¡é¥¬ ç¨á«¥ ¨ à §¬¥à¥ ä ©«®¢ ¯ ­¥«¨
  4030.         mov     eax, [ebp + panel1_total_num - panel1_data]
  4031.         push    dword [ebp + panel1_total_size+4 - panel1_data]
  4032.         push    dword [ebp + panel1_total_size - panel1_data]
  4033.         call    fill_total_info
  4034.         mov     eax, [ebp + panel1_width - panel1_data]
  4035.         sub     eax, 2
  4036.         cmp     ecx, eax
  4037.         jbe     @f
  4038.         mov     ecx, eax
  4039.         mov     byte [edi+ecx-3], '.'
  4040.         mov     word [edi+ecx-2], '..'
  4041. @@:
  4042.         sub     eax, ecx
  4043.         shr     eax, 1
  4044.         inc     eax
  4045.         add     eax, [ebp + panel1_left - panel1_data]
  4046.         add     edx, [ebp + panel1_top - panel1_data]
  4047.         add     edx, [ebp + panel1_height - panel1_data]
  4048.         dec     edx
  4049.         mov     esi, edi
  4050.         call    get_console_ptr
  4051.         mov     ah, [panel_number_color]
  4052. @@:
  4053.         lodsb
  4054.         stosw
  4055.         loop    @b
  4056.         cmp     [ebp + panel1_numfiles - panel1_data], 0
  4057.         jz      .skip_curinfo
  4058. ; ˆ­ä®à¬ æ¨ï ® ⥪ã饬 ä ©«¥
  4059.         mov     ebx, [ebp + panel1_index - panel1_data]
  4060.         mov     eax, [ebp + panel1_files - panel1_data]
  4061.         mov     ebx, [eax+ebx*4]
  4062.         mov     eax, [ebp + panel1_left - panel1_data]
  4063.         add     eax, [ebp + panel1_width - panel1_data]
  4064.         dec     eax
  4065.         mov     edx, [ebp + panel1_top - panel1_data]
  4066.         add     edx, [ebp + panel1_height - panel1_data]
  4067.         dec     edx
  4068.         dec     edx
  4069.         call    get_console_ptr
  4070.         mov     ecx, [ebp + panel1_width - panel1_data]
  4071.         dec     ecx
  4072.         dec     ecx
  4073.         cmp     [ebp + panel1_colmode - panel1_data], 3
  4074.         jz      .show_curname
  4075. ; ‚à¥¬ï ¬®¤¨ä¨ª æ¨¨
  4076.         sub     edi, 5*2
  4077.         sub     ecx, 6
  4078.         mov     al, [ebx+24+2]
  4079.         aam
  4080.         or      ax, 0x3030
  4081.         mov     [edi], ah
  4082.         mov     [edi+2], al
  4083.         mov     [edi+4], byte ':'
  4084.         mov     al, [ebx+24+1]
  4085.         aam
  4086.         or      ax, 0x3030
  4087.         mov     [edi+6], ah
  4088.         mov     [edi+8], al
  4089.         mov     al, [panel_normal_color]
  4090.         mov     [edi+1], al
  4091.         mov     [edi+3], al
  4092.         mov     [edi+5], al
  4093.         mov     [edi+7], al
  4094.         mov     [edi+9], al
  4095.         dec     edi
  4096.         mov     [edi], al
  4097.         dec     edi
  4098.         mov     byte [edi], ' '
  4099. ; „ â  ¬®¤¨ä¨ª æ¨¨
  4100.         sub     edi, 8*2
  4101.         sub     ecx, 9
  4102.         mov     al, [ebx+28+0]
  4103.         aam
  4104.         or      ax, 0x3030
  4105.         mov     [edi], ah
  4106.         mov     [edi+2], al
  4107.         mov     [edi+4], byte '.'
  4108.         mov     al, [ebx+28+1]
  4109.         aam
  4110.         or      ax, 0x3030
  4111.         mov     [edi+6], ah
  4112.         mov     [edi+8], al
  4113.         mov     [edi+10], byte '.'
  4114.         mov     ax, [ebx+28+2]
  4115.         div     [_100]
  4116.         mov     al, ah
  4117.         aam
  4118.         or      ax, 0x3030
  4119.         mov     [edi+12], ah
  4120.         mov     [edi+14], al
  4121.         mov     al, [panel_normal_color]
  4122.         mov     [edi+1], al
  4123.         mov     [edi+3], al
  4124.         mov     [edi+5], al
  4125.         mov     [edi+7], al
  4126.         mov     [edi+9], al
  4127.         mov     [edi+11], al
  4128.         mov     [edi+13], al
  4129.         mov     [edi+15], al
  4130.         dec     edi
  4131.         mov     [edi], al
  4132.         dec     edi
  4133.         mov     [edi], byte ' '
  4134. ;  §¬¥à
  4135.         std
  4136.         mov     ah, [panel_normal_color]
  4137.         dec     edi
  4138.         dec     edi
  4139.         dec     ecx
  4140.         test    byte [ebx], 0x10
  4141.         jz      .size_file
  4142.         push    ecx
  4143.         mov     esi, aFolder+aFolder.size-1
  4144.         mov     ecx, aFolder.size
  4145.         cmp     word [ebx+40], '..'
  4146.         jnz     @f
  4147.         cmp     byte [ebx+42], 0
  4148.         jnz     @f
  4149.         mov     esi, aUp+aUp.size-1
  4150.         mov     cl, aUp.size
  4151. @@:
  4152.         sub     [esp], ecx
  4153. @@:
  4154.         lodsb
  4155.         stosw
  4156.         loop    @b
  4157.         pop     ecx
  4158.         jmp     .size_done
  4159. .size_file:
  4160.         mov     edx, [ebx+36]
  4161.         test    edx, edx
  4162.         jz      .size_less_4g
  4163.         cmp     edx, 10*256
  4164.         jae     .size_tera
  4165. ; ¢ £¨£ ¡ ©â å
  4166.         mov     al, 'G'
  4167.         shl     edx, 2
  4168.         jmp     .size_letter
  4169. .size_tera:
  4170. ; ¢ â¥à ¡ ©â å
  4171.         shr     edx, 8
  4172.         mov     al, 'T'
  4173.         jmp     .size_letter
  4174. .size_less_4g:
  4175.         mov     edx, [ebx+32]
  4176.         cmp     edx, 10*(1 shl 20)
  4177.         jae     .size_mega
  4178.         cmp     edx, 1 shl 20
  4179.         jb      .size_num
  4180.         shr     edx, 10
  4181.         mov     al, 'K'
  4182.         jmp     .size_letter
  4183. .size_mega:
  4184.         mov     al, 'M'
  4185.         shr     edx, 20
  4186. .size_letter:
  4187.         stosw
  4188.         dec     ecx
  4189.         mov     al, ' '
  4190.         stosw
  4191.         dec     ecx
  4192. .size_num:
  4193.         xchg    eax, edx
  4194.         xor     edx, edx
  4195.         div     [_10d]
  4196.         xchg    eax, edx
  4197.         add     al, '0'
  4198.         mov     ah, [panel_normal_color]
  4199.         stosw
  4200.         dec     ecx
  4201.         test    edx, edx
  4202.         jnz     .size_num
  4203. .size_done:
  4204.         cld
  4205. .show_curname:
  4206. ; ˆ¬ï
  4207.         sub     edi, ecx
  4208.         sub     edi, ecx
  4209.         lea     esi, [ebx+40]
  4210. @@:
  4211.         lodsb
  4212.         test    al, al
  4213.         jnz     @b
  4214.         sub     esi, ebx
  4215.         sub     esi, 41
  4216.         mov     ah, [panel_normal_color]
  4217.         cmp     esi, ecx
  4218.         lea     edx, [ebx+40]
  4219.         jbe     @f
  4220.         mov     al, '{'
  4221.         mov     [edi-2], ax
  4222.         add     edx, esi
  4223.         sub     edx, ecx
  4224. @@:
  4225.         mov     esi, edx
  4226. @@:
  4227.         lodsb
  4228.         test    al, al
  4229.         jz      @f
  4230.         stosw
  4231.         loop    @b
  4232. @@:
  4233.         mov     al, ' '
  4234.         rep     stosw
  4235. .skip_curinfo:
  4236.         call    draw_image
  4237.         ret
  4238.  
  4239. fill_total_info:
  4240.         mov     edi, saved_file_name+511
  4241.         mov     byte [edi], ' '
  4242. if lang eq ru
  4243.         mov     byte [edi-1], '¥'
  4244.         dec     edi
  4245.         cmp     eax, 1
  4246.         jz      @f
  4247.         mov     word [edi-1], ' å'
  4248.         dec     edi
  4249. @@:
  4250.         mov     dword [edi-4], 'ä ©«'
  4251.         mov     byte [edi-5], ' '
  4252.         sub     edi, 5
  4253. else
  4254.         cmp     eax, 1
  4255.         jz      @f
  4256.         dec     edi
  4257.         mov     byte [edi], 's'
  4258. @@:
  4259.         mov     dword [edi-4], 'file'
  4260.         mov     byte [edi-5], ' '
  4261.         sub     edi, 5
  4262. end if
  4263.         xor     edx, edx
  4264.         push    10
  4265.         pop     ecx
  4266. @@:
  4267.         div     ecx
  4268.         dec     edi
  4269.         add     dl, '0'
  4270.         mov     [edi], dl
  4271.         xor     edx, edx
  4272.         test    eax, eax
  4273.         jnz     @b
  4274. if lang eq ru
  4275.         mov     dword [edi-4], 'â ¢ '
  4276.         mov     dword [edi-8], ' ¡ ©'
  4277.         sub     edi, 8
  4278. else
  4279.         mov     dword [edi-4], ' in '
  4280.         mov     dword [edi-8], 'ytes'
  4281.         mov     word [edi-10], ' b'
  4282.         sub     edi, 10
  4283. end if
  4284.         lea     esi, [edi-3]
  4285.         mov     edx, [esp+8]
  4286.         mov     eax, [esp+4]
  4287. .selsizel:
  4288.         push    edx
  4289.         mov     ebx, edx
  4290.         xor     edx, edx
  4291.         add     ebx, ebx
  4292.         adc     edx, edx
  4293.         push    ebx
  4294.         push    edx
  4295.         add     ebx, ebx
  4296.         adc     edx, edx
  4297.         add     ebx, [esp+4]
  4298.         adc     edx, [esp]
  4299.         add     esp, 8
  4300.         add     eax, ebx
  4301.         adc     edx, 0
  4302.         div     ecx
  4303.         dec     edi
  4304.         cmp     edi, esi
  4305.         jae     @f
  4306.         mov     byte [edi], ','
  4307.         dec     edi
  4308.         sub     esi, 4
  4309. @@:
  4310.         pop     ebx
  4311.         add     dl, '0'
  4312.         mov     byte [edi], dl
  4313.         xchg    eax, ebx
  4314.         mul     [muldiv10]
  4315.         add     eax, ebx
  4316.         adc     edx, 0
  4317.         mov     ebx, eax
  4318.         or      ebx, edx
  4319.         jnz     .selsizel
  4320.         dec     edi
  4321.         mov     byte [edi], ' '
  4322.         mov     ecx, saved_file_name+512
  4323.         sub     ecx, edi
  4324.         ret     8
  4325.  
  4326. get_file_color:
  4327.         mov     ah, [esi + 6]
  4328.         cmp     ebp, [active_panel]
  4329.         jnz     @f
  4330.         cmp     ecx, [ebp + panel1_index - panel1_data]
  4331.         jnz     @f
  4332.         mov     ah, [esi + 7]
  4333. @@:
  4334.         test    byte [esi + 303], 1
  4335.         jnz     @f
  4336.         mov     ah, [esi + 4]
  4337.         cmp     ebp, [active_panel]
  4338.         jnz     @f
  4339.         cmp     ecx, [ebp + panel1_index - panel1_data]
  4340.         jnz     @f
  4341.         mov     ah, [esi + 5]
  4342. @@:
  4343.         ret
  4344.  
  4345. draw_name_column:
  4346.         mov     eax, [column_index]
  4347.         mov     [last_column_index], eax
  4348.         mov     edx, [ebp + panel1_numfiles - panel1_data]
  4349.         mov     ecx, [column_height]
  4350.         dec     ecx
  4351. .l:
  4352.         cmp     [column_index], edx
  4353.         jae     .ret
  4354.         push    ecx
  4355.         mov     ecx, [column_index]
  4356.         mov     esi, [ebp + panel1_files - panel1_data]
  4357.         mov     esi, [esi+ecx*4]
  4358.         mov     ebx, [esi]
  4359.         call    get_file_color
  4360.         add     esi, 40
  4361.         mov     ecx, [column_width]
  4362.         push    edi
  4363. @@:
  4364.         lodsb
  4365.         test    al, al
  4366.         jz      @f
  4367.         stosw
  4368.         loop    @b
  4369.         lodsb
  4370.         test    al, al
  4371.         jz      @f
  4372.         mov     byte [edi], '}'
  4373.         jmp     .continue
  4374. @@:
  4375.         test    bl, 10h
  4376.         jnz     .noalignext
  4377.         mov     ebx, [ebp + panel1_colmode - panel1_data]
  4378. ; sizeof(PanelMode) = 40
  4379.         lea     ebx, [ebx+ebx*4]
  4380.         cmp     [colmodes+ebx*8+PanelMode.bAlignExtensions], 0
  4381.         jz      .noalignext
  4382.         push    ecx
  4383.         sub     ecx, [column_width]
  4384.         neg     ecx
  4385.         jz      .noalignext2
  4386.         dec     esi
  4387. @@:
  4388.         dec     esi
  4389.         cmp     byte [esi], '.'
  4390.         loopnz  @b
  4391.         jnz     .noalignext2
  4392.         inc     esi
  4393.         sub     ecx, [column_width]
  4394.         neg     ecx
  4395.         sub     ecx, [esp]
  4396.         sub     edi, ecx
  4397.         sub     edi, ecx
  4398.         dec     ecx
  4399.         mov     ebx, [esp+4]
  4400.         cmp     ecx, 3
  4401.         ja      @f
  4402.         mov     cl, 3
  4403. @@:
  4404.         sub     ecx, [column_width]
  4405.         sub     ebx, edi
  4406.         sar     ebx, 1
  4407.         sub     ebx, ecx
  4408.         pop     ecx
  4409.         inc     ecx
  4410.         push    0
  4411.         cmp     ecx, ebx
  4412.         jbe     @f
  4413.         sub     ecx, ebx
  4414.         mov     [esp], ecx
  4415.         mov     ecx, ebx
  4416. @@:
  4417.         mov     al, ' '
  4418.         rep     stosw
  4419. @@:
  4420.         lodsb
  4421.         test    al, al
  4422.         jz      .noalignext2
  4423.         stosw
  4424.         jmp     @b
  4425. .noalignext2:
  4426.         pop     ecx
  4427. .noalignext:
  4428.         mov     al, ' '
  4429.         rep     stosw
  4430. .continue:
  4431.         pop     edi
  4432.         add     edi, [cur_width]
  4433.         add     edi, [cur_width]
  4434.         inc     [column_index]
  4435.         pop     ecx
  4436.         dec     ecx
  4437.         jnz     .l
  4438. .ret:
  4439.         mov     eax, [ebp + panel1_colsz - panel1_data]
  4440.         add     [ebp + panel1_colst - panel1_data], eax
  4441.         cmp     ebp, panel1_data
  4442.         jnz     .ret2
  4443. ; —¨á«® íªà ­®¢
  4444.         mov     eax, [num_screens]
  4445.         dec     eax
  4446.         jz      .ret2
  4447.         push    eax
  4448.         xor     eax, eax
  4449.         xor     edx, edx
  4450.         call    get_console_ptr
  4451.         mov     ah, [panel_nscreens_color]
  4452.         mov     al, '['
  4453.         stosw
  4454.         pop     eax
  4455.         push    -'0'
  4456. @@:
  4457.         xor     edx, edx
  4458.         div     [_10d]
  4459.         push    edx
  4460.         test    eax, eax
  4461.         jnz     @b
  4462. @@:
  4463.         pop     eax
  4464.         add     eax, '0'
  4465.         jz      @f
  4466.         mov     ah, [panel_nscreens_color]
  4467.         stosw
  4468.         jmp     @b
  4469. @@:
  4470.         mov     al, ']'
  4471.         mov     ah, [panel_nscreens_color]
  4472.         stosw
  4473. .ret2:
  4474. draw_empty_column:
  4475.         ret
  4476.  
  4477. draw_size_column:
  4478.         add     edi, [column_width]
  4479.         add     edi, [column_width]
  4480.         dec     edi
  4481.         dec     edi
  4482.         std
  4483.         mov     ecx, [column_height]
  4484.         dec     ecx
  4485.         push    [last_column_index]
  4486. .l:
  4487.         mov     edx, [ebp + panel1_numfiles - panel1_data]
  4488.         cmp     [last_column_index], edx
  4489.         jae     .ret
  4490.         push    ecx
  4491.         push    edi
  4492.         mov     ecx, [last_column_index]
  4493.         mov     esi, [ebp + panel1_files - panel1_data]
  4494.         mov     esi, [esi+ecx*4]
  4495.         call    get_file_color
  4496.         mov     ecx, [column_width]
  4497. @@:
  4498.         mov     ebx, eax
  4499.         cmp     word [esi+40], '..'
  4500.         jnz     .nodotdot
  4501.         cmp     byte [esi+42], 0
  4502.         jnz     .nodotdot
  4503. if lang eq ru
  4504.         mov     al, 'å'
  4505.         stosw
  4506.         mov     al, 'à'
  4507.         stosw
  4508.         mov     al, '¥'
  4509.         stosw
  4510.         mov     al, '¢'
  4511.         stosw
  4512.         mov     al, '‚'
  4513.         stosw
  4514.         sub     ecx, 5
  4515. else
  4516.         mov     al, ' '
  4517.         stosw
  4518.         stosw
  4519.         mov     al, 'p'
  4520.         stosw
  4521.         mov     al, 'U'
  4522.         stosw
  4523.         sub     ecx, 4
  4524. end if
  4525.         jmp     .size_written
  4526. .nodotdot:
  4527.         test    byte [esi], 10h
  4528.         jz      .nofolder
  4529. if lang eq ru
  4530.         mov     al, ' '
  4531.         stosw
  4532.         mov     al, 'ª'
  4533.         stosw
  4534.         mov     al, '¯'
  4535.         stosw
  4536.         mov     al, ' '
  4537.         stosw
  4538.         mov     al, ''
  4539.         stosw
  4540.         sub     ecx, 5
  4541. else
  4542.         mov     al, 'r'
  4543.         stosw
  4544.         mov     al, 'e'
  4545.         stosw
  4546.         mov     al, 'd'
  4547.         stosw
  4548.         mov     al, 'l'
  4549.         stosw
  4550.         mov     al, 'o'
  4551.         stosw
  4552.         mov     al, 'F'
  4553.         stosw
  4554.         sub     ecx, 6
  4555. end if
  4556.         jmp     .size_written
  4557. .nofolder:
  4558.         mov     eax, [esi+32]
  4559.         mov     edx, [esi+36]
  4560.         test    edx, edx
  4561.         jz      .less_4G
  4562.         cmp     edx, 10000/4*1024
  4563.         jb      .giga
  4564.         mov     al, 'T'
  4565.         shr     edx, 10
  4566.         jmp     .write_letter
  4567. .giga:
  4568.         mov     al, 'G'
  4569.         shl     edx, 2
  4570.         jmp     .write_letter
  4571. .less_4G:
  4572.         mov     edx, eax
  4573.         cmp     eax, 1000000
  4574.         jb      .byte
  4575.         cmp     eax, 10000*1024
  4576.         jb      .kilo
  4577.         mov     al, 'M'
  4578.         shr     edx, 20
  4579.         jmp     .write_letter
  4580. .kilo:
  4581.         mov     al, 'K'
  4582.         shr     edx, 10
  4583. .write_letter:
  4584.         mov     ah, bh
  4585.         stosw
  4586.         mov     al, ' '
  4587.         stosw
  4588.         dec     ecx
  4589.         dec     ecx
  4590. .byte:
  4591.         xchg    eax, edx
  4592.         xor     edx, edx
  4593.         div     [_10d]
  4594.         xchg    eax, edx
  4595.         add     al, '0'
  4596.         mov     ah, bh
  4597.         stosw
  4598.         dec     ecx
  4599.         test    edx, edx
  4600.         jnz     .byte
  4601. .size_written:
  4602.         mov     eax, ebx
  4603.         test    ecx, ecx
  4604.         jle     @f
  4605.         mov     al, ' '
  4606.         rep     stosw
  4607. @@:
  4608.         mov     byte [edi+1], ah
  4609.         pop     edi
  4610.         add     edi, [cur_width]
  4611.         add     edi, [cur_width]
  4612.         inc     [last_column_index]
  4613.         pop     ecx
  4614.         dec     ecx
  4615.         jnz     .l
  4616. .ret:
  4617.         pop     [last_column_index]
  4618.         cld
  4619.         ret
  4620.  
  4621. draw_date_column:
  4622.         mov     ecx, [column_height]
  4623.         dec     ecx
  4624.         push    [last_column_index]
  4625. .l:
  4626.         mov     edx, [ebp + panel1_numfiles - panel1_data]
  4627.         cmp     [last_column_index], edx
  4628.         jae     .ret
  4629.         push    ecx
  4630.         push    edi
  4631.         mov     ecx, [last_column_index]
  4632.         mov     esi, [ebp + panel1_files - panel1_data]
  4633.         mov     esi, [esi+ecx*4]
  4634.         call    get_file_color
  4635.         mov     bh, ah
  4636.         mov     byte [edi-1], bh
  4637.         mov     al, [esi+28]
  4638.         aam
  4639.         add     eax, '00'
  4640.         push    eax
  4641.         mov     al, ah
  4642.         mov     ah, bh
  4643.         stosw
  4644.         pop     eax
  4645.         mov     ah, bh
  4646.         stosw
  4647.         mov     al, '.'
  4648.         stosw
  4649.         mov     al, [esi+29]
  4650.         aam
  4651.         add     eax, '00'
  4652.         push    eax
  4653.         mov     al, ah
  4654.         mov     ah, bh
  4655.         stosw
  4656.         pop     eax
  4657.         mov     ah, bh
  4658.         stosw
  4659.         mov     al, '.'
  4660.         stosw
  4661.         movzx   eax, word [esi+30]
  4662.         xor     edx, edx
  4663.         div     [_10d]
  4664.         xchg    eax, edx
  4665.         add     al, '0'
  4666.         mov     ah, bh
  4667.         mov     [edi+2], ax
  4668.         xchg    eax, edx
  4669.         xor     edx, edx
  4670.         div     [_10d]
  4671.         xchg    eax, edx
  4672.         add     al, '0'
  4673.         mov     ah, bh
  4674.         stosw
  4675.         pop     edi
  4676.         add     edi, [cur_width]
  4677.         add     edi, [cur_width]
  4678.         inc     [last_column_index]
  4679.         pop     ecx
  4680.         dec     ecx
  4681.         jnz     .l
  4682. .ret:
  4683.         pop     [last_column_index]
  4684.         cld
  4685.         ret
  4686.  
  4687. draw_time_column:
  4688.         mov     ecx, [column_height]
  4689.         dec     ecx
  4690.         push    [last_column_index]
  4691. .l:
  4692.         mov     edx, [ebp + panel1_numfiles - panel1_data]
  4693.         cmp     [last_column_index], edx
  4694.         jae     .ret
  4695.         push    ecx
  4696.         push    edi
  4697.         mov     ecx, [last_column_index]
  4698.         mov     esi, [ebp + panel1_files - panel1_data]
  4699.         mov     esi, [esi+ecx*4]
  4700.         call    get_file_color
  4701.         mov     bh, ah
  4702.         mov     byte [edi-1], bh
  4703.         mov     al, [esi+26]
  4704.         aam
  4705.         add     eax, '00'
  4706.         push    eax
  4707.         mov     al, ah
  4708.         mov     ah, bh
  4709.         stosw
  4710.         pop     eax
  4711.         mov     ah, bh
  4712.         stosw
  4713.         mov     al, ':'
  4714.         stosw
  4715.         mov     al, [esi+25]
  4716.         aam
  4717.         add     eax, '00'
  4718.         push    eax
  4719.         mov     al, ah
  4720.         mov     ah, bh
  4721.         stosw
  4722.         pop     eax
  4723.         mov     ah, bh
  4724.         stosw
  4725.         pop     edi
  4726.         add     edi, [cur_width]
  4727.         add     edi, [cur_width]
  4728.         inc     [last_column_index]
  4729.         pop     ecx
  4730.         dec     ecx
  4731.         jnz     .l
  4732. .ret:
  4733.         pop     [last_column_index]
  4734.         cld
  4735.         ret
  4736.  
  4737. ;insert_last_dot:
  4738. ;        push    eax esi
  4739. ;        mov     ah, 0
  4740. ;.loop:
  4741. ;        lodsb
  4742. ;        test    al, al
  4743. ;        jz      .done
  4744. ;        cmp     al, '.'
  4745. ;        jnz     .loop
  4746. ;        mov     ah, 1
  4747. ;        jmp     .loop
  4748. ;.done:
  4749. ;        test    ah, ah
  4750. ;        jnz     @f
  4751. ;        mov     byte [esi-1], '.'
  4752. ;        mov     byte [esi], 0
  4753. ;@@:
  4754. ;        pop     esi eax
  4755. ;        ret
  4756.  
  4757. ;delete_last_dot:
  4758. ;        push    esi
  4759. ;@@:
  4760. ;        cmp     byte [esi], 0
  4761. ;        jz      @f
  4762. ;        inc     esi
  4763. ;        jmp     @b
  4764. ;@@:
  4765. ;        cmp     byte [esi-1], '.'
  4766. ;        jnz     @f
  4767. ;        mov     byte [esi-1], 0
  4768. ;@@:     pop     esi
  4769. ;        ret
  4770.  
  4771. read_folder:
  4772.         mov     eax, [ebp + panel1_nfa - panel1_data]
  4773.         mov     [dirinfo.size], eax
  4774.         shl     eax, 2
  4775.         add     eax, [ebp + panel1_files - panel1_data]
  4776.         mov     [dirinfo.dirdata], eax
  4777.         lea     eax, [ebp + panel1_dir - panel1_data]
  4778.         mov     [dirinfo.name], eax
  4779.         xor     eax, eax
  4780.         mov     [ebp + panel1_total_num - panel1_data], eax
  4781.         mov     dword [ebp + panel1_total_size - panel1_data], eax
  4782.         mov     dword [ebp + panel1_total_size+4 - panel1_data], eax
  4783.         mov     [ebp + panel1_selected_num - panel1_data], eax
  4784.         mov     dword [ebp + panel1_selected_size - panel1_data], eax
  4785.         mov     dword [ebp + panel1_selected_size+4 - panel1_data], eax
  4786. .retry:
  4787.         mov     eax, [ebp + panel1_hPlugin - panel1_data]
  4788.         test    eax, eax
  4789.         jz      .native
  4790.         mov     ecx, [dirinfo.size]
  4791.         test    [ebp + panel1_plugin_flags - panel1_data], 1
  4792.         jz      @f
  4793.         dec     ecx     ; reserve one entry for '..'
  4794. @@:
  4795.         push    ebp
  4796.         push    [dirinfo.dirdata]
  4797.         push    ecx
  4798.         push    0
  4799.         push    [ebp + panel1_hFile - panel1_data]
  4800.         call    [eax + PluginInfo.ReadFolder]
  4801.         pop     ebp
  4802.         mov     ebx, [dirinfo.dirdata]
  4803.         mov     ebx, [ebx+4]
  4804.         jmp     .read
  4805. .native:
  4806.         push    70
  4807.         pop     eax
  4808.         mov     ebx, dirinfo
  4809.         int     40h
  4810. .read:
  4811.         test    eax, eax
  4812.         jz      .ok
  4813.         cmp     eax, 6
  4814.         jz      .ok
  4815. ; Failed to read folder, notify user
  4816.         cmp     [bSilentFolderMode], 0
  4817.         jnz     .dont_notify
  4818.         push    dword aContinue
  4819.         push    dword aRetry
  4820.         mov     edx, esp
  4821.         call    get_error_msg
  4822.         push    [dirinfo.name]
  4823.         push    dword aCannotReadFolder
  4824.         push    eax
  4825.         mov     eax, esp
  4826.         push    edx
  4827.         push    2
  4828.         push    eax
  4829.         push    3
  4830.         call    SayErr
  4831.         add     esp, 5*4
  4832.         test    eax, eax
  4833.         jz      .retry
  4834. .dont_notify:
  4835. ; If not on plugin panel, try to return to previous directory
  4836.         cmp     [ebp + panel1_hPlugin - panel1_data], 0
  4837.         jnz     @f
  4838.         mov     esi, prev_dir
  4839.         cmp     byte [esi], 0
  4840.         jz      @f
  4841.         lea     edi, [ebp + panel1_dir - panel1_data]
  4842.         mov     ecx, 1024/4
  4843.         rep     movsd
  4844.         mov     byte [prev_dir], 0
  4845.         ret
  4846. @@:
  4847.         mov     [bSilentFolderMode], 1  ; enter silent mode
  4848. ; Try to read parent folder
  4849.         mov     esi, [dirinfo.name]
  4850.         xor     edx, edx
  4851. .up1:
  4852.         lodsb
  4853.         test    al, al
  4854.         jz      .up1done
  4855.         cmp     al, '/'
  4856.         jnz     .up1
  4857.         inc     edx
  4858.         lea     edi, [esi-1]
  4859.         jmp     .up1
  4860. .up1done:
  4861.         cmp     [ebp + panel1_hPlugin - panel1_data], 0
  4862.         jz      .4
  4863.         cmp     edx, 1
  4864.         ja      .up
  4865. ; ç⥭¨¥ á ¯ ­¥«¨ ¯« £¨­  ®¡«®¬ «®áì ¯® ¯®«­®©
  4866. ; ¯à¨ í⮬ ¬ë 㦥 ¢ ª®à­¥
  4867. ; ¤¥« ¥¬ ¢¨¤, çâ® äã­ªæ¨ï ç⥭¨ï ¢¥à­ã«  0 í«¥¬¥­â®¢
  4868. ; (¥á«¨ ­ã¦¥­ ¢å®¤ "..", ®­ ¡ã¤¥â ¤®¡ ¢«¥­  ¢â®¬ â¨ç¥áª¨)
  4869.         xor     ebx, ebx        ; 0 items read
  4870.         mov     eax, [dirinfo.dirdata]
  4871.         mov     [eax+8], ebx    ; 0 items total
  4872.         jmp     .ok
  4873. .4:
  4874.         cmp     edx, 2
  4875.         jbe     .noup
  4876. .up:
  4877.         stosb
  4878.         jmp     read_folder
  4879. .noup:
  4880. ; There is no parent folder, and we are not on plugin panel
  4881. ; Try to read ramdisk
  4882.         mov     esi, [dirinfo.name]
  4883.         mov     edi, esi
  4884.         lodsd
  4885.         or      eax, 0x00202000
  4886.         cmp     eax, '/rd/'
  4887.         jnz     @f
  4888.         lodsw
  4889.         cmp     ax, '1'
  4890.         jz      .nosetrd
  4891. @@:
  4892.         mov     eax, '/rd/'
  4893.         stosd
  4894.         mov     ax, '1'
  4895.         stosw
  4896.         jmp     read_folder
  4897. .nosetrd:
  4898. ; „ ¦¥ à ¬¤¨áª ­¥ ¯à®ç¨â «áï. ‡­ ç¨â, ­¥ áã¤ì¡ ...
  4899.         and     dword [ebp + panel1_numfiles - panel1_data], 0
  4900.         and     dword [ebp + panel1_index - panel1_data], 0
  4901.         and     dword [ebp + panel1_start - panel1_data], 0
  4902.         mov     [bSilentFolderMode], 0  ; leave silent mode
  4903.         ret
  4904. .ok:
  4905.         mov     eax, [dirinfo.dirdata]
  4906.         cmp     [eax+8], ebx
  4907.         jz      .readdone
  4908.         push    dword [eax+8]
  4909.         mov     ecx, [ebp + panel1_files - panel1_data]
  4910.         call    pgfree
  4911.         pop     ecx
  4912.         add     ecx, 0xF
  4913.         and     ecx, not 0xF
  4914.         push    ecx
  4915.         imul    ecx, 4+304
  4916.         add     ecx, 32
  4917.         call    xpgalloc
  4918.         test    eax, eax
  4919.         jnz     .succ1
  4920.         pop     eax
  4921.         jmp     .readdone
  4922. .succ1:
  4923.         mov     [ebp + panel1_files - panel1_data], eax
  4924.         pop     [ebp + panel1_nfa - panel1_data]
  4925.         mov     [prev_dir], 0
  4926.         jmp     read_folder
  4927. .readdone:
  4928.         xor     edx, edx
  4929.         mov     [ebp + panel1_start - panel1_data], edx
  4930.         mov     [ebp + panel1_index - panel1_data], edx
  4931.         mov     [ebp + panel1_start - panel1_data], edx
  4932.         mov     edi, [ebp + panel1_files - panel1_data]
  4933.         mov     eax, [ebp + panel1_nfa - panel1_data]
  4934.         lea     eax, [edi + eax*4 + 32]
  4935.         mov     ecx, [eax-32+4]
  4936.         test    ecx, ecx
  4937.         jz      .loopdone
  4938. ; ˆ£­®à¨à㥬 ᯥ樠«ì­ë¥ ¢å®¤ë, ᮮ⢥âáâ¢ãî騥 ¯ ¯ª¥ '.' ¨ ¬¥âª¥ ⮬ 
  4939. .ptrinit:
  4940.         cmp     word [eax+40], '.'
  4941.         jz      .loopcont
  4942.         test    byte [eax], 8
  4943.         jnz     .loopcont
  4944.         mov     byte [eax+303], 0
  4945.         test    edx, edx
  4946.         jnz     .nodotdot
  4947.         cmp     word [eax+40], '..'
  4948.         jnz     .nodotdot
  4949.         cmp     byte [eax+42], 0
  4950.         jnz     .nodotdot
  4951.         mov     edx, eax
  4952.         push    edi
  4953. @@:
  4954.         cmp     edi, [ebp + panel1_files - panel1_data]
  4955.         jbe     @f
  4956.         push    dword [edi-4]
  4957.         pop     dword [edi]
  4958.         sub     edi, 4
  4959.         jmp     @b
  4960. @@:
  4961.         stosd
  4962.         pop     edi
  4963.         scasd
  4964.         jmp     .dotdot
  4965. .nodotdot:
  4966.         stosd
  4967.         xor     ebx, ebx
  4968.         test    byte [eax], 10h
  4969.         setz    bl
  4970.         add     [ebp + panel1_total_num - panel1_data], ebx
  4971.         mov     ebx, dword [eax+32]
  4972.         add     dword [ebp + panel1_total_size - panel1_data], ebx
  4973.         mov     ebx, dword [eax+36]
  4974.         adc     dword [ebp + panel1_total_size+4 - panel1_data], ebx
  4975. .dotdot:
  4976. ; ¯®¤á¢¥âª 
  4977. ;        call    insert_last_dot
  4978.         call    highlight_init
  4979. ;        call    delete_last_dot
  4980. .loopcont:
  4981.         add     eax, 304
  4982.         dec     ecx
  4983.         jnz     .ptrinit
  4984. .loopdone:
  4985.         push    edi
  4986.         sub     edi, [ebp + panel1_files - panel1_data]
  4987.         shr     edi, 2
  4988.         mov     [ebp + panel1_numfiles - panel1_data], edi
  4989.         pop     edi
  4990.         test    edx, edx
  4991.         jnz     @f
  4992.         test    [ebp + panel1_plugin_flags - panel1_data], 1
  4993.         jz      @f
  4994.         mov     ecx, [ebp + panel1_numfiles - panel1_data]
  4995.         inc     [ebp + panel1_numfiles - panel1_data]
  4996.         lea     esi, [edi-4]
  4997.         std
  4998.         rep     movsd
  4999.         cld
  5000.         mov     eax, left_dotdot_entry
  5001.         cmp     ebp, panel1_data
  5002.         jz      .zq
  5003.         add     eax, right_dotdot_entry-left_dotdot_entry
  5004. .zq:
  5005.         stosd
  5006.         call    highlight_init
  5007. @@:
  5008. ; ‘®àâ¨à®¢ª 
  5009. sort_files:
  5010.         movzx   eax, [ebp + panel1_sortmode - panel1_data]
  5011.         mov     ebx, [compare_fns + eax*4]
  5012. .mode:
  5013.         mov     edx, [ebp + panel1_files - panel1_data]
  5014.         mov     ecx, [ebp + panel1_numfiles - panel1_data]
  5015.         jecxz   .skip
  5016.         mov     eax, [edx]
  5017.         cmp     word [eax+40], '..'
  5018.         jnz     .nodotdot
  5019.         cmp     byte [eax+42], 0
  5020.         jnz     .nodotdot
  5021.         dec     ecx
  5022.         add     edx, 4
  5023. .nodotdot:
  5024.         call    sort
  5025. .skip:
  5026.         mov     [bSilentFolderMode], 0  ; leave silent mode
  5027.         ret
  5028.  
  5029. highlight_init:
  5030.         pushad
  5031.         mov     ebp, eax
  5032.         lea     esi, [ebp+40]
  5033.         mov     edi, lower_file_name
  5034.         mov     edx, edi
  5035.         xor     eax, eax
  5036. @@:
  5037.         lodsb
  5038.         mov     al, [tolower_table+eax]
  5039.         stosb
  5040.         test    al, al
  5041.         jnz     @b
  5042.         mov     esi, edx
  5043.         lea     edx, [edi-1]
  5044.         xor     ecx, ecx
  5045. .highlight_test_loop:
  5046.         mov     ebx, [highlight_groups+ecx*4]
  5047.         mov     al, [ebx + highlight.IncludeAttributes]
  5048.         mov     ah, [ebp]
  5049.         and     ah, al
  5050.         cmp     ah, al
  5051.         jnz     .highlight_test_failed
  5052.         lea     edi, [ebx + highlight.Mask]
  5053.         call    match_mask_rev_lowercase
  5054.         jc      .highlight_test_failed
  5055.         mov     ah, [ebx + highlight.NormalColor]
  5056.         test    ah, ah
  5057.         jnz     @f
  5058.         mov     ah, [panel_normal_color]
  5059. @@:
  5060.         mov     [ebp+4], ah
  5061.         mov     ah, [ebx + highlight.CursorColor]
  5062.         test    ah, ah
  5063.         jnz     @f
  5064.         mov     ah, [panel_cursor_color]
  5065. @@:
  5066.         mov     [ebp+5], ah
  5067.         mov     ah, [ebx + highlight.SelectedColor]
  5068.         test    ah, ah
  5069.         jnz     @f
  5070.         mov     ah, [panel_selected_color]
  5071. @@:
  5072.         mov     [ebp+6], ah
  5073.         mov     ah, [ebx + highlight.SelectedCursorColor]
  5074.         test    ah, ah
  5075.         jnz     @f
  5076.         mov     ah, [panel_selected_cursor_color]
  5077. @@:
  5078.         mov     [ebp+7], ah
  5079.         jmp     .doname
  5080. .highlight_test_failed:
  5081.         inc     ecx
  5082.         cmp     ecx, [highlight_num_groups]
  5083.         jb      .highlight_test_loop
  5084. .nohighlight:
  5085.         mov     ah, [panel_normal_color]
  5086.         mov     [ebp+4], ah
  5087.         mov     ah, [panel_cursor_color]
  5088.         mov     [ebp+5], ah
  5089.         mov     ah, [panel_selected_color]
  5090.         mov     [ebp+6], ah
  5091.         mov     ah, [panel_selected_cursor_color]
  5092.         mov     [ebp+7], ah
  5093. .doname:
  5094.         popad
  5095.         ret
  5096.  
  5097. compare_name:
  5098.         test    byte [esi], 10h
  5099.         jnz     .1dir
  5100.         test    byte [edi], 10h
  5101.         jnz     .greater
  5102. .eq1:
  5103.         add     esi, 40
  5104.         add     edi, 40
  5105.         jmp     strcmpi
  5106. .greater:
  5107.         test    esi, esi
  5108.         ret
  5109. .1dir:
  5110.         test    byte [edi], 10h
  5111.         jnz     .eq1
  5112. .less:
  5113.         xor     edi, edi
  5114.         stc
  5115.         ret
  5116.  
  5117. compare_name_rev:
  5118.         test    byte [esi], 10h
  5119.         jnz     .1dir
  5120.         test    byte [edi], 10h
  5121.         jnz     .greater
  5122. .eq1:
  5123.         add     esi, 40
  5124.         add     edi, 40
  5125.         xchg    esi, edi
  5126.         jmp     strcmpi
  5127. .greater:
  5128.         test    esi, esi
  5129.         ret
  5130. .1dir:
  5131.         test    byte [edi], 10h
  5132.         jnz     .eq1
  5133. .less:
  5134.         xor     edi, edi
  5135.         stc
  5136.         ret
  5137.  
  5138. strcmpi:
  5139.         push    eax
  5140. @@:
  5141.         lodsb
  5142.         call    match_symbol
  5143.         jnz     .ret
  5144.         inc     edi
  5145.         test    al, al
  5146.         jnz     @b
  5147. .ret:
  5148.         pop     eax
  5149.         ret
  5150.  
  5151. compare_ext:
  5152.         test    byte [esi], 10h
  5153.         jnz     .1dir
  5154.         test    byte [edi], 10h
  5155.         jnz     .greater
  5156. .eq1:
  5157.         add     esi, 40
  5158.         add     edi, 40
  5159.         push    esi edi
  5160.         call    seek_ext
  5161.         xchg    esi, edi
  5162.         call    seek_ext
  5163.         xchg    esi, edi
  5164.         call    strcmpi
  5165.         jnz     .ret
  5166.         pop     edi esi
  5167.         jmp     strcmpi
  5168. .ret:
  5169.         pop     edi esi
  5170.         ret
  5171. .greater:
  5172.         test    esi, esi
  5173.         ret
  5174. .1dir:
  5175.         test    byte [edi], 10h
  5176.         jnz     .eq1
  5177. .less:
  5178.         xor     edi, edi
  5179.         stc
  5180.         ret
  5181.  
  5182. compare_ext_rev:
  5183.         test    byte [esi], 10h
  5184.         jnz     .1dir
  5185.         test    byte [edi], 10h
  5186.         jnz     .greater
  5187. .eq1:
  5188.         add     esi, 40
  5189.         add     edi, 40
  5190.         push    esi edi
  5191.         call    seek_ext
  5192.         xchg    esi, edi
  5193.         call    seek_ext
  5194.         call    strcmpi
  5195.         jnz     .ret
  5196.         pop     edi esi
  5197.         xchg    esi, edi
  5198.         jmp     strcmpi
  5199. .ret:
  5200.         pop     edi esi
  5201.         ret
  5202. .greater:
  5203.         test    esi, esi
  5204.         ret
  5205. .1dir:
  5206.         test    byte [edi], 10h
  5207.         jnz     .eq1
  5208. .less:
  5209.         xor     edi, edi
  5210.         stc
  5211.         ret
  5212.  
  5213. seek_ext:
  5214.         push    eax
  5215.         xor     eax, eax
  5216. .l:
  5217.         inc     esi
  5218.         cmp     byte [esi-1], '.'
  5219.         jnz     @f
  5220.         mov     eax, esi
  5221. @@:
  5222.         cmp     byte [esi-1], 0
  5223.         jnz     .l
  5224.         test    eax, eax
  5225.         jnz     @f
  5226.         lea     eax, [esi-1]
  5227. @@:
  5228.         mov     esi, eax
  5229.         pop     eax
  5230.         ret
  5231.  
  5232. compare_modified:
  5233.         test    byte [esi], 10h
  5234.         jnz     .1dir
  5235.         test    byte [edi], 10h
  5236.         jnz     .greater
  5237. .eq1:
  5238.         push    edi
  5239.         mov     edi, [edi+28]
  5240.         cmp     edi, [esi+28]
  5241.         pop     edi
  5242.         jnz     @f
  5243.         push    edi
  5244.         mov     edi, [edi+24]
  5245.         cmp     edi, [esi+24]
  5246.         pop     edi
  5247.         jnz     @f
  5248.         add     esi, 40
  5249.         add     edi, 40
  5250.         jmp     strcmpi
  5251. @@:
  5252.         ret
  5253. .greater:
  5254.         test    esi, esi
  5255.         ret
  5256. .1dir:
  5257.         test    byte [edi], 10h
  5258.         jnz     .eq1
  5259. .less:
  5260.         xor     edi, edi
  5261.         stc
  5262.         ret
  5263.  
  5264. compare_modified_rev:
  5265.         test    byte [esi], 10h
  5266.         jnz     .1dir
  5267.         test    byte [edi], 10h
  5268.         jnz     .greater
  5269. .eq1:
  5270.         push    esi
  5271.         mov     esi, [esi+28]
  5272.         cmp     esi, [edi+28]
  5273.         pop     esi
  5274.         jnz     @f
  5275.         push    esi
  5276.         mov     esi, [esi+24]
  5277.         cmp     esi, [edi+24]
  5278.         pop     esi
  5279.         jnz     @f
  5280.         add     esi, 40
  5281.         add     edi, 40
  5282.         xchg    esi, edi
  5283.         jmp     strcmpi
  5284. @@:
  5285.         ret
  5286. .greater:
  5287.         test    esi, esi
  5288.         ret
  5289. .1dir:
  5290.         test    byte [edi], 10h
  5291.         jnz     .eq1
  5292. .less:
  5293.         xor     edi, edi
  5294.         stc
  5295.         ret
  5296.  
  5297. compare_size:
  5298.         test    byte [esi], 10h
  5299.         jnz     .1dir
  5300.         test    byte [edi], 10h
  5301.         jnz     .greater
  5302. .eq1:
  5303.         push    edi
  5304.         mov     edi, [edi+36]
  5305.         cmp     edi, [esi+36]
  5306.         pop     edi
  5307.         jnz     @f
  5308.         push    edi
  5309.         mov     edi, [edi+32]
  5310.         cmp     edi, [esi+32]
  5311.         pop     edi
  5312.         jnz     @f
  5313.         add     esi, 40
  5314.         add     edi, 40
  5315.         jmp     strcmpi
  5316. @@:
  5317.         ret
  5318. .greater:
  5319.         test    esi, esi
  5320.         ret
  5321. .1dir:
  5322.         test    byte [edi], 10h
  5323.         jnz     .eq1
  5324. .less:
  5325.         xor     edi, edi
  5326.         stc
  5327.         ret
  5328.  
  5329. compare_size_rev:
  5330.         test    byte [esi], 10h
  5331.         jnz     .1dir
  5332.         test    byte [edi], 10h
  5333.         jnz     .greater
  5334. .eq1:
  5335.         push    esi
  5336.         mov     esi, [esi+36]
  5337.         cmp     esi, [edi+36]
  5338.         pop     esi
  5339.         jnz     @f
  5340.         push    esi
  5341.         mov     esi, [esi+32]
  5342.         cmp     esi, [edi+32]
  5343.         pop     esi
  5344.         jnz     @f
  5345.         add     esi, 40
  5346.         add     edi, 40
  5347.         xchg    esi, edi
  5348.         jmp     strcmpi
  5349. @@:
  5350.         ret
  5351. .greater:
  5352.         test    esi, esi
  5353.         ret
  5354. .1dir:
  5355.         test    byte [edi], 10h
  5356.         jnz     .eq1
  5357. .less:
  5358.         xor     edi, edi
  5359.         stc
  5360.         ret
  5361.  
  5362. compare_unordered:
  5363.         cmp     esi, edi
  5364.         ret
  5365. compare_unordered_rev:
  5366.         cmp     edi, esi
  5367.         ret
  5368.  
  5369. compare_created:
  5370.         test    byte [esi], 10h
  5371.         jnz     .1dir
  5372.         test    byte [edi], 10h
  5373.         jnz     .greater
  5374. .eq1:
  5375.         push    edi
  5376.         mov     edi, [edi+12]
  5377.         cmp     edi, [esi+12]
  5378.         pop     edi
  5379.         jnz     @f
  5380.         push    edi
  5381.         mov     edi, [edi+8]
  5382.         cmp     edi, [esi+8]
  5383.         pop     edi
  5384.         jnz     @f
  5385.         add     esi, 40
  5386.         add     edi, 40
  5387.         jmp     strcmpi
  5388. @@:
  5389.         ret
  5390. .greater:
  5391.         test    esi, esi
  5392.         ret
  5393. .1dir:
  5394.         test    byte [edi], 10h
  5395.         jnz     .eq1
  5396. .less:
  5397.         xor     edi, edi
  5398.         stc
  5399.         ret
  5400.  
  5401. compare_created_rev:
  5402.         test    byte [esi], 10h
  5403.         jnz     .1dir
  5404.         test    byte [edi], 10h
  5405.         jnz     .greater
  5406. .eq1:
  5407.         push    esi
  5408.         mov     esi, [esi+12]
  5409.         cmp     esi, [edi+12]
  5410.         pop     esi
  5411.         jnz     @f
  5412.         push    esi
  5413.         mov     esi, [esi+8]
  5414.         cmp     esi, [edi+8]
  5415.         pop     esi
  5416.         jnz     @f
  5417.         add     esi, 40
  5418.         add     edi, 40
  5419.         xchg    esi, edi
  5420.         jmp     strcmpi
  5421. @@:
  5422.         ret
  5423. .greater:
  5424.         test    esi, esi
  5425.         ret
  5426. .1dir:
  5427.         test    byte [edi], 10h
  5428.         jnz     .eq1
  5429. .less:
  5430.         xor     edi, edi
  5431.         stc
  5432.         ret
  5433.  
  5434. compare_accessed:
  5435.         test    byte [esi], 10h
  5436.         jnz     .1dir
  5437.         test    byte [edi], 10h
  5438.         jnz     .greater
  5439. .eq1:
  5440.         push    edi
  5441.         mov     edi, [edi+20]
  5442.         cmp     edi, [esi+20]
  5443.         pop     edi
  5444.         jnz     @f
  5445.         push    edi
  5446.         mov     edi, [edi+16]
  5447.         cmp     edi, [esi+16]
  5448.         pop     edi
  5449.         jnz     @f
  5450.         add     esi, 40
  5451.         add     edi, 40
  5452.         jmp     strcmpi
  5453. @@:
  5454.         ret
  5455. .greater:
  5456.         test    esi, esi
  5457.         ret
  5458. .1dir:
  5459.         test    byte [edi], 10h
  5460.         jnz     .eq1
  5461. .less:
  5462.         xor     edi, edi
  5463.         stc
  5464.         ret
  5465.  
  5466. compare_accessed_rev:
  5467.         test    byte [esi], 10h
  5468.         jnz     .1dir
  5469.         test    byte [edi], 10h
  5470.         jnz     .greater
  5471. .eq1:
  5472.         push    esi
  5473.         mov     esi, [esi+20]
  5474.         cmp     esi, [edi+20]
  5475.         pop     esi
  5476.         jnz     @f
  5477.         push    esi
  5478.         mov     esi, [esi+16]
  5479.         cmp     esi, [edi+16]
  5480.         pop     esi
  5481.         jnz     @f
  5482.         add     esi, 40
  5483.         add     edi, 40
  5484.         xchg    esi, edi
  5485.         jmp     strcmpi
  5486. @@:
  5487.         ret
  5488. .greater:
  5489.         test    esi, esi
  5490.         ret
  5491. .1dir:
  5492.         test    byte [edi], 10h
  5493.         jnz     .eq1
  5494. .less:
  5495.         xor     edi, edi
  5496.         stc
  5497.         ret
  5498.  
  5499. ReadFolder_default:
  5500.         mov     eax, 2
  5501.         ret     10h
  5502.  
  5503. if 0
  5504. ; Following subroutines work, but are slow
  5505. match_mask:
  5506. ; in: esi->name, edi->mask
  5507. ; out: CF clear <=> match
  5508.         pusha
  5509.         xchg    esi, edi
  5510. .main_cycle:
  5511.         push    esi
  5512. @@:
  5513.         lodsb
  5514.         test    al, al
  5515.         jz      @f
  5516.         cmp     al, ','
  5517.         jz      @f
  5518.         cmp     al, '|'
  5519.         jnz     @b
  5520. @@:
  5521.         mov     [esi-1], byte 0
  5522.         xchg    esi, [esp]
  5523.         call    match_single_mask
  5524.         pop     esi
  5525.         mov     [esi-1], al
  5526.         jnc     .found
  5527.         cmp     al, ','
  5528.         jz      .main_cycle
  5529. .done_fail:
  5530.         stc
  5531.         popa
  5532.         ret
  5533. .found:
  5534.         test    al, al
  5535.         jz      .done_succ
  5536.         cmp     al, '|'
  5537.         jz      .test_exclude
  5538.         lodsb
  5539.         jmp     .found
  5540. .done_succ:
  5541.         clc
  5542.         popa
  5543.         ret
  5544. .test_exclude:
  5545.         push    esi
  5546. @@:
  5547.         lodsb
  5548.         test    al, al
  5549.         jz      @f
  5550.         cmp     al, ','
  5551.         jnz     @b
  5552. @@:
  5553.         mov     byte [esi-1], 0
  5554.         xchg    esi, [esp]
  5555.         call    match_single_mask
  5556.         pop     esi
  5557.         mov     [esi-1], al
  5558.         jnc     .done_fail
  5559.         test    al, al
  5560.         jz      .done_succ
  5561.         jmp     .test_exclude
  5562.  
  5563. match_single_mask:
  5564. ; in: esi->mask, edi->name
  5565. ; out: CF clear <=> match
  5566.         pusha
  5567. .mask_symbol:
  5568.         lodsb
  5569.         test    al, al
  5570.         jz      .mask_done
  5571.         cmp     al, '*'
  5572.         jz      .asterisk
  5573.         cmp     al, '?'
  5574.         jz      .quest
  5575.         cmp     al, '['
  5576.         jz      .list
  5577.         call    match_symbol
  5578.         jnz     .done_fail
  5579.         inc     edi
  5580.         jmp     .mask_symbol
  5581. .done_fail:
  5582.         stc
  5583.         popa
  5584.         ret
  5585. .mask_done:
  5586.         scasb
  5587.         jnz     .done_fail
  5588. .done_succ:
  5589.         clc
  5590.         popa
  5591.         ret
  5592. .quest:
  5593.         mov     al, 0
  5594.         scasb
  5595.         jz      .done_fail
  5596.         jmp     .mask_symbol
  5597. .list:
  5598.         lodsb
  5599.         cmp     al, ']'
  5600.         jz      .done_fail
  5601.         cmp     byte [esi+1], '-'
  5602.         jz      .range
  5603.         call    match_symbol
  5604.         jnz     .list
  5605. .listok:
  5606.         inc     edi
  5607. @@:
  5608.         lodsb
  5609.         cmp     al, ']'
  5610.         jnz     @b
  5611.         jmp     .mask_symbol
  5612. .range:
  5613.         call    match_symbol
  5614.         ja      @f
  5615.         mov     al, [esi+2]
  5616.         call    match_symbol
  5617.         jae     .listok
  5618. @@:
  5619.         inc     esi
  5620.         jmp     .list
  5621. .asterisk:
  5622.         cmp     byte [esi], 0
  5623.         jz      .done_succ
  5624.         cmp     byte [esi], '?'
  5625.         jnz     @f
  5626.         mov     al, 0
  5627.         scasb
  5628.         jz      .done_fail
  5629.         inc     esi
  5630.         jmp     .asterisk
  5631. @@:
  5632.         cmp     byte [esi], '['
  5633.         jz      .asterisk_common
  5634. ; the mask is ...*<normal-symbol>...
  5635. .asterisk_normal:
  5636.         mov     al, [esi]
  5637. @@:
  5638.         cmp     byte [edi], 0
  5639.         jz      .done_fail
  5640.         call    match_symbol
  5641.         jz      @f
  5642.         inc     edi
  5643.         jmp     @b
  5644. @@:
  5645.         inc     edi
  5646.         inc     esi
  5647.         call    match_single_mask
  5648.         jnc     .done_succ
  5649.         dec     esi
  5650.         jmp     .asterisk_normal
  5651. .asterisk_common:
  5652.         push    edi
  5653. @@:
  5654.         call    match_single_mask
  5655.         jnc     @f
  5656.         mov     al, 0
  5657.         scasb
  5658.         jnz     @b
  5659.         pop     edi
  5660.         jmp     .done_fail
  5661. @@:
  5662.         pop     edi
  5663.         jmp     .done_succ
  5664.  
  5665. match_mask_rev:
  5666. ; in: esi->name, edx->end of name, edi->mask
  5667. ; out: CF clear <=> match
  5668.         pusha
  5669.         xchg    esi, edx
  5670.         xchg    esi, edi
  5671. .main_cycle:
  5672.         mov     ecx, esi
  5673. @@:
  5674.         lodsb
  5675.         test    al, al
  5676.         jz      @f
  5677.         cmp     al, ','
  5678.         jz      @f
  5679.         cmp     al, '|'
  5680.         jnz     @b
  5681. @@:
  5682.         dec     esi
  5683.         mov     [esi], byte 0
  5684.         call    match_single_mask_rev2
  5685.         mov     [esi], al
  5686.         inc     esi
  5687.         jnc     .found
  5688.         cmp     al, ','
  5689.         jz      .main_cycle
  5690. .done_fail:
  5691.         stc
  5692.         popa
  5693.         ret
  5694. .found:
  5695.         test    al, al
  5696.         jz      .done_succ
  5697.         cmp     al, '|'
  5698.         jz      .test_exclude
  5699.         lodsb
  5700.         jmp     .found
  5701. .done_succ:
  5702.         clc
  5703.         popa
  5704.         ret
  5705. .test_exclude:
  5706.         mov     ecx, esi
  5707. @@:
  5708.         lodsb
  5709.         test    al, al
  5710.         jz      @f
  5711.         cmp     al, ','
  5712.         jnz     @b
  5713. @@:
  5714.         dec     esi
  5715.         mov     byte [esi], 0
  5716.         call    match_single_mask_rev2
  5717.         mov     [esi], al
  5718.         inc     esi
  5719.         jnc     .done_fail
  5720.         test    al, al
  5721.         jz      .done_succ
  5722.         jmp     .test_exclude
  5723.  
  5724. match_single_mask_rev2:
  5725.         pusha
  5726.         jmp     match_single_mask_rev.mask_symbol
  5727. match_single_mask_rev:
  5728. ; in: esi->mask, edi->end of name, edx->start of name
  5729. ; out: CF clear <=> match
  5730.         pusha
  5731.         mov     ecx, esi
  5732. @@:
  5733.         lodsb
  5734.         test    al, al
  5735.         jnz     @b
  5736.         dec     esi
  5737. ; esi->end of mask, ecx->start of mask
  5738. .mask_symbol:
  5739.         dec     esi
  5740.         cmp     esi, ecx
  5741.         jb      .mask_done
  5742.         mov     al, [esi]
  5743.         cmp     al, '*'
  5744.         jz      .asterisk
  5745.         cmp     al, '?'
  5746.         jz      .quest
  5747.         cmp     al, ']'
  5748.         jz      .list
  5749.         dec     edi
  5750.         cmp     edi, edx
  5751.         jb      .done_fail
  5752.         call    match_symbol
  5753.         jz      .mask_symbol
  5754. .done_fail:
  5755.         stc
  5756.         popa
  5757.         ret
  5758. .mask_done:
  5759.         cmp     edi, edx
  5760.         jnz     .done_fail
  5761. .done_succ:
  5762.         clc
  5763.         popa
  5764.         ret
  5765. .quest:
  5766.         dec     edi
  5767.         cmp     edi, edx
  5768.         jb      .done_fail
  5769.         jmp     .mask_symbol
  5770. .list:
  5771.         dec     edi
  5772.         cmp     edi, edx
  5773.         jb      .done_fail
  5774. .list_check:
  5775.         dec     esi
  5776.         cmp     esi, ecx
  5777.         jbe     .done_fail
  5778.         mov     al, [esi]
  5779.         cmp     al, '['
  5780.         jz      .done_fail
  5781.         cmp     byte [esi-1], '-'
  5782.         jz      .range
  5783.         call    match_symbol
  5784.         jnz     .list_check
  5785. .listok:
  5786. @@:
  5787.         dec     esi
  5788.         cmp     esi, ecx
  5789.         jb      .done_fail
  5790.         cmp     byte [esi], '['
  5791.         jnz     @b
  5792.         jmp     .mask_symbol
  5793. .range:
  5794.         call    match_symbol
  5795.         jb      @f
  5796.         mov     al, [esi-2]
  5797.         call    match_symbol
  5798.         jbe     .listok
  5799. @@:
  5800.         dec     esi
  5801.         dec     esi
  5802.         jmp     .list_check
  5803. .asterisk:
  5804.         cmp     esi, ecx
  5805.         jz      .done_succ
  5806.         cmp     byte [esi-1], '?'
  5807.         jnz     @f
  5808.         cmp     edi, edx
  5809.         jz      .done_fail
  5810.         dec     esi
  5811.         jmp     .asterisk
  5812. @@:
  5813.         cmp     byte [esi-1], ']'
  5814.         jz      .asterisk_common
  5815. ; the mask is ...<normal-symbol>*...
  5816. .asterisk_normal:
  5817.         mov     al, [esi-1]
  5818. @@:
  5819.         cmp     edi, edx
  5820.         jz      .done_fail
  5821.         call    match_symbol
  5822.         jz      @f
  5823.         dec     edi
  5824.         jmp     @b
  5825. @@:
  5826.         dec     edi
  5827.         dec     esi
  5828.         call    match_single_mask_rev2
  5829.         jnc     .done_succ
  5830.         inc     esi
  5831.         jmp     .asterisk_normal
  5832. .asterisk_common:
  5833.         push    edi
  5834. @@:
  5835.         call    match_single_mask_rev2
  5836.         jnc     @f
  5837.         dec     edi
  5838.         cmp     edi, edx
  5839.         jae     @b
  5840.         pop     edi
  5841.         jmp     .done_fail
  5842. @@:
  5843.         pop     edi
  5844.         jmp     .done_succ
  5845. end if
  5846.  
  5847. ;tolower:
  5848. ;        push    ecx
  5849. ;        movzx   ecx, al
  5850. ;        mov     al, [tolower_table+ecx]
  5851. ;        pop     ecx
  5852. ;        ret
  5853.  
  5854. match_symbol:
  5855. ; in: al,[edi]=symbols
  5856. ; out: flags as 'cmp al,[edi]'
  5857.         push    eax ecx
  5858.         movzx   ecx, al
  5859.         mov     al, [tolower_table+ecx]
  5860.         movzx   ecx, byte [edi]
  5861.         cmp     al, [tolower_table+ecx]
  5862.         pop     ecx eax
  5863.         ret
  5864.  
  5865. match_mask_rev_lowercase:
  5866. ; in: esi->name, edx->end of name, edi->mask
  5867. ; out: CF clear <=> match
  5868.         pusha
  5869.         xchg    esi, edx
  5870.         xchg    esi, edi
  5871. .main_cycle:
  5872.         mov     ecx, esi
  5873. @@:
  5874.         lodsb
  5875.         test    al, al
  5876.         jz      @f
  5877.         cmp     al, ','
  5878.         jz      @f
  5879.         cmp     al, ';'
  5880.         jz      @f
  5881.         cmp     al, '|'
  5882.         jnz     @b
  5883. @@:
  5884.         dec     esi
  5885.         mov     [esi], byte 0
  5886.         call    match_single_mask_rev_lowercase
  5887.         mov     [esi], al
  5888.         inc     esi
  5889.         jnc     .found
  5890.         cmp     al, ','
  5891.         jz      .main_cycle
  5892.         cmp     al, ';'
  5893.         jz      .main_cycle
  5894. .done_fail:
  5895.         stc
  5896.         popa
  5897.         ret
  5898. .found:
  5899.         test    al, al
  5900.         jz      .done_succ
  5901.         cmp     al, '|'
  5902.         jz      .test_exclude
  5903.         lodsb
  5904.         jmp     .found
  5905. .done_succ:
  5906.         clc
  5907.         popa
  5908.         ret
  5909. .test_exclude:
  5910.         mov     ecx, esi
  5911. @@:
  5912.         lodsb
  5913.         test    al, al
  5914.         jz      @f
  5915.         cmp     al, ','
  5916.         jz      @f
  5917.         cmp     al, ';'
  5918.         jnz     @b
  5919. @@:
  5920.         dec     esi
  5921.         mov     byte [esi], 0
  5922.         call    match_single_mask_rev_lowercase
  5923.         mov     [esi], al
  5924.         inc     esi
  5925.         jnc     .done_fail
  5926.         test    al, al
  5927.         jz      .done_succ
  5928.         jmp     .test_exclude
  5929.  
  5930. match_single_mask_rev_lowercase:
  5931. ; in: esi->end of mask, ecx->start of mask, edi->end of name, edx->start of name
  5932. ; out: CF clear <=> match
  5933.         push    esi edi eax
  5934. .mask_symbol:
  5935.         dec     esi
  5936.         cmp     esi, ecx
  5937.         jb      .mask_done
  5938.         mov     al, [esi]
  5939.         cmp     al, '*'
  5940.         jz      .asterisk
  5941.         cmp     al, '?'
  5942.         jz      .quest
  5943.         cmp     al, ']'
  5944.         jz      .list
  5945.         dec     edi
  5946.         cmp     edi, edx
  5947.         jb      .done_fail
  5948.         cmp     al, [edi]
  5949.         jz      .mask_symbol
  5950. .done_fail:
  5951.         stc
  5952.         pop     eax edi esi
  5953.         ret
  5954. .mask_done:
  5955.         cmp     edi, edx
  5956.         jnz     .done_fail
  5957. .done_succ:
  5958.         clc
  5959.         pop     eax edi esi
  5960.         ret
  5961. .quest:
  5962.         dec     edi
  5963.         cmp     edi, edx
  5964.         jb      .done_fail
  5965.         jmp     .mask_symbol
  5966. .list:
  5967.         dec     edi
  5968.         cmp     edi, edx
  5969.         jb      .done_fail
  5970. .list_check:
  5971.         dec     esi
  5972.         cmp     esi, ecx
  5973.         jbe     .done_fail
  5974.         mov     al, [esi]
  5975.         cmp     al, '['
  5976.         jz      .done_fail
  5977.         cmp     byte [esi-1], '-'
  5978.         jz      .range
  5979.         cmp     al, [edi]
  5980.         jnz     .list_check
  5981. .listok:
  5982. @@:
  5983.         dec     esi
  5984.         cmp     esi, ecx
  5985.         jb      .done_fail
  5986.         cmp     byte [esi], '['
  5987.         jnz     @b
  5988.         jmp     .mask_symbol
  5989. .range:
  5990.         cmp     al, [edi]
  5991.         jb      @f
  5992.         mov     al, [esi-2]
  5993.         cmp     al, [edi]
  5994.         jbe     .listok
  5995. @@:
  5996.         dec     esi
  5997.         dec     esi
  5998.         jmp     .list_check
  5999. .asterisk:
  6000.         cmp     esi, ecx
  6001.         jz      .done_succ
  6002.         cmp     byte [esi-1], '?'
  6003.         jnz     @f
  6004.         cmp     edi, edx
  6005.         jz      .done_fail
  6006.         dec     esi
  6007.         jmp     .asterisk
  6008. @@:
  6009.         cmp     byte [esi-1], ']'
  6010.         jz      .asterisk_common
  6011. ; the mask is ...<normal-symbol>*...
  6012. .asterisk_normal:
  6013.         mov     al, [esi-1]
  6014. @@:
  6015.         cmp     edi, edx
  6016.         jz      .done_fail
  6017.         cmp     al, [edi]
  6018.         jz      @f
  6019.         dec     edi
  6020.         jmp     @b
  6021. @@:
  6022.         dec     edi
  6023.         dec     esi
  6024.         call    match_single_mask_rev_lowercase
  6025.         jnc     .done_succ
  6026.         inc     esi
  6027.         jmp     .asterisk_normal
  6028. .asterisk_common:
  6029.         push    edi
  6030. @@:
  6031.         call    match_single_mask_rev_lowercase
  6032.         jnc     @f
  6033.         dec     edi
  6034.         cmp     edi, edx
  6035.         jae     @b
  6036.         pop     edi
  6037.         jmp     .done_fail
  6038. @@:
  6039.         pop     edi
  6040.         jmp     .done_succ
  6041.  
  6042. find_extension:
  6043.         lea     esi, [ecx+40]
  6044.         push    esi
  6045. @@:
  6046.         lodsb
  6047.         test    al, al
  6048.         jnz     @b
  6049. @@:
  6050.         dec     esi
  6051.         cmp     byte [esi], '.'
  6052.         jz      .found_ext
  6053.         cmp     esi, [esp]
  6054.         ja      @b
  6055. ; empty extension
  6056.         pop     esi
  6057.         stc
  6058.         ret
  6059. .found_ext:
  6060.         inc     esi
  6061.         mov     edi, [associations]
  6062.         test    edi, edi
  6063.         jz      .notfound
  6064. .find_loop:
  6065.         push    esi edi
  6066.         call    strcmpi
  6067.         pop     edi esi
  6068.         pushf
  6069. @@:
  6070.         inc     edi
  6071.         cmp     byte [edi-1], 0
  6072.         jnz     @b
  6073.         popf
  6074.         jz      .found
  6075. @@:
  6076.         inc     edi
  6077.         cmp     byte [edi-1], 0
  6078.         jnz     @b
  6079.         cmp     byte [edi], 0
  6080.         jnz     .find_loop
  6081. .notfound:
  6082. ; unknown extension
  6083.         stc
  6084. .found:
  6085.         pop     esi
  6086.         ret
  6087.  
  6088. header  db      'Kolibri Far ',version,0
  6089.  
  6090. nomem_draw      db      'No memory for redraw.',0
  6091. .size = $ - nomem_draw
  6092.  
  6093. def_left_dir    db      '/rd/1',0
  6094. def_right_dir   db      '/hd0/1',0
  6095.  
  6096. bSilentFolderMode db    1
  6097.  
  6098. if lang eq ru
  6099. aFolder         db      ' ¯ª '
  6100. .size = $-aFolder
  6101. aUp             db      '‚¢¥àå'
  6102. .size = $-aUp
  6103. aDrive          db      '„¨áª',0
  6104. aScreens        db      'ªà ­ë',0
  6105. else
  6106. aFolder         db      'Folder'
  6107. .size = $-aFolder
  6108. aUp             db      'Up'
  6109. .size = $-aUp
  6110. aDrive          db      'Drive',0
  6111. aScreens        db      'Screens',0
  6112. end if
  6113.  
  6114. align 4
  6115. _10d dd 10
  6116. _100d dd 100
  6117. muldiv10 dd 429496729
  6118. _10 db 10
  6119. _100 db 100
  6120.  
  6121. fpu_cw  dw      000011100111111b
  6122.  
  6123. keybar_panels:
  6124. if lang eq ru
  6125. ; ¡¥§ ª« ¢¨è-¬®¤¨ä¨ª â®à®¢
  6126.         db      '®¬®éì'
  6127.         db      '®«ì§Œ'
  6128.         db      'à®á¬ '
  6129.         db      '¥¤ ªâ'
  6130.         db      'Š®¯¨à '
  6131.         db      '¥à¥­ '
  6132.         db      ' ¯ª  '
  6133.         db      '“¤ «¥­'
  6134.         db      'Š®­äŒ­'
  6135.         db      '‚ë室 '
  6136.         db      'Œ®¤ã«¨'
  6137.         db      'ªà ­ë'
  6138. ; Shift
  6139.         db      '„®¡ ¢«'
  6140.         db      ' á¯ ª'
  6141.         db      '€à劮¬'
  6142.         db      '¥¤ ª.'
  6143.         db      'Š®¯¨à '
  6144.         db      '¥à¥¨¬'
  6145.         db      '      '
  6146.         db      '“¤ «¥­'
  6147.         db      '‘®åà ­'
  6148.         db      '®á«¤­'
  6149.         db      'ƒà㯯ë'
  6150.         db      '‚ë¡à ­'
  6151. ; Ctrl
  6152.         db      '‹¥¢ ï '
  6153.         db      'à ¢ ï'
  6154.         db      'ˆ¬ï   '
  6155.         db      ' áè¨à'
  6156.         db      'Œ®¤¨ä '
  6157.         db      ' §¬¥à'
  6158.         db      '¥á®àâ'
  6159.         db      '‘®§¤ ­'
  6160.         db      '„®áâã¯'
  6161.         db      'Ž¯¨á ­'
  6162.         db      '‚« ¤¥«'
  6163.         db      '‘®àâ  '
  6164. ; Ctrl+Shift
  6165.         db      '      '
  6166.         db      '      '
  6167.         db      'à®á¬ '
  6168.         db      '¥¤ ªâ'
  6169.         db      '      '
  6170.         db      '      '
  6171.         db      '      '
  6172.         db      '      '
  6173.         db      '      '
  6174.         db      '      '
  6175.         db      '      '
  6176.         db      '      '
  6177. ; Alt
  6178.         db      '‹¥¢ ï '
  6179.         db      'à ¢ ï'
  6180.         db      '‘¬®âà.'
  6181.         db      '¥¤ ª.'
  6182.         db      '¥ç âì'
  6183.         db      '‘¢ï§ì '
  6184.         db      'ˆáª âì'
  6185.         db      'ˆáâ®à '
  6186.         db      '‚¨¤¥® '
  6187.         db      '„¥à¥¢®'
  6188.         db      'ˆáâà '
  6189.         db      'ˆá⏠¯'
  6190. ; Alt+Shift
  6191.         db      '      '
  6192.         db      '      '
  6193.         db      '      '
  6194.         db      '      '
  6195.         db      '      '
  6196.         db      '      '
  6197.         db      '      '
  6198.         db      '      '
  6199.         db      'Š®­ä«'
  6200.         db      '      '
  6201.         db      '      '
  6202.         db      '      '
  6203. ; Alt+Ctrl
  6204. times 12 db     '      '
  6205. ; Alt+Ctrl+Shift
  6206. times 12 db     '      '
  6207. else
  6208. ; No modificators
  6209.         db      'Help  '
  6210.         db      'UserMn'
  6211.         db      'View  '
  6212.         db      'Edit  '
  6213.         db      'Copy  '
  6214.         db      'RenMov'
  6215.         db      'MkFold'
  6216.         db      'Delete'
  6217.         db      'ConfMn'
  6218.         db      'Quit  '
  6219.         db      'Plugin'
  6220.         db      'Screen'
  6221. ; Shift
  6222.         db      'Add   '
  6223.         db      'Extrct'
  6224.         db      'ArcCmd'
  6225.         db      'Edit..'
  6226.         db      'Copy  '
  6227.         db      'Rename'
  6228.         db      '      '
  6229.         db      'Delete'
  6230.         db      'Save  '
  6231.         db      'Last  '
  6232.         db      'Group '
  6233.         db      'SelUp '
  6234. ; Ctrl
  6235.         db      'Left  '
  6236.         db      'Right '
  6237.         db      'Name  '
  6238.         db      'Extens'
  6239.         db      'Modifn'
  6240.         db      'Size  '
  6241.         db      'Unsort'
  6242.         db      'Creatn'
  6243.         db      'Access'
  6244.         db      'Descr '
  6245.         db      'Owner '
  6246.         db      'Sort  '
  6247. ; Ctrl+Shift
  6248.         db      '      '
  6249.         db      '      '
  6250.         db      'View  '
  6251.         db      'Edit  '
  6252.         db      '      '
  6253.         db      '      '
  6254.         db      '      '
  6255.         db      '      '
  6256.         db      '      '
  6257.         db      '      '
  6258.         db      '      '
  6259.         db      '      '
  6260. ; Alt
  6261.         db      'Left  '
  6262.         db      'Right '
  6263.         db      'View..'
  6264.         db      'Edit..'
  6265.         db      'Print '
  6266.         db      'MkLink'
  6267.         db      'Find  '
  6268.         db      'Histry'
  6269.         db      'Video '
  6270.         db      'Tree  '
  6271.         db      'ViewHs'
  6272.         db      'FoldHs'
  6273. ; Alt+Shift
  6274.         db      '      '
  6275.         db      '      '
  6276.         db      '      '
  6277.         db      '      '
  6278.         db      '      '
  6279.         db      '      '
  6280.         db      '      '
  6281.         db      '      '
  6282.         db      'ConfPl'
  6283.         db      '      '
  6284.         db      '      '
  6285.         db      '      '
  6286. ; Alt+Ctrl
  6287. times 12 db     '      '
  6288. ; Alt+Ctrl+Shift
  6289. times 12 db     '      '
  6290. end if
  6291.  
  6292. keybar_viewer:
  6293. if lang eq ru
  6294. ; ¡¥§ ª« ¢¨è-¬®¤¨ä¨ª â®à®¢
  6295.         db      '®¬®éì'
  6296.         db      ' §¢¥à'
  6297.         db      '‚ë室 '
  6298.         db      'Š®¤   '
  6299.         db      '      '
  6300.         db      '¥¤ ªâ'
  6301.         db      '®¨áª '
  6302. keybar_cp:
  6303.         db      'cp1251'
  6304.         db      '      '
  6305.         db      '‚ë室 '
  6306.         db      'Œ®¤ã«¨'
  6307.         db      'ªà ­ë'
  6308. ; Shift
  6309.         db      '      '
  6310.         db      '‘«®¢  '
  6311.         db      '      '
  6312.         db      '      '
  6313.         db      '      '
  6314.         db      '      '
  6315.         db      '„ «ìè¥'
  6316.         db      '’ ¡«¨æ'
  6317.         db      '      '
  6318.         db      '      '
  6319.         db      '      '
  6320.         db      '      '
  6321. ; Ctrl
  6322.         db      '      '
  6323.         db      '      '
  6324.         db      '      '
  6325.         db      '      '
  6326.         db      '      '
  6327.         db      '      '
  6328.         db      '      '
  6329.         db      '      '
  6330.         db      '      '
  6331.         db      '®§¨æ '
  6332.         db      '      '
  6333.         db      '      '
  6334. ; Ctrl+Shift
  6335.         db      '      '
  6336.         db      '      '
  6337.         db      '      '
  6338.         db      '      '
  6339.         db      '      '
  6340.         db      '      '
  6341.         db      '      '
  6342.         db      '      '
  6343.         db      '      '
  6344.         db      '      '
  6345.         db      '      '
  6346.         db      '      '
  6347. ; Alt
  6348.         db      '      '
  6349.         db      '      '
  6350.         db      '      '
  6351.         db      '      '
  6352.         db      '¥ç âì'
  6353.         db      '      '
  6354.         db      ' § ¤ '
  6355.         db      '¥à¥©â'
  6356.         db      '‚¨¤¥® '
  6357.         db      '      '
  6358.         db      'ˆáâà '
  6359.         db      '      '
  6360. ; Alt+Shift
  6361.         db      '      '
  6362.         db      '      '
  6363.         db      '      '
  6364.         db      '      '
  6365.         db      '      '
  6366.         db      '      '
  6367.         db      '      '
  6368.         db      '      '
  6369.         db      'Š®­ä¨£'
  6370.         db      '      '
  6371.         db      '      '
  6372.         db      '      '
  6373. ; Alt+Ctrl
  6374. times 12 db     '      '
  6375. ; Alt+Ctrl+Shift
  6376. times 12 db     '      '
  6377. else
  6378. ; No modificators
  6379.         db      'Help  '
  6380.         db      'Unwrap'
  6381.         db      'Quit  '
  6382.         db      'Hex   '
  6383.         db      '      '
  6384.         db      'Edit  '
  6385.         db      'Search'
  6386. keybar_cp:
  6387.         db      'cp1251'
  6388.         db      '      '
  6389.         db      'Quit  '
  6390.         db      'Plugin'
  6391.         db      'Screen'
  6392. ; Shift
  6393.         db      '      '
  6394.         db      'WWrap '
  6395.         db      '      '
  6396.         db      '      '
  6397.         db      '      '
  6398.         db      '      '
  6399.         db      'Next  '
  6400.         db      'Table '
  6401.         db      '      '
  6402.         db      '      '
  6403.         db      '      '
  6404.         db      '      '
  6405. ; Ctrl
  6406.         db      '      '
  6407.         db      '      '
  6408.         db      '      '
  6409.         db      '      '
  6410.         db      '      '
  6411.         db      '      '
  6412.         db      '      '
  6413.         db      '      '
  6414.         db      '      '
  6415.         db      'GoFile'
  6416.         db      '      '
  6417.         db      '      '
  6418. ; Ctrl+Shift
  6419.         db      '      '
  6420.         db      '      '
  6421.         db      '      '
  6422.         db      '      '
  6423.         db      '      '
  6424.         db      '      '
  6425.         db      '      '
  6426.         db      '      '
  6427.         db      '      '
  6428.         db      '      '
  6429.         db      '      '
  6430.         db      '      '
  6431. ; Alt
  6432.         db      '      '
  6433.         db      '      '
  6434.         db      '      '
  6435.         db      '      '
  6436.         db      'Print '
  6437.         db      '      '
  6438.         db      'Prev  '
  6439.         db      'Goto  '
  6440.         db      'Video '
  6441.         db      '      '
  6442.         db      'ViewHs'
  6443.         db      '      '
  6444. ; Alt+Shift
  6445.         db      '      '
  6446.         db      '      '
  6447.         db      '      '
  6448.         db      '      '
  6449.         db      '      '
  6450.         db      '      '
  6451.         db      '      '
  6452.         db      '      '
  6453.         db      'Config'
  6454.         db      '      '
  6455.         db      '      '
  6456.         db      '      '
  6457. ; Alt+Ctrl
  6458. times 12 db     '      '
  6459. ; Alt+Ctrl+Shift
  6460. times 12 db     '      '
  6461. end if
  6462.  
  6463.         align   4
  6464. cur_width       dd      80
  6465. cur_height      dd      25
  6466. saved_width     dd      -1
  6467. saved_height    dd      -1
  6468. fill_width      dd      0
  6469. fill_height     dd      0
  6470. max_width = 256
  6471. max_height = 256
  6472. console_data_ptr dd     0
  6473.  
  6474. cursor_x        dd      -1
  6475. cursor_y        dd      -1
  6476. cur_cursor_pos  dd      -1
  6477. old_cursor_pos  dd      -1
  6478.  
  6479. active_panel    dd      panel1_data
  6480.  
  6481. associations    dd      0
  6482. associations_size dd    1               ; terminating zero
  6483. associations_allocated dd 0x1000        ; start with one page
  6484.  
  6485. console_colors  dd      0x000000, 0x000080, 0x008000, 0x008080
  6486.                 dd      0x800000, 0x800080, 0x808000, 0xC0C0C0
  6487.                 dd      0x808080, 0x0000FF, 0x00FF00, 0x00FFFF
  6488.                 dd      0xFF0000, 0xFF00FF, 0xFFFF00, 0xFFFFFF
  6489.  
  6490. compare_fns     dd      compare_name
  6491.                 dd      compare_name_rev
  6492.                 dd      compare_ext
  6493.                 dd      compare_ext_rev
  6494.                 dd      compare_modified
  6495.                 dd      compare_modified_rev
  6496.                 dd      compare_size
  6497.                 dd      compare_size_rev
  6498.                 dd      compare_unordered
  6499.                 dd      compare_unordered_rev
  6500.                 dd      compare_created
  6501.                 dd      compare_created_rev
  6502.                 dd      compare_accessed
  6503.                 dd      compare_accessed_rev
  6504.  
  6505. ctrlkey_tests   dd      ctrlkey_test0
  6506.                 dd      ctrlkey_test1
  6507.                 dd      ctrlkey_test2
  6508.                 dd      ctrlkey_test3
  6509.                 dd      ctrlkey_test4
  6510. ctrlkey_tests_num = 5
  6511.  
  6512. virtual at 0
  6513. screen_vtable:
  6514.         .OnRedraw       dd      ?
  6515.         .OnKey          dd      ?
  6516.         .keybar         dd      ?
  6517.         .getname        dd      ?
  6518.         .OnExit         dd      ?
  6519.         .IsHandleUsed   dd      ?
  6520. end virtual
  6521.  
  6522. panels_vtable:
  6523.         dd      panels_OnRedraw
  6524.         dd      panels_OnKey
  6525.         dd      keybar_panels
  6526.         dd      panels_getname
  6527.         dd      panels_OnExit
  6528.         dd      panels_IsHandleUsed
  6529.  
  6530. viewer_vtable:
  6531.         dd      viewer_OnRedraw
  6532.         dd      viewer_OnKey
  6533.         dd      keybar_viewer
  6534.         dd      viewer_getname
  6535.         dd      viewer_OnExit
  6536.         dd      viewer_IsHandleUsed
  6537.  
  6538. ; additions to this table require changes in tools.inc::get_error_msg
  6539. errors1:
  6540.         dd      error0msg
  6541.         dd      error1msg
  6542.         dd      error2msg
  6543.         dd      error3msg
  6544.         dd      error4msg
  6545.         dd      error5msg
  6546.         dd      error6msg
  6547.         dd      error7msg
  6548.         dd      error8msg
  6549.         dd      error9msg
  6550.         dd      error10msg
  6551.         dd      error11msg
  6552. errors2:
  6553.         dd      error30msg
  6554.         dd      error31msg
  6555.         dd      error32msg
  6556.  
  6557. encodings:
  6558. .cp866 = 0
  6559. .cp1251 = 1
  6560. .koi8r = 2
  6561. .unicode = 3
  6562.  
  6563. .names:
  6564.         db      'cp866   '
  6565.         db      'cp1251  '
  6566.         db      'koi8-r  '
  6567.         db      'Unicode '
  6568.  
  6569. .tables:
  6570. ; cp866 - trivial map
  6571.         times 128 db %+127
  6572. ; cp1251
  6573.         db      0x3F,0x3F,0x27,0x3F,0x22,0x3A,0xC5,0xD8,0x3F,0x25,0x3F,0x3C,0x3F,0x3F,0x3F,0x3F
  6574.         db      0x3F,0x27,0x27,0x22,0x22,0x07,0x2D,0x2D,0x3F,0x54,0x3F,0x3E,0x3F,0x3F,0x3F,0x3F
  6575.         db      0xFF,0xF6,0xF7,0x3F,0xFD,0x3F,0xB3,0x15,0xF0,0x63,0xF2,0x3C,0xBF,0x2D,0x52,0xF4
  6576.         db      0xF8,0x2B,0x49,0x69,0x3F,0xE7,0x14,0xFA,0xF1,0xFC,0xF3,0x3E,0x3F,0x3F,0x3F,0xF5
  6577.         times 0x30 db %-1+0x80
  6578.         times 0x10 db %-1+0xE0
  6579. ; koi8-r
  6580.         db      0xC4,0xB3,0xDA,0xBF,0xC0,0xD9,0xC3,0xB4,0xC2,0xC1,0xC5,0xDF,0xDC,0xDB,0xDD,0xDE
  6581.         db      0xB0,0xB1,0xB2,0xF4,0xFE,0xF9,0xFB,0xF7,0xF3,0xF2,0xFF,0xF5,0xF8,0xFD,0xFA,0xF6
  6582.         db      0xCD,0xBA,0xD5,0xF1,0xD6,0xC9,0xB8,0xB7,0xBB,0xD4,0xD3,0xC8,0xBE,0xBD,0xBC,0xC6
  6583.         db      0xC7,0xCC,0xB5,0xF0,0xB6,0xB9,0xD1,0xD2,0xCB,0xCF,0xD0,0xCA,0xD8,0xD7,0xCE,0xFC
  6584.         db      0xEE,0xA0,0xA1,0xE6,0xA4,0xA5,0xE4,0xA3,0xE5,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE
  6585.         db      0xAF,0xEF,0xE0,0xE1,0xE2,0xE3,0xA6,0xA2,0xEC,0xEB,0xA7,0xE8,0xED,0xE9,0xE7,0xEA
  6586.         db      0x9E,0x80,0x81,0x96,0x84,0x85,0x94,0x83,0x95,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E
  6587.         db      0x8F,0x9F,0x90,0x91,0x92,0x93,0x86,0x82,0x9C,0x9B,0x87,0x98,0x9D,0x99,0x97,0x9A
  6588.  
  6589. .menu:
  6590.         db      .cp866
  6591. .menu.1:
  6592.         dd      .menu.2
  6593.         dd      0
  6594. if lang eq ru
  6595.         db      '&DOS ⥪áâ (cp866)',0
  6596. else
  6597.         db      '&DOS text (cp866)',0
  6598. end if
  6599.         db      .cp1251
  6600. .menu.2:
  6601.         dd      .menu.3
  6602.         dd      .menu.1
  6603. if lang eq ru
  6604.         db      '&Windows ⥪áâ (cp1251)',0
  6605. else
  6606.         db      '&Windows text (cp1251)',0
  6607. end if
  6608.         db      .koi8r
  6609. .menu.3:
  6610.         dd      .menu.4
  6611.         dd      .menu.2
  6612. if lang eq ru
  6613.         db      '&Linux ⥪áâ (koi8-r)',0
  6614. else
  6615.         db      '&Linux text (koi8-r)',0
  6616. end if
  6617.         db      .unicode
  6618. .menu.4:
  6619.         dd      0
  6620.         dd      .menu.3
  6621.         db      '&Unicode',0
  6622.  
  6623. active_screen   dd      0
  6624. tabsize         dd      8
  6625.  
  6626. ascii2scan:
  6627.         times 32 db 0
  6628.         db      0x39,0x02,0x03,0x04,0x05,0x06,0x08,0x28,0x0A,0x0B,0x09,0x0D,0x33,0x0C,0x34,0x35
  6629.         db      0x0B,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x27,0x27,0x33,0x0D,0x34,0x35
  6630.         db      0x03,0x1E,0x30,0x2E,0x20,0x12,0x21,0x22,0x23,0x17,0x24,0x25,0x26,0x32,0x31,0x18
  6631.         db      0x19,0x10,0x13,0x1F,0x14,0x16,0x2F,0x11,0x2D,0x15,0x2C,0x1A,0x2B,0x1B,0x07,0x0C
  6632.         db      0x29,0x1E,0x30,0x2E,0x20,0x12,0x21,0x22,0x23,0x17,0x24,0x25,0x26,0x32,0x31,0x18
  6633.         db      0x19,0x10,0x13,0x1F,0x14,0x16,0x2F,0x11,0x2D,0x15,0x2C,0x1A,0x2B,0x1B,0x29,0x00
  6634.         db      0x21,0x33,0x20,0x16,0x26,0x14,0x27,0x19,0x30,0x10,0x13,0x25,0x2F,0x15,0x24,0x22
  6635.         db      0x23,0x2E,0x31,0x12,0x1E,0x1A,0x11,0x2D,0x17,0x18,0x1B,0x1F,0x32,0x28,0x34,0x2C
  6636.         db      0x21,0x33,0x20,0x16,0x26,0x14,0x27,0x19,0x30,0x10,0x13,0x25,0x2F,0x15,0x24,0x22
  6637.         times 48 db 0
  6638.         db      0x23,0x2E,0x31,0x12,0x1E,0x1A,0x11,0x2D,0x17,0x18,0x1B,0x1F,0x32,0x28,0x34,0x2C
  6639.         db      0x29,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  6640.  
  6641. ; Š« ¢¨è­ë¥ á®ç¥â ­¨ï
  6642. ; db scancode, reserved
  6643. ; dw ctrlstate
  6644. ; dd handler
  6645. ; ctrlstate: ¬« ¤è¨¥ 4 ¡¨â  - ¤«ï Shift, á«¥¤ãî騥 - ¤«ï Ctrl, á«¥¤ãî騥 - ¤«ï Alt
  6646. ; 0 = ­¨ ®¤­  ª« ¢¨è  ­¥ ­ ¦ â 
  6647. ; 1 = ஢­® ®¤­  ­ ¦ â 
  6648. ; 2 = ®¡¥ ­ ¦ âë
  6649. ; 3 = «¥¢ ï ­ ¦ â , ¯à ¢ ï ­¥â
  6650. ; 4 = ¯à ¢ ï ­ ¦ â , «¥¢ ï ­¥â
  6651. panels_ctrlkeys:
  6652.         dw      0x48, 0
  6653.         dd      panels_OnKey.up
  6654.         dw      0x50, 0
  6655.         dd      panels_OnKey.down
  6656.         dw      0x4B, 0
  6657.         dd      panels_OnKey.left
  6658.         dw      0x4D, 0
  6659.         dd      panels_OnKey.right
  6660.         dw      0x51, 0
  6661.         dd      panels_OnKey.pgdn
  6662.         dw      0x49, 0
  6663.         dd      panels_OnKey.pgup
  6664.         dw      0xF, 0
  6665.         dd      panels_OnKey.tab
  6666.         dw      0x47, 0
  6667.         dd      panels_OnKey.home
  6668.         dw      0x4F, 0
  6669.         dd      panels_OnKey.end
  6670.         dw      0x1C, 0
  6671.         dd      panels_OnKey.enter
  6672.         dw      0x3D, 0
  6673.         dd      panels_OnKey.f3
  6674.         dw      0x3F, 0
  6675.         dd      panels_OnKey.f5
  6676.         dw      0x3F, 1
  6677.         dd      panels_OnKey.shift_f5
  6678.         dw      0x41, 0
  6679.         dd      panels_OnKey.f7
  6680.         dw      0x42, 0
  6681.         dd      panels_OnKey.f8
  6682.         dw      0x43, 0x100
  6683.         dd      alt_f9
  6684.         dw      0x44, 0
  6685.         dd      exit
  6686.         dw      0x5D, 0
  6687.         dd      panels_OnKey.menu
  6688. repeat 9-3+1
  6689.         dw      0x3D+%-1, 0x10
  6690.         dd      panels_OnKey.ctrl_f39
  6691. end repeat
  6692.         dw      0x3B, 0x100
  6693.         dd      panels_OnKey.alt_f12
  6694.         dw      0x3C, 0x100
  6695.         dd      panels_OnKey.alt_f12
  6696.         dw      0x58, 0
  6697.         dd      F12
  6698.         dw      0x13, 0x10
  6699.         dd      panels_OnKey.ctrl_r
  6700.         dw      2, 0x30
  6701.         dd      panels_OnKey.change_mode
  6702.         dw      3, 0x30
  6703.         dd      panels_OnKey.change_mode
  6704.         dw      4, 0x30
  6705.         dd      panels_OnKey.change_mode
  6706.         dw      5, 0x30
  6707.         dd      panels_OnKey.change_mode
  6708. repeat 10
  6709.         dw      %+1, 0x40
  6710.         dd      panels_OnKey.quick_jump
  6711. end repeat
  6712.         dw      0x52, 0
  6713.         dd      panels_OnKey.insert
  6714.         dw      0x4E, 0
  6715.         dd      panels_OnKey.greyplus
  6716.         dw      0x4A, 0
  6717.         dd      panels_OnKey.greyminus
  6718.         dw      0x37, 0
  6719.         dd      panels_OnKey.greyasterisk
  6720.         db      0
  6721.  
  6722. viewer_ctrlkeys:
  6723.         dw      1, 0
  6724.         dd      viewer_OnKey.exit
  6725.         dw      0x51, 0
  6726.         dd      viewer_OnKey.pgdn
  6727.         dw      0x49, 0
  6728.         dd      viewer_OnKey.pgup
  6729.         dw      0x50, 0
  6730.         dd      viewer_OnKey.down
  6731.         dw      0x48, 0
  6732.         dd      viewer_OnKey.up
  6733.         dw      0x4B, 0
  6734.         dd      viewer_OnKey.left
  6735.         dw      0x4B, 0x10
  6736.         dd      viewer_OnKey.ctrl_left
  6737.         dw      0x4B, 0x11
  6738.         dd      viewer_OnKey.ctrl_shift_left
  6739.         dw      0x4C, 0
  6740.         dd      viewer_OnKey.exit
  6741.         dw      0x4D, 0
  6742.         dd      viewer_OnKey.right
  6743.         dw      0x4D, 0x10
  6744.         dd      viewer_OnKey.ctrl_right
  6745.         dw      0x4D, 0x11
  6746.         dd      viewer_OnKey.ctrl_shift_right
  6747.         dw      0x3C, 0
  6748.         dd      viewer_OnKey.f2
  6749.         dw      0x3D, 0
  6750.         dd      viewer_OnKey.exit
  6751.         dw      0x3E, 0
  6752.         dd      viewer_OnKey.f4
  6753.         dw      0x42, 0
  6754.         dd      viewer_OnKey.f8
  6755.         dw      0x42, 1
  6756.         dd      viewer_OnKey.shift_f8
  6757.         dw      0x44, 0
  6758.         dd      viewer_OnKey.exit
  6759.         dw      0x47, 0
  6760.         dd      viewer_OnKey.home
  6761.         dw      0x4F, 0
  6762.         dd      viewer_OnKey.end
  6763.         dw      0x58, 0
  6764.         dd      F12
  6765.         dw      0x43, 0x100
  6766.         dd      alt_f9
  6767.         db      0
  6768.  
  6769. dirinfo:
  6770.                 dd      1
  6771. .first          dd      0
  6772.                 dd      0
  6773. .size           dd      300
  6774. .dirdata        dd      0
  6775.                 db      0
  6776. .name           dd      0
  6777.  
  6778. readinfo:
  6779.                 dd      0
  6780. .first          dq      0
  6781. .size           dd      0
  6782. .data           dd      0
  6783.                 db      0
  6784. .name           dd      0
  6785.  
  6786. writeinfo:
  6787. .code           dd      2
  6788. .first          dq      0
  6789. .size           dd      0
  6790. .data           dd      0
  6791.                 db      0
  6792. .name           dd      0
  6793.  
  6794. attrinfo:
  6795.                 dd      5
  6796.                 dd      0
  6797.                 dd      0
  6798.                 dd      0
  6799.                 dd      .attr
  6800.                 db      0
  6801. .name           dd      0
  6802.  
  6803. delinfo:
  6804.                 dd      8
  6805.                 dd      0
  6806.                 dd      0
  6807.                 dd      0
  6808.                 dd      0
  6809.                 db      0
  6810.                 dd      execdata
  6811.  
  6812. mkdirinfo:
  6813.                 dd      9
  6814.                 dd      0
  6815.                 dd      0
  6816.                 dd      0
  6817.                 dd      0
  6818.                 db      0
  6819.                 dd      CopyDestEditBuf+12
  6820.  
  6821. if lang eq ru
  6822. compare_names   db      '¨ˆà¬Œ €­á‘¤„'
  6823. else
  6824. compare_names   db      'nNxXmMsSuUcCaA'
  6825. end if
  6826.  
  6827. ; ‡¤¥áì ­ ç¨­ îâáï ª®­ä¨£ãà æ¨®­­ë¥ ¤ ­­ë¥ - ¢ ⥪ã饩 ॠ«¨§ æ¨¨ ®­¨ § è¨âë ¢ ¡¨­ à­¨ª
  6828.  
  6829. ;  ­¥«ì
  6830. panel_normal_color      db      1Bh
  6831. panel_selected_color    db      1Eh
  6832. panel_border_color      db      1Bh
  6833. panel_cursor_color      db      30h
  6834. panel_selected_cursor_color db  3Eh
  6835. panel_header_color      db      1Bh
  6836. panel_active_header_color db    30h
  6837. column_header_color     db      1Eh
  6838. panel_number_color      db      1Bh
  6839. panel_numselected_color db      3Eh
  6840. panel_nscreens_color    db      0Bh
  6841. ; „¨ «®£¨
  6842. dialog_colors:
  6843. dialog_main_color       db      70h
  6844. dialog_border_color     db      70h
  6845. dialog_header_color     db      70h
  6846. dialog_edit_color       db      30h
  6847. dialog_unmodified_edit_color db 38h
  6848. dialog_normal_btn_color db      70h
  6849. dialog_selected_btn_color db    30h
  6850. ; à¥¤ã¯à¥¦¤¥­¨ï ¨ ®è¨¡ª¨
  6851. warning_colors:
  6852. ; !!! ¤®«¦­ë ¡ëâì ⥠¦¥ ¯®«ï ¨ ¢ ⮬ ¦¥ ¯®à浪¥, çâ® ¨ ¤«ï ®¡ëç­ëå ¤¨ «®£®¢ !!!
  6853. warning_main_color      db      4Fh
  6854. warning_border_color    db      4Fh
  6855. warning_header_color    db      4Fh
  6856. warning_edit_color      db      30h
  6857. warning_unmodified_edit_color db 38h
  6858. warning_normal_btn_color db     4Fh
  6859. warning_selected_btn_color db   70h
  6860. ; Œ¥­î
  6861. menu_normal_color       db      3Fh
  6862. menu_selected_color     db      0Fh
  6863. menu_highlight_color    db      3Eh
  6864. menu_selected_highlight_color db 0Eh
  6865. menu_border_color       db      3Fh
  6866. menu_header_color       db      3Fh
  6867. menu_scrollbar_color    db      3Fh
  6868. ; ‹¨­¥©ª  ª« ¢¨è
  6869. keybar_number_color     db      7
  6870. keybar_name_color       db      30h
  6871. keybar_bgr_color        db      7
  6872. ; Š®¬ ­¤­ ï áâப 
  6873. cmdbar_normal_color     db      7
  6874. cmdbar_prefix_color     db      7
  6875. ; à®á¬®âà騪
  6876. view_normal_color       db      1Bh
  6877. view_status_color       db      30h
  6878. view_arrows_color       db      1Eh
  6879.  
  6880. ; ®¤á¢¥âª  ä ©«®¢
  6881. highlight_num_groups    dd      10
  6882. highlight_groups        dd      highlight_group0
  6883.                 dd      highlight_group1
  6884.                 dd      highlight_group2
  6885.                 dd      highlight_group3
  6886.                 dd      highlight_group4
  6887.                 dd      highlight_group5
  6888.                 dd      highlight_group6
  6889.                 dd      highlight_group7
  6890.                 dd      highlight_group8
  6891.                 dd      highlight_group9
  6892.  
  6893. ; ”®à¬ â ®¯¨á ­¨ï £àã¯¯ë ¯®¤á¢¥âª¨:
  6894. virtual at 0
  6895. highlight:
  6896.         .IncludeAttributes      db ?
  6897.         .NormalColor            db ?
  6898.         .CursorColor            db ?
  6899.         .SelectedColor          db ?
  6900.         .SelectedCursorColor    db ?
  6901.         .Mask:                  ; ASCIIZ-string
  6902. end virtual
  6903.  
  6904. ; all highlight masks must be in lowercase!
  6905. highlight_group0:
  6906.         db      2
  6907.         db      13h, 38h, 0, 0
  6908.         db      '*',0
  6909. highlight_group1:
  6910.         db      4
  6911.         db      13h, 38h, 0, 0
  6912.         db      '*',0
  6913. highlight_group2:
  6914.         db      10h
  6915.         db      1Fh, 3Fh, 0, 0
  6916.         db      '*|..',0
  6917. highlight_group3:
  6918.         db      10h
  6919.         db      0, 0, 0, 0
  6920.         db      '..',0
  6921. highlight_group4:
  6922.         db      0
  6923.         db      1Ah, 3Ah, 0, 0
  6924.         db      '*.exe,*.com,*.bat,*.cmd',0
  6925. highlight_group5:
  6926.         db      0
  6927.         db      1Ah, 3Ah, 0, 0
  6928.         db      '*|*.*',0
  6929. highlight_group6:
  6930.         db      0
  6931.         db      1Dh, 3Dh, 0, 0
  6932.         db      '*.rar,*.zip,*.[zj],*.[bg7]z,*.[bg]zip,*.tar,*.t[ag]z,*.ar[cj],*.r[0-9][0-9],'
  6933.         db      '*.a[0-9][0-9],*.bz2,*.cab,*.msi,*.jar,*.lha,*.lzh,*.ha,*.ac[bei],*.pa[ck],'
  6934.         db      '*.rk,*.cpio,*.rpm,*.zoo,*.hqx,*.sit,*.ice,*.uc2,*.ain,*.imp,*.777,*.ufa,*.boa,'
  6935.         db      '*.bs[2a],*.sea,*.hpk,*.ddi,*.x2,*.rkv,*.[lw]sz,*.h[ay]p,*.lim,*.sqz,*.chz',0
  6936. highlight_group7:
  6937.         db      0
  6938.         db      16h, 36h, 0, 0
  6939.         db      '*.bak,*.tmp',0
  6940. highlight_group8:
  6941.         db      0
  6942.         db      17h, 37h, 0, 0
  6943.         db      '*.asm,*.inc',0
  6944. highlight_group9:
  6945.         db      10h
  6946.         db      1Fh, 3Fh, 0, 0
  6947.         db      '*',0
  6948.  
  6949. bConfirmDelete  db      1
  6950. bConfirmDeleteIncomplete db 0
  6951.  
  6952. FolderShortcuts dd      0,0,0,0,0,0,0,0,0,0
  6953.  
  6954. ; ‡¤¥áì § ª ­ç¨¢ îâáï ª®­ä¨£ãà æ¨®­­ë¥ ¤ ­­ë¥
  6955.  
  6956. bWasE0          db      0
  6957. ctrlstate       db      0
  6958. MemForImage     dd      0
  6959. restore_semicolon dd    0
  6960. bForHex         db      0
  6961.  
  6962. align   4
  6963. ; ‘®®¡é¥­¨¥ ® ®¡«®¬¥ ¯à¨ ¢ë¤¥«¥­¨¨ ¯ ¬ïâ¨
  6964. nomem_dlgdata:
  6965.         dd      2
  6966.         dd      -1
  6967.         dd      -1
  6968.         dd      12
  6969.         dd      2
  6970.         dd      1
  6971.         dd      1
  6972.         dd      aError
  6973.         rb      4
  6974.         dd      0
  6975.         dd      0
  6976.         dd      2
  6977. ; áâப  "No memory"
  6978.         dd      1
  6979.         dd      1,0,10,0
  6980.         dd      aNoMemory
  6981.         dd      1
  6982. ; ª­®¯ª  "Ok"
  6983.         dd      2
  6984.         dd      4,1,7,1
  6985.         dd      aOk
  6986.         dd      0xD
  6987.  
  6988. ; ¤¨ «®£ ª®¯¨à®¢ ­¨ï
  6989. copy_dlgdata:
  6990.         dd      1
  6991. .x      dd      -1
  6992. .y      dd      -1
  6993. .width  dd      ?
  6994. .height dd      4
  6995.         dd      4
  6996.         dd      2
  6997.         dd      aCopyCaption
  6998. .main_color db ?
  6999. .border_color db ?
  7000. .header_color db ?
  7001.         db      0
  7002.         dd      0
  7003.         dd      0
  7004.         dd      4
  7005. ; áâப  'Š®¯¨à®¢ âì "%s" ¢:'
  7006.         dd      1
  7007.         dd      1,0
  7008. .width2 dd      ?
  7009.         dd      0
  7010.         dd      CopySourceTextBuf
  7011.         dd      0
  7012. ; ¯®«¥ । ªâ¨à®¢ ­¨ï á ¨¬¥­¥¬ ä ©« /¯ ¯ª¨ ­ §­ ç¥­¨ï
  7013.         dd      3
  7014.         dd      1,1
  7015. .width3 dd      ?
  7016.         dd      1
  7017.         dd      CopyDestEditBuf
  7018. .flags0 dd      0
  7019. ; ª­®¯ª  "ª®¯¨à®¢ âì"
  7020. .copy_btn:
  7021.         dd      2
  7022. .copy_x1 dd     ?
  7023.         dd      3
  7024. .copy_x2 dd     ?
  7025.         dd      3
  7026.         dd      aCopy
  7027. .flags1 dd      18h
  7028. ; ª­®¯ª  "®â¬¥­¨âì"
  7029.         dd      2
  7030. .cnl_x1 dd      ?
  7031.         dd      3
  7032. .cnl_x2 dd      ?
  7033.         dd      3
  7034.         dd      aCancelB
  7035. .flags2 dd      8
  7036.  
  7037. mkdir_dlgdata:
  7038.         dd      1
  7039.         dd      -1, -1
  7040. .width  dd      ?
  7041. .height dd      4
  7042.         dd      4, 2
  7043.         dd      aMkDirCaption
  7044.         dd      ?
  7045.         dd      0
  7046.         dd      0
  7047.         dd      4
  7048. ; ‘âப  "‘®§¤ âì ¯ ¯ªã"
  7049.         dd      1
  7050.         dd      1,0,aMkDirLen,0
  7051.         dd      aMkDir
  7052.         dd      0
  7053. ; ¯®«¥ । ªâ¨à®¢ ­¨ï á ¨¬¥­¥¬ ᮧ¤ ¢ ¥¬®© ¯ ¯ª¨
  7054.         dd      3
  7055.         dd      1,1
  7056. .width2 dd      ?
  7057.         dd      1
  7058.         dd      CopyDestEditBuf
  7059. .flags0 dd      0xC
  7060. ; ª­®¯ª  "à®¤®«¦¨âì"
  7061. .cont_btn:
  7062.         dd      2
  7063. .cont_x1 dd     ?
  7064.         dd      3
  7065. .cont_x2 dd     ?
  7066.         dd      3
  7067.         dd      a_Continue
  7068. .flags1 dd      18h
  7069. ; ª­®¯ª  "®â¬¥­¨âì"
  7070.         dd      2
  7071. .cnl_x1 dd      ?
  7072.         dd      3
  7073. .cnl_x2 dd      ?
  7074.         dd      3
  7075.         dd      aCancelB
  7076. .flags2 dd      8
  7077.  
  7078. ; ¤¨ «®£ ¢ë¤¥«¥­¨ï/á­ïâ¨ï
  7079. mark_dlgdata:
  7080.         dd      1
  7081.         dd      -1, -1
  7082.         dd      37, 1
  7083.         dd      4, 2
  7084. .title  dd      ?
  7085.         dd      ?
  7086.         dd      0, 0
  7087.         dd      1
  7088. ; ¯®«¥ । ªâ¨à®¢ ­¨ï
  7089.         dd      3
  7090.         dd      1, 0, 35, 0
  7091.         dd      enter_string_buf
  7092. .flags  dd      ?
  7093.  
  7094. RetryOrCancelBtn:
  7095.         dd      aRetry
  7096.         dd      a_Cancel
  7097. DeleteOrKeepBtn:
  7098.         dd      a_Delete
  7099.         dd      aKeep
  7100. RetryOrIgnoreBtn:
  7101.         dd      aRetry
  7102.         dd      aIgnore
  7103. DeleteOrCancelBtn:
  7104.         dd      a_Delete
  7105.         dd      a_Cancel
  7106. DeleteErrorBtn:
  7107.         dd      aRetry
  7108.         dd      aSkip
  7109.         dd      aSkipAll
  7110.         dd      a_Cancel
  7111. ContinueBtn:
  7112.         dd      aContinue
  7113.  
  7114. aCannotOpenFile_ptr     dd      aCannotOpenFile
  7115. if lang eq ru
  7116. aDeleteCaption          db      '“¤ «¥­¨¥',0
  7117. aConfirmDeleteText      db      '‚ë å®â¨â¥ 㤠«¨âì',0
  7118. aDeleteFolder           db      ' ¯ ¯ªã',0
  7119. aConfirmDeleteTextMax = $ - aConfirmDeleteText - 2
  7120. aDeleteFile             db      ' ä ©«',0
  7121. aCancelB                db      '[ Žâ¬¥­¨âì ]',0
  7122. aCancelBLength = $ - aCancelB - 1
  7123. aCopyCaption            db      'Š®¯¨à®¢ ­¨¥',0
  7124. aCopy                   db      '[ Š®¯¨à®¢ âì ]',0
  7125. aCopyLength = $ - aCopy - 1
  7126. a_Continue              db      '[ à®¤®«¦¨âì ]',0
  7127. a_ContinueLength = $ - a_Continue - 1
  7128. aCopy1                  db      'Š®¯¨à®¢ âì ',0
  7129. aCopy2                  db      ' ¢:',0
  7130. aError                  db      'Žè¨¡ª ',0
  7131. aContinue               db      'à®¤®«¦¨âì',0
  7132. aRetry                  db      '®¢â®à¨âì',0
  7133. a_Cancel                db      'Žâ¬¥­¨âì',0
  7134. a_Delete                db      '“¤ «¨âì',0
  7135. aSkip                   db      'à®¯ãáâ¨âì',0
  7136. aSkipAll                db      'à®¯ãáâ¨âì ¢á¥',0
  7137. error0msg               db      '‘âà ­­®... ¥â ®è¨¡ª¨',0
  7138. error1msg               db      '‘âà ­­®... ¥ ®¯à¥¤¥«¥­  ¡ §  ¨/¨«¨ à §¤¥« ¦ñá⪮£® ¤¨áª ',0
  7139. error2msg               db      '”ã­ªæ¨ï ­¥ ¯®¤¤¥à¦¨¢ ¥âáï ¤«ï ¤ ­­®© ä ©«®¢®© á¨á⥬ë',0
  7140. error3msg               db      '¥¨§¢¥áâ­ ï ä ©«®¢ ï á¨á⥬ ',0
  7141. error4msg               db      '‘âà ­­®... Žè¨¡ª  4',0
  7142. error5msg               db      '” ©« ­¥ ­ ©¤¥­',0
  7143. error6msg               db      '” ©« § ª®­ç¨«áï',0
  7144. error7msg               db      '‘âà ­­®... “ª § â¥«ì ¢­¥ ¯ ¬ï⨠¯à¨«®¦¥­¨ï',0
  7145. error8msg               db      '„¨áª § ¯®«­¥­',0
  7146. error9msg               db      '” ©«®¢ ï áâàãªâãà  à §àã襭 ',0
  7147. error10msg              db      '„®áâ㯠§ ¯à¥éñ­',0
  7148. error11msg              db      'Žè¨¡ª  ãáâனá⢠',0
  7149. error30msg              db      '¥¤®áâ â®ç­® ¯ ¬ïâ¨',0
  7150. error31msg              db      '” ©« ­¥ ï¥âáï ¨á¯®«­ï¥¬ë¬',0
  7151. error32msg              db      '‘«¨èª®¬ ¬­®£® ¯à®æ¥áᮢ',0
  7152. aUnknownError           db      '¥¨§¢¥áâ­ë© ª®¤ ®è¨¡ª¨: ',0
  7153. aCannotReadFolder       db      '¥ ¬®£ã ¯à®ç¨â âì ¯ ¯ªã',0
  7154. aRunError               db      'Žè¨¡ª  ¯à¨ § ¯ã᪥ ¯à®£à ¬¬ë:',0
  7155. aFileNameTooBig         db      '®«­®¥ ¨¬ï ä ©«  ᫨誮¬ ¤«¨­­®¥',0
  7156. aFolderNameTooBig       db      '®«­®¥ ¨¬ï ¯ ¯ª¨ ᫨誮¬ ¤«¨­­®¥',0
  7157. aCmdLineTooBig          db      'Š®¬ ­¤­ ï áâப  ¯à¥¢ë蠥⠣࠭¨æã OS ¢ 256 ᨬ¢®«®¢',0
  7158. aCannotCopyToSelf       db      '” ©« ­¥ ¬®¦¥â ¡ëâì ᪮¯¨à®¢ ­ ¢ á ¬®£® ᥡï',0
  7159. aCannotReadFile         db      '¥ ¬®£ã ¯à®ç¨â âì ä ©«',0
  7160. aIncompleteFile         db      'ë« ¯®«ã祭 ­¥¯®«­ë© ä ©«. “¤ «¨âì ¥£®?',0
  7161. aKeep                   db      'Žáâ ¢¨âì',0
  7162. aCannotWriteFile        db      '¥ ¬®£ã § ¯¨á âì ¢ ä ©«',0
  7163. aCannotDeleteFile       db      '¥ ¬®£ã 㤠«¨âì ä ©«',0
  7164. aCannotDeleteFolder     db      '¥ ¬®£ã 㤠«¨âì ¯ ¯ªã',0
  7165. aNotFolder              db      '­¥ ï¥âáï ¯ ¯ª®©',0
  7166. aIgnore                 db      'ˆ£­®à¨à®¢ âì',0
  7167. aMkDirCaption           db      '‘®§¤ ­¨¥ ¯ ¯ª¨',0
  7168. aMkDir                  db      '‘®§¤ âì ¯ ¯ªã',0
  7169. aMkDirLen = $ - aMkDir - 1
  7170. aCannotMakeFolder       db      '¥ ¬®£ã ᮧ¤ âì ¯ ¯ªã',0
  7171. aName                   db      3,'ˆ¬ï'
  7172. aSize                   db      6,' §¬¥à'
  7173. aDate                   db      4,'„ â '
  7174. aTime                   db      5,'‚६ï'
  7175. aCannotLoadDLL          db      '¥ ¬®£ã § £à㧨âì DLL',0
  7176. aCannotLoadPlugin       db      '¥ ¬®£ã § £à㧨âì ¯« £¨­',0
  7177. aInvalidDLL             db      '” ©« ­¥ ­ ©¤¥­ ¨«¨ ¨¬¥¥â ­¥¢¥à­ë© ä®à¬ â',0
  7178. aMissingExport          db      '¥®¡å®¤¨¬ ï äã­ªæ¨ï ­¥ ­ ©¤¥­ ',0
  7179. aInitFailed             db      'Žè¨¡ª  ¯à¨ ¨­¨æ¨ «¨§ æ¨¨',0
  7180. aIncompatibleVersion    db      '¥á®¢¬¥á⨬ ï ¢¥àá¨ï',0
  7181. aTables                 db      '’ ¡«¨æë',0
  7182. aSelect                 db      '®¬¥â¨âì',0
  7183. aDeselect               db      '‘­ïâì',0
  7184. aCannotOpenFile         db      'Žè¨¡ª  ¯à¨ ®âªàë⨨ ä ©« ',0
  7185. aCannotSetFolder        db      '¥ ¬®£ã § ©â¨ ¢ ¯ ¯ªã',0
  7186. else
  7187. aDeleteCaption          db      'Delete',0
  7188. aConfirmDeleteText      db      'Do you wish to delete',0
  7189. aDeleteFolder           db      ' the folder',0
  7190. aConfirmDeleteTextMax = $ - aConfirmDeleteText - 2
  7191. aDeleteFile             db      ' the file',0
  7192. aDelete                 db      ' Delete ',0
  7193. aDeleteLength = $ - aDelete - 1
  7194. aCancel                 db      ' Cancel ',0
  7195. aCancelLength = $ - aCancel - 1
  7196. aCancelB                db      '[ Cancel ]',0
  7197. aCancelBLength = $ - aCancelB - 1
  7198. aCopyCaption            db      'Copy',0
  7199. aCopy                   db      '[ Copy ]',0
  7200. aCopyLength = $ - aCopy - 1
  7201. a_Continue              db      '[ Continue ]',0
  7202. a_ContinueLength = $ - a_Continue - 1
  7203. aCopy1                  db      'Copy "',0
  7204. aCopy2                  db      '" to:',0
  7205. aError                  db      'Error',0
  7206. aContinue               db      'Continue',0
  7207. aRetry                  db      'Retry',0
  7208. a_Cancel                db      'Cancel',0
  7209. a_Delete                db      'Delete',0
  7210. aSkip                   db      'Skip',0
  7211. aSkipAll                db      'Skip all',0
  7212. error0msg               db      'Strange... No error',0
  7213. error1msg               db      'Strange... Hard disk base and/or partition not defined',0
  7214. error2msg               db      'The file system does not support this function',0
  7215. error3msg               db      'Unknown file system',0
  7216. error4msg               db      'Strange... Error 4',0
  7217. error5msg               db      'File not found',0
  7218. error6msg               db      'End of file',0
  7219. error7msg               db      'Strange... Pointer lies outside of application memory',0
  7220. error8msg               db      'Disk is full',0
  7221. error9msg               db      'File structure is destroyed',0
  7222. error10msg              db      'Access denied',0
  7223. error11msg              db      'Device error',0
  7224. error30msg              db      'Not enough memory',0
  7225. error31msg              db      'File is not executable',0
  7226. error32msg              db      'Too many processes',0
  7227. aUnknownError           db      'Unknown error code: ',0
  7228. aCannotReadFolder       db      'Cannot read folder',0
  7229. aRunError               db      'Cannot execute program:',0
  7230. aFileNameTooBig         db      'Full file name is too long',0
  7231. aFolderNameTooBig       db      'Full folder name is too long',0
  7232. aCmdLineTooBig          db      'Command line is too long (OS limit is 256 symbols)',0
  7233. aCannotCopyToSelf       db      'File cannot be copied onto itself',0
  7234. aCannotReadFile         db      'Cannot read file',0
  7235. aIncompleteFile         db      'Incomplete file was retrieved. Delete it?',0
  7236. aKeep                   db      'Keep',0
  7237. aCannotWriteFile        db      'Cannot write to the file',0
  7238. aCannotDeleteFile       db      'Cannot delete the file',0
  7239. aCannotDeleteFolder     db      'Cannot delete the folder',0
  7240. aNotFolder              db      'is not a folder',0
  7241. aIgnore                 db      'Ignore',0
  7242. aMkDirCaption           db      'Make folder',0
  7243. aMkDir                  db      'Create the folder',0
  7244. aMkDirLen = $ - aMkDir - 1
  7245. aCannotMakeFolder       db      'Cannot create folder',0
  7246. aName                   db      4,'Name'
  7247. aSize                   db      4,'Size'
  7248. aDate                   db      4,'Date'
  7249. aTime                   db      4,'Time'
  7250. aCannotLoadDLL          db      'Cannot load DLL',0
  7251. aCannotLoadPlugin       db      'Cannot load plugin',0
  7252. aInvalidDLL             db      'File is not found or invalid',0
  7253. aMissingExport          db      'Required function is not present',0
  7254. aInitFailed             db      'Initialization failed',0
  7255. aIncompatibleVersion    db      'Incompatible version',0
  7256. aTables                 db      'Tables',0
  7257. aSelect                 db      'Select',0
  7258. aDeselect               db      'Deselect',0
  7259. aCannotOpenFile         db      'Cannot open the file',0
  7260. aCannotSetFolder        db      'Cannot enter to folder',0
  7261. end if
  7262.  
  7263. aOk                     db      'OK',0
  7264. aNoMemory               db      'No memory!'
  7265. nullstr                 db      0
  7266. aUntitled               db      'untitled',0
  7267. aDotDot                 db      '..',0,0
  7268. standard_dll_path:
  7269. libini_name             db      '/sys/dll/'
  7270. standard_dll_path_size = $ - standard_dll_path
  7271.                         db      'libini.obj',0
  7272. aStart                  db      'START',0
  7273. aLibInit                db      'lib_init',0
  7274. aVersion                db      'version',0
  7275. aIniGetInt              db      'ini.get_int',0
  7276. aIniGetStr              db      'ini.get_str',0
  7277. aIniSetInt              db      'ini.set_int',0
  7278. aIniEnumKeys            db      'ini.enum_keys',0
  7279. aPluginLoad             db      'plugin_load',0
  7280. aPluginUnload           db      'plugin_unload',0
  7281. aGetattr                db      'getattr',0
  7282. aOpen                   db      'open',0
  7283. aRead                   db      'read',0
  7284. aSetpos                 db      'setpos',0
  7285. aClose                  db      'close',0
  7286. aOpenFilePlugin         db      'OpenFilePlugin',0
  7287. aClosePlugin            db      'ClosePlugin',0
  7288. aReadFolder             db      'ReadFolder',0
  7289. aSetFolder              db      'SetFolder',0
  7290. aGetOpenPluginInfo      db      'GetOpenPluginInfo',0
  7291. aGetPanelTitle          db      'GetPanelTitle',0
  7292. aGetFiles               db      'GetFiles',0
  7293.  
  7294. aConfirmations          db      'Confirmations',0
  7295. aConfirmDelete          db      'Delete',0
  7296. aConfirmDeleteIncomplete db     'DeleteIncomplete',0
  7297.  
  7298. aPanels                 db      'Panels',0
  7299. aLeftViewMode           db      'LeftViewMode',0
  7300. aRightViewMode          db      'RightViewMode',0
  7301.  
  7302. aAssociations           db      'Associations',0
  7303. aPlugins                db      'Plugins',0
  7304. aMenu                   db      'Menu',0
  7305. aFolderShortcuts        db      'FolderShortcuts',0
  7306. aShortcut               db      'Shortcut'
  7307. .d                      db      '0',0
  7308.  
  7309. align 4
  7310. ini_import:
  7311. ini.get_int     dd      aIniGetInt
  7312. ini.get_str     dd      aIniGetStr
  7313. ini.enum_keys   dd      aIniEnumKeys
  7314. ini.set_int     dd      aIniSetInt
  7315.                 dd      0
  7316.  
  7317. plugin_exported:
  7318.         dd      aPluginUnload
  7319.         dd      aGetattr
  7320.         dd      aOpen
  7321.         dd      aRead
  7322.         dd      aSetpos
  7323.         dd      aClose
  7324.         dd      aOpenFilePlugin
  7325.         dd      aClosePlugin
  7326.         dd      aReadFolder
  7327.         dd      aSetFolder
  7328.         dd      aGetOpenPluginInfo
  7329.         dd      aGetPanelTitle
  7330.         dd      aGetFiles
  7331.         dd      0
  7332. plugin_exported_default:
  7333.         dd      plugin_unload_default
  7334.         dd      getattr_default
  7335.         dd      open_default
  7336.         dd      read
  7337.         dd      setpos_default
  7338.         dd      close
  7339.         dd      OpenFilePlugin_default
  7340.         dd      ClosePlugin_default
  7341.         dd      ReadFolder_default
  7342.         dd      SetFolder_default
  7343.         dd      GetOpenPluginInfo_default
  7344.         dd      GetPanelTitle_default
  7345.         dd      GetFiles_default
  7346.  
  7347. kfar_info:
  7348.         dd      .size
  7349.         dd      version_dword
  7350.         dd      open
  7351.         dd      read
  7352.         dd      -1      ; write: to be implemented
  7353.         dd      seek
  7354.         dd      -1      ; flush: to be implemented
  7355.         dd      filesize
  7356.         dd      close
  7357.         dd      xpgalloc
  7358.         dd      xpgrealloc
  7359.         dd      pgfree
  7360.         dd      getfreemem
  7361.         dd      libini_alloc
  7362.         dd      libini_realloc
  7363.         dd      libini_free
  7364.         dd      menu
  7365.         dd      menu_centered_in
  7366.         dd      DialogBox
  7367.         dd      SayErr
  7368.         dd      Message
  7369.         dd      cur_width
  7370. .size = $ - kfar_info
  7371.  
  7372. plugins         dd      0
  7373. num_plugins     dd      0
  7374. alloc_plugins   dd      0
  7375.  
  7376. virtual at 0
  7377. PluginInfo:
  7378. .unload         dd      ?
  7379. .getattr        dd      ?
  7380. .open           dd      ?
  7381. .read           dd      ?
  7382. .setpos         dd      ?
  7383. .close          dd      ?
  7384. .OpenFilePlugin dd      ?
  7385. .ClosePlugin    dd      ?
  7386. .ReadFolder     dd      ?
  7387. .SetFolder      dd      ?
  7388. .GetOpenPluginInfo dd   ?
  7389. .GetPanelTitle  dd      ?
  7390. .GetFiles       dd      ?
  7391. .size = $
  7392. end virtual
  7393.  
  7394. virtual at 0
  7395. PanelMode:
  7396. ; up to 16 columns on one panel
  7397. .NumColumns     dd      ?
  7398. ; available column types:
  7399. COLUMN_TYPE_NONE = 0
  7400. COLUMN_TYPE_NAME = 1
  7401.         COLUMN_NAME_MARK = 10h          ; (reserved)
  7402.         COLUMN_NAME_NOPATH = 20h        ; (reserved)
  7403.         COLUMN_NAME_RIGHTALIGN = 40h    ; (reserved)
  7404. COLUMN_TYPE_SIZE = 2
  7405.         COLUMN_SIZE_COMMA = 10h         ; (reserved)
  7406. COLUMN_TYPE_PACKED_SIZE = 3             ; (reserved)
  7407. COLUMN_TYPE_DATE = 4
  7408. COLUMN_TYPE_TIME = 5
  7409. COLUMN_TYPE_DATETIME = 6                ; (reserved)
  7410. COLUMN_TYPE_DATETIME_CREATION = 7       ; (reserved)
  7411. COLUMN_TYPE_DATETIME_ACCESS = 8         ; (reserved)
  7412. COLUMN_TYPE_ATTRIBUTES = 9              ; (reserved)
  7413. COLUMN_TYPE_DESCRIPTION = 10            ; (reserved)
  7414. COLUMN_TYPE_OWNER = 11                  ; (reserved)
  7415. COLUMN_TYPE_NUMLINKS = 12               ; (reserved)
  7416. COLUMN_TYPE_CUSTOM = 13                 ; (reserved)
  7417. .ColumnTypes    rb      16
  7418.  
  7419. .ColumnWidths   rb      16
  7420. .bFullScreen    db      ?               ; (reserved)
  7421. .bAlignExtensions db    ?
  7422.                 rb      2
  7423. .size = $
  7424. end virtual
  7425.  
  7426. align 4
  7427. column_headers:
  7428.         dd      nullstr
  7429.         dd      aName
  7430.         dd      aSize
  7431.         dd      nullstr
  7432.         dd      aDate
  7433.         dd      aTime
  7434. draw_column_proc:
  7435.         dd      draw_empty_column
  7436.         dd      draw_name_column
  7437.         dd      draw_size_column
  7438.         dd      -1
  7439.         dd      draw_date_column
  7440.         dd      draw_time_column
  7441. colmodes:
  7442. ; ०¨¬ 0 : NM,SC,D
  7443.         dd      3
  7444.         db      COLUMN_TYPE_NAME+COLUMN_NAME_MARK, COLUMN_TYPE_SIZE+COLUMN_SIZE_COMMA
  7445.                 db      COLUMN_TYPE_DATE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  7446.         db      0, 10, 8
  7447.                 times 13 db 0
  7448.         db      0, 1
  7449.                 times 2 db 0
  7450. ; ०¨¬ 1 : N,N,N
  7451.         dd      3
  7452.         db      COLUMN_TYPE_NAME, COLUMN_TYPE_NAME, COLUMN_TYPE_NAME
  7453.                 times 13 db 0
  7454.         times 16 db 0
  7455.         db      0, 1
  7456.                 times 2 db 0
  7457. ; ०¨¬ 2 : N,N
  7458.         dd      2
  7459.         db      COLUMN_TYPE_NAME, COLUMN_TYPE_NAME
  7460.                 times 14 db 0
  7461.         times 16 db 0
  7462.         db      0, 0
  7463.                 times 2 db 0
  7464. ; ०¨¬ 3 : N,S,D,T
  7465.         dd      4
  7466.         db      COLUMN_TYPE_NAME, COLUMN_TYPE_SIZE, COLUMN_TYPE_DATE, COLUMN_TYPE_TIME
  7467.                 times 12 db 0
  7468.         db      0, 6, 8, 5
  7469.                 times 12 db 0
  7470.         db      0, 1
  7471.                 times 2 db 0
  7472. ; ०¨¬ 4 : N,S
  7473.         dd      2
  7474.         db      COLUMN_TYPE_NAME, COLUMN_TYPE_SIZE
  7475.                 times 14 db 0
  7476.         db      0, 6
  7477.                 times 14 db 0
  7478.         db      0, 0
  7479.                 times 2 db 0
  7480. ; ०¨¬ 5 : N,S,P,DM,DC,DA,A
  7481. ; ०¨¬ 6 : N,Z
  7482. ; ०¨¬ 7 : N,S,Z
  7483. ; ०¨¬ 8 : N,S,O
  7484. ; ०¨¬ 9 : N,S,LN
  7485.  
  7486. execinfo:
  7487.         dd      7
  7488.         dd      0
  7489. execparams dd   0
  7490.         dd      0
  7491.         dd      0
  7492.         db      0
  7493. execptr dd      ?
  7494.  
  7495. IncludeIGlobals
  7496.  
  7497. i_end:
  7498.  
  7499. IncludeUGlobals
  7500.  
  7501. execdata rb     1024
  7502. execdataend:
  7503.         align   4
  7504. attrinfo.attr   rb      40
  7505.  
  7506. panel1_data:
  7507. panel1_left     dd      ?
  7508. panel1_top      dd      ?
  7509. panel1_width    dd      ?
  7510. panel1_height   dd      ?
  7511. panel1_index    dd      ?
  7512. panel1_start    dd      ?
  7513. panel1_colsz    dd      ?
  7514. panel1_colst    dd      ?
  7515. panel1_sortmode db      ?
  7516.                 rb      3
  7517. panel1_nfa      dd      ?
  7518. panel1_numfiles dd      ?
  7519. panel1_files    dd      ?
  7520. panel1_hPlugin  dd      ?
  7521. panel1_hFile    dd      ?
  7522. panel1_parents          dd      ?
  7523. panel1_parents_sz       dd      ?
  7524. panel1_parents_alloc    dd      ?
  7525. panel1_colmode          dd      ?
  7526. panel1_colwidths        rd      16+1
  7527. panel1_total_num        dd      ?
  7528. panel1_total_size       dq      ?
  7529. panel1_selected_num     dd      ?
  7530. panel1_selected_size    dq      ?
  7531. panel1_plugin_info:
  7532. panel1_plugin_flags     dd      ?
  7533. panel1_dir      rb      1024
  7534.  
  7535. panel2_data:
  7536. panel2_left     dd      ?
  7537. panel2_top      dd      ?
  7538. panel2_width    dd      ?
  7539. panel2_height   dd      ?
  7540. panel2_index    dd      ?
  7541. panel2_start    dd      ?
  7542. panel2_colsz    dd      ?
  7543. panel2_colst    dd      ?
  7544. panel2_sortmode db      ?
  7545.                 rb      3
  7546. panel2_nfa      dd      ?
  7547. panel2_numfiles dd      ?
  7548. panel2_files    dd      ?
  7549. panel2_hPlugin  dd      ?
  7550. panel2_hFile    dd      ?
  7551. panel2_parents          dd      ?
  7552. panel2_parents_sz       dd      ?
  7553. panel2_parents_alloc    dd      ?
  7554. panel2_colmode          dd      ?
  7555. panel2_colwidths        rd      16+1
  7556. panel2_total_num        dd      ?
  7557. panel2_total_size       dq      ?
  7558. panel2_selected_num     dd      ?
  7559. panel2_selected_size    dq      ?
  7560. panel2_plugin_info:
  7561. panel2_plugin_flags     dd      ?
  7562. panel2_dir      rb      1024
  7563.  
  7564. ;console_data    rb      max_width*max_height*2
  7565.  
  7566. nomem_dlgsavearea       rb      (12+4)*(3+3)*2
  7567.  
  7568. cur_header      rb      max_width
  7569. tmp             dd      ?
  7570.  
  7571. skinh           dd      ?
  7572. std_colors      rd      10
  7573.  
  7574. min_y           dd      ?
  7575. max_y           dd      ?
  7576. min_x           dd      ?
  7577. max_x           dd      ?
  7578. used_width      dd      ?
  7579. used_height     dd      ?
  7580.  
  7581. wnd_width       dd      ?
  7582. wnd_height      dd      ?
  7583.  
  7584. column_left     dd      ?
  7585. column_top      dd      ?
  7586. column_width    dd      ?
  7587. column_height   dd      ?
  7588. column_index    dd      ?
  7589. last_column_index dd    ?
  7590.  
  7591. scrpos          dq      ?
  7592. viewer_right_side dq    ?
  7593.  
  7594. saved_file_name:
  7595. procinfo        rb      1024
  7596. lower_file_name = procinfo + 512
  7597.  
  7598. app_path        rb      1100
  7599.  
  7600. error_msg       rb      128
  7601.  
  7602. prev_dir        rb      1024
  7603.  
  7604. driveinfo       rb      32+304
  7605. tmpname         rb      32
  7606.  
  7607. screens         dd      ?
  7608. num_screens     dd      ?
  7609. active_screen_vtable dd ?
  7610. active_screen_data dd   ?
  7611.  
  7612. default_attr    dd      ?
  7613. left_dotdot_entry       rb      40+3    ; 40 bytes for attributes + '..'
  7614. right_dotdot_entry      rb      40+3
  7615.  
  7616. aConfirmDeleteTextBuf   rb      aConfirmDeleteTextMax + 1
  7617. CopySourceTextBuf       rb      512
  7618. CopyDestEditBuf         rb      12+512+1
  7619. .length = $ - CopyDestEditBuf - 13
  7620.  
  7621. enter_string_buf        rb      12+512+1
  7622.  
  7623. bMemForImageValidData   db      ?
  7624.  
  7625. align 4
  7626. tolower_table   rb      256
  7627. layout          rb      128
  7628.  
  7629. copy_buffer_size = 65536
  7630. copy_buffer     rb      copy_buffer_size
  7631.  
  7632. filedata_buffer_size = 1024
  7633. filedata_buffer rb      filedata_buffer_size
  7634.  
  7635. source_hModule  dd      ?
  7636. source_hPlugin  dd      ?
  7637. source_hFile    dd      ?
  7638. ; data for directory delete
  7639. ; If directory nested level is >1024, then its full name is too big,
  7640. ; so we see the overflow when creating full name (we check for this!)
  7641. del_dir_stack   rd      1024
  7642. del_dir_stack_ptr dd    ?
  7643. del_dir_query_size = 32
  7644. del_dir_query_area rb   32+304*del_dir_query_size
  7645.  
  7646. label copy_dir_stack dword at del_dir_stack
  7647. label copy_dir_stack_ptr dword at del_dir_stack_ptr
  7648. copy_dir_query_size = del_dir_query_size
  7649. copy_dir_query_area = del_dir_query_area
  7650. del_bSkipAll    db      ?       ; for directory errors
  7651. label copy_bSkipAll byte at del_bSkipAll
  7652. copy_bSkipAll2  db      ?       ; for file read/write errors
  7653. copy_bSkipAll3  db      ?       ; for SetFolder errors
  7654.  
  7655. bEndSlash       db      ?
  7656. bDestIsFolder   db      ?
  7657. bNeedRestoreName db     ?
  7658.  
  7659. ; stack
  7660.         align   4
  7661.         rb      32768
  7662. stacktop:
  7663.  
  7664. mem:
  7665.