Subversion Repositories Kolibri OS

Rev

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