
;BMOV.ASM
;      4    8	12
;BMOV(src,dest,bytes)
;
;   Matthew Dillon
;
;   -Handles ascending/descending moves
;   -Optimizes the move if addresses longword boundries and #bytes
;    is a multiple of 4.
;   -Completely tested

	xdef  _bmov

_bmov
	movem.l 4(A7),A0/A1	;source, destination
	move.l	12(A7),D0	;bytes
	clr.b	D1		;long word boundry flag
	andi.b	#3,15(A7)	;byte count multiple of 4?
	bne	notlwb
	andi.b	#3,7(A7)	;source mulitple of 4?
	bne	notlwb
	andi.b	#3,11(A7)	;destination multiple of 4?
	seq.b	D1		;set longword boundry flag if true
notlwb	cmp.l	A0,A1
	beq	end		;trivial case
	ble	ascend		;ascending copy
	add.l	D0,A0		;descending copy
	add.l	D0,A1

decend	tst.b	D1		;DESCEND
	beq	decbyte
declong lsr.l	#2,D0		;DESCEND LONGWORD
	bra	ab00
ab0	move.l	-(A0),-(A1)
ab00	dbf.w	D0,ab0
	sub.l	#$10000,D0
	bpl	ab0
end	rts

ab1	move.b	-(A0),-(A1)	;DESCEND BYTE
decbyte dbf.w	D0,ab1
	sub.l	#$10000,D0
	bpl	ab1
	rts

ascend	tst.b	D1		;ASCEND
	beq	ascbyte
asclong lsr.l	#2,D0		;ASCEND LONGWORD
	bra	ab22
ab2	move.l	(A0)+,(A1)+
ab22	dbf.w	D0,ab2
	sub.l	#$10000,D0
	bpl	ab2
	rts

ab3	move.b	(A0)+,(A1)+	;ASCEND BYTE
ascbyte dbf.w	D0,ab3
	sub.l	#$10000,D0
	bpl	ab3
	rts


