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.
 
 
 
 
 

449 lines
11 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 Sun May 17 03:37:44 2015 UTC
  8. */
  9. /* @AUTOGEN_INST_BLOCK_START */
  10. INST_FUNC(adc)
  11. {
  12. INST_TAKES_ARGS(
  13. AT_REGISTER,
  14. AT_IMMEDIATE|AT_INDIRECT|AT_INDEXED|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_IYL)
  35. INST_RETURN(2, INST_IY_PREFIX, 0x8D)
  36. if (INST_REG(0) == REG_A && INST_REG(1) == REG_L)
  37. INST_RETURN(1, 0x8D)
  38. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IXL)
  39. INST_RETURN(2, INST_IX_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. if (INST_REG(0) == REG_A && (INST_INDIRECT(1).type == AT_REGISTER && INST_INDIRECT(1).addr.reg == REG_HL))
  57. INST_RETURN(1, 0x8E)
  58. INST_ERROR(ARG_VALUE)
  59. }
  60. if (INST_NARGS == 2 && INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_INDEXED) {
  61. if (INST_REG(0) == REG_A)
  62. INST_RETURN(3, INST_INDEX_PREFIX(1), 0x8E, INST_INDEX(1).offset)
  63. INST_ERROR(ARG_VALUE)
  64. }
  65. INST_ERROR(ARG_TYPE)
  66. }
  67. INST_FUNC(add)
  68. {
  69. INST_TAKES_ARGS(
  70. AT_REGISTER,
  71. AT_IMMEDIATE|AT_INDIRECT|AT_INDEXED|AT_REGISTER,
  72. AT_NONE
  73. )
  74. if (INST_NARGS == 2 && INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_REGISTER) {
  75. if (INST_REG(0) == REG_A && INST_REG(1) == REG_A)
  76. INST_RETURN(1, 0x87)
  77. if (INST_REG(0) == REG_A && INST_REG(1) == REG_B)
  78. INST_RETURN(1, 0x80)
  79. if (INST_REG(0) == REG_A && INST_REG(1) == REG_C)
  80. INST_RETURN(1, 0x81)
  81. if (INST_REG(0) == REG_A && INST_REG(1) == REG_D)
  82. INST_RETURN(1, 0x82)
  83. if (INST_REG(0) == REG_A && INST_REG(1) == REG_E)
  84. INST_RETURN(1, 0x83)
  85. if (INST_REG(0) == REG_A && INST_REG(1) == REG_H)
  86. INST_RETURN(1, 0x84)
  87. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IXH)
  88. INST_RETURN(2, INST_IX_PREFIX, 0x84)
  89. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IYH)
  90. INST_RETURN(2, INST_IY_PREFIX, 0x84)
  91. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IYL)
  92. INST_RETURN(2, INST_IY_PREFIX, 0x85)
  93. if (INST_REG(0) == REG_A && INST_REG(1) == REG_L)
  94. INST_RETURN(1, 0x85)
  95. if (INST_REG(0) == REG_A && INST_REG(1) == REG_IXL)
  96. INST_RETURN(2, INST_IX_PREFIX, 0x85)
  97. if (INST_REG(0) == REG_IY && INST_REG(1) == REG_BC)
  98. INST_RETURN(2, INST_IY_PREFIX, 0x09)
  99. if (INST_REG(0) == REG_IX && INST_REG(1) == REG_BC)
  100. INST_RETURN(2, INST_IX_PREFIX, 0x09)
  101. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_BC)
  102. INST_RETURN(1, 0x09)
  103. if (INST_REG(0) == REG_IY && INST_REG(1) == REG_DE)
  104. INST_RETURN(2, INST_IY_PREFIX, 0x19)
  105. if (INST_REG(0) == REG_IX && INST_REG(1) == REG_DE)
  106. INST_RETURN(2, INST_IX_PREFIX, 0x19)
  107. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_DE)
  108. INST_RETURN(1, 0x19)
  109. if (INST_REG(0) == REG_IY && INST_REG(1) == REG_HL)
  110. INST_RETURN(2, INST_IY_PREFIX, 0x29)
  111. if (INST_REG(0) == REG_IX && INST_REG(1) == REG_HL)
  112. INST_RETURN(2, INST_IX_PREFIX, 0x29)
  113. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_HL)
  114. INST_RETURN(1, 0x29)
  115. if (INST_REG(0) == REG_IY && INST_REG(1) == REG_SP)
  116. INST_RETURN(2, INST_IY_PREFIX, 0x39)
  117. if (INST_REG(0) == REG_IX && INST_REG(1) == REG_SP)
  118. INST_RETURN(2, INST_IX_PREFIX, 0x39)
  119. if (INST_REG(0) == REG_HL && INST_REG(1) == REG_SP)
  120. INST_RETURN(1, 0x39)
  121. INST_ERROR(ARG_VALUE)
  122. }
  123. if (INST_NARGS == 2 && INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_IMMEDIATE) {
  124. if (INST_REG(0) == REG_A && INST_IMM(1).mask & IMM_U8)
  125. INST_RETURN(2, 0xC6, INST_IMM(1).uval)
  126. INST_ERROR(ARG_VALUE)
  127. }
  128. if (INST_NARGS == 2 && INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_INDIRECT) {
  129. if (INST_REG(0) == REG_A && (INST_INDIRECT(1).type == AT_REGISTER && INST_INDIRECT(1).addr.reg == REG_HL))
  130. INST_RETURN(1, 0x86)
  131. INST_ERROR(ARG_VALUE)
  132. }
  133. if (INST_NARGS == 2 && INST_TYPE(0) == AT_REGISTER && INST_TYPE(1) == AT_INDEXED) {
  134. if (INST_REG(0) == REG_A)
  135. INST_RETURN(3, INST_INDEX_PREFIX(1), 0x86, INST_INDEX(1).offset)
  136. INST_ERROR(ARG_VALUE)
  137. }
  138. INST_ERROR(ARG_TYPE)
  139. }
  140. INST_FUNC(ccf)
  141. {
  142. INST_TAKES_NO_ARGS
  143. INST_RETURN(1, 0x3F)
  144. }
  145. INST_FUNC(cpd)
  146. {
  147. INST_TAKES_NO_ARGS
  148. INST_RETURN(2, 0xED, 0xA9)
  149. }
  150. INST_FUNC(cpdr)
  151. {
  152. INST_TAKES_NO_ARGS
  153. INST_RETURN(2, 0xED, 0xB9)
  154. }
  155. INST_FUNC(cpi)
  156. {
  157. INST_TAKES_NO_ARGS
  158. INST_RETURN(2, 0xED, 0xA1)
  159. }
  160. INST_FUNC(cpir)
  161. {
  162. INST_TAKES_NO_ARGS
  163. INST_RETURN(2, 0xED, 0xB1)
  164. }
  165. INST_FUNC(cpl)
  166. {
  167. INST_TAKES_NO_ARGS
  168. INST_RETURN(1, 0x2F)
  169. }
  170. INST_FUNC(daa)
  171. {
  172. INST_TAKES_NO_ARGS
  173. INST_RETURN(1, 0x27)
  174. }
  175. INST_FUNC(di)
  176. {
  177. INST_TAKES_NO_ARGS
  178. INST_RETURN(1, 0xF3)
  179. }
  180. INST_FUNC(ei)
  181. {
  182. INST_TAKES_NO_ARGS
  183. INST_RETURN(1, 0xFB)
  184. }
  185. INST_FUNC(exx)
  186. {
  187. INST_TAKES_NO_ARGS
  188. INST_RETURN(1, 0xD9)
  189. }
  190. INST_FUNC(halt)
  191. {
  192. INST_TAKES_NO_ARGS
  193. INST_RETURN(1, 0x76)
  194. }
  195. INST_FUNC(inc)
  196. {
  197. INST_TAKES_ARGS(
  198. AT_INDEXED|AT_INDIRECT|AT_REGISTER,
  199. AT_NONE,
  200. AT_NONE
  201. )
  202. if (INST_NARGS == 1 && INST_TYPE(0) == AT_REGISTER) {
  203. if (INST_REG(0) == REG_A)
  204. INST_RETURN(1, 0x3C)
  205. if (INST_REG(0) == REG_B)
  206. INST_RETURN(1, 0x04)
  207. if (INST_REG(0) == REG_C)
  208. INST_RETURN(1, 0x0C)
  209. if (INST_REG(0) == REG_D)
  210. INST_RETURN(1, 0x14)
  211. if (INST_REG(0) == REG_E)
  212. INST_RETURN(1, 0x1C)
  213. if (INST_REG(0) == REG_H)
  214. INST_RETURN(1, 0x24)
  215. if (INST_REG(0) == REG_IXH)
  216. INST_RETURN(2, INST_IX_PREFIX, 0x24)
  217. if (INST_REG(0) == REG_IYH)
  218. INST_RETURN(2, INST_IY_PREFIX, 0x24)
  219. if (INST_REG(0) == REG_IYL)
  220. INST_RETURN(2, INST_IY_PREFIX, 0x2C)
  221. if (INST_REG(0) == REG_L)
  222. INST_RETURN(1, 0x2C)
  223. if (INST_REG(0) == REG_IXL)
  224. INST_RETURN(2, INST_IX_PREFIX, 0x2C)
  225. if (INST_REG(0) == REG_BC)
  226. INST_RETURN(1, 0x03)
  227. if (INST_REG(0) == REG_DE)
  228. INST_RETURN(1, 0x13)
  229. if (INST_REG(0) == REG_IY)
  230. INST_RETURN(2, INST_IY_PREFIX, 0x23)
  231. if (INST_REG(0) == REG_IX)
  232. INST_RETURN(2, INST_IX_PREFIX, 0x23)
  233. if (INST_REG(0) == REG_HL)
  234. INST_RETURN(1, 0x23)
  235. if (INST_REG(0) == REG_SP)
  236. INST_RETURN(1, 0x33)
  237. INST_ERROR(ARG_VALUE)
  238. }
  239. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDIRECT) {
  240. if ((INST_INDIRECT(0).type == AT_REGISTER && INST_INDIRECT(0).addr.reg == REG_HL))
  241. INST_RETURN(1, 0x34)
  242. INST_ERROR(ARG_VALUE)
  243. }
  244. if (INST_NARGS == 1 && INST_TYPE(0) == AT_INDEXED) {
  245. if (1)
  246. INST_RETURN(3, INST_INDEX_PREFIX(0), 0x34, INST_INDEX(0).offset)
  247. INST_ERROR(ARG_VALUE)
  248. }
  249. INST_ERROR(ARG_TYPE)
  250. }
  251. INST_FUNC(ind)
  252. {
  253. INST_TAKES_NO_ARGS
  254. INST_RETURN(2, 0xED, 0xAA)
  255. }
  256. INST_FUNC(indr)
  257. {
  258. INST_TAKES_NO_ARGS
  259. INST_RETURN(2, 0xED, 0xBA)
  260. }
  261. INST_FUNC(ini)
  262. {
  263. INST_TAKES_NO_ARGS
  264. INST_RETURN(2, 0xED, 0xA2)
  265. }
  266. INST_FUNC(inir)
  267. {
  268. INST_TAKES_NO_ARGS
  269. INST_RETURN(2, 0xED, 0xB2)
  270. }
  271. INST_FUNC(ldd)
  272. {
  273. INST_TAKES_NO_ARGS
  274. INST_RETURN(2, 0xED, 0xA8)
  275. }
  276. INST_FUNC(lddr)
  277. {
  278. INST_TAKES_NO_ARGS
  279. INST_RETURN(2, 0xED, 0xB8)
  280. }
  281. INST_FUNC(ldi)
  282. {
  283. INST_TAKES_NO_ARGS
  284. INST_RETURN(2, 0xED, 0xA0)
  285. }
  286. INST_FUNC(ldir)
  287. {
  288. INST_TAKES_NO_ARGS
  289. INST_RETURN(2, 0xED, 0xB0)
  290. }
  291. INST_FUNC(neg)
  292. {
  293. INST_TAKES_NO_ARGS
  294. INST_RETURN(2, 0xED, 0x44)
  295. }
  296. INST_FUNC(nop)
  297. {
  298. INST_TAKES_NO_ARGS
  299. INST_RETURN(1, 0x00)
  300. }
  301. INST_FUNC(otdr)
  302. {
  303. INST_TAKES_NO_ARGS
  304. INST_RETURN(2, 0xED, 0xBB)
  305. }
  306. INST_FUNC(otir)
  307. {
  308. INST_TAKES_NO_ARGS
  309. INST_RETURN(2, 0xED, 0xB3)
  310. }
  311. INST_FUNC(outd)
  312. {
  313. INST_TAKES_NO_ARGS
  314. INST_RETURN(2, 0xED, 0xAB)
  315. }
  316. INST_FUNC(outi)
  317. {
  318. INST_TAKES_NO_ARGS
  319. INST_RETURN(2, 0xED, 0xA3)
  320. }
  321. INST_FUNC(reti)
  322. {
  323. INST_TAKES_NO_ARGS
  324. INST_RETURN(2, 0xED, 0x4D)
  325. }
  326. INST_FUNC(retn)
  327. {
  328. INST_TAKES_NO_ARGS
  329. INST_RETURN(2, 0xED, 0x45)
  330. }
  331. INST_FUNC(rla)
  332. {
  333. INST_TAKES_NO_ARGS
  334. INST_RETURN(1, 0x17)
  335. }
  336. INST_FUNC(rlca)
  337. {
  338. INST_TAKES_NO_ARGS
  339. INST_RETURN(1, 0x07)
  340. }
  341. INST_FUNC(rld)
  342. {
  343. INST_TAKES_NO_ARGS
  344. INST_RETURN(2, 0xED, 0x6F)
  345. }
  346. INST_FUNC(rra)
  347. {
  348. INST_TAKES_NO_ARGS
  349. INST_RETURN(1, 0x1F)
  350. }
  351. INST_FUNC(rrca)
  352. {
  353. INST_TAKES_NO_ARGS
  354. INST_RETURN(1, 0x0F)
  355. }
  356. INST_FUNC(scf)
  357. {
  358. INST_TAKES_NO_ARGS
  359. INST_RETURN(1, 0x37)
  360. }
  361. /* @AUTOGEN_INST_BLOCK_END */
  362. /*
  363. Return the relevant ASMInstParser function for the given encoded mnemonic.
  364. */
  365. static ASMInstParser lookup_parser(uint32_t key)
  366. {
  367. /* @AUTOGEN_LOOKUP_BLOCK_START */
  368. HANDLE(adc)
  369. HANDLE(add)
  370. HANDLE(ccf)
  371. HANDLE(cpd)
  372. HANDLE(cpdr)
  373. HANDLE(cpi)
  374. HANDLE(cpir)
  375. HANDLE(cpl)
  376. HANDLE(daa)
  377. HANDLE(di)
  378. HANDLE(ei)
  379. HANDLE(exx)
  380. HANDLE(halt)
  381. HANDLE(inc)
  382. HANDLE(ind)
  383. HANDLE(indr)
  384. HANDLE(ini)
  385. HANDLE(inir)
  386. HANDLE(ldd)
  387. HANDLE(lddr)
  388. HANDLE(ldi)
  389. HANDLE(ldir)
  390. HANDLE(neg)
  391. HANDLE(nop)
  392. HANDLE(otdr)
  393. HANDLE(otir)
  394. HANDLE(outd)
  395. HANDLE(outi)
  396. HANDLE(reti)
  397. HANDLE(retn)
  398. HANDLE(rla)
  399. HANDLE(rlca)
  400. HANDLE(rld)
  401. HANDLE(rra)
  402. HANDLE(rrca)
  403. HANDLE(scf)
  404. /* @AUTOGEN_LOOKUP_BLOCK_END */
  405. return NULL;
  406. }