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&0xf0000)|((EA+2)&0xffff))
25 
26 #define PutRMWord(ModRM,val)				\
27 {							\
28 	if (ModRM >= 0xc0)				\
29 		I.regs.w[Mod_RM.RM.w[ModRM]]=val;	\
30 	else {						\
31 		(*GetEA[ModRM])();			\
32 		WriteWord( EA ,val);			\
33 	}						\
34 }
35 
36 #define PutImmRMWord(ModRM) 				\
37 {							\
38 	WORD val;					\
39 	if (ModRM >= 0xc0)				\
40 		FETCHWORD(I.regs.w[Mod_RM.RM.w[ModRM]]) \
41 	else {						\
42 		(*GetEA[ModRM])();			\
43 		FETCHWORD(val)				\
44 		WriteWord( EA , val);			\
45 	}						\
46 }
47 
48 #define GetRMByte(ModRM) \
49 	((ModRM) >= 0xc0 ? I.regs.b[Mod_RM.RM.b[ModRM]] : ReadByte( (*GetEA[ModRM])() ))
50 
51 #define PutRMByte(ModRM,val)				\
52 {							\
53 	if (ModRM >= 0xc0)				\
54 		I.regs.b[Mod_RM.RM.b[ModRM]]=val;	\
55 	else						\
56 		WriteByte( (*GetEA[ModRM])() ,val); 	\
57 }
58 
59 #define PutImmRMByte(ModRM) 				\
60 {							\
61 	if (ModRM >= 0xc0)				\
62 		I.regs.b[Mod_RM.RM.b[ModRM]]=FETCH; 	\
63 	else {						\
64 		(*GetEA[ModRM])();			\
65 		WriteByte( EA , FETCH );		\
66 	}						\
67 }
68 
69 #define PutbackRMByte(ModRM,val)			\
70 {							\
71 	if (ModRM >= 0xc0)				\
72 		I.regs.b[Mod_RM.RM.b[ModRM]]=val;	\
73 	else						\
74 		WriteByte(EA,val);			\
75 }
76 
77 #define DEF_br8							\
78 	UINT32 ModRM = FETCH,src,dst;		\
79 	src = RegByte(ModRM);				\
80     dst = GetRMByte(ModRM)
81 
82 #define DEF_wr16						\
83 	UINT32 ModRM = FETCH,src,dst;		\
84 	src = RegWord(ModRM);				\
85     dst = GetRMWord(ModRM)
86 
87 #define DEF_r8b							\
88 	UINT32 ModRM = FETCH,src,dst;		\
89 	dst = RegByte(ModRM);				\
90     src = GetRMByte(ModRM)
91 
92 #define DEF_r16w						\
93 	UINT32 ModRM = FETCH,src,dst;		\
94 	dst = RegWord(ModRM);				\
95     src = GetRMWord(ModRM)
96 
97 #define DEF_ald8						\
98 	UINT32 src = FETCH;					\
99 	UINT32 dst = I.regs.b[AL]
100 
101 #define DEF_axd16						\
102 	UINT32 src = FETCH; 				\
103 	UINT32 dst = I.regs.w[AW];			\
104     src += (FETCH << 8)
105