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