mirror of
https://github.com/captain-amygdala/pistorm.git
synced 2026-04-18 08:56:10 +00:00
introducing CPU state paramter 2
This commit is contained in:
22
m68kcpu.c
22
m68kcpu.c
@@ -37,10 +37,10 @@
|
||||
/* ======================================================================== */
|
||||
/* ================================ INCLUDES ============================== */
|
||||
/* ======================================================================== */
|
||||
|
||||
extern void m68040_fpu_op0(void);
|
||||
extern void m68040_fpu_op1(void);
|
||||
extern void m68851_mmu_ops();
|
||||
struct m68ki_cpu_core;
|
||||
extern void m68040_fpu_op0(struct m68ki_cpu_core *state);
|
||||
extern void m68040_fpu_op1(struct m68ki_cpu_core *state);
|
||||
extern void m68851_mmu_ops(struct m68ki_cpu_core *state);
|
||||
extern unsigned char m68ki_cycles[][0x10000];
|
||||
extern void m68ki_build_opcode_table(void);
|
||||
|
||||
@@ -974,7 +974,7 @@ int m68k_execute(m68ki_cpu_core *state, int num_cycles)
|
||||
m68ki_initial_cycles = num_cycles;
|
||||
|
||||
/* See if interrupts came in */
|
||||
m68ki_check_interrupts();
|
||||
m68ki_check_interrupts(state);
|
||||
|
||||
/* Make sure we're not stopped */
|
||||
if(!CPU_STOPPED)
|
||||
@@ -989,7 +989,7 @@ int m68k_execute(m68ki_cpu_core *state, int num_cycles)
|
||||
/* Main loop. Keep going until we run out of clock cycles */
|
||||
do
|
||||
{
|
||||
/* Set tracing accodring to T1. (T0 is done inside instruction) */
|
||||
/* Set tracing according to T1. (T0 is done inside instruction) */
|
||||
m68ki_trace_t1(); /* auto-disable (see m68kcpu.h) */
|
||||
|
||||
/* Set the address space for reads */
|
||||
@@ -1010,8 +1010,8 @@ int m68k_execute(m68ki_cpu_core *state, int num_cycles)
|
||||
#endif
|
||||
|
||||
/* Read an instruction and call its handler */
|
||||
REG_IR = m68ki_read_imm_16();
|
||||
m68ki_instruction_jump_table[REG_IR](&m68ki_cpu);
|
||||
REG_IR = m68ki_read_imm_16(state);
|
||||
m68ki_instruction_jump_table[REG_IR](state);
|
||||
USE_CYCLES(CYC_INSTRUCTION[REG_IR]);
|
||||
|
||||
/* Trace m68k_exception, if necessary */
|
||||
@@ -1158,8 +1158,8 @@ void m68k_pulse_reset(m68ki_cpu_core *state)
|
||||
|
||||
/* Read the initial stack pointer and program counter */
|
||||
m68ki_jump(0);
|
||||
REG_SP = m68ki_read_imm_32();
|
||||
REG_PC = m68ki_read_imm_32();
|
||||
REG_SP = m68ki_read_imm_32(state);
|
||||
REG_PC = m68ki_read_imm_32(state);
|
||||
m68ki_jump(REG_PC);
|
||||
|
||||
CPU_RUN_MODE = RUN_MODE_NORMAL;
|
||||
@@ -1167,7 +1167,7 @@ void m68k_pulse_reset(m68ki_cpu_core *state)
|
||||
RESET_CYCLES = CYC_EXCEPTION[EXCEPTION_RESET];
|
||||
|
||||
/* flush the MMU's cache */
|
||||
pmmu_atc_flush();
|
||||
pmmu_atc_flush(state);
|
||||
|
||||
if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
|
||||
{
|
||||
|
||||
150
m68kcpu.h
150
m68kcpu.h
@@ -725,10 +725,10 @@ extern jmp_buf m68ki_aerr_trap;
|
||||
#define EA_AY_PD_8() (--AY) /* predecrement (size = byte) */
|
||||
#define EA_AY_PD_16() (AY-=2) /* predecrement (size = word) */
|
||||
#define EA_AY_PD_32() (AY-=4) /* predecrement (size = long) */
|
||||
#define EA_AY_DI_8() (AY+MAKE_INT_16(m68ki_read_imm_16())) /* displacement */
|
||||
#define EA_AY_DI_8() (AY+MAKE_INT_16(m68ki_read_imm_16(state))) /* displacement */
|
||||
#define EA_AY_DI_16() EA_AY_DI_8()
|
||||
#define EA_AY_DI_32() EA_AY_DI_8()
|
||||
#define EA_AY_IX_8() m68ki_get_ea_ix(AY) /* indirect + index */
|
||||
#define EA_AY_IX_8() m68ki_get_ea_ix(state, AY) /* indirect + index */
|
||||
#define EA_AY_IX_16() EA_AY_IX_8()
|
||||
#define EA_AY_IX_32() EA_AY_IX_8()
|
||||
|
||||
@@ -741,33 +741,33 @@ extern jmp_buf m68ki_aerr_trap;
|
||||
#define EA_AX_PD_8() (--AX)
|
||||
#define EA_AX_PD_16() (AX-=2)
|
||||
#define EA_AX_PD_32() (AX-=4)
|
||||
#define EA_AX_DI_8() (AX+MAKE_INT_16(m68ki_read_imm_16()))
|
||||
#define EA_AX_DI_8() (AX+MAKE_INT_16(m68ki_read_imm_16(state)))
|
||||
#define EA_AX_DI_16() EA_AX_DI_8()
|
||||
#define EA_AX_DI_32() EA_AX_DI_8()
|
||||
#define EA_AX_IX_8() m68ki_get_ea_ix(AX)
|
||||
#define EA_AX_IX_8() m68ki_get_ea_ix(state, AX)
|
||||
#define EA_AX_IX_16() EA_AX_IX_8()
|
||||
#define EA_AX_IX_32() EA_AX_IX_8()
|
||||
|
||||
#define EA_A7_PI_8() ((REG_A[7]+=2)-2)
|
||||
#define EA_A7_PD_8() (REG_A[7]-=2)
|
||||
|
||||
#define EA_AW_8() MAKE_INT_16(m68ki_read_imm_16()) /* absolute word */
|
||||
#define EA_AW_8() MAKE_INT_16(m68ki_read_imm_16(state)) /* absolute word */
|
||||
#define EA_AW_16() EA_AW_8()
|
||||
#define EA_AW_32() EA_AW_8()
|
||||
#define EA_AL_8() m68ki_read_imm_32() /* absolute long */
|
||||
#define EA_AL_8() m68ki_read_imm_32(state) /* absolute long */
|
||||
#define EA_AL_16() EA_AL_8()
|
||||
#define EA_AL_32() EA_AL_8()
|
||||
#define EA_PCDI_8() m68ki_get_ea_pcdi() /* pc indirect + displacement */
|
||||
#define EA_PCDI_8() m68ki_get_ea_pcdi(state) /* pc indirect + displacement */
|
||||
#define EA_PCDI_16() EA_PCDI_8()
|
||||
#define EA_PCDI_32() EA_PCDI_8()
|
||||
#define EA_PCIX_8() m68ki_get_ea_pcix() /* pc indirect + index */
|
||||
#define EA_PCIX_8() m68ki_get_ea_pcix(state) /* pc indirect + index */
|
||||
#define EA_PCIX_16() EA_PCIX_8()
|
||||
#define EA_PCIX_32() EA_PCIX_8()
|
||||
|
||||
|
||||
#define OPER_I_8() m68ki_read_imm_8()
|
||||
#define OPER_I_16() m68ki_read_imm_16()
|
||||
#define OPER_I_32() m68ki_read_imm_32()
|
||||
#define OPER_I_8(state) m68ki_read_imm_8(state)
|
||||
#define OPER_I_16(state) m68ki_read_imm_16(state)
|
||||
#define OPER_I_32(state) m68ki_read_imm_32(state)
|
||||
|
||||
|
||||
|
||||
@@ -1084,8 +1084,8 @@ extern uint m68ki_aerr_fc;
|
||||
/* Forward declarations to keep some of the macros happy */
|
||||
static inline uint m68ki_read_16_fc (uint address, uint fc);
|
||||
static inline uint m68ki_read_32_fc (uint address, uint fc);
|
||||
static inline uint m68ki_get_ea_ix(uint An);
|
||||
static inline void m68ki_check_interrupts(void); /* ASG: check for interrupts */
|
||||
static inline uint m68ki_get_ea_ix(m68ki_cpu_core *state, uint An);
|
||||
static inline void m68ki_check_interrupts(m68ki_cpu_core *state); /* ASG: check for interrupts */
|
||||
|
||||
/* quick disassembly (used for logging) */
|
||||
char* m68ki_disassemble_quick(unsigned int pc, unsigned int cpu_type);
|
||||
@@ -1107,7 +1107,7 @@ inline void m68ki_ic_clear(m68ki_cpu_core *state)
|
||||
}
|
||||
}
|
||||
|
||||
extern uint32 pmmu_translate_addr(uint32 addr_in, const uint16 rw);
|
||||
extern uint32 pmmu_translate_addr(m68ki_cpu_core *state, uint32 addr_in, uint16 rw);
|
||||
|
||||
// read immediate word using the instruction cache
|
||||
|
||||
@@ -1169,7 +1169,7 @@ uint m68ki_read_imm6_addr_slowpath(uint32_t pc, address_translation_cache *cache
|
||||
|
||||
|
||||
|
||||
static inline uint m68ki_read_imm_16(void)
|
||||
static inline uint m68ki_read_imm_16(m68ki_cpu_core *state)
|
||||
{
|
||||
uint32_t pc = REG_PC;
|
||||
|
||||
@@ -1182,13 +1182,13 @@ static inline uint m68ki_read_imm_16(void)
|
||||
return m68ki_read_imm6_addr_slowpath(pc, cache);
|
||||
}
|
||||
|
||||
static inline uint m68ki_read_imm_8(void)
|
||||
static inline uint m68ki_read_imm_8(m68ki_cpu_core *state)
|
||||
{
|
||||
/* map read immediate 8 to read immediate 16 */
|
||||
return MASK_OUT_ABOVE_8(m68ki_read_imm_16());
|
||||
return MASK_OUT_ABOVE_8(m68ki_read_imm_16(state));
|
||||
}
|
||||
|
||||
static inline uint m68ki_read_imm_32(void)
|
||||
static inline uint m68ki_read_imm_32(m68ki_cpu_core *state)
|
||||
{
|
||||
#if M68K_SEPARATE_READS
|
||||
#if M68K_EMULATE_PMMU
|
||||
@@ -1403,18 +1403,18 @@ static inline void m68ki_write_32_pd_fc(uint address, uint fc, uint value)
|
||||
/* The program counter relative addressing modes cause operands to be
|
||||
* retrieved from program space, not data space.
|
||||
*/
|
||||
static inline uint m68ki_get_ea_pcdi(void)
|
||||
static inline uint m68ki_get_ea_pcdi(m68ki_cpu_core *state)
|
||||
{
|
||||
uint old_pc = REG_PC;
|
||||
m68ki_use_program_space(); /* auto-disable */
|
||||
return old_pc + MAKE_INT_16(m68ki_read_imm_16());
|
||||
return old_pc + MAKE_INT_16(m68ki_read_imm_16(state));
|
||||
}
|
||||
|
||||
|
||||
static inline uint m68ki_get_ea_pcix(void)
|
||||
static inline uint m68ki_get_ea_pcix(m68ki_cpu_core *state)
|
||||
{
|
||||
m68ki_use_program_space(); /* auto-disable */
|
||||
return m68ki_get_ea_ix(REG_PC);
|
||||
return m68ki_get_ea_ix(state, REG_PC);
|
||||
}
|
||||
|
||||
/* Indexed addressing modes are encoded as follows:
|
||||
@@ -1459,10 +1459,10 @@ static inline uint m68ki_get_ea_pcix(void)
|
||||
* 1 011 mem indir with long outer
|
||||
* 1 100-111 reserved
|
||||
*/
|
||||
static inline uint m68ki_get_ea_ix(uint An)
|
||||
static inline uint m68ki_get_ea_ix(m68ki_cpu_core *state, uint An)
|
||||
{
|
||||
/* An = base register */
|
||||
uint extension = m68ki_read_imm_16();
|
||||
uint extension = m68ki_read_imm_16(state);
|
||||
uint Xn = 0; /* Index register */
|
||||
uint bd = 0; /* Base Displacement */
|
||||
uint od = 0; /* Outer Displacement */
|
||||
@@ -1512,7 +1512,7 @@ static inline uint m68ki_get_ea_ix(uint An)
|
||||
|
||||
/* Check if base displacement is present */
|
||||
if(BIT_5(extension)) /* BD SIZE */
|
||||
bd = BIT_4(extension) ? m68ki_read_imm_32() : (uint32)MAKE_INT_16(m68ki_read_imm_16());
|
||||
bd = BIT_4(extension) ? m68ki_read_imm_32(state) : (uint32)MAKE_INT_16(m68ki_read_imm_16(state));
|
||||
|
||||
/* If no indirect action, we are done */
|
||||
if(!(extension&7)) /* No Memory Indirect */
|
||||
@@ -1520,7 +1520,7 @@ static inline uint m68ki_get_ea_ix(uint An)
|
||||
|
||||
/* Check if outer displacement is present */
|
||||
if(BIT_1(extension)) /* I/IS: od */
|
||||
od = BIT_0(extension) ? m68ki_read_imm_32() : (uint32)MAKE_INT_16(m68ki_read_imm_16());
|
||||
od = BIT_0(extension) ? m68ki_read_imm_32(state) : (uint32)MAKE_INT_16(m68ki_read_imm_16(state));
|
||||
|
||||
/* Postindex */
|
||||
if(BIT_2(extension)) /* I/IS: 0 = preindex, 1 = postindex */
|
||||
@@ -1532,53 +1532,53 @@ static inline uint m68ki_get_ea_ix(uint An)
|
||||
|
||||
|
||||
/* Fetch operands */
|
||||
static inline uint OPER_AY_AI_8(void) {uint ea = EA_AY_AI_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AY_AI_16(void) {uint ea = EA_AY_AI_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AY_AI_32(void) {uint ea = EA_AY_AI_32(); return m68ki_read_32(ea);}
|
||||
static inline uint OPER_AY_PI_8(void) {uint ea = EA_AY_PI_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AY_PI_16(void) {uint ea = EA_AY_PI_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AY_PI_32(void) {uint ea = EA_AY_PI_32(); return m68ki_read_32(ea);}
|
||||
static inline uint OPER_AY_PD_8(void) {uint ea = EA_AY_PD_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AY_PD_16(void) {uint ea = EA_AY_PD_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AY_PD_32(void) {uint ea = EA_AY_PD_32(); return m68ki_read_32(ea);}
|
||||
static inline uint OPER_AY_DI_8(void) {uint ea = EA_AY_DI_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AY_DI_16(void) {uint ea = EA_AY_DI_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AY_DI_32(void) {uint ea = EA_AY_DI_32(); return m68ki_read_32(ea);}
|
||||
static inline uint OPER_AY_IX_8(void) {uint ea = EA_AY_IX_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AY_IX_16(void) {uint ea = EA_AY_IX_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AY_IX_32(void) {uint ea = EA_AY_IX_32(); return m68ki_read_32(ea);}
|
||||
static inline uint OPER_AY_AI_8(m68ki_cpu_core *state) {uint ea = EA_AY_AI_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AY_AI_16(m68ki_cpu_core *state) {uint ea = EA_AY_AI_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AY_AI_32(m68ki_cpu_core *state) {uint ea = EA_AY_AI_32(); return m68ki_read_32(ea);}
|
||||
static inline uint OPER_AY_PI_8(m68ki_cpu_core *state) {uint ea = EA_AY_PI_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AY_PI_16(m68ki_cpu_core *state) {uint ea = EA_AY_PI_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AY_PI_32(m68ki_cpu_core *state) {uint ea = EA_AY_PI_32(); return m68ki_read_32(ea);}
|
||||
static inline uint OPER_AY_PD_8(m68ki_cpu_core *state) {uint ea = EA_AY_PD_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AY_PD_16(m68ki_cpu_core *state) {uint ea = EA_AY_PD_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AY_PD_32(m68ki_cpu_core *state) {uint ea = EA_AY_PD_32(); return m68ki_read_32(ea);}
|
||||
static inline uint OPER_AY_DI_8(m68ki_cpu_core *state) {uint ea = EA_AY_DI_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AY_DI_16(m68ki_cpu_core *state) {uint ea = EA_AY_DI_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AY_DI_32(m68ki_cpu_core *state) {uint ea = EA_AY_DI_32(); return m68ki_read_32(ea);}
|
||||
static inline uint OPER_AY_IX_8(m68ki_cpu_core *state) {uint ea = EA_AY_IX_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AY_IX_16(m68ki_cpu_core *state) {uint ea = EA_AY_IX_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AY_IX_32(m68ki_cpu_core *state) {uint ea = EA_AY_IX_32(); return m68ki_read_32(ea);}
|
||||
|
||||
static inline uint OPER_AX_AI_8(void) {uint ea = EA_AX_AI_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AX_AI_16(void) {uint ea = EA_AX_AI_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AX_AI_32(void) {uint ea = EA_AX_AI_32(); return m68ki_read_32(ea);}
|
||||
static inline uint OPER_AX_PI_8(void) {uint ea = EA_AX_PI_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AX_PI_16(void) {uint ea = EA_AX_PI_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AX_PI_32(void) {uint ea = EA_AX_PI_32(); return m68ki_read_32(ea);}
|
||||
static inline uint OPER_AX_PD_8(void) {uint ea = EA_AX_PD_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AX_PD_16(void) {uint ea = EA_AX_PD_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AX_PD_32(void) {uint ea = EA_AX_PD_32(); return m68ki_read_32(ea);}
|
||||
static inline uint OPER_AX_DI_8(void) {uint ea = EA_AX_DI_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AX_DI_16(void) {uint ea = EA_AX_DI_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AX_DI_32(void) {uint ea = EA_AX_DI_32(); return m68ki_read_32(ea);}
|
||||
static inline uint OPER_AX_IX_8(void) {uint ea = EA_AX_IX_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AX_IX_16(void) {uint ea = EA_AX_IX_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AX_IX_32(void) {uint ea = EA_AX_IX_32(); return m68ki_read_32(ea);}
|
||||
static inline uint OPER_AX_AI_8(m68ki_cpu_core *state) {uint ea = EA_AX_AI_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AX_AI_16(m68ki_cpu_core *state) {uint ea = EA_AX_AI_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AX_AI_32(m68ki_cpu_core *state) {uint ea = EA_AX_AI_32(); return m68ki_read_32(ea);}
|
||||
static inline uint OPER_AX_PI_8(m68ki_cpu_core *state) {uint ea = EA_AX_PI_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AX_PI_16(m68ki_cpu_core *state) {uint ea = EA_AX_PI_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AX_PI_32(m68ki_cpu_core *state) {uint ea = EA_AX_PI_32(); return m68ki_read_32(ea);}
|
||||
static inline uint OPER_AX_PD_8(m68ki_cpu_core *state) {uint ea = EA_AX_PD_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AX_PD_16(m68ki_cpu_core *state) {uint ea = EA_AX_PD_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AX_PD_32(m68ki_cpu_core *state) {uint ea = EA_AX_PD_32(); return m68ki_read_32(ea);}
|
||||
static inline uint OPER_AX_DI_8(m68ki_cpu_core *state) {uint ea = EA_AX_DI_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AX_DI_16(m68ki_cpu_core *state) {uint ea = EA_AX_DI_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AX_DI_32(m68ki_cpu_core *state) {uint ea = EA_AX_DI_32(); return m68ki_read_32(ea);}
|
||||
static inline uint OPER_AX_IX_8(m68ki_cpu_core *state) {uint ea = EA_AX_IX_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AX_IX_16(m68ki_cpu_core *state) {uint ea = EA_AX_IX_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AX_IX_32(m68ki_cpu_core *state) {uint ea = EA_AX_IX_32(); return m68ki_read_32(ea);}
|
||||
|
||||
static inline uint OPER_A7_PI_8(void) {uint ea = EA_A7_PI_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_A7_PD_8(void) {uint ea = EA_A7_PD_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_A7_PI_8(m68ki_cpu_core *state) {uint ea = EA_A7_PI_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_A7_PD_8(m68ki_cpu_core *state) {uint ea = EA_A7_PD_8(); return m68ki_read_8(ea); }
|
||||
|
||||
static inline uint OPER_AW_8(void) {uint ea = EA_AW_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AW_16(void) {uint ea = EA_AW_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AW_32(void) {uint ea = EA_AW_32(); return m68ki_read_32(ea);}
|
||||
static inline uint OPER_AL_8(void) {uint ea = EA_AL_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AL_16(void) {uint ea = EA_AL_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AL_32(void) {uint ea = EA_AL_32(); return m68ki_read_32(ea);}
|
||||
static inline uint OPER_PCDI_8(void) {uint ea = EA_PCDI_8(); return m68ki_read_pcrel_8(ea); }
|
||||
static inline uint OPER_PCDI_16(void) {uint ea = EA_PCDI_16(); return m68ki_read_pcrel_16(ea);}
|
||||
static inline uint OPER_PCDI_32(void) {uint ea = EA_PCDI_32(); return m68ki_read_pcrel_32(ea);}
|
||||
static inline uint OPER_PCIX_8(void) {uint ea = EA_PCIX_8(); return m68ki_read_pcrel_8(ea); }
|
||||
static inline uint OPER_PCIX_16(void) {uint ea = EA_PCIX_16(); return m68ki_read_pcrel_16(ea);}
|
||||
static inline uint OPER_PCIX_32(void) {uint ea = EA_PCIX_32(); return m68ki_read_pcrel_32(ea);}
|
||||
static inline uint OPER_AW_8(m68ki_cpu_core *state) {uint ea = EA_AW_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AW_16(m68ki_cpu_core *state) {uint ea = EA_AW_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AW_32(m68ki_cpu_core *state) {uint ea = EA_AW_32(); return m68ki_read_32(ea);}
|
||||
static inline uint OPER_AL_8(m68ki_cpu_core *state) {uint ea = EA_AL_8(); return m68ki_read_8(ea); }
|
||||
static inline uint OPER_AL_16(m68ki_cpu_core *state) {uint ea = EA_AL_16(); return m68ki_read_16(ea);}
|
||||
static inline uint OPER_AL_32(m68ki_cpu_core *state) {uint ea = EA_AL_32(); return m68ki_read_32(ea);}
|
||||
static inline uint OPER_PCDI_8(m68ki_cpu_core *state) {uint ea = EA_PCDI_8(); return m68ki_read_pcrel_8(ea); }
|
||||
static inline uint OPER_PCDI_16(m68ki_cpu_core *state) {uint ea = EA_PCDI_16(); return m68ki_read_pcrel_16(ea);}
|
||||
static inline uint OPER_PCDI_32(m68ki_cpu_core *state) {uint ea = EA_PCDI_32(); return m68ki_read_pcrel_32(ea);}
|
||||
static inline uint OPER_PCIX_8(m68ki_cpu_core *state) {uint ea = EA_PCIX_8(); return m68ki_read_pcrel_8(ea); }
|
||||
static inline uint OPER_PCIX_16(m68ki_cpu_core *state) {uint ea = EA_PCIX_16(); return m68ki_read_pcrel_16(ea);}
|
||||
static inline uint OPER_PCIX_32(m68ki_cpu_core *state) {uint ea = EA_PCIX_32(); return m68ki_read_pcrel_32(ea);}
|
||||
|
||||
|
||||
|
||||
@@ -1724,7 +1724,7 @@ static inline void m68ki_set_ccr(uint value)
|
||||
}
|
||||
|
||||
/* Set the status register but don't check for interrupts */
|
||||
static inline void m68ki_set_sr_noint(uint value)
|
||||
static inline void m68ki_set_sr_noint(m68ki_cpu_core *state, uint value)
|
||||
{
|
||||
/* Mask out the "unimplemented" bits */
|
||||
value &= CPU_SR_MASK;
|
||||
@@ -1754,10 +1754,10 @@ static inline void m68ki_set_sr_noint_nosp(uint value)
|
||||
}
|
||||
|
||||
/* Set the status register and check for interrupts */
|
||||
static inline void m68ki_set_sr(uint value)
|
||||
static inline void m68ki_set_sr(m68ki_cpu_core *state, uint value)
|
||||
{
|
||||
m68ki_set_sr_noint(value);
|
||||
m68ki_check_interrupts();
|
||||
m68ki_set_sr_noint(state, value);
|
||||
m68ki_check_interrupts(state);
|
||||
}
|
||||
|
||||
|
||||
@@ -2376,7 +2376,7 @@ static inline void m68ki_exception_interrupt(uint int_level)
|
||||
|
||||
|
||||
/* ASG: Check for interrupts */
|
||||
static inline void m68ki_check_interrupts(void)
|
||||
static inline void m68ki_check_interrupts(m68ki_cpu_core *state)
|
||||
{
|
||||
if(m68ki_cpu.nmi_pending)
|
||||
{
|
||||
|
||||
217
m68kfpu.c
217
m68kfpu.c
@@ -4,6 +4,7 @@
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "softfloat/softfloat.h"
|
||||
|
||||
float_status status;
|
||||
|
||||
extern void exit(int);
|
||||
@@ -380,7 +381,7 @@ static inline int TEST_CONDITION(int condition)
|
||||
return r;
|
||||
}
|
||||
|
||||
static uint8 READ_EA_8(int ea)
|
||||
static uint8 READ_EA_8(m68ki_cpu_core *state, int ea)
|
||||
{
|
||||
int mode = (ea >> 3) & 0x7;
|
||||
int reg = (ea & 0x7);
|
||||
@@ -422,13 +423,13 @@ static uint8 READ_EA_8(int ea)
|
||||
{
|
||||
case 0: // (xxx).W
|
||||
{
|
||||
uint32 ea = (uint32)OPER_I_16();
|
||||
uint32 ea = (uint32) OPER_I_16(state);
|
||||
return m68ki_read_8(ea);
|
||||
}
|
||||
case 1: // (xxx).L
|
||||
{
|
||||
uint32 d1 = OPER_I_16();
|
||||
uint32 d2 = OPER_I_16();
|
||||
uint32 d1 = OPER_I_16(state);
|
||||
uint32 d2 = OPER_I_16(state);
|
||||
uint32 ea = (d1 << 16) | d2;
|
||||
return m68ki_read_8(ea);
|
||||
}
|
||||
@@ -439,12 +440,12 @@ static uint8 READ_EA_8(int ea)
|
||||
}
|
||||
case 3: // (PC) + (Xn) + d8
|
||||
{
|
||||
uint32 ea = EA_PCIX_8();
|
||||
uint32 ea = EA_PCIX_8();
|
||||
return m68ki_read_8(ea);
|
||||
}
|
||||
case 4: // #<data>
|
||||
{
|
||||
return OPER_I_8();
|
||||
return OPER_I_8(state);
|
||||
}
|
||||
default: fatalerror("M68kFPU: READ_EA_8: unhandled mode %d, reg %d at %08X\n", mode, reg, REG_PC);
|
||||
}
|
||||
@@ -456,7 +457,7 @@ static uint8 READ_EA_8(int ea)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static uint16 READ_EA_16(int ea)
|
||||
static uint16 READ_EA_16(m68ki_cpu_core *state, int ea)
|
||||
{
|
||||
int mode = (ea >> 3) & 0x7;
|
||||
int reg = (ea & 0x7);
|
||||
@@ -498,13 +499,13 @@ static uint16 READ_EA_16(int ea)
|
||||
{
|
||||
case 0: // (xxx).W
|
||||
{
|
||||
uint32 ea = (uint32)OPER_I_16();
|
||||
uint32 ea = (uint32) OPER_I_16(state);
|
||||
return m68ki_read_16(ea);
|
||||
}
|
||||
case 1: // (xxx).L
|
||||
{
|
||||
uint32 d1 = OPER_I_16();
|
||||
uint32 d2 = OPER_I_16();
|
||||
uint32 d1 = OPER_I_16(state);
|
||||
uint32 d2 = OPER_I_16(state);
|
||||
uint32 ea = (d1 << 16) | d2;
|
||||
return m68ki_read_16(ea);
|
||||
}
|
||||
@@ -520,7 +521,7 @@ static uint16 READ_EA_16(int ea)
|
||||
}
|
||||
case 4: // #<data>
|
||||
{
|
||||
return OPER_I_16();
|
||||
return OPER_I_16(state);
|
||||
}
|
||||
|
||||
default: fatalerror("M68kFPU: READ_EA_16: unhandled mode %d, reg %d at %08X\n", mode, reg, REG_PC);
|
||||
@@ -533,7 +534,7 @@ static uint16 READ_EA_16(int ea)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static uint32 READ_EA_32(int ea)
|
||||
static uint32 READ_EA_32(m68ki_cpu_core *state, int ea)
|
||||
{
|
||||
int mode = (ea >> 3) & 0x7;
|
||||
int reg = (ea & 0x7);
|
||||
@@ -575,13 +576,13 @@ static uint32 READ_EA_32(int ea)
|
||||
{
|
||||
case 0: // (xxx).W
|
||||
{
|
||||
uint32 ea = (uint32)OPER_I_16();
|
||||
uint32 ea = (uint32) OPER_I_16(state);
|
||||
return m68ki_read_32(ea);
|
||||
}
|
||||
case 1: // (xxx).L
|
||||
{
|
||||
uint32 d1 = OPER_I_16();
|
||||
uint32 d2 = OPER_I_16();
|
||||
uint32 d1 = OPER_I_16(state);
|
||||
uint32 d2 = OPER_I_16(state);
|
||||
uint32 ea = (d1 << 16) | d2;
|
||||
return m68ki_read_32(ea);
|
||||
}
|
||||
@@ -597,7 +598,7 @@ static uint32 READ_EA_32(int ea)
|
||||
}
|
||||
case 4: // #<data>
|
||||
{
|
||||
return OPER_I_32();
|
||||
return OPER_I_32(state);
|
||||
}
|
||||
default: fatalerror("M68kFPU: READ_EA_32: unhandled mode %d, reg %d at %08X\n", mode, reg, REG_PC);
|
||||
}
|
||||
@@ -608,7 +609,7 @@ static uint32 READ_EA_32(int ea)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static uint64 READ_EA_64(int ea)
|
||||
static uint64 READ_EA_64(m68ki_cpu_core *state, int ea)
|
||||
{
|
||||
int mode = (ea >> 3) & 0x7;
|
||||
int reg = (ea & 0x7);
|
||||
@@ -659,8 +660,8 @@ static uint64 READ_EA_64(int ea)
|
||||
{
|
||||
case 1: // (xxx).L
|
||||
{
|
||||
uint32 d1 = OPER_I_16();
|
||||
uint32 d2 = OPER_I_16();
|
||||
uint32 d1 = OPER_I_16(state);
|
||||
uint32 d2 = OPER_I_16(state);
|
||||
uint32 ea = (d1 << 16) | d2;
|
||||
return (uint64)(m68ki_read_32(ea)) << 32 | (uint64)(m68ki_read_32(ea+4));
|
||||
}
|
||||
@@ -673,8 +674,8 @@ static uint64 READ_EA_64(int ea)
|
||||
}
|
||||
case 4: // #<data>
|
||||
{
|
||||
h1 = OPER_I_32();
|
||||
h2 = OPER_I_32();
|
||||
h1 = OPER_I_32(state);
|
||||
h2 = OPER_I_32(state);
|
||||
return (uint64)(h1) << 32 | (uint64)(h2);
|
||||
}
|
||||
case 2: // (d16, PC)
|
||||
@@ -695,7 +696,7 @@ static uint64 READ_EA_64(int ea)
|
||||
}
|
||||
|
||||
|
||||
static floatx80 READ_EA_FPE(uint32 ea)
|
||||
static floatx80 READ_EA_FPE(m68ki_cpu_core *state, uint32 ea)
|
||||
{
|
||||
floatx80 fpr;
|
||||
int mode = (ea >> 3) & 0x7;
|
||||
@@ -745,8 +746,8 @@ static floatx80 READ_EA_FPE(uint32 ea)
|
||||
{
|
||||
case 1: // (xxx)
|
||||
{
|
||||
uint32 d1 = OPER_I_16();
|
||||
uint32 d2 = OPER_I_16();
|
||||
uint32 d1 = OPER_I_16(state);
|
||||
uint32 d2 = OPER_I_16(state);
|
||||
uint32 ea = (d1 << 16) | d2;
|
||||
fpr = load_extended_float80(ea);
|
||||
}
|
||||
@@ -787,7 +788,7 @@ static floatx80 READ_EA_FPE(uint32 ea)
|
||||
return fpr;
|
||||
}
|
||||
|
||||
static floatx80 READ_EA_PACK(int ea)
|
||||
static floatx80 READ_EA_PACK(m68ki_cpu_core *state, int ea)
|
||||
{
|
||||
floatx80 fpr;
|
||||
int mode = (ea >> 3) & 0x7;
|
||||
@@ -834,7 +835,7 @@ static floatx80 READ_EA_PACK(int ea)
|
||||
return fpr;
|
||||
}
|
||||
|
||||
static void WRITE_EA_8(int ea, uint8 data)
|
||||
static void WRITE_EA_8(m68ki_cpu_core *state, int ea, uint8 data)
|
||||
{
|
||||
int mode = (ea >> 3) & 0x7;
|
||||
int reg = (ea & 0x7);
|
||||
@@ -882,8 +883,8 @@ static void WRITE_EA_8(int ea, uint8 data)
|
||||
{
|
||||
case 1: // (xxx).B
|
||||
{
|
||||
uint32 d1 = OPER_I_16();
|
||||
uint32 d2 = OPER_I_16();
|
||||
uint32 d1 = OPER_I_16(state);
|
||||
uint32 d2 = OPER_I_16(state);
|
||||
uint32 ea = (d1 << 16) | d2;
|
||||
m68ki_write_8(ea, data);
|
||||
break;
|
||||
@@ -902,7 +903,7 @@ static void WRITE_EA_8(int ea, uint8 data)
|
||||
}
|
||||
}
|
||||
|
||||
static void WRITE_EA_16(int ea, uint16 data)
|
||||
static void WRITE_EA_16(m68ki_cpu_core *state, int ea, uint16 data)
|
||||
{
|
||||
int mode = (ea >> 3) & 0x7;
|
||||
int reg = (ea & 0x7);
|
||||
@@ -950,8 +951,8 @@ static void WRITE_EA_16(int ea, uint16 data)
|
||||
{
|
||||
case 1: // (xxx).W
|
||||
{
|
||||
uint32 d1 = OPER_I_16();
|
||||
uint32 d2 = OPER_I_16();
|
||||
uint32 d1 = OPER_I_16(state);
|
||||
uint32 d2 = OPER_I_16(state);
|
||||
uint32 ea = (d1 << 16) | d2;
|
||||
m68ki_write_16(ea, data);
|
||||
break;
|
||||
@@ -970,7 +971,7 @@ static void WRITE_EA_16(int ea, uint16 data)
|
||||
}
|
||||
}
|
||||
|
||||
static void WRITE_EA_32(int ea, uint32 data)
|
||||
static void WRITE_EA_32(m68ki_cpu_core *state, int ea, uint32 data)
|
||||
{
|
||||
int mode = (ea >> 3) & 0x7;
|
||||
int reg = (ea & 0x7);
|
||||
@@ -1023,14 +1024,14 @@ static void WRITE_EA_32(int ea, uint32 data)
|
||||
{
|
||||
case 0: // (xxx).W
|
||||
{
|
||||
uint32 ea = OPER_I_16();
|
||||
uint32 ea = OPER_I_16(state);
|
||||
m68ki_write_32(ea, data);
|
||||
break;
|
||||
}
|
||||
case 1: // (xxx).L
|
||||
{
|
||||
uint32 d1 = OPER_I_16();
|
||||
uint32 d2 = OPER_I_16();
|
||||
uint32 d1 = OPER_I_16(state);
|
||||
uint32 d2 = OPER_I_16(state);
|
||||
uint32 ea = (d1 << 16) | d2;
|
||||
m68ki_write_32(ea, data);
|
||||
break;
|
||||
@@ -1049,7 +1050,7 @@ static void WRITE_EA_32(int ea, uint32 data)
|
||||
}
|
||||
}
|
||||
|
||||
static void WRITE_EA_64(int ea, uint64 data)
|
||||
static void WRITE_EA_64(m68ki_cpu_core *state, int ea, uint64 data)
|
||||
{
|
||||
int mode = (ea >> 3) & 0x7;
|
||||
int reg = (ea & 0x7);
|
||||
@@ -1100,8 +1101,8 @@ static void WRITE_EA_64(int ea, uint64 data)
|
||||
{
|
||||
case 1: // (xxx).L
|
||||
{
|
||||
uint32 d1 = OPER_I_16();
|
||||
uint32 d2 = OPER_I_16();
|
||||
uint32 d1 = OPER_I_16(state);
|
||||
uint32 d2 = OPER_I_16(state);
|
||||
uint32 ea = (d1 << 16) | d2;
|
||||
m68ki_write_32(ea+0, (uint32)(data >> 32));
|
||||
m68ki_write_32(ea+4, (uint32)(data));
|
||||
@@ -1122,7 +1123,7 @@ static void WRITE_EA_64(int ea, uint64 data)
|
||||
}
|
||||
}
|
||||
|
||||
static void WRITE_EA_FPE(uint32 ea, floatx80 fpr)
|
||||
static void WRITE_EA_FPE(m68ki_cpu_core *state, uint32 ea, floatx80 fpr)
|
||||
{
|
||||
int mode = (ea >> 3) & 0x7;
|
||||
int reg = (ea & 0x7);
|
||||
@@ -1173,7 +1174,7 @@ static void WRITE_EA_FPE(uint32 ea, floatx80 fpr)
|
||||
}
|
||||
}
|
||||
|
||||
static void WRITE_EA_PACK(int ea, int k, floatx80 fpr)
|
||||
static void WRITE_EA_PACK(m68ki_cpu_core *state, int ea, int k, floatx80 fpr)
|
||||
{
|
||||
int mode = (ea >> 3) & 0x7;
|
||||
int reg = (ea & 0x7);
|
||||
@@ -1219,7 +1220,7 @@ static void WRITE_EA_PACK(int ea, int k, floatx80 fpr)
|
||||
}
|
||||
|
||||
|
||||
static void fpgen_rm_reg(uint16 w2)
|
||||
static void fpgen_rm_reg(m68ki_cpu_core *state, uint16 w2)
|
||||
{
|
||||
int ea = REG_IR & 0x3f;
|
||||
int rm = (w2 >> 14) & 0x1;
|
||||
@@ -1236,42 +1237,42 @@ static void fpgen_rm_reg(uint16 w2)
|
||||
{
|
||||
case 0: // Long-Word Integer
|
||||
{
|
||||
sint32 d = READ_EA_32(ea);
|
||||
sint32 d = READ_EA_32(state, ea);
|
||||
source = int32_to_floatx80(d);
|
||||
break;
|
||||
}
|
||||
case 1: // Single-precision Real
|
||||
{
|
||||
uint32 d = READ_EA_32(ea);
|
||||
uint32 d = READ_EA_32(state, ea);
|
||||
source = float32_to_floatx80(d, &status);
|
||||
break;
|
||||
}
|
||||
case 2: // Extended-precision Real
|
||||
{
|
||||
source = READ_EA_FPE(ea);
|
||||
source = READ_EA_FPE(state, ea);
|
||||
break;
|
||||
}
|
||||
case 3: // Packed-decimal Real
|
||||
{
|
||||
source = READ_EA_PACK(ea);
|
||||
source = READ_EA_PACK(state, ea);
|
||||
break;
|
||||
}
|
||||
case 4: // Word Integer
|
||||
{
|
||||
sint16 d = READ_EA_16(ea);
|
||||
sint16 d = READ_EA_16(state, ea);
|
||||
source = int32_to_floatx80((sint32)d);
|
||||
break;
|
||||
}
|
||||
case 5: // Double-precision Real
|
||||
{
|
||||
uint64 d = READ_EA_64(ea);
|
||||
uint64 d = READ_EA_64(state, ea);
|
||||
|
||||
source = float64_to_floatx80(d, &status);
|
||||
break;
|
||||
}
|
||||
case 6: // Byte Integer
|
||||
{
|
||||
sint8 d = READ_EA_8(ea);
|
||||
sint8 d = READ_EA_8(state, ea);
|
||||
source = int32_to_floatx80((sint32)d);
|
||||
break;
|
||||
}
|
||||
@@ -1743,7 +1744,7 @@ static void fpgen_rm_reg(uint16 w2)
|
||||
}
|
||||
}
|
||||
|
||||
static void fmove_reg_mem(uint16 w2)
|
||||
static void fmove_reg_mem(m68ki_cpu_core *state, uint16 w2)
|
||||
{
|
||||
int ea = REG_IR & 0x3f;
|
||||
int src = (w2 >> 7) & 0x7;
|
||||
@@ -1755,25 +1756,25 @@ static void fmove_reg_mem(uint16 w2)
|
||||
case 0: // Long-Word Integer
|
||||
{
|
||||
sint32 d = (sint32)floatx80_to_int32(REG_FP[src], &status);
|
||||
WRITE_EA_32(ea, d);
|
||||
WRITE_EA_32(state, ea, d);
|
||||
break;
|
||||
}
|
||||
case 1: // Single-precision Real
|
||||
{
|
||||
uint32 d = floatx80_to_float32(REG_FP[src], &status);
|
||||
WRITE_EA_32(ea, d);
|
||||
WRITE_EA_32(state, ea, d);
|
||||
break;
|
||||
}
|
||||
case 2: // Extended-precision Real
|
||||
{
|
||||
WRITE_EA_FPE(ea, REG_FP[src]);
|
||||
WRITE_EA_FPE(state, ea, REG_FP[src]);
|
||||
break;
|
||||
}
|
||||
case 3: // Packed-decimal Real with Static K-factor
|
||||
{
|
||||
// sign-extend k
|
||||
k = (k & 0x40) ? (k | 0xffffff80) : (k & 0x7f);
|
||||
WRITE_EA_PACK(ea, k, REG_FP[src]);
|
||||
WRITE_EA_PACK(state, ea, k, REG_FP[src]);
|
||||
break;
|
||||
}
|
||||
case 4: // Word Integer
|
||||
@@ -1783,7 +1784,7 @@ static void fmove_reg_mem(uint16 w2)
|
||||
{
|
||||
REG_FPSR |= FPES_OE | FPAE_IOP;
|
||||
}
|
||||
WRITE_EA_16(ea, (sint16)value);
|
||||
WRITE_EA_16(state, ea, (sint16) value);
|
||||
break;
|
||||
}
|
||||
case 5: // Double-precision Real
|
||||
@@ -1792,7 +1793,7 @@ static void fmove_reg_mem(uint16 w2)
|
||||
|
||||
d = floatx80_to_float64(REG_FP[src], &status);
|
||||
|
||||
WRITE_EA_64(ea, d);
|
||||
WRITE_EA_64(state, ea, d);
|
||||
break;
|
||||
}
|
||||
case 6: // Byte Integer
|
||||
@@ -1802,12 +1803,12 @@ static void fmove_reg_mem(uint16 w2)
|
||||
{
|
||||
REG_FPSR |= FPES_OE | FPAE_IOP;
|
||||
}
|
||||
WRITE_EA_8(ea, (sint8)value);
|
||||
WRITE_EA_8(state, ea, (sint8) value);
|
||||
break;
|
||||
}
|
||||
case 7: // Packed-decimal Real with Dynamic K-factor
|
||||
{
|
||||
WRITE_EA_PACK(ea, REG_D[k>>4], REG_FP[src]);
|
||||
WRITE_EA_PACK(state, ea, REG_D[k >> 4], REG_FP[src]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1815,7 +1816,7 @@ static void fmove_reg_mem(uint16 w2)
|
||||
USE_CYCLES(12);
|
||||
}
|
||||
|
||||
static void fmove_fpcr(uint16 w2)
|
||||
static void fmove_fpcr(m68ki_cpu_core *state, uint16 w2)
|
||||
{
|
||||
int ea = REG_IR & 0x3f;
|
||||
int dir = (w2 >> 13) & 0x1;
|
||||
@@ -1852,15 +1853,15 @@ static void fmove_fpcr(uint16 w2)
|
||||
{
|
||||
if (dir) // From system control reg to <ea>
|
||||
{
|
||||
if (regsel & 4) WRITE_EA_32(ea, REG_FPCR);
|
||||
if (regsel & 2) WRITE_EA_32(ea, REG_FPSR);
|
||||
if (regsel & 1) WRITE_EA_32(ea, REG_FPIAR);
|
||||
if (regsel & 4) WRITE_EA_32(state, ea, REG_FPCR);
|
||||
if (regsel & 2) WRITE_EA_32(state, ea, REG_FPSR);
|
||||
if (regsel & 1) WRITE_EA_32(state, ea, REG_FPIAR);
|
||||
}
|
||||
else // From <ea> to system control reg
|
||||
{
|
||||
if (regsel & 4) REG_FPCR = READ_EA_32(ea);
|
||||
if (regsel & 2) REG_FPSR = READ_EA_32(ea);
|
||||
if (regsel & 1) REG_FPIAR = READ_EA_32(ea);
|
||||
if (regsel & 4) REG_FPCR = READ_EA_32(state, ea);
|
||||
if (regsel & 2) REG_FPSR = READ_EA_32(state, ea);
|
||||
if (regsel & 1) REG_FPIAR = READ_EA_32(state, ea);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1915,7 +1916,7 @@ static void fmove_fpcr(uint16 w2)
|
||||
USE_CYCLES(10);
|
||||
}
|
||||
|
||||
static void fmovem(uint16 w2)
|
||||
static void fmovem(m68ki_cpu_core *state, uint16 w2)
|
||||
{
|
||||
int i;
|
||||
int ea = REG_IR & 0x3f;
|
||||
@@ -1957,7 +1958,7 @@ static void fmovem(uint16 w2)
|
||||
mem_addr += 12;
|
||||
break;
|
||||
default:
|
||||
WRITE_EA_FPE(ea, REG_FP[i]);
|
||||
WRITE_EA_FPE(state, ea, REG_FP[i]);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1981,7 +1982,7 @@ static void fmovem(uint16 w2)
|
||||
mem_addr += 12;
|
||||
break;
|
||||
default:
|
||||
WRITE_EA_FPE(ea, REG_FP[7-i]);
|
||||
WRITE_EA_FPE(state, ea, REG_FP[7 - i]);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2017,7 +2018,7 @@ static void fmovem(uint16 w2)
|
||||
mem_addr += 12;
|
||||
break;
|
||||
default:
|
||||
REG_FP[7-i] = READ_EA_FPE(ea);
|
||||
REG_FP[7-i] = READ_EA_FPE(state, ea);
|
||||
break;
|
||||
}
|
||||
USE_CYCLES(2);
|
||||
@@ -2031,20 +2032,20 @@ static void fmovem(uint16 w2)
|
||||
}
|
||||
}
|
||||
|
||||
static void fscc()
|
||||
static void fscc(m68ki_cpu_core *state)
|
||||
{
|
||||
int ea = REG_IR & 0x3f;
|
||||
int condition = (sint16)(OPER_I_16());
|
||||
int condition = (sint16)(OPER_I_16(state));
|
||||
|
||||
WRITE_EA_8(ea, TEST_CONDITION(condition) ? 0xff : 0);
|
||||
WRITE_EA_8(state, ea, TEST_CONDITION(condition) ? 0xff : 0);
|
||||
USE_CYCLES(7); // ???
|
||||
}
|
||||
static void fbcc16(void)
|
||||
static void fbcc16(m68ki_cpu_core *state)
|
||||
{
|
||||
sint32 offset;
|
||||
int condition = REG_IR & 0x3f;
|
||||
|
||||
offset = (sint16)(OPER_I_16());
|
||||
offset = (sint16)(OPER_I_16(state));
|
||||
|
||||
// TODO: condition and jump!!!
|
||||
if (TEST_CONDITION(condition))
|
||||
@@ -2056,12 +2057,12 @@ static void fbcc16(void)
|
||||
USE_CYCLES(7);
|
||||
}
|
||||
|
||||
static void fbcc32(void)
|
||||
static void fbcc32(m68ki_cpu_core *state)
|
||||
{
|
||||
sint32 offset;
|
||||
int condition = REG_IR & 0x3f;
|
||||
|
||||
offset = OPER_I_32();
|
||||
offset = OPER_I_32(state);
|
||||
|
||||
// TODO: condition and jump!!!
|
||||
if (TEST_CONDITION(condition))
|
||||
@@ -2074,7 +2075,7 @@ static void fbcc32(void)
|
||||
}
|
||||
|
||||
|
||||
void m68040_fpu_op0()
|
||||
void m68040_fpu_op0(m68ki_cpu_core *state)
|
||||
{
|
||||
m68ki_cpu.fpu_just_reset = 0;
|
||||
|
||||
@@ -2082,33 +2083,33 @@ void m68040_fpu_op0()
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
uint16 w2 = OPER_I_16();
|
||||
uint16 w2 = OPER_I_16(state);
|
||||
switch ((w2 >> 13) & 0x7)
|
||||
{
|
||||
case 0x0: // FPU ALU FP, FP
|
||||
case 0x2: // FPU ALU ea, FP
|
||||
{
|
||||
fpgen_rm_reg(w2);
|
||||
fpgen_rm_reg(state, w2);
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x3: // FMOVE FP, ea
|
||||
{
|
||||
fmove_reg_mem(w2);
|
||||
fmove_reg_mem(state, w2);
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x4: // FMOVEM ea, FPCR
|
||||
case 0x5: // FMOVEM FPCR, ea
|
||||
{
|
||||
fmove_fpcr(w2);
|
||||
fmove_fpcr(state, w2);
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x6: // FMOVEM ea, list
|
||||
case 0x7: // FMOVEM list, ea
|
||||
{
|
||||
fmovem(w2);
|
||||
fmovem(state, w2);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2125,7 +2126,7 @@ void m68040_fpu_op0()
|
||||
printf("M68kFPU: unimplemented FDBcc main op %d with mode %d at %08X\n", (REG_IR >> 6) & 0x3, (REG_IR >> 3) & 0x7, REG_PC-4);
|
||||
break;
|
||||
default: // FScc (?)
|
||||
fscc();
|
||||
fscc(state);
|
||||
return;
|
||||
}
|
||||
fatalerror("M68kFPU: unimplemented main op %d with mode %d at %08X\n", (REG_IR >> 6) & 0x3, (REG_IR >> 3) & 0x7, REG_PC-4);
|
||||
@@ -2133,12 +2134,12 @@ void m68040_fpu_op0()
|
||||
}
|
||||
case 2: // FBcc disp16
|
||||
{
|
||||
fbcc16();
|
||||
fbcc16(state);
|
||||
break;
|
||||
}
|
||||
case 3: // FBcc disp32
|
||||
{
|
||||
fbcc32();
|
||||
fbcc32(state);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2146,7 +2147,7 @@ void m68040_fpu_op0()
|
||||
}
|
||||
}
|
||||
|
||||
static int perform_fsave(uint32 addr, int inc)
|
||||
static int perform_fsave(m68ki_cpu_core *state, uint32 addr, int inc)
|
||||
{
|
||||
if(m68ki_cpu.cpu_type & CPU_TYPE_040)
|
||||
{
|
||||
@@ -2188,7 +2189,7 @@ static int perform_fsave(uint32 addr, int inc)
|
||||
}
|
||||
|
||||
// FRESTORE on a NULL frame reboots the FPU - all registers to NaN, the 3 status regs to 0
|
||||
static void do_frestore_null(void)
|
||||
static void do_frestore_null(m68ki_cpu_core *state)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -2206,7 +2207,7 @@ static void do_frestore_null(void)
|
||||
m68ki_cpu.fpu_just_reset = 1;
|
||||
}
|
||||
|
||||
void m68040_do_fsave(uint32 addr, int reg, int inc)
|
||||
void m68040_do_fsave(m68ki_cpu_core *state, uint32 addr, int reg, int inc)
|
||||
{
|
||||
if (m68ki_cpu.fpu_just_reset)
|
||||
{
|
||||
@@ -2215,13 +2216,13 @@ void m68040_do_fsave(uint32 addr, int reg, int inc)
|
||||
else
|
||||
{
|
||||
// we normally generate an IDLE frame
|
||||
int delta = perform_fsave(addr, inc);
|
||||
int delta = perform_fsave(state, addr, inc);
|
||||
if(reg != -1)
|
||||
REG_A[reg] += delta;
|
||||
}
|
||||
}
|
||||
|
||||
void m68040_do_frestore(uint32 addr, int reg)
|
||||
void m68040_do_frestore(m68ki_cpu_core *state, uint32 addr, int reg)
|
||||
{
|
||||
uint32 temp = m68ki_read_32(addr);
|
||||
// check for nullptr frame
|
||||
@@ -2254,11 +2255,11 @@ void m68040_do_frestore(uint32 addr, int reg)
|
||||
}
|
||||
else
|
||||
{
|
||||
do_frestore_null();
|
||||
do_frestore_null(state);
|
||||
}
|
||||
}
|
||||
|
||||
void m68040_fpu_op1()
|
||||
void m68040_fpu_op1(m68ki_cpu_core *state)
|
||||
{
|
||||
int ea = REG_IR & 0x3f;
|
||||
int mode = (ea >> 3) & 0x7;
|
||||
@@ -2273,27 +2274,27 @@ void m68040_fpu_op1()
|
||||
{
|
||||
case 2: // (An)
|
||||
addr = REG_A[reg];
|
||||
m68040_do_fsave(addr, -1, 1);
|
||||
m68040_do_fsave(state, addr, -1, 1);
|
||||
break;
|
||||
|
||||
case 3: // (An)+
|
||||
addr = EA_AY_PI_32();
|
||||
printf("FSAVE mode %d, reg A%d=0x%08x\n",mode,reg,REG_A[reg]);
|
||||
m68040_do_fsave(addr, -1, 1); // FIXME: -1 was reg
|
||||
m68040_do_fsave(state, addr, -1, 1); // FIXME: -1 was reg
|
||||
break;
|
||||
|
||||
case 4: // -(An)
|
||||
addr = EA_AY_PD_32();
|
||||
m68040_do_fsave(addr, reg, 0); // FIXME: -1 was reg
|
||||
m68040_do_fsave(state, addr, reg, 0); // FIXME: -1 was reg
|
||||
break;
|
||||
case 5: // (D16, An)
|
||||
addr = EA_AY_DI_16();
|
||||
m68040_do_fsave(addr, -1, 1);
|
||||
m68040_do_fsave(state, addr, -1, 1);
|
||||
break;
|
||||
|
||||
case 6: // (An) + (Xn) + d8
|
||||
addr = EA_AY_IX_16();
|
||||
m68040_do_fsave(addr, -1, 1);
|
||||
m68040_do_fsave(state, addr, -1, 1);
|
||||
break;
|
||||
|
||||
case 7: //
|
||||
@@ -2303,13 +2304,13 @@ void m68040_fpu_op1()
|
||||
case 1: // (abs32)
|
||||
{
|
||||
addr = EA_AL_32();
|
||||
m68040_do_fsave(addr, -1, 1);
|
||||
m68040_do_fsave(state, addr, -1, 1);
|
||||
break;
|
||||
}
|
||||
case 2: // (d16, PC)
|
||||
{
|
||||
addr = EA_PCDI_16();
|
||||
m68040_do_fsave(addr, -1, 1);
|
||||
m68040_do_fsave(state, addr, -1, 1);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@@ -2330,22 +2331,22 @@ void m68040_fpu_op1()
|
||||
{
|
||||
case 2: // (An)
|
||||
addr = REG_A[reg];
|
||||
m68040_do_frestore(addr, -1);
|
||||
m68040_do_frestore(state, addr, -1);
|
||||
break;
|
||||
|
||||
case 3: // (An)+
|
||||
addr = EA_AY_PI_32();
|
||||
m68040_do_frestore(addr, reg);
|
||||
m68040_do_frestore(state, addr, reg);
|
||||
break;
|
||||
|
||||
case 5: // (D16, An)
|
||||
addr = EA_AY_DI_16();
|
||||
m68040_do_frestore(addr, -1);
|
||||
m68040_do_frestore(state, addr, -1);
|
||||
break;
|
||||
|
||||
case 6: // (An) + (Xn) + d8
|
||||
addr = EA_AY_IX_16();
|
||||
m68040_do_frestore(addr, -1);
|
||||
m68040_do_frestore(state, addr, -1);
|
||||
break;
|
||||
|
||||
case 7: //
|
||||
@@ -2355,13 +2356,13 @@ void m68040_fpu_op1()
|
||||
case 1: // (abs32)
|
||||
{
|
||||
addr = EA_AL_32();
|
||||
m68040_do_frestore(addr, -1);
|
||||
m68040_do_frestore(state, addr, -1);
|
||||
break;
|
||||
}
|
||||
case 2: // (d16, PC)
|
||||
{
|
||||
addr = EA_PCDI_16();
|
||||
m68040_do_frestore(addr, -1);
|
||||
m68040_do_frestore(state, addr, -1);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@@ -2380,9 +2381,9 @@ void m68040_fpu_op1()
|
||||
}
|
||||
}
|
||||
|
||||
void m68881_ftrap()
|
||||
void m68881_ftrap(m68ki_cpu_core *state)
|
||||
{
|
||||
uint16 w2 = OPER_I_16();
|
||||
uint16 w2 = OPER_I_16(state);
|
||||
|
||||
// now check the condition
|
||||
if (TEST_CONDITION(w2 & 0x3f))
|
||||
@@ -2395,11 +2396,11 @@ void m68881_ftrap()
|
||||
switch (REG_IR & 0x7)
|
||||
{
|
||||
case 2: // word operand
|
||||
OPER_I_16();
|
||||
OPER_I_16(state);
|
||||
break;
|
||||
|
||||
case 3: // long word operand
|
||||
OPER_I_32();
|
||||
OPER_I_32(state);
|
||||
break;
|
||||
|
||||
case 4: // no operand
|
||||
|
||||
@@ -880,11 +880,11 @@ void generate_opcode_handler(FILE* filep, body_struct* body, replace_struct* rep
|
||||
add_replace_string(replace, ID_OPHANDLER_EA_AY_16, str);
|
||||
sprintf(str, "EA_%s_32()", g_ea_info_table[ea_mode].ea_add);
|
||||
add_replace_string(replace, ID_OPHANDLER_EA_AY_32, str);
|
||||
sprintf(str, "OPER_%s_8()", g_ea_info_table[ea_mode].ea_add);
|
||||
sprintf(str, "OPER_%s_8(state)", g_ea_info_table[ea_mode].ea_add);
|
||||
add_replace_string(replace, ID_OPHANDLER_OPER_AY_8, str);
|
||||
sprintf(str, "OPER_%s_16()", g_ea_info_table[ea_mode].ea_add);
|
||||
sprintf(str, "OPER_%s_16(state)", g_ea_info_table[ea_mode].ea_add);
|
||||
add_replace_string(replace, ID_OPHANDLER_OPER_AY_16, str);
|
||||
sprintf(str, "OPER_%s_32()", g_ea_info_table[ea_mode].ea_add);
|
||||
sprintf(str, "OPER_%s_32(state)", g_ea_info_table[ea_mode].ea_add);
|
||||
add_replace_string(replace, ID_OPHANDLER_OPER_AY_32, str);
|
||||
}
|
||||
|
||||
|
||||
165
m68kmmu.h
165
m68kmmu.h
@@ -9,6 +9,9 @@
|
||||
|
||||
// MMU status register bit definitions
|
||||
|
||||
|
||||
|
||||
struct m68ki_cpu_core;
|
||||
#if 0
|
||||
#define MMULOG(A) printf A
|
||||
#else
|
||||
@@ -61,7 +64,7 @@
|
||||
#define m_side_effects_disabled 0
|
||||
|
||||
/* decodes the effective address */
|
||||
uint32 DECODE_EA_32(int ea)
|
||||
uint32 DECODE_EA_32(m68ki_cpu_core *state, int ea)
|
||||
{
|
||||
int mode = (ea >> 3) & 0x7;
|
||||
int reg = (ea & 0x7);
|
||||
@@ -93,13 +96,13 @@ uint32 DECODE_EA_32(int ea)
|
||||
{
|
||||
case 0: // (xxx).W
|
||||
{
|
||||
uint32 ea = OPER_I_16();
|
||||
uint32 ea = OPER_I_16(state);
|
||||
return ea;
|
||||
}
|
||||
case 1: // (xxx).L
|
||||
{
|
||||
uint32 d1 = OPER_I_16();
|
||||
uint32 d2 = OPER_I_16();
|
||||
uint32 d1 = OPER_I_16(state);
|
||||
uint32 d2 = OPER_I_16(state);
|
||||
uint32 ea = (d1 << 16) | d2;
|
||||
return ea;
|
||||
}
|
||||
@@ -117,7 +120,7 @@ uint32 DECODE_EA_32(int ea)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void pmmu_set_buserror(uint32 addr_in)
|
||||
void pmmu_set_buserror(m68ki_cpu_core *state, uint32 addr_in)
|
||||
{
|
||||
if (!m_side_effects_disabled && ++m68ki_cpu.mmu_tmp_buserror_occurred == 1)
|
||||
{
|
||||
@@ -130,7 +133,7 @@ void pmmu_set_buserror(uint32 addr_in)
|
||||
|
||||
|
||||
// pmmu_atc_add: adds this address to the ATC
|
||||
void pmmu_atc_add(uint32 logical, uint32 physical, int fc, int rw)
|
||||
void pmmu_atc_add(m68ki_cpu_core *state, uint32 logical, uint32 physical, int fc, int rw)
|
||||
{
|
||||
// get page size (i.e. # of bits to ignore); is 10 for Apollo
|
||||
int ps = (m68ki_cpu.mmu_tc >> 20) & 0xf;
|
||||
@@ -195,7 +198,7 @@ void pmmu_atc_add(uint32 logical, uint32 physical, int fc, int rw)
|
||||
|
||||
// pmmu_atc_flush: flush entire ATC
|
||||
// 7fff0003 001ffd10 80f05750 is what should load
|
||||
void pmmu_atc_flush()
|
||||
void pmmu_atc_flush(m68ki_cpu_core *state)
|
||||
{
|
||||
MMULOG(("ATC flush: pc=%08x\n", m68ki_cpu.ppc));
|
||||
// std::fill(std::begin(m68ki_cpu.mmu_atc_tag), std::end(m68ki_cpu.mmu_atc_tag), 0);
|
||||
@@ -206,7 +209,7 @@ void pmmu_atc_flush()
|
||||
|
||||
int fc_from_modes(uint16 modes);
|
||||
|
||||
void pmmu_atc_flush_fc_ea(uint16 modes)
|
||||
void pmmu_atc_flush_fc_ea(m68ki_cpu_core *state, uint16 modes)
|
||||
{
|
||||
unsigned int fcmask = (modes >> 5) & 7;
|
||||
unsigned int fc = fc_from_modes(modes) & fcmask;
|
||||
@@ -218,7 +221,7 @@ void pmmu_atc_flush_fc_ea(uint16 modes)
|
||||
{
|
||||
case 1: // PFLUSHA
|
||||
MMULOG(("PFLUSHA: mode %d\n", mode));
|
||||
pmmu_atc_flush();
|
||||
pmmu_atc_flush(state);
|
||||
break;
|
||||
|
||||
case 4: // flush by fc
|
||||
@@ -236,7 +239,7 @@ void pmmu_atc_flush_fc_ea(uint16 modes)
|
||||
|
||||
case 6: // flush by fc + ea
|
||||
|
||||
ea = DECODE_EA_32(m68ki_cpu.ir);
|
||||
ea = DECODE_EA_32(state, m68ki_cpu.ir);
|
||||
MMULOG(("flush by fc/ea: fc %d, mask %d, ea %08x\n", fc, fcmask, ea));
|
||||
for(unsigned int i=0,e;i<MMU_ATC_ENTRIES;i++)
|
||||
{
|
||||
@@ -259,8 +262,7 @@ void pmmu_atc_flush_fc_ea(uint16 modes)
|
||||
}
|
||||
|
||||
//template<bool ptest>
|
||||
uint16 pmmu_atc_lookup(uint32 addr_in, int fc, uint16 rw,
|
||||
uint32 *addr_out,int ptest)
|
||||
uint16 pmmu_atc_lookup(m68ki_cpu_core *state, uint32 addr_in, int fc, uint16 rw, uint32 *addr_out, int ptest)
|
||||
{
|
||||
MMULOG(("%s: LOOKUP addr_in=%08x, fc=%d, ptest=%d, rw=%d\n", __func__, addr_in, fc, ptest,rw));
|
||||
unsigned int ps = (m68ki_cpu.mmu_tc >> 20) & 0xf;
|
||||
@@ -318,7 +320,7 @@ uint16 pmmu_atc_lookup(uint32 addr_in, int fc, uint16 rw,
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint16 pmmu_match_tt(uint32 addr_in, int fc, uint32 tt, uint16 rw)
|
||||
uint16 pmmu_match_tt(m68ki_cpu_core *state, uint32 addr_in, int fc, uint32 tt, uint16 rw)
|
||||
{
|
||||
if (!(tt & M68K_MMU_TT_ENABLE))
|
||||
{
|
||||
@@ -352,7 +354,7 @@ uint16 pmmu_match_tt(uint32 addr_in, int fc, uint32 tt, uint16 rw)
|
||||
return 1;
|
||||
}
|
||||
|
||||
void update_descriptor(uint32 tptr, int type, uint32 entry, int16 rw)
|
||||
void update_descriptor(m68ki_cpu_core *state, uint32 tptr, int type, uint32 entry, int16 rw)
|
||||
{
|
||||
if (type == M68K_MMU_DF_DT_PAGE && !rw &&
|
||||
!(entry & M68K_MMU_DF_MODIFIED) &&
|
||||
@@ -370,7 +372,7 @@ void update_descriptor(uint32 tptr, int type, uint32 entry, int16 rw)
|
||||
|
||||
|
||||
//template<bool _long>
|
||||
void update_sr(int type, uint32 tbl_entry, int fc,uint16 _long)
|
||||
void update_sr(m68ki_cpu_core *state, int type, uint32 tbl_entry, int fc, uint16 _long)
|
||||
{
|
||||
if (m_side_effects_disabled)
|
||||
{
|
||||
@@ -411,8 +413,8 @@ void update_sr(int type, uint32 tbl_entry, int fc,uint16 _long)
|
||||
}
|
||||
|
||||
//template<bool ptest>
|
||||
uint16 pmmu_walk_tables(uint32 addr_in, int type, uint32 table, uint8 fc,
|
||||
int limit, uint16 rw, uint32 *addr_out, int ptest)
|
||||
uint16 pmmu_walk_tables(m68ki_cpu_core *state, uint32 addr_in, int type, uint32 table, uint8 fc, int limit, uint16 rw,
|
||||
uint32 *addr_out, int ptest)
|
||||
{
|
||||
int level = 0;
|
||||
uint32 bits = m68ki_cpu.mmu_tc & 0xffff;
|
||||
@@ -478,10 +480,10 @@ uint16 pmmu_walk_tables(uint32 addr_in, int type, uint32 table, uint8 fc,
|
||||
table = tbl_entry & M68K_MMU_DF_ADDR_MASK;
|
||||
if (!m_side_effects_disabled)
|
||||
{
|
||||
update_sr(type, tbl_entry, fc,0);
|
||||
update_sr(state, type, tbl_entry, fc, 0);
|
||||
if (!ptest)
|
||||
{
|
||||
update_descriptor(*addr_out, type, tbl_entry, rw);
|
||||
update_descriptor(state, *addr_out, type, tbl_entry, rw);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -507,10 +509,10 @@ uint16 pmmu_walk_tables(uint32 addr_in, int type, uint32 table, uint8 fc,
|
||||
table = tbl_entry2 & M68K_MMU_DF_ADDR_MASK;
|
||||
if (!m_side_effects_disabled)
|
||||
{
|
||||
update_sr(type, tbl_entry, fc,1);
|
||||
update_sr(state, type, tbl_entry, fc, 1);
|
||||
if (!ptest)
|
||||
{
|
||||
update_descriptor(*addr_out, type, tbl_entry, rw);
|
||||
update_descriptor(state, *addr_out, type, tbl_entry, rw);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -552,7 +554,8 @@ uint16 pmmu_walk_tables(uint32 addr_in, int type, uint32 table, uint8 fc,
|
||||
|
||||
// pmmu_translate_addr_with_fc: perform 68851/68030-style PMMU address translation
|
||||
//template<bool ptest, bool pload>
|
||||
uint32 pmmu_translate_addr_with_fc(uint32 addr_in, uint8 fc, uint16 rw, int limit,int ptest,int pload)
|
||||
uint32 pmmu_translate_addr_with_fc(m68ki_cpu_core *state, uint32 addr_in, uint8 fc, uint16 rw, int limit, int ptest,
|
||||
int pload)
|
||||
{
|
||||
uint32 addr_out = 0;
|
||||
|
||||
@@ -563,8 +566,8 @@ uint32 pmmu_translate_addr_with_fc(uint32 addr_in, uint8 fc, uint16 rw, int limi
|
||||
|
||||
m68ki_cpu.mmu_last_logical_addr = addr_in;
|
||||
|
||||
if (pmmu_match_tt(addr_in, fc, m68ki_cpu.mmu_tt0, rw) ||
|
||||
pmmu_match_tt(addr_in, fc, m68ki_cpu.mmu_tt1, rw) ||
|
||||
if (pmmu_match_tt(state, addr_in, fc, m68ki_cpu.mmu_tt0, rw) ||
|
||||
pmmu_match_tt(state, addr_in, fc, m68ki_cpu.mmu_tt1, rw) ||
|
||||
fc == 7)
|
||||
{
|
||||
return addr_in;
|
||||
@@ -572,17 +575,17 @@ uint32 pmmu_translate_addr_with_fc(uint32 addr_in, uint8 fc, uint16 rw, int limi
|
||||
|
||||
if (ptest && limit == 0)
|
||||
{
|
||||
pmmu_atc_lookup(addr_in, fc, rw, &addr_out, 1);
|
||||
pmmu_atc_lookup(state, addr_in, fc, rw, &addr_out, 1);
|
||||
return addr_out;
|
||||
}
|
||||
|
||||
if (!ptest && !pload && pmmu_atc_lookup(addr_in, fc, rw, &addr_out, 0))
|
||||
if (!ptest && !pload && pmmu_atc_lookup(state, addr_in, fc, rw, &addr_out, 0))
|
||||
{
|
||||
if ((m68ki_cpu.mmu_tmp_sr & M68K_MMU_SR_BUS_ERROR) || (!rw && (m68ki_cpu.mmu_tmp_sr & M68K_MMU_SR_WRITE_PROTECT)))
|
||||
{
|
||||
MMULOG(("set atc hit buserror: addr_in=%08x, addr_out=%x, rw=%x, fc=%d, sz=%d\n",
|
||||
addr_in, addr_out, m68ki_cpu.mmu_tmp_rw, m68ki_cpu.mmu_tmp_fc, m68ki_cpu.mmu_tmp_sz));
|
||||
pmmu_set_buserror(addr_in);
|
||||
pmmu_set_buserror(state, addr_in);
|
||||
}
|
||||
return addr_out;
|
||||
}
|
||||
@@ -601,7 +604,7 @@ uint32 pmmu_translate_addr_with_fc(uint32 addr_in, uint8 fc, uint16 rw, int limi
|
||||
type = m68ki_cpu.mmu_crp_limit & M68K_MMU_DF_DT;
|
||||
}
|
||||
|
||||
if (!pmmu_walk_tables(addr_in, type, tbl_addr, fc, limit, rw, &addr_out, ptest))
|
||||
if (!pmmu_walk_tables(state, addr_in, type, tbl_addr, fc, limit, rw, &addr_out, ptest))
|
||||
{
|
||||
MMULOG(("%s: addr_in=%08x, type=%x, tbl_addr=%x, fc=%d, limit=%x, rw=%x, addr_out=%x, ptest=%d\n",
|
||||
__func__, addr_in, type, tbl_addr, fc, limit, rw, addr_out, ptest));
|
||||
@@ -620,7 +623,7 @@ uint32 pmmu_translate_addr_with_fc(uint32 addr_in, uint8 fc, uint16 rw, int limi
|
||||
if (!pload)
|
||||
{
|
||||
MMULOG(("%s: set buserror (SR %04X)\n", __func__, m68ki_cpu.mmu_tmp_sr));
|
||||
pmmu_set_buserror(addr_in);
|
||||
pmmu_set_buserror(state, addr_in);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -629,7 +632,7 @@ uint32 pmmu_translate_addr_with_fc(uint32 addr_in, uint8 fc, uint16 rw, int limi
|
||||
// between RW and the root type
|
||||
if (!m_side_effects_disabled)
|
||||
{
|
||||
pmmu_atc_add(addr_in, addr_out, fc, rw && type != 1);
|
||||
pmmu_atc_add(state, addr_in, addr_out, fc, rw && type != 1);
|
||||
}
|
||||
MMULOG(("PMMU: [%08x] => [%08x] (SR %04x)\n", addr_in, addr_out, m68ki_cpu.mmu_tmp_sr));
|
||||
return addr_out;
|
||||
@@ -637,7 +640,7 @@ uint32 pmmu_translate_addr_with_fc(uint32 addr_in, uint8 fc, uint16 rw, int limi
|
||||
|
||||
// FC bits: 2 = supervisor, 1 = program, 0 = data
|
||||
// the 68040 is a subset of the 68851 and 68030 PMMUs - the page table sizes are fixed, there is no early termination, etc, etc.
|
||||
uint32 pmmu_translate_addr_with_fc_040(uint32 addr_in, uint8 fc, uint8 ptest)
|
||||
uint32 pmmu_translate_addr_with_fc_040(m68ki_cpu_core *state, uint32 addr_in, uint8 fc, uint8 ptest)
|
||||
{
|
||||
uint32 addr_out, tt0, tt1;
|
||||
|
||||
@@ -675,7 +678,7 @@ uint32 pmmu_translate_addr_with_fc_040(uint32 addr_in, uint8 fc, uint8 ptest)
|
||||
MMULOG(("TT0 match on address %08x (TT0 = %08x, mask = %08x)\n", addr_in, tt0, mask));
|
||||
if ((tt0 & 4) && !m68ki_cpu.mmu_tmp_rw && !ptest) // write protect?
|
||||
{
|
||||
pmmu_set_buserror(addr_in);
|
||||
pmmu_set_buserror(state, addr_in);
|
||||
}
|
||||
|
||||
return addr_in;
|
||||
@@ -695,7 +698,7 @@ uint32 pmmu_translate_addr_with_fc_040(uint32 addr_in, uint8 fc, uint8 ptest)
|
||||
MMULOG(("TT1 match on address %08x (TT0 = %08x, mask = %08x)\n", addr_in, tt1, mask));
|
||||
if ((tt1 & 4) && !m68ki_cpu.mmu_tmp_rw && !ptest) // write protect?
|
||||
{
|
||||
pmmu_set_buserror(addr_in);
|
||||
pmmu_set_buserror(state, addr_in);
|
||||
}
|
||||
|
||||
return addr_in;
|
||||
@@ -760,7 +763,7 @@ uint32 pmmu_translate_addr_with_fc_040(uint32 addr_in, uint8 fc, uint8 ptest)
|
||||
// write protected by the root or pointer entries?
|
||||
if ((((root_entry & 4) && !m68ki_cpu.mmu_tmp_rw) || ((pointer_entry & 4) && !m68ki_cpu.mmu_tmp_rw)) && !ptest)
|
||||
{
|
||||
pmmu_set_buserror(addr_in);
|
||||
pmmu_set_buserror(state, addr_in);
|
||||
return addr_in;
|
||||
}
|
||||
|
||||
@@ -768,7 +771,7 @@ uint32 pmmu_translate_addr_with_fc_040(uint32 addr_in, uint8 fc, uint8 ptest)
|
||||
if (!(pointer_entry & 2) && !ptest)
|
||||
{
|
||||
logerror("Invalid pointer entry! PC=%x, addr=%x\n", m68ki_cpu.ppc, addr_in);
|
||||
pmmu_set_buserror(addr_in);
|
||||
pmmu_set_buserror(state, addr_in);
|
||||
return addr_in;
|
||||
}
|
||||
|
||||
@@ -780,7 +783,7 @@ uint32 pmmu_translate_addr_with_fc_040(uint32 addr_in, uint8 fc, uint8 ptest)
|
||||
|
||||
if (!ptest)
|
||||
{
|
||||
pmmu_set_buserror(addr_in);
|
||||
pmmu_set_buserror(state, addr_in);
|
||||
}
|
||||
|
||||
return addr_in;
|
||||
@@ -819,7 +822,7 @@ uint32 pmmu_translate_addr_with_fc_040(uint32 addr_in, uint8 fc, uint8 ptest)
|
||||
// is the page write protected or supervisor protected?
|
||||
if ((((page_entry & 4) && !m68ki_cpu.mmu_tmp_rw) || ((page_entry & 0x80) && !(fc & 4))) && !ptest)
|
||||
{
|
||||
pmmu_set_buserror(addr_in);
|
||||
pmmu_set_buserror(state, addr_in);
|
||||
return addr_in;
|
||||
}
|
||||
|
||||
@@ -829,7 +832,7 @@ uint32 pmmu_translate_addr_with_fc_040(uint32 addr_in, uint8 fc, uint8 ptest)
|
||||
MMULOG(("Invalid page entry! PC=%x, addr=%x\n", m68ki_cpu.ppc, addr_in));
|
||||
if (!ptest)
|
||||
{
|
||||
pmmu_set_buserror(addr_in);
|
||||
pmmu_set_buserror(state, addr_in);
|
||||
}
|
||||
|
||||
return addr_in;
|
||||
@@ -881,17 +884,17 @@ uint32 pmmu_translate_addr_with_fc_040(uint32 addr_in, uint8 fc, uint8 ptest)
|
||||
}
|
||||
|
||||
// pmmu_translate_addr: perform 68851/68030-style PMMU address translation
|
||||
uint32 pmmu_translate_addr(uint32 addr_in, uint16 rw)
|
||||
uint32 pmmu_translate_addr(m68ki_cpu_core *state, uint32 addr_in, uint16 rw)
|
||||
{
|
||||
uint32 addr_out;
|
||||
|
||||
if (CPU_TYPE_IS_040_PLUS(m68ki_cpu.cpu_type))
|
||||
{
|
||||
addr_out = pmmu_translate_addr_with_fc_040(addr_in, m68ki_cpu.mmu_tmp_fc, 0);
|
||||
addr_out = pmmu_translate_addr_with_fc_040(state, addr_in, m68ki_cpu.mmu_tmp_fc, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
addr_out = pmmu_translate_addr_with_fc(addr_in, m68ki_cpu.mmu_tmp_fc, rw,7,0,0);
|
||||
addr_out = pmmu_translate_addr_with_fc(state, addr_in, m68ki_cpu.mmu_tmp_fc, rw, 7, 0, 0);
|
||||
MMULOG(("ADDRIN %08X, ADDROUT %08X\n", addr_in, addr_out));
|
||||
}
|
||||
return addr_out;
|
||||
@@ -940,9 +943,9 @@ int fc_from_modes(uint16 modes)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void m68851_pload(uint32 ea, uint16 modes)
|
||||
void m68851_pload(m68ki_cpu_core *state, uint32 ea, uint16 modes)
|
||||
{
|
||||
uint32 ltmp = DECODE_EA_32(ea);
|
||||
uint32 ltmp = DECODE_EA_32(state, ea);
|
||||
int fc = fc_from_modes(modes);
|
||||
uint16 rw = !!(modes & 0x200);
|
||||
|
||||
@@ -953,11 +956,11 @@ void m68851_pload(uint32 ea, uint16 modes)
|
||||
{
|
||||
if (CPU_TYPE_IS_040_PLUS(m68ki_cpu.cpu_type))
|
||||
{
|
||||
pmmu_translate_addr_with_fc_040(ltmp, fc, 0);
|
||||
pmmu_translate_addr_with_fc_040(state, ltmp, fc, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
pmmu_translate_addr_with_fc(ltmp, fc, rw , 7, 0, 1);
|
||||
pmmu_translate_addr_with_fc(state, ltmp, fc, rw, 7, 0, 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -968,9 +971,9 @@ void m68851_pload(uint32 ea, uint16 modes)
|
||||
}
|
||||
}
|
||||
|
||||
void m68851_ptest(uint32 ea, uint16 modes)
|
||||
void m68851_ptest(m68ki_cpu_core *state, uint32 ea, uint16 modes)
|
||||
{
|
||||
uint32 v_addr = DECODE_EA_32(ea);
|
||||
uint32 v_addr = DECODE_EA_32(state, ea);
|
||||
uint32 p_addr;
|
||||
|
||||
int level = (modes >> 10) & 7;
|
||||
@@ -983,11 +986,11 @@ void m68851_ptest(uint32 ea, uint16 modes)
|
||||
|
||||
if (CPU_TYPE_IS_040_PLUS(m68ki_cpu.cpu_type))
|
||||
{
|
||||
p_addr = pmmu_translate_addr_with_fc_040(v_addr, fc, 1);
|
||||
p_addr = pmmu_translate_addr_with_fc_040(state, v_addr, fc, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
p_addr = pmmu_translate_addr_with_fc(v_addr, fc, rw, level, 1, 0);
|
||||
p_addr = pmmu_translate_addr_with_fc(state, v_addr, fc, rw, level, 1, 0);
|
||||
}
|
||||
|
||||
m68ki_cpu.mmu_sr = m68ki_cpu.mmu_tmp_sr;
|
||||
@@ -996,34 +999,34 @@ void m68851_ptest(uint32 ea, uint16 modes)
|
||||
if (modes & 0x100)
|
||||
{
|
||||
int areg = (modes >> 5) & 7;
|
||||
WRITE_EA_32(0x08 | areg, p_addr);
|
||||
WRITE_EA_32(state, 0x08 | areg, p_addr);
|
||||
}
|
||||
}
|
||||
|
||||
void m68851_pmove_get(uint32 ea, uint16 modes)
|
||||
void m68851_pmove_get(m68ki_cpu_core *state, uint32 ea, uint16 modes)
|
||||
{
|
||||
switch ((modes>>10) & 0x3f)
|
||||
{
|
||||
case 0x02: // transparent translation register 0
|
||||
WRITE_EA_32(ea, m68ki_cpu.mmu_tt0);
|
||||
WRITE_EA_32(state, ea, m68ki_cpu.mmu_tt0);
|
||||
MMULOG(("PMMU: pc=%x PMOVE from mmu_tt0=%08x\n", m68ki_cpu.ppc, m68ki_cpu.mmu_tt0));
|
||||
break;
|
||||
case 0x03: // transparent translation register 1
|
||||
WRITE_EA_32(ea, m68ki_cpu.mmu_tt1);
|
||||
WRITE_EA_32(state, ea, m68ki_cpu.mmu_tt1);
|
||||
MMULOG(("PMMU: pc=%x PMOVE from mmu_tt1=%08x\n", m68ki_cpu.ppc, m68ki_cpu.mmu_tt1));
|
||||
break;
|
||||
case 0x10: // translation control register
|
||||
WRITE_EA_32(ea, m68ki_cpu.mmu_tc);
|
||||
WRITE_EA_32(state, ea, m68ki_cpu.mmu_tc);
|
||||
MMULOG(("PMMU: pc=%x PMOVE from mmu_tc=%08x\n", m68ki_cpu.ppc, m68ki_cpu.mmu_tc));
|
||||
break;
|
||||
|
||||
case 0x12: // supervisor root pointer
|
||||
WRITE_EA_64(ea, (uint64)m68ki_cpu.mmu_srp_limit<<32 | (uint64)m68ki_cpu.mmu_srp_aptr);
|
||||
WRITE_EA_64(state, ea, (uint64)m68ki_cpu.mmu_srp_limit<<32 | (uint64)m68ki_cpu.mmu_srp_aptr);
|
||||
MMULOG(("PMMU: pc=%x PMOVE from SRP limit = %08x, aptr = %08x\n", m68ki_cpu.ppc, m68ki_cpu.mmu_srp_limit, m68ki_cpu.mmu_srp_aptr));
|
||||
break;
|
||||
|
||||
case 0x13: // CPU root pointer
|
||||
WRITE_EA_64(ea, (uint64)m68ki_cpu.mmu_crp_limit<<32 | (uint64)m68ki_cpu.mmu_crp_aptr);
|
||||
WRITE_EA_64(state, ea, (uint64)m68ki_cpu.mmu_crp_limit<<32 | (uint64)m68ki_cpu.mmu_crp_aptr);
|
||||
MMULOG(("PMMU: pc=%x PMOVE from CRP limit = %08x, aptr = %08x\n", m68ki_cpu.ppc, m68ki_cpu.mmu_crp_limit, m68ki_cpu.mmu_crp_aptr));
|
||||
break;
|
||||
|
||||
@@ -1034,19 +1037,19 @@ void m68851_pmove_get(uint32 ea, uint16 modes)
|
||||
|
||||
if (!(modes & 0x100)) // flush ATC on moves to TC, SRP, CRP, TT with FD bit clear
|
||||
{
|
||||
pmmu_atc_flush();
|
||||
pmmu_atc_flush(state);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void m68851_pmove_put(uint32 ea, uint16 modes)
|
||||
void m68851_pmove_put(m68ki_cpu_core *state, uint32 ea, uint16 modes)
|
||||
{
|
||||
uint64 temp64;
|
||||
switch ((modes>>13) & 7)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
uint32 temp = READ_EA_32(ea);
|
||||
uint32 temp = READ_EA_32(state, ea);
|
||||
|
||||
if (((modes >> 10) & 7) == 2)
|
||||
{
|
||||
@@ -1063,7 +1066,7 @@ void m68851_pmove_put(uint32 ea, uint16 modes)
|
||||
// FIXME: unreachable
|
||||
if (!(modes & 0x100))
|
||||
{
|
||||
pmmu_atc_flush();
|
||||
pmmu_atc_flush(state);
|
||||
}
|
||||
}
|
||||
/* fall through */
|
||||
@@ -1077,7 +1080,7 @@ void m68851_pmove_put(uint32 ea, uint16 modes)
|
||||
switch ((modes >> 10) & 7)
|
||||
{
|
||||
case 0: // translation control register
|
||||
m68ki_cpu.mmu_tc = READ_EA_32(ea);
|
||||
m68ki_cpu.mmu_tc = READ_EA_32(state, ea);
|
||||
MMULOG(("PMMU: TC = %08x\n", m68ki_cpu.mmu_tc));
|
||||
|
||||
if (m68ki_cpu.mmu_tc & 0x80000000)
|
||||
@@ -1106,12 +1109,12 @@ void m68851_pmove_put(uint32 ea, uint16 modes)
|
||||
|
||||
if (!(modes & 0x100)) // flush ATC on moves to TC, SRP, CRP with FD bit clear
|
||||
{
|
||||
pmmu_atc_flush();
|
||||
pmmu_atc_flush(state);
|
||||
}
|
||||
break;
|
||||
|
||||
case 2: // supervisor root pointer
|
||||
temp64 = READ_EA_64(ea);
|
||||
temp64 = READ_EA_64(state, ea);
|
||||
m68ki_cpu.mmu_srp_limit = (temp64 >> 32) & 0xffffffff;
|
||||
m68ki_cpu.mmu_srp_aptr = temp64 & 0xffffffff;
|
||||
MMULOG(("PMMU: SRP limit = %08x aptr = %08x\n", m68ki_cpu.mmu_srp_limit, m68ki_cpu.mmu_srp_aptr));
|
||||
@@ -1124,12 +1127,12 @@ void m68851_pmove_put(uint32 ea, uint16 modes)
|
||||
|
||||
if (!(modes & 0x100))
|
||||
{
|
||||
pmmu_atc_flush();
|
||||
pmmu_atc_flush(state);
|
||||
}
|
||||
break;
|
||||
|
||||
case 3: // CPU root pointer
|
||||
temp64 = READ_EA_64(ea);
|
||||
temp64 = READ_EA_64(state, ea);
|
||||
m68ki_cpu.mmu_crp_limit = (temp64 >> 32) & 0xffffffff;
|
||||
m68ki_cpu.mmu_crp_aptr = temp64 & 0xffffffff;
|
||||
MMULOG(("PMMU: CRP limit = %08x aptr = %08x\n", m68ki_cpu.mmu_crp_limit, m68ki_cpu.mmu_crp_aptr));
|
||||
@@ -1142,7 +1145,7 @@ void m68851_pmove_put(uint32 ea, uint16 modes)
|
||||
|
||||
if (!(modes & 0x100))
|
||||
{
|
||||
pmmu_atc_flush();
|
||||
pmmu_atc_flush(state);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1150,7 +1153,7 @@ void m68851_pmove_put(uint32 ea, uint16 modes)
|
||||
if (m68ki_cpu.cpu_type == CPU_TYPE_020)
|
||||
{
|
||||
// DomainOS on Apollo DN3000 will only reset this to 0
|
||||
uint16 mmu_ac = READ_EA_16(ea);
|
||||
uint16 mmu_ac = READ_EA_16(state, ea);
|
||||
if (mmu_ac != 0)
|
||||
{
|
||||
MMULOG(("680x0 PMMU: pc=%x PMOVE to mmu_ac=%08x\n",
|
||||
@@ -1168,7 +1171,7 @@ void m68851_pmove_put(uint32 ea, uint16 modes)
|
||||
break;
|
||||
case 3: // MMU status
|
||||
{
|
||||
uint32 temp = READ_EA_32(ea);
|
||||
uint32 temp = READ_EA_32(state, ea);
|
||||
logerror("680x0: unsupported PMOVE %x to MMU status, PC %x\n", temp, m68ki_cpu.pc);
|
||||
}
|
||||
break;
|
||||
@@ -1176,7 +1179,7 @@ void m68851_pmove_put(uint32 ea, uint16 modes)
|
||||
}
|
||||
|
||||
|
||||
void m68851_pmove(uint32 ea, uint16 modes)
|
||||
void m68851_pmove(m68ki_cpu_core *state, uint32 ea, uint16 modes)
|
||||
{
|
||||
switch ((modes>>13) & 0x7)
|
||||
{
|
||||
@@ -1184,23 +1187,23 @@ void m68851_pmove(uint32 ea, uint16 modes)
|
||||
case 2: // MC68851 form, FD never set
|
||||
if (modes & 0x200)
|
||||
{
|
||||
m68851_pmove_get(ea, modes);
|
||||
m68851_pmove_get(state, ea, modes);
|
||||
break;
|
||||
}
|
||||
else // top 3 bits of modes: 010 for this, 011 for status, 000 for transparent translation regs
|
||||
{
|
||||
m68851_pmove_put(ea, modes);
|
||||
m68851_pmove_put(state, ea, modes);
|
||||
break;
|
||||
}
|
||||
case 3: // MC68030 to/from status reg
|
||||
if (modes & 0x200)
|
||||
{
|
||||
MMULOG(("%s: read SR = %04x\n", __func__, m68ki_cpu.mmu_sr));
|
||||
WRITE_EA_16(ea, m68ki_cpu.mmu_sr);
|
||||
WRITE_EA_16(state, ea, m68ki_cpu.mmu_sr);
|
||||
}
|
||||
else
|
||||
{
|
||||
m68ki_cpu.mmu_sr = READ_EA_16(ea);
|
||||
m68ki_cpu.mmu_sr = READ_EA_16(state, ea);
|
||||
MMULOG(("%s: write SR = %04X\n", __func__, m68ki_cpu.mmu_sr));
|
||||
}
|
||||
break;
|
||||
@@ -1213,7 +1216,7 @@ void m68851_pmove(uint32 ea, uint16 modes)
|
||||
|
||||
}
|
||||
|
||||
void m68851_mmu_ops()
|
||||
void m68851_mmu_ops(m68ki_cpu_core *state)
|
||||
{
|
||||
uint16 modes;
|
||||
uint32 ea = m68ki_cpu.ir & 0x3f;
|
||||
@@ -1232,28 +1235,28 @@ void m68851_mmu_ops()
|
||||
else if ((m68ki_cpu.ir & 0xffe0) == 0xf500)
|
||||
{
|
||||
MMULOG(("68040 pflush: pc=%08x ir=%04x opmode=%d register=%d\n", REG_PC-4, m68ki_cpu.ir, (m68ki_cpu.ir >> 3) & 3, m68ki_cpu.ir & 7));
|
||||
pmmu_atc_flush();
|
||||
pmmu_atc_flush(state);
|
||||
}
|
||||
else // the rest are 1111000xxxXXXXXX where xxx is the instruction family
|
||||
{
|
||||
switch ((m68ki_cpu.ir>>9) & 0x7)
|
||||
{
|
||||
case 0:
|
||||
modes = OPER_I_16();
|
||||
modes = OPER_I_16(state);
|
||||
|
||||
if ((modes & 0xfde0) == 0x2000) // PLOAD
|
||||
{
|
||||
m68851_pload(ea, modes);
|
||||
m68851_pload(state, ea, modes);
|
||||
return;
|
||||
}
|
||||
else if ((modes & 0xe200) == 0x2000) // PFLUSH
|
||||
{
|
||||
pmmu_atc_flush_fc_ea(modes);
|
||||
pmmu_atc_flush_fc_ea(state, modes);
|
||||
return;
|
||||
}
|
||||
else if (modes == 0xa000) // PFLUSHR
|
||||
{
|
||||
pmmu_atc_flush();
|
||||
pmmu_atc_flush(state);
|
||||
return;
|
||||
}
|
||||
else if (modes == 0x2800) // PVALID (FORMAT 1)
|
||||
@@ -1268,12 +1271,12 @@ void m68851_mmu_ops()
|
||||
}
|
||||
else if ((modes & 0xe000) == 0x8000) // PTEST
|
||||
{
|
||||
m68851_ptest(ea, modes);
|
||||
m68851_ptest(state, ea, modes);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
m68851_pmove(ea, modes);
|
||||
m68851_pmove(state, ea, modes);
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user