1; Thomas Leonard 2; 24/5/98 3 4ar0 rn 0 5ar1 rn 1 6ar2 rn 2 7ar3 rn 3 8ar4 rn 4 9ar5 rn 5 10ar6 rn 6 11ar7 rn 7 12ar10 rn 10 13ar11 rn 11 14lk rn 14 15ar15 rn 15 16 17 AREA DATA 18 align 4 19 20 export |r0| 21r0: dcd 0 22 23 export |r1| 24r1: dcd 0 25 26 export |r2| 27r2: dcd 0 28 29 export |r3| 30r3: dcd 0 31 32 export |r4| 33r4: dcd 0 34 35 export |r5| 36r5: dcd 0 37 38 export |r6| 39r6: dcd 0 40 41 export |r7| 42r7: dcd 0 43 44 export |time_of_last_poll| 45time_of_last_poll: dcd 0 46 47 AREA CODE, READONLY 48 align 4 49 import |r0| 50 export |swi| 51 = "swi" 52 align 4 53swi: 54 ; r0 = swi number 55 stmfd sp!,{ar4-ar10,lk} 56 orr ar10,ar0,#1<<17 ;always use the X form 57 mov ar0,ar1 58 mov ar1,ar2 59 mov ar2,ar3 60 add ar3,sp,#4*8 61 ldmia ar3,{ar3-ar7} 62 swi 0x6f ; OS_CallASWI 63 ldr ar10,regs_addr 64 stmia ar10,{ar0-ar7} 65 ldmvcfd sp!,{ar4-ar10,pc}^ 66 ; report the error and quit on Cancel 67 mov r1,#0x17 68 adr r2,s_title 69 swi 0x400df ; Wimp_ReportError 70 cmp r1,#1 ;OK selected? 71 ldmeqfd sp!,{ar4-ar10,pc}^ ;yes - try to continue 72 swi 0x11 ;no - die (OS_Exit) 73s_title: 74 = "Nasty error - Cancel to quit" 75 = 0 76 77 align 4 78 export |xswi| 79 = "xswi" 80 align 4 81xswi: 82 ; r0 = swi number 83 stmfd sp!,{ar4-ar10,lk} 84 orr ar10,ar0,#1<<17 ;always use the X form 85 mov ar0,ar1 86 mov ar1,ar2 87 mov ar2,ar3 88 add ar3,sp,#4*8 89 ldmia ar3,{ar3-ar7} 90 swi 0x6f ; OS_CallASWI 91 ldr ar10,regs_addr 92 stmia ar10,{ar0-ar7} 93 mov ar0,#0 94 orr ar0,ar0,ar15 95 ldmfd sp!,{ar4-ar10,pc}^ 96 97regs_addr: 98 dcd r0 99 100 ; The Wimp_Poll swis have to be done specially because, 101 ; for some reason, r13 sometimes gets corrupted by Wimp_Poll 102 ; (eg when running FileFind) 103 AREA CODE, READONLY 104 align 4 105 import |time_of_last_poll| 106 export |wimp_poll| 107 = "wimp_poll" 108 align 4 109wimp_poll: 110 mov ar3,sp 111 swi 0x400c7 ; Wimp_Poll 112 mov sp,ar3 113 114 mov ar3,ar0 115 swi 0x42 ; OS_ReadMonotonicTime 116 ldr ar2,addr_time 117 str ar0,[ar2] 118 mov ar0,ar3 119 120 mov ar2,#0 121 wfs ar2 ; Write floating point status. Needed? 122 movs pc,lk 123 124 align 4 125 export |wimp_pollidle| 126 = "wimp_pollidle" 127 align 4 128wimp_pollidle: 129 mov ar3,sp 130 swi 0x400e1 ; Wimp_PollIdle 131 mov sp,ar3 132 133 mov ar3,ar0 134 swi 0x42 ; OS_ReadMonotonicTime 135 ldr ar2,addr_time 136 str ar0,[ar2] 137 mov ar0,ar3 138 139 mov ar2,#0 140 wfs ar2 ; Write floating point status. Needed? 141 movs pc,lk 142 143addr_time: dcd time_of_last_poll 144