Subversion Repositories Kolibri OS

Rev

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