improve 64bit portability
[picodrive.git] / cpu / fame / famec.c
index 508a12f..60a9e55 100644 (file)
@@ -94,7 +94,7 @@
 #define s16    signed short\r
 #define u32    unsigned int\r
 #define s32    signed int\r
-#define uptr   unsigned long\r
+#define uptr   uintptr_t\r
 \r
 /*\r
 typedef unsigned char  u8;\r
@@ -228,21 +228,21 @@ typedef signed int        s32;
 // internals core macros\r
 /////////////////////////\r
 \r
-#define DREG(X)         (m68kcontext.dreg[(X)].D)\r
-#define DREGu32(X)      (m68kcontext.dreg[(X)].D)\r
-#define DREGs32(X)      (m68kcontext.dreg[(X)].SD)\r
-#define DREGu16(X)      (m68kcontext.dreg[(X)].W)\r
-#define DREGs16(X)      (m68kcontext.dreg[(X)].SW)\r
-#define DREGu8(X)       (m68kcontext.dreg[(X)].B)\r
-#define DREGs8(X)       (m68kcontext.dreg[(X)].SB)\r
+#define DREG(X)         (ctx->dreg[(X)].D)\r
+#define DREGu32(X)      (ctx->dreg[(X)].D)\r
+#define DREGs32(X)      (ctx->dreg[(X)].SD)\r
+#define DREGu16(X)      (ctx->dreg[(X)].W)\r
+#define DREGs16(X)      (ctx->dreg[(X)].SW)\r
+#define DREGu8(X)       (ctx->dreg[(X)].B)\r
+#define DREGs8(X)       (ctx->dreg[(X)].SB)\r
 \r
-#define AREG(X)         (m68kcontext.areg[(X)].D)\r
-#define AREGu32(X)      (m68kcontext.areg[(X)].D)\r
-#define AREGs32(X)      (m68kcontext.areg[(X)].SD)\r
-#define AREGu16(X)      (m68kcontext.areg[(X)].W)\r
-#define AREGs16(X)      (m68kcontext.areg[(X)].SW)\r
+#define AREG(X)         (ctx->areg[(X)].D)\r
+#define AREGu32(X)      (ctx->areg[(X)].D)\r
+#define AREGs32(X)      (ctx->areg[(X)].SD)\r
+#define AREGu16(X)      (ctx->areg[(X)].W)\r
+#define AREGs16(X)      (ctx->areg[(X)].SW)\r
 \r
-#define ASP             (m68kcontext.asp)\r
+#define ASP             (ctx->asp)\r
 \r
 #define LSL(A, C)       ((A) << (C))\r
 #define LSR(A, C)       ((A) >> (C))\r
@@ -271,39 +271,39 @@ typedef signed int        s32;
 \r
 #ifdef FAMEC_ROLL_INLINE\r
 #define RET(A)                                      \\r
-    m68kcontext.io_cycle_counter -= (A);                        \\r
-    if (m68kcontext.io_cycle_counter <= 0) goto famec_Exec_End;        \\r
+    ctx->io_cycle_counter -= (A);                        \\r
+    if (ctx->io_cycle_counter <= 0) goto famec_Exec_End;       \\r
     NEXT\r
 #else\r
 #define RET(A)                                      \\r
-    m68kcontext.io_cycle_counter -= (A);                        \\r
-    if (m68kcontext.io_cycle_counter <= 0) goto famec_Exec_End;        \\r
+    ctx->io_cycle_counter -= (A);                        \\r
+    if (ctx->io_cycle_counter <= 0) goto famec_Exec_End;       \\r
     goto famec_Exec;\r
 #endif\r
 \r
 #define RET0() \\r
-    m68kcontext.io_cycle_counter = -6; \\r
+    ctx->io_cycle_counter = -6; \\r
     goto famec_End;\r
 \r
 #else\r
 \r
 #define NEXT \\r
-    do{ \\r
-       FETCH_WORD(Opcode); \\r
-       JumpTable[Opcode](); \\r
-    }while(m68kcontext.io_cycle_counter>0);\r
+    do { \\r
+        FETCH_WORD(Opcode); \\r
+        JumpTable[Opcode](ctx); \\r
+    } while (ctx->io_cycle_counter > 0);\r
 \r
 #define RET(A) \\r
-    m68kcontext.io_cycle_counter -= (A);  \\r
+    ctx->io_cycle_counter -= (A);  \\r
     return;\r
 \r
 #define RET0() \\r
-    m68kcontext.io_cycle_counter = -6; \\r
+    ctx->io_cycle_counter = -6; \\r
     return;\r
 \r
 #endif\r
 \r
-#define M68K_PPL (m68kcontext.sr >> 8) & 7\r
+#define M68K_PPL (ctx->sr >> 8) & 7\r
 \r
 #define GET_PC                  \\r
        (u32)((uptr)PC - BasePC)\r
@@ -321,7 +321,7 @@ typedef signed int  s32;
 { \\r
     u32 pc = A; \\r
     FORCE_ALIGNMENT(pc); \\r
-    BasePC = m68kcontext.Fetch[(pc >> M68K_FETCHSFT) & M68K_FETCHMASK];    \\r
+    BasePC = ctx->Fetch[(pc >> M68K_FETCHSFT) & M68K_FETCHMASK];    \\r
     PC = (u16*)((pc & M68K_ADR_MASK) + BasePC);        \\r
 }\r
 \r
@@ -331,7 +331,7 @@ typedef signed int  s32;
 { \\r
     u32 pc = A; \\r
     FORCE_ALIGNMENT(pc); \\r
-    BasePC = m68kcontext.Fetch[(pc >> M68K_FETCHSFT) & M68K_FETCHMASK];    \\r
+    BasePC = ctx->Fetch[(pc >> M68K_FETCHSFT) & M68K_FETCHMASK];    \\r
     BasePC -= pc & 0xFF000000;    \\r
     PC = (u16*)(pc + BasePC); \\r
 }\r
@@ -346,29 +346,29 @@ typedef signed int        s32;
 //    CCnt = io_cycle_counter;\r
 \r
 #define READ_BYTE_F(A, D)           \\r
-       D = m68kcontext.read_byte(A) & 0xFF;\r
+       D = ctx->read_byte(A) & 0xFF;\r
 \r
 #define READ_WORD_F(A, D)           \\r
-       D = m68kcontext.read_word(A) & 0xFFFF;\r
+       D = ctx->read_word(A) & 0xFFFF;\r
 \r
 #define READ_LONG_F(A, D)           \\r
-       D = m68kcontext.read_long(A);\r
+       D = ctx->read_long(A);\r
 \r
 #define READSX_LONG_F READ_LONG_F\r
 \r
 #define WRITE_LONG_F(A, D)          \\r
-       m68kcontext.write_long(A, D);\r
+       ctx->write_long(A, D);\r
 \r
 #define WRITE_LONG_DEC_F(A, D)          \\r
-       m68kcontext.write_word((A) + 2, (D) & 0xFFFF);    \\r
-       m68kcontext.write_word((A), (D) >> 16);\r
+       ctx->write_word((A) + 2, (D) & 0xFFFF);    \\r
+       ctx->write_word((A), (D) >> 16);\r
 \r
 #define PUSH_32_F(D)                        \\r
        AREG(7) -= 4;                               \\r
-       m68kcontext.write_long(AREG(7), D);\r
+       ctx->write_long(AREG(7), D);\r
 \r
 #define POP_32_F(D)                         \\r
-       D = m68kcontext.read_long(AREG(7));         \\r
+       D = ctx->read_long(AREG(7));         \\r
        AREG(7) += 4;\r
 \r
 #ifndef FAME_BIG_ENDIAN\r
@@ -440,23 +440,23 @@ typedef signed int        s32;
 #endif\r
 \r
 #define READSX_BYTE_F(A, D)             \\r
-    D = (s8)m68kcontext.read_byte(A);\r
+    D = (s8)ctx->read_byte(A);\r
 \r
 #define READSX_WORD_F(A, D)             \\r
-    D = (s16)m68kcontext.read_word(A);\r
+    D = (s16)ctx->read_word(A);\r
 \r
 \r
 #define WRITE_BYTE_F(A, D)      \\r
-    m68kcontext.write_byte(A, D);\r
+    ctx->write_byte(A, D);\r
 \r
 #define WRITE_WORD_F(A, D)      \\r
-    m68kcontext.write_word(A, D);\r
+    ctx->write_word(A, D);\r
 \r
 #define PUSH_16_F(D)                    \\r
-    m68kcontext.write_word(AREG(7) -= 2, D);   \\r
+    ctx->write_word(AREG(7) -= 2, D);   \\r
 \r
 #define POP_16_F(D)                     \\r
-    D = (u16)m68kcontext.read_word(AREG(7));   \\r
+    D = (u16)ctx->read_word(AREG(7));   \\r
     AREG(7) += 2;\r
 \r
 #define GET_CCR                                     \\r
@@ -501,17 +501,17 @@ typedef signed int        s32;
 #endif\r
 \r
 #define CHECK_INT_TO_JUMP(CLK) \\r
-       if (interrupt_chk__()) \\r
+       if (interrupt_chk__(ctx)) \\r
        { \\r
-               cycles_needed=m68kcontext.io_cycle_counter-(CLK); \\r
-               m68kcontext.io_cycle_counter=(CLK);  \\r
+               cycles_needed=ctx->io_cycle_counter-(CLK); \\r
+               ctx->io_cycle_counter=(CLK);  \\r
        }\r
 \r
 \r
 #ifdef FAMEC_CHECK_BRANCHES\r
 \r
 #ifdef FAMEC_NO_GOTOS\r
-#define CHECK_BRANCH_EXCEPTION_GOTO_END m68kcontext.io_cycle_counter=0; return;\r
+#define CHECK_BRANCH_EXCEPTION_GOTO_END ctx->io_cycle_counter=0; return;\r
 #else\r
 #define CHECK_BRANCH_EXCEPTION_GOTO_END goto famec_Exec_End;\r
 #endif\r
@@ -520,8 +520,8 @@ typedef signed int  s32;
        if ((_PC_)&1) \\r
        { \\r
                u32 new_PC, pr_PC=GET_PC; \\r
-               m68kcontext.execinfo |= FM68K_EMULATE_GROUP_0; \\r
-               new_PC = execute_exception_group_0(M68K_ADDRESS_ERROR_EX, 0, pr_PC, 0x12 ); \\r
+               ctx->execinfo |= FM68K_EMULATE_GROUP_0; \\r
+               new_PC = execute_exception_group_0(ctx, M68K_ADDRESS_ERROR_EX, 0, pr_PC, 0x12 ); \\r
                SET_PC(new_PC); \\r
                CHECK_BRANCH_EXCEPTION_GOTO_END \\r
        }\r
@@ -529,29 +529,24 @@ typedef signed int        s32;
 #define CHECK_BRANCH_EXCEPTION(_PC_)\r
 #endif\r
 \r
-\r
-// global variable\r
-///////////////////\r
-\r
-/* Current CPU context */\r
-M68K_CONTEXT *g_m68kcontext;\r
-#define m68kcontext (*g_m68kcontext)\r
-\r
 #ifdef FAMEC_NO_GOTOS\r
