--- hatari/src/uae-cpu/newcpu.c 2019/04/09 08:55:52 1.1.1.21 +++ hatari/src/uae-cpu/newcpu.c 2019/04/09 08:59:35 1.1.1.23 @@ -163,6 +163,7 @@ const char NewCpu_fileid[] = "Hatari new #include "debugui.h" #include "debugcpu.h" #include "68kDisass.h" +#include "stMemory.h" #ifdef HAVE_CAPSIMAGE #if CAPSIMAGE_VERSION == 5 @@ -391,9 +392,9 @@ struct regstruct regs; static long int m68kpc_offset; -#define get_ibyte_1(o) get_byte(regs.pc + (regs.pc_p - regs.pc_oldp) + (o) + 1) -#define get_iword_1(o) get_word(regs.pc + (regs.pc_p - regs.pc_oldp) + (o)) -#define get_ilong_1(o) get_long(regs.pc + (regs.pc_p - regs.pc_oldp) + (o)) +#define get_ibyte_1(o) STMemory_ReadByte(regs.pc + (regs.pc_p - regs.pc_oldp) + (o) + 1) +#define get_iword_1(o) STMemory_ReadWord(regs.pc + (regs.pc_p - regs.pc_oldp) + (o)) +#define get_ilong_1(o) STMemory_ReadLong(regs.pc + (regs.pc_p - regs.pc_oldp) + (o)) uae_s32 ShowEA (FILE *f, int reg, amodes mode, wordsizes size, char *buf) { @@ -1060,7 +1061,11 @@ void Exception(int nr, uaecptr oldpc, in else if ( get_long(regs.instruction_pc) == 0x13f88e21 ) /* 13f8 8e21 move.b $ffff8e21.w,$xxxxx (Tymewarp) */ put_byte ( get_long(regs.instruction_pc+4) , 0x00 ); /* dest content should not be changed to "ff" but keep its value "00" */ - fprintf(stderr,"Bus Error at address $%x, PC=$%x addr_e3=%x op_e3=%x\n", BusErrorAddress, currpc, get_long(m68k_areg(regs, 7)+10) , BusError_opcode); + if (M68000_IsVerboseBusError(currpc, BusErrorAddress)) { + Log_Printf(LOG_WARN, "Bus Error at address $%x, PC=$%x addr_e3=%x op_e3=%x\n", + BusErrorAddress, currpc, + get_long(m68k_areg(regs, 7) + 10), BusError_opcode); + } /* Check for double bus errors: */ if (regs.spcflags & SPCFLAG_BUSERROR) { @@ -1163,7 +1168,6 @@ static void Interrupt(int nr , int Pendi } -uae_u32 caar, cacr; static uae_u32 itt0, itt1, dtt0, dtt1, tc, mmusr, urp, srp; @@ -1210,7 +1214,7 @@ int m68k_move2c (int regno, uae_u32 *reg cacr_mask = 0x00003f1f; else if (currprefs.cpu_level == 4) // 68040 cacr_mask = 0x80008000; - cacr = *regp & cacr_mask; + regs.cacr = *regp & cacr_mask; } case 3: tc = *regp & 0xc000; break; /* Mask out fields that should be zero. */ @@ -1221,7 +1225,7 @@ int m68k_move2c (int regno, uae_u32 *reg case 0x800: regs.usp = *regp; break; case 0x801: regs.vbr = *regp; break; - case 0x802: caar = *regp; break; + case 0x802: regs.caar = *regp; break; case 0x803: regs.msp = *regp; if (regs.m == 1) m68k_areg(regs, 7) = regs.msp; break; case 0x804: regs.isp = *regp; if (regs.m == 0) m68k_areg(regs, 7) = regs.isp; break; case 0x805: mmusr = *regp; break; @@ -1244,7 +1248,7 @@ int m68k_movec2 (int regno, uae_u32 *reg switch (regno) { case 0: *regp = regs.sfc; break; case 1: *regp = regs.dfc; break; - case 2: *regp = cacr; break; + case 2: *regp = regs.cacr; break; case 3: *regp = tc; break; case 4: *regp = itt0; break; case 5: *regp = itt1; break; @@ -1252,7 +1256,7 @@ int m68k_movec2 (int regno, uae_u32 *reg case 7: *regp = dtt1; break; case 0x800: *regp = regs.usp; break; case 0x801: *regp = regs.vbr; break; - case 0x802: *regp = caar; break; + case 0x802: *regp = regs.caar; break; case 0x803: *regp = regs.m == 1 ? m68k_areg(regs, 7) : regs.msp; break; case 0x804: *regp = regs.m == 0 ? m68k_areg(regs, 7) : regs.isp; break; case 0x805: *regp = mmusr; break; @@ -1266,6 +1270,7 @@ int m68k_movec2 (int regno, uae_u32 *reg return 1; } +#if !defined(uae_s64) STATIC_INLINE int div_unsigned(uae_u32 src_hi, uae_u32 src_lo, uae_u32 ndiv, uae_u32 *quot, uae_u32 *rem) { @@ -1290,6 +1295,7 @@ div_unsigned(uae_u32 src_hi, uae_u32 src *rem = src_hi; return 0; } +#endif void m68k_divl (uae_u32 opcode, uae_u32 src, uae_u16 extra, uaecptr oldpc) { @@ -1412,6 +1418,7 @@ void m68k_divl (uae_u32 opcode, uae_u32 #endif } +#if !defined(uae_s64) STATIC_INLINE void mul_unsigned(uae_u32 src1, uae_u32 src2, uae_u32 *dst_hi, uae_u32 *dst_lo) { @@ -1430,6 +1437,7 @@ mul_unsigned(uae_u32 src1, uae_u32 src2, *dst_lo = lo; *dst_hi = r3; } +#endif void m68k_mull (uae_u32 opcode, uae_u32 src, uae_u16 extra) { @@ -1661,11 +1669,10 @@ static int do_specialties (void) Exception(2,0,M68000_EXC_SRC_CPU); } - if(regs.spcflags & SPCFLAG_EXTRA_CYCLES) { + if ( WaitStateCycles ) { /* Add some extra cycles to simulate a wait state */ - unset_special(SPCFLAG_EXTRA_CYCLES); - M68000_AddCycles(nWaitStateCycles); - nWaitStateCycles = 0; + M68000_AddCycles(WaitStateCycles); + WaitStateCycles = 0; } if (regs.spcflags & SPCFLAG_DOTRACE) { @@ -1816,11 +1823,11 @@ static void m68k_run_1 (void) #endif M68000_AddCyclesWithPairing(cycles); - if (regs.spcflags & SPCFLAG_EXTRA_CYCLES) { + + if ( WaitStateCycles ) { /* Add some extra cycles to simulate a wait state */ - unset_special(SPCFLAG_EXTRA_CYCLES); - M68000_AddCycles(nWaitStateCycles); - nWaitStateCycles = 0; + M68000_AddCycles(WaitStateCycles); + WaitStateCycles = 0; } /* We can have several interrupts at the same time before the next CPU instruction */ @@ -1843,7 +1850,7 @@ static void m68k_run_1 (void) /* Run DSP 56k code if necessary */ if (bDspEnabled) { - DSP_Run( Cycles_GetCounter(CYCLES_COUNTER_CPU) * 2); + DSP_Run( Cycles_GetCounter(CYCLES_COUNTER_CPU) * DSP_CPU_FREQ_RATIO); } } } @@ -1887,11 +1894,11 @@ static void m68k_run_2 (void) Cycles_SetCounter(CYCLES_COUNTER_CPU, 0); /* to measure the total number of cycles spent in the cpu */ M68000_AddCycles(cycles); - if (regs.spcflags & SPCFLAG_EXTRA_CYCLES) { + + if ( WaitStateCycles ) { /* Add some extra cycles to simulate a wait state */ - unset_special(SPCFLAG_EXTRA_CYCLES); - M68000_AddCycles(nWaitStateCycles); - nWaitStateCycles = 0; + M68000_AddCycles(WaitStateCycles); + WaitStateCycles = 0; } if ( PendingInterruptCount <= 0 ) @@ -1909,7 +1916,7 @@ static void m68k_run_2 (void) /* Run DSP 56k code if necessary */ if (bDspEnabled) { - DSP_Run( Cycles_GetCounter(CYCLES_COUNTER_CPU) ); + DSP_Run( Cycles_GetCounter(CYCLES_COUNTER_CPU) * DSP_CPU_FREQ_RATIO); } } }