newcpu.h
1 /* 2 * UAE - The Un*x Amiga Emulator 3 * 4 * MC68000 emulation 5 * 6 * Copyright 1995 Bernd Schmidt 7 */ 8 9 #ifndef NEWCPU_H 10 #define NEWCPU_H 11 12 13 extern const int areg_byteinc[]; 14 extern const int imm8_table[]; 15 16 extern int broken_in; 17 18 typedef void cpuop_func(ULONG) REGPARAM; 19 20 struct cputbl { 21 cpuop_func *handler; 22 int specific; 23 UWORD opcode; 24 }; 25 26 27 extern cpuop_func *cpufunctbl[65536]; 28 extern void op_illg(ULONG) REGPARAM; 29 30 typedef char flagtype; 31 32 union flagu { 33 struct { 34 /* v must be at the start so that the x86 seto instruction 35 * changes the V flag. C must follow after V. */ 36 char v; 37 char c; 38 char n; 39 char z; 40 } flags; 41 ULONG longflags; 42 }; 43 44 extern struct regstruct 45 { 46 ULONG d[8]; 47 CPTR a[8],usp; 48 UWORD sr; 49 flagtype t; 50 flagtype s; 51 flagtype x; 52 flagtype stopped; 53 int intmask; 54 ULONG pc; 55 UWORD *pc_p; 56 UWORD *pc_oldp; 57 58 ULONG vbr,sfc,dfc; 59 } regs; 60 61 #ifdef INTEL_FLAG_OPT 62 extern union flagu intel_flag_lookup[256] __asm__ ("intel_flag_lookup"); 63 extern union flagu regflags __asm__ ("regflags"); 64 #else 65 extern union flagu regflags; 66 #endif 67 68 #define ZFLG (regflags.flags.z) 69 #define NFLG (regflags.flags.n) 70 #define CFLG (regflags.flags.c) 71 #define VFLG (regflags.flags.v) 72 73 //extern void emu_printi(int val); 74 //extern void emu_printf(char *); 75 76 extern void MC68000_oldstep(UWORD opcode); 77 78 extern UWORD *pc_pref; 79 extern int cnt; 80 static __inline__ UWORD nextiword(void) 81 { 82 //emu_printi((int)regs.pc); 83 //emu_printi(regs.pc + (regs.pc_p-pc_pref)*2); 84 //delay(1); 85 //regs.pc_p = get_real_address(regs.pc + (regs.pc_p-pc_pref)*2); 86 UWORD r = *regs.pc_p++; 87 //emu_printf("w:"); 88 //emu_printi(cnt++); 89 //emu_printi(r); 90 return r; 91 } 92 93 static __inline__ ULONG nextilong(void) 94 { 95 //emu_printi((int)regs.pc); 96 //regs.pc_p = get_real_address(regs.pc + (regs.pc_p-pc_pref)*2); 97 ULONG r = *regs.pc_p++; 98 //regs.pc_p = get_real_address(regs.pc + (regs.pc_p-pc_pref)*2); 99 r = (r << 16) + *regs.pc_p++; 100 //emu_printf("l:"); 101 //emu_printi(cnt++); 102 //emu_printi(r); 103 return r; 104 } 105 106 static __inline__ void m68k_setpc(CPTR newpc) 107 { 108 regs.pc = newpc; 109 regs.pc_p = regs.pc_oldp = get_real_address(newpc); 110 pc_pref = regs.pc_p; 111 //emu_printf("setpc"); 112 //emu_printi(regs.pc + (regs.pc_p-pc_pref)*2); 113 } 114 115 static __inline__ CPTR m68k_getpc(void) 116 { 117 return regs.pc + ((char *)regs.pc_p - (char *)regs.pc_oldp); 118 } 119 120 static __inline__ void m68k_setstopped(int stop) 121 { 122 regs.stopped = stop; 123 if (stop) 124 specialflags |= SPCFLAG_STOP; 125 } 126 127 static __inline__ int cctrue(const int cc) 128 { 129 switch(cc){ 130 case 0: return 1; /* T */ 131 case 1: return 0; /* F */ 132 case 2: return !CFLG && !ZFLG; /* HI */ 133 case 3: return CFLG || ZFLG; /* LS */ 134 case 4: return !CFLG; /* CC */ 135 case 5: return CFLG; /* CS */ 136 case 6: return !ZFLG; /* NE */ 137 case 7: return ZFLG; /* EQ */ 138 case 8: return !VFLG; /* VC */ 139 case 9: return VFLG; /* VS */ 140 case 10:return !NFLG; /* PL */ 141 case 11:return NFLG; /* MI */ 142 case 12:return NFLG == VFLG; /* GE */ 143 case 13:return NFLG != VFLG; /* LT */ 144 case 14:return !ZFLG && (NFLG == VFLG); /* GT */ 145 case 15:return ZFLG || (NFLG != VFLG); /* LE */ 146 } 147 abort(); 148 return 0; 149 } 150 151 #if CPU_LEVEL > 1 152 extern ULONG get_disp_ea (ULONG, UWORD); 153 154 #else 155 static __inline__ ULONG get_disp_ea (ULONG base, UWORD dp) 156 { 157 int reg = (dp >> 12) & 7; 158 LONG regd; 159 160 if (dp & 0x8000) 161 regd = regs.a[reg]; 162 else 163 regd = regs.d[reg]; 164 if (!(dp & 0x800)) 165 regd = (LONG)(WORD)regd; 166 return base + (BYTE)(dp) + regd; 167 } 168 #endif 169 170 extern void MakeSR(void); 171 extern void MakeFromSR(void); 172 extern void Exception(int); 173 extern void m68k_move2c(int, ULONG *); 174 extern void m68k_movec2(int, ULONG *); 175 extern void m68k_divl (UWORD, ULONG, UWORD); 176 extern void m68k_mull (UWORD, ULONG, UWORD); 177 extern void init_m68k (void); 178 extern void MC68000_step(void); 179 extern void MC68000_run(void); 180 extern void MC68000_skip(CPTR); 181 extern void MC68000_dumpstate(CPTR *); 182 extern void MC68000_disasm(CPTR,CPTR *,int); 183 extern void MC68000_reset(void); 184 185 #endif