; Assembler source code module for some functions
; used in BDotD.
; Written for AS, but shouldn't cause trouble for other assemblers :-)

r0	rn	0
r1	rn	1
r2	rn	2
r3	rn	3
r4	rn	4
r5	rn	5
r6	rn	6
r7	rn	7
r8	rn	8
r9	rn	9
r10	rn	10
r11	rn	11
r12	rn	12
sp	rn	13
lr	rn	14
pc	rn	15


XOS_FSControl	equ	&20029

	area	|Moogle's_Code| , CODE, READONLY
	import	malloc
	import	printf
	import	exit
	import	free

canonicalise_code:			; char *canonicalise_code( char *path )
	stmfd	sp!,{r1-r5,lr}		; stack registers
	mov	r1,r0			; r1 = (int) path
	stmfd	sp!,{r1}
	mov	r0,#37			; reason code
	mov	r2,#0			; we only want the
	mov	r3,#0			;    required buffer
	mov	r4,#0			;    size at the mo.
	mov	r5,#0			;    so all these are zilch
	swi	XOS_FSControl		; find buffer size
	bvs	error1			; trap any, ahem, ooopses
	rsb	r5,r5,#1		; buffer size needed is 1 - R5 bytes
	mov	r0,r5			; argument for malloc
	bl	malloc			; malloc the storage
	cmp	r0,#0			; malloc failed?
	ldmfd	sp!,{r1}		;
	beq	errorm			; trap it
	mov	r2,r0			; pointer to buffer
	mov	r0,#37			; reason code (again)
	swi	XOS_FSControl		; canonicalise the path
	bvs	error2			; trap any oopses
	mov	r0,r2			; return the buffer ptr
	ldmfd	sp!,{r1-r5,pc}^		; exit

error2:	mov	r1,r0			; preserve r0 (the error ptr)
	mov	r0,r2			; ->buffer
	bl	free			; free the buffer
	add	r1,r1,#4		; we want the error text
	adr	r0,err2_text		; format string
	bl	printf
	b	die

errorm:	adr	r0,oom_text		; -> error message
	bl	printf
	b	die

error1:	ldmfd	sp!,{r1}
	add	r1,r0,#4		; error is 2nd arg
	adr	r0,err1_text		; format string
	bl	printf			; print error

die:
	ldmfd	sp!,{r1-r5,lr}		; restore regs
	mov	r0,#1			; argument to exit()
	b	exit			; die (in horrible pain)

oom_text	=	"Out of memory (in canonicalise_path)", 0
err1_text	=	"Error (in canonicalise_path/1): %s\n", 0
err2_text	=	"Error (in canonicalise_path/2): %s\n", 0

	align
	export canonicalise_code

end
