home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 300-399 / ff362.lzh / MemRoutines / memset.asm < prev    next >
Assembly Source File  |  1990-08-11  |  2KB  |  75 lines

  1. ;-------------------------------------------------------------
  2. ; memset() -- a faster version
  3. ;-------------------------------------------------------------
  4. ; toaddr = memset( to,char,count)
  5.  
  6. ; This routine copies "char" to the "to" address "count" times. It attempts
  7. ; to be more efficient that the Lattice function and the Aztec function 
  8. ; "setmem" by moving data a long word at a time, instead of a byte at a time.
  9. ; The "to" address is returned.
  10.  
  11. ;                            Robert Broughton
  12. ;                            328-1027 Davie St.
  13. ;                            Vancouver, BC V6E 4L2
  14. ;                            Canada
  15. ;                            USENet: a1040@mindlink.UUCP
  16.  
  17. ;MANX    SET    0
  18.     IFND    MANX
  19.     IDNT    _memset
  20.     CSECT    _memset
  21.     ENDC
  22.     XDEF    _memset
  23. _memset:
  24.     link    a5,#.127
  25.     move.l    d2,-(a7)
  26.     move.l    8(a5),a1            ;* out
  27. ;    the next two lines are for Lattice
  28.     IFND    MANX
  29.         move.l   12(a5),d1   ;* char
  30.         move.l    16(a5),d0    ;* count
  31.     ELSE
  32. ;    the next two lines are for Manx
  33.         move.w    12(a5),d1   ;* char
  34.         move.l    14(a5),d0    ;* count
  35.     ENDC
  36.  
  37.         cmp.l        #7,d0
  38.         ble        finish       ;* too small, don't bother with optimization
  39.  
  40.         move.l    a1,d2
  41.         btst        #0,d2            ;*  even or odd
  42.         beq        ok              ;*  it's even already
  43.         move.b    d1,(a1)+     ;*  now it's even
  44.         subq.l    #1,d0
  45.  
  46. ok:
  47. ;     make all four bytes of d1 the same
  48.         move.b    d1,d2
  49.         lsl.w        #8,d2
  50.         move.b    d1,d2
  51.         move.w    d2,d1
  52.         swap        d1
  53.         move.w    d2,d1
  54. outeven:
  55.         cmp.l        #3,d0
  56.         ble        finish
  57.  
  58.         move.l    d1,(a1)+
  59.         subq.l    #4,d0
  60.         bra        outeven
  61.  
  62. finish:
  63.         cmp.b        #0,d0
  64.         ble      really
  65.         move.b    d1,(a1)+
  66.         dbf        d0,finish
  67.  
  68. really:
  69.         move.l    8(a5),d0        ;* because Lattice does this
  70.         move.l    (a7)+,d2
  71.     unlk    a5
  72.     rts
  73. .127    equ    0
  74.  
  75.