-#define Opcode m68kcontext.Opcode\r
-#define cycles_needed m68kcontext.cycles_needed\r
-#define PC m68kcontext.PC\r
-#define BasePC m68kcontext.BasePC\r
-#define flag_C m68kcontext.flag_C\r
-#define flag_V m68kcontext.flag_V\r
-#define flag_NotZ m68kcontext.flag_NotZ\r
-#define flag_N m68kcontext.flag_N\r
-#define flag_X m68kcontext.flag_X\r
+#define Opcode ctx->Opcode\r
+#define cycles_needed ctx->cycles_needed\r
+#define PC ctx->PC\r
+#define BasePC ctx->BasePC\r
+#define flag_C ctx->flag_C\r
+#define flag_V ctx->flag_V\r
+#define flag_NotZ ctx->flag_NotZ\r
+#define flag_N ctx->flag_N\r
+#define flag_X ctx->flag_X\r
 #endif\r
 \r
-#define flag_T m68kcontext.flag_T\r
-#define flag_S m68kcontext.flag_S\r
-#define flag_I m68kcontext.flag_I\r
+#define flag_T ctx->flag_T\r
+#define flag_S ctx->flag_S\r
+#define flag_I ctx->flag_I\r
+\r
+// global variable\r
+///////////////////\r
 \r
 static u32 initialised = 0;\r
 \r
