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