home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 3 / FREEWARE.BIN / ms_dos / dsort / dstqsrt.pre < prev   
Text File  |  1980-01-02  |  5KB  |  175 lines

  1.     page    96,132
  2. ;§∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞§
  3. ;§                                                                          §
  4. ;§              ディレクトリエントリ  ソート  ユーティリティ                §
  5. ;§                                                                          §
  6. ;§                                     DSORT.EXE  Ver1.11    §
  7. ;§                                                                          §
  8. ;§                   Copyright (C) by 福地 邦雄 1991. All rights reserved.  §
  9. ;§∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞§
  10.     .MODEL  SMALL,C
  11. ;
  12. REVERSE     equ 1
  13. FALSE       equ 0
  14. direntrysize    equ 20h
  15. ;
  16.     public  dirqsort,dirswap,sortfuncall
  17. ;
  18.     .code
  19. ;
  20. ;------------------------------------------------------------------------------
  21. ;
  22. ;   dirqsort
  23. ;       ディレクトリエントリのクイックソート
  24. ;
  25. ;   TYPE    near call
  26. ;   IN      DS = ソートバッファセグメント
  27. ;           [SP+2] = ソートバッファオフセット
  28. ;           [SP+4] = 要素数
  29. ;           ES:[SP+6] = 比較関数リストアドレス
  30. ;   OUT     なし
  31. ;   保存レジスタ    bp,ds
  32. ;
  33. ;------------------------------------------------------------------------------
  34. ;
  35. dirqsort    proc    sortobj,elmcount,funclist
  36.     local cmpobj,chgedobj,cmpcount,chgcount
  37. ;
  38.     @if (elmcount,gt,1),L           ; 要素数2以上ならソート実行
  39.         mov     si,sortobj
  40.         mov     di,direntrysize
  41.         add     di,si
  42.         cmp     elmcount,02
  43.         mov     cmpobj,di
  44.         @if (zf,on)                 ; 要素数2なら直接比較
  45.             mov     bx,funclist
  46.             call    sortfuncall
  47.             test    ax,ax
  48.             @if (zf,off),and,(sf,off)   ; エントリ1が大きい時は入れ換え
  49.                 mov     di,cmpobj
  50.                 mov     si,sortobj
  51.                 call    dirswap
  52.             @ifend
  53.         @else                       ; 要素数3以上
  54.             mov ax,elmcount         ; 比較の基準を配列の真ん中から取り出す
  55.             mov     bx,2
  56.             cwd
  57.             idiv        bx
  58.             mov     bx,direntrysize
  59.             imul    bx
  60.             mov     si,sortobj
  61.             mov     di,si
  62.             add     di,ax
  63.             call    dirswap
  64.             mov     ax,sortobj      ; 準備
  65.             mov     chgcount,0
  66.             mov     cmpcount,1
  67.             mov     chgedobj,ax
  68.             @do repeat
  69.                 mov     ax,cmpcount ; 比較終了か?
  70.                 @if (ax,ge,elmcount)
  71.                     @doexit
  72.                 @ifend
  73.                 mov     di,sortobj  ; 比較関数呼び出し
  74.                 mov     si,cmpobj
  75.                 mov     bx,funclist
  76.                 call    sortfuncall
  77.                 test    ax,ax
  78.                 @if (sf,on)         ; 比較対象エントリが小さい時
  79.                     inc     chgcount
  80.                     add     chgedobj,direntrysize
  81.                     mov     si,cmpobj
  82.                     mov     di,chgedobj
  83.                     @if (si,/=,di)
  84.                         call      dirswap
  85.                     @ifend
  86.                 @ifend
  87.                 add     cmpobj,direntrysize ; 次の比較対象へ
  88.                 inc     cmpcount
  89.             @doend
  90.             mov     si,sortobj      ;
  91.             mov     di,chgedobj
  92.             @if (si,/=,di)
  93.                 call      dirswap
  94.             @ifend
  95.             push    funclist        ; 再帰呼び出し 1
  96.             push    chgcount
  97.             push    sortobj
  98.             call    dirqsort
  99.             mov     bx,chgedobj     ; 再帰呼び出し 2
  100.             add     bx,direntrysize
  101.             mov     cx,elmcount
  102.             sub     cx,chgcount
  103.             dec     cx
  104.             push    funclist
  105.             push    cx
  106.             push    bx
  107.             call    dirqsort
  108.         @ifend
  109.     @ifend
  110.     ret     6
  111. ;
  112. dirqsort    endp
  113. ;
  114. ;------------------------------------------------------------------------------
  115. ;
  116. ;   dirswap
  117. ;       ディレクトリエントリの交換
  118. ;
  119. ;   TYPE    near call
  120. ;   IN      DS:SI = エントリ1アドレス
  121. ;              DI = エントリ2アドレス
  122. ;   OUT     なし
  123. ;   保存レジスタ    bx,dx,si,di,bp,ds,es
  124. ;
  125. ;------------------------------------------------------------------------------
  126. ;
  127. dirswap proc
  128. ;
  129.     cld
  130.     mov     cx,direntrysize/2
  131. swaploop:
  132.     mov     ax,[si]
  133.     xchg    [di],ax
  134.     mov     [si],ax
  135.     lea     si,[si+2]
  136.     lea     di,[di+2]
  137.     loop    swaploop
  138. ;
  139.     ret
  140. ;
  141. dirswap endp
  142. ;
  143. ;------------------------------------------------------------------------------
  144. ;
  145. ;   sortfuncall
  146. ;       ソート用比較関数列の呼び出し
  147. ;
  148. ;   TYPE    near call
  149. ;   IN      ES:BX = 比較関数列のアドレス
  150. ;           DS:SI = エントリ1アドレス
  151. ;              DI = エントリ2アドレス
  152. ;   OUT     AX = 比較結果
  153. ;   保存レジスタ    si,di,bp,ds,es
  154. ;
  155. ;------------------------------------------------------------------------------
  156. ;
  157. sortfuncall proc
  158. ;
  159.     @do until
  160.         call    word ptr es:[bx]    ; 比較関数呼び出し
  161.         @if (word ptr es:[bx+2],=,REVERSE)  ; 逆順指定の時は結果を反転
  162.             neg     ax
  163.         @ifend
  164.         @if (ax,/=,0)               ; 比較して違いがあれば終了
  165.             jmp     compareend
  166.         @ifend
  167.         lea     bx,[bx+4]           ; 次の比較関数へ
  168.     @doend (word ptr es:[bx],=,0)   ; 関数列の終了まで
  169. compareend:
  170.     ret
  171. ;
  172. sortfuncall endp
  173. ;
  174.     end
  175.