17b96a31ba3ebdb4b5e5cddfd13e00d919b830ff
[picodrive.git] / cpu / sh2 / mame / sh2.c
1 /*****************************************************************************\r
2  *\r
3  *   sh2.c\r
4  *   Portable Hitachi SH-2 (SH7600 family) emulator\r
5  *\r
6  *   Copyright Juergen Buchmueller <pullmoll@t-online.de>,\r
7  *   all rights reserved.\r
8  *\r
9  *   - This source code is released as freeware for non-commercial purposes.\r
10  *   - You are free to use and redistribute this code in modified or\r
11  *     unmodified form, provided you list me in the credits.\r
12  *   - If you modify this source code, you must add a notice to each modified\r
13  *     source file that it has been changed.  If you're a nice person, you\r
14  *     will clearly mark each change too.  :)\r
15  *   - If you wish to use this for commercial purposes, please contact me at\r
16  *     pullmoll@t-online.de\r
17  *   - The author of this copywritten work reserves the right to change the\r
18  *     terms of its usage and license at any time, including retroactively\r
19  *   - This entire notice must remain in the source code.\r
20  *\r
21  *  This work is based on <tiraniddo@hotmail.com> C/C++ implementation of\r
22  *  the SH-2 CPU core and was adapted to the MAME CPU core requirements.\r
23  *  Thanks also go to Chuck Mason <chukjr@sundail.net> and Olivier Galibert\r
24  *  <galibert@pobox.com> for letting me peek into their SEMU code :-)\r
25  *\r
26  *****************************************************************************/\r
27 \r
28 /*****************************************************************************\r
29     Changes\r
30     20130129 Angelo Salese\r
31     - added illegal opcode exception handling, side effect of some Saturn games\r
32       on loading like Feda or Falcom Classics Vol. 1\r
33       (i.e. Master CPU Incautiously transfers memory from CD to work RAM H, and\r
34             wipes out Slave CPU program code too while at it).\r
35 \r
36     20051129 Mariusz Wojcieszek\r
37     - introduced memory_decrypted_read_word() for opcode fetching\r
38 \r
39     20050813 Mariusz Wojcieszek\r
40     - fixed 64 bit / 32 bit division in division unit\r
41 \r
42     20031015 O. Galibert\r
43     - dma fixes, thanks to sthief\r
44 \r
45     20031013 O. Galibert, A. Giles\r
46     - timer fixes\r
47     - multi-cpu simplifications\r
48 \r
49     20030915 O. Galibert\r
50     - fix DMA1 irq vector\r
51     - ignore writes to DRCRx\r
52     - fix cpu number issues\r
53     - fix slave/master recognition\r
54     - fix wrong-cpu-in-context problem with the timers\r
55 \r
56     20021020 O. Galibert\r
57     - DMA implementation, lightly tested\r
58     - delay slot in debugger fixed\r
59     - add divide box mirrors\r
60     - Nicola-ify the indentation\r
61     - Uncrapify sh2_internal_*\r
62     - Put back nmi support that had been lost somehow\r
63 \r
64     20020914 R. Belmont\r
65     - Initial SH2 internal timers implementation, based on code by O. Galibert.\r
66       Makes music work in galspanic4/s/s2, panic street, cyvern, other SKNS games.\r
67     - Fix to external division, thanks to "spice" on the E2J board.\r
68       Corrects behavior of s1945ii turret boss.\r
69 \r
70     20020302 Olivier Galibert (galibert@mame.net)\r
71     - Fixed interrupt in delay slot\r
72     - Fixed rotcr\r
73     - Fixed div1\r
74     - Fixed mulu\r
75     - Fixed negc\r
76 \r
77     20020301 R. Belmont\r
78     - Fixed external division\r
79 \r
80     20020225 Olivier Galibert (galibert@mame.net)\r
81     - Fixed interrupt handling\r
82 \r
83     20010207 Sylvain Glaize (mokona@puupuu.org)\r
84 \r
85     - Bug fix in INLINE void MOVBM(UINT32 m, UINT32 n) (see comment)\r
86     - Support of full 32 bit addressing (RB, RW, RL and WB, WW, WL functions)\r
87         reason : when the two high bits of the address are set, access is\r
88         done directly in the cache data array. The SUPER KANEKO NOVA SYSTEM\r
89         sets the stack pointer here, using these addresses as usual RAM access.\r
90 \r
91         No real cache support has been added.\r
92     - Read/Write memory format correction (_bew to _bedw) (see also SH2\r
93         definition in cpuintrf.c and DasmSH2(..) in sh2dasm.c )\r
94 \r
95     20010623 James Forshaw (TyRaNiD@totalise.net)\r
96 \r
97     - Modified operation of sh2_exception. Done cause mame irq system is stupid, and\r
98       doesnt really seem designed for any more than 8 interrupt lines.\r
99 \r
100     20010701 James Forshaw (TyRaNiD@totalise.net)\r
101 \r
102     - Fixed DIV1 operation. Q bit now correctly generated\r
103 \r
104     20020218 Added save states (mokona@puupuu.org)\r
105 \r
106  *****************************************************************************/\r
107 \r
108 //#include "debugger.h"\r
109 //#include "sh2.h"\r
110 //#include "sh2comn.h"\r
111 #undef INLINE\r
112 #define INLINE static\r
113 \r
114 //CPU_DISASSEMBLE( sh2 );\r
115 \r
116 #ifndef USE_SH2DRC\r
117 \r
118 /* speed up delay loops, bail out of tight loops */\r
119 //#define BUSY_LOOP_HACKS       1\r
120 \r
121 #define VERBOSE 0\r
122 \r
123 #define LOG(x)  do { if (VERBOSE) logerror x; } while (0)\r
124 \r
125 #if 0\r
126 INLINE UINT8 RB(sh2_state *sh2, offs_t A)\r
127 {\r
128         if (A >= 0xe0000000)\r
129                 return sh2_internal_r(*sh2->internal, (A & 0x1fc)>>2, 0xff << (((~A) & 3)*8)) >> (((~A) & 3)*8);\r
130 \r
131         if (A >= 0xc0000000)\r
132                 return sh2->program->read_byte(A);\r
133 \r
134         if (A >= 0x40000000)\r
135                 return 0xa5;\r
136 \r
137         return sh2->program->read_byte(A & AM);\r
138 }\r
139 \r
140 INLINE UINT16 RW(sh2_state *sh2, offs_t A)\r
141 {\r
142         if (A >= 0xe0000000)\r
143                 return sh2_internal_r(*sh2->internal, (A & 0x1fc)>>2, 0xffff << (((~A) & 2)*8)) >> (((~A) & 2)*8);\r
144 \r
145         if (A >= 0xc0000000)\r
146                 return sh2->program->read_word(A);\r
147 \r
148         if (A >= 0x40000000)\r
149                 return 0xa5a5;\r
150 \r
151         return sh2->program->read_word(A & AM);\r
152 }\r
153 \r
154 INLINE UINT32 RL(sh2_state *sh2, offs_t A)\r
155 {\r
156         if (A >= 0xe0000000)\r
157                 return sh2_internal_r(*sh2->internal, (A & 0x1fc)>>2, 0xffffffff);\r
158 \r
159         if (A >= 0xc0000000)\r
160                 return sh2->program->read_dword(A);\r
161 \r
162         if (A >= 0x40000000)\r
163                 return 0xa5a5a5a5;\r
164 \r
165         return sh2->program->read_dword(A & AM);\r
166 }\r
167 \r
168 INLINE void WB(sh2_state *sh2, offs_t A, UINT8 V)\r
169 {\r
170         if (A >= 0xe0000000)\r
171         {\r
172                 sh2_internal_w(*sh2->internal, (A & 0x1fc)>>2, V << (((~A) & 3)*8), 0xff << (((~A) & 3)*8));\r
173                 return;\r
174         }\r
175 \r
176         if (A >= 0xc0000000)\r
177         {\r
178                 sh2->program->write_byte(A,V);\r
179                 return;\r
180         }\r
181 \r
182         if (A >= 0x40000000)\r
183                 return;\r
184 \r
185         sh2->program->write_byte(A & AM,V);\r
186 }\r
187 \r
188 INLINE void WW(sh2_state *sh2, offs_t A, UINT16 V)\r
189 {\r
190         if (A >= 0xe0000000)\r
191         {\r
192                 sh2_internal_w(*sh2->internal, (A & 0x1fc)>>2, V << (((~A) & 2)*8), 0xffff << (((~A) & 2)*8));\r
193                 return;\r
194         }\r
195 \r
196         if (A >= 0xc0000000)\r
197         {\r
198                 sh2->program->write_word(A,V);\r
199                 return;\r
200         }\r
201 \r
202         if (A >= 0x40000000)\r
203                 return;\r
204 \r
205         sh2->program->write_word(A & AM,V);\r
206 }\r
207 \r
208 INLINE void WL(sh2_state *sh2, offs_t A, UINT32 V)\r
209 {\r
210         if (A >= 0xe0000000)\r
211         {\r
212                 sh2_internal_w(*sh2->internal, (A & 0x1fc)>>2, V, 0xffffffff);\r
213                 return;\r
214         }\r
215 \r
216         if (A >= 0xc0000000)\r
217         {\r
218                 sh2->program->write_dword(A,V);\r
219                 return;\r
220         }\r
221 \r
222         if (A >= 0x40000000)\r
223                 return;\r
224 \r
225         sh2->program->write_dword(A & AM,V);\r
226 }\r
227 #endif\r
228 \r
229 /*  code                 cycles  t-bit\r
230  *  0011 nnnn mmmm 1100  1       -\r
231  *  ADD     Rm,Rn\r
232  */\r
233 INLINE void ADD(sh2_state *sh2, UINT32 m, UINT32 n)\r
234 {\r
235         sh2->r[n] += sh2->r[m];\r
236 }\r
237 \r
238 /*  code                 cycles  t-bit\r
239  *  0111 nnnn iiii iiii  1       -\r
240  *  ADD     #imm,Rn\r
241  */\r
242 INLINE void ADDI(sh2_state *sh2, UINT32 i, UINT32 n)\r
243 {\r
244         sh2->r[n] += (INT32)(INT16)(INT8)i;\r
245 }\r
246 \r
247 /*  code                 cycles  t-bit\r
248  *  0011 nnnn mmmm 1110  1       carry\r
249  *  ADDC    Rm,Rn\r
250  */\r
251 INLINE void ADDC(sh2_state *sh2, UINT32 m, UINT32 n)\r
252 {\r
253         UINT32 tmp0, tmp1;\r
254 \r
255         tmp1 = sh2->r[n] + sh2->r[m];\r
256         tmp0 = sh2->r[n];\r
257         sh2->r[n] = tmp1 + (sh2->sr & T);\r
258         if (tmp0 > tmp1)\r
259                 sh2->sr |= T;\r
260         else\r
261                 sh2->sr &= ~T;\r
262         if (tmp1 > sh2->r[n])\r
263                 sh2->sr |= T;\r
264 }\r
265 \r
266 /*  code                 cycles  t-bit\r
267  *  0011 nnnn mmmm 1111  1       overflow\r
268  *  ADDV    Rm,Rn\r
269  */\r
270 INLINE void ADDV(sh2_state *sh2, UINT32 m, UINT32 n)\r
271 {\r
272         INT32 dest, src, ans;\r
273 \r
274         if ((INT32) sh2->r[n] >= 0)\r
275                 dest = 0;\r
276         else\r
277                 dest = 1;\r
278         if ((INT32) sh2->r[m] >= 0)\r
279                 src = 0;\r
280         else\r
281                 src = 1;\r
282         src += dest;\r
283         sh2->r[n] += sh2->r[m];\r
284         if ((INT32) sh2->r[n] >= 0)\r
285                 ans = 0;\r
286         else\r
287                 ans = 1;\r
288         ans += dest;\r
289         if (src == 0 || src == 2)\r
290         {\r
291                 if (ans == 1)\r
292                         sh2->sr |= T;\r
293                 else\r
294                         sh2->sr &= ~T;\r
295         }\r
296         else\r
297                 sh2->sr &= ~T;\r
298 }\r
299 \r
300 /*  code                 cycles  t-bit\r
301  *  0010 nnnn mmmm 1001  1       -\r
302  *  AND     Rm,Rn\r
303  */\r
304 INLINE void AND(sh2_state *sh2, UINT32 m, UINT32 n)\r
305 {\r
306         sh2->r[n] &= sh2->r[m];\r
307 }\r
308 \r
309 \r
310 /*  code                 cycles  t-bit\r
311  *  1100 1001 iiii iiii  1       -\r
312  *  AND     #imm,R0\r
313  */\r
314 INLINE void ANDI(sh2_state *sh2, UINT32 i)\r
315 {\r
316         sh2->r[0] &= i;\r
317 }\r
318 \r
319 /*  code                 cycles  t-bit\r
320  *  1100 1101 iiii iiii  1       -\r
321  *  AND.B   #imm,@(R0,GBR)\r
322  */\r
323 INLINE void ANDM(sh2_state *sh2, UINT32 i)\r
324 {\r
325         UINT32 temp;\r
326 \r
327         sh2->ea = sh2->gbr + sh2->r[0];\r
328         temp = i & RB( sh2, sh2->ea );\r
329         WB( sh2, sh2->ea, temp );\r
330         sh2->icount -= 2;\r
331 }\r
332 \r
333 /*  code                 cycles  t-bit\r
334  *  1000 1011 dddd dddd  3/1     -\r
335  *  BF      disp8\r
336  */\r
337 INLINE void BF(sh2_state *sh2, UINT32 d)\r
338 {\r
339         if ((sh2->sr & T) == 0)\r
340         {\r
341                 INT32 disp = ((INT32)d << 24) >> 24;\r
342                 sh2->pc = sh2->ea = sh2->pc + disp * 2 + 2;\r
343                 sh2->icount -= 2;\r
344         }\r
345 }\r
346 \r
347 /*  code                 cycles  t-bit\r
348  *  1000 1111 dddd dddd  3/1     -\r
349  *  BFS     disp8\r
350  */\r
351 INLINE void BFS(sh2_state *sh2, UINT32 d)\r
352 {\r
353         sh2->delay = sh2->pc;\r
354         sh2->pc += 2;\r
355 \r
356         if ((sh2->sr & T) == 0)\r
357         {\r
358                 INT32 disp = ((INT32)d << 24) >> 24;\r
359                 sh2->pc = sh2->ea = sh2->pc + disp * 2;\r
360                 sh2->icount--;\r
361         }\r
362 }\r
363 \r
364 /*  code                 cycles  t-bit\r
365  *  1010 dddd dddd dddd  2       -\r
366  *  BRA     disp12\r
367  */\r
368 INLINE void BRA(sh2_state *sh2, UINT32 d)\r
369 {\r
370         INT32 disp = ((INT32)d << 20) >> 20;\r
371 \r
372 #if BUSY_LOOP_HACKS\r
373         if (disp == -2)\r
374         {\r
375                 UINT32 next_opcode = (UINT32)(UINT16)RW( sh2, sh2->ppc & AM );\r
376                 /* BRA  $\r
377                  * NOP\r
378                  */\r
379                 if (next_opcode == 0x0009)\r
380                         sh2->icount %= 3;   /* cycles for BRA $ and NOP taken (3) */\r
381         }\r
382 #endif\r
383         sh2->delay = sh2->pc;\r
384         sh2->pc = sh2->ea = sh2->pc + disp * 2 + 2;\r
385         sh2->icount--;\r
386 }\r
387 \r
388 /*  code                 cycles  t-bit\r
389  *  0000 mmmm 0010 0011  2       -\r
390  *  BRAF    Rm\r
391  */\r
392 INLINE void BRAF(sh2_state *sh2, UINT32 m)\r
393 {\r
394         sh2->delay = sh2->pc;\r
395         sh2->pc += sh2->r[m] + 2;\r
396         sh2->icount--;\r
397 }\r
398 \r
399 /*  code                 cycles  t-bit\r
400  *  1011 dddd dddd dddd  2       -\r
401  *  BSR     disp12\r
402  */\r
403 INLINE void BSR(sh2_state *sh2, UINT32 d)\r
404 {\r
405         INT32 disp = ((INT32)d << 20) >> 20;\r
406 \r
407         sh2->pr = sh2->pc + 2;\r
408         sh2->delay = sh2->pc;\r
409         sh2->pc = sh2->ea = sh2->pc + disp * 2 + 2;\r
410         sh2->icount--;\r
411 }\r
412 \r
413 /*  code                 cycles  t-bit\r
414  *  0000 mmmm 0000 0011  2       -\r
415  *  BSRF    Rm\r
416  */\r
417 INLINE void BSRF(sh2_state *sh2, UINT32 m)\r
418 {\r
419         sh2->pr = sh2->pc + 2;\r
420         sh2->delay = sh2->pc;\r
421         sh2->pc += sh2->r[m] + 2;\r
422         sh2->icount--;\r
423 }\r
424 \r
425 /*  code                 cycles  t-bit\r
426  *  1000 1001 dddd dddd  3/1     -\r
427  *  BT      disp8\r
428  */\r
429 INLINE void BT(sh2_state *sh2, UINT32 d)\r
430 {\r
431         if ((sh2->sr & T) != 0)\r
432         {\r
433                 INT32 disp = ((INT32)d << 24) >> 24;\r
434                 sh2->pc = sh2->ea = sh2->pc + disp * 2 + 2;\r
435                 sh2->icount -= 2;\r
436         }\r
437 }\r
438 \r
439 /*  code                 cycles  t-bit\r
440  *  1000 1101 dddd dddd  2/1     -\r
441  *  BTS     disp8\r
442  */\r
443 INLINE void BTS(sh2_state *sh2, UINT32 d)\r
444 {\r
445         sh2->delay = sh2->pc;\r
446         sh2->pc += 2;\r
447 \r
448         if ((sh2->sr & T) != 0)\r
449         {\r
450                 INT32 disp = ((INT32)d << 24) >> 24;\r
451                 sh2->pc = sh2->ea = sh2->pc + disp * 2;\r
452                 sh2->icount--;\r
453         }\r
454 }\r
455 \r
456 /*  code                 cycles  t-bit\r
457  *  0000 0000 0010 1000  1       -\r
458  *  CLRMAC\r
459  */\r
460 INLINE void CLRMAC(sh2_state *sh2)\r
461 {\r
462         sh2->mach = 0;\r
463         sh2->macl = 0;\r
464 }\r
465 \r
466 /*  code                 cycles  t-bit\r
467  *  0000 0000 0000 1000  1       -\r
468  *  CLRT\r
469  */\r
470 INLINE void CLRT(sh2_state *sh2)\r
471 {\r
472         sh2->sr &= ~T;\r
473 }\r
474 \r
475 /*  code                 cycles  t-bit\r
476  *  0011 nnnn mmmm 0000  1       comparison result\r
477  *  CMP_EQ  Rm,Rn\r
478  */\r
479 INLINE void CMPEQ(sh2_state *sh2, UINT32 m, UINT32 n)\r
480 {\r
481         if (sh2->r[n] == sh2->r[m])\r
482                 sh2->sr |= T;\r
483         else\r
484                 sh2->sr &= ~T;\r
485 }\r
486 \r
487 /*  code                 cycles  t-bit\r
488  *  0011 nnnn mmmm 0011  1       comparison result\r
489  *  CMP_GE  Rm,Rn\r
490  */\r
491 INLINE void CMPGE(sh2_state *sh2, UINT32 m, UINT32 n)\r
492 {\r
493         if ((INT32) sh2->r[n] >= (INT32) sh2->r[m])\r
494                 sh2->sr |= T;\r
495         else\r
496                 sh2->sr &= ~T;\r
497 }\r
498 \r
499 /*  code                 cycles  t-bit\r
500  *  0011 nnnn mmmm 0111  1       comparison result\r
501  *  CMP_GT  Rm,Rn\r
502  */\r
503 INLINE void CMPGT(sh2_state *sh2, UINT32 m, UINT32 n)\r
504 {\r
505         if ((INT32) sh2->r[n] > (INT32) sh2->r[m])\r
506                 sh2->sr |= T;\r
507         else\r
508                 sh2->sr &= ~T;\r
509 }\r
510 \r
511 /*  code                 cycles  t-bit\r
512  *  0011 nnnn mmmm 0110  1       comparison result\r
513  *  CMP_HI  Rm,Rn\r
514  */\r
515 INLINE void CMPHI(sh2_state *sh2, UINT32 m, UINT32 n)\r
516 {\r
517         if ((UINT32) sh2->r[n] > (UINT32) sh2->r[m])\r
518                 sh2->sr |= T;\r
519         else\r
520                 sh2->sr &= ~T;\r
521 }\r
522 \r
523 /*  code                 cycles  t-bit\r
524  *  0011 nnnn mmmm 0010  1       comparison result\r
525  *  CMP_HS  Rm,Rn\r
526  */\r
527 INLINE void CMPHS(sh2_state *sh2, UINT32 m, UINT32 n)\r
528 {\r
529         if ((UINT32) sh2->r[n] >= (UINT32) sh2->r[m])\r
530                 sh2->sr |= T;\r
531         else\r
532                 sh2->sr &= ~T;\r
533 }\r
534 \r
535 \r
536 /*  code                 cycles  t-bit\r
537  *  0100 nnnn 0001 0101  1       comparison result\r
538  *  CMP_PL  Rn\r
539  */\r
540 INLINE void CMPPL(sh2_state *sh2, UINT32 n)\r
541 {\r
542         if ((INT32) sh2->r[n] > 0)\r
543                 sh2->sr |= T;\r
544         else\r
545                 sh2->sr &= ~T;\r
546 }\r
547 \r
548 /*  code                 cycles  t-bit\r
549  *  0100 nnnn 0001 0001  1       comparison result\r
550  *  CMP_PZ  Rn\r
551  */\r
552 INLINE void CMPPZ(sh2_state *sh2, UINT32 n)\r
553 {\r
554         if ((INT32) sh2->r[n] >= 0)\r
555                 sh2->sr |= T;\r
556         else\r
557                 sh2->sr &= ~T;\r
558 }\r
559 \r
560 /*  code                 cycles  t-bit\r
561  *  0010 nnnn mmmm 1100  1       comparison result\r
562  * CMP_STR  Rm,Rn\r
563  */\r
564 INLINE void CMPSTR(sh2_state *sh2, UINT32 m, UINT32 n)\r
565         {\r
566         UINT32 temp;\r
567         INT32 HH, HL, LH, LL;\r
568         temp = sh2->r[n] ^ sh2->r[m];\r
569         HH = (temp >> 24) & 0xff;\r
570         HL = (temp >> 16) & 0xff;\r
571         LH = (temp >> 8) & 0xff;\r
572         LL = temp & 0xff;\r
573         if (HH && HL && LH && LL)\r
574         sh2->sr &= ~T;\r
575         else\r
576         sh2->sr |= T;\r
577         }\r
578 \r
579 \r
580 /*  code                 cycles  t-bit\r
581  *  1000 1000 iiii iiii  1       comparison result\r
582  *  CMP/EQ #imm,R0\r
583  */\r
584 INLINE void CMPIM(sh2_state *sh2, UINT32 i)\r
585 {\r
586         UINT32 imm = (UINT32)(INT32)(INT16)(INT8)i;\r
587 \r
588         if (sh2->r[0] == imm)\r
589                 sh2->sr |= T;\r
590         else\r
591                 sh2->sr &= ~T;\r
592 }\r
593 \r
594 /*  code                 cycles  t-bit\r
595  *  0010 nnnn mmmm 0111  1       calculation result\r
596  *  DIV0S   Rm,Rn\r
597  */\r
598 INLINE void DIV0S(sh2_state *sh2, UINT32 m, UINT32 n)\r
599 {\r
600         if ((sh2->r[n] & 0x80000000) == 0)\r
601                 sh2->sr &= ~Q;\r
602         else\r
603                 sh2->sr |= Q;\r
604         if ((sh2->r[m] & 0x80000000) == 0)\r
605                 sh2->sr &= ~M;\r
606         else\r
607                 sh2->sr |= M;\r
608         if ((sh2->r[m] ^ sh2->r[n]) & 0x80000000)\r
609                 sh2->sr |= T;\r
610         else\r
611                 sh2->sr &= ~T;\r
612 }\r
613 \r
614 /*  code                 cycles  t-bit\r
615  *  0000 0000 0001 1001  1       0\r
616  *  DIV0U\r
617  */\r
618 INLINE void DIV0U(sh2_state *sh2)\r
619 {\r
620         sh2->sr &= ~(M | Q | T);\r
621 }\r
622 \r
623 /*  code                 cycles  t-bit\r
624  *  0011 nnnn mmmm 0100  1       calculation result\r
625  *  DIV1 Rm,Rn\r
626  */\r
627 INLINE void DIV1(sh2_state *sh2, UINT32 m, UINT32 n)\r
628 {\r
629         UINT32 tmp0;\r
630         UINT32 old_q;\r
631 \r
632         old_q = sh2->sr & Q;\r
633         if (0x80000000 & sh2->r[n])\r
634                 sh2->sr |= Q;\r
635         else\r
636                 sh2->sr &= ~Q;\r
637 \r
638         sh2->r[n] = (sh2->r[n] << 1) | (sh2->sr & T);\r
639 \r
640         if (!old_q)\r
641         {\r
642                 if (!(sh2->sr & M))\r
643                 {\r
644                         tmp0 = sh2->r[n];\r
645                         sh2->r[n] -= sh2->r[m];\r
646                         if(!(sh2->sr & Q))\r
647                                 if(sh2->r[n] > tmp0)\r
648                                         sh2->sr |= Q;\r
649                                 else\r
650                                         sh2->sr &= ~Q;\r
651                         else\r
652                                 if(sh2->r[n] > tmp0)\r
653                                         sh2->sr &= ~Q;\r
654                                 else\r
655                                         sh2->sr |= Q;\r
656                 }\r
657                 else\r
658                 {\r
659                         tmp0 = sh2->r[n];\r
660                         sh2->r[n] += sh2->r[m];\r
661                         if(!(sh2->sr & Q))\r
662                         {\r
663                                 if(sh2->r[n] < tmp0)\r
664                                         sh2->sr &= ~Q;\r
665                                 else\r
666                                         sh2->sr |= Q;\r
667                         }\r
668                         else\r
669                         {\r
670                                 if(sh2->r[n] < tmp0)\r
671                                         sh2->sr |= Q;\r
672                                 else\r
673                                         sh2->sr &= ~Q;\r
674                         }\r
675                 }\r
676         }\r
677         else\r
678         {\r
679                 if (!(sh2->sr & M))\r
680                 {\r
681                         tmp0 = sh2->r[n];\r
682                         sh2->r[n] += sh2->r[m];\r
683                         if(!(sh2->sr & Q))\r
684                                 if(sh2->r[n] < tmp0)\r
685                                         sh2->sr |= Q;\r
686                                 else\r
687                                         sh2->sr &= ~Q;\r
688                         else\r
689                                 if(sh2->r[n] < tmp0)\r
690                                         sh2->sr &= ~Q;\r
691                                 else\r
692                                         sh2->sr |= Q;\r
693                 }\r
694                 else\r
695                 {\r
696                         tmp0 = sh2->r[n];\r
697                         sh2->r[n] -= sh2->r[m];\r
698                         if(!(sh2->sr & Q))\r
699                                 if(sh2->r[n] > tmp0)\r
700                                         sh2->sr &= ~Q;\r
701                                 else\r
702                                         sh2->sr |= Q;\r
703                         else\r
704                                 if(sh2->r[n] > tmp0)\r
705                                         sh2->sr |= Q;\r
706                                 else\r
707                                         sh2->sr &= ~Q;\r
708                 }\r
709         }\r
710 \r
711         tmp0 = (sh2->sr & (Q | M));\r
712         if((!tmp0) || (tmp0 == 0x300)) /* if Q == M set T else clear T */\r
713                 sh2->sr |= T;\r
714         else\r
715                 sh2->sr &= ~T;\r
716 }\r
717 \r
718 /*  DMULS.L Rm,Rn */\r
719 INLINE void DMULS(sh2_state *sh2, UINT32 m, UINT32 n)\r
720 {\r
721         UINT32 RnL, RnH, RmL, RmH, Res0, Res1, Res2;\r
722         UINT32 temp0, temp1, temp2, temp3;\r
723         INT32 tempm, tempn, fnLmL;\r
724 \r
725         tempn = (INT32) sh2->r[n];\r
726         tempm = (INT32) sh2->r[m];\r
727         if (tempn < 0)\r
728                 tempn = 0 - tempn;\r
729         if (tempm < 0)\r
730                 tempm = 0 - tempm;\r
731         if ((INT32) (sh2->r[n] ^ sh2->r[m]) < 0)\r
732                 fnLmL = -1;\r
733         else\r
734                 fnLmL = 0;\r
735         temp1 = (UINT32) tempn;\r
736         temp2 = (UINT32) tempm;\r
737         RnL = temp1 & 0x0000ffff;\r
738         RnH = (temp1 >> 16) & 0x0000ffff;\r
739         RmL = temp2 & 0x0000ffff;\r
740         RmH = (temp2 >> 16) & 0x0000ffff;\r
741         temp0 = RmL * RnL;\r
742         temp1 = RmH * RnL;\r
743         temp2 = RmL * RnH;\r
744         temp3 = RmH * RnH;\r
745         Res2 = 0;\r
746         Res1 = temp1 + temp2;\r
747         if (Res1 < temp1)\r
748                 Res2 += 0x00010000;\r
749         temp1 = (Res1 << 16) & 0xffff0000;\r
750         Res0 = temp0 + temp1;\r
751         if (Res0 < temp0)\r
752                 Res2++;\r
753         Res2 = Res2 + ((Res1 >> 16) & 0x0000ffff) + temp3;\r
754         if (fnLmL < 0)\r
755         {\r
756                 Res2 = ~Res2;\r
757                 if (Res0 == 0)\r
758                         Res2++;\r
759                 else\r
760                         Res0 = (~Res0) + 1;\r
761         }\r
762         sh2->mach = Res2;\r
763         sh2->macl = Res0;\r
764         sh2->icount--;\r
765 }\r
766 \r
767 /*  DMULU.L Rm,Rn */\r
768 INLINE void DMULU(sh2_state *sh2, UINT32 m, UINT32 n)\r
769 {\r
770         UINT32 RnL, RnH, RmL, RmH, Res0, Res1, Res2;\r
771         UINT32 temp0, temp1, temp2, temp3;\r
772 \r
773         RnL = sh2->r[n] & 0x0000ffff;\r
774         RnH = (sh2->r[n] >> 16) & 0x0000ffff;\r
775         RmL = sh2->r[m] & 0x0000ffff;\r
776         RmH = (sh2->r[m] >> 16) & 0x0000ffff;\r
777         temp0 = RmL * RnL;\r
778         temp1 = RmH * RnL;\r
779         temp2 = RmL * RnH;\r
780         temp3 = RmH * RnH;\r
781         Res2 = 0;\r
782         Res1 = temp1 + temp2;\r
783         if (Res1 < temp1)\r
784                 Res2 += 0x00010000;\r
785         temp1 = (Res1 << 16) & 0xffff0000;\r
786         Res0 = temp0 + temp1;\r
787         if (Res0 < temp0)\r
788                 Res2++;\r
789         Res2 = Res2 + ((Res1 >> 16) & 0x0000ffff) + temp3;\r
790         sh2->mach = Res2;\r
791         sh2->macl = Res0;\r
792         sh2->icount--;\r
793 }\r
794 \r
795 /*  DT      Rn */\r
796 INLINE void DT(sh2_state *sh2, UINT32 n)\r
797 {\r
798         sh2->r[n]--;\r
799         if (sh2->r[n] == 0)\r
800                 sh2->sr |= T;\r
801         else\r
802                 sh2->sr &= ~T;\r
803         sh2->no_polling = SH2_NO_POLLING;\r
804 #if BUSY_LOOP_HACKS\r
805         {\r
806                 UINT32 next_opcode = (UINT32)(UINT16)RW( sh2, sh2->ppc & AM );\r
807                 /* DT   Rn\r
808                  * BF   $-2\r
809                  */\r
810                 if (next_opcode == 0x8bfd)\r
811                 {\r
812                         while (sh2->r[n] > 1 && sh2->icount > 4)\r
813                         {\r
814                                 sh2->r[n]--;\r
815                                 sh2->icount -= 4;   /* cycles for DT (1) and BF taken (3) */\r
816                         }\r
817                 }\r
818         }\r
819 #endif\r
820 }\r
821 \r
822 /*  EXTS.B  Rm,Rn */\r
823 INLINE void EXTSB(sh2_state *sh2, UINT32 m, UINT32 n)\r
824 {\r
825         sh2->r[n] = ((INT32)sh2->r[m] << 24) >> 24;\r
826 }\r
827 \r
828 /*  EXTS.W  Rm,Rn */\r
829 INLINE void EXTSW(sh2_state *sh2, UINT32 m, UINT32 n)\r
830 {\r
831         sh2->r[n] = ((INT32)sh2->r[m] << 16) >> 16;\r
832 }\r
833 \r
834 /*  EXTU.B  Rm,Rn */\r
835 INLINE void EXTUB(sh2_state *sh2, UINT32 m, UINT32 n)\r
836 {\r
837         sh2->r[n] = sh2->r[m] & 0x000000ff;\r
838 }\r
839 \r
840 /*  EXTU.W  Rm,Rn */\r
841 INLINE void EXTUW(sh2_state *sh2, UINT32 m, UINT32 n)\r
842 {\r
843         sh2->r[n] = sh2->r[m] & 0x0000ffff;\r
844 }\r
845 \r
846 /*  ILLEGAL */\r
847 INLINE void ILLEGAL(sh2_state *sh2)\r
848 {\r
849         logerror("SH2: Illegal opcode at %08x\n", sh2->pc - 2);\r
850         sh2->r[15] -= 4;\r
851         WL( sh2, sh2->r[15], sh2->sr );     /* push SR onto stack */\r
852         sh2->r[15] -= 4;\r
853         WL( sh2, sh2->r[15], sh2->pc - 2 ); /* push PC onto stack */\r
854 \r
855         /* fetch PC */\r
856         sh2->pc = RL( sh2, sh2->vbr + 4 * 4 );\r
857 \r
858         /* TODO: timing is a guess */\r
859         sh2->icount -= 5;\r
860 }\r
861 \r
862 \r
863 /*  JMP     @Rm */\r
864 INLINE void JMP(sh2_state *sh2, UINT32 m)\r
865 {\r
866         sh2->delay = sh2->pc;\r
867         sh2->pc = sh2->ea = sh2->r[m];\r
868         sh2->icount--;\r
869 }\r
870 \r
871 /*  JSR     @Rm */\r
872 INLINE void JSR(sh2_state *sh2, UINT32 m)\r
873 {\r
874         sh2->delay = sh2->pc;\r
875         sh2->pr = sh2->pc + 2;\r
876         sh2->pc = sh2->ea = sh2->r[m];\r
877         sh2->icount--;\r
878 }\r
879 \r
880 \r
881 /*  LDC     Rm,SR */\r
882 INLINE void LDCSR(sh2_state *sh2, UINT32 m)\r
883 {\r
884         sh2->sr = sh2->r[m] & FLAGS;\r
885         sh2->test_irq = 1;\r
886 }\r
887 \r
888 /*  LDC     Rm,GBR */\r
889 INLINE void LDCGBR(sh2_state *sh2, UINT32 m)\r
890 {\r
891         sh2->gbr = sh2->r[m];\r
892 }\r
893 \r
894 /*  LDC     Rm,VBR */\r
895 INLINE void LDCVBR(sh2_state *sh2, UINT32 m)\r
896 {\r
897         sh2->vbr = sh2->r[m];\r
898 }\r
899 \r
900 /*  LDC.L   @Rm+,SR */\r
901 INLINE void LDCMSR(sh2_state *sh2, UINT32 m)\r
902 {\r
903         sh2->ea = sh2->r[m];\r
904         sh2->sr = RL( sh2, sh2->ea ) & FLAGS;\r
905         sh2->r[m] += 4;\r
906         sh2->icount -= 2;\r
907         sh2->test_irq = 1;\r
908 }\r
909 \r
910 /*  LDC.L   @Rm+,GBR */\r
911 INLINE void LDCMGBR(sh2_state *sh2, UINT32 m)\r
912 {\r
913         sh2->ea = sh2->r[m];\r
914         sh2->gbr = RL( sh2, sh2->ea );\r
915         sh2->r[m] += 4;\r
916         sh2->icount -= 2;\r
917 }\r
918 \r
919 /*  LDC.L   @Rm+,VBR */\r
920 INLINE void LDCMVBR(sh2_state *sh2, UINT32 m)\r
921 {\r
922         sh2->ea = sh2->r[m];\r
923         sh2->vbr = RL( sh2, sh2->ea );\r
924         sh2->r[m] += 4;\r
925         sh2->icount -= 2;\r
926 }\r
927 \r
928 /*  LDS     Rm,MACH */\r
929 INLINE void LDSMACH(sh2_state *sh2, UINT32 m)\r
930 {\r
931         sh2->mach = sh2->r[m];\r
932 }\r
933 \r
934 /*  LDS     Rm,MACL */\r
935 INLINE void LDSMACL(sh2_state *sh2, UINT32 m)\r
936 {\r
937         sh2->macl = sh2->r[m];\r
938 }\r
939 \r
940 /*  LDS     Rm,PR */\r
941 INLINE void LDSPR(sh2_state *sh2, UINT32 m)\r
942 {\r
943         sh2->pr = sh2->r[m];\r
944 }\r
945 \r
946 /*  LDS.L   @Rm+,MACH */\r
947 INLINE void LDSMMACH(sh2_state *sh2, UINT32 m)\r
948 {\r
949         sh2->ea = sh2->r[m];\r
950         sh2->mach = RL( sh2, sh2->ea );\r
951         sh2->r[m] += 4;\r
952 }\r
953 \r
954 /*  LDS.L   @Rm+,MACL */\r
955 INLINE void LDSMMACL(sh2_state *sh2, UINT32 m)\r
956 {\r
957         sh2->ea = sh2->r[m];\r
958         sh2->macl = RL( sh2, sh2->ea );\r
959         sh2->r[m] += 4;\r
960 }\r
961 \r
962 /*  LDS.L   @Rm+,PR */\r
963 INLINE void LDSMPR(sh2_state *sh2, UINT32 m)\r
964 {\r
965         sh2->ea = sh2->r[m];\r
966         sh2->pr = RL( sh2, sh2->ea );\r
967         sh2->r[m] += 4;\r
968 }\r
969 \r
970 /*  MAC.L   @Rm+,@Rn+ */\r
971 INLINE void MAC_L(sh2_state *sh2, UINT32 m, UINT32 n)\r
972 {\r
973         UINT32 RnL, RnH, RmL, RmH, Res0, Res1, Res2;\r
974         UINT32 temp0, temp1, temp2, temp3;\r
975         INT32 tempm, tempn, fnLmL;\r
976 \r
977         tempn = (INT32) RL( sh2, sh2->r[n] );\r
978         sh2->r[n] += 4;\r
979         tempm = (INT32) RL( sh2, sh2->r[m] );\r
980         sh2->r[m] += 4;\r
981         if ((INT32) (tempn ^ tempm) < 0)\r
982                 fnLmL = -1;\r
983         else\r
984                 fnLmL = 0;\r
985         if (tempn < 0)\r
986                 tempn = 0 - tempn;\r
987         if (tempm < 0)\r
988                 tempm = 0 - tempm;\r
989         temp1 = (UINT32) tempn;\r
990         temp2 = (UINT32) tempm;\r
991         RnL = temp1 & 0x0000ffff;\r
992         RnH = (temp1 >> 16) & 0x0000ffff;\r
993         RmL = temp2 & 0x0000ffff;\r
994         RmH = (temp2 >> 16) & 0x0000ffff;\r
995         temp0 = RmL * RnL;\r
996         temp1 = RmH * RnL;\r
997         temp2 = RmL * RnH;\r
998         temp3 = RmH * RnH;\r
999         Res2 = 0;\r
1000         Res1 = temp1 + temp2;\r
1001         if (Res1 < temp1)\r
1002                 Res2 += 0x00010000;\r
1003         temp1 = (Res1 << 16) & 0xffff0000;\r
1004         Res0 = temp0 + temp1;\r
1005         if (Res0 < temp0)\r
1006                 Res2++;\r
1007         Res2 = Res2 + ((Res1 >> 16) & 0x0000ffff) + temp3;\r
1008         if (fnLmL < 0)\r
1009         {\r
1010                 Res2 = ~Res2;\r
1011                 if (Res0 == 0)\r
1012                         Res2++;\r
1013                 else\r
1014                         Res0 = (~Res0) + 1;\r
1015         }\r
1016         if (sh2->sr & S)\r
1017         {\r
1018                 Res0 = sh2->macl + Res0;\r
1019                 if (sh2->macl > Res0)\r
1020                         Res2++;\r
1021                 Res2 += (sh2->mach & 0x0000ffff);\r
1022                 if (((INT32) Res2 < 0) && (Res2 < 0xffff8000))\r
1023                 {\r
1024                         Res2 = 0x00008000;\r
1025                         Res0 = 0x00000000;\r
1026                 }\r
1027                 else if (((INT32) Res2 > 0) && (Res2 > 0x00007fff))\r
1028                 {\r
1029                         Res2 = 0x00007fff;\r
1030                         Res0 = 0xffffffff;\r
1031                 }\r
1032                 sh2->mach = Res2;\r
1033                 sh2->macl = Res0;\r
1034         }\r
1035         else\r
1036         {\r
1037                 Res0 = sh2->macl + Res0;\r
1038                 if (sh2->macl > Res0)\r
1039                         Res2++;\r
1040                 Res2 += sh2->mach;\r
1041                 sh2->mach = Res2;\r
1042                 sh2->macl = Res0;\r
1043         }\r
1044         sh2->icount -= 2;\r
1045 }\r
1046 \r
1047 /*  MAC.W   @Rm+,@Rn+ */\r
1048 INLINE void MAC_W(sh2_state *sh2, UINT32 m, UINT32 n)\r
1049 {\r
1050         INT32 tempm, tempn, dest, src, ans;\r
1051         UINT32 templ;\r
1052 \r
1053         tempn = (INT32)(INT16) RW( sh2, sh2->r[n] );\r
1054         sh2->r[n] += 2;\r
1055         tempm = (INT32)(INT16) RW( sh2, sh2->r[m] );\r
1056         sh2->r[m] += 2;\r
1057         templ = sh2->macl;\r
1058         tempm = (tempn * tempm);\r
1059         if ((INT32) sh2->macl >= 0)\r
1060                 dest = 0;\r
1061         else\r
1062                 dest = 1;\r
1063         if ((INT32) tempm >= 0)\r
1064         {\r
1065                 src = 0;\r
1066                 tempn = 0;\r
1067         }\r
1068         else\r
1069         {\r
1070                 src = 1;\r
1071                 tempn = 0xffffffff;\r
1072         }\r
1073         src += dest;\r
1074         sh2->macl += tempm;\r
1075         if ((INT32) sh2->macl >= 0)\r
1076                 ans = 0;\r
1077         else\r
1078                 ans = 1;\r
1079         ans += dest;\r
1080         if (sh2->sr & S)\r
1081         {\r
1082                 if (ans == 1)\r
1083                         {\r
1084                                 if (src == 0)\r
1085                                         sh2->macl = 0x7fffffff;\r
1086                                 if (src == 2)\r
1087                                         sh2->macl = 0x80000000;\r
1088                         }\r
1089         }\r
1090         else\r
1091         {\r
1092                 sh2->mach += tempn;\r
1093                 if (templ > sh2->macl)\r
1094                         sh2->mach += 1;\r
1095         }\r
1096         sh2->icount -= 2;\r
1097 }\r
1098 \r
1099 /*  MOV     Rm,Rn */\r
1100 INLINE void MOV(sh2_state *sh2, UINT32 m, UINT32 n)\r
1101 {\r
1102         sh2->r[n] = sh2->r[m];\r
1103 }\r
1104 \r
1105 /*  MOV.B   Rm,@Rn */\r
1106 INLINE void MOVBS(sh2_state *sh2, UINT32 m, UINT32 n)\r
1107 {\r
1108         sh2->ea = sh2->r[n];\r
1109         WB( sh2, sh2->ea, sh2->r[m] & 0x000000ff);\r
1110 }\r
1111 \r
1112 /*  MOV.W   Rm,@Rn */\r
1113 INLINE void MOVWS(sh2_state *sh2, UINT32 m, UINT32 n)\r
1114 {\r
1115         sh2->ea = sh2->r[n];\r
1116         WW( sh2, sh2->ea, sh2->r[m] & 0x0000ffff);\r
1117 }\r
1118 \r
1119 /*  MOV.L   Rm,@Rn */\r
1120 INLINE void MOVLS(sh2_state *sh2, UINT32 m, UINT32 n)\r
1121 {\r
1122         sh2->ea = sh2->r[n];\r
1123         WL( sh2, sh2->ea, sh2->r[m] );\r
1124 }\r
1125 \r
1126 /*  MOV.B   @Rm,Rn */\r
1127 INLINE void MOVBL(sh2_state *sh2, UINT32 m, UINT32 n)\r
1128 {\r
1129         sh2->ea = sh2->r[m];\r
1130         sh2->r[n] = (UINT32)(INT32)(INT16)(INT8) RB( sh2, sh2->ea );\r
1131 }\r
1132 \r
1133 /*  MOV.W   @Rm,Rn */\r
1134 INLINE void MOVWL(sh2_state *sh2, UINT32 m, UINT32 n)\r
1135 {\r
1136         sh2->ea = sh2->r[m];\r
1137         sh2->r[n] = (UINT32)(INT32)(INT16) RW( sh2, sh2->ea );\r
1138 }\r
1139 \r
1140 /*  MOV.L   @Rm,Rn */\r
1141 INLINE void MOVLL(sh2_state *sh2, UINT32 m, UINT32 n)\r
1142 {\r
1143         sh2->ea = sh2->r[m];\r
1144         sh2->r[n] = RL( sh2, sh2->ea );\r
1145 }\r
1146 \r
1147 /*  MOV.B   Rm,@-Rn */\r
1148 INLINE void MOVBM(sh2_state *sh2, UINT32 m, UINT32 n)\r
1149 {\r
1150         /* SMG : bug fix, was reading sh2->r[n] */\r
1151         UINT32 data = sh2->r[m] & 0x000000ff;\r
1152 \r
1153         sh2->r[n] -= 1;\r
1154         WB( sh2, sh2->r[n], data );\r
1155 }\r
1156 \r
1157 /*  MOV.W   Rm,@-Rn */\r
1158 INLINE void MOVWM(sh2_state *sh2, UINT32 m, UINT32 n)\r
1159 {\r
1160         UINT32 data = sh2->r[m] & 0x0000ffff;\r
1161 \r
1162         sh2->r[n] -= 2;\r
1163         WW( sh2, sh2->r[n], data );\r
1164 }\r
1165 \r
1166 /*  MOV.L   Rm,@-Rn */\r
1167 INLINE void MOVLM(sh2_state *sh2, UINT32 m, UINT32 n)\r
1168 {\r
1169         UINT32 data = sh2->r[m];\r
1170 \r
1171         sh2->r[n] -= 4;\r
1172         WL( sh2, sh2->r[n], data );\r
1173 }\r
1174 \r
1175 /*  MOV.B   @Rm+,Rn */\r
1176 INLINE void MOVBP(sh2_state *sh2, UINT32 m, UINT32 n)\r
1177 {\r
1178         sh2->r[n] = (UINT32)(INT32)(INT16)(INT8) RB( sh2, sh2->r[m] );\r
1179         if (n != m)\r
1180                 sh2->r[m] += 1;\r
1181 }\r
1182 \r
1183 /*  MOV.W   @Rm+,Rn */\r
1184 INLINE void MOVWP(sh2_state *sh2, UINT32 m, UINT32 n)\r
1185 {\r
1186         sh2->r[n] = (UINT32)(INT32)(INT16) RW( sh2, sh2->r[m] );\r
1187         if (n != m)\r
1188                 sh2->r[m] += 2;\r
1189 }\r
1190 \r
1191 /*  MOV.L   @Rm+,Rn */\r
1192 INLINE void MOVLP(sh2_state *sh2, UINT32 m, UINT32 n)\r
1193 {\r
1194         sh2->r[n] = RL( sh2, sh2->r[m] );\r
1195         if (n != m)\r
1196                 sh2->r[m] += 4;\r
1197 }\r
1198 \r
1199 /*  MOV.B   Rm,@(R0,Rn) */\r
1200 INLINE void MOVBS0(sh2_state *sh2, UINT32 m, UINT32 n)\r
1201 {\r
1202         sh2->ea = sh2->r[n] + sh2->r[0];\r
1203         WB( sh2, sh2->ea, sh2->r[m] & 0x000000ff );\r
1204 }\r
1205 \r
1206 /*  MOV.W   Rm,@(R0,Rn) */\r
1207 INLINE void MOVWS0(sh2_state *sh2, UINT32 m, UINT32 n)\r
1208 {\r
1209         sh2->ea = sh2->r[n] + sh2->r[0];\r
1210         WW( sh2, sh2->ea, sh2->r[m] & 0x0000ffff );\r
1211 }\r
1212 \r
1213 /*  MOV.L   Rm,@(R0,Rn) */\r
1214 INLINE void MOVLS0(sh2_state *sh2, UINT32 m, UINT32 n)\r
1215 {\r
1216         sh2->ea = sh2->r[n] + sh2->r[0];\r
1217         WL( sh2, sh2->ea, sh2->r[m] );\r
1218 }\r
1219 \r
1220 /*  MOV.B   @(R0,Rm),Rn */\r
1221 INLINE void MOVBL0(sh2_state *sh2, UINT32 m, UINT32 n)\r
1222 {\r
1223         sh2->ea = sh2->r[m] + sh2->r[0];\r
1224         sh2->r[n] = (UINT32)(INT32)(INT16)(INT8) RB( sh2, sh2->ea );\r
1225 }\r
1226 \r
1227 /*  MOV.W   @(R0,Rm),Rn */\r
1228 INLINE void MOVWL0(sh2_state *sh2, UINT32 m, UINT32 n)\r
1229 {\r
1230         sh2->ea = sh2->r[m] + sh2->r[0];\r
1231         sh2->r[n] = (UINT32)(INT32)(INT16) RW( sh2, sh2->ea );\r
1232 }\r
1233 \r
1234 /*  MOV.L   @(R0,Rm),Rn */\r
1235 INLINE void MOVLL0(sh2_state *sh2, UINT32 m, UINT32 n)\r
1236 {\r
1237         sh2->ea = sh2->r[m] + sh2->r[0];\r
1238         sh2->r[n] = RL( sh2, sh2->ea );\r
1239 }\r
1240 \r
1241 /*  MOV     #imm,Rn */\r
1242 INLINE void MOVI(sh2_state *sh2, UINT32 i, UINT32 n)\r
1243 {\r
1244         sh2->r[n] = (UINT32)(INT32)(INT16)(INT8) i;\r
1245 }\r
1246 \r
1247 /*  MOV.W   @(disp8,PC),Rn */\r
1248 INLINE void MOVWI(sh2_state *sh2, UINT32 d, UINT32 n)\r
1249 {\r
1250         UINT32 disp = d & 0xff;\r
1251         sh2->ea = sh2->pc + disp * 2 + 2;\r
1252         sh2->r[n] = (UINT32)(INT32)(INT16) RW( sh2, sh2->ea );\r
1253 }\r
1254 \r
1255 /*  MOV.L   @(disp8,PC),Rn */\r
1256 INLINE void MOVLI(sh2_state *sh2, UINT32 d, UINT32 n)\r
1257 {\r
1258         UINT32 disp = d & 0xff;\r
1259         sh2->ea = ((sh2->pc + 2) & ~3) + disp * 4;\r
1260         sh2->r[n] = RL( sh2, sh2->ea );\r
1261 }\r
1262 \r
1263 /*  MOV.B   @(disp8,GBR),R0 */\r
1264 INLINE void MOVBLG(sh2_state *sh2, UINT32 d)\r
1265 {\r
1266         UINT32 disp = d & 0xff;\r
1267         sh2->ea = sh2->gbr + disp;\r
1268         sh2->r[0] = (UINT32)(INT32)(INT16)(INT8) RB( sh2, sh2->ea );\r
1269 }\r
1270 \r
1271 /*  MOV.W   @(disp8,GBR),R0 */\r
1272 INLINE void MOVWLG(sh2_state *sh2, UINT32 d)\r
1273 {\r
1274         UINT32 disp = d & 0xff;\r
1275         sh2->ea = sh2->gbr + disp * 2;\r
1276         sh2->r[0] = (INT32)(INT16) RW( sh2, sh2->ea );\r
1277 }\r
1278 \r
1279 /*  MOV.L   @(disp8,GBR),R0 */\r
1280 INLINE void MOVLLG(sh2_state *sh2, UINT32 d)\r
1281 {\r
1282         UINT32 disp = d & 0xff;\r
1283         sh2->ea = sh2->gbr + disp * 4;\r
1284         sh2->r[0] = RL( sh2, sh2->ea );\r
1285 }\r
1286 \r
1287 /*  MOV.B   R0,@(disp8,GBR) */\r
1288 INLINE void MOVBSG(sh2_state *sh2, UINT32 d)\r
1289 {\r
1290         UINT32 disp = d & 0xff;\r
1291         sh2->ea = sh2->gbr + disp;\r
1292         WB( sh2, sh2->ea, sh2->r[0] & 0x000000ff );\r
1293 }\r
1294 \r
1295 /*  MOV.W   R0,@(disp8,GBR) */\r
1296 INLINE void MOVWSG(sh2_state *sh2, UINT32 d)\r
1297 {\r
1298         UINT32 disp = d & 0xff;\r
1299         sh2->ea = sh2->gbr + disp * 2;\r
1300         WW( sh2, sh2->ea, sh2->r[0] & 0x0000ffff );\r
1301 }\r
1302 \r
1303 /*  MOV.L   R0,@(disp8,GBR) */\r
1304 INLINE void MOVLSG(sh2_state *sh2, UINT32 d)\r
1305 {\r
1306         UINT32 disp = d & 0xff;\r
1307         sh2->ea = sh2->gbr + disp * 4;\r
1308         WL( sh2, sh2->ea, sh2->r[0] );\r
1309 }\r
1310 \r
1311 /*  MOV.B   R0,@(disp4,Rn) */\r
1312 INLINE void MOVBS4(sh2_state *sh2, UINT32 d, UINT32 n)\r
1313 {\r
1314         UINT32 disp = d & 0x0f;\r
1315         sh2->ea = sh2->r[n] + disp;\r
1316         WB( sh2, sh2->ea, sh2->r[0] & 0x000000ff );\r
1317 }\r
1318 \r
1319 /*  MOV.W   R0,@(disp4,Rn) */\r
1320 INLINE void MOVWS4(sh2_state *sh2, UINT32 d, UINT32 n)\r
1321 {\r
1322         UINT32 disp = d & 0x0f;\r
1323         sh2->ea = sh2->r[n] + disp * 2;\r
1324         WW( sh2, sh2->ea, sh2->r[0] & 0x0000ffff );\r
1325 }\r
1326 \r
1327 /* MOV.L Rm,@(disp4,Rn) */\r
1328 INLINE void MOVLS4(sh2_state *sh2, UINT32 m, UINT32 d, UINT32 n)\r
1329 {\r
1330         UINT32 disp = d & 0x0f;\r
1331         sh2->ea = sh2->r[n] + disp * 4;\r
1332         WL( sh2, sh2->ea, sh2->r[m] );\r
1333 }\r
1334 \r
1335 /*  MOV.B   @(disp4,Rm),R0 */\r
1336 INLINE void MOVBL4(sh2_state *sh2, UINT32 m, UINT32 d)\r
1337 {\r
1338         UINT32 disp = d & 0x0f;\r
1339         sh2->ea = sh2->r[m] + disp;\r
1340         sh2->r[0] = (UINT32)(INT32)(INT16)(INT8) RB( sh2, sh2->ea );\r
1341 }\r
1342 \r
1343 /*  MOV.W   @(disp4,Rm),R0 */\r
1344 INLINE void MOVWL4(sh2_state *sh2, UINT32 m, UINT32 d)\r
1345 {\r
1346         UINT32 disp = d & 0x0f;\r
1347         sh2->ea = sh2->r[m] + disp * 2;\r
1348         sh2->r[0] = (UINT32)(INT32)(INT16) RW( sh2, sh2->ea );\r
1349 }\r
1350 \r
1351 /*  MOV.L   @(disp4,Rm),Rn */\r
1352 INLINE void MOVLL4(sh2_state *sh2, UINT32 m, UINT32 d, UINT32 n)\r
1353 {\r
1354         UINT32 disp = d & 0x0f;\r
1355         sh2->ea = sh2->r[m] + disp * 4;\r
1356         sh2->r[n] = RL( sh2, sh2->ea );\r
1357 }\r
1358 \r
1359 /*  MOVA    @(disp8,PC),R0 */\r
1360 INLINE void MOVA(sh2_state *sh2, UINT32 d)\r
1361 {\r
1362         UINT32 disp = d & 0xff;\r
1363         sh2->ea = ((sh2->pc + 2) & ~3) + disp * 4;\r
1364         sh2->r[0] = sh2->ea;\r
1365 }\r
1366 \r
1367 /*  MOVT    Rn */\r
1368 INLINE void MOVT(sh2_state *sh2, UINT32 n)\r
1369 {\r
1370         sh2->r[n] = sh2->sr & T;\r
1371 }\r
1372 \r
1373 /*  MUL.L   Rm,Rn */\r
1374 INLINE void MULL(sh2_state *sh2, UINT32 m, UINT32 n)\r
1375 {\r
1376         sh2->macl = sh2->r[n] * sh2->r[m];\r
1377         sh2->icount--;\r
1378 }\r
1379 \r
1380 /*  MULS    Rm,Rn */\r
1381 INLINE void MULS(sh2_state *sh2, UINT32 m, UINT32 n)\r
1382 {\r
1383         sh2->macl = (INT16) sh2->r[n] * (INT16) sh2->r[m];\r
1384 }\r
1385 \r
1386 /*  MULU    Rm,Rn */\r
1387 INLINE void MULU(sh2_state *sh2, UINT32 m, UINT32 n)\r
1388 {\r
1389         sh2->macl = (UINT16) sh2->r[n] * (UINT16) sh2->r[m];\r
1390 }\r
1391 \r
1392 /*  NEG     Rm,Rn */\r
1393 INLINE void NEG(sh2_state *sh2, UINT32 m, UINT32 n)\r
1394 {\r
1395         sh2->r[n] = 0 - sh2->r[m];\r
1396 }\r
1397 \r
1398 /*  NEGC    Rm,Rn */\r
1399 INLINE void NEGC(sh2_state *sh2, UINT32 m, UINT32 n)\r
1400 {\r
1401         UINT32 temp;\r
1402 \r
1403         temp = sh2->r[m];\r
1404         sh2->r[n] = -temp - (sh2->sr & T);\r
1405         if (temp || (sh2->sr & T))\r
1406                 sh2->sr |= T;\r
1407         else\r
1408                 sh2->sr &= ~T;\r
1409 }\r
1410 \r
1411 /*  NOP */\r
1412 INLINE void NOP(void)\r
1413 {\r
1414 }\r
1415 \r
1416 /*  NOT     Rm,Rn */\r
1417 INLINE void NOT(sh2_state *sh2, UINT32 m, UINT32 n)\r
1418 {\r
1419         sh2->r[n] = ~sh2->r[m];\r
1420 }\r
1421 \r
1422 /*  OR      Rm,Rn */\r
1423 INLINE void OR(sh2_state *sh2, UINT32 m, UINT32 n)\r
1424 {\r
1425         sh2->r[n] |= sh2->r[m];\r
1426 }\r
1427 \r
1428 /*  OR      #imm,R0 */\r
1429 INLINE void ORI(sh2_state *sh2, UINT32 i)\r
1430 {\r
1431         sh2->r[0] |= i;\r
1432 }\r
1433 \r
1434 /*  OR.B    #imm,@(R0,GBR) */\r
1435 INLINE void ORM(sh2_state *sh2, UINT32 i)\r
1436 {\r
1437         UINT32 temp;\r
1438 \r
1439         sh2->ea = sh2->gbr + sh2->r[0];\r
1440         temp = RB( sh2, sh2->ea );\r
1441         temp |= i;\r
1442         WB( sh2, sh2->ea, temp );\r
1443         sh2->icount -= 2;\r
1444 }\r
1445 \r
1446 /*  ROTCL   Rn */\r
1447 INLINE void ROTCL(sh2_state *sh2, UINT32 n)\r
1448 {\r
1449         UINT32 temp;\r
1450 \r
1451         temp = (sh2->r[n] >> 31) & T;\r
1452         sh2->r[n] = (sh2->r[n] << 1) | (sh2->sr & T);\r
1453         sh2->sr = (sh2->sr & ~T) | temp;\r
1454 }\r
1455 \r
1456 /*  ROTCR   Rn */\r
1457 INLINE void ROTCR(sh2_state *sh2, UINT32 n)\r
1458 {\r
1459         UINT32 temp;\r
1460         temp = (sh2->sr & T) << 31;\r
1461         if (sh2->r[n] & T)\r
1462                 sh2->sr |= T;\r
1463         else\r
1464                 sh2->sr &= ~T;\r
1465         sh2->r[n] = (sh2->r[n] >> 1) | temp;\r
1466 }\r
1467 \r
1468 /*  ROTL    Rn */\r
1469 INLINE void ROTL(sh2_state *sh2, UINT32 n)\r
1470 {\r
1471         sh2->sr = (sh2->sr & ~T) | ((sh2->r[n] >> 31) & T);\r
1472         sh2->r[n] = (sh2->r[n] << 1) | (sh2->r[n] >> 31);\r
1473 }\r
1474 \r
1475 /*  ROTR    Rn */\r
1476 INLINE void ROTR(sh2_state *sh2, UINT32 n)\r
1477 {\r
1478         sh2->sr = (sh2->sr & ~T) | (sh2->r[n] & T);\r
1479         sh2->r[n] = (sh2->r[n] >> 1) | (sh2->r[n] << 31);\r
1480 }\r
1481 \r
1482 /*  RTE */\r
1483 INLINE void RTE(sh2_state *sh2)\r
1484 {\r
1485         sh2->ea = sh2->r[15];\r
1486         sh2->delay = sh2->pc;\r
1487         sh2->pc = RL( sh2, sh2->ea );\r
1488         sh2->r[15] += 4;\r
1489         sh2->ea = sh2->r[15];\r
1490         sh2->sr = RL( sh2, sh2->ea ) & FLAGS;\r
1491         sh2->r[15] += 4;\r
1492         sh2->icount -= 3;\r
1493         sh2->test_irq = 1;\r
1494 }\r
1495 \r
1496 /*  RTS */\r
1497 INLINE void RTS(sh2_state *sh2)\r
1498 {\r
1499         sh2->delay = sh2->pc;\r
1500         sh2->pc = sh2->ea = sh2->pr;\r
1501         sh2->icount--;\r
1502 }\r
1503 \r
1504 /*  SETT */\r
1505 INLINE void SETT(sh2_state *sh2)\r
1506 {\r
1507         sh2->sr |= T;\r
1508 }\r
1509 \r
1510 /*  SHAL    Rn      (same as SHLL) */\r
1511 INLINE void SHAL(sh2_state *sh2, UINT32 n)\r
1512 {\r
1513         sh2->sr = (sh2->sr & ~T) | ((sh2->r[n] >> 31) & T);\r
1514         sh2->r[n] <<= 1;\r
1515 }\r
1516 \r
1517 /*  SHAR    Rn */\r
1518 INLINE void SHAR(sh2_state *sh2, UINT32 n)\r
1519 {\r
1520         sh2->sr = (sh2->sr & ~T) | (sh2->r[n] & T);\r
1521         sh2->r[n] = (UINT32)((INT32)sh2->r[n] >> 1);\r
1522 }\r
1523 \r
1524 /*  SHLL    Rn      (same as SHAL) */\r
1525 INLINE void SHLL(sh2_state *sh2, UINT32 n)\r
1526 {\r
1527         sh2->sr = (sh2->sr & ~T) | ((sh2->r[n] >> 31) & T);\r
1528         sh2->r[n] <<= 1;\r
1529 }\r
1530 \r
1531 /*  SHLL2   Rn */\r
1532 INLINE void SHLL2(sh2_state *sh2, UINT32 n)\r
1533 {\r
1534         sh2->r[n] <<= 2;\r
1535 }\r
1536 \r
1537 /*  SHLL8   Rn */\r
1538 INLINE void SHLL8(sh2_state *sh2, UINT32 n)\r
1539 {\r
1540         sh2->r[n] <<= 8;\r
1541 }\r
1542 \r
1543 /*  SHLL16  Rn */\r
1544 INLINE void SHLL16(sh2_state *sh2, UINT32 n)\r
1545 {\r
1546         sh2->r[n] <<= 16;\r
1547 }\r
1548 \r
1549 /*  SHLR    Rn */\r
1550 INLINE void SHLR(sh2_state *sh2, UINT32 n)\r
1551 {\r
1552         sh2->sr = (sh2->sr & ~T) | (sh2->r[n] & T);\r
1553         sh2->r[n] >>= 1;\r
1554 }\r
1555 \r
1556 /*  SHLR2   Rn */\r
1557 INLINE void SHLR2(sh2_state *sh2, UINT32 n)\r
1558 {\r
1559         sh2->r[n] >>= 2;\r
1560 }\r
1561 \r
1562 /*  SHLR8   Rn */\r
1563 INLINE void SHLR8(sh2_state *sh2, UINT32 n)\r
1564 {\r
1565         sh2->r[n] >>= 8;\r
1566 }\r
1567 \r
1568 /*  SHLR16  Rn */\r
1569 INLINE void SHLR16(sh2_state *sh2, UINT32 n)\r
1570 {\r
1571         sh2->r[n] >>= 16;\r
1572 }\r
1573 \r
1574 /*  SLEEP */\r
1575 INLINE void SLEEP(sh2_state *sh2)\r
1576 {\r
1577         //if(sh2->sleep_mode != 2)\r
1578                 sh2->pc -= 2;\r
1579         sh2->icount -= 2;\r
1580         /* Wait_for_exception; */\r
1581         /*if(sh2->sleep_mode == 0)\r
1582                 sh2->sleep_mode = 1;\r
1583         else if(sh2->sleep_mode == 2)\r
1584                 sh2->sleep_mode = 0;*/\r
1585 }\r
1586 \r
1587 /*  STC     SR,Rn */\r
1588 INLINE void STCSR(sh2_state *sh2, UINT32 n)\r
1589 {\r
1590         sh2->r[n] = sh2->sr;\r
1591 }\r
1592 \r
1593 /*  STC     GBR,Rn */\r
1594 INLINE void STCGBR(sh2_state *sh2, UINT32 n)\r
1595 {\r
1596         sh2->r[n] = sh2->gbr;\r
1597 }\r
1598 \r
1599 /*  STC     VBR,Rn */\r
1600 INLINE void STCVBR(sh2_state *sh2, UINT32 n)\r
1601 {\r
1602         sh2->r[n] = sh2->vbr;\r
1603 }\r
1604 \r
1605 /*  STC.L   SR,@-Rn */\r
1606 INLINE void STCMSR(sh2_state *sh2, UINT32 n)\r
1607 {\r
1608         sh2->r[n] -= 4;\r
1609         sh2->ea = sh2->r[n];\r
1610         WL( sh2, sh2->ea, sh2->sr );\r
1611         sh2->icount--;\r
1612 }\r
1613 \r
1614 /*  STC.L   GBR,@-Rn */\r
1615 INLINE void STCMGBR(sh2_state *sh2, UINT32 n)\r
1616 {\r
1617         sh2->r[n] -= 4;\r
1618         sh2->ea = sh2->r[n];\r
1619         WL( sh2, sh2->ea, sh2->gbr );\r
1620         sh2->icount--;\r
1621 }\r
1622 \r
1623 /*  STC.L   VBR,@-Rn */\r
1624 INLINE void STCMVBR(sh2_state *sh2, UINT32 n)\r
1625 {\r
1626         sh2->r[n] -= 4;\r
1627         sh2->ea = sh2->r[n];\r
1628         WL( sh2, sh2->ea, sh2->vbr );\r
1629         sh2->icount--;\r
1630 }\r
1631 \r
1632 /*  STS     MACH,Rn */\r
1633 INLINE void STSMACH(sh2_state *sh2, UINT32 n)\r
1634 {\r
1635         sh2->r[n] = sh2->mach;\r
1636 }\r
1637 \r
1638 /*  STS     MACL,Rn */\r
1639 INLINE void STSMACL(sh2_state *sh2, UINT32 n)\r
1640 {\r
1641         sh2->r[n] = sh2->macl;\r
1642 }\r
1643 \r
1644 /*  STS     PR,Rn */\r
1645 INLINE void STSPR(sh2_state *sh2, UINT32 n)\r
1646 {\r
1647         sh2->r[n] = sh2->pr;\r
1648 }\r
1649 \r
1650 /*  STS.L   MACH,@-Rn */\r
1651 INLINE void STSMMACH(sh2_state *sh2, UINT32 n)\r
1652 {\r
1653         sh2->r[n] -= 4;\r
1654         sh2->ea = sh2->r[n];\r
1655         WL( sh2, sh2->ea, sh2->mach );\r
1656 }\r
1657 \r
1658 /*  STS.L   MACL,@-Rn */\r
1659 INLINE void STSMMACL(sh2_state *sh2, UINT32 n)\r
1660 {\r
1661         sh2->r[n] -= 4;\r
1662         sh2->ea = sh2->r[n];\r
1663         WL( sh2, sh2->ea, sh2->macl );\r
1664 }\r
1665 \r
1666 /*  STS.L   PR,@-Rn */\r
1667 INLINE void STSMPR(sh2_state *sh2, UINT32 n)\r
1668 {\r
1669         sh2->r[n] -= 4;\r
1670         sh2->ea = sh2->r[n];\r
1671         WL( sh2, sh2->ea, sh2->pr );\r
1672 }\r
1673 \r
1674 /*  SUB     Rm,Rn */\r
1675 INLINE void SUB(sh2_state *sh2, UINT32 m, UINT32 n)\r
1676 {\r
1677         sh2->r[n] -= sh2->r[m];\r
1678 }\r
1679 \r
1680 /*  SUBC    Rm,Rn */\r
1681 INLINE void SUBC(sh2_state *sh2, UINT32 m, UINT32 n)\r
1682 {\r
1683         UINT32 tmp0, tmp1;\r
1684 \r
1685         tmp1 = sh2->r[n] - sh2->r[m];\r
1686         tmp0 = sh2->r[n];\r
1687         sh2->r[n] = tmp1 - (sh2->sr & T);\r
1688         if (tmp0 < tmp1)\r
1689                 sh2->sr |= T;\r
1690         else\r
1691                 sh2->sr &= ~T;\r
1692         if (tmp1 < sh2->r[n])\r
1693                 sh2->sr |= T;\r
1694 }\r
1695 \r
1696 /*  SUBV    Rm,Rn */\r
1697 INLINE void SUBV(sh2_state *sh2, UINT32 m, UINT32 n)\r
1698 {\r
1699         INT32 dest, src, ans;\r
1700 \r
1701         if ((INT32) sh2->r[n] >= 0)\r
1702                 dest = 0;\r
1703         else\r
1704                 dest = 1;\r
1705         if ((INT32) sh2->r[m] >= 0)\r
1706                 src = 0;\r
1707         else\r
1708                 src = 1;\r
1709         src += dest;\r
1710         sh2->r[n] -= sh2->r[m];\r
1711         if ((INT32) sh2->r[n] >= 0)\r
1712                 ans = 0;\r
1713         else\r
1714                 ans = 1;\r
1715         ans += dest;\r
1716         if (src == 1)\r
1717         {\r
1718                 if (ans == 1)\r
1719                         sh2->sr |= T;\r
1720                 else\r
1721                         sh2->sr &= ~T;\r
1722         }\r
1723         else\r
1724                 sh2->sr &= ~T;\r
1725 }\r
1726 \r
1727 /*  SWAP.B  Rm,Rn */\r
1728 INLINE void SWAPB(sh2_state *sh2, UINT32 m, UINT32 n)\r
1729 {\r
1730         UINT32 temp0, temp1;\r
1731 \r
1732         temp0 = sh2->r[m] & 0xffff0000;\r
1733         temp1 = (sh2->r[m] & 0x000000ff) << 8;\r
1734         sh2->r[n] = (sh2->r[m] >> 8) & 0x000000ff;\r
1735         sh2->r[n] = sh2->r[n] | temp1 | temp0;\r
1736 }\r
1737 \r
1738 /*  SWAP.W  Rm,Rn */\r
1739 INLINE void SWAPW(sh2_state *sh2, UINT32 m, UINT32 n)\r
1740 {\r
1741         UINT32 temp;\r
1742 \r
1743         temp = (sh2->r[m] >> 16) & 0x0000ffff;\r
1744         sh2->r[n] = (sh2->r[m] << 16) | temp;\r
1745 }\r
1746 \r
1747 /*  TAS.B   @Rn */\r
1748 INLINE void TAS(sh2_state *sh2, UINT32 n)\r
1749 {\r
1750         UINT32 temp;\r
1751         sh2->ea = sh2->r[n];\r
1752         /* Bus Lock enable */\r
1753         temp = RB( sh2, sh2->ea );\r
1754         if (temp == 0)\r
1755                 sh2->sr |= T;\r
1756         else\r
1757                 sh2->sr &= ~T;\r
1758         temp |= 0x80;\r
1759         /* Bus Lock disable */\r
1760         WB( sh2, sh2->ea, temp );\r
1761         sh2->icount -= 3;\r
1762 }\r
1763 \r
1764 /*  TRAPA   #imm */\r
1765 INLINE void TRAPA(sh2_state *sh2, UINT32 i)\r
1766 {\r
1767         UINT32 imm = i & 0xff;\r
1768 \r
1769         sh2->ea = sh2->vbr + imm * 4;\r
1770 \r
1771         sh2->r[15] -= 4;\r
1772         WL( sh2, sh2->r[15], sh2->sr );\r
1773         sh2->r[15] -= 4;\r
1774         WL( sh2, sh2->r[15], sh2->pc );\r
1775 \r
1776         sh2->pc = RL( sh2, sh2->ea );\r
1777 \r
1778         sh2->icount -= 7;\r
1779 }\r
1780 \r
1781 /*  TST     Rm,Rn */\r
1782 INLINE void TST(sh2_state *sh2, UINT32 m, UINT32 n)\r
1783 {\r
1784         if ((sh2->r[n] & sh2->r[m]) == 0)\r
1785                 sh2->sr |= T;\r
1786         else\r
1787                 sh2->sr &= ~T;\r
1788 }\r
1789 \r
1790 /*  TST     #imm,R0 */\r
1791 INLINE void TSTI(sh2_state *sh2, UINT32 i)\r
1792 {\r
1793         UINT32 imm = i & 0xff;\r
1794 \r
1795         if ((imm & sh2->r[0]) == 0)\r
1796                 sh2->sr |= T;\r
1797         else\r
1798                 sh2->sr &= ~T;\r
1799 }\r
1800 \r
1801 /*  TST.B   #imm,@(R0,GBR) */\r
1802 INLINE void TSTM(sh2_state *sh2, UINT32 i)\r
1803 {\r
1804         UINT32 imm = i & 0xff;\r
1805 \r
1806         sh2->ea = sh2->gbr + sh2->r[0];\r
1807         if ((imm & RB( sh2, sh2->ea )) == 0)\r
1808                 sh2->sr |= T;\r
1809         else\r
1810                 sh2->sr &= ~T;\r
1811         sh2->icount -= 2;\r
1812 }\r
1813 \r
1814 /*  XOR     Rm,Rn */\r
1815 INLINE void XOR(sh2_state *sh2, UINT32 m, UINT32 n)\r
1816 {\r
1817         sh2->r[n] ^= sh2->r[m];\r
1818 }\r
1819 \r
1820 /*  XOR     #imm,R0 */\r
1821 INLINE void XORI(sh2_state *sh2, UINT32 i)\r
1822 {\r
1823         UINT32 imm = i & 0xff;\r
1824         sh2->r[0] ^= imm;\r
1825 }\r
1826 \r
1827 /*  XOR.B   #imm,@(R0,GBR) */\r
1828 INLINE void XORM(sh2_state *sh2, UINT32 i)\r
1829 {\r
1830         UINT32 imm = i & 0xff;\r
1831         UINT32 temp;\r
1832 \r
1833         sh2->ea = sh2->gbr + sh2->r[0];\r
1834         temp = RB( sh2, sh2->ea );\r
1835         temp ^= imm;\r
1836         WB( sh2, sh2->ea, temp );\r
1837         sh2->icount -= 2;\r
1838 }\r
1839 \r
1840 /*  XTRCT   Rm,Rn */\r
1841 INLINE void XTRCT(sh2_state *sh2, UINT32 m, UINT32 n)\r
1842 {\r
1843         UINT32 temp;\r
1844 \r
1845         temp = (sh2->r[m] << 16) & 0xffff0000;\r
1846         sh2->r[n] = (sh2->r[n] >> 16) & 0x0000ffff;\r
1847         sh2->r[n] |= temp;\r
1848 }\r
1849 \r
1850 /*****************************************************************************\r
1851  *  OPCODE DISPATCHERS\r
1852  *****************************************************************************/\r
1853 \r
1854 INLINE void op0000(sh2_state *sh2, UINT16 opcode)\r
1855 {\r
1856         switch (opcode & 0x3F)\r
1857         {\r
1858         case 0x00: ILLEGAL(sh2);        rlog(0);                        break;\r
1859         case 0x01: ILLEGAL(sh2);        rlog(0);                        break;\r
1860         case 0x02: STCSR(sh2, Rn);      rlog(LRN);                      break;\r
1861         case 0x03: BSRF(sh2, Rn);       rlog(LRN);                      break;\r
1862         case 0x04: MOVBS0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1863         case 0x05: MOVWS0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1864         case 0x06: MOVLS0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1865         case 0x07: MULL(sh2, Rm, Rn);   rlog(LRNM); rlog1(SHR_MACL);    break;\r
1866         case 0x08: CLRT(sh2);           rlog(0);                        break;\r
1867         case 0x09: NOP();               rlog(0);                        break;\r
1868         case 0x0a: STSMACH(sh2, Rn);    rlog(LRN);  rlog1(SHR_MACH);    break;\r
1869         case 0x0b: RTS(sh2);            rlog(0);    rlog1(SHR_PR);      break;\r
1870         case 0x0c: MOVBL0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1871         case 0x0d: MOVWL0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1872         case 0x0e: MOVLL0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1873         case 0x0f: MAC_L(sh2, Rm, Rn);  rlog(LRNM); rlog2(SHR_MACL,SHR_MACH); break;\r
1874 \r
1875         case 0x10: ILLEGAL(sh2);        rlog(0);                        break;\r
1876         case 0x11: ILLEGAL(sh2);        rlog(0);                        break;\r
1877         case 0x12: STCGBR(sh2, Rn);     rlog(LRN);  rlog1(SHR_GBR);     break;\r
1878         case 0x13: ILLEGAL(sh2);        rlog(0);                        break;\r
1879         case 0x14: MOVBS0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1880         case 0x15: MOVWS0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1881         case 0x16: MOVLS0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1882         case 0x17: MULL(sh2, Rm, Rn);   rlog(LRNM); rlog1(SHR_MACL);    break;\r
1883         case 0x18: SETT(sh2);           rlog(0);                        break;\r
1884         case 0x19: DIV0U(sh2);          rlog(0);                        break;\r
1885         case 0x1a: STSMACL(sh2, Rn);    rlog(LRN);  rlog1(SHR_MACL);    break;\r
1886         case 0x1b: SLEEP(sh2);          rlog(0);                        break;\r
1887         case 0x1c: MOVBL0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1888         case 0x1d: MOVWL0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1889         case 0x1e: MOVLL0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1890         case 0x1f: MAC_L(sh2, Rm, Rn);  rlog(LRNM); rlog2(SHR_MACL,SHR_MACH); break;\r
1891 \r
1892         case 0x20: ILLEGAL(sh2);        rlog(0);                        break;\r
1893         case 0x21: ILLEGAL(sh2);        rlog(0);                        break;\r
1894         case 0x22: STCVBR(sh2, Rn);     rlog(LRN);  rlog1(SHR_VBR);     break;\r
1895         case 0x23: BRAF(sh2, Rn);       rlog(LRN);                      break;\r
1896         case 0x24: MOVBS0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1897         case 0x25: MOVWS0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1898         case 0x26: MOVLS0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1899         case 0x27: MULL(sh2, Rm, Rn);   rlog(LRNM); rlog1(SHR_MACL);    break;\r
1900         case 0x28: CLRMAC(sh2);         rlog(0);    rlog2(SHR_MACL,SHR_MACH); break;\r
1901         case 0x29: MOVT(sh2, Rn);       rlog(LRN);                      break;\r
1902         case 0x2a: STSPR(sh2, Rn);      rlog(LRN);  rlog1(SHR_PR);      break;\r
1903         case 0x2b: RTE(sh2);            rlog(0);                        break;\r
1904         case 0x2c: MOVBL0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1905         case 0x2d: MOVWL0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1906         case 0x2e: MOVLL0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1907         case 0x2f: MAC_L(sh2, Rm, Rn);  rlog(LRNM); rlog2(SHR_MACL,SHR_MACH); break;\r
1908 \r
1909         case 0x30: ILLEGAL(sh2);        rlog(0);                        break;\r
1910         case 0x31: ILLEGAL(sh2);        rlog(0);                        break;\r
1911         case 0x32: ILLEGAL(sh2);        rlog(0);                        break;\r
1912         case 0x33: ILLEGAL(sh2);        rlog(0);                        break;\r
1913         case 0x34: MOVBS0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1914         case 0x35: MOVWS0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1915         case 0x36: MOVLS0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1916         case 0x37: MULL(sh2, Rm, Rn);   rlog(LRNM); rlog1(SHR_MACL);    break;\r
1917         case 0x38: ILLEGAL(sh2);        rlog(0);                        break;\r
1918         case 0x39: ILLEGAL(sh2);        rlog(0);                        break;\r
1919         case 0x3c: MOVBL0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1920         case 0x3d: MOVWL0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1921         case 0x3e: MOVLL0(sh2, Rm, Rn); rlog(LRNM); rlog1(0);           break;\r
1922         case 0x3f: MAC_L(sh2, Rm, Rn);  rlog(LRNM); rlog2(SHR_MACL,SHR_MACH); break;\r
1923         case 0x3a: ILLEGAL(sh2);        rlog(0);                        break;\r
1924         case 0x3b: ILLEGAL(sh2);        rlog(0);                        break;\r
1925         }\r
1926 }\r
1927 \r
1928 INLINE void op0001(sh2_state *sh2, UINT16 opcode)\r
1929 {\r
1930         MOVLS4(sh2, Rm, opcode & 0x0f, Rn);\r
1931         rlog(LRNM);\r
1932 }\r
1933 \r
1934 INLINE void op0010(sh2_state *sh2, UINT16 opcode)\r
1935 {\r
1936         switch (opcode & 15)\r
1937         {\r
1938         case  0: MOVBS(sh2, Rm, Rn);    rlog(LRNM);                     break;\r
1939         case  1: MOVWS(sh2, Rm, Rn);    rlog(LRNM);                     break;\r
1940         case  2: MOVLS(sh2, Rm, Rn);    rlog(LRNM);                     break;\r
1941         case  3: ILLEGAL(sh2);          rlog(0);                        break;\r
1942         case  4: MOVBM(sh2, Rm, Rn);    rlog(LRNM);                     break;\r
1943         case  5: MOVWM(sh2, Rm, Rn);    rlog(LRNM);                     break;\r
1944         case  6: MOVLM(sh2, Rm, Rn);    rlog(LRNM);                     break;\r
1945         case  7: DIV0S(sh2, Rm, Rn);    rlog(LRNM);                     break;\r
1946         case  8: TST(sh2, Rm, Rn);      rlog(LRNM);                     break;\r
1947         case  9: AND(sh2, Rm, Rn);      rlog(LRNM);                     break;\r
1948         case 10: XOR(sh2, Rm, Rn);      rlog(LRNM);                     break;\r
1949         case 11: OR(sh2, Rm, Rn);       rlog(LRNM);                     break;\r
1950         case 12: CMPSTR(sh2, Rm, Rn);   rlog(LRNM);                     break;\r
1951         case 13: XTRCT(sh2, Rm, Rn);    rlog(LRNM);                     break;\r
1952         case 14: MULU(sh2, Rm, Rn);     rlog(LRNM); rlog1(SHR_MACL);    break;\r
1953         case 15: MULS(sh2, Rm, Rn);     rlog(LRNM); rlog1(SHR_MACL);    break;\r
1954         }\r
1955 }\r
1956 \r
1957 INLINE void op0011(sh2_state *sh2, UINT16 opcode)\r
1958 {\r
1959         switch (opcode & 15)\r
1960         {\r
1961         case  0: CMPEQ(sh2, Rm, Rn);    rlog(LRNM);                     break;\r
1962         case  1: ILLEGAL(sh2);          rlog(0);                        break;\r
1963         case  2: CMPHS(sh2, Rm, Rn);    rlog(LRNM);                     break;\r
1964         case  3: CMPGE(sh2, Rm, Rn);    rlog(LRNM);                     break;\r
1965         case  4: DIV1(sh2, Rm, Rn);     rlog(LRNM);                     break;\r
1966         case  5: DMULU(sh2, Rm, Rn);    rlog(LRNM); rlog2(SHR_MACL,SHR_MACH); break;\r
1967         case  6: CMPHI(sh2, Rm, Rn);    rlog(LRNM);                     break;\r
1968         case  7: CMPGT(sh2, Rm, Rn);    rlog(LRNM);                     break;\r
1969         case  8: SUB(sh2, Rm, Rn);      rlog(LRNM);                     break;\r
1970         case  9: ILLEGAL(sh2);          rlog(0);                        break;\r
1971         case 10: SUBC(sh2, Rm, Rn);     rlog(LRNM);                     break;\r
1972         case 11: SUBV(sh2, Rm, Rn);     rlog(LRNM);                     break;\r
1973         case 12: ADD(sh2, Rm, Rn);      rlog(LRNM);                     break;\r
1974         case 13: DMULS(sh2, Rm, Rn);    rlog(LRNM); rlog2(SHR_MACL,SHR_MACH); break;\r
1975         case 14: ADDC(sh2, Rm, Rn);     rlog(LRNM);                     break;\r
1976         case 15: ADDV(sh2, Rm, Rn);     rlog(LRNM);                     break;\r
1977         }\r
1978 }\r
1979 \r
1980 INLINE void op0100(sh2_state *sh2, UINT16 opcode)\r
1981 {\r
1982         switch (opcode & 0x3F)\r
1983         {\r
1984         case 0x00: SHLL(sh2, Rn);       rlog(LRN);                      break;\r
1985         case 0x01: SHLR(sh2, Rn);       rlog(LRN);                      break;\r
1986         case 0x02: STSMMACH(sh2, Rn);   rlog(LRN); rlog1(SHR_MACH);     break;\r
1987         case 0x03: STCMSR(sh2, Rn);     rlog(LRN);                      break;\r
1988         case 0x04: ROTL(sh2, Rn);       rlog(LRN);                      break;\r
1989         case 0x05: ROTR(sh2, Rn);       rlog(LRN);                      break;\r
1990         case 0x06: LDSMMACH(sh2, Rn);   rlog(LRN); rlog1(SHR_MACH);     break;\r
1991         case 0x07: LDCMSR(sh2, Rn);     rlog(LRN);                      break;\r
1992         case 0x08: SHLL2(sh2, Rn);      rlog(LRN);                      break;\r
1993         case 0x09: SHLR2(sh2, Rn);      rlog(LRN);                      break;\r
1994         case 0x0a: LDSMACH(sh2, Rn);    rlog(LRN); rlog1(SHR_MACH);     break;\r
1995         case 0x0b: JSR(sh2, Rn);        rlog(LRN); rlog1(SHR_PR);       break;\r
1996         case 0x0c: ILLEGAL(sh2);        rlog(0);                        break;\r
1997         case 0x0d: ILLEGAL(sh2);        rlog(0);                        break;\r
1998         case 0x0e: LDCSR(sh2, Rn);      rlog(LRN);                      break;\r
1999         case 0x0f: MAC_W(sh2, Rm, Rn);  rlog(LRNM); rlog2(SHR_MACL,SHR_MACH); break;\r
2000 \r
2001         case 0x10: DT(sh2, Rn);         rlog(LRN);                      break;\r
2002         case 0x11: CMPPZ(sh2, Rn);      rlog(LRN);                      break;\r
2003         case 0x12: STSMMACL(sh2, Rn);   rlog(LRN); rlog1(SHR_MACL);     break;\r
2004         case 0x13: STCMGBR(sh2, Rn);    rlog(LRN); rlog1(SHR_GBR);      break;\r
2005         case 0x14: ILLEGAL(sh2);        rlog(0);                        break;\r
2006         case 0x15: CMPPL(sh2, Rn);      rlog(LRN);                      break;\r
2007         case 0x16: LDSMMACL(sh2, Rn);   rlog(LRN); rlog1(SHR_MACL);     break;\r
2008         case 0x17: LDCMGBR(sh2, Rn);    rlog(LRN); rlog1(SHR_GBR);      break;\r
2009         case 0x18: SHLL8(sh2, Rn);      rlog(LRN);                      break;\r
2010         case 0x19: SHLR8(sh2, Rn);      rlog(LRN);                      break;\r
2011         case 0x1a: LDSMACL(sh2, Rn);    rlog(LRN); rlog1(SHR_MACL);     break;\r
2012         case 0x1b: TAS(sh2, Rn);        rlog(LRN);                      break;\r
2013         case 0x1c: ILLEGAL(sh2);        rlog(0);                        break;\r
2014         case 0x1d: ILLEGAL(sh2);        rlog(0);                        break;\r
2015         case 0x1e: LDCGBR(sh2, Rn);     rlog(LRN); rlog1(SHR_GBR);      break;\r
2016         case 0x1f: MAC_W(sh2, Rm, Rn);  rlog(LRNM); rlog2(SHR_MACL,SHR_MACH); break;\r
2017 \r
2018         case 0x20: SHAL(sh2, Rn);       rlog(LRN);                      break;\r
2019         case 0x21: SHAR(sh2, Rn);       rlog(LRN);                      break;\r
2020         case 0x22: STSMPR(sh2, Rn);     rlog(LRN); rlog1(SHR_PR);       break;\r
2021         case 0x23: STCMVBR(sh2, Rn);    rlog(LRN); rlog1(SHR_VBR);      break;\r
2022         case 0x24: ROTCL(sh2, Rn);      rlog(LRN);                      break;\r
2023         case 0x25: ROTCR(sh2, Rn);      rlog(LRN);                      break;\r
2024         case 0x26: LDSMPR(sh2, Rn);     rlog(LRN); rlog1(SHR_PR);       break;\r
2025         case 0x27: LDCMVBR(sh2, Rn);    rlog(LRN); rlog1(SHR_VBR);      break;\r
2026         case 0x28: SHLL16(sh2, Rn);     rlog(LRN);                      break;\r
2027         case 0x29: SHLR16(sh2, Rn);     rlog(LRN);                      break;\r
2028         case 0x2a: LDSPR(sh2, Rn);      rlog(LRN); rlog1(SHR_PR);       break;\r
2029         case 0x2b: JMP(sh2, Rn);        rlog(LRN);                      break;\r
2030         case 0x2c: ILLEGAL(sh2);        rlog(0);                        break;\r
2031         case 0x2d: ILLEGAL(sh2);        rlog(0);                        break;\r
2032         case 0x2e: LDCVBR(sh2, Rn);     rlog(LRN); rlog1(SHR_VBR);      break;\r
2033         case 0x2f: MAC_W(sh2, Rm, Rn);  rlog(LRNM); rlog2(SHR_MACL,SHR_MACH); break;\r
2034 \r
2035         case 0x30:\r
2036         case 0x31:\r
2037         case 0x32:\r
2038         case 0x33:\r
2039         case 0x34:\r
2040         case 0x35:\r
2041         case 0x36:\r
2042         case 0x37:\r
2043         case 0x38:\r
2044         case 0x39:\r
2045         case 0x3a:\r
2046         case 0x3b:\r
2047         case 0x3c:\r
2048         case 0x3d:\r
2049         case 0x3e: ILLEGAL(sh2);        rlog(0);                        break;\r
2050         case 0x3f: MAC_W(sh2, Rm, Rn);  rlog(LRNM); rlog2(SHR_MACL,SHR_MACH); break;\r
2051         }\r
2052 }\r
2053 \r
2054 INLINE void op0101(sh2_state *sh2, UINT16 opcode)\r
2055 {\r
2056         MOVLL4(sh2, Rm, opcode & 0x0f, Rn);\r
2057         rlog(LRNM);\r
2058 }\r
2059 \r
2060 INLINE void op0110(sh2_state *sh2, UINT16 opcode)\r
2061 {\r
2062         switch (opcode & 15)\r
2063         {\r
2064         case  0: MOVBL(sh2, Rm, Rn);                            break;\r
2065         case  1: MOVWL(sh2, Rm, Rn);                            break;\r
2066         case  2: MOVLL(sh2, Rm, Rn);                            break;\r
2067         case  3: MOV(sh2, Rm, Rn);                              break;\r
2068         case  4: MOVBP(sh2, Rm, Rn);                            break;\r
2069         case  5: MOVWP(sh2, Rm, Rn);                            break;\r
2070         case  6: MOVLP(sh2, Rm, Rn);                            break;\r
2071         case  7: NOT(sh2, Rm, Rn);                              break;\r
2072         case  8: SWAPB(sh2, Rm, Rn);                            break;\r
2073         case  9: SWAPW(sh2, Rm, Rn);                            break;\r
2074         case 10: NEGC(sh2, Rm, Rn);                             break;\r
2075         case 11: NEG(sh2, Rm, Rn);                              break;\r
2076         case 12: EXTUB(sh2, Rm, Rn);                            break;\r
2077         case 13: EXTUW(sh2, Rm, Rn);                            break;\r
2078         case 14: EXTSB(sh2, Rm, Rn);                            break;\r
2079         case 15: EXTSW(sh2, Rm, Rn);                            break;\r
2080         }\r
2081         rlog(LRNM);\r
2082 }\r
2083 \r
2084 INLINE void op0111(sh2_state *sh2, UINT16 opcode)\r
2085 {\r
2086         ADDI(sh2, opcode & 0xff, Rn);\r
2087         rlog(LRN);\r
2088 }\r
2089 \r
2090 INLINE void op1000(sh2_state *sh2, UINT16 opcode)\r
2091 {\r
2092         switch ( opcode  & (15<<8) )\r
2093         {\r
2094         case  0<< 8: MOVBS4(sh2, opcode & 0x0f, Rm);    rlog(LRM); rlog1(0);    break;\r
2095         case  1<< 8: MOVWS4(sh2, opcode & 0x0f, Rm);    rlog(LRM); rlog1(0);    break;\r
2096         case  2<< 8: ILLEGAL(sh2);                      rlog(0);                break;\r
2097         case  3<< 8: ILLEGAL(sh2);                      rlog(0);                break;\r
2098         case  4<< 8: MOVBL4(sh2, Rm, opcode & 0x0f);    rlog(LRM); rlog1(0);    break;\r
2099         case  5<< 8: MOVWL4(sh2, Rm, opcode & 0x0f);    rlog(LRM); rlog1(0);    break;\r
2100         case  6<< 8: ILLEGAL(sh2);                      rlog(0);                break;\r
2101         case  7<< 8: ILLEGAL(sh2);                      rlog(0);                break;\r
2102         case  8<< 8: CMPIM(sh2, opcode & 0xff);         rlog(0);   rlog1(0);    break;\r
2103         case  9<< 8: BT(sh2, opcode & 0xff);            rlog(0);        break;\r
2104         case 10<< 8: ILLEGAL(sh2);                      rlog(0);        break;\r
2105         case 11<< 8: BF(sh2, opcode & 0xff);            rlog(0);        break;\r
2106         case 12<< 8: ILLEGAL(sh2);                      rlog(0);        break;\r
2107         case 13<< 8: BTS(sh2, opcode & 0xff);           rlog(0);        break;\r
2108         case 14<< 8: ILLEGAL(sh2);                      rlog(0);        break;\r
2109         case 15<< 8: BFS(sh2, opcode & 0xff);           rlog(0);        break;\r
2110         }\r
2111 }\r
2112 \r
2113 \r
2114 INLINE void op1001(sh2_state *sh2, UINT16 opcode)\r
2115 {\r
2116         MOVWI(sh2, opcode & 0xff, Rn);\r
2117         rlog(LRN);\r
2118 }\r
2119 \r
2120 INLINE void op1010(sh2_state *sh2, UINT16 opcode)\r
2121 {\r
2122         BRA(sh2, opcode & 0xfff);\r
2123         rlog(0);\r
2124 }\r
2125 \r
2126 INLINE void op1011(sh2_state *sh2, UINT16 opcode)\r
2127 {\r
2128         BSR(sh2, opcode & 0xfff);\r
2129         rlog(0);\r
2130         rlog1(SHR_PR);\r
2131 }\r
2132 \r
2133 INLINE void op1100(sh2_state *sh2, UINT16 opcode)\r
2134 {\r
2135         switch (opcode & (15<<8))\r
2136         {\r
2137         case  0<<8: MOVBSG(sh2, opcode & 0xff); rlog2(0, SHR_GBR);      break;\r
2138         case  1<<8: MOVWSG(sh2, opcode & 0xff); rlog2(0, SHR_GBR);      break;\r
2139         case  2<<8: MOVLSG(sh2, opcode & 0xff); rlog2(0, SHR_GBR);      break;\r
2140         case  3<<8: TRAPA(sh2, opcode & 0xff);  rlog1(SHR_VBR);         break;\r
2141         case  4<<8: MOVBLG(sh2, opcode & 0xff); rlog2(0, SHR_GBR);      break;\r
2142         case  5<<8: MOVWLG(sh2, opcode & 0xff); rlog2(0, SHR_GBR);      break;\r
2143         case  6<<8: MOVLLG(sh2, opcode & 0xff); rlog2(0, SHR_GBR);      break;\r
2144         case  7<<8: MOVA(sh2, opcode & 0xff);   rlog1(0);               break;\r
2145         case  8<<8: TSTI(sh2, opcode & 0xff);   rlog1(0);               break;\r
2146         case  9<<8: ANDI(sh2, opcode & 0xff);   rlog1(0);               break;\r
2147         case 10<<8: XORI(sh2, opcode & 0xff);   rlog1(0);               break;\r
2148         case 11<<8: ORI(sh2, opcode & 0xff);    rlog1(0);               break;\r
2149         case 12<<8: TSTM(sh2, opcode & 0xff);   rlog2(0, SHR_GBR);      break;\r
2150         case 13<<8: ANDM(sh2, opcode & 0xff);   rlog2(0, SHR_GBR);      break;\r
2151         case 14<<8: XORM(sh2, opcode & 0xff);   rlog2(0, SHR_GBR);      break;\r
2152         case 15<<8: ORM(sh2, opcode & 0xff);    rlog2(0, SHR_GBR);      break;\r
2153         }\r
2154         rlog(0);\r
2155 }\r
2156 \r
2157 INLINE void op1101(sh2_state *sh2, UINT16 opcode)\r
2158 {\r
2159         MOVLI(sh2, opcode & 0xff, Rn);\r
2160         rlog(LRN);\r
2161 }\r
2162 \r
2163 INLINE void op1110(sh2_state *sh2, UINT16 opcode)\r
2164 {\r
2165         MOVI(sh2, opcode & 0xff, Rn);\r
2166         rlog(LRN);\r
2167 }\r
2168 \r
2169 INLINE void op1111(sh2_state *sh2, UINT16 opcode)\r
2170 {\r
2171         ILLEGAL(sh2);\r
2172         rlog(0);\r
2173 }\r
2174 \r
2175 #endif\r