	SECTION		chipMeMory,data_c	
							;BY BLAINE EVANS
							;1 ERITH WAY
							;PONTYBODKIN
							;NR MOLD
							;CLWYD
							;CH7 4TR
							;TEL O352-771673
	opt	c-,d+

Height			equ	256
Width			equ	80
Depth			equ	2

ScreenSize		equ	Height*Width

LineHeight		equ	16
LineWidth		equ	1
LineDepth		equ	2

	Move.l	4.w,a6			;FIND EXEC BASE
	lea	gfxlib(pc),a1		;lOAD GRAPHICS lIBRARY IN A1
	Moveq	#$00,d0			;VERSION 0
	jsr	-552(a6)		;OPEN lIBRARY
	Move.l	d0,_gfxBase		;STORE D0 (GFX ADDRESS )
	Beq	Nolib_exit		;ElSE EXIT
	Bsr	Foreground_addresses	;BRANCH TO FOREGROUND ADDRESSES
	Bsr	Init
	Move.l	_gfxBase,a0		;lOAD ADDRESS OF GRAPHICS lIB IN A0
	Move.l	50(a0),Oldcop		;STORE CURRENT COPPER,ETC TO RETRIEVE lATER
S
	Move.l	#Newcop,50(a0)		;POINT TO OUR COPPERlIST

Wait					;WAIT lOOP
	Cmp.b	#255,$dff006		;VERTICAl BlANKING GAP 
	Bne.s	wait			;
;	Move.w	#$fff,$180(a6)		;REMOVE TO MEASURE RASTER TIME
	Bsr	GetXY
	Bsr	line
;	Move.w	#$000,$180(a6)		;REMOVE TO MEASURE RASTER TIME
	Btst	#$6,$bfe001		;QUIT lEFT MOUSE PRESSED
	Bne.s	Wait
Ended					;ElSE lOOP TO WAIT
	Move.l	_gfxBase,a0		;lOAD GRAPHICS lIB ADDRESS IN A0
	Move.l	oldcop,50(a0)		;RESTORE OlD COPPER TO RETURN TO EDITTER
NoMem_exit	
	Move.l	4.w,a6			;FIND EXEC BASE
	Move.l	_gfxBase,a1		;lOAD GRAPHICS BASE IN A1
	jsr	-414(a6)		;ClOSE lIBRARY
Nolib_exit
	rts				;RETURN TO EDITER
Foreground_addresses			;START OF FOREGROUND DATA
	Move.l	#Foreground,d0
	Move.w	d0,Bpl0ptl		;lOW WORD IN BIT PlANE 0 lOW
	Swap	d0				
	Move.w	d0,Bpl0pth		;HIGH WORD IN BIT PlANE 0 HIGH
	Swap	d0
	Add.l	#ScreenSize,d0
	Move.w	d0,Bpl1ptl		;lOW WORD IN BIT PlANE 1 lOW
	Swap	d0				
	Move.w	d0,Bpl1pth		;HIGH WORD IN BIT PlANE 1 HIGH
	Swap	d0
	rts
Init
	Lea	Connections(pc),a4
	Move.l	a4,ConnectSave
	Rts
GetXY
	Moveq.l	#0,d0				; Clear work registers
	Moveq.l	#0,d1
	Moveq.l	#0,d2
	Moveq.l	#0,d3
	Move.l	ConnectSave,a4
	Move.l	(a4)+,a0
	Move.l	(a4)+,a1
	Move.w	(a0)+,d0			; x1=d0
	Cmp.w	End,d0				; end marker reached
	Bne.s	NoEnd				; no,then skip reset
	Lea	Connections(pc),a4		; reload connections
	Move.l	a4,ConnectSave
	Move.l	(a4)+,a0
	Move.l	(a4)+,a1
	Move.w	(a0)+,d0			; x1=d0
NoEnd
	Move.w	(a0)+,d1			; y1=d1
	Move.w	(a1)+,d2			; x2=d2
	Move.w	(a1)+,d3			; y2=d3
	Move.l	a4,ConnectSave
	Rts
