Subversion Repositories Kolibri OS

Rev

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