Annotation of uae/include/newcpu.h, revision 1.1.1.2

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);

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.