Octant_taBle
	Dc.B	1,17,9,21,5,25,13,29		; line only
	Even

line
	lea	$dff000,a5			; custoM Base
	Move.l	#Foreground,a0			; start address of screen
	Move.l	#Width,a1			; width of screen
	Move.w	a1,d4				; 
	Mulu.w	d1,d4				; Multiply y1 By width
	Moveq	#-$10,d5			; no leading chars
	And.w	d0,d5				; BottoM four Bits Masked froM x1
	lsr.w	#3,d5				; reMainder divided By 8
	Add.w	d5,d4				; y1*width+X1/8
	Add.l	a0,d4				; +start of Bitplane

	Clr.l	d5			
	Sub.w	d1,d3				; y2-y1 d3=Delta y
	Roxl.b	d5				; shift leading char froM delta y
	Tst.w	d3				; restore n-flag
	Bge.s	Y2gy1				; when dy=+ve,goto y2gy1
	Neg.w	d3				; invert if not +ve
Y2gy1
	Sub.w	d0,d2				; x2-x1=delta X
	Roxl.b	d5				; Move leading char forM delta X
	Tst.w	d2				; restore n flag
	Bge.s	X2gx1				; when dx=+ve,goto x2gx1
	Neg.w	d2				; invert if not +ve
X2gx1
	Move.w	d3,d1				; delta y
	Sub.w	d2,d1				; deltaY-deltaX
	Bge.s	Dygdx				; when dy>dx,goto dygdx
	Exg	d2,d3				; sMaller delta in d2
Dygdx
	Roxl.b	d5				; d5=result of 3 coMparisons
	Move.b	Octant_table(pc,d5),d5		; Matching octants
	Add.w	d2,d2				; sMaller delta * 2

	Move.w	d2,SDelta_2			; store
	Sub.w	d3,d2				; 2*sMaller delta-larger delta
	Bge.s	Signn1				; when 2*sd > l.delta
	Or.b	#$40,d5				; sign flag set
Signn1
	Move.w	d2,SDelta_2_LDelta		; store 
	Sub.w	d3,d2				; 2*s.delta-2*large delta
	Move.w	d2,SDelta_2_LDelta_2		; store
	And.w	#$000f,d0			; BottoM 4 Bits froM X1
	Ror.w	#4,d0				; to START0-3
	Or.w	#$0Bca,d0			; USEx and lFx Bits  set
	lsl.w	#6,d3				; length * 64
	Addq	#2,d3				; plus (Width=2)

	Move.w	#(lineDepth)-1,d7		; no of planes -1
Draw_loop
	Bsr	Draw
	Add.l	#ScreenSize,d4			; next plane
	DBra	d7,Draw_loop
	Rts
Draw
	Bsr	WBlit
	Move.w	SDelta_2,$62(a5)		;BltBmod
	Move.w	SDelta_2_LDelta,$52(a5)		;BltAptl
	Move.w	SDelta_2_LDelta_2,$64(a5)	;BltAmod
	Move.w	#$8000,$74(a5)			;BltAdat
	Move.w	#$ffff,$72(a5)			;BltBdat
	Move.w	#$ffff,$44(a5)			;Bltafwm
	Move.w	d0,$40(a5)			;Bltcon0
	Move.w	d5,$42(a5)			;Bltcon1
	Move.l	d4,$48(a5)			;BltCpth
	Move.l	d4,$54(a5)			;BltDpth
	Move.w	a1,$60(a5)			;BltCmod
	Move.w	a1,$66(a5)			;BltDmod
	Move.w	d3,$58(a5)			;Bltsize
	Rts
WBlit
	Btst	#14,$2(a5)
	Bne.s	WBlit
	Rts

gfxlib	dc.b	"graphics.library",0	
	even
