; HzN 18.04.2003: 32 Bit
;     Alle Rueckspruenge der Form  ldmdb  fp, {r1-r9, fp, sp, pc}^
;     umgesetzt in                 ldmdb  fp, {r1-r9, fp, sp, pc}


	AREA 	Routines,CODE


	EXPORT 	zonecheck
	EXPORT  module_base
	EXPORT	bbchecksum
	EXPORT	deflistchecksum
	EXPORT	dircheckset
	EXPORT	dirchecksum
	IMPORT	|Image$$RO$$Base|
	IMPORT	|x$stack_overflow|

	; void zonecheck(char *start,int len)
zonecheck

	mov	ip, sp
	stmfd	sp!, {r1-r9, fp, ip, lr, pc}
	sub	fp, ip, #4
	cmps	sp,sl
	bllt	|x$stack_overflow|
	mov 	lr,#0
	adds    r1,r1,r0
zonecheck_1
	ldmdb 	r1!,{r2-r9}
	adcs	lr,lr,r9
	adcs	lr,lr,r8
	adcs	lr,lr,r7
	adcs	lr,lr,r6
	adcs	lr,lr,r5
	adcs	lr,lr,r4
	adcs	lr,lr,r3
	adcs	lr,lr,r2
	teq	r1,r0
	bne	zonecheck_1
	and	r2,r2,#&FF
	sub	lr,lr,r2
	eor	lr,lr,lr,lsr #16
	eor	lr,lr,lr,lsr #8
	and	lr,lr,#&FF
	mov	r0,lr
	ldmdb	fp, {r1-r9, fp, sp, pc}

	; void bbchecksum(char *start,int len)
bbchecksum

	mov	ip, sp
	stmfd	sp!, {r1-r9, fp, ip, lr, pc}
	sub	fp, ip, #4
	cmps	sp,sl
	bllt	|x$stack_overflow|

	adds	lr,r0,r1
	sub 	r1,lr,#1
	mov	r2,#0
	b	bbchecksum_2
bbchecksum_1
	ldrb	lr,[r1,#-1]!
	adc	r2,r2,lr
	movs	r2,r2,lsl #24
	mov	r2,r2,lsr #24
bbchecksum_2
	teq	r0,r1
	bne	bbchecksum_1
	mov	r0,r2
	ldmdb	fp, {r1-r9, fp, sp, pc}

	; void deflistchecksum(char *start,char *end)
deflistchecksum

	mov	ip, sp
	stmfd	sp!, {r1-r9, fp, ip, lr, pc}
	sub	fp, ip, #4
	cmps	sp,sl
	bllt	|x$stack_overflow|
	mov	r2,#0
deflistchecksum_1
	cmp	r0,r1
	bhs	deflistchecksum_2
	ldr	r3,[r0],#4
	eor	r2,r3,r2,ror #13
	b	deflistchecksum_1
deflistchecksum_2
	eor	r2,r2,r2,lsr #16
	eor	r2,r2,r2,lsr #8
	and	r2,r2,#255
	orr	r2,r2,#&20000000
	str	r2,[r1]
	ldmdb	fp, {r1-r9, fp, sp, pc}

	; void dirchecksum(int val)
dirchecksum
	mov	ip, sp
	stmfd	sp!, {r1-r9, fp, ip, lr, pc}
	sub	fp, ip, #4
	cmps	sp,sl
	bllt	|x$stack_overflow|
	ldr	r1,dchecksum
	eor	r1,r0,r1,ror#13
	str	r1,dchecksum
	mov	r0,r1
	ldmdb	fp, {r1-r9, fp, sp, pc}

dchecksum
	&	0

	; void dircheckset(void)
dircheckset
	mov	ip, sp
	stmfd	sp!, {r1-r9, fp, ip, lr, pc}
	sub	fp, ip, #4
	cmps	sp,sl
	bllt	|x$stack_overflow|
	mov	r0,#0
	str	r0,dchecksum
	ldmdb	fp, {r1-r9, fp, sp, pc}

	AREA	Code_Description,DATA,REL
module_base
	DCD	|Image$$RO$$Base|
	END


