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.
 
 
 
 
 

792 lines
17 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. #include "instructions.h"
  4. #include "inst_support.h"
  5. /* Instruction parser functions */
  6. INST_FUNC(adc)
  7. {
  8. INST_TAKES_ARGS(2, 2)
  9. INST_FORCE_TYPE(0, AT_REGISTER)
  10. switch (INST_REG(0)) {
  11. case REG_A:
  12. switch (INST_TYPE(1)) {
  13. case AT_REGISTER:
  14. switch (INST_REG(1)) {
  15. case REG_A: INST_RETURN(1, 0x8F)
  16. case REG_B: INST_RETURN(1, 0x88)
  17. case REG_C: INST_RETURN(1, 0x89)
  18. case REG_D: INST_RETURN(1, 0x8A)
  19. case REG_E: INST_RETURN(1, 0x8B)
  20. case REG_H: INST_RETURN(1, 0x8C)
  21. case REG_L: INST_RETURN(1, 0x8D)
  22. case REG_IXH: INST_RETURN(2, 0xDD, 0x8C)
  23. case REG_IXL: INST_RETURN(2, 0xDD, 0x8D)
  24. case REG_IYH: INST_RETURN(2, 0xFD, 0x8C)
  25. case REG_IYL: INST_RETURN(2, 0xFD, 0x8D)
  26. default: INST_ERROR(ARG1_BAD_REG)
  27. }
  28. case AT_IMMEDIATE:
  29. INST_CHECK_IMM(1, IMM_U8)
  30. INST_RETURN(2, 0xCE, INST_IMM(1).uval)
  31. case AT_INDIRECT:
  32. INST_INDIRECT_HL_ONLY(1)
  33. INST_RETURN(1, 0x8E)
  34. case AT_INDEXED:
  35. INST_RETURN(3, INST_INDEX_BYTES(1, 0x8E))
  36. default:
  37. INST_ERROR(ARG1_TYPE)
  38. }
  39. case REG_HL:
  40. INST_FORCE_TYPE(1, AT_REGISTER)
  41. switch (INST_REG(1)) {
  42. case REG_BC: INST_RETURN(2, 0xED, 0x4A)
  43. case REG_DE: INST_RETURN(2, 0xED, 0x5A)
  44. case REG_HL: INST_RETURN(2, 0xED, 0x6A)
  45. case REG_SP: INST_RETURN(2, 0xED, 0x7A)
  46. default: INST_ERROR(ARG1_BAD_REG)
  47. }
  48. default:
  49. INST_ERROR(ARG0_TYPE)
  50. }
  51. }
  52. INST_FUNC(add)
  53. {
  54. INST_TAKES_ARGS(2, 2)
  55. INST_FORCE_TYPE(0, AT_REGISTER)
  56. switch (INST_REG(0)) {
  57. case REG_A:
  58. switch (INST_TYPE(1)) {
  59. case AT_REGISTER:
  60. switch (INST_REG(1)) {
  61. case REG_A: INST_RETURN(1, 0x87)
  62. case REG_B: INST_RETURN(1, 0x80)
  63. case REG_C: INST_RETURN(1, 0x81)
  64. case REG_D: INST_RETURN(1, 0x82)
  65. case REG_E: INST_RETURN(1, 0x83)
  66. case REG_H: INST_RETURN(1, 0x84)
  67. case REG_L: INST_RETURN(1, 0x85)
  68. case REG_IXH: INST_RETURN(2, 0xDD, 0x84)
  69. case REG_IXL: INST_RETURN(2, 0xDD, 0x85)
  70. case REG_IYH: INST_RETURN(2, 0xFD, 0x84)
  71. case REG_IYL: INST_RETURN(2, 0xFD, 0x85)
  72. default: INST_ERROR(ARG1_BAD_REG)
  73. }
  74. case AT_IMMEDIATE:
  75. INST_CHECK_IMM(1, IMM_U8)
  76. INST_RETURN(2, 0xC6, INST_IMM(1).uval)
  77. case AT_INDIRECT:
  78. INST_INDIRECT_HL_ONLY(1)
  79. INST_RETURN(1, 0x86)
  80. case AT_INDEXED:
  81. INST_RETURN(3, INST_INDEX_BYTES(1, 0x86))
  82. default:
  83. INST_ERROR(ARG1_TYPE)
  84. }
  85. case REG_HL:
  86. INST_FORCE_TYPE(1, AT_REGISTER)
  87. switch (INST_REG(1)) {
  88. case REG_BC: INST_RETURN(1, 0x09)
  89. case REG_DE: INST_RETURN(1, 0x19)
  90. case REG_HL: INST_RETURN(1, 0x29)
  91. case REG_SP: INST_RETURN(1, 0x39)
  92. default: INST_ERROR(ARG1_BAD_REG)
  93. }
  94. case REG_IX:
  95. case REG_IY:
  96. INST_FORCE_TYPE(1, AT_REGISTER)
  97. switch (INST_REG(1)) {
  98. case REG_BC: INST_RETURN(2, INST_INDEX_PREFIX(1), 0x09)
  99. case REG_DE: INST_RETURN(2, INST_INDEX_PREFIX(1), 0x19)
  100. case REG_IX:
  101. case REG_IY:
  102. if (INST_REG(0) != INST_REG(1))
  103. INST_ERROR(ARG1_BAD_REG)
  104. INST_RETURN(2, INST_INDEX_PREFIX(1), 0x29)
  105. case REG_SP: INST_RETURN(2, INST_INDEX_PREFIX(1), 0x39)
  106. default: INST_ERROR(ARG1_BAD_REG)
  107. }
  108. default:
  109. INST_ERROR(ARG0_TYPE)
  110. }
  111. }
  112. INST_FUNC(and)
  113. {
  114. // TODO
  115. INST_TAKES_NO_ARGS
  116. INST_ERROR(ARG_SYNTAX)
  117. INST_RETURN(1, 0xFF)
  118. }
  119. INST_FUNC(bit)
  120. {
  121. // TODO
  122. INST_TAKES_NO_ARGS
  123. INST_ERROR(ARG_SYNTAX)
  124. INST_RETURN(1, 0xFF)
  125. }
  126. INST_FUNC(call)
  127. {
  128. // TODO
  129. INST_TAKES_NO_ARGS
  130. INST_ERROR(ARG_SYNTAX)
  131. INST_RETURN(1, 0xFF)
  132. }
  133. INST_FUNC(ccf)
  134. {
  135. INST_TAKES_NO_ARGS
  136. INST_RETURN(1, 0x3F)
  137. }
  138. INST_FUNC(cp)
  139. {
  140. // TODO
  141. INST_TAKES_NO_ARGS
  142. INST_ERROR(ARG_SYNTAX)
  143. INST_RETURN(1, 0xFF)
  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(dec)
  176. {
  177. // TODO
  178. INST_TAKES_NO_ARGS
  179. INST_ERROR(ARG_SYNTAX)
  180. INST_RETURN(1, 0xFF)
  181. }
  182. INST_FUNC(di)
  183. {
  184. INST_TAKES_NO_ARGS
  185. INST_RETURN(1, 0xF3)
  186. }
  187. INST_FUNC(djnz)
  188. {
  189. // TODO
  190. INST_TAKES_NO_ARGS
  191. INST_ERROR(ARG_SYNTAX)
  192. INST_RETURN(1, 0xFF)
  193. }
  194. INST_FUNC(ei)
  195. {
  196. INST_TAKES_NO_ARGS
  197. INST_RETURN(1, 0xFB)
  198. }
  199. INST_FUNC(ex)
  200. {
  201. // TODO
  202. INST_TAKES_NO_ARGS
  203. INST_ERROR(ARG_SYNTAX)
  204. INST_RETURN(1, 0xFF)
  205. }
  206. INST_FUNC(exx)
  207. {
  208. INST_TAKES_NO_ARGS
  209. INST_RETURN(1, 0xD9)
  210. }
  211. INST_FUNC(halt)
  212. {
  213. INST_TAKES_NO_ARGS
  214. INST_RETURN(1, 0x76)
  215. }
  216. INST_FUNC(im)
  217. {
  218. // TODO
  219. INST_TAKES_NO_ARGS
  220. INST_ERROR(ARG_SYNTAX)
  221. INST_RETURN(1, 0xFF)
  222. }
  223. INST_FUNC(in)
  224. {
  225. // TODO
  226. INST_TAKES_NO_ARGS
  227. INST_ERROR(ARG_SYNTAX)
  228. INST_RETURN(1, 0xFF)
  229. }
  230. INST_FUNC(inc)
  231. {
  232. INST_TAKES_ARGS(1, 1)
  233. switch (INST_TYPE(0)) {
  234. case AT_REGISTER:
  235. switch (INST_REG(0)) {
  236. case REG_A: INST_RETURN(1, 0x3C)
  237. case REG_B: INST_RETURN(1, 0x04)
  238. case REG_C: INST_RETURN(1, 0x0C)
  239. case REG_D: INST_RETURN(1, 0x14)
  240. case REG_E: INST_RETURN(1, 0x1C)
  241. case REG_H: INST_RETURN(1, 0x24)
  242. case REG_L: INST_RETURN(1, 0x2C)
  243. case REG_BC: INST_RETURN(1, 0x03)
  244. case REG_DE: INST_RETURN(1, 0x13)
  245. case REG_HL: INST_RETURN(1, 0x23)
  246. case REG_SP: INST_RETURN(1, 0x33)
  247. case REG_IX: INST_RETURN(2, 0xDD, 0x23)
  248. case REG_IY: INST_RETURN(2, 0xFD, 0x23)
  249. case REG_IXH: INST_RETURN(2, 0xDD, 0x2C)
  250. case REG_IXL: INST_RETURN(2, 0xFD, 0x2C)
  251. case REG_IYH: INST_RETURN(2, 0xDD, 0x2C)
  252. case REG_IYL: INST_RETURN(2, 0xFD, 0x2C)
  253. default: INST_ERROR(ARG0_BAD_REG)
  254. }
  255. case AT_INDIRECT:
  256. INST_INDIRECT_HL_ONLY(0)
  257. INST_RETURN(1, 0x34)
  258. case AT_INDEXED:
  259. INST_RETURN(3, INST_INDEX_BYTES(0, 0x34))
  260. default:
  261. INST_ERROR(ARG0_TYPE)
  262. }
  263. }
  264. INST_FUNC(ind)
  265. {
  266. INST_TAKES_NO_ARGS
  267. INST_RETURN(2, 0xED, 0xAA)
  268. }
  269. INST_FUNC(indr)
  270. {
  271. INST_TAKES_NO_ARGS
  272. INST_RETURN(2, 0xED, 0xBA)
  273. }
  274. INST_FUNC(ini)
  275. {
  276. INST_TAKES_NO_ARGS
  277. INST_RETURN(2, 0xED, 0xA2)
  278. }
  279. INST_FUNC(inir)
  280. {
  281. INST_TAKES_NO_ARGS
  282. INST_RETURN(2, 0xED, 0xB2)
  283. }
  284. INST_FUNC(jp)
  285. {
  286. // TODO
  287. INST_TAKES_NO_ARGS
  288. INST_ERROR(ARG_SYNTAX)
  289. INST_RETURN(1, 0xFF)
  290. }
  291. INST_FUNC(jr)
  292. {
  293. // TODO
  294. INST_TAKES_NO_ARGS
  295. INST_ERROR(ARG_SYNTAX)
  296. INST_RETURN(1, 0xFF)
  297. }
  298. INST_FUNC(ld)
  299. {
  300. INST_TAKES_ARGS(2, 2)
  301. switch (INST_TYPE(0)) {
  302. case AT_REGISTER:
  303. switch (INST_REG(0)) {
  304. case REG_A:
  305. switch (INST_TYPE(1)) {
  306. case AT_REGISTER:
  307. switch (INST_REG(1)) {
  308. case REG_A: INST_RETURN(1, 0x7F)
  309. case REG_B: INST_RETURN(1, 0x78)
  310. case REG_C: INST_RETURN(1, 0x79)
  311. case REG_D: INST_RETURN(1, 0x7A)
  312. case REG_E: INST_RETURN(1, 0x7B)
  313. case REG_H: INST_RETURN(1, 0x7C)
  314. case REG_L: INST_RETURN(1, 0x7D)
  315. case REG_I: INST_RETURN(2, 0xED, 0x57)
  316. case REG_R: INST_RETURN(2, 0xED, 0x5F)
  317. case REG_IXH: INST_RETURN(2, 0xDD, 0x7C)
  318. case REG_IXL: INST_RETURN(2, 0xDD, 0x7D)
  319. case REG_IYH: INST_RETURN(2, 0xFD, 0x7C)
  320. case REG_IYL: INST_RETURN(2, 0xFD, 0x7D)
  321. default: INST_ERROR(ARG1_BAD_REG)
  322. }
  323. case AT_IMMEDIATE:
  324. INST_CHECK_IMM(1, IMM_U8)
  325. INST_RETURN(2, 0x3E, INST_IMM(1).uval)
  326. case AT_INDIRECT:
  327. switch (INST_INDIRECT(1).type) {
  328. case AT_REGISTER:
  329. switch (INST_INDIRECT(1).addr.reg) {
  330. case REG_BC: INST_RETURN(1, 0x0A)
  331. case REG_DE: INST_RETURN(1, 0x1A)
  332. case REG_HL: INST_RETURN(1, 0x7E)
  333. default: INST_ERROR(ARG0_BAD_REG)
  334. }
  335. case AT_IMMEDIATE:
  336. INST_RETURN(3, 0x3A, INST_INDIRECT_IMM(1))
  337. case AT_LABEL:
  338. INST_RETURN_INDIRECT_LABEL(1, 3, 0x3A)
  339. default:
  340. INST_ERROR(ARG0_TYPE)
  341. }
  342. case AT_INDEXED:
  343. INST_RETURN(3, INST_INDEX_BYTES(1, 0x7E))
  344. default:
  345. INST_ERROR(ARG1_TYPE)
  346. }
  347. case REG_B: // TODO (15 cases)
  348. case REG_C: // TODO (15 cases)
  349. case REG_D: // TODO (15 cases)
  350. case REG_E: // TODO (15 cases)
  351. case REG_H: // TODO (11 cases)
  352. case REG_L: // TODO (11 cases)
  353. case REG_I: // TODO ( 1 case )
  354. case REG_R: // TODO ( 1 case )
  355. case REG_BC: // TODO ( 2 cases)
  356. case REG_DE: // TODO ( 2 cases)
  357. case REG_HL: // TODO ( 3 cases)
  358. case REG_IX: // TODO ( 2 cases)
  359. case REG_IY: // TODO ( 2 cases)
  360. case REG_SP: // TODO ( 5 cases)
  361. case REG_IXH: // TODO ( 8 cases)
  362. case REG_IXL: // TODO ( 8 cases)
  363. case REG_IYH: // TODO ( 8 cases)
  364. case REG_IYL: // TODO ( 8 cases)
  365. default: INST_ERROR(ARG0_BAD_REG)
  366. }
  367. case AT_INDIRECT:
  368. switch (INST_INDIRECT(0).type) {
  369. case AT_REGISTER:
  370. switch (INST_INDIRECT(0).addr.reg) {
  371. case REG_BC: // TODO (1 case )
  372. case REG_DE: // TODO (1 case )
  373. case REG_HL: // TODO (8 cases)
  374. default: INST_ERROR(ARG0_BAD_REG)
  375. }
  376. case AT_IMMEDIATE:
  377. // TODO (8 cases)
  378. case AT_LABEL:
  379. // TODO (same 8 cases)
  380. default:
  381. INST_ERROR(ARG0_TYPE)
  382. }
  383. case AT_INDEXED:
  384. // TODO (16 cases)
  385. default:
  386. INST_ERROR(ARG0_TYPE)
  387. }
  388. }
  389. INST_FUNC(ldd)
  390. {
  391. INST_TAKES_NO_ARGS
  392. INST_RETURN(2, 0xED, 0xA8)
  393. }
  394. INST_FUNC(lddr)
  395. {
  396. INST_TAKES_NO_ARGS
  397. INST_RETURN(2, 0xED, 0xB8)
  398. }
  399. INST_FUNC(ldi)
  400. {
  401. INST_TAKES_NO_ARGS
  402. INST_RETURN(2, 0xED, 0xA0)
  403. }
  404. INST_FUNC(ldir)
  405. {
  406. INST_TAKES_NO_ARGS
  407. INST_RETURN(2, 0xED, 0xB0)
  408. }
  409. INST_FUNC(neg)
  410. {
  411. // TODO
  412. INST_TAKES_NO_ARGS
  413. INST_ERROR(ARG_SYNTAX)
  414. INST_RETURN(1, 0xFF)
  415. }
  416. INST_FUNC(nop)
  417. {
  418. INST_TAKES_NO_ARGS
  419. INST_RETURN(1, 0x00)
  420. }
  421. INST_FUNC(or)
  422. {
  423. // TODO
  424. INST_TAKES_NO_ARGS
  425. INST_ERROR(ARG_SYNTAX)
  426. INST_RETURN(1, 0xFF)
  427. }
  428. INST_FUNC(otdr)
  429. {
  430. INST_TAKES_NO_ARGS
  431. INST_RETURN(2, 0xED, 0xBB)
  432. }
  433. INST_FUNC(otir)
  434. {
  435. INST_TAKES_NO_ARGS
  436. INST_RETURN(2, 0xED, 0xB3)
  437. }
  438. INST_FUNC(out)
  439. {
  440. // TODO
  441. INST_TAKES_NO_ARGS
  442. INST_ERROR(ARG_SYNTAX)
  443. INST_RETURN(1, 0xFF)
  444. }
  445. INST_FUNC(outd)
  446. {
  447. INST_TAKES_NO_ARGS
  448. INST_RETURN(2, 0xED, 0xAB)
  449. }
  450. INST_FUNC(outi)
  451. {
  452. INST_TAKES_NO_ARGS
  453. INST_RETURN(2, 0xED, 0xA3)
  454. }
  455. INST_FUNC(pop)
  456. {
  457. // TODO
  458. INST_TAKES_NO_ARGS
  459. INST_ERROR(ARG_SYNTAX)
  460. INST_RETURN(1, 0xFF)
  461. }
  462. INST_FUNC(push)
  463. {
  464. // TODO
  465. INST_TAKES_NO_ARGS
  466. INST_ERROR(ARG_SYNTAX)
  467. INST_RETURN(1, 0xFF)
  468. }
  469. INST_FUNC(res)
  470. {
  471. // TODO
  472. INST_TAKES_NO_ARGS
  473. INST_ERROR(ARG_SYNTAX)
  474. INST_RETURN(1, 0xFF)
  475. }
  476. INST_FUNC(ret)
  477. {
  478. // TODO
  479. INST_TAKES_NO_ARGS
  480. INST_ERROR(ARG_SYNTAX)
  481. INST_RETURN(1, 0xFF)
  482. }
  483. INST_FUNC(reti)
  484. {
  485. INST_TAKES_NO_ARGS
  486. INST_RETURN(2, 0xED, 0x4D)
  487. }
  488. INST_FUNC(retn)
  489. {
  490. INST_TAKES_NO_ARGS
  491. INST_RETURN(2, 0xED, 0x45)
  492. }
  493. INST_FUNC(rl)
  494. {
  495. // TODO
  496. INST_TAKES_NO_ARGS
  497. INST_ERROR(ARG_SYNTAX)
  498. INST_RETURN(1, 0xFF)
  499. }
  500. INST_FUNC(rla)
  501. {
  502. INST_TAKES_NO_ARGS
  503. INST_RETURN(1, 0x17)
  504. }
  505. INST_FUNC(rlc)
  506. {
  507. // TODO
  508. INST_TAKES_NO_ARGS
  509. INST_ERROR(ARG_SYNTAX)
  510. INST_RETURN(1, 0xFF)
  511. }
  512. INST_FUNC(rlca)
  513. {
  514. INST_TAKES_NO_ARGS
  515. INST_RETURN(1, 0x07)
  516. }
  517. INST_FUNC(rld)
  518. {
  519. INST_TAKES_NO_ARGS
  520. INST_RETURN(2, 0xED, 0x6F)
  521. }
  522. INST_FUNC(rr)
  523. {
  524. // TODO
  525. INST_TAKES_NO_ARGS
  526. INST_ERROR(ARG_SYNTAX)
  527. INST_RETURN(1, 0xFF)
  528. }
  529. INST_FUNC(rra)
  530. {
  531. INST_TAKES_NO_ARGS
  532. INST_RETURN(1, 0x1F)
  533. }
  534. INST_FUNC(rrc)
  535. {
  536. // TODO
  537. INST_TAKES_NO_ARGS
  538. INST_ERROR(ARG_SYNTAX)
  539. INST_RETURN(1, 0xFF)
  540. }
  541. INST_FUNC(rrca)
  542. {
  543. INST_TAKES_NO_ARGS
  544. INST_RETURN(1, 0x0F)
  545. }
  546. INST_FUNC(rrd)
  547. {
  548. // TODO
  549. INST_TAKES_NO_ARGS
  550. INST_ERROR(ARG_SYNTAX)
  551. INST_RETURN(1, 0xFF)
  552. }
  553. INST_FUNC(rst)
  554. {
  555. // TODO
  556. INST_TAKES_NO_ARGS
  557. INST_ERROR(ARG_SYNTAX)
  558. INST_RETURN(1, 0xFF)
  559. }
  560. INST_FUNC(sbc)
  561. {
  562. // TODO
  563. INST_TAKES_NO_ARGS
  564. INST_ERROR(ARG_SYNTAX)
  565. INST_RETURN(1, 0xFF)
  566. }
  567. INST_FUNC(scf)
  568. {
  569. INST_TAKES_NO_ARGS
  570. INST_RETURN(1, 0x37)
  571. }
  572. INST_FUNC(set)
  573. {
  574. // TODO
  575. INST_TAKES_NO_ARGS
  576. INST_ERROR(ARG_SYNTAX)
  577. INST_RETURN(1, 0xFF)
  578. }
  579. INST_FUNC(sl1)
  580. {
  581. // TODO
  582. INST_TAKES_NO_ARGS
  583. INST_ERROR(ARG_SYNTAX)
  584. INST_RETURN(1, 0xFF)
  585. }
  586. INST_FUNC(sla)
  587. {
  588. // TODO
  589. INST_TAKES_NO_ARGS
  590. INST_ERROR(ARG_SYNTAX)
  591. INST_RETURN(1, 0xFF)
  592. }
  593. INST_FUNC(sll)
  594. {
  595. // TODO
  596. INST_TAKES_NO_ARGS
  597. INST_ERROR(ARG_SYNTAX)
  598. INST_RETURN(1, 0xFF)
  599. }
  600. INST_FUNC(sls)
  601. {
  602. // TODO
  603. INST_TAKES_NO_ARGS
  604. INST_ERROR(ARG_SYNTAX)
  605. INST_RETURN(1, 0xFF)
  606. }
  607. INST_FUNC(sra)
  608. {
  609. // TODO
  610. INST_TAKES_NO_ARGS
  611. INST_ERROR(ARG_SYNTAX)
  612. INST_RETURN(1, 0xFF)
  613. }
  614. INST_FUNC(srl)
  615. {
  616. // TODO
  617. INST_TAKES_NO_ARGS
  618. INST_ERROR(ARG_SYNTAX)
  619. INST_RETURN(1, 0xFF)
  620. }
  621. INST_FUNC(sub)
  622. {
  623. // TODO
  624. INST_TAKES_NO_ARGS
  625. INST_ERROR(ARG_SYNTAX)
  626. INST_RETURN(1, 0xFF)
  627. }
  628. INST_FUNC(xor)
  629. {
  630. // TODO
  631. INST_TAKES_NO_ARGS
  632. INST_ERROR(ARG_SYNTAX)
  633. INST_RETURN(1, 0xFF)
  634. }
  635. /*
  636. Return the relevant ASMInstParser function for a given mnemonic.
  637. NULL is returned if the mnemonic is not known.
  638. */
  639. ASMInstParser get_inst_parser(char mstr[MAX_MNEMONIC_SIZE])
  640. {
  641. // Exploit the fact that we can store the entire mnemonic string as a
  642. // single 32-bit value to do fast lookups:
  643. uint32_t key = (mstr[0] << 24) + (mstr[1] << 16) + (mstr[2] << 8) + mstr[3];
  644. HANDLE(adc)
  645. HANDLE(add)
  646. HANDLE(and)
  647. HANDLE(bit)
  648. HANDLE(call)
  649. HANDLE(ccf)
  650. HANDLE(cp)
  651. HANDLE(cpd)
  652. HANDLE(cpdr)
  653. HANDLE(cpi)
  654. HANDLE(cpir)
  655. HANDLE(cpl)
  656. HANDLE(daa)
  657. HANDLE(dec)
  658. HANDLE(di)
  659. HANDLE(djnz)
  660. HANDLE(ei)
  661. HANDLE(ex)
  662. HANDLE(exx)
  663. HANDLE(halt)
  664. HANDLE(im)
  665. HANDLE(in)
  666. HANDLE(inc)
  667. HANDLE(ind)
  668. HANDLE(indr)
  669. HANDLE(ini)
  670. HANDLE(inir)
  671. HANDLE(jp)
  672. HANDLE(jr)
  673. HANDLE(ld)
  674. HANDLE(ldd)
  675. HANDLE(lddr)
  676. HANDLE(ldi)
  677. HANDLE(ldir)
  678. HANDLE(neg)
  679. HANDLE(nop)
  680. HANDLE(or)
  681. HANDLE(otdr)
  682. HANDLE(otir)
  683. HANDLE(out)
  684. HANDLE(outd)
  685. HANDLE(outi)
  686. HANDLE(pop)
  687. HANDLE(push)
  688. HANDLE(res)
  689. HANDLE(ret)
  690. HANDLE(reti)
  691. HANDLE(retn)
  692. HANDLE(rl)
  693. HANDLE(rla)
  694. HANDLE(rlc)
  695. HANDLE(rlca)
  696. HANDLE(rld)
  697. HANDLE(rr)
  698. HANDLE(rra)
  699. HANDLE(rrc)
  700. HANDLE(rrca)
  701. HANDLE(rrd)
  702. HANDLE(rst)
  703. HANDLE(sbc)
  704. HANDLE(scf)
  705. HANDLE(set)
  706. HANDLE(sl1)
  707. HANDLE(sla)
  708. HANDLE(sll)
  709. HANDLE(sls)
  710. HANDLE(sra)
  711. HANDLE(srl)
  712. HANDLE(sub)
  713. HANDLE(xor)
  714. return NULL;
  715. }