|
|
1.1 ! root 1: /* ! 2: * UAE - The Un*x Amiga Emulator ! 3: * ! 4: * MC68000 emulation - machine dependent bits ! 5: * ! 6: * Copyright 1997 Bernd Schmidt ! 7: */ ! 8: ! 9: struct flag_struct { ! 10: unsigned int c:1; /* first byte */ ! 11: int :5; ! 12: unsigned int z:1; ! 13: unsigned int n:1; ! 14: int :3; /* second, third & fourth byte */ ! 15: unsigned int v:1; ! 16: int :20; ! 17: unsigned int x:1; /* fifth */ ! 18: int :31; ! 19: }; ! 20: ! 21: extern struct flag_struct regflags; ! 22: ! 23: #define ZFLG (regflags.z) ! 24: #define NFLG (regflags.n) ! 25: #define CFLG (regflags.c) ! 26: #define VFLG (regflags.v) ! 27: #define XFLG (regflags.x) ! 28: ! 29: static __inline__ int cctrue(const int cc) ! 30: { ! 31: switch(cc){ ! 32: case 0: return 1; /* T */ ! 33: case 1: return 0; /* F */ ! 34: case 2: return !CFLG && !ZFLG; /* HI */ ! 35: case 3: return CFLG || ZFLG; /* LS */ ! 36: case 4: return !CFLG; /* CC */ ! 37: case 5: return CFLG; /* CS */ ! 38: case 6: return !ZFLG; /* NE */ ! 39: case 7: return ZFLG; /* EQ */ ! 40: case 8: return !VFLG; /* VC */ ! 41: case 9: return VFLG; /* VS */ ! 42: case 10:return !NFLG; /* PL */ ! 43: case 11:return NFLG; /* MI */ ! 44: case 12:return NFLG == VFLG; /* GE */ ! 45: case 13:return NFLG != VFLG; /* LT */ ! 46: case 14:return !ZFLG && (NFLG == VFLG); /* GT */ ! 47: case 15:return ZFLG || (NFLG != VFLG); /* LE */ ! 48: } ! 49: abort(); ! 50: return 0; ! 51: } ! 52: ! 53: void x86_flag_testl (uae_u32 v); ! 54: void x86_flag_testw (uae_s16 v); ! 55: void x86_flag_testb (uae_s8 v); ! 56: void x86_flag_cmpl (uae_u32 s, uae_s32 d); ! 57: void x86_flag_cmpw (uae_s16 s, uae_s16 d); ! 58: void x86_flag_cmpb (uae_s8 s, uae_s8 d); ! 59: uae_u32 x86_flag_doaddl (uae_u32 s, uae_s32 d); ! 60: uae_u32 x86_flag_doaddw (uae_s16 s, uae_s16 d); ! 61: uae_u32 x86_flag_doaddb (uae_s8 s, uae_s8 d); ! 62: uae_u32 x86_flag_dosubl (uae_u32 s, uae_s32 d); ! 63: uae_u32 x86_flag_dosubw (uae_s16 s, uae_s16 d); ! 64: uae_u32 x86_flag_dosubb (uae_s8 s, uae_s8 d); ! 65: ! 66: #define x86_flag_addl(v,s,d) do { v = x86_flag_doaddl(s,d); } while (0) ! 67: #define x86_flag_addw(v,s,d) do { v = x86_flag_doaddw(s,d); } while (0) ! 68: #define x86_flag_addb(v,s,d) do { v = x86_flag_doaddb(s,d); } while (0) ! 69: #define x86_flag_subl(v,s,d) do { v = x86_flag_dosubl(s,d); } while (0) ! 70: #define x86_flag_subw(v,s,d) do { v = x86_flag_dosubw(s,d); } while (0) ! 71: #define x86_flag_subb(v,s,d) do { v = x86_flag_dosubb(s,d); } while (0) ! 72: ! 73: #pragma aux x86_flag_testl = \ ! 74: "test edx,edx" \ ! 75: "pushfd" \ ! 76: "pop ecx" \ ! 77: "mov DWORD [regflags],ecx" \ ! 78: parm [edx] \ ! 79: modify [ecx] ! 80: ! 81: #pragma aux x86_flag_testw = \ ! 82: "test dx,dx" \ ! 83: "pushfd" \ ! 84: "pop ecx" \ ! 85: "mov DWORD [ regflags],ecx" \ ! 86: parm [dx] \ ! 87: modify [ecx] ! 88: ! 89: #pragma aux x86_flag_testb = \ ! 90: "test dl,dl" \ ! 91: "pushfd" \ ! 92: "pop ecx" \ ! 93: "mov DWORD [ regflags],ecx" \ ! 94: parm [dl] \ ! 95: modify [ecx] ! 96: ! 97: #pragma aux x86_flag_doaddl = \ ! 98: "add edx,ecx" \ ! 99: "pushfd" \ ! 100: "pop ecx" \ ! 101: "mov DWORD [ regflags],ecx" \ ! 102: "mov DWORD [ regflags + 4],ecx" \ ! 103: parm [ecx] [edx] \ ! 104: value [edx] \ ! 105: modify [ecx] ! 106: ! 107: #pragma aux x86_flag_doaddw = \ ! 108: "add dx,cx" \ ! 109: "pushfd" \ ! 110: "pop ecx" \ ! 111: "mov DWORD [ regflags],ecx" \ ! 112: "mov DWORD [ regflags + 4],ecx" \ ! 113: parm [cx] [dx] \ ! 114: value [edx] \ ! 115: modify [ecx] ! 116: ! 117: #pragma aux x86_flag_doaddb = \ ! 118: "add dl,cl" \ ! 119: "pushfd" \ ! 120: "pop ecx" \ ! 121: "mov DWORD [ regflags],ecx" \ ! 122: "mov DWORD [ regflags + 4],ecx" \ ! 123: parm [cl] [dl] \ ! 124: value [edx] \ ! 125: modify [ecx] ! 126: ! 127: #pragma aux x86_flag_dosubl = \ ! 128: "sub edx,ecx" \ ! 129: "pushfd" \ ! 130: "pop ecx" \ ! 131: "mov DWORD [ regflags],ecx" \ ! 132: "mov DWORD [ regflags + 4],ecx" \ ! 133: parm [ecx] [edx] \ ! 134: value [edx] \ ! 135: modify [ecx] ! 136: ! 137: #pragma aux x86_flag_dosubw = \ ! 138: "sub dx,cx" \ ! 139: "pushfd" \ ! 140: "pop ecx" \ ! 141: "mov DWORD [ regflags],ecx" \ ! 142: "mov DWORD [ regflags + 4],ecx" \ ! 143: parm [cx] [dx] \ ! 144: value [edx] \ ! 145: modify [ecx] ! 146: ! 147: #pragma aux x86_flag_dosubb = \ ! 148: "sub dl,cl" \ ! 149: "pushfd" \ ! 150: "pop ecx" \ ! 151: "mov DWORD [ regflags],ecx" \ ! 152: "mov DWORD [ regflags + 4],ecx" \ ! 153: parm [cl] [dl] \ ! 154: value [edx] \ ! 155: modify [ecx] ! 156: ! 157: #pragma aux x86_flag_cmpl = \ ! 158: "cmp edx,ecx" \ ! 159: "pushfd" \ ! 160: "pop ecx" \ ! 161: "mov DWORD [ regflags],ecx" \ ! 162: parm [ecx] [edx] \ ! 163: modify [ecx] ! 164: ! 165: #pragma aux x86_flag_cmpw = \ ! 166: "cmp dx,cx" \ ! 167: "pushfd" \ ! 168: "pop ecx" \ ! 169: "mov DWORD [ regflags],ecx" \ ! 170: parm [cx] [dx] \ ! 171: modify [ecx] ! 172: ! 173: #pragma aux x86_flag_cmpb = \ ! 174: "cmp dl,cl" \ ! 175: "pushfd" \ ! 176: "pop ecx" \ ! 177: "mov DWORD [ regflags],ecx" \ ! 178: parm [cl] [dl] \ ! 179: modify [ecx] ! 180:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.