; *******************************************
; * This is one of the fastes Line-Routine. *
; * At the moment without clipping.	    *
; *******************************************
;
;
; This Sources is done by MCM/Complex and improved by Tron/Sanity
;
; 






	org	$20000
	load	$20000

WaitBlit	MACRO
.\@1	BTST	#14,2(A5)
	BNE.S	.\@1
		ENDM

Plane	=	$50000

J:
	move.l	#More,$80.W
	trap	#0
	rts

MORE:
	move.w	#$2700,sr
	lea	$DFF000,A5
	bsr	clear
	bsr	InitBlitSizes
	bsr	InitYPosTab
	move.l	#ucp,$84(a5)
	bsr	InitLine

	lea	Plane,A0
	move	#0,d0
	move	#0,d1
	move	#100,d2
	move	#100,d3
	bsr	BlitLine
	
Wait:
	btst	#2,$16(a5)
	bne.s	Wait

	move.w	#$2000,sr
	rte

Clear:
	lea	Plane,a0
	move.w	#101*40/4-1,d1
	moveq	#0,d0
Clear0:
	move.l	d0,(a0)+
	dbf	d1,Clear0

	move.w	#156*40/4-1,d1
*	move.l	#$AAAAAAAA,d0
Clear1:
	move.l	d0,(a0)+
	dbf	d1,Clear1
	rts
	
UCP:
	dc.w	$96,$87C0,$108,0,$8e,$2981,$90,$29c1,$92,$38,$94,$d0
	dc.w	$e0,Plane/$10000,$e2,Plane&$FFFF,$100,$1200,$102,0
	dc.l	$fffffffe
	
InitBlitSizes:
	LEA	LINE_BlitSizes(PC),A0
	MOVEQ	#0,D0
	MOVE.W	#$3FF,D2
.loop
	MOVE	D0,D1
	LSL.W	#6,D1
	ADDQ.W	#2,D1
	MOVE	D1,(A0)+
	ADDQ.W	#1,D0
	DBF	D2,.loop
	RTS
	
InitYPosTab:
	LEA	YPosTab(PC),A0
	MOVEQ	#0,D0
	MOVE.W	#255,D1
.loop
	MOVE	D0,(A0)+
	ADD.W	#40,D0
	DBF	D1,.loop
	RTS

InitLine:
	WaitBlit
	MOVEQ	#-1,D0
	MOVE.L	D0,$44(A5)		;BLTAFWM = $FFFF (BLTALWM egal!)
	MOVE.L	#$FFFF8000,$72(A5)	;BLTBDAT = Maske, BLTADAT = $8000
	MOVE.W	#$0028,$60(A5)		;BLTCMOD = Breite der Plane
	MOVE.W	#0,$42(A5)		;BLTCON1 löschen
	LEA	YPosTab(PC),A1
	LEA	LINE_BlitSizes(PC),A2
	RTS

*-------------------------------- BlitLine -----------------------------*
*
*	IN:	D0/D1		x1,y1
*		D2/D3		x2,y3
*		A0		Plane
*		A1	(*)	YPosTab
*		A2	(*)	LINE_BlitSizes
*		A5	(*)	Custom-Base $DFF000
*
*		D4		work register
*
*		(*)		will remain untouched
BlitLine:
	CMP.W	D1,D3		;Blitter im Single-Modus
	BEQ.S	.end		;--> Keine horizontalen Linien!!!
	BGT.S	.y2_gt_y1	;Y2 > Y1 ??? Ja --> branch
	EXG	D0,D2		;Nein --> Oktanten "klappen"
	EXG	D1,D3		;--> Nur Oktanten 4,5,6,7 möglich!!!
.y2_gt_y1
	MOVE	D1,D4
	ADD	D4,D4
	ADD.W	(A1,D4.W),A0
	MOVE	D0,D4
	ASR.W	#3,D4
	LEA	(A0,D4.W),A0

	MOVEQ	#1,D4		;Oktant 6/7
	SUB	D0,D2		;X2 > X1 (DeltaX)
	BPL.S	.x2_gt_x1	;DeltaX positiv --> Oktant 6/7
	NEG	D2		;DeltaX negativ --> Positiv machen
	MOVEQ	#0,D4		;jetzt nur noch Oktanten 4/5 möglich!!! 
.x2_gt_x1
	SUB	D1,D3		;DeltaY


	MOVE	D3,D1
	ADD	D1,D1
	CMP.W	D2,D1
	DBHI	D3,.1
.1
	MOVE	D3,D1		
	SUB	D2,D1		;DeltaY > Delta X ??? (SUB.W wegen X-Flag!!!!)
	BGT.S	.dy_gt_dx	;Ja --> D3 schon GDelta und D2 KDelta
	EXG	D2,D3		;Nein -> D3 zu GroßDelta, D2 zu KDelta machen
.dy_gt_dx
	ADDX	D4,D4		;D4 mit D4 und X-Flag addieren
		;bei Oktant 4/5 (D4=0) und dy>dx -> X-Flag=0 -> D4=0 OKT 5
		;bei Oktant 4/5 (D4=0) und dy<dx -> X-Flag=1 -> D4=1 OKT 4
		;bei Oktant 6/7 (D4=1) und dy>dx -> X-Flag=0 -> D4=2 OKT 6
		;bei Oktant 6/7 (D4=1) und dy<dx -> X-Flag=1 -> D4=3 OKT 7

	ADD	D2,D2		;2*KDelta
	MOVE	D2,D1		
	SUB	D3,D2		;2*KDelta - GDelta
	ADDX	D4,D4		;wenn 2*KDelta - GDelta <0 --> SIGN-Bit setzen!

	ADD	D0,D0
	ANDI.W	#$001F,D0

	WaitBlit
	MOVE	BltCon0(PC,D0.W),$40(A5)	;BltCON0 = $xB4A
	MOVE.B	BltCon1(PC,D4.W),$43(A5)	;BltCON1 = $00xx
	
	MOVE	D2,$52(A5)	;BLTAPTL = 2*KDelta - GDelta	
	SUB	D3,D2		;D2 = 2*KDelta - 2*GDelta
	ADD	D3,D3
	MOVEM.W	D1/D2,$62(A5)	;BLTBMOD=2*KDelta, BLTAMOD=2*KDelta-2*GDelta
	MOVE.L	A0,$48(A5)
	MOVE.L	A0,$54(A5)
	MOVE	(A2,D3.W),$58(A5)	
.end
	rts

BltCon0:
	DC.W	$0B4A,$1B4A,$2B4A,$3B4A,$4B4A,$5B4A,$6B4A,$7B4A
	DC.W	$8B4A,$9B4A,$AB4A,$BB4A,$CB4A,$DB4A,$EB4A,$FB4A
BltCon1:
	DC.B	$0B	;Sign 0, Oktant 5, Single, Line
	DC.B	$4B	;Sign 1, Oktant 5, Single, Line
	DC.B	$17	;Sign 0, Oktant 4, Single, Line
	DC.B	$57	;Sign 1, Oktant 4, Single, Line
	DC.B	$03	;Sign 0, Oktant 6, Single, Line
	DC.B	$43	;Sign 1, Oktant 6, Single, Line
	DC.B	$13	;Sign 0, Oktant 7, Single, Line
	DC.B	$53	;Sign 1, Oktant 7, Single, Line

LINE_BlitSizes:		BLK.W	1024,0
YPosTab:		BLK.W	256,0
