1 static struct {
2 	struct {
3 		WREGS w[256];
4 		BREGS b[256];
5 	} reg;
6 	struct {
7 		WREGS w[256];
8 		BREGS b[256];
9 	} RM;
10 } Mod_RM;
11 
12 #define RegWord(ModRM) I.regs.w[Mod_RM.reg.w[ModRM]]
13 #define RegByte(ModRM) I.regs.b[Mod_RM.reg.b[ModRM]]
14 
15 #define GetRMWord(ModRM) \
16 	((ModRM) >= 0xc0 ? I.regs.w[Mod_RM.RM.w[ModRM]] : ( (*GetEA[ModRM])(), ReadWord( EA ) ))
17 
18 #define PutbackRMWord(ModRM,val) \
19 { \
20 	if (ModRM >= 0xc0) I.regs.w[Mod_RM.RM.w[ModRM]]=val; \
21     else WriteWord(EA,val); \
22 }
23 
24 #define GetnextRMWord ReadWord(EA+2)
25 
26 #define GetRMWordOffset(offs) \
27 		ReadWord(EA-EO+(UINT16)(EO+offs))
28 
29 #define GetRMByteOffset(offs) \
30 		ReadByte(EA-EO+(UINT16)(EO+offs))
31 
32 #define PutRMWord(ModRM,val)				\
33 {											\
34 	if (ModRM >= 0xc0)						\
35 		I.regs.w[Mod_RM.RM.w[ModRM]]=val;	\
36 	else {									\
37 		(*GetEA[ModRM])();					\
38 		WriteWord( EA ,val);				\
39 	}										\
40 }
41 
42 #define PutRMWordOffset(offs, val) \
43 		WriteWord( EA-EO+(UINT16)(EO+offs), val)
44 
45 #define PutRMByteOffset(offs, val) \
46 		WriteByte( EA-EO+(UINT16)(EO+offs), val)
47 
48 #define PutImmRMWord(ModRM) 				\
49 {											\
50 	WORD val;								\
51 	if (ModRM >= 0xc0)						\
52 		FETCHWORD(I.regs.w[Mod_RM.RM.w[ModRM]]) \
53 	else {									\
54 		(*GetEA[ModRM])();					\
55 		FETCHWORD(val)						\
56 		WriteWord( EA , val);				\
57 	}										\
58 }
59 
60 #define GetRMByte(ModRM) \
61 	((ModRM) >= 0xc0 ? I.regs.b[Mod_RM.RM.b[ModRM]] : ReadByte( (*GetEA[ModRM])() ))
62 
63 #define PutRMByte(ModRM,val)				\
64 {											\
65 	if (ModRM >= 0xc0)						\
66 		I.regs.b[Mod_RM.RM.b[ModRM]]=val;	\
67 	else									\
68 		WriteByte( (*GetEA[ModRM])() ,val); \
69 }
70 
71 #define PutImmRMByte(ModRM) 				\
72 {											\
73 	if (ModRM >= 0xc0)						\
74 		I.regs.b[Mod_RM.RM.b[ModRM]]=FETCH; \
75 	else {									\
76 		(*GetEA[ModRM])();					\
77 		WriteByte( EA , FETCH );			\
78 	}										\
79 }
80 
81 #define PutbackRMByte(ModRM,val)			\
82 {											\
83 	if (ModRM >= 0xc0)						\
84 		I.regs.b[Mod_RM.RM.b[ModRM]]=val;	\
85 	else									\
86 		WriteByte(EA,val);					\
87 }
88 
89 #define DEF_br8(dst,src)					\
90 	unsigned ModRM = FETCHOP;				\
91 	unsigned src = RegByte(ModRM);			\
92     unsigned dst = GetRMByte(ModRM)
93 
94 #define DEF_wr16(dst,src)					\
95 	unsigned ModRM = FETCHOP;				\
96 	unsigned src = RegWord(ModRM);			\
97     unsigned dst = GetRMWord(ModRM)
98 
99 #define DEF_r8b(dst,src)					\
100 	unsigned ModRM = FETCHOP;				\
101 	unsigned dst = RegByte(ModRM);			\
102     unsigned src = GetRMByte(ModRM)
103 
104 #define DEF_r16w(dst,src)					\
105 	unsigned ModRM = FETCHOP;				\
106 	unsigned dst = RegWord(ModRM);			\
107     unsigned src = GetRMWord(ModRM)
108 
109 #define DEF_ald8(dst,src)					\
110 	unsigned src = FETCHOP; 				\
111 	unsigned dst = I.regs.b[AL]
112 
113 #define DEF_axd16(dst,src)					\
114 	unsigned src = FETCHOP; 				\
115 	unsigned dst = I.regs.w[AX];			\
116     src += (FETCH << 8)
117 
118 
119