		
;drawc
;
;	;***
;	stmfd	sp!,{r0-r11,lr}
;	
;	ldr	r2,=font_tab
;	ldrb	r2,[r2,r1]
;	
;	mov	r3,r2,lsr #4	;Start
;	and	r2,r2,#$f	;End
;	sub	r2,r2,r3	;End-Start
;	
;	ldr	r0,=font_16
;	add	r0,r0,r1,lsl #5	;*32
;	
;	
;	mov	r3,r3,lsl #2	;r3*4
;	
;	mov	r6,r12			;X-Verschiebung
;	add	r12,r12,r2,lsl #2	;+Breite
;
;	bic	r5,r6,#$1f		;/32 
;	add	r2,r5,r11 		;*32 (/32*32 gleiche wie &~$1f)
;	
;	and	r6,r6,#$1f		;r6%32
;	rsb	r7,r6,#32
	
;	mvn	r10,#0
	
	
;rlline	
;	ldr	r4,[r0],#4
;	mov	r4,r4,lsr r3	;nach links an rand
;	mov	r4,r4,ror r7	;+verschiebung
;	mov	r8,r10,lsl r6	;maske auch verschieben
;	and	r11,r4,r8	;teil1 raus
	
;	ldr	r1,[r2]
;	orr	r1,r1,r11
;	str	r1,[r2],#4	
	
;	bics	r4,r4,r8	;wenn 32bit überlauf dann schreibe den
;	ldrne	r1,[r2,#32-4]	
;	orrne	r1,r1,r4
;	strne	r1,[r2,#32-4]	
	
;	subs	r5,r5,#1
;	bne	rlline

;	ldmfd	sp!,{r0-r11,lr}
;	bx	lr

	.align	4
	.thumb

;****************************************************************************
;*
;* drawc8X4_th (zeichnet Buchstabe in Dest (nichtsymetrisch))
;*
;* r0  = font 		(8*X 4Bit)
;* r1  = buchstabe	(auch mehr als 8Bit erlaubt)
;* r2  = font_tab	(buchstaben infos (start,breite))
;* r9  = tileoffset	(bei höhe > 8 (fonttilelinesize:screentilelinesize)
;* r10 = font_höhe	
;* r11 = destination	(es wird 8*8 4Bit Teile gezeichnet)
;* r12 = XStart		(X Beginn)
;*
;* return:
;*
;* r12 = neuer XWert
;*
;* wastes r0-r3,r8-r11
;* saves  r4-r7
;*

	.global		drawc8X4_th
	.type		drawc8X4_th,function	

drawc8X4_th

	mov	r3,lr
	push	{r3-r7}

	ldrb	r2,[r2,r1]
	
	mov	r5,#$f
	lsr	r3,r2,#4	;Start
	and	r2,r5		;End
	sub	r2,r2,r3	;End-Start

	
	lsl	r5,r1,#5
	add	r0,r0,r5	;r0+r1*32
	
	lsl	r3,r3,#2	;r3*4
	
	mov	r6,r12		;X-Verschiebung
	lsl	r2,r2,#2	;+Breite
	add	r12,r2

	lsr	r2,r6,#5	;add basepointer + x-versiebung (bic $1f)
	lsl	r2,r2,#5
	add	r2,r11	
	
	;r11 = free
	
	mov	r4,#32
	mov	r5,r9		;r5 = CHAR:FONT
	lsl	r4,r4,#16
	sub	r5,r5,#32	;FONT - 32 (-1 Teil)
	sub	r5,r5,r4	;CHAR - 32 (-1 Teil)
	mov	r11,r5		;r11 = CHAR-32:FONT-32

	mov	r5,#$1f
	and	r6,r5		;r6%32
	
	mov	r5,#32
	sub	r7,r5,r6
	
	;r10 = anzahl
	

	mov	lr,r10		;r11=anzahl
	mov	r5,r10
	lsr	r5,r5,#3
	add	r5,r5,#1
	mov	r10,r5		;r10 = count = (anzahl/8)+1;

rltile_th	

	mov	r4,#1
	mov	r5,#8		;rest = default = 8
	
	cmp	r10,r4		;count = 1 dann letzter durchlauf (rest bestimmen)		
	bne	nicht_letzter
		
	mov	r5,lr
	mov	r4,#$7
	and	r5,r4		;rest = anzahl%8;
	beq	no_rest		;rest == 0
	
nicht_letzter
rlline_th	
	
	ldmia	r0!,{r4}
		
	lsr	r4,r3		;nach links an rand (und test ob null)
	beq	no_normal_draw
	
	mov	r1,#0		;maske = 0
	ror	r4,r7		;+verschiebung	(rolle)	

	mvn	r1,r1		;maske (sets no flags) = maske = $ffffffff
	lsl	r1,r1,r6	;maske auch verschieben
	mov	r8,r1
	mov	r9,r4
	and	r4,r4,r1	;teil1 raus
	beq	no_first_draw	;leer
	
	ldr	r1,[r2]
	orr	r1,r4
	str	r1,[r2]
	
no_first_draw	

	mov	r1,r8		;maske
	mov	r4,r9		;daten
	
	bic	r4,r1		;lösch alte daten
	beq	no_overlay_draw	;wenn null da kein overlay
	
	ldr	r1,[r2,#32]
	orr	r1,r4
	str	r1,[r2,#32]
	
no_normal_draw	
no_overlay_draw
		
	add	r2,r2,#4	;nächste zeile
	sub	r5,r5,#1
	bne	rlline_th

	;fonttilelinesize:screentilelinesize=r11

	mov	r5,r11
	lsr	r4,r5,#16	;r4 = fonttilelinesize
	add	r0,r0,r4	;font+=r4
	
	lsl	r5,r5,#16
	lsr	r5,r5,#16	;screentilelinesize
	add	r2,r2,r5
	
no_rest	
	mov	r5,r10
	sub	r5,r5,#1
	mov	r10,r5
	bne	rltile_th
	
	
	pop	{r3-r7}
	bx	r3