@@ -560,7 +555,7 @@ extern M68K_CONTEXT PicoCpuFS68k;
 #endif\r
 \r
 /* Custom function handler */\r
-typedef void (*opcode_func)(void);\r
+typedef void (*opcode_func)(M68K_CONTEXT *ctx);\r
 \r
 static opcode_func JumpTable[0x10000];\r
 \r
@@ -679,30 +674,28 @@ int fm68k_reset(M68K_CONTEXT *ctx)
        if (!initialised)\r
                init_jump_table();\r
 \r
-       g_m68kcontext = ctx;\r
-\r
        // Si la CPU esta en ejecucion, salir con M68K_RUNNING\r
-       if (m68kcontext.execinfo & M68K_RUNNING)\r
+       if (ctx->execinfo & M68K_RUNNING)\r
                return M68K_RUNNING;\r
 \r
        // Resetear registros\r
-       //memset(&m68kcontext.dreg[0], 0, 16*4);\r
+       //memset(&ctx->dreg[0], 0, 16*4);\r
 \r
        // Resetear interrupts, execinfo y ASP\r
-       m68kcontext.interrupts[0] = 0;\r
-       m68kcontext.execinfo = 0;\r
+       ctx->interrupts[0] = 0;\r
+       ctx->execinfo = 0;\r
        ASP = 0;\r
 \r
        // Fijar registro de estado\r
