	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
;	Move.w	#$000,$180(a6)		;REMOVE TO MEASURE RASTER TIME
Hold
	Btst	#$6,$bfe001		;QUIT lEFT MOUSE PRESSED
	Bne.s	Hold
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
	Move.l	#X1,a0
	Move.l	#Y1,a1
	Move.l	#X2,a2
	Move.l	#Y2,a3
	Move.l	a0,X1Pos
	Move.l	a1,Y1Pos
	Move.l	a2,X2Pos
	Move.l	a3,Y2Pos
	rts
GetXY
	Move.w	#PosSize,d6			; no of points
PosLoop	
	Move.l	X1Pos,a0
	Move.l	Y1Pos,a1
	Move.l	X2Pos,a2
	Move.l	Y2Pos,a3
	Move.l	(a0)+,d0
	Cmp.l	#$ffff,d0			; end Marker
	Bne	NoFill				; else fill shape
	Bsr	FillArea
	Dbra	d6,PosLoop
	Rts
NoFill
	Move.l	(a1)+,d1			; y1=d1
	Move.l	(a2)+,d2			; x2=d2
	Move.l	(a3)+,d3			; y2=d3
	Move.l	a0,X1Pos			; save positions
	Move.l	a1,Y1Pos
	Move.l	a2,X2Pos
	Move.l	a3,Y2Pos
	Bsr	Line
	Dbra	d6,PosLoop
	rts	

Octant_table
	Dc.b	3,19,11,23,7,27,15,31		; Fill + Sing Bits set
	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
FillArea
	Move.w	#(LineDepth)-1,d5		* no of planes -1
	Lea	$dff000,a5			* custom base
	Move.l	#Foreground,a0			* Start of BitPlane
	Add.l	#(ScreenSize)-2,a0		* Last Word-1
Fill_loop
	Bsr	Fill		
	Add.l	#ScreenSize,a0			* Next Plane
	Dbra	d5,Fill_loop		
	Rts
Fill
	Bsr	Wblit
	Move.l	a0,$50(a5)			* bltApt   * Address of last word
	Move.l	a0,$54(a5)			* bltDpt   * Designation
	Move.w	#0,$64(a5)			* bltamod  * Mask Modula
	Move.w	#0,$66(a5)			* bltdmod  * Designation Modula
	Move.w	#$09f0,$40(a5)		* USEx + D, LFx: D=A  * Bplcon0
	Move.w	#%0000000000001010,$42(a5)* Inclusive fill + descending  * Bplcon1
	Move.w	#$ffff,$44(a5)			* bltafwm  * first word mask
	Move.w	#$ffff,$46(a5)			* bltalwm  * last word mask
	Move.w	#((Height-1)*64)+(Width/2),$58(a5)* bltsize  * Bltsize
	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
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

Pos
X1		dc.l	0260,0380,$ffff
PosEnd
Y1		dc.l	0060,0060
X2		dc.l	0260,0380
Y2		dc.l	0120,0120

PosSize		equ	((PosEnd-Pos)/4)-1

X1Pos		dc.l	0
Y1Pos		dc.l	0
X2Pos		dc.l	0
Y2Pos		dc.l	0


Foreground
		dcb.b	ScreenSize*Depth,$00


