Merge branch 'libretro' into libretro-reset
[picodrive.git] / cpu / musashi / m68kcpu.h
index 8885595..63055cb 100644 (file)
@@ -4,10 +4,10 @@
 /* ======================================================================== */\r
 /*\r
  *                                  MUSASHI\r
- *                                Version 3.3\r
+ *                                Version 3.31\r
  *\r
  * A portable Motorola M680x0 processor emulation engine.\r
- * Copyright 1998-2001 Karl Stenerud.  All rights reserved.\r
+ * Copyright 1998-2007 Karl Stenerud.  All rights reserved.\r
  *\r
  * This code may be freely used for non-commercial purposes as long as this\r
  * copyright notice remains unaltered in the source code and any binary files\r
@@ -27,6 +27,9 @@
 #define M68KCPU__HEADER\r
 \r
 // notaz: something's missing this\r
+#ifndef UINT64\r
+#define UINT64 unsigned long long\r
+#endif\r
 #ifndef UINT16\r
 #define UINT32 unsigned int\r
 #define UINT16 unsigned short\r
 \r
 #define sint8  signed   char                   /* ASG: changed from char to signed char */\r
 #define sint16 signed   short\r
-#define sint32 signed   long\r
+#define sint32 signed   int                    /* AWJ: changed from long to int */\r
 #define uint8  unsigned char\r
 #define uint16 unsigned short\r
-#define uint32 unsigned long\r
+#define uint32 unsigned int                    /* AWJ: changed from long to int */\r
 \r
 /* signed and unsigned int must be at least 32 bits wide */\r
 #define sint   signed   int\r
 \r
 \r
 /* Allow for architectures that don't have 32-bit sizes */\r
-#if ULONG_MAX == 0xffffffff\r
+#if UINT_MAX == 0xffffffff\r
        #define MAKE_INT_32(A) (sint32)(A)\r
 #else\r
        #undef  sint32\r
        {\r
                return (value & 0x80000000) ? value | ~0xffffffff : value & 0xffffffff;\r
        }\r
-#endif /* ULONG_MAX == 0xffffffff */\r
+#endif /* UINT_MAX == 0xffffffff */\r
 \r
-// notaz\r
-INLINE sint32 MAKE_INT_24(uint value)\r
-{\r
-       return (value & 0x800000) ? value | ~0xffffff : value & 0xffffff;\r
-}\r
 \r
 \r
 \r
@@ -328,6 +326,11 @@ INLINE sint32 MAKE_INT_24(uint value)
 #define REG_CAAR         m68ki_cpu.caar\r
 #define REG_IR           m68ki_cpu.ir\r
 \r
+#define REG_FP           m68ki_cpu.fpr\r
+#define REG_FPCR         m68ki_cpu.fpcr\r
+#define REG_FPSR         m68ki_cpu.fpsr\r
+#define REG_FPIAR        m68ki_cpu.fpiar\r
+\r
 #define FLAG_T1          m68ki_cpu.t1_flag\r
 #define FLAG_T0          m68ki_cpu.t0_flag\r
 #define FLAG_S           m68ki_cpu.s_flag\r
@@ -367,6 +370,7 @@ INLINE sint32 MAKE_INT_24(uint value)
 #define CALLBACK_RESET_INSTR  m68ki_cpu.reset_instr_callback\r
 #define CALLBACK_CMPILD_INSTR m68ki_cpu.cmpild_instr_callback\r
 #define CALLBACK_RTE_INSTR    m68ki_cpu.rte_instr_callback\r
+#define CALLBACK_TAS_INSTR    m68ki_cpu.tas_instr_callback\r
 #define CALLBACK_PC_CHANGED   m68ki_cpu.pc_changed_callback\r
 #define CALLBACK_SET_FC       m68ki_cpu.set_fc_callback\r
 #define CALLBACK_INSTR_HOOK   m68ki_cpu.instr_hook_callback\r
@@ -487,6 +491,17 @@ INLINE sint32 MAKE_INT_24(uint value)
        #define m68ki_rte_callback()\r
 #endif /* M68K_RTE_HAS_CALLBACK */\r
 \r
+#if M68K_TAS_HAS_CALLBACK\r
+       #if M68K_TAS_HAS_CALLBACK == OPT_SPECIFY_HANDLER\r
+               #define m68ki_tas_callback() M68K_TAS_CALLBACK()\r
+       #else\r
+               #define m68ki_tas_callback() CALLBACK_TAS_INSTR()\r
+       #endif\r
+#else\r
+       #define m68ki_tas_callback()\r
+#endif /* M68K_TAS_HAS_CALLBACK */\r
+\r
+\r
 #if M68K_INSTRUCTION_HOOK\r
        #if M68K_INSTRUCTION_HOOK == OPT_SPECIFY_HANDLER\r
                #define m68ki_instr_hook() M68K_INSTRUCTION_CALLBACK()\r
@@ -835,6 +850,12 @@ INLINE sint32 MAKE_INT_24(uint value)
 /* =============================== PROTOTYPES ============================= */\r
 /* ======================================================================== */\r
 \r
