*****************************************************************************
*** Circle Routine		     (c) 1989(!!!) by McDeal&Agent/D-TECT ***
*** Release in HACK-MAG Issue #5					  ***
*****************************************************************************

ExecBase	=  4
Forbid		= -132
Permit		= -138
OldOpenLibrary	= -408
CloseLibrary	= -414

PlaneWidth	= 40
PlaneHeight	= 256
PlaneLen	= PlaneWidth*PlaneHeight

***************************************************
*** MACRO Definition				***
***************************************************

WAITBLITT:	MACRO
.\@:		btst	#6,$02(a5)
		bne.s	.\@
		ENDM

***************************************************
*** Programm Start				***
***************************************************

		section	a,code
		opt	o+

Start:		lea	$dff000,a5
		clr.l	0.w
		bsr.s	AllOff
		bsr	MakePlotYTab
		bsr.s	SetPlanePtr
		bsr.s	StartCopper
		bsr	Main
		bsr.s	StopCopper
		bsr.s	AllOn
		moveq	#0,d0
		rts

***************************************************
*** All Off/On					***
***************************************************

AllOff:		move.l	(ExecBase).w,a6
		jsr	Forbid(a6)
		move.w	$1c(a5),d0
		bset	#15,d0
		move.w	d0,INTENASave
		move.w	#$7fff,$9a(a5)
		rts

AllOn:		move.l	(ExecBase).w,a6
		move.w	#$7fff,$9a(a5)
		move.w	INTENASave(pc),$9a(a5)
		jmp	Permit(a6)

INTENASave:	dc.w	0

***************************************************
*** Plane Ptr in Copperlist			***
***************************************************

SetPlanePtr:	lea	PlanePtrs+2,a1
		move.l	#Plane1,d0
		move.w	d0,4(a1)
		swap	d0
		move.w	d0,(a1)
		rts

***************************************************
*** Copper Init					***
***************************************************

StartCopper:	move.w	$02(a5),d0
		bset	#15,d0
		move.w	d0,DMACONSave
		move.w	#$7fff,$96(a5)
		move.l	#NCList,$80(a5)
		move.w	$88(a5),d0
		move.w	#$83f0,$96(a5)
		rts

StopCopper:	move.l	(ExecBase).w,a6
		move.w	#$7fff,$96(a5)
		lea	GFXName(pc),a1
		jsr	OldOpenLibrary(a6)
		move.l	d0,a1
		move.l	38(a1),$80(a5)
		move.w	$88(a5),d0
		jsr	CloseLibrary(a6)
		move.w	DMACONSave(pc),$96(a5)
		rts

DMACONSave:	dc.w	0
GFXName:	dc.b	"graphics.library",0
		even

***************************************************
*** Calc Plot Tab				***
***************************************************

MakePlotYTab:	lea	PlotTabY,a0
		moveq	#0,d0
		move.w	#256-1,d7
.Loop:		move.w	d0,(a0)+
		add.w	#PlaneWidth,d0
		dbra	d7,.Loop
		rts

***************************************************
*** MainLoop					***
***************************************************

Main:		btst	#10,$16(a5)
		beq.s	Main
		move.l	$04(a5),d0
		and.l	#$1ff00,d0
		cmp.l	#50*256,d0
		bne.s	Main

		move.w	#$00f,$dff180
		bsr.s	DrawCircle
		move.w	#$000,$dff180

		btst	#6,$bfe001
		bne.s	Main
		rts

***************************************************
*** Circle Routine				***
***************************************************

DrawCircle:	move.w	#100,d2
		move.w	#160,a1			;X
		move.w	#128,a2			;Y
		lea	PlotTabY,a4
		lea	Plane1,a0

		moveq	#0,d0			;rel. X Pos
		move.w	d2,d1			;rel. Y Pos

		moveq	#3,d5
		add.w	d2,d2			;radius*2
		sub.w	d2,d5
		move.w	#10,a3

		bra.s	Plot

CircleLoop:	cmp.w	d1,d0		
		bge.s	.Exit
		tst.w	d5
		bmi.s	IncX
		move.w	d0,d3
		sub.w	d1,d3
		add.w	d3,d3
		add.w	d3,d3
		add.w	a3,d3
		add.w	d3,d5
		addq.w	#1,d0			;Inc X,Y
		subq.w	#1,d1

		bra.s	Plot
.Exit:		lea	$dff000,a5
		rts

IncX:		move.w	d0,d3			;X inc
		add.w	d3,d3			;*4
		add.w	d3,d3
		addq.w	#6,d3			;+6
		add.w	d3,d5
		addq.w	#1,d0

***************************************************
*** Eight-Way-Plotting				***
***************************************************

Plot:		;d0=X, d1=Y, a0=PlanePtr
		;a3=XTabPtr, a4=YTabPtr
		;a1=X origin, a2=Y origin

		move.l	a0,a5			;PlanePtr in a5,a6
		move.l	a0,a6

		move.w	d0,d7
		neg.w	d7			;neg X in d7
		move.w	d1,d3
		neg.w	d3			;neg Y in d3

		move.w	d3,d4
		add.w	a2,d4
		add.w	d4,d4
		add.w	(a4,d4.w),a6

		move.w	d1,d4
		add.w	a2,d4
		add.w	d4,d4
		add.w	(a4,d4.w),a5

		move.w	d0,d2
		add.w	a1,d2
		move.w	d2,d6
		not.w	d6
		lsr.w	#3,d2

		bset	d6,(a5,d2.w)		;X+,Y+
		bset	d6,(a6,d2.w)		;X+,Y-

		move.w	d7,d2
		add.w	a1,d2
		move.w	d2,d6
		not.w	d6			;Bit Offset in d6
		lsr.w	#3,d2

		bset	d6,(a5,d2.w)		;X-,Y+
		bset	d6,(a6,d2.w)		;X-,Y-

		move.l	a0,a5
		move.l	a0,a6

		move.w	d0,d4
		add.w	a2,d4
		add.w	d4,d4
		add.w	(a4,d4.w),a5

		add.w	a2,d7
		add.w	d7,d7
		add.w	(a4,d7.w),a6

		move.w	d1,d2
		add.w	a1,d2
		move.w	d2,d6
		not.w	d6			;Bit Offset in d6
		lsr.w	#3,d2

		bset	d6,(a5,d2.w)		;X+,Y+
		bset	d6,(a6,d2.w)		;X+,Y-

		add.w	a1,d3
		move.w	d3,d6
		not.w	d6			;Bit Offset in d7
		lsr.w	#3,d3

		bset	d6,(a5,d3.w)		;X-,Y+
		bset	d6,(a6,d3.w)		;X-,Y-
		bra	CircleLoop

***************************************************
*** Copperlist					***
***************************************************

		section	b,data_c

NCList:		dc.l	$01200000,$01220000,$01240000,$01260000
		dc.l	$01280000,$012a0000,$012c0000,$012e0000
		dc.l	$01300000,$01320000,$01340000,$01360000
		dc.l	$01380000,$013a0000,$013c0000,$013e0000

		dc.l	$008e2981,$009029c1,$00920038,$009400d0
		dc.l	$01020000,$01040000,$01080000,$010a0000
		dc.l	$01000200

PlanePtrs:	dc.l	$00e00000,$00e20000
		dc.l	$01001200

		dc.l	$01800000,$01820fff
		dc.l	-2
NCListEnd:

***************************************************
*** BSS data-segment				***
***************************************************

		section	c,bss_c

PlotTabY:	ds.w	256
Plane1:		ds.b	PlaneLen
