--- uae/src/include/newcpu.h 2018/04/24 16:38:39 1.1.1.1 +++ uae/src/include/newcpu.h 2018/04/24 16:39:23 1.1.1.2 @@ -18,6 +18,7 @@ extern int fpp_movem_index2[256]; extern int fpp_movem_next[256]; extern int broken_in; +extern int may_run_compiled; typedef void cpuop_func(ULONG) REGPARAM; @@ -27,12 +28,9 @@ struct cputbl { UWORD opcode; }; -extern struct cputbl smallcputbl[]; - -extern cpuop_func *cpufunctbl[65536]; extern void op_illg(ULONG) REGPARAM; -typedef char flagtype; +typedef char flagtype; /* Arrrghh.. */ @@ -44,22 +42,10 @@ typedef char flagtype; #define USE_POINTER #endif -struct flag_struct { - unsigned int c:1; /* first byte */ - int :5; - unsigned int z:1; - unsigned int n:1; - int :3; - unsigned int v:1; /* second byte */ - int :4; - unsigned int x:1; /* third & fourth */ - int :15; -}; - extern struct regstruct { - ULONG d[8]; - CPTR a[8],usp,isp,msp; + ULONG regs[16]; + CPTR usp,isp,msp; UWORD sr; flagtype t1; flagtype t0; @@ -78,40 +64,49 @@ extern struct regstruct double fp[8]; ULONG fpcr,fpsr,fpiar; +#ifdef USE_EXECLIB + volatile +#endif ULONG spcflags; + ULONG kick_mask; } regs, lastint_regs; -#ifdef INTEL_FLAG_OPT -extern struct flag_struct regflags __asm__ ("regflags"); -#else -extern struct flag_struct regflags; -#endif - -#define ZFLG (regflags.z) -#define NFLG (regflags.n) -#define CFLG (regflags.c) -#define VFLG (regflags.v) -#define XFLG (regflags.x) +#define m68k_dreg(r,num) ((r).regs[(num)]) +#define m68k_areg(r,num) ((r).regs[(num)+8]) #ifdef USE_POINTER -static __inline__ UWORD nextiword(void) +static __inline__ ULONG nextibyte(void) { - UWORD r = (*(regs.pc_p) << 8) | (*(regs.pc_p + 1) << 0); + ULONG r = do_get_mem_byte(regs.pc_p+1); + regs.pc_p += 2; + return r; +} + +static __inline__ ULONG nextiword(void) +{ + ULONG r = do_get_mem_word((UWORD *)regs.pc_p); regs.pc_p += 2; return r; } static __inline__ ULONG nextilong(void) { - ULONG r = (*regs.pc_p << 24) | (*(regs.pc_p + 1) << 16) | (*(regs.pc_p + 2) << 8) | (*(regs.pc_p + 3) << 0); + ULONG r = do_get_mem_long((ULONG *)regs.pc_p); regs.pc_p += 4; return r; } #else -static __inline__ UWORD nextiword(void) +static __inline__ ULONG nextibyte(void) { - UWORD r = get_aword(regs.pc); + ULONG r = get_byte(regs.pc+1); + regs.pc += 2; + return r; +} + +static __inline__ ULONG nextiword(void) +{ + ULONG r = get_aword(regs.pc); regs.pc += 2; return r; } @@ -130,8 +125,13 @@ static __inline__ ULONG nextilong(void) #if !defined(NEED_TO_DEBUG_BADLY) && !defined(USE_COMPILER) static __inline__ void m68k_setpc(CPTR newpc) { - regs.pc = newpc; regs.pc_p = regs.pc_oldp = get_real_address(newpc); + regs.pc = newpc; +#if USER_PROGRAMS_BEHAVE > 0 + if ((newpc & 0xF80000) != regs.kick_mask) + regs.spcflags |= SPCFLAG_MODE_CHANGE; + regs.kick_mask = newpc & 0xF80000; +#endif } #else extern void m68k_setpc(CPTR newpc); @@ -172,36 +172,12 @@ static __inline__ void m68k_setstopped(i regs.spcflags |= SPCFLAG_STOP; } -static __inline__ int cctrue(const int cc) -{ - switch(cc){ - case 0: return 1; /* T */ - case 1: return 0; /* F */ - case 2: return !CFLG && !ZFLG; /* HI */ - case 3: return CFLG || ZFLG; /* LS */ - case 4: return !CFLG; /* CC */ - case 5: return CFLG; /* CS */ - case 6: return !ZFLG; /* NE */ - case 7: return ZFLG; /* EQ */ - case 8: return !VFLG; /* VC */ - case 9: return VFLG; /* VS */ - case 10:return !NFLG; /* PL */ - case 11:return NFLG; /* MI */ - case 12:return NFLG == VFLG; /* GE */ - case 13:return NFLG != VFLG; /* LT */ - case 14:return !ZFLG && (NFLG == VFLG); /* GT */ - case 15:return ZFLG || (NFLG != VFLG); /* LE */ - } - abort(); - return 0; -} - #if CPU_LEVEL > 1 static __inline__ ULONG get_disp_ea (ULONG base) { UWORD dp = nextiword(); - int reg = (dp >> 12) & 7; - LONG regd = dp & 0x8000 ? regs.a[reg] : regs.d[reg]; + int reg = (dp >> 12) & 15; + LONG regd = regs.regs[reg]; if ((dp & 0x800) == 0) regd = (LONG)(WORD)regd; regd <<= (dp >> 9) & 3; @@ -229,14 +205,16 @@ static __inline__ ULONG get_disp_ea (ULO static __inline__ ULONG get_disp_ea (ULONG base) { UWORD dp = nextiword(); - int reg = (dp >> 12) & 7; - LONG regd = dp & 0x8000 ? regs.a[reg] : regs.d[reg]; + int reg = (dp >> 12) & 15; + LONG regd = regs.regs[reg]; if ((dp & 0x800) == 0) regd = (LONG)(WORD)regd; return base + (BYTE)(dp) + regd; } #endif +extern LONG ShowEA(int reg, amodes mode, wordsizes size, char *buf); + extern void MakeSR(void); extern void MakeFromSR(void); extern void Exception(int, CPTR); @@ -246,13 +224,13 @@ extern void m68k_movec2(int, ULONG *); extern void m68k_divl (ULONG, ULONG, UWORD, CPTR); extern void m68k_mull (ULONG, ULONG, UWORD); extern void init_m68k (void); -extern void m68k_run(void); extern void m68k_go(int); -extern void m68k_run_2(void); extern void m68k_dumpstate(CPTR *); extern void m68k_disasm(CPTR,CPTR *,int); extern void m68k_reset(void); + extern void mmu_op (ULONG, UWORD); + extern void fpp_opp (ULONG, UWORD); extern void fdbcc_opp (ULONG, UWORD); extern void fscc_opp (ULONG, UWORD); @@ -261,3 +239,23 @@ extern void fbcc_opp (ULONG, CPTR, ULONG extern void fsave_opp (ULONG); extern void frestore_opp (ULONG); +#ifdef MEMFUNCS_DIRECT_REQUESTED +#define CPU_OP_NAME(a) op_direct ## a +#else +#define CPU_OP_NAME(a) op ## a +#endif + +extern struct cputbl op_smalltbl[]; +extern struct cputbl op_direct_smalltbl[]; + +#ifndef INTEL_FLAG_OPT +extern cpuop_func *cpufunctbl[65536]; +#if USER_PROGRAMS_BEHAVE > 0 +extern cpuop_func *cpufunctbl_behaved[65536]; +#endif +#else +extern cpuop_func *cpufunctbl[65536] __asm__ ("cpufunctbl"); +#if USER_PROGRAMS_BEHAVE > 0 +extern cpuop_func *cpufunctbl_behaved[65536] __asm__ ("cpufunctbl_behaved");; +#endif +#endif