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) Wreg(Mod_RM.reg.w[ModRM])
13 #define RegByte(ModRM) Breg(Mod_RM.reg.b[ModRM])
14 
15 #define GetRMWord(ModRM) \
16 	((ModRM) >= 0xc0 ? Wreg(Mod_RM.RM.w[ModRM]) : ( (*GetEA[ModRM])(nec_state), read_mem_word( EA ) ))
17 
18 #define PutbackRMWord(ModRM,val)			     \
19 {							     \
20 	if (ModRM >= 0xc0) Wreg(Mod_RM.RM.w[ModRM])=val; \
21     else write_mem_word(EA,val);  \
22 }
23 
24 #define GetnextRMWord read_mem_word((EA&0xf0000)|((EA+2)&0xffff))
25 
26 #define PutRMWord(ModRM,val)				\
27 {							\
28 	if (ModRM >= 0xc0)				\
29 		Wreg(Mod_RM.RM.w[ModRM])=val;	\
30 	else {						\
31 		(*GetEA[ModRM])(nec_state);			\
32 		write_mem_word( EA ,val);			\
33 	}						\
34 }
35 
36 #define PutImmRMWord(ModRM) 				\
37 {							\
38 	WORD val;					\
39 	if (ModRM >= 0xc0)				\
40 		Wreg(Mod_RM.RM.w[ModRM]) = FETCHWORD(); \
41 	else {						\
42 		(*GetEA[ModRM])(nec_state);			\
43 		val = FETCHWORD();				\
44 		write_mem_word( EA , val);			\
45 	}						\
46 }
47 
48 #define GetRMByte(ModRM) \
49 	((ModRM) >= 0xc0 ? Breg(Mod_RM.RM.b[ModRM]) : read_mem_byte( (*GetEA[ModRM])(nec_state) ))
50 
51 #define PutRMByte(ModRM,val)				\
52 {							\
53 	if (ModRM >= 0xc0)				\
54 		Breg(Mod_RM.RM.b[ModRM])=val;	\
55 	else						\
56 		write_mem_byte( (*GetEA[ModRM])(nec_state) ,val);	\
57 }
58 
59 #define PutImmRMByte(ModRM) 				\
60 {							\
61 	if (ModRM >= 0xc0)				\
62 		Breg(Mod_RM.RM.b[ModRM])=FETCH();	\
63 	else {						\
64 		(*GetEA[ModRM])(nec_state);			\
65 		write_mem_byte( EA , FETCH() );		\
66 	}						\
67 }
68 
69 #define PutbackRMByte(ModRM,val)			\
70 {							\
71 	if (ModRM >= 0xc0)				\
72 		Breg(Mod_RM.RM.b[ModRM])=val;	\
73 	else						\
74 		write_mem_byte(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 = Breg(AL)
100 
101 #define DEF_axd16						\
102 	UINT32 src = FETCH();				\
103 	UINT32 dst = Wreg(AW);			\
104     src += (FETCH() << 8)
105