Subversion Repositories Kolibri OS

Rev

Rev 183 | 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.         mov     eax, [ebp + panel1_files - panel1_data]
  582.         mov     ecx, [eax+ecx*4]
  583.         mov     eax, [ebp + panel1_nfa - panel1_data]
  584.         lea     ecx, [ecx+eax*4+32]
  585.         add     ecx, [ebp + panel1_files - panel1_data]
  586.         test    byte [ecx], 10h
  587.         jnz     .enter_folder
  588. ; find extension
  589.         lea     esi, [ecx+40]
  590.         push    esi
  591. @@:
  592.         lodsb
  593.         test    al, al
  594.         jnz     @b
  595. @@:
  596.         dec     esi
  597.         cmp     byte [esi], '.'
  598.         jz      .found_ext
  599.         cmp     esi, [esp]
  600.         ja      @b
  601.         jmp     .run_app
  602. .found_ext:
  603.         inc     esi
  604.         mov     edi, associations
  605. @@:
  606.         push    esi edi
  607.         mov     edi, [edi]
  608.         call    strcmpi
  609.         pop     edi esi
  610.         jz      .run_association
  611.         add     edi, 8
  612.         cmp     edi, associations_end
  613.         jb      @b
  614.         jmp     .run_app
  615. .run_association:
  616.         mov     [execparams], execdata
  617.         mov     eax, [edi+4]
  618.         mov     [execptr], eax
  619.         jmp     .dorun
  620. .run_app:
  621.         mov     [execptr], execdata
  622.         and     [execparams], 0
  623. .dorun:
  624.         pop     esi
  625.         lea     esi, [ebp + panel1_dir - panel1_data]
  626.         mov     edi, execdata
  627. ; TODO: add overflow check
  628. @@:
  629.         lodsb
  630.         test    al, al
  631.         jz      @f
  632.         stosb
  633.         jmp     @b
  634. @@:
  635.         lea     esi, [ecx+40]
  636.         mov     al, '/'
  637.         stosb
  638. @@:
  639.         lodsb
  640.         stosb
  641.         test    al, al
  642.         jnz     @b
  643.         push    70
  644.         pop     eax
  645.         mov     ebx, execinfo
  646.         int     40h
  647.         ret
  648. .enter_folder:
  649.         lea     esi, [ecx+40]
  650.         cmp     word [esi], '..'
  651.         jnz     @f
  652.         cmp     byte [esi+2], 0
  653.         jz      .dotdot
  654. @@:
  655.         lea     edi, [ebp + panel1_dir - panel1_data]
  656.         mov     al, 0
  657.         or      ecx, -1
  658.         repnz   scasb
  659.         dec     edi
  660.         mov     al, '/'
  661.         cmp     [edi-1], al
  662.         jz      @f
  663.         stosb
  664. @@:
  665. ; TODO: add buffer overflow check
  666. @@:
  667.         lodsb
  668.         stosb
  669.         test    al, al
  670.         jnz     @b
  671. .reread:
  672.         call    read_folder
  673. .done_cmdbar:
  674.         call    draw_cmdbar
  675.         jmp     .done_redraw
  676. .dotdot:
  677.         lea     edi, [ebp + panel1_dir - panel1_data]
  678.         mov     al, 0
  679.         or      ecx, -1
  680.         repnz   scasb
  681.         dec     edi
  682.         mov     al, '/'
  683.         std
  684.         repnz   scasb
  685.         cld
  686.         inc     edi
  687.         mov     byte [edi], 0
  688.         inc     edi
  689.         push    edi
  690.         call    read_folder
  691.         pop     edi
  692.         mov     edx, [ebp + panel1_files - panel1_data]
  693.         mov     ecx, [ebp + panel1_numfiles - panel1_data]
  694. .scanloop:
  695.         mov     esi, [edx]
  696.         mov     eax, [ebp + panel1_nfa - panel1_data]
  697.         lea     esi, [esi+eax*4+32+40]
  698.         add     esi, [ebp + panel1_files - panel1_data]
  699.         push    esi edi
  700. @@:
  701.         lodsb
  702.         call    match_symbol
  703.         jnz     @f
  704.         inc     edi
  705.         test    al, al
  706.         jnz     @b
  707. @@:
  708.         pop     edi esi
  709.         jz      .scanfound
  710.         add     edx, 4
  711.         loop    .scanloop
  712.         jmp     .scandone
  713. .scanfound:
  714.         sub     edx, [ebp + panel1_files - panel1_data]
  715.         shr     edx, 2
  716.         mov     [ebp + panel1_index - panel1_data], edx
  717.         sub     edx, [ebp + panel1_colst - panel1_data]
  718.         jb      .scandone
  719.         inc     edx
  720.         mov     [ebp + panel1_start - panel1_data], edx
  721. .scandone:
  722.         jmp     .done_cmdbar
  723. .ctrl_f39:
  724.         sub     al, 0x3D
  725.         add     al, al
  726.         mov     ah, [ebp + panel1_sortmode - panel1_data]
  727.         and     ah, 0xFE
  728.         cmp     al, ah
  729.         jnz     @f
  730.         and     [ebp + panel1_sortmode - panel1_data], 1
  731.         or      al, [ebp + panel1_sortmode - panel1_data]
  732.         xor     al, 1
  733. @@:
  734.         mov     [ebp + panel1_sortmode - panel1_data], al
  735.         mov     eax, [ebp + panel1_index - panel1_data]
  736.         mov     ecx, [ebp + panel1_files - panel1_data]
  737.         push    dword [ecx+eax*4]
  738.         push    ecx
  739.         call    sort_files
  740.         pop     edi
  741.         pop     eax
  742.         or      ecx, -1
  743.         repnz   scasd
  744.         not     ecx
  745.         dec     ecx
  746.         mov     [ebp + panel1_index - panel1_data], ecx
  747.         sub     ecx, [ebp + panel1_start - panel1_data]
  748.         jb      .less_start
  749.         sub     ecx, [ebp + panel1_colst - panel1_data]
  750.         jae     .gr_end
  751. @@:     jmp     .done_redraw
  752. .less_start:
  753.         add     [ebp + panel1_start - panel1_data], ecx
  754.         jmp     @b
  755. .gr_end:
  756.         inc     ecx
  757.         add     [ebp + panel1_start - panel1_data], ecx
  758.         jmp     @b
  759. .alt_f12:
  760.         mov     ebp, panel1_data
  761.         cmp     al, 0x3B
  762.         jz      @f
  763.         mov     ebp, panel2_data
  764. @@:
  765. ; get drives list
  766.         mov     ebx, dirinfo
  767.         mov     [ebx+dirinfo.size-dirinfo], 1
  768.         mov     [ebx+dirinfo.dirdata-dirinfo], driveinfo
  769.         mov     [ebx+dirinfo.name-dirinfo], tmpname
  770.         mov     byte [tmpname], '/'
  771.         xor     ecx, ecx
  772. .drive_loop_e:
  773.         mov     byte [tmpname+1], 0
  774.         push    70
  775.         pop     eax
  776.         int     40h
  777.         mov     ebx, dirinfo
  778.         test    eax, eax
  779.         jnz     .drive_loop_e_done
  780.         mov     esi, driveinfo+32+40
  781.         mov     edi, tmpname+1
  782. @@:
  783.         lodsb
  784.         stosb
  785.         test    al, al
  786.         jnz     @b
  787.         push    [ebx+dirinfo.first-dirinfo]
  788.         and     [ebx+dirinfo.first-dirinfo], 0
  789. .drive_loop_i:
  790.         push    70
  791.         pop     eax
  792.         int     40h
  793.         mov     ebx, dirinfo
  794.         test    eax, eax
  795.         jnz     .drive_loop_i_done
  796.         mov     eax, 32+8
  797.         call    mf_alloc
  798.         test    eax, eax
  799.         jz      .drive_loop_i_done
  800.         jecxz   @f
  801.         mov     [ecx], eax
  802. @@:
  803.         and     dword [eax], 0
  804.         mov     [eax+4], ecx
  805.         mov     ecx, eax
  806.         lea     edi, [eax+8]
  807.         mov     esi, tmpname
  808. @@:
  809.         lodsb
  810.         test    al, al
  811.         jz      @f
  812.         stosb
  813.         jmp     @b
  814. @@:
  815.         mov     esi, driveinfo+32+40
  816.         mov     al, '/'
  817.         stosb
  818. @@:
  819.         lodsb
  820.         stosb
  821.         test    al, al
  822.         jnz     @b
  823.         inc     [ebx+dirinfo.first-dirinfo]
  824.         jmp     .drive_loop_i
  825. .drive_loop_i_done:
  826.         pop     [ebx+dirinfo.first-dirinfo]
  827.         inc     [ebx+dirinfo.first-dirinfo]
  828.         jmp     .drive_loop_e
  829. .drive_loop_e_done:
  830.         and     [ebx+dirinfo.first-dirinfo], 0
  831.         lea     edi, [ebp + panel1_dir - panel1_data]
  832. .find_cur_drive_loop:
  833.         push    edi
  834.         lea     esi, [ecx+8]
  835. @@:
  836.         lodsb
  837.         test    al, al
  838.         jz      .cur_drive_found
  839.         call    match_symbol
  840.         jnz     @f
  841.         inc     edi
  842.         jmp     @b
  843. @@:
  844.         cmp     dword [ecx+4], 0
  845.         jz      @f
  846.         pop     edi
  847.         mov     ecx, [ecx+4]
  848.         jmp     .find_cur_drive_loop
  849. @@:
  850. .cur_drive_found:
  851.         pop     edi
  852.         push    1
  853.         push    aDrive
  854.         push    ecx
  855.         mov     eax, [ebp + panel1_height - panel1_data]
  856.         sub     eax, 2
  857.         jae     @f
  858.         add     eax, 2
  859. @@:
  860.         push    eax
  861.         push    [ebp + panel1_width - panel1_data]
  862.         push    [ebp + panel1_top - panel1_data]
  863.         push    [ebp + panel1_left - panel1_data]
  864.         call    menu_centered_in
  865.         cmp     eax, -1
  866.         jz      .ret2
  867.         lea     esi, [eax+8]
  868.         lea     edi, [ebp + panel1_dir - panel1_data]
  869. @@:
  870.         lodsb
  871.         stosb
  872.         test    al, al
  873.         jnz     @b
  874. @@:
  875.         cmp     dword [ecx+4], 0
  876.         jz      @f
  877.         mov     ecx, [ecx+4]
  878.         jmp     @b
  879. @@:
  880.         mov     eax, ecx
  881.         mov     ecx, [ecx]
  882.         call    mf_free
  883.         test    ecx, ecx
  884.         jnz     @b
  885.         call    read_folder
  886.         jmp     .done_redraw
  887. .f3:
  888.         call    view_file
  889. .ret2:
  890.         ret
  891. .f8:
  892.         mov     eax, [ebp + panel1_files - panel1_data]
  893.         mov     ecx, [eax+ecx*4]
  894.         mov     eax, [ebp + panel1_nfa - panel1_data]
  895.         lea     ecx, [ecx+eax*4+32]
  896.         add     ecx, [ebp + panel1_files - panel1_data]
  897.         lea     esi, [ebp + panel1_dir - panel1_data]
  898.         mov     edi, execdata
  899. @@:
  900.         lodsb
  901.         test    al, al
  902.         jz      @f
  903.         stosb
  904.         jmp     @b
  905. @@:
  906.         lea     esi, [ecx+40]
  907.         mov     al, '/'
  908.         stosb
  909. @@:
  910.         lodsb
  911.         stosb
  912.         test    al, al
  913.         jnz     @b
  914.         push    70
  915.         pop     eax
  916.         mov     ebx, delinfo
  917.         int     0x40
  918. .ctrl_r:
  919. ; Rescan panel
  920. ;       call    read_folder
  921. ;       jmp     .done_redraw
  922.         mov     eax, [ebp + panel1_index - panel1_data]
  923.         push    eax
  924.         mov     ecx, [ebp + panel1_files - panel1_data]
  925.         mov     ecx, [ecx+eax*4]
  926.         mov     eax, [ebp + panel1_nfa - panel1_data]
  927.         lea     esi, [ecx+eax*4+32+40]
  928.         add     esi, [ebp + panel1_files - panel1_data]
  929.         mov     edi, saved_file_name
  930. @@:
  931.         lodsb
  932.         stosb
  933.         test    al, al
  934.         jnz     @b
  935.         push    [ebp + panel1_start - panel1_data]
  936.         call    read_folder
  937.         pop     [ebp + panel1_start - panel1_data]
  938.         pop     [ebp + panel1_index - panel1_data]
  939.         or      eax, -1
  940. @@:
  941.         inc     eax
  942.         cmp     eax, [ebp + panel1_numfiles - panel1_data]
  943.         jae     .ctrl_r.notfound
  944.         mov     esi, [ebp + panel1_nfa - panel1_data]
  945.         mov     ecx, [ebp + panel1_files - panel1_data]
  946.         lea     esi, [ecx+esi*4+32+40]
  947.         add     esi, [ecx+eax*4]
  948.         mov     edi, saved_file_name
  949.         call    strcmpi
  950.         jnz     @b
  951. .ctrl_r.found:
  952.         mov     [ebp + panel1_index - panel1_data], eax
  953. .ctrl_r.notfound:
  954.         mov     eax, [ebp + panel1_numfiles - panel1_data]
  955.         dec     eax
  956.         cmp     [ebp + panel1_index - panel1_data], eax
  957.         jbe     @f
  958.         mov     [ebp + panel1_index - panel1_data], eax
  959. @@:
  960.         mov     eax, [ebp + panel1_index - panel1_data]
  961.         cmp     [ebp + panel1_start - panel1_data], eax
  962.         jbe     @f
  963.         mov     [ebp + panel1_start - panel1_data], eax
  964. @@:
  965.         inc     eax
  966.         sub     eax, [ebp + panel1_colst - panel1_data]
  967.         jae     @f
  968.         xor     eax, eax
  969. @@:
  970.         cmp     [ebp + panel1_start - panel1_data], eax
  971.         jae     @f
  972.         mov     [ebp + panel1_start - panel1_data], eax
  973. @@:
  974.         mov     eax, [ebp + panel1_numfiles - panel1_data]
  975.         sub     eax, [ebp + panel1_colst - panel1_data]
  976.         jbe     @f
  977.         cmp     [ebp + panel1_start - panel1_data], eax
  978.         jbe     @f
  979.         mov     [ebp + panel1_start - panel1_data], eax
  980. @@:
  981.         jmp     .done_redraw
  982.  
  983. panels_OnRedraw:
  984.         call    draw_cmdbar
  985.         mov     ebp, panel1_data
  986.         call    draw_panel
  987.         mov     ebp, panel2_data
  988.         call    draw_panel
  989.         ret
  990.  
  991. init_console:
  992.         mov     ax, 0720h
  993.         mov     ecx, [cur_width]
  994.         imul    ecx, [cur_height]
  995.         mov     edi, console_data
  996.         rep     stosw
  997.         and     [panel1_left], 0
  998.         and     [panel1_top], 0
  999.         and     [panel2_top], 0
  1000.         mov     eax, [cur_width]
  1001.         inc     eax
  1002.         shr     eax, 1
  1003.         mov     [panel1_width], eax
  1004.         mov     [panel2_left], eax
  1005.         sub     eax, [cur_width]
  1006.         neg     eax
  1007.         mov     [panel2_width], eax
  1008.         mov     eax, [cur_height]
  1009.         dec     eax
  1010.         dec     eax
  1011.         mov     [panel1_height], eax
  1012.         mov     [panel2_height], eax
  1013.         ret
  1014.  
  1015. panels_getname:
  1016. if lang eq ru
  1017.         mov     eax, 'Пане'
  1018.         stosd
  1019.         mov     eax, 'ли  '
  1020.         stosd
  1021.         mov     eax, '    '
  1022.         stosd
  1023.         stosb
  1024. else
  1025.         mov     eax, 'Pane'
  1026.         stosd
  1027.         mov     eax, 'ls  '
  1028.         stosd
  1029.         mov     eax, '    '
  1030.         stosd
  1031.         stosb
  1032. end if
  1033.         sub     ecx, 13
  1034.         mov     ebp, [active_panel]
  1035.         lea     esi, [ebp + panel1_dir - panel1_data]
  1036.         push    3
  1037.         pop     edx
  1038. @@:
  1039.         lodsb
  1040.         stosb
  1041.         dec     ecx
  1042.         test    al, al
  1043.         jz      @f
  1044.         cmp     al, '/'
  1045.         jnz     @b
  1046.         dec     edx
  1047.         jnz     @b
  1048. @@:
  1049.         test    al, al
  1050.         jnz     @f
  1051.         dec     esi
  1052.         dec     edi
  1053. @@:
  1054.         push    esi
  1055. @@:
  1056.         lodsb
  1057.         test    al, al
  1058.         jnz     @b
  1059.         dec     esi
  1060.         mov     ebx, esi
  1061.         sub     ebx, [esp]
  1062.         dec     esi
  1063.         push    esi
  1064.         mov     edx, [ebp + panel1_files - panel1_data]
  1065.         mov     esi, [ebp + panel1_index - panel1_data]
  1066.         mov     esi, [edx+esi*4]
  1067.         add     esi, edx
  1068.         mov     edx, [ebp + panel1_nfa - panel1_data]
  1069.         lea     esi, [esi+edx*4+32+40]
  1070.         push    esi
  1071. @@:
  1072.         lodsb
  1073.         test    al, al
  1074.         jnz     @b
  1075.         add     ebx, esi
  1076.         sub     ebx, [esp]
  1077.         dec     esi
  1078.         cmp     ebx, ecx
  1079.         jbe     @f
  1080.         mov     al, '.'
  1081.         stosb
  1082.         stosb
  1083.         stosb
  1084.         sub     ecx, 3
  1085.         mov     ebx, ecx
  1086. @@:
  1087.         add     edi, ebx
  1088.         inc     ecx
  1089.         std
  1090. @@:
  1091.         movsb
  1092.         dec     ecx
  1093.         jz      .nodir
  1094.         cmp     esi, [esp]
  1095.         jae     @b
  1096.         mov     al, '/'
  1097.         stosb
  1098.         dec     ecx
  1099.         jz      .nodir
  1100.         mov     esi, [esp+4]
  1101. @@:
  1102.         cmp     esi, [esp+8]
  1103.         jb      .nodir
  1104.         movsb
  1105.         loop    @b
  1106. .nodir:
  1107.         cld
  1108.         pop     eax
  1109.         pop     eax
  1110.         pop     eax
  1111.         ret
  1112.  
  1113. draw_window:
  1114.         push    12
  1115.         pop     eax
  1116.         push    1
  1117.         pop     ebx
  1118.         int     40h
  1119.         mov     al, 48
  1120.         mov     bl, 4
  1121.         int     40h
  1122.         mov     [skinh], eax
  1123.         mov     ebx, [cur_width]
  1124.         imul    ebx, font_width
  1125.         add     ebx, 100*65536 + 5*2
  1126.         mov     ecx, [cur_height]
  1127.         imul    ecx, font_height
  1128.         lea     ecx, [eax+ecx+5+100*65536]
  1129.         xor     eax, eax
  1130.         mov     edx, 0x13000000
  1131.         mov     edi, header
  1132.         int     40h
  1133.         mov     al, 48
  1134.         push    3
  1135.         pop     ebx
  1136.         mov     ecx, std_colors
  1137.         push    40
  1138.         pop     edx
  1139.         int     40h
  1140. ;        mov     bl, 7
  1141. ;        int     40h
  1142. ;        xor     ax, ax
  1143. ;        shr     ebx, 16
  1144. ;        or      ebx, eax
  1145. ;        mov     ecx, [std_colors+16]
  1146. ;        mov     edx, header
  1147. ;        push    header.length
  1148. ;        pop     esi
  1149. ;        push    4
  1150. ;        pop     eax
  1151. ;        int     40h
  1152.         xor     ecx, ecx
  1153.         call    draw_image
  1154.         push    12
  1155.         pop     eax
  1156.         push    2
  1157.         pop     ebx
  1158.         int     40h
  1159.         ret
  1160.  
  1161. draw_image.nomem:
  1162.         mov     al, 13
  1163.         xor     edx, edx
  1164.         mov     ebx, [cur_width]
  1165.         imul    ebx, font_width
  1166.         add     ebx, 5*65536
  1167.         mov     ecx, [skinh-2]
  1168.         mov     cx, word [cur_height]
  1169.         imul    cx, font_height
  1170.         int     40h
  1171.         mov     al, 4
  1172.         mov     ebx, 32*65536+32
  1173.         mov     ecx, 0xFFFFFF
  1174.         mov     edx, nomem_draw
  1175.         push    nomem_draw.size
  1176.         pop     esi
  1177.         int     40h
  1178.         ret
  1179.  
  1180. draw_image:
  1181.         cmp     [MemForImage], 0
  1182.         jnz     .allocated
  1183. ; allocate memory for image
  1184.         mov     eax, [cur_width]
  1185.         imul    eax, [cur_height]
  1186.         imul    eax, font_width*font_height*3
  1187.         call    mf_alloc
  1188.         test    eax, eax
  1189.         jz      draw_image.nomem
  1190.         mov     [MemForImage], eax
  1191. .allocated:
  1192.         mov     edi, [MemForImage]
  1193.         mov     esi, console_data
  1194.         mov     ecx, [cur_height]
  1195. .lh:
  1196.         push    ecx
  1197.         mov     ecx, [cur_width]
  1198. .lw:
  1199.         push    ecx edi
  1200.         xor     eax, eax
  1201.         mov     al, [esi+1]
  1202.         and     al, 0xF
  1203.         mov     ebx, [console_colors + eax*4]   ; цвет текста
  1204.         mov     al, [esi+1]
  1205.         shr     al, 4
  1206.         mov     ebp, [console_colors + eax*4]   ; цвет фона
  1207.         lodsb
  1208.         inc     esi
  1209. if font_width > 8
  1210.         lea     edx, [eax+eax+font]
  1211. else
  1212.         lea     edx, [eax+font]
  1213. end if
  1214.         mov     ecx, font_height
  1215. .sh:
  1216.         push    ecx edi
  1217.         xor     ecx, ecx
  1218. .sw:
  1219.         mov     eax, ebx
  1220.         bt      [edx], ecx
  1221.         jc      @f
  1222.         mov     eax, ebp
  1223. @@:
  1224.         stosw
  1225.         shr     eax, 16
  1226.         stosb
  1227.         inc     ecx
  1228.         cmp     ecx, font_width
  1229.         jb      .sw
  1230.         pop     edi ecx
  1231.         mov     eax, [cur_width]
  1232.         imul    eax, font_width*3
  1233.         add     edi, eax
  1234. if font_width > 8
  1235.         add     edx, 256*2
  1236. else
  1237.         add     edx, 256
  1238. end if
  1239.         loop    .sh
  1240.         pop     edi ecx
  1241.         add     edi, font_width*3
  1242.         loop    .lw
  1243.         mov     eax, [cur_width]
  1244.         imul    eax, (font_height-1)*font_width*3
  1245.         add     edi, eax
  1246.         pop     ecx
  1247.         loop    .lh
  1248.         push    7
  1249.         pop     eax
  1250.         mov     ebx, [MemForImage]
  1251.         mov     ecx, [cur_width]
  1252.         imul    ecx, font_width*10000h
  1253.         mov     cx, word [cur_height]
  1254.         imul    cx, font_height
  1255.         mov     edx, [skinh]
  1256.         add     edx, 5*10000h
  1257.         int     40h
  1258.         ret
  1259.  
  1260. get_console_ptr:
  1261. ; in: eax=x, edx=y
  1262. ; out: edi->console data
  1263.         push    edx
  1264.         imul    edx, [cur_width]
  1265.         add     edx, eax
  1266.         lea     edi, [console_data + edx*2]
  1267.         pop     edx
  1268.         ret
  1269.  
  1270. draw_keybar:
  1271.         pushad
  1272.         xor     eax, eax
  1273.         test    [ctrlstate], 3
  1274.         jz      @f
  1275.         inc     eax
  1276. @@:
  1277.         test    [ctrlstate], 0xC
  1278.         jz      @f
  1279.         or      al, 2
  1280. @@:
  1281.         test    [ctrlstate], 0x30
  1282.         jz      @f
  1283.         or      al, 4
  1284. @@:
  1285.         imul    eax, 6*12
  1286.         mov     esi, [active_screen_vtable]
  1287.         mov     esi, [esi+screen_vtable.keybar]
  1288.         add     esi, eax
  1289.         xor     ecx, ecx
  1290.         inc     ecx
  1291.         xor     eax, eax
  1292.         mov     edx, [cur_height]
  1293.         dec     edx
  1294.         call    get_console_ptr
  1295.         push    6
  1296.         pop     ebx
  1297.         mov     eax, [cur_width]
  1298.         sub     eax, 11+9+3*2+6
  1299.         cmp     eax, 7*11
  1300.         jl      @f
  1301.         cdq
  1302.         mov     bl, 11
  1303.         div     ebx
  1304.         mov     ebx, eax
  1305. @@:
  1306.         xor     edx, edx
  1307. .l:
  1308.         add     edx, 7
  1309.         cmp     cl, 10
  1310.         jb      @f
  1311.         inc     edx
  1312. @@:
  1313.         cmp     edx, [cur_width]
  1314.         ja      .ret
  1315.         cmp     cl, 10
  1316.         jae     .twodig
  1317.         lea     eax, [ecx+'0']
  1318.         stosb
  1319.         mov     al, [keybar_number_color]
  1320.         stosb
  1321.         jmp     .cmn
  1322. .twodig:
  1323.         mov     al, cl
  1324.         cbw
  1325.         div     [_10]
  1326.         add     al, '0'
  1327.         stosb
  1328.         mov     al, [keybar_number_color]
  1329.         stosb
  1330.         xchg    al, ah
  1331.         add     al, '0'
  1332.         stosw
  1333. .cmn:
  1334.         mov     ah, [keybar_name_color]
  1335.         push    ecx
  1336.         mov     cl, 6
  1337. @@:
  1338.         lodsb
  1339.         stosw
  1340.         loop    @b
  1341.         mov     al, ' '
  1342.         lea     ecx, [ebx-6]
  1343.         cmp     byte [esp], 12
  1344.         jz      .ret_pop
  1345.         add     edx, ecx
  1346.         rep     stosw
  1347.         pop     ecx
  1348.         inc     edx
  1349.         cmp     edx, [cur_width]
  1350.         ja      .ret
  1351.         mov     ah, [keybar_bgr_color]
  1352.         stosw
  1353.         inc     ecx
  1354.         jmp     .l
  1355. .ret_pop:
  1356.         pop     ecx
  1357. .ret:
  1358.         cmp     byte [edi-2], ' '
  1359.         jnz     @f
  1360.         dec     edi
  1361.         dec     edi
  1362. @@:
  1363.         push    edi
  1364.         mov     eax, [cur_width]
  1365.         mov     edx, [cur_height]
  1366.         call    get_console_ptr
  1367.         mov     ecx, edi
  1368.         pop     edi
  1369.         sub     ecx, edi
  1370.         shr     ecx, 1
  1371.         mov     al, ' '
  1372.         mov     ah, [keybar_name_color]
  1373.         rep     stosw
  1374. .done:
  1375.         popad
  1376.         ret
  1377.  
  1378. draw_cmdbar:
  1379.         mov     esi, [active_panel]
  1380.         add     esi, panel1_dir - panel1_data
  1381.         xor     eax, eax
  1382.         mov     edx, [cur_height]
  1383.         dec     edx
  1384.         dec     edx
  1385.         call    get_console_ptr
  1386.         mov     ah, [cmdbar_prefix_color]
  1387.         mov     ecx, [cur_width]
  1388.         dec     ecx
  1389. @@:
  1390.         lodsb
  1391.         test    al, al
  1392.         jz      @f
  1393.         stosw
  1394.         loop    @b
  1395. @@:
  1396.         mov     al, '>'
  1397.         stosw
  1398.         mov     al, ' '
  1399.         mov     ah, [cmdbar_normal_color]
  1400.         rep     stosw
  1401.         ret
  1402.  
  1403. draw_border:
  1404.         push    edi
  1405.         mov     al, 0xC9
  1406.         stosw
  1407.         mov     al, 0xCD
  1408.         lea     ecx, [ebx-2]
  1409.         rep     stosw
  1410.         mov     al, 0xBB
  1411.         stosw
  1412.         pop     edi
  1413.         add     edi, [cur_width]
  1414.         add     edi, [cur_width]
  1415.         lea     ecx, [edx-2]
  1416. .l:
  1417.         push    edi
  1418.         mov     al, 0xBA
  1419.         stosw
  1420.         mov     al, 0x20
  1421.         push    ecx
  1422.         lea     ecx, [ebx-2]
  1423.         rep     stosw
  1424.         pop     ecx
  1425.         mov     al, 0xBA
  1426.         stosw
  1427.         pop     edi
  1428.         add     edi, [cur_width]
  1429.         add     edi, [cur_width]
  1430.         loop    .l
  1431.         mov     al, 0xC8
  1432.         stosw
  1433.         mov     al, 0xCD
  1434.         lea     ecx, [ebx-2]
  1435.         rep     stosw
  1436.         mov     al, 0xBC
  1437.         stosw
  1438.         ret
  1439.  
  1440. draw_panel:
  1441.         mov     eax, [ebp + panel1_left - panel1_data]
  1442.         mov     edx, [ebp + panel1_top - panel1_data]
  1443.         call    get_console_ptr
  1444. ; draw border
  1445.         mov     ah, [panel_border_color]
  1446.         mov     ebx, [ebp + panel1_width - panel1_data]
  1447.         mov     edx, [ebp + panel1_height - panel1_data]
  1448.         call    draw_border
  1449.         push    eax
  1450.         mov     eax, [ebp + panel1_left - panel1_data]
  1451.         mov     edx, [ebp + panel1_top - panel1_data]
  1452.         add     edx, [ebp + panel1_height - panel1_data]
  1453.         sub     edx, 3
  1454.         call    get_console_ptr
  1455.         pop     eax
  1456.         mov     al, 0xC7
  1457.         stosw
  1458.         mov     al, 0xC4
  1459.         lea     ecx, [ebx-2]
  1460.         rep     stosw
  1461.         mov     al, 0xB6
  1462.         stosw
  1463.         mov     eax, [ebp + panel1_width - panel1_data]
  1464.         sub     eax, 3
  1465.         shr     eax, 1
  1466.         mov     [column_width], eax
  1467.         mov     eax, [ebp + panel1_left - panel1_data]
  1468.         inc     eax
  1469.         mov     [column_left], eax
  1470.         add     eax, [column_width]
  1471.         mov     edx, [ebp + panel1_top - panel1_data]
  1472.         inc     edx
  1473.         mov     [column_top], edx
  1474.         dec     edx
  1475.         call    get_console_ptr
  1476.         mov     ah, [panel_border_color]
  1477.         mov     al, 0xD1
  1478.         mov     [edi], ax
  1479.         add     edi, [cur_width]
  1480.         add     edi, [cur_width]
  1481.         mov     ecx, [ebp + panel1_height - panel1_data]
  1482.         sub     ecx, 4
  1483.         mov     [column_height], ecx
  1484.         mov     al, 0xB3
  1485. @@:
  1486.         mov     [edi], ax
  1487.         add     edi, [cur_width]
  1488.         add     edi, [cur_width]
  1489.         loop    @b
  1490.         mov     al, 0xC1
  1491.         stosw
  1492.         mov     eax, [column_height]
  1493.         dec     eax
  1494.         mov     [ebp + panel1_colsz - panel1_data], eax
  1495.         add     eax, eax
  1496.         mov     [ebp + panel1_colst - panel1_data], eax
  1497.         mov     eax, [ebp + panel1_start - panel1_data]
  1498.         mov     [column_index], eax
  1499.         call    draw_column
  1500.         mov     eax, [ebp + panel1_width - panel1_data]
  1501.         sub     eax, 3
  1502.         mov     ecx, [column_width]
  1503.         sub     eax, ecx
  1504.         mov     [column_width], eax
  1505.         inc     ecx
  1506.         add     [column_left], ecx
  1507.         call    draw_column
  1508. ; Заголовок панели (текущая папка)
  1509.         lea     esi, [ebp + panel1_dir - panel1_data]
  1510.         mov     edi, cur_header
  1511.         mov     ecx, [ebp + panel1_width - panel1_data]
  1512.         sub     ecx, 7
  1513.         movsb
  1514. @@:
  1515.         lodsb
  1516.         stosb
  1517.         dec     ecx
  1518.         test    al, al
  1519.         jz      .header_created
  1520.         cmp     al, '/'
  1521.         jnz     @b
  1522.         mov     edx, esi
  1523. @@:
  1524.         lodsb
  1525.         test    al, al
  1526.         jnz     @b
  1527.         sub     esi, edx
  1528.         dec     esi
  1529.         cmp     esi, ecx
  1530.         jbe     @f
  1531.         mov     word [edi], '..'
  1532.         mov     byte [edi+2], '.'
  1533.         add     edi, 3
  1534.         sub     ecx, 3
  1535.         add     edx, esi
  1536.         sub     edx, ecx
  1537. @@:
  1538.         mov     esi, edx
  1539. @@:
  1540.         lodsb
  1541.         stosb
  1542.         dec     ecx
  1543.         test    al, al
  1544.         jnz     @b
  1545. .header_created:
  1546.         mov     edx, [ebp + panel1_top - panel1_data]
  1547.         mov     eax, [ebp + panel1_left - panel1_data]
  1548.         shr     ecx, 1
  1549.         lea     eax, [eax+ecx+3]
  1550.         call    get_console_ptr
  1551.         mov     ah, [panel_active_header_color]
  1552.         cmp     ebp, [active_panel]
  1553.         jz      @f
  1554.         mov     ah, [panel_header_color]
  1555. @@:
  1556.         mov     al, ' '
  1557.         stosw
  1558.         mov     esi, cur_header
  1559. @@:
  1560.         lodsb
  1561.         test    al, al
  1562.         jz      @f
  1563.         stosw
  1564.         jmp     @b
  1565. @@:
  1566.         mov     al, ' '
  1567.         stosw
  1568.         mov     edx, [ebp + panel1_top - panel1_data]
  1569.         inc     edx
  1570.         mov     eax, [ebp + panel1_left - panel1_data]
  1571.         inc     eax
  1572.         call    get_console_ptr
  1573.         movzx   eax, [ebp + panel1_sortmode - panel1_data]
  1574.         mov     al, [compare_names+eax]
  1575.         stosb
  1576.         cmp     [ebp + panel1_numfiles - panel1_data], 0
  1577.         jz      .skip_curinfo
  1578. ; Информация о выбранном файле
  1579.         mov     ebx, [ebp + panel1_index - panel1_data]
  1580.         mov     eax, [ebp + panel1_files - panel1_data]
  1581.         mov     ebx, [eax+ebx*4]
  1582.         mov     eax, [ebp + panel1_nfa - panel1_data]
  1583.         lea     ebx, [ebx+eax*4+32]
  1584.         add     ebx, [ebp + panel1_files - panel1_data]
  1585.         mov     eax, [ebp + panel1_left - panel1_data]
  1586.         add     eax, [ebp + panel1_width - panel1_data]
  1587.         dec     eax
  1588.         mov     edx, [ebp + panel1_top - panel1_data]
  1589.         add     edx, [ebp + panel1_height - panel1_data]
  1590.         dec     edx
  1591.         dec     edx
  1592.         call    get_console_ptr
  1593.         mov     ecx, [ebp + panel1_width - panel1_data]
  1594.         dec     ecx
  1595.         dec     ecx
  1596. ; Время модификации
  1597.         sub     edi, 5*2
  1598.         sub     ecx, 6
  1599.         mov     al, [ebx+24+2]
  1600.         aam
  1601.         or      ax, 0x3030
  1602.         mov     [edi], ah
  1603.         mov     [edi+2], al
  1604.         mov     [edi+4], byte ':'
  1605.         mov     al, [ebx+24+1]
  1606.         aam
  1607.         or      ax, 0x3030
  1608.         mov     [edi+6], ah
  1609.         mov     [edi+8], al
  1610.         mov     al, [panel_normal_color]
  1611.         mov     [edi+1], al
  1612.         mov     [edi+3], al
  1613.         mov     [edi+5], al
  1614.         mov     [edi+7], al
  1615.         mov     [edi+9], al
  1616.         dec     edi
  1617.         mov     [edi], al
  1618.         dec     edi
  1619.         mov     byte [edi], ' '
  1620. ; Дата модификации
  1621.         sub     edi, 8*2
  1622.         sub     ecx, 9
  1623.         mov     al, [ebx+28+0]
  1624.         aam
  1625.         or      ax, 0x3030
  1626.         mov     [edi], ah
  1627.         mov     [edi+2], al
  1628.         mov     [edi+4], byte '.'
  1629.         mov     al, [ebx+28+1]
  1630.         aam
  1631.         or      ax, 0x3030
  1632.         mov     [edi+6], ah
  1633.         mov     [edi+8], al
  1634.         mov     [edi+10], byte '.'
  1635.         mov     ax, [ebx+28+2]
  1636.         div     [_100]
  1637.         mov     al, ah
  1638.         aam
  1639.         or      ax, 0x3030
  1640.         mov     [edi+12], ah
  1641.         mov     [edi+14], al
  1642.         mov     al, [panel_normal_color]
  1643.         mov     [edi+1], al
  1644.         mov     [edi+3], al
  1645.         mov     [edi+5], al
  1646.         mov     [edi+7], al
  1647.         mov     [edi+9], al
  1648.         mov     [edi+11], al
  1649.         mov     [edi+13], al
  1650.         mov     [edi+15], al
  1651.         dec     edi
  1652.         mov     [edi], al
  1653.         dec     edi
  1654.         mov     [edi], byte ' '
  1655. ; Размер
  1656.         std
  1657.         mov     ah, [panel_normal_color]
  1658.         dec     edi
  1659.         dec     edi
  1660.         dec     ecx
  1661.         test    byte [ebx], 0x10
  1662.         jz      .size_file
  1663.         push    ecx
  1664.         mov     esi, aFolder+aFolder.size-1
  1665.         mov     ecx, aFolder.size
  1666.         cmp     word [ebx+40], '..'
  1667.         jnz     @f
  1668.         cmp     byte [ebx+42], 0
  1669.         jnz     @f
  1670.         mov     esi, aUp+aUp.size-1
  1671.         mov     cl, aUp.size
  1672. @@:
  1673.         sub     [esp], ecx
  1674. @@:
  1675.         lodsb
  1676.         stosw
  1677.         loop    @b
  1678.         pop     ecx
  1679.         jmp     .size_done
  1680. .size_file:
  1681.         mov     edx, [ebx+36]
  1682.         test    edx, edx
  1683.         jz      .size_less_4g
  1684.         cmp     edx, 10*256
  1685.         jae     .size_tera
  1686. ; в гигабайтах
  1687.         mov     al, 'G'
  1688.         jmp     .size_letter
  1689. .size_tera:
  1690. ; в терабайтах
  1691.         shr     edx, 8
  1692.         mov     al, 'T'
  1693.         jmp     .size_letter
  1694. .size_less_4g:
  1695.         mov     edx, [ebx+32]
  1696.         cmp     edx, 10*(1 shl 20)
  1697.         jae     .size_mega
  1698.         cmp     edx, 1 shl 20
  1699.         jb      .size_num
  1700.         shr     edx, 10
  1701.         mov     al, 'K'
  1702.         jmp     .size_letter
  1703. .size_mega:
  1704.         mov     al, 'M'
  1705.         shr     edx, 20
  1706. .size_letter:
  1707.         stosw
  1708.         dec     ecx
  1709.         mov     al, ' '
  1710.         stosw
  1711.         dec     ecx
  1712. .size_num:
  1713.         xchg    eax, edx
  1714.         xor     edx, edx
  1715.         div     [_10d]
  1716.         xchg    eax, edx
  1717.         add     al, '0'
  1718.         mov     ah, [panel_normal_color]
  1719.         stosw
  1720.         dec     ecx
  1721.         test    edx, edx
  1722.         jnz     .size_num
  1723. .size_done:
  1724.         cld
  1725. ; Имя
  1726.         sub     edi, ecx
  1727.         sub     edi, ecx
  1728.         lea     esi, [ebx+40]
  1729. @@:
  1730.         lodsb
  1731.         test    al, al
  1732.         jnz     @b
  1733.         sub     esi, ebx
  1734.         sub     esi, 41
  1735.         mov     ah, [panel_normal_color]
  1736.         cmp     esi, ecx
  1737.         lea     edx, [ebx+40]
  1738.         jbe     @f
  1739.         mov     al, '{'
  1740.         mov     [edi-2], ax
  1741.         add     edx, esi
  1742.         sub     edx, ecx
  1743. @@:
  1744.         mov     esi, edx
  1745. @@:
  1746.         lodsb
  1747.         test    al, al
  1748.         jz      @f
  1749.         stosw
  1750.         loop    @b
  1751. @@:
  1752.         mov     al, ' '
  1753.         rep     stosw
  1754. .skip_curinfo:
  1755.         call    draw_image
  1756.         ret
  1757.  
  1758. draw_column:
  1759.         mov     eax, [column_left]
  1760.         mov     edx, [column_top]
  1761.         call    get_console_ptr
  1762. ; заголовок столбца
  1763.         push    edi
  1764.         mov     ah, [column_header_color]
  1765.         mov     al, ' '
  1766.         mov     ecx, [column_width]
  1767. if lang eq ru
  1768.         sub     ecx, 3
  1769. else
  1770.         sub     ecx, 4
  1771. end if
  1772.         shr     ecx, 1
  1773.         rep     stosw
  1774. if lang eq ru
  1775.         mov     al, 'И'
  1776.         stosw
  1777.         mov     al, 'м'
  1778.         stosw
  1779.         mov     al, 'я'
  1780.         stosw
  1781. else
  1782.         mov     al, 'N'
  1783.         stosw
  1784.         mov     al, 'a'
  1785.         stosw
  1786.         mov     al, 'm'
  1787.         stosw
  1788.         mov     al, 'e'
  1789.         stosw
  1790. end if
  1791.         mov     al, ' '
  1792.         mov     ecx, [column_width]
  1793. if lang eq ru
  1794.         sub     ecx, 2
  1795. else
  1796.         sub     ecx, 3
  1797. end if
  1798.         shr     ecx, 1
  1799.         rep     stosw
  1800.         pop     edi
  1801.         add     edi, [cur_width]
  1802.         add     edi, [cur_width]
  1803. ; файлы
  1804.         mov     edx, [ebp + panel1_numfiles - panel1_data]
  1805.         mov     ecx, [column_height]
  1806.         dec     ecx
  1807. .l:
  1808.         cmp     [column_index], edx
  1809.         jae     .ret
  1810.         push    ecx
  1811.         mov     esi, [column_index]
  1812.         mov     ecx, [ebp + panel1_files - panel1_data]
  1813.         mov     esi, [ecx+esi*4]
  1814.         mov     ecx, [ebp + panel1_nfa - panel1_data]
  1815.         lea     esi, [esi + ecx*4 + 32 + 40]
  1816.         add     esi, [ebp + panel1_files - panel1_data]
  1817. ; подсветка
  1818. ;        call    insert_last_dot
  1819.         xor     ecx, ecx
  1820. .highlight_test_loop:
  1821.         mov     ebx, [highlight_groups+ecx*4]
  1822.         mov     al, [ebx + highlight.IncludeAttributes]
  1823.         mov     ah, [esi - 40]
  1824.         and     ah, al
  1825.         cmp     ah, al
  1826.         jnz     .highlight_test_failed
  1827.         push    edi
  1828.         lea     edi, [ebx + highlight.Mask]
  1829.         call    match_mask
  1830.         pop     edi
  1831.         jc      .highlight_test_failed
  1832.         mov     ah, [ebx + highlight.NormalColor]
  1833.         cmp     ebp, [active_panel]
  1834.         jnz     @f
  1835.         mov     ecx, [column_index]
  1836.         cmp     ecx, [ebp + panel1_index - panel1_data]
  1837.         jnz     @f
  1838.         mov     ah, [ebx + highlight.CursorColor]
  1839. @@:
  1840.         test    ah, ah
  1841.         jz      .nohighlight
  1842.         jmp     .doname
  1843. .highlight_test_failed:
  1844.         inc     ecx
  1845.         cmp     ecx, [highlight_num_groups]
  1846.         jb      .highlight_test_loop
  1847. .nohighlight:
  1848.         mov     ah, [panel_normal_color]
  1849.         cmp     ebp, [active_panel]
  1850.         jnz     @f
  1851.         mov     ecx, [column_index]
  1852.         cmp     ecx, [ebp + panel1_index - panel1_data]
  1853.         jnz     @f
  1854.         mov     ah, [panel_cursor_color]
  1855. @@:
  1856. .doname:
  1857. ;        call    delete_last_dot
  1858.         mov     ecx, [column_width]
  1859.         push    edi
  1860. @@:
  1861.         lodsb
  1862.         test    al, al
  1863.         jz      @f
  1864.         stosw
  1865.         loop    @b
  1866.         cmp     byte [esi], 0
  1867.         jz      @f
  1868.         mov     byte [edi], '}'
  1869. @@:
  1870.         mov     al, ' '
  1871.         rep     stosw
  1872.         pop     edi
  1873.         add     edi, [cur_width]
  1874.         add     edi, [cur_width]
  1875.         inc     [column_index]
  1876.         pop     ecx
  1877.         dec     ecx
  1878.         jnz     .l
  1879. .ret:
  1880.         cmp     ebp, panel1_data
  1881.         jnz     .ret2
  1882. ; Число экранов
  1883.         mov     eax, [num_screens]
  1884.         dec     eax
  1885.         jz      .ret2
  1886.         push    eax
  1887.         xor     eax, eax
  1888.         xor     edx, edx
  1889.         call    get_console_ptr
  1890.         mov     ah, [panel_nscreens_color]
  1891.         mov     al, '['
  1892.         stosw
  1893.         pop     eax
  1894.         push    -'0'
  1895. @@:
  1896.         xor     edx, edx
  1897.         div     [_10d]
  1898.         push    edx
  1899.         test    eax, eax
  1900.         jnz     @b
  1901. @@:
  1902.         pop     eax
  1903.         add     eax, '0'
  1904.         jz      @f
  1905.         mov     ah, [panel_nscreens_color]
  1906.         stosw
  1907.         jmp     @b
  1908. @@:
  1909.         mov     al, ']'
  1910.         mov     ah, [panel_nscreens_color]
  1911.         stosw
  1912. .ret2:
  1913.         ret
  1914.  
  1915. ;insert_last_dot:
  1916. ;        push    eax esi
  1917. ;        mov     ah, 0
  1918. ;.loop:
  1919. ;        lodsb
  1920. ;        test    al, al
  1921. ;        jz      .done
  1922. ;        cmp     al, '.'
  1923. ;        jnz     .loop
  1924. ;        mov     ah, 1
  1925. ;        jmp     .loop
  1926. ;.done:
  1927. ;        test    ah, ah
  1928. ;        jnz     @f
  1929. ;        mov     byte [esi-1], '.'
  1930. ;        mov     byte [esi], 0
  1931. ;@@:
  1932. ;        pop     esi eax
  1933. ;        ret
  1934.  
  1935. ;delete_last_dot:
  1936. ;        push    esi
  1937. ;@@:
  1938. ;        cmp     byte [esi], 0
  1939. ;        jz      @f
  1940. ;        inc     esi
  1941. ;        jmp     @b
  1942. ;@@:
  1943. ;        cmp     byte [esi-1], '.'
  1944. ;        jnz     @f
  1945. ;        mov     byte [esi-1], 0
  1946. ;@@:     pop     esi
  1947. ;        ret
  1948.  
  1949. read_folder:
  1950.         mov     eax, [ebp + panel1_nfa - panel1_data]
  1951.         mov     [dirinfo.size], eax
  1952.         shl     eax, 2
  1953.         add     eax, [ebp + panel1_files - panel1_data]
  1954.         mov     [dirinfo.dirdata], eax
  1955.         lea     eax, [ebp + panel1_dir - panel1_data]
  1956.         mov     [dirinfo.name], eax
  1957.         push    70
  1958.         pop     eax
  1959.         mov     ebx, dirinfo
  1960.         int     40h
  1961.         test    eax, eax
  1962.         jz      .ok
  1963.         cmp     eax, 6
  1964.         jz      .ok
  1965. ; TODO: add error handling
  1966.         mov     [ebp + panel1_numfiles - panel1_data], 2
  1967.         mov     eax, [ebp + panel1_nfa - panel1_data]
  1968.         shl     eax, 2
  1969.         add     eax, [ebp + panel1_files - panel1_data]
  1970.         add     eax, 32+40
  1971.         mov     word [eax], '..'
  1972.         mov     byte [eax+2], 0
  1973.         add     eax, 304
  1974.         mov     dword [eax], 'Read'
  1975.         mov     dword [eax+4], ' err'
  1976.         mov     dword [eax+8], 'or'
  1977.         mov     eax, [ebp + panel1_files - panel1_data]
  1978.         mov     dword [eax], 0
  1979.         mov     dword [eax+4], 304
  1980.         and     dword [ebp + panel1_index - panel1_data], 0
  1981.         and     dword [ebp + panel1_start - panel1_data], 0
  1982.         ret
  1983. .ok:
  1984.         mov     eax, [dirinfo.dirdata]
  1985.         cmp     [eax+8], ebx
  1986.         jz      .readdone
  1987.         push    eax
  1988.         mov     eax, [ebp + panel1_files - panel1_data]
  1989.         cmp     eax, buf1
  1990.         jz      @f
  1991.         cmp     eax, buf2
  1992.         jz      @f
  1993.         call    mf_free
  1994. @@:
  1995.         pop     eax
  1996.         mov     eax, [eax+8]
  1997.         add     eax, 0xF
  1998.         and     eax, not 0xF
  1999.         push    eax
  2000.         imul    eax, 4+304
  2001.         add     eax, 32
  2002.         call    mf_alloc
  2003.         test    eax, eax
  2004.         jnz     .succ1
  2005.         pop     eax
  2006. ; TODO: add error handling
  2007.         jmp     .readdone
  2008. .succ1:
  2009.         mov     [ebp + panel1_files - panel1_data], eax
  2010.         pop     [ebp + panel1_nfa - panel1_data]
  2011.         jmp     read_folder
  2012. .readdone:
  2013.         and     [ebp + panel1_start - panel1_data], 0
  2014.         and     [ebp + panel1_index - panel1_data], 0
  2015.         and     [ebp + panel1_start - panel1_data], 0
  2016.         mov     edi, [ebp + panel1_files - panel1_data]
  2017.         mov     eax, [ebp + panel1_nfa - panel1_data]
  2018.         lea     esi, [edi + eax*4 + 32]
  2019.         xor     eax, eax
  2020.         mov     ecx, [esi-32+4]
  2021.         jecxz   .loopdone
  2022. ; Игнорируем специальные входы, соответствующие папке '.' и метке тома
  2023. .ptrinit:
  2024.         cmp     word [esi+eax+40], '.'
  2025.         jz      .loopcont
  2026.         test    byte [esi+eax], 8
  2027.         jnz     .loopcont
  2028.         stosd
  2029. .loopcont:
  2030.         add     eax, 304
  2031.         loop    .ptrinit
  2032. .loopdone:
  2033.         sub     edi, [ebp + panel1_files - panel1_data]
  2034.         shr     edi, 2
  2035.         mov     [ebp + panel1_numfiles - panel1_data], edi
  2036. .done:
  2037. ; Сортировка
  2038. sort_files:
  2039.         movzx   eax, [ebp + panel1_sortmode - panel1_data]
  2040.         mov     ebx, [compare_fns + eax*4]
  2041.         mov     edx, [ebp + panel1_files - panel1_data]
  2042.         mov     ecx, [ebp + panel1_numfiles - panel1_data]
  2043.         call    sort
  2044.         ret
  2045.  
  2046. compare_name:
  2047.         push    eax
  2048.         mov     eax, [ebp + panel1_nfa - panel1_data]
  2049.         add     esi, [ebp + panel1_files - panel1_data]
  2050.         add     edi, [ebp + panel1_files - panel1_data]
  2051.         lea     esi, [esi+eax*4+0x20]
  2052.         lea     edi, [edi+eax*4+0x20]
  2053.         pop     eax
  2054.         cmp     word [esi+40], '..'
  2055.         jnz     @f
  2056.         cmp     byte [esi+42], 0
  2057.         jz      .less
  2058. @@:     cmp     word [edi+40], '..'
  2059.         jnz     @f
  2060.         cmp     byte [edi+42], 0
  2061.         jz      .greater
  2062. @@:
  2063.         test    byte [esi], 10h
  2064.         jnz     .1dir
  2065.         test    byte [edi], 10h
  2066.         jnz     .greater
  2067. .eq1:
  2068.         add     esi, 40
  2069.         add     edi, 40
  2070.         jmp     strcmpi
  2071. .greater:
  2072.         test    esi, esi
  2073.         ret
  2074. .1dir:
  2075.         test    byte [edi], 10h
  2076.         jnz     .eq1
  2077. .less:
  2078.         xor     edi, edi
  2079.         stc
  2080.         ret
  2081.  
  2082. compare_name_rev:
  2083.         push    eax
  2084.         mov     eax, [ebp + panel1_nfa - panel1_data]
  2085.         add     esi, [ebp + panel1_files - panel1_data]
  2086.         add     edi, [ebp + panel1_files - panel1_data]
  2087.         lea     esi, [esi+eax*4+0x20]
  2088.         lea     edi, [edi+eax*4+0x20]
  2089.         pop     eax
  2090.         cmp     word [esi+40], '..'
  2091.         jnz     @f
  2092.         cmp     byte [esi+42], 0
  2093.         jz      .less
  2094. @@:     cmp     word [edi+40], '..'
  2095.         jnz     @f
  2096.         cmp     byte [edi+42], 0
  2097.         jz      .greater
  2098. @@:
  2099.         test    byte [esi], 10h
  2100.         jnz     .1dir
  2101.         test    byte [edi], 10h
  2102.         jnz     .greater
  2103. .eq1:
  2104.         add     esi, 40
  2105.         add     edi, 40
  2106.         xchg    esi, edi
  2107.         jmp     strcmpi
  2108. .greater:
  2109.         test    esi, esi
  2110.         ret
  2111. .1dir:
  2112.         test    byte [edi], 10h
  2113.         jnz     .eq1
  2114. .less:
  2115.         xor     edi, edi
  2116.         stc
  2117.         ret
  2118.  
  2119. strcmpi:
  2120.         push    eax
  2121. @@:
  2122.         lodsb
  2123.         call    match_symbol
  2124.         jnz     .ret
  2125.         inc     edi
  2126.         test    al, al
  2127.         jnz     @b
  2128. .ret:
  2129.         pop     eax
  2130.         ret
  2131.  
  2132. compare_ext:
  2133.         push    eax
  2134.         mov     eax, [ebp + panel1_nfa - panel1_data]
  2135.         add     esi, [ebp + panel1_files - panel1_data]
  2136.         add     edi, [ebp + panel1_files - panel1_data]
  2137.         lea     esi, [esi+eax*4+0x20]
  2138.         lea     edi, [edi+eax*4+0x20]
  2139.         pop     eax
  2140.         cmp     word [esi+40], '..'
  2141.         jnz     @f
  2142.         cmp     byte [esi+42], 0
  2143.         jz      .less
  2144. @@:     cmp     word [edi+40], '..'
  2145.         jnz     @f
  2146.         cmp     byte [edi+42], 0
  2147.         jz      .greater
  2148. @@:
  2149.         test    byte [esi], 10h
  2150.         jnz     .1dir
  2151.         test    byte [edi], 10h
  2152.         jnz     .greater
  2153. .eq1:
  2154.         add     esi, 40
  2155.         add     edi, 40
  2156.         push    esi edi
  2157.         call    seek_ext
  2158.         xchg    esi, edi
  2159.         call    seek_ext
  2160.         xchg    esi, edi
  2161.         call    strcmpi
  2162.         jnz     .ret
  2163.         pop     edi esi
  2164.         jmp     strcmpi
  2165. .ret:
  2166.         pop     edi esi
  2167.         ret
  2168. .greater:
  2169.         test    esi, esi
  2170.         ret
  2171. .1dir:
  2172.         test    byte [edi], 10h
  2173.         jnz     .eq1
  2174. .less:
  2175.         xor     edi, edi
  2176.         stc
  2177.         ret
  2178.  
  2179. compare_ext_rev:
  2180.         push    eax
  2181.         mov     eax, [ebp + panel1_nfa - panel1_data]
  2182.         add     esi, [ebp + panel1_files - panel1_data]
  2183.         add     edi, [ebp + panel1_files - panel1_data]
  2184.         lea     esi, [esi+eax*4+0x20]
  2185.         lea     edi, [edi+eax*4+0x20]
  2186.         pop     eax
  2187.         cmp     word [esi+40], '..'
  2188.         jnz     @f
  2189.         cmp     byte [esi+42], 0
  2190.         jz      .less
  2191. @@:     cmp     word [edi+40], '..'
  2192.         jnz     @f
  2193.         cmp     byte [edi+42], 0
  2194.         jz      .greater
  2195. @@:
  2196.         test    byte [esi], 10h
  2197.         jnz     .1dir
  2198.         test    byte [edi], 10h
  2199.         jnz     .greater
  2200. .eq1:
  2201.         add     esi, 40
  2202.         add     edi, 40
  2203.         push    esi edi
  2204.         call    seek_ext
  2205.         xchg    esi, edi
  2206.         call    seek_ext
  2207.         call    strcmpi
  2208.         jnz     .ret
  2209.         pop     edi esi
  2210.         xchg    esi, edi
  2211.         jmp     strcmpi
  2212. .ret:
  2213.         pop     edi esi
  2214.         ret
  2215. .greater:
  2216.         test    esi, esi
  2217.         ret
  2218. .1dir:
  2219.         test    byte [edi], 10h
  2220.         jnz     .eq1
  2221. .less:
  2222.         xor     edi, edi
  2223.         stc
  2224.         ret
  2225.  
  2226. seek_ext:
  2227.         push    eax
  2228.         xor     eax, eax
  2229. .l:
  2230.         inc     esi
  2231.         cmp     byte [esi-1], '.'
  2232.         jnz     @f
  2233.         mov     eax, esi
  2234. @@:
  2235.         cmp     byte [esi-1], 0
  2236.         jnz     .l
  2237.         test    eax, eax
  2238.         jnz     @f
  2239.         lea     eax, [esi-1]
  2240. @@:
  2241.         mov     esi, eax
  2242.         pop     eax
  2243.         ret
  2244.  
  2245. compare_modified:
  2246.         push    eax
  2247.         mov     eax, [ebp + panel1_nfa - panel1_data]
  2248.         add     esi, [ebp + panel1_files - panel1_data]
  2249.         add     edi, [ebp + panel1_files - panel1_data]
  2250.         lea     esi, [esi+eax*4+0x20]
  2251.         lea     edi, [edi+eax*4+0x20]
  2252.         pop     eax
  2253.         cmp     word [esi+40], '..'
  2254.         jnz     @f
  2255.         cmp     byte [esi+42], 0
  2256.         jz      .less
  2257. @@:     cmp     word [edi+40], '..'
  2258.         jnz     @f
  2259.         cmp     byte [edi+42], 0
  2260.         jz      .greater
  2261. @@:
  2262.         test    byte [esi], 10h
  2263.         jnz     .1dir
  2264.         test    byte [edi], 10h
  2265.         jnz     .greater
  2266. .eq1:
  2267.         push    edi
  2268.         mov     edi, [edi+28]
  2269.         cmp     edi, [esi+28]
  2270.         pop     edi
  2271.         jnz     @f
  2272.         push    edi
  2273.         mov     edi, [edi+24]
  2274.         cmp     edi, [esi+24]
  2275.         pop     edi
  2276.         jnz     @f
  2277.         add     esi, 40
  2278.         add     edi, 40
  2279.         jmp     strcmpi
  2280. @@:
  2281.         ret
  2282. .greater:
  2283.         test    esi, esi
  2284.         ret
  2285. .1dir:
  2286.         test    byte [edi], 10h
  2287.         jnz     .eq1
  2288. .less:
  2289.         xor     edi, edi
  2290.         stc
  2291.         ret
  2292.  
  2293. compare_modified_rev:
  2294.         push    eax
  2295.         mov     eax, [ebp + panel1_nfa - panel1_data]
  2296.         add     esi, [ebp + panel1_files - panel1_data]
  2297.         add     edi, [ebp + panel1_files - panel1_data]
  2298.         lea     esi, [esi+eax*4+0x20]
  2299.         lea     edi, [edi+eax*4+0x20]
  2300.         pop     eax
  2301.         cmp     word [esi+40], '..'
  2302.         jnz     @f
  2303.         cmp     byte [esi+42], 0
  2304.         jz      .less
  2305. @@:     cmp     word [edi+40], '..'
  2306.         jnz     @f
  2307.         cmp     byte [edi+42], 0
  2308.         jz      .greater
  2309. @@:
  2310.         test    byte [esi], 10h
  2311.         jnz     .1dir
  2312.         test    byte [edi], 10h
  2313.         jnz     .greater
  2314. .eq1:
  2315.         push    esi
  2316.         mov     esi, [esi+28]
  2317.         cmp     esi, [edi+28]
  2318.         pop     esi
  2319.         jnz     @f
  2320.         push    esi
  2321.         mov     esi, [esi+24]
  2322.         cmp     esi, [edi+24]
  2323.         pop     esi
  2324.         jnz     @f
  2325.         add     esi, 40
  2326.         add     edi, 40
  2327.         xchg    esi, edi
  2328.         jmp     strcmpi
  2329. @@:
  2330.         ret
  2331. .greater:
  2332.         test    esi, esi
  2333.         ret
  2334. .1dir:
  2335.         test    byte [edi], 10h
  2336.         jnz     .eq1
  2337. .less:
  2338.         xor     edi, edi
  2339.         stc
  2340.         ret
  2341.  
  2342. compare_size:
  2343.         push    eax
  2344.         mov     eax, [ebp + panel1_nfa - panel1_data]
  2345.         add     esi, [ebp + panel1_files - panel1_data]
  2346.         add     edi, [ebp + panel1_files - panel1_data]
  2347.         lea     esi, [esi+eax*4+0x20]
  2348.         lea     edi, [edi+eax*4+0x20]
  2349.         pop     eax
  2350.         cmp     word [esi+40], '..'
  2351.         jnz     @f
  2352.         cmp     byte [esi+42], 0
  2353.         jz      .less
  2354. @@:     cmp     word [edi+40], '..'
  2355.         jnz     @f
  2356.         cmp     byte [edi+42], 0
  2357.         jz      .greater
  2358. @@:
  2359.         test    byte [esi], 10h
  2360.         jnz     .1dir
  2361.         test    byte [edi], 10h
  2362.         jnz     .greater
  2363. .eq1:
  2364.         push    edi
  2365.         mov     edi, [edi+36]
  2366.         cmp     edi, [esi+36]
  2367.         pop     edi
  2368.         jnz     @f
  2369.         push    edi
  2370.         mov     edi, [edi+32]
  2371.         cmp     edi, [esi+32]
  2372.         pop     edi
  2373.         jnz     @f
  2374.         add     esi, 40
  2375.         add     edi, 40
  2376.         jmp     strcmpi
  2377. @@:
  2378.         ret
  2379. .greater:
  2380.         test    esi, esi
  2381.         ret
  2382. .1dir:
  2383.         test    byte [edi], 10h
  2384.         jnz     .eq1
  2385. .less:
  2386.         xor     edi, edi
  2387.         stc
  2388.         ret
  2389.  
  2390. compare_size_rev:
  2391.         push    eax
  2392.         mov     eax, [ebp + panel1_nfa - panel1_data]
  2393.         add     esi, [ebp + panel1_files - panel1_data]
  2394.         add     edi, [ebp + panel1_files - panel1_data]
  2395.         lea     esi, [esi+eax*4+0x20]
  2396.         lea     edi, [edi+eax*4+0x20]
  2397.         pop     eax
  2398.         cmp     word [esi+40], '..'
  2399.         jnz     @f
  2400.         cmp     byte [esi+42], 0
  2401.         jz      .less
  2402. @@:     cmp     word [edi+40], '..'
  2403.         jnz     @f
  2404.         cmp     byte [edi+42], 0
  2405.         jz      .greater
  2406. @@:
  2407.         test    byte [esi], 10h
  2408.         jnz     .1dir
  2409.         test    byte [edi], 10h
  2410.         jnz     .greater
  2411. .eq1:
  2412.         push    esi
  2413.         mov     esi, [esi+36]
  2414.         cmp     esi, [edi+36]
  2415.         pop     esi
  2416.         jnz     @f
  2417.         push    esi
  2418.         mov     esi, [esi+32]
  2419.         cmp     esi, [edi+32]
  2420.         pop     esi
  2421.         jnz     @f
  2422.         add     esi, 40
  2423.         add     edi, 40
  2424.         xchg    esi, edi
  2425.         jmp     strcmpi
  2426. @@:
  2427.         ret
  2428. .greater:
  2429.         test    esi, esi
  2430.         ret
  2431. .1dir:
  2432.         test    byte [edi], 10h
  2433.         jnz     .eq1
  2434. .less:
  2435.         xor     edi, edi
  2436.         stc
  2437.         ret
  2438.  
  2439. compare_unordered:
  2440.         cmp     esi, edi
  2441.         ret
  2442. compare_unordered_rev:
  2443.         push    eax
  2444.         mov     eax, [ebp + panel1_nfa - panel1_data]
  2445.         add     esi, [ebp + panel1_files - panel1_data]
  2446.         add     edi, [ebp + panel1_files - panel1_data]
  2447.         lea     esi, [esi+eax*4+0x20]
  2448.         lea     edi, [edi+eax*4+0x20]
  2449.         pop     eax
  2450.         cmp     word [esi+40], '..'
  2451.         jnz     @f
  2452.         cmp     byte [esi+42], 0
  2453.         jz      .less
  2454. @@:     cmp     word [edi+40], '..'
  2455.         jnz     @f
  2456.         cmp     byte [edi+42], 0
  2457.         jz      .greater
  2458. @@:
  2459.         cmp     edi, esi
  2460.         ret
  2461. .greater:
  2462.         test    esi, esi
  2463.         ret
  2464. .less:
  2465.         xor     edi, edi
  2466.         stc
  2467.         ret
  2468.  
  2469. compare_created:
  2470.         push    eax
  2471.         mov     eax, [ebp + panel1_nfa - panel1_data]
  2472.         add     esi, [ebp + panel1_files - panel1_data]
  2473.         add     edi, [ebp + panel1_files - panel1_data]
  2474.         lea     esi, [esi+eax*4+0x20]
  2475.         lea     edi, [edi+eax*4+0x20]
  2476.         pop     eax
  2477.         cmp     word [esi+40], '..'
  2478.         jnz     @f
  2479.         cmp     byte [esi+42], 0
  2480.         jz      .less
  2481. @@:     cmp     word [edi+40], '..'
  2482.         jnz     @f
  2483.         cmp     byte [edi+42], 0
  2484.         jz      .greater
  2485. @@:
  2486.         test    byte [esi], 10h
  2487.         jnz     .1dir
  2488.         test    byte [edi], 10h
  2489.         jnz     .greater
  2490. .eq1:
  2491.         push    edi
  2492.         mov     edi, [edi+12]
  2493.         cmp     edi, [esi+12]
  2494.         pop     edi
  2495.         jnz     @f
  2496.         push    edi
  2497.         mov     edi, [edi+8]
  2498.         cmp     edi, [esi+8]
  2499.         pop     edi
  2500.         jnz     @f
  2501.         add     esi, 40
  2502.         add     edi, 40
  2503.         jmp     strcmpi
  2504. @@:
  2505.         ret
  2506. .greater:
  2507.         test    esi, esi
  2508.         ret
  2509. .1dir:
  2510.         test    byte [edi], 10h
  2511.         jnz     .eq1
  2512. .less:
  2513.         xor     edi, edi
  2514.         stc
  2515.         ret
  2516.  
  2517. compare_created_rev:
  2518.         push    eax
  2519.         mov     eax, [ebp + panel1_nfa - panel1_data]
  2520.         add     esi, [ebp + panel1_files - panel1_data]
  2521.         add     edi, [ebp + panel1_files - panel1_data]
  2522.         lea     esi, [esi+eax*4+0x20]
  2523.         lea     edi, [edi+eax*4+0x20]
  2524.         pop     eax
  2525.         cmp     word [esi+40], '..'
  2526.         jnz     @f
  2527.         cmp     byte [esi+42], 0
  2528.         jz      .less
  2529. @@:     cmp     word [edi+40], '..'
  2530.         jnz     @f
  2531.         cmp     byte [edi+42], 0
  2532.         jz      .greater
  2533. @@:
  2534.         test    byte [esi], 10h
  2535.         jnz     .1dir
  2536.         test    byte [edi], 10h
  2537.         jnz     .greater
  2538. .eq1:
  2539.         push    esi
  2540.         mov     esi, [esi+12]
  2541.         cmp     esi, [edi+12]
  2542.         pop     esi
  2543.         jnz     @f
  2544.         push    esi
  2545.         mov     esi, [esi+8]
  2546.         cmp     esi, [edi+8]
  2547.         pop     esi
  2548.         jnz     @f
  2549.         add     esi, 40
  2550.         add     edi, 40
  2551.         xchg    esi, edi
  2552.         jmp     strcmpi
  2553. @@:
  2554.         ret
  2555. .greater:
  2556.         test    esi, esi
  2557.         ret
  2558. .1dir:
  2559.         test    byte [edi], 10h
  2560.         jnz     .eq1
  2561. .less:
  2562.         xor     edi, edi
  2563.         stc
  2564.         ret
  2565.  
  2566. compare_accessed:
  2567.         push    eax
  2568.         mov     eax, [ebp + panel1_nfa - panel1_data]
  2569.         add     esi, [ebp + panel1_files - panel1_data]
  2570.         add     edi, [ebp + panel1_files - panel1_data]
  2571.         lea     esi, [esi+eax*4+0x20]
  2572.         lea     edi, [edi+eax*4+0x20]
  2573.         pop     eax
  2574.         cmp     word [esi+40], '..'
  2575.         jnz     @f
  2576.         cmp     byte [esi+42], 0
  2577.         jz      .less
  2578. @@:     cmp     word [edi+40], '..'
  2579.         jnz     @f
  2580.         cmp