-       m68kcontext.sr = (m68kcontext.sr & 0xff) | 0x2700;\r
+       ctx->sr = (ctx->sr & 0xff) | 0x2700;\r
 \r
        // Obtener puntero de pila inicial y PC\r
-       AREG(7) = m68kcontext.read_long(0);\r
-       m68kcontext.pc = m68kcontext.read_long(4);\r
+       AREG(7) = ctx->read_long(0);\r
+       ctx->pc = ctx->read_long(4);\r
 \r
 #ifdef FAMEC_DEBUG\r
        puts("Reset 68k done!\n");\r
-       printf("PC = 0x%08X\n",m68kcontext.pc);\r
+       printf("PC = 0x%08X\n",ctx->pc);\r
 #endif\r
 \r
     return M68K_OK;\r
@@ -714,39 +707,39 @@ int fm68k_reset(M68K_CONTEXT *ctx)
 /* No recibe parametros                                                     */\r
 /* Retorna 68k PC                                                           */\r
 /****************************************************************************/\r
-u32 fm68k_get_pc(M68K_CONTEXT *context)\r
+u32 fm68k_get_pc(const M68K_CONTEXT *ctx)\r
 {\r
 #ifdef FAMEC_NO_GOTOS\r
-       return (context->execinfo & M68K_RUNNING)?(uptr)PC-BasePC:context->pc;\r
+       return (ctx->execinfo & M68K_RUNNING)?(uptr)PC-BasePC:ctx->pc;\r
 #else\r
-       return context->pc; // approximate PC in this mode\r
+       return ctx->pc; // approximate PC in this mode\r
 #endif\r
 }\r
 \r
 \r
 //////////////////////////\r
 // Chequea las interrupciones y las inicia\r
-static FAMEC_EXTRA_INLINE s32 interrupt_chk__(void)\r
+static FAMEC_EXTRA_INLINE s32 interrupt_chk__(M68K_CONTEXT *ctx)\r
 {\r
-       if (m68kcontext.interrupts[0] > flag_I)\r
-               return m68kcontext.interrupts[0];\r
+       if (ctx->interrupts[0] > flag_I)\r
+               return ctx->interrupts[0];\r
 \r
        return 0;\r
 }\r
 \r
 int fm68k_would_interrupt(M68K_CONTEXT *ctx)\r
 {\r
-       return interrupt_chk__();\r
+       return interrupt_chk__(ctx);\r
 }\r
 \r
-static FAMEC_EXTRA_INLINE u32 execute_exception(s32 vect, u32 oldPC, u32 oldSR)\r
+static FAMEC_EXTRA_INLINE u32 execute_exception(M68K_CONTEXT *ctx, s32 vect, u32 oldPC, u32 oldSR)\r
 {\r
        u32 newPC;\r
        //u32 oldSR = GET_SR;\r
 \r
-        m68kcontext.io_cycle_counter -= exception_cycle_table[vect];\r
+        ctx->io_cycle_counter -= exception_cycle_table[vect];\r
 #ifdef FAMEC_EMULATE_TRACE\r
-       m68kcontext.execinfo &= ~FM68K_EMULATE_TRACE;\r
+       ctx->execinfo &= ~FM68K_EMULATE_TRACE;\r
 #endif\r
 \r
        PRE_IO\r
@@ -785,12 +778,12 @@ static FAMEC_EXTRA_INLINE u32 execute_exception(s32 vect, u32 oldPC, u32 oldSR)
        return newPC;\r
 }\r
 \r
