home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / CPM68K / SD68K.LBR / SORT.S < prev   
Text File  |  2000-06-30  |  2KB  |  77 lines

  1. ****    SORT -- Sort Array of Strings
  2. **
  3. **    Function:
  4. **        SORT sorts the set of fixed length records according to
  5. **        the control information in the Sort Specification Block (SSB)
  6. **        pointed to by D1.
  7. **    Inputs:  D1.L points to SSB
  8. **    Outputs:  -none-  (records sorted)
  9. **    Registers affected:  -none-
  10. **    Routines called:  compare routine (SSB)
  11. **    Special Error Conditions:  -none-
  12. **
  13. **    SSB Format:
  14. **
  15. **        Long: starting address of first record
  16. **        Word: number of records to sort
  17. **        Word: Size of each record
  18. **        Long: Address of compare routine
  19. **        Long: -reserved-
  20. *
  21.     .globl    sort
  22.     .globl    cmpa12
  23.     .text
  24. sort:
  25.     movem.l    d0-d7/a0-a6,-(a7)    * save registers
  26.     move.l    d1,a1        * ptr to ssb
  27.     move.l    (a1),a2        * start of records
  28.     move    4(a1),d6    * number of records
  29.     cmpi    #1,d6
  30.     ble    sortx        * if .le. 1 record
  31.     mulu    6(a1),d6    * lba+1; inner loop limit
  32.     add.l    a2,d6
  33.     move.l    d6,a5
  34.     sub    6(a1),a5    * (lba+1)-recsize
  35.     move.l    a5,d5        * outer loop limit
  36. *    begin inner loop
  37. sort1:    move.l    a2,a3
  38.     add    6(a1),a3
  39. *    compare
  40. sort2:    move.l    8(a1),a6    * compare routine
  41.     jsr    (a6)
  42.     ble    sort4        * no need to swap
  43. *    swap entries
  44.     move.l    a2,a5        * item 1
  45.     move.l    a3,a6        * item 2
  46.     move    6(a1),d3    * length in bytes
  47.     subq    #1,d3
  48. sort3:    move.b    (a5),d4        * swap bytes
  49.     move.b    (a6),(a5)+
  50.     move.b    d4,(a6)+
  51.     dbra    d3,sort3    * loop for all of entry
  52. *    end of inner loop
  53. sort4:    add    6(a1),a3
  54.     cmpa.l    d6,a3
  55.     blt    sort2
  56. *    end of outer loop
  57.     add    6(a1),a2
  58.     cmpa.l    d5,a2
  59.     blt    sort1
  60. *
  61. sortx:    movem.l    (a7)+,d0-d7/a0-a6
  62.     rts
  63. *
  64. ***    cmpa12 -- compare 12 bytes ascending (on word boundary)
  65. *
  66. cmpa12:
  67.     movem.l    d2/a2-a3,-(a7)    * save registers
  68.     cmpm.l    (a3)+,(a2)+
  69.     bne    cmpx        * not equal
  70.     cmpm.l    (a3)+,(a2)+
  71.     bne    cmpx        * not equal
  72.     cmpm.l    (a3)+,(a2)+
  73. cmpx:    movem.l    (a7)+,d2/a2-a3
  74.     rts
  75. *
  76.     .end
  77.