;
; Copyright (C) 1994 George Leonidas Coulouris
;
; Program name	: PosterBrot
; Description	: Iterates given C, returns greyscale level
; Last modified	: 9 June 94
;

	xref _iterations

	xdef _IterateC

	section code

;	cx	- fp0
;	cy	- fp1
;	oldzx	- fp2
;	oldzy	- fp3
;	zx	- fp4
;	zy	- fp5

_IterateC:
	fmovem.x		fp2-fp6,-(sp)	; save registers

	move.w		_iterations,d0	; initialize
	fmovecr.x		#$0f,fp2
	fmovecr.x		#$0f,fp3

loop:
	fmove.x		fp2,fp4		; zx = oldzx^2 - oldzy^2 + cx
	fmul.x		fp4,fp4
	fmove.x		fp3,fp6
	fmul.x		fp6,fp6
	fsub.x		fp6,fp4
	fadd.x		fp0,fp4

	fmove.x		fp2,fp5		; zy = 2 * oldzx * oldzy + cy
	fmul.x		fp3,fp5
	fmul.x		#2.0,fp5
	fadd.x		fp1,fp5

	fmove.x		fp4,fp2		; oldzx = zx
	fmove.x		fp5,fp3		; oldzy = zy

	fmul.x		fp4,fp4		; r^2 = zx^2 + zy^2
	fmul.x		fp5,fp5
	fadd.x		fp5,fp4

	fcmp.x		#4.0,fp4
	fbgt.l		escape		; if r^2 > 4 then escape
	dbra			d0,loop		; else, iterate

jumpout:
	move.w		#255,d0
	bra			outtahere

escape:
	fsqrt.x		fp4,fp4
	fmove.x		#510.0,fp5
	fdiv.x		fp4,fp5
 	fmove.w		fp5,d0
	bra			outtahere

outtahere:
	fmovem.x		(sp)+,fp2-fp6		; restore registers
	rts
	end
