Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. format MS COFF
  2. public EXPORTS
  3. section '.flat' code readable align 16
  4. ; void __stdcall START(dword state);
  5. DLL_ENTRY equ 1
  6. DLL_EXIT equ -1
  7. START:
  8.         cmp     dword [esp+4], DLL_ENTRY
  9.         jnz     .ret
  10.         push    edi
  11.         mov     edi, tolower_table
  12.         push    'A'
  13.         pop     ecx
  14.         xor     eax, eax
  15. @@:
  16.         stosb
  17.         inc     eax
  18.         loop    @b
  19.         add     al, 0x20
  20.         mov     cl, 'Z'-'A'+1
  21. @@:
  22.         stosb
  23.         inc     eax
  24.         loop    @b
  25.         sub     al, 0x20
  26.         mov     cl, '€'-'Z'-1
  27. @@:
  28.         stosb
  29.         inc     eax
  30.         loop    @b
  31.         add     al, 0x20
  32.         mov     cl, ''-'€'
  33. @@:
  34.         stosb
  35.         inc     eax
  36.         loop    @b
  37.         add     al, 0x30
  38.         mov     cl, 'Ÿ'-''+1
  39. @@:
  40.         stosb
  41.         inc     eax
  42.         loop    @b
  43.         sub     al, 0x50
  44.         mov     cl, 256-'Ÿ'-1
  45. @@:
  46.         stosb
  47.         inc     eax
  48.         loop    @b
  49.         mov     byte [edi-256+'ð'], 'ñ'
  50.         pop     edi
  51. .ret:
  52.         ret     4
  53.  
  54. ; enum sort_mode
  55. ; { SORT_BY_NAME = 0, SORT_BY_NAME_REV = 1,
  56. ;   SORT_BY_EXT = 2, SORT_BY_EXT_REV = 3,
  57. ;   SORT_BY_MODIFIED = 4, SORT_BY_MODIFIED_REV = 5,
  58. ;   SORT_BY_SIZE = 6, SORT_BY_SIZE_REV = 7,
  59. ;   SORT_BY_CREATED = 10, SORT_BY_CREATED_REV = 11,
  60. ;   SORT_BY_ACCESSED = 12, SORT_BY_ACCESSED_REV = 13 };
  61. ; int __stdcall sort_dir(BDFE* folder_data, unsigned num_folder_entries, sort_mode mode);
  62. ; return: 0 = ok, 1 = error
  63. sort_dir:
  64.         cmp     dword [esp+12], num_compare_fns
  65.         jae     .error
  66.         push    ebx
  67.         mov     eax, ptr_table + 0x1FFF
  68.         mov     edx, ptr_table
  69.         and     eax, not 0xFFF
  70.         mov     ecx, [esp+4+8]  ; num_folder_entries
  71.         sub     eax, edx
  72.         shl     ecx, 3
  73.         jz      .done
  74.         cmp     eax, ecx
  75.         jae     .memok
  76.         push    68
  77.         pop     eax
  78.         push    12
  79.         pop     ebx
  80.         int     0x40
  81.         test    eax, eax
  82.         jz      .error2
  83.         mov     edx, eax
  84. .memok:
  85.         shr     ecx, 3
  86.         mov     eax, edx
  87.         mov     ebx, [esp+4+4]  ; folder_data
  88.         push    ecx
  89. .init_ptr:
  90.         mov     [eax], ebx
  91.         mov     [eax+4], eax
  92.         add     eax, 8
  93.         add     ebx, 304
  94.         sub     ecx, 1
  95.         jnz     .init_ptr
  96.         pop     ecx
  97.         mov     ebx, [esp+4+12] ; mode
  98.         mov     ebx, [compare_fns+ebx*4]
  99.         test    ebx, ebx
  100.         jz      .done_free
  101.         push    esi edi ecx
  102.         call    sort
  103.         pop     ecx
  104.         mov     ebx, edx
  105.         sub     esp, 304
  106. .moveloop:
  107.         mov     esi, [ebx]
  108.         test    esi, esi
  109.         jz      .movenext
  110.         cmp     [ebx+4], ebx
  111.         jz      .movenext
  112.         mov     esi, [ebx]
  113.         mov     edi, esp
  114.         push    ecx
  115.         mov     ecx, 304/4
  116.         rep     movsd
  117.         mov     edi, [ebx]
  118.         mov     eax, [ebx+4]
  119. .z:
  120.         mov     esi, [eax]
  121.         mov     dword [eax], 0
  122.         push    esi
  123.         mov     ecx, 304/4
  124.         rep     movsd
  125.         pop     edi
  126.         mov     eax, [eax+4]
  127.         cmp     eax, ebx
  128.         jnz     .z
  129.         lea     esi, [esp+4]
  130.         mov     ecx, 304/4
  131.         rep     movsd
  132.         pop     ecx
  133. .movenext:
  134.         add     ebx, 8
  135.         sub     ecx, 1
  136.         jnz     .moveloop
  137.         add     esp, 304
  138.         pop     edi esi
  139. .done_free:
  140.         cmp     edx, ptr_table
  141.         jz      .done
  142.         push    68
  143.         pop     eax
  144.         push    13
  145.         pop     ebx
  146.         mov     ecx, edx
  147.         int     0x40
  148. .done:
  149.         pop     ebx
  150.         xor     eax, eax
  151.         ret     12
  152. .error2:
  153.         pop     ebx
  154. .error:
  155.         push    1
  156.         pop     eax
  157.         ret     12
  158.  
  159. ; ‘®àâ¨à®¢ª  qword'®¢ ¢ ª®«¨ç¥á⢥ ecx ¯®  ¤à¥áã edx, äã­ªæ¨ï áà ¢­¥­¨ï ¢ ebx
  160. ;  §àãè ¥â eax, ecx, esi, edi
  161. sort:
  162. ;        jecxz   .done  ; checked by caller
  163.         mov     eax, ecx
  164. @@:
  165.         push    eax
  166.         call    .restore
  167.         pop     eax
  168.         sub     eax, 1
  169.         jnz     @b
  170. @@:
  171.         cmp     ecx, 1
  172.         jz      .done
  173.         mov     esi, 1
  174.         mov     edi, ecx
  175.         call    .exchange
  176.         dec     ecx
  177.         mov     eax, 1
  178.         call    .restore
  179.         jmp     @b
  180. .done:
  181.         ret
  182.  
  183. .exchange:
  184.         push    eax ecx
  185.         mov     eax, [edx+esi*8-8]
  186.         mov     ecx, [edx+edi*8-8]
  187.         mov     [edx+esi*8-8], ecx
  188.         mov     [edx+edi*8-8], eax
  189.         mov     eax, [edx+esi*8-4]
  190.         mov     ecx, [edx+edi*8-4]
  191.         mov     [edx+esi*8-4], ecx
  192.         mov     [edx+edi*8-4], eax
  193.         pop     ecx eax
  194.         ret
  195.  
  196. .restore:
  197.         lea     esi, [eax+eax]
  198.         cmp     esi, ecx
  199.         ja      .doner
  200.         push    esi
  201.         mov     esi, [edx+esi*8-8]
  202.         mov     edi, [edx+eax*8-8]
  203.         call    ebx
  204.         pop     esi
  205.         ja      .need_xchg
  206.         cmp     esi, ecx
  207.         jae     .doner
  208.         push    esi
  209.         mov     esi, [edx+esi*8]
  210.         mov     edi, [edx+eax*8-8]
  211.         call    ebx
  212.         pop     esi
  213.         jbe     .doner
  214. .need_xchg:
  215.         cmp     esi, ecx
  216.         jz      .do_xchg
  217.         push    esi
  218.         mov     edi, [edx+esi*8-8]
  219.         mov     esi, [edx+esi*8]
  220.         call    ebx
  221.         pop     esi
  222.         sbb     esi, -1
  223. .do_xchg:
  224.         mov     edi, eax
  225.         call    .exchange
  226.         mov     eax, esi
  227.         jmp     .restore
  228. .doner:
  229.         ret
  230.  
  231. compare_name:
  232.         test    byte [esi], 10h
  233.         jnz     .1dir
  234.         test    byte [edi], 10h
  235.         jnz     .greater
  236. .eq1:
  237.         add     esi, 40
  238.         add     edi, 40
  239.         jmp     strcmpi
  240. .greater:
  241.         test    esi, esi
  242.         ret
  243. .1dir:
  244.         test    byte [edi], 10h
  245.         jnz     .eq1
  246. .less:
  247.         xor     edi, edi
  248.         stc
  249.         ret
  250.  
  251. compare_name_rev:
  252.         test    byte [esi], 10h
  253.         jnz     .1dir
  254.         test    byte [edi], 10h
  255.         jnz     .greater
  256. .eq1:
  257.         add     esi, 40
  258.         add     edi, 40
  259.         xchg    esi, edi
  260.         jmp     strcmpi
  261. .greater:
  262.         test    esi, esi
  263.         ret
  264. .1dir:
  265.         test    byte [edi], 10h
  266.         jnz     .eq1
  267. .less:
  268.         xor     edi, edi
  269.         stc
  270.         ret
  271.  
  272. strcmpi:
  273.         push    eax
  274. @@:
  275.         lodsb
  276.         call    match_symbol
  277.         jnz     .ret
  278.         inc     edi
  279.         test    al, al
  280.         jnz     @b
  281. .ret:
  282.         pop     eax
  283.         ret
  284.  
  285. compare_ext:
  286.         test    byte [esi], 10h
  287.         jnz     .1dir
  288.         test    byte [edi], 10h
  289.         jnz     .greater
  290. .eq1:
  291.         add     esi, 40
  292.         add     edi, 40
  293.         push    esi edi
  294.         call    seek_ext
  295.         xchg    esi, edi
  296.         call    seek_ext
  297.         xchg    esi, edi
  298.         call    strcmpi
  299.         jnz     .ret
  300.         pop     edi esi
  301.         jmp     strcmpi
  302. .ret:
  303.         pop     edi esi
  304.         ret
  305. .greater:
  306.         test    esi, esi
  307.         ret
  308. .1dir:
  309.         test    byte [edi], 10h
  310.         jnz     .eq1
  311. .less:
  312.         xor     edi, edi
  313.         stc
  314.         ret
  315.  
  316. compare_ext_rev:
  317.         test    byte [esi], 10h
  318.         jnz     .1dir
  319.         test    byte [edi], 10h
  320.         jnz     .greater
  321. .eq1:
  322.         add     esi, 40
  323.         add     edi, 40
  324.         push    esi edi
  325.         call    seek_ext
  326.         xchg    esi, edi
  327.         call    seek_ext
  328.         call    strcmpi
  329.         jnz     .ret
  330.         pop     edi esi
  331.         xchg    esi, edi
  332.         jmp     strcmpi
  333. .ret:
  334.         pop     edi esi
  335.         ret
  336. .greater:
  337.         test    esi, esi
  338.         ret
  339. .1dir:
  340.         test    byte [edi], 10h
  341.         jnz     .eq1
  342. .less:
  343.         xor     edi, edi
  344.         stc
  345.         ret
  346.  
  347. seek_ext:
  348.         push    eax
  349.         xor     eax, eax
  350. .l:
  351.         inc     esi
  352.         cmp     byte [esi-1], '.'
  353.         jnz     @f
  354.         mov     eax, esi
  355. @@:
  356.         cmp     byte [esi-1], 0
  357.         jnz     .l
  358.         test    eax, eax
  359.         jnz     @f
  360.         lea     eax, [esi-1]
  361. @@:
  362.         mov     esi, eax
  363.         pop     eax
  364.         ret
  365.  
  366. compare_modified:
  367.         test    byte [esi], 10h
  368.         jnz     .1dir
  369.         test    byte [edi], 10h
  370.         jnz     .greater
  371. .eq1:
  372.         push    edi
  373.         mov     edi, [edi+28]
  374.         cmp     edi, [esi+28]
  375.         pop     edi
  376.         jnz     @f
  377.         push    edi
  378.         mov     edi, [edi+24]
  379.         cmp     edi, [esi+24]
  380.         pop     edi
  381.         jnz     @f
  382.         add     esi, 40
  383.         add     edi, 40
  384.         jmp     strcmpi
  385. @@:
  386.         ret
  387. .greater:
  388.         test    esi, esi
  389.         ret
  390. .1dir:
  391.         test    byte [edi], 10h
  392.         jnz     .eq1
  393. .less:
  394.         xor     edi, edi
  395.         stc
  396.         ret
  397.  
  398. compare_modified_rev:
  399.         test    byte [esi], 10h
  400.         jnz     .1dir
  401.         test    byte [edi], 10h
  402.         jnz     .greater
  403. .eq1:
  404.         push    esi
  405.         mov     esi, [esi+28]
  406.         cmp     esi, [edi+28]
  407.         pop     esi
  408.         jnz     @f
  409.         push    esi
  410.         mov     esi, [esi+24]
  411.         cmp     esi, [edi+24]
  412.         pop     esi
  413.         jnz     @f
  414.         add     esi, 40
  415.         add     edi, 40
  416.         xchg    esi, edi
  417.         jmp     strcmpi
  418. @@:
  419.         ret
  420. .greater:
  421.         test    esi, esi
  422.         ret
  423. .1dir:
  424.         test    byte [edi], 10h
  425.         jnz     .eq1
  426. .less:
  427.         xor     edi, edi
  428.         stc
  429.         ret
  430.  
  431. compare_size:
  432.         test    byte [esi], 10h
  433.         jnz     .1dir
  434.         test    byte [edi], 10h
  435.         jnz     .greater
  436. .eq1:
  437.         push    edi
  438.         mov     edi, [edi+36]
  439.         cmp     edi, [esi+36]
  440.         pop     edi
  441.         jnz     @f
  442.         push    edi
  443.         mov     edi, [edi+32]
  444.         cmp     edi, [esi+32]
  445.         pop     edi
  446.         jnz     @f
  447.         add     esi, 40
  448.         add     edi, 40
  449.         jmp     strcmpi
  450. @@:
  451.         ret
  452. .greater:
  453.         test    esi, esi
  454.         ret
  455. .1dir:
  456.         test    byte [edi], 10h
  457.         jnz     .eq1
  458. .less:
  459.         xor     edi, edi
  460.         stc
  461.         ret
  462.  
  463. compare_size_rev:
  464.         test    byte [esi], 10h
  465.         jnz     .1dir
  466.         test    byte [edi], 10h
  467.         jnz     .greater
  468. .eq1:
  469.         push    esi
  470.         mov     esi, [esi+36]
  471.         cmp     esi, [edi+36]
  472.         pop     esi
  473.         jnz     @f
  474.         push    esi
  475.         mov     esi, [esi+32]
  476.         cmp     esi, [edi+32]
  477.         pop     esi
  478.         jnz     @f
  479.         add     esi, 40
  480.         add     edi, 40
  481.         xchg    esi, edi
  482.         jmp     strcmpi
  483. @@:
  484.         ret
  485. .greater:
  486.         test    esi, esi
  487.         ret
  488. .1dir:
  489.         test    byte [edi], 10h
  490.         jnz     .eq1
  491. .less:
  492.         xor     edi, edi
  493.         stc
  494.         ret
  495.  
  496. compare_unordered:
  497.         cmp     esi, edi
  498.         ret
  499. compare_unordered_rev:
  500.         cmp     edi, esi
  501.         ret
  502.  
  503. compare_created:
  504.         test    byte [esi], 10h
  505.         jnz     .1dir
  506.         test    byte [edi], 10h
  507.         jnz     .greater
  508. .eq1:
  509.         push    edi
  510.         mov     edi, [edi+12]
  511.         cmp     edi, [esi+12]
  512.         pop     edi
  513.         jnz     @f
  514.         push    edi
  515.         mov     edi, [edi+8]
  516.         cmp     edi, [esi+8]
  517.         pop     edi
  518.         jnz     @f
  519.         add     esi, 40
  520.         add     edi, 40
  521.         jmp     strcmpi
  522. @@:
  523.         ret
  524. .greater:
  525.         test    esi, esi
  526.         ret
  527. .1dir:
  528.         test    byte [edi], 10h
  529.         jnz     .eq1
  530. .less:
  531.         xor     edi, edi
  532.         stc
  533.         ret
  534.  
  535. compare_created_rev:
  536.         test    byte [esi], 10h
  537.         jnz     .1dir
  538.         test    byte [edi], 10h
  539.         jnz     .greater
  540. .eq1:
  541.         push    esi
  542.         mov     esi, [esi+12]
  543.         cmp     esi, [edi+12]
  544.         pop     esi
  545.         jnz     @f
  546.         push    esi
  547.         mov     esi, [esi+8]
  548.         cmp     esi, [edi+8]
  549.         pop     esi
  550.         jnz     @f
  551.         add     esi, 40
  552.         add     edi, 40
  553.         xchg    esi, edi
  554.         jmp     strcmpi
  555. @@:
  556.         ret
  557. .greater:
  558.         test    esi, esi
  559.         ret
  560. .1dir:
  561.         test    byte [edi], 10h
  562.         jnz     .eq1
  563. .less:
  564.         xor     edi, edi
  565.         stc
  566.         ret
  567.  
  568. compare_accessed:
  569.         test    byte [esi], 10h
  570.         jnz     .1dir
  571.         test    byte [edi], 10h
  572.         jnz     .greater
  573. .eq1:
  574.         push    edi
  575.         mov     edi, [edi+20]
  576.         cmp     edi, [esi+20]
  577.         pop     edi
  578.         jnz     @f
  579.         push    edi
  580.         mov     edi, [edi+16]
  581.         cmp     edi, [esi+16]
  582.         pop     edi
  583.         jnz     @f
  584.         add     esi, 40
  585.         add     edi, 40
  586.         jmp     strcmpi
  587. @@:
  588.         ret
  589. .greater:
  590.         test    esi, esi
  591.         ret
  592. .1dir:
  593.         test    byte [edi], 10h
  594.         jnz     .eq1
  595. .less:
  596.         xor     edi, edi
  597.         stc
  598.         ret
  599.  
  600. compare_accessed_rev:
  601.         test    byte [esi], 10h
  602.         jnz     .1dir
  603.         test    byte [edi], 10h
  604.         jnz     .greater
  605. .eq1:
  606.         push    esi
  607.         mov     esi, [esi+20]
  608.         cmp     esi, [edi+20]
  609.         pop     esi
  610.         jnz     @f
  611.         push    esi
  612.         mov     esi, [esi+16]
  613.         cmp     esi, [edi+16]
  614.         pop     esi
  615.         jnz     @f
  616.         add     esi, 40
  617.         add     edi, 40
  618.         xchg    esi, edi
  619.         jmp     strcmpi
  620. @@:
  621.         ret
  622. .greater:
  623.         test    esi, esi
  624.         ret
  625. .1dir:
  626.         test    byte [edi], 10h
  627.         jnz     .eq1
  628. .less:
  629.         xor     edi, edi
  630.         stc
  631.         ret
  632.  
  633. match_symbol:
  634. ; in: al,[edi]=symbols
  635. ; out: flags as 'cmp al,[edi]'
  636.         push    eax ecx
  637.         movzx   ecx, al
  638.         mov     al, [tolower_table+ecx]
  639.         movzx   ecx, byte [edi]
  640.         cmp     al, [tolower_table+ecx]
  641.         pop     ecx eax
  642.         ret
  643.  
  644. align 4
  645. compare_fns     dd      compare_name
  646.                 dd      compare_name_rev
  647.                 dd      compare_ext
  648.                 dd      compare_ext_rev
  649.                 dd      compare_modified
  650.                 dd      compare_modified_rev
  651.                 dd      compare_size
  652.                 dd      compare_size_rev
  653. ;                dd      compare_unordered
  654. ;                dd      compare_unordered_rev
  655.                 dd      0
  656.                 dd      0
  657.                 dd      compare_created
  658.                 dd      compare_created_rev
  659.                 dd      compare_accessed
  660.                 dd      compare_accessed_rev
  661. num_compare_fns = ($ - compare_fns) / 4
  662.  
  663. EXPORTS:
  664.         dd      szStart,        START
  665.         dd      szVersion,      0x00010001
  666.         dd      szSortDir,      sort_dir
  667.         dd      szStrcmpi,      strcmpi
  668.         dd      0
  669. szStart         db      'START',0
  670. szVersion       db      'version',0
  671. szSortDir       db      'SortDir',0
  672. szStrcmpi       db      'strcmpi',0
  673.  
  674. section '.data' data readable writable align 16
  675. tolower_table   rb      256
  676. ; ptr_table must be last variable
  677. ptr_table       rb      0x1000
  678.