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