|
|
1.1 ! root 1: /* ! 2: * UAE - The Un*x Amiga Emulator ! 3: * ! 4: * MC68000 emulation - machine dependent bits ! 5: * ! 6: * Copyright 1996 Bernd Schmidt ! 7: */ ! 8: ! 9: struct flag_struct { ! 10: unsigned int cznv; ! 11: unsigned int x; ! 12: }; ! 13: ! 14: #define FLAGVAL_Z 0x40 ! 15: #define FLAGVAL_N 0x80 ! 16: ! 17: #define SET_ZFLG(y) (regflags.cznv = (regflags.cznv & ~0x40) | (((y) & 1) << 6)) ! 18: #define SET_CFLG(y) (regflags.cznv = (regflags.cznv & ~1) | ((y) & 1)) ! 19: #define SET_VFLG(y) (regflags.cznv = (regflags.cznv & ~0x800) | (((y) & 1) << 11)) ! 20: #define SET_NFLG(y) (regflags.cznv = (regflags.cznv & ~0x80) | (((y) & 1) << 7)) ! 21: #define SET_XFLG(y) (regflags.x = (y)) ! 22: ! 23: #define GET_ZFLG ((regflags.cznv >> 6) & 1) ! 24: #define GET_CFLG (regflags.cznv & 1) ! 25: #define GET_VFLG ((regflags.cznv >> 11) & 1) ! 26: #define GET_NFLG ((regflags.cznv >> 7) & 1) ! 27: #define GET_XFLG (regflags.x & 1) ! 28: ! 29: #define CLEAR_CZNV (regflags.cznv = 0) ! 30: #define GET_CZNV (regflags.cznv) ! 31: #define IOR_CZNV(X) (regflags.cznv |= (X)) ! 32: #define SET_CZNV(X) (regflags.cznv = (X)) ! 33: ! 34: #define COPY_CARRY (regflags.x = regflags.cznv) ! 35: ! 36: ! 37: extern struct flag_struct regflags __asm__ ("regflags"); ! 38: ! 39: static __inline__ int cctrue(int cc) ! 40: { ! 41: uae_u32 cznv = regflags.cznv; ! 42: switch(cc){ ! 43: case 0: return 1; /* T */ ! 44: case 1: return 0; /* F */ ! 45: case 2: return (cznv & 0x41) == 0; /* !GET_CFLG && !GET_ZFLG; HI */ ! 46: case 3: return (cznv & 0x41) != 0; /* GET_CFLG || GET_ZFLG; LS */ ! 47: case 4: return (cznv & 1) == 0; /* !GET_CFLG; CC */ ! 48: case 5: return (cznv & 1) != 0; /* GET_CFLG; CS */ ! 49: case 6: return (cznv & 0x40) == 0; /* !GET_ZFLG; NE */ ! 50: case 7: return (cznv & 0x40) != 0; /* GET_ZFLG; EQ */ ! 51: case 8: return (cznv & 0x800) == 0;/* !GET_VFLG; VC */ ! 52: case 9: return (cznv & 0x800) != 0;/* GET_VFLG; VS */ ! 53: case 10:return (cznv & 0x80) == 0; /* !GET_NFLG; PL */ ! 54: case 11:return (cznv & 0x80) != 0; /* GET_NFLG; MI */ ! 55: case 12:return (((cznv << 4) ^ cznv) & 0x800) == 0; /* GET_NFLG == GET_VFLG; GE */ ! 56: case 13:return (((cznv << 4) ^ cznv) & 0x800) != 0;/* GET_NFLG != GET_VFLG; LT */ ! 57: case 14: ! 58: cznv &= 0x8c0; ! 59: return (((cznv << 4) ^ cznv) & 0x840) == 0; /* !GET_ZFLG && (GET_NFLG == GET_VFLG); GT */ ! 60: case 15: ! 61: cznv &= 0x8c0; ! 62: return (((cznv << 4) ^ cznv) & 0x840) != 0; /* GET_ZFLG || (GET_NFLG != GET_VFLG); LE */ ! 63: } ! 64: abort(); ! 65: return 0; ! 66: } ! 67: ! 68: #define optflag_testl(v) \ ! 69: __asm__ __volatile__ ("testl %1,%1\n\t" \ ! 70: "pushfl\n\t" \ ! 71: "popl %0\n\t" \ ! 72: : "=r" (regflags.cznv) : "r" (v) : "cc") ! 73: ! 74: #define optflag_testw(v) \ ! 75: __asm__ __volatile__ ("testw %w1,%w1\n\t" \ ! 76: "pushfl\n\t" \ ! 77: "popl %0\n\t" \ ! 78: : "=r" (regflags.cznv) : "r" (v) : "cc") ! 79: ! 80: #define optflag_testb(v) \ ! 81: __asm__ __volatile__ ("testb %b1,%b1\n\t" \ ! 82: "pushfl\n\t" \ ! 83: "popl %0\n\t" \ ! 84: : "=r" (regflags.cznv) : "q" (v) : "cc") ! 85: ! 86: #define optflag_addl(v, s, d) do { \ ! 87: __asm__ __volatile__ ("addl %k2,%k1\n\t" \ ! 88: "pushfl\n\t" \ ! 89: "popl %0\n\t" \ ! 90: : "=r" (regflags.cznv), "=r" (v) : "rmi" (s), "1" (d) : "cc"); \ ! 91: COPY_CARRY; \ ! 92: } while (0) ! 93: #define optflag_addw(v, s, d) do { \ ! 94: __asm__ __volatile__ ("addw %w2,%w1\n\t" \ ! 95: "pushfl\n\t" \ ! 96: "popl %0\n\t" \ ! 97: : "=r" (regflags.cznv), "=r" (v) : "rmi" (s), "1" (d) : "cc"); \ ! 98: COPY_CARRY; \ ! 99: } while (0) ! 100: ! 101: #define optflag_addb(v, s, d) do { \ ! 102: __asm__ __volatile__ ("addb %b2,%b1\n\t" \ ! 103: "pushfl\n\t" \ ! 104: "popl %0\n\t" \ ! 105: : "=r" (regflags.cznv), "=q" (v) : "qmi" (s), "1" (d) : "cc"); \ ! 106: COPY_CARRY; \ ! 107: } while (0) ! 108: ! 109: #define optflag_subl(v, s, d) do { \ ! 110: __asm__ __volatile__ ("subl %k2,%k1\n\t" \ ! 111: "pushfl\n\t" \ ! 112: "popl %0\n\t" \ ! 113: : "=r" (regflags.cznv), "=r" (v) : "rmi" (s), "1" (d) : "cc"); \ ! 114: COPY_CARRY; \ ! 115: } while (0) ! 116: ! 117: #define optflag_subw(v, s, d) do { \ ! 118: __asm__ __volatile__ ("subw %w2,%w1\n\t" \ ! 119: "pushfl\n\t" \ ! 120: "popl %0\n\t" \ ! 121: : "=r" (regflags.cznv), "=r" (v) : "rmi" (s), "1" (d) : "cc"); \ ! 122: COPY_CARRY; \ ! 123: } while (0) ! 124: ! 125: #define optflag_subb(v, s, d) do { \ ! 126: __asm__ __volatile__ ("subb %b2,%b1\n\t" \ ! 127: "pushfl\n\t" \ ! 128: "popl %0\n\t" \ ! 129: : "=r" (regflags.cznv), "=q" (v) : "qmi" (s), "1" (d) : "cc"); \ ! 130: COPY_CARRY; \ ! 131: } while (0) ! 132: ! 133: #define optflag_cmpl(s, d) \ ! 134: __asm__ __volatile__ ("cmpl %k1,%k2\n\t" \ ! 135: "pushfl\n\t" \ ! 136: "popl %0\n\t" \ ! 137: : "=r" (regflags.cznv) : "rmi" (s), "r" (d) : "cc") ! 138: ! 139: #define optflag_cmpw(s, d) \ ! 140: __asm__ __volatile__ ("cmpw %w1,%w2\n\t" \ ! 141: "pushfl\n\t" \ ! 142: "popl %0\n\t" \ ! 143: : "=r" (regflags.cznv) : "rmi" (s), "r" (d) : "cc") ! 144: ! 145: #define optflag_cmpb(s, d) \ ! 146: __asm__ __volatile__ ("cmpb %b1,%b2\n\t" \ ! 147: "pushfl\n\t" \ ! 148: "popl %0\n\t" \ ! 149: : "=r" (regflags.cznv) : "qmi" (s), "q" (d) : "cc") ! 150:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.