home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_progs / prog_c / suplib.lzh / SUPLIB / SRC / BSET.ASM < prev    next >
Assembly Source File  |  1991-08-16  |  2KB  |  78 lines

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