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