+typedef union\r
+{\r
+       UINT64 i;\r
+       double f;\r
+} fp_reg;\r
+\r
 typedef struct\r
 {\r
        uint cpu_type;     /* CPU Type: 68000, 68008, 68010, 68EC020, or 68020 */\r
@@ -848,6 +869,10 @@ typedef struct
        uint cacr;         /* Cache Control Register (m68020, unemulated) */\r
        uint caar;         /* Cache Address Register (m68020, unemulated) */\r
        uint ir;           /* Instruction Register */\r
+    fp_reg fpr[8];     /* FPU Data Register (m68040) */\r
+       uint fpiar;        /* FPU Instruction Address Register (m68040) */\r
+       uint fpsr;         /* FPU Status Register (m68040) */\r
+       uint fpcr;         /* FPU Control Register (m68040) */\r
        uint t1_flag;      /* Trace 1 */\r
        uint t0_flag;      /* Trace 0 */\r
        uint s_flag;       /* Supervisor */\r
@@ -887,17 +912,24 @@ typedef struct
        void (*reset_instr_callback)(void);               /* Called when a RESET instruction is encountered */\r
        void (*cmpild_instr_callback)(unsigned int, int); /* Called when a CMPI.L #v, Dn instruction is encountered */\r
        void (*rte_instr_callback)(void);                 /* Called when a RTE instruction is encountered */\r
+       int  (*tas_instr_callback)(void);                 /* Called when a TAS instruction is encountered, allows / disallows writeback */\r
        void (*pc_changed_callback)(unsigned int new_pc); /* Called when the PC changes by a large amount */\r
        void (*set_fc_callback)(unsigned int new_fc);     /* Called when the CPU function code changes */\r
        void (*instr_hook_callback)(void);                /* Called every instruction cycle prior to execution */\r
 \r
+       // notaz\r
+       sint cyc_remaining_cycles;\r
+       sint not_polling;\r
 } m68ki_cpu_core;\r
 \r
-\r
+// notaz\r
 extern m68ki_cpu_core *m68ki_cpu_p;\r
-#define m68ki_cpu (*m68ki_cpu_p) // test\r
+#define m68ki_cpu (*m68ki_cpu_p)\r
+#define m68ki_remaining_cycles m68ki_cpu_p->cyc_remaining_cycles\r
 \r
-extern sint           m68ki_remaining_cycles;\r
+\r
+//extern m68ki_cpu_core m68ki_cpu;\r
+//extern sint           m68ki_remaining_cycles;\r
 extern uint           m68ki_tracing;\r
 extern uint8          m68ki_shift_8_table[];\r
 extern uint16         m68ki_shift_16_table[];\r
@@ -1505,7 +1537,8 @@ INLINE void m68ki_set_sr_noint_nosp(uint value)
 INLINE void m68ki_set_sr(uint value)\r
 {\r
        m68ki_set_sr_noint(value);\r
-       m68ki_check_interrupts();\r
+       if (GET_CYCLES() >= 0) // notaz\r
+               m68ki_check_interrupts();\r
 }\r
 \r
 \r
@@ -1590,7 +1623,7 @@ INLINE void m68ki_stack_frame_buserr(uint sr)
 /* Format 8 stack frame (68010).\r
  * 68010 only.  This is the 29 word bus/address error frame.\r
  */\r
-void m68ki_stack_frame_1000(uint pc, uint sr, uint vector)\r
+INLINE void m68ki_stack_frame_1000(uint pc, uint sr, uint vector)\r
 {\r
        /* VERSION\r
      * NUMBER\r
@@ -1644,7 +1677,7 @@ void m68ki_stack_frame_1000(uint pc, uint sr, uint vector)
  * if the error happens at an instruction boundary.\r
  * PC stacked is address of next instruction.\r
  */\r
-void m68ki_stack_frame_1010(uint sr, uint vector, uint pc)\r
+INLINE void m68ki_stack_frame_1010(uint sr, uint vector, uint pc)\r
 {\r
        /* INTERNAL REGISTER */\r
        m68ki_push_16(0);\r
@@ -1691,7 +1724,7 @@ void m68ki_stack_frame_1010(uint sr, uint vector, uint pc)
  * if the error happens during instruction execution.\r
  * PC stacked is address of instruction in progress.\r
  */\r
-void m68ki_stack_frame_1011(uint sr, uint vector, uint pc)\r
+INLINE void m68ki_stack_frame_1011(uint sr, uint vector, uint pc)\r
 {\r
        /* INTERNAL REGISTERS (18 words) */\r
        m68ki_push_32(0);\r
@@ -1933,8 +1966,9 @@ m68k_read_memory_8(0x00ffff01);
        USE_CYCLES(CYC_EXCEPTION[EXCEPTION_ADDRESS_ERROR] - CYC_INSTRUCTION[REG_IR]);\r
 }\r
 \r
+\r
 /* Service an interrupt request and start exception processing */\r
-void m68ki_exception_interrupt(uint int_level)\r
+INLINE void m68ki_exception_interrupt(uint int_level)\r
 {\r
        uint vector;\r
        uint sr;\r
@@ -1979,6 +2013,7 @@ void m68ki_exception_interrupt(uint int_level)
 \r
        /* Get the new PC */\r
        new_pc = m68ki_read_data_32((vector<<2) + REG_VBR);\r
+       //new_pc = m68k_read_immediate_32((vector<<2) + REG_VBR); // notaz hack\r
 \r
        /* If vector is uninitialized, call the uninitialized interrupt vector */\r
        if(new_pc == 0)\r