Subversion Repositories Kolibri OS

Rev

Rev 517 | Rev 529 | 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.         and     [max_x], 0
  2643.         or      [min_x], -1
  2644.         and     [max_y], 0
  2645.         or      [min_y], -1
  2646.         mov     eax, [cursor_y]
  2647.         mul     [cur_width]
  2648.         add     eax, [cursor_x]
  2649.         add     eax, eax
  2650.         add     eax, [console_data_ptr]
  2651.         xchg    [cur_cursor_pos], eax
  2652.         mov     [old_cursor_pos], eax
  2653.         mov     edi, [MemForImage]
  2654.         mov     esi, [console_data_ptr]
  2655.         mov     ecx, [cur_height]
  2656. .lh:
  2657.         push    ecx
  2658.         mov     ecx, [cur_width]
  2659. .lw:
  2660.         push    ecx
  2661.         mov     eax, [cur_width]
  2662.         imul    eax, [cur_height]
  2663.         mov     ebx, [esi]
  2664.         cmp     [bMemForImageValidData], 0
  2665.         jz      @f
  2666.         cmp     esi, [cur_cursor_pos]
  2667.         jz      @f
  2668.         cmp     esi, [old_cursor_pos]
  2669.         jz      @f
  2670.         cmp     bx, [eax*2+esi]
  2671.         jnz     @f
  2672.         inc     esi
  2673.         inc     esi
  2674.         jmp     .skip_symbol
  2675. @@:
  2676.         mov     [eax*2+esi], bx
  2677.         cmp     ecx, [min_x]
  2678.         ja      @f
  2679.         mov     [min_x], ecx
  2680. @@:
  2681.         cmp     ecx, [max_x]
  2682.         jb      @f
  2683.         mov     [max_x], ecx
  2684. @@:
  2685.         mov     eax, [esp+4]
  2686.         mov     [min_y], eax
  2687.         cmp     eax, [max_y]
  2688.         jb      @f
  2689.         mov     [max_y], eax
  2690. @@:
  2691.         push    edi
  2692.         xor     eax, eax
  2693.         mov     al, [esi+1]
  2694.         and     al, 0xF
  2695.         mov     ebx, eax
  2696.         mov     al, [esi+1]
  2697.         shr     al, 4
  2698.         mov     ebp, eax
  2699.         sub     ebx, ebp
  2700.         lodsb
  2701.         inc     esi
  2702. if font_width > 8
  2703.         lea     edx, [eax+eax+font]
  2704. else
  2705.         lea     edx, [eax+font]
  2706. end if
  2707. .sh:
  2708.         mov     ecx, [edx]
  2709. repeat font_width
  2710.         shr     ecx, 1
  2711.         sbb     eax, eax
  2712.         and     eax, ebx
  2713.         add     eax, ebp
  2714.         mov     [edi+%-1], al
  2715. end repeat
  2716.         mov     eax, [cur_width]
  2717. ;        imul    eax, font_width
  2718. ;        add     edi, eax
  2719. if font_width = 6
  2720.         lea     eax, [eax*2+eax]
  2721.         lea     edi, [edi+eax*2]
  2722. else if font_width = 7
  2723.         lea     edi, [edi+eax*8]
  2724.         sub     edi, eax
  2725. else if font_width = 8
  2726.         lea     edi, [edi+eax*8]
  2727. else if font_width = 9
  2728.         lea     edi, [edi+eax*8]
  2729.         add     edi, eax
  2730. else if font_width = 10
  2731.         lea     eax, [eax*4+eax]
  2732.         lea     edi, [edi+eax*2]
  2733. else
  2734. Unknown font_width value!
  2735. end if
  2736. if font_width > 8
  2737.         add     edx, 256*2
  2738.         cmp     edx, font+256*2*font_height
  2739. else
  2740.         add     edx, 256
  2741.         cmp     edx, font+256*font_height
  2742. end if
  2743.         jb      .sh
  2744.         pop     edi
  2745. .skip_symbol:
  2746.         pop     ecx
  2747.         add     edi, font_width
  2748.         dec     ecx
  2749.         jnz     .lw
  2750.         mov     eax, [cur_width]
  2751.         imul    eax, (font_height-1)*font_width
  2752.         add     edi, eax
  2753.         pop     ecx
  2754.         dec     ecx
  2755.         jnz     .lh
  2756. ; cursor
  2757.         mov     eax, [cursor_y]
  2758.         inc     eax
  2759.         jz      .nocursor
  2760.         mul     [cur_width]
  2761.         imul    eax, font_height*font_width
  2762.         mov     edx, [cursor_x]
  2763.         inc     edx
  2764.         imul    edx, font_width
  2765.         add     eax, edx
  2766.         add     eax, [MemForImage]
  2767.         mov     edx, [cur_width]
  2768.         imul    edx, font_width
  2769.         neg     edx
  2770.         mov     ecx, (font_height*15+50)/100
  2771. .cursor_loop:
  2772.         push    ecx
  2773.         mov     ecx, font_width
  2774.         add     eax, edx
  2775.         push    eax
  2776. @@:
  2777. ;        add     byte [eax-1], 0x10
  2778.         xor     byte [eax-1], 7
  2779.         sub     eax, 1
  2780.         loop    @b
  2781.         pop     eax
  2782.         pop     ecx
  2783.         loop    .cursor_loop
  2784. .nocursor:
  2785.         cmp     [min_y], -1
  2786.         jz      .nodraw
  2787.         mov     ecx, [cur_width]
  2788.         mov     ebx, [cur_height]
  2789.         mov     eax, ebx
  2790.         sub     ebx, [max_y]
  2791.         sub     eax, [min_y]
  2792.         sub     eax, ebx
  2793.         inc     eax
  2794.         imul    ebp, eax, font_height
  2795.         mov     edx, ecx
  2796.         sub     edx, [max_x]
  2797.         imul    edx, font_width
  2798.         mov     eax, edx
  2799.         shl     edx, 16
  2800.         imul    dx, bx, font_height
  2801.         imul    ebx, [cur_width]
  2802.         mov     ecx, [max_x]
  2803.         sub     ecx, [min_x]
  2804.         inc     ecx
  2805.         imul    ecx, font_width*10000h
  2806.         add     ecx, ebp
  2807.         imul    ebx, font_width*font_height
  2808.         add     ebx, [MemForImage]
  2809.         add     ebx, eax
  2810.         add     edx, [skinh]
  2811.         add     edx, 5*10000h
  2812.         imul    esi, [cur_width], font_width
  2813.         mov     ebp, ecx
  2814.         shr     ebp, 16
  2815.         sub     esi, ebp
  2816.         mov     ebp, esi
  2817.         push    65
  2818.         pop     eax
  2819.         mov     edi, console_colors
  2820.         push    8
  2821.         pop     esi
  2822.         int     40h
  2823. .nodraw:
  2824.         ret
  2825.  
  2826. get_console_ptr:
  2827. ; in: eax=x, edx=y
  2828. ; out: edi->console data
  2829.         push    edx
  2830.         imul    edx, [cur_width]
  2831.         add     edx, eax
  2832.         mov     edi, [console_data_ptr]
  2833.         lea     edi, [edi + edx*2]
  2834.         pop     edx
  2835.         ret
  2836.  
  2837. draw_keybar:
  2838.         pushad
  2839.         xor     eax, eax
  2840.         test    [ctrlstate], 3
  2841.         jz      @f
  2842.         inc     eax
  2843. @@:
  2844.         test    [ctrlstate], 0xC
  2845.         jz      @f
  2846.         or      al, 2
  2847. @@:
  2848.         test    [ctrlstate], 0x30
  2849.         jz      @f
  2850.         or      al, 4
  2851. @@:
  2852.         imul    eax, 6*12
  2853.         mov     esi, [active_screen_vtable]
  2854.         mov     esi, [esi+screen_vtable.keybar]
  2855.         add     esi, eax
  2856.         xor     ecx, ecx
  2857.         inc     ecx
  2858.         xor     eax, eax
  2859.         mov     edx, [cur_height]
  2860.         dec     edx
  2861.         call    get_console_ptr
  2862.         push    6
  2863.         pop     ebx
  2864.         mov     eax, [cur_width]
  2865.         sub     eax, 11+9+3*2+6
  2866.         cmp     eax, 7*11
  2867.         jl      @f
  2868.         cdq
  2869.         mov     bl, 11
  2870.         div     ebx
  2871.         mov     ebx, eax
  2872. @@:
  2873.         xor     edx, edx
  2874. .l:
  2875.         add     edx, 7
  2876.         cmp     cl, 10
  2877.         jb      @f
  2878.         inc     edx
  2879. @@:
  2880.         cmp     edx, [cur_width]
  2881.         ja      .ret
  2882.         cmp     cl, 10
  2883.         jae     .twodig
  2884.         lea     eax, [ecx+'0']
  2885.         stosb
  2886.         mov     al, [keybar_number_color]
  2887.         stosb
  2888.         jmp     .cmn
  2889. .twodig:
  2890.         mov     al, cl
  2891.         cbw
  2892.         div     [_10]
  2893.         add     al, '0'
  2894.         stosb
  2895.         mov     al, [keybar_number_color]
  2896.         stosb
  2897.         xchg    al, ah
  2898.         add     al, '0'
  2899.         stosw
  2900. .cmn:
  2901.         mov     ah, [keybar_name_color]
  2902.         push    ecx
  2903.         mov     cl, 6
  2904. @@:
  2905.         lodsb
  2906.         stosw
  2907.         loop    @b
  2908.         mov     al, ' '
  2909.         lea     ecx, [ebx-6]
  2910.         cmp     byte [esp], 12
  2911.         jz      .ret_pop
  2912.         add     edx, ecx
  2913.         rep     stosw
  2914.         pop     ecx
  2915.         inc     edx
  2916.         cmp     edx, [cur_width]
  2917.         ja      .ret
  2918.         mov     ah, [keybar_bgr_color]
  2919.         stosw
  2920.         inc     ecx
  2921.         jmp     .l
  2922. .ret_pop:
  2923.         pop     ecx
  2924. .ret:
  2925.         cmp     byte [edi-2], ' '
  2926.         jnz     @f
  2927.         dec     edi
  2928.         dec     edi
  2929. @@:
  2930.         push    edi
  2931.         xor     eax, eax
  2932.         mov     edx, [cur_height]
  2933.         call    get_console_ptr
  2934.         mov     ecx, edi
  2935.         pop     edi
  2936.         sub     ecx, edi
  2937.         shr     ecx, 1
  2938.         mov     al, ' '
  2939.         mov     ah, [keybar_name_color]
  2940.         rep     stosw
  2941. .done:
  2942.         popad
  2943.         ret
  2944.  
  2945. draw_cmdbar:
  2946.         mov     esi, [active_panel]
  2947.         add     esi, panel1_dir - panel1_data
  2948.         xor     eax, eax
  2949.         mov     edx, [cur_height]
  2950.         dec     edx
  2951.         dec     edx
  2952.         call    get_console_ptr
  2953.         mov     ah, [cmdbar_prefix_color]
  2954.         mov     ecx, [cur_width]
  2955.         dec     ecx
  2956. @@:
  2957.         lodsb
  2958.         test    al, al
  2959.         jz      @f
  2960.         stosw
  2961.         loop    @b
  2962. @@:
  2963.         mov     al, '>'
  2964.         stosw
  2965.         mov     al, ' '
  2966.         mov     ah, [cmdbar_normal_color]
  2967.         rep     stosw
  2968.         ret
  2969.  
  2970. draw_border:
  2971.         push    edi
  2972.         mov     al, 0xC9
  2973.         stosw
  2974.         mov     al, 0xCD
  2975.         lea     ecx, [ebx-2]
  2976.         rep     stosw
  2977.         mov     al, 0xBB
  2978.         stosw
  2979.         pop     edi
  2980.         add     edi, [cur_width]
  2981.         add     edi, [cur_width]
  2982.         lea     ecx, [edx-2]
  2983. .l:
  2984.         push    edi
  2985.         mov     al, 0xBA
  2986.         stosw
  2987.         mov     al, 0x20
  2988.         push    ecx
  2989.         lea     ecx, [ebx-2]
  2990.         rep     stosw
  2991.         pop     ecx
  2992.         mov     al, 0xBA
  2993.         stosw
  2994.         pop     edi
  2995.         add     edi, [cur_width]
  2996.         add     edi, [cur_width]
  2997.         loop    .l
  2998.         mov     al, 0xC8
  2999.         stosw
  3000.         mov     al, 0xCD
  3001.         lea     ecx, [ebx-2]
  3002.         rep     stosw
  3003.         mov     al, 0xBC
  3004.         stosw
  3005.         ret
  3006.  
  3007. calc_colwidths:
  3008. ; in: ebp->panel data
  3009.         imul    esi, [ebp + panel1_colmode - panel1_data], PanelMode.size
  3010.         add     esi, colmodes
  3011.         lodsd
  3012.         mov     ecx, eax
  3013.         lea     edx, [ecx-1]
  3014.         xor     ebx, ebx
  3015.         add     esi, PanelMode.ColumnWidths-4
  3016.         push    ecx esi
  3017.         xor     eax, eax
  3018. .loop:
  3019.         lodsb
  3020.         add     edx, eax
  3021.         cmp     al, 1
  3022.         adc     ebx, 0
  3023.         loop    .loop
  3024.         pop     esi ecx
  3025.         lea     edi, [ebp + panel1_colwidths - panel1_data]
  3026.         test    ebx, ebx
  3027.         jz      .loop2
  3028.         mov     eax, [ebp + panel1_width - panel1_data]
  3029.         dec     eax
  3030.         dec     eax
  3031.         sub     eax, edx
  3032.         jae     @f
  3033.         xor     eax, eax
  3034. @@:
  3035.         xor     edx, edx
  3036.         div     ebx
  3037.         test    eax, eax
  3038.         jnz     @f
  3039.         xor     edx, edx
  3040.         inc     eax
  3041. @@:
  3042.         push    eax
  3043. .loop2:
  3044.         movzx   eax, byte [esi]
  3045.         inc     esi
  3046.         test    eax, eax
  3047.         jnz     @f
  3048.         pop     eax
  3049.         push    eax
  3050.         dec     ebx
  3051.         cmp     ebx, edx
  3052.         jae     @f
  3053.         inc     eax
  3054. @@:
  3055.         stosd
  3056.         loop    .loop2
  3057.         pop     eax
  3058.         and     dword [edi], 0
  3059.         ret
  3060.  
  3061. draw_panel:
  3062.         mov     eax, [ebp + panel1_left - panel1_data]
  3063.         mov     edx, [ebp + panel1_top - panel1_data]
  3064.         call    get_console_ptr
  3065. ; draw border
  3066.         mov     ah, [panel_border_color]
  3067.         mov     ebx, [ebp + panel1_width - panel1_data]
  3068.         mov     edx, [ebp + panel1_height - panel1_data]
  3069.         call    draw_border
  3070.         push    eax
  3071.         mov     eax, [ebp + panel1_left - panel1_data]
  3072.         mov     edx, [ebp + panel1_top - panel1_data]
  3073.         add     edx, [ebp + panel1_height - panel1_data]
  3074.         sub     edx, 3
  3075.         call    get_console_ptr
  3076.         pop     eax
  3077.         mov     al, 0xC7
  3078.         stosw
  3079.         mov     al, 0xC4
  3080.         lea     ecx, [ebx-2]
  3081.         rep     stosw
  3082.         mov     al, 0xB6
  3083.         stosw
  3084.  
  3085.         imul    esi, [ebp + panel1_colmode - panel1_data], PanelMode.size
  3086.         add     esi, colmodes
  3087.         lodsd
  3088.         mov     ecx, eax        ; number of columns
  3089.         lea     ebx, [ebp + panel1_colwidths - panel1_data]
  3090.         mov     eax, [ebp + panel1_left - panel1_data]
  3091.         inc     eax
  3092.         mov     [column_left], eax
  3093.         mov     eax, [ebp + panel1_top - panel1_data]
  3094.         inc     eax
  3095.         mov     [column_top], eax
  3096.         mov     eax, [ebp + panel1_height - panel1_data]
  3097.         sub     eax, 4
  3098.         mov     [column_height], eax
  3099.         dec     eax
  3100.         mov     [ebp + panel1_colsz - panel1_data], eax
  3101.         and     [ebp + panel1_colst - panel1_data], 0
  3102.         mov     eax, [ebp + panel1_start - panel1_data]
  3103.         mov     [column_index], eax
  3104.         mov     [last_column_index], eax
  3105. .columns_loop:
  3106.         push    ecx
  3107.         mov     eax, [ebx]
  3108.         add     ebx, 4
  3109.         mov     [column_width], eax
  3110.         cmp     ecx, 1
  3111.         jz      .skip_right_border
  3112.         add     eax, [column_left]
  3113.         mov     edx, [ebp + panel1_top - panel1_data]
  3114.         call    get_console_ptr
  3115.         mov     ah, [panel_header_color]
  3116.         mov     al, 0xD1
  3117.         mov     [edi], ax
  3118.         add     edi, [cur_width]
  3119.         add     edi, [cur_width]
  3120.         mov     ecx, [column_height]
  3121.         mov     al, 0xB3
  3122. @@:
  3123.         mov     [edi], ax
  3124.         add     edi, [cur_width]
  3125.         add     edi, [cur_width]
  3126.         loop    @b
  3127.         mov     al, 0xC1
  3128.         stosw
  3129. .skip_right_border:
  3130.         mov     eax, [column_left]
  3131.         mov     edx, [column_top]
  3132.         call    get_console_ptr
  3133. ; § £®«®¢®ª á⮫¡æ 
  3134.         push    edi
  3135.         mov     edx, [esi]
  3136.         and     edx, 0xF
  3137.         mov     edx, [column_headers+edx*4]
  3138.         movzx   ecx, byte [edx]
  3139.         inc     edx
  3140.         cmp     ecx, [column_width]
  3141.         jb      @f
  3142.         mov     ecx, [column_width]
  3143. @@:
  3144.         push    ecx
  3145.         sub     ecx, [column_width]
  3146.         neg     ecx
  3147.         shr     ecx, 1
  3148.         mov     al, ' '
  3149.         mov     ah, [column_header_color]
  3150.         rep     stosw
  3151.         pop     ecx
  3152.         jecxz   .skipcopyhdr
  3153.         push    ecx
  3154. @@:
  3155.         mov     al, [edx]
  3156.         inc     edx
  3157.         stosw
  3158.         loop    @b
  3159.         pop     ecx
  3160. .skipcopyhdr:
  3161.         sub     ecx, [column_width]
  3162.         neg     ecx
  3163.         inc     ecx
  3164.         shr     ecx, 1
  3165.         mov     al, ' '
  3166.         rep     stosw
  3167.         pop     edi
  3168.         add     edi, [cur_width]
  3169.         add     edi, [cur_width]
  3170. ; á ¬ á⮫¡¥æ
  3171.         mov     eax, [esi]
  3172.         and     eax, 0xF
  3173.         push    ebx esi
  3174.         call    dword [draw_column_proc+eax*4]
  3175.         pop     esi ebx
  3176.         inc     esi
  3177.         mov     eax, [column_width]
  3178.         inc     eax
  3179.         add     [column_left], eax
  3180.         pop     ecx
  3181.         dec     ecx
  3182.         jnz     .columns_loop
  3183. ; ‡ £®«®¢®ª ¯ ­¥«¨ (⥪ãé ï ¯ ¯ª )
  3184.         lea     esi, [ebp + panel1_dir - panel1_data]
  3185.         mov     edi, cur_header
  3186.         mov     ecx, [ebp + panel1_width - panel1_data]
  3187.         sub     ecx, 7
  3188.         movsb
  3189. @@:
  3190.         lodsb
  3191.         stosb
  3192.         dec     ecx
  3193.         test    al, al
  3194.         jz      .header_created
  3195.         cmp     al, '/'
  3196.         jnz     @b
  3197.         mov     edx, esi
  3198. @@:
  3199.         lodsb
  3200.         test    al, al
  3201.         jnz     @b
  3202.         sub     esi, edx
  3203.         dec     esi
  3204.         cmp     esi, ecx
  3205.         jbe     @f
  3206.         mov     word [edi], '..'
  3207.         mov     byte [edi+2], '.'
  3208.         add     edi, 3
  3209.         sub     ecx, 3
  3210.         add     edx, esi
  3211.         sub     edx, ecx
  3212. @@:
  3213.         mov     esi, edx
  3214. @@:
  3215.         lodsb
  3216.         stosb
  3217.         dec     ecx
  3218.         test    al, al
  3219.         jnz     @b
  3220. .header_created:
  3221.         mov     edx, [ebp + panel1_top - panel1_data]
  3222.         mov     eax, [ebp + panel1_left - panel1_data]
  3223.         shr     ecx, 1
  3224.         lea     eax, [eax+ecx+3]
  3225.         call    get_console_ptr
  3226.         mov     ah, [panel_active_header_color]
  3227.         cmp     ebp, [active_panel]
  3228.         jz      @f
  3229.         mov     ah, [panel_header_color]
  3230. @@:
  3231.         mov     al, ' '
  3232.         stosw
  3233.         mov     esi, cur_header
  3234. @@:
  3235.         lodsb
  3236.         test    al, al
  3237.         jz      @f
  3238.         stosw
  3239.         jmp     @b
  3240. @@:
  3241.         mov     al, ' '
  3242.         stosw
  3243.         mov     edx, [ebp + panel1_top - panel1_data]
  3244.         inc     edx
  3245.         mov     eax, [ebp + panel1_left - panel1_data]
  3246.         inc     eax
  3247.         call    get_console_ptr
  3248.         movzx   eax, [ebp + panel1_sortmode - panel1_data]
  3249.         mov     al, [compare_names+eax]
  3250.         stosb
  3251.         mov     eax, [ebp + panel1_selected_num - panel1_data]
  3252.         test    eax, eax
  3253.         jz      .skip_selected_info
  3254. ; ˆ­ä®à¬ æ¨ï ® ¢ë¤¥«¥­­ëå ä ©« å
  3255.         push    dword [ebp + panel1_selected_size+4 - panel1_data]
  3256.         push    dword [ebp + panel1_selected_size - panel1_data]
  3257.         call    fill_total_info
  3258.         mov     eax, [ebp + panel1_width - panel1_data]
  3259.         sub     eax, 2
  3260.         cmp     ecx, eax
  3261.         jbe     @f
  3262.         mov     ecx, eax
  3263.         mov     edi, saved_file_name+512
  3264.         sub     edi, eax
  3265.         mov     byte [edi], '.'
  3266.         mov     word [edi+1], '..'
  3267. @@:
  3268.         mov     esi, edi
  3269.         sub     eax, ecx
  3270.         shr     eax, 1
  3271.         inc     eax
  3272.         add     eax, [ebp + panel1_left - panel1_data]
  3273.         mov     edx, [ebp + panel1_top - panel1_data]
  3274.         add     edx, [ebp + panel1_height - panel1_data]
  3275.         sub     edx, 3
  3276.         call    get_console_ptr
  3277.         mov     ah, [panel_numselected_color]
  3278. @@:
  3279.         lodsb
  3280.         stosw
  3281.         loop    @b
  3282. .skip_selected_info:
  3283. ; ˆ­ä®à¬ æ¨ï ®¡ ®¡é¥¬ ç¨á«¥ ¨ à §¬¥à¥ ä ©«®¢ ¯ ­¥«¨
  3284.         mov     eax, [ebp + panel1_total_num - panel1_data]
  3285.         push    dword [ebp + panel1_total_size+4 - panel1_data]
  3286.         push    dword [ebp + panel1_total_size - panel1_data]
  3287.         call    fill_total_info
  3288.         mov     eax, [ebp + panel1_width - panel1_data]
  3289.         sub     eax, 2
  3290.         cmp     ecx, eax
  3291.         jbe     @f
  3292.         mov     ecx, eax
  3293.         mov     byte [edi+ecx-3], '.'
  3294.         mov     word [edi+ecx-2], '..'
  3295. @@:
  3296.         sub     eax, ecx
  3297.         shr     eax, 1
  3298.         inc     eax
  3299.         add     eax, [ebp + panel1_left - panel1_data]
  3300.         add     edx, [ebp + panel1_top - panel1_data]
  3301.         add     edx, [ebp + panel1_height - panel1_data]
  3302.         dec     edx
  3303.         mov     esi, edi
  3304.         call    get_console_ptr
  3305.         mov     ah, [panel_number_color]
  3306. @@:
  3307.         lodsb
  3308.         stosw
  3309.         loop    @b
  3310.         cmp     [ebp + panel1_numfiles - panel1_data], 0
  3311.         jz      .skip_curinfo
  3312. ; ˆ­ä®à¬ æ¨ï ® ⥪ã饬 ä ©«¥
  3313.         mov     ebx, [ebp + panel1_index - panel1_data]
  3314.         mov     eax, [ebp + panel1_files - panel1_data]
  3315.         mov     ebx, [eax+ebx*4]
  3316.         mov     eax, [ebp + panel1_left - panel1_data]
  3317.         add     eax, [ebp + panel1_width - panel1_data]
  3318.         dec     eax
  3319.         mov     edx, [ebp + panel1_top - panel1_data]
  3320.         add     edx, [ebp + panel1_height - panel1_data]
  3321.         dec     edx
  3322.         dec     edx
  3323.         call    get_console_ptr
  3324.         mov     ecx, [ebp + panel1_width - panel1_data]
  3325.         dec     ecx
  3326.         dec     ecx
  3327.         cmp     [ebp + panel1_colmode - panel1_data], 3
  3328.         jz      .show_curname
  3329. ; ‚à¥¬ï ¬®¤¨ä¨ª æ¨¨
  3330.         sub     edi, 5*2
  3331.         sub     ecx, 6
  3332.         mov     al, [ebx+24+2]
  3333.         aam
  3334.         or      ax, 0x3030
  3335.         mov     [edi], ah
  3336.         mov     [edi+2], al
  3337.         mov     [edi+4], byte ':'
  3338.         mov     al, [ebx+24+1]
  3339.         aam
  3340.         or      ax, 0x3030
  3341.         mov     [edi+6], ah
  3342.         mov     [edi+8], al
  3343.         mov     al, [panel_normal_color]
  3344.         mov     [edi+1], al
  3345.         mov     [edi+3], al
  3346.         mov     [edi+5], al
  3347.         mov     [edi+7], al
  3348.         mov     [edi+9], al
  3349.         dec     edi
  3350.         mov     [edi], al
  3351.         dec     edi
  3352.         mov     byte [edi], ' '
  3353. ; „ â  ¬®¤¨ä¨ª æ¨¨
  3354.         sub     edi, 8*2
  3355.         sub     ecx, 9
  3356.         mov     al, [ebx+28+0]
  3357.         aam
  3358.         or      ax, 0x3030
  3359.         mov     [edi], ah
  3360.         mov     [edi+2], al
  3361.         mov     [edi+4], byte '.'
  3362.         mov     al, [ebx+28+1]
  3363.         aam
  3364.         or      ax, 0x3030
  3365.         mov     [edi+6], ah
  3366.         mov     [edi+8], al
  3367.         mov     [edi+10], byte '.'
  3368.         mov     ax, [ebx+28+2]
  3369.         div     [_100]
  3370.         mov     al, ah
  3371.         aam
  3372.         or      ax, 0x3030
  3373.         mov     [edi+12], ah
  3374.         mov     [edi+14], al
  3375.         mov     al, [panel_normal_color]
  3376.         mov     [edi+1], al
  3377.         mov     [edi+3], al
  3378.         mov     [edi+5], al
  3379.         mov     [edi+7], al
  3380.         mov     [edi+9], al
  3381.         mov     [edi+11], al
  3382.         mov     [edi+13], al
  3383.         mov     [edi+15], al
  3384.         dec     edi
  3385.         mov     [edi], al
  3386.         dec     edi
  3387.         mov     [edi], byte ' '
  3388. ;  §¬¥à
  3389.         std
  3390.         mov     ah, [panel_normal_color]
  3391.         dec     edi
  3392.         dec     edi
  3393.         dec     ecx
  3394.         test    byte [ebx], 0x10
  3395.         jz      .size_file
  3396.         push    ecx
  3397.         mov     esi, aFolder+aFolder.size-1
  3398.         mov     ecx, aFolder.size
  3399.         cmp     word [ebx+40], '..'
  3400.         jnz     @f
  3401.         cmp     byte [ebx+42], 0
  3402.         jnz     @f
  3403.         mov     esi, aUp+aUp.size-1
  3404.         mov     cl, aUp.size
  3405. @@:
  3406.         sub     [esp], ecx
  3407. @@:
  3408.         lodsb
  3409.         stosw
  3410.         loop    @b
  3411.         pop     ecx
  3412.         jmp     .size_done
  3413. .size_file:
  3414.         mov     edx, [ebx+36]
  3415.         test    edx, edx
  3416.         jz      .size_less_4g
  3417.         cmp     edx, 10*256
  3418.         jae     .size_tera
  3419. ; ¢ £¨£ ¡ ©â å
  3420.         mov     al, 'G'
  3421.         shl     edx, 2
  3422.         jmp     .size_letter
  3423. .size_tera:
  3424. ; ¢ â¥à ¡ ©â å
  3425.         shr     edx, 8
  3426.         mov     al, 'T'
  3427.         jmp     .size_letter
  3428. .size_less_4g:
  3429.         mov     edx, [ebx+32]
  3430.         cmp     edx, 10*(1 shl 20)
  3431.         jae     .size_mega
  3432.         cmp     edx, 1 shl 20
  3433.         jb      .size_num
  3434.         shr     edx, 10
  3435.         mov     al, 'K'
  3436.         jmp     .size_letter
  3437. .size_mega:
  3438.         mov     al, 'M'
  3439.         shr     edx, 20
  3440. .size_letter:
  3441.         stosw
  3442.         dec     ecx
  3443.         mov     al, ' '
  3444.         stosw
  3445.         dec     ecx
  3446. .size_num:
  3447.         xchg    eax, edx
  3448.         xor     edx, edx
  3449.         div     [_10d]
  3450.         xchg    eax, edx
  3451.         add     al, '0'
  3452.         mov     ah, [panel_normal_color]
  3453.         stosw
  3454.         dec     ecx
  3455.         test    edx, edx
  3456.         jnz     .size_num
  3457. .size_done:
  3458.         cld
  3459. .show_curname:
  3460. ; ˆ¬ï
  3461.         sub     edi, ecx
  3462.         sub     edi, ecx
  3463.         lea     esi, [ebx+40]
  3464. @@:
  3465.         lodsb
  3466.         test    al, al
  3467.         jnz     @b
  3468.         sub     esi, ebx
  3469.         sub     esi, 41
  3470.         mov     ah, [panel_normal_color]
  3471.         cmp     esi, ecx
  3472.         lea     edx, [ebx+40]
  3473.         jbe     @f
  3474.         mov     al, '{'
  3475.         mov     [edi-2], ax
  3476.         add     edx, esi
  3477.         sub     edx, ecx
  3478. @@:
  3479.         mov     esi, edx
  3480. @@:
  3481.         lodsb
  3482.         test    al, al
  3483.         jz      @f
  3484.         stosw
  3485.         loop    @b
  3486. @@:
  3487.         mov     al, ' '
  3488.         rep     stosw
  3489. .skip_curinfo:
  3490.         call    draw_image
  3491.         ret
  3492.  
  3493. fill_total_info:
  3494.         mov     edi, saved_file_name+511
  3495.         mov     byte [edi], ' '
  3496. if lang eq ru
  3497.         mov     byte [edi-1], '¥'
  3498.         dec     edi
  3499.         cmp     eax, 1
  3500.         jz      @f
  3501.         mov     word [edi-1], ' å'
  3502.         dec     edi
  3503. @@:
  3504.         mov     dword [edi-4], 'ä ©«'
  3505.         mov     byte [edi-5], ' '
  3506.         sub     edi, 5
  3507. else
  3508.         cmp     eax, 1
  3509.         jz      @f
  3510.         dec     edi
  3511.         mov     byte [edi], 's'
  3512. @@:
  3513.         mov     dword [edi-4], 'file'
  3514.         mov     byte [edi-5], ' '
  3515.         sub     edi, 5
  3516. end if
  3517.         xor     edx, edx
  3518.         push    10
  3519.         pop     ecx
  3520. @@:
  3521.         div     ecx
  3522.         dec     edi
  3523.         add     dl, '0'
  3524.         mov     [edi], dl
  3525.         xor     edx, edx
  3526.         test    eax, eax
  3527.         jnz     @b
  3528. if lang eq ru
  3529.         mov     dword [edi-4], 'â ¢ '
  3530.         mov     dword [edi-8], ' ¡ ©'
  3531.         sub     edi, 8
  3532. else
  3533.         mov     dword [edi-4], ' in '
  3534.         mov     dword [edi-8], 'ytes'
  3535.         mov     word [edi-10], ' b'
  3536.         sub     edi, 10
  3537. end if
  3538.         lea     esi, [edi-3]
  3539.         mov     edx, [esp+8]
  3540.         mov     eax, [esp+4]
  3541. .selsizel:
  3542.         push    edx
  3543.         mov     ebx, edx
  3544.         xor     edx, edx
  3545.         add     ebx, ebx
  3546.         adc     edx, edx
  3547.         push    ebx
  3548.         push    edx
  3549.         add     ebx, ebx
  3550.         adc     edx, edx
  3551.         add     ebx, [esp+4]
  3552.         adc     edx, [esp]
  3553.         add     esp, 8
  3554.         add     eax, ebx
  3555.         adc     edx, 0
  3556.         div     ecx
  3557.         dec     edi
  3558.         cmp     edi, esi
  3559.         jae     @f
  3560.         mov     byte [edi], ','
  3561.         dec     edi
  3562.         sub     esi, 4
  3563. @@:
  3564.         pop     ebx
  3565.         add     dl, '0'
  3566.         mov     byte [edi], dl
  3567.         xchg    eax, ebx
  3568.         mul     [muldiv10]
  3569.         add     eax, ebx
  3570.         adc     edx, 0
  3571.         mov     ebx, eax
  3572.         or      ebx, edx
  3573.         jnz     .selsizel
  3574.         dec     edi
  3575.         mov     byte [edi], ' '
  3576.         mov     ecx, saved_file_name+512
  3577.         sub     ecx, edi
  3578.         ret     8
  3579.  
  3580. get_file_color:
  3581.         mov     ah, [esi + 6]
  3582.         cmp     ebp, [active_panel]
  3583.         jnz     @f
  3584.         cmp     ecx, [ebp + panel1_index - panel1_data]
  3585.         jnz     @f
  3586.         mov     ah, [esi + 7]
  3587. @@:
  3588.         test    byte [esi + 303], 1
  3589.         jnz     @f
  3590.         mov     ah, [esi + 4]
  3591.         cmp     ebp, [active_panel]
  3592.         jnz     @f
  3593.         cmp     ecx, [ebp + panel1_index - panel1_data]
  3594.         jnz     @f
  3595.         mov     ah, [esi + 5]
  3596. @@:
  3597.         ret
  3598.  
  3599. draw_name_column:
  3600.         mov     eax, [column_index]
  3601.         mov     [last_column_index], eax
  3602.         mov     edx, [ebp + panel1_numfiles - panel1_data]
  3603.         mov     ecx, [column_height]
  3604.         dec     ecx
  3605. .l:
  3606.         cmp     [column_index], edx
  3607.         jae     .ret
  3608.         push    ecx
  3609.         mov     ecx, [column_index]
  3610.         mov     esi, [ebp + panel1_files - panel1_data]
  3611.         mov     esi, [esi+ecx*4]
  3612.         mov     ebx, [esi]
  3613.         call    get_file_color
  3614.         add     esi, 40
  3615.         mov     ecx, [column_width]
  3616.         push    edi
  3617. @@:
  3618.         lodsb
  3619.         test    al, al
  3620.         jz      @f
  3621.         stosw
  3622.         loop    @b
  3623.         lodsb
  3624.         test    al, al
  3625.         jz      @f
  3626.         mov     byte [edi], '}'
  3627.         jmp     .continue
  3628. @@:
  3629.         test    bl, 10h
  3630.         jnz     .noalignext
  3631.         mov     ebx, [ebp + panel1_colmode - panel1_data]
  3632. ; sizeof(PanelMode) = 40
  3633.         lea     ebx, [ebx+ebx*4]
  3634.         cmp     [colmodes+ebx*8+PanelMode.bAlignExtensions], 0
  3635.         jz      .noalignext
  3636.         push    ecx
  3637.         sub     ecx, [column_width]
  3638.         neg     ecx
  3639.         jz      .noalignext2
  3640.         dec     esi
  3641. @@:
  3642.         dec     esi
  3643.         cmp     byte [esi], '.'
  3644.         loopnz  @b
  3645.         jnz     .noalignext2
  3646.         inc     esi
  3647.         sub     ecx, [column_width]
  3648.         neg     ecx
  3649.         sub     ecx, [esp]
  3650.         sub     edi, ecx
  3651.         sub     edi, ecx
  3652.         dec     ecx
  3653.         mov     ebx, [esp+4]
  3654.         cmp     ecx, 3
  3655.         ja      @f
  3656.         mov     cl, 3
  3657. @@:
  3658.         sub     ecx, [column_width]
  3659.         sub     ebx, edi
  3660.         sar     ebx, 1
  3661.         sub     ebx, ecx
  3662.         pop     ecx
  3663.         inc     ecx
  3664.         push    0
  3665.         cmp     ecx, ebx
  3666.         jbe     @f
  3667.         sub     ecx, ebx
  3668.         mov     [esp], ecx
  3669.         mov     ecx, ebx
  3670. @@:
  3671.         mov     al, ' '
  3672.         rep     stosw
  3673. @@:
  3674.         lodsb
  3675.         test    al, al
  3676.         jz      .noalignext2
  3677.         stosw
  3678.         jmp     @b
  3679. .noalignext2:
  3680.         pop     ecx
  3681. .noalignext:
  3682.         mov     al, ' '
  3683.         rep     stosw
  3684. .continue:
  3685.         pop     edi
  3686.         add     edi, [cur_width]
  3687.         add     edi, [cur_width]
  3688.         inc     [column_index]
  3689.         pop     ecx
  3690.         dec     ecx
  3691.         jnz     .l
  3692. .ret:
  3693.         mov     eax, [ebp + panel1_colsz - panel1_data]
  3694.         add     [ebp + panel1_colst - panel1_data], eax
  3695.         cmp     ebp, panel1_data
  3696.         jnz     .ret2
  3697. ; —¨á«® íªà ­®¢
  3698.         mov     eax, [num_screens]
  3699.         dec     eax
  3700.         jz      .ret2
  3701.         push    eax
  3702.         xor     eax, eax
  3703.         xor     edx, edx
  3704.         call    get_console_ptr
  3705.         mov     ah, [panel_nscreens_color]
  3706.         mov     al, '['
  3707.         stosw
  3708.         pop     eax
  3709.         push    -'0'
  3710. @@:
  3711.         xor     edx, edx
  3712.         div     [_10d]
  3713.         push    edx
  3714.         test    eax, eax
  3715.         jnz     @b
  3716. @@:
  3717.         pop     eax
  3718.         add     eax, '0'
  3719.         jz      @f
  3720.         mov     ah, [panel_nscreens_color]
  3721.         stosw
  3722.         jmp     @b
  3723. @@:
  3724.         mov     al, ']'
  3725.         mov     ah, [panel_nscreens_color]
  3726.         stosw
  3727. .ret2:
  3728. draw_empty_column:
  3729.         ret
  3730.  
  3731. draw_size_column:
  3732.         add     edi, [column_width]
  3733.         add     edi, [column_width]
  3734.         dec     edi
  3735.         dec     edi
  3736.         std
  3737.         mov     ecx, [column_height]
  3738.         dec     ecx
  3739.         push    [last_column_index]
  3740. .l:
  3741.         mov     edx, [ebp + panel1_numfiles - panel1_data]
  3742.         cmp     [last_column_index], edx
  3743.         jae     .ret
  3744.         push    ecx
  3745.         push    edi
  3746.         mov     ecx, [last_column_index]
  3747.         mov     esi, [ebp + panel1_files - panel1_data]
  3748.         mov     esi, [esi+ecx*4]
  3749.         call    get_file_color
  3750.         mov     ecx, [column_width]
  3751. @@:
  3752.         mov     ebx, eax
  3753.         cmp     word [esi+40], '..'
  3754.         jnz     .nodotdot
  3755.         cmp     byte [esi+42], 0
  3756.         jnz     .nodotdot
  3757. if lang eq ru
  3758.         mov     al, 'å'
  3759.         stosw
  3760.         mov     al, 'à'
  3761.         stosw
  3762.         mov     al, '¥'
  3763.         stosw
  3764.         mov     al, '¢'
  3765.         stosw
  3766.         mov     al, '‚'
  3767.         stosw
  3768.         sub     ecx, 5
  3769. else
  3770.         mov     al, ' '
  3771.         stosw
  3772.         stosw
  3773.         mov     al, 'p'
  3774.         stosw
  3775.         mov     al, 'U'
  3776.         stosw
  3777.         sub     ecx, 4
  3778. end if
  3779.         jmp     .size_written
  3780. .nodotdot:
  3781.         test    byte [esi], 10h
  3782.         jz      .nofolder
  3783. if lang eq ru
  3784.         mov     al, ' '
  3785.         stosw
  3786.         mov     al, 'ª'
  3787.         stosw
  3788.         mov     al, '¯'
  3789.         stosw
  3790.         mov     al, ' '
  3791.         stosw
  3792.         mov     al, ''
  3793.         stosw
  3794.         sub     ecx, 5
  3795. else
  3796.         mov     al, 'r'
  3797.         stosw
  3798.         mov     al, 'e'
  3799.         stosw
  3800.         mov     al, 'd'
  3801.         stosw
  3802.         mov     al, 'l'
  3803.         stosw
  3804.         mov     al, 'o'
  3805.         stosw
  3806.         mov     al, 'F'
  3807.         stosw
  3808.         sub     ecx, 6
  3809. end if
  3810.         jmp     .size_written
  3811. .nofolder:
  3812.         mov     eax, [esi+32]
  3813.         mov     edx, [esi+36]
  3814.         test    edx, edx
  3815.         jz      .less_4G
  3816.         cmp     edx, 10000/4*1024
  3817.         jb      .giga
  3818.         mov     al, 'T'
  3819.         shr     edx, 10
  3820.         jmp     .write_letter
  3821. .giga:
  3822.         mov     al, 'G'
  3823.         shl     edx, 2
  3824.         jmp     .write_letter
  3825. .less_4G:
  3826.         mov     edx, eax
  3827.         cmp     eax, 1000000
  3828.         jb      .byte
  3829.         cmp     eax, 10000*1024
  3830.         jb      .kilo
  3831.         mov     al, 'M'
  3832.         shr     edx, 20
  3833.         jmp     .write_letter
  3834. .kilo:
  3835.         mov     al, 'K'
  3836.         shr     edx, 10
  3837. .write_letter:
  3838.         mov     ah, bh
  3839.         stosw
  3840.         mov     al, ' '
  3841.         stosw
  3842.         dec     ecx
  3843.         dec     ecx
  3844. .byte:
  3845.         xchg    eax, edx
  3846.         xor     edx, edx
  3847.         div     [_10d]
  3848.         xchg    eax, edx
  3849.         add     al, '0'
  3850.         mov     ah, bh
  3851.         stosw
  3852.         dec     ecx
  3853.         test    edx, edx
  3854.         jnz     .byte
  3855. .size_written:
  3856.         mov     eax, ebx
  3857.         test    ecx, ecx
  3858.         jle     @f
  3859.         mov     al, ' '
  3860.         rep     stosw
  3861. @@:
  3862.         mov     byte [edi+1], ah
  3863.         pop     edi
  3864.         add     edi, [cur_width]
  3865.         add     edi, [cur_width]
  3866.         inc     [last_column_index]
  3867.         pop     ecx
  3868.         dec     ecx
  3869.         jnz     .l
  3870. .ret:
  3871.         pop     [last_column_index]
  3872.         cld
  3873.         ret
  3874.  
  3875. draw_date_column:
  3876.         mov     ecx, [column_height]
  3877.         dec     ecx
  3878.         push    [last_column_index]
  3879. .l:
  3880.         mov     edx, [ebp + panel1_numfiles - panel1_data]
  3881.         cmp     [last_column_index], edx
  3882.         jae     .ret
  3883.         push    ecx
  3884.         push    edi
  3885.         mov     ecx, [last_column_index]
  3886.         mov     esi, [ebp + panel1_files - panel1_data]
  3887.         mov     esi, [esi+ecx*4]
  3888.         call    get_file_color
  3889.         mov     bh, ah
  3890.         mov     byte [edi-1], bh
  3891.         mov     al, [esi+28]
  3892.         aam
  3893.         add     eax, '00'
  3894.         push    eax
  3895.         mov     al, ah
  3896.         mov     ah, bh
  3897.         stosw
  3898.         pop     eax
  3899.         mov     ah, bh
  3900.         stosw
  3901.         mov     al, '.'
  3902.         stosw
  3903.         mov     al, [esi+29]
  3904.         aam
  3905.         add     eax, '00'
  3906.         push    eax
  3907.         mov     al, ah
  3908.         mov     ah, bh
  3909.         stosw
  3910.         pop     eax
  3911.         mov     ah, bh
  3912.         stosw
  3913.         mov     al, '.'
  3914.         stosw
  3915.         movzx   eax, word [esi+30]
  3916.         xor     edx, edx
  3917.         div     [_10d]
  3918.         xchg    eax, edx
  3919.         add     al, '0'
  3920.         mov     ah, bh
  3921.         mov     [edi+2], ax
  3922.         xchg    eax, edx
  3923.         xor     edx, edx
  3924.         div     [_10d]
  3925.         xchg    eax, edx
  3926.         add     al, '0'
  3927.         mov     ah, bh
  3928.         stosw
  3929.         pop     edi
  3930.         add     edi, [cur_width]
  3931.         add     edi, [cur_width]
  3932.         inc     [last_column_index]
  3933.         pop     ecx
  3934.         dec     ecx
  3935.         jnz     .l
  3936. .ret:
  3937.         pop     [last_column_index]
  3938.         cld
  3939.         ret
  3940.  
  3941. draw_time_column:
  3942.         mov     ecx, [column_height]
  3943.         dec     ecx
  3944.         push    [last_column_index]
  3945. .l:
  3946.         mov     edx, [ebp + panel1_numfiles - panel1_data]
  3947.         cmp     [last_column_index], edx
  3948.         jae     .ret
  3949.         push    ecx
  3950.         push    edi
  3951.         mov     ecx, [last_column_index]
  3952.         mov     esi, [ebp + panel1_files - panel1_data]
  3953.         mov     esi, [esi+ecx*4]
  3954.         call    get_file_color
  3955.         mov     bh, ah
  3956.         mov     byte [edi-1], bh
  3957.         mov     al, [esi+26]
  3958.         aam
  3959.         add     eax, '00'
  3960.         push    eax
  3961.         mov     al, ah
  3962.         mov     ah, bh
  3963.         stosw
  3964.         pop     eax
  3965.         mov     ah, bh
  3966.         stosw
  3967.         mov     al, ':'
  3968.         stosw
  3969.         mov     al, [esi+25]
  3970.         aam
  3971.         add     eax, '00'
  3972.         push    eax
  3973.         mov     al, ah
  3974.         mov     ah, bh
  3975.         stosw
  3976.         pop     eax
  3977.         mov     ah, bh
  3978.         stosw
  3979.         pop     edi
  3980.         add     edi, [cur_width]
  3981.         add     edi, [cur_width]
  3982.         inc     [last_column_index]
  3983.         pop     ecx
  3984.         dec     ecx
  3985.         jnz     .l
  3986. .ret:
  3987.         pop     [last_column_index]
  3988.         cld
  3989.         ret
  3990.  
  3991. ;insert_last_dot:
  3992. ;        push    eax esi
  3993. ;        mov     ah, 0
  3994. ;.loop:
  3995. ;        lodsb
  3996. ;        test    al, al
  3997. ;        jz      .done
  3998. ;        cmp     al, '.'
  3999. ;        jnz     .loop
  4000. ;        mov     ah, 1
  4001. ;        jmp     .loop
  4002. ;.done:
  4003. ;        test    ah, ah
  4004. ;        jnz     @f
  4005. ;        mov     byte [esi-1], '.'
  4006. ;        mov     byte [esi], 0
  4007. ;@@:
  4008. ;        pop     esi eax
  4009. ;        ret
  4010.  
  4011. ;delete_last_dot:
  4012. ;        push    esi
  4013. ;@@:
  4014. ;        cmp     byte [esi], 0
  4015. ;        jz      @f
  4016. ;        inc     esi
  4017. ;        jmp     @b
  4018. ;@@:
  4019. ;        cmp     byte [esi-1], '.'
  4020. ;        jnz     @f
  4021. ;        mov     byte [esi-1], 0
  4022. ;@@:     pop     esi
  4023. ;        ret
  4024.  
  4025. read_folder:
  4026.         mov     eax, [ebp + panel1_nfa - panel1_data]
  4027.         mov     [dirinfo.size], eax
  4028.         shl     eax, 2
  4029.         add     eax, [ebp + panel1_files - panel1_data]
  4030.         mov     [dirinfo.dirdata], eax
  4031.         lea     eax, [ebp + panel1_dir - panel1_data]
  4032.         mov     [dirinfo.name], eax
  4033.         xor     eax, eax
  4034.         mov     [ebp + panel1_total_num - panel1_data], eax
  4035.         mov     dword [ebp + panel1_total_size - panel1_data], eax
  4036.         mov     dword [ebp + panel1_total_size+4 - panel1_data], eax
  4037.         mov     [ebp + panel1_selected_num - panel1_data], eax
  4038.         mov     dword [ebp + panel1_selected_size - panel1_data], eax
  4039.         mov     dword [ebp + panel1_selected_size+4 - panel1_data], eax
  4040. .retry:
  4041.         push    70
  4042.         pop     eax
  4043.         mov     ebx, dirinfo
  4044.         int     40h
  4045.         test    eax, eax
  4046.         jz      .ok
  4047.         cmp     eax, 6
  4048.         jz      .ok
  4049. ; Failed to read folder, notify user
  4050.         cmp     [bSilentFolderMode], 0
  4051.         jnz     .dont_notify
  4052.         push    dword aContinue
  4053.         push    dword aRetry
  4054.         mov     edx, esp
  4055.         call    get_error_msg
  4056.         push    [dirinfo.name]
  4057.         push    dword aCannotReadFolder
  4058.         push    eax
  4059.         mov     eax, esp
  4060.         push    edx
  4061.         push    2
  4062.         push    eax
  4063.         push    3
  4064.         push    -1
  4065.         push    -1
  4066.         push    dword aError
  4067.         call    SayErr
  4068.         add     esp, 5*4
  4069.         test    eax, eax
  4070.         jz      .retry
  4071. .dont_notify:
  4072.         mov     esi, prev_dir
  4073.         cmp     byte [esi], 0
  4074.         jz      @f
  4075.         lea     edi, [ebp + panel1_dir - panel1_data]
  4076.         mov     ecx, 1024/4
  4077.         rep     movsd
  4078.         mov     byte [prev_dir], 0
  4079.         ret
  4080. @@:
  4081.         mov     [bSilentFolderMode], 1  ; enter silent mode
  4082.         mov     esi, [dirinfo.name]
  4083.         xor     edx, edx
  4084. .up1:
  4085.         lodsb
  4086.         test    al, al
  4087.         jz      .up1done
  4088.         cmp     al, '/'
  4089.         jnz     .up1
  4090.         inc     edx
  4091.         lea     edi, [esi-1]
  4092.         jmp     .up1
  4093. .up1done:
  4094.         cmp     edx, 2
  4095.         jbe     .noup
  4096.         stosb
  4097.         jmp     read_folder
  4098. .noup:
  4099.         mov     esi, [dirinfo.name]
  4100.         mov     edi, esi
  4101.         lodsd
  4102.         or      eax, 0x00202000
  4103.         cmp     eax, '/rd/'
  4104.         jnz     @f
  4105.         lodsw
  4106.         cmp     ax, '1'
  4107.         jz      .nosetrd
  4108. @@:
  4109.         mov     eax, '/rd/'
  4110.         stosd
  4111.         mov     ax, '1'
  4112.         stosw
  4113.         jmp     read_folder
  4114. .nosetrd:
  4115. ; „ ¦¥ à ¬¤¨áª ­¥ ¯à®ç¨â «áï. ‡­ ç¨â, ­¥ áã¤ì¡ ...
  4116.         and     dword [ebp + panel1_numfiles - panel1_data], 0
  4117.         and     dword [ebp + panel1_index - panel1_data], 0
  4118.         and     dword [ebp + panel1_start - panel1_data], 0
  4119.         mov     [bSilentFolderMode], 0  ; leave silent mode
  4120.         ret
  4121. .ok:
  4122.         mov     eax, [dirinfo.dirdata]
  4123.         cmp     [eax+8], ebx
  4124.         jz      .readdone
  4125.         push    dword [eax+8]
  4126.         mov     ecx, [ebp + panel1_files - panel1_data]
  4127.         call    pgfree
  4128.         pop     ecx
  4129.         add     ecx, 0xF
  4130.         and     ecx, not 0xF
  4131.         push    ecx
  4132.         imul    ecx, 4+304
  4133.         add     ecx, 32
  4134.         call    xpgalloc
  4135.         test    eax, eax
  4136.         jnz     .succ1
  4137.         pop     eax
  4138.         jmp     .readdone
  4139. .succ1:
  4140.         mov     [ebp + panel1_files - panel1_data], eax
  4141.         pop     [ebp + panel1_nfa - panel1_data]
  4142.         mov     [prev_dir], 0
  4143.         jmp     read_folder
  4144. .readdone:
  4145.         and     [ebp + panel1_start - panel1_data], 0
  4146.         and     [ebp + panel1_index - panel1_data], 0
  4147.         and     [ebp + panel1_start - panel1_data], 0
  4148.         mov     edi, [ebp + panel1_files - panel1_data]
  4149.         mov     eax, [ebp + panel1_nfa - panel1_data]
  4150.         lea     eax, [edi + eax*4 + 32]
  4151.         mov     ecx, [eax-32+4]
  4152.         test    ecx, ecx
  4153.         jz      .loopdone
  4154.         xor     edx, edx
  4155. ; ˆ£­®à¨à㥬 ᯥ樠«ì­ë¥ ¢å®¤ë, ᮮ⢥âáâ¢ãî騥 ¯ ¯ª¥ '.' ¨ ¬¥âª¥ ⮬ 
  4156. .ptrinit:
  4157.         cmp     word [eax+40], '.'
  4158.         jz      .loopcont
  4159.         test    byte [eax], 8
  4160.         jnz     .loopcont
  4161.         mov     byte [eax+303], 0
  4162.         test    edx, edx
  4163.         jnz     .nodotdot
  4164.         cmp     word [eax+40], '..'
  4165.         jnz     .nodotdot
  4166.         cmp     byte [eax+42], 0
  4167.         jnz     .nodotdot
  4168.         mov     edx, eax
  4169.         push    edi
  4170. @@:
  4171.         cmp     edi, [ebp + panel1_files - panel1_data]
  4172.         jbe     @f
  4173.         push    dword [edi-4]
  4174.         pop     dword [edi]
  4175.         sub     edi, 4
  4176.         jmp     @b
  4177. @@:
  4178.         stosd
  4179.         pop     edi
  4180.         scasd
  4181.         jmp     .dotdot
  4182. .nodotdot:
  4183.         stosd
  4184.         xor     ebx, ebx
  4185.         test    byte [eax], 10h
  4186.         setz    bl
  4187.         add     [ebp + panel1_total_num - panel1_data], ebx
  4188.         mov     ebx, dword [eax+32]
  4189.         add     dword [ebp + panel1_total_size - panel1_data], ebx
  4190.         mov     ebx, dword [eax+36]
  4191.         adc     dword [ebp + panel1_total_size+4 - panel1_data], ebx
  4192. .dotdot:
  4193. ; ¯®¤á¢¥âª 
  4194. ;        call    insert_last_dot
  4195.         pushad
  4196.         mov     ebp, eax
  4197.         lea     esi, [ebp+40]
  4198.         mov     edi, lower_file_name
  4199.         mov     edx, edi
  4200.         xor     eax, eax
  4201. @@:
  4202.         lodsb
  4203.         mov     al, [tolower_table+eax]
  4204.         stosb
  4205.         test    al, al
  4206.         jnz     @b
  4207.         mov     esi, edx
  4208.         lea     edx, [edi-1]
  4209.         xor     ecx, ecx
  4210. .highlight_test_loop:
  4211.         mov     ebx, [highlight_groups+ecx*4]
  4212.         mov     al, [ebx + highlight.IncludeAttributes]
  4213.         mov     ah, [ebp]
  4214.         and     ah, al
  4215.         cmp     ah, al
  4216.         jnz     .highlight_test_failed
  4217.         lea     edi, [ebx + highlight.Mask]
  4218.         call    match_mask_rev_lowercase
  4219.         jc      .highlight_test_failed
  4220.         mov     ah, [ebx + highlight.NormalColor]
  4221.         test    ah, ah
  4222.         jnz     @f
  4223.         mov     ah, [panel_normal_color]
  4224. @@:
  4225.         mov     [ebp+4], ah
  4226.         mov     ah, [ebx + highlight.CursorColor]
  4227.         test    ah, ah
  4228.         jnz     @f
  4229.         mov     ah, [panel_cursor_color]
  4230. @@:
  4231.         mov     [ebp+5], ah
  4232.         mov     ah, [ebx + highlight.SelectedColor]
  4233.         test    ah, ah
  4234.         jnz     @f
  4235.         mov     ah, [panel_selected_color]
  4236. @@:
  4237.         mov     [ebp+6], ah
  4238.         mov     ah, [ebx + highlight.SelectedCursorColor]
  4239.         test    ah, ah
  4240.         jnz     @f
  4241.         mov     ah, [panel_selected_cursor_color]
  4242. @@:
  4243.         mov     [ebp+7], ah
  4244.         jmp     .doname
  4245. .highlight_test_failed:
  4246.         inc     ecx
  4247.         cmp     ecx, [highlight_num_groups]
  4248.         jb      .highlight_test_loop
  4249. .nohighlight:
  4250.         mov     ah, [panel_normal_color]
  4251.         mov     [ebp+4], ah
  4252.         mov     ah, [panel_cursor_color]
  4253.         mov     [ebp+5], ah
  4254.         mov     ah, [panel_selected_color]
  4255.         mov     [ebp+6], ah
  4256.         mov     ah, [panel_selected_cursor_color]
  4257.         mov     [ebp+7], ah
  4258. .doname:
  4259. ;        call    delete_last_dot
  4260.         popad
  4261. .loopcont:
  4262.         add     eax, 304
  4263.         dec     ecx
  4264.         jnz     .ptrinit
  4265. .loopdone:
  4266.         sub     edi, [ebp + panel1_files - panel1_data]
  4267.         shr     edi, 2
  4268.         mov     [ebp + panel1_numfiles - panel1_data], edi
  4269. .done:
  4270. ; ‘®àâ¨à®¢ª 
  4271. sort_files:
  4272.         movzx   eax, [ebp + panel1_sortmode - panel1_data]
  4273.         mov     ebx, [compare_fns + eax*4]
  4274.         mov     edx, [ebp + panel1_files - panel1_data]
  4275.         mov     ecx, [ebp + panel1_numfiles - panel1_data]
  4276.         jecxz   .skip
  4277.         mov     eax, [edx]
  4278.         cmp     word [eax+40], '..'
  4279.         jnz     .nodotdot
  4280.         cmp     byte [eax+42], 0
  4281.         jnz     .nodotdot
  4282.         dec     ecx
  4283.         add     edx, 4
  4284. .nodotdot:
  4285.         call    sort
  4286. .skip:
  4287.         mov     [bSilentFolderMode], 0  ; leave silent mode
  4288.         ret
  4289.  
  4290. compare_name:
  4291.         test    byte [esi], 10h
  4292.         jnz     .1dir
  4293.         test    byte [edi], 10h
  4294.         jnz     .greater
  4295. .eq1:
  4296.         add     esi, 40
  4297.         add     edi, 40
  4298.         jmp     strcmpi
  4299. .greater:
  4300.         test    esi, esi
  4301.         ret
  4302. .1dir:
  4303.         test    byte [edi], 10h
  4304.         jnz     .eq1
  4305. .less:
  4306.         xor     edi, edi
  4307.         stc
  4308.         ret
  4309.  
  4310. compare_name_rev:
  4311.         test    byte [esi], 10h
  4312.         jnz     .1dir
  4313.         test    byte [edi], 10h
  4314.         jnz     .greater
  4315. .eq1:
  4316.         add     esi, 40
  4317.         add     edi, 40
  4318.         xchg    esi, edi
  4319.         jmp     strcmpi
  4320. .greater:
  4321.         test    esi, esi
  4322.         ret
  4323. .1dir:
  4324.         test    byte [edi], 10h
  4325.         jnz     .eq1
  4326. .less:
  4327.         xor     edi, edi
  4328.         stc
  4329.         ret
  4330.  
  4331. strcmpi:
  4332.         push    eax
  4333. @@:
  4334.         lodsb
  4335.         call    match_symbol
  4336.         jnz     .ret
  4337.         inc     edi
  4338.         test    al, al
  4339.         jnz     @b
  4340. .ret:
  4341.         pop     eax
  4342.         ret
  4343.  
  4344. compare_ext:
  4345.         test    byte [esi], 10h
  4346.         jnz     .1dir
  4347.         test    byte [edi], 10h
  4348.         jnz     .greater
  4349. .eq1:
  4350.         add     esi, 40
  4351.         add     edi, 40
  4352.         push    esi edi
  4353.         call    seek_ext
  4354.         xchg    esi, edi
  4355.         call    seek_ext
  4356.         xchg    esi, edi
  4357.         call    strcmpi
  4358.         jnz     .ret
  4359.         pop     edi esi
  4360.         jmp     strcmpi
  4361. .ret:
  4362.         pop     edi esi
  4363.         ret
  4364. .greater:
  4365.         test    esi, esi
  4366.         ret
  4367. .1dir:
  4368.         test    byte [edi], 10h
  4369.         jnz     .eq1
  4370. .less:
  4371.         xor     edi, edi
  4372.         stc
  4373.         ret
  4374.  
  4375. compare_ext_rev:
  4376.         test    byte [esi], 10h
  4377.         jnz     .1dir
  4378.         test    byte [edi], 10h
  4379.         jnz     .greater
  4380. .eq1:
  4381.         add     esi, 40
  4382.         add     edi, 40
  4383.         push    esi edi
  4384.         call    seek_ext
  4385.         xchg    esi, edi
  4386.         call    seek_ext
  4387.         call    strcmpi
  4388.         jnz     .ret
  4389.         pop     edi esi
  4390.         xchg    esi, edi
  4391.         jmp     strcmpi
  4392. .ret:
  4393.         pop     edi esi
  4394.         ret
  4395. .greater:
  4396.         test    esi, esi
  4397.         ret
  4398. .1dir:
  4399.         test    byte [edi], 10h
  4400.         jnz     .eq1
  4401. .less:
  4402.         xor     edi, edi
  4403.         stc
  4404.         ret
  4405.  
  4406. seek_ext:
  4407.         push    eax
  4408.         xor     eax, eax
  4409. .l:
  4410.         inc     esi
  4411.         cmp     byte [esi-1], '.'
  4412.         jnz     @f
  4413.         mov     eax, esi
  4414. @@:
  4415.         cmp     byte [esi-1], 0
  4416.         jnz     .l
  4417.         test    eax, eax
  4418.         jnz     @f
  4419.         lea     eax, [esi-1]
  4420. @@:
  4421.         mov     esi, eax
  4422.         pop     eax
  4423.         ret
  4424.  
  4425. compare_modified:
  4426.         test    byte [esi], 10h
  4427.         jnz     .1dir
  4428.         test    byte [edi], 10h
  4429.         jnz     .greater
  4430. .eq1:
  4431.         push    edi
  4432.         mov     edi, [edi+28]
  4433.         cmp     edi, [esi+28]
  4434.         pop     edi
  4435.         jnz     @f
  4436.         push    edi
  4437.         mov     edi, [edi+24]
  4438.         cmp     edi, [esi+24]
  4439.         pop     edi
  4440.         jnz     @f
  4441.         add     esi, 40
  4442.         add     edi, 40
  4443.         jmp     strcmpi
  4444. @@:
  4445.         ret
  4446. .greater:
  4447.         test    esi, esi
  4448.         ret
  4449. .1dir:
  4450.         test    byte [edi], 10h
  4451.         jnz     .eq1
  4452. .less:
  4453.         xor     edi, edi
  4454.         stc
  4455.         ret
  4456.  
  4457. compare_modified_rev:
  4458.         test    byte [esi], 10h
  4459.         jnz     .1dir
  4460.         test    byte [edi], 10h
  4461.         jnz     .greater
  4462. .eq1:
  4463.         push    esi
  4464.         mov     esi, [esi+28]
  4465.         cmp     esi, [edi+28]
  4466.         pop     esi
  4467.         jnz     @f
  4468.         push    esi
  4469.         mov     esi, [esi+24]
  4470.         cmp     esi, [edi+24]
  4471.         pop     esi
  4472.         jnz     @f
  4473.         add     esi, 40
  4474.         add     edi, 40
  4475.         xchg    esi, edi
  4476.         jmp     strcmpi
  4477. @@:
  4478.         ret
  4479. .greater:
  4480.         test    esi, esi
  4481.         ret
  4482. .1dir:
  4483.         test    byte [edi], 10h
  4484.         jnz     .eq1
  4485. .less:
  4486.         xor     edi, edi
  4487.         stc
  4488.         ret
  4489.  
  4490. compare_size:
  4491.         test    byte [esi], 10h
  4492.         jnz     .1dir
  4493.         test    byte [edi], 10h
  4494.         jnz     .greater
  4495. .eq1:
  4496.         push    edi
  4497.         mov     edi, [edi+36]
  4498.         cmp     edi, [esi+36]
  4499.         pop     edi
  4500.         jnz     @f
  4501.         push    edi
  4502.         mov     edi, [edi+32]
  4503.         cmp     edi, [esi+32]
  4504.         pop     edi
  4505.         jnz     @f
  4506.         add     esi, 40
  4507.         add     edi, 40
  4508.         jmp     strcmpi
  4509. @@:
  4510.         ret
  4511. .greater:
  4512.         test    esi, esi
  4513.         ret
  4514. .1dir:
  4515.         test    byte [edi], 10h
  4516.         jnz     .eq1
  4517. .less:
  4518.         xor     edi, edi
  4519.         stc
  4520.         ret
  4521.  
  4522. compare_size_rev:
  4523.         test    byte [esi], 10h
  4524.         jnz     .1dir
  4525.         test    byte [edi], 10h
  4526.         jnz     .greater
  4527. .eq1:
  4528.         push    esi
  4529.         mov     esi, [esi+36]
  4530.         cmp     esi, [edi+36]
  4531.         pop     esi
  4532.         jnz     @f
  4533.         push    esi
  4534.         mov     esi, [esi+32]
  4535.         cmp     esi, [edi+32]
  4536.         pop     esi
  4537.         jnz     @f
  4538.         add     esi, 40
  4539.         add     edi, 40
  4540.         xchg    esi, edi
  4541.         jmp     strcmpi
  4542. @@:
  4543.         ret
  4544. .greater:
  4545.         test    esi, esi
  4546.         ret
  4547. .1dir:
  4548.         test    byte [edi], 10h
  4549.         jnz     .eq1
  4550. .less:
  4551.         xor     edi, edi
  4552.         stc
  4553.         ret
  4554.  
  4555. compare_unordered:
  4556.         cmp     esi, edi
  4557.         ret
  4558. compare_unordered_rev:
  4559.         cmp     edi, esi
  4560.         ret
  4561.  
  4562. compare_created:
  4563.         test    byte [esi], 10h
  4564.         jnz     .1dir
  4565.         test    byte [edi], 10h
  4566.         jnz     .greater
  4567. .eq1:
  4568.         push    edi
  4569.         mov     edi, [edi+12]
  4570.         cmp     edi, [esi+12]
  4571.         pop     edi
  4572.         jnz     @f
  4573.         push    edi
  4574.         mov     edi, [edi+8]
  4575.         cmp     edi, [esi+8]
  4576.         pop     edi
  4577.         jnz     @f
  4578.         add     esi, 40
  4579.         add     edi, 40
  4580.         jmp     strcmpi
  4581. @@:
  4582.         ret
  4583. .greater:
  4584.         test    esi, esi
  4585.         ret
  4586. .1dir:
  4587.         test    byte [edi], 10h
  4588.         jnz     .eq1
  4589. .less:
  4590.         xor     edi, edi
  4591.         stc
  4592.         ret
  4593.  
  4594. compare_created_rev:
  4595.         test    byte [esi], 10h
  4596.         jnz     .1dir
  4597.         test    byte [edi], 10h
  4598.         jnz     .greater
  4599. .eq1:
  4600.         push    esi
  4601.         mov     esi, [esi+12]
  4602.         cmp     esi, [edi+12]
  4603.         pop     esi
  4604.         jnz     @f
  4605.         push    esi
  4606.         mov     esi, [esi+8]
  4607.         cmp     esi, [edi+8]
  4608.         pop     esi
  4609.         jnz     @f
  4610.         add     esi, 40
  4611.         add     edi, 40
  4612.         xchg    esi, edi
  4613.         jmp     strcmpi
  4614. @@:
  4615.         ret
  4616. .greater:
  4617.         test    esi, esi
  4618.         ret
  4619. .1dir:
  4620.         test    byte [edi], 10h
  4621.         jnz     .eq1
  4622. .less:
  4623.         xor     edi, edi
  4624.         stc
  4625.         ret
  4626.  
  4627. compare_accessed:
  4628.         test    byte [esi], 10h
  4629.         jnz     .1dir
  4630.         test    byte [edi], 10h
  4631.         jnz     .greater
  4632. .eq1:
  4633.         push    edi
  4634.         mov     edi, [edi+20]
  4635.         cmp     edi, [esi+20]
  4636.         pop     edi
  4637.         jnz     @f
  4638.         push    edi
  4639.         mov     edi, [edi+16]
  4640.         cmp     edi, [esi+16]
  4641.         pop     edi
  4642.         jnz     @f
  4643.         add     esi, 40
  4644.         add     edi, 40
  4645.         jmp     strcmpi
  4646. @@:
  4647.         ret
  4648. .greater:
  4649.         test    esi, esi
  4650.         ret
  4651. .1dir:
  4652.         test    byte [edi], 10h
  4653.         jnz     .eq1
  4654. .less:
  4655.         xor     edi, edi
  4656.         stc
  4657.         ret
  4658.  
  4659. compare_accessed_rev:
  4660.         test    byte [esi], 10h
  4661.         jnz     .1dir
  4662.         test    byte [edi], 10h
  4663.         jnz     .greater
  4664. .eq1:
  4665.         push    esi
  4666.         mov     esi, [esi+20]
  4667.         cmp     esi, [edi+20]
  4668.         pop     esi
  4669.         jnz     @f
  4670.         push    esi
  4671.         mov     esi, [esi+16]
  4672.         cmp     esi, [edi+16]
  4673.         pop     esi
  4674.         jnz     @f
  4675.         add     esi, 40
  4676.         add     edi, 40
  4677.         xchg    esi, edi
  4678.         jmp     strcmpi
  4679. @@:
  4680.         ret
  4681. .greater:
  4682.         test    esi, esi
  4683.         ret
  4684. .1dir:
  4685.         test    byte [edi], 10h
  4686.         jnz     .eq1
  4687. .less:
  4688.         xor     edi, edi
  4689.         stc
  4690.         ret
  4691.  
  4692. if 0
  4693. match_mask:
  4694. ; in: esi->name, edi->mask
  4695. ; out: CF clear <=> match
  4696.         pusha
  4697.         xchg    esi, edi
  4698. .main_cycle:
  4699.         push    esi
  4700. @@:
  4701.         lodsb
  4702.         test    al, al
  4703.         jz      @f
  4704.         cmp     al, ','
  4705.         jz      @f
  4706.         cmp     al, '|'
  4707.         jnz     @b
  4708. @@:
  4709.         mov     [esi-1], byte 0
  4710.         xchg    esi, [esp]
  4711.         call    match_single_mask
  4712.         pop     esi
  4713.         mov     [esi-1], al
  4714.         jnc     .found
  4715.         cmp     al, ','
  4716.         jz      .main_cycle
  4717. .done_fail:
  4718.         stc
  4719.         popa
  4720.         ret
  4721. .found:
  4722.         test    al, al
  4723.         jz      .done_succ
  4724.         cmp     al, '|'
  4725.         jz      .test_exclude
  4726.         lodsb
  4727.         jmp     .found
  4728. .done_succ:
  4729.         clc
  4730.         popa
  4731.         ret
  4732. .test_exclude:
  4733.         push    esi
  4734. @@:
  4735.         lodsb
  4736.         test    al, al
  4737.         jz      @f
  4738.         cmp     al, ','
  4739.         jnz     @b
  4740. @@:
  4741.         mov     byte [esi-1], 0
  4742.         xchg    esi, [esp]
  4743.         call    match_single_mask
  4744.         pop     esi
  4745.         mov     [esi-1], al
  4746.         jnc     .done_fail
  4747.         test    al, al
  4748.         jz      .done_succ
  4749.         jmp     .test_exclude
  4750.  
  4751. match_single_mask:
  4752. ; in: esi->mask, edi->name
  4753. ; out: CF clear <=> match
  4754.         pusha
  4755. .mask_symbol:
  4756.         lodsb
  4757.         test    al, al
  4758.         jz      .mask_done
  4759.         cmp     al, '*'
  4760.         jz      .asterisk
  4761.         cmp     al, '?'
  4762.         jz      .quest
  4763.         cmp     al, '['
  4764.         jz      .list
  4765.         call    match_symbol
  4766.         jnz     .done_fail
  4767.         inc     edi
  4768.         jmp     .mask_symbol
  4769. .done_fail:
  4770.         stc
  4771.         popa
  4772.         ret
  4773. .mask_done:
  4774.         scasb
  4775.         jnz     .done_fail
  4776. .done_succ:
  4777.         clc
  4778.         popa
  4779.         ret
  4780. .quest:
  4781.         mov     al, 0
  4782.         scasb
  4783.         jz      .done_fail
  4784.         jmp     .mask_symbol
  4785. .list:
  4786.         lodsb
  4787.         cmp     al, ']'
  4788.         jz      .done_fail
  4789.         cmp     byte [esi+1], '-'
  4790.         jz      .range
  4791.         call    match_symbol
  4792.         jnz     .list
  4793. .listok:
  4794.         inc     edi
  4795. @@:
  4796.         lodsb
  4797.         cmp     al, ']'
  4798.         jnz     @b
  4799.         jmp     .mask_symbol
  4800. .range:
  4801.         call    match_symbol
  4802.         ja      @f
  4803.         mov     al, [esi+2]
  4804.         call    match_symbol
  4805.         jae     .listok
  4806. @@:
  4807.         inc     esi
  4808.         jmp     .list
  4809. .asterisk:
  4810.         cmp     byte [esi], 0
  4811.         jz      .done_succ
  4812.         cmp     byte [esi], '?'
  4813.         jnz     @f
  4814.         mov     al, 0
  4815.         scasb
  4816.         jz      .done_fail
  4817.         inc     esi
  4818.         jmp     .asterisk
  4819. @@:
  4820.         cmp     byte [esi], '['
  4821.         jz      .asterisk_common
  4822. ; the mask is ...*<normal-symbol>...
  4823. .asterisk_normal:
  4824.         mov     al, [esi]
  4825. @@:
  4826.         cmp     byte [edi], 0
  4827.         jz      .done_fail
  4828.         call    match_symbol
  4829.         jz      @f
  4830.         inc     edi
  4831.         jmp     @b
  4832. @@:
  4833.         inc     edi
  4834.         inc     esi
  4835.         call    match_single_mask
  4836.         jnc     .done_succ
  4837.         dec     esi
  4838.         jmp     .asterisk_normal
  4839. .asterisk_common:
  4840.         push    edi
  4841. @@:
  4842.         call    match_single_mask
  4843.         jnc     @f
  4844.         mov     al, 0
  4845.         scasb
  4846.         jnz     @b
  4847.         pop     edi
  4848.         jmp     .done_fail
  4849. @@:
  4850.         pop     edi
  4851.         jmp     .done_succ
  4852.  
  4853. match_mask_rev:
  4854. ; in: esi->name, edx->end of name, edi->mask
  4855. ; out: CF clear <=> match
  4856.         pusha
  4857.         xchg    esi, edx
  4858.         xchg    esi, edi
  4859. .main_cycle:
  4860.         mov     ecx, esi
  4861. @@:
  4862.         lodsb
  4863.         test    al, al
  4864.         jz      @f
  4865.         cmp     al, ','
  4866.         jz      @f
  4867.         cmp     al, '|'
  4868.         jnz     @b
  4869. @@:
  4870.         dec     esi
  4871.         mov     [esi], byte 0
  4872.         call    match_single_mask_rev2
  4873.         mov     [esi], al
  4874.         inc     esi
  4875.         jnc     .found
  4876.         cmp     al, ','
  4877.         jz      .main_cycle
  4878. .done_fail:
  4879.         stc
  4880.         popa
  4881.         ret
  4882. .found:
  4883.         test    al, al
  4884.         jz      .done_succ
  4885.         cmp     al, '|'
  4886.         jz      .test_exclude
  4887.         lodsb
  4888.         jmp     .found
  4889. .done_succ:
  4890.         clc
  4891.         popa
  4892.         ret
  4893. .test_exclude:
  4894.         mov     ecx, esi
  4895. @@:
  4896.         lodsb
  4897.         test    al, al
  4898.         jz      @f
  4899.         cmp     al, ','
  4900.         jnz     @b
  4901. @@:
  4902.         dec     esi
  4903.         mov     byte [esi], 0
  4904.         call    match_single_mask_rev2
  4905.         mov     [esi], al
  4906.         inc     esi
  4907.         jnc     .done_fail
  4908.         test    al, al
  4909.         jz      .done_succ
  4910.         jmp     .test_exclude
  4911.  
  4912. match_single_mask_rev2:
  4913.         pusha
  4914.         jmp     match_single_mask_rev.mask_symbol
  4915. match_single_mask_rev:
  4916. ; in: esi->mask, edi->end of name, edx->start of name
  4917. ; out: CF clear <=> match
  4918.         pusha
  4919.         mov     ecx, esi
  4920. @@:
  4921.         lodsb
  4922.         test    al, al
  4923.         jnz     @b
  4924.         dec     esi
  4925. ; esi->end of mask, ecx->start of mask
  4926. .mask_symbol:
  4927.         dec     esi
  4928.         cmp     esi, ecx
  4929.         jb      .mask_done
  4930.         mov     al, [esi]
  4931.         cmp     al, '*'
  4932.         jz      .asterisk
  4933.         cmp     al, '?'
  4934.         jz      .quest
  4935.         cmp     al, ']'
  4936.         jz      .list
  4937.         dec     edi
  4938.         cmp     edi, edx
  4939.         jb      .done_fail
  4940.         call    match_symbol
  4941.         jz      .mask_symbol
  4942. .done_fail:
  4943.         stc
  4944.         popa
  4945.         ret
  4946. .mask_done:
  4947.         cmp     edi, edx
  4948.         jnz     .done_fail
  4949. .done_succ:
  4950.         clc
  4951.         popa
  4952.         ret
  4953. .quest:
  4954.         dec     edi
  4955.         cmp     edi, edx
  4956.         jb      .done_fail
  4957.         jmp     .mask_symbol
  4958. .list:
  4959.         dec     edi
  4960.         cmp     edi, edx
  4961.         jb      .done_fail
  4962. .list_check:
  4963.         dec     esi
  4964.         cmp     esi, ecx
  4965.         jbe     .done_fail
  4966.         mov     al, [esi]
  4967.         cmp     al, '['
  4968.         jz      .done_fail
  4969.         cmp     byte [esi-1], '-'
  4970.         jz      .range
  4971.         call    match_symbol
  4972.         jnz     .list_check
  4973. .listok:
  4974. @@:
  4975.         dec     esi
  4976.         cmp     esi, ecx
  4977.         jb      .done_fail
  4978.         cmp     byte [esi], '['
  4979.         jnz     @b
  4980.         jmp     .mask_symbol
  4981. .range:
  4982.         call    match_symbol
  4983.         jb      @f
  4984.         mov     al, [esi-2]
  4985.         call    match_symbol
  4986.         jbe     .listok
  4987. @@:
  4988.         dec     esi
  4989.         dec     esi
  4990.         jmp     .list_check
  4991. .asterisk:
  4992.         cmp     esi, ecx
  4993.         jz      .done_succ
  4994.         cmp     byte [esi-1], '?'
  4995.         jnz     @f
  4996.         cmp     edi, edx
  4997.         jz      .done_fail
  4998.         dec     esi
  4999.         jmp     .asterisk
  5000. @@:
  5001.         cmp     byte [esi-1], ']'
  5002.         jz      .asterisk_common
  5003. ; the mask is ...<normal-symbol>*...
  5004. .asterisk_normal:
  5005.         mov     al, [esi-1]
  5006. @@:
  5007.         cmp     edi, edx
  5008.         jz      .done_fail
  5009.         call    match_symbol
  5010.         jz      @f
  5011.         dec     edi
  5012.         jmp     @b
  5013. @@:
  5014.         dec     edi
  5015.         dec     esi
  5016.         call    match_single_mask_rev2
  5017.         jnc     .done_succ
  5018.         inc     esi
  5019.         jmp     .asterisk_normal
  5020. .asterisk_common:
  5021.         push    edi
  5022. @@:
  5023.         call    match_single_mask_rev2
  5024.         jnc     @f
  5025.         dec     edi
  5026.         cmp     edi, edx
  5027.         jae     @b
  5028.         pop     edi
  5029.         jmp     .done_fail
  5030. @@:
  5031.         pop     edi
  5032.         jmp     .done_succ
  5033. end if
  5034.  
  5035. ;tolower:
  5036. ;        push    ecx
  5037. ;        movzx   ecx, al
  5038. ;        mov     al, [tolower_table+ecx]
  5039. ;        pop     ecx
  5040. ;        ret
  5041.  
  5042. match_symbol:
  5043. ; in: al,[edi]=symbols
  5044. ; out: flags as 'cmp al,[edi]'
  5045.         push    eax ecx
  5046.         movzx   ecx, al
  5047.         mov     al, [tolower_table+ecx]
  5048.         movzx   ecx, byte [edi]
  5049.         cmp     al, [tolower_table+ecx]
  5050.         pop     ecx eax
  5051.         ret
  5052.  
  5053. match_mask_rev_lowercase:
  5054. ; in: esi->name, edx->end of name, edi->mask
  5055. ; out: CF clear <=> match
  5056.         pusha
  5057.         xchg    esi, edx
  5058.         xchg    esi, edi
  5059. .main_cycle:
  5060.         mov     ecx, esi
  5061. @@:
  5062.         lodsb
  5063.         test    al, al
  5064.         jz      @f
  5065.         cmp     al, ','
  5066.         jz      @f
  5067.         cmp     al, ';'
  5068.         jz      @f
  5069.         cmp     al, '|'
  5070.         jnz     @b
  5071. @@:
  5072.         dec     esi
  5073.         mov     [esi], byte 0
  5074.         call    match_single_mask_rev_lowercase
  5075.         mov     [esi], al
  5076.         inc     esi
  5077.         jnc     .found
  5078.         cmp     al, ','
  5079.         jz      .main_cycle
  5080.         cmp     al, ';'
  5081.         jz      .main_cycle
  5082. .done_fail:
  5083.         stc
  5084.         popa
  5085.         ret
  5086. .found:
  5087.         test    al, al
  5088.         jz      .done_succ
  5089.         cmp     al, '|'
  5090.         jz      .test_exclude
  5091.         lodsb
  5092.         jmp     .found
  5093. .done_succ:
  5094.         clc
  5095.         popa
  5096.         ret
  5097. .test_exclude:
  5098.         mov     ecx, esi
  5099. @@:
  5100.         lodsb
  5101.         test    al, al
  5102.         jz      @f
  5103.         cmp     al, ','
  5104.         jz      @f
  5105.         cmp     al, ';'
  5106.         jnz     @b
  5107. @@:
  5108.         dec     esi
  5109.         mov     byte [esi], 0
  5110.         call    match_single_mask_rev_lowercase
  5111.         mov     [esi], al
  5112.         inc     esi
  5113.         jnc     .done_fail
  5114.         test    al, al
  5115.         jz      .done_succ
  5116.         jmp     .test_exclude
  5117.  
  5118. match_single_mask_rev_lowercase:
  5119. ; in: esi->end of mask, ecx->start of mask, edi->end of name, edx->start of name
  5120. ; out: CF clear <=> match
  5121.         push    esi edi eax
  5122. .mask_symbol:
  5123.         dec     esi
  5124.         cmp     esi, ecx
  5125.         jb      .mask_done
  5126.         mov     al, [esi]
  5127.         cmp     al, '*'
  5128.         jz      .asterisk
  5129.         cmp     al, '?'
  5130.         jz      .quest
  5131.         cmp     al, ']'
  5132.         jz      .list
  5133.         dec     edi
  5134.         cmp     edi, edx
  5135.         jb      .done_fail
  5136.         cmp     al, [edi]
  5137.         jz      .mask_symbol
  5138. .done_fail:
  5139.         stc
  5140.         pop     eax edi esi
  5141.         ret
  5142. .mask_done:
  5143.         cmp     edi, edx
  5144.         jnz     .done_fail
  5145. .done_succ:
  5146.         clc
  5147.         pop     eax edi esi
  5148.         ret
  5149. .quest:
  5150.         dec     edi
  5151.         cmp     edi, edx
  5152.         jb      .done_fail
  5153.         jmp     .mask_symbol
  5154. .list:
  5155.         dec     edi
  5156.         cmp     edi, edx
  5157.         jb      .done_fail
  5158. .list_check:
  5159.         dec     esi
  5160.         cmp     esi, ecx
  5161.         jbe     .done_fail
  5162.         mov     al, [esi]
  5163.         cmp     al, '['
  5164.         jz      .done_fail
  5165.         cmp     byte [esi-1], '-'
  5166.         jz      .range
  5167.         cmp     al, [edi]
  5168.         jnz     .list_check
  5169. .listok:
  5170. @@:
  5171.         dec     esi
  5172.         cmp     esi, ecx
  5173.         jb      .done_fail
  5174.         cmp     byte [esi], '['
  5175.         jnz     @b
  5176.         jmp     .mask_symbol
  5177. .range:
  5178.         cmp     al, [edi]
  5179.         jb      @f
  5180.         mov     al, [esi-2]
  5181.         cmp     al, [edi]
  5182.         jbe     .listok
  5183. @@:
  5184.         dec     esi
  5185.         dec     esi
  5186.         jmp     .list_check
  5187. .asterisk:
  5188.         cmp     esi, ecx
  5189.         jz      .done_succ
  5190.         cmp     byte [esi-1], '?'
  5191.         jnz     @f
  5192.         cmp     edi, edx
  5193.         jz      .done_fail
  5194.         dec     esi
  5195.         jmp     .asterisk
  5196. @@:
  5197.         cmp     byte [esi-1], ']'
  5198.         jz      .asterisk_common
  5199. ; the mask is ...<normal-symbol>*...
  5200. .asterisk_normal:
  5201.         mov     al, [esi-1]
  5202. @@:
  5203.         cmp     edi, edx
  5204.         jz      .done_fail
  5205.         cmp     al, [edi]
  5206.         jz      @f
  5207.         dec     edi
  5208.         jmp     @b
  5209. @@:
  5210.         dec     edi
  5211.         dec     esi
  5212.         call    match_single_mask_rev_lowercase
  5213.         jnc     .done_succ
  5214.         inc     esi
  5215.         jmp     .asterisk_normal
  5216. .asterisk_common:
  5217.         push    edi
  5218. @@:
  5219.         call    match_single_mask_rev_lowercase
  5220.         jnc     @f
  5221.         dec     edi
  5222.         cmp     edi, edx
  5223.         jae     @b
  5224.         pop     edi
  5225.         jmp     .done_fail
  5226. @@:
  5227.         pop     edi
  5228.         jmp     .done_succ
  5229.  
  5230. find_extension:
  5231.         lea     esi, [ecx+40]
  5232.         push    esi
  5233. @@:
  5234.         lodsb
  5235.         test    al, al
  5236.         jnz     @b
  5237. @@:
  5238.         dec     esi
  5239.         cmp     byte [esi], '.'
  5240.         jz      .found_ext
  5241.         cmp     esi, [esp]
  5242.         ja      @b
  5243. ; empty extension
  5244.         pop     esi
  5245.         stc
  5246.         ret
  5247. .found_ext:
  5248.         inc     esi
  5249.         mov     edi, [associations]
  5250.         test    edi, edi
  5251.         jz      .notfound
  5252. .find_loop:
  5253.         push    esi edi
  5254.         call    strcmpi
  5255.         pop     edi esi
  5256.         pushf
  5257. @@:
  5258.         inc     edi
  5259.         cmp     byte [edi-1], 0
  5260.         jnz     @b
  5261.         popf
  5262.         jz      .found
  5263. @@:
  5264.         inc     edi
  5265.         cmp     byte [edi-1], 0
  5266.         jnz     @b
  5267.         cmp     byte [edi], 0
  5268.         jnz     .find_loop
  5269. .notfound:
  5270. ; unknown extension
  5271.         stc
  5272. .found:
  5273.         pop     esi
  5274.         ret
  5275.  
  5276. header  db      'Kolibri Far 0.35',0
  5277.  
  5278. nomem_draw      db      'No memory for redraw.',0
  5279. .size = $ - nomem_draw
  5280.  
  5281. def_left_dir    db      '/rd/1',0
  5282. def_right_dir   db      '/hd0/1',0
  5283.  
  5284. bSilentFolderMode db    1
  5285.  
  5286. if lang eq ru
  5287. aFolder         db      ' ¯ª '
  5288. .size = $-aFolder
  5289. aUp             db      '‚¢¥àå'
  5290. .size = $-aUp
  5291. aDrive          db      '„¨áª',0
  5292. aScreens        db      'ªà ­ë',0
  5293. else
  5294. aFolder         db      'Folder'
  5295. .size = $-aFolder
  5296. aUp             db      'Up'
  5297. .size = $-aUp
  5298. aDrive          db      'Drive',0
  5299. aScreens        db      'Screens',0
  5300. end if
  5301.  
  5302. align 4
  5303. _10d dd 10
  5304. _100d dd 100
  5305. muldiv10 dd 429496729
  5306. _10 db 10
  5307. _100 db 100
  5308.  
  5309. fpu_cw  dw      000011100111111b
  5310.  
  5311. keybar_panels:
  5312. if lang eq ru
  5313. ; ¡¥§ ª« ¢¨è-¬®¤¨ä¨ª â®à®¢
  5314.         db      '®¬®éì'
  5315.         db      '®«ì§Œ'
  5316.         db      'à®á¬ '
  5317.         db      '¥¤ ªâ'
  5318.         db      'Š®¯¨à '
  5319.         db      '¥à¥­ '
  5320.         db      ' ¯ª  '
  5321.         db      '“¤ «¥­'
  5322.         db      'Š®­äŒ­'
  5323.         db      '‚ë室 '
  5324.         db      'Œ®¤ã«¨'
  5325.         db      'ªà ­ë'
  5326. ; Shift
  5327.         db      '„®¡ ¢«'
  5328.         db      ' á¯ ª'
  5329.         db      '€à劮¬'
  5330.         db      '¥¤ ª.'
  5331.         db      'Š®¯¨à '
  5332.         db      '¥à¥¨¬'
  5333.         db      '      '
  5334.         db      '“¤ «¥­'
  5335.         db      '‘®åà ­'
  5336.         db      '®á«¤­'
  5337.         db      'ƒà㯯ë'
  5338.         db      '‚ë¡à ­'
  5339. ; Ctrl
  5340.         db      '‹¥¢ ï '
  5341.         db      'à ¢ ï'
  5342.         db      'ˆ¬ï   '
  5343.         db      ' áè¨à'
  5344.         db      'Œ®¤¨ä '
  5345.         db      ' §¬¥à'
  5346.         db      '¥á®àâ'
  5347.         db      '‘®§¤ ­'
  5348.         db      '„®áâã¯'
  5349.         db      'Ž¯¨á ­'
  5350.         db      '‚« ¤¥«'
  5351.         db      '‘®àâ  '
  5352. ; Ctrl+Shift
  5353.         db      '      '
  5354.         db      '      '
  5355.         db      'à®á¬ '
  5356.         db      '¥¤ ªâ'
  5357.         db      '      '
  5358.         db      '      '
  5359.         db      '      '
  5360.         db      '      '
  5361.         db      '      '
  5362.         db      '      '
  5363.         db      '      '
  5364.         db      '      '
  5365. ; Alt
  5366.         db      '‹¥¢ ï '
  5367.         db      'à ¢ ï'
  5368.         db      '‘¬®âà.'
  5369.         db      '¥¤ ª.'
  5370.         db      '¥ç âì'
  5371.         db      '‘¢ï§ì '
  5372.         db      'ˆáª âì'
  5373.         db      'ˆáâ®à '
  5374.         db      '‚¨¤¥® '
  5375.         db      '„¥à¥¢®'
  5376.         db      'ˆáâà '
  5377.         db      'ˆá⏠¯'
  5378. ; Alt+Shift
  5379.         db      '      '
  5380.         db      '      '
  5381.         db      '      '
  5382.         db      '      '
  5383.         db      '      '
  5384.         db      '      '
  5385.         db      '      '
  5386.         db      '      '
  5387.         db      'Š®­ä«'
  5388.         db      '      '
  5389.         db      '      '
  5390.         db      '      '
  5391. ; Alt+Ctrl
  5392. times 12 db     '      '
  5393. ; Alt+Ctrl+Shift
  5394. times 12 db     '      '
  5395. else
  5396. ; No modificators
  5397.         db      'Help  '
  5398.         db      'UserMn'
  5399.         db      'View  '
  5400.         db      'Edit  '
  5401.         db      'Copy  '
  5402.         db      'RenMov'
  5403.         db      'MkFold'
  5404.         db      'Delete'
  5405.         db      'ConfMn'
  5406.         db      'Quit  '
  5407.         db      'Plugin'
  5408.         db      'Screen'
  5409. ; Shift
  5410.         db      'Add   '
  5411.         db      'Extrct'
  5412.         db      'ArcCmd'
  5413.         db      'Edit..'
  5414.         db      'Copy  '
  5415.         db      'Rename'
  5416.         db      '      '
  5417.         db      'Delete'
  5418.         db      'Save  '
  5419.         db      'Last  '
  5420.         db      'Group '
  5421.         db      'SelUp '
  5422. ; Ctrl
  5423.         db      'Left  '
  5424.         db      'Right '
  5425.         db      'Name  '
  5426.         db      'Extens'
  5427.         db      'Modifn'
  5428.         db      'Size  '
  5429.         db      'Unsort'
  5430.         db      'Creatn'
  5431.         db      'Access'
  5432.         db      'Descr '
  5433.         db      'Owner '
  5434.         db      'Sort  '
  5435. ; Ctrl+Shift
  5436.         db      '      '
  5437.         db      '      '
  5438.         db      'View  '
  5439.         db      'Edit  '
  5440.         db      '      '
  5441.         db      '      '
  5442.         db      '      '
  5443.         db      '      '
  5444.         db      '      '
  5445.         db      '      '
  5446.         db      '      '
  5447.         db      '      '
  5448. ; Alt
  5449.         db      'Left  '
  5450.         db      'Right '
  5451.         db      'View..'
  5452.         db      'Edit..'
  5453.         db      'Print '
  5454.         db      'MkLink'
  5455.         db      'Find  '
  5456.         db      'Histry'
  5457.         db      'Video '
  5458.         db      'Tree  '
  5459.         db      'ViewHs'
  5460.         db      'FoldHs'
  5461. ; Alt+Shift
  5462.         db      '      '
  5463.         db      '      '
  5464.         db      '      '
  5465.         db      '      '
  5466.         db      '      '
  5467.         db      '      '
  5468.         db      '      '
  5469.         db      '      '
  5470.         db      'ConfPl'
  5471.         db      '      '
  5472.         db      '      '
  5473.         db      '      '
  5474. ; Alt+Ctrl
  5475. times 12 db     '      '
  5476. ; Alt+Ctrl+Shift
  5477. times 12 db     '      '
  5478. end if
  5479.  
  5480. keybar_viewer:
  5481. if lang eq ru
  5482. ; ¡¥§ ª« ¢¨è-¬®¤¨ä¨ª â®à®¢
  5483.         db      '®¬®éì'
  5484.         db      ' §¢¥à'
  5485.         db      '‚ë室 '
  5486.         db      'Š®¤   '
  5487.         db      '      '
  5488.         db      '¥¤ ªâ'
  5489.         db      '®¨áª '
  5490. keybar_cp:
  5491.         db      'cp1251'
  5492.         db      '      '
  5493.         db      '‚ë室 '
  5494.         db      'Œ®¤ã«¨'
  5495.         db      'ªà ­ë'
  5496. ; Shift
  5497.         db      '      '
  5498.         db      '‘«®¢  '
  5499.         db      '      '
  5500.         db      '      '
  5501.         db      '      '
  5502.         db      '      '
  5503.         db      '„ «ìè¥'
  5504.         db      '’ ¡«¨æ'
  5505.         db      '      '
  5506.         db      '      '
  5507.         db      '      '
  5508.         db      '      '
  5509. ; Ctrl
  5510.         db      '      '
  5511.         db      '      '
  5512.         db      '      '
  5513.         db      '      '
  5514.         db      '      '
  5515.         db      '      '
  5516.         db      '      '
  5517.         db      '      '
  5518.         db      '      '
  5519.         db      '®§¨æ '
  5520.         db      '      '
  5521.         db      '      '
  5522. ; Ctrl+Shift
  5523.         db      '      '
  5524.         db      '      '
  5525.         db      '      '
  5526.         db      '      '
  5527.         db      '      '
  5528.         db      '      '
  5529.         db      '      '
  5530.         db      '      '
  5531.         db      '      '
  5532.         db      '      '
  5533.         db      '      '
  5534.         db      '      '
  5535. ; Alt
  5536.         db      '      '
  5537.         db      '      '
  5538.         db      '      '
  5539.         db      '      '
  5540.         db      '¥ç âì'
  5541.         db      '      '
  5542.         db      ' § ¤ '
  5543.         db      '¥à¥©â'
  5544.         db      '‚¨¤¥® '
  5545.         db      '      '
  5546.         db      'ˆáâà '
  5547.         db      '      '
  5548. ; Alt+Shift
  5549.         db      '      '
  5550.         db      '      '
  5551.         db      '      '
  5552.         db      '      '
  5553.         db      '      '
  5554.         db      '      '
  5555.         db      '      '
  5556.         db      '      '
  5557.         db      'Š®­ä¨£'
  5558.         db      '      '
  5559.         db      '      '
  5560.         db      '      '
  5561. ; Alt+Ctrl
  5562. times 12 db     '      '
  5563. ; Alt+Ctrl+Shift
  5564. times 12 db     '      '
  5565. else
  5566. ; No modificators
  5567.         db      'Help  '
  5568.         db      'Unwrap'
  5569.         db      'Quit  '
  5570.         db      'Hex   '
  5571.         db      '      '
  5572.         db      'Edit  '
  5573.         db      'Search'
  5574. keybar_cp:
  5575.         db      'cp1251'
  5576.         db      '      '
  5577.         db      'Quit  '
  5578.         db      'Plugin'
  5579.         db      'Screen'
  5580. ; Shift
  5581.         db      '      '
  5582.         db      'WWrap '
  5583.         db      '      '
  5584.         db      '      '
  5585.         db      '      '
  5586.         db      '      '
  5587.         db      'Next  '
  5588.         db      'Table '
  5589.         db      '      '
  5590.         db      '      '
  5591.         db      '      '
  5592.         db      '      '
  5593. ; Ctrl
  5594.         db      '      '
  5595.         db      '      '
  5596.         db      '      '
  5597.         db      '      '
  5598.         db      '      '
  5599.         db      '      '
  5600.         db      '      '
  5601.         db      '      '
  5602.         db      '      '
  5603.         db      'GoFile'
  5604.         db      '      '
  5605.         db      '      '
  5606. ; Ctrl+Shift
  5607.         db      '      '
  5608.         db      '      '
  5609.         db      '      '
  5610.         db      '      '
  5611.         db      '      '
  5612.         db      '      '
  5613.         db      '      '
  5614.         db      '      '
  5615.         db      '      '
  5616.         db      '      '
  5617.         db      '      '
  5618.         db      '      '
  5619. ; Alt
  5620.         db      '      '
  5621.         db      '      '
  5622.         db      '      '
  5623.         db      '      '
  5624.         db      'Print '
  5625.         db      '      '
  5626.         db      'Prev  '
  5627.         db      'Goto  '
  5628.         db      'Video '
  5629.         db      '      '
  5630.         db      'ViewHs'
  5631.         db      '      '
  5632. ; Alt+Shift
  5633.         db      '      '
  5634.         db      '      '
  5635.         db      '      '
  5636.         db      '      '
  5637.         db      '      '
  5638.         db      '      '
  5639.         db      '      '
  5640.         db      '      '
  5641.         db      'Config'
  5642.         db      '      '
  5643.         db      '      '
  5644.         db      '      '
  5645. ; Alt+Ctrl
  5646. times 12 db     '      '
  5647. ; Alt+Ctrl+Shift
  5648. times 12 db     '      '
  5649. end if
  5650.  
  5651.         align   4
  5652. cur_width       dd      80
  5653. cur_height      dd      25
  5654. saved_width     dd      -1
  5655. saved_height    dd      -1
  5656. fill_width      dd      0
  5657. fill_height     dd      0
  5658. max_width = 256
  5659. max_height = 256
  5660. console_data_ptr dd     0
  5661.  
  5662. cursor_x        dd      -1
  5663. cursor_y        dd      -1
  5664. cur_cursor_pos  dd      -1
  5665. old_cursor_pos  dd      -1
  5666.  
  5667. active_panel    dd      panel1_data
  5668.  
  5669. associations    dd      0
  5670. associations_size dd    1               ; terminating zero
  5671. associations_allocated dd 0x1000        ; start with one page
  5672.  
  5673. console_colors  dd      0x000000, 0x000080, 0x008000, 0x008080
  5674.                 dd      0x800000, 0x800080, 0x808000, 0xC0C0C0
  5675.                 dd      0x808080, 0x0000FF, 0x00FF00, 0x00FFFF
  5676.                 dd      0xFF0000, 0xFF00FF, 0xFFFF00, 0xFFFFFF
  5677.  
  5678. compare_fns     dd      compare_name
  5679.                 dd      compare_name_rev
  5680.                 dd      compare_ext
  5681.                 dd      compare_ext_rev
  5682.                 dd      compare_modified
  5683.                 dd      compare_modified_rev
  5684.                 dd      compare_size
  5685.                 dd      compare_size_rev
  5686.                 dd      compare_unordered
  5687.                 dd      compare_unordered_rev
  5688.                 dd      compare_created
  5689.                 dd      compare_created_rev
  5690.                 dd      compare_accessed
  5691.                 dd      compare_accessed_rev
  5692.  
  5693. ctrlkey_tests   dd      ctrlkey_test0
  5694.                 dd      ctrlkey_test1
  5695.                 dd      ctrlkey_test2
  5696.                 dd      ctrlkey_test3
  5697.                 dd      ctrlkey_test4
  5698. ctrlkey_tests_num = 5
  5699.  
  5700. virtual at 0
  5701. screen_vtable:
  5702.         .OnRedraw       dd      ?
  5703.         .OnKey          dd      ?
  5704.         .keybar         dd      ?
  5705.         .getname        dd      ?
  5706. end virtual
  5707.  
  5708. panels_vtable:
  5709.         dd      panels_OnRedraw
  5710.         dd      panels_OnKey
  5711.         dd      keybar_panels
  5712.         dd      panels_getname
  5713.  
  5714. viewer_vtable:
  5715.         dd      viewer_OnRedraw
  5716.         dd      viewer_OnKey
  5717.         dd      keybar_viewer
  5718.         dd      viewer_getname
  5719.  
  5720. ; additions to this table require changes in tools.inc::get_error_msg
  5721. errors1:
  5722.         dd      error0msg
  5723.         dd      error1msg
  5724.         dd      error2msg
  5725.         dd      error3msg
  5726.         dd      error4msg
  5727.         dd      error5msg
  5728.         dd      error6msg
  5729.         dd      error7msg
  5730.         dd      error8msg
  5731.         dd      error9msg
  5732.         dd      error10msg
  5733.         dd      error11msg
  5734. errors2:
  5735.         dd      error30msg
  5736.         dd      error31msg
  5737.         dd      error32msg
  5738.  
  5739. encodings:
  5740. .cp866 = 0
  5741. .cp1251 = 1
  5742. .koi8r = 2
  5743. .unicode = 3
  5744.  
  5745. .names:
  5746.         db      'cp866   '
  5747.         db      'cp1251  '
  5748.         db      'koi8-r  '
  5749.         db      'Unicode '
  5750.  
  5751. .tables:
  5752. ; cp866 - trivial map
  5753.         times 128 db %+127
  5754. ; cp1251
  5755.         db      0x3F,0x3F,0x27,0x3F,0x22,0x3A,0xC5,0xD8,0x3F,0x25,0x3F,0x3C,0x3F,0x3F,0x3F,0x3F
  5756.         db      0x3F,0x27,0x27,0x22,0x22,0x07,0x2D,0x2D,0x3F,0x54,0x3F,0x3E,0x3F,0x3F,0x3F,0x3F
  5757.         db      0xFF,0xF6,0xF7,0x3F,0xFD,0x3F,0xB3,0x15,0xF0,0x63,0xF2,0x3C,0xBF,0x2D,0x52,0xF4
  5758.         db      0xF8,0x2B,0x49,0x69,0x3F,0xE7,0x14,0xFA,0xF1,0xFC,0xF3,0x3E,0x3F,0x3F,0x3F,0xF5
  5759.         times 0x30 db %-1+0x80
  5760.         times 0x10 db %-1+0xE0
  5761. ; koi8-r
  5762.         db      0xC4,0xB3,0xDA,0xBF,0xC0,0xD9,0xC3,0xB4,0xC2,0xC1,0xC5,0xDF,0xDC,0xDB,0xDD,0xDE
  5763.         db      0xB0,0xB1,0xB2,0xF4,0xFE,0xF9,0xFB,0xF7,0xF3,0xF2,0xFF,0xF5,0xF8,0xFD,0xFA,0xF6
  5764.         db      0xCD,0xBA,0xD5,0xF1,0xD6,0xC9,0xB8,0xB7,0xBB,0xD4,0xD3,0xC8,0xBE,0xBD,0xBC,0xC6
  5765.         db      0xC7,0xCC,0xB5,0xF0,0xB6,0xB9,0xD1,0xD2,0xCB,0xCF,0xD0,0xCA,0xD8,0xD7,0xCE,0xFC
  5766.         db      0xEE,0xA0,0xA1,0xE6,0xA4,0xA5,0xE4,0xA3,0xE5,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE
  5767.         db      0xAF,0xEF,0xE0,0xE1,0xE2,0xE3,0xA6,0xA2,0xEC,0xEB,0xA7,0xE8,0xED,0xE9,0xE7,0xEA
  5768.         db      0x9E,0x80,0x81,0x96,0x84,0x85,0x94,0x83,0x95,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E
  5769.         db      0x8F,0x9F,0x90,0x91,0x92,0x93,0x86,0x82,0x9C,0x9B,0x87,0x98,0x9D,0x99,0x97,0x9A
  5770.  
  5771. .menu:
  5772.         db      .cp866
  5773. .menu.1:
  5774.         dd      .menu.2
  5775.         dd      0
  5776. if lang eq ru
  5777.         db      '&DOS ⥪áâ (cp866)',0
  5778. else
  5779.         db      '&DOS text (cp866)',0
  5780. end if
  5781.         db      .cp1251
  5782. .menu.2:
  5783.         dd      .menu.3
  5784.         dd      .menu.1
  5785. if lang eq ru
  5786.         db      '&Windows ⥪áâ (cp1251)',0
  5787. else
  5788.         db      '&Windows text (cp1251)',0
  5789. end if
  5790.         db      .koi8r
  5791. .menu.3:
  5792.         dd      .menu.4
  5793.         dd      .menu.2
  5794. if lang eq ru
  5795.         db      '&Linux ⥪áâ (koi8-r)',0
  5796. else
  5797.         db      '&Linux text (koi8-r)',0
  5798. end if
  5799.         db      .unicode
  5800. .menu.4:
  5801.         dd      0
  5802.         dd      .menu.3
  5803.         db      '&Unicode',0
  5804.  
  5805. active_screen   dd      0
  5806. tabsize         dd      8
  5807.  
  5808. ascii2scan:
  5809.         times 32 db 0
  5810.         db      0x39,0x02,0x03,0x04,0x05,0x06,0x08,0x28,0x0A,0x0B,0x09,0x0D,0x33,0x0C,0x34,0x35
  5811.         db      0x0B,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x27,0x27,0x33,0x0D,0x34,0x35
  5812.         db      0x03,0x1E,0x30,0x2E,0x20,0x12,0x21,0x22,0x23,0x17,0x24,0x25,0x26,0x32,0x31,0x18
  5813.         db      0x19,0x10,0x13,0x1F,0x14,0x16,0x2F,0x11,0x2D,0x15,0x2C,0x1A,0x2B,0x1B,0x07,0x0C
  5814.         db      0x29,0x1E,0x30,0x2E,0x20,0x12,0x21,0x22,0x23,0x17,0x24,0x25,0x26,0x32,0x31,0x18
  5815.         db      0x19,0x10,0x13,0x1F,0x14,0x16,0x2F,0x11,0x2D,0x15,0x2C,0x1A,0x2B,0x1B,0x29,0x00
  5816.         db      0x21,0x33,0x20,0x16,0x26,0x14,0x27,0x19,0x30,0x10,0x13,0x25,0x2F,0x15,0x24,0x22
  5817.         db      0x23,0x2E,0x31,0x12,0x1E,0x1A,0x11,0x2D,0x17,0x18,0x1B,0x1F,0x32,0x28,0x34,0x2C
  5818.         db      0x21,0x33,0x20,0x16,0x26,0x14,0x27,0x19,0x30,0x10,0x13,0x25,0x2F,0x15,0x24,0x22
  5819.         times 48 db 0
  5820.         db      0x23,0x2E,0x31,0x12,0x1E,0x1A,0x11,0x2D,0x17,0x18,0x1B,0x1F,0x32,0x28,0x34,0x2C
  5821.         db      0x29,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  5822.  
  5823. ; Š« ¢¨è­ë¥ á®ç¥â ­¨ï
  5824. ; db scancode, reserved
  5825. ; dw ctrlstate
  5826. ; dd handler
  5827. ; ctrlstate: ¬« ¤è¨¥ 4 ¡¨â  - ¤«ï Shift, á«¥¤ãî騥 - ¤«ï Ctrl, á«¥¤ãî騥 - ¤«ï Alt
  5828. ; 0 = ­¨ ®¤­  ª« ¢¨è  ­¥ ­ ¦ â 
  5829. ; 1 = ஢­® ®¤­  ­ ¦ â 
  5830. ; 2 = ®¡¥ ­ ¦ âë
  5831. ; 3 = «¥¢ ï ­ ¦ â , ¯à ¢ ï ­¥â
  5832. ; 4 = ¯à ¢ ï ­ ¦ â , «¥¢ ï ­¥â
  5833. panels_ctrlkeys:
  5834.         dw      0x48, 0
  5835.         dd      panels_OnKey.up
  5836.         dw      0x50, 0
  5837.         dd      panels_OnKey.down
  5838.         dw      0x4B, 0
  5839.         dd      panels_OnKey.left
  5840.         dw      0x4D, 0
  5841.         dd      panels_OnKey.right
  5842.         dw      0x51, 0
  5843.         dd      panels_OnKey.pgdn
  5844.         dw      0x49, 0
  5845.         dd      panels_OnKey.pgup
  5846.         dw      0xF, 0
  5847.         dd      panels_OnKey.tab
  5848.         dw      0x47, 0
  5849.         dd      panels_OnKey.home
  5850.         dw      0x4F, 0
  5851.         dd      panels_OnKey.end
  5852.         dw      0x1C, 0
  5853.         dd      panels_OnKey.enter
  5854.         dw      0x3D, 0
  5855.         dd      panels_OnKey.f3
  5856.         dw      0x3F, 0
  5857.         dd      panels_OnKey.f5
  5858.         dw      0x3F, 1
  5859.         dd      panels_OnKey.shift_f5
  5860.         dw      0x41, 0
  5861.         dd      panels_OnKey.f7
  5862.         dw      0x42, 0
  5863.         dd      panels_OnKey.f8
  5864.         dw      0x43, 0x100
  5865.         dd      alt_f9
  5866.         dw      0x44, 0
  5867.         dd      exit
  5868.         dw      0x5D, 0
  5869.         dd      panels_OnKey.menu
  5870. repeat 9-3+1
  5871.         dw      0x3D+%-1, 0x10
  5872.         dd      panels_OnKey.ctrl_f39
  5873. end repeat
  5874.         dw      0x3B, 0x100
  5875.         dd      panels_OnKey.alt_f12
  5876.         dw      0x3C, 0x100
  5877.         dd      panels_OnKey.alt_f12
  5878.         dw      0x58, 0
  5879.         dd      F12
  5880.         dw      0x13, 0x10
  5881.         dd      panels_OnKey.ctrl_r
  5882.         dw      2, 0x30
  5883.         dd      panels_OnKey.change_mode
  5884.         dw      3, 0x30
  5885.         dd      panels_OnKey.change_mode
  5886.         dw      4, 0x30
  5887.         dd      panels_OnKey.change_mode
  5888.         dw      5, 0x30
  5889.         dd      panels_OnKey.change_mode
  5890. repeat 10
  5891.         dw      %+1, 0x40
  5892.         dd      panels_OnKey.quick_jump
  5893. end repeat
  5894.         dw      0x52, 0
  5895.         dd      panels_OnKey.insert
  5896.         dw      0x4E, 0
  5897.         dd      panels_OnKey.greyplus
  5898.         dw      0x4A, 0
  5899.         dd      panels_OnKey.greyminus
  5900.         dw      0x37, 0
  5901.         dd      panels_OnKey.greyasterisk
  5902.         db      0
  5903.  
  5904. viewer_ctrlkeys:
  5905.         dw      1, 0
  5906.         dd      viewer_OnKey.exit
  5907.         dw      0x51, 0
  5908.         dd      viewer_OnKey.pgdn
  5909.         dw      0x49, 0
  5910.         dd      viewer_OnKey.pgup
  5911.         dw      0x50, 0
  5912.         dd      viewer_OnKey.down
  5913.         dw      0x48, 0
  5914.         dd      viewer_OnKey.up
  5915.         dw      0x4B, 0
  5916.         dd      viewer_OnKey.left
  5917.         dw      0x4B, 0x10
  5918.         dd      viewer_OnKey.ctrl_left
  5919.         dw      0x4B, 0x11
  5920.         dd      viewer_OnKey.ctrl_shift_left
  5921.         dw      0x4C, 0
  5922.         dd      viewer_OnKey.exit
  5923.         dw      0x4D, 0
  5924.         dd      viewer_OnKey.right
  5925.         dw      0x4D, 0x10
  5926.         dd      viewer_OnKey.ctrl_right
  5927.         dw      0x4D, 0x11
  5928.         dd      viewer_OnKey.ctrl_shift_right
  5929.         dw      0x3C, 0
  5930.         dd      viewer_OnKey.f2
  5931.         dw      0x3D, 0
  5932.         dd      viewer_OnKey.exit
  5933.         dw      0x3E, 0
  5934.         dd      viewer_OnKey.f4
  5935.         dw      0x42, 0
  5936.         dd      viewer_OnKey.f8
  5937.         dw      0x42, 1
  5938.         dd      viewer_OnKey.shift_f8
  5939.         dw      0x44, 0
  5940.         dd      viewer_OnKey.exit
  5941.         dw      0x47, 0
  5942.         dd      viewer_OnKey.home
  5943.         dw      0x4F, 0
  5944.         dd      viewer_OnKey.end
  5945.         dw      0x58, 0
  5946.         dd      F12
  5947.         dw      0x43, 0x100
  5948.         dd      alt_f9
  5949.         db      0
  5950.  
  5951. dirinfo:
  5952.                 dd      1
  5953. .first          dd      0
  5954.                 dd      0
  5955. .size           dd      300
  5956. .dirdata        dd      0
  5957.                 db      0
  5958. .name           dd      0
  5959.  
  5960. readinfo:
  5961.                 dd      0
  5962. .first          dq      0
  5963. .size           dd      0
  5964. .data           dd      0
  5965.                 db      0
  5966. .name           dd      0
  5967.  
  5968. writeinfo:
  5969. .code           dd      2
  5970. .first          dq      0
  5971. .size           dd      0
  5972. .data           dd      0
  5973.                 db      0
  5974. .name           dd      0
  5975.  
  5976. attrinfo:
  5977.                 dd      5
  5978.                 dd      0
  5979.                 dd      0
  5980.                 dd      0
  5981.                 dd      .attr
  5982.                 db      0
  5983. .name           dd      0
  5984.  
  5985. delinfo:
  5986.                 dd      8
  5987.                 dd      0
  5988.                 dd      0
  5989.                 dd      0
  5990.                 dd      0
  5991.                 db      0
  5992.                 dd      execdata
  5993.  
  5994. mkdirinfo:
  5995.                 dd      9
  5996.                 dd      0
  5997.                 dd      0
  5998.                 dd      0
  5999.                 dd      0
  6000.                 db      0
  6001.                 dd      CopyDestEditBuf+12
  6002.  
  6003. if lang eq ru
  6004. compare_names   db      '¨ˆà¬Œ €­á‘¤„'
  6005. else
  6006. compare_names   db      'nNxXmMsSuUcCaA'
  6007. end if
  6008.  
  6009. ; ‡¤¥áì ­ ç¨­ îâáï ª®­ä¨£ãà æ¨®­­ë¥ ¤ ­­ë¥ - ¢ ⥪ã饩 ॠ«¨§ æ¨¨ ®­¨ § è¨âë ¢ ¡¨­ à­¨ª
  6010.  
  6011. ;  ­¥«ì
  6012. panel_normal_color      db      1Bh
  6013. panel_selected_color    db      1Eh
  6014. panel_border_color      db      1Bh
  6015. panel_cursor_color      db      30h
  6016. panel_selected_cursor_color db  3Eh
  6017. panel_header_color      db      1Bh
  6018. panel_active_header_color db    30h
  6019. column_header_color     db      1Eh
  6020. panel_number_color      db      1Bh
  6021. panel_numselected_color db      3Eh
  6022. panel_nscreens_color    db      0Bh
  6023. ; „¨ «®£¨
  6024. dialog_colors:
  6025. dialog_main_color       db      70h
  6026. dialog_border_color     db      70h
  6027. dialog_header_color     db      70h
  6028. dialog_edit_color       db      30h
  6029. dialog_unmodified_edit_color db 38h
  6030. dialog_normal_btn_color db      70h
  6031. dialog_selected_btn_color db    30h
  6032. ; à¥¤ã¯à¥¦¤¥­¨ï ¨ ®è¨¡ª¨
  6033. warning_colors:
  6034. ; !!! ¤®«¦­ë ¡ëâì ⥠¦¥ ¯®«ï ¨ ¢ ⮬ ¦¥ ¯®à浪¥, çâ® ¨ ¤«ï ®¡ëç­ëå ¤¨ «®£®¢ !!!
  6035. warning_main_color      db      4Fh
  6036. warning_border_color    db      4Fh
  6037. warning_header_color    db      4Fh
  6038. warning_edit_color      db      30h
  6039. warning_unmodified_edit_color db 38h
  6040. warning_normal_btn_color db     4Fh
  6041. warning_selected_btn_color db   70h
  6042. ; Œ¥­î
  6043. menu_normal_color       db      3Fh
  6044. menu_selected_color     db      0Fh
  6045. menu_highlight_color    db      3Eh
  6046. menu_selected_highlight_color db 0Eh
  6047. menu_border_color       db      3Fh
  6048. menu_header_color       db      3Fh
  6049. menu_scrollbar_color    db      3Fh
  6050. ; ‹¨­¥©ª  ª« ¢¨è
  6051. keybar_number_color     db      7
  6052. keybar_name_color       db      30h
  6053. keybar_bgr_color        db      7
  6054. ; Š®¬ ­¤­ ï áâப 
  6055. cmdbar_normal_color     db      7
  6056. cmdbar_prefix_color     db      7
  6057. ; à®á¬®âà騪
  6058. view_normal_color       db      1Bh
  6059. view_status_color       db      30h
  6060. view_arrows_color       db      1Eh
  6061.  
  6062. ; ®¤á¢¥âª  ä ©«®¢
  6063. highlight_num_groups    dd      10
  6064. highlight_groups        dd      highlight_group0
  6065.                 dd      highlight_group1
  6066.                 dd      highlight_group2
  6067.                 dd      highlight_group3
  6068.                 dd      highlight_group4
  6069.                 dd      highlight_group5
  6070.                 dd      highlight_group6
  6071.                 dd      highlight_group7
  6072.                 dd      highlight_group8
  6073.                 dd      highlight_group9
  6074.  
  6075. ; ”®à¬ â ®¯¨á ­¨ï £àã¯¯ë ¯®¤á¢¥âª¨:
  6076. virtual at 0
  6077. highlight:
  6078.         .IncludeAttributes      db ?
  6079.         .NormalColor            db ?
  6080.         .CursorColor            db ?
  6081.         .SelectedColor          db ?
  6082.         .SelectedCursorColor    db ?
  6083.         .Mask:                  ; ASCIIZ-string
  6084. end virtual
  6085.  
  6086. ; all highlight masks must be in lowercase!
  6087. highlight_group0:
  6088.         db      2
  6089.         db      13h, 38h, 0, 0
  6090.         db      '*',0
  6091. highlight_group1:
  6092.         db      4
  6093.         db      13h, 38h, 0, 0
  6094.         db      '*',0
  6095. highlight_group2:
  6096.         db      10h
  6097.         db      1Fh, 3Fh, 0, 0
  6098.         db      '*|..',0
  6099. highlight_group3:
  6100.         db      10h
  6101.         db      0, 0, 0, 0
  6102.         db      '..',0
  6103. highlight_group4:
  6104.         db      0
  6105.         db      1Ah, 3Ah, 0, 0
  6106.         db      '*.exe,*.com,*.bat,*.cmd',0
  6107. highlight_group5:
  6108.         db      0
  6109.         db      1Ah, 3Ah, 0, 0
  6110.         db      '*|*.*',0
  6111. highlight_group6:
  6112.         db      0
  6113.         db      1Dh, 3Dh, 0, 0
  6114.         db      '*.rar,*.zip,*.[zj],*.[bg7]z,*.[bg]zip,*.tar,*.t[ag]z,*.ar[cj],*.r[0-9][0-9],'
  6115.         db      '*.a[0-9][0-9],*.bz2,*.cab,*.msi,*.jar,*.lha,*.lzh,*.ha,*.ac[bei],*.pa[ck],'
  6116.         db      '*.rk,*.cpio,*.rpm,*.zoo,*.hqx,*.sit,*.ice,*.uc2,*.ain,*.imp,*.777,*.ufa,*.boa,'
  6117.         db      '*.bs[2a],*.sea,*.hpk,*.ddi,*.x2,*.rkv,*.[lw]sz,*.h[ay]p,*.lim,*.sqz,*.chz',0
  6118. highlight_group7:
  6119.         db      0
  6120.         db      16h, 36h, 0, 0
  6121.         db      '*.bak,*.tmp',0
  6122. highlight_group8:
  6123.         db      0
  6124.         db      17h, 37h, 0, 0
  6125.         db      '*.asm,*.inc',0
  6126. highlight_group9:
  6127.         db      10h
  6128.         db      1Fh, 3Fh, 0, 0
  6129.         db      '*',0
  6130.  
  6131. bConfirmDelete  db      1
  6132. bConfirmDeleteIncomplete db 0
  6133.  
  6134. FolderShortcuts dd      0,0,0,0,0,0,0,0,0,0
  6135.  
  6136. ; ‡¤¥áì § ª ­ç¨¢ îâáï ª®­ä¨£ãà æ¨®­­ë¥ ¤ ­­ë¥
  6137.  
  6138. bWasE0          db      0
  6139. ctrlstate       db      0
  6140. MemForImage     dd      0
  6141. restore_semicolon dd    0
  6142. bForHex         db      0
  6143.  
  6144. align   4
  6145. ; ‘®®¡é¥­¨¥ ® ®¡«®¬¥ ¯à¨ ¢ë¤¥«¥­¨¨ ¯ ¬ïâ¨
  6146. nomem_dlgdata:
  6147.         dd      2
  6148.         dd      -1
  6149.         dd      -1
  6150.         dd      12
  6151.         dd      2
  6152.         dd      1
  6153.         dd      1
  6154.         dd      aError
  6155.         rb      4
  6156.         dd      0
  6157.         dd      0
  6158.         dd      2
  6159. ; áâப  "No memory"
  6160.         dd      1
  6161.         dd      1,0,10,0
  6162.         dd      aNoMemory
  6163.         dd      1
  6164. ; ª­®¯ª  "Ok"
  6165.         dd      2
  6166.         dd      4,1,7,1
  6167.         dd      aOk
  6168.         dd      0xD
  6169.  
  6170. ; ¤¨ «®£ ª®¯¨à®¢ ­¨ï
  6171. copy_dlgdata:
  6172.         dd      1
  6173. .x      dd      -1
  6174. .y      dd      -1
  6175. .width  dd      ?
  6176. .height dd      4
  6177.         dd      4
  6178.         dd      2
  6179.         dd      aCopyCaption
  6180. .main_color db ?
  6181. .border_color db ?
  6182. .header_color db ?
  6183.         db      0
  6184.         dd      0
  6185.         dd      0
  6186.         dd      4
  6187. ; áâப  'Š®¯¨à®¢ âì "%s" ¢:'
  6188.         dd      1
  6189.         dd      1,0
  6190. .width2 dd      ?
  6191.         dd      0
  6192.         dd      CopySourceTextBuf
  6193.         dd      0
  6194. ; ¯®«¥ । ªâ¨à®¢ ­¨ï á ¨¬¥­¥¬ ä ©« /¯ ¯ª¨ ­ §­ ç¥­¨ï
  6195.         dd      3
  6196.         dd      1,1
  6197. .width3 dd      ?
  6198.         dd      1
  6199.         dd      CopyDestEditBuf
  6200. .flags0 dd      0
  6201. ; ª­®¯ª  "ª®¯¨à®¢ âì"
  6202. .copy_btn:
  6203.         dd      2
  6204. .copy_x1 dd     ?
  6205.         dd      3
  6206. .copy_x2 dd     ?
  6207.         dd      3
  6208.         dd      aCopy
  6209. .flags1 dd      18h
  6210. ; ª­®¯ª  "®â¬¥­¨âì"
  6211.         dd      2
  6212. .cnl_x1 dd      ?
  6213.         dd      3
  6214. .cnl_x2 dd      ?
  6215.         dd      3
  6216.         dd      aCancelB
  6217. .flags2 dd      8
  6218.  
  6219. mkdir_dlgdata:
  6220.         dd      1
  6221.         dd      -1, -1
  6222. .width  dd      ?
  6223. .height dd      4
  6224.         dd      4, 2
  6225.         dd      aMkDirCaption
  6226.         dd      ?
  6227.         dd      0
  6228.         dd      0
  6229.         dd      4
  6230. ; ‘âப  "‘®§¤ âì ¯ ¯ªã"
  6231.         dd      1
  6232.         dd      1,0,aMkDirLen,0
  6233.         dd      aMkDir
  6234.         dd      0
  6235. ; ¯®«¥ । ªâ¨à®¢ ­¨ï á ¨¬¥­¥¬ ᮧ¤ ¢ ¥¬®© ¯ ¯ª¨
  6236.         dd      3
  6237.         dd      1,1
  6238. .width2 dd      ?
  6239.         dd      1
  6240.         dd      CopyDestEditBuf
  6241. .flags0 dd      0xC
  6242. ; ª­®¯ª  "à®¤®«¦¨âì"
  6243. .cont_btn:
  6244.         dd      2
  6245. .cont_x1 dd     ?
  6246.         dd      3
  6247. .cont_x2 dd     ?
  6248.         dd      3
  6249.         dd      a_Continue
  6250. .flags1 dd      18h
  6251. ; ª­®¯ª  "®â¬¥­¨âì"
  6252.         dd      2
  6253. .cnl_x1 dd      ?
  6254.         dd      3
  6255. .cnl_x2 dd      ?
  6256.         dd      3
  6257.         dd      aCancelB
  6258. .flags2 dd      8
  6259.  
  6260. ; ¤¨ «®£ ¢ë¤¥«¥­¨ï/á­ïâ¨ï
  6261. mark_dlgdata:
  6262.         dd      1
  6263.         dd      -1, -1
  6264.         dd      37, 1
  6265.         dd      4, 2
  6266. .title  dd      ?
  6267.         dd      ?
  6268.         dd      0, 0
  6269.         dd      1
  6270. ; ¯®«¥ । ªâ¨à®¢ ­¨ï
  6271.         dd      3
  6272.         dd      1, 0, 35, 0
  6273.         dd      enter_string_buf
  6274. .flags  dd      ?
  6275.  
  6276. RetryOrCancelBtn:
  6277.         dd      aRetry
  6278.         dd      a_Cancel
  6279. DeleteOrKeepBtn:
  6280.         dd      a_Delete
  6281.         dd      aKeep
  6282. RetryOrIgnoreBtn:
  6283.         dd      aRetry
  6284.         dd      aIgnore
  6285. DeleteOrCancelBtn:
  6286.         dd      a_Delete
  6287.         dd      a_Cancel
  6288. DeleteErrorBtn:
  6289.         dd      aRetry
  6290.         dd      aSkip
  6291.         dd      aSkipAll
  6292.         dd      a_Cancel
  6293. ContinueBtn:
  6294.         dd      aContinue
  6295.  
  6296. if lang eq ru
  6297. aDeleteCaption          db      '“¤ «¥­¨¥',0
  6298. aConfirmDeleteText      db      '‚ë å®â¨â¥ 㤠«¨âì',0
  6299. aDeleteFolder           db      ' ¯ ¯ªã',0
  6300. aConfirmDeleteTextMax = $ - aConfirmDeleteText - 2
  6301. aDeleteFile             db      ' ä ©«',0
  6302. aCancelB                db      '[ Žâ¬¥­¨âì ]',0
  6303. aCancelBLength = $ - aCancelB - 1
  6304. aCopyCaption            db      'Š®¯¨à®¢ ­¨¥',0
  6305. aCopy                   db      '[ Š®¯¨à®¢ âì ]',0
  6306. aCopyLength = $ - aCopy - 1
  6307. a_Continue              db      '[ à®¤®«¦¨âì ]',0
  6308. a_ContinueLength = $ - a_Continue - 1
  6309. aCopy1                  db      'Š®¯¨à®¢ âì ',0
  6310. aCopy2                  db      ' ¢:',0
  6311. aError                  db      'Žè¨¡ª ',0
  6312. aContinue               db      'à®¤®«¦¨âì',0
  6313. aRetry                  db      '®¢â®à¨âì',0
  6314. a_Cancel                db      'Žâ¬¥­¨âì',0
  6315. a_Delete                db      '“¤ «¨âì',0
  6316. aSkip                   db      'à®¯ãáâ¨âì',0
  6317. aSkipAll                db      'à®¯ãáâ¨âì ¢á¥',0
  6318. error0msg               db      '‘âà ­­®... ¥â ®è¨¡ª¨',0
  6319. error1msg               db      '‘âà ­­®... ¥ ®¯à¥¤¥«¥­  ¡ §  ¨/¨«¨ à §¤¥« ¦ñá⪮£® ¤¨áª ',0
  6320. error2msg               db      '”ã­ªæ¨ï ­¥ ¯®¤¤¥à¦¨¢ ¥âáï ¤«ï ¤ ­­®© ä ©«®¢®© á¨á⥬ë',0
  6321. error3msg               db      '¥¨§¢¥áâ­ ï ä ©«®¢ ï á¨á⥬ ',0
  6322. error4msg               db      '‘âà ­­®... Žè¨¡ª  4',0
  6323. error5msg               db      '” ©« ­¥ ­ ©¤¥­',0
  6324. error6msg               db      '” ©« § ª®­ç¨«áï',0
  6325. error7msg               db      '‘âà ­­®... “ª § â¥«ì ¢­¥ ¯ ¬ï⨠¯à¨«®¦¥­¨ï',0
  6326. error8msg               db      '„¨áª § ¯®«­¥­',0
  6327. error9msg               db      '” ©«®¢ ï áâàãªâãà  à §àã襭 ',0
  6328. error10msg              db      '„®áâ㯠§ ¯à¥éñ­',0
  6329. error11msg              db      'Žè¨¡ª  ãáâனá⢠',0
  6330. error30msg              db      '¥¤®áâ â®ç­® ¯ ¬ïâ¨',0
  6331. error31msg              db      '” ©« ­¥ ï¥âáï ¨á¯®«­ï¥¬ë¬',0
  6332. error32msg              db      '‘«¨èª®¬ ¬­®£® ¯à®æ¥áᮢ',0
  6333. aUnknownError           db      '¥¨§¢¥áâ­ë© ª®¤ ®è¨¡ª¨: ',0
  6334. aCannotReadFolder       db      '¥ ¬®£ã ¯à®ç¨â âì ¯ ¯ªã',0
  6335. aRunError               db      'Žè¨¡ª  ¯à¨ § ¯ã᪥ ¯à®£à ¬¬ë:',0
  6336. aFileNameTooBig         db      '®«­®¥ ¨¬ï ä ©«  ᫨誮¬ ¤«¨­­®¥',0
  6337. aFolderNameTooBig       db      '®«­®¥ ¨¬ï ¯ ¯ª¨ ᫨誮¬ ¤«¨­­®¥',0
  6338. aCmdLineTooBig          db      'Š®¬ ­¤­ ï áâப  ¯à¥¢ë蠥⠣࠭¨æã OS ¢ 256 ᨬ¢®«®¢',0
  6339. aCannotCopyToSelf       db      '” ©« ­¥ ¬®¦¥â ¡ëâì ᪮¯¨à®¢ ­ ¢ á ¬®£® ᥡï',0
  6340. aCannotReadFile         db      '¥ ¬®£ã ¯à®ç¨â âì ä ©«',0
  6341. aIncompleteFile         db      'ë« ¯®«ã祭 ­¥¯®«­ë© ä ©«. “¤ «¨âì ¥£®?',0
  6342. aKeep                   db      'Žáâ ¢¨âì',0
  6343. aCannotWriteFile        db      '¥ ¬®£ã § ¯¨á âì ¢ ä ©«',0
  6344. aCannotDeleteFile       db      '¥ ¬®£ã 㤠«¨âì ä ©«',0
  6345. aCannotDeleteFolder     db      '¥ ¬®£ã 㤠«¨âì ¯ ¯ªã',0
  6346. aNotFolder              db      '­¥ ï¥âáï ¯ ¯ª®©',0
  6347. aIgnore                 db      'ˆ£­®à¨à®¢ âì',0
  6348. aMkDirCaption           db      '‘®§¤ ­¨¥ ¯ ¯ª¨',0
  6349. aMkDir                  db      '‘®§¤ âì ¯ ¯ªã',0
  6350. aMkDirLen = $ - aMkDir - 1
  6351. aCannotMakeFolder       db      '¥ ¬®£ã ᮧ¤ âì ¯ ¯ªã',0
  6352. aName                   db      3,'ˆ¬ï'
  6353. aSize                   db      6,' §¬¥à'
  6354. aDate                   db      4,'„ â '
  6355. aTime                   db      5,'‚६ï'
  6356. aCannotLoadDLL          db      '¥ ¬®£ã § £à㧨âì DLL',0
  6357. aInvalidDLL             db      '” ©« ­¥ ­ ©¤¥­ ¨«¨ ¨¬¥¥â ­¥¢¥à­ë© ä®à¬ â',0
  6358. aMissingExport          db      '¥®¡å®¤¨¬ ï äã­ªæ¨ï ­¥ ­ ©¤¥­ ',0
  6359. aInitFailed             db      'Žè¨¡ª  ¯à¨ ¨­¨æ¨ «¨§ æ¨¨',0
  6360. aIncompatibleVersion    db      '¥á®¢¬¥á⨬ ï ¢¥àá¨ï',0
  6361. aTables                 db      '’ ¡«¨æë',0
  6362. aSelect                 db      '®¬¥â¨âì',0
  6363. aDeselect               db      '‘­ïâì',0
  6364. else
  6365. aDeleteCaption          db      'Delete',0
  6366. aConfirmDeleteText      db      'Do you wish to delete',0
  6367. aDeleteFolder           db      ' the folder',0
  6368. aConfirmDeleteTextMax = $ - aConfirmDeleteText - 2
  6369. aDeleteFile             db      ' the file',0
  6370. aDelete                 db      ' Delete ',0
  6371. aDeleteLength = $ - aDelete - 1
  6372. aCancel                 db      ' Cancel ',0
  6373. aCancelLength = $ - aCancel - 1
  6374. aCancelB                db      '[ Cancel ]',0
  6375. aCancelBLength = $ - aCancelB - 1
  6376. aCopyCaption            db      'Copy',0
  6377. aCopy                   db      '[ Copy ]',0
  6378. aCopyLength = $ - aCopy - 1
  6379. a_Continue              db      '[ Continue ]',0
  6380. a_ContinueLength = $ - a_Continue - 1
  6381. aCopy1                  db      'Copy "',0
  6382. aCopy2                  db      '" to:',0
  6383. aError                  db      'Error',0
  6384. aContinue               db      'Continue',0
  6385. aRetry                  db      'Retry',0
  6386. a_Cancel                db      'Cancel',0
  6387. a_Delete                db      'Delete',0
  6388. aSkip                   db      'Skip',0
  6389. aSkipAll                db      'Skip all',0
  6390. error0msg               db      'Strange... No error',0
  6391. error1msg               db      'Strange... Hard disk base and/or partition not defined',0
  6392. error2msg               db      'The file system does not support this function',0
  6393. error3msg               db      'Unknown file system',0
  6394. error4msg               db      'Strange... Error 4',0
  6395. error5msg               db      'File not found',0
  6396. error6msg               db      'End of file',0
  6397. error7msg               db      'Strange... Pointer lies outside of application memory',0
  6398. error8msg               db      'Disk is full',0
  6399. error9msg               db      'File structure is destroyed',0
  6400. error10msg              db      'Access denied',0
  6401. error11msg              db      'Device error',0
  6402. error30msg              db      'Not enough memory',0
  6403. error31msg              db      'File is not executable',0
  6404. error32msg              db      'Too many processes',0
  6405. aUnknownError           db      'Unknown error code: ',0
  6406. aCannotReadFolder       db      'Cannot read folder',0
  6407. aRunError               db      'Cannot execute program:',0
  6408. aFileNameTooBig         db      'Full file name is too long',0
  6409. aFolderNameTooBig       db      'Full folder name is too long',0
  6410. aCmdLineTooBig          db      'Command line is too long (OS limit is 256 symbols)',0
  6411. aCannotCopyToSelf       db      'File cannot be copied onto itself',0
  6412. aCannotReadFile         db      'Cannot read file',0
  6413. aIncompleteFile         db      'Incomplete file was retrieved. Delete it?',0
  6414. aKeep                   db      'Keep',0
  6415. aCannotWriteFile        db      'Cannot write to the file',0
  6416. aCannotDeleteFile       db      'Cannot delete the file',0
  6417. aCannotDeleteFolder     db      'Cannot delete the folder',0
  6418. aNotFolder              db      'is not a folder',0
  6419. aIgnore                 db      'Ignore',0
  6420. aMkDirCaption           db      'Make folder',0
  6421. aMkDir                  db      'Create the folder',0
  6422. aMkDirLen = $ - aMkDir - 1
  6423. aCannotMakeFolder       db      'Cannot create folder',0
  6424. aName                   db      4,'Name'
  6425. aSize                   db      4,'Size'
  6426. aDate                   db      4,'Date'
  6427. aTime                   db      4,'Time'
  6428. aCannotLoadDLL          db      'Cannot load DLL',0
  6429. aInvalidDLL             db      'File is not found or invalid',0
  6430. aMissingExport          db      'Required function is not present',0
  6431. aInitFailed             db      'Initialization failed',0
  6432. aIncompatibleVersion    db      'Incompatible version',0
  6433. aTables                 db      'Tables',0
  6434. aSelect                 db      'Select',0
  6435. aDeselect               db      'Deselect',0
  6436. end if
  6437.  
  6438. aOk                     db      'OK',0
  6439. aNoMemory               db      'No memory!'
  6440. nullstr                 db      0
  6441. standard_dll_path:
  6442. libini_name             db      '/rd/1/dll/'
  6443. standard_dll_path_size = $ - standard_dll_path
  6444.                         db      'libini.obj',0
  6445. aStart                  db      'START',0
  6446. aLibInit                db      'lib_init',0
  6447. aVersion                db      'version',0
  6448. aIniGetInt              db      'ini.get_int',0
  6449. aIniGetStr              db      'ini.get_str',0
  6450. aIniEnumKeys            db      'ini.enum_keys',0
  6451.  
  6452. aConfirmations          db      'Confirmations',0
  6453. aConfirmDelete          db      'Delete',0
  6454. aConfirmDeleteIncomplete db     'DeleteIncomplete',0
  6455.  
  6456. aAssociations           db      'Associations',0
  6457. aMenu                   db      'Menu',0
  6458. aFolderShortcuts        db      'FolderShortcuts',0
  6459. aShortcut               db      'Shortcut'
  6460. .d                      db      '0',0
  6461.  
  6462. align 4
  6463. ini_import:
  6464. ini.get_int     dd      aIniGetInt
  6465. ini.get_str     dd      aIniGetStr
  6466. ini.enum_keys   dd      aIniEnumKeys
  6467.                 dd      0
  6468.  
  6469. virtual at 0
  6470. PanelMode:
  6471. ; up to 16 columns on one panel
  6472. .NumColumns     dd      ?
  6473. ; available column types:
  6474. COLUMN_TYPE_NONE = 0
  6475. COLUMN_TYPE_NAME = 1
  6476.         COLUMN_NAME_MARK = 10h          ; (reserved)
  6477.         COLUMN_NAME_NOPATH = 20h        ; (reserved)
  6478.         COLUMN_NAME_RIGHTALIGN = 40h    ; (reserved)
  6479. COLUMN_TYPE_SIZE = 2
  6480.         COLUMN_SIZE_COMMA = 10h         ; (reserved)
  6481. COLUMN_TYPE_PACKED_SIZE = 3             ; (reserved)
  6482. COLUMN_TYPE_DATE = 4
  6483. COLUMN_TYPE_TIME = 5
  6484. COLUMN_TYPE_DATETIME = 6                ; (reserved)
  6485. COLUMN_TYPE_DATETIME_CREATION = 7       ; (reserved)
  6486. COLUMN_TYPE_DATETIME_ACCESS = 8         ; (reserved)
  6487. COLUMN_TYPE_ATTRIBUTES = 9              ; (reserved)
  6488. COLUMN_TYPE_DESCRIPTION = 10            ; (reserved)
  6489. COLUMN_TYPE_OWNER = 11                  ; (reserved)
  6490. COLUMN_TYPE_NUMLINKS = 12               ; (reserved)
  6491. COLUMN_TYPE_CUSTOM = 13                 ; (reserved)
  6492. .ColumnTypes    rb      16
  6493.  
  6494. .ColumnWidths   rb      16
  6495. .bFullScreen    db      ?               ; (reserved)
  6496. .bAlignExtensions db    ?
  6497.                 rb      2
  6498. .size = $
  6499. end virtual
  6500.  
  6501. align 4
  6502. column_headers:
  6503.         dd      nullstr
  6504.         dd      aName
  6505.         dd      aSize
  6506.         dd      nullstr
  6507.         dd      aDate
  6508.         dd      aTime
  6509. draw_column_proc:
  6510.         dd      draw_empty_column
  6511.         dd      draw_name_column
  6512.         dd      draw_size_column
  6513.         dd      -1
  6514.         dd      draw_date_column
  6515.         dd      draw_time_column
  6516. colmodes:
  6517. ; ०¨¬ 0 : NM,SC,D
  6518.         dd      3
  6519.         db      COLUMN_TYPE_NAME+COLUMN_NAME_MARK, COLUMN_TYPE_SIZE+COLUMN_SIZE_COMMA
  6520.                 db      COLUMN_TYPE_DATE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  6521.         db      0, 10, 8
  6522.                 times 13 db 0
  6523.         db      0, 1
  6524.                 times 2 db 0
  6525. ; ०¨¬ 1 : N,N,N
  6526.         dd      3
  6527.         db      COLUMN_TYPE_NAME, COLUMN_TYPE_NAME, COLUMN_TYPE_NAME
  6528.                 times 13 db 0
  6529.         times 16 db 0
  6530.         db      0, 1
  6531.                 times 2 db 0
  6532. ; ०¨¬ 2 : N,N
  6533.         dd      2
  6534.         db      COLUMN_TYPE_NAME, COLUMN_TYPE_NAME
  6535.                 times 14 db 0
  6536.         times 16 db 0
  6537.         db      0, 0
  6538.                 times 2 db 0
  6539. ; ०¨¬ 3 : N,S,D,T
  6540.         dd      4
  6541.         db      COLUMN_TYPE_NAME, COLUMN_TYPE_SIZE, COLUMN_TYPE_DATE, COLUMN_TYPE_TIME
  6542.                 times 12 db 0
  6543.         db      0, 6, 8, 5
  6544.                 times 12 db 0
  6545.         db      0, 1
  6546.                 times 2 db 0
  6547. ; ०¨¬ 4 : N,S
  6548.         dd      2
  6549.         db      COLUMN_TYPE_NAME, COLUMN_TYPE_SIZE
  6550.                 times 14 db 0
  6551.         db      0, 6
  6552.                 times 14 db 0
  6553.         db      0, 0
  6554.                 times 2 db 0
  6555. ; ०¨¬ 5 : N,S,P,DM,DC,DA,A
  6556. ; ०¨¬ 6 : N,Z
  6557. ; ०¨¬ 7 : N,S,Z
  6558. ; ०¨¬ 8 : N,S,O
  6559. ; ०¨¬ 9 : N,S,LN
  6560.  
  6561. execinfo:
  6562.         dd      7
  6563.         dd      0
  6564. execparams dd   0
  6565.         dd      0
  6566.         dd      0
  6567.         db      0
  6568. execptr dd      ?
  6569.  
  6570. IncludeIGlobals
  6571.  
  6572. i_end:
  6573.  
  6574. IncludeUGlobals
  6575.  
  6576. execdata rb     1024
  6577. execdataend:
  6578.         align   4
  6579. attrinfo.attr   rb      40
  6580.  
  6581. panel1_data:
  6582. panel1_left     dd      ?
  6583. panel1_top      dd      ?
  6584. panel1_width    dd      ?
  6585. panel1_height   dd      ?
  6586. panel1_index    dd      ?
  6587. panel1_start    dd      ?
  6588. panel1_colsz    dd      ?
  6589. panel1_colst    dd      ?
  6590. panel1_sortmode db      ?
  6591.                 rb      3
  6592. panel1_nfa      dd      ?
  6593. panel1_numfiles dd      ?
  6594. panel1_files    dd      ?
  6595. panel1_colmode  dd      ?
  6596. panel1_colwidths rd     16+1
  6597. panel1_total_num dd     ?
  6598. panel1_total_size dq    ?
  6599. panel1_selected_num dd ?
  6600. panel1_selected_size dq ?
  6601. panel1_dir      rb      1024
  6602.  
  6603. panel2_data:
  6604. panel2_left     dd      ?
  6605. panel2_top      dd      ?
  6606. panel2_width    dd      ?
  6607. panel2_height   dd      ?
  6608. panel2_index    dd      ?
  6609. panel2_start    dd      ?
  6610. panel2_colsz    dd      ?
  6611. panel2_colst    dd      ?
  6612. panel2_sortmode db      ?
  6613.                 rb      3
  6614. panel2_nfa      dd      ?
  6615. panel2_numfiles dd      ?
  6616. panel2_files    dd      ?
  6617. panel2_colmode  dd      ?
  6618. panel2_colwidths rd     16+1
  6619. panel2_total_num dd     ?
  6620. panel2_total_size dq    ?
  6621. panel2_selected_num  dd ?
  6622. panel2_selected_size dq ?
  6623. panel2_dir      rb      1024
  6624.  
  6625. ;console_data    rb      max_width*max_height*2
  6626.  
  6627. nomem_dlgsavearea       rb      (12+4)*(3+3)*2
  6628.  
  6629. cur_header      rb      max_width
  6630. tmp             dd      ?
  6631.  
  6632. skinh           dd      ?
  6633. std_colors      rd      10
  6634.  
  6635. min_y           dd      ?
  6636. max_y           dd      ?
  6637. min_x           dd      ?
  6638. max_x           dd      ?
  6639. used_width      dd      ?
  6640. used_height     dd      ?
  6641.  
  6642. wnd_width       dd      ?
  6643. wnd_height      dd      ?
  6644.  
  6645. column_left     dd      ?
  6646. column_top      dd      ?
  6647. column_width    dd      ?
  6648. column_height   dd      ?
  6649. column_index    dd      ?
  6650. last_column_index dd    ?
  6651.  
  6652. scrpos          dq      ?
  6653. viewer_right_side dq    ?
  6654.  
  6655. saved_file_name:
  6656. procinfo        rb      1024
  6657. lower_file_name = procinfo + 512
  6658.  
  6659. app_path        rb      1100
  6660.  
  6661. error_msg       rb      128
  6662.  
  6663. prev_dir        rb      1024
  6664.  
  6665. driveinfo       rb      32+304
  6666. tmpname         rb      32
  6667.  
  6668. screens         dd      ?
  6669. num_screens     dd      ?
  6670. active_screen_vtable dd ?
  6671. active_screen_data dd   ?
  6672.  
  6673. aConfirmDeleteTextBuf   rb      aConfirmDeleteTextMax + 1
  6674. CopySourceTextBuf       rb      512
  6675. CopyDestEditBuf         rb      12+512+1
  6676. .length = $ - CopyDestEditBuf - 13
  6677.  
  6678. enter_string_buf        rb      12+512+1
  6679.  
  6680. bMemForImageValidData   db      ?
  6681.  
  6682. align 4
  6683. tolower_table   rb      256
  6684. layout          rb      128
  6685.  
  6686. copy_buffer_size = 65536
  6687. copy_buffer     rb      copy_buffer_size
  6688.  
  6689. ; data for directory delete
  6690. ; If directory nested level is >1024, then its full name is too big,
  6691. ; so we see the overflow when creating full name (we check for this!)
  6692. del_dir_stack   rd      1024
  6693. del_dir_stack_ptr dd    ?
  6694. del_dir_query_size = 32
  6695. del_dir_query_area rb   32+304*del_dir_query_size
  6696.  
  6697. label copy_dir_stack dword at del_dir_stack
  6698. label copy_dir_stack_ptr dword at del_dir_stack_ptr
  6699. copy_dir_query_size = del_dir_query_size
  6700. copy_dir_query_area = del_dir_query_area
  6701. del_bSkipAll    db      ?       ; for directory errors
  6702. label copy_bSkipAll byte at del_bSkipAll
  6703. copy_bSkipAll2  db      ?       ; for file read/write errors
  6704.  
  6705. bEndSlash       db      ?
  6706. bDestIsFolder   db      ?
  6707. bNeedRestoreName db     ?
  6708.  
  6709. ; stack
  6710.         align   4
  6711.         rb      512
  6712. stacktop:
  6713.  
  6714. mem:
  6715.