1 // license:BSD-3-Clause
2 // copyright-holders:Bryan McPhail
3 static struct {
4 	struct {
5 		WREGS w[256];
6 		BREGS b[256];
7 	} reg;
8 	struct {
9 		WREGS w[256];
10 		BREGS b[256];
11 	} RM;
12 } Mod_RM;
13 
14 #define RegWord(ModRM) Wreg(Mod_RM.reg.w[ModRM])
15 #define RegByte(ModRM) Breg(Mod_RM.reg.b[ModRM])
16 
17 #define GetRMWord(ModRM) \
18 	((ModRM) >= 0xc0 ? Wreg(Mod_RM.RM.w[ModRM]) : ( (this->*s_GetEA[ModRM])(), read_mem_word( m_EA ) ))
19 
20 #define PutbackRMWord(ModRM,val)                 \
21 {                                \
22 	if (ModRM >= 0xc0) Wreg(Mod_RM.RM.w[ModRM])=val; \
23 	else write_mem_word(m_EA,val);  \
24 }
25 
26 #define GetnextRMWord read_mem_word((m_EA&0xf0000)|((m_EA+2)&0xffff))
27 
28 #define PutRMWord(ModRM,val)                \
29 {                           \
30 	if (ModRM >= 0xc0)              \
31 		Wreg(Mod_RM.RM.w[ModRM])=val;   \
32 	else {                      \
33 		(this->*s_GetEA[ModRM])();         \
34 		write_mem_word( m_EA ,val);           \
35 	}                       \
36 }
37 
38 #define PutImmRMWord(ModRM)                 \
39 {                           \
40 	WORD val;                   \
41 	if (ModRM >= 0xc0)              \
42 		Wreg(Mod_RM.RM.w[ModRM]) = fetchword(); \
43 	else {                      \
44 		(this->*s_GetEA[ModRM])();         \
45 		val = fetchword();              \
46 		write_mem_word( m_EA , val);          \
47 	}                       \
48 }
49 
50 #define GetRMByte(ModRM) \
51 	((ModRM) >= 0xc0 ? Breg(Mod_RM.RM.b[ModRM]) : read_mem_byte( (this->*s_GetEA[ModRM])() ))
52 
53 #define PutRMByte(ModRM,val)                \
54 {                           \
55 	if (ModRM >= 0xc0)              \
56 		Breg(Mod_RM.RM.b[ModRM])=val;   \
57 	else                        \
58 		write_mem_byte( (this->*s_GetEA[ModRM])() ,val);   \
59 }
60 
61 #define PutImmRMByte(ModRM)                 \
62 {                           \
63 	if (ModRM >= 0xc0)              \
64 		Breg(Mod_RM.RM.b[ModRM])=fetch();   \
65 	else {                      \
66 		(this->*s_GetEA[ModRM])();         \
67 		write_mem_byte( m_EA , fetch() );     \
68 	}                       \
69 }
70 
71 #define PutbackRMByte(ModRM,val)            \
72 {                           \
73 	if (ModRM >= 0xc0)              \
74 		Breg(Mod_RM.RM.b[ModRM])=val;   \
75 	else                        \
76 		write_mem_byte(m_EA,val);         \
77 }
78 
79 #define DEF_br8                         \
80 	uint32_t ModRM = fetch(),src,dst;     \
81 	src = RegByte(ModRM);               \
82 	dst = GetRMByte(ModRM)
83 
84 #define DEF_wr16                        \
85 	uint32_t ModRM = fetch(),src,dst;     \
86 	src = RegWord(ModRM);               \
87 	dst = GetRMWord(ModRM)
88 
89 #define DEF_r8b                         \
90 	uint32_t ModRM = fetch(),src,dst;     \
91 	dst = RegByte(ModRM);               \
92 	src = GetRMByte(ModRM)
93 
94 #define DEF_r16w                        \
95 	uint32_t ModRM = fetch(),src,dst;     \
96 	dst = RegWord(ModRM);               \
97 	src = GetRMWord(ModRM)
98 
99 #define DEF_ald8                        \
100 	uint32_t src = fetch();                   \
101 	uint32_t dst = Breg(AL)
102 
103 #define DEF_axd16                       \
104 	uint32_t src = fetch();               \
105 	uint32_t dst = Wreg(AW);          \
106 	src += (fetch() << 8)
107