/* ======================================================================== */\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
#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
#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
#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
#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
/* =============================== 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
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
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
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
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
{\r
\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