-static FAMEC_EXTRA_INLINE u32 execute_exception_group_0(s32 vect, s32 addr, u16 spec_info, u32 oldSR)\r
+static FAMEC_EXTRA_INLINE u32 execute_exception_group_0(M68K_CONTEXT *ctx, s32 vect, s32 addr, u16 spec_info, u32 oldSR)\r
 {\r
        u32 newPC;\r
        u16 inst_reg = 0;\r
-       newPC = execute_exception(vect, addr, oldSR);\r
-       //if (!(m68kcontext.icust_handler && m68kcontext.icust_handler[vect]))\r
+       newPC = execute_exception(ctx, vect, addr, oldSR);\r
+       //if (!(ctx->icust_handler && ctx->icust_handler[vect]))\r
        {\r
                PUSH_16_F(inst_reg);\r
                PUSH_32_F(addr);\r
@@ -802,7 +795,7 @@ static FAMEC_EXTRA_INLINE u32 execute_exception_group_0(s32 vect, s32 addr, u16
 \r
 #ifdef FAMEC_NO_GOTOS\r
 \r
-#define OPCODE(N_OP) static void OP_##N_OP(void)\r
+#define OPCODE(N_OP) static void OP_##N_OP(M68K_CONTEXT *ctx)\r
 #define CAST_OP(N_OP) (opcode_func)&OP_##N_OP\r
 #include "famec_opcodes.h"\r
 #endif\r
@@ -839,21 +832,19 @@ int fm68k_emulate(M68K_CONTEXT *ctx, s32 cycles, fm68k_call_reason reason)
        }\r
 #endif // FAMEC_NO_GOTOS\r
 \r
-       g_m68kcontext = ctx;\r
-\r
        // won't emulate double fault\r
-       // if (m68kcontext.execinfo & M68K_FAULTED) return -1;\r
+       // if (ctx->execinfo & M68K_FAULTED) return -1;\r
 \r
        // Cache PPL\r
        flag_I = M68K_PPL;\r
 \r
-       if (m68kcontext.execinfo & FM68K_HALTED)\r
+       if (ctx->execinfo & FM68K_HALTED)\r
        {\r
-               if (interrupt_chk__() <= 0)\r
+               if (interrupt_chk__(ctx) <= 0)\r
                {\r
                        return cycles;\r
                }\r
-               m68kcontext.execinfo &= ~FM68K_HALTED;\r
+               ctx->execinfo &= ~FM68K_HALTED;\r
        }\r
 \r
 #ifdef FAMEC_DEBUG\r
@@ -861,13 +852,13 @@ int fm68k_emulate(M68K_CONTEXT *ctx, s32 cycles, fm68k_call_reason reason)
 #endif\r
 \r
        /* Poner la CPU en estado de ejecucion */\r
-       m68kcontext.execinfo |= M68K_RUNNING;\r
+       ctx->execinfo |= M68K_RUNNING;\r
 \r
        // Cache SR\r
-       SET_SR(m68kcontext.sr)\r
+       SET_SR(ctx->sr)\r
 \r
        // Fijar PC\r
-       SET_PC(m68kcontext.pc)\r
+       SET_PC(ctx->pc)\r
 \r
 #ifdef FAMEC_DEBUG\r
        printf("PC: %p\n",PC);\r
@@ -875,33 +866,33 @@ int fm68k_emulate(M68K_CONTEXT *ctx, s32 cycles, fm68k_call_reason reason)
 #endif\r
 \r
        /* guardar ciclos de ejecucion solicitados */\r
-       m68kcontext.io_cycle_counter = cycles;\r
+       ctx->io_cycle_counter = cycles;\r
        cycles_needed = 0;\r
 \r
 #ifdef FAMEC_EMULATE_TRACE\r
-       if (!(m68kcontext.execinfo & FM68K_EMULATE_TRACE))\r
+       if (!(ctx->execinfo & FM68K_EMULATE_TRACE))\r
 #endif\r
        {\r
-               s32 line=interrupt_chk__();\r
+               s32 line=interrupt_chk__(ctx);\r
                if (line>0)\r
                {\r
                        /* comprobar si hay rutina de acknowledge */\r
-                       if (m68kcontext.iack_handler != NULL)\r
-                               m68kcontext.iack_handler(line);\r
+                       if (ctx->iack_handler != NULL)\r
+                               ctx->iack_handler(line);\r
                        else\r
-                               m68kcontext.interrupts[0] = 0;\r
+                               ctx->interrupts[0] = 0;\r
 \r
-                       SET_PC(execute_exception(line + 0x18, GET_PC, GET_SR));\r
+                       SET_PC(execute_exception(ctx, line + 0x18, GET_PC, GET_SR));\r
                        flag_I = (u32)line;\r
-                       if (m68kcontext.io_cycle_counter <= 0) goto famec_End;\r
+                       if (ctx->io_cycle_counter <= 0) goto famec_End;\r
                }\r
 #ifdef FAMEC_EMULATE_TRACE\r
                else\r
                        if  (flag_T)\r
                        {\r
-                               m68kcontext.execinfo |= FM68K_EMULATE_TRACE;\r
-                               cycles_needed = m68kcontext.io_cycle_counter;\r
-                               m68kcontext.io_cycle_counter=0;\r
+                               ctx->execinfo |= FM68K_EMULATE_TRACE;\r
+                               cycles_needed = ctx->io_cycle_counter;\r
+                               ctx->io_cycle_counter=0;\r
                        }\r
 #endif\r
        }\r
@@ -927,14 +918,14 @@ famec_Exec:
 #endif\r
 \r
 #ifdef FAMEC_EMULATE_TRACE\r
-       if (m68kcontext.execinfo & FM68K_EMULATE_TRACE)\r
+       if (ctx->execinfo & FM68K_EMULATE_TRACE)\r
        {\r
-               m68kcontext.io_cycle_counter += cycles_needed;\r
+               ctx->io_cycle_counter += cycles_needed;\r
                cycles_needed = 0;\r
-               m68kcontext.execinfo &= ~FM68K_EMULATE_TRACE;\r
-               m68kcontext.execinfo |= FM68K_DO_TRACE;\r
-               SET_PC(execute_exception(M68K_TRACE_EX, GET_PC, GET_SR));\r
-               if (m68kcontext.io_cycle_counter > 0)\r
+               ctx->execinfo &= ~FM68K_EMULATE_TRACE;\r
+               ctx->execinfo |= FM68K_DO_TRACE;\r
+               SET_PC(execute_exception(ctx, M68K_TRACE_EX, GET_PC, GET_SR));\r
+               if (ctx->io_cycle_counter > 0)\r
                {\r
                        //NEXT\r
                        goto famec_Exec;\r
@@ -945,24 +936,24 @@ famec_Exec:
                if (cycles_needed != 0)\r
                {\r
                        u32 line;\r
-                       m68kcontext.io_cycle_counter += cycles_needed;\r
+                       ctx->io_cycle_counter += cycles_needed;\r
                        cycles_needed = 0;\r
-                       //if (m68kcontext.io_cycle_counter <= 0) goto famec_End;\r
-                       line=interrupt_chk__();\r
+                       //if (ctx->io_cycle_counter <= 0) goto famec_End;\r
+                       line=interrupt_chk__(ctx);\r
                        if (line>0)\r
                        {\r
-                               if (m68kcontext.iack_handler != NULL)\r
-                                       m68kcontext.iack_handler(line);\r
+                               if (ctx->iack_handler != NULL)\r
+                                       ctx->iack_handler(line);\r
                                else\r
-                                       m68kcontext.interrupts[0] = 0;\r
+                                       ctx->interrupts[0] = 0;\r
 \r
-                               SET_PC(execute_exception(line + 0x18, GET_PC, GET_SR));\r
+                               SET_PC(execute_exception(ctx, line + 0x18, GET_PC, GET_SR));\r
                                flag_I = (u32)line;\r
                        }\r
 #ifdef FAMEC_EMULATE_TRACE\r
                        if (!(flag_T))\r
 #endif\r
-                       if (m68kcontext.io_cycle_counter > 0)\r
+                       if (ctx->io_cycle_counter > 0)\r
                        {\r
                                //NEXT\r
                                goto famec_Exec;\r
@@ -970,19 +961,19 @@ famec_Exec:
                }\r
 \r
 famec_End:\r
-       m68kcontext.sr = GET_SR;\r
-       m68kcontext.pc = GET_PC;\r
+       ctx->sr = GET_SR;\r
+       ctx->pc = GET_PC;\r
 \r
-       m68kcontext.execinfo &= ~M68K_RUNNING;\r
+       ctx->execinfo &= ~M68K_RUNNING;\r
 \r
 #ifdef FAMEC_DEBUG\r
        printf("En really end...\n");\r
        printf("PC: %p\n",PC);\r
        printf("BasePC: 0x%08x\n",BasePC);\r
-       printf("pc: 0x%08x\n",m68kcontext.pc);\r
+       printf("pc: 0x%08x\n",ctx->pc);\r
 #endif\r
 \r
-       return cycles - m68kcontext.io_cycle_counter;\r
+       return cycles - ctx->io_cycle_counter;\r
 \r
 #ifndef FAMEC_NO_GOTOS\r
 init_jump_table:\r