******************************************************************************
*Draw circle around Center (d0,d1) with Radius (d2) in Plane (a5).
*Made by Patrick van Logchem (v912152@si.hhs.nl) on 7 June 1993.
******************************************************************************

center:
	dc.w	0,0

	cnop	0,8
	
Circle:
	lea	center(pc),a3
	movem.w	d0/d1,(a3)	; place center in buffer

	move.w	d0,d3
	sub.w	d2,d3		; d3 = -X

	lea	RowTab(pc),a4	; this table contains pre-calculated offsets
				; (with base 0) for every rasterline.
	move.w	d1,d4
	add.w	d4,d4
	move.w	(a4,d4.w),d4

	move.w	d3,d5
	asr.w	#3,d5
	sub.w	d5,d4
	bchg	d3,(a5,d4.w)
	add.w	d5,d4

	add.w	d2,d3
	add.w	d2,d3		; d3 = +X

	move.w	d3,d5
	asr.w	#3,d5
	sub.w	d5,d4
	bchg	d3,(a5,d4.w)

	moveq	#0,d0		; X = 0
	move.w	d2,d1		; Y = R

	move.w	d2,d6
	lsr.w	#1,d6		; D = R>>1
   
	bra.s	skip4

; make sure (with nop's) that cir_lp is on a 8 byte boundary for max speed.

cir_lp:
	cmp.w	d1,d5
	beq.s	skip4		; if(Y != Y_old) /* only plot in new rows */
	plot4	d0,d1		;  set (X,Y),(X,-Y),(-X,-Y),(-X,Y)
skip4:
	plot4	d1,d0		; set (Y,X),(Y,-X),(-Y,-X),(-Y,X)
	move.w	d1,d5		; Y_old = Y
   
	addq.w	#1,d0		; X += 1
	sub.w	d0,d6		; D -= X
	bgt.s	noYdec		; if(D < 0) {
	subq.w	#1,d1		;  Y -= 1
	add.w	d1,d6		;  D += Y }
noYdec:
	cmp.w	d0,d1		; while(X < Y)	/* not finished 1/8 part ?? */
	bgt.w	cir_lp		;  loop

	bne.s	SkipEqu		; if(X == Y)
	plot4	d0,d1		;  set (X,Y),(X,-Y),(-X,-Y),(-X,Y)
SkipEqu:
	rts

******************************************************************************
*Macro to set 4 simetrical pixels around ((middle),(middle+2)).
*\1 = x ,\2 = y (are not touched; d2-d5 are!)

plot4	MACRO
	movem.w	(a3),d2/d3	; get X and Y
	move.w	d3,d4		; and another Y
	add.w	\1,d2		; d2 = +X
	add.w	\2,d3		; d3 = +Y
	sub.w	\2,d4		; d4 = -Y

	add.w	d3,d3		; make offset +Y
	add.w	d4,d4		; make offset -Y
	move.w	(a4,d3.w),d3	; d3=Width/8 * +Y
	move.w	(a4,d4.w),d4	; d4=Width/8 * -Y

	move.w	d2,d5
	asr.w	#3,d5		; d5=X/8
	sub.w	d5,d3
	sub.w	d5,d4
	bchg	d2,(a5,d3.w)	; (+X,+Y)
	bchg	d2,(a5,d4.w)	; (+X,-Y)

*Note: when changing this in to bfchg, speed DEcreases, so 4get it !

	add.w	d5,d3
	add.w	d5,d4

	sub.w	\1,d2
	sub.w	\1,d2		; d2 = -X

	move.w	d2,d5
	asr.w	#3,d5		; d5=X/8
	sub.w	d5,d3
	sub.w	d5,d4
	bchg	d2,(a5,d3.w)	; (-X,+Y)
	bchg	d2,(a5,d4.w)	; (-X,-Y)
	ENDM

******************************************************************************
