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.
 
 
 
 
 

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