Merge branch 'dev'
[picodrive.git] / cpu / fame / famec_opcodes.h
index a9cc991..5e09a92 100644 (file)
@@ -638,9 +638,7 @@ OPCODE(0x007C)
        }
        else
        {
-               u32 newPC = (u32)(PC) - BasePC;
-               SET_PC(newPC-2);
-               execute_exception(M68K_PRIVILEGE_VIOLATION_EX);
+               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
 #ifdef USE_CYCLONE_TIMING
                RET(0)
 #else
@@ -1298,9 +1296,7 @@ OPCODE(0x027C)
        }
        else
        {
-               u32 newPC = (u32)(PC) - BasePC;
-               SET_PC(newPC-2);
-               execute_exception(M68K_PRIVILEGE_VIOLATION_EX);
+               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(20)
@@ -1950,10 +1946,8 @@ OPCODE(0x0A7C)
        }
        else
        {
-               u32 newPC = (u32)(PC) - BasePC;
-               SET_PC(newPC-2);
-               execute_exception(M68K_PRIVILEGE_VIOLATION_EX);
-               RET(4)
+               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
+               RET(0)
        }
 RET(20)
 }
@@ -3832,7 +3826,7 @@ OPCODE(0x083A)
 
        FETCH_BYTE(src);
        src = 1 << (src & 7);
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -3849,7 +3843,7 @@ OPCODE(0x083B)
 
        FETCH_BYTE(src);
        src = 1 << (src & 7);
-       adr = (u32)(PC) - BasePC;
+       adr = (uptr)(PC) - BasePC;
        DECODE_EXT_WORD
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -4578,7 +4572,7 @@ OPCODE(0x013A)
 
        src = DREGu8((Opcode >> 9) & 7);
        src = 1 << (src & 7);
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -4595,7 +4589,7 @@ OPCODE(0x013B)
 
        src = DREGu8((Opcode >> 9) & 7);
        src = 1 << (src & 7);
-       adr = (u32)(PC) - BasePC;
+       adr = (uptr)(PC) - BasePC;
        DECODE_EXT_WORD
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -5213,7 +5207,11 @@ OPCODE(0x0108)
        READ_BYTE_F(adr + 2, src)
        DREGu16((Opcode >> 9) & 7) = (res << 8) | src;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(16)
+#else
 RET(24)
+#endif
 }
 
 // MOVEPLaD
@@ -5237,7 +5235,11 @@ OPCODE(0x0148)
        READ_BYTE_F(adr, src)
        DREG((Opcode >> 9) & 7) = res | src;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(24)
+#else
 RET(32)
+#endif
 }
 
 // MOVEPWDa
@@ -5253,7 +5255,11 @@ OPCODE(0x0188)
        WRITE_BYTE_F(adr + 0, res >> 8)
        WRITE_BYTE_F(adr + 2, res >> 0)
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(16)
+#else
 RET(24)
+#endif
 }
 
 // MOVEPLDa
@@ -5274,7 +5280,11 @@ OPCODE(0x01C8)
        adr += 2;
        WRITE_BYTE_F(adr, res >> 0)
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(24)
+#else
 RET(32)
+#endif
 }
 
 // MOVEB
@@ -5460,6 +5470,7 @@ OPCODE(0x1F00)
 RET(8)
 }
 
+#if 0
 // MOVEB
 OPCODE(0x1008)
 {
@@ -5692,6 +5703,7 @@ OPCODE(0x1F08)
 */
 RET(8)
 }
+#endif
 
 // MOVEB
 OPCODE(0x1010)
