1 /**************************************************************************** 2 * * 3 * Third Year Project * 4 * * 5 * An IBM PC Emulator * 6 * For Unix and X Windows * 7 * * 8 * By David Hedley * 9 * * 10 * * 11 * This program is Copyrighted. Consult the file COPYRIGHT for more details * 12 * * 13 ****************************************************************************/ 14 15 /* This is CPU.H it contains definitions for cpu.c */ 16 17 18 #ifndef CPU_H 19 #define CPU_H 20 21 #include "mytypes.h" 22 23 #define AX 0 24 #define CX 1 25 #define DX 2 26 #define BX 3 27 #define SP 4 28 #define BP 5 29 #define SI 6 30 #define DI 7 31 32 #define AL 0 33 #define CL 1 34 #define DL 2 35 #define BL 3 36 #define AH 4 37 #define CH 5 38 #define DH 6 39 #define BH 7 40 41 #define SPL 8 42 #define SPH 9 43 #define BPL 10 44 #define BPH 11 45 #define SIL 12 46 #define SIH 13 47 #define DIL 14 48 #define DIH 15 49 50 51 #define ES 0 52 #define CS 1 53 #define SS 2 54 #define DS 3 55 56 57 /* parameter x = result, y = source 1, z = source 2 */ 58 59 #define SetCFB_Add(x,y) (CF = (BYTE)(x) < (BYTE)(y)) 60 #define SetCFW_Add(x,y) (CF = (WORD)(x) < (WORD)(y)) 61 #define SetCFB_Sub(y,z) (CF = (BYTE)(y) > (BYTE)(z)) 62 #define SetCFW_Sub(y,z) (CF = (WORD)(y) > (WORD)(z)) 63 #define SetZFB(x) (ZF = !(BYTE)(x)) 64 #define SetZFW(x) (ZF = !(WORD)(x)) 65 #define SetTF(x) (TF = (x)) 66 #define SetIF(x) (IF = (x)) 67 #define SetDF(x) (DF = (x)) 68 #define SetAF(x,y,z) (AF = ((x) ^ ((y) ^ (z))) & 0x10) 69 #define SetPF(x) (PF = parity_table[(BYTE)(x)]) 70 #define SetOFW_Add(x,y,z) (OF = ((x) ^ (y)) & ((x) ^ (z)) & 0x8000) 71 #define SetOFB_Add(x,y,z) (OF = ((x) ^ (y)) & ((x) ^ (z)) & 0x80) 72 #define SetOFW_Sub(x,y,z) (OF = ((z) ^ (y)) & ((z) ^ (x)) & 0x8000) 73 #define SetOFB_Sub(x,y,z) (OF = ((z) ^ (y)) & ((z) ^ (x)) & 0x80) 74 #define SetSFW(x) (SF = (x) & 0x8000) 75 #define SetSFB(x) (SF = (x) & 0x80) 76 77 78 #define GetMemInc(Seg,Off) ((Seg)[(Off)++]) 79 80 #if defined(TEST) && defined(BSD386) 81 # define SegToMemPtr(Seg) (sregs[Seg] == 0xa000 ? (BYTE *)0xe00a0000 : \ 82 sregs[Seg] == 0xb800 ? (BYTE *)0xe00b8000 : \ 83 &memory[sregs[Seg] << 4]) 84 #else 85 # define SegToMemPtr(Seg) (&memory[sregs[Seg] << 4]) 86 #endif 87 88 89 #define PutMemB(Seg,Off,x) ((Seg)[(WORD)(Off)] = (BYTE)(x)) 90 #define GetMemB(Seg,Off) ((BYTE)(Seg)[(WORD)(Off)]) 91 92 #define CalcAll() 93 94 #define CompressFlags() (WORD)(CF | (PF << 2) | (!(!AF) << 4) | (ZF << 6) \ 95 | (!(!SF) << 7) | (TF << 8) | (IF << 9) \ 96 | (DF << 10) | (!(!OF) << 11)) 97 98 #define ExpandFlags(f) \ 99 { \ 100 CF = (f) & 1; \ 101 PF = ((f) & 4) == 4; \ 102 AF = (f) & 16; \ 103 ZF = ((f) & 64) == 64; \ 104 SF = (f) & 128; \ 105 TF = ((f) & 256) == 256; \ 106 IF = ((f) & 512) == 512; \ 107 DF = ((f) & 1024) == 1024; \ 108 OF = (f) & 2048; \ 109 } 110 111 112 /* ChangeE(x) changes x to little endian from the machine's natural endian 113 format and back again. Obviously there is nothing to do for little-endian 114 machines... */ 115 116 #if defined(LITTLE_ENDIAN) 117 # define ChangeE(x) (WORD)(x) 118 #else 119 # define ChangeE(x) (WORD)(((x) << 8) | ((BYTE)((x) >> 8))) 120 #endif 121 122 #if defined(LITTLE_ENDIAN) && !defined(ALIGNED_ACCESS) 123 # define ReadWord(x) (*(x)) 124 # define WriteWord(x,y) (*(x) = (y)) 125 # define CopyWord(x,y) (*x = *y) 126 # define PutMemW(Seg,Off,x) (*(WORD *)((Seg)+(WORD)(Off)) = (WORD)(x)) 127 # define GetMemW(Seg,Off) (*(WORD *)((Seg)+(WORD)(Off))) 128 #else 129 # define ReadWord(x) ((WORD)(*((BYTE *)(x))) + ((WORD)(*((BYTE *)(x)+1)) << 8)) 130 # define WriteWord(x,y) (*(BYTE *)(x) = (BYTE)(y), *((BYTE *)(x)+1) = (BYTE)((y) >> 8)) 131 # define CopyWord(x,y) (*(BYTE *)(x) = *(BYTE *)(y), *((BYTE *)(x)+1) = *((BYTE *)(y)+1)) 132 # define PutMemW(Seg,Off,x) (Seg[Off] = (BYTE)(x), Seg[(WORD)(Off)+1] = (BYTE)((x) >> 8)) 133 # define GetMemW(Seg,Off) ((WORD)Seg[Off] + ((WORD)Seg[(WORD)(Off)+1] << 8)) 134 #endif 135 136 extern WORD wregs[8]; /* Always little-endian */ 137 extern BYTE *bregs[16]; /* Points to bytes within wregs[] */ 138 extern unsigned sregs[4]; /* Always native machine word order */ 139 140 extern unsigned ip; /* Always native machine word order */ 141 142 /* All the byte flags will either be 1 or 0 */ 143 extern BYTE CF, PF, ZF, TF, IF, DF; 144 145 /* All the word flags may be either none-zero (true) or zero (false) */ 146 extern unsigned AF, OF, SF; 147 148 extern BYTE *c_cs,*c_ds,*c_es,*c_ss,*c_stack; 149 150 extern volatile int int_pending; 151 extern volatile int int_blocked; 152 153 #endif 154