

;****************************************
;*
;* b2wchar (8Bit char to 16Bit char)
;*
;* r0 = ascii zeichen
;* r1 = ascii zeichen 16 bit
;*

b2wchar

	.global	b2wchar
	.type	b2wchar,function
	
b2wc	ldrb	r2,[r0],#1
	cmp	r2,#0
	sub	r2,r2,#32
	strneh	r2,[r1],#2
	bne	b2wc

	bx	lr

;****************************************
;*
;* drawc (Draw Char on Screen)
;*
;* r0 = ascii zeichen
;* r1 = mapbase ($6001000)
;* r2 = x
;* r3 = y
;*

	.global	drawc

drawc:	stmfd	sp!,{r0,r1}
	
	add	r1,r1,r2, lsl #1	
	add	r1,r1,r3, lsl #6	
	sub	r0,r0,#32
	strh	r0,[r1]

	ldmfd	sp!,{r0,r1}
	bx	lr
	
;****************************************
;*
;* puts (Draw String on Screen)
;*
;* r0 = string
;* r1 = mapbase ($6001000)
;* r2 = x
;* r3 = y
;*	
	
	.global	puts
	
puts:	stmfd	sp!,{r0,r1,r4,lr}

	mov	r4,r0

pulo:	ldrb	r0,[r4],#1	
	cmp	r0,#0
	beq	pulo_end
	
	bl	drawc
	
	;**** ränder abtesten
	
	add	r2,r2,#1
	cmp	r2,#30
	moveq	r2,#0
	addeq	r3,r3,#1
	cmp	r3,#20
	moveq	r3,#0
	
	b	pulo
pulo_end:	
	

	ldmfd	sp!,{r0,r1,r4,lr}
	bx	lr	
	
;****************************************
;*
;* clrscr (bildschirm löschen)
;*
;* r1 = mapbase ($6001000)
;*

	.global	clrscr

clrscr:	
	stmfd	sp!,{r0-r2,lr}
	
	mov	r0,#(32*32)/2
	mov	r2,#0
clrlp:	
	str	r2,[r1],#4
	subs	r0,r0,#1
	bne 	clrlp
	
	ldmfd	sp!,{r0-r2,lr}
	bx	lr

;****************************************
;*
;* puts_hex (Draw Hex on Screen)
;*
;* r0 = value
;* r1 = mapbase ($6001000)
;* r2 = x
;* r3 = y
;*	
	
	.global	puts_hex
	
puts_hex:

	stmfd	sp!,{r0,r1,r4,r5,r6,r7,lr}

	mov	r4,r0
	mov	r5,#0		;führende 0, 0 = nicht printen

	mov	r6,#8
puhlo:	
	sub	r7,r6,#1
	mov	r7,r7, lsl #2
	mov	r7,r4, lsr r7
	and	r7,r7,#$f
	cmp	r7,#0
	bne	drawh		;keine null dann zeichnen
	cmp	r5,#0
	beq	drawhno		;ist einen null und führende zeichen ist auch null dann nächste hex
	
drawh:	
	mov	r5,#1		;führende null aus
	cmp	r7,#9
	addle	r0,r7,#'0'
	addgt	r0,r7,#'a'-10

	bl	drawc

	;**** ränder abtesten
	
	add	r2,r2,#1
	cmp	r2,#30
	moveq	r2,#0
	addeq	r3,r3,#1
	cmp	r3,#20
	moveq	r3,#0
	
drawhno:
	cmp	r6,#2		;letzte zahl auch 0 erlaubt
	moveq	r5,#1

	subs	r6,r6,#1
	bne	puhlo
puhlo_end:	
	ldmfd	sp!,{r0,r1,r4,r5,r6,r7,lr}
	bx	lr
	
;****************************************
;*
;* puts_dec (Dez Hex on Screen)
;*
;* r0 = value
;* r1 = mapbase ($6001000)
;* r2 = x
;* r3 = y
;*	
	
	.global	puts_dec
	
puts_dec:

	stmfd	sp!,{r0,r2,r4,r5,r6,r12,lr}

	mov	r12,sp
	
	mov	r4,r1
	mov	r5,r2
	mov	r6,r3
	
	sub	sp,sp,#1
	mov	r2,#0
	strb	r2,[sp]
zdivlo:
	mov	r1,r0
	bl	udiv10		;r1/10 , r2=r1%10 is mod
	mov	r0,r1
	
	sub	sp,sp,#1
	add	r2,r2,#'0'
	strb	r2,[sp]

	cmp	r0,#0
	bne	zdivlo
	
	mov	r0,sp
	mov	r1,r4
	mov	r2,r5
	mov	r3,r6
		
	bl	puts
	
	mov	sp,r12
	ldmfd	sp!,{r0,r2,r4,r5,r6,r12,lr}
	bx	lr
	
	.end