
macro loadrma m0,m1
;load filename m0 in rma, return address in m1
{
STMFD R13!,{R0-R4}
MOV R1,m0
filelength R1,R2
MOVVS R2,#4  ;R2 is used internally as an error type marker
BVS _LOADRMA1
MOVNE R2,R0
BNE _LOADRMA1
STMFD R13!,{R0,R2-R3}
ADD R3,R2,#3
BIC R3,R3,#3
MOV R0,#6
SWI XOS_Module
MOVVS R14,R0
MOVVC R14,R2
LDMFD R13!,{R0,R2-R3}
MOVVS R0,R14
MOVVC R2,R14
MOVVS R14,R0
BVS _LOADRMA2
STMFD R13!,{R0-R3}
MOV R1,R1
MOV R2,R2
MOV R0,#255
MOV R3,#0
SWI XOS_File
MOVVS R14,R0
LDMFD R13!,{R0-R3}
MOVVS R0,R14
MOV R14,R2
BVC _LOADRMA2
STMFD R13!,{R0}
STMFD R13!,{R0,R2}
;MOV R2,R2
MOV R0,#7
SWI XOS_Module
MOVVS R14,R0
LDMFD R13!,{R0,R2}
MOVVS R0,R14
LDMFD R13!,{R0}
MOV R2,#4
._LOADRMA1
CMP R2,#0
CMPNE R2,#2
MOVEQ R0,#19
SWIEQ XOS_File
MOV R14,R0
._LOADRMA2
LDMFD R13!,{R0-R4}
MOVVC m1,R14
MOVVS R0,R14
}

macro claimrma m0,m1
{
STMFD R13!,{R0,R2-R3}
ADD R3,m0,#3
BIC R3,R3,#3
MOV R0,#6
SWI XOS_Module
MOVVS R14,R0
MOVVC R14,R2
LDMFD R13!,{R0,R2-R3}
MOVVS R0,R14
MOVVC m1,R14
}

macro releaserma m0
;VS error
{
STMFD R13!,{R0,R2}
MOV R2,m0
MOV R0,#7
SWI XOS_Module
MOVVS R14,R0
LDMFD R13!,{R0,R2}
MOVVS R0,R14
}

macro filelength m0,m1
;VS if error
;NE if not a file, type in R0.
{
STMFD R13!,{R0-R5}
MOV R1,m0
MOV R0,#5
SWI XOS_File
MOV R14,R4
MOVVS R14,R0
MOVVS R0,#0
CMP R0,#1
MOVNE R14,R0
LDMFD R13!,{R0-R5}
MOVVC m1,R14
MOVNE R0,R14
MOVVS R0,R14
}

macro getfiletype m0,m1
;VS if error
;m1=0 if unable to find
{
STMFD R13!,{R0-R6}
MOV R0,#20
MOV R1,m0
SWI XOS_File
MOV R14,R6
CMP R0,#0
MOVEQ R14,#0
MOVVS R14,R0
LDMFD R13!,{R0-R6}
MOVVC m1,R14
MOVVS R0,R14
}


macro loadfile m0,m1
;filename in m0, load adress in m1
{
STMFD R13!,{R0-R3}
MOV R1,m0
MOV R2,m1
MOV R0,#255
MOV R3,#0
SWI XOS_File
MOVVS R14,R0
LDMFD R13!,{R0-R3}
MOVVS R0,R14
}

macro MYDIV m0,m1,m2,t0
{
TST R13,#3
MOVNE PC,#0
CMP m1,#0
RSBLT m1,m1,#0
EORLT R13,R13,#1
CMP m2,#0
RSBLT m2,m2,#0
EORLT R13,R13,#2
BNE _MYDIV4
CMP m1,#0
MOVEQ m0,#0
MOVNE m0,#&7f000000
B _MYDIV1
._MYDIV4
MOV t0,#1
._MYDIV2
CMP m2,#&80000000
CMPCC m2,m1
MOVCC m2,m2,LSL #1
MOVCC t0,t0,LSL #1
BCC _MYDIV2
MOV m0,#0
._MYDIV3
CMP m1,m2
SUBCS m1,m1,m2
ADDCS m0,m0,t0
MOVS t0,t0,LSR #1
MOVNE m2,m2,LSR #1
BNE _MYDIV3
._MYDIV1
TST R13,#2
RSBNE m2,m2,#0
TST R13,#1
RSBNE m1,m1,#0
EORNE R13,R13,#2
TST R13,#2
RSBNE m0,m0,#0
BIC R13,R13,#3
}
