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