blob: 562747adba8beb1137629e75206e415cb6812bcd [file] [log] [blame]
; Thomas Leonard
; 24/5/98
ar0 rn 0
ar1 rn 1
ar2 rn 2
ar3 rn 3
ar4 rn 4
ar5 rn 5
ar6 rn 6
ar7 rn 7
ar10 rn 10
ar11 rn 11
lk rn 14
ar15 rn 15
AREA DATA
align 4
export |r0|
r0: dcd 0
export |r1|
r1: dcd 0
export |r2|
r2: dcd 0
export |r3|
r3: dcd 0
export |r4|
r4: dcd 0
export |r5|
r5: dcd 0
export |r6|
r6: dcd 0
export |r7|
r7: dcd 0
export |time_of_last_poll|
time_of_last_poll: dcd 0
AREA CODE, READONLY
align 4
import |r0|
export |swi|
= "swi"
align 4
swi:
; r0 = swi number
stmfd sp!,{ar4-ar10,lk}
orr ar10,ar0,#1<<17 ;always use the X form
mov ar0,ar1
mov ar1,ar2
mov ar2,ar3
add ar3,sp,#4*8
ldmia ar3,{ar3-ar7}
swi 0x6f ; OS_CallASWI
ldr ar10,regs_addr
stmia ar10,{ar0-ar7}
ldmvcfd sp!,{ar4-ar10,pc}^
; report the error and quit on Cancel
mov r1,#0x17
adr r2,s_title
swi 0x400df ; Wimp_ReportError
cmp r1,#1 ;OK selected?
ldmeqfd sp!,{ar4-ar10,pc}^ ;yes - try to continue
swi 0x11 ;no - die (OS_Exit)
s_title:
= "Nasty error - Cancel to quit"
= 0
align 4
export |xswi|
= "xswi"
align 4
xswi:
; r0 = swi number
stmfd sp!,{ar4-ar10,lk}
orr ar10,ar0,#1<<17 ;always use the X form
mov ar0,ar1
mov ar1,ar2
mov ar2,ar3
add ar3,sp,#4*8
ldmia ar3,{ar3-ar7}
swi 0x6f ; OS_CallASWI
ldr ar10,regs_addr
stmia ar10,{ar0-ar7}
mov ar0,#0
orr ar0,ar0,ar15
ldmfd sp!,{ar4-ar10,pc}^
regs_addr:
dcd r0
; The Wimp_Poll swis have to be done specially because,
; for some reason, r13 sometimes gets corrupted by Wimp_Poll
; (eg when running FileFind)
AREA CODE, READONLY
align 4
import |time_of_last_poll|
export |wimp_poll|
= "wimp_poll"
align 4
wimp_poll:
mov ar3,sp
swi 0x400c7 ; Wimp_Poll
mov sp,ar3
mov ar3,ar0
swi 0x42 ; OS_ReadMonotonicTime
ldr ar2,addr_time
str ar0,[ar2]
mov ar0,ar3
mov ar2,#0
wfs ar2 ; Write floating point status. Needed?
movs pc,lk
align 4
export |wimp_pollidle|
= "wimp_pollidle"
align 4
wimp_pollidle:
mov ar3,sp
swi 0x400e1 ; Wimp_PollIdle
mov sp,ar3
mov ar3,ar0
swi 0x42 ; OS_ReadMonotonicTime
ldr ar2,addr_time
str ar0,[ar2]
mov ar0,ar3
mov ar2,#0
wfs ar2 ; Write floating point status. Needed?
movs pc,lk
addr_time: dcd time_of_last_poll