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

VECTOR(IX0,IY0,IX1,IY1,IPEN)

plottet (IPEN<>0) bzw. loescht (IPEN=0) eine Strecke vom Punkt (IX0,IY0) 
zum Punkt (IX1,IY1).


Die Punktkoordinaten (2-Byte-Integer) gelten bezgl. des momentanen Fensters
und werden nach den Regeln von Microsoft-F80 uebergeben. Demnach enthaelt
- HL die Adresse von IX0
- DE die Adresse von IY0
- BC die Adresse des Pointers auf die 6 Bytes mit Pointern auf IX1,IY1 und IPEN

Nach dem Algorithmus von Bresenham (s. Newman & Sproull Principles of
Interactive Computer Graphics p.26) werden die Plottpunkte inkrementell
errechnet und gesetzt.

Die Routine benutzt die Argument-Transfer-Routine IARGT im Modul PUTP und
ruft die Plott-Routine PUTP ueber den Entry PUTPBD.

A.Herrmann	21.12.83
#
VECTOR:	PUSH DE
	LD E,(HL)
	INC HL
	LD D,(HL)
	LD (X0),DE	; Hole x0
	POP HL
	LD E,(HL)
	INC HL
	LD D,(HL)
	LD (Y0),DE	; Hole y0
;
	LD DE,X1	; Pointer auf 3.Par.
	LD A,3		; 3 Integer-Argumente
	CALL IARGT	; transferieren
;
	LD HL,(Y1)
	LD DE,(Y0)
	XOR A		; Clear Carry
	SBC HL,DE
	LD (DY),HL	; DELTA Y
	CALL SGN
	LD (SGNDY),HL	; SGN(DELTA Y)
	LD HL,(X1)
	LD DE,(X0)
	XOR A
	SBC HL,DE
	LD (DX),HL	; DELTA X
	CALL SGN
	LD (SGNDX),HL	; SGN(DELTA X)
;
	LD HL,(DX)
	CALL DABS
	LD (DABSDX),HL	; 2*ABS(DELTA X)
	LD HL,(DY)
	CALL DABS
	LD (DABSDY),HL	; 2*ABS(DELTA Y)
;
	LD BC,(X0)	; X=X0
	PUSH BC
	LD DE,(Y0)	; Y=Y0
	PUSH DE
;
	LD HL,(DABSDX)
	LD DE,(DABSDY)
	XOR A
	SBC HL,DE
	JP C,VECT10	; IF DELTA X < DELTA Y GOTO VECT10
;
; DELTA X >= DELTA Y
;
	LD HL,(DX)
	CALL ABS
	PUSH HL		; ABS(DELTA X)
	LD DE,(DABSDY)
	EX DE,HL
	XOR A
	SBC HL,DE
	LD (ERRSUM),HL	; ERRSUM=2*ABS(DELTA Y)-ABS(DELTA X)
	POP HL		; FOR HL=ABS(DELTA X) DOWNTO 0
	INC HL
	POP DE
	POP BC
VECT1:	PUSH HL
	PUSH BC
	PUSH DE
	LD A,(PEN)
	CALL PUTPBD	; SET PIXEL BC=X,DE=Y,A=PEN
	POP DE
	LD HL,(ERRSUM)
	BIT 7,H
	JP NZ,VECT2
	LD A,H
	OR L
	JP Z,VECT2	; IF ERRSUM <= 0 GOTO VECT2
	LD HL,(SGNDY)
	ADD HL,DE
	EX DE,HL	; Y=Y+SGN(DELTA Y)
	LD HL,(ERRSUM)
	LD BC,(DABSDX)
	XOR A
	SBC HL,BC	; ERRSUM=ERRSUM-2*ABS(DELTA X)
VECT2:	LD BC,(DABSDY)
	ADD HL,BC
	LD (ERRSUM),HL	; ERRSUM=ERRSUM+2*ABS(DELTA Y)
	POP BC
	LD HL,(SGNDX)
	ADD HL,BC
	LD B,H
	LD C,L		; X=X+SGN(DELTA X)
	POP HL
	DEC HL
	LD A,H
	OR L
	JP NZ,VECT1	; NEXT HL
	RET		; EXIT
;
; DELTA X < DELTA Y
;
VECT10:	LD HL,(DY)
	CALL ABS
	PUSH HL		; ABS(DELTA Y)
	LD DE,(DABSDX)
	EX DE,HL
	XOR A
	SBC HL,DE
	LD (ERRSUM),HL	; ERRSUM=2*ABS(DELTA X)-ABS(DELTA Y)
	POP HL		; FOR HL=ABS(DELTA Y) DOWNTO 0
	INC HL
	POP DE
	POP BC
VECT11:	PUSH HL
	PUSH DE
	PUSH BC
	LD A,(PEN)
	CALL PUTPBD	; SET PIXEL BC=X,DE=Y,A=PEN
	POP BC
	LD HL,(ERRSUM)
	BIT 7,H
	JP NZ,VECT12
	LD A,H
	OR L
	JP Z,VECT12	; IF ERRSUM <= 0 GOTO VECT12
	LD HL,(SGNDX)
	ADD HL,BC
	LD B,H
	LD C,L		; X=X+SGN(DELTA X)
	LD HL,(ERRSUM)
	LD DE,(DABSDY)
	XOR A
	SBC HL,DE	; ERRSUM=ERRSUM-2*ABS(DELTA Y)
VECT12:	LD DE,(DABSDX)
	ADD HL,DE
	LD (ERRSUM),HL	; ERRSUM=ERRSUM+2*ABS(DELTA X)
	POP DE
	LD HL,(SGNDY)
	ADD HL,DE
	EX DE,HL	; Y=Y+SGN(DELTA Y)
	POP HL
	DEC HL
	LD A,H
	OR L
	JP NZ,VECT11	; NEXT HL
	RET		; EXIT
;
X0:	DW 0
Y0:	DW 0
X1:	DW 0
Y1:	DW 0
PEN:	DW 0
DX:	DW 0
DY:	DW 0
SGNDX:	DW 0
SGNDY:	DW 0
DABSDX:	DW 0
DABSDY:	DW 0
ERRSUM:	DW 0
;
;	SGN
; liefert das Signum von HL in HL (-1/0/1)
;
SGN:	JR NC,SGN1
	LD HL,-1
	RET
SGN1:	JR NZ,SGN2
	LD HL,0
	RET
SGN2:	LD HL,1
	RET
;
;	DABS
; multipliziert den Absolutwert von HL mit 2.
;
DABS:	BIT 7,H
	JR Z,DABS1
	LD DE,0
	EX DE,HL
	SCF
	CCF
	SBC HL,DE
DABS1:	ADD HL,HL
	RET
;
;	ABS
; liefert den Absolutwert von HL.
;
ABS:	BIT 7,H
	RET Z
	LD DE,0
	EX DE,HL
	SCF
	CCF
	SBC HL,DE
	RET
;
	END
