Subversion Repositories Kolibri OS

Rev

Rev 2633 | 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.65'
  11. version_dword equ 0*10000h + 65
  12.  
  13. min_width = 54
  14. max_width = 255
  15. min_height = 8
  16. max_height = 255
  17.  
  18. include 'lang.inc'
  19. include 'font.inc'
  20. include 'sort.inc'
  21. include 'kglobals.inc'
  22. include 'dialogs.inc'
  23. include 'search.inc'
  24. include 'viewer.inc'
  25. include 'editor.inc'
  26. include 'tools.inc'
  27. include 'filetool.inc'
  28.  
  29. cursor_normal_size = (font_height*15+50)/100
  30. cursor_big_size = font_height
  31.  
  32. start:
  33.         mov     edi, identical_table
  34.         mov     ecx, 0x100
  35.         xor     eax, eax
  36. @@:
  37.         stosb
  38.         inc     eax
  39.         loop    @b
  40.         mov     cl, 'A'
  41. @@:
  42.         stosb
  43.         inc     eax
  44.         loop    @b
  45.         add     al, 0x20
  46.         mov     cl, 'Z'-'A'+1
  47. @@:
  48.         stosb
  49.         inc     eax
  50.         loop    @b
  51.         sub     al, 0x20
  52.         mov     cl, 'А'-'Z'-1
  53. @@:
  54.         stosb
  55.         inc     eax
  56.         loop    @b
  57.         add     al, 0x20
  58.         mov     cl, 'Р'-'А'
  59. @@:
  60.         stosb
  61.         inc     eax
  62.         loop    @b
  63.         add     al, 0x30
  64.         mov     cl, 'Я'-'Р'+1
  65. @@:
  66.         stosb
  67.         inc     eax
  68.         loop    @b
  69.         sub     al, 0x50
  70.         mov     cl, 256-'Я'-1
  71. @@:
  72.         stosb
  73.         inc     eax
  74.         loop    @b
  75.         mov     byte [edi-256+'Ё'], 'ё'
  76.         mov     cl, 'A'
  77.         inc     eax
  78.         rep     stosb
  79.         mov     cl, 'Z'-'A'+1
  80.         dec     eax
  81.         rep     stosb
  82.         mov     cl, 'a'-'Z'-1
  83.         inc     eax
  84.         rep     stosb
  85.         mov     byte [edi-'a'+'_'], 0
  86.         mov     cl, 'z'-'a'+1
  87.         dec     eax
  88.         rep     stosb
  89.         mov     cl, 'А'-'z'-1
  90.         inc     eax
  91.         rep     stosb
  92.         mov     cl, 'п'-'А'+1
  93.         dec     eax
  94.         rep     stosb
  95.         mov     cl, 'р'-'п'-1
  96.         inc     eax
  97.         rep     stosb
  98.         mov     cl, 'ё'-'р'+1
  99.         dec     eax
  100.         rep     stosb
  101.         mov     cl, 256-'ё'-1
  102.         inc     eax
  103.         rep     stosb
  104.         mov     edi, SearchStringEditBuf
  105.         mov     eax, SearchStringEditBuf.length
  106.         stosd
  107.         xor     eax, eax
  108.         stosd
  109.         stosd
  110.         stosb
  111.         push    68
  112.         pop     eax
  113.         push    11
  114.         pop     ebx
  115.         int     0x40
  116.         call    init_console
  117.         call    draw_window
  118.         push    66
  119.         pop     eax
  120.         push    1
  121.         pop     ebx
  122.         mov     ecx, ebx
  123.         int     40h     ; set keyboard mode to scancodes
  124.         mov     eax, 200
  125.         mov     [panel1_nfa], eax
  126.         mov     [panel2_nfa], eax
  127.         mov     ecx, 200*4 + 32 + 200*304
  128.         call    pgalloc
  129.         mov     [panel1_files], eax
  130.         call    pgalloc
  131.         mov     [panel2_files], eax
  132.         test    eax, eax
  133.         jz      exit
  134.         xor     eax, eax
  135.         cmp     [panel1_files], eax
  136.         jz      exit
  137.         mov     [panel1_hPlugin], eax
  138.         mov     [panel1_parents], eax
  139.         mov     [panel1_parents_sz], eax
  140.         mov     [panel1_parents_alloc], eax
  141.         mov     [panel2_hPlugin], eax
  142.         mov     [panel2_parents], eax
  143.         mov     [panel2_parents_sz], eax
  144.         mov     [panel2_parents_alloc], eax
  145.         mov     [panel1_sortmode], al   ; sort by name
  146.         mov     [panel2_sortmode], al
  147.         mov     al, 2                   ; "средний" формат
  148.         mov     [panel1_colmode], eax
  149.         mov     [panel2_colmode], eax
  150.         mov     [num_screens], 1
  151.         mov     ecx, 0x1000
  152.         call    pgalloc
  153.         mov     [screens], eax
  154.         test    eax, eax
  155.         jz      exit
  156.         mov     ecx, panels_vtable
  157.         mov     [eax], ecx
  158.         mov     [active_screen_vtable], ecx
  159.         mov     [active_screen_keybar], keybar_panels
  160. ; load libini.obj and kfar.ini
  161.         mov     eax, libini_name
  162.         mov     esi, ini_import
  163.         push    8
  164.         pop     ebp     ; we use version 8 of libini
  165.         call    load_dll_and_import
  166.         test    eax, eax
  167.         jnz     .noini
  168.         mov     edi, app_path
  169.         or      ecx, -1
  170.         repnz   scasb
  171.         mov     dword [edi-1], '.ini'
  172.         mov     byte [edi+3], 0
  173.         push    1
  174.         push    dword aConfirmDelete
  175.         push    dword aConfirmations
  176.         push    dword app_path
  177.         call    [ini.get_int]
  178.         mov     [bConfirmDelete], al
  179.         push    0
  180.         push    dword aConfirmDeleteIncomplete
  181.         push    dword aConfirmations
  182.         push    dword app_path
  183.         call    [ini.get_int]
  184.         mov     [bConfirmDeleteIncomplete], al
  185.         push    2
  186.         push    aLeftViewMode
  187.         push    aPanels
  188.         push    app_path
  189.         call    [ini.get_int]
  190.         cmp     eax, 1
  191.         jb      @f
  192.         cmp     eax, 4
  193.         ja      @f
  194.         mov     [panel1_colmode], eax
  195. @@:
  196.         push    2
  197.         push    aRightViewMode
  198.         push    aPanels
  199.         push    app_path
  200.         call    [ini.get_int]
  201.         cmp     eax, 1
  202.         jb      @f
  203.         cmp     eax, 4
  204.         ja      @f
  205.         mov     [panel2_colmode], eax
  206. @@:
  207.         push    0
  208.         push    aLeftSortMode
  209.         push    aPanels
  210.         push    app_path
  211.         call    [ini.get_int]
  212.         cmp     eax, 14
  213.         jae     @f
  214.         mov     [panel1_sortmode], al
  215. @@:
  216.         push    0
  217.         push    aRightSortMode
  218.         push    aPanels
  219.         push    app_path
  220.         call    [ini.get_int]
  221.         cmp     eax, 14
  222.         jae     @f
  223.         mov     [panel2_sortmode], al
  224. @@:
  225.         push    nullstr
  226.         push    512
  227.         push    saved_file_name
  228.         push    aEolStyle
  229.         push    aEditor
  230.         push    app_path
  231.         call    [ini.get_str]
  232.         mov     cl, edit.eol_dos
  233.         mov     al, [saved_file_name]
  234.         or      al, 20h
  235.         cmp     al, 'd'
  236.         jz      @f
  237.         mov     cl, edit.eol_mac
  238.         cmp     al, 'm'
  239.         jz      @f
  240.         mov     cl, edit.eol_unix
  241. @@:
  242.         mov     [EditEOLStyle], cl
  243.         mov     ecx, 0x1000
  244.         call    xpgalloc
  245.         test    eax, eax
  246.         jz      .skip_assoc
  247.         mov     [associations], eax
  248.         push    enum_associations_callback
  249.         push    aAssociations
  250.         push    app_path
  251.         call    [ini.enum_keys]
  252. .skip_assoc:
  253.         xor     ebp, ebp
  254.         xor     esi, esi
  255. .shortcut_loop:
  256.         mov     edi, saved_file_name
  257.         push    dword nullstr
  258.         push    512
  259.         push    edi
  260.         push    dword aShortcut
  261.         push    dword aFolderShortcuts
  262.         push    dword app_path
  263.         call    [ini.get_str]
  264.         cmp     byte [edi], 0
  265.         jz      .shortcut_cont
  266.         or      ecx, -1
  267.         xor     eax, eax
  268.         repnz   scasb
  269.         not     ecx
  270.         cmp     ecx, 2
  271.         jz      @f
  272.         cmp     byte [edi-2], '/'
  273.         jnz     @f
  274.         mov     byte [edi-2], 0
  275.         dec     ecx
  276. @@:
  277.         mov     al, [aShortcut.d]
  278.         push    esi
  279.         inc     esi
  280.         mov     [FolderShortcuts+(eax-'0')*4], esi
  281.         lea     esi, [esi+ecx-1]
  282.         push    esi
  283.         and     esi, 0xFFF
  284.         cmp     esi, ecx
  285.         pop     esi
  286.         ja      .norealloc
  287.         mov     edx, ebp
  288.         mov     ecx, esi
  289.         call    xpgrealloc
  290.         test    eax, eax
  291.         jnz     @f
  292.         pop     esi
  293.         mov     edi, FolderShortcuts
  294.         mov     ecx, 10
  295.         rep     stosd
  296.         jmp     .skip_shortcuts
  297. @@:
  298.         mov     ebp, eax
  299. .norealloc:
  300.         pop     edi
  301.         add     edi, ebp
  302.         mov     ecx, saved_file_name
  303. @@:
  304.         mov     al, [ecx]
  305.         inc     ecx
  306.         stosb
  307.         test    al, al
  308.         jnz     @b
  309. .shortcut_cont:
  310.         inc     [aShortcut.d]
  311.         cmp     [aShortcut.d], '9'
  312.         jbe     .shortcut_loop
  313.         mov     esi, FolderShortcuts
  314.         mov     ecx, 10
  315.         dec     ebp
  316. .l3:
  317.         lodsd
  318.         test    eax, eax
  319.         jz      @f
  320.         add     [esi-4], ebp
  321. @@:
  322.         loop    .l3
  323. .skip_shortcuts:
  324. ; load plugins
  325.         push    enum_plugins_callback
  326.         push    aPlugins
  327.         push    app_path
  328.         call    [ini.enum_keys]
  329. ; calculate info for editor
  330.         xor     ebx, ebx
  331.         mov     ecx, [num_plugins]
  332.         mov     esi, [plugins]
  333. @@:
  334.         dec     ecx
  335.         js      @f
  336.         mov     [esi+PluginInfo.EditInfoOffs], ebx
  337.         add     ebx, [esi+PluginInfo.EditInfoSize]
  338.         jnc     @f
  339.         sbb     ebx, ebx
  340. @@:
  341. ; поскольку размер блока в редакторе ограничен, то и размер памяти, резервируемой для плагинов, ограничен
  342. ; 512 - грубая верхняя оценка, гарантирующая работу редактора, реально плагины должны требовать меньше
  343.         cmp     ebx, 512
  344.         jb      @f
  345.         or      ebx, -1
  346.         mov     [EditPlugInfo], ebx     ; disable plugins for editor
  347.         push    ContinueBtn
  348.         push    1
  349.         push    EditConfigErr_ptr
  350.         push    2
  351.         call    SayErr
  352. @@:
  353.         add     ebx, 3
  354.         and     ebx, not 3
  355.         mov     [EditPlugInfo], ebx
  356. .noini:
  357.         mov     eax, [EditPlugInfo]
  358.         add     eax, editor_line.plugdata
  359.         imul    eax, max_height
  360.         add     eax, editor_data.basesize + 0xFFF
  361.         shr     eax, 12
  362.         mov     [EditDataSize], eax
  363.         mov     esi, def_left_dir
  364.         mov     edi, panel1_dir
  365. @@:
  366.         lodsb
  367.         stosb
  368.         test    al, al
  369.         jnz     @b
  370.         mov     esi, def_right_dir
  371.         mov     edi, panel2_dir
  372. @@:
  373.         lodsb
  374.         stosb
  375.         test    al, al
  376.         jnz     @b
  377.         call    draw_keybar
  378.         call    draw_cmdbar
  379.         mov     [prev_dir], 0
  380.         mov     ebp, panel1_data
  381.         call    calc_colwidths
  382.         call    read_folder
  383.         call    draw_panel
  384.         mov     [bSilentFolderMode], 1
  385.         mov     ebp, panel2_data
  386.         call    calc_colwidths
  387.         call    read_folder
  388.         call    draw_panel
  389. event:
  390.         call    get_event
  391.         dec     eax
  392.         jz      redraw
  393.         dec     eax
  394.         jz      key
  395. ; button - we have only one button, close
  396. exit:
  397. ; close all screens
  398. @@:
  399.         mov     ecx, [num_screens]
  400.         mov     eax, [screens]
  401.         mov     ebp, [eax+ecx*8-4]
  402.         mov     eax, [eax+ecx*8-8]
  403.         push    ebp
  404.         call    [eax+screen_vtable.OnExit]
  405.         pop     ecx
  406.         call    pgfree
  407.         dec     [num_screens]
  408.         jnz     @b
  409. ; unload all plugins
  410.         mov     ecx, [num_plugins]
  411.         imul    esi, ecx, PluginInfo.size
  412.         add     esi, [plugins]
  413. .unload:
  414.         dec     ecx
  415.         js      .unload_done
  416.         sub     esi, PluginInfo.size
  417.         push    ecx esi
  418.         call    [esi+PluginInfo.unload]
  419.         pop     esi ecx
  420.         jmp     .unload
  421. .unload_done:
  422.         cmp     [ini.set_int], aIniSetInt
  423.         jz      .nosave
  424.         push    [panel1_colmode]
  425.         push    aLeftViewMode
  426.         push    aPanels
  427.         push    app_path
  428.         call    [ini.set_int]
  429.         push    [panel2_colmode]
  430.         push    aRightViewMode
  431.         push    aPanels
  432.         push    app_path
  433.         call    [ini.set_int]
  434.         movzx   eax, [panel1_sortmode]
  435.         push    eax
  436.         push    aLeftSortMode
  437.         push    aPanels
  438.         push    app_path
  439.         call    [ini.set_int]
  440.         movzx   eax, [panel2_sortmode]
  441.         push    eax
  442.         push    aRightSortMode
  443.         push    aPanels
  444.         push    app_path
  445.         call    [ini.set_int]
  446. .nosave:
  447. if CHECK_FOR_LEAKS
  448.         mov     ecx, [panel1_files]
  449.         call    pgfree
  450.         mov     ecx, [panel2_files]
  451.         call    pgfree
  452.         mov     ecx, [screens]
  453.         call    pgfree
  454.         mov     ecx, [associations]
  455.         call    pgfree
  456.         mov     ecx, [console_data_ptr]
  457.         call    pgfree
  458.         mov     ecx, [MemForImage]
  459.         call    pgfree
  460.         mov     esi, FolderShortcuts
  461.         push    10
  462.         pop     ecx
  463. @@:
  464.         lodsd
  465.         test    eax, eax
  466.         jnz     @f
  467.         loop    @b
  468.         jmp     .nofreefs
  469. @@:
  470.         mov     ecx, eax
  471.         call    pgfree
  472.         mov     ecx, [plugins]
  473.         call    pgfree
  474.         mov     ecx, [panel1_parents]
  475.         call    pgfree
  476.         mov     ecx, [panel2_parents]
  477.         call    pgfree
  478. .nofreefs:
  479.         mov     eax, [numallocatedregions]
  480.         test    eax, eax
  481.         jz      @f
  482.         mov     edi, allocatedregions
  483.         int3
  484.         jmp     $
  485. @@:
  486. end if
  487.         or      eax, -1
  488.         int     40h
  489.  
  490. get_event:
  491.         push    ebx
  492.         mov     ebx, [idle_interval]
  493.         cmp     ebx, -1
  494.         jz      .infinite
  495.         push    23
  496.         pop     eax
  497.         int     40h
  498.         pop     ebx
  499.         test    eax, eax
  500.         jnz     .ret
  501.         mov     ebp, [active_screen_data]
  502.         mov     eax, [active_screen_vtable]
  503.         mov     eax, [eax+screen_vtable.OnIdle]
  504.         test    eax, eax
  505.         jz      get_event
  506.         call    eax
  507.         jmp     get_event
  508. .infinite:
  509.         pop     ebx
  510.         push    10
  511.         pop     eax
  512.         int     40h
  513. .ret:
  514.         ret
  515.  
  516. redraw:
  517. ; query kbd state from OS
  518.         mov     al, 66
  519.         push    3
  520.         pop     ebx
  521.         int     0x40
  522.         and     eax, 0x3F
  523.         cmp     al, [ctrlstate]
  524.         mov     [ctrlstate], al
  525.         jz      @f
  526.         call    draw_keybar
  527. @@:
  528.         mov     al, 9
  529.         mov     ebx, procinfo
  530.         or      ecx, -1
  531.         int     40h
  532. ; test if rolled up
  533. ; height of rolled up window is [skinh]+3
  534.         mov     eax, [ebx+46]
  535.         sub     eax, [skinh]
  536.         cmp     eax, 5
  537.         ja      @f
  538.         mov     al, 12
  539.         push    1
  540.         pop     ebx
  541.         int     0x40
  542.         xor     eax, eax
  543. ; ebx, ecx, edi are ignored by function 0 after first redraw
  544.         mov     edx, 0x53000000
  545.         int     0x40
  546.         mov     al, 12
  547.         inc     ebx
  548.         int     0x40
  549.         jmp     event
  550. @@:
  551.         xor     ecx, ecx
  552.         mov     eax, [ebx+42]
  553.         mov     [wnd_width], eax
  554.         sub     eax, 5*2-1
  555.         jae     @f
  556.         xor     eax, eax
  557. @@:
  558.         cdq
  559.         mov     esi, font_width
  560.         div     esi
  561.         cmp     eax, min_width
  562.         jae     @f
  563.         mov     al, min_width
  564.         mov     ch, 1
  565. @@:
  566.         cmp     eax, max_width
  567.         jbe     @f
  568.         mov     eax, max_width
  569.         mov     ch, 1
  570. @@:
  571.         cmp     eax, [cur_width]
  572.         mov     [cur_width], eax
  573.         setnz   cl
  574.         or      cl, ch
  575.         test    edx, edx
  576.         mov     [fill_width], edx
  577.         setnz   ch
  578.         mov     eax, [ebx+46]
  579.         mov     [wnd_height], eax
  580.         sub     eax, [skinh]
  581.         sub     eax, 5-1
  582.         jns     @f
  583.         xor     eax, eax
  584. @@:
  585.         cdq
  586.         mov     esi, font_height
  587.         div     esi
  588.         cmp     eax, min_height
  589.         jae     @f
  590.         mov     al, min_height
  591.         mov     cl, 1
  592. @@:
  593.         cmp     eax, max_height
  594.         jbe     @f
  595.         mov     eax, max_height
  596.         mov     cl, 1
  597. @@:
  598.         mov     [fill_height], edx
  599.         cmp     eax, [cur_height]
  600.         mov     [cur_height], eax
  601.         jnz     .resize
  602.         test    cl, cl
  603.         jnz     .resize
  604.         test    edx, edx
  605.         setnz   cl
  606.         or      cl, ch
  607.         jz      @f
  608.         test    byte [ebx+70], 1
  609.         jnz     @f
  610. .resize:
  611.         push    67
  612.         pop     eax
  613.         or      ebx, -1
  614.         or      ecx, -1
  615.         mov     edx, [cur_width]
  616.         imul    edx, font_width
  617.         add     edx, 5*2-1
  618.         mov     esi, [cur_height]
  619.         imul    esi, font_height
  620.         add     esi, [skinh]
  621.         add     esi, 5-1
  622.         int     40h
  623. .resize_draw:
  624.         mov     ecx, [MemForImage]
  625.         call    pgfree
  626.         and     [MemForImage], 0
  627.         call    init_console
  628. ;        call    draw_window
  629.         call    draw_keybar
  630.         mov     ebp, [active_screen_data]
  631.         mov     eax, [active_screen_vtable]
  632.         mov     [cursor_size], cursor_normal_size
  633.         call    dword [eax+screen_vtable.OnRedraw]
  634.         jmp     event
  635. @@:
  636.         call    draw_window
  637.         jmp     event
  638. alt_f9:
  639.         cmp     [saved_width], -1
  640.         jz      @f
  641.         mov     eax, [saved_width]
  642.         mov     [cur_width], eax
  643.         or      [saved_width], -1
  644.         mov     eax, [saved_height]
  645.         mov     [cur_height], eax
  646.         or      [saved_height], -1
  647.         jmp     redraw.resize
  648. @@:
  649.         push    48
  650.         pop     eax
  651.         push    5
  652.         pop     ebx
  653.         int     0x40
  654.         push    eax
  655.         sub     eax, [esp+2]
  656.         inc     eax
  657.         movzx   eax, ax
  658.         sub     eax, 10
  659.         xor     edx, edx
  660.         mov     ecx, font_width
  661.         div     ecx
  662.         xchg    [cur_width], eax
  663.         mov     [saved_width], eax
  664.         mov     eax, ebx
  665.         shr     ebx, 16
  666.         sub     eax, ebx
  667.         sub     eax, 5-1
  668.         sub     eax, [skinh]
  669.         xor     edx, edx
  670.         mov     ecx, font_height
  671.         div     ecx
  672.         xchg    [cur_height], eax
  673.         mov     [saved_height], eax
  674.         mov     ecx, ebx
  675.         pop     ebx
  676.         shr     ebx, 16
  677.         mov     edx, [cur_width]
  678.         imul    edx, font_width
  679.         add     edx, 5*2-1
  680.         mov     esi, [cur_height]
  681.         imul    esi, font_height
  682.         add     esi, [skinh]
  683.         add     esi, 4
  684.         push    67
  685.         pop     eax
  686.         int     0x40
  687.         jmp     redraw.resize_draw
  688. key:
  689.         mov     al, 2
  690.         int     40h
  691.         test    al, al
  692.         jnz     event
  693.         xchg    al, ah
  694.         cmp     al, 0xE0
  695.         jnz     @f
  696.         mov     [bWasE0], 1
  697.         jmp     event
  698. @@:
  699.         xchg    ah, [bWasE0]
  700.         mov     ebp, [active_screen_data]
  701.         mov     edx, [active_screen_vtable]
  702.         cmp     al, 0x1D
  703.         jz      .ctrl_down
  704.         cmp     al, 0x9D
  705.         jz      .ctrl_up
  706.         cmp     al, 0x2A
  707.         jz      .lshift_down
  708.         cmp     al, 0xAA
  709.         jz      .lshift_up
  710.         cmp     al, 0x36
  711.         jz      .rshift_down
  712.         cmp     al, 0xB6
  713.         jz      .rshift_up
  714.         cmp     al, 0x38
  715.         jz      .alt_down
  716.         cmp     al, 0xB8
  717.         jz      .alt_up
  718.         call    [edx+screen_vtable.OnKey]
  719.         jmp     event
  720. .ctrl_down:
  721.         test    ah, ah
  722.         jnz     .rctrl_down
  723.         or      [ctrlstate], 4
  724.         jmp     .keybar
  725. .rctrl_down:
  726.         or      [ctrlstate], 8
  727.         jmp     .keybar
  728. .ctrl_up:
  729.         test    ah, ah
  730.         jnz     .rctrl_up
  731.         and     [ctrlstate], not 4
  732.         jmp     .keybar
  733. .rctrl_up:
  734.         and     [ctrlstate], not 8
  735. .keybar:
  736.         call    draw_keybar
  737.         call    draw_image
  738. @@:     jmp     event
  739. .lshift_down:
  740. ; ignore E0 2A sequence
  741. ; e.g. arrow keys with NumLock on generate sequence E0 2A E0 xx / E0 xx+80 E0 AA
  742. ; where xx is scancode, so we can safely ignore E0 2A
  743.         test    ah, ah
  744.         jnz     @b
  745.         or      [ctrlstate], 1
  746.         jmp     .keybar
  747. .lshift_up:
  748. ; ignore E0 AA sequence
  749.         test    ah, ah
  750.         jnz     @b
  751.         and     [ctrlstate], not 1
  752.         jmp     .keybar
  753. .rshift_down:
  754.         or      [ctrlstate], 2
  755.         jmp     .keybar
  756. .rshift_up:
  757.         and     [ctrlstate], not 2
  758.         jmp     .keybar
  759. .alt_down:
  760.         test    ah, ah
  761.         jnz     .ralt_down
  762.         or      [ctrlstate], 0x10
  763.         jmp     .keybar
  764. .ralt_down:
  765.         or      [ctrlstate], 0x20
  766.         jmp     .keybar
  767. .alt_up:
  768.         test    ah, ah
  769.         jnz     .ralt_up
  770.         and     [ctrlstate], not 0x10
  771.         jmp     .keybar
  772. .ralt_up:
  773.         and     [ctrlstate], not 0x20
  774.         jmp     .keybar
  775.  
  776. process_ctrl_keys:
  777.         cmp     byte [esi], 0
  778.         jz      .done
  779.         push    ecx
  780.         cmp     al, [esi]
  781.         jz      .check
  782. .cont:
  783.         pop     ecx
  784.         add     esi, 8
  785.         jmp     process_ctrl_keys
  786. .done:
  787.         stc
  788.         ret
  789. .check:
  790.         mov     cl, 0
  791.         call    .check_ctrlkey
  792.         jc      .cont
  793.         mov     cl, 2
  794.         call    .check_ctrlkey
  795.         jc      .cont
  796.         mov     cl, 4
  797.         call    .check_ctrlkey
  798.         jc      .cont
  799.         pop     ecx
  800.         call    dword [esi+4]
  801.         clc
  802.         ret
  803. .check_ctrlkey:
  804.         push    eax edx
  805.         movzx   edx, [ctrlstate]
  806.         shr     edx, cl
  807.         add     cl, cl
  808.         movzx   eax, word [esi+2]
  809.         shr     eax, cl
  810.         and     eax, 15
  811.         cmp     al, ctrlkey_tests_num
  812.         jae     .fail
  813.         xchg    eax, edx
  814.         and     al, 3
  815.         call    [ctrlkey_tests + edx*4]
  816.         cmp     al, 1
  817.         pop     edx eax
  818.         ret
  819. .fail:
  820.         stc
  821.         pop     edx eax
  822.         ret
  823.  
  824. ctrlkey_test0:
  825.         test    al, al
  826.         setz    al
  827.         ret
  828. ctrlkey_test1:
  829.         test    al, al
  830.         setnp   al
  831.         ret
  832. ctrlkey_test2:
  833.         cmp     al, 3
  834.         setz    al
  835.         ret
  836. ctrlkey_test3:
  837.         cmp     al, 1
  838.         setz    al
  839.         ret
  840. ctrlkey_test4:
  841.         cmp     al, 2
  842.         setz    al
  843.         ret
  844.  
  845. enum_associations_callback:
  846. ; LongBool __stdcall callback(f_name,sec_name,key_name,key_value);
  847. ; [esp+4] = f_name, [esp+8] = sec_name, [esp+12] = key_name, [esp+16] = key_value
  848.         mov     esi, [esp+12]
  849.         mov     edi, esi
  850. @@:
  851.         lodsb
  852.         test    al, al
  853.         jnz     @b
  854.         sub     esi, edi        ; esi = size of key name
  855.         mov     eax, [esp+16]
  856. @@:
  857.         inc     esi
  858.         inc     eax
  859.         cmp     byte [eax-1], 0
  860.         jnz     @b
  861. ; esi = total size of entry
  862.         push    esi
  863.         add     esi, [associations_size]
  864.         mov     ecx, [associations_allocated]
  865. @@:
  866.         cmp     esi, ecx
  867.         jbe     @f
  868.         add     ecx, ecx
  869.         jmp     @b
  870. @@:
  871.         pop     esi
  872.         cmp     [associations_allocated], ecx
  873.         jz      @f
  874.         mov     [associations_allocated], ecx
  875.         mov     edx, [associations]
  876.         call    xpgrealloc
  877.         mov     [associations], eax
  878.         test    eax, eax
  879.         jz      .err
  880. @@:
  881.         mov     eax, esi
  882.         mov     esi, edi
  883.         mov     edi, [associations]
  884.         add     edi, [associations_size]
  885.         dec     edi
  886.         add     [associations_size], eax
  887. @@:
  888.         lodsb
  889.         stosb
  890.         test    al, al
  891.         jnz     @b
  892.         mov     esi, [esp+16]
  893. @@:
  894.         lodsb
  895.         stosb
  896.         test    al, al
  897.         jnz     @b
  898. .ret:
  899.         mov     al, 1
  900.         ret     16
  901. .err:
  902.         mov     ecx, edx
  903.         call    pgfree
  904.         xor     eax, eax
  905.         ret     16
  906.  
  907. enum_plugins_callback:
  908. ; LongBool __stdcall callback(f_name,sec_name,key_name,key_value);
  909. ; [esp+4] = f_name, [esp+8] = sec_name, [esp+12] = key_name, [esp+16] = key_value
  910.         mov     esi, [esp+16]
  911.         cmp     byte [esi], '/'
  912.         jz      .absolute
  913. ; convert path to absolute
  914.         mov     edi, execdata
  915. @@:
  916.         cmp     edi, execdata+1024
  917.         jae     .overflow
  918.         lodsb
  919.         stosb
  920.         test    al, al
  921.         jnz     @b
  922.         mov     edi, saved_file_name
  923.         mov     [esp+16], edi
  924.         mov     esi, app_path
  925.         push    esi
  926.         xor     ecx, ecx
  927. @@:
  928.         lodsb
  929.         test    al, al
  930.         jz      @f
  931.         cmp     al, '/'
  932.         jnz     @b
  933.         mov     ecx, esi
  934.         jmp     @b
  935. @@:
  936.         pop     esi
  937.         sub     ecx, esi
  938.         push    edi
  939.         add     edi, ecx
  940.         cmp     edi, saved_file_name+1024
  941.         pop     edi
  942.         ja      .overflow
  943.         rep     movsb
  944.         mov     esi, execdata
  945. .z:
  946.         cmp     word [esi], '.'
  947.         jz      .ret
  948.         cmp     word [esi], './'
  949.         jnz     @f
  950.         add     esi, 2
  951.         jmp     .z
  952. @@:
  953.         cmp     word [esi], '..'
  954.         jnz     .c
  955.         cmp     byte [esi+2], 0
  956.         jz      .ret
  957.         cmp     byte [esi+2], '/'
  958.         jnz     .c
  959.         add     esi, 3
  960. @@:
  961.         dec     edi
  962.         cmp     edi, saved_file_name
  963.         jbe     .ret
  964.         cmp     byte [edi-1], '/'
  965.         jnz     @b
  966.         jmp     .z
  967. .c:
  968.         cmp     edi, saved_file_name+1024
  969.         jae     .overflow
  970.         lodsb
  971.         stosb
  972.         test    al, al
  973.         jnz     .c
  974.         jmp     .absolute
  975. .overflow:
  976.         mov     esi, execdata
  977.         mov     byte [esi+1023], 0
  978.         call    load_dll_and_import.big
  979. .ret:
  980.         mov     al, 1
  981.         ret     16
  982. .absolute:
  983. ; allocate space for plugin info
  984.         mov     eax, [num_plugins]
  985.         inc     eax
  986.         mov     [num_plugins], eax
  987.         imul    ecx, eax, PluginInfo.size
  988.         cmp     ecx, [alloc_plugins]
  989.         jbe     .norealloc
  990.         mov     edx, [plugins]
  991.         call    xpgrealloc
  992.         test    eax, eax
  993.         jnz     @f
  994. .dec_ret:
  995.         dec     [num_plugins]
  996.         jmp     .ret
  997. @@:
  998.         mov     [plugins], eax
  999.         lea     eax, [ecx+0xFFF]
  1000.         and     eax, not 0xFFF
  1001.         mov     [alloc_plugins], eax
  1002. .norealloc:
  1003.         mov     esi, [plugins]
  1004.         lea     esi, [esi+ecx-PluginInfo.size]
  1005. ; load plugin DLL
  1006.         or      ebp, -1
  1007.         mov     eax, [esp+16]
  1008.         call    load_dll_and_import.do
  1009.         test    eax, eax
  1010.         jnz     .dec_ret
  1011. ; find exported functions
  1012.         mov     eax, aVersion
  1013.         call    load_dll_and_import.find_exported_function
  1014.         jnc     @f
  1015.         xor     eax, eax
  1016. @@:
  1017. MIN_INTERFACE_VER = 3
  1018. MAX_INTERFACE_VER = 3
  1019.         cmp     eax, MIN_INTERFACE_VER
  1020.         jb      @f
  1021.         cmp     eax, MAX_INTERFACE_VER
  1022.         jbe     .version_ok
  1023. @@:
  1024.         push    aIncompatibleVersion
  1025. .cantload:
  1026.         push    dword [esp+4+16]
  1027.         push    aCannotLoadPlugin
  1028.         mov     eax, esp
  1029.         push    ContinueBtn
  1030.         push    1
  1031.         push    eax
  1032.         push    3
  1033.         call    SayErr
  1034.         add     esp, 12
  1035.         jmp     .dec_ret
  1036. .version_ok:
  1037.         mov     edi, esi
  1038.         mov     esi, plugin_exported
  1039. .import:
  1040.         lodsd
  1041.         test    eax, eax
  1042.         jz      .import_done
  1043.         call    load_dll_and_import.find_exported_function
  1044.         jnc     @f
  1045.         mov     eax, [esi-4+plugin_exported_default-plugin_exported]
  1046. @@:
  1047.         stosd
  1048.         jmp     .import
  1049. .import_done:
  1050. ; initialize plugin
  1051.         mov     eax, aPluginLoad
  1052.         call    load_dll_and_import.find_exported_function
  1053.         jc      .ok
  1054.         push    kfar_info
  1055.         call    eax
  1056.         cmp     eax, 1
  1057.         jb      .ok
  1058.         ja      .dec_ret
  1059.         push    aInitFailed
  1060.         jmp     .cantload
  1061. .ok:
  1062.         mov     al, 1
  1063.         ret     16
  1064.  
  1065. plugin_unload_default:
  1066.         ret
  1067.  
  1068. OpenFilePlugin_default:
  1069.         xor     eax, eax
  1070.         ret     28
  1071. GetFiles_default:
  1072.         xor     eax, eax
  1073.         ret     20
  1074.  
  1075. ClosePlugin_default:
  1076.         ret     4
  1077.  
  1078. GetOpenPluginInfo_default:
  1079.         ret     8
  1080.  
  1081. SetFolder_default:
  1082. open_default:
  1083.         xor     eax, eax
  1084.         ret     12
  1085.  
  1086. new_screen:
  1087. ; in: ecx=sizeof(screen data), edx->vtable
  1088. ; out: ebp=pointer or NULL, eax!=0 if successful
  1089. ; destroys ebx,ecx
  1090.         call    xpgalloc
  1091.         test    eax, eax
  1092.         jnz     @f
  1093.         ret
  1094. @@:
  1095.         mov     ebp, eax
  1096.         mov     eax, [screens]
  1097.         mov     ecx, [num_screens]
  1098.         inc     ecx
  1099.         shl     ecx, 3
  1100.         test    ecx, 0xFFF
  1101.         jnz     .norealloc
  1102.         push    edx
  1103.         mov     edx, eax
  1104.         call    xpgrealloc
  1105.         pop     edx
  1106.         test    eax, eax
  1107.         jnz     @f
  1108.         mov     ecx, ebp
  1109.         call    pgfree
  1110.         xor     eax, eax
  1111.         ret
  1112. @@:
  1113.         mov     [screens], eax
  1114. .norealloc:
  1115.         inc     [num_screens]
  1116.         mov     [eax+ecx-8], edx
  1117.         mov     [eax+ecx-4], ebp
  1118.         mov     eax, [num_screens]
  1119.         dec     eax
  1120.         mov     [active_screen], eax
  1121.         mov     [active_screen_vtable], edx
  1122.         mov     [active_screen_data], ebp
  1123.         or      [idle_interval], -1
  1124.         mov     edx, [edx+screen_vtable.keybar]
  1125.         test    edx, edx
  1126.         jz      @f
  1127.         mov     [active_screen_keybar], edx
  1128. @@:
  1129.         jmp     draw_keybar
  1130.  
  1131. next_screen:
  1132.         mov     eax, [active_screen]
  1133.         inc     eax
  1134.         cmp     eax, [num_screens]
  1135.         jnz     @f
  1136.         xor     eax, eax
  1137. @@:     mov     [active_screen], eax
  1138.         jmp     change_screen
  1139.  
  1140. delete_active_screen:
  1141.         mov     edi, [screens]
  1142.         mov     eax, [active_screen]
  1143.         shl     eax, 3
  1144.         add     edi, eax
  1145.         push    dword [edi+4]
  1146.         lea     esi, [edi+8]
  1147.         mov     ecx, [num_screens]
  1148.         sub     ecx, [active_screen]
  1149.         dec     ecx
  1150.         add     ecx, ecx
  1151.         rep     movsd
  1152.         dec     [num_screens]
  1153.         mov     ecx, [num_screens]
  1154.         shl     ecx, 3
  1155.         test    ecx, 0xFFF
  1156.         jnz     .norealloc
  1157.         mov     edx, [screens]
  1158.         call    pgrealloc               ; must succeed, because we decrease size
  1159.         mov     [screens], eax
  1160. .norealloc:
  1161.         pop     ecx
  1162.         call    pgfree
  1163.         dec     [active_screen]
  1164.  
  1165. change_screen:
  1166.         pusha
  1167.         or      [idle_interval], -1
  1168.         mov     eax, [active_screen]
  1169.         mov     esi, [screens]
  1170.         mov     ebp, [esi+eax*8+4]
  1171.         mov     eax, [esi+eax*8]
  1172.         push    eax ebp
  1173.         mov     eax, [eax+screen_vtable.OnActivate]
  1174.         test    eax, eax
  1175.         jz      @f
  1176.         call    eax
  1177. @@:
  1178.         pop     ebp eax
  1179.         mov     [active_screen_vtable], eax
  1180.         mov     [active_screen_data], ebp
  1181.         mov     edx, [eax+screen_vtable.keybar]
  1182.         test    edx, edx
  1183.         jz      @f
  1184.         mov     [active_screen_keybar], edx
  1185. @@:
  1186.         call    draw_keybar
  1187.         mov     [cursor_size], cursor_normal_size
  1188.         call    [eax+screen_vtable.OnRedraw]
  1189.         popa
  1190.         ret
  1191.  
  1192. F12:
  1193.         mov     eax, [cur_width]
  1194.         add     eax, 8
  1195.         mov     esi, eax
  1196.         mul     [num_screens]
  1197.         mov     ecx, eax
  1198.         call    xpgalloc
  1199.         test    eax, eax
  1200.         jnz     @f
  1201.         ret
  1202. @@:
  1203.         mov     ebx, eax
  1204.         mov     edi, eax
  1205.         xor     ecx, ecx
  1206. .next:
  1207.         xor     eax, eax
  1208.         stosd
  1209.         inc     ecx
  1210.         cmp     ecx, [num_screens]
  1211.         jz      @f
  1212.         lea     eax, [edi+esi-4]
  1213.         mov     dword [edi-4], eax
  1214. @@:
  1215.         xor     eax, eax
  1216.         stosd
  1217.         dec     ecx
  1218.         jz      @f
  1219.         lea     eax, [edi-8]
  1220.         sub     eax, esi
  1221.         mov     dword [edi-4], eax
  1222. @@:
  1223.         mov     al, '&'
  1224.         stosb
  1225.         cmp     ecx, 36
  1226.         jae     .noletter
  1227.         lea     eax, [ecx+'0']
  1228.         cmp     al, '9'
  1229.         jbe     @f
  1230.         add     al, 7
  1231. @@:
  1232.         stosb
  1233.         mov     al, '.'
  1234.         stosb
  1235.         jmp     .letter_done
  1236. .noletter:
  1237.         mov     al, ' '
  1238.         stosb
  1239.         stosb
  1240. .letter_done:
  1241.         mov     al, ' '
  1242.         stosb
  1243.         pushad
  1244.         mov     eax, [screens]
  1245.         mov     ebp, [eax+ecx*8+4]
  1246.         mov     eax, [eax+ecx*8]
  1247.         mov     ecx, [cur_width]
  1248.         sub     ecx, 12
  1249.         call    [eax + screen_vtable.getname]
  1250.         popad
  1251.         sub     edi, 4
  1252.         add     edi, [cur_width]
  1253.         inc     ecx
  1254.         cmp     ecx, [num_screens]
  1255.         jb      .next
  1256.         mov     eax, [active_screen]
  1257.         mul     esi
  1258.         add     eax, ebx
  1259.         push    1
  1260.         push    dword aScreens
  1261.         push    eax
  1262.         call    menu
  1263.         cmp     eax, -1
  1264.         jz      @f
  1265.         sub     eax, ebx
  1266.         div     esi
  1267.         mov     [active_screen], eax
  1268. @@:
  1269.         mov     ecx, ebx
  1270.         call    pgfree
  1271.         jmp     change_screen
  1272.  
  1273. panels_OnKey:
  1274. ; restore screen hidden by quick search box
  1275.         cmp     [bDisplayQuickSearch], 0
  1276.         jz      @f
  1277.         mov     [bDisplayQuickSearch], 0
  1278.         push    0
  1279.         push    QuickSearchDlg
  1280.         call    HideDialogBox
  1281. @@:
  1282.         mov     ebp, [active_panel]
  1283.         mov     ecx, [ebp + panel1_index - panel1_data]
  1284.         mov     edx, [ebp + panel1_start - panel1_data]
  1285.         mov     ebx, [ebp + panel1_colst - panel1_data]
  1286.         add     ebx, edx
  1287.         mov     esi, panels_ctrlkeys
  1288.         call    process_ctrl_keys
  1289.         jc      .nostdkey
  1290.         mov     [bQuickSearchMode], 0
  1291.         ret
  1292. .leaveqsmode:
  1293.         mov     [bQuickSearchMode], 0
  1294.         call    draw_image
  1295.         ret
  1296. .keepqsmode:
  1297.         push    QuickSearchDlg
  1298.         call    ShowDialogBox
  1299.         mov     [bDisplayQuickSearch], 1
  1300.         ret
  1301. .nostdkey:
  1302.         cmp     [bQuickSearchMode], 0
  1303.         jz      .noqsmode
  1304.         test    al, al
  1305.         js      .keepqsmode
  1306.         cmp     al, 40h
  1307.         jae     .leaveqsmode
  1308.         cmp     al, 0Eh
  1309.         jz      .qsbackspace
  1310.         cmp     al, 1Ch
  1311.         jz      .test_enter
  1312.         movzx   eax, al
  1313.         cmp     byte [scan2ascii+eax], 0
  1314.         jz      .leaveqsmode
  1315.         call    get_ascii_char
  1316.         mov     ecx, dword [quick_search_buf + 4]
  1317.         cmp     ecx, quicksearch_maxlen
  1318.         jae     .keepqsmode
  1319.         mov     byte [quick_search_buf + 12 + ecx], al
  1320.         mov     byte [quick_search_buf + 12 + ecx + 1], 0
  1321.         push    ecx
  1322.         call    quick_find
  1323.         pop     ecx
  1324.         jnc     @f
  1325.         mov     byte [quick_search_buf + 12 + ecx], 0
  1326.         jmp     .keepqsmode
  1327. @@:
  1328.         inc     dword [quick_search_buf + 4]
  1329.         sub     ecx, 16
  1330.         jae     @f
  1331.         xor     ecx, ecx
  1332. @@:
  1333.         mov     dword [quick_search_buf + 8], ecx
  1334.         jmp     .keepqsmode
  1335. .qsbackspace:
  1336.         mov     ecx, dword [quick_search_buf + 4]
  1337.         jecxz   .keepqsmode2
  1338.         dec     ecx
  1339.         mov     byte [quick_search_buf + 12 + ecx], 0
  1340.         dec     dword [quick_search_buf + 4]
  1341. .keepqsmode2:
  1342.         jmp     .keepqsmode
  1343. .test_enter:
  1344.         test    [ctrlstate], 0Ch        ; LCtrl or RCtrl pressed?
  1345.         jz      .keepqsmode2
  1346.         test    [ctrlstate], 3          ; Shift pressed?
  1347.         jnz     @f
  1348.         call    quick_find_next
  1349.         jmp     .keepqsmode2
  1350. @@:
  1351.         call    quick_find_prev
  1352.         jmp     .keepqsmode2
  1353. .noqsmode:
  1354. ; handle Alt+<key> combinations for quick search
  1355.         test    [ctrlstate], 30h        ; LAlt or RAlt pressed?
  1356.         jz      .noalt                  ; no => skip
  1357.         test    [ctrlstate], 0Ch        ; LCtrl or RCtrl pressed?
  1358.         jnz     .noalt                  ; yes => skip
  1359.         cmp     al, 40h
  1360.         jae     .noalt
  1361.         movzx   eax, al
  1362.         cmp     byte [scan2ascii+eax], 0
  1363.         jz      .noalt
  1364.         call    get_ascii_char
  1365.         mov     edi, quick_search_buf + 12
  1366.         mov     dword [edi-12], quicksearch_maxlen-1
  1367.         mov     dword [edi-8], 1
  1368.         and     dword [edi-4], 0
  1369.         stosb
  1370.         mov     byte [edi], 0
  1371.         call    quick_find
  1372.         jnc     @f
  1373.         mov     byte [quick_search_buf + 12], 0
  1374.         and     dword [quick_search_buf + 4], 0
  1375. @@:
  1376.         mov     ebx, QuickSearchDlg
  1377.         mov     eax, [ebp + panel1_left - panel1_data]
  1378.         add     eax, 10
  1379.         mov     edx, [cur_width]
  1380.         sub     edx, 21
  1381.         cmp     eax, edx
  1382.         jb      @f
  1383.         mov     eax, edx
  1384. @@:
  1385.         mov     [ebx + dlgtemplate.x], eax
  1386.         mov     eax, [ebp + panel1_top - panel1_data]
  1387.         add     eax, [ebp + panel1_height - panel1_data]
  1388.         mov     edx, [cur_height]
  1389.         sub     edx, 2
  1390.         cmp     eax, edx
  1391.         jb      @f
  1392.         mov     eax, edx
  1393. @@:
  1394.         mov     [ebx + dlgtemplate.y], eax
  1395.         push    ebx
  1396.         call    ShowDialogBox
  1397.         mov     [bQuickSearchMode], 1
  1398.         mov     [bDisplayQuickSearch], 1
  1399. .find_letter_done:
  1400. .noalt:
  1401. .ret:
  1402.         ret
  1403. .up:
  1404.         jecxz   .ret
  1405.         dec     ecx
  1406.         mov     [ebp + panel1_index - panel1_data], ecx
  1407.         cmp     ecx, edx
  1408.         jae     .done_redraw
  1409.         mov     [ebp + panel1_start - panel1_data], ecx
  1410. .done_redraw:
  1411. ;        call    draw_panel
  1412. ;        ret
  1413.         jmp     draw_panel
  1414. .insert:
  1415.         lea     eax, [ecx*4]
  1416.         add     eax, [ebp + panel1_files - panel1_data]
  1417.         mov     eax, [eax]
  1418.         cmp     word [eax+40], '..'
  1419.         jnz     @f
  1420.         cmp     byte [eax+42], 0
  1421.         jz      .insert.down
  1422. @@:
  1423.         xor     byte [eax+303], 1
  1424.         mov     edx, [eax+32]
  1425.         test    byte [eax+303], 1
  1426.         mov     eax, [eax+36]
  1427.         jnz     .insert.increase
  1428.         sub     dword [ebp + panel1_selected_size - panel1_data], edx
  1429.         sbb     dword [ebp + panel1_selected_size+4 - panel1_data], eax
  1430.         dec     [ebp + panel1_selected_num - panel1_data]
  1431.         jmp     .insert.down
  1432. .insert.increase:
  1433.         add     dword [ebp + panel1_selected_size - panel1_data], edx
  1434.         adc     dword [ebp + panel1_selected_size+4 - panel1_data], eax
  1435.         inc     [ebp + panel1_selected_num - panel1_data]
  1436. .insert.down:
  1437.         inc     ecx
  1438.         cmp     ecx, [ebp + panel1_numfiles - panel1_data]
  1439.         jae     .done_redraw
  1440.         jmp     @f
  1441. .down:
  1442.         inc     ecx
  1443.         cmp     ecx, [ebp + panel1_numfiles - panel1_data]
  1444.         jae     .ret
  1445. @@:
  1446.         mov     [ebp + panel1_index - panel1_data], ecx
  1447.         cmp     ecx, ebx
  1448.         jb      .done_redraw
  1449.         sub     ecx, [ebp + panel1_colst - panel1_data]
  1450.         inc     ecx
  1451.         mov     [ebp + panel1_start - panel1_data], ecx
  1452.         jmp     .done_redraw
  1453. .left:
  1454.         test    ecx, ecx
  1455.         jnz     @f
  1456.         ret
  1457. @@:
  1458.         mov     eax, [ebp + panel1_colsz - panel1_data]
  1459.         sub     ecx, eax
  1460.         jae     @f
  1461.         xor     ecx, ecx
  1462. @@:
  1463.         mov     [ebp + panel1_index - panel1_data], ecx
  1464. .finalize_left:
  1465.         cmp     ecx, edx
  1466.         jae     .done_redraw
  1467.         sub     edx, eax
  1468.         jae     @f
  1469.         xor     edx, edx
  1470. @@:
  1471.         mov     [ebp + panel1_start - panel1_data], edx
  1472.         jmp     .done_redraw
  1473. .pgup:
  1474.         mov     eax, [ebp + panel1_colst - panel1_data]
  1475.         dec     eax
  1476.         jnz     @f
  1477.         inc     eax
  1478. @@:
  1479.         test    ecx, ecx
  1480.         jnz     @f
  1481.         ret
  1482. @@:
  1483.         sub     ecx, eax
  1484.         jae     @f
  1485.         xor     ecx, ecx
  1486. @@:
  1487.         mov     [ebp + panel1_index - panel1_data], ecx
  1488.         dec     ecx
  1489.         jmp     .finalize_left
  1490. .right:
  1491.         mov     eax, [ebp + panel1_colsz - panel1_data]
  1492.         add     ecx, eax
  1493.         cmp     ecx, [ebp + panel1_numfiles - panel1_data]
  1494.         jb      @f
  1495.         mov     ecx, [ebp + panel1_numfiles - panel1_data]
  1496.         dec     ecx
  1497. @@:
  1498.         mov     [ebp + panel1_index - panel1_data], ecx
  1499. .finalize_right:
  1500.         cmp     ecx, ebx
  1501.         jb      .done_redraw
  1502.         add     ebx, eax
  1503.         cmp     ebx, [ebp + panel1_numfiles - panel1_data]
  1504.         jbe     @f
  1505.         mov     ebx, [ebp + panel1_numfiles - panel1_data]
  1506. @@:
  1507.         sub     ebx, [ebp + panel1_colst - panel1_data]
  1508.         jae     @f
  1509.         xor     ebx, ebx
  1510. @@:
  1511.         mov     [ebp + panel1_start - panel1_data], ebx
  1512.         jmp     .done_redraw
  1513. .pgdn:
  1514.         mov     eax, [ebp + panel1_colst - panel1_data]
  1515.         dec     eax
  1516.         jnz     @f
  1517.         inc     eax
  1518. @@:
  1519.         add     ecx, eax
  1520.         cmp     ecx, [ebp + panel1_numfiles - panel1_data]
  1521.         jb      @f
  1522.         mov     ecx, [ebp + panel1_numfiles - panel1_data]
  1523.         dec     ecx
  1524. @@:
  1525.         mov     [ebp + panel1_index - panel1_data], ecx
  1526.         inc     ecx
  1527.         jmp     .finalize_right
  1528. .tab:
  1529.         xor     [active_panel], panel1_data xor panel2_data
  1530.         call    draw_cmdbar
  1531.         call    draw_panel
  1532.         mov     ebp, [active_panel]
  1533.         jmp     .done_redraw
  1534. .home:
  1535.         and     [ebp + panel1_start - panel1_data], 0
  1536.         and     [ebp + panel1_index - panel1_data], 0
  1537.         jmp     .done_redraw
  1538. .end:
  1539.         mov     eax, [ebp + panel1_numfiles - panel1_data]
  1540.         dec     eax
  1541.         mov     [ebp + panel1_index - panel1_data], eax
  1542.         inc     eax
  1543.         sub     eax, [ebp + panel1_colst - panel1_data]
  1544.         jae     @f
  1545.         xor     eax, eax
  1546. @@:
  1547.         mov     [ebp + panel1_start - panel1_data], eax
  1548.         jmp     .done_redraw
  1549. .enter:
  1550.         cmp     [bQuickSearchMode], 0
  1551.         jz      @f
  1552.         call    draw_image
  1553. @@:
  1554.         call    get_curfile_folder_entry
  1555.         test    byte [ecx], 10h
  1556.         jnz     .enter_folder
  1557. ; todo: add <Enter> handling on plugin panel
  1558.         cmp     [ebp + panel1_hPlugin - panel1_data], 0
  1559.         jnz     .ret
  1560. ; generate full file name
  1561.         lea     esi, [ebp + panel1_dir - panel1_data]
  1562.         mov     edi, execdata
  1563. @@:
  1564.         lodsb
  1565.         test    al, al
  1566.         jz      @f
  1567.         stosb
  1568.         cmp     edi, execdataend-1
  1569.         jae     .bigfilename
  1570.         jmp     @b
  1571. @@:
  1572.         lea     esi, [ecx+40]
  1573.         mov     al, '/'
  1574.         stosb
  1575. @@:
  1576.         lodsb
  1577.         stosb
  1578.         cmp     edi, execdataend
  1579.         ja      .bigfilename
  1580.         test    al, al
  1581.         jnz     @b
  1582. ; try to open file and look for all plugins
  1583.         push    O_READ
  1584.         push    execdata
  1585.         call    open
  1586.         test    eax, eax
  1587.         jz      .noplugins      ; if can't open, just try to execute
  1588.         mov     esi, eax        ; save handle
  1589.         push    filedata_buffer_size
  1590.         push    filedata_buffer
  1591.         push    esi
  1592.         call    read
  1593.         mov     edi, eax        ; save size of read data
  1594. ; test for Kolibri executable
  1595.         cmp     eax, 24h
  1596.         jb      .enter.noexec
  1597.         cmp     dword [filedata_buffer], 'MENU'
  1598.         jnz     @f
  1599.         cmp     word [filedata_buffer+4], 'ET'
  1600.         jnz     @f
  1601. .close_run:
  1602.         push    esi
  1603.         call    close
  1604.         jmp     .run_app
  1605. @@:
  1606.         cmp     dword [filedata_buffer], 'KPCK'
  1607.         jnz     @f
  1608.         cmp     dword [filedata_buffer+12], 0x26914601
  1609.         jz      .close_run
  1610. @@:
  1611. .enter.noexec:
  1612.         mov     ecx, [num_plugins]
  1613.         mov     edx, [plugins]
  1614.         sub     edx, PluginInfo.size
  1615. .plugloop:
  1616.         add     edx, PluginInfo.size
  1617.         dec     ecx
  1618.         js      .plugdone
  1619.         pushad
  1620.         push    execdata
  1621.         push    [ebp+panel1_hFile-panel1_data]
  1622.         push    [ebp+panel1_hPlugin-panel1_data]
  1623.         push    edi
  1624.         push    filedata_buffer
  1625.         call    get_curfile_folder_entry
  1626.         push    ecx
  1627.         push    esi
  1628.         call    [edx+PluginInfo.OpenFilePlugin]
  1629.         mov     [esp+28], eax
  1630.         popad
  1631.         test    eax, eax
  1632.         jz      .plugloop
  1633.         cmp     eax, -1
  1634.         jnz     .pluginok
  1635.         push    esi
  1636.         call    close
  1637.         ret
  1638. .pluginok:
  1639. ; save current directory and set root directory of hPlugin
  1640.         mov     edi, eax        ; save handle
  1641.         mov     esi, execdata
  1642. @@:
  1643.         lodsb
  1644.         test    al, al
  1645.         jnz     @b
  1646.         sub     esi, execdata-9
  1647. ; allocate esi bytes in buffer 'parents'
  1648.         mov     ecx, [ebp + panel1_parents_sz - panel1_data]
  1649.         add     ecx, esi
  1650.         cmp     ecx, [ebp + panel1_parents_alloc - panel1_data]
  1651.         jbe     .enter.norealloc
  1652.         push    edx
  1653.         mov     edx, [ebp + panel1_parents - panel1_data]
  1654.         call    xpgrealloc
  1655.         pop     edx
  1656.         test    eax, eax
  1657.         jnz     @f
  1658.         push    edi
  1659.         call    [edx+PluginInfo.ClosePlugin]
  1660.         ret
  1661. @@:
  1662.         mov     [ebp + panel1_parents - panel1_data], eax
  1663. .enter.norealloc:
  1664.         mov     [ebp + panel1_parents_sz - panel1_data], ecx
  1665. ; save current state to the end of buffer
  1666.         sub     ecx, esi
  1667.         add     ecx, [ebp + panel1_parents - panel1_data]
  1668.         xchg    edx, [ebp + panel1_hPlugin - panel1_data]
  1669.         mov     [ecx], edx
  1670.         xchg    edi, [ebp + panel1_hFile - panel1_data]
  1671.         mov     [ecx+4], edi
  1672.         mov     byte [ecx+8], 0
  1673.         lea     edi, [ecx+9]
  1674.         lea     ecx, [esi-9]
  1675.         mov     esi, execdata
  1676.         rep     movsb
  1677.         mov     word [ebp + panel1_dir - panel1_data], '/'
  1678.         mov     eax, [ebp + panel1_hPlugin - panel1_data]
  1679.         lea     ebx, [ebp + panel1_plugin_info - panel1_data]
  1680.         and     dword [ebx], 0
  1681.         push    ebp
  1682.         push    ebx
  1683.         push    [ebp + panel1_hFile - panel1_data]
  1684.         call    [eax+PluginInfo.GetOpenPluginInfo]
  1685.         pop     ebp
  1686.         call    get_curfile_folder_entry
  1687.         mov     esi, ecx
  1688.         mov     edi, left_dotdot_entry
  1689.         cmp     ebp, panel1_data
  1690.         jz      @f
  1691.         add     edi, right_dotdot_entry-left_dotdot_entry
  1692. @@:
  1693.         mov     ecx, 10
  1694.         rep     movsd
  1695.         mov     byte [edi-40], 10h      ; attributes: folder
  1696.         mov     eax, '..'
  1697.         stosd
  1698.         jmp     .reread
  1699. .plugdone:
  1700.         push    esi
  1701.         call    close
  1702. .noplugins:
  1703. ; run program or association
  1704.         call    get_curfile_folder_entry
  1705.         call    find_extension
  1706.         jc      .run_app
  1707. .run_association:
  1708.         cmp     byte [edi], 0
  1709.         jz      .l1
  1710.         cmp     byte [edi], ';'
  1711.         jnz     @f
  1712. .l1:
  1713.         ret
  1714. @@:
  1715.         mov     esi, edi
  1716. @@:
  1717.         lodsb
  1718.         test    al, al
  1719.         jz      @f
  1720.         cmp     al, ';'
  1721.         jnz     @b
  1722.         dec     esi
  1723.         mov     byte [esi], 0
  1724.         mov     [restore_semicolon], esi
  1725. @@:
  1726. .run_association2:
  1727.         mov     [execparams], execdata
  1728.         mov     [execptr], edi
  1729.         jmp     .dorun
  1730. .run_app:
  1731.         mov     [execptr], execdata
  1732.         and     [execparams], 0
  1733. .dorun:
  1734.         lea     esi, [ebp + panel1_dir - panel1_data]
  1735.         mov     edi, execdata
  1736. @@:
  1737.         lodsb
  1738.         test    al, al
  1739.         jz      @f
  1740.         stosb
  1741.         cmp     edi, execdataend-1
  1742.         jae     .bigfilename
  1743.         jmp     @b
  1744. @@:
  1745.         lea     esi, [ecx+40]
  1746.         mov     al, '/'
  1747.         stosb
  1748. @@:
  1749.         lodsb
  1750.         stosb
  1751.         cmp     edi, execdataend
  1752.         ja      .bigfilename
  1753.         test    al, al
  1754.         jnz     @b
  1755. ; for fasm call - special handling, because
  1756. ; 1) fasm command line convention is different : fasm infile,outfile[,path] rather than tinypad infile
  1757. ; 2) fasm will probably create new file in directory, so we want to reload panel data
  1758.         xor     edx, edx
  1759.         cmp     [execparams], edx
  1760.         jz      .nofasm
  1761.         mov     esi, [execptr]
  1762. @@:
  1763.         lodsb
  1764.         test    al, al
  1765.         jnz     @b
  1766.         mov     eax, [esi-5]
  1767.         or      eax, 0x20202020
  1768.         cmp     eax, 'fasm'
  1769.         jnz     .nofasm
  1770.         cmp     edi, execdata+(execdataend-execdata)/2
  1771.         ja      .bigfilename
  1772.         mov     esi, execdata
  1773. @@:
  1774.         lodsb
  1775.         stosb
  1776.         test    al, al
  1777.         jnz     @b
  1778.         mov     byte [esi-1], ','
  1779.         inc     edx
  1780. ; output file: no extension if input file has extension, '.bin' otherwise
  1781.         push    edi
  1782. @@:
  1783.         dec     edi
  1784.         cmp     byte [edi], '.'
  1785.         jz      .ptfound
  1786.         cmp     byte [edi], '/'
  1787.         jnz     @b
  1788.         pop     edi
  1789.         cmp     edi, execdataend-4
  1790.         ja      .bigfilename
  1791.         mov     dword [edi-1], '.bin'
  1792.         mov     byte [edi+3], 0
  1793.         jmp     .nofasm
  1794. .ptfound:
  1795.         mov     byte [edi], 0
  1796.         pop     edi
  1797. .nofasm:
  1798.         mov     ebx, execinfo
  1799. ; if command line is more than 256 symbols, the kernel will truncate it
  1800. ; we do not want this!
  1801. ; N.B. We know that command line is either NULL or execdata, which is always ASCIIZ string,
  1802. ;      but can be up to 1023 symbols
  1803.         mov     esi, [ebx+8]
  1804.         test    esi, esi
  1805.         jz      .cmdlinelenok
  1806. @@:
  1807.         lodsb
  1808.         test    al, al
  1809.         jnz     @b
  1810.         sub     esi, [ebx+8]
  1811.         dec     esi
  1812.         cmp     esi, 256
  1813.         ja      .bigcmdline
  1814. .cmdlinelenok:
  1815.         push    70
  1816.         pop     eax
  1817.         int     40h
  1818.         xor     esi, esi
  1819.         xchg    esi, [restore_semicolon]
  1820.         test    esi, esi
  1821.         jz      @f
  1822.         mov     byte [esi], ';'
  1823. @@:
  1824.         neg     eax
  1825.         js      @f
  1826.         call    get_error_msg
  1827.         push    eax
  1828.         push    dword aRunError
  1829.         mov     eax, esp
  1830.         push    ContinueBtn
  1831.         push    1
  1832.         push    eax
  1833.         push    2
  1834.         call    SayErr
  1835.         pop     eax
  1836.         pop     eax
  1837.         ret
  1838. @@:
  1839.         test    edx, edx
  1840.         jz      @f
  1841.         push    5
  1842.         pop     eax
  1843.         push    20
  1844.         pop     ebx
  1845.         int     0x40
  1846.         jmp     .ctrl_r
  1847. @@:
  1848.         ret
  1849. .bigfilename3:
  1850.         pop     esi
  1851. .bigfilename2:
  1852.         pop     esi
  1853. .bigfilename:
  1854.         mov     eax, aFileNameTooBig
  1855. .l2:
  1856.         xor     esi, esi
  1857.         xchg    esi, [restore_semicolon]
  1858.         test    esi, esi
  1859.         jz      @f
  1860.         mov     byte [esi], ';'
  1861. @@:
  1862.         push    eax
  1863.         mov     eax, esp
  1864.         push    ContinueBtn
  1865.         push    1
  1866.         push    eax
  1867.         push    1
  1868.         call    SayErr
  1869.         pop     eax
  1870.         ret
  1871. .bigcmdline:
  1872.         mov     eax, aCmdLineTooBig
  1873.         jmp     .l2
  1874. .bigfoldername2:
  1875.         mov     esi, prev_dir
  1876.         lea     edi, [ebp + panel1_dir - panel1_data]
  1877. @@:
  1878.         lodsb
  1879.         stosb
  1880.         test    al, al
  1881.         jnz     @b
  1882. .bigfoldername:
  1883.         mov     eax, aFolderNameTooBig
  1884.         jmp     .l2
  1885. .enter_folder:
  1886.         lea     esi, [ecx+40]
  1887.         cmp     word [esi], '..'
  1888.         jnz     @f
  1889.         cmp     byte [esi+2], 0
  1890.         jz      .dotdot
  1891. @@:
  1892.         push    esi
  1893.         lea     esi, [ebp + panel1_dir - panel1_data]
  1894.         mov     edi, prev_dir
  1895. @@:
  1896.         lodsb
  1897.         stosb
  1898.         test    al, al
  1899.         jnz     @b
  1900.         lea     edi, [esi-1]
  1901.         lea     edx, [ebp + panel1_dir - panel1_data + 1024]
  1902.         cmp     esi, edx
  1903.         pop     esi
  1904.         jae     .bigfoldername
  1905.         mov     al, '/'
  1906.         cmp     [edi-1], al
  1907.         jz      @f
  1908.         stosb
  1909. @@:
  1910.         lodsb
  1911.         cmp     edi, edx
  1912.         jae     .bigfoldername2
  1913.         stosb
  1914.         test    al, al
  1915.         jnz     @b
  1916.         mov     eax, [ebp + panel1_hPlugin - panel1_data]
  1917.         test    eax, eax
  1918.         jz      .reread
  1919.         push    ebp
  1920.         lea     esi, [ebp + panel1_dir - panel1_data]
  1921.         push    esi
  1922.         add     ecx, 40
  1923.         push    ecx
  1924.         push    [ebp + panel1_hFile - panel1_data]
  1925.         call    [eax+PluginInfo.SetFolder]
  1926.         pop     ebp
  1927.         test    al, al
  1928.         jnz     .reread
  1929.         mov     esi, prev_dir
  1930.         lea     edi, [ebp + panel1_dir - panel1_data]
  1931. @@:
  1932.         lodsb
  1933.         stosb
  1934.         test    al, al
  1935.         jnz     @b
  1936. .retd:
  1937.         ret
  1938. .reread:
  1939.         call    read_folder
  1940. .done_cmdbar:
  1941.         call    draw_cmdbar
  1942.         jmp     .done_redraw
  1943. .dotdot:
  1944.         lea     edi, [ebp + panel1_dir - panel1_data]
  1945.         cmp     word [edi], '/'
  1946.         jnz     .dotdot_noroot
  1947.         cmp     [ebp + panel1_hPlugin - panel1_data], 0
  1948.         jz      .retd
  1949.         call    close_plugin_panel
  1950.         jmp     .dotdot
  1951. .dotdot_noroot:
  1952.         mov     edx, edi
  1953.         mov     al, 0
  1954.         or      ecx, -1
  1955.         repnz   scasb
  1956.         dec     edi
  1957.         mov     al, '/'
  1958.         std
  1959.         repnz   scasb
  1960.         cld
  1961.         inc     edi
  1962.         cmp     edi, edx
  1963.         jnz     @f
  1964.         inc     edi
  1965. @@:
  1966.         push    dword [edi]
  1967.         mov     byte [edi], 0
  1968.         push    edi
  1969.         mov     eax, [ebp + panel1_hPlugin - panel1_data]
  1970.         test    eax, eax
  1971.         jz      .dotdot_native
  1972.         push    ebp
  1973.         lea     esi, [ebp + panel1_dir - panel1_data]
  1974.         push    esi
  1975.         push    aDotDot
  1976.         push    [ebp + panel1_hFile - panel1_data]
  1977.         call    [eax+PluginInfo.SetFolder]
  1978.         pop     ebp
  1979.         test    al, al
  1980.         jnz     .dotdot_native
  1981.         pop     edi
  1982.         pop     dword [edi]
  1983.         ret
  1984. .dotdot_native:
  1985.         call    read_folder
  1986.         pop     edi
  1987.         pop     dword [edi]
  1988.         push    edi
  1989.         cmp     byte [edi], '/'
  1990.         jnz     @f
  1991.         inc     edi
  1992. @@:
  1993.         mov     edx, [ebp + panel1_files - panel1_data]
  1994.         mov     ecx, [ebp + panel1_numfiles - panel1_data]
  1995. .scanloop:
  1996.         mov     esi, [edx]
  1997.         add     esi, 40
  1998.         push    esi edi
  1999. @@:
  2000.         lodsb
  2001.         call    match_symbol
  2002.         jnz     @f
  2003.         inc     edi
  2004.         test    al, al
  2005.         jnz     @b
  2006. @@:
  2007.         pop     edi esi
  2008.         jz      .scanfound
  2009.         add     edx, 4
  2010.         loop    .scanloop
  2011.         jmp     .scandone
  2012. .scanfound:
  2013.         sub     edx, [ebp + panel1_files - panel1_data]
  2014.         shr     edx, 2
  2015.         mov     [ebp + panel1_index - panel1_data], edx
  2016.         sub     edx, [ebp + panel1_colst - panel1_data]
  2017.         jb      .scandone
  2018.         inc     edx
  2019.         mov     [ebp + panel1_start - panel1_data], edx
  2020. .scandone:
  2021.         pop     edi
  2022.         mov     byte [edi], 0
  2023.         jmp     .done_cmdbar
  2024. .ctrl_f39:
  2025.         sub     al, 0x3D
  2026.         add     al, al
  2027.         mov     ah, [ebp + panel1_sortmode - panel1_data]
  2028.         and     ah, 0xFE
  2029.         cmp     al, ah
  2030.         jnz     @f
  2031.         and     [ebp + panel1_sortmode - panel1_data], 1
  2032.         or      al, [ebp + panel1_sortmode - panel1_data]
  2033.         xor     al, 1
  2034. @@:
  2035.         mov     [ebp + panel1_sortmode - panel1_data], al
  2036.         mov     eax, [ebp + panel1_index - panel1_data]
  2037.         mov     ecx, [ebp + panel1_files - panel1_data]
  2038.         push    dword [ecx+eax*4]
  2039.         push    ecx
  2040.         call    sort_files
  2041.         pop     edi
  2042.         pop     eax
  2043.         or      ecx, -1
  2044.         repnz   scasd
  2045.         not     ecx
  2046.         dec     ecx
  2047.         mov     [ebp + panel1_index - panel1_data], ecx
  2048.         sub     ecx, [ebp + panel1_start - panel1_data]
  2049.         jb      .less_start
  2050.         sub     ecx, [ebp + panel1_colst - panel1_data]
  2051.         jae     .gr_end
  2052. @@:     jmp     .done_redraw
  2053. .less_start:
  2054.         add     [ebp + panel1_start - panel1_data], ecx
  2055.         jmp     @b
  2056. .gr_end:
  2057.         inc     ecx
  2058.         add     [ebp + panel1_start - panel1_data], ecx
  2059.         jmp     @b
  2060. .alt_f12:
  2061.         mov     ebp, panel1_data
  2062.         cmp     al, 0x3B
  2063.         jz      @f
  2064.         mov     ebp, panel2_data
  2065. @@:
  2066. ; get drives list
  2067.         mov     ebx, dirinfo
  2068.         mov     [ebx+dirinfo.size-dirinfo], 1
  2069.         mov     [ebx+dirinfo.dirdata-dirinfo], driveinfo
  2070.         mov     [ebx+dirinfo.name-dirinfo], tmpname
  2071.         mov     byte [tmpname], '/'
  2072.         xor     edx, edx
  2073.         xor     ecx, ecx
  2074. .drive_loop_e:
  2075.         mov     byte [tmpname+1], 0
  2076.         push    70
  2077.         pop     eax
  2078.         int     40h
  2079.         mov     ebx, dirinfo
  2080.         test    eax, eax
  2081.         jnz     .drive_loop_e_done
  2082.         mov     esi, driveinfo+32+40
  2083.         mov     edi, tmpname+1
  2084. @@:
  2085.         lodsb
  2086.         stosb
  2087.         test    al, al
  2088.         jnz     @b
  2089.         push    [ebx+dirinfo.first-dirinfo]
  2090.         and     [ebx+dirinfo.first-dirinfo], 0
  2091. .drive_loop_i:
  2092.         push    70
  2093.         pop     eax
  2094.         int     40h
  2095.         mov     ebx, dirinfo
  2096.         test    eax, eax
  2097.         jnz     .drive_loop_i_done
  2098.         add     ecx, 32+8
  2099.         push    ecx
  2100.         and     ecx, 0xFFF
  2101.         cmp     ecx, 32+8
  2102.         pop     ecx
  2103.         ja      @f
  2104.         call    xpgrealloc
  2105.         mov     edx, eax
  2106.         test    eax, eax
  2107.         jnz     @f
  2108.         pop     eax
  2109.         ret
  2110. @@:
  2111.         lea     edi, [edx+ecx-32]
  2112.         mov     esi, tmpname
  2113. @@:
  2114.         lodsb
  2115.         test    al, al
  2116.         jz      @f
  2117.         stosb
  2118.         jmp     @b
  2119. @@:
  2120.         mov     esi, driveinfo+32+40
  2121.         mov     al, '/'
  2122.         stosb
  2123. @@:
  2124.         lodsb
  2125.         stosb
  2126.         test    al, al
  2127.         jnz     @b
  2128.         inc     [ebx+dirinfo.first-dirinfo]
  2129.         jmp     .drive_loop_i
  2130. .drive_loop_i_done:
  2131.         pop     [ebx+dirinfo.first-dirinfo]
  2132.         inc     [ebx+dirinfo.first-dirinfo]
  2133.         jmp     .drive_loop_e
  2134. .drive_loop_e_done:
  2135.         and     [ebx+dirinfo.first-dirinfo], 0
  2136.         mov     edi, edx
  2137.         xor     esi, esi
  2138.         add     ecx, edx
  2139. @@:
  2140.         and     dword [edi], 0
  2141.         mov     dword [edi+4], esi
  2142.         mov     esi, edi
  2143.         add     edi, 32+8
  2144.         cmp     edi, ecx
  2145.         jae     @f
  2146.         mov     [esi], edi
  2147.         jmp     @b
  2148. @@:
  2149.         mov     ecx, edx
  2150.         lea     edi, [ebp + panel1_dir - panel1_data]
  2151.         cmp     [ebp + panel1_hPlugin - panel1_data], 0
  2152.         jz      .find_cur_drive_loop
  2153.         mov     edi, [ebp + panel1_parents - panel1_data]
  2154.         add     edi, 8
  2155. .find_cur_drive_loop:
  2156.         push    edi
  2157.         lea     esi, [ecx+8]
  2158. @@:
  2159.         lodsb
  2160.         test    al, al
  2161.         jz      .cur_drive_found
  2162.         call    match_symbol
  2163.         jnz     @f
  2164.         inc     edi
  2165.         jmp     @b
  2166. @@:
  2167.         cmp     dword [ecx], 0
  2168.         jz      @f
  2169.         pop     edi
  2170.         mov     ecx, [ecx]
  2171.         jmp     .find_cur_drive_loop
  2172. @@:
  2173.         mov     ecx, edx
  2174. .cur_drive_found:
  2175.         pop     edi
  2176.         push    1
  2177.         push    aDrive
  2178.         push    ecx
  2179.         mov     eax, [ebp + panel1_height - panel1_data]
  2180.         sub     eax, 2
  2181.         jae     @f
  2182.         add     eax, 2
  2183. @@:
  2184.         push    eax
  2185.         push    [ebp + panel1_width - panel1_data]
  2186.         push    [ebp + panel1_top - panel1_data]
  2187.         push    [ebp + panel1_left - panel1_data]
  2188.         call    menu_centered_in
  2189.         cmp     eax, -1
  2190.         jnz     @f
  2191.         mov     ecx, edx
  2192.         call    pgfree
  2193.         ret
  2194. @@:
  2195.         push    eax
  2196.         push    edx
  2197.         call    close_plugin_panels
  2198.         pop     edx
  2199.         lea     edi, [ebp + panel1_dir - panel1_data]
  2200.         push    edi
  2201.         mov     esi, edi
  2202.         mov     edi, prev_dir
  2203.         mov     ecx, 1024/4
  2204.         rep     movsd
  2205.         pop     edi
  2206.         pop     esi
  2207.         add     esi, 8
  2208. @@:
  2209.         lodsb
  2210.         stosb
  2211.         test    al, al
  2212.         jnz     @b
  2213.         mov     ecx, edx
  2214.         call    pgfree
  2215.         call    read_folder
  2216.         jmp     .done_redraw
  2217. .shift_f5:
  2218. ; todo: copy to plugin panel
  2219.         cmp     [ebp + panel1_hPlugin - panel1_data], 0
  2220.         jz      @f
  2221.         ret
  2222. @@:
  2223.         mov     esi, ebp
  2224.         cmp     [ebp + panel1_selected_num - panel1_data], 0
  2225.         jnz     .f5_2
  2226.         call    get_curfile_folder_entry
  2227.         lea     esi, [ecx+40]
  2228.         mov     edi, CopyDestEditBuf
  2229.         mov     eax, CopyDestEditBuf.length
  2230.         stosd
  2231.         scasd
  2232.         xor     eax, eax
  2233.         stosd
  2234.         mov     edx, edi
  2235. @@:
  2236.         lodsb
  2237.         test    al, al
  2238.         jz      .f5_common
  2239.         stosb
  2240.         jmp     @b
  2241. .f5:
  2242. ; todo: copy to plugin panel
  2243.         mov     esi, ebp
  2244.         xor     esi, panel1_data xor panel2_data
  2245.         cmp     [esi + panel1_hPlugin - panel1_data], 0
  2246.         jz      .f5_2
  2247.         ret
  2248. .f5_2:
  2249.         add     esi, panel1_dir - panel1_data
  2250.         mov     edi, CopyDestEditBuf
  2251.         mov     eax, CopyDestEditBuf.length
  2252.         stosd
  2253.         scasd
  2254.         xor     eax, eax
  2255.         stosd
  2256.         mov     edx, edi
  2257. @@:
  2258.         lodsb
  2259.         test    al, al
  2260.         jz      @f
  2261.         cmp     edi, CopyDestEditBuf+12+511
  2262.         jae     .bigfoldername
  2263.         stosb
  2264.         jmp     @b
  2265. @@:
  2266.         mov     al, '/'
  2267.         stosb
  2268. .f5_common:
  2269.         mov     eax, [ebp + panel1_hPlugin - panel1_data]
  2270.         mov     [source_hModule], eax
  2271.         mov     eax, [ebp + panel1_hFile - panel1_data]
  2272.         mov     [source_hPlugin], eax
  2273.         mov     eax, left_dotdot_entry
  2274.         cmp     ebp, panel1_data
  2275.         jz      @f
  2276.         add     eax, right_dotdot_entry-left_dotdot_entry
  2277. @@:
  2278.         mov     [default_attr], eax
  2279.         mov     byte [edi], 0
  2280.         sub     edi, edx
  2281.         mov     [edx-8], edi
  2282.         mov     edi, CopySourceTextBuf
  2283.         mov     esi, aCopy1
  2284. @@:
  2285.         lodsb
  2286.         test    al, al
  2287.         jz      @f
  2288.         stosb
  2289.         jmp     @b
  2290. @@:
  2291.         mov     eax, [ebp + panel1_selected_num - panel1_data]
  2292.         test    eax, eax
  2293.         jz      .f5_noselected1
  2294.         mov     ebx, eax
  2295.         push    10
  2296.         pop     ecx
  2297.         push    -'0'
  2298. @@:
  2299.         xor     edx, edx
  2300.         div     ecx
  2301.         push    edx
  2302.         test    eax, eax
  2303.         jnz     @b
  2304. @@:
  2305.         pop     eax
  2306.         add     al, '0'
  2307.         jz      @f
  2308.         stosb
  2309.         jmp     @b
  2310. @@:
  2311. if lang eq ru
  2312.         mov     dword [edi], ' эле'
  2313.         mov     dword [edi+4], 'мент'
  2314.         add     edi, 8
  2315.         cmp     ebx, 1
  2316.         jz      @f
  2317.         mov     al, 'а'
  2318.         stosb
  2319.         cmp     ebx, 4
  2320.         jbe     @f
  2321.         mov     word [edi-1], 'ов'
  2322.         inc     edi
  2323. @@:
  2324. else
  2325.         mov     dword [edi], ' ite'
  2326.         mov     byte [edi+4], 'm'
  2327.         add     edi, 5
  2328.         cmp     ebx, 1
  2329.         jz      @f
  2330.         mov     al, 's'
  2331.         stosb
  2332. @@:
  2333. end if
  2334.         jmp     .f5_selected1
  2335. .f5_noselected1:
  2336.         mov     al, '"'
  2337.         stosb
  2338.         call    get_curfile_folder_entry
  2339.         lea     esi, [ecx+40]
  2340.         lea     eax, [esi+1]
  2341. @@:
  2342.         inc     esi
  2343.         cmp     byte [esi-1], 0
  2344.         jnz     @b
  2345.         sub     esi, eax
  2346.         xchg    eax, esi
  2347.         dec     esi
  2348.         mov     edx, [cur_width]
  2349.         sub     edx, 50
  2350.         sub     eax, edx
  2351.         jbe     @f
  2352.         add     esi, eax
  2353.         mov     al, '.'
  2354.         stosb
  2355.         stosb
  2356.         stosb
  2357. @@:
  2358.         lodsb
  2359.         test    al, al
  2360.         jz      @f
  2361.         stosb
  2362.         jmp     @b
  2363. @@:
  2364.         mov     al, '"'
  2365.         stosb
  2366. .f5_selected1:
  2367.         mov     esi, aCopy2
  2368. @@:
  2369.         lodsb
  2370.         stosb
  2371.         test    al, al
  2372.         jnz     @b
  2373.         mov     ebx, copy_dlgdata
  2374.         mov     eax, [cur_width]
  2375.         sub     eax, 12
  2376.         mov     [ebx + dlgtemplate.width], eax
  2377.         dec     eax
  2378.         dec     eax
  2379.         mov     [ebx - copy_dlgdata + copy_dlgdata.width2], eax
  2380.         mov     [ebx - copy_dlgdata + copy_dlgdata.width3], eax
  2381.         shr     eax, 1
  2382.         dec     eax
  2383.         dec     eax
  2384.         mov     [ebx - copy_dlgdata + copy_dlgdata.copy_x2], eax
  2385.         sub     eax, aCopyLength-1
  2386.         mov     [ebx - copy_dlgdata + copy_dlgdata.copy_x1], eax
  2387.         add     eax, aCopyLength+3
  2388.         mov     [ebx - copy_dlgdata + copy_dlgdata.cnl_x1], eax
  2389.         add     eax, aCancelBLength - 1
  2390.         mov     [ebx - copy_dlgdata + copy_dlgdata.cnl_x2], eax
  2391.         mov     byte [ebx - copy_dlgdata + copy_dlgdata.flags0], 0xC
  2392.         and     byte [ebx - copy_dlgdata + copy_dlgdata.flags1], not 4
  2393.         and     byte [ebx - copy_dlgdata + copy_dlgdata.flags2], not 4
  2394.         push    ebx
  2395.         call    DialogBox
  2396.         cmp     eax, copy_dlgdata.copy_btn
  2397.         jnz     .ret2
  2398. ; Копируем
  2399.         mov     esi, CopyDestEditBuf+12
  2400.         mov     edi, esi
  2401.         xor     eax, eax
  2402.         or      ecx, -1
  2403.         repnz   scasb
  2404.         dec     edi
  2405.         dec     edi
  2406.         cmp     edi, esi
  2407.         jb      .ret2
  2408.         mov     [bEndSlash], 0
  2409.         cmp     byte [edi], '/'
  2410.         jnz     @f
  2411.         cmp     edi, esi
  2412.         jz      @f
  2413.         mov     byte [edi], 0
  2414.         dec     edi
  2415.         mov     [bEndSlash], 1
  2416. @@:
  2417. ; Если путь не начинается со слэша, считаем его относительно текущей папки
  2418.         cmp     byte [esi], '/'
  2419.         jz      .copy_absolute_path
  2420.         push    esi
  2421.         push    edi
  2422.         lea     edi, [ebp + panel1_dir - panel1_data]
  2423.         or      ecx, -1
  2424.         xor     eax, eax
  2425.         repnz   scasb
  2426.         not     ecx
  2427.         pop     edi
  2428.         push    edi
  2429.         add     edi, ecx
  2430.         cmp     edi, CopyDestEditBuf+12+513
  2431.         pop     edi
  2432.         jb      @f
  2433.         pop     esi
  2434.         jmp     .bigfilename
  2435. @@:
  2436.         lea     edx, [edi+2]
  2437.         sub     edx, esi
  2438.         lea     edi, [edi+ecx+1]
  2439.         xchg    ecx, edx
  2440.         std
  2441.         lea     esi, [esi+ecx-1]
  2442.         rep     movsb
  2443.         cld
  2444.         pop     edi
  2445.         lea     esi, [ebp + panel1_dir - panel1_data]
  2446.         push    edi
  2447.         mov     ecx, edx
  2448.         rep     movsb
  2449.         mov     byte [edi-1], '/'
  2450.         pop     esi
  2451. .copy_absolute_path:
  2452. ; Сначала создаём все вышележащие папки, которые ещё не существуют
  2453. ; Последний из элементов может быть как файлом, так и папкой;
  2454. ; форсируем папку в случае, если хотя бы один из источников является папкой
  2455.         xor     edx, edx
  2456.         cmp     [ebp + panel1_selected_num - panel1_data], 0
  2457.         jz      .f5_noselected2
  2458.         mov     ecx, [ebp + panel1_numfiles - panel1_data]
  2459.         mov     edi, [ebp + panel1_files - panel1_data]
  2460. .scanselected2:
  2461.         mov     eax, [edi]
  2462.         add     edi, 4
  2463.         test    byte [eax+303], 1
  2464.         jz      @f
  2465.         test    byte [eax], 10h
  2466.         jz      @f
  2467.         inc     edx
  2468. @@:
  2469.         loop    .scanselected2
  2470.         jmp     .f5_selected2
  2471. .f5_noselected2:
  2472.         call    get_curfile_folder_entry
  2473.         test    byte [ecx], 10h
  2474.         setnz   dl
  2475. .f5_selected2:
  2476.         xor     eax, eax
  2477.         mov     edi, esi
  2478. .countslashloop:
  2479.         cmp     byte [edi], '/'
  2480.         jnz     @f
  2481.         inc     eax
  2482.         mov     ecx, edi
  2483. @@:
  2484.         inc     edi
  2485.         cmp     byte [edi], 0
  2486.         jnz     .countslashloop
  2487.         mov     [bNeedRestoreName], 0
  2488. ; "/file-system/partition" folders already exist, so we don't need to create them
  2489.         cmp     eax, 2
  2490.         jbe     .createupdone
  2491. ; we interpret destination as folder if edx!=0 or bEndSlash!=0
  2492.         test    edx, edx
  2493.         jnz     @f
  2494.         cmp     [bEndSlash], 0
  2495.         jnz     @f
  2496.         mov     edi, ecx
  2497.         dec     eax
  2498. @@:
  2499.         mov     [attrinfo.name], esi
  2500.         mov     ecx, eax
  2501. ; ищем последнюю папку, которая ещё существует
  2502. .createuploop1:
  2503.         cmp     eax, 2
  2504.         jbe     .createupdone1
  2505.         mov     dl, [edi]
  2506.         mov     byte [edi], 0
  2507.         push    eax
  2508.         push    70
  2509.         pop     eax
  2510.         mov     ebx, attrinfo
  2511.         int     0x40
  2512.         test    eax, eax
  2513.         pop     eax
  2514.         mov     byte [edi], dl
  2515.         jnz     .createupcont1
  2516.         test    byte [attrinfo.attr], 10h
  2517.         jnz     .createupdone1
  2518. ; the item required to be a folder, but is file
  2519.         push    aNotFolder
  2520.         push    esi
  2521.         mov     eax, esp
  2522.         push    ContinueBtn
  2523.         push    1
  2524.         push    eax
  2525.         push    2
  2526.         call    SayErr
  2527.         pop     eax
  2528.         pop     eax
  2529. .ret3:
  2530.         ret
  2531. .createupcont1:
  2532.         dec     eax
  2533. @@:
  2534.         dec     edi
  2535.         cmp     byte [edi], '/'
  2536.         jnz     @b
  2537.         jmp     .createuploop1
  2538. .createupdone1:
  2539. ; создаём все папки, которые нам нужны
  2540.         cmp     eax, ecx
  2541.         jae     .createupdone
  2542. @@:
  2543.         inc     edi
  2544.         cmp     byte [edi], 0
  2545.         jz      @f
  2546.         cmp     byte [edi], '/'
  2547.         jnz     @b
  2548. @@:
  2549.         mov     dl, byte [edi]
  2550.         mov     byte [edi], 0
  2551.         push    eax
  2552.         push    RetryOrCancelBtn
  2553.         push    2
  2554.         call    makedir
  2555.         mov     byte [edi], dl
  2556.         mov     [bNeedRestoreName], 1
  2557.         pop     eax
  2558.         jnz     .ret3
  2559.         inc     eax
  2560.         jmp     .createupdone1
  2561. .createupdone:
  2562.         mov     dl, 1
  2563.         cmp     byte [edi], 1
  2564.         sbb     eax, -1
  2565.         cmp     eax, 2
  2566.         jbe     .docopy
  2567.         mov     [attrinfo.attr], 0      ; assume zero attributes if error
  2568.         push    70
  2569.         pop     eax
  2570.         mov     ebx, attrinfo
  2571.         int     0x40
  2572.         test    [attrinfo.attr], 10h
  2573.         setnz   dl
  2574. .docopy:
  2575.         call    get_curfile_folder_entry
  2576.         mov     eax, ecx
  2577.         cmp     [bNeedRestoreName], 0
  2578.         jz      @f
  2579.         cmp     [bEndSlash], 0
  2580.         jnz     @f
  2581.         cmp     [ebp + panel1_selected_num - panel1_data], 0
  2582.         jnz     @f
  2583.         test    byte [eax], 10h
  2584.         jz      @f
  2585.         mov     dl, 0
  2586. @@:
  2587. ; начинаем собственно копирование
  2588.         mov     [bDestIsFolder], dl
  2589.         mov     [copy_bSkipAll], 0
  2590.         mov     [copy_bSkipAll2], 0
  2591.         mov     [copy_bSkipAll3], 0
  2592.         test    [ebp + panel1_plugin_flags - panel1_data], 2
  2593.         jnz     .copy_GetFiles
  2594.         cmp     [ebp + panel1_selected_num - panel1_data], 0
  2595.         jnz     .f5_selected3
  2596.         call    copy_file
  2597. .copydone:
  2598.         push    ebp
  2599.         call    .ctrl_r
  2600.         pop     ebp
  2601.         xor     ebp, panel1_data xor panel2_data
  2602.         jmp     .ctrl_r
  2603. .f5_selected3:
  2604.         mov     ecx, [ebp + panel1_numfiles - panel1_data]
  2605.         mov     esi, [ebp + panel1_files - panel1_data]
  2606. .f5_selected_copyloop:
  2607.         lodsd
  2608.         test    byte [eax+303], 1
  2609.         jz      .f5_selected_copycont
  2610.         mov     [bDestIsFolder], dl
  2611.         call    copy_file
  2612.         ja      .f5_multiple_cancel
  2613.         and     byte [eax+303], not 1
  2614.         pushad
  2615.         call    draw_panel
  2616.         cmp     [bNeedRestoreName], 0
  2617.         jz      @f
  2618.         mov     esi, CopyDestEditBuf+12
  2619.         call    delete_last_name_from_end
  2620. @@:
  2621.         popad
  2622. .f5_selected_copycont:
  2623.         loop    .f5_selected_copyloop
  2624. .f5_multiple_cancel:
  2625.         jmp     .copydone
  2626. .copy_GetFiles:
  2627.         mov     ecx, [ebp + panel1_selected_num - panel1_data]
  2628.         cmp     ecx, 1
  2629.         adc     ecx, 0
  2630.         shl     ecx, 2
  2631.         call    xpgalloc
  2632.         test    eax, eax
  2633.         jnz     @f
  2634.         ret
  2635. @@:
  2636.         push    ebp eax ; save
  2637.         push    copy_AddDir     ; adddir
  2638.         push    copy_AddFile    ; addfile
  2639.         push    eax             ; items
  2640.         shr     ecx, 2
  2641.         push    ecx             ; NumItems
  2642.         push    [ebp + panel1_hFile - panel1_data]
  2643.         mov     edi, eax
  2644.         call    get_curfile_folder_entry
  2645.         mov     [edi], ecx
  2646.         cmp     [ebp + panel1_selected_num - panel1_data], 0
  2647.         jz      .cgf1
  2648.         mov     esi, [ebp + panel1_files - panel1_data]
  2649.         mov     ecx, [ebp + panel1_numfiles - panel1_data]
  2650. .cgf0:
  2651.         lodsd
  2652.         test    byte [eax+303], 1
  2653.         jz      @f
  2654.         stosd
  2655. @@:
  2656.         loop    .cgf0
  2657. .cgf1:
  2658.         mov     eax, [ebp + panel1_hPlugin - panel1_data]
  2659.         call    [eax+PluginInfo.GetFiles]
  2660.         pop     ecx ebp
  2661.         call    pgfree
  2662.         jmp     .copydone
  2663.  
  2664. .f3:
  2665.         mov     eax, [ebp + panel1_files - panel1_data]
  2666.         mov     ecx, [eax+ecx*4]
  2667.         test    byte [ecx], 10h
  2668.         jnz     .ret2
  2669.         lea     esi, [ebp + panel1_dir - panel1_dat