_gfxBase	dc.l	0			;lONG WORD TO STORE GFX ADDRESS
oldcop		dc.l	0			;OLD COPPERlIST ADDRESS
LineAddress	dc.l	0
Octant		dc.l	0
ConnectSave	dc.l	0
Blitlength	dc.w	0
X		dc.l	0
Y		dc.l	0
Bltcon		dc.w	0
SDelta_2	dc.w	0
SDelta_2_LDelta	dc.w	0
SDelta_2_LDelta_2	dc.w	0
	even


Newcop
	dc.w	$0100,%1010001000000000		
	dc.w	$0102
Scroll	dc.w	$0000				;SCROll VAlUE
	dc.w	$0104,%0000000000000001		;NO PRIORITIES
	dc.w	$0108,$0000,$010a,$0000		;MODUlAS
	dc.w	$0092,$0038,$0094,$00d0		;256*40 SCREEN
	dc.w	$008e,$2c81,$0090,$2cc1		;VISIBlE AREA
						
Planes
	dc.w	$00e0
Bpl0pth	dc.w	$0000,$00e2
Bpl0ptl	dc.w	$0000,$00e4
Bpl1pth	dc.w	$0000,$00e6
Bpl1ptl	dc.w	$0000,$00e8
Bpl2pth	dc.w	$0000,$00ea
Bpl2ptl	dc.w	$0000,$00ec
Bpl3pth	dc.w	$0000,$00ee
Bpl3ptl	dc.w	$0000,$00f0
Bpl4pth	dc.w	$0000,$00f2
Bpl4ptl	dc.w	$0000,$00f4
Bpl5pth	dc.w	$0000,$00f6
Bpl5ptl	dc.w	$0000

Sprites						;SPRITES
	dc.w	$0120
Spl0pth	dc.w	$0000,$0122
Spl0ptl	dc.w	$0000,$0124
Spl1pth	dc.w	$0000,$0126
Spl1ptl	dc.w	$0000
	dc.w	$0128,$0000,$012a,$0000
	dc.w	$012c,$0000,$012e,$0000
	dc.w	$0130,$0000,$0132,$0000
	dc.w	$0134,$0000,$0136,$0000
	dc.w	$0138,$0000,$013a,$0000
	dc.w	$013c,$0000,$013e,$0000

	dc.w	$0180,$0000,$0182,$0ff0		;COlORS PlAY 1
	dc.w	$0184,$0d00,$0186,$0fff
	dc.w	$0188,$0ff0,$018a,$00ff
	dc.w	$018c,$008f,$018e,$0095

	dc.w	$0190,$0000,$0192,$0283		;COlORS PlAY 2
	dc.w	$0194,$08f4,$0196,$0095
	dc.w	$0198,$0243,$019a,$00ff
	dc.w	$019c,$0ff0,$019e,$0fa0

	dc.w	$01a0,$0000,$01a2,$0fff		;SPRITE COlORS
	dc.w	$01a4,$0f00,$01a6,$0B00
	dc.w	$01a8,$0600,$01aa,$0F40
	dc.w	$01ac,$0F80,$01ae,$0Fa0
	dc.w	$01B0,$0Ff0,$01B2,$000f
	dc.w	$01B4,$004f,$01B6,$008f
	dc.w	$01B8,$00ff,$01Ba,$00f0
	dc.w	$01Bc,$0283,$01Be,$0f0f

	dc.w	$ffff,$fffe			;END OF COPPERlIST

A		Dc.w	260,060
B		Dc.w	260,120
C		Dc.w	380,060
D		Dc.w	380,120
E		Dc.w	320,030
F		Dc.w	440,030
G		Dc.w	440,090
End		Dc.w	$ffff,$ffff
Connections	
		Dc.l	A,B		;     E#######F
		Dc.l	C,D		;    #       ##
		Dc.l	A,C		;   #       # #
		Dc.l	B,D		;  A#######C  #
		Dc.l	A,E		;  #       #  G
		Dc.l	C,F		;  #       # #
		Dc.l	E,F		;  #       ##
		Dc.l	D,G		;  B#######D
		Dc.l	G,F		;
		Dc.l	End		; END MARKER
Foreground
		dcb.b	ScreenSize*Depth,$00



