home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 171.lha / SupLib / bset.asm < prev    next >
Assembly Source File  |  1988-04-28  |  2KB  |  72 lines

  1.  
  2.         public    _bzero        ; Zero a block of memory
  3.         public    _bset        ; Set a block of memory to (byte val)
  4.  
  5.         ;   BSET(buffer, len, byte)
  6.         ;   BZERO(buffer, len)
  7.  
  8.         public    _bset
  9.         public    _bzero
  10.  
  11. _bzero:     moveq.l #0,D1
  12.         bra    .bz0
  13. _bset:        move.b    12+3(sp),D1
  14. .bz0        move.l    4(sp),A0
  15.         move.l    8(sp),D0
  16.  
  17.         add.l    D0,A0        ; start at end of address
  18.         cmp.l    #40,D0        ; unscientifically chosen
  19.         bls    .bs2
  20.         bra    .bs10
  21. .bs1        move.b    D1,-(A0)    ; any count < 65536
  22. .bs2        dbf    D0,.bs1
  23.         rts
  24.  
  25.                     ; at least 2 bytes in count (D0)
  26. .bs10        movem.l D2-D7/A2-A6,-(sp)   ;ant count > 4
  27.         move.l    A0,D2
  28.         btst.l    #0,D2        ; is it aligned?
  29.         beq    .bs22
  30.         move.b    D1,-(A0)    ; no, copy one byte
  31.         subq.l    #1,D0
  32.  
  33. .bs22        andi.l    #$FF,D1     ; expand data D1.B -> D2-D7/A1-A6
  34.         move.l    D1,D2        ; D1 000000xx   D2 000000xx
  35.         asl.w    #8,D2        ;               0000xx00
  36.         or.w    D2,D1        ;     0000xxxx
  37.         move.w    D1,D2        ;     0000xxxx      0000xxxx
  38.         swap    D2        ;     0000xxxx      xxxx0000
  39.         or.l    D1,D2        ; D2.L
  40.         move.l    D2,D3
  41.         move.l    D2,D4
  42.         move.l    D2,D5
  43.         move.l    D2,D6
  44.         move.l    D2,D7
  45.         move.l    D2,A1
  46.         move.l    D2,A2
  47.         move.l    D2,A3
  48.         move.l    D2,A4
  49.         move.l    D2,A5
  50.         move.l    D2,A6        ; D2-D7/A1-A6   (12 registers)
  51.         move.l    #12*4,D1    ; bytes per transfer (48)
  52. .bs30        sub.l    D1,D0        ; pre subtract
  53.         bmi    .bs40
  54. .bs31        movem.l D2-D7/A1-A6,-(A0)
  55.         sub.l    D1,D0
  56.         bpl    .bs31
  57. .bs40        add.w    D1,D0        ; less than 48 bytes remaining
  58.  
  59.         move.w    #4,D1        ; by 4's
  60.         sub.w    D1,D0
  61.         bmi    .bs50
  62. .bs41        move.l    D2,-(A0)
  63.         sub.w    D1,D0
  64.         bpl    .bs41
  65. .bs50        add.w    D1,D0
  66.         bra    .bs52
  67. .bs51        move.b    D2,-(A0)    ; by 1's
  68. .bs52        dbf    D0,.bs51
  69.         movem.l (sp)+,D2-D7/A2-A6
  70.         rts
  71.  
  72.