Subversion Repositories Kolibri OS

Rev

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