An emulator, assembler, and disassembler for the Sega Game Gear
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 

449 lignes
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. }