--- BasiliskII/src/uae_cpu/newcpu.h 1999/10/03 14:16:26 1.1 +++ BasiliskII/src/uae_cpu/newcpu.h 2002/11/02 18:13:27 1.12 @@ -6,42 +6,17 @@ * Copyright 1995 Bernd Schmidt */ -#define SPCFLAG_STOP 2 -#define SPCFLAG_DISK 4 -#define SPCFLAG_INT 8 -#define SPCFLAG_BRK 16 -#define SPCFLAG_EXTRA_CYCLES 32 -#define SPCFLAG_TRACE 64 -#define SPCFLAG_DOTRACE 128 -#define SPCFLAG_DOINT 256 -#define SPCFLAG_BLTNASTY 512 -#define SPCFLAG_EXEC 1024 -#define SPCFLAG_MODE_CHANGE 8192 - -#ifndef SET_CFLG - -#define SET_CFLG(x) (CFLG = (x)) -#define SET_NFLG(x) (NFLG = (x)) -#define SET_VFLG(x) (VFLG = (x)) -#define SET_ZFLG(x) (ZFLG = (x)) -#define SET_XFLG(x) (XFLG = (x)) - -#define GET_CFLG CFLG -#define GET_NFLG NFLG -#define GET_VFLG VFLG -#define GET_ZFLG ZFLG -#define GET_XFLG XFLG - -#define CLEAR_CZNV do { \ - SET_CFLG (0); \ - SET_ZFLG (0); \ - SET_NFLG (0); \ - SET_VFLG (0); \ -} while (0) +#ifndef NEWCPU_H +#define NEWCPU_H -#define COPY_CARRY (SET_XFLG (GET_CFLG)) +#ifndef FLIGHT_RECORDER +#define FLIGHT_RECORDER 0 #endif +#include "m68k.h" +#include "readcpu.h" +#include "spcflags.h" + extern int areg_byteinc[]; extern int imm8_table[]; @@ -49,56 +24,76 @@ extern int movem_index1[256]; extern int movem_index2[256]; extern int movem_next[256]; -extern int fpp_movem_index1[256]; -extern int fpp_movem_index2[256]; -extern int fpp_movem_next[256]; - extern int broken_in; -typedef unsigned long REGPARAM2 cpuop_func (uae_u32) REGPARAM; +#ifdef X86_ASSEMBLY +/* This hack seems to force all register saves (pushl %reg) to be moved to the + begining of the function, thus making it possible to cpuopti to remove them + since m68k_run_1 will save those registers before calling the instruction + handler */ +# define cpuop_tag(tag) __asm__ __volatile__ ( "#cpuop_" tag ) +#else +# define cpuop_tag(tag) ; +#endif + +#define cpuop_begin() do { cpuop_tag("begin"); } while (0) +#define cpuop_end() do { cpuop_tag("end"); } while (0) +typedef void REGPARAM2 cpuop_func (uae_u32) REGPARAM; + struct cputbl { cpuop_func *handler; - int specific; + uae_u16 specific; uae_u16 opcode; }; -extern unsigned long REGPARAM2 op_illg (uae_u32) REGPARAM; +extern cpuop_func *cpufunctbl[65536] ASM_SYM_FOR_FUNC ("cpufunctbl"); -typedef char flagtype; +#if USE_JIT +typedef void compop_func (uae_u32) REGPARAM; -extern struct regstruct -{ - uae_u32 regs[16]; - uaecptr usp,isp,msp; - uae_u16 sr; - flagtype t1; - flagtype t0; - flagtype s; - flagtype m; - flagtype x; - flagtype stopped; - int intmask; - - uae_u32 pc; - uae_u8 *pc_p; - uae_u8 *pc_oldp; +struct comptbl { + compop_func *handler; + uae_u32 specific; + uae_u32 opcode; +}; +#endif - uae_u32 vbr,sfc,dfc; +extern void REGPARAM2 op_illg (uae_u32) REGPARAM; + +typedef char flagtype; - double fp[8]; - uae_u32 fpcr,fpsr,fpiar; +struct regstruct { + uae_u32 regs[16]; - uae_u32 spcflags; - uae_u32 kick_mask; + uae_u32 pc; + uae_u8 * pc_p; + uae_u8 * pc_oldp; + + spcflags_t spcflags; + int intmask; + + uae_u32 vbr, sfc, dfc; + uaecptr usp, isp, msp; + uae_u16 sr; + flagtype t1; + flagtype t0; + flagtype s; + flagtype m; + flagtype x; + flagtype stopped; +#if USE_PREFETCH_BUFFER /* Fellow sources say this is 4 longwords. That's impossible. It needs * to be at least a longword. The HRM has some cryptic comment about two * instructions being on the same longword boundary. * The way this is implemented now seems like a good compromise. */ uae_u32 prefetch; -} regs, lastint_regs; +#endif +}; + +extern regstruct regs, lastint_regs; #define m68k_dreg(r,num) ((r).regs[(num)]) #define m68k_areg(r,num) (((r).regs + 8)[(num)]) @@ -113,6 +108,7 @@ extern struct regstruct #define GET_OPCODE (get_iword (0)) #endif +#if USE_PREFETCH_BUFFER static __inline__ uae_u32 get_ibyte_prefetch (uae_s32 o) { if (o > 3 || o < 0) @@ -135,11 +131,13 @@ static __inline__ uae_u32 get_ilong_pref return do_get_mem_long(®s.prefetch); return (do_get_mem_word (((uae_u16 *)®s.prefetch) + 1) << 16) | do_get_mem_word ((uae_u16 *)(regs.pc_p + 4)); } +#endif #define m68k_incpc(o) (regs.pc_p += (o)) static __inline__ void fill_prefetch_0 (void) { +#if USE_PREFETCH_BUFFER uae_u32 r; #ifdef UNALIGNED_PROFITABLE r = *(uae_u32 *)regs.pc_p; @@ -148,6 +146,7 @@ static __inline__ void fill_prefetch_0 ( r = do_get_mem_long ((uae_u32 *)regs.pc_p); do_put_mem_long (®s.prefetch, r); #endif +#endif } #if 0 @@ -185,41 +184,56 @@ static __inline__ uae_u32 next_ilong (vo return r; } -#if !defined USE_COMPILER static __inline__ void m68k_setpc (uaecptr newpc) { +#if REAL_ADDRESSING || DIRECT_ADDRESSING + regs.pc_p = get_real_address(newpc); +#else regs.pc_p = regs.pc_oldp = get_real_address(newpc); regs.pc = newpc; -} -#else -extern void m68k_setpc (uaecptr newpc); #endif +} static __inline__ uaecptr m68k_getpc (void) { +#if REAL_ADDRESSING || DIRECT_ADDRESSING + return get_virtual_address(regs.pc_p); +#else return regs.pc + ((char *)regs.pc_p - (char *)regs.pc_oldp); +#endif } -static __inline__ uaecptr m68k_getpc_p (uae_u8 *p) -{ - return regs.pc + ((char *)p - (char *)regs.pc_oldp); -} - -#ifdef USE_COMPILER -extern void m68k_setpc_fast (uaecptr newpc); -extern void m68k_setpc_bcc (uaecptr newpc); -extern void m68k_setpc_rte (uaecptr newpc); -#else #define m68k_setpc_fast m68k_setpc #define m68k_setpc_bcc m68k_setpc #define m68k_setpc_rte m68k_setpc -#endif + +static __inline__ void m68k_do_rts(void) +{ + m68k_setpc(get_long(m68k_areg(regs, 7))); + m68k_areg(regs, 7) += 4; +} + +static __inline__ void m68k_do_bsr(uaecptr oldpc, uae_s32 offset) +{ + m68k_areg(regs, 7) -= 4; + put_long(m68k_areg(regs, 7), oldpc); + m68k_incpc(offset); +} + +static __inline__ void m68k_do_jsr(uaecptr oldpc, uaecptr dest) +{ + m68k_areg(regs, 7) -= 4; + put_long(m68k_areg(regs, 7), oldpc); + m68k_setpc(dest); +} static __inline__ void m68k_setstopped (int stop) { regs.stopped = stop; - if (stop) - regs.spcflags |= SPCFLAG_STOP; + /* A traced STOP instruction drops through immediately without + actually stopping. */ + if (stop && (regs.spcflags & SPCFLAG_DOTRACE) == 0) + SPCFLAGS_SET( SPCFLAG_STOP ); } extern uae_u32 get_disp_ea_020 (uae_u32 base, uae_u32 dp); @@ -231,27 +245,22 @@ extern void MakeSR (void); extern void MakeFromSR (void); extern void Exception (int, uaecptr); extern void dump_counts (void); -extern void m68k_move2c (int, uae_u32 *); -extern void m68k_movec2 (int, uae_u32 *); +extern int m68k_move2c (int, uae_u32 *); +extern int m68k_movec2 (int, uae_u32 *); extern void m68k_divl (uae_u32, uae_u32, uae_u16, uaecptr); extern void m68k_mull (uae_u32, uae_u32, uae_u16); +extern void m68k_emulop (uae_u32); +extern void m68k_emulop_return (void); extern void init_m68k (void); -extern void m68k_go (int); +extern void exit_m68k (void); extern void m68k_dumpstate (uaecptr *); extern void m68k_disasm (uaecptr, uaecptr *, int); extern void m68k_reset (void); extern void m68k_enter_debugger(void); +extern int m68k_do_specialties(void); extern void mmu_op (uae_u32, uae_u16); -extern void fpp_opp (uae_u32, uae_u16); -extern void fdbcc_opp (uae_u32, uae_u16); -extern void fscc_opp (uae_u32, uae_u16); -extern void ftrapcc_opp (uae_u32,uaecptr); -extern void fbcc_opp (uae_u32, uaecptr, uae_u32); -extern void fsave_opp (uae_u32); -extern void frestore_opp (uae_u32); - /* Opcode of faulting instruction */ extern uae_u16 last_op_for_exception_3; /* PC at fault time */ @@ -262,15 +271,29 @@ extern uaecptr last_fault_for_exception_ #define CPU_OP_NAME(a) op ## a /* 68020 + 68881 */ -extern struct cputbl op_smalltbl_0[]; +extern struct cputbl op_smalltbl_0_ff[]; /* 68020 */ -extern struct cputbl op_smalltbl_1[]; +extern struct cputbl op_smalltbl_1_ff[]; /* 68010 */ -extern struct cputbl op_smalltbl_2[]; +extern struct cputbl op_smalltbl_2_ff[]; /* 68000 */ -extern struct cputbl op_smalltbl_3[]; +extern struct cputbl op_smalltbl_3_ff[]; /* 68000 slow but compatible. */ -extern struct cputbl op_smalltbl_4[]; - -extern cpuop_func *cpufunctbl[65536] ASM_SYM_FOR_FUNC ("cpufunctbl"); +extern struct cputbl op_smalltbl_4_ff[]; +#if FLIGHT_RECORDER +extern void m68k_record_step(uaecptr); +#endif +extern void m68k_do_execute(void); +extern void m68k_execute(void); +#if USE_JIT +#ifdef X86_ASSEMBLY +/* This is generated code */ +extern void (*m68k_compile_execute)(void); +#else +extern void m68k_do_compile_execute(void); +extern void m68k_compile_execute(void); +#endif +#endif + +#endif /* NEWCPU_H */