
#    r0		volatile, may be used by function linkage
#    r1		stack pointer
#    r2		table of contents register
#    r3	.. r4	volatile, pass 1st - 2nd int args, return 1st - 2nd ints
#    r5  .. r10	volatile, pass 3rd - 8th int args
#    r11		volatile, pass static chain if language needs it
#    r12		volatile, used by dyn linker, exception handling
#    r13 .. r31	saved



#    f0		volatile
#    f1  .. f4	volatile, pass 1st - 4th float args, return 1st - 4th floats
#    f5  .. f13	volatile, pass 5th - 13th float args
#    f14 .. f31	saved

#	Use r23	as CurCnt
#	Use r24	as MaxCnt (Constant value)
#	Use r25	as LPixelBuf
#	Use r26	as location within ColorTable32
#	Use r27	as base address of ColorTable32
#	Use r28	as BPP (that is, bytes per pixel)

#	r29	as RightEdge
#	r30	as xtemp (integer)


#	Note that the following are constants, and independent of xtemp.

#	First the integers
#	MaxCnt	in r24
#	LPixelBuf in r25. It changes but need only be loaded 1 time.
#	Base address of ColorTable32 in r27
#	BPP in r28

#	Now the floats	(Newly defined)

#	3.00 in f14
#	Zr in f15.  It changes as Zr is recalculated.
#	Use f16	as value of yRel.  This is constant for each line.
#	Use f17	Zi.  It's initially yRel, but changes within loop.
#	Use f18	as xRel. Only changes as DX is added for the next pixel.
#	Use f19 as |Z2| Only for comparing with Limit.
#	Use f20    This is scratch and used shortly for 2Zi.
#	Delta x	in f21
#	Two	in f22
#	Limit	in f23
#	Use f24	as Zr2.  This is also a temporary value
#	Use f26 as Zr3.


	.text
	.sdreg	13
	.global	UseLibP6
	.align	4
UseLibP6:
	mflr	11
	stw	11,4(1)	#Save return address
	stwu	1,-80(1)      #Save stack pointer
	fmr	16,1		#Transfer yrel from f1 to f16
	lis	4,MaxCnt@ha
	lwz	24,MaxCnt@l(4)		#MaxCnt in r24.
	lis	4,LPixelBuf@ha
	lwz	25,LPixelBuf@l(4)	#Get Location of LPixelBuf
	lis	4,ColorTable32@ha
	lwz	27,ColorTable32@l(4)	#Start of color table

	lis	4,BPP@ha
	lwz	28,BPP@l(4)             #Number bytes per pixel
	lis	4,Factor@ha
	lfd	25,Factor@l(4)	#Get Factor into f25
	lis	4,Two@ha
	lfd	22,Two@l(4)	#Get Two into f22 as constant
	lis	4,Limit@ha
	lfd	23,Limit@l(4)	#Get Limit into f23 as constant

	fadd	14,22,22	#f14 is 4.
	fadd	14,14,22	#f14 is 6.
	fdiv	14,14,22	#f14 is 3.

#The above could have been done with a global definition of 3.000.

	li	30,0		#xtemp = 0.
	fsub	15,22,22	#(float)xtemp = 0.
	lis	4,XCenter@ha
	lfd	10,XCenter@l(4)	#f10 = XCenter
	fsub	15,15,10	#xRel = xRel - XCenter
	fdiv	18,15,25	#xRel = xRel/Factor

	lis	4,DX@ha
	lfd	21,DX@l(4)	#Get the real value of Delta x.
	lis	4,RightEdge@ha
	lwz	29,RightEdge@l(4)

Start:
	fmr	15,18		#Initial value of Zr is xRel

#  The following line was moved before rather than after fmr f17,f16
#  to give the fpu a break.
	li	23,1		#Initialize CurCnt = 1
	fmr	17,16		#yRel into f17 as initial Zi.
	b	l3		#Check to see if to MaxCnt
l2:
	fmul	24,15,15	#Zr2 in f24
	fmul	4,17,17	#Zi2 = Zi*Zi
	fadd	19,24,4	#Zr2 + Zi2 -> f19
	fcmpu	0,19,23	#Compare with Limit in f23.
	ble	0,l6

#The following section is not very time-critical as it is only reached once.
#for each pixel
	cmpwi	0,28,2	#See if BPP < 2
	blt	0,l8
l7:
	slwi	10,23,2	#4 times CurCnt for offset in ColorTable32
	add	26,27,10	#Find location of pixel color in ColorTable32
	lwz	11,0(26)	#Get ARGB from ColorTable
	stw	11,0(25)	#Store color in LPixelBuf
	addi	25,25,4	#Point to next location in LPixelBuf
	b	l1
l8:	andi.	3,23,65535	#Prep Color as UWORD for PlotIt
	bl	PlotIt
l9:	b	l1
l6:


	fmul	20,4,14	#Zi2*3 -> f20
 	fmul	27,24,14	#3*Zr2 -> f27
	fsub	20,24,20	#Zr2 - 3*Zi2 -> f20
	fsub	27,27,4	#(3Zr2 - Zi2) -> f27
	fmul	20,20,15	#Zr*(Zr2 - 3Zi2) -> f20 = Zr3

	fmul	27,27,17	#Zi*(3Zr2 - Zi2) -> f27 = Zi3

	fmul	28,27,27	#Zi3*Zi3
	fmul	29,20,20	#Zr3*Zr3
	fmul	30,20,27	#Zr3*Zi3
	fsub	29,29,28	#Zr3*Zr3 - Zi3*Zi3 = Zr6
	fmul	17,30,22	#2*Zr3*Zi3 = Zi

#	fmr	24,29


	fadd	15,18,29	#New Zr = xRel + Zr2
	addi	23,23,1	#Increment CurCnt
	fadd	17,16,17	#Zi = Zi + yRel

l3:
	cmpw	0,23,24	#See if CurCnt < MaxCnt
	blt	0,l2		#Repeat until MaxCnt reached

	cmpwi	0,28,2	#See if BPP < 2
	blt	0,l11
l10:

	lis	12,4
	addi	12,12,-4
	add	26,27,12	#Find location of pixel color
	lwz	11,0(26)      #Get color

	stw	11,0(25)	#Store color in LPixelBuf
	addi	25,25,4	#Point to next pixel in buffer
	b	l1		#Was l12
l11:
	lis	11,1
	addi	3,11,-1	#ffff into r3 for PlotIt
	bl	PlotIt
l1:
	fadd	18,18,21	#Find new value of xRel (xRel = xRel + DX).
	addi	30,30,1	#Increment xtemp.
	cmpw	0,30,29	#See if to RightEdge

	blt	0,Start	#Repeat until row is done.
	lis	4,LPixelBuf@ha
	stw	25,LPixelBuf@l(4)  #New location in long pixel buffer
	addi	1,1,80        #Balance Stack pointer
	lwz	11,4(1)	#Get return address
	mtlr	11

	blr
	.type	UseLibP6,@function
	.size	UseLibP6,$-UseLibP6

	.globl	MaxCnt
	.globl	RightEdge
	.globl	XCenter
	.globl	Factor
	.globl	Limit
	.globl	Two
	.globl	LPixelBuf
	.globl	ColorTable32
	.globl	BPP
	.globl	DX
	.globl	PlotIt

