

	.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
	
	