@@ -7104,7 +7116,7 @@ OPCODE(0x103A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -7123,7 +7135,7 @@ OPCODE(0x10BA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -7143,7 +7155,7 @@ OPCODE(0x10FA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -7164,7 +7176,7 @@ OPCODE(0x113A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -7185,7 +7197,7 @@ OPCODE(0x117A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -7206,7 +7218,7 @@ OPCODE(0x11BA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -7227,7 +7239,7 @@ OPCODE(0x11FA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -7247,7 +7259,7 @@ OPCODE(0x13FA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -7267,7 +7279,7 @@ OPCODE(0x1EFA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -7288,7 +7300,7 @@ OPCODE(0x1F3A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -7309,7 +7321,7 @@ OPCODE(0x103B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = (uptr)(PC) - BasePC;
        DECODE_EXT_WORD
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -7328,7 +7340,7 @@ OPCODE(0x10BB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = (uptr)(PC) - BasePC;
        DECODE_EXT_WORD
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -7348,7 +7360,7 @@ OPCODE(0x10FB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = (uptr)(PC) - BasePC;
        DECODE_EXT_WORD
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -7369,7 +7381,7 @@ OPCODE(0x113B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = (uptr)(PC) - BasePC;
        DECODE_EXT_WORD
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -7390,7 +7402,7 @@ OPCODE(0x117B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = (uptr)(PC) - BasePC;
        DECODE_EXT_WORD
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -7411,7 +7423,7 @@ OPCODE(0x11BB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = (uptr)(PC) - BasePC;
        DECODE_EXT_WORD
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -7432,7 +7444,7 @@ OPCODE(0x11FB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = (uptr)(PC) - BasePC;
        DECODE_EXT_WORD
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -7452,7 +7464,7 @@ OPCODE(0x13FB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = (uptr)(PC) - BasePC;
        DECODE_EXT_WORD
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -7472,7 +7484,7 @@ OPCODE(0x1EFB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = (uptr)(PC) - BasePC;
        DECODE_EXT_WORD
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -7493,7 +7505,7 @@ OPCODE(0x1F3B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = (uptr)(PC) - BasePC;
        DECODE_EXT_WORD
        PRE_IO
        READ_BYTE_F(adr, res)
@@ -8167,7 +8179,7 @@ OPCODE(0x2100)
        adr = AREG((Opcode >> 9) & 7) - 4;
        AREG((Opcode >> 9) & 7) = adr;
        PRE_IO
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(12)
 }
@@ -8279,7 +8291,7 @@ OPCODE(0x2F00)
        adr = AREG(7) - 4;
        AREG(7) = adr;
        PRE_IO
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(12)
 }
@@ -8350,7 +8362,7 @@ OPCODE(0x2108)
        adr = AREG((Opcode >> 9) & 7) - 4;
        AREG((Opcode >> 9) & 7) = adr;
        PRE_IO
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(12)
 }
@@ -8462,7 +8474,7 @@ OPCODE(0x2F08)
        adr = AREG(7) - 4;
        AREG(7) = adr;
        PRE_IO
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(12)
 }
@@ -8539,7 +8551,7 @@ OPCODE(0x2110)
        flag_N = res >> 24;
        adr = AREG((Opcode >> 9) & 7) - 4;
        AREG((Opcode >> 9) & 7) = adr;
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(20)
 }
@@ -8657,7 +8669,7 @@ OPCODE(0x2F10)
        flag_N = res >> 24;
        adr = AREG(7) - 4;
        AREG(7) = adr;
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(20)
 }
@@ -8738,7 +8750,7 @@ OPCODE(0x2118)
        flag_N = res >> 24;
        adr = AREG((Opcode >> 9) & 7) - 4;
        AREG((Opcode >> 9) & 7) = adr;
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(20)
 }
@@ -8862,7 +8874,7 @@ OPCODE(0x2F18)
        flag_N = res >> 24;
        adr = AREG(7) - 4;
        AREG(7) = adr;
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(20)
 }
@@ -8943,7 +8955,7 @@ OPCODE(0x2120)
        flag_N = res >> 24;
        adr = AREG((Opcode >> 9) & 7) - 4;
        AREG((Opcode >> 9) & 7) = adr;
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(22)
 }
@@ -9067,7 +9079,7 @@ OPCODE(0x2F20)
        flag_N = res >> 24;
        adr = AREG(7) - 4;
        AREG(7) = adr;
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(22)
 }
@@ -9148,7 +9160,7 @@ OPCODE(0x2128)
        flag_N = res >> 24;
        adr = AREG((Opcode >> 9) & 7) - 4;
        AREG((Opcode >> 9) & 7) = adr;
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(24)
 }
@@ -9272,7 +9284,7 @@ OPCODE(0x2F28)
        flag_N = res >> 24;
        adr = AREG(7) - 4;
        AREG(7) = adr;
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(24)
 }
@@ -9353,7 +9365,7 @@ OPCODE(0x2130)
        flag_N = res >> 24;
        adr = AREG((Opcode >> 9) & 7) - 4;
        AREG((Opcode >> 9) & 7) = adr;
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(26)
 }
@@ -9477,7 +9489,7 @@ OPCODE(0x2F30)
        flag_N = res >> 24;
        adr = AREG(7) - 4;
        AREG(7) = adr;
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(26)
 }
@@ -9554,7 +9566,7 @@ OPCODE(0x2138)
        flag_N = res >> 24;
        adr = AREG((Opcode >> 9) & 7) - 4;
        AREG((Opcode >> 9) & 7) = adr;
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(24)
 }
@@ -9672,7 +9684,7 @@ OPCODE(0x2F38)
        flag_N = res >> 24;
        adr = AREG(7) - 4;
        AREG(7) = adr;
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(24)
 }
@@ -9749,7 +9761,7 @@ OPCODE(0x2139)
        flag_N = res >> 24;
        adr = AREG((Opcode >> 9) & 7) - 4;
        AREG((Opcode >> 9) & 7) = adr;
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(28)
 }
@@ -9867,7 +9879,7 @@ OPCODE(0x2F39)
        flag_N = res >> 24;
        adr = AREG(7) - 4;
        AREG(7) = adr;
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(28)
 }
@@ -9878,7 +9890,7 @@ OPCODE(0x203A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_LONG_F(adr, res)
@@ -9897,7 +9909,7 @@ OPCODE(0x20BA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_LONG_F(adr, res)
@@ -9917,7 +9929,7 @@ OPCODE(0x20FA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_LONG_F(adr, res)
@@ -9938,7 +9950,7 @@ OPCODE(0x213A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_LONG_F(adr, res)
@@ -9948,7 +9960,7 @@ OPCODE(0x213A)
        flag_N = res >> 24;
        adr = AREG((Opcode >> 9) & 7) - 4;
        AREG((Opcode >> 9) & 7) = adr;
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(24)
 }
@@ -9959,7 +9971,7 @@ OPCODE(0x217A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_LONG_F(adr, res)
@@ -9980,7 +9992,7 @@ OPCODE(0x21BA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_LONG_F(adr, res)
@@ -10001,7 +10013,7 @@ OPCODE(0x21FA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_LONG_F(adr, res)
@@ -10021,7 +10033,7 @@ OPCODE(0x23FA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_LONG_F(adr, res)
@@ -10041,7 +10053,7 @@ OPCODE(0x2EFA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_LONG_F(adr, res)
@@ -10062,7 +10074,7 @@ OPCODE(0x2F3A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_LONG_F(adr, res)
@@ -10072,7 +10084,7 @@ OPCODE(0x2F3A)
        flag_N = res >> 24;
        adr = AREG(7) - 4;
        AREG(7) = adr;
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(24)
 }
@@ -10083,7 +10095,7 @@ OPCODE(0x203B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_LONG_F(adr, res)
@@ -10102,7 +10114,7 @@ OPCODE(0x20BB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_LONG_F(adr, res)
@@ -10122,7 +10134,7 @@ OPCODE(0x20FB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_LONG_F(adr, res)
@@ -10143,7 +10155,7 @@ OPCODE(0x213B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_LONG_F(adr, res)
@@ -10153,7 +10165,7 @@ OPCODE(0x213B)
        flag_N = res >> 24;
        adr = AREG((Opcode >> 9) & 7) - 4;
        AREG((Opcode >> 9) & 7) = adr;
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(26)
 }
@@ -10164,7 +10176,7 @@ OPCODE(0x217B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_LONG_F(adr, res)
@@ -10185,7 +10197,7 @@ OPCODE(0x21BB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_LONG_F(adr, res)
@@ -10206,7 +10218,7 @@ OPCODE(0x21FB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_LONG_F(adr, res)
@@ -10226,7 +10238,7 @@ OPCODE(0x23FB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_LONG_F(adr, res)
@@ -10246,7 +10258,7 @@ OPCODE(0x2EFB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_LONG_F(adr, res)
@@ -10267,7 +10279,7 @@ OPCODE(0x2F3B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_LONG_F(adr, res)
@@ -10277,7 +10289,7 @@ OPCODE(0x2F3B)
        flag_N = res >> 24;
        adr = AREG(7) - 4;
        AREG(7) = adr;
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(26)
 }
@@ -10348,7 +10360,7 @@ OPCODE(0x213C)
        adr = AREG((Opcode >> 9) & 7) - 4;
        AREG((Opcode >> 9) & 7) = adr;
        PRE_IO
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(20)
 }
@@ -10460,7 +10472,7 @@ OPCODE(0x2F3C)
        adr = AREG(7) - 4;
        AREG(7) = adr;
        PRE_IO
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(20)
 }
@@ -10541,7 +10553,7 @@ OPCODE(0x211F)
        flag_N = res >> 24;
        adr = AREG((Opcode >> 9) & 7) - 4;
        AREG((Opcode >> 9) & 7) = adr;
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(20)
 }
@@ -10665,7 +10677,7 @@ OPCODE(0x2F1F)
        flag_N = res >> 24;
        adr = AREG(7) - 4;
        AREG(7) = adr;
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(20)
 }
@@ -10746,7 +10758,7 @@ OPCODE(0x2127)
        flag_N = res >> 24;
        adr = AREG((Opcode >> 9) & 7) - 4;
        AREG((Opcode >> 9) & 7) = adr;
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(22)
 }
@@ -10870,7 +10882,7 @@ OPCODE(0x2F27)
        flag_N = res >> 24;
        adr = AREG(7) - 4;
        AREG(7) = adr;
-       WRITE_LONG_F(adr, res)
+       WRITE_LONG_DEC_F(adr, res)
        POST_IO
 RET(22)
 }
@@ -11005,7 +11017,7 @@ OPCODE(0x207A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READSX_LONG_F(adr, res)
@@ -11020,7 +11032,7 @@ OPCODE(0x207B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READSX_LONG_F(adr, res)
@@ -12847,7 +12859,7 @@ OPCODE(0x303A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_WORD_F(adr, res)
@@ -12866,7 +12878,7 @@ OPCODE(0x30BA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_WORD_F(adr, res)
@@ -12886,7 +12898,7 @@ OPCODE(0x30FA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_WORD_F(adr, res)
@@ -12907,7 +12919,7 @@ OPCODE(0x313A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_WORD_F(adr, res)
@@ -12928,7 +12940,7 @@ OPCODE(0x317A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_WORD_F(adr, res)
@@ -12949,7 +12961,7 @@ OPCODE(0x31BA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_WORD_F(adr, res)
@@ -12970,7 +12982,7 @@ OPCODE(0x31FA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_WORD_F(adr, res)
@@ -12990,7 +13002,7 @@ OPCODE(0x33FA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_WORD_F(adr, res)
@@ -13010,7 +13022,7 @@ OPCODE(0x3EFA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_WORD_F(adr, res)
@@ -13031,7 +13043,7 @@ OPCODE(0x3F3A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_WORD_F(adr, res)
@@ -13052,7 +13064,7 @@ OPCODE(0x303B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_WORD_F(adr, res)
@@ -13071,7 +13083,7 @@ OPCODE(0x30BB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_WORD_F(adr, res)
@@ -13091,7 +13103,7 @@ OPCODE(0x30FB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_WORD_F(adr, res)
@@ -13112,7 +13124,7 @@ OPCODE(0x313B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_WORD_F(adr, res)
@@ -13133,7 +13145,7 @@ OPCODE(0x317B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_WORD_F(adr, res)
@@ -13154,7 +13166,7 @@ OPCODE(0x31BB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_WORD_F(adr, res)
@@ -13175,7 +13187,7 @@ OPCODE(0x31FB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_WORD_F(adr, res)
@@ -13195,7 +13207,7 @@ OPCODE(0x33FB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_WORD_F(adr, res)
@@ -13215,7 +13227,7 @@ OPCODE(0x3EFB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_WORD_F(adr, res)
@@ -13236,7 +13248,7 @@ OPCODE(0x3F3B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_WORD_F(adr, res)
@@ -13974,7 +13986,7 @@ OPCODE(0x307A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READSX_WORD_F(adr, res)
@@ -13989,7 +14001,7 @@ OPCODE(0x307B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READSX_WORD_F(adr, res)
@@ -16467,7 +16479,7 @@ OPCODE(0x44FA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_WORD_F(adr, res)
@@ -16482,7 +16494,7 @@ OPCODE(0x44FB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_WORD_F(adr, res)
@@ -16552,9 +16564,7 @@ OPCODE(0x46C0)
        }
        else
        {
-               u32 oldPC=GET_PC;
-               SET_PC(oldPC-2)
-               execute_exception(M68K_PRIVILEGE_VIOLATION_EX);
+               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(12)
@@ -16583,9 +16593,7 @@ OPCODE(0x46D0)
        }
        else
        {
-               u32 oldPC=GET_PC;
-               SET_PC(oldPC-2)
-               execute_exception(M68K_PRIVILEGE_VIOLATION_EX);
+               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(16)
@@ -16615,9 +16623,7 @@ OPCODE(0x46D8)
        }
        else
        {
-               u32 oldPC=GET_PC;
-               SET_PC(oldPC-2)
-               execute_exception(M68K_PRIVILEGE_VIOLATION_EX);
+               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(16)
@@ -16647,9 +16653,7 @@ OPCODE(0x46E0)
        }
        else
        {
-               u32 oldPC=GET_PC;
-               SET_PC(oldPC-2)
-               execute_exception(M68K_PRIVILEGE_VIOLATION_EX);
+               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(18)
@@ -16679,9 +16683,7 @@ OPCODE(0x46E8)
        }
        else
        {
-               u32 oldPC=GET_PC;
-               SET_PC(oldPC-2)
-               execute_exception(M68K_PRIVILEGE_VIOLATION_EX);
+               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(20)
@@ -16711,9 +16713,7 @@ OPCODE(0x46F0)
        }
        else
        {
-               u32 oldPC=GET_PC;
-               SET_PC(oldPC-2)
-               execute_exception(M68K_PRIVILEGE_VIOLATION_EX);
+               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(22)
@@ -16743,9 +16743,7 @@ OPCODE(0x46F8)
        }
        else
        {
-               u32 oldPC=GET_PC;
-               SET_PC(oldPC-2)
-               execute_exception(M68K_PRIVILEGE_VIOLATION_EX);
+               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(20)
@@ -16774,9 +16772,7 @@ OPCODE(0x46F9)
        }
        else
        {
-               u32 oldPC=GET_PC;
-               SET_PC(oldPC-2)
-               execute_exception(M68K_PRIVILEGE_VIOLATION_EX);
+               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(24)
@@ -16790,7 +16786,7 @@ OPCODE(0x46FA)
 
        if (flag_S)
        {
-               adr = GET_SWORD + ((u32)(PC) - BasePC);
+               adr = GET_SWORD + GET_PC;
                PC++;
                PRE_IO
                READ_WORD_F(adr, res)
@@ -16802,13 +16798,11 @@ OPCODE(0x46FA)
                        ASP = res;
                }
                POST_IO
-               CHECK_INT_TO_JUMP(24)
+               CHECK_INT_TO_JUMP(20)
        }
        else
        {
-               u32 oldPC=GET_PC;
-               SET_PC(oldPC-2)
-               execute_exception(M68K_PRIVILEGE_VIOLATION_EX);
+               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(20)
@@ -16822,7 +16816,7 @@ OPCODE(0x46FB)
 
        if (flag_S)
        {
-               adr = (u32)(PC) - BasePC;
+               adr = GET_PC;
                DECODE_EXT_WORD
                PRE_IO
                READ_WORD_F(adr, res)
@@ -16838,9 +16832,7 @@ OPCODE(0x46FB)
        }
        else
        {
-               u32 oldPC=GET_PC;
-               SET_PC(oldPC-2)
-               execute_exception(M68K_PRIVILEGE_VIOLATION_EX);
+               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(22)
@@ -16866,9 +16858,7 @@ OPCODE(0x46FC)
        }
        else
        {
-               u32 oldPC=GET_PC;
-               SET_PC(oldPC-2)
-               execute_exception(M68K_PRIVILEGE_VIOLATION_EX);
+               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(16)
@@ -16898,9 +16888,7 @@ OPCODE(0x46DF)
        }
        else
        {
-               u32 oldPC=GET_PC;
-               SET_PC(oldPC-2)
-               execute_exception(M68K_PRIVILEGE_VIOLATION_EX);
+               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(16)
@@ -16930,9 +16918,7 @@ OPCODE(0x46E7)
        }
        else
        {
-               u32 oldPC=GET_PC;
-               SET_PC(oldPC-2)
-               execute_exception(M68K_PRIVILEGE_VIOLATION_EX);
+               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(18)
@@ -17264,7 +17250,7 @@ OPCODE(0x487A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        PUSH_32_F(adr)
@@ -17278,7 +17264,7 @@ OPCODE(0x487B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        PUSH_32_F(adr)
@@ -18306,8 +18292,19 @@ OPCODE(0x4AD0)
        flag_V = 0;
        flag_NotZ = res;
        flag_N = res;
+#ifdef PICODRIVE_HACK
+       if (g_m68kcontext == &PicoCpuFS68k) {
+               res |= 0x80;
+               WRITE_BYTE_F(adr, res);
+       }
+#endif
+
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(18)
+#else
 RET(8)
+#endif
 }
 
 // TAS
@@ -18324,8 +18321,20 @@ OPCODE(0x4AD8)
        flag_V = 0;
        flag_NotZ = res;
        flag_N = res;
+
+#ifdef PICODRIVE_HACK
+       if (g_m68kcontext == &PicoCpuFS68k) {
+               res |= 0x80;
+               WRITE_BYTE_F(adr, res);
+       }
+#endif
+
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(18)
+#else
 RET(8)
+#endif
 }
 
 // TAS
@@ -18342,8 +18351,20 @@ OPCODE(0x4AE0)
        flag_V = 0;
        flag_NotZ = res;
        flag_N = res;
+
+#ifdef PICODRIVE_HACK
+       if (g_m68kcontext == &PicoCpuFS68k) {
+               res |= 0x80;
+               WRITE_BYTE_F(adr, res);
+       }
+#endif
+
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(20)
+#else
 RET(10)
+#endif
 }
 
 // TAS
@@ -18360,8 +18381,20 @@ OPCODE(0x4AE8)
        flag_V = 0;
        flag_NotZ = res;
        flag_N = res;
+
+#ifdef PICODRIVE_HACK
+       if (g_m68kcontext == &PicoCpuFS68k) {
+               res |= 0x80;
+               WRITE_BYTE_F(adr, res);
+       }
+#endif
+
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(22)
+#else
 RET(12)
+#endif
 }
 
 // TAS
@@ -18378,8 +18411,20 @@ OPCODE(0x4AF0)
        flag_V = 0;
        flag_NotZ = res;
        flag_N = res;
+
+#ifdef PICODRIVE_HACK
+       if (g_m68kcontext == &PicoCpuFS68k) {
+               res |= 0x80;
+               WRITE_BYTE_F(adr, res);
+       }
+#endif
+
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(24)
+#else
 RET(14)
+#endif
 }
 
 // TAS
@@ -18395,8 +18440,20 @@ OPCODE(0x4AF8)
        flag_V = 0;
        flag_NotZ = res;
        flag_N = res;
+
+#ifdef PICODRIVE_HACK
+       if (g_m68kcontext == &PicoCpuFS68k) {
+               res |= 0x80;
+               WRITE_BYTE_F(adr, res);
+       }
+#endif
+
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(22)
+#else
 RET(12)
+#endif
 }
 
 // TAS
@@ -18412,8 +18469,20 @@ OPCODE(0x4AF9)
        flag_V = 0;
        flag_NotZ = res;
        flag_N = res;
+
+#ifdef PICODRIVE_HACK
+       if (g_m68kcontext == &PicoCpuFS68k) {
+               res |= 0x80;
+               WRITE_BYTE_F(adr, res);
+       }
+#endif
+
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(26)
+#else
 RET(16)
+#endif
 }
 
 // TAS
@@ -18430,8 +18499,20 @@ OPCODE(0x4ADF)
        flag_V = 0;
        flag_NotZ = res;
        flag_N = res;
+
+#ifdef PICODRIVE_HACK
+       if (g_m68kcontext == &PicoCpuFS68k) {
+               res |= 0x80;
+               WRITE_BYTE_F(adr, res);
+       }
+#endif
+
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(18)
+#else
 RET(8)
+#endif
 }
 
 // TAS
@@ -18448,35 +18529,41 @@ OPCODE(0x4AE7)
        flag_V = 0;
        flag_NotZ = res;
        flag_N = res;
+
+#ifdef PICODRIVE_HACK
+       if (g_m68kcontext == &PicoCpuFS68k) {
+               res |= 0x80;
+               WRITE_BYTE_F(adr, res);
+       }
+#endif
+
        POST_IO
-RET(10)
+#ifdef USE_CYCLONE_TIMING
+RET(20)
+#else
+RET(8)
+#endif
 }
 
 // ILLEGAL
 OPCODE(0x4AFC)
 {
-       u32 oldPC=GET_PC;
-       SET_PC(oldPC-2)
-       execute_exception(M68K_ILLEGAL_INSTRUCTION_EX);
-RET(4)
+       SET_PC(execute_exception(M68K_ILLEGAL_INSTRUCTION_EX, GET_PC-2, GET_SR));
+RET(0)
 }
 
 // ILLEGAL A000-AFFF
 OPCODE(0xA000)
 {
-       u32 oldPC=GET_PC;
-       SET_PC(oldPC-2)
-       execute_exception(M68K_1010_EX);
-RET(4)
+       SET_PC(execute_exception(M68K_1010_EX, GET_PC-2, GET_SR));
+RET(0)
 }
 
 // ILLEGAL F000-FFFF
 OPCODE(0xF000)
 {
-       u32 oldPC=GET_PC;
-       SET_PC(oldPC-2)
-       execute_exception(M68K_1111_EX);
-RET(4)
+       SET_PC(execute_exception(M68K_1111_EX, GET_PC-2, GET_SR));
+RET(0) // 4 already taken by exc. handler
 }
 
 // MOVEMaR
@@ -18673,7 +18760,7 @@ OPCODE(0x4CBA)
        s32 *psrc;
 
        FETCH_WORD(res);
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        psrc = &DREGs32(0);
        dst = adr;
@@ -18705,7 +18792,7 @@ OPCODE(0x4CBB)
        s32 *psrc;
 
        FETCH_WORD(res);
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        psrc = &DREGs32(0);
        dst = adr;
@@ -18950,7 +19037,7 @@ OPCODE(0x4CFA)
        u32 *psrc;
 
        FETCH_WORD(res);
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        psrc = &DREGu32(0);
        dst = adr;
@@ -18982,7 +19069,7 @@ OPCODE(0x4CFB)
        u32 *psrc;
 
        FETCH_WORD(res);
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        psrc = &DREGu32(0);
        dst = adr;
@@ -19036,7 +19123,7 @@ RET(12)
 // TRAP
 OPCODE(0x4E40)
 {
-       execute_exception(M68K_TRAP_BASE_EX + (Opcode & 0xF));
+       SET_PC(execute_exception(M68K_TRAP_BASE_EX + (Opcode & 0xF), GET_PC, GET_SR));
 RET(4)
 }
 
@@ -19107,9 +19194,7 @@ OPCODE(0x4E60)
 
        if (!flag_S)
        {
-               u32 oldPC=GET_PC;
-               SET_PC(oldPC-2)
-               execute_exception(M68K_PRIVILEGE_VIOLATION_EX);
+               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
        res = AREGu32((Opcode >> 0) & 7);
@@ -19125,9 +19210,7 @@ OPCODE(0x4E68)
 
        if (!flag_S)
        {
-               u32 oldPC=GET_PC;
-               SET_PC(oldPC-2)
-               execute_exception(M68K_PRIVILEGE_VIOLATION_EX);
+               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
        res = ASP;
@@ -19143,9 +19226,7 @@ OPCODE(0x4E70)
 
        if (!flag_S)
        {
-               u32 oldPC=GET_PC;
-               SET_PC(oldPC-2)
-               execute_exception(M68K_PRIVILEGE_VIOLATION_EX);
+               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
        PRE_IO
@@ -19169,9 +19250,7 @@ OPCODE(0x4E72)
 
        if (!flag_S)
        {
-               u32 oldPC=GET_PC;
-               SET_PC(oldPC-2)
-               execute_exception(M68K_PRIVILEGE_VIOLATION_EX);
+               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
        FETCH_WORD(res);
@@ -19183,9 +19262,8 @@ OPCODE(0x4E72)
                AREG(7) = ASP;
                ASP = res;
        }
-       m68kcontext.execinfo |= M68K_HALTED;
-       m68kcontext.io_cycle_counter = 0;
-RET(4)
+       m68kcontext.execinfo |= FM68K_HALTED;
+RET0()
 }
 
 // RTE
@@ -19196,9 +19274,7 @@ OPCODE(0x4E73)
 
        if (!flag_S)
        {
-               u32 oldPC=GET_PC;
-               SET_PC(oldPC-2)
-               execute_exception(M68K_PRIVILEGE_VIOLATION_EX);
+               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
        PRE_IO
@@ -19213,7 +19289,7 @@ OPCODE(0x4E73)
                ASP = res;
        }
        POST_IO
-       m68kcontext.execinfo &= ~(M68K_EMULATE_GROUP_0|M68K_EMULATE_TRACE|M68K_DO_TRACE);
+       m68kcontext.execinfo &= ~(FM68K_EMULATE_GROUP_0|FM68K_EMULATE_TRACE|FM68K_DO_TRACE);
        CHECK_INT_TO_JUMP(20)
 RET(20)
 }
@@ -19236,7 +19312,7 @@ RET(16)
 OPCODE(0x4E76)
 {
        if (flag_V & 0x80)
-               execute_exception(M68K_TRAPV_EX);
+               SET_PC(execute_exception(M68K_TRAPV_EX, GET_PC, GET_SR));
 RET(4)
 }
 
@@ -19266,7 +19342,7 @@ OPCODE(0x4E90)
        {
                u32 oldPC;
 
-               oldPC = (u32)(PC) - BasePC;
+               oldPC = GET_PC;
        PRE_IO
                PUSH_32_F(oldPC)
        }
@@ -19287,7 +19363,7 @@ OPCODE(0x4EA8)
        {
                u32 oldPC;
 
-               oldPC = (u32)(PC) - BasePC;
+               oldPC = GET_PC;
        PRE_IO
                PUSH_32_F(oldPC)
        }
@@ -19308,7 +19384,7 @@ OPCODE(0x4EB0)
        {
                u32 oldPC;
 
-               oldPC = (u32)(PC) - BasePC;
+               oldPC = GET_PC;
        PRE_IO
                PUSH_32_F(oldPC)
        }
@@ -19328,7 +19404,7 @@ OPCODE(0x4EB8)
        {
                u32 oldPC;
 
-               oldPC = (u32)(PC) - BasePC;
+               oldPC = GET_PC;
        PRE_IO
                PUSH_32_F(oldPC)
        }
@@ -19348,7 +19424,7 @@ OPCODE(0x4EB9)
        {
                u32 oldPC;
 
-               oldPC = (u32)(PC) - BasePC;
+               oldPC = GET_PC;
        PRE_IO
                PUSH_32_F(oldPC)
        }
@@ -19364,12 +19440,12 @@ OPCODE(0x4EBA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        {
                u32 oldPC;
 
-               oldPC = (u32)(PC) - BasePC;
+               oldPC = GET_PC;
        PRE_IO
                PUSH_32_F(oldPC)
        }
@@ -19385,12 +19461,12 @@ OPCODE(0x4EBB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        {
                u32 oldPC;
 
-               oldPC = (u32)(PC) - BasePC;
+               oldPC = GET_PC;
        PRE_IO
                PUSH_32_F(oldPC)
        }
@@ -19468,7 +19544,7 @@ OPCODE(0x4EFA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        SET_PC(adr)
        CHECK_BRANCH_EXCEPTION(adr)
@@ -19481,7 +19557,7 @@ OPCODE(0x4EFB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        SET_PC(adr)
        CHECK_BRANCH_EXCEPTION(adr)
@@ -19499,7 +19575,7 @@ OPCODE(0x4180)
        if (((s32)res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               execute_exception(M68K_CHK_EX);
+               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
        }
 RET(10)
 }
@@ -19517,7 +19593,7 @@ OPCODE(0x4190)
        if (((s32)res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               execute_exception(M68K_CHK_EX);
+               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(14)
@@ -19537,7 +19613,7 @@ OPCODE(0x4198)
        if (((s32)res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               execute_exception(M68K_CHK_EX);
+               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(14)
@@ -19557,7 +19633,7 @@ OPCODE(0x41A0)
        if (((s32)res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               execute_exception(M68K_CHK_EX);
+               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(16)
@@ -19577,7 +19653,7 @@ OPCODE(0x41A8)
        if (((s32)res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               execute_exception(M68K_CHK_EX);
+               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(18)
@@ -19597,7 +19673,7 @@ OPCODE(0x41B0)
        if (((s32)res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               execute_exception(M68K_CHK_EX);
+               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(20)
@@ -19616,7 +19692,7 @@ OPCODE(0x41B8)
        if (((s32)res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               execute_exception(M68K_CHK_EX);
+               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(18)
@@ -19635,7 +19711,7 @@ OPCODE(0x41B9)
        if (((s32)res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               execute_exception(M68K_CHK_EX);
+               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(22)
@@ -19647,7 +19723,7 @@ OPCODE(0x41BA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_WORD_F(adr, src)
@@ -19655,7 +19731,7 @@ OPCODE(0x41BA)
        if (((s32)res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               execute_exception(M68K_CHK_EX);
+               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(18)
@@ -19667,7 +19743,7 @@ OPCODE(0x41BB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_WORD_F(adr, src)
@@ -19675,7 +19751,7 @@ OPCODE(0x41BB)
        if (((s32)res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               execute_exception(M68K_CHK_EX);
+               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(20)
@@ -19692,7 +19768,7 @@ OPCODE(0x41BC)
        if (((s32)res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               execute_exception(M68K_CHK_EX);
+               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(14)
@@ -19712,7 +19788,7 @@ OPCODE(0x419F)
        if (((s32)res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               execute_exception(M68K_CHK_EX);
+               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(14)
@@ -19732,7 +19808,7 @@ OPCODE(0x41A7)
        if (((s32)res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               execute_exception(M68K_CHK_EX);
+               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(16)
@@ -19806,7 +19882,7 @@ OPCODE(0x41FA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        res = adr;
        AREG((Opcode >> 9) & 7) = res;
@@ -19819,7 +19895,7 @@ OPCODE(0x41FB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        res = adr;
        AREG((Opcode >> 9) & 7) = res;
@@ -23229,7 +23305,7 @@ OPCODE(0x51C8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23254,7 +23330,7 @@ OPCODE(0x52C8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23285,7 +23361,7 @@ OPCODE(0x53C8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23316,7 +23392,7 @@ OPCODE(0x54C8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23347,7 +23423,7 @@ OPCODE(0x55C8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23378,7 +23454,7 @@ OPCODE(0x56C8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23409,7 +23485,7 @@ OPCODE(0x57C8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23440,7 +23516,7 @@ OPCODE(0x58C8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23471,7 +23547,7 @@ OPCODE(0x59C8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23502,7 +23578,7 @@ OPCODE(0x5AC8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23533,7 +23609,7 @@ OPCODE(0x5BC8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23564,7 +23640,7 @@ OPCODE(0x5CC8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23595,7 +23671,7 @@ OPCODE(0x5DC8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23626,7 +23702,7 @@ OPCODE(0x5EC8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23657,7 +23733,7 @@ OPCODE(0x5FC8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23892,7 +23968,7 @@ OPCODE(0x5048)
        dst = AREGu32((Opcode >> 0) & 7);
        res = dst + src;
        AREG((Opcode >> 0) & 7) = res;
-#ifdef USE_CYCLONE_TIMING_ // breaks Project-X
+#ifdef USE_CYCLONE_TIMING
 RET(4)
 #else
 RET(8)
@@ -25113,7 +25189,7 @@ OPCODE(0x6200)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25133,7 +25209,7 @@ OPCODE(0x6300)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25153,7 +25229,7 @@ OPCODE(0x6400)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25173,7 +25249,7 @@ OPCODE(0x6500)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25193,7 +25269,7 @@ OPCODE(0x6600)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25213,7 +25289,7 @@ OPCODE(0x6700)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25233,7 +25309,7 @@ OPCODE(0x6800)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25253,7 +25329,7 @@ OPCODE(0x6900)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25273,7 +25349,7 @@ OPCODE(0x6A00)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25293,7 +25369,7 @@ OPCODE(0x6B00)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25313,7 +25389,7 @@ OPCODE(0x6C00)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25333,7 +25409,7 @@ OPCODE(0x6D00)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25353,7 +25429,7 @@ OPCODE(0x6E00)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25373,7 +25449,7 @@ OPCODE(0x6F00)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25387,7 +25463,7 @@ RET(12)
 OPCODE(0x6001)
 {
 #ifdef FAMEC_CHECK_BRANCHES
-       u32 newPC = (u32)(PC) - BasePC;
+       u32 newPC = GET_PC;
        s8 offs=Opcode;
        newPC += offs;
        SET_PC(newPC);
@@ -25407,7 +25483,7 @@ OPCODE(0x6000)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25425,7 +25501,7 @@ OPCODE(0x6101)
 
        PRE_IO
 
-       oldPC = (u32)(PC) - BasePC;
+       oldPC = GET_PC;
        PUSH_32_F(oldPC)
 #ifdef FAMEC_CHECK_BRANCHES
        offs = Opcode;
@@ -25449,7 +25525,7 @@ OPCODE(0x6100)
        {
                u32 oldPC, newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                oldPC = newPC + 2;
                PUSH_32_F(oldPC)
                newPC += GET_SWORD;
@@ -25640,7 +25716,7 @@ OPCODE(0x803A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_BYTE_F(adr, src)
@@ -25661,7 +25737,7 @@ OPCODE(0x803B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_BYTE_F(adr, src)
@@ -25902,7 +25978,7 @@ OPCODE(0x807A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_WORD_F(adr, src)
@@ -25923,7 +25999,7 @@ OPCODE(0x807B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_WORD_F(adr, src)
@@ -26164,7 +26240,7 @@ OPCODE(0x80BA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_LONG_F(adr, src)
@@ -26185,7 +26261,7 @@ OPCODE(0x80BB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_LONG_F(adr, src)
@@ -26965,7 +27041,7 @@ OPCODE(0x80C0)
        src = DREGu16((Opcode >> 0) & 7);
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(140)
 #else
@@ -27013,7 +27089,7 @@ OPCODE(0x80D0)
        READ_WORD_F(adr, src)
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(144)
 #else
@@ -27062,7 +27138,7 @@ OPCODE(0x80D8)
        READ_WORD_F(adr, src)
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(144)
 #else
@@ -27111,7 +27187,7 @@ OPCODE(0x80E0)
        READ_WORD_F(adr, src)
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(146)
 #else
@@ -27160,7 +27236,7 @@ OPCODE(0x80E8)
        READ_WORD_F(adr, src)
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(148)
 #else
@@ -27209,7 +27285,7 @@ OPCODE(0x80F0)
        READ_WORD_F(adr, src)
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(150)
 #else
@@ -27257,7 +27333,7 @@ OPCODE(0x80F8)
        READ_WORD_F(adr, src)
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(148)
 #else
@@ -27305,7 +27381,7 @@ OPCODE(0x80F9)
        READ_WORD_F(adr, src)
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(162)
 #else
@@ -27348,13 +27424,13 @@ OPCODE(0x80FA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_WORD_F(adr, src)
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(148)
 #else
@@ -27397,13 +27473,13 @@ OPCODE(0x80FB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_WORD_F(adr, src)
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(160)
 #else
@@ -27449,7 +27525,7 @@ OPCODE(0x80FC)
        FETCH_WORD(src);
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(144)
 #else
@@ -27498,7 +27574,7 @@ OPCODE(0x80DF)
        READ_WORD_F(adr, src)
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(144)
 #else
@@ -27547,7 +27623,7 @@ OPCODE(0x80E7)
        READ_WORD_F(adr, src)
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(146)
 #else
@@ -27593,9 +27669,9 @@ OPCODE(0x81C0)
        src = (s32)DREGs16((Opcode >> 0) & 7);
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81C0;
 #endif
                RET(10)
        }
@@ -27607,7 +27683,7 @@ goto end;
                res = 0;
        DREGu32((Opcode >> 9) & 7) = res;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81C0;
 #endif
        RET(50)
        }
@@ -27621,7 +27697,7 @@ goto end;
                {
                        flag_V = M68K_SR_V;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81C0;
 #endif
        RET(80)
                }
@@ -27633,7 +27709,7 @@ goto end;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end:   m68kcontext.io_cycle_counter -= 50;
+end81C0: m68kcontext.io_cycle_counter -= 50;
 #endif
 RET(108)
 }
@@ -27649,9 +27725,9 @@ OPCODE(0x81D0)
        READSX_WORD_F(adr, src)
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81D0;
 #endif
                RET(14)
        }
@@ -27663,7 +27739,7 @@ goto end;
                res = 0;
        DREGu32((Opcode >> 9) & 7) = res;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81D0;
 #endif
        RET(54)
        }
@@ -27677,7 +27753,7 @@ goto end;
                {
                        flag_V = M68K_SR_V;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81D0;
 #endif
        RET(84)
                }
@@ -27689,7 +27765,7 @@ goto end;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end:   m68kcontext.io_cycle_counter -= 50;
+end81D0: m68kcontext.io_cycle_counter -= 50;
 #endif
 RET(112)
 }
@@ -27706,9 +27782,9 @@ OPCODE(0x81D8)
        READSX_WORD_F(adr, src)
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81D8;
 #endif
                RET(14)
        }
@@ -27720,7 +27796,7 @@ goto end;
                res = 0;
        DREGu32((Opcode >> 9) & 7) = res;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81D8;
 #endif
        RET(54)
        }
@@ -27734,7 +27810,7 @@ goto end;
                {
                        flag_V = M68K_SR_V;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81D8;
 #endif
        RET(84)
                }
@@ -27746,7 +27822,7 @@ goto end;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end:   m68kcontext.io_cycle_counter -= 50;
+end81D8: m68kcontext.io_cycle_counter -= 50;
 #endif
 RET(112)
 }
@@ -27763,9 +27839,9 @@ OPCODE(0x81E0)
        READSX_WORD_F(adr, src)
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81E0;
 #endif
                RET(16)
        }
@@ -27777,7 +27853,7 @@ goto end;
                res = 0;
        DREGu32((Opcode >> 9) & 7) = res;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81E0;
 #endif
        RET(56)
        }
@@ -27791,7 +27867,7 @@ goto end;
                {
                        flag_V = M68K_SR_V;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81E0;
 #endif
        RET(86)
                }
@@ -27803,7 +27879,7 @@ goto end;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end:   m68kcontext.io_cycle_counter -= 50;
+end81E0: m68kcontext.io_cycle_counter -= 50;
 #endif
 RET(114)
 }
@@ -27820,9 +27896,9 @@ OPCODE(0x81E8)
        READSX_WORD_F(adr, src)
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81E8;
 #endif
                RET(18)
        }
@@ -27834,7 +27910,7 @@ goto end;
                res = 0;
        DREGu32((Opcode >> 9) & 7) = res;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81E8;
 #endif
        RET(58)
        }
@@ -27848,7 +27924,7 @@ goto end;
                {
                        flag_V = M68K_SR_V;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81E8;
 #endif
        RET(88)
                }
@@ -27860,7 +27936,7 @@ goto end;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end:   m68kcontext.io_cycle_counter -= 50;
+end81E8: m68kcontext.io_cycle_counter -= 50;
 #endif
 RET(116)
 }
@@ -27877,9 +27953,9 @@ OPCODE(0x81F0)
        READSX_WORD_F(adr, src)
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81F0;
 #endif
                RET(20)
        }
@@ -27891,7 +27967,7 @@ goto end;
                res = 0;
        DREGu32((Opcode >> 9) & 7) = res;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81F0;
 #endif
        RET(60)
        }
@@ -27905,7 +27981,7 @@ goto end;
                {
                        flag_V = M68K_SR_V;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81F0;
 #endif
        RET(90)
                }
@@ -27917,7 +27993,7 @@ goto end;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end:   m68kcontext.io_cycle_counter -= 50;
+end81F0: m68kcontext.io_cycle_counter -= 50;
 #endif
 RET(118)
 }
@@ -27933,9 +28009,9 @@ OPCODE(0x81F8)
        READSX_WORD_F(adr, src)
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81F8;
 #endif
                RET(18)
        }
@@ -27947,7 +28023,7 @@ goto end;
                res = 0;
        DREGu32((Opcode >> 9) & 7) = res;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81F8;
 #endif
        RET(58)
        }
@@ -27961,7 +28037,7 @@ goto end;
                {
                        flag_V = M68K_SR_V;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81F8;
 #endif
        RET(88)
                }
@@ -27973,7 +28049,7 @@ goto end;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end:   m68kcontext.io_cycle_counter -= 50;
+end81F8: m68kcontext.io_cycle_counter -= 50;
 #endif
 RET(116)
 }
@@ -27989,9 +28065,9 @@ OPCODE(0x81F9)
        READSX_WORD_F(adr, src)
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81F9;
 #endif
                RET(22)
        }
@@ -28003,7 +28079,7 @@ goto end;
                res = 0;
        DREGu32((Opcode >> 9) & 7) = res;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81F9;
 #endif
        RET(62)
        }
@@ -28017,7 +28093,7 @@ goto end;
                {
                        flag_V = M68K_SR_V;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81F9;
 #endif
        RET(92)
                }
@@ -28029,7 +28105,7 @@ goto end;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end:   m68kcontext.io_cycle_counter -= 50;
+end81F9: m68kcontext.io_cycle_counter -= 50;
 #endif
 RET(120)
 }
@@ -28040,15 +28116,15 @@ OPCODE(0x81FA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READSX_WORD_F(adr, src)
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81FA;
 #endif
                RET(18)
        }
@@ -28060,7 +28136,7 @@ goto end;
                res = 0;
        DREGu32((Opcode >> 9) & 7) = res;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81FA;
 #endif
        RET(58)
        }
@@ -28074,7 +28150,7 @@ goto end;
                {
                        flag_V = M68K_SR_V;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81FA;
 #endif
        RET(88)
                }
@@ -28086,7 +28162,7 @@ goto end;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end:   m68kcontext.io_cycle_counter -= 50;
+end81FA: m68kcontext.io_cycle_counter -= 50;
 #endif
 RET(116)
 }
@@ -28097,15 +28173,15 @@ OPCODE(0x81FB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READSX_WORD_F(adr, src)
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81FB;
 #endif
                RET(20)
        }
@@ -28117,7 +28193,7 @@ goto end;
                res = 0;
        DREGu32((Opcode >> 9) & 7) = res;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81FB;
 #endif
        RET(60)
        }
@@ -28131,7 +28207,7 @@ goto end;
                {
                        flag_V = M68K_SR_V;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81FB;
 #endif
        RET(90)
                }
@@ -28143,7 +28219,7 @@ goto end;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end:   m68kcontext.io_cycle_counter -= 50;
+end81FB: m68kcontext.io_cycle_counter -= 50;
 #endif
 RET(118)
 }
@@ -28157,9 +28233,9 @@ OPCODE(0x81FC)
        FETCH_SWORD(src);
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81FC;
 #endif
                RET(14)
        }
@@ -28171,7 +28247,7 @@ goto end;
                res = 0;
        DREGu32((Opcode >> 9) & 7) = res;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81FC;
 #endif
        RET(54)
        }
@@ -28185,7 +28261,7 @@ goto end;
                {
                        flag_V = M68K_SR_V;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81FC;
 #endif
        RET(84)
                }
@@ -28197,7 +28273,7 @@ goto end;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end:   m68kcontext.io_cycle_counter -= 50;
+end81FC: m68kcontext.io_cycle_counter -= 50;
 #endif
 RET(112)
 }
@@ -28214,9 +28290,9 @@ OPCODE(0x81DF)
        READSX_WORD_F(adr, src)
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81DF;
 #endif
                RET(14)
        }
@@ -28228,7 +28304,7 @@ goto end;
                res = 0;
        DREGu32((Opcode >> 9) & 7) = res;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81DF;
 #endif
        RET(54)
        }
@@ -28242,7 +28318,7 @@ goto end;
                {
                        flag_V = M68K_SR_V;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81DF;
 #endif
        RET(84)
                }
@@ -28254,7 +28330,7 @@ goto end;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end:   m68kcontext.io_cycle_counter -= 50;
+end81DF: m68kcontext.io_cycle_counter -= 50;
 #endif
 RET(112)
 }
@@ -28271,9 +28347,9 @@ OPCODE(0x81E7)
        READSX_WORD_F(adr, src)
        if (src == 0)
        {
-               execute_exception(M68K_ZERO_DIVIDE_EX);
+               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81E7;
 #endif
                RET(16)
        }
@@ -28285,7 +28361,7 @@ goto end;
                res = 0;
        DREGu32((Opcode >> 9) & 7) = res;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81E7;
 #endif
        RET(56)
        }
@@ -28299,7 +28375,7 @@ goto end;
                {
                        flag_V = M68K_SR_V;
 #ifdef USE_CYCLONE_TIMING_DIV
-goto end;
+goto end81E7;
 #endif
        RET(86)
                }
@@ -28311,7 +28387,7 @@ goto end;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end:   m68kcontext.io_cycle_counter -= 50;
+end81E7: m68kcontext.io_cycle_counter -= 50;
 #endif
 RET(114)
 }
@@ -28333,6 +28409,7 @@ RET(4)
 }
 
 // SUBaD
+#if 0
 OPCODE(0x9008)
 {
        u32 adr, res;
@@ -28352,6 +28429,7 @@ OPCODE(0x9008)
 */
 RET(4)
 }
+#endif
 
 // SUBaD
 OPCODE(0x9010)
@@ -28496,7 +28574,7 @@ OPCODE(0x903A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_BYTE_F(adr, src)
@@ -28516,7 +28594,7 @@ OPCODE(0x903B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_BYTE_F(adr, src)
@@ -28761,7 +28839,7 @@ OPCODE(0x907A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_WORD_F(adr, src)
@@ -28781,7 +28859,7 @@ OPCODE(0x907B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_WORD_F(adr, src)
@@ -29035,7 +29113,7 @@ OPCODE(0x90BA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_LONG_F(adr, src)
@@ -29056,7 +29134,7 @@ OPCODE(0x90BB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_LONG_F(adr, src)
@@ -30026,7 +30104,11 @@ OPCODE(0x90D0)
        res = dst - src;
        AREG((Opcode >> 9) & 7) = res;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(12)
+#else
 RET(10)
+#endif
 }
 
 // SUBA
@@ -30043,7 +30125,11 @@ OPCODE(0x90D8)
        res = dst - src;
        AREG((Opcode >> 9) & 7) = res;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(12)
+#else
 RET(10)
+#endif
 }
 
 // SUBA
@@ -30060,7 +30146,11 @@ OPCODE(0x90E0)
        res = dst - src;
        AREG((Opcode >> 9) & 7) = res;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(14)
+#else
 RET(12)
+#endif
 }
 
 // SUBA
@@ -30077,7 +30167,11 @@ OPCODE(0x90E8)
        res = dst - src;
        AREG((Opcode >> 9) & 7) = res;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(16)
+#else
 RET(14)
+#endif
 }
 
 // SUBA
@@ -30094,7 +30188,11 @@ OPCODE(0x90F0)
        res = dst - src;
        AREG((Opcode >> 9) & 7) = res;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(18)
+#else
 RET(16)
+#endif
 }
 
 // SUBA
@@ -30110,7 +30208,11 @@ OPCODE(0x90F8)
        res = dst - src;
        AREG((Opcode >> 9) & 7) = res;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(16)
+#else
 RET(14)
+#endif
 }
 
 // SUBA
@@ -30126,7 +30228,11 @@ OPCODE(0x90F9)
        res = dst - src;
        AREG((Opcode >> 9) & 7) = res;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(20)
+#else
 RET(18)
+#endif
 }
 
 // SUBA
@@ -30135,7 +30241,7 @@ OPCODE(0x90FA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READSX_WORD_F(adr, src)
@@ -30143,7 +30249,11 @@ OPCODE(0x90FA)
        res = dst - src;
        AREG((Opcode >> 9) & 7) = res;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(16)
+#else
 RET(14)
+#endif
 }
 
 // SUBA
@@ -30152,7 +30262,7 @@ OPCODE(0x90FB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READSX_WORD_F(adr, src)
@@ -30160,7 +30270,11 @@ OPCODE(0x90FB)
        res = dst - src;
        AREG((Opcode >> 9) & 7) = res;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(18)
+#else
 RET(16)
+#endif
 }
 
 // SUBA
@@ -30190,7 +30304,11 @@ OPCODE(0x90DF)
        res = dst - src;
        AREG((Opcode >> 9) & 7) = res;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(12)
+#else
 RET(10)
+#endif
 }
 
 // SUBA
@@ -30207,7 +30325,11 @@ OPCODE(0x90E7)
        res = dst - src;
        AREG((Opcode >> 9) & 7) = res;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(14)
+#else
 RET(12)
+#endif
 }
 
 // SUBA
@@ -30366,7 +30488,7 @@ OPCODE(0x91FA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READSX_LONG_F(adr, src)
@@ -30383,7 +30505,7 @@ OPCODE(0x91FB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READSX_LONG_F(adr, src)
@@ -30461,6 +30583,7 @@ RET(4)
 }
 
 // CMP
+#if 0
 OPCODE(0xB008)
 {
        u32 adr, res;
@@ -30479,6 +30602,7 @@ OPCODE(0xB008)
 */
 RET(4)
 }
+#endif
 
 // CMP
 OPCODE(0xB010)
@@ -30616,7 +30740,7 @@ OPCODE(0xB03A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_BYTE_F(adr, src)
@@ -30635,7 +30759,7 @@ OPCODE(0xB03B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_BYTE_F(adr, src)
@@ -30867,7 +30991,7 @@ OPCODE(0xB07A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_WORD_F(adr, src)
@@ -30886,7 +31010,7 @@ OPCODE(0xB07B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_WORD_F(adr, src)
@@ -31127,7 +31251,7 @@ OPCODE(0xB0BA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_LONG_F(adr, src)
@@ -31147,7 +31271,7 @@ OPCODE(0xB0BB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_LONG_F(adr, src)
@@ -32257,7 +32381,7 @@ OPCODE(0xB0FA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READSX_WORD_F(adr, src)
@@ -32277,7 +32401,7 @@ OPCODE(0xB0FB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READSX_WORD_F(adr, src)
@@ -32522,7 +32646,7 @@ OPCODE(0xB1FA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READSX_LONG_F(adr, src)
@@ -32542,7 +32666,7 @@ OPCODE(0xB1FB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READSX_LONG_F(adr, src)
@@ -32779,7 +32903,7 @@ OPCODE(0xC03A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_BYTE_F(adr, src)
@@ -32800,7 +32924,7 @@ OPCODE(0xC03B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_BYTE_F(adr, src)
@@ -33041,7 +33165,7 @@ OPCODE(0xC07A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_WORD_F(adr, src)
@@ -33062,7 +33186,7 @@ OPCODE(0xC07B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_WORD_F(adr, src)
@@ -33303,7 +33427,7 @@ OPCODE(0xC0BA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_LONG_F(adr, src)
@@ -33324,7 +33448,7 @@ OPCODE(0xC0BB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_LONG_F(adr, src)
@@ -34286,7 +34410,7 @@ OPCODE(0xC0FA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_WORD_F(adr, src)
@@ -34310,7 +34434,7 @@ OPCODE(0xC0FB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_WORD_F(adr, src)
@@ -34587,7 +34711,7 @@ OPCODE(0xC1FA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READSX_WORD_F(adr, src)
@@ -34611,7 +34735,7 @@ OPCODE(0xC1FB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READSX_WORD_F(adr, src)
@@ -34756,6 +34880,7 @@ RET(4)
 }
 
 // ADDaD
+#if 0
 OPCODE(0xD008)
 {
        u32 adr, res;
@@ -34775,6 +34900,7 @@ OPCODE(0xD008)
 */
 RET(4)
 }
+#endif
 
 // ADDaD
 OPCODE(0xD010)
@@ -34919,7 +35045,7 @@ OPCODE(0xD03A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_BYTE_F(adr, src)
@@ -34939,7 +35065,7 @@ OPCODE(0xD03B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_BYTE_F(adr, src)
@@ -35184,7 +35310,7 @@ OPCODE(0xD07A)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_WORD_F(adr, src)
@@ -35204,7 +35330,7 @@ OPCODE(0xD07B)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_WORD_F(adr, src)
@@ -35458,7 +35584,7 @@ OPCODE(0xD0BA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READ_LONG_F(adr, src)
@@ -35479,7 +35605,7 @@ OPCODE(0xD0BB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READ_LONG_F(adr, src)
@@ -36449,7 +36575,11 @@ OPCODE(0xD0D0)
        res = dst + src;
        AREG((Opcode >> 9) & 7) = res;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(12)
+#else
 RET(10)
+#endif
 }
 
 // ADDA
@@ -36466,7 +36596,11 @@ OPCODE(0xD0D8)
        res = dst + src;
        AREG((Opcode >> 9) & 7) = res;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(12)
+#else
 RET(10)
+#endif
 }
 
 // ADDA
@@ -36483,7 +36617,11 @@ OPCODE(0xD0E0)
        res = dst + src;
        AREG((Opcode >> 9) & 7) = res;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(14)
+#else
 RET(12)
+#endif
 }
 
 // ADDA
@@ -36500,7 +36638,11 @@ OPCODE(0xD0E8)
        res = dst + src;
        AREG((Opcode >> 9) & 7) = res;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(16)
+#else
 RET(14)
+#endif
 }
 
 // ADDA
@@ -36517,7 +36659,11 @@ OPCODE(0xD0F0)
        res = dst + src;
        AREG((Opcode >> 9) & 7) = res;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(18)
+#else
 RET(16)
+#endif
 }
 
 // ADDA
@@ -36533,7 +36679,11 @@ OPCODE(0xD0F8)
        res = dst + src;
        AREG((Opcode >> 9) & 7) = res;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(16)
+#else
 RET(14)
+#endif
 }
 
 // ADDA
@@ -36549,7 +36699,11 @@ OPCODE(0xD0F9)
        res = dst + src;
        AREG((Opcode >> 9) & 7) = res;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(20)
+#else
 RET(18)
+#endif
 }
 
 // ADDA
@@ -36558,7 +36712,7 @@ OPCODE(0xD0FA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READSX_WORD_F(adr, src)
@@ -36566,7 +36720,11 @@ OPCODE(0xD0FA)
        res = dst + src;
        AREG((Opcode >> 9) & 7) = res;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(16)
+#else
 RET(14)
+#endif
 }
 
 // ADDA
@@ -36575,7 +36733,7 @@ OPCODE(0xD0FB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READSX_WORD_F(adr, src)
@@ -36583,7 +36741,11 @@ OPCODE(0xD0FB)
        res = dst + src;
        AREG((Opcode >> 9) & 7) = res;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(18)
+#else
 RET(16)
+#endif
 }
 
 // ADDA
@@ -36613,7 +36775,11 @@ OPCODE(0xD0DF)
        res = dst + src;
        AREG((Opcode >> 9) & 7) = res;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(12)
+#else
 RET(10)
+#endif
 }
 
 // ADDA
@@ -36630,7 +36796,11 @@ OPCODE(0xD0E7)
        res = dst + src;
        AREG((Opcode >> 9) & 7) = res;
        POST_IO
+#ifdef USE_CYCLONE_TIMING
+RET(14)
+#else
 RET(12)
+#endif
 }
 
 // ADDA
@@ -36789,7 +36959,7 @@ OPCODE(0xD1FA)
        u32 adr, res;
        u32 src, dst;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
        READSX_LONG_F(adr, src)
@@ -36806,7 +36976,7 @@ OPCODE(0xD1FB)
        u32 adr, res;
        u32 src, dst;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
        READSX_LONG_F(adr, src)
@@ -39790,3 +39960,98 @@ OPCODE(0xE7E7)
 RET(14)
 }
 
+#ifdef PICODRIVE_HACK
+#if 0
+#define UPDATE_IDLE_COUNT { \
+       extern int idle_hit_counter; \
+       idle_hit_counter++; \
+}
+#else
+#define UPDATE_IDLE_COUNT
+#endif
+
+// BRA
+OPCODE(0x6001_idle)
+{
+#ifdef FAMEC_CHECK_BRANCHES
+       u32 newPC = GET_PC;
+       s8 offs=Opcode;
+       newPC += offs;
+       SET_PC(newPC);
+       CHECK_BRANCH_EXCEPTION(offs)
+#else
+       PC += ((s8)(Opcode & 0xFE)) >> 1;
+#endif
+       UPDATE_IDLE_COUNT
+RET0()
+}
+
+// BCC
+OPCODE(0x6601_idle)
+{
+       if (flag_NotZ)
+       {
+               UPDATE_IDLE_COUNT
+               PC += ((s8)(Opcode & 0xFE)) >> 1;
+               //if (idle_hit)
+               RET0()
+       }
+RET(8)
+}
+
+OPCODE(0x6701_idle)
+{
+       if (!flag_NotZ)
+       {
+               UPDATE_IDLE_COUNT
+               PC += ((s8)(Opcode & 0xFE)) >> 1;
+               //if (idle_hit)
+               RET0()
+       }
+RET(8)
+}
+
+
+extern int SekIsIdleReady(void);
+extern int SekIsIdleCode(unsigned short *dst, int bytes);
+extern int SekRegisterIdlePatch(unsigned int pc, int oldop, int newop, void *ctx);
+
+OPCODE(idle_detector_bcc8)
+{
+       int frame_count, cond_true, bytes, ret, newop;
+       u16 *dest_pc;
+
+       dest_pc = PC + (((s8)(Opcode & 0xFE)) >> 1);
+
+       if (!SekIsIdleReady())
+               goto end;
+
+       bytes = 0 - (s8)(Opcode & 0xFE) - 2;
+       ret = SekIsIdleCode(dest_pc, bytes);
+       newop = (Opcode & 0xfe) | 0x7100;
+       if (!ret) newop |= 0x200;
+       if (  Opcode & 0x0100)  newop |= 0x400; // beq
+       if (!(Opcode & 0x0f00)) newop |= 0xc00; // bra
+
+       ret = SekRegisterIdlePatch(GET_PC - 2, Opcode, newop, &m68kcontext);
+       switch (ret)
+       {
+               case 0: PC[-1] = newop; break;
+               case 1: break;
+               case 2: JumpTable[Opcode] = (Opcode & 0x0f00) ?
+                               ((Opcode & 0x0100) ? CAST_OP(0x6701) : CAST_OP(0x6601)) :
+                               CAST_OP(0x6001); break;
+       }
+
+end:
+       if ((Opcode & 0xff00) == 0x6000) cond_true = 1;
+       else cond_true = (Opcode & 0x0100) ? !flag_NotZ : flag_NotZ; // beq?
+       if (cond_true)
+       {
+               PC = dest_pc;
+               m68kcontext.io_cycle_counter -= 2;
+       }
+RET(8)
+}
+
+#endif // PICODRIVE_HACK