An emulator, assembler, and disassembler for the Sega Game Gear
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

1047 lines
43 KiB

  1. /* Copyright (C) 2014-2015 Ben Kurtovic <ben.kurtovic@gmail.com>
  2. Released under the terms of the MIT License. See LICENSE for details. */
  3. /*
  4. This file is AUTO-GENERATED from 'instructions.yml'.
  5. `make` should trigger a rebuild when it is modified; if not, use:
  6. `python scripts/update_asm_instructions.py`.
  7. @AUTOGEN_DATE Mon May 18 08:43:46 2015 UTC
  8. */
  9. /* @AUTOGEN_INST_BLOCK_START */
  10. INST_FUNC(adc)
  11. {
  12. INST_TAKES_ARGS(
  13. AT_REGISTER,
  14. AT_IMMEDIATE|AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  15. AT_NONE
  16. )
  17. if (INST_NARGS == 2 && INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_REGISTER) {
  18. if (INST_REG(0) == REG_A && INST_REG(1) == REG_A)
  19. INST_RETURN(1, 0x8F)
  20. if (INST_REG(0) == REG_A && INST_REG(1) == REG_B)
  21. INST_RETURN(1, 0x88)
  22. if (INST_REG(0) == REG_A && INST_REG(1) == REG_C)
  23. INST_RETURN(1, 0x89)
  24. if (INST_REG(0) == REG_A && INST_REG(1) == REG_D)
  25. INST_RETURN(1, 0x8A)
  26. if (INST_REG(0) == REG_A && INST_REG(1) == REG_E)
  27. INST_RETURN(1, 0x8B)
  28. if (INST_REG(0) == REG_A && INST_REG(1) == REG_H)
  29. INST_RETURN(1, 0x8C)
  30. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IXH)
  31. INST_RETURN(2, INST_IX_PREFIX, 0x8C)
  32. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IYH)
  33. INST_RETURN(2, INST_IY_PREFIX, 0x8C)
  34. if (INST_REG(0) == REG_A && INST_REG(1) == REG_L)
  35. INST_RETURN(1, 0x8D)
  36. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IXL)
  37. INST_RETURN(2, INST_IX_PREFIX, 0x8D)
  38. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IYL)
  39. INST_RETURN(2, INST_IY_PREFIX, 0x8D)
  40. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_BC)
  41. INST_RETURN(2, 0xED, 0x4A)
  42. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_DE)
  43. INST_RETURN(2, 0xED, 0x5A)
  44. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_HL)
  45. INST_RETURN(2, 0xED, 0x6A)
  46. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_SP)
  47. INST_RETURN(2, 0xED, 0x7A)
  48. INST_ERROR(ARG_VALUE)
  49. }
  50. if (INST_NARGS == 2 && INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_IMMEDIATE) {
  51. if (INST_REG(0) == REG_A && INST_IMM(1).mask & IMM_U8)
  52. INST_RETURN(2, 0xCE, INST_IMM(1).uval)
  53. INST_ERROR(ARG_VALUE)
  54. }
  55. if (INST_NARGS == 2 && INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_INDIRECT &&
  56. (INST_INDIRECT(1).type == AT_REGISTER && INST_INDIRECT(1).addr.reg == REG_HL)) {
  57. if (INST_REG(0) == REG_A)
  58. INST_RETURN(1, 0x8E)
  59. INST_ERROR(ARG_VALUE)
  60. }
  61. if (INST_NARGS == 2 && INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_INDEXED) {
  62. if (INST_REG(0) == REG_A)
  63. INST_RETURN(3, INST_INDEX_PREFIX(1), 0x8E, INST_INDEX(1).offset)
  64. INST_ERROR(ARG_VALUE)
  65. }
  66. INST_ERROR(ARG_TYPE)
  67. }
  68. INST_FUNC(add)
  69. {
  70. INST_TAKES_ARGS(
  71. AT_REGISTER,
  72. AT_IMMEDIATE|AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  73. AT_NONE
  74. )
  75. if (INST_NARGS == 2 && INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_REGISTER) {
  76. if (INST_REG(0) == REG_A && INST_REG(1) == REG_A)
  77. INST_RETURN(1, 0x87)
  78. if (INST_REG(0) == REG_A && INST_REG(1) == REG_B)
  79. INST_RETURN(1, 0x80)
  80. if (INST_REG(0) == REG_A && INST_REG(1) == REG_C)
  81. INST_RETURN(1, 0x81)
  82. if (INST_REG(0) == REG_A && INST_REG(1) == REG_D)
  83. INST_RETURN(1, 0x82)
  84. if (INST_REG(0) == REG_A && INST_REG(1) == REG_E)
  85. INST_RETURN(1, 0x83)
  86. if (INST_REG(0) == REG_A && INST_REG(1) == REG_H)
  87. INST_RETURN(1, 0x84)
  88. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IXH)
  89. INST_RETURN(2, INST_IX_PREFIX, 0x84)
  90. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IYH)
  91. INST_RETURN(2, INST_IY_PREFIX, 0x84)
  92. if (INST_REG(0) == REG_A && INST_REG(1) == REG_L)
  93. INST_RETURN(1, 0x85)
  94. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IXL)
  95. INST_RETURN(2, INST_IX_PREFIX, 0x85)
  96. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IYL)
  97. INST_RETURN(2, INST_IY_PREFIX, 0x85)
  98. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_BC)
  99. INST_RETURN(1, 0x09)
  100. if (INST_REG(0) == REG_IX && INST_REG(1) == REG_BC)
  101. INST_RETURN(2, INST_IX_PREFIX, 0x09)
  102. if (INST_REG(0) == REG_IY && INST_REG(1) == REG_BC)
  103. INST_RETURN(2, INST_IY_PREFIX, 0x09)
  104. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_DE)
  105. INST_RETURN(1, 0x19)
  106. if (INST_REG(0) == REG_IX && INST_REG(1) == REG_DE)
  107. INST_RETURN(2, INST_IX_PREFIX, 0x19)
  108. if (INST_REG(0) == REG_IY && INST_REG(1) == REG_DE)
  109. INST_RETURN(2, INST_IY_PREFIX, 0x19)
  110. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_HL)
  111. INST_RETURN(1, 0x29)
  112. if (INST_REG(0) == REG_IX && INST_REG(1) == REG_IX)
  113. INST_RETURN(2, INST_IX_PREFIX, 0x29)
  114. if (INST_REG(0) == REG_IY && INST_REG(1) == REG_IY)
  115. INST_RETURN(2, INST_IY_PREFIX, 0x29)
  116. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_SP)
  117. INST_RETURN(1, 0x39)
  118. if (INST_REG(0) == REG_IX && INST_REG(1) == REG_SP)
  119. INST_RETURN(2, INST_IX_PREFIX, 0x39)
  120. if (INST_REG(0) == REG_IY && INST_REG(1) == REG_SP)
  121. INST_RETURN(2, INST_IY_PREFIX, 0x39)
  122. INST_ERROR(ARG_VALUE)
  123. }
  124. if (INST_NARGS == 2 && INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_IMMEDIATE) {
  125. if (INST_REG(0) == REG_A && INST_IMM(1).mask & IMM_U8)
  126. INST_RETURN(2, 0xC6, INST_IMM(1).uval)
  127. INST_ERROR(ARG_VALUE)
  128. }
  129. if (INST_NARGS == 2 && INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_INDIRECT &&
  130. (INST_INDIRECT(1).type == AT_REGISTER && INST_INDIRECT(1).addr.reg == REG_HL)) {
  131. if (INST_REG(0) == REG_A)
  132. INST_RETURN(1, 0x86)
  133. INST_ERROR(ARG_VALUE)
  134. }
  135. if (INST_NARGS == 2 && INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_INDEXED) {
  136. if (INST_REG(0) == REG_A)
  137. INST_RETURN(3, INST_INDEX_PREFIX(1), 0x86, INST_INDEX(1).offset)
  138. INST_ERROR(ARG_VALUE)
  139. }
  140. INST_ERROR(ARG_TYPE)
  141. }
  142. INST_FUNC(and)
  143. {
  144. INST_TAKES_ARGS(
  145. AT_IMMEDIATE|AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  146. AT_NONE,
  147. AT_NONE
  148. )
  149. if (INST_NARGS == 1 && INST_TYPE(0) == AT_REGISTER) {
  150. if (INST_REG(0) == REG_A)
  151. INST_RETURN(1, 0xA7)
  152. if (INST_REG(0) == REG_B)
  153. INST_RETURN(1, 0xA0)
  154. if (INST_REG(0) == REG_C)
  155. INST_RETURN(1, 0xA1)
  156. if (INST_REG(0) == REG_D)
  157. INST_RETURN(1, 0xA2)
  158. if (INST_REG(0) == REG_E)
  159. INST_RETURN(1, 0xA3)
  160. if (INST_REG(0) == REG_H)
  161. INST_RETURN(1, 0xA4)
  162. if (INST_REG(0) == REG_IXH)
  163. INST_RETURN(2, INST_IX_PREFIX, 0xA4)
  164. if (INST_REG(0) == REG_IYH)
  165. INST_RETURN(2, INST_IY_PREFIX, 0xA4)
  166. if (INST_REG(0) == REG_L)
  167. INST_RETURN(1, 0xA5)
  168. if (INST_REG(0) == REG_IXL)
  169. INST_RETURN(2, INST_IX_PREFIX, 0xA5)
  170. if (INST_REG(0) == REG_IYL)
  171. INST_RETURN(2, INST_IY_PREFIX, 0xA5)
  172. INST_ERROR(ARG_VALUE)
  173. }
  174. if (INST_NARGS == 1 && INST_TYPE(0) == AT_IMMEDIATE) {
  175. if (INST_IMM(0).mask & IMM_U8)
  176. INST_RETURN(2, 0xE6, INST_IMM(0).uval)
  177. INST_ERROR(ARG_VALUE)
  178. }
  179. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDIRECT &&
  180. (INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_HL)) {
  181. INST_RETURN(1, 0xA6)
  182. }
  183. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDEXED) {
  184. INST_RETURN(3, INST_INDEX_PREFIX(0), 0xA6, INST_INDEX(0).offset)
  185. }
  186. INST_ERROR(ARG_TYPE)
  187. }
  188. INST_FUNC(bit)
  189. {
  190. INST_TAKES_ARGS(
  191. AT_IMMEDIATE,
  192. AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  193. AT_NONE
  194. )
  195. if (INST_NARGS == 2 && INST_TYPE(0) == AT_IMMEDIATE && INST_TYPE(1) == AT_REGISTER) {
  196. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 0) && INST_REG(1) == REG_A)
  197. INST_RETURN(2, 0xCB, 0x47)
  198. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 0) && INST_REG(1) == REG_B)
  199. INST_RETURN(2, 0xCB, 0x40)
  200. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 0) && INST_REG(1) == REG_C)
  201. INST_RETURN(2, 0xCB, 0x41)
  202. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 0) && INST_REG(1) == REG_D)
  203. INST_RETURN(2, 0xCB, 0x42)
  204. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 0) && INST_REG(1) == REG_E)
  205. INST_RETURN(2, 0xCB, 0x43)
  206. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 0) && INST_REG(1) == REG_H)
  207. INST_RETURN(2, 0xCB, 0x44)
  208. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 0) && INST_REG(1) == REG_L)
  209. INST_RETURN(2, 0xCB, 0x45)
  210. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 1) && INST_REG(1) == REG_A)
  211. INST_RETURN(2, 0xCB, 0x4F)
  212. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 1) && INST_REG(1) == REG_B)
  213. INST_RETURN(2, 0xCB, 0x48)
  214. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 1) && INST_REG(1) == REG_C)
  215. INST_RETURN(2, 0xCB, 0x49)
  216. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 1) && INST_REG(1) == REG_D)
  217. INST_RETURN(2, 0xCB, 0x4A)
  218. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 1) && INST_REG(1) == REG_E)
  219. INST_RETURN(2, 0xCB, 0x4B)
  220. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 1) && INST_REG(1) == REG_H)
  221. INST_RETURN(2, 0xCB, 0x4C)
  222. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 1) && INST_REG(1) == REG_L)
  223. INST_RETURN(2, 0xCB, 0x4D)
  224. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 2) && INST_REG(1) == REG_A)
  225. INST_RETURN(2, 0xCB, 0x57)
  226. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 2) && INST_REG(1) == REG_B)
  227. INST_RETURN(2, 0xCB, 0x50)
  228. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 2) && INST_REG(1) == REG_C)
  229. INST_RETURN(2, 0xCB, 0x51)
  230. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 2) && INST_REG(1) == REG_D)
  231. INST_RETURN(2, 0xCB, 0x52)
  232. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 2) && INST_REG(1) == REG_E)
  233. INST_RETURN(2, 0xCB, 0x53)
  234. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 2) && INST_REG(1) == REG_H)
  235. INST_RETURN(2, 0xCB, 0x54)
  236. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 2) && INST_REG(1) == REG_L)
  237. INST_RETURN(2, 0xCB, 0x55)
  238. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 3) && INST_REG(1) == REG_A)
  239. INST_RETURN(2, 0xCB, 0x5F)
  240. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 3) && INST_REG(1) == REG_B)
  241. INST_RETURN(2, 0xCB, 0x58)
  242. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 3) && INST_REG(1) == REG_C)
  243. INST_RETURN(2, 0xCB, 0x59)
  244. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 3) && INST_REG(1) == REG_D)
  245. INST_RETURN(2, 0xCB, 0x5A)
  246. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 3) && INST_REG(1) == REG_E)
  247. INST_RETURN(2, 0xCB, 0x5B)
  248. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 3) && INST_REG(1) == REG_H)
  249. INST_RETURN(2, 0xCB, 0x5C)
  250. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 3) && INST_REG(1) == REG_L)
  251. INST_RETURN(2, 0xCB, 0x5D)
  252. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 4) && INST_REG(1) == REG_A)
  253. INST_RETURN(2, 0xCB, 0x67)
  254. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 4) && INST_REG(1) == REG_B)
  255. INST_RETURN(2, 0xCB, 0x60)
  256. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 4) && INST_REG(1) == REG_C)
  257. INST_RETURN(2, 0xCB, 0x61)
  258. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 4) && INST_REG(1) == REG_D)
  259. INST_RETURN(2, 0xCB, 0x62)
  260. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 4) && INST_REG(1) == REG_E)
  261. INST_RETURN(2, 0xCB, 0x63)
  262. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 4) && INST_REG(1) == REG_H)
  263. INST_RETURN(2, 0xCB, 0x64)
  264. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 4) && INST_REG(1) == REG_L)
  265. INST_RETURN(2, 0xCB, 0x65)
  266. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 5) && INST_REG(1) == REG_A)
  267. INST_RETURN(2, 0xCB, 0x6F)
  268. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 5) && INST_REG(1) == REG_B)
  269. INST_RETURN(2, 0xCB, 0x68)
  270. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 5) && INST_REG(1) == REG_C)
  271. INST_RETURN(2, 0xCB, 0x69)
  272. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 5) && INST_REG(1) == REG_D)
  273. INST_RETURN(2, 0xCB, 0x6A)
  274. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 5) && INST_REG(1) == REG_E)
  275. INST_RETURN(2, 0xCB, 0x6B)
  276. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 5) && INST_REG(1) == REG_H)
  277. INST_RETURN(2, 0xCB, 0x6C)
  278. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 5) && INST_REG(1) == REG_L)
  279. INST_RETURN(2, 0xCB, 0x6D)
  280. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 6) && INST_REG(1) == REG_A)
  281. INST_RETURN(2, 0xCB, 0x77)
  282. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 6) && INST_REG(1) == REG_B)
  283. INST_RETURN(2, 0xCB, 0x70)
  284. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 6) && INST_REG(1) == REG_C)
  285. INST_RETURN(2, 0xCB, 0x71)
  286. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 6) && INST_REG(1) == REG_D)
  287. INST_RETURN(2, 0xCB, 0x72)
  288. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 6) && INST_REG(1) == REG_E)
  289. INST_RETURN(2, 0xCB, 0x73)
  290. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 6) && INST_REG(1) == REG_H)
  291. INST_RETURN(2, 0xCB, 0x74)
  292. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 6) && INST_REG(1) == REG_L)
  293. INST_RETURN(2, 0xCB, 0x75)
  294. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 7) && INST_REG(1) == REG_A)
  295. INST_RETURN(2, 0xCB, 0x7F)
  296. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 7) && INST_REG(1) == REG_B)
  297. INST_RETURN(2, 0xCB, 0x78)
  298. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 7) && INST_REG(1) == REG_C)
  299. INST_RETURN(2, 0xCB, 0x79)
  300. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 7) && INST_REG(1) == REG_D)
  301. INST_RETURN(2, 0xCB, 0x7A)
  302. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 7) && INST_REG(1) == REG_E)
  303. INST_RETURN(2, 0xCB, 0x7B)
  304. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 7) && INST_REG(1) == REG_H)
  305. INST_RETURN(2, 0xCB, 0x7C)
  306. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 7) && INST_REG(1) == REG_L)
  307. INST_RETURN(2, 0xCB, 0x7D)
  308. INST_ERROR(ARG_VALUE)
  309. }
  310. if (INST_NARGS == 2 && INST_TYPE(0) == AT_IMMEDIATE && INST_TYPE(1) == AT_INDIRECT &&
  311. (INST_INDIRECT(1).type == AT_REGISTER && INST_INDIRECT(1).addr.reg == REG_HL)) {
  312. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 0))
  313. INST_RETURN(2, 0xCB, 0x46)
  314. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 1))
  315. INST_RETURN(2, 0xCB, 0x4E)
  316. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 2))
  317. INST_RETURN(2, 0xCB, 0x56)
  318. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 3))
  319. INST_RETURN(2, 0xCB, 0x5E)
  320. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 4))
  321. INST_RETURN(2, 0xCB, 0x66)
  322. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 5))
  323. INST_RETURN(2, 0xCB, 0x6E)
  324. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 6))
  325. INST_RETURN(2, 0xCB, 0x76)
  326. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 7))
  327. INST_RETURN(2, 0xCB, 0x7E)
  328. INST_ERROR(ARG_VALUE)
  329. }
  330. if (INST_NARGS == 2 && INST_TYPE(0) == AT_IMMEDIATE && INST_TYPE(1) == AT_INDEXED) {
  331. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 0))
  332. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0x46)
  333. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 1))
  334. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0x4E)
  335. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 2))
  336. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0x56)
  337. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 3))
  338. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0x5E)
  339. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 4))
  340. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0x66)
  341. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 5))
  342. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0x6E)
  343. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 6))
  344. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0x76)
  345. if ((INST_IMM(0).mask & IMM_BIT && INST_IMM(0).uval == 7))
  346. INST_RETURN(4, INST_INDEX_PREFIX(1), 0xCB, INST_INDEX(1).offset, 0x7E)
  347. INST_ERROR(ARG_VALUE)
  348. }
  349. INST_ERROR(ARG_TYPE)
  350. }
  351. INST_FUNC(ccf)
  352. {
  353. INST_TAKES_NO_ARGS
  354. INST_RETURN(1, 0x3F)
  355. }
  356. INST_FUNC(cpd)
  357. {
  358. INST_TAKES_NO_ARGS
  359. INST_RETURN(2, 0xED, 0xA9)
  360. }
  361. INST_FUNC(cpdr)
  362. {
  363. INST_TAKES_NO_ARGS
  364. INST_RETURN(2, 0xED, 0xB9)
  365. }
  366. INST_FUNC(cpi)
  367. {
  368. INST_TAKES_NO_ARGS
  369. INST_RETURN(2, 0xED, 0xA1)
  370. }
  371. INST_FUNC(cpir)
  372. {
  373. INST_TAKES_NO_ARGS
  374. INST_RETURN(2, 0xED, 0xB1)
  375. }
  376. INST_FUNC(cpl)
  377. {
  378. INST_TAKES_NO_ARGS
  379. INST_RETURN(1, 0x2F)
  380. }
  381. INST_FUNC(daa)
  382. {
  383. INST_TAKES_NO_ARGS
  384. INST_RETURN(1, 0x27)
  385. }
  386. INST_FUNC(di)
  387. {
  388. INST_TAKES_NO_ARGS
  389. INST_RETURN(1, 0xF3)
  390. }
  391. INST_FUNC(ei)
  392. {
  393. INST_TAKES_NO_ARGS
  394. INST_RETURN(1, 0xFB)
  395. }
  396. INST_FUNC(exx)
  397. {
  398. INST_TAKES_NO_ARGS
  399. INST_RETURN(1, 0xD9)
  400. }
  401. INST_FUNC(halt)
  402. {
  403. INST_TAKES_NO_ARGS
  404. INST_RETURN(1, 0x76)
  405. }
  406. INST_FUNC(inc)
  407. {
  408. INST_TAKES_ARGS(
  409. AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  410. AT_NONE,
  411. AT_NONE
  412. )
  413. if (INST_NARGS == 1 && INST_TYPE(0) == AT_REGISTER) {
  414. if (INST_REG(0) == REG_A)
  415. INST_RETURN(1, 0x3C)
  416. if (INST_REG(0) == REG_B)
  417. INST_RETURN(1, 0x04)
  418. if (INST_REG(0) == REG_C)
  419. INST_RETURN(1, 0x0C)
  420. if (INST_REG(0) == REG_D)
  421. INST_RETURN(1, 0x14)
  422. if (INST_REG(0) == REG_E)
  423. INST_RETURN(1, 0x1C)
  424. if (INST_REG(0) == REG_H)
  425. INST_RETURN(1, 0x24)
  426. if (INST_REG(0) == REG_IXH)
  427. INST_RETURN(2, INST_IX_PREFIX, 0x24)
  428. if (INST_REG(0) == REG_IYH)
  429. INST_RETURN(2, INST_IY_PREFIX, 0x24)
  430. if (INST_REG(0) == REG_L)
  431. INST_RETURN(1, 0x2C)
  432. if (INST_REG(0) == REG_IXL)
  433. INST_RETURN(2, INST_IX_PREFIX, 0x2C)
  434. if (INST_REG(0) == REG_IYL)
  435. INST_RETURN(2, INST_IY_PREFIX, 0x2C)
  436. if (INST_REG(0) == REG_BC)
  437. INST_RETURN(1, 0x03)
  438. if (INST_REG(0) == REG_DE)
  439. INST_RETURN(1, 0x13)
  440. if (INST_REG(0) == REG_HL)
  441. INST_RETURN(1, 0x23)
  442. if (INST_REG(0) == REG_IX)
  443. INST_RETURN(2, INST_IX_PREFIX, 0x23)
  444. if (INST_REG(0) == REG_IY)
  445. INST_RETURN(2, INST_IY_PREFIX, 0x23)
  446. if (INST_REG(0) == REG_SP)
  447. INST_RETURN(1, 0x33)
  448. INST_ERROR(ARG_VALUE)
  449. }
  450. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDIRECT &&
  451. (INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_HL)) {
  452. INST_RETURN(1, 0x34)
  453. }
  454. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDEXED) {
  455. INST_RETURN(3, INST_INDEX_PREFIX(0), 0x34, INST_INDEX(0).offset)
  456. }
  457. INST_ERROR(ARG_TYPE)
  458. }
  459. INST_FUNC(ind)
  460. {
  461. INST_TAKES_NO_ARGS
  462. INST_RETURN(2, 0xED, 0xAA)
  463. }
  464. INST_FUNC(indr)
  465. {
  466. INST_TAKES_NO_ARGS
  467. INST_RETURN(2, 0xED, 0xBA)
  468. }
  469. INST_FUNC(ini)
  470. {
  471. INST_TAKES_NO_ARGS
  472. INST_RETURN(2, 0xED, 0xA2)
  473. }
  474. INST_FUNC(inir)
  475. {
  476. INST_TAKES_NO_ARGS
  477. INST_RETURN(2, 0xED, 0xB2)
  478. }
  479. INST_FUNC(ld)
  480. {
  481. INST_TAKES_ARGS(
  482. AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  483. AT_IMMEDIATE|AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  484. AT_NONE
  485. )
  486. if (INST_NARGS == 2 && INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_REGISTER) {
  487. if (INST_REG(0) == REG_A && INST_REG(1) == REG_A)
  488. INST_RETURN(1, 0x7F)
  489. if (INST_REG(0) == REG_A && INST_REG(1) == REG_B)
  490. INST_RETURN(1, 0x78)
  491. if (INST_REG(0) == REG_A && INST_REG(1) == REG_C)
  492. INST_RETURN(1, 0x79)
  493. if (INST_REG(0) == REG_A && INST_REG(1) == REG_D)
  494. INST_RETURN(1, 0x7A)
  495. if (INST_REG(0) == REG_A && INST_REG(1) == REG_E)
  496. INST_RETURN(1, 0x7B)
  497. if (INST_REG(0) == REG_A && INST_REG(1) == REG_H)
  498. INST_RETURN(1, 0x7C)
  499. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IXH)
  500. INST_RETURN(2, INST_IX_PREFIX, 0x7C)
  501. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IYH)
  502. INST_RETURN(2, INST_IY_PREFIX, 0x7C)
  503. if (INST_REG(0) == REG_A && INST_REG(1) == REG_L)
  504. INST_RETURN(1, 0x7D)
  505. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IXL)
  506. INST_RETURN(2, INST_IX_PREFIX, 0x7D)
  507. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IYL)
  508. INST_RETURN(2, INST_IY_PREFIX, 0x7D)
  509. if (INST_REG(0) == REG_B && INST_REG(1) == REG_A)
  510. INST_RETURN(1, 0x47)
  511. if (INST_REG(0) == REG_B && INST_REG(1) == REG_B)
  512. INST_RETURN(1, 0x40)
  513. if (INST_REG(0) == REG_B && INST_REG(1) == REG_C)
  514. INST_RETURN(1, 0x41)
  515. if (INST_REG(0) == REG_B && INST_REG(1) == REG_D)
  516. INST_RETURN(1, 0x42)
  517. if (INST_REG(0) == REG_B && INST_REG(1) == REG_E)
  518. INST_RETURN(1, 0x43)
  519. if (INST_REG(0) == REG_B && INST_REG(1) == REG_H)
  520. INST_RETURN(1, 0x44)
  521. if (INST_REG(0) == REG_B && INST_REG(1) == REG_IXH)
  522. INST_RETURN(2, INST_IX_PREFIX, 0x44)
  523. if (INST_REG(0) == REG_B && INST_REG(1) == REG_IYH)
  524. INST_RETURN(2, INST_IY_PREFIX, 0x44)
  525. if (INST_REG(0) == REG_B && INST_REG(1) == REG_L)
  526. INST_RETURN(1, 0x45)
  527. if (INST_REG(0) == REG_B && INST_REG(1) == REG_IXL)
  528. INST_RETURN(2, INST_IX_PREFIX, 0x45)
  529. if (INST_REG(0) == REG_B && INST_REG(1) == REG_IYL)
  530. INST_RETURN(2, INST_IY_PREFIX, 0x45)
  531. if (INST_REG(0) == REG_C && INST_REG(1) == REG_A)
  532. INST_RETURN(1, 0x4F)
  533. if (INST_REG(0) == REG_C && INST_REG(1) == REG_B)
  534. INST_RETURN(1, 0x48)
  535. if (INST_REG(0) == REG_C && INST_REG(1) == REG_C)
  536. INST_RETURN(1, 0x49)
  537. if (INST_REG(0) == REG_C && INST_REG(1) == REG_D)
  538. INST_RETURN(1, 0x4A)
  539. if (INST_REG(0) == REG_C && INST_REG(1) == REG_E)
  540. INST_RETURN(1, 0x4B)
  541. if (INST_REG(0) == REG_C && INST_REG(1) == REG_H)
  542. INST_RETURN(1, 0x4C)
  543. if (INST_REG(0) == REG_C && INST_REG(1) == REG_IXH)
  544. INST_RETURN(2, INST_IX_PREFIX, 0x4C)
  545. if (INST_REG(0) == REG_C && INST_REG(1) == REG_IYH)
  546. INST_RETURN(2, INST_IY_PREFIX, 0x4C)
  547. if (INST_REG(0) == REG_C && INST_REG(1) == REG_L)
  548. INST_RETURN(1, 0x4D)
  549. if (INST_REG(0) == REG_C && INST_REG(1) == REG_IXL)
  550. INST_RETURN(2, INST_IX_PREFIX, 0x4D)
  551. if (INST_REG(0) == REG_C && INST_REG(1) == REG_IYL)
  552. INST_RETURN(2, INST_IY_PREFIX, 0x4D)
  553. if (INST_REG(0) == REG_D && INST_REG(1) == REG_A)
  554. INST_RETURN(1, 0x57)
  555. if (INST_REG(0) == REG_D && INST_REG(1) == REG_B)
  556. INST_RETURN(1, 0x50)
  557. if (INST_REG(0) == REG_D && INST_REG(1) == REG_C)
  558. INST_RETURN(1, 0x51)
  559. if (INST_REG(0) == REG_D && INST_REG(1) == REG_D)
  560. INST_RETURN(1, 0x52)
  561. if (INST_REG(0) == REG_D && INST_REG(1) == REG_E)
  562. INST_RETURN(1, 0x53)
  563. if (INST_REG(0) == REG_D && INST_REG(1) == REG_H)
  564. INST_RETURN(1, 0x54)
  565. if (INST_REG(0) == REG_D && INST_REG(1) == REG_IXH)
  566. INST_RETURN(2, INST_IX_PREFIX, 0x54)
  567. if (INST_REG(0) == REG_D && INST_REG(1) == REG_IYH)
  568. INST_RETURN(2, INST_IY_PREFIX, 0x54)
  569. if (INST_REG(0) == REG_D && INST_REG(1) == REG_L)
  570. INST_RETURN(1, 0x55)
  571. if (INST_REG(0) == REG_D && INST_REG(1) == REG_IXL)
  572. INST_RETURN(2, INST_IX_PREFIX, 0x55)
  573. if (INST_REG(0) == REG_D && INST_REG(1) == REG_IYL)
  574. INST_RETURN(2, INST_IY_PREFIX, 0x55)
  575. if (INST_REG(0) == REG_E && INST_REG(1) == REG_A)
  576. INST_RETURN(1, 0x5F)
  577. if (INST_REG(0) == REG_E && INST_REG(1) == REG_B)
  578. INST_RETURN(1, 0x58)
  579. if (INST_REG(0) == REG_E && INST_REG(1) == REG_C)
  580. INST_RETURN(1, 0x59)
  581. if (INST_REG(0) == REG_E && INST_REG(1) == REG_D)
  582. INST_RETURN(1, 0x5A)
  583. if (INST_REG(0) == REG_E && INST_REG(1) == REG_E)
  584. INST_RETURN(1, 0x5B)
  585. if (INST_REG(0) == REG_E && INST_REG(1) == REG_H)
  586. INST_RETURN(1, 0x5C)
  587. if (INST_REG(0) == REG_E && INST_REG(1) == REG_IXH)
  588. INST_RETURN(2, INST_IX_PREFIX, 0x5C)
  589. if (INST_REG(0) == REG_E && INST_REG(1) == REG_IYH)
  590. INST_RETURN(2, INST_IY_PREFIX, 0x5C)
  591. if (INST_REG(0) == REG_E && INST_REG(1) == REG_L)
  592. INST_RETURN(1, 0x5D)
  593. if (INST_REG(0) == REG_E && INST_REG(1) == REG_IXL)
  594. INST_RETURN(2, INST_IX_PREFIX, 0x5D)
  595. if (INST_REG(0) == REG_E && INST_REG(1) == REG_IYL)
  596. INST_RETURN(2, INST_IY_PREFIX, 0x5D)
  597. if (INST_REG(0) == REG_H && INST_REG(1) == REG_A)
  598. INST_RETURN(1, 0x67)
  599. if (INST_REG(0) == REG_IXH && INST_REG(1) == REG_A)
  600. INST_RETURN(2, INST_IX_PREFIX, 0x67)
  601. if (INST_REG(0) == REG_IYH && INST_REG(1) == REG_A)
  602. INST_RETURN(2, INST_IY_PREFIX, 0x67)
  603. if (INST_REG(0) == REG_H && INST_REG(1) == REG_B)
  604. INST_RETURN(1, 0x60)
  605. if (INST_REG(0) == REG_IXH && INST_REG(1) == REG_B)
  606. INST_RETURN(2, INST_IX_PREFIX, 0x60)
  607. if (INST_REG(0) == REG_IYH && INST_REG(1) == REG_B)
  608. INST_RETURN(2, INST_IY_PREFIX, 0x60)
  609. if (INST_REG(0) == REG_H && INST_REG(1) == REG_C)
  610. INST_RETURN(1, 0x61)
  611. if (INST_REG(0) == REG_IXH && INST_REG(1) == REG_C)
  612. INST_RETURN(2, INST_IX_PREFIX, 0x61)
  613. if (INST_REG(0) == REG_IYH && INST_REG(1) == REG_C)
  614. INST_RETURN(2, INST_IY_PREFIX, 0x61)
  615. if (INST_REG(0) == REG_H && INST_REG(1) == REG_D)
  616. INST_RETURN(1, 0x62)
  617. if (INST_REG(0) == REG_IXH && INST_REG(1) == REG_D)
  618. INST_RETURN(2, INST_IX_PREFIX, 0x62)
  619. if (INST_REG(0) == REG_IYH && INST_REG(1) == REG_D)
  620. INST_RETURN(2, INST_IY_PREFIX, 0x62)
  621. if (INST_REG(0) == REG_H && INST_REG(1) == REG_E)
  622. INST_RETURN(1, 0x63)
  623. if (INST_REG(0) == REG_IXH && INST_REG(1) == REG_E)
  624. INST_RETURN(2, INST_IX_PREFIX, 0x63)
  625. if (INST_REG(0) == REG_IYH && INST_REG(1) == REG_E)
  626. INST_RETURN(2, INST_IY_PREFIX, 0x63)
  627. if (INST_REG(0) == REG_H && INST_REG(1) == REG_H)
  628. INST_RETURN(1, 0x64)
  629. if (INST_REG(0) == REG_IXH && INST_REG(1) == REG_IXH)
  630. INST_RETURN(2, INST_IX_PREFIX, 0x64)
  631. if (INST_REG(0) == REG_IYH && INST_REG(1) == REG_IYH)
  632. INST_RETURN(2, INST_IY_PREFIX, 0x64)
  633. if (INST_REG(0) == REG_H && INST_REG(1) == REG_L)
  634. INST_RETURN(1, 0x65)
  635. if (INST_REG(0) == REG_IXH && INST_REG(1) == REG_IXL)
  636. INST_RETURN(2, INST_IX_PREFIX, 0x65)
  637. if (INST_REG(0) == REG_IYH && INST_REG(1) == REG_IYL)
  638. INST_RETURN(2, INST_IY_PREFIX, 0x65)
  639. if (INST_REG(0) == REG_L && INST_REG(1) == REG_A)
  640. INST_RETURN(1, 0x6F)
  641. if (INST_REG(0) == REG_IXL && INST_REG(1) == REG_A)
  642. INST_RETURN(2, INST_IX_PREFIX, 0x6F)
  643. if (INST_REG(0) == REG_IYL && INST_REG(1) == REG_A)
  644. INST_RETURN(2, INST_IY_PREFIX, 0x6F)
  645. if (INST_REG(0) == REG_L && INST_REG(1) == REG_B)
  646. INST_RETURN(1, 0x68)
  647. if (INST_REG(0) == REG_IXL && INST_REG(1) == REG_B)
  648. INST_RETURN(2, INST_IX_PREFIX, 0x68)
  649. if (INST_REG(0) == REG_IYL && INST_REG(1) == REG_B)
  650. INST_RETURN(2, INST_IY_PREFIX, 0x68)
  651. if (INST_REG(0) == REG_L && INST_REG(1) == REG_C)
  652. INST_RETURN(1, 0x69)
  653. if (INST_REG(0) == REG_IXL && INST_REG(1) == REG_C)
  654. INST_RETURN(2, INST_IX_PREFIX, 0x69)
  655. if (INST_REG(0) == REG_IYL && INST_REG(1) == REG_C)
  656. INST_RETURN(2, INST_IY_PREFIX, 0x69)
  657. if (INST_REG(0) == REG_L && INST_REG(1) == REG_D)
  658. INST_RETURN(1, 0x6A)
  659. if (INST_REG(0) == REG_IXL && INST_REG(1) == REG_D)
  660. INST_RETURN(2, INST_IX_PREFIX, 0x6A)
  661. if (INST_REG(0) == REG_IYL && INST_REG(1) == REG_D)
  662. INST_RETURN(2, INST_IY_PREFIX, 0x6A)
  663. if (INST_REG(0) == REG_L && INST_REG(1) == REG_E)
  664. INST_RETURN(1, 0x6B)
  665. if (INST_REG(0) == REG_IXL && INST_REG(1) == REG_E)
  666. INST_RETURN(2, INST_IX_PREFIX, 0x6B)
  667. if (INST_REG(0) == REG_IYL && INST_REG(1) == REG_E)
  668. INST_RETURN(2, INST_IY_PREFIX, 0x6B)
  669. if (INST_REG(0) == REG_L && INST_REG(1) == REG_H)
  670. INST_RETURN(1, 0x6C)
  671. if (INST_REG(0) == REG_IXL && INST_REG(1) == REG_IXH)
  672. INST_RETURN(2, INST_IX_PREFIX, 0x6C)
  673. if (INST_REG(0) == REG_IYL && INST_REG(1) == REG_IYH)
  674. INST_RETURN(2, INST_IY_PREFIX, 0x6C)
  675. if (INST_REG(0) == REG_L && INST_REG(1) == REG_L)
  676. INST_RETURN(1, 0x6D)
  677. if (INST_REG(0) == REG_IXL && INST_REG(1) == REG_IXL)
  678. INST_RETURN(2, INST_IX_PREFIX, 0x6D)
  679. if (INST_REG(0) == REG_IYL && INST_REG(1) == REG_IYL)
  680. INST_RETURN(2, INST_IY_PREFIX, 0x6D)
  681. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IX)
  682. INST_RETURN(3, INST_IX_PREFIX, 0xED, 0x57)
  683. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IY)
  684. INST_RETURN(3, INST_IY_PREFIX, 0xED, 0x57)
  685. if (INST_REG(0) == REG_IX && INST_REG(1) == REG_A)
  686. INST_RETURN(3, INST_IX_PREFIX, 0xED, 0x47)
  687. if (INST_REG(0) == REG_IY && INST_REG(1) == REG_A)
  688. INST_RETURN(3, INST_IY_PREFIX, 0xED, 0x47)
  689. if (INST_REG(0) == REG_A && INST_REG(1) == REG_R)
  690. INST_RETURN(2, 0xED, 0x5F)
  691. if (INST_REG(0) == REG_R && INST_REG(1) == REG_A)
  692. INST_RETURN(2, 0xED, 0x4F)
  693. if (INST_REG(0) == REG_SP && INST_REG(1) == REG_HL)
  694. INST_RETURN(1, 0xF9)
  695. if (INST_REG(0) == REG_SP && INST_REG(1) == REG_IX)
  696. INST_RETURN(2, INST_IX_PREFIX, 0xF9)
  697. if (INST_REG(0) == REG_SP && INST_REG(1) == REG_IY)
  698. INST_RETURN(2, INST_IY_PREFIX, 0xF9)
  699. INST_ERROR(ARG_VALUE)
  700. }
  701. if (INST_NARGS == 2 && INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_IMMEDIATE) {
  702. if (INST_REG(0) == REG_A && INST_IMM(1).mask & IMM_U8)
  703. INST_RETURN(2, 0x3E, INST_IMM(1).uval)
  704. if (INST_REG(0) == REG_B && INST_IMM(1).mask & IMM_U8)
  705. INST_RETURN(2, 0x06, INST_IMM(1).uval)
  706. if (INST_REG(0) == REG_C && INST_IMM(1).mask & IMM_U8)
  707. INST_RETURN(2, 0x0E, INST_IMM(1).uval)
  708. if (INST_REG(0) == REG_D && INST_IMM(1).mask & IMM_U8)
  709. INST_RETURN(2, 0x16, INST_IMM(1).uval)
  710. if (INST_REG(0) == REG_E && INST_IMM(1).mask & IMM_U8)
  711. INST_RETURN(2, 0x1E, INST_IMM(1).uval)
  712. if (INST_REG(0) == REG_H && INST_IMM(1).mask & IMM_U8)
  713. INST_RETURN(2, 0x26, INST_IMM(1).uval)
  714. if (INST_REG(0) == REG_IXH && INST_IMM(1).mask & IMM_U8)
  715. INST_RETURN(3, INST_IX_PREFIX, 0x26, INST_IMM(1).uval)
  716. if (INST_REG(0) == REG_IYH && INST_IMM(1).mask & IMM_U8)
  717. INST_RETURN(3, INST_IY_PREFIX, 0x26, INST_IMM(1).uval)
  718. if (INST_REG(0) == REG_L && INST_IMM(1).mask & IMM_U8)
  719. INST_RETURN(2, 0x2E, INST_IMM(1).uval)
  720. if (INST_REG(0) == REG_IXL && INST_IMM(1).mask & IMM_U8)
  721. INST_RETURN(3, INST_IX_PREFIX, 0x2E, INST_IMM(1).uval)
  722. if (INST_REG(0) == REG_IYL && INST_IMM(1).mask & IMM_U8)
  723. INST_RETURN(3, INST_IY_PREFIX, 0x2E, INST_IMM(1).uval)
  724. if (INST_REG(0) == REG_BC && INST_IMM(1).mask & IMM_U16)
  725. INST_RETURN(3, 0x01, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  726. if (INST_REG(0) == REG_DE && INST_IMM(1).mask & IMM_U16)
  727. INST_RETURN(3, 0x11, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  728. if (INST_REG(0) == REG_HL && INST_IMM(1).mask & IMM_U16)
  729. INST_RETURN(3, 0x21, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  730. if (INST_REG(0) == REG_IX && INST_IMM(1).mask & IMM_U16)
  731. INST_RETURN(4, INST_IX_PREFIX, 0x21, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  732. if (INST_REG(0) == REG_IY && INST_IMM(1).mask & IMM_U16)
  733. INST_RETURN(4, INST_IY_PREFIX, 0x21, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  734. if (INST_REG(0) == REG_SP && INST_IMM(1).mask & IMM_U16)
  735. INST_RETURN(3, 0x31, INST_IMM_U16_B1(INST_IMM(1)), INST_IMM_U16_B2(INST_IMM(1)))
  736. INST_ERROR(ARG_VALUE)
  737. }
  738. if (INST_NARGS == 2 && INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_INDIRECT &&
  739. (INST_INDIRECT(1).type == AT_REGISTER && INST_INDIRECT(1).addr.reg == REG_HL)) {
  740. if (INST_REG(0) == REG_A)
  741. INST_RETURN(1, 0x7E)
  742. if (INST_REG(0) == REG_B)
  743. INST_RETURN(1, 0x46)
  744. if (INST_REG(0) == REG_C)
  745. INST_RETURN(1, 0x4E)
  746. if (INST_REG(0) == REG_D)
  747. INST_RETURN(1, 0x56)
  748. if (INST_REG(0) == REG_E)
  749. INST_RETURN(1, 0x5E)
  750. if (INST_REG(0) == REG_H)
  751. INST_RETURN(1, 0x66)
  752. if (INST_REG(0) == REG_L)
  753. INST_RETURN(1, 0x6E)
  754. INST_ERROR(ARG_VALUE)
  755. }
  756. if (INST_NARGS == 2 && INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_INDEXED) {
  757. if (INST_REG(0) == REG_A)
  758. INST_RETURN(3, INST_INDEX_PREFIX(1), 0x7E, INST_INDEX(1).offset)
  759. if (INST_REG(0) == REG_B)
  760. INST_RETURN(3, INST_INDEX_PREFIX(1), 0x46, INST_INDEX(1).offset)
  761. if (INST_REG(0) == REG_C)
  762. INST_RETURN(3, INST_INDEX_PREFIX(1), 0x4E, INST_INDEX(1).offset)
  763. if (INST_REG(0) == REG_D)
  764. INST_RETURN(3, INST_INDEX_PREFIX(1), 0x56, INST_INDEX(1).offset)
  765. if (INST_REG(0) == REG_E)
  766. INST_RETURN(3, INST_INDEX_PREFIX(1), 0x5E, INST_INDEX(1).offset)
  767. if (INST_REG(0) == REG_H)
  768. INST_RETURN(3, INST_INDEX_PREFIX(1), 0x66, INST_INDEX(1).offset)
  769. if (INST_REG(0) == REG_L)
  770. INST_RETURN(3, INST_INDEX_PREFIX(1), 0x6E, INST_INDEX(1).offset)
  771. INST_ERROR(ARG_VALUE)
  772. }
  773. if (INST_NARGS == 2 && INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_INDIRECT) {
  774. if (INST_REG(0) == REG_A && (INST_INDIRECT(1).type == AT_REGISTER && INST_INDIRECT(1).addr.reg == REG_BC))
  775. INST_RETURN(1, 0x0A)
  776. if (INST_REG(0) == REG_A && (INST_INDIRECT(1).type == AT_REGISTER && INST_INDIRECT(1).addr.reg == REG_DE))
  777. INST_RETURN(1, 0x1A)
  778. if (INST_REG(0) == REG_HL && INST_INDIRECT(1).type == AT_IMMEDIATE)
  779. INST_RETURN(3, 0x2A, INST_IMM_U16_B1(INST_INDIRECT(1).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(1).addr.imm))
  780. if (INST_REG(0) == REG_IX && INST_INDIRECT(1).type == AT_IMMEDIATE)
  781. INST_RETURN(4, INST_IX_PREFIX, 0x2A, INST_IMM_U16_B1(INST_INDIRECT(1).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(1).addr.imm))
  782. if (INST_REG(0) == REG_IY && INST_INDIRECT(1).type == AT_IMMEDIATE)
  783. INST_RETURN(4, INST_IY_PREFIX, 0x2A, INST_IMM_U16_B1(INST_INDIRECT(1).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(1).addr.imm))
  784. if (INST_REG(0) == REG_A && INST_INDIRECT(1).type == AT_IMMEDIATE)
  785. INST_RETURN(3, 0x3A, INST_IMM_U16_B1(INST_INDIRECT(1).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(1).addr.imm))
  786. if (INST_REG(0) == REG_BC && INST_INDIRECT(1).type == AT_IMMEDIATE)
  787. INST_RETURN(4, 0xED, 0x4B, INST_IMM_U16_B1(INST_INDIRECT(1).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(1).addr.imm))
  788. if (INST_REG(0) == REG_DE && INST_INDIRECT(1).type == AT_IMMEDIATE)
  789. INST_RETURN(4, 0xED, 0x5B, INST_IMM_U16_B1(INST_INDIRECT(1).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(1).addr.imm))
  790. if (INST_REG(0) == REG_SP && INST_INDIRECT(1).type == AT_IMMEDIATE)
  791. INST_RETURN(4, 0xED, 0x7B, INST_IMM_U16_B1(INST_INDIRECT(1).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(1).addr.imm))
  792. INST_ERROR(ARG_VALUE)
  793. }
  794. if (INST_NARGS == 2 && INST_TYPE(0) == AT_INDIRECT && INST_TYPE(1) == AT_REGISTER &&
  795. (INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_HL)) {
  796. if (INST_REG(1) == REG_A)
  797. INST_RETURN(1, 0x77)
  798. if (INST_REG(1) == REG_B)
  799. INST_RETURN(1, 0x70)
  800. if (INST_REG(1) == REG_C)
  801. INST_RETURN(1, 0x71)
  802. if (INST_REG(1) == REG_D)
  803. INST_RETURN(1, 0x72)
  804. if (INST_REG(1) == REG_E)
  805. INST_RETURN(1, 0x73)
  806. if (INST_REG(1) == REG_H)
  807. INST_RETURN(1, 0x74)
  808. if (INST_REG(1) == REG_L)
  809. INST_RETURN(1, 0x75)
  810. INST_ERROR(ARG_VALUE)
  811. }
  812. if (INST_NARGS == 2 && INST_TYPE(0) == AT_INDEXED && INST_TYPE(1) == AT_REGISTER) {
  813. if (INST_REG(1) == REG_A)
  814. INST_RETURN(3, INST_INDEX_PREFIX(0), 0x77, INST_INDEX(0).offset)
  815. if (INST_REG(1) == REG_B)
  816. INST_RETURN(3, INST_INDEX_PREFIX(0), 0x70, INST_INDEX(0).offset)
  817. if (INST_REG(1) == REG_C)
  818. INST_RETURN(3, INST_INDEX_PREFIX(0), 0x71, INST_INDEX(0).offset)
  819. if (INST_REG(1) == REG_D)
  820. INST_RETURN(3, INST_INDEX_PREFIX(0), 0x72, INST_INDEX(0).offset)
  821. if (INST_REG(1) == REG_E)
  822. INST_RETURN(3, INST_INDEX_PREFIX(0), 0x73, INST_INDEX(0).offset)
  823. if (INST_REG(1) == REG_H)
  824. INST_RETURN(3, INST_INDEX_PREFIX(0), 0x74, INST_INDEX(0).offset)
  825. if (INST_REG(1) == REG_L)
  826. INST_RETURN(3, INST_INDEX_PREFIX(0), 0x75, INST_INDEX(0).offset)
  827. INST_ERROR(ARG_VALUE)
  828. }
  829. if (INST_NARGS == 2 && INST_TYPE(0) == AT_INDIRECT && INST_TYPE(1) == AT_IMMEDIATE &&
  830. (INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_HL)) {
  831. if (INST_IMM(1).mask & IMM_U8)
  832. INST_RETURN(2, 0x36, INST_IMM(1).uval)
  833. INST_ERROR(ARG_VALUE)
  834. }
  835. if (INST_NARGS == 2 && INST_TYPE(0) == AT_INDEXED && INST_TYPE(1) == AT_IMMEDIATE) {
  836. if (INST_IMM(1).mask & IMM_U8)
  837. INST_RETURN(4, INST_INDEX_PREFIX(0), 0x36, INST_INDEX(0).offset, INST_IMM(1).uval)
  838. INST_ERROR(ARG_VALUE)
  839. }
  840. if (INST_NARGS == 2 && INST_TYPE(0) == AT_INDIRECT && INST_TYPE(1) == AT_REGISTER) {
  841. if ((INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_BC) && INST_REG(1) == REG_A)
  842. INST_RETURN(1, 0x02)
  843. if ((INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_DE) && INST_REG(1) == REG_A)
  844. INST_RETURN(1, 0x12)
  845. if (INST_INDIRECT(0).type == AT_IMMEDIATE && INST_REG(1) == REG_HL)
  846. INST_RETURN(3, 0x22, INST_IMM_U16_B1(INST_INDIRECT(0).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(0).addr.imm))
  847. if (INST_INDIRECT(0).type == AT_IMMEDIATE && INST_REG(1) == REG_IX)
  848. INST_RETURN(4, INST_IX_PREFIX, 0x22, INST_IMM_U16_B1(INST_INDIRECT(0).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(0).addr.imm))
  849. if (INST_INDIRECT(0).type == AT_IMMEDIATE && INST_REG(1) == REG_IY)
  850. INST_RETURN(4, INST_IY_PREFIX, 0x22, INST_IMM_U16_B1(INST_INDIRECT(0).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(0).addr.imm))
  851. if (INST_INDIRECT(0).type == AT_IMMEDIATE && INST_REG(1) == REG_A)
  852. INST_RETURN(3, 0x32, INST_IMM_U16_B1(INST_INDIRECT(0).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(0).addr.imm))
  853. if (INST_INDIRECT(0).type == AT_IMMEDIATE && INST_REG(1) == REG_BC)
  854. INST_RETURN(4, 0xED, 0x43, INST_IMM_U16_B1(INST_INDIRECT(0).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(0).addr.imm))
  855. if (INST_INDIRECT(0).type == AT_IMMEDIATE && INST_REG(1) == REG_DE)
  856. INST_RETURN(4, 0xED, 0x53, INST_IMM_U16_B1(INST_INDIRECT(0).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(0).addr.imm))
  857. if (INST_INDIRECT(0).type == AT_IMMEDIATE && INST_REG(1) == REG_SP)
  858. INST_RETURN(4, 0xED, 0x73, INST_IMM_U16_B1(INST_INDIRECT(0).addr.imm), INST_IMM_U16_B2(INST_INDIRECT(0).addr.imm))
  859. INST_ERROR(ARG_VALUE)
  860. }
  861. INST_ERROR(ARG_TYPE)
  862. }
  863. INST_FUNC(ldd)
  864. {
  865. INST_TAKES_NO_ARGS
  866. INST_RETURN(2, 0xED, 0xA8)
  867. }
  868. INST_FUNC(lddr)
  869. {
  870. INST_TAKES_NO_ARGS
  871. INST_RETURN(2, 0xED, 0xB8)
  872. }
  873. INST_FUNC(ldi)
  874. {
  875. INST_TAKES_NO_ARGS
  876. INST_RETURN(2, 0xED, 0xA0)
  877. }
  878. INST_FUNC(ldir)
  879. {
  880. INST_TAKES_NO_ARGS
  881. INST_RETURN(2, 0xED, 0xB0)
  882. }
  883. INST_FUNC(neg)
  884. {
  885. INST_TAKES_NO_ARGS
  886. INST_RETURN(2, 0xED, 0x44)
  887. }
  888. INST_FUNC(nop)
  889. {
  890. INST_TAKES_NO_ARGS
  891. INST_RETURN(1, 0x00)
  892. }
  893. INST_FUNC(otdr)
  894. {
  895. INST_TAKES_NO_ARGS
  896. INST_RETURN(2, 0xED, 0xBB)
  897. }
  898. INST_FUNC(otir)
  899. {
  900. INST_TAKES_NO_ARGS
  901. INST_RETURN(2, 0xED, 0xB3)
  902. }
  903. INST_FUNC(outd)
  904. {
  905. INST_TAKES_NO_ARGS
  906. INST_RETURN(2, 0xED, 0xAB)
  907. }
  908. INST_FUNC(outi)
  909. {
  910. INST_TAKES_NO_ARGS
  911. INST_RETURN(2, 0xED, 0xA3)
  912. }
  913. INST_FUNC(reti)
  914. {
  915. INST_TAKES_NO_ARGS
  916. INST_RETURN(2, 0xED, 0x4D)
  917. }
  918. INST_FUNC(retn)
  919. {
  920. INST_TAKES_NO_ARGS
  921. INST_RETURN(2, 0xED, 0x45)
  922. }
  923. INST_FUNC(rla)
  924. {
  925. INST_TAKES_NO_ARGS
  926. INST_RETURN(1, 0x17)
  927. }
  928. INST_FUNC(rlca)
  929. {
  930. INST_TAKES_NO_ARGS
  931. INST_RETURN(1, 0x07)
  932. }
  933. INST_FUNC(rld)
  934. {
  935. INST_TAKES_NO_ARGS
  936. INST_RETURN(2, 0xED, 0x6F)
  937. }
  938. INST_FUNC(rra)
  939. {
  940. INST_TAKES_NO_ARGS
  941. INST_RETURN(1, 0x1F)
  942. }
  943. INST_FUNC(rrca)
  944. {
  945. INST_TAKES_NO_ARGS
  946. INST_RETURN(1, 0x0F)
  947. }
  948. INST_FUNC(scf)
  949. {
  950. INST_TAKES_NO_ARGS
  951. INST_RETURN(1, 0x37)
  952. }
  953. /* @AUTOGEN_INST_BLOCK_END */
  954. /*
  955. Return the relevant ASMInstParser function for the given encoded mnemonic.
  956. */
  957. static ASMInstParser lookup_parser(uint32_t key)
  958. {
  959. /* @AUTOGEN_LOOKUP_BLOCK_START */
  960. HANDLE(adc)
  961. HANDLE(add)
  962. HANDLE(and)
  963. HANDLE(bit)
  964. HANDLE(ccf)
  965. HANDLE(cpd)
  966. HANDLE(cpdr)
  967. HANDLE(cpi)
  968. HANDLE(cpir)
  969. HANDLE(cpl)
  970. HANDLE(daa)
  971. HANDLE(di)
  972. HANDLE(ei)
  973. HANDLE(exx)
  974. HANDLE(halt)
  975. HANDLE(inc)
  976. HANDLE(ind)
  977. HANDLE(indr)
  978. HANDLE(ini)
  979. HANDLE(inir)
  980. HANDLE(ld)
  981. HANDLE(ldd)
  982. HANDLE(lddr)
  983. HANDLE(ldi)
  984. HANDLE(ldir)
  985. HANDLE(neg)
  986. HANDLE(nop)
  987. HANDLE(otdr)
  988. HANDLE(otir)
  989. HANDLE(outd)
  990. HANDLE(outi)
  991. HANDLE(reti)
  992. HANDLE(retn)
  993. HANDLE(rla)
  994. HANDLE(rlca)
  995. HANDLE(rld)
  996. HANDLE(rra)
  997. HANDLE(rrca)
  998. HANDLE(scf)
  999. /* @AUTOGEN_LOOKUP_BLOCK_END */
  1000. return NULL;
  1001. }