

	.text
	.thumb
	
	.global		fillRowByRow_th
	.thumb_func
	.type		fillRowByRow_th,function
	
@***********************************************************:
@*:
@*: fillRowByRow_th (füllen von puffern) 
@*:
@*: r0  = x
@*: r1  = y
@*: r2  = &setfunktion(x,y) (r0,r1)  @r0,r1,r10,r11,r12 for free use)
@*: r3  = &testfunktion(x,y) (r0,r1) @r0,r1,r10,r11,r12 for free use) r0 = return 0 == not set
@*:
	
fillRowByRow_th:

	push	{r4, r5, r6, r7, lr}
	mov	r7, r9
	mov	r6, r8
	push	{r6, r7}
	
	mov	r4, r0		@x
	mov	r5, r1		@y
		
	mov	r7, r2		@&setPixel
	mov	r6, r3		@&isPixel
	mov	r8, r0		@px =  x
	
	@r2,r3 = free
		
	@berechne rücksprungwerte
	
	mov	r2,pc
	mov	r3,r2				@pc
pcrel1:	add	r2,#(rbr_ir1+1-pcrel1)		@pc+2
pcrel2:	add	r3,#(rbr_sr1+1-pcrel2+2)	@pc+4
	
	@suche nach links
	
rbr_suchel:

	mov	r0, r4		@x
	mov	r1, r5		@y	
	mov	lr,r2
	bx	r6		@isPixel
rbr_ir1:	cmp	r0, #0		@wenn dann ist gesetzt
	bne	rbr_suchel_e
	
	mov	r0, r4		@x
	mov	r1, r5		@y
	mov	lr,r3
	bx	r7		@setPixel
rbr_sr1:	sub	r4, r4, #1	@x --
	b	rbr_suchel
	
rbr_suchel_e:

	@****

	add	r4, r4, #1	@x++
	mov	r9, r4		@lg = x (linke grenze = x)
	mov	r4, r8		@x  = px (alter x)
	
	@berechne rücksprungwerte
		
	mov	r2,pc
	mov	r3,r2				@pc
pcrel3:	add	r2,#(rbr_ir2+1-pcrel3)		@pc+2
pcrel4:	add	r3,#(rbr_sucher+1-pcrel4+2)	@pc+4
	
	@suche nach rechts
	
rbr_sucher:

	add	r4, r4, #1	@x++
	mov	r0, r4		@x
	mov	r1, r5		@y
	mov	lr,r2
	bx	r6
rbr_ir2:	cmp	r0, #0		@x
	bne	rbr_sucher_e
	
	mov	r0, r4		@x
	mov	r1, r5		@y
	mov	lr,r3
	bx	r7		
	@geht immer wieder nach rbr_sucher
		
rbr_sucher_e:

	@teste von rg bis lg ob pixel darüber oder darunter

	@r2,r3  = temp free (scratch in rekursion)
	
	@for(pos = rg@ pos >= lg@ pos--) 

	sub	r4, r4, #1	@pos--
	cmp	r4, r9		@pos=lg
	blt	rbr_sucheou_e	@pos<lg  dann raus
	
	sub	r0, r5, #1	@r3 = y-1
	mov	r8, r0		@r8 = y-1
	add	r5, r5, #1	@y++
	
rbr_sucheou:

	mov	r0, r4		@pos
	mov	r1, r8		@y
	mov	r2,#3
	mov	lr,pc
	add	lr,r2
	bx	r6		@isPixel
	cmp	r0, #0		@x
	beq	rbr_setLineOben
	
rbr_setLineOben_e:

	mov	r0, r4		@pos
	mov	r1, r5		@y
	mov	r2,#3
	mov	lr,pc
	add	lr,r2
	bx	r6		@isPixel
	cmp	r0, #0		@x
	beq	rbr_setLineUnten
	
rbr_setLineUnten_e:

	sub	r4, r4, #1	@pos--
	cmp	r4, r9		@solange pos>=lg
	bge	rbr_sucheou	@suche obenunten
	
rbr_sucheou_e:

	@ fkt ende 
	
	pop	{r3, r4}
	mov	r8, r3
	mov	r9, r4
	pop	{r4, r5, r6, r7}
	pop	{r0}
	bx	r0
	
	@ aufruf für suche line unter
	
rbr_setLineUnten:

	mov	r0, r4	@  pos
	mov	r1, r5	@  y
	mov	r2, r7	@  setPixel
	mov	r3, r6	@  isPixel
	bl	fillRowByRow_th
	
	b	rbr_setLineUnten_e
	
	@ aufruf für suche line oben
	
rbr_setLineOben:	

	mov	r0, r4	@  pos
	mov	r1, r8	@  y
	mov	r2, r7	@  setPixel
	mov	r3, r6	@  isPixel
	bl	fillRowByRow_th
	b	rbr_setLineOben_e

	.pool
	.end
	
	