famec: eliminate global context ptr
[picodrive.git] / cpu / fame / famec_opcodes.h
index 551d757..e069e9e 100644 (file)
@@ -1,4 +1,10 @@
 
+#ifdef PICODRIVE_HACK
+#define NOT_POLLING ctx->not_polling = 1;
+#else
+#define NOT_POLLING
+#endif
+
 // ORI
 OPCODE(0x0000)
 {
@@ -638,7 +644,7 @@ OPCODE(0x007C)
        }
        else
        {
-               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
 #ifdef USE_CYCLONE_TIMING
                RET(0)
 #else
@@ -1296,7 +1302,7 @@ OPCODE(0x027C)
        }
        else
        {
-               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(20)
@@ -1946,7 +1952,7 @@ OPCODE(0x0A7C)
        }
        else
        {
-               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(0)
        }
 RET(20)
@@ -3826,7 +3832,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)
@@ -3843,7 +3849,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)
@@ -4572,7 +4578,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)
@@ -4589,7 +4595,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)
@@ -5478,8 +5484,8 @@ OPCODE(0x1008)
        u32 src, dst;
 
        // can't read byte from Ax registers !
-       m68kcontext.execinfo |= M68K_FAULTED;
-       m68kcontext.io_cycle_counter = 0;
+       ctx->execinfo |= M68K_FAULTED;
+       ctx->io_cycle_counter = 0;
 /*
        goto famec_Exec_End;
        flag_C = 0;
@@ -5498,8 +5504,8 @@ OPCODE(0x1088)
        u32 src, dst;
 
        // can't read byte from Ax registers !
-       m68kcontext.execinfo |= M68K_FAULTED;
-       m68kcontext.io_cycle_counter = 0;
+       ctx->execinfo |= M68K_FAULTED;
+       ctx->io_cycle_counter = 0;
 /*
        goto famec_Exec_End;
        flag_C = 0;
@@ -5521,8 +5527,8 @@ OPCODE(0x10C8)
        u32 src, dst;
 
        // can't read byte from Ax registers !
-       m68kcontext.execinfo |= M68K_FAULTED;
-       m68kcontext.io_cycle_counter = 0;
+       ctx->execinfo |= M68K_FAULTED;
+       ctx->io_cycle_counter = 0;
 /*
        goto famec_Exec_End;
        flag_C = 0;
@@ -5545,8 +5551,8 @@ OPCODE(0x1108)
        u32 src, dst;
 
        // can't read byte from Ax registers !
-       m68kcontext.execinfo |= M68K_FAULTED;
-       m68kcontext.io_cycle_counter = 0;
+       ctx->execinfo |= M68K_FAULTED;
+       ctx->io_cycle_counter = 0;
 /*
        goto famec_Exec_End;
        flag_C = 0;
@@ -5569,8 +5575,8 @@ OPCODE(0x1148)
        u32 src, dst;
 
        // can't read byte from Ax registers !
-       m68kcontext.execinfo |= M68K_FAULTED;
-       m68kcontext.io_cycle_counter = 0;
+       ctx->execinfo |= M68K_FAULTED;
+       ctx->io_cycle_counter = 0;
 /*
        goto famec_Exec_End;
        flag_C = 0;
@@ -5593,8 +5599,8 @@ OPCODE(0x1188)
        u32 src, dst;
 
        // can't read byte from Ax registers !
-       m68kcontext.execinfo |= M68K_FAULTED;
-       m68kcontext.io_cycle_counter = 0;
+       ctx->execinfo |= M68K_FAULTED;
+       ctx->io_cycle_counter = 0;
 /*
        goto famec_Exec_End;
        flag_C = 0;
@@ -5617,8 +5623,8 @@ OPCODE(0x11C8)
        u32 src, dst;
 
        // can't read byte from Ax registers !
-       m68kcontext.execinfo |= M68K_FAULTED;
-       m68kcontext.io_cycle_counter = 0;
+       ctx->execinfo |= M68K_FAULTED;
+       ctx->io_cycle_counter = 0;
 /*
        goto famec_Exec_End;
        flag_C = 0;
@@ -5640,8 +5646,8 @@ OPCODE(0x13C8)
        u32 src, dst;
 
        // can't read byte from Ax registers !
-       m68kcontext.execinfo |= M68K_FAULTED;
-       m68kcontext.io_cycle_counter = 0;
+       ctx->execinfo |= M68K_FAULTED;
+       ctx->io_cycle_counter = 0;
 /*
        goto famec_Exec_End;
        flag_C = 0;
@@ -5663,8 +5669,8 @@ OPCODE(0x1EC8)
        u32 src, dst;
 
        // can't read byte from Ax registers !
-       m68kcontext.execinfo |= M68K_FAULTED;
-       m68kcontext.io_cycle_counter = 0;
+       ctx->execinfo |= M68K_FAULTED;
+       ctx->io_cycle_counter = 0;
 /*
        goto famec_Exec_End;
        flag_C = 0;
@@ -5687,8 +5693,8 @@ OPCODE(0x1F08)
        u32 src, dst;
 
        // can't read byte from Ax registers !
-       m68kcontext.execinfo |= M68K_FAULTED;
-       m68kcontext.io_cycle_counter = 0;
+       ctx->execinfo |= M68K_FAULTED;
+       ctx->io_cycle_counter = 0;
 /*
        goto famec_Exec_End;
        flag_C = 0;
@@ -7116,7 +7122,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)
@@ -7135,7 +7141,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)
@@ -7155,7 +7161,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)
@@ -7176,7 +7182,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)
@@ -7197,7 +7203,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)
@@ -7218,7 +7224,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)
@@ -7239,7 +7245,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)
@@ -7259,7 +7265,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)
@@ -7279,7 +7285,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)
@@ -7300,7 +7306,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)
@@ -7321,7 +7327,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)
@@ -7340,7 +7346,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)
@@ -7360,7 +7366,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)
@@ -7381,7 +7387,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)
@@ -7402,7 +7408,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)
@@ -7423,7 +7429,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)
@@ -7444,7 +7450,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)
@@ -7464,7 +7470,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)
@@ -7484,7 +7490,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)
@@ -7505,7 +7511,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)
@@ -9890,7 +9896,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)
@@ -9909,7 +9915,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)
@@ -9929,7 +9935,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)
@@ -9950,7 +9956,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)
@@ -9971,7 +9977,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)
@@ -9992,7 +9998,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)
@@ -10013,7 +10019,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)
@@ -10033,7 +10039,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)
@@ -10053,7 +10059,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)
@@ -10074,7 +10080,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)
@@ -10095,7 +10101,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)
@@ -10114,7 +10120,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)
@@ -10134,7 +10140,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)
@@ -10155,7 +10161,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)
@@ -10176,7 +10182,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)
@@ -10197,7 +10203,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)
@@ -10218,7 +10224,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)
@@ -10238,7 +10244,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)
@@ -10258,7 +10264,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)
@@ -10279,7 +10285,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)
@@ -11017,7 +11023,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)
@@ -11032,7 +11038,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)
@@ -12859,7 +12865,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)
@@ -12878,7 +12884,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)
@@ -12898,7 +12904,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)
@@ -12919,7 +12925,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)
@@ -12940,7 +12946,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)
@@ -12961,7 +12967,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)
@@ -12982,7 +12988,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)
@@ -13002,7 +13008,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)
@@ -13022,7 +13028,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)
@@ -13043,7 +13049,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)
@@ -13064,7 +13070,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)
@@ -13083,7 +13089,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)
@@ -13103,7 +13109,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)
@@ -13124,7 +13130,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)
@@ -13145,7 +13151,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)
@@ -13166,7 +13172,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)
@@ -13187,7 +13193,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)
@@ -13207,7 +13213,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)
@@ -13227,7 +13233,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)
@@ -13248,7 +13254,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)
@@ -13986,7 +13992,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)
@@ -14001,7 +14007,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)
@@ -16479,7 +16485,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)
@@ -16494,7 +16500,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)
@@ -16564,7 +16570,7 @@ OPCODE(0x46C0)
        }
        else
        {
-               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(12)
@@ -16593,7 +16599,7 @@ OPCODE(0x46D0)
        }
        else
        {
-               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(16)
@@ -16623,7 +16629,7 @@ OPCODE(0x46D8)
        }
        else
        {
-               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(16)
@@ -16653,7 +16659,7 @@ OPCODE(0x46E0)
        }
        else
        {
-               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(18)
@@ -16683,7 +16689,7 @@ OPCODE(0x46E8)
        }
        else
        {
-               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(20)
@@ -16713,7 +16719,7 @@ OPCODE(0x46F0)
        }
        else
        {
-               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(22)
@@ -16743,7 +16749,7 @@ OPCODE(0x46F8)
        }
        else
        {
-               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(20)
@@ -16772,7 +16778,7 @@ OPCODE(0x46F9)
        }
        else
        {
-               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(24)
@@ -16786,7 +16792,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,7 +16808,7 @@ OPCODE(0x46FA)
        }
        else
        {
-               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(20)
@@ -16816,7 +16822,7 @@ OPCODE(0x46FB)
 
        if (flag_S)
        {
-               adr = (u32)(PC) - BasePC;
+               adr = GET_PC;
                DECODE_EXT_WORD
                PRE_IO
                READ_WORD_F(adr, res)
@@ -16832,7 +16838,7 @@ OPCODE(0x46FB)
        }
        else
        {
-               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(22)
@@ -16858,7 +16864,7 @@ OPCODE(0x46FC)
        }
        else
        {
-               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(16)
@@ -16888,7 +16894,7 @@ OPCODE(0x46DF)
        }
        else
        {
-               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(16)
@@ -16918,7 +16924,7 @@ OPCODE(0x46E7)
        }
        else
        {
-               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
 RET(18)
@@ -16930,18 +16936,20 @@ OPCODE(0x4800)
        u32 adr, res;
        u32 src, dst;
 
-       res = DREGu8((Opcode >> 0) & 7);
-       res = 0x9a - res - ((flag_X >> M68K_SR_X_SFT) & 1);
+       dst = DREGu8((Opcode >> 0) & 7);
+       res = -dst - ((flag_X >> M68K_SR_X_SFT) & 1);
 
-       if (res != 0x9a)
+       if (res != 0)
        {
-               if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10;
-               res &= 0xFF;
-       DREGu8((Opcode >> 0) & 7) = res;
+               flag_V = res;
+               if (((res|dst) & 0x0f) == 0) res = (res & 0xf0) + 6;
+               res = (res + 0x9a) & 0xFF;
+               DREGu8((Opcode >> 0) & 7) = res;
+               flag_V &= ~res;
                flag_NotZ |= res;
                flag_X = flag_C = M68K_SR_C;
        }
-       else flag_X = flag_C = 0;
+       else flag_V = flag_X = flag_C = 0;
        flag_N = res;
 RET(6)
 }
@@ -16954,18 +16962,20 @@ OPCODE(0x4810)
 
        adr = AREG((Opcode >> 0) & 7);
        PRE_IO
-       READ_BYTE_F(adr, res)
-       res = 0x9a - res - ((flag_X >> M68K_SR_X_SFT) & 1);
+       READ_BYTE_F(adr, dst)
+       res = -dst - ((flag_X >> M68K_SR_X_SFT) & 1);
 
-       if (res != 0x9a)
+       if (res != 0)
        {
-               if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10;
-               res &= 0xFF;
-       WRITE_BYTE_F(adr, res)
+               flag_V = res;
+               if (((res|dst) & 0x0f) == 0) res = (res & 0xf0) + 6;
+               res = (res + 0x9a) & 0xFF;
+               WRITE_BYTE_F(adr, res)
+               flag_V &= ~res;
                flag_NotZ |= res;
                flag_X = flag_C = M68K_SR_C;
        }
-       else flag_X = flag_C = 0;
+       else flag_V = flag_X = flag_C = 0;
        flag_N = res;
        POST_IO
 RET(12)
@@ -16980,18 +16990,20 @@ OPCODE(0x4818)
        adr = AREG((Opcode >> 0) & 7);
        AREG((Opcode >> 0) & 7) += 1;
        PRE_IO
-       READ_BYTE_F(adr, res)
-       res = 0x9a - res - ((flag_X >> M68K_SR_X_SFT) & 1);
+       READ_BYTE_F(adr, dst)
+       res = -dst - ((flag_X >> M68K_SR_X_SFT) & 1);
 
-       if (res != 0x9a)
+       if (res != 0)
        {
-               if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10;
-               res &= 0xFF;
-       WRITE_BYTE_F(adr, res)
+               flag_V = res;
+               if (((res|dst) & 0x0f) == 0) res = (res & 0xf0) + 6;
+               res = (res + 0x9a) & 0xFF;
+               WRITE_BYTE_F(adr, res)
+               flag_V &= ~res;
                flag_NotZ |= res;
                flag_X = flag_C = M68K_SR_C;
        }
-       else flag_X = flag_C = 0;
+       else flag_V = flag_X = flag_C = 0;
        flag_N = res;
        POST_IO
 RET(12)
@@ -17006,18 +17018,20 @@ OPCODE(0x4820)
        adr = AREG((Opcode >> 0) & 7) - 1;
        AREG((Opcode >> 0) & 7) = adr;
        PRE_IO
-       READ_BYTE_F(adr, res)
-       res = 0x9a - res - ((flag_X >> M68K_SR_X_SFT) & 1);
+       READ_BYTE_F(adr, dst)
+       res = -dst - ((flag_X >> M68K_SR_X_SFT) & 1);
 
-       if (res != 0x9a)
+       if (res != 0)
        {
-               if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10;
-               res &= 0xFF;
-       WRITE_BYTE_F(adr, res)
+               flag_V = res;
+               if (((res|dst) & 0x0f) == 0) res = (res & 0xf0) + 6;
+               res = (res + 0x9a) & 0xFF;
+               WRITE_BYTE_F(adr, res)
+               flag_V &= ~res;
                flag_NotZ |= res;
                flag_X = flag_C = M68K_SR_C;
        }
-       else flag_X = flag_C = 0;
+       else flag_V = flag_X = flag_C = 0;
        flag_N = res;
        POST_IO
 RET(14)
@@ -17032,18 +17046,20 @@ OPCODE(0x4828)
        FETCH_SWORD(adr);
        adr += AREG((Opcode >> 0) & 7);
        PRE_IO
-       READ_BYTE_F(adr, res)
-       res = 0x9a - res - ((flag_X >> M68K_SR_X_SFT) & 1);
+       READ_BYTE_F(adr, dst)
+       res = -dst - ((flag_X >> M68K_SR_X_SFT) & 1);
 
-       if (res != 0x9a)
+       if (res != 0)
        {
-               if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10;
-               res &= 0xFF;
-       WRITE_BYTE_F(adr, res)
+               flag_V = res;
+               if (((res|dst) & 0x0f) == 0) res = (res & 0xf0) + 6;
+               res = (res + 0x9a) & 0xFF;
+               WRITE_BYTE_F(adr, res)
+               flag_V &= ~res;
                flag_NotZ |= res;
                flag_X = flag_C = M68K_SR_C;
        }
-       else flag_X = flag_C = 0;
+       else flag_V = flag_X = flag_C = 0;
        flag_N = res;
        POST_IO
 RET(16)
@@ -17058,18 +17074,20 @@ OPCODE(0x4830)
        adr = AREG((Opcode >> 0) & 7);
        DECODE_EXT_WORD
        PRE_IO
-       READ_BYTE_F(adr, res)
-       res = 0x9a - res - ((flag_X >> M68K_SR_X_SFT) & 1);
+       READ_BYTE_F(adr, dst)
+       res = -dst - ((flag_X >> M68K_SR_X_SFT) & 1);
 
-       if (res != 0x9a)
+       if (res != 0)
        {
-               if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10;
-               res &= 0xFF;
-       WRITE_BYTE_F(adr, res)
+               flag_V = res;
+               if (((res|dst) & 0x0f) == 0) res = (res & 0xf0) + 6;
+               res = (res + 0x9a) & 0xFF;
+               WRITE_BYTE_F(adr, res)
+               flag_V &= ~res;
                flag_NotZ |= res;
                flag_X = flag_C = M68K_SR_C;
        }
-       else flag_X = flag_C = 0;
+       else flag_V = flag_X = flag_C = 0;
        flag_N = res;
        POST_IO
 RET(18)
@@ -17083,18 +17101,20 @@ OPCODE(0x4838)
 
        FETCH_SWORD(adr);
        PRE_IO
-       READ_BYTE_F(adr, res)
-       res = 0x9a - res - ((flag_X >> M68K_SR_X_SFT) & 1);
+       READ_BYTE_F(adr, dst)
+       res = -dst - ((flag_X >> M68K_SR_X_SFT) & 1);
 
-       if (res != 0x9a)
+       if (res != 0)
        {
-               if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10;
-               res &= 0xFF;
-       WRITE_BYTE_F(adr, res)
+               flag_V = res;
+               if (((res|dst) & 0x0f) == 0) res = (res & 0xf0) + 6;
+               res = (res + 0x9a) & 0xFF;
+               WRITE_BYTE_F(adr, res)
+               flag_V &= ~res;
                flag_NotZ |= res;
                flag_X = flag_C = M68K_SR_C;
        }
-       else flag_X = flag_C = 0;
+       else flag_V = flag_X = flag_C = 0;
        flag_N = res;
        POST_IO
 RET(16)
@@ -17108,18 +17128,20 @@ OPCODE(0x4839)
 
        FETCH_LONG(adr);
        PRE_IO
-       READ_BYTE_F(adr, res)
-       res = 0x9a - res - ((flag_X >> M68K_SR_X_SFT) & 1);
+       READ_BYTE_F(adr, dst)
+       res = -dst - ((flag_X >> M68K_SR_X_SFT) & 1);
 
-       if (res != 0x9a)
+       if (res != 0)
        {
-               if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10;
-               res &= 0xFF;
-       WRITE_BYTE_F(adr, res)
+               flag_V = res;
+               if (((res|dst) & 0x0f) == 0) res = (res & 0xf0) + 6;
+               res = (res + 0x9a) & 0xFF;
+               WRITE_BYTE_F(adr, res)
+               flag_V &= ~res;
                flag_NotZ |= res;
                flag_X = flag_C = M68K_SR_C;
        }
-       else flag_X = flag_C = 0;
+       else flag_V = flag_X = flag_C = 0;
        flag_N = res;
        POST_IO
 RET(20)
@@ -17134,18 +17156,20 @@ OPCODE(0x481F)
        adr = AREG(7);
        AREG(7) += 2;
        PRE_IO
-       READ_BYTE_F(adr, res)
-       res = 0x9a - res - ((flag_X >> M68K_SR_X_SFT) & 1);
+       READ_BYTE_F(adr, dst)
+       res = -dst - ((flag_X >> M68K_SR_X_SFT) & 1);
 
-       if (res != 0x9a)
+       if (res != 0)
        {
-               if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10;
-               res &= 0xFF;
-       WRITE_BYTE_F(adr, res)
+               flag_V = res;
+               if (((res|dst) & 0x0f) == 0) res = (res & 0xf0) + 6;
+               res = (res + 0x9a) & 0xFF;
+               WRITE_BYTE_F(adr, res)
+               flag_V &= ~res;
                flag_NotZ |= res;
                flag_X = flag_C = M68K_SR_C;
        }
-       else flag_X = flag_C = 0;
+       else flag_V = flag_X = flag_C = 0;
        flag_N = res;
        POST_IO
 RET(12)
@@ -17160,18 +17184,20 @@ OPCODE(0x4827)
        adr = AREG(7) - 2;
        AREG(7) = adr;
        PRE_IO
-       READ_BYTE_F(adr, res)
-       res = 0x9a - res - ((flag_X >> M68K_SR_X_SFT) & 1);
+       READ_BYTE_F(adr, dst)
+       res = -dst - ((flag_X >> M68K_SR_X_SFT) & 1);
 
-       if (res != 0x9a)
+       if (res != 0)
        {
-               if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10;
-               res &= 0xFF;
-       WRITE_BYTE_F(adr, res)
+               flag_V = res;
+               if (((res|dst) & 0x0f) == 0) res = (res & 0xf0) + 6;
+               res = (res + 0x9a) & 0xFF;
+               WRITE_BYTE_F(adr, res)
+               flag_V &= ~res;
                flag_NotZ |= res;
                flag_X = flag_C = M68K_SR_C;
        }
-       else flag_X = flag_C = 0;
+       else flag_V = flag_X = flag_C = 0;
        flag_N = res;
        POST_IO
 RET(14)
@@ -17250,7 +17276,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)
@@ -17264,7 +17290,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)
@@ -17311,7 +17337,7 @@ OPCODE(0x4890)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(8)
 #else
@@ -17343,7 +17369,7 @@ OPCODE(0x48A0)
        } while (res >>= 1);
        AREG((Opcode >> 0) & 7) = adr;
        POST_IO
-       m68kcontext.io_cycle_counter -= (dst - adr) * 2;
+       ctx->io_cycle_counter -= (dst - adr) * 2;
 RET(8)
 }
 
@@ -17371,7 +17397,7 @@ OPCODE(0x48A8)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(12)
 #else
@@ -17403,7 +17429,7 @@ OPCODE(0x48B0)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(14)
 #else
@@ -17434,7 +17460,7 @@ OPCODE(0x48B8)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(12)
 #else
@@ -17465,7 +17491,7 @@ OPCODE(0x48B9)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(16)
 #else
@@ -17497,7 +17523,7 @@ OPCODE(0x48A7)
        } while (res >>= 1);
        AREG(7) = adr;
        POST_IO
-       m68kcontext.io_cycle_counter -= (dst - adr) * 2;
+       ctx->io_cycle_counter -= (dst - adr) * 2;
 RET(8)
 }
 
@@ -17524,7 +17550,7 @@ OPCODE(0x48D0)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(8)
 #else
@@ -17556,7 +17582,7 @@ OPCODE(0x48E0)
        } while (res >>= 1);
        AREG((Opcode >> 0) & 7) = adr;
        POST_IO
-       m68kcontext.io_cycle_counter -= (dst - adr) * 2;
+       ctx->io_cycle_counter -= (dst - adr) * 2;
 RET(8)
 }
 
@@ -17584,7 +17610,7 @@ OPCODE(0x48E8)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(12)
 #else
@@ -17616,7 +17642,7 @@ OPCODE(0x48F0)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(14)
 #else
@@ -17647,7 +17673,7 @@ OPCODE(0x48F8)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(12)
 #else
@@ -17678,7 +17704,7 @@ OPCODE(0x48F9)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(16)
 #else
@@ -17710,7 +17736,7 @@ OPCODE(0x48E7)
        } while (res >>= 1);
        AREG(7) = adr;
        POST_IO
-       m68kcontext.io_cycle_counter -= (dst - adr) * 2;
+       ctx->io_cycle_counter -= (dst - adr) * 2;
 RET(8)
 }
 
@@ -18293,7 +18319,7 @@ OPCODE(0x4AD0)
        flag_NotZ = res;
        flag_N = res;
 #ifdef PICODRIVE_HACK
-       if (g_m68kcontext == &PicoCpuFS68k) {
+       if (ctx == &PicoCpuFS68k) {
                res |= 0x80;
                WRITE_BYTE_F(adr, res);
        }
@@ -18323,7 +18349,7 @@ OPCODE(0x4AD8)
        flag_N = res;
 
 #ifdef PICODRIVE_HACK
-       if (g_m68kcontext == &PicoCpuFS68k) {
+       if (ctx == &PicoCpuFS68k) {
                res |= 0x80;
                WRITE_BYTE_F(adr, res);
        }
@@ -18353,7 +18379,7 @@ OPCODE(0x4AE0)
        flag_N = res;
 
 #ifdef PICODRIVE_HACK
-       if (g_m68kcontext == &PicoCpuFS68k) {
+       if (ctx == &PicoCpuFS68k) {
                res |= 0x80;
                WRITE_BYTE_F(adr, res);
        }
@@ -18383,7 +18409,7 @@ OPCODE(0x4AE8)
        flag_N = res;
 
 #ifdef PICODRIVE_HACK
-       if (g_m68kcontext == &PicoCpuFS68k) {
+       if (ctx == &PicoCpuFS68k) {
                res |= 0x80;
                WRITE_BYTE_F(adr, res);
        }
@@ -18413,7 +18439,7 @@ OPCODE(0x4AF0)
        flag_N = res;
 
 #ifdef PICODRIVE_HACK
-       if (g_m68kcontext == &PicoCpuFS68k) {
+       if (ctx == &PicoCpuFS68k) {
                res |= 0x80;
                WRITE_BYTE_F(adr, res);
        }
@@ -18442,7 +18468,7 @@ OPCODE(0x4AF8)
        flag_N = res;
 
 #ifdef PICODRIVE_HACK
-       if (g_m68kcontext == &PicoCpuFS68k) {
+       if (ctx == &PicoCpuFS68k) {
                res |= 0x80;
                WRITE_BYTE_F(adr, res);
        }
@@ -18471,7 +18497,7 @@ OPCODE(0x4AF9)
        flag_N = res;
 
 #ifdef PICODRIVE_HACK
-       if (g_m68kcontext == &PicoCpuFS68k) {
+       if (ctx == &PicoCpuFS68k) {
                res |= 0x80;
                WRITE_BYTE_F(adr, res);
        }
@@ -18501,7 +18527,7 @@ OPCODE(0x4ADF)
        flag_N = res;
 
 #ifdef PICODRIVE_HACK
-       if (g_m68kcontext == &PicoCpuFS68k) {
+       if (ctx == &PicoCpuFS68k) {
                res |= 0x80;
                WRITE_BYTE_F(adr, res);
        }
@@ -18531,7 +18557,7 @@ OPCODE(0x4AE7)
        flag_N = res;
 
 #ifdef PICODRIVE_HACK
-       if (g_m68kcontext == &PicoCpuFS68k) {
+       if (ctx == &PicoCpuFS68k) {
                res |= 0x80;
                WRITE_BYTE_F(adr, res);
        }
@@ -18548,21 +18574,25 @@ RET(8)
 // ILLEGAL
 OPCODE(0x4AFC)
 {
-       SET_PC(execute_exception(M68K_ILLEGAL_INSTRUCTION_EX, GET_PC-2, GET_SR));
+#ifdef PICODRIVE_HACK
+       extern void SekFinishIdleDet(void);
+       SekFinishIdleDet();
+#endif
+       SET_PC(execute_exception(ctx, M68K_ILLEGAL_INSTRUCTION_EX, GET_PC-2, GET_SR));
 RET(0)
 }
 
 // ILLEGAL A000-AFFF
 OPCODE(0xA000)
 {
-       SET_PC(execute_exception(M68K_1010_EX, GET_PC-2, GET_SR));
+       SET_PC(execute_exception(ctx, M68K_1010_EX, GET_PC-2, GET_SR));
 RET(0)
 }
 
 // ILLEGAL F000-FFFF
 OPCODE(0xF000)
 {
-       SET_PC(execute_exception(M68K_1111_EX, GET_PC-2, GET_SR));
+       SET_PC(execute_exception(ctx, M68K_1111_EX, GET_PC-2, GET_SR));
 RET(0) // 4 already taken by exc. handler
 }
 
@@ -18589,7 +18619,7 @@ OPCODE(0x4C90)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(12)
 #else
@@ -18621,7 +18651,7 @@ OPCODE(0x4C98)
        } while (res >>= 1);
        AREG((Opcode >> 0) & 7) = adr;
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 RET(12)
 }
 
@@ -18649,7 +18679,7 @@ OPCODE(0x4CA8)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(16)
 #else
@@ -18681,7 +18711,7 @@ OPCODE(0x4CB0)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(18)
 #else
@@ -18712,7 +18742,7 @@ OPCODE(0x4CB8)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(16)
 #else
@@ -18743,7 +18773,7 @@ OPCODE(0x4CB9)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(20)
 #else
@@ -18760,7 +18790,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;
@@ -18775,7 +18805,7 @@ OPCODE(0x4CBA)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(16)
 #else
@@ -18792,7 +18822,7 @@ OPCODE(0x4CBB)
        s32 *psrc;
 
        FETCH_WORD(res);
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        psrc = &DREGs32(0);
        dst = adr;
@@ -18807,7 +18837,7 @@ OPCODE(0x4CBB)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(18)
 #else
@@ -18839,7 +18869,7 @@ OPCODE(0x4C9F)
        } while (res >>= 1);
        AREG(7) = adr;
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 RET(12)
 }
 
@@ -18866,7 +18896,7 @@ OPCODE(0x4CD0)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(12)
 #else
@@ -18898,7 +18928,7 @@ OPCODE(0x4CD8)
        } while (res >>= 1);
        AREG((Opcode >> 0) & 7) = adr;
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 RET(12)
 }
 
@@ -18926,7 +18956,7 @@ OPCODE(0x4CE8)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(16)
 #else
@@ -18958,7 +18988,7 @@ OPCODE(0x4CF0)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(18)
 #else
@@ -18989,7 +19019,7 @@ OPCODE(0x4CF8)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(16)
 #else
@@ -19020,7 +19050,7 @@ OPCODE(0x4CF9)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(20)
 #else
@@ -19037,7 +19067,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;
@@ -19052,7 +19082,7 @@ OPCODE(0x4CFA)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(16)
 #else
@@ -19069,7 +19099,7 @@ OPCODE(0x4CFB)
        u32 *psrc;
 
        FETCH_WORD(res);
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        psrc = &DREGu32(0);
        dst = adr;
@@ -19084,7 +19114,7 @@ OPCODE(0x4CFB)
                psrc++;
        } while (res >>= 1);
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 #ifdef USE_CYCLONE_TIMING
 RET(18)
 #else
@@ -19116,14 +19146,14 @@ OPCODE(0x4CDF)
        } while (res >>= 1);
        AREG(7) = adr;
        POST_IO
-       m68kcontext.io_cycle_counter -= (adr - dst) * 2;
+       ctx->io_cycle_counter -= (adr - dst) * 2;
 RET(12)
 }
 
 // TRAP
 OPCODE(0x4E40)
 {
-       SET_PC(execute_exception(M68K_TRAP_BASE_EX + (Opcode & 0xF), GET_PC, GET_SR));
+       SET_PC(execute_exception(ctx, M68K_TRAP_BASE_EX + (Opcode & 0xF), GET_PC, GET_SR));
 RET(4)
 }
 
@@ -19194,7 +19224,7 @@ OPCODE(0x4E60)
 
        if (!flag_S)
        {
-               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
        res = AREGu32((Opcode >> 0) & 7);
@@ -19210,7 +19240,7 @@ OPCODE(0x4E68)
 
        if (!flag_S)
        {
-               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
        res = ASP;
@@ -19226,11 +19256,11 @@ OPCODE(0x4E70)
 
        if (!flag_S)
        {
-               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
        PRE_IO
-       if (m68kcontext.reset_handler) m68kcontext.reset_handler();
+       if (ctx->reset_handler) ctx->reset_handler();
 //     CPU->Reset_CallBack();
        POST_IO
 RET(132)
@@ -19250,7 +19280,7 @@ OPCODE(0x4E72)
 
        if (!flag_S)
        {
-               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
        FETCH_WORD(res);
@@ -19262,7 +19292,7 @@ OPCODE(0x4E72)
                AREG(7) = ASP;
                ASP = res;
        }
-       m68kcontext.execinfo |= FM68K_HALTED;
+       ctx->execinfo |= FM68K_HALTED;
 RET0()
 }
 
@@ -19274,7 +19304,7 @@ OPCODE(0x4E73)
 
        if (!flag_S)
        {
-               SET_PC(execute_exception(M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_PRIVILEGE_VIOLATION_EX, GET_PC-2, GET_SR));
                RET(4)
        }
        PRE_IO
@@ -19289,7 +19319,7 @@ OPCODE(0x4E73)
                ASP = res;
        }
        POST_IO
-       m68kcontext.execinfo &= ~(FM68K_EMULATE_GROUP_0|FM68K_EMULATE_TRACE|FM68K_DO_TRACE);
+       ctx->execinfo &= ~(FM68K_EMULATE_GROUP_0|FM68K_EMULATE_TRACE|FM68K_DO_TRACE);
        CHECK_INT_TO_JUMP(20)
 RET(20)
 }
@@ -19312,7 +19342,7 @@ RET(16)
 OPCODE(0x4E76)
 {
        if (flag_V & 0x80)
-               SET_PC(execute_exception(M68K_TRAPV_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_TRAPV_EX, GET_PC, GET_SR));
 RET(4)
 }
 
@@ -19342,7 +19372,7 @@ OPCODE(0x4E90)
        {
                u32 oldPC;
 
-               oldPC = (u32)(PC) - BasePC;
+               oldPC = GET_PC;
        PRE_IO
                PUSH_32_F(oldPC)
        }
@@ -19363,7 +19393,7 @@ OPCODE(0x4EA8)
        {
                u32 oldPC;
 
-               oldPC = (u32)(PC) - BasePC;
+               oldPC = GET_PC;
        PRE_IO
                PUSH_32_F(oldPC)
        }
@@ -19384,7 +19414,7 @@ OPCODE(0x4EB0)
        {
                u32 oldPC;
 
-               oldPC = (u32)(PC) - BasePC;
+               oldPC = GET_PC;
        PRE_IO
                PUSH_32_F(oldPC)
        }
@@ -19404,7 +19434,7 @@ OPCODE(0x4EB8)
        {
                u32 oldPC;
 
-               oldPC = (u32)(PC) - BasePC;
+               oldPC = GET_PC;
        PRE_IO
                PUSH_32_F(oldPC)
        }
@@ -19424,7 +19454,7 @@ OPCODE(0x4EB9)
        {
                u32 oldPC;
 
-               oldPC = (u32)(PC) - BasePC;
+               oldPC = GET_PC;
        PRE_IO
                PUSH_32_F(oldPC)
        }
@@ -19440,12 +19470,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)
        }
@@ -19461,12 +19491,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)
        }
@@ -19544,7 +19574,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)
@@ -19557,7 +19587,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)
@@ -19567,15 +19597,14 @@ RET(14)
 // CHK
 OPCODE(0x4180)
 {
-       u32 adr, res;
-       u32 src, dst;
+       s32 src, res;
 
-       src = DREGu16((Opcode >> 0) & 7);
-       res = DREGu16((Opcode >> 9) & 7);
-       if (((s32)res < 0) || (res > src))
+       src = DREGs16((Opcode >> 0) & 7);
+       res = DREGs16((Opcode >> 9) & 7);
+       if ((res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_CHK_EX, GET_PC, GET_SR));
        }
 RET(10)
 }
@@ -19583,17 +19612,17 @@ RET(10)
 // CHK
 OPCODE(0x4190)
 {
-       u32 adr, res;
-       u32 src, dst;
+       s32 src, res;
+       u32 adr;
 
        adr = AREG((Opcode >> 0) & 7);
        PRE_IO
-       READ_WORD_F(adr, src)
-       res = DREGu16((Opcode >> 9) & 7);
-       if (((s32)res < 0) || (res > src))
+       READSX_WORD_F(adr, src)
+       res = DREGs16((Opcode >> 9) & 7);
+       if ((res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(14)
@@ -19602,18 +19631,18 @@ RET(14)
 // CHK
 OPCODE(0x4198)
 {
-       u32 adr, res;
-       u32 src, dst;
+       s32 src, res;
+       u32 adr;
 
        adr = AREG((Opcode >> 0) & 7);
        AREG((Opcode >> 0) & 7) += 2;
        PRE_IO
-       READ_WORD_F(adr, src)
-       res = DREGu16((Opcode >> 9) & 7);
-       if (((s32)res < 0) || (res > src))
+       READSX_WORD_F(adr, src)
+       res = DREGs16((Opcode >> 9) & 7);
+       if ((res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(14)
@@ -19622,18 +19651,18 @@ RET(14)
 // CHK
 OPCODE(0x41A0)
 {
-       u32 adr, res;
-       u32 src, dst;
+       s32 src, res;
+       u32 adr;
 
        adr = AREG((Opcode >> 0) & 7) - 2;
        AREG((Opcode >> 0) & 7) = adr;
        PRE_IO
-       READ_WORD_F(adr, src)
-       res = DREGu16((Opcode >> 9) & 7);
-       if (((s32)res < 0) || (res > src))
+       READSX_WORD_F(adr, src)
+       res = DREGs16((Opcode >> 9) & 7);
+       if ((res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(16)
@@ -19642,18 +19671,18 @@ RET(16)
 // CHK
 OPCODE(0x41A8)
 {
-       u32 adr, res;
-       u32 src, dst;
+       s32 src, res;
+       u32 adr;
 
        FETCH_SWORD(adr);
        adr += AREG((Opcode >> 0) & 7);
        PRE_IO
-       READ_WORD_F(adr, src)
-       res = DREGu16((Opcode >> 9) & 7);
-       if (((s32)res < 0) || (res > src))
+       READSX_WORD_F(adr, src)
+       res = DREGs16((Opcode >> 9) & 7);
+       if ((res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(18)
@@ -19662,18 +19691,18 @@ RET(18)
 // CHK
 OPCODE(0x41B0)
 {
-       u32 adr, res;
-       u32 src, dst;
+       s32 src, res;
+       u32 adr;
 
        adr = AREG((Opcode >> 0) & 7);
        DECODE_EXT_WORD
        PRE_IO
-       READ_WORD_F(adr, src)
-       res = DREGu16((Opcode >> 9) & 7);
-       if (((s32)res < 0) || (res > src))
+       READSX_WORD_F(adr, src)
+       res = DREGs16((Opcode >> 9) & 7);
+       if ((res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(20)
@@ -19682,17 +19711,17 @@ RET(20)
 // CHK
 OPCODE(0x41B8)
 {
-       u32 adr, res;
-       u32 src, dst;
+       s32 src, res;
+       u32 adr;
 
        FETCH_SWORD(adr);
        PRE_IO
-       READ_WORD_F(adr, src)
-       res = DREGu16((Opcode >> 9) & 7);
-       if (((s32)res < 0) || (res > src))
+       READSX_WORD_F(adr, src)
+       res = DREGs16((Opcode >> 9) & 7);
+       if ((res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(18)
@@ -19701,17 +19730,17 @@ RET(18)
 // CHK
 OPCODE(0x41B9)
 {
-       u32 adr, res;
-       u32 src, dst;
+       s32 src, res;
+       u32 adr;
 
        FETCH_LONG(adr);
        PRE_IO
-       READ_WORD_F(adr, src)
-       res = DREGu16((Opcode >> 9) & 7);
-       if (((s32)res < 0) || (res > src))
+       READSX_WORD_F(adr, src)
+       res = DREGs16((Opcode >> 9) & 7);
+       if ((res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(22)
@@ -19720,18 +19749,18 @@ RET(22)
 // CHK
 OPCODE(0x41BA)
 {
-       u32 adr, res;
-       u32 src, dst;
+       s32 src, res;
+       u32 adr;
 
-       adr = GET_SWORD + ((u32)(PC) - BasePC);
+       adr = GET_SWORD + GET_PC;
        PC++;
        PRE_IO
-       READ_WORD_F(adr, src)
-       res = DREGu16((Opcode >> 9) & 7);
-       if (((s32)res < 0) || (res > src))
+       READSX_WORD_F(adr, src)
+       res = DREGs16((Opcode >> 9) & 7);
+       if ((res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(18)
@@ -19740,18 +19769,18 @@ RET(18)
 // CHK
 OPCODE(0x41BB)
 {
-       u32 adr, res;
-       u32 src, dst;
+       s32 src, res;
+       u32 adr;
 
-       adr = (u32)(PC) - BasePC;
+       adr = GET_PC;
        DECODE_EXT_WORD
        PRE_IO
-       READ_WORD_F(adr, src)
-       res = DREGu16((Opcode >> 9) & 7);
-       if (((s32)res < 0) || (res > src))
+       READSX_WORD_F(adr, src)
+       res = DREGs16((Opcode >> 9) & 7);
+       if ((res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(20)
@@ -19760,15 +19789,15 @@ RET(20)
 // CHK
 OPCODE(0x41BC)
 {
-       u32 adr, res;
-       u32 src, dst;
+       s32 src, res;
+       u32 adr;
 
-       FETCH_WORD(src);
-       res = DREGu16((Opcode >> 9) & 7);
-       if (((s32)res < 0) || (res > src))
+       FETCH_SWORD(src);
+       res = DREGs16((Opcode >> 9) & 7);
+       if ((res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(14)
@@ -19777,18 +19806,18 @@ RET(14)
 // CHK
 OPCODE(0x419F)
 {
-       u32 adr, res;
-       u32 src, dst;
+       s32 src, res;
+       u32 adr;
 
        adr = AREG(7);
        AREG(7) += 2;
        PRE_IO
-       READ_WORD_F(adr, src)
-       res = DREGu16((Opcode >> 9) & 7);
-       if (((s32)res < 0) || (res > src))
+       READSX_WORD_F(adr, src)
+       res = DREGs16((Opcode >> 9) & 7);
+       if ((res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(14)
@@ -19797,18 +19826,18 @@ RET(14)
 // CHK
 OPCODE(0x41A7)
 {
-       u32 adr, res;
-       u32 src, dst;
+       s32 src, res;
+       u32 adr;
 
        adr = AREG(7) - 2;
        AREG(7) = adr;
        PRE_IO
-       READ_WORD_F(adr, src)
-       res = DREGu16((Opcode >> 9) & 7);
-       if (((s32)res < 0) || (res > src))
+       READSX_WORD_F(adr, src)
+       res = DREGs16((Opcode >> 9) & 7);
+       if ((res < 0) || (res > src))
        {
                flag_N = res >> 8;
-               SET_PC(execute_exception(M68K_CHK_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_CHK_EX, GET_PC, GET_SR));
        }
        POST_IO
 RET(16)
@@ -19882,7 +19911,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;
@@ -19895,7 +19924,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;
@@ -23298,6 +23327,8 @@ OPCODE(0x51C8)
        u32 adr, res;
        u32 src, dst;
 
+       NOT_POLLING
+
        res = DREGu16((Opcode >> 0) & 7);
        res--;
        DREGu16((Opcode >> 0) & 7) = res;
@@ -23305,7 +23336,7 @@ OPCODE(0x51C8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23321,6 +23352,8 @@ OPCODE(0x52C8)
        u32 adr, res;
        u32 src, dst;
 
+       NOT_POLLING
+
        if ((!flag_NotZ) || (flag_C & 0x100))
        {
        res = DREGu16((Opcode >> 0) & 7);
@@ -23330,7 +23363,7 @@ OPCODE(0x52C8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23352,6 +23385,8 @@ OPCODE(0x53C8)
        u32 adr, res;
        u32 src, dst;
 
+       NOT_POLLING
+
        if (flag_NotZ && (!(flag_C & 0x100)))
        {
        res = DREGu16((Opcode >> 0) & 7);
@@ -23361,7 +23396,7 @@ OPCODE(0x53C8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23383,6 +23418,8 @@ OPCODE(0x54C8)
        u32 adr, res;
        u32 src, dst;
 
+       NOT_POLLING
+
        if (flag_C & 0x100)
        {
        res = DREGu16((Opcode >> 0) & 7);
@@ -23392,7 +23429,7 @@ OPCODE(0x54C8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23414,6 +23451,8 @@ OPCODE(0x55C8)
        u32 adr, res;
        u32 src, dst;
 
+       NOT_POLLING
+
        if (!(flag_C & 0x100))
        {
        res = DREGu16((Opcode >> 0) & 7);
@@ -23423,7 +23462,7 @@ OPCODE(0x55C8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23445,6 +23484,8 @@ OPCODE(0x56C8)
        u32 adr, res;
        u32 src, dst;
 
+       NOT_POLLING
+
        if (!flag_NotZ)
        {
        res = DREGu16((Opcode >> 0) & 7);
@@ -23454,7 +23495,7 @@ OPCODE(0x56C8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23476,6 +23517,8 @@ OPCODE(0x57C8)
        u32 adr, res;
        u32 src, dst;
 
+       NOT_POLLING
+
        if (flag_NotZ)
        {
        res = DREGu16((Opcode >> 0) & 7);
@@ -23485,7 +23528,7 @@ OPCODE(0x57C8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23507,6 +23550,8 @@ OPCODE(0x58C8)
        u32 adr, res;
        u32 src, dst;
 
+       NOT_POLLING
+
        if (flag_V & 0x80)
        {
        res = DREGu16((Opcode >> 0) & 7);
@@ -23516,7 +23561,7 @@ OPCODE(0x58C8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23538,6 +23583,8 @@ OPCODE(0x59C8)
        u32 adr, res;
        u32 src, dst;
 
+       NOT_POLLING
+
        if (!(flag_V & 0x80))
        {
        res = DREGu16((Opcode >> 0) & 7);
@@ -23547,7 +23594,7 @@ OPCODE(0x59C8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23569,6 +23616,8 @@ OPCODE(0x5AC8)
        u32 adr, res;
        u32 src, dst;
 
+       NOT_POLLING
+
        if (flag_N & 0x80)
        {
        res = DREGu16((Opcode >> 0) & 7);
@@ -23578,7 +23627,7 @@ OPCODE(0x5AC8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23600,6 +23649,8 @@ OPCODE(0x5BC8)
        u32 adr, res;
        u32 src, dst;
 
+       NOT_POLLING
+
        if (!(flag_N & 0x80))
        {
        res = DREGu16((Opcode >> 0) & 7);
@@ -23609,7 +23660,7 @@ OPCODE(0x5BC8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23631,6 +23682,8 @@ OPCODE(0x5CC8)
        u32 adr, res;
        u32 src, dst;
 
+       NOT_POLLING
+
        if ((flag_N ^ flag_V) & 0x80)
        {
        res = DREGu16((Opcode >> 0) & 7);
@@ -23640,7 +23693,7 @@ OPCODE(0x5CC8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23662,6 +23715,8 @@ OPCODE(0x5DC8)
        u32 adr, res;
        u32 src, dst;
 
+       NOT_POLLING
+
        if (!((flag_N ^ flag_V) & 0x80))
        {
        res = DREGu16((Opcode >> 0) & 7);
@@ -23671,7 +23726,7 @@ OPCODE(0x5DC8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23693,6 +23748,8 @@ OPCODE(0x5EC8)
        u32 adr, res;
        u32 src, dst;
 
+       NOT_POLLING
+
        if ((!flag_NotZ) || ((flag_N ^ flag_V) & 0x80))
        {
        res = DREGu16((Opcode >> 0) & 7);
@@ -23702,7 +23759,7 @@ OPCODE(0x5EC8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -23724,6 +23781,8 @@ OPCODE(0x5FC8)
        u32 adr, res;
        u32 src, dst;
 
+       NOT_POLLING
+
        if (flag_NotZ && (!((flag_N ^ flag_V) & 0x80)))
        {
        res = DREGu16((Opcode >> 0) & 7);
@@ -23733,7 +23792,7 @@ OPCODE(0x5FC8)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -24992,7 +25051,7 @@ OPCODE(0x6201)
        if (flag_NotZ && (!(flag_C & 0x100)))
        {
                PC += ((s8)(Opcode & 0xFE)) >> 1;
-       m68kcontext.io_cycle_counter -= 2;
+       ctx->io_cycle_counter -= 2;
        }
 RET(8)
 }
@@ -25006,7 +25065,7 @@ OPCODE(0x6301)
        if ((!flag_NotZ) || (flag_C & 0x100))
        {
                PC += ((s8)(Opcode & 0xFE)) >> 1;
-       m68kcontext.io_cycle_counter -= 2;
+       ctx->io_cycle_counter -= 2;
        }
 RET(8)
 }
@@ -25020,7 +25079,7 @@ OPCODE(0x6401)
        if (!(flag_C & 0x100))
        {
                PC += ((s8)(Opcode & 0xFE)) >> 1;
-       m68kcontext.io_cycle_counter -= 2;
+       ctx->io_cycle_counter -= 2;
        }
 RET(8)
 }
@@ -25034,7 +25093,7 @@ OPCODE(0x6501)
        if (flag_C & 0x100)
        {
                PC += ((s8)(Opcode & 0xFE)) >> 1;
-       m68kcontext.io_cycle_counter -= 2;
+       ctx->io_cycle_counter -= 2;
        }
 RET(8)
 }
@@ -25048,7 +25107,7 @@ OPCODE(0x6601)
        if (flag_NotZ)
        {
                PC += ((s8)(Opcode & 0xFE)) >> 1;
-       m68kcontext.io_cycle_counter -= 2;
+       ctx->io_cycle_counter -= 2;
        }
 RET(8)
 }
@@ -25062,7 +25121,7 @@ OPCODE(0x6701)
        if (!flag_NotZ)
        {
                PC += ((s8)(Opcode & 0xFE)) >> 1;
-       m68kcontext.io_cycle_counter -= 2;
+       ctx->io_cycle_counter -= 2;
        }
 RET(8)
 }
@@ -25076,7 +25135,7 @@ OPCODE(0x6801)
        if (!(flag_V & 0x80))
        {
                PC += ((s8)(Opcode & 0xFE)) >> 1;
-       m68kcontext.io_cycle_counter -= 2;
+       ctx->io_cycle_counter -= 2;
        }
 RET(8)
 }
@@ -25090,7 +25149,7 @@ OPCODE(0x6901)
        if (flag_V & 0x80)
        {
                PC += ((s8)(Opcode & 0xFE)) >> 1;
-       m68kcontext.io_cycle_counter -= 2;
+       ctx->io_cycle_counter -= 2;
        }
 RET(8)
 }
@@ -25104,7 +25163,7 @@ OPCODE(0x6A01)
        if (!(flag_N & 0x80))
        {
                PC += ((s8)(Opcode & 0xFE)) >> 1;
-       m68kcontext.io_cycle_counter -= 2;
+       ctx->io_cycle_counter -= 2;
        }
 RET(8)
 }
@@ -25118,7 +25177,7 @@ OPCODE(0x6B01)
        if (flag_N & 0x80)
        {
                PC += ((s8)(Opcode & 0xFE)) >> 1;
-       m68kcontext.io_cycle_counter -= 2;
+       ctx->io_cycle_counter -= 2;
        }
 RET(8)
 }
@@ -25132,7 +25191,7 @@ OPCODE(0x6C01)
        if (!((flag_N ^ flag_V) & 0x80))
        {
                PC += ((s8)(Opcode & 0xFE)) >> 1;
-       m68kcontext.io_cycle_counter -= 2;
+       ctx->io_cycle_counter -= 2;
        }
 RET(8)
 }
@@ -25146,7 +25205,7 @@ OPCODE(0x6D01)
        if ((flag_N ^ flag_V) & 0x80)
        {
                PC += ((s8)(Opcode & 0xFE)) >> 1;
-       m68kcontext.io_cycle_counter -= 2;
+       ctx->io_cycle_counter -= 2;
        }
 RET(8)
 }
@@ -25160,7 +25219,7 @@ OPCODE(0x6E01)
        if (flag_NotZ && (!((flag_N ^ flag_V) & 0x80)))
        {
                PC += ((s8)(Opcode & 0xFE)) >> 1;
-       m68kcontext.io_cycle_counter -= 2;
+       ctx->io_cycle_counter -= 2;
        }
 RET(8)
 }
@@ -25174,7 +25233,7 @@ OPCODE(0x6F01)
        if ((!flag_NotZ) || ((flag_N ^ flag_V) & 0x80))
        {
                PC += ((s8)(Opcode & 0xFE)) >> 1;
-       m68kcontext.io_cycle_counter -= 2;
+       ctx->io_cycle_counter -= 2;
        }
 RET(8)
 }
@@ -25189,7 +25248,7 @@ OPCODE(0x6200)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25209,7 +25268,7 @@ OPCODE(0x6300)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25229,7 +25288,7 @@ OPCODE(0x6400)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25249,7 +25308,7 @@ OPCODE(0x6500)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25269,7 +25328,7 @@ OPCODE(0x6600)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25289,7 +25348,7 @@ OPCODE(0x6700)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25309,7 +25368,7 @@ OPCODE(0x6800)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25329,7 +25388,7 @@ OPCODE(0x6900)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25349,7 +25408,7 @@ OPCODE(0x6A00)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25369,7 +25428,7 @@ OPCODE(0x6B00)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25389,7 +25448,7 @@ OPCODE(0x6C00)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25409,7 +25468,7 @@ OPCODE(0x6D00)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25429,7 +25488,7 @@ OPCODE(0x6E00)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25449,7 +25508,7 @@ OPCODE(0x6F00)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25463,7 +25522,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);
@@ -25483,7 +25542,7 @@ OPCODE(0x6000)
        {
                u32 newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                newPC += GET_SWORD;
                SET_PC(newPC);
                CHECK_BRANCH_EXCEPTION(newPC)
@@ -25501,7 +25560,7 @@ OPCODE(0x6101)
 
        PRE_IO
 
-       oldPC = (u32)(PC) - BasePC;
+       oldPC = GET_PC;
        PUSH_32_F(oldPC)
 #ifdef FAMEC_CHECK_BRANCHES
        offs = Opcode;
@@ -25525,7 +25584,7 @@ OPCODE(0x6100)
        {
                u32 oldPC, newPC;
 
-               newPC = (u32)(PC) - BasePC;
+               newPC = GET_PC;
                oldPC = newPC + 2;
                PUSH_32_F(oldPC)
                newPC += GET_SWORD;
@@ -25716,7 +25775,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)
@@ -25737,7 +25796,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)
@@ -25978,7 +26037,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)
@@ -25999,7 +26058,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)
@@ -26240,7 +26299,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)
@@ -26261,7 +26320,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)
@@ -26898,19 +26957,19 @@ OPCODE(0x8100)
 {
        u32 adr, res;
        u32 src, dst;
+       u32 corf = 0;
 
        src = DREGu8((Opcode >> 0) & 7);
        dst = DREGu8((Opcode >> 9) & 7);
        res = (dst & 0xF) - (src & 0xF) - ((flag_X >> M68K_SR_X_SFT) & 1);
-       if (res > 9) res -= 6;
+       if (res > 0xF) corf = 6;
        res += (dst & 0xF0) - (src & 0xF0);
-       if (res > 0x99)
-       {
-               res += 0xA0;
-               flag_X = flag_C = M68K_SR_C;
-       }
-       else flag_X = flag_C = 0;
-       flag_NotZ |= res & 0xFF;
+       flag_V = res;
+       flag_X = flag_C = (s32)res < (s32)corf ? M68K_SR_C : 0;
+       if (res > 0xff) res += 0xA0;
+       res = (res - corf) & 0xFF;
+       flag_V &= ~res;
+       flag_NotZ |= res;
        flag_N = res;
        DREGu8((Opcode >> 9) & 7) = res;
 RET(6)
@@ -26921,6 +26980,7 @@ OPCODE(0x8108)
 {
        u32 adr, res;
        u32 src, dst;
+       u32 corf = 0;
 
        adr = AREG((Opcode >> 0) & 7) - 1;
        AREG((Opcode >> 0) & 7) = adr;
@@ -26930,15 +26990,14 @@ OPCODE(0x8108)
        AREG((Opcode >> 9) & 7) = adr;
        READ_BYTE_F(adr, dst)
        res = (dst & 0xF) - (src & 0xF) - ((flag_X >> M68K_SR_X_SFT) & 1);
-       if (res > 9) res -= 6;
+       if (res > 0xF) corf = 6;
        res += (dst & 0xF0) - (src & 0xF0);
-       if (res > 0x99)
-       {
-               res += 0xA0;
-               flag_X = flag_C = M68K_SR_C;
-       }
-       else flag_X = flag_C = 0;
-       flag_NotZ |= res & 0xFF;
+       flag_V = res;
+       flag_X = flag_C = (s32)res < (s32)corf ? M68K_SR_C : 0;
+       if (res > 0xff) res += 0xA0;
+       res = (res - corf) & 0xFF;
+       flag_V &= ~res;
+       flag_NotZ |= res;
        flag_N = res;
        WRITE_BYTE_F(adr, res)
        POST_IO
@@ -26950,6 +27009,7 @@ OPCODE(0x810F)
 {
        u32 adr, res;
        u32 src, dst;
+       u32 corf = 0;
 
        adr = AREG(7) - 2;
        AREG(7) = adr;
@@ -26959,15 +27019,14 @@ OPCODE(0x810F)
        AREG((Opcode >> 9) & 7) = adr;
        READ_BYTE_F(adr, dst)
        res = (dst & 0xF) - (src & 0xF) - ((flag_X >> M68K_SR_X_SFT) & 1);
-       if (res > 9) res -= 6;
+       if (res > 0xF) corf = 6;
        res += (dst & 0xF0) - (src & 0xF0);
-       if (res > 0x99)
-       {
-               res += 0xA0;
-               flag_X = flag_C = M68K_SR_C;
-       }
-       else flag_X = flag_C = 0;
-       flag_NotZ |= res & 0xFF;
+       flag_V = res;
+       flag_X = flag_C = (s32)res < (s32)corf ? M68K_SR_C : 0;
+       if (res > 0xff) res += 0xA0;
+       res = (res - corf) & 0xFF;
+       flag_V &= ~res;
+       flag_NotZ |= res;
        flag_N = res;
        WRITE_BYTE_F(adr, res)
        POST_IO
@@ -26979,6 +27038,7 @@ OPCODE(0x8F08)
 {
        u32 adr, res;
        u32 src, dst;
+       u32 corf = 0;
 
        adr = AREG((Opcode >> 0) & 7) - 1;
        AREG((Opcode >> 0) & 7) = adr;
@@ -26988,15 +27048,14 @@ OPCODE(0x8F08)
        AREG(7) = adr;
        READ_BYTE_F(adr, dst)
        res = (dst & 0xF) - (src & 0xF) - ((flag_X >> M68K_SR_X_SFT) & 1);
-       if (res > 9) res -= 6;
+       if (res > 0xF) corf = 6;
        res += (dst & 0xF0) - (src & 0xF0);
-       if (res > 0x99)
-       {
-               res += 0xA0;
-               flag_X = flag_C = M68K_SR_C;
-       }
-       else flag_X = flag_C = 0;
-       flag_NotZ |= res & 0xFF;
+       flag_V = res;
+       flag_X = flag_C = (s32)res < (s32)corf ? M68K_SR_C : 0;
+       if (res > 0xff) res += 0xA0;
+       res = (res - corf) & 0xFF;
+       flag_V &= ~res;
+       flag_NotZ |= res;
        flag_N = res;
        WRITE_BYTE_F(adr, res)
        POST_IO
@@ -27008,6 +27067,7 @@ OPCODE(0x8F0F)
 {
        u32 adr, res;
        u32 src, dst;
+       u32 corf = 0;
 
        adr = AREG(7) - 2;
        AREG(7) = adr;
@@ -27017,15 +27077,14 @@ OPCODE(0x8F0F)
        AREG(7) = adr;
        READ_BYTE_F(adr, dst)
        res = (dst & 0xF) - (src & 0xF) - ((flag_X >> M68K_SR_X_SFT) & 1);
-       if (res > 9) res -= 6;
+       if (res > 0xF) corf = 6;
        res += (dst & 0xF0) - (src & 0xF0);
-       if (res > 0x99)
-       {
-               res += 0xA0;
-               flag_X = flag_C = M68K_SR_C;
-       }
-       else flag_X = flag_C = 0;
-       flag_NotZ |= res & 0xFF;
+       flag_V = res;
+       flag_X = flag_C = (s32)res < (s32)corf ? M68K_SR_C : 0;
+       if (res > 0xff) res += 0xA0;
+       res = (res - corf) & 0xFF;
+       flag_V &= ~res;
+       flag_NotZ |= res;
        flag_N = res;
        WRITE_BYTE_F(adr, res)
        POST_IO
@@ -27041,7 +27100,7 @@ OPCODE(0x80C0)
        src = DREGu16((Opcode >> 0) & 7);
        if (src == 0)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(140)
 #else
@@ -27089,7 +27148,7 @@ OPCODE(0x80D0)
        READ_WORD_F(adr, src)
        if (src == 0)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(144)
 #else
@@ -27138,7 +27197,7 @@ OPCODE(0x80D8)
        READ_WORD_F(adr, src)
        if (src == 0)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(144)
 #else
@@ -27187,7 +27246,7 @@ OPCODE(0x80E0)
        READ_WORD_F(adr, src)
        if (src == 0)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(146)
 #else
@@ -27236,7 +27295,7 @@ OPCODE(0x80E8)
        READ_WORD_F(adr, src)
        if (src == 0)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(148)
 #else
@@ -27285,7 +27344,7 @@ OPCODE(0x80F0)
        READ_WORD_F(adr, src)
        if (src == 0)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(150)
 #else
@@ -27333,7 +27392,7 @@ OPCODE(0x80F8)
        READ_WORD_F(adr, src)
        if (src == 0)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(148)
 #else
@@ -27381,9 +27440,9 @@ OPCODE(0x80F9)
        READ_WORD_F(adr, src)
        if (src == 0)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
-RET(162)
+RET(152)
 #else
 RET(22)
 #endif
@@ -27399,7 +27458,7 @@ RET(22)
                {
                        flag_V = M68K_SR_V;
 #ifdef USE_CYCLONE_TIMING_DIV
-RET(162)
+RET(152)
 #else
        RET(82)
 #endif
@@ -27412,7 +27471,7 @@ RET(162)
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-RET(162)
+RET(152)
 #else
 RET(102)
 #endif
@@ -27424,13 +27483,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)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(148)
 #else
@@ -27473,15 +27532,15 @@ 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)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
-RET(160)
+RET(150)
 #else
 RET(20)
 #endif
@@ -27497,7 +27556,7 @@ RET(20)
                {
                        flag_V = M68K_SR_V;
 #ifdef USE_CYCLONE_TIMING_DIV
-RET(160)
+RET(150)
 #else
        RET(80)
 #endif
@@ -27510,7 +27569,7 @@ RET(160)
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-RET(160)
+RET(150)
 #else
 RET(100)
 #endif
@@ -27525,7 +27584,7 @@ OPCODE(0x80FC)
        FETCH_WORD(src);
        if (src == 0)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(144)
 #else
@@ -27574,7 +27633,7 @@ OPCODE(0x80DF)
        READ_WORD_F(adr, src)
        if (src == 0)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(144)
 #else
@@ -27623,7 +27682,7 @@ OPCODE(0x80E7)
        READ_WORD_F(adr, src)
        if (src == 0)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 RET(146)
 #else
@@ -27669,7 +27728,7 @@ OPCODE(0x81C0)
        src = (s32)DREGs16((Opcode >> 0) & 7);
        if (src == 0)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 goto end81C0;
 #endif
@@ -27709,7 +27768,7 @@ goto end81C0;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end81C0: m68kcontext.io_cycle_counter -= 50;
+end81C0: ctx->io_cycle_counter -= 50;
 #endif
 RET(108)
 }
@@ -27725,7 +27784,7 @@ OPCODE(0x81D0)
        READSX_WORD_F(adr, src)
        if (src == 0)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 goto end81D0;
 #endif
@@ -27765,7 +27824,7 @@ goto end81D0;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end81D0: m68kcontext.io_cycle_counter -= 50;
+end81D0: ctx->io_cycle_counter -= 50;
 #endif
 RET(112)
 }
@@ -27782,7 +27841,7 @@ OPCODE(0x81D8)
        READSX_WORD_F(adr, src)
        if (src == 0)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 goto end81D8;
 #endif
@@ -27822,7 +27881,7 @@ goto end81D8;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end81D8: m68kcontext.io_cycle_counter -= 50;
+end81D8: ctx->io_cycle_counter -= 50;
 #endif
 RET(112)
 }
@@ -27839,7 +27898,7 @@ OPCODE(0x81E0)
        READSX_WORD_F(adr, src)
        if (src == 0)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 goto end81E0;
 #endif
@@ -27879,7 +27938,7 @@ goto end81E0;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end81E0: m68kcontext.io_cycle_counter -= 50;
+end81E0: ctx->io_cycle_counter -= 50;
 #endif
 RET(114)
 }
@@ -27896,7 +27955,7 @@ OPCODE(0x81E8)
        READSX_WORD_F(adr, src)
        if (src == 0)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 goto end81E8;
 #endif
@@ -27936,7 +27995,7 @@ goto end81E8;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end81E8: m68kcontext.io_cycle_counter -= 50;
+end81E8: ctx->io_cycle_counter -= 50;
 #endif
 RET(116)
 }
@@ -27953,7 +28012,7 @@ OPCODE(0x81F0)
        READSX_WORD_F(adr, src)
        if (src == 0)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 goto end81F0;
 #endif
@@ -27993,7 +28052,7 @@ goto end81F0;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end81F0: m68kcontext.io_cycle_counter -= 50;
+end81F0: ctx->io_cycle_counter -= 50;
 #endif
 RET(118)
 }
@@ -28009,7 +28068,7 @@ OPCODE(0x81F8)
        READSX_WORD_F(adr, src)
        if (src == 0)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 goto end81F8;
 #endif
@@ -28049,7 +28108,7 @@ goto end81F8;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end81F8: m68kcontext.io_cycle_counter -= 50;
+end81F8: ctx->io_cycle_counter -= 50;
 #endif
 RET(116)
 }
@@ -28065,7 +28124,7 @@ OPCODE(0x81F9)
        READSX_WORD_F(adr, src)
        if (src == 0)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 goto end81F9;
 #endif
@@ -28105,7 +28164,7 @@ goto end81F9;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end81F9: m68kcontext.io_cycle_counter -= 50;
+end81F9: ctx->io_cycle_counter -= 50;
 #endif
 RET(120)
 }
@@ -28116,13 +28175,13 @@ 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)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 goto end81FA;
 #endif
@@ -28162,7 +28221,7 @@ goto end81FA;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end81FA: m68kcontext.io_cycle_counter -= 50;
+end81FA: ctx->io_cycle_counter -= 50;
 #endif
 RET(116)
 }
@@ -28173,13 +28232,13 @@ 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)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 goto end81FB;
 #endif
@@ -28219,7 +28278,7 @@ goto end81FB;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end81FB: m68kcontext.io_cycle_counter -= 50;
+end81FB: ctx->io_cycle_counter -= 50;
 #endif
 RET(118)
 }
@@ -28233,7 +28292,7 @@ OPCODE(0x81FC)
        FETCH_SWORD(src);
        if (src == 0)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 goto end81FC;
 #endif
@@ -28273,7 +28332,7 @@ goto end81FC;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end81FC: m68kcontext.io_cycle_counter -= 50;
+end81FC: ctx->io_cycle_counter -= 50;
 #endif
 RET(112)
 }
@@ -28290,7 +28349,7 @@ OPCODE(0x81DF)
        READSX_WORD_F(adr, src)
        if (src == 0)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 goto end81DF;
 #endif
@@ -28330,7 +28389,7 @@ goto end81DF;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end81DF: m68kcontext.io_cycle_counter -= 50;
+end81DF: ctx->io_cycle_counter -= 50;
 #endif
 RET(112)
 }
@@ -28347,7 +28406,7 @@ OPCODE(0x81E7)
        READSX_WORD_F(adr, src)
        if (src == 0)
        {
-               SET_PC(execute_exception(M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
+               SET_PC(execute_exception(ctx, M68K_ZERO_DIVIDE_EX, GET_PC, GET_SR));
 #ifdef USE_CYCLONE_TIMING_DIV
 goto end81E7;
 #endif
@@ -28387,7 +28446,7 @@ goto end81E7;
        DREGu32((Opcode >> 9) & 7) = res;
        }
 #ifdef USE_CYCLONE_TIMING_DIV
-end81E7: m68kcontext.io_cycle_counter -= 50;
+end81E7: ctx->io_cycle_counter -= 50;
 #endif
 RET(114)
 }
@@ -28416,8 +28475,8 @@ OPCODE(0x9008)
        u32 src, dst;
 
        // can't read byte from Ax registers !
-       m68kcontext.execinfo |= M68K_FAULTED;
-       m68kcontext.io_cycle_counter = 0;
+       ctx->execinfo |= M68K_FAULTED;
+       ctx->io_cycle_counter = 0;
 /*
        goto famec_Exec_End;
        dst = DREGu8((Opcode >> 9) & 7);
@@ -28574,7 +28633,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)
@@ -28594,7 +28653,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)
@@ -28839,7 +28898,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)
@@ -28859,7 +28918,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)
@@ -29113,7 +29172,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)
@@ -29134,7 +29193,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)
@@ -30241,7 +30300,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)
@@ -30262,7 +30321,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)
@@ -30488,7 +30547,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)
@@ -30505,7 +30564,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)
@@ -30590,8 +30649,8 @@ OPCODE(0xB008)
        u32 src, dst;
 
        // can't read byte from Ax registers !
-       m68kcontext.execinfo |= M68K_FAULTED;
-       m68kcontext.io_cycle_counter = 0;
+       ctx->execinfo |= M68K_FAULTED;
+       ctx->io_cycle_counter = 0;
 /*
        goto famec_Exec_End;
        dst = DREGu8((Opcode >> 9) & 7);
@@ -30740,7 +30799,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)
@@ -30759,7 +30818,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)
@@ -30991,7 +31050,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)
@@ -31010,7 +31069,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)
@@ -31251,7 +31310,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)
@@ -31271,7 +31330,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)
@@ -32381,7 +32440,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)
@@ -32401,7 +32460,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)
@@ -32646,7 +32705,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)
@@ -32666,7 +32725,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)
@@ -32903,7 +32962,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)
@@ -32924,7 +32983,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)
@@ -33165,7 +33224,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)
@@ -33186,7 +33245,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)
@@ -33427,7 +33486,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)
@@ -33448,7 +33507,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)
@@ -34085,18 +34144,22 @@ OPCODE(0xC100)
 {
        u32 adr, res;
        u32 src, dst;
+       u32 corf = 0;
 
        src = DREGu8((Opcode >> 0) & 7);
        dst = DREGu8((Opcode >> 9) & 7);
        res = (dst & 0xF) + (src & 0xF) + ((flag_X >> M68K_SR_X_SFT) & 1);
-       if (res > 9) res += 6;
+       if (res > 9) corf = 6;
        res += (dst & 0xF0) + (src & 0xF0);
-       if (res > 0x99)
+       flag_V = ~res;
+       res += corf;
+       if (res > 0x9F)
        {
                res -= 0xA0;
                flag_X = flag_C = M68K_SR_C;
        }
        else flag_X = flag_C = 0;
+       flag_V &= res;
        flag_NotZ |= res & 0xFF;
        flag_N = res;
        DREGu8((Opcode >> 9) & 7) = res;
@@ -34108,6 +34171,7 @@ OPCODE(0xC108)
 {
        u32 adr, res;
        u32 src, dst;
+       u32 corf = 0;
 
        adr = AREG((Opcode >> 0) & 7) - 1;
        AREG((Opcode >> 0) & 7) = adr;
@@ -34117,14 +34181,17 @@ OPCODE(0xC108)
        AREG((Opcode >> 9) & 7) = adr;
        READ_BYTE_F(adr, dst)
        res = (dst & 0xF) + (src & 0xF) + ((flag_X >> M68K_SR_X_SFT) & 1);
-       if (res > 9) res += 6;
+       if (res > 9) corf = 6;
        res += (dst & 0xF0) + (src & 0xF0);
-       if (res > 0x99)
+       flag_V = ~res;
+       res += corf;
+       if (res > 0x9F)
        {
                res -= 0xA0;
                flag_X = flag_C = M68K_SR_C;
        }
        else flag_X = flag_C = 0;
+       flag_V &= res;
        flag_NotZ |= res & 0xFF;
        flag_N = res;
        WRITE_BYTE_F(adr, res)
@@ -34137,6 +34204,7 @@ OPCODE(0xC10F)
 {
        u32 adr, res;
        u32 src, dst;
+       u32 corf = 0;
 
        adr = AREG(7) - 2;
        AREG(7) = adr;
@@ -34146,14 +34214,17 @@ OPCODE(0xC10F)
        AREG((Opcode >> 9) & 7) = adr;
        READ_BYTE_F(adr, dst)
        res = (dst & 0xF) + (src & 0xF) + ((flag_X >> M68K_SR_X_SFT) & 1);
-       if (res > 9) res += 6;
+       if (res > 9) corf = 6;
        res += (dst & 0xF0) + (src & 0xF0);
-       if (res > 0x99)
+       flag_V = ~res;
+       res += corf;
+       if (res > 0x9F)
        {
                res -= 0xA0;
                flag_X = flag_C = M68K_SR_C;
        }
        else flag_X = flag_C = 0;
+       flag_V &= res;
        flag_NotZ |= res & 0xFF;
        flag_N = res;
        WRITE_BYTE_F(adr, res)
@@ -34166,6 +34237,7 @@ OPCODE(0xCF08)
 {
        u32 adr, res;
        u32 src, dst;
+       u32 corf = 0;
 
        adr = AREG((Opcode >> 0) & 7) - 1;
        AREG((Opcode >> 0) & 7) = adr;
@@ -34175,14 +34247,17 @@ OPCODE(0xCF08)
        AREG(7) = adr;
        READ_BYTE_F(adr, dst)
        res = (dst & 0xF) + (src & 0xF) + ((flag_X >> M68K_SR_X_SFT) & 1);
-       if (res > 9) res += 6;
+       if (res > 9) corf = 6;
        res += (dst & 0xF0) + (src & 0xF0);
-       if (res > 0x99)
+       flag_V = ~res;
+       res += corf;
+       if (res > 0x9F)
        {
                res -= 0xA0;
                flag_X = flag_C = M68K_SR_C;
        }
        else flag_X = flag_C = 0;
+       flag_V &= res;
        flag_NotZ |= res & 0xFF;
        flag_N = res;
        WRITE_BYTE_F(adr, res)
@@ -34195,6 +34270,7 @@ OPCODE(0xCF0F)
 {
        u32 adr, res;
        u32 src, dst;
+       u32 corf = 0;
 
        adr = AREG(7) - 2;
        AREG(7) = adr;
@@ -34204,14 +34280,17 @@ OPCODE(0xCF0F)
        AREG(7) = adr;
        READ_BYTE_F(adr, dst)
        res = (dst & 0xF) + (src & 0xF) + ((flag_X >> M68K_SR_X_SFT) & 1);
-       if (res > 9) res += 6;
+       if (res > 9) corf = 6;
        res += (dst & 0xF0) + (src & 0xF0);
-       if (res > 0x99)
+       flag_V = ~res;
+       res += corf;
+       if (res > 0x9F)
        {
                res -= 0xA0;
                flag_X = flag_C = M68K_SR_C;
        }
        else flag_X = flag_C = 0;
+       flag_V &= res;
        flag_NotZ |= res & 0xFF;
        flag_N = res;
        WRITE_BYTE_F(adr, res)
@@ -34410,7 +34489,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)
@@ -34434,7 +34513,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)
@@ -34711,7 +34790,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)
@@ -34735,7 +34814,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)
@@ -34887,8 +34966,8 @@ OPCODE(0xD008)
        u32 src, dst;
 
        // can't read byte from Ax registers !
-       m68kcontext.execinfo |= M68K_FAULTED;
-       m68kcontext.io_cycle_counter = 0;
+       ctx->execinfo |= M68K_FAULTED;
+       ctx->io_cycle_counter = 0;
 /*
        goto famec_Exec_End;
        dst = DREGu8((Opcode >> 9) & 7);
@@ -35045,7 +35124,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)
@@ -35065,7 +35144,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)
@@ -35310,7 +35389,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)
@@ -35330,7 +35409,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)
@@ -35584,7 +35663,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)
@@ -35605,7 +35684,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)
@@ -36712,7 +36791,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)
@@ -36733,7 +36812,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)
@@ -36959,7 +37038,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)
@@ -36976,7 +37055,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)
@@ -37047,7 +37126,7 @@ OPCODE(0xE000)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = (s32)DREGs8((Opcode >> 0) & 7);
        flag_V = 0;
        flag_X = flag_C = src << ((M68K_SR_C_SFT + 1) - sft);
@@ -37067,7 +37146,7 @@ OPCODE(0xE040)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = (s32)DREGs16((Opcode >> 0) & 7);
        flag_V = 0;
        flag_X = flag_C = src << ((M68K_SR_C_SFT + 1) - sft);
@@ -37087,7 +37166,7 @@ OPCODE(0xE080)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = (s32)DREGs32((Opcode >> 0) & 7);
        flag_V = 0;
        flag_X = flag_C = src << ((M68K_SR_C_SFT + 1) - sft);
@@ -37107,7 +37186,7 @@ OPCODE(0xE008)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = DREGu8((Opcode >> 0) & 7);
        flag_N = flag_V = 0;
        flag_X = flag_C = src << ((M68K_SR_C_SFT + 1) - sft);
@@ -37126,7 +37205,7 @@ OPCODE(0xE048)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = DREGu16((Opcode >> 0) & 7);
        flag_N = flag_V = 0;
        flag_X = flag_C = src << ((M68K_SR_C_SFT + 1) - sft);
@@ -37145,7 +37224,7 @@ OPCODE(0xE088)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = DREGu32((Opcode >> 0) & 7);
        flag_N = flag_V = 0;
        flag_X = flag_C = src << ((M68K_SR_C_SFT + 1) - sft);
@@ -37164,7 +37243,7 @@ OPCODE(0xE010)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = DREGu8((Opcode >> 0) & 7);
        src |= (flag_X & M68K_SR_X) << 0;
        res = (src >> sft) | (src << (9 - sft));
@@ -37185,7 +37264,7 @@ OPCODE(0xE050)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = DREGu16((Opcode >> 0) & 7);
        src |= (flag_X & M68K_SR_X) << 8;
        res = (src >> sft) | (src << (17 - sft));
@@ -37206,7 +37285,7 @@ OPCODE(0xE090)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = DREGu32((Opcode >> 0) & 7);
        flag_C = src << ((M68K_SR_C_SFT + 1) - sft);
        if (sft == 1) res = (src >> 1) | ((flag_X & M68K_SR_X) << (32 - (M68K_SR_X_SFT + 1)));
@@ -37228,7 +37307,7 @@ OPCODE(0xE018)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = DREGu8((Opcode >> 0) & 7);
        flag_V = 0;
        flag_C = src << ((M68K_SR_C_SFT + 1) - sft);
@@ -37248,7 +37327,7 @@ OPCODE(0xE058)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = DREGu16((Opcode >> 0) & 7);
        flag_V = 0;
        flag_C = src << ((M68K_SR_C_SFT + 1) - sft);
@@ -37268,7 +37347,7 @@ OPCODE(0xE098)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = DREGu32((Opcode >> 0) & 7);
        flag_V = 0;
        flag_C = src << ((M68K_SR_C_SFT + 1) - sft);
@@ -37288,7 +37367,7 @@ OPCODE(0xE100)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = DREGu8((Opcode >> 0) & 7);
        if (sft < 8)
        {
@@ -37327,7 +37406,7 @@ OPCODE(0xE140)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = DREGu16((Opcode >> 0) & 7);
                flag_X = flag_C = src >> (8 - sft);
                res = src << sft;
@@ -37352,7 +37431,7 @@ OPCODE(0xE180)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = DREGu32((Opcode >> 0) & 7);
                flag_X = flag_C = src >> (24 - sft);
                res = src << sft;
@@ -37377,7 +37456,7 @@ OPCODE(0xE108)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = DREGu8((Opcode >> 0) & 7);
        flag_V = 0;
        flag_X = flag_C = src << (0 + sft);
@@ -37397,7 +37476,7 @@ OPCODE(0xE148)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = DREGu16((Opcode >> 0) & 7);
        flag_V = 0;
        flag_X = flag_C = src >> (8 - sft);
@@ -37417,7 +37496,7 @@ OPCODE(0xE188)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = DREGu32((Opcode >> 0) & 7);
        flag_V = 0;
        flag_X = flag_C = src >> (24 - sft);
@@ -37437,7 +37516,7 @@ OPCODE(0xE110)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = DREGu8((Opcode >> 0) & 7);
        src |= (flag_X & M68K_SR_X) << 0;
        res = (src << sft) | (src >> (9 - sft));
@@ -37458,7 +37537,7 @@ OPCODE(0xE150)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = DREGu16((Opcode >> 0) & 7);
        src |= (flag_X & M68K_SR_X) << 8;
        res = (src << sft) | (src >> (17 - sft));
@@ -37479,7 +37558,7 @@ OPCODE(0xE190)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = DREGu32((Opcode >> 0) & 7);
        flag_C = src >> ((32 - M68K_SR_C_SFT) - sft);
        if (sft == 1) res = (src << 1) | ((flag_X & M68K_SR_X) >> ((M68K_SR_X_SFT + 1) - 1));
@@ -37501,7 +37580,7 @@ OPCODE(0xE118)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = DREGu8((Opcode >> 0) & 7);
        flag_V = 0;
        flag_C = src << (0 + sft);
@@ -37521,7 +37600,7 @@ OPCODE(0xE158)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = DREGu16((Opcode >> 0) & 7);
        flag_V = 0;
        flag_C = src >> (8 - sft);
@@ -37541,7 +37620,7 @@ OPCODE(0xE198)
        u32 sft;
 
        sft = (((Opcode >> 9) - 1) & 7) + 1;
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
        src = DREGu32((Opcode >> 0) & 7);
        flag_V = 0;
        flag_C = src >> (24 - sft);
@@ -37564,7 +37643,7 @@ OPCODE(0xE020)
        src = (s32)DREGs8((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                if (sft < 8)
                {
                        flag_V = 0;
@@ -37617,7 +37696,7 @@ OPCODE(0xE060)
        src = (s32)DREGs16((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                if (sft < 16)
                {
                        flag_V = 0;
@@ -37675,7 +37754,7 @@ OPCODE(0xE0A0)
        src = (s32)DREGs32((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                if (sft < 32)
                {
                        flag_V = 0;
@@ -37729,7 +37808,7 @@ OPCODE(0xE028)
        src = DREGu8((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                if (sft <= 8)
                {
                        flag_N = flag_V = 0;
@@ -37768,7 +37847,7 @@ OPCODE(0xE068)
        src = DREGu16((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                if (sft <= 16)
                {
                        flag_N = flag_V = 0;
@@ -37812,7 +37891,7 @@ OPCODE(0xE0A8)
        src = DREGu32((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                if (sft < 32)
                {
                        flag_N = flag_V = 0;
@@ -37854,7 +37933,7 @@ OPCODE(0xE030)
        src = DREGu8((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                sft %= 9;
 
                src |= (flag_X & M68K_SR_X) << 0;
@@ -37886,7 +37965,7 @@ OPCODE(0xE070)
        src = DREGu16((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                sft %= 17;
 
                src |= (flag_X & M68K_SR_X) << 8;
@@ -37923,14 +38002,14 @@ OPCODE(0xE0B0)
        src = DREGu32((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                sft %= 33;
 
                if (sft != 0)
                {
                        if (sft == 1) res = (src >> 1) | ((flag_X & M68K_SR_X) << (32 - (M68K_SR_X_SFT + 1)));
                        else res = (src >> sft) | (src << (33 - sft)) | (((flag_X & M68K_SR_X) << (32 - (M68K_SR_X_SFT + 1))) >> (sft - 1));
-                       flag_X = (src >> (32 - sft)) << M68K_SR_X_SFT;
+                       flag_X = (src >> (sft - 1)) << M68K_SR_X_SFT;
                }
                else res = src;
                flag_C = flag_X;
@@ -37961,7 +38040,7 @@ OPCODE(0xE038)
        src = DREGu8((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                sft &= 0x07;
 
                flag_C = src << (M68K_SR_C_SFT - ((sft - 1) & 7));
@@ -37992,7 +38071,7 @@ OPCODE(0xE078)
        src = DREGu16((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                sft &= 0x0F;
 
                flag_C = (src >> ((sft - 1) & 15)) << M68K_SR_C_SFT;
@@ -38028,7 +38107,7 @@ OPCODE(0xE0B8)
        src = DREGu32((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                sft &= 0x1F;
 
                flag_C = (src >> ((sft - 1) & 31)) << M68K_SR_C_SFT;
@@ -38060,7 +38139,7 @@ OPCODE(0xE120)
        src = DREGu8((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                if (sft < 8)
                {
                        flag_X = flag_C = (src << sft) >> 0;
@@ -38108,7 +38187,7 @@ OPCODE(0xE160)
        src = DREGu16((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                if (sft < 16)
                {
                        flag_X = flag_C = (src << sft) >> 8;
@@ -38161,7 +38240,7 @@ OPCODE(0xE1A0)
        src = DREGu32((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                if (sft < 32)
                {
                        flag_X = flag_C = (src >> (32 - sft)) << M68K_SR_C_SFT;
@@ -38210,7 +38289,7 @@ OPCODE(0xE128)
        src = DREGu8((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                if (sft <= 8)
                {
                        flag_X = flag_C = (src << sft) >> 0;
@@ -38250,7 +38329,7 @@ OPCODE(0xE168)
        src = DREGu16((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                if (sft <= 16)
                {
                        flag_X = flag_C = (src << sft) >> 8;
@@ -38295,7 +38374,7 @@ OPCODE(0xE1A8)
        src = DREGu32((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                if (sft < 32)
                {
                        flag_X = flag_C = (src >> (32 - sft)) << M68K_SR_C_SFT;
@@ -38338,7 +38417,7 @@ OPCODE(0xE130)
        src = DREGu8((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                sft %= 9;
 
                src |= (flag_X & M68K_SR_X) << 0;
@@ -38370,7 +38449,7 @@ OPCODE(0xE170)
        src = DREGu16((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                sft %= 17;
 
                src |= (flag_X & M68K_SR_X) << 8;
@@ -38407,7 +38486,7 @@ OPCODE(0xE1B0)
        src = DREGu32((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                sft %= 33;
 
                if (sft != 0)
@@ -38445,7 +38524,7 @@ OPCODE(0xE138)
        src = DREGu8((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                if (sft &= 0x07)
                {
                        flag_C = (src << sft) >> 0;
@@ -38483,7 +38562,7 @@ OPCODE(0xE178)
        src = DREGu16((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                if (sft &= 0x0F)
                {
                        flag_C = (src << sft) >> 8;
@@ -38526,7 +38605,7 @@ OPCODE(0xE1B8)
        src = DREGu32((Opcode >> 0) & 7);
        if (sft)
        {
-       m68kcontext.io_cycle_counter -= sft * 2;
+       ctx->io_cycle_counter -= sft * 2;
                if (sft &= 0x1F)
                {
                        flag_C = (src >> (32 - sft)) << M68K_SR_C_SFT;
@@ -39974,7 +40053,7 @@ RET(14)
 OPCODE(0x6001_idle)
 {
 #ifdef FAMEC_CHECK_BRANCHES
-       u32 newPC = (u32)(PC) - BasePC;
+       u32 newPC = GET_PC;
        s8 offs=Opcode;
        newPC += offs;
        SET_PC(newPC);
@@ -40012,20 +40091,18 @@ 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)
 {
-       extern int idledet_start_frame;
-       extern char Pico[];
        int frame_count, cond_true, bytes, ret, newop;
        u16 *dest_pc;
 
        dest_pc = PC + (((s8)(Opcode & 0xFE)) >> 1);
 
-       frame_count = *(int *)(Pico+0x22208+0x1c); // Pico.m.frame_count
-       if (frame_count < idledet_start_frame)
+       if (!SekIsIdleReady())
                goto end;
 
        bytes = 0 - (s8)(Opcode & 0xFE) - 2;
@@ -40035,7 +40112,7 @@ OPCODE(idle_detector_bcc8)
        if (  Opcode & 0x0100)  newop |= 0x400; // beq
        if (!(Opcode & 0x0f00)) newop |= 0xc00; // bra
 
-       ret = SekRegisterIdlePatch(GET_PC - 2, Opcode, newop, &m68kcontext);
+       ret = SekRegisterIdlePatch(GET_PC - 2, Opcode, newop, ctx);
        switch (ret)
        {
                case 0: PC[-1] = newop; break;
@@ -40051,7 +40128,7 @@ end:
        if (cond_true)
        {
                PC = dest_pc;
-               m68kcontext.io_cycle_counter -= 2;
+               ctx->io_cycle_counter -= 2;
        }
 RET(8)
 }