
@********************************************************************:
@*:
@*: rand
@*:
@*:
	.global		rand
	.type		rand,function	
rand:

	stmfd	sp!,{r2,r3,r4}
	ldr r3,= seed		
	ldmia	r3, {r1,r2}		
	tst	r2, r2, lsr #1		
	movs	r4, r1, rrx		
	adc	r2, r2, r2		
	eor	r4, r4, r1, lsl #12	
	eor	r1, r4, r4, lsr #20	
	stmia	r3, {r1,r2}	
	ldmfd	sp!,{r2,r3,r4}	
	bx	lr
	.global		udiv3
	.global		udiv5
	.global		udiv10

udiv3:

        sub     r2, r1, #3
        mov     r1, r1, lsr #1
        add     r1, r1, r1, lsr #2
        add     r1, r1, r1, lsr #4
        add     r1, r1, r1, lsr #8
        add     r1, r1, r1, lsr #16
        mov     r1, r1, lsr #1
        rsb     r3, r1, r1, lsl #2
        subs    r2, r2, r3, lsl #0
        addpl   r1, r1, #1
        addmi   r2, r2, #3
        cmp     r2, #3
        addge   r1, r1, #1
        subge   r2, r2, #3
        mov     pc, lr

     
udiv5:
        sub     r2, r1, #5
        sub     r1, r1, r1, lsr #2
        add     r1, r1, r1, lsr #4
        add     r1, r1, r1, lsr #8
        add     r1, r1, r1, lsr #16
        mov     r1, r1, lsr #2
        add     r3, r1, r1, lsl #2
        subs    r2, r2, r3, lsl #0
        addpl   r1, r1, #1
        addmi   r2, r2, #5
        mov     pc, lr

     
udiv10:
        sub     r2, r1, #10
        sub     r1, r1, r1, lsr #2
        add     r1, r1, r1, lsr #4
        add     r1, r1, r1, lsr #8
        add     r1, r1, r1, lsr #16
        mov     r1, r1, lsr #3
        add     r3, r1, r1, lsl #2
        subs    r2, r2, r3, lsl #1
        addpl   r1, r1, #1
        addmi   r2, r2, #10
        mov     pc, lr


@***************************: stackcheck
@*:
@* return: r0 = ~ max stackusage
@*:
@**:

	.global	stackcheck

stackcheck:
	
	ldr r0,=mystackend
	ldr r1,=mystack
	ldr	r3,=0xabcddcba

sttr:	cmp	r0,r1
	beq	stckef
	ldr	r2,[r0],#4
	cmp	r2,r3
	beq	sttr	

stckef:

	sub	r0,r1,r0
	mov	pc,lr

@***************************: dma copy
@*:
@*: löscht (mit 0 besetzen) speicherbereich r1 von der länge r2 
@*: (r1=long aligned, r2=/4 teilbarer size)
@*:
@*: r1 = dest	(32bit aligned)
@*: r2 = size (durch 4 teilbar)
@*:
@*:


	.global	memclear32
	.type	memclear32,function	

memclear32:

	cmp	r2,#0			@wenn 0 dann raus
	bxeq	lr

	stmfd	sp!,{r0,r2,r3}

	mov	r3,#0
	stmfd	sp!,{r3}		@0 in den stack
	
	mov	r0,sp			@quelle ist stack

	tst	r2,#3			@durch 4 teilbar
	bicne	r2,r2,#3		@wenn nicht dann 
	addne	r2,r2,#4		@aufrunden
	mov	r2,r2, lsr #2		@size / 4
	
	ldr	r3,=0x40000d4		@dma
	orr	r2,r2,#0x85000000	@32bit source adr. not modify
	stmia	r3,{r0,r1,r2}		@start
	
	add	sp,sp,#4		@clean stack

	ldmfd	sp!,{r0,r2,r3}
	bx	lr

@***************************: dma copy
@*:
@*: löscht (mit X besetzen) speicherbereich r1 von der länge r2 
@*: (r1=long aligned, r2=/4 teilbarer size)
@*:
@*: r0 = füllbyte  
@*: r1 = dest	 (32bit aligned)
@*: r2 = size (durch 4 teilbar)
@*:
@*:


	.global	memset32
	.type	memset32,function	

memset32:

	cmp	r2,#0			@wenn 0 dann raus
	bxeq	lr

	stmfd	sp!,{r0,r2,r3}

	mov	r3,r0
	orr	r3,r3,r3, lsl #8
	orr	r3,r3,r3, lsl #16
	stmfd	sp!,{r3}		@0 in den stack
	
	mov	r0,sp			@quelle ist stack

	tst	r2,#3			@durch 4 teilbar
	bicne	r2,r2,#3		@wenn nicht dann 
	addne	r2,r2,#4		@aufrunden
	mov	r2,r2, lsr #2		@size / 4
	
	ldr	r3,=0x40000d4		@dma
	orr	r2,r2,#0x85000000	@32bit source adr. not modify
	stmia	r3,{r0,r1,r2}		@start
	
	add	sp,sp,#4		@clean stack

	ldmfd	sp!,{r0,r2,r3}
	bx	lr

@***************************: wait for line 
@*:
@*: r2 = line
@*:
@**:

	.global	wait

wait:
	stmfd 	sp!,{r0,r1}

	mov	r1,#0x4000000
        
waitv:	ldrh	r0,[r1,#6]
	cmp	r0,r2
	bne	waitv	 

	ldmfd	sp!,{r0,r1}
	bx	lr
	
@***************************: dma copy
@*:
@*: r0 = source
@*: r1 = destination 
@*: r2 = size (durch 4 teilbar)
@*:
@**:

	.global	dmacpy

dmacpy:
	cmp	r2,#0			@wenn 0 dann raus
	bxeq	lr
	
	tst	r2,#3			@durch 4 teilbar
	bicne	r2,r2,#3		@wenn nicht dann 
	addne	r2,r2,#4		@aufrunden
	mov	r2,r2, lsr #2		@/4
	
	ldr	r3,=0x40000d4
	orr	r2,r2,#0x84000000
	stmia	r3,{r0,r1,r2}			
	bx 	lr	

	.pool
	
	
	.SECTION    .iwram,"ax"  
    	.ARM
    	
    	.local		seed
seed:	.word		0x12345678    

	.end