|
|
1.1 ! root 1: /* ! 2: * UAE - The Un*x Amiga Emulator ! 3: * ! 4: * MC68000 emulation ! 5: * ! 6: * Copyright 1995 Bernd Schmidt ! 7: */ ! 8: ! 9: extern int areg_byteinc[]; ! 10: extern int imm8_table[]; ! 11: ! 12: extern int movem_index1[256]; ! 13: extern int movem_index2[256]; ! 14: extern int movem_next[256]; ! 15: ! 16: extern int fpp_movem_index1[256]; ! 17: extern int fpp_movem_index2[256]; ! 18: extern int fpp_movem_next[256]; ! 19: ! 20: extern int broken_in; ! 21: ! 22: typedef void cpuop_func(ULONG) REGPARAM; ! 23: ! 24: struct cputbl { ! 25: cpuop_func *handler; ! 26: int specific; ! 27: UWORD opcode; ! 28: }; ! 29: ! 30: extern struct cputbl smallcputbl[]; ! 31: ! 32: extern cpuop_func *cpufunctbl[65536]; ! 33: extern void op_illg(ULONG) REGPARAM; ! 34: ! 35: typedef char flagtype; ! 36: ! 37: /* Arrrghh.. */ ! 38: ! 39: #if defined(USE_COMPILER) && !defined(USE_POINTER) ! 40: #define USE_POINTER ! 41: #undef NEED_TO_DEBUG_BADLY ! 42: #endif ! 43: #if defined(NEED_TO_DEBUG_BADLY) && !defined(USE_POINTER) ! 44: #define USE_POINTER ! 45: #endif ! 46: ! 47: struct flag_struct { ! 48: unsigned int c:1; /* first byte */ ! 49: int :5; ! 50: unsigned int z:1; ! 51: unsigned int n:1; ! 52: int :3; ! 53: unsigned int v:1; /* second byte */ ! 54: int :4; ! 55: unsigned int x:1; /* third & fourth */ ! 56: int :15; ! 57: }; ! 58: ! 59: extern struct regstruct ! 60: { ! 61: ULONG d[8]; ! 62: CPTR a[8],usp,isp,msp; ! 63: UWORD sr; ! 64: flagtype t1; ! 65: flagtype t0; ! 66: flagtype s; ! 67: flagtype m; ! 68: flagtype x; ! 69: flagtype stopped; ! 70: int intmask; ! 71: ULONG pc; ! 72: #ifdef USE_POINTER ! 73: UBYTE *pc_p; ! 74: UBYTE *pc_oldp; ! 75: #endif ! 76: ! 77: ULONG vbr,sfc,dfc; ! 78: ! 79: double fp[8]; ! 80: ULONG fpcr,fpsr,fpiar; ! 81: ULONG spcflags; ! 82: } regs, lastint_regs; ! 83: ! 84: #ifdef INTEL_FLAG_OPT ! 85: extern struct flag_struct regflags __asm__ ("regflags"); ! 86: #else ! 87: extern struct flag_struct regflags; ! 88: #endif ! 89: ! 90: #define ZFLG (regflags.z) ! 91: #define NFLG (regflags.n) ! 92: #define CFLG (regflags.c) ! 93: #define VFLG (regflags.v) ! 94: #define XFLG (regflags.x) ! 95: ! 96: #ifdef USE_POINTER ! 97: static __inline__ UWORD nextiword(void) ! 98: { ! 99: UWORD r = (*(regs.pc_p) << 8) | (*(regs.pc_p + 1) << 0); ! 100: regs.pc_p += 2; ! 101: return r; ! 102: } ! 103: ! 104: static __inline__ ULONG nextilong(void) ! 105: { ! 106: ULONG r = (*regs.pc_p << 24) | (*(regs.pc_p + 1) << 16) | (*(regs.pc_p + 2) << 8) | (*(regs.pc_p + 3) << 0); ! 107: regs.pc_p += 4; ! 108: return r; ! 109: } ! 110: #else ! 111: ! 112: static __inline__ UWORD nextiword(void) ! 113: { ! 114: UWORD r = get_aword(regs.pc); ! 115: regs.pc += 2; ! 116: return r; ! 117: } ! 118: ! 119: static __inline__ ULONG nextilong(void) ! 120: { ! 121: ULONG r = get_along(regs.pc); ! 122: regs.pc += 4; ! 123: return r; ! 124: } ! 125: ! 126: #endif ! 127: ! 128: #ifdef USE_POINTER ! 129: ! 130: #if !defined(NEED_TO_DEBUG_BADLY) && !defined(USE_COMPILER) ! 131: static __inline__ void m68k_setpc(CPTR newpc) ! 132: { ! 133: regs.pc = newpc; ! 134: regs.pc_p = regs.pc_oldp = get_real_address(newpc); ! 135: } ! 136: #else ! 137: extern void m68k_setpc(CPTR newpc); ! 138: #endif ! 139: ! 140: static __inline__ CPTR m68k_getpc(void) ! 141: { ! 142: return regs.pc + ((char *)regs.pc_p - (char *)regs.pc_oldp); ! 143: } ! 144: ! 145: #else ! 146: ! 147: static __inline__ void m68k_setpc(CPTR newpc) ! 148: { ! 149: regs.pc = newpc; ! 150: } ! 151: ! 152: static __inline__ CPTR m68k_getpc(void) ! 153: { ! 154: return regs.pc; ! 155: } ! 156: #endif ! 157: ! 158: #ifdef USE_COMPILER ! 159: extern void m68k_setpc_fast(CPTR newpc); ! 160: extern void m68k_setpc_bcc(CPTR newpc); ! 161: extern void m68k_setpc_rte(CPTR newpc); ! 162: #else ! 163: #define m68k_setpc_fast m68k_setpc ! 164: #define m68k_setpc_bcc m68k_setpc ! 165: #define m68k_setpc_rte m68k_setpc ! 166: #endif ! 167: ! 168: static __inline__ void m68k_setstopped(int stop) ! 169: { ! 170: regs.stopped = stop; ! 171: if (stop) ! 172: regs.spcflags |= SPCFLAG_STOP; ! 173: } ! 174: ! 175: static __inline__ int cctrue(const int cc) ! 176: { ! 177: switch(cc){ ! 178: case 0: return 1; /* T */ ! 179: case 1: return 0; /* F */ ! 180: case 2: return !CFLG && !ZFLG; /* HI */ ! 181: case 3: return CFLG || ZFLG; /* LS */ ! 182: case 4: return !CFLG; /* CC */ ! 183: case 5: return CFLG; /* CS */ ! 184: case 6: return !ZFLG; /* NE */ ! 185: case 7: return ZFLG; /* EQ */ ! 186: case 8: return !VFLG; /* VC */ ! 187: case 9: return VFLG; /* VS */ ! 188: case 10:return !NFLG; /* PL */ ! 189: case 11:return NFLG; /* MI */ ! 190: case 12:return NFLG == VFLG; /* GE */ ! 191: case 13:return NFLG != VFLG; /* LT */ ! 192: case 14:return !ZFLG && (NFLG == VFLG); /* GT */ ! 193: case 15:return ZFLG || (NFLG != VFLG); /* LE */ ! 194: } ! 195: abort(); ! 196: return 0; ! 197: } ! 198: ! 199: #if CPU_LEVEL > 1 ! 200: static __inline__ ULONG get_disp_ea (ULONG base) ! 201: { ! 202: UWORD dp = nextiword(); ! 203: int reg = (dp >> 12) & 7; ! 204: LONG regd = dp & 0x8000 ? regs.a[reg] : regs.d[reg]; ! 205: if ((dp & 0x800) == 0) ! 206: regd = (LONG)(WORD)regd; ! 207: regd <<= (dp >> 9) & 3; ! 208: if (dp & 0x100) { ! 209: LONG outer = 0; ! 210: if (dp & 0x80) base = 0; ! 211: if (dp & 0x40) regd = 0; ! 212: ! 213: if ((dp & 0x30) == 0x20) base += (LONG)(WORD)nextiword(); ! 214: if ((dp & 0x30) == 0x30) base += nextilong(); ! 215: ! 216: if ((dp & 0x3) == 0x2) outer = (LONG)(WORD)nextiword(); ! 217: if ((dp & 0x3) == 0x3) outer = nextilong(); ! 218: ! 219: if ((dp & 0x4) == 0) base += regd; ! 220: if (dp & 0x3) base = get_long (base); ! 221: if (dp & 0x4) base += regd; ! 222: ! 223: return base + outer; ! 224: } else { ! 225: return base + (LONG)((BYTE)dp) + regd; ! 226: } ! 227: } ! 228: #else ! 229: static __inline__ ULONG get_disp_ea (ULONG base) ! 230: { ! 231: UWORD dp = nextiword(); ! 232: int reg = (dp >> 12) & 7; ! 233: LONG regd = dp & 0x8000 ? regs.a[reg] : regs.d[reg]; ! 234: if ((dp & 0x800) == 0) ! 235: regd = (LONG)(WORD)regd; ! 236: return base + (BYTE)(dp) + regd; ! 237: } ! 238: #endif ! 239: ! 240: extern void MakeSR(void); ! 241: extern void MakeFromSR(void); ! 242: extern void Exception(int, CPTR); ! 243: extern void dump_counts(void); ! 244: extern void m68k_move2c(int, ULONG *); ! 245: extern void m68k_movec2(int, ULONG *); ! 246: extern void m68k_divl (ULONG, ULONG, UWORD, CPTR); ! 247: extern void m68k_mull (ULONG, ULONG, UWORD); ! 248: extern void init_m68k (void); ! 249: extern void m68k_run(void); ! 250: extern void m68k_go(int); ! 251: extern void m68k_run_2(void); ! 252: extern void m68k_dumpstate(CPTR *); ! 253: extern void m68k_disasm(CPTR,CPTR *,int); ! 254: extern void m68k_reset(void); ! 255: extern void mmu_op (ULONG, UWORD); ! 256: extern void fpp_opp (ULONG, UWORD); ! 257: extern void fdbcc_opp (ULONG, UWORD); ! 258: extern void fscc_opp (ULONG, UWORD); ! 259: extern void ftrapcc_opp (ULONG,CPTR); ! 260: extern void fbcc_opp (ULONG, CPTR, ULONG); ! 261: extern void fsave_opp (ULONG); ! 262: extern void frestore_opp (ULONG); ! 263:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.