summaryrefslogtreecommitdiff
path: root/src/swis.s
diff options
context:
space:
mode:
authorvimboss <devnull@localhost>2004-06-13 20:20:40 +0000
committervimboss <devnull@localhost>2004-06-13 20:20:40 +0000
commit7edfa5bad3d3bf32e8c14461cfe4ab5c768401cc (patch)
tree221cbe3c40e043163c06f61c52a7ba2eb41e12ce /src/swis.s
parent9c7ddf7723deb142fa98aaf4842ec351dd8fce2a (diff)
downloadvim-7edfa5bad3d3bf32e8c14461cfe4ab5c768401cc.tar.gz
updated for version 7.0001v7.0001v7-0001
Diffstat (limited to 'src/swis.s')
-rw-r--r--src/swis.s143
1 files changed, 143 insertions, 0 deletions
diff --git a/src/swis.s b/src/swis.s
new file mode 100644
index 00000000..562747ad
--- /dev/null
+++ b/src/swis.s
@@ -0,0 +1,143 @@
+; 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