Subversion Repositories Kolibri OS

Rev

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