Subversion Repositories Kolibri OS

Rev

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