home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol078 / shelsort.mac < prev    next >
Text File  |  1984-04-29  |  4KB  |  154 lines

  1. .z80
  2. .comment !
  3.     shell-metzner sort routine in z80 code.
  4.     April 1982, Claude Almer
  5.             Software Source Pty. Ltd.
  6.     no end statement in file
  7.     ========================
  8.     sort-routine to be called as follows:
  9.     call    sort    ;hl, de, bc set up as below:
  10.     on entry:    HL contains the number of elements
  11.     ---------    DE points to location of first element
  12.             BC contains the length of the strings
  13.     on exit:    AF register destroyed.
  14.     --------    BC register destroyed.
  15.             DE register destroyed.
  16.             HL register destroyed.
  17.     reserved labels:    sort,sort1 through sort26
  18.     ----------------
  19.     sort1  through sort10    sorting     routine
  20.     sort11 through sort12    compare     routine
  21.     sort13 through sort14    swap     routine
  22.     sort15 through sort18    indexing routine
  23.     sort19 through sort26         data area !
  24.  
  25. ;    >>>>>>>>>>>>>>        sort-routine
  26. ;                ============
  27.  
  28. sort::    ld    (sort19),de    ;area to sort
  29.     ld    (sort20),bc    ;length to compare and swap
  30. sort1:    ld    (sort25),hl    ;set arrays
  31.     ld    (sort26),hl    ;initialise
  32. sort2:    ld    bc,(sort25)    ;sort25/2
  33.     srl    b        ;divide by 2
  34.     rr    c        ;bc / 2
  35.     ld    (sort25),bc    ;now sort25=sort25/2
  36.     ld    a,b        ;if sort25=0 then return
  37.     or    c
  38.  
  39. ;    >>>>>>>>>>>>>>>>>    ;exit if through
  40.  
  41.     ret    z        ;yes, RETURN
  42.                 ;===========
  43.  
  44. sort3:    ld    hl,(sort26)    ;calculate sort23
  45.     ld    de,(sort25)    ;sort23 = sort26-sort25
  46.     or    a        ;clear carry
  47.     sbc    hl,de        ;sort23 now in hl
  48.     ld    (sort23),hl    ;sort23 now stored
  49.     ld    hl,0        ;clear sort22
  50.     ld    (sort22),hl    ;sort22=1
  51. sort4:    ld    hl,(sort22)    ;sort21=sort22
  52.     ld    (sort21),hl    ;store
  53. sort5:    ld    hl,(sort21)    ;sort24=sort21+sort25
  54.     ld    de,(sort25)    ;get sort25
  55.     add    hl,de        ;add it together
  56.     ld    (sort24),hl    ;and store it
  57. sort6:    ld    hl,(sort21)    ;for comparisons now
  58.     ld    de,(sort24)    ;as well
  59.     call    sort11        ;compare the two
  60.     jr    nc,sort10    ;if sort21>=sort22 then sort10
  61. sort7:    call    sort13        ;swap the two arrays
  62. sort8:    ld    hl,(sort21)    ;sort21=sort21-sort25
  63.     ld    de,(sort25)    ;get sort25
  64.     or    a        ;clear carry
  65.     sbc    hl,de        ;subtract sort25
  66.     ld    (sort21),hl    ;and store it in sort21
  67. sort9:    ld    a,h        ;if sort21 >=0 then sort5
  68.     or    a        ;is sort21 greter ?
  69.     jp    p,sort5        ;if positive it's greater
  70. sort10: ld    hl,(sort22)    ;sort22=sort22+1
  71.     inc    hl        ;+1
  72.     ld    (sort22),hl    ;store back there
  73.     inc    hl        ;adjust for flag below
  74.     ld    de,(sort23)    ;if sort22>sort23 then sort2
  75.     or    a        ;clear carry
  76.     sbc    hl,de        ;sort22 greater then sort23 ?
  77.     jr    c,sort4        ;not greater, goto sort4
  78.     jr    sort2        ;if sort22>sort23 then sort2
  79.  
  80. ;    >>>>>>>>>>>>>>>>    compare routine
  81. ;                ===============
  82.  
  83. sort11: call    sort15        ;set up hl,de
  84.     ld    bc,(sort20)    ;number of chars to compare
  85. sort12: ld    a,(de)        ;get char in de
  86.     cp    (hl)        ;compare it with (hl)
  87.     ret    nz        ;return if not equal
  88.     inc    de        ;point to next
  89.     cpi            ;dec bc, inc hl
  90.     jp    pe,sort12    ;pe if not zero
  91.     xor    a        ;clear flags and exit
  92.     ret            ;all the same
  93.  
  94. ;    >>>>>>>>>>>>>>>>    swap routine
  95. ;                ============
  96.  
  97. sort13: call    sort15        ;set up hl and de
  98.     ld    bc,(sort20)    ;get the length
  99. sort14: ld    a,(de)        ;get byter
  100.     push    bc        ;keep counter
  101.     ld    c,a        ;keep char
  102.     ld    a,(hl)        ;get second char
  103.     ld    (de),a        ;swap it
  104.     ld    (hl),c        ;and the other one
  105.     pop    bc        ;restore counter
  106.     inc    de        ;point to next
  107.     cpi            ;inc hl + dec bc
  108.     jp    pe,sort14    ;pe if bc not 0
  109.     ret            ;all done
  110.  
  111. ;    >>>>>>>>>>>>>>>>    indexing routine
  112. ;                ================
  113.  
  114. sort15: ld    hl,(sort24)    ;get sort24
  115.     call    sort16        ;point hl to sort24'th position
  116.     push    hl        ;keep it
  117.     ld    hl,(sort21)    ;sort21
  118.     call    sort16        ;hl to sort21'th. position
  119.     pop    de        ;de now restored (sort24)
  120.     ret            ;all indexing done
  121. sort16: ld    c,h        ;mpr high
  122.     ld    a,l        ;mpr low
  123.     ld    b,16        ;count bits
  124.     ld    hl,0        ;for result
  125.     ld    de,(sort20)    ;length to multiply with
  126. sort17: srl    c        ;right shift mpr h
  127.     rra            ;r rotate mpr l
  128.     jr    nc,sort18    ;carry ??
  129.     add    hl,de        ;add mpd to result
  130. sort18: ex    de,hl        ;for double shift
  131.     add    hl,hl        ;doublebit-shift mpd left
  132.     ex    de,hl        ;back to normal
  133.     djnz    sort17        ;until all bits
  134.     ld    de,(sort19)    ;add offset
  135.     add    hl,de        ;add it to result
  136.     ret            ;all done
  137.  
  138.  
  139.     >>>>>>>>>>>>>>>>    ;data area
  140.                 ;=========
  141.  
  142. sort19: dw    0        ;string start position
  143. sort20: dw    0        ;string length
  144. sort21: dw    0        ;data area for sort
  145. sort22: dw    0        ;data area for sort
  146. sort23: dw    0        ;data area for sort
  147. sort24: dw    0        ;data area for sort
  148. sort25: dw    0        ;data area for sort
  149. sort26: dw    0        ;data area for sort
  150.  
  151. ;    end of sort routine    <<<<<<<<<<<<<<<<<<<<<<<<
  152.  
  153.  
  154.