4 ; Wimp_Poll support for DLLs and applications that use them
9 ;----- Standard stuff -------------------------------------------------------
14 ;----- Main code ------------------------------------------------------------
16 AREA |DLL$$Code|,CODE,READONLY
18 ; --- _dll_wimpPoll ---
20 ; On entry: a1 == event mask
21 ; a2 == pointer to wimp poll block
22 ; a4 == pointer to poll word if bit 22 of a1 is set
23 ; On exit: a1 == reason code returned by Wimp_Poll
24 ; Other registers preserved
26 ; Floating point status is preserved if a1 on entry has bit 24 set and the
27 ; floating point emulator or hardware is present. The floating point
28 ; registers preserved are f4-f7 and the FPSR.
30 EXPORT |_dll_wimpPoll|
35 MOV v2,#0 ;Don't restore FP state
36 TST a1,#1<<24 ;Does caller want FP saved?
37 BIC v3,a1,#1<<24 ;We're doing it, not the WIMP
38 BEQ %00 ;No -- skip this bit
39 SWI XFPEmulator_Version ;Is the FPE/FPA there?
40 MOVVC v2,#1 ;Yes -- set flag to restore
41 BLVC save_fp ;Save the FP state
43 00 SWI XDLL_SaveHandle ;Get my application handle
44 MOV v1,a1 ;Look after it
45 MOV a1,v3 ;Restore event mask
46 SWI XWimp_Poll ;Do the SWI call
47 ORRVS v2,v2,#2 ;Set bit 1 of v2 if error
48 MOV v3,a1 ;Save the reason code/error
49 MOV a1,v1 ;Restore application handle
50 SWI XDLL_RestoreHandle ;Put the handle back again
51 MOV a1,v3 ;Restore event code/error
53 TST v2,#1 ;Is bit 0 set?
54 BLNE restore_fp ;Yes -- restore FP state
55 TST v2,#2 ;Was there an error?
56 LDMFD sp!,{v1-v3,lr} ;Restore all registers anyhow
57 BICEQS pc,lr,#V_flag ;No -- clear V flag
58 ORRS pc,lr,#V_flag ;Yes -- set V flag
62 ; --- _dll_wimpPollIdle ---
64 ; On entry: a1 == event mask
65 ; a2 == pointer to wimp poll block
66 ; a3 == earliest time to return with an idle event
67 ; a4 == pointer to poll word if bit 22 of a1 is set
68 ; On exit: a1 == reason code returned by Wimp_Poll
69 ; Other registers preserved
71 ; Floating point status is preserved if a1 on entry has bit 24 set and the
72 ; floating point emulator or hardware is present. The floating point
73 ; registers preserved are f4-f7 and the FPSR.
75 EXPORT |_dll_wimpPollIdle|
76 |_dll_wimpPollIdle| ROUT
80 MOV v2,#0 ;Don't restore FP state
81 TST a1,#1<<24 ;Does caller want FP saved?
82 BIC v3,a1,#1<<24 ;We're doing it, not the WIMP
83 BEQ %00 ;No -- skip this bit
84 SWI XFPEmulator_Version ;Is the FPE/FPA there?
85 MOVVC v2,#1 ;Yes -- set flag to restore
86 BLVC save_fp ;Save the FP state
88 00 SWI XDLL_SaveHandle ;Get my application handle
89 MOV v1,a1 ;Look after it
90 MOV a1,v3 ;Restore event mask
91 SWI XWimp_PollIdle ;Do the SWI call
92 ORRVS v2,v2,#2 ;Set bit 1 of v2 if error
93 MOV v3,a1 ;Save the reason code/error
94 MOV a1,v1 ;Restore application handle
95 SWI XDLL_RestoreHandle ;Put the handle back again
96 MOV a1,v3 ;Restore event code/error
98 TST v2,#1 ;Is bit 0 set?
99 BLNE restore_fp ;Yes -- restore FP state
100 TST v2,#2 ;Was there an error?
101 LDMFD sp!,{v1-v3,lr} ;Restore all registers anyhow
102 BICEQS pc,lr,#V_flag ;No -- clear V flag
103 ORRS pc,lr,#V_flag ;Yes -- set V flag
110 ; On exit: v1 corrupted
114 RFS v1 ;Read the FP status word
115 STMFD sp!,{v1} ;Stack it
116 MOV v1,#0 ;We will zero the FPSR
118 SUB sp,sp,#4*12 ;Leave space for 4 FP regs
119 STFE f4,[sp,#0*12] ;Stack F4
120 STFE f5,[sp,#1*12] ;Stack F5
121 STFE f6,[sp,#2*12] ;Stack F6
122 STFE f7,[sp,#3*12] ;Stack F7
123 MOVS pc,lr ;Return to caller
128 ; On exit: v1 corrupted
132 MOV v1,#0 ;We will zero the FPSR
134 LDFE f4,[sp,#0*12] ;Unstack F4
135 LDFE f5,[sp,#1*12] ;Unstack F5
136 LDFE f6,[sp,#2*12] ;Unstack F6
137 LDFE f7,[sp,#3*12] ;Unstack F7
138 ADD sp,sp,#4*12 ;Move stack ptr up past FP
139 LDMFD sp!,{v1} ;Restore FPSR
140 WFS v1 ;Write it to the FPSR
141 MOVS pc,lr ;Return to caller
143 ;----- That's all, folks ----------------------------------------------------