helpers.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. #define GetEAa PhysPt eaa = EALookupTable[rm]();
  2. #define GetRMEAa \
  3. GetRM; \
  4. GetEAa;
  5. #define RMEbGb(inst) \
  6. { \
  7. GetRMrb; \
  8. if (rm >= 0xc0) \
  9. { \
  10. GetEArb; \
  11. inst(*earb, *rmrb, LoadRb, SaveRb); \
  12. } \
  13. else \
  14. { \
  15. GetEAa; \
  16. inst(eaa, *rmrb, Mem_Lodsb, Mem_Stosb); \
  17. } \
  18. }
  19. #define RMGbEb(inst) \
  20. { \
  21. GetRMrb; \
  22. if (rm >= 0xc0) \
  23. { \
  24. GetEArb; \
  25. inst(*rmrb, *earb, LoadRb, SaveRb); \
  26. } \
  27. else \
  28. { \
  29. GetEAa; \
  30. inst(*rmrb, Mem_Lodsb(eaa), LoadRb, SaveRb); \
  31. } \
  32. }
  33. #define RMEb(inst) \
  34. { \
  35. if (rm >= 0xc0) \
  36. { \
  37. GetEArb; \
  38. inst(*earb, LoadRb, SaveRb); \
  39. } \
  40. else \
  41. { \
  42. GetEAa; \
  43. inst(eaa, Mem_Lodsb, Mem_Stosb); \
  44. } \
  45. }
  46. #define RMEwGw(inst) \
  47. { \
  48. GetRMrw; \
  49. if (rm >= 0xc0) \
  50. { \
  51. GetEArw; \
  52. inst(*earw, *rmrw, LoadRw, SaveRw); \
  53. } \
  54. else \
  55. { \
  56. GetEAa; \
  57. inst(eaa, *rmrw, Mem_Lodsw, Mem_Stosw); \
  58. } \
  59. }
  60. #define RMEwGwOp3(inst, op3) \
  61. { \
  62. GetRMrw; \
  63. if (rm >= 0xc0) \
  64. { \
  65. GetEArw; \
  66. inst(*earw, *rmrw, op3, LoadRw, SaveRw); \
  67. } \
  68. else \
  69. { \
  70. GetEAa; \
  71. inst(eaa, *rmrw, op3, Mem_Lodsw, Mem_Stosw); \
  72. } \
  73. }
  74. #define RMGwEw(inst) \
  75. { \
  76. GetRMrw; \
  77. if (rm >= 0xc0) \
  78. { \
  79. GetEArw; \
  80. inst(*rmrw, *earw, LoadRw, SaveRw); \
  81. } \
  82. else \
  83. { \
  84. GetEAa; \
  85. inst(*rmrw, Mem_Lodsw(eaa), LoadRw, SaveRw); \
  86. } \
  87. }
  88. #define RMGwEwOp3(inst, op3) \
  89. { \
  90. GetRMrw; \
  91. if (rm >= 0xc0) \
  92. { \
  93. GetEArw; \
  94. inst(*rmrw, *earw, op3, LoadRw, SaveRw); \
  95. } \
  96. else \
  97. { \
  98. GetEAa; \
  99. inst(*rmrw, Mem_Lodsw(eaa), op3, LoadRw, SaveRw); \
  100. } \
  101. }
  102. #define RMEdGd(inst) \
  103. { \
  104. GetRMrd; \
  105. if (rm >= 0xc0) {GetEArd; inst(*eard, *rmrd, LoadRd, SaveRd);} \
  106. else {GetEAa; inst(eaa, *rmrd, Mem_Lodsd, Mem_Stosd);} \
  107. }
  108. #define RMEdGdOp3(inst,op3) \
  109. { \
  110. GetRMrd; \
  111. if (rm >= 0xc0) {GetEArd; inst(*eard, *rmrd, op3, LoadRd, SaveRd);} \
  112. else {GetEAa; inst(eaa, *rmrd, op3, Mem_Lodsd, Mem_Stosd);} \
  113. }
  114. #define RMGdEd(inst) \
  115. { \
  116. GetRMrd; \
  117. if (rm >= 0xc0) \
  118. { \
  119. GetEArd; \
  120. inst(*rmrd, *eard, LoadRd, SaveRd); \
  121. } \
  122. else \
  123. { \
  124. GetEAa; \
  125. inst(*rmrd, Mem_Lodsd(eaa), LoadRd, SaveRd); \
  126. } \
  127. }
  128. #define RMGdEdOp3(inst, op3) \
  129. { \
  130. GetRMrd; \
  131. if (rm >= 0xc0) {GetEArd; inst(*rmrd, *eard, op3, LoadRd, SaveRd);} \
  132. else {GetEAa; inst(*rmrd, Mem_Lodsd(eaa), op3, LoadRd, SaveRd);} \
  133. }
  134. #define RMEw(inst) \
  135. { \
  136. if (rm >= 0xc0) \
  137. { \
  138. GetEArw; \
  139. inst(*earw, LoadRw, SaveRw); \
  140. } \
  141. else \
  142. { \
  143. GetEAa; \
  144. inst(eaa, Mem_Lodsw, Mem_Stosw); \
  145. } \
  146. }
  147. #define RMEd(inst) \
  148. { \
  149. if (rm >= 0xc0) \
  150. { \
  151. GetEArd; \
  152. inst(*eard, LoadRd, SaveRd); \
  153. } \
  154. else \
  155. { \
  156. GetEAa; \
  157. inst(eaa, Mem_Lodsd, Mem_Stosd); \
  158. } \
  159. }
  160. #define ALIb(inst) \
  161. { \
  162. inst(reg_al, Fetchb(), LoadRb, SaveRb) \
  163. }
  164. #define AXIw(inst) \
  165. { \
  166. inst(reg_ax, Fetchw(), LoadRw, SaveRw); \
  167. }
  168. #define EAXId(inst) \
  169. { \
  170. inst(reg_eax, Fetchd(), LoadRd, SaveRd); \
  171. }
  172. #define CASE_W(_WHICH) \
  173. case (OPCODE_NONE+_WHICH):
  174. #define CASE_D(_WHICH) \
  175. case (OPCODE_SIZE+_WHICH):
  176. #define CASE_B(_WHICH) \
  177. CASE_W(_WHICH) \
  178. CASE_D(_WHICH)
  179. #define CASE_0F_W(_WHICH) \
  180. case ((OPCODE_0F|OPCODE_NONE)+_WHICH):
  181. #define CASE_0F_D(_WHICH) \
  182. case ((OPCODE_0F|OPCODE_SIZE)+_WHICH):
  183. #define CASE_0F_B(_WHICH) \
  184. CASE_0F_W(_WHICH) \
  185. CASE_0F_D(_WHICH)