summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/cpu/dsp32/dsp32ops.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/cpu/dsp32/dsp32ops.c')
-rw-r--r--src/emu/cpu/dsp32/dsp32ops.c2898
1 files changed, 2898 insertions, 0 deletions
diff --git a/src/emu/cpu/dsp32/dsp32ops.c b/src/emu/cpu/dsp32/dsp32ops.c
new file mode 100644
index 00000000000..fce00795ccb
--- /dev/null
+++ b/src/emu/cpu/dsp32/dsp32ops.c
@@ -0,0 +1,2898 @@
+/***************************************************************************
+
+ dsp32ops.c
+ Core implementation for the portable DSP32 emulator.
+ Written by Aaron Giles
+
+***************************************************************************/
+
+
+
+/***************************************************************************
+ COMPILE-TIME OPTIONS
+***************************************************************************/
+
+/* these defined latencies are a pain to implement, but are necessary */
+#define EMULATE_MEMORY_LATENCY (1)
+#define EMULATE_MULTIPLIER_LATENCY (1)
+#define EMULATE_AFLAGS_LATENCY (1)
+
+/* these optimizations should have some effect, but they don't really, so */
+/* leave them off */
+#define IGNORE_DAU_UV_FLAGS (0)
+#define ASSUME_WRITEABLE (0)
+#define ASSUME_UNCONDITIONAL_CAU (0)
+
+
+
+/***************************************************************************
+ MACROS
+***************************************************************************/
+
+#define SET_V_16(a,b,r) dsp32.vflags = (((a) ^ (b) ^ (r) ^ ((r) >> 1)) << 8)
+#define SET_NZC_16(r) dsp32.nzcflags = ((r) << 8)
+#define SET_NZCV_16(a,b,r) SET_NZC_16(r); SET_V_16(a,b,r)
+#define SET_NZ00_16(r) dsp32.nzcflags = (((r) << 8) & 0xffffff); dsp32.vflags = 0
+
+#define SET_V_24(a,b,r) dsp32.vflags = ((a) ^ (b) ^ (r) ^ ((r) >> 1))
+#define SET_NZC_24(r) dsp32.nzcflags = (r)
+#define SET_NZCV_24(a,b,r) SET_NZC_24(r); SET_V_24(a,b,r)
+#define SET_NZ00_24(r) dsp32.nzcflags = ((r) & 0xffffff); dsp32.vflags = 0
+
+#define TRUNCATE24(a) ((a) & 0xffffff)
+#define EXTEND16_TO_24(a) TRUNCATE24((INT32)(INT16)(a))
+#define REG16(a) ((UINT16)dsp32.r[a])
+#define REG24(a) (dsp32.r[a])
+
+#define WRITEABLE_REGS (0x6f3efffe)
+#if ASSUME_WRITEABLE
+#define IS_WRITEABLE(r) (1)
+#else
+#define IS_WRITEABLE(r) (WRITEABLE_REGS & (1 << (r)))
+#endif
+
+#if ASSUME_UNCONDITIONAL_CAU
+#define CONDITION_IS_TRUE (1)
+#else
+#define CONDITION_IS_TRUE (!(OP & 0x400) || (condition((OP >> 12) & 15)))
+#endif
+
+#if EMULATE_MEMORY_LATENCY
+#define WWORD_DEFERRED(a,v) do { int bufidx = dsp32.mbuf_index & 3; dsp32.mbufaddr[bufidx] = -(a); dsp32.mbufdata[bufidx] = (v); } while (0)
+#define WLONG_DEFERRED(a,v) do { int bufidx = dsp32.mbuf_index & 3; dsp32.mbufaddr[bufidx] = (a); dsp32.mbufdata[bufidx] = (v); } while (0)
+#define PROCESS_DEFERRED_MEMORY() \
+ if (dsp32.mbufaddr[++dsp32.mbuf_index & 3] != 1) \
+ { \
+ int bufidx = dsp32.mbuf_index & 3; \
+ if (dsp32.mbufaddr[bufidx] >= 0) \
+ WLONG(dsp32.mbufaddr[bufidx], dsp32.mbufdata[bufidx]); \
+ else \
+ WWORD(-dsp32.mbufaddr[bufidx], dsp32.mbufdata[bufidx]); \
+ dsp32.mbufaddr[bufidx] = 1; \
+ }
+#else
+#define WWORD_DEFERRED(a,v) WWORD(a,v)
+#define WLONG_DEFERRED(a,v) WLONG(a,v)
+#define PROCESS_DEFERRED_MEMORY()
+#endif
+
+#if EMULATE_MULTIPLIER_LATENCY
+#define DEFERRED_MULTIPLIER(x) dau_get_amult(x)
+#else
+#define DEFERRED_MULTIPLIER(x) dsp32.a[x]
+#endif
+
+#if EMULATE_AFLAGS_LATENCY
+#define DEFERRED_NZFLAGS dau_get_anzflags()
+#define DEFERRED_VUFLAGS dau_get_avuflags()
+#else
+#define DEFERRED_NZFLAGS dsp32.NZflags
+#define DEFERRED_VUFLAGS dsp32.VUflags
+#endif
+
+
+
+/***************************************************************************
+ FORWARD DECLARATIONS
+***************************************************************************/
+
+extern void (*dsp32ops[])(void);
+
+
+
+/***************************************************************************
+ TYPEDEFS
+***************************************************************************/
+
+typedef union int_double
+{
+ double d;
+ UINT32 i[2];
+} int_double;
+
+
+
+/***************************************************************************
+ IMPLEMENTATION
+***************************************************************************/
+
+static void illegal(void)
+{
+}
+
+
+static void unimplemented(void)
+{
+ fatalerror("Unimplemented op @ %06X: %08X (dis=%02X, tbl=%03X)", dsp32.PC - 4, OP, OP >> 25, OP >> 21);
+}
+
+
+INLINE void execute_one(void)
+{
+ PROCESS_DEFERRED_MEMORY();
+ CALL_MAME_DEBUG;
+ OP = ROPCODE(dsp32.PC);
+ dsp32_icount -= 4; /* 4 clocks per cycle */
+ dsp32.PC += 4;
+ if (OP)
+ (*dsp32ops[OP >> 21])();
+}
+
+
+
+/***************************************************************************
+ CAU HELPERS
+***************************************************************************/
+
+static UINT32 cau_read_pi_special(UINT8 i)
+{
+ switch (i)
+ {
+ case 4: return dsp32.ibuf;
+ case 5: return dsp32.obuf;
+ case 6: update_pcr(dsp32.pcr & ~PCR_PDFs); return dsp32.pdr;
+ case 14: return dsp32.piop;
+ case 20: return dsp32.pdr2;
+ case 22: update_pcr(dsp32.pcr & ~PCR_PIFs); return dsp32.pir;
+ case 30: return dsp32.pcw;
+ default: fprintf(stderr, "Unimplemented CAU PI read = %X\n", i);
+ }
+ return 0;
+}
+
+
+static void cau_write_pi_special(UINT8 i, UINT32 val)
+{
+ switch (i)
+ {
+ case 4: dsp32.ibuf = val; break;
+ case 5: dsp32.obuf = val; break;
+ case 6: dsp32.pdr = val; update_pcr(dsp32.pcr | PCR_PDFs); break;
+ case 14: dsp32.piop = val; break;
+ case 20: dsp32.pdr2 = val; break;
+ case 22: dsp32.pir = val; update_pcr(dsp32.pcr | PCR_PIFs); break;
+ case 30: dsp32.pcw = val; break;
+ default: fprintf(stderr, "Unimplemented CAU PI write = %X\n", i);
+ }
+}
+
+
+INLINE UINT8 cau_read_pi_1byte(int pi)
+{
+ int p = (pi >> 5) & 0x1f;
+ int i = (pi >> 0) & 0x1f;
+ if (p)
+ {
+ UINT32 result = RBYTE(dsp32.r[p]);
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i]);
+ return result;
+ }
+ else
+ return cau_read_pi_special(i);
+}
+
+
+INLINE UINT16 cau_read_pi_2byte(int pi)
+{
+ int p = (pi >> 5) & 0x1f;
+ int i = (pi >> 0) & 0x1f;
+ if (p)
+ {
+ UINT32 result = RWORD(dsp32.r[p]);
+ if (i < 22 || i > 23)
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i]);
+ else
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i] * 2);
+ return result;
+ }
+ else
+ return cau_read_pi_special(i);
+}
+
+
+INLINE UINT32 cau_read_pi_4byte(int pi)
+{
+ int p = (pi >> 5) & 0x1f;
+ int i = (pi >> 0) & 0x1f;
+ if (p)
+ {
+ UINT32 result = RLONG(dsp32.r[p]);
+ if (i < 22 || i > 23)
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i]);
+ else
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i] * 4);
+ return result;
+ }
+ else
+ return cau_read_pi_special(i);
+}
+
+
+INLINE void cau_write_pi_1byte(int pi, UINT8 val)
+{
+ int p = (pi >> 5) & 0x1f;
+ int i = (pi >> 0) & 0x1f;
+ if (p)
+ {
+ WBYTE(dsp32.r[p], val);
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i]);
+ }
+ else
+ cau_write_pi_special(i, val);
+}
+
+
+INLINE void cau_write_pi_2byte(int pi, UINT16 val)
+{
+ int p = (pi >> 5) & 0x1f;
+ int i = (pi >> 0) & 0x1f;
+ if (p)
+ {
+ WWORD(dsp32.r[p], val);
+ if (i < 22 || i > 23)
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i]);
+ else
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i] * 2);
+ }
+ else
+ cau_write_pi_special(i, val);
+}
+
+
+INLINE void cau_write_pi_4byte(int pi, UINT32 val)
+{
+ int p = (pi >> 5) & 0x1f;
+ int i = (pi >> 0) & 0x1f;
+ if (p)
+ {
+ WLONG(dsp32.r[p], (INT32)(val << 8) >> 8);
+ if (i < 22 || i > 23)
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i]);
+ else
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i] * 4);
+ }
+ else
+ cau_write_pi_special(i, val);
+}
+
+
+
+/***************************************************************************
+ DAU HELPERS
+***************************************************************************/
+
+INLINE double dau_get_amult(int aidx)
+{
+ int bufidx = (dsp32.abuf_index - 1) & 3;
+ double val = dsp32.a[aidx];
+ while (dsp32_icount >= dsp32.abufcycle[bufidx] - 2 * 4)
+ {
+ if (dsp32.abufreg[bufidx] == aidx)
+ val = dsp32.abuf[bufidx];
+ bufidx = (bufidx - 1) & 3;
+ }
+ return val;
+}
+
+
+INLINE double dau_get_anzflags(void)
+{
+ int bufidx = (dsp32.abuf_index - 1) & 3;
+ double nzflags = dsp32.NZflags;
+ while (dsp32_icount >= dsp32.abufcycle[bufidx] - 3 * 4)
+ {
+ nzflags = dsp32.abufNZflags[bufidx];
+ bufidx = (bufidx - 1) & 3;
+ }
+ return nzflags;
+}
+
+
+INLINE UINT8 dau_get_avuflags(void)
+{
+#if (!IGNORE_DAU_UV_FLAGS)
+ int bufidx = (dsp32.abuf_index - 1) & 3;
+ UINT8 vuflags = dsp32.VUflags;
+ while (dsp32_icount >= dsp32.abufcycle[bufidx] - 3 * 4)
+ {
+ vuflags = dsp32.abufVUflags[bufidx];
+ bufidx = (bufidx - 1) & 3;
+ }
+ return vuflags;
+#else
+ return 0;
+#endif
+}
+
+
+INLINE void remember_last_dau(int aidx)
+{
+#if (EMULATE_MULTIPLIER_LATENCY || EMULATE_AFLAGS_LATENCY)
+ int bufidx = dsp32.abuf_index++ & 3;
+ dsp32.abuf[bufidx] = dsp32.a[aidx];
+ dsp32.abufreg[bufidx] = aidx;
+ dsp32.abufNZflags[bufidx] = dsp32.NZflags;
+#if (!IGNORE_DAU_UV_FLAGS)
+ dsp32.abufVUflags[bufidx] = dsp32.VUflags;
+#endif
+ dsp32.abufcycle[bufidx] = dsp32_icount;
+#endif
+}
+
+
+INLINE void dau_set_val_noflags(int aidx, double res)
+{
+ remember_last_dau(aidx);
+ dsp32.a[aidx] = res;
+}
+
+
+INLINE void dau_set_val_flags(int aidx, double res)
+{
+ remember_last_dau(aidx);
+#if (!IGNORE_DAU_UV_FLAGS)
+{
+ double absres = (res < 0) ? -res : res;
+ dsp32.VUflags = 0;
+ if (absres < 5.87747e-39)
+ {
+ if (absres != 0)
+ dsp32.VUflags = UFLAGBIT;
+ res = 0.0;
+ }
+ else if (absres > 3.40282e38)
+ {
+ dsp32.VUflags = VFLAGBIT;
+// DEBUGGER_BREAK;
+// fprintf(stderr, "Result = %g\n", absres);
+ res = (res < 0) ? -3.40282e38 : 3.40282e38;
+ }
+}
+#endif
+ dsp32.NZflags = res;
+ dsp32.a[aidx] = res;
+}
+
+
+INLINE double dsp_to_double(UINT32 val)
+{
+ int_double id;
+
+ if (val == 0)
+ return 0;
+ else if ((INT32)val > 0)
+ {
+ int exponent = ((val & 0xff) - 128 + 1023) << 20;
+ id.i[BYTE_XOR_BE(0)] = exponent + (val >> 11);
+ id.i[BYTE_XOR_BE(1)] = (val << 21) & 0xe0000000;
+ }
+ else
+ {
+ int exponent = ((val & 0xff) - 128 + 1023) << 20;
+ val = -(val & 0xffffff00);
+ id.i[BYTE_XOR_BE(0)] = 0x80000000 + exponent + ((val >> 11) & 0x001fffff);
+ id.i[BYTE_XOR_BE(1)] = (val << 21) & 0xe0000000;
+ }
+ return id.d;
+}
+
+
+INLINE UINT32 double_to_dsp(double val)
+{
+ int mantissa, exponent;
+ int_double id;
+ id.d = val;
+ mantissa = ((id.i[BYTE_XOR_BE(0)] & 0x000fffff) << 11) | ((id.i[BYTE_XOR_BE(1)] & 0xe0000000) >> 21);
+ exponent = ((id.i[BYTE_XOR_BE(0)] & 0x7ff00000) >> 20) - 1023 + 128;
+ if (exponent < 0)
+ return 0x00000000;
+ else if (exponent > 255)
+ {
+// DEBUGGER_BREAK;
+// fprintf(stderr, "Exponent = %d\n", exponent);
+ return ((INT32)id.i[BYTE_XOR_BE(0)] >= 0) ? 0x7fffffff : 0x800000ff;
+ }
+ else if ((INT32)id.i[BYTE_XOR_BE(0)] >= 0)
+ return exponent | mantissa;
+ else
+ {
+ mantissa = -mantissa;
+ if (mantissa == 0) { mantissa = 0x80000000; exponent--; }
+ return 0x80000000 | exponent | (mantissa & 0xffffff00);
+ }
+}
+
+
+static double dau_read_pi_special(int i)
+{
+ fatalerror("Unimplemented dau_read_pi_special(%d)", i);
+ return 0;
+}
+
+
+static void dau_write_pi_special(int i, double val)
+{
+ fatalerror("Unimplemented dau_write_pi_special(%d)", i);
+}
+
+
+static int lastp;
+
+INLINE double dau_read_pi_double_1st(int pi, int multiplier)
+{
+ int p = (pi >> 3) & 15;
+ int i = (pi >> 0) & 7;
+
+ lastp = p;
+ if (p)
+ {
+ UINT32 result = RLONG(dsp32.r[p]);
+ if (i < 6)
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i+16]);
+ else
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i+16] * 4);
+ return dsp_to_double(result);
+ }
+ else if (i < 4)
+ return multiplier ? DEFERRED_MULTIPLIER(i) : dsp32.a[i];
+ else
+ return dau_read_pi_special(i);
+}
+
+
+INLINE double dau_read_pi_double_2nd(int pi, int multiplier, double xval)
+{
+ int p = (pi >> 3) & 15;
+ int i = (pi >> 0) & 7;
+
+ if (p == 15) p = lastp; /* P=15 means Z inherits from Y, Y inherits from X */
+ lastp = p;
+ if (p)
+ {
+ UINT32 result;
+ result = RLONG(dsp32.r[p]);
+ if (i < 6)
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i+16]);
+ else
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i+16] * 4);
+ return dsp_to_double(result);
+ }
+ else if (i < 4)
+ return multiplier ? DEFERRED_MULTIPLIER(i) : dsp32.a[i];
+ else
+ return dau_read_pi_special(i);
+}
+
+
+INLINE UINT32 dau_read_pi_4bytes(int pi)
+{
+ int p = (pi >> 3) & 15;
+ int i = (pi >> 0) & 7;
+
+ lastp = p;
+ if (p)
+ {
+ UINT32 result = RLONG(dsp32.r[p]);
+ if (i < 6)
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i+16]);
+ else
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i+16] * 4);
+ return result;
+ }
+ else if (i < 4)
+ return double_to_dsp(dsp32.a[i]);
+ else
+ return dau_read_pi_special(i);
+}
+
+
+INLINE UINT16 dau_read_pi_2bytes(int pi)
+{
+ int p = (pi >> 3) & 15;
+ int i = (pi >> 0) & 7;
+
+ lastp = p;
+ if (p)
+ {
+ UINT32 result = RWORD(dsp32.r[p]);
+ if (i < 6)
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i+16]);
+ else
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i+16] * 2);
+ return result;
+ }
+ else if (i < 4)
+ return double_to_dsp(dsp32.a[i]);
+ else
+ return dau_read_pi_special(i);
+}
+
+
+INLINE void dau_write_pi_double(int pi, double val)
+{
+ int p = (pi >> 3) & 15;
+ int i = (pi >> 0) & 7;
+
+ if (p == 15) p = lastp; /* P=15 means Z inherits from Y, Y inherits from X */
+ if (p)
+ {
+ WLONG_DEFERRED(dsp32.r[p], double_to_dsp(val));
+ if (i < 6)
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i+16]);
+ else
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i+16] * 4);
+ }
+ else if (i < 4)
+ dau_set_val_noflags(i, val);
+ else
+ dau_write_pi_special(i, val);
+}
+
+
+INLINE void dau_write_pi_4bytes(int pi, UINT32 val)
+{
+ int p = (pi >> 3) & 15;
+ int i = (pi >> 0) & 7;
+
+ if (p == 15) p = lastp; /* P=15 means Z inherits from Y, Y inherits from X */
+ if (p)
+ {
+ lastp = p;
+ WLONG_DEFERRED(dsp32.r[p], val);
+ if (i < 6)
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i+16]);
+ else
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i+16] * 4);
+ }
+ else if (i < 4)
+ dau_set_val_noflags(i, dsp_to_double(val));
+ else
+ dau_write_pi_special(i, val);
+}
+
+
+INLINE void dau_write_pi_2bytes(int pi, UINT16 val)
+{
+ int p = (pi >> 3) & 15;
+ int i = (pi >> 0) & 7;
+
+ if (p == 15) p = lastp; /* P=15 means Z inherits from Y, Y inherits from X */
+ if (p)
+ {
+ lastp = p;
+ WWORD_DEFERRED(dsp32.r[p], val);
+ if (i < 6)
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i+16]);
+ else
+ dsp32.r[p] = TRUNCATE24(dsp32.r[p] + dsp32.r[i+16] * 2);
+ }
+ else if (i < 4)
+ dau_set_val_noflags(i, dsp_to_double(val << 16));
+ else
+ dau_write_pi_special(i, val);
+}
+
+
+
+/***************************************************************************
+ COMMON CONDITION ROUTINE
+***************************************************************************/
+
+#if (!ASSUME_UNCONDITIONAL_CAU)
+static int condition(int cond)
+{
+ switch (cond)
+ {
+ case 0:
+ return 0;
+ case 1:
+ return 1;
+ case 2:
+ return !nFLAG;
+ case 3:
+ return nFLAG;
+ case 4:
+ return !zFLAG;
+ case 5:
+ return zFLAG;
+ case 6:
+ return !vFLAG;
+ case 7:
+ return vFLAG;
+ case 8:
+ return !cFLAG;
+ case 9:
+ return cFLAG;
+ case 10:
+ return !(nFLAG ^ cFLAG);
+ case 11:
+ return (nFLAG ^ cFLAG);
+ case 12:
+ return !(zFLAG | (nFLAG ^ vFLAG));
+ case 13:
+ return (zFLAG | (nFLAG ^ vFLAG));
+ case 14:
+ return !(cFLAG | zFLAG);
+ case 15:
+ return (cFLAG | zFLAG);
+
+ case 16:
+ return !(DEFERRED_VUFLAGS & UFLAGBIT);
+ case 17:
+ return (DEFERRED_VUFLAGS & UFLAGBIT);
+ case 18:
+ return !(DEFERRED_NZFLAGS < 0);
+ case 19:
+ return (DEFERRED_NZFLAGS < 0);
+ case 20:
+ return !(DEFERRED_NZFLAGS == 0);
+ case 21:
+ return (DEFERRED_NZFLAGS == 0);
+ case 22:
+ return !(DEFERRED_VUFLAGS & VFLAGBIT);
+ case 23:
+ return (DEFERRED_VUFLAGS & VFLAGBIT);
+ case 24:
+ return !(DEFERRED_NZFLAGS <= 0);
+ case 25:
+ return (DEFERRED_NZFLAGS <= 0);
+
+ case 32: /* !ibf */
+ case 33: /* ibf */
+ case 34: /* !obe */
+ case 35: /* obe */
+ case 36: /* !pdf */
+ case 37: /* pdf */
+ case 38: /* !pif */
+ case 39: /* pif */
+ case 40: /* !sy */
+ case 41: /* sy */
+ case 42: /* !fb */
+ case 43: /* fb */
+ case 44: /* !ireq1 */
+ case 45: /* ireq1 */
+ case 46: /* !ireq2 */
+ case 47: /* ireq2 */
+ default:
+ fatalerror("Unimplemented condition: %X", cond);
+ }
+}
+#endif
+
+
+
+/***************************************************************************
+ CAU BRANCH INSTRUCTION IMPLEMENTATION
+***************************************************************************/
+
+static void nop(void)
+{
+ UINT32 op = OP;
+ if (op == 0)
+ return;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+
+}
+
+
+static void goto_t(void)
+{
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+}
+
+
+static void goto_pl(void)
+{
+ if (!nFLAG)
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_mi(void)
+{
+ if (nFLAG)
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_ne(void)
+{
+ if (!zFLAG)
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_eq(void)
+{
+ if (zFLAG)
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_vc(void)
+{
+ if (!vFLAG)
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_vs(void)
+{
+ if (vFLAG)
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_cc(void)
+{
+ if (!cFLAG)
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_cs(void)
+{
+ if (cFLAG)
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_ge(void)
+{
+ if (!(nFLAG ^ vFLAG))
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_lt(void)
+{
+ if (nFLAG ^ vFLAG)
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_gt(void)
+{
+ if (!(zFLAG | (nFLAG ^ vFLAG)))
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_le(void)
+{
+ if (zFLAG | (nFLAG ^ vFLAG))
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_hi(void)
+{
+ if (!cFLAG && !zFLAG)
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_ls(void)
+{
+ if (cFLAG || zFLAG)
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_auc(void)
+{
+ if (!(DEFERRED_VUFLAGS & UFLAGBIT))
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_aus(void)
+{
+ if (DEFERRED_VUFLAGS & UFLAGBIT)
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_age(void)
+{
+ if (DEFERRED_NZFLAGS >= 0)
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_alt(void)
+{
+ if (DEFERRED_NZFLAGS < 0)
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_ane(void)
+{
+ if (DEFERRED_NZFLAGS != 0)
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_aeq(void)
+{
+ if (DEFERRED_NZFLAGS == 0)
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_avc(void)
+{
+ if (!(DEFERRED_VUFLAGS & VFLAGBIT))
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_avs(void)
+{
+ if (DEFERRED_VUFLAGS & VFLAGBIT)
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_agt(void)
+{
+ if (DEFERRED_NZFLAGS > 0)
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_ale(void)
+{
+ if (DEFERRED_NZFLAGS <= 0)
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void goto_ibe(void)
+{
+ unimplemented();
+}
+
+
+static void goto_ibf(void)
+{
+ unimplemented();
+}
+
+
+static void goto_obf(void)
+{
+ unimplemented();
+}
+
+
+static void goto_obe(void)
+{
+ unimplemented();
+}
+
+
+static void goto_pde(void)
+{
+ unimplemented();
+}
+
+
+static void goto_pdf(void)
+{
+ unimplemented();
+}
+
+
+static void goto_pie(void)
+{
+ unimplemented();
+}
+
+
+static void goto_pif(void)
+{
+ unimplemented();
+}
+
+
+static void goto_syc(void)
+{
+ unimplemented();
+}
+
+
+static void goto_sys(void)
+{
+ unimplemented();
+}
+
+
+static void goto_fbc(void)
+{
+ unimplemented();
+}
+
+
+static void goto_fbs(void)
+{
+ unimplemented();
+}
+
+
+static void goto_irq1lo(void)
+{
+ unimplemented();
+}
+
+
+static void goto_irq1hi(void)
+{
+ unimplemented();
+}
+
+
+static void goto_irq2lo(void)
+{
+ unimplemented();
+}
+
+
+static void goto_irq2hi(void)
+{
+ unimplemented();
+}
+
+
+static void dec_goto(void)
+{
+ int hr = (OP >> 21) & 0x1f;
+ int old = (INT16)dsp32.r[hr];
+ dsp32.r[hr] = EXTEND16_TO_24(dsp32.r[hr] - 1);
+ if (old >= 0)
+ {
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+ }
+}
+
+
+static void call(void)
+{
+ UINT32 op = OP;
+ int mr = (op >> 21) & 0x1f;
+ if (IS_WRITEABLE(mr))
+ dsp32.r[mr] = dsp32.PC + 4;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (INT16)op);
+ memory_set_opbase(dsp32.PC);
+}
+
+
+static void goto24(void)
+{
+ UINT32 op = OP;
+ execute_one();
+ dsp32.PC = TRUNCATE24(REG24((op >> 16) & 0x1f) + (op & 0xffff) + ((op >> 5) & 0xff0000));
+ memory_set_opbase(dsp32.PC);
+}
+
+
+static void call24(void)
+{
+ UINT32 op = OP;
+ int mr = (op >> 16) & 0x1f;
+ if (IS_WRITEABLE(mr))
+ dsp32.r[mr] = dsp32.PC + 4;
+ execute_one();
+ dsp32.PC = (op & 0xffff) + ((op >> 5) & 0xff0000);
+ memory_set_opbase(dsp32.PC);
+}
+
+
+static void do_i(void)
+{
+ unimplemented();
+}
+
+
+static void do_r(void)
+{
+ unimplemented();
+}
+
+
+
+/***************************************************************************
+ CAU 16-BIT ARITHMETIC IMPLEMENTATION
+***************************************************************************/
+
+static void add_si(void)
+{
+ int dr = (OP >> 21) & 0x1f;
+ int hrval = REG16((OP >> 16) & 0x1f);
+ int res = hrval + (UINT16)OP;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ SET_NZCV_16(hrval, OP, res);
+}
+
+
+static void add_ss(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG16((OP >> 5) & 0x1f);
+ int s2rval = (OP & 0x800) ? REG16((OP >> 0) & 0x1f) : REG16(dr);
+ int res = s2rval + s1rval;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ SET_NZCV_16(s1rval, s2rval, res);
+ }
+}
+
+
+static void mul2_s(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG16((OP >> 5) & 0x1f);
+ int res = s1rval * 2;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ SET_NZCV_16(s1rval, 0, res);
+ }
+}
+
+
+static void subr_ss(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG16((OP >> 5) & 0x1f);
+ int s2rval = (OP & 0x800) ? REG16((OP >> 0) & 0x1f) : REG16(dr);
+ int res = s1rval - s2rval;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ SET_NZCV_16(s1rval, s2rval, res);
+ }
+}
+
+
+static void addr_ss(void)
+{
+ unimplemented();
+}
+
+
+static void sub_ss(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG16((OP >> 5) & 0x1f);
+ int s2rval = (OP & 0x800) ? REG16((OP >> 0) & 0x1f) : REG16(dr);
+ int res = s2rval - s1rval;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ SET_NZCV_16(s1rval, s2rval, res);
+ }
+}
+
+
+static void neg_s(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG16((OP >> 5) & 0x1f);
+ int res = -s1rval;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ SET_NZCV_16(s1rval, 0, res);
+ }
+}
+
+
+static void andc_ss(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG16((OP >> 5) & 0x1f);
+ int s2rval = (OP & 0x800) ? REG16((OP >> 0) & 0x1f) : REG16(dr);
+ int res = s2rval & ~s1rval;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ SET_NZ00_16(res);
+ }
+}
+
+
+static void cmp_ss(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int drval = REG16((OP >> 16) & 0x1f);
+ int s1rval = REG16((OP >> 5) & 0x1f);
+ int res = drval - s1rval;
+ SET_NZCV_16(drval, s1rval, res);
+ }
+}
+
+
+static void xor_ss(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG16((OP >> 5) & 0x1f);
+ int s2rval = (OP & 0x800) ? REG16((OP >> 0) & 0x1f) : REG16(dr);
+ int res = s2rval ^ s1rval;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ SET_NZ00_16(res);
+ }
+}
+
+
+static void rcr_s(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG16((OP >> 5) & 0x1f);
+ int res = ((dsp32.nzcflags >> 9) & 0x8000) | (s1rval >> 1);
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ dsp32.nzcflags = ((res & 0xffff) << 8) | ((s1rval & 1) << 24);
+ dsp32.vflags = 0;
+ }
+}
+
+
+static void or_ss(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG16((OP >> 5) & 0x1f);
+ int s2rval = (OP & 0x800) ? REG16((OP >> 0) & 0x1f) : REG16(dr);
+ int res = s2rval | s1rval;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ SET_NZ00_16(res);
+ }
+}
+
+
+static void rcl_s(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG16((OP >> 5) & 0x1f);
+ int res = ((dsp32.nzcflags >> 24) & 0x0001) | (s1rval << 1);
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ dsp32.nzcflags = ((res & 0xffff) << 8) | ((s1rval & 0x8000) << 9);
+ dsp32.vflags = 0;
+ }
+}
+
+
+static void shr_s(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG16((OP >> 5) & 0x1f);
+ int res = s1rval >> 1;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ dsp32.nzcflags = ((res & 0xffff) << 8) | ((s1rval & 1) << 24);
+ dsp32.vflags = 0;
+ }
+}
+
+
+static void div2_s(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG16((OP >> 5) & 0x1f);
+ int res = (s1rval & 0x8000) | (s1rval >> 1);
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ dsp32.nzcflags = ((res & 0xffff) << 8) | ((s1rval & 1) << 24);
+ dsp32.vflags = 0;
+ }
+}
+
+
+static void and_ss(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG16((OP >> 5) & 0x1f);
+ int s2rval = (OP & 0x800) ? REG16((OP >> 0) & 0x1f) : REG16(dr);
+ int res = s2rval & s1rval;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ SET_NZ00_16(res);
+ }
+}
+
+
+static void test_ss(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int drval = REG16((OP >> 16) & 0x1f);
+ int s1rval = REG16((OP >> 5) & 0x1f);
+ int res = drval & s1rval;
+ SET_NZ00_16(res);
+ }
+}
+
+
+static void add_di(void)
+{
+ int dr = (OP >> 16) & 0x1f;
+ int drval = REG16(dr);
+ int res = drval + (UINT16)OP;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ SET_NZCV_16(drval, OP, res);
+}
+
+
+static void subr_di(void)
+{
+ int dr = (OP >> 16) & 0x1f;
+ int drval = REG16(dr);
+ int res = (UINT16)OP - drval;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ SET_NZCV_16(drval, OP, res);
+}
+
+
+static void addr_di(void)
+{
+ unimplemented();
+}
+
+
+static void sub_di(void)
+{
+ int dr = (OP >> 16) & 0x1f;
+ int drval = REG16(dr);
+ int res = drval - (UINT16)OP;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ SET_NZCV_16(drval, OP, res);
+}
+
+
+static void andc_di(void)
+{
+ int dr = (OP >> 16) & 0x1f;
+ int drval = REG16(dr);
+ int res = drval & ~(UINT16)OP;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ SET_NZ00_16(res);
+}
+
+
+static void cmp_di(void)
+{
+ int drval = REG16((OP >> 16) & 0x1f);
+ int res = drval - (UINT16)OP;
+ SET_NZCV_16(drval, OP, res);
+}
+
+
+static void xor_di(void)
+{
+ int dr = (OP >> 16) & 0x1f;
+ int drval = REG16(dr);
+ int res = drval ^ (UINT16)OP;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ SET_NZ00_16(res);
+}
+
+
+static void or_di(void)
+{
+ int dr = (OP >> 16) & 0x1f;
+ int drval = REG16(dr);
+ int res = drval | (UINT16)OP;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ SET_NZ00_16(res);
+}
+
+
+static void and_di(void)
+{
+ int dr = (OP >> 16) & 0x1f;
+ int drval = REG16(dr);
+ int res = drval & (UINT16)OP;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ SET_NZ00_16(res);
+}
+
+
+static void test_di(void)
+{
+ int drval = REG16((OP >> 16) & 0x1f);
+ int res = drval & (UINT16)OP;
+ SET_NZ00_16(res);
+}
+
+
+
+/***************************************************************************
+ CAU 24-BIT ARITHMETIC IMPLEMENTATION
+***************************************************************************/
+
+static void adde_si(void)
+{
+ int dr = (OP >> 21) & 0x1f;
+ int hrval = REG24((OP >> 16) & 0x1f);
+ int res = hrval + EXTEND16_TO_24(OP);
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = TRUNCATE24(res);
+ SET_NZCV_24(hrval, OP << 8, res);
+}
+
+
+static void adde_ss(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG24((OP >> 5) & 0x1f);
+ int s2rval = (OP & 0x800) ? REG24((OP >> 0) & 0x1f) : REG24(dr);
+ int res = s2rval + s1rval;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = TRUNCATE24(res);
+ SET_NZCV_24(s1rval, s2rval, res);
+ }
+}
+
+
+static void mul2e_s(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG24((OP >> 5) & 0x1f);
+ int res = s1rval * 2;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = TRUNCATE24(res);
+ SET_NZCV_24(s1rval, 0, res);
+ }
+}
+
+
+static void subre_ss(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG24((OP >> 5) & 0x1f);
+ int s2rval = (OP & 0x800) ? REG24((OP >> 0) & 0x1f) : REG24(dr);
+ int res = s1rval - s2rval;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = TRUNCATE24(res);
+ SET_NZCV_24(s1rval, s2rval, res);
+ }
+}
+
+
+static void addre_ss(void)
+{
+ unimplemented();
+}
+
+
+static void sube_ss(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG24((OP >> 5) & 0x1f);
+ int s2rval = (OP & 0x800) ? REG24((OP >> 0) & 0x1f) : REG24(dr);
+ int res = s2rval - s1rval;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = TRUNCATE24(res);
+ SET_NZCV_24(s1rval, s2rval, res);
+ }
+}
+
+
+static void nege_s(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG24((OP >> 5) & 0x1f);
+ int res = -s1rval;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = TRUNCATE24(res);
+ SET_NZCV_24(s1rval, 0, res);
+ }
+}
+
+
+static void andce_ss(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG24((OP >> 5) & 0x1f);
+ int s2rval = (OP & 0x800) ? REG24((OP >> 0) & 0x1f) : REG24(dr);
+ int res = s2rval & ~s1rval;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = res;
+ SET_NZ00_24(res);
+ }
+}
+
+
+static void cmpe_ss(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int drval = REG24((OP >> 16) & 0x1f);
+ int s1rval = REG24((OP >> 5) & 0x1f);
+ int res = drval - s1rval;
+ SET_NZCV_24(drval, s1rval, res);
+ }
+}
+
+
+static void xore_ss(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG24((OP >> 5) & 0x1f);
+ int s2rval = (OP & 0x800) ? REG24((OP >> 0) & 0x1f) : REG24(dr);
+ int res = s2rval ^ s1rval;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = res;
+ SET_NZ00_24(res);
+ }
+}
+
+
+static void rcre_s(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG24((OP >> 5) & 0x1f);
+ int res = ((dsp32.nzcflags >> 1) & 0x800000) | (s1rval >> 1);
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = TRUNCATE24(res);
+ dsp32.nzcflags = res | ((s1rval & 1) << 24);
+ dsp32.vflags = 0;
+ }
+}
+
+
+static void ore_ss(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG24((OP >> 5) & 0x1f);
+ int s2rval = (OP & 0x800) ? REG24((OP >> 0) & 0x1f) : REG24(dr);
+ int res = s2rval | s1rval;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = res;
+ SET_NZ00_24(res);
+ }
+}
+
+
+static void rcle_s(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG24((OP >> 5) & 0x1f);
+ int res = ((dsp32.nzcflags >> 24) & 0x000001) | (s1rval << 1);
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = TRUNCATE24(res);
+ dsp32.nzcflags = res | ((s1rval & 0x800000) << 1);
+ dsp32.vflags = 0;
+ }
+}
+
+
+static void shre_s(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG24((OP >> 5) & 0x1f);
+ int res = s1rval >> 1;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = res;
+ dsp32.nzcflags = res | ((s1rval & 1) << 24);
+ dsp32.vflags = 0;
+ }
+}
+
+
+static void div2e_s(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG24((OP >> 5) & 0x1f);
+ int res = (s1rval & 0x800000) | (s1rval >> 1);
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = TRUNCATE24(res);
+ dsp32.nzcflags = res | ((s1rval & 1) << 24);
+ dsp32.vflags = 0;
+ }
+}
+
+
+static void ande_ss(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int dr = (OP >> 16) & 0x1f;
+ int s1rval = REG24((OP >> 5) & 0x1f);
+ int s2rval = (OP & 0x800) ? REG24((OP >> 0) & 0x1f) : REG24(dr);
+ int res = s2rval & s1rval;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = res;
+ SET_NZ00_24(res);
+ }
+}
+
+
+static void teste_ss(void)
+{
+ if (CONDITION_IS_TRUE)
+ {
+ int drval = REG24((OP >> 16) & 0x1f);
+ int s1rval = REG24((OP >> 5) & 0x1f);
+ int res = drval & s1rval;
+ SET_NZ00_24(res);
+ }
+}
+
+
+static void adde_di(void)
+{
+ int dr = (OP >> 16) & 0x1f;
+ int drval = REG24(dr);
+ int res = drval + EXTEND16_TO_24(OP);
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = TRUNCATE24(res);
+ SET_NZCV_24(drval, OP << 8, res);
+}
+
+
+static void subre_di(void)
+{
+ int dr = (OP >> 16) & 0x1f;
+ int drval = REG24(dr);
+ int res = EXTEND16_TO_24(OP) - drval;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = TRUNCATE24(res);
+ SET_NZCV_24(drval, OP << 8, res);
+}
+
+
+static void addre_di(void)
+{
+ unimplemented();
+}
+
+
+static void sube_di(void)
+{
+ int dr = (OP >> 16) & 0x1f;
+ int drval = REG24(dr);
+ int res = drval - EXTEND16_TO_24(OP);
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = TRUNCATE24(res);
+ SET_NZCV_24(drval, OP << 8, res);
+}
+
+
+static void andce_di(void)
+{
+ int dr = (OP >> 16) & 0x1f;
+ int drval = REG24(dr);
+ int res = drval & ~EXTEND16_TO_24(OP);
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = res;
+ SET_NZ00_24(res);
+}
+
+
+static void cmpe_di(void)
+{
+ int drval = REG24((OP >> 16) & 0x1f);
+ int res = drval - EXTEND16_TO_24(OP);
+ SET_NZCV_24(drval, OP << 8, res);
+}
+
+
+static void xore_di(void)
+{
+ int dr = (OP >> 16) & 0x1f;
+ int drval = REG24(dr);
+ int res = drval ^ EXTEND16_TO_24(OP);
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = res;
+ SET_NZ00_24(res);
+}
+
+
+static void ore_di(void)
+{
+ int dr = (OP >> 16) & 0x1f;
+ int drval = REG24(dr);
+ int res = drval | EXTEND16_TO_24(OP);
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = res;
+ SET_NZ00_24(res);
+}
+
+
+static void ande_di(void)
+{
+ int dr = (OP >> 16) & 0x1f;
+ int drval = REG24(dr);
+ int res = drval & EXTEND16_TO_24(OP);
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = res;
+ SET_NZ00_24(res);
+}
+
+
+static void teste_di(void)
+{
+ int drval = REG24((OP >> 16) & 0x1f);
+ int res = drval & EXTEND16_TO_24(OP);
+ SET_NZ00_24(res);
+}
+
+
+
+/***************************************************************************
+ CAU LOAD/STORE IMPLEMENTATION
+***************************************************************************/
+
+static void load_hi(void)
+{
+ int dr = (OP >> 16) & 0x1f;
+ UINT32 res = RBYTE(EXTEND16_TO_24(OP));
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ dsp32.nzcflags = res << 8;
+ dsp32.vflags = 0;
+}
+
+
+static void load_li(void)
+{
+ int dr = (OP >> 16) & 0x1f;
+ UINT32 res = RBYTE(EXTEND16_TO_24(OP));
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = res;
+ dsp32.nzcflags = res << 8;
+ dsp32.vflags = 0;
+}
+
+
+static void load_i(void)
+{
+ UINT32 res = RWORD(EXTEND16_TO_24(OP));
+ int dr = (OP >> 16) & 0x1f;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ dsp32.nzcflags = res << 8;
+ dsp32.vflags = 0;
+}
+
+
+static void load_ei(void)
+{
+ UINT32 res = TRUNCATE24(RLONG(EXTEND16_TO_24(OP)));
+ int dr = (OP >> 16) & 0x1f;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = res;
+ dsp32.nzcflags = res;
+ dsp32.vflags = 0;
+}
+
+
+static void store_hi(void)
+{
+ WBYTE(EXTEND16_TO_24(OP), dsp32.r[(OP >> 16) & 0x1f] >> 8);
+}
+
+
+static void store_li(void)
+{
+ WBYTE(EXTEND16_TO_24(OP), dsp32.r[(OP >> 16) & 0x1f]);
+}
+
+
+static void store_i(void)
+{
+ WWORD(EXTEND16_TO_24(OP), REG16((OP >> 16) & 0x1f));
+}
+
+
+static void store_ei(void)
+{
+ WLONG(EXTEND16_TO_24(OP), (INT32)(REG24((OP >> 16) & 0x1f) << 8) >> 8);
+}
+
+
+static void load_hr(void)
+{
+ if (!(OP & 0x400))
+ {
+ int dr = (OP >> 16) & 0x1f;
+ UINT32 res = cau_read_pi_1byte(OP) << 8;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ dsp32.nzcflags = res << 8;
+ dsp32.vflags = 0;
+ }
+ else
+ unimplemented();
+}
+
+
+static void load_lr(void)
+{
+ if (!(OP & 0x400))
+ {
+ int dr = (OP >> 16) & 0x1f;
+ UINT32 res = cau_read_pi_1byte(OP);
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = res;
+ dsp32.nzcflags = res << 8;
+ dsp32.vflags = 0;
+ }
+ else
+ unimplemented();
+}
+
+
+static void load_r(void)
+{
+ if (!(OP & 0x400))
+ {
+ UINT32 res = cau_read_pi_2byte(OP);
+ int dr = (OP >> 16) & 0x1f;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = EXTEND16_TO_24(res);
+ dsp32.nzcflags = res << 8;
+ dsp32.vflags = 0;
+ }
+ else
+ unimplemented();
+}
+
+
+static void load_er(void)
+{
+ if (!(OP & 0x400))
+ {
+ UINT32 res = TRUNCATE24(cau_read_pi_4byte(OP));
+ int dr = (OP >> 16) & 0x1f;
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = res;
+ dsp32.nzcflags = res;
+ dsp32.vflags = 0;
+ }
+ else
+ unimplemented();
+}
+
+
+static void store_hr(void)
+{
+ if (!(OP & 0x400))
+ cau_write_pi_1byte(OP, dsp32.r[(OP >> 16) & 0x1f] >> 8);
+ else
+ unimplemented();
+}
+
+
+static void store_lr(void)
+{
+ if (!(OP & 0x400))
+ cau_write_pi_1byte(OP, dsp32.r[(OP >> 16) & 0x1f]);
+ else
+ unimplemented();
+}
+
+
+static void store_r(void)
+{
+ if (!(OP & 0x400))
+ cau_write_pi_2byte(OP, REG16((OP >> 16) & 0x1f));
+ else
+ unimplemented();
+}
+
+
+static void store_er(void)
+{
+ if (!(OP & 0x400))
+ cau_write_pi_4byte(OP, REG24((OP >> 16) & 0x1f));
+ else
+ unimplemented();
+}
+
+
+static void load24(void)
+{
+ int dr = (OP >> 16) & 0x1f;
+ UINT32 res = (OP & 0xffff) + ((OP >> 5) & 0xff0000);
+ if (IS_WRITEABLE(dr))
+ dsp32.r[dr] = res;
+}
+
+
+
+/***************************************************************************
+ DAU FORM 1 IMPLEMENTATION
+***************************************************************************/
+
+static void d1_aMpp(void)
+{
+ double xval = dau_read_pi_double_1st(OP >> 14, 1);
+ double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval);
+ double res = yval + DEFERRED_MULTIPLIER((OP >> 26) & 7) * xval;
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, res);
+ dau_set_val_flags((OP >> 21) & 3, res);
+}
+
+
+static void d1_aMpm(void)
+{
+ double xval = dau_read_pi_double_1st(OP >> 14, 1);
+ double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval);
+ double res = yval - DEFERRED_MULTIPLIER((OP >> 26) & 7) * xval;
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, res);
+ dau_set_val_flags((OP >> 21) & 3, res);
+}
+
+
+static void d1_aMmp(void)
+{
+ double xval = dau_read_pi_double_1st(OP >> 14, 1);
+ double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval);
+ double res = -yval + DEFERRED_MULTIPLIER((OP >> 26) & 7) * xval;
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, res);
+ dau_set_val_flags((OP >> 21) & 3, res);
+}
+
+
+static void d1_aMmm(void)
+{
+ double xval = dau_read_pi_double_1st(OP >> 14, 1);
+ double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval);
+ double res = -yval - DEFERRED_MULTIPLIER((OP >> 26) & 7) * xval;
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, res);
+ dau_set_val_flags((OP >> 21) & 3, res);
+}
+
+
+static void d1_0px(void)
+{
+ double xval = dau_read_pi_double_1st(OP >> 14, 1);
+ double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval);
+ double res = yval;
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, res);
+ dau_set_val_flags((OP >> 21) & 3, res);
+ (void)xval;
+}
+
+
+static void d1_0mx(void)
+{
+ double xval = dau_read_pi_double_1st(OP >> 14, 1);
+ double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval);
+ double res = -yval;
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, res);
+ dau_set_val_flags((OP >> 21) & 3, res);
+ (void)xval;
+}
+
+
+static void d1_1pp(void)
+{
+ double xval = dau_read_pi_double_1st(OP >> 14, 1);
+ double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval);
+ double res = yval + xval;
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, res);
+ dau_set_val_flags((OP >> 21) & 3, res);
+}
+
+
+static void d1_1pm(void)
+{
+ double xval = dau_read_pi_double_1st(OP >> 14, 1);
+ double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval);
+ double res = yval - xval;
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, res);
+ dau_set_val_flags((OP >> 21) & 3, res);
+}
+
+
+static void d1_1mp(void)
+{
+ double xval = dau_read_pi_double_1st(OP >> 14, 1);
+ double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval);
+ double res = -yval + xval;
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, res);
+ dau_set_val_flags((OP >> 21) & 3, res);
+}
+
+
+static void d1_1mm(void)
+{
+ double xval = dau_read_pi_double_1st(OP >> 14, 1);
+ double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval);
+ double res = -yval - xval;
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, res);
+ dau_set_val_flags((OP >> 21) & 3, res);
+}
+
+
+static void d1_aMppr(void)
+{
+ unimplemented();
+}
+
+
+static void d1_aMpmr(void)
+{
+ unimplemented();
+}
+
+
+static void d1_aMmpr(void)
+{
+ unimplemented();
+}
+
+
+static void d1_aMmmr(void)
+{
+ unimplemented();
+}
+
+
+
+/***************************************************************************
+ DAU FORM 2 IMPLEMENTATION
+***************************************************************************/
+
+static void d2_aMpp(void)
+{
+ double xval = dau_read_pi_double_1st(OP >> 14, 1);
+ double yval = dau_read_pi_double_2nd(OP >> 7, 1, xval);
+ double res = dsp32.a[(OP >> 26) & 7] + yval * xval;
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, yval);
+ dau_set_val_flags((OP >> 21) & 3, res);
+}
+
+
+static void d2_aMpm(void)
+{
+ double xval = dau_read_pi_double_1st(OP >> 14, 1);
+ double yval = dau_read_pi_double_2nd(OP >> 7, 1, xval);
+ double res = dsp32.a[(OP >> 26) & 7] - yval * xval;
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, yval);
+ dau_set_val_flags((OP >> 21) & 3, res);
+}
+
+
+static void d2_aMmp(void)
+{
+ double xval = dau_read_pi_double_1st(OP >> 14, 1);
+ double yval = dau_read_pi_double_2nd(OP >> 7, 1, xval);
+ double res = -dsp32.a[(OP >> 26) & 7] + yval * xval;
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, yval);
+ dau_set_val_flags((OP >> 21) & 3, res);
+}
+
+
+static void d2_aMmm(void)
+{
+ double xval = dau_read_pi_double_1st(OP >> 14, 1);
+ double yval = dau_read_pi_double_2nd(OP >> 7, 1, xval);
+ double res = -dsp32.a[(OP >> 26) & 7] - yval * xval;
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, yval);
+ dau_set_val_flags((OP >> 21) & 3, res);
+}
+
+
+static void d2_aMppr(void)
+{
+ unimplemented();
+}
+
+
+static void d2_aMpmr(void)
+{
+ unimplemented();
+}
+
+
+static void d2_aMmpr(void)
+{
+ unimplemented();
+}
+
+
+static void d2_aMmmr(void)
+{
+ unimplemented();
+}
+
+
+
+/***************************************************************************
+ DAU FORM 3 IMPLEMENTATION
+***************************************************************************/
+
+static void d3_aMpp(void)
+{
+ double xval = dau_read_pi_double_1st(OP >> 14, 1);
+ double yval = dau_read_pi_double_2nd(OP >> 7, 1, xval);
+ double res = dsp32.a[(OP >> 26) & 7] + yval * xval;
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, res);
+ dau_set_val_flags((OP >> 21) & 3, res);
+}
+
+
+static void d3_aMpm(void)
+{
+ double xval = dau_read_pi_double_1st(OP >> 14, 1);
+ double yval = dau_read_pi_double_2nd(OP >> 7, 1, xval);
+ double res = dsp32.a[(OP >> 26) & 7] - yval * xval;
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, res);
+ dau_set_val_flags((OP >> 21) & 3, res);
+}
+
+
+static void d3_aMmp(void)
+{
+ double xval = dau_read_pi_double_1st(OP >> 14, 1);
+ double yval = dau_read_pi_double_2nd(OP >> 7, 1, xval);
+ double res = -dsp32.a[(OP >> 26) & 7] + yval * xval;
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, res);
+ dau_set_val_flags((OP >> 21) & 3, res);
+}
+
+
+static void d3_aMmm(void)
+{
+ double xval = dau_read_pi_double_1st(OP >> 14, 1);
+ double yval = dau_read_pi_double_2nd(OP >> 7, 1, xval);
+ double res = -dsp32.a[(OP >> 26) & 7] - yval * xval;
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, res);
+ dau_set_val_flags((OP >> 21) & 3, res);
+}
+
+
+static void d3_aMppr(void)
+{
+ unimplemented();
+}
+
+
+static void d3_aMpmr(void)
+{
+ unimplemented();
+}
+
+
+static void d3_aMmpr(void)
+{
+ unimplemented();
+}
+
+
+static void d3_aMmmr(void)
+{
+ unimplemented();
+}
+
+
+
+/***************************************************************************
+ DAU FORM 4 IMPLEMENTATION
+***************************************************************************/
+
+static void d4_pp(void)
+{
+ double xval = dau_read_pi_double_1st(OP >> 14, 1);
+ double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval);
+ double res = yval + xval;
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, yval);
+ dau_set_val_flags((OP >> 21) & 3, res);
+}
+
+
+static void d4_pm(void)
+{
+ double xval = dau_read_pi_double_1st(OP >> 14, 1);
+ double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval);
+ double res = yval - xval;
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, yval);
+ dau_set_val_flags((OP >> 21) & 3, res);
+}
+
+
+static void d4_mp(void)
+{
+ double xval = dau_read_pi_double_1st(OP >> 14, 1);
+ double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval);
+ double res = -yval + xval;
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, yval);
+ dau_set_val_flags((OP >> 21) & 3, res);
+}
+
+
+static void d4_mm(void)
+{
+ double xval = dau_read_pi_double_1st(OP >> 14, 1);
+ double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval);
+ double res = -yval - xval;
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, yval);
+ dau_set_val_flags((OP >> 21) & 3, res);
+}
+
+
+static void d4_ppr(void)
+{
+ unimplemented();
+}
+
+
+static void d4_pmr(void)
+{
+ unimplemented();
+}
+
+
+static void d4_mpr(void)
+{
+ unimplemented();
+}
+
+
+static void d4_mmr(void)
+{
+ unimplemented();
+}
+
+
+
+/***************************************************************************
+ DAU FORM 5 IMPLEMENTATION
+***************************************************************************/
+
+static void d5_ic(void)
+{
+ unimplemented();
+}
+
+
+static void d5_oc(void)
+{
+ unimplemented();
+}
+
+
+static void d5_float(void)
+{
+ double res = (double)(INT16)dau_read_pi_2bytes(OP >> 7);
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, res);
+ dau_set_val_flags((OP >> 21) & 3, res);
+}
+
+
+static void d5_int(void)
+{
+ double val = dau_read_pi_double_1st(OP >> 7, 0);
+ int zpi = (OP >> 0) & 0x7f;
+ INT16 res;
+ if (!(dsp32.DAUC & 0x10)) val = floor(val + 0.5);
+ else val = ceil(val - 0.5);
+ res = (INT16)val;
+ if (zpi != 7)
+ dau_write_pi_2bytes(zpi, res);
+ dau_set_val_noflags((OP >> 21) & 3, dsp_to_double(res << 16));
+}
+
+
+static void d5_round(void)
+{
+ double res = (double)(float)dau_read_pi_double_1st(OP >> 7, 0);
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, res);
+ dau_set_val_flags((OP >> 21) & 3, res);
+}
+
+
+static void d5_ifalt(void)
+{
+ int ar = (OP >> 21) & 3;
+ double res = dsp32.a[ar];
+ int zpi = (OP >> 0) & 0x7f;
+ if (NFLAG)
+ res = dau_read_pi_double_1st(OP >> 7, 0);
+ if (zpi != 7)
+ dau_write_pi_double(zpi, res);
+ dau_set_val_noflags(ar, res);
+}
+
+
+static void d5_ifaeq(void)
+{
+ int ar = (OP >> 21) & 3;
+ double res = dsp32.a[ar];
+ int zpi = (OP >> 0) & 0x7f;
+ if (ZFLAG)
+ res = dau_read_pi_double_1st(OP >> 7, 0);
+ if (zpi != 7)
+ dau_write_pi_double(zpi, res);
+ dau_set_val_noflags(ar, res);
+}
+
+
+static void d5_ifagt(void)
+{
+ int ar = (OP >> 21) & 3;
+ double res = dsp32.a[ar];
+ int zpi = (OP >> 0) & 0x7f;
+ if (!NFLAG && !ZFLAG)
+ res = dau_read_pi_double_1st(OP >> 7, 0);
+ if (zpi != 7)
+ dau_write_pi_double(zpi, res);
+ dau_set_val_noflags(ar, res);
+}
+
+
+static void d5_float24(void)
+{
+ double res = (double)((INT32)(dau_read_pi_4bytes(OP >> 7) << 8) >> 8);
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_double(zpi, res);
+ dau_set_val_flags((OP >> 21) & 3, res);
+}
+
+
+static void d5_int24(void)
+{
+ double val = dau_read_pi_double_1st(OP >> 7, 0);
+ int zpi = (OP >> 0) & 0x7f;
+ INT32 res;
+ if (!(dsp32.DAUC & 0x10)) val = floor(val + 0.5);
+ else val = ceil(val - 0.5);
+ res = (INT32)val;
+ if (res > 0x7fffff) res = 0x7fffff;
+ else if (res < -0x800000) res = -0x800000;
+ if (zpi != 7)
+ dau_write_pi_4bytes(zpi, (INT32)(res << 8) >> 8);
+ dau_set_val_noflags((OP >> 21) & 3, dsp_to_double(res << 8));
+}
+
+
+static void d5_ieee(void)
+{
+ unimplemented();
+}
+
+
+static void d5_dsp(void)
+{
+ unimplemented();
+}
+
+
+static void d5_seed(void)
+{
+ UINT32 val = dau_read_pi_4bytes(OP >> 7);
+ INT32 res = val ^ 0x7fffffff;
+ int zpi = (OP >> 0) & 0x7f;
+ if (zpi != 7)
+ dau_write_pi_4bytes(zpi, res);
+ dau_set_val_flags((OP >> 21) & 3, dsp_to_double((INT32)res));
+}
+
+
+
+/***************************************************************************
+ FUNCTION TABLE
+***************************************************************************/
+
+void (*dsp32ops[])(void) =
+{
+ nop, goto_t, goto_pl, goto_mi, goto_ne, goto_eq, goto_vc, goto_vs, /* 00 */
+ goto_cc, goto_cs, goto_ge, goto_lt, goto_gt, goto_le, goto_hi, goto_ls,
+ goto_auc, goto_aus, goto_age, goto_alt, goto_ane, goto_aeq, goto_avc, goto_avs, /* 01 */
+ goto_agt, goto_ale, illegal, illegal, illegal, illegal, illegal, illegal,
+ goto_ibe, goto_ibf, goto_obf, goto_obe, goto_pde, goto_pdf, goto_pie, goto_pif, /* 02 */
+ goto_syc, goto_sys, goto_fbc, goto_fbs, goto_irq1lo,goto_irq1hi,goto_irq2lo,goto_irq2hi,
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, /* 03 */
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal,
+
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, /* 04 */
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal,
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, /* 05 */
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal,
+ dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, /* 06 */
+ dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto,
+ dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, /* 07 */
+ dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto,
+
+ call, call, call, call, call, call, call, call, /* 08 */
+ call, call, call, call, call, call, call, call,
+ call, call, call, call, call, call, call, call, /* 09 */
+ call, call, call, call, call, call, call, call,
+ add_si, add_si, add_si, add_si, add_si, add_si, add_si, add_si, /* 0a */
+ add_si, add_si, add_si, add_si, add_si, add_si, add_si, add_si,
+ add_si, add_si, add_si, add_si, add_si, add_si, add_si, add_si, /* 0b */
+ add_si, add_si, add_si, add_si, add_si, add_si, add_si, add_si,
+
+ add_ss, mul2_s, subr_ss, addr_ss, sub_ss, neg_s, andc_ss, cmp_ss, /* 0c */
+ xor_ss, rcr_s, or_ss, rcl_s, shr_s, div2_s, and_ss, test_ss,
+ add_di, illegal, subr_di, addr_di, sub_di, illegal, andc_di, cmp_di, /* 0d */
+ xor_di, illegal, or_di, illegal, illegal, illegal, and_di, test_di,
+ load_hi, load_hi, load_li, load_li, load_i, load_i, load_ei, load_ei, /* 0e */
+ store_hi, store_hi, store_li, store_li, store_i, store_i, store_ei, store_ei,
+ load_hr, load_hr, load_lr, load_lr, load_r, load_r, load_er, load_er, /* 0f */
+ store_hr, store_hr, store_lr, store_lr, store_r, store_r, store_er, store_er,
+
+ d1_aMpp, d1_aMpp, d1_aMpp, d1_aMpp, d1_aMpm, d1_aMpm, d1_aMpm, d1_aMpm, /* 10 */
+ d1_aMmp, d1_aMmp, d1_aMmp, d1_aMmp, d1_aMmm, d1_aMmm, d1_aMmm, d1_aMmm,
+ d1_aMppr, d1_aMppr, d1_aMppr, d1_aMppr, d1_aMpmr, d1_aMpmr, d1_aMpmr, d1_aMpmr, /* 11 */
+ d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmmr, d1_aMmmr, d1_aMmmr, d1_aMmmr,
+ d1_aMpp, d1_aMpp, d1_aMpp, d1_aMpp, d1_aMpm, d1_aMpm, d1_aMpm, d1_aMpm, /* 12 */
+ d1_aMmp, d1_aMmp, d1_aMmp, d1_aMmp, d1_aMmm, d1_aMmm, d1_aMmm, d1_aMmm,
+ d1_aMppr, d1_aMppr, d1_aMppr, d1_aMppr, d1_aMpmr, d1_aMpmr, d1_aMpmr, d1_aMpmr, /* 13 */
+ d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmmr, d1_aMmmr, d1_aMmmr, d1_aMmmr,
+
+ d1_aMpp, d1_aMpp, d1_aMpp, d1_aMpp, d1_aMpm, d1_aMpm, d1_aMpm, d1_aMpm, /* 14 */
+ d1_aMmp, d1_aMmp, d1_aMmp, d1_aMmp, d1_aMmm, d1_aMmm, d1_aMmm, d1_aMmm,
+ d1_aMppr, d1_aMppr, d1_aMppr, d1_aMppr, d1_aMpmr, d1_aMpmr, d1_aMpmr, d1_aMpmr, /* 15 */
+ d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmmr, d1_aMmmr, d1_aMmmr, d1_aMmmr,
+ d1_aMpp, d1_aMpp, d1_aMpp, d1_aMpp, d1_aMpm, d1_aMpm, d1_aMpm, d1_aMpm, /* 16 */
+ d1_aMmp, d1_aMmp, d1_aMmp, d1_aMmp, d1_aMmm, d1_aMmm, d1_aMmm, d1_aMmm,
+ d1_aMppr, d1_aMppr, d1_aMppr, d1_aMppr, d1_aMpmr, d1_aMpmr, d1_aMpmr, d1_aMpmr, /* 17 */
+ d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmmr, d1_aMmmr, d1_aMmmr, d1_aMmmr,
+
+ d1_0px, d1_0px, d1_0px, d1_0px, d1_0px, d1_0px, d1_0px, d1_0px, /* 18 */
+ d1_0mx, d1_0mx, d1_0mx, d1_0mx, d1_0mx, d1_0mx, d1_0mx, d1_0mx,
+ d1_aMppr, d1_aMppr, d1_aMppr, d1_aMppr, d1_aMpmr, d1_aMpmr, d1_aMpmr, d1_aMpmr, /* 19 */
+ d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmmr, d1_aMmmr, d1_aMmmr, d1_aMmmr,
+ d1_1pp, d1_1pp, d1_1pp, d1_1pp, d1_1pm, d1_1pm, d1_1pm, d1_1pm, /* 1a */
+ d1_1mp, d1_1mp, d1_1mp, d1_1mp, d1_1mm, d1_1mm, d1_1mm, d1_1mm,
+ d1_aMppr, d1_aMppr, d1_aMppr, d1_aMppr, d1_aMpmr, d1_aMpmr, d1_aMpmr, d1_aMpmr, /* 1b */
+ d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmmr, d1_aMmmr, d1_aMmmr, d1_aMmmr,
+
+ d4_pp, d4_pp, d4_pp, d4_pp, d4_pm, d4_pm, d4_pm, d4_pm, /* 1c */
+ d4_mp, d4_mp, d4_mp, d4_mp, d4_mm, d4_mm, d4_mm, d4_mm,
+ d4_ppr, d4_ppr, d4_ppr, d4_ppr, d4_pmr, d4_pmr, d4_pmr, d4_pmr, /* 1d */
+ d4_mpr, d4_mpr, d4_mpr, d4_mpr, d4_mmr, d4_mmr, d4_mmr, d4_mmr,
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, /* 1e */
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal,
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, /* 1f */
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal,
+
+ d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpm, d2_aMpm, d2_aMpm, d2_aMpm, /* 20 */
+ d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmm, d2_aMmm, d2_aMmm, d2_aMmm,
+ d2_aMppr, d2_aMppr, d2_aMppr, d2_aMppr, d2_aMpmr, d2_aMpmr, d2_aMpmr, d2_aMpmr, /* 21 */
+ d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmmr, d2_aMmmr, d2_aMmmr, d2_aMmmr,
+ d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpm, d2_aMpm, d2_aMpm, d2_aMpm, /* 22 */
+ d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmm, d2_aMmm, d2_aMmm, d2_aMmm,
+ d2_aMppr, d2_aMppr, d2_aMppr, d2_aMppr, d2_aMpmr, d2_aMpmr, d2_aMpmr, d2_aMpmr, /* 23 */
+ d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmmr, d2_aMmmr, d2_aMmmr, d2_aMmmr,
+
+ d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpm, d2_aMpm, d2_aMpm, d2_aMpm, /* 24 */
+ d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmm, d2_aMmm, d2_aMmm, d2_aMmm,
+ d2_aMppr, d2_aMppr, d2_aMppr, d2_aMppr, d2_aMpmr, d2_aMpmr, d2_aMpmr, d2_aMpmr, /* 25 */
+ d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmmr, d2_aMmmr, d2_aMmmr, d2_aMmmr,
+ d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpm, d2_aMpm, d2_aMpm, d2_aMpm, /* 26 */
+ d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmm, d2_aMmm, d2_aMmm, d2_aMmm,
+ d2_aMppr, d2_aMppr, d2_aMppr, d2_aMppr, d2_aMpmr, d2_aMpmr, d2_aMpmr, d2_aMpmr, /* 27 */
+ d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmmr, d2_aMmmr, d2_aMmmr, d2_aMmmr,
+
+ d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpm, d2_aMpm, d2_aMpm, d2_aMpm, /* 28 */
+ d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmm, d2_aMmm, d2_aMmm, d2_aMmm,
+ d2_aMppr, d2_aMppr, d2_aMppr, d2_aMppr, d2_aMpmr, d2_aMpmr, d2_aMpmr, d2_aMpmr, /* 29 */
+ d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmmr, d2_aMmmr, d2_aMmmr, d2_aMmmr,
+ d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpm, d2_aMpm, d2_aMpm, d2_aMpm, /* 2a */
+ d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmm, d2_aMmm, d2_aMmm, d2_aMmm,
+ d2_aMppr, d2_aMppr, d2_aMppr, d2_aMppr, d2_aMpmr, d2_aMpmr, d2_aMpmr, d2_aMpmr, /* 2b */
+ d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmmr, d2_aMmmr, d2_aMmmr, d2_aMmmr,
+
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, /* 2c */
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal,
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, /* 2d */
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal,
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, /* 2e */
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal,
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, /* 2f */
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal,
+
+ d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpm, d3_aMpm, d3_aMpm, d3_aMpm, /* 30 */
+ d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmm, d3_aMmm, d3_aMmm, d3_aMmm,
+ d3_aMppr, d3_aMppr, d3_aMppr, d3_aMppr, d3_aMpmr, d3_aMpmr, d3_aMpmr, d3_aMpmr, /* 31 */
+ d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmmr, d3_aMmmr, d3_aMmmr, d3_aMmmr,
+ d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpm, d3_aMpm, d3_aMpm, d3_aMpm, /* 32 */
+ d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmm, d3_aMmm, d3_aMmm, d3_aMmm,
+ d3_aMppr, d3_aMppr, d3_aMppr, d3_aMppr, d3_aMpmr, d3_aMpmr, d3_aMpmr, d3_aMpmr, /* 33 */
+ d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmmr, d3_aMmmr, d3_aMmmr, d3_aMmmr,
+
+ d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpm, d3_aMpm, d3_aMpm, d3_aMpm, /* 34 */
+ d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmm, d3_aMmm, d3_aMmm, d3_aMmm,
+ d3_aMppr, d3_aMppr, d3_aMppr, d3_aMppr, d3_aMpmr, d3_aMpmr, d3_aMpmr, d3_aMpmr, /* 35 */
+ d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmmr, d3_aMmmr, d3_aMmmr, d3_aMmmr,
+ d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpm, d3_aMpm, d3_aMpm, d3_aMpm, /* 36 */
+ d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmm, d3_aMmm, d3_aMmm, d3_aMmm,
+ d3_aMppr, d3_aMppr, d3_aMppr, d3_aMppr, d3_aMpmr, d3_aMpmr, d3_aMpmr, d3_aMpmr, /* 37 */
+ d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmmr, d3_aMmmr, d3_aMmmr, d3_aMmmr,
+
+ d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpm, d3_aMpm, d3_aMpm, d3_aMpm, /* 38 */
+ d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmm, d3_aMmm, d3_aMmm, d3_aMmm,
+ d3_aMppr, d3_aMppr, d3_aMppr, d3_aMppr, d3_aMpmr, d3_aMpmr, d3_aMpmr, d3_aMpmr, /* 39 */
+ d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmmr, d3_aMmmr, d3_aMmmr, d3_aMmmr,
+ d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpm, d3_aMpm, d3_aMpm, d3_aMpm, /* 3a */
+ d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmm, d3_aMmm, d3_aMmm, d3_aMmm,
+ d3_aMppr, d3_aMppr, d3_aMppr, d3_aMppr, d3_aMpmr, d3_aMpmr, d3_aMpmr, d3_aMpmr, /* 3b */
+ d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmmr, d3_aMmmr, d3_aMmmr, d3_aMmmr,
+
+ d5_ic, d5_ic, d5_ic, d5_ic, d5_oc, d5_oc, d5_oc, d5_oc, /* 3c */
+ d5_float, d5_float, d5_float, d5_float, d5_int, d5_int, d5_int, d5_int,
+ d5_round, d5_round, d5_round, d5_round, d5_ifalt, d5_ifalt, d5_ifalt, d5_ifalt, /* 3d */
+ d5_ifaeq, d5_ifaeq, d5_ifaeq, d5_ifaeq, d5_ifagt, d5_ifagt, d5_ifagt, d5_ifagt,
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, /* 3e */
+ d5_float24, d5_float24, d5_float24, d5_float24, d5_int24, d5_int24, d5_int24, d5_int24,
+ d5_ieee, d5_ieee, d5_ieee, d5_ieee, d5_dsp, d5_dsp, d5_dsp, d5_dsp, /* 3f */
+ d5_seed, d5_seed, d5_seed, d5_seed, illegal, illegal, illegal, illegal,
+
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, /* 40 */
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal,
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, /* 41 */
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal,
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, /* 42 */
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal,
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, /* 43 */
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal,
+
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, /* 44 */
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal,
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, /* 45 */
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal,
+ do_i, do_r, illegal, illegal, illegal, illegal, illegal, illegal, /* 46 */
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal,
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, /* 47 */
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal,
+
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, /* 48 */
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal,
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, /* 49 */
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal,
+ adde_si, adde_si, adde_si, adde_si, adde_si, adde_si, adde_si, adde_si, /* 4a */
+ adde_si, adde_si, adde_si, adde_si, adde_si, adde_si, adde_si, adde_si,
+ adde_si, adde_si, adde_si, adde_si, adde_si, adde_si, adde_si, adde_si, /* 4b */
+ adde_si, adde_si, adde_si, adde_si, adde_si, adde_si, adde_si, adde_si,
+
+ adde_ss, mul2e_s, subre_ss, addre_ss, sube_ss, nege_s, andce_ss, cmpe_ss, /* 4c */
+ xore_ss, rcre_s, ore_ss, rcle_s, shre_s, div2e_s, ande_ss, teste_ss,
+ adde_di, illegal, subre_di, addre_di, sube_di, illegal, andce_di, cmpe_di, /* 4d */
+ xore_di, illegal, ore_di, illegal, illegal, illegal, ande_di, teste_di,
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, /* 4e */
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal,
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, /* 4f */
+ illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal,
+
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, /* 50 */
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24,
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, /* 51 */
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24,
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, /* 52 */
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24,
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, /* 53 */
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24,
+
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, /* 54 */
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24,
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, /* 55 */
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24,
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, /* 56 */
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24,
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, /* 57 */
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24,
+
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, /* 58 */
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24,
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, /* 59 */
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24,
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, /* 5a */
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24,
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, /* 5b */
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24,
+
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, /* 5c */
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24,
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, /* 5d */
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24,
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, /* 5e */
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24,
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, /* 5f */
+ goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24,
+
+ load24, load24, load24, load24, load24, load24, load24, load24, /* 60 */
+ load24, load24, load24, load24, load24, load24, load24, load24,
+ load24, load24, load24, load24, load24, load24, load24, load24, /* 61 */
+ load24, load24, load24, load24, load24, load24, load24, load24,
+ load24, load24, load24, load24, load24, load24, load24, load24, /* 62 */
+ load24, load24, load24, load24, load24, load24, load24, load24,
+ load24, load24, load24, load24, load24, load24, load24, load24, /* 63 */
+ load24, load24, load24, load24, load24, load24, load24, load24,
+
+ load24, load24, load24, load24, load24, load24, load24, load24, /* 64 */
+ load24, load24, load24, load24, load24, load24, load24, load24,
+ load24, load24, load24, load24, load24, load24, load24, load24, /* 65 */
+ load24, load24, load24, load24, load24, load24, load24, load24,
+ load24, load24, load24, load24, load24, load24, load24, load24, /* 66 */
+ load24, load24, load24, load24, load24, load24, load24, load24,
+ load24, load24, load24, load24, load24, load24, load24, load24, /* 67 */
+ load24, load24, load24, load24, load24, load24, load24, load24,
+
+ load24, load24, load24, load24, load24, load24, load24, load24, /* 68 */
+ load24, load24, load24, load24, load24, load24, load24, load24,
+ load24, load24, load24, load24, load24, load24, load24, load24, /* 69 */
+ load24, load24, load24, load24, load24, load24, load24, load24,
+ load24, load24, load24, load24, load24, load24, load24, load24, /* 6a */
+ load24, load24, load24, load24, load24, load24, load24, load24,
+ load24, load24, load24, load24, load24, load24, load24, load24, /* 6b */
+ load24, load24, load24, load24, load24, load24, load24, load24,
+
+ load24, load24, load24, load24, load24, load24, load24, load24, /* 6c */
+ load24, load24, load24, load24, load24, load24, load24, load24,
+ load24, load24, load24, load24, load24, load24, load24, load24, /* 6d */
+ load24, load24, load24, load24, load24, load24, load24, load24,
+ load24, load24, load24, load24, load24, load24, load24, load24, /* 6e */
+ load24, load24, load24, load24, load24, load24, load24, load24,
+ load24, load24, load24, load24, load24, load24, load24, load24, /* 6f */
+ load24, load24, load24, load24, load24, load24, load24, load24,
+
+ call24, call24, call24, call24, call24, call24, call24, call24, /* 70 */
+ call24, call24, call24, call24, call24, call24, call24, call24,
+ call24, call24, call24, call24, call24, call24, call24, call24, /* 71 */
+ call24, call24, call24, call24, call24, call24, call24, call24,
+ call24, call24, call24, call24, call24, call24, call24, call24, /* 72 */
+ call24, call24, call24, call24, call24, call24, call24, call24,
+ call24, call24, call24, call24, call24, call24, call24, call24, /* 73 */
+ call24, call24, call24, call24, call24, call24, call24, call24,
+
+ call24, call24, call24, call24, call24, call24, call24, call24, /* 74 */
+ call24, call24, call24, call24, call24, call24, call24, call24,
+ call24, call24, call24, call24, call24, call24, call24, call24, /* 75 */
+ call24, call24, call24, call24, call24, call24, call24, call24,
+ call24, call24, call24, call24, call24, call24, call24, call24, /* 76 */
+ call24, call24, call24, call24, call24, call24, call24, call24,
+ call24, call24, call24, call24, call24, call24, call24, call24, /* 77 */
+ call24, call24, call24, call24, call24, call24, call24, call24,
+
+ call24, call24, call24, call24, call24, call24, call24, call24, /* 78 */
+ call24, call24, call24, call24, call24, call24, call24, call24,
+ call24, call24, call24, call24, call24, call24, call24, call24, /* 79 */
+ call24, call24, call24, call24, call24, call24, call24, call24,
+ call24, call24, call24, call24, call24, call24, call24, call24, /* 7a */
+ call24, call24, call24, call24, call24, call24, call24, call24,
+ call24, call24, call24, call24, call24, call24, call24, call24, /* 7b */
+ call24, call24, call24, call24, call24, call24, call24, call24,
+
+ call24, call24, call24, call24, call24, call24, call24, call24, /* 7c */
+ call24, call24, call24, call24, call24, call24, call24, call24,
+ call24, call24, call24, call24, call24, call24, call24, call24, /* 7d */
+ call24, call24, call24, call24, call24, call24, call24, call24,
+ call24, call24, call24, call24, call24, call24, call24, call24, /* 7e */
+ call24, call24, call24, call24, call24, call24, call24, call24,
+ call24, call24, call24, call24, call24, call24, call24, call24, /* 7f */
+ call24, call24, call24, call24, call24, call24, call24, call24
+};
+
+
+/*
+
+ Most common OPs in Race Drivin':
+
+301681217 - OP 0 - nop
+164890391 - OP 4A1 - adde_si
+99210113 - OP 661 - load24
+86010010 - OP F7 - load_er
+61148739 - OP 4D4 - sube_di
+52693763 - OP 180 - d1_0px
+41525754 - OP FF - store_er
+35033321 - OP 380 - d3_aMpp
+31621151 - OP 4C0 - adde_ss
+28076244 - OP 660 - load24
+19190505 - OP 4C1 - mul2e_s
+13270852 - OP F5 - load_r
+12535169 - OP 1A4 - d1_1pm
+12265141 - OP 4C4 - sube_ss
+10748211 - OP 4CD - div2e_s
+10493660 - OP FD - store_r
+ 9721263 - OP 189
+ 9415685 - OP 3C8
+ 9294148 - OP 3D5
+ 8887846 - OP 1A1
+ 8788648 - OP 381
+ 8185239 - OP 300
+ 7241256 - OP 383
+ 6877349 - OP 4A3
+ 6832295 - OP 181
+ 6601270 - OP 3E8
+ 6562483 - OP 4A4
+ 6553514 - OP 3C9
+ 6270430 - OP 280
+ 6041485 - OP 1A0
+ 5299529 - OP 304
+ 5110926 - OP 382
+ 4922253 - OP 363
+ 4603670 - OP 4D7
+ 4164327 - OP 4AE
+ 3980085 - OP 3EC
+ 3599198 - OP 3CC
+ 3543878 - OP 3D0
+ 3489158 - OP 4
+ 3463235 - OP 321
+ 3335995 - OP 3F9
+ 3001546 - OP 4CE
+ 2882940 - OP 129
+ 2882940 - OP 1A5
+ 2882940 - OP 342
+ 2841981 - OP 360
+ 2663417 - OP FB
+ 2059640 - OP 3ED
+ 1867166 - OP 1A8
+ 1830789 - OP 305
+ 1753312 - OP 301
+ 1726866 - OP 5
+ 1594991 - OP 12
+ 1571286 - OP 19
+ 1507644 - OP A2
+ 1418846 - OP 3CD
+ 1273134 - OP F3
+ 1177914 - OP 4C7
+ 1175720 - OP 188
+ 1091848 - OP 3E9
+ 1088206 - OP 6FF
+ 1088204 - OP 4CA
+ 1012639 - OP 101
+ 939617 - OP 4C5
+
+*/