home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / arc-lbr / sort.asm < prev    next >
Assembly Source File  |  1984-01-09  |  2KB  |  191 lines

  1. ; SHELL-METZNER SORT
  2. ; Call with the following information:
  3. ;
  4. ; BC  =  Number of records to be sorted
  5. ; DE  =  Record length
  6. ; HL  =  Buffer address
  7. ;
  8. ; Comment out the following line if subroutine is
  9. ; to be yanked into a file instead of using RMAC/LINK
  10. ;
  11.     PUBLIC    SORT
  12. ;
  13. TRUE    EQU    255
  14. FALSE    EQU    0
  15. ;
  16. ASCEND    EQU    TRUE        ;set FALSE for descending sort
  17. STRIPHI    EQU    FALSE        ;true, if high bits not significant
  18. ;
  19. SORT:    SHLD    SSTADR
  20.     PUSH    H
  21.     XCHG
  22.     SHLD    SRECLEN
  23.     PUSH    H
  24.     MOV    H,B
  25.     MOV    L,C
  26.     SHLD    SNUMRT
  27.     SHLD    SNUMRW
  28. ;
  29. ; NOW DIVIDE # OF FIELDS BY 2
  30. ;
  31. DIVIDE:    LHLD    SNUMRW    ;GET VALUE
  32.     ORA    A        ;CLEAR CARRY
  33.     MOV    A,H
  34.     RAR
  35.     MOV    H,A
  36.     MOV    A,L
  37.     RAR
  38.     MOV    L,A
  39.     SHLD    SNUMRW    ;SAVE RESULT
  40.     MOV    A,L        ;IF SNUMRW<>0
  41.     ORA    H        ;  THEN
  42.     JNZ    NOTDONE        ;    NOT DONE
  43. ;
  44. ; ALL FIELDS SORTED
  45. ;
  46.     POP    B        ;CLEAN UP STACK
  47.     POP    D
  48.     RET
  49. ;
  50. NOTDONE:XCHG
  51.     LHLD    SNUMRT
  52.     MOV    A,L
  53.     SUB    E
  54.     MOV    L,A
  55.     MOV    A,H
  56.     SBB    D
  57.     MOV    H,A
  58.     SHLD    SRECLEN
  59.     LXI    H,1
  60.     SHLD    SORTV1
  61.     SHLD    SSTADR
  62.     DCR    L
  63.     POP    B
  64.     PUSH    B
  65. NDONE1:    DAD    D
  66.     DCX    B
  67.     MOV    A,B
  68.     ORA    C
  69.     JNZ    NDONE1
  70.     SHLD    SORTV2
  71.     XCHG
  72.     POP    B
  73.     POP    H
  74.     PUSH    H
  75.     PUSH    B
  76. NDONE2:    SHLD    SORTV4
  77.     SHLD    SORTV3
  78.     XCHG
  79.     DAD    D
  80.     XCHG
  81. COMPRE:    POP    B
  82.     PUSH    B
  83. COMPR1:    LDAX    D
  84.     IF    STRIPHI
  85.     ANI    7FH
  86.     PUSH    B
  87.     PUSH    PSW
  88.     MOV    A,M
  89.     ANI    7FH
  90.     MOV    B,A
  91.     POP    PSW
  92.     SUB    B
  93.     POP    B
  94.     ELSE
  95.     SUB    M
  96.     ENDIF
  97.     JNZ    NOTEQU
  98.     INX    H
  99.     INX    D
  100.     DCX    B
  101.     MOV    A,B
  102.     ORA    C
  103.     JNZ    COMPR1
  104.     JMP    NOSWITCH
  105. ;
  106. NOTEQU:
  107.     IF    ASCEND
  108.     JNC    NOSWITCH
  109.     ELSE
  110.     JC    NOSWITCH
  111.     ENDIF
  112. SWITCH:    PUSH    B
  113.     MOV    B,M
  114.     LDAX    D
  115.     MOV    M,A
  116.     MOV    A,B
  117.     STAX    D
  118.     INX    H
  119.     INX    D
  120.     POP    B
  121.     DCX    B
  122.     MOV    A,B
  123.     ORA    C
  124.     JNZ    SWITCH
  125.     LHLD    SNUMRW
  126.     MOV    A,H
  127.     CMA
  128.     MOV    D,A
  129.     MOV    A,L
  130.     CMA
  131.     MOV    E,A
  132.     LHLD    SORTV1
  133.     DAD    D
  134.     JNC    NOSWITCH
  135.     INX    H
  136.     SHLD    SORTV1
  137.     LHLD    SORTV3
  138.     XCHG
  139.     LHLD    SORTV2
  140.     MOV    A,E
  141.     SUB    L
  142.     MOV    L,A
  143.     MOV    A,D
  144.     SBB    H
  145.     MOV    H,A
  146.     SHLD    SORTV3
  147.     JMP    COMPRE
  148. ;
  149. NOSWITCH:
  150.     LHLD    SSTADR
  151.     INX    H
  152.     SHLD    SSTADR
  153.     SHLD    SORTV1
  154.     XCHG
  155.     LHLD    SRECLEN
  156.     MOV    A,L
  157.     SUB    E
  158.     MOV    A,H
  159.     SBB    D
  160.     JC    DIVIDE
  161.     LHLD    SORTV4
  162.     POP    D
  163.     PUSH    D
  164.     DAD    D
  165.     XCHG
  166.     LHLD    SORTV2
  167.     XCHG
  168.     JMP    NDONE2
  169. ;.....
  170. ;
  171. ;
  172. ; UTILITY SUBTRACTION SUBROUTINE...
  173. ; HL=HL-DE
  174. ;
  175. SUBDE:    MOV    A,L
  176.     SUB    E
  177.     MOV    L,A
  178.     MOV    A,H
  179.     SBB    D
  180.     MOV    H,A
  181.     RET
  182. ;
  183. SRECLEN:DW    0
  184. SSTADR:    DW    0
  185. SORTV1:DW    0
  186. SORTV2:DW    0
  187. SORTV3:DW    0
  188. SORTV4:DW    0
  189. SNUMRT:DW    0
  190. SNUMRW:DW    0
  191.