	PAGE 60
	ENTRY CIRCLE
	EXT PUTPBD,IARGT
	.Z80
	.COMMENT #

CIRCLE(IXM,IYM,IR,IPEN)

plottet (IPEN <> 0) bzw. loescht (IPEN = 0) einen Kreis um den Mittelpunkt 
(IXM,IYM) mit dem Radius IR.


Die Punktkoordinaten (2-Byte-Integer) gelten bezgl. des momentanen Plott-
Fensters und werden nach den Regeln von Microsoft-F80 uebergeben.
Demnach enthaelt
- HL die Adresse von IXM
- DE die Adresse von IYM
- BC die Adresse der 4 Bytes mit den Pointern auf IR und IPEN.

Die Routine benutzt die Integer-Argument Transfer-Routine IARGT und ruft
die externe Plott-Routine PUTP ueber deren Entry PUTPBD.

Verfahren nach B.K.P.Horn:  Circle Generators for Display Devices, GCIP 5
(1976) p.283

A.Herrmann	21.12.83
#
CIRCLE:	PUSH DE
	LD E,(HL)
	INC HL
	LD D,(HL)
	LD (XM),DE	; xm
	POP HL
	LD E,(HL)
	INC HL
	LD D,(HL)
	LD (YM),DE	; ym
;
	LD A,2		; 2 Argument
	LD DE,RAD	; nach RAD und PEN
	CALL IARGT
;
	XOR A		; Flag Byte
LOOP:	PUSH AF		; (Bit 0=Swap, Bit 1=Neg y, Bit 2=Neg x)
	CALL SECTOR	; Plotte naechsten Oktant
	POP AF
	INC A
	CP 8
	JR NZ,LOOP
	RET
;
XM:	DW 0		; Mittelpunkts-
YM:	DW 0		; Koord.
RAD:	DW 0		; Radius
PEN:	DW 0		; Plott-Pen
;
;	SECTOR
; plottet den Kreisbogen eines Oktanten
;
SECTOR:	LD HL,0
	LD DE,(RAD)
	PUSH HL
	PUSH DE
	SCF
	CCF
	SBC HL,DE
	LD B,H
	LD C,L		; BC = s = -r
	POP HL		; HL = x = r
	POP DE		; DE = y = 0
;
REP:			; repeat
	CALL PLOT	; Plotte x,y gemaess Flag Vector A
	PUSH DE
	PUSH HL
	EX DE,HL
	ADD HL,HL
	INC HL
	ADD HL,BC
	LD B,H
	LD C,L		; s = s + 2y + 1
	POP HL
	JP NC,NEXT	; if s>0
	DEC HL		; x = x - 1
	PUSH HL
	ADD HL,HL
	EX DE,HL
	LD H,B
	LD L,C
	SCF
	CCF
	SBC HL,DE
	LD B,H
	LD C,L		; s = s - 2x
	POP HL
NEXT:	POP DE
	INC DE		; y = y + 1
	PUSH HL
	SCF
	CCF
	SBC HL,DE
	POP HL
	JP NC,REP	; until x-y < 0
	RET
;
;	PLOT
; setzt den Plott-Punkt bei x,y (HL,DE) gemaess dem Flag Vector in A.
; Bit 0 = 1 :	x,y werden vertauscht (swap)
; Bit 1 = 1 :	y=-y (negate y)
; Bit 2 = 1 :	x=-x (negate x)
; Auf diese Weise wird die Symmetrie des Kreises ausgenutzt.
;
PLOT:	PUSH HL		; x
	PUSH DE		; y
	BIT 0,A
	JR Z,PLOT1
	EX DE,HL	; swap x,y
PLOT1:	BIT 1,A
	JR Z,PLOT2
	PUSH HL		; negate y
	LD HL,0
	SCF
	CCF
	SBC HL,DE
	EX DE,HL
	POP HL
PLOT2:	BIT 2,A
	JR Z,PLOT3
	PUSH DE		; negate x
	LD DE,0
	EX DE,HL
	SCF
	CCF
	SBC HL,DE
	POP DE
PLOT3:	PUSH BC
	PUSH DE		; point(x+xm,y+ym)
	LD DE,(XM)
	ADD HL,DE	; HL = x + xm
	POP DE
	PUSH HL
	LD HL,(YM)
	ADD HL,DE
	EX DE,HL	; DE = y + ym
	POP BC		; BC = x + xm
	PUSH AF		; rette Flag Vector
	LD A,(PEN)
	CALL PUTPBD	; setze Grafik Punkt
	POP AF
	POP BC
	POP DE
	POP HL
	RET
;
	END
