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