1
2
3 #define if2 if12
4 #define f2Op1 f12Op1
5 #define f2Op2 f12Op2
6 #define f2Flag1 f12Flag1
7 #define f2Flag2 f12Flag2
8
9 #define F2END() \
10 return 2+amLength1+amLength2;
11
12 #define F2LOADOPFLOAT(num) \
13 if (f2Flag##num) \
14 appf = u2f(v60.reg[f2Op##num]); \
15 else \
16 appf = u2f(MemRead32(f2Op##num));
17
18 #define F2STOREOPFLOAT(num) \
19 if (f2Flag##num) \
20 v60.reg[f2Op##num] = f2u(appf); \
21 else \
22 MemWrite32(f2Op##num, f2u(appf));
23
F2DecodeFirstOperand(UINT32 (* DecodeOp1)(void),UINT8 dim1)24 static void F2DecodeFirstOperand(UINT32 (*DecodeOp1)(void), UINT8 dim1)
25 {
26 modDim = dim1;
27 modM = if2 & 0x40;
28 modAdd = PC + 2;
29 amLength1 = DecodeOp1();
30 f2Op1 = amOut;
31 f2Flag1 = amFlag;
32 }
33
F2DecodeSecondOperand(UINT32 (* DecodeOp2)(void),UINT8 dim2)34 static void F2DecodeSecondOperand(UINT32 (*DecodeOp2)(void), UINT8 dim2)
35 {
36 modDim = dim2;
37 modM = if2 & 0x20;
38 modAdd = PC + 2 + amLength1;
39 amLength2 = DecodeOp2();
40 f2Op2 = amOut;
41 f2Flag2 = amFlag;
42 }
43
F2WriteSecondOperand(UINT8 dim2)44 static void F2WriteSecondOperand(UINT8 dim2)
45 {
46 modDim = dim2;
47 modM = if2 & 0x20;
48 modAdd = PC + 2 + amLength1;
49 amLength2 = WriteAM();
50 }
51
opCVTWS(void)52 static UINT32 opCVTWS(void)
53 {
54 float val;
55
56 F2DecodeFirstOperand(ReadAM,2);
57
58 // Convert to float
59 val = (float)(INT32)f2Op1;
60 modWriteValW = f2u(val);
61
62 _OV=0;
63 _CY=(val < 0.0f);
64 _S=((modWriteValW & 0x80000000)!=0);
65 _Z=(val == 0.0f);
66
67 F2WriteSecondOperand(2);
68 F2END();
69 }
70
opCVTSW(void)71 static UINT32 opCVTSW(void)
72 {
73 float val;
74
75 F2DecodeFirstOperand(ReadAM,2);
76
77 // Convert to UINT32
78 val = u2f(f2Op1);
79 modWriteValW = (INT32)val; // fix for arm, needs to be cast to signed! -dink
80
81 _OV=0;
82 _CY=(val < 0.0f);
83 _S=((modWriteValW & 0x80000000)!=0);
84 _Z=(val == 0.0f);
85
86 F2WriteSecondOperand(2);
87 F2END();
88 }
89
opMOVFS(void)90 static UINT32 opMOVFS(void)
91 {
92 F2DecodeFirstOperand(ReadAM,2);
93 modWriteValW = f2Op1;
94 F2WriteSecondOperand(2);
95 F2END();
96 }
97
opNEGFS(void)98 static UINT32 opNEGFS(void)
99 {
100 float appf;
101
102 F2DecodeFirstOperand(ReadAM, 2);
103 F2DecodeSecondOperand(ReadAMAddress, 2);
104
105 appf = -u2f(f2Op1);
106
107 _OV=0;
108 _CY=(appf < 0.0f);
109 _S=((f2u(appf) & 0x80000000)!=0);
110 _Z=(appf == 0.0f);
111
112 F2STOREOPFLOAT(2);
113 F2END()
114 }
115
opABSFS(void)116 static UINT32 opABSFS(void)
117 {
118 float appf;
119
120 F2DecodeFirstOperand(ReadAM, 2);
121 F2DecodeSecondOperand(ReadAMAddress, 2);
122
123 appf = u2f(f2Op1);
124
125 if(appf < 0)
126 appf = -appf;
127
128 _OV=0;
129 _CY=0;
130 _S=((f2u(appf) & 0x80000000)!=0);
131 _Z=(appf == 0.0f);
132
133 F2STOREOPFLOAT(2);
134 F2END()
135 }
136
opADDFS(void)137 static UINT32 opADDFS(void)
138 {
139 UINT32 appw;
140 float appf;
141
142 F2DecodeFirstOperand(ReadAM, 2);
143 F2DecodeSecondOperand(ReadAMAddress, 2);
144
145 F2LOADOPFLOAT(2);
146
147 appf += u2f(f2Op1);
148
149 appw = f2u(appf);
150 _OV = _CY = 0;
151 _S = ((appw & 0x80000000)!=0);
152 _Z = (appw == 0);
153
154 F2STOREOPFLOAT(2);
155 F2END()
156 }
157
opSUBFS(void)158 static UINT32 opSUBFS(void)
159 {
160 UINT32 appw;
161 float appf;
162
163 F2DecodeFirstOperand(ReadAM, 2);
164 F2DecodeSecondOperand(ReadAMAddress, 2);
165
166 F2LOADOPFLOAT(2);
167
168 appf -= u2f(f2Op1);
169
170 appw = f2u(appf);
171 _OV = _CY = 0;
172 _S = ((appw & 0x80000000)!=0);
173 _Z = (appw == 0);
174
175 F2STOREOPFLOAT(2);
176 F2END()
177 }
178
opMULFS(void)179 static UINT32 opMULFS(void)
180 {
181 UINT32 appw;
182 float appf;
183
184 F2DecodeFirstOperand(ReadAM, 2);
185 F2DecodeSecondOperand(ReadAMAddress, 2);
186
187 F2LOADOPFLOAT(2);
188
189 appf *= u2f(f2Op1);
190
191 appw = f2u(appf);
192 _OV = _CY = 0;
193 _S = ((appw & 0x80000000)!=0);
194 _Z = (appw == 0);
195
196 F2STOREOPFLOAT(2);
197 F2END()
198 }
199
opDIVFS(void)200 static UINT32 opDIVFS(void)
201 {
202 UINT32 appw;
203 float appf;
204
205 F2DecodeFirstOperand(ReadAM, 2);
206 F2DecodeSecondOperand(ReadAMAddress, 2);
207
208 F2LOADOPFLOAT(2);
209
210 appf /= u2f(f2Op1);
211
212 appw = f2u(appf);
213 _OV = _CY = 0;
214 _S = ((appw & 0x80000000)!=0);
215 _Z = (appw == 0);
216
217 F2STOREOPFLOAT(2);
218 F2END()
219 }
220
opSCLFS(void)221 static UINT32 opSCLFS(void)
222 {
223 UINT32 appw;
224 float appf;
225
226 F2DecodeFirstOperand(ReadAM, 1);
227 F2DecodeSecondOperand(ReadAMAddress, 2);
228
229 F2LOADOPFLOAT(2);
230
231 if ((INT16)f2Op1 < 0)
232 appf /= 1 << -(INT16)f2Op1;
233 else
234 appf *= 1 << f2Op1;
235
236 appw = f2u(appf);
237 _OV = _CY = 0;
238 _S = ((appw & 0x80000000)!=0);
239 _Z = (appw == 0);
240
241 F2STOREOPFLOAT(2);
242 F2END()
243 }
244
opCMPF(void)245 static UINT32 opCMPF(void)
246 {
247 float appf;
248
249 F2DecodeFirstOperand(ReadAM, 2);
250 F2DecodeSecondOperand(ReadAM, 2);
251
252 appf = u2f(f2Op2) - u2f(f2Op1);
253
254 _Z = (appf == 0);
255 _S = (appf < 0);
256 _OV = 0;
257 _CY = 0;
258
259 F2END();
260 }
261
op5FUNHANDLED(void)262 static UINT32 op5FUNHANDLED(void)
263 {
264 // //fatalerror("Unhandled 5F opcode at %08x", PC);
265 return 0; /* never reached, fatalerror won't return */
266 }
267
op5CUNHANDLED(void)268 static UINT32 op5CUNHANDLED(void)
269 {
270 // //fatalerror("Unhandled 5C opcode at %08x", PC);
271 return 0; /* never reached, fatalerror won't return */
272 }
273
274 static UINT32 (*const Op5FTable[32])(void) =
275 {
276 opCVTWS,
277 opCVTSW,
278 op5FUNHANDLED,
279 op5FUNHANDLED,
280 op5FUNHANDLED,
281 op5FUNHANDLED,
282 op5FUNHANDLED,
283 op5FUNHANDLED,
284 op5FUNHANDLED,
285 op5FUNHANDLED,
286 op5FUNHANDLED,
287 op5FUNHANDLED,
288 op5FUNHANDLED,
289 op5FUNHANDLED,
290 op5FUNHANDLED,
291 op5FUNHANDLED,
292 op5FUNHANDLED,
293 op5FUNHANDLED,
294 op5FUNHANDLED,
295 op5FUNHANDLED,
296 op5FUNHANDLED,
297 op5FUNHANDLED,
298 op5FUNHANDLED,
299 op5FUNHANDLED,
300 op5FUNHANDLED,
301 op5FUNHANDLED,
302 op5FUNHANDLED,
303 op5FUNHANDLED,
304 op5FUNHANDLED,
305 op5FUNHANDLED,
306 op5FUNHANDLED,
307 op5FUNHANDLED
308 };
309
310 static UINT32 (*const Op5CTable[32])(void) =
311 {
312 opCMPF,
313 op5CUNHANDLED,
314 op5CUNHANDLED,
315 op5CUNHANDLED,
316 op5CUNHANDLED,
317 op5CUNHANDLED,
318 op5CUNHANDLED,
319 op5CUNHANDLED,
320 opMOVFS,
321 opNEGFS,
322 opABSFS,
323 op5CUNHANDLED,
324 op5CUNHANDLED,
325 op5CUNHANDLED,
326 op5CUNHANDLED,
327 op5CUNHANDLED,
328
329 opSCLFS,
330 op5CUNHANDLED,
331 op5CUNHANDLED,
332 op5CUNHANDLED,
333 op5CUNHANDLED,
334 op5CUNHANDLED,
335 op5CUNHANDLED,
336 op5CUNHANDLED,
337 opADDFS,
338 opSUBFS,
339 opMULFS,
340 opDIVFS,
341 op5CUNHANDLED,
342 op5CUNHANDLED,
343 op5CUNHANDLED,
344 op5CUNHANDLED
345 };
346
347
op5F(void)348 static UINT32 op5F(void)
349 {
350 if2 = OpRead8(PC + 1);
351 return Op5FTable[if2&0x1F]();
352 }
353
354
op5C(void)355 static UINT32 op5C(void)
356 {
357 if2 = OpRead8(PC + 1);
358 return Op5CTable[if2&0x1F]();
359 }
360