/ MCUME_teensy / teensyuae / newcpu.h
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