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.
 
 
 
 
 

574 line
25 KiB

  1. /* Copyright (C) 2014-2016 Ben Kurtovic <ben.kurtovic@gmail.com>
  2. Released under the terms of the MIT License. See LICENSE for details. */
  3. #include <stddef.h>
  4. #include "arguments.h"
  5. #include "../logging.h"
  6. #include "../util.h"
  7. #define MAX_ARG_SIZE 256
  8. typedef enum {
  9. AT_NONE,
  10. /* Register */
  11. AT_REG_A, AT_REG_B, AT_REG_C, AT_REG_D, AT_REG_E, AT_REG_H,
  12. AT_REG_L, AT_REG_I, AT_REG_R, AT_REG_AF, AT_REG_BC, AT_REG_DE,
  13. AT_REG_HL, AT_REG_IX, AT_REG_IY, AT_REG_SP, AT_REG_AF_, AT_REG_IXH,
  14. AT_REG_IXL, AT_REG_IYH, AT_REG_IYL,
  15. /* Immediate */
  16. AT_IMM_U16, AT_IMM_U8, AT_IMM_REL, AT_IMM_BIT, AT_IMM_RST, AT_IMM_IM,
  17. /* Indirect */
  18. AT_IDR_HL, AT_IDR_BC, AT_IDR_DE, AT_IDR_SP, AT_IDR_IMM,
  19. /* Indexed */
  20. AT_IX_IY,
  21. /* Condition */
  22. AT_COND_NZ, AT_COND_Z, AT_COND_NC, AT_COND_C, AT_COND_PO, AT_COND_PE,
  23. AT_COND_P, AT_COND_M,
  24. /* Port */
  25. AT_PORT_C, AT_PORT_IM
  26. } ArgType;
  27. #define __ AT_NONE
  28. #define A_ AT_REG_A
  29. #define B_ AT_REG_B
  30. #define C_ AT_REG_C
  31. #define D_ AT_REG_D
  32. #define E_ AT_REG_E
  33. #define H_ AT_REG_H
  34. #define L_ AT_REG_L
  35. #define I_ AT_REG_I
  36. #define R_ AT_REG_R
  37. #define AF AT_REG_AF
  38. #define BC AT_REG_BC
  39. #define DE AT_REG_DE
  40. #define HL AT_REG_HL
  41. #define IX AT_REG_IX
  42. #define IY AT_REG_IY
  43. #define SP AT_REG_SP
  44. #define AS AT_REG_AF_
  45. #define XH AT_REG_IXH
  46. #define XL AT_REG_IXL
  47. #define YH AT_REG_IYH
  48. #define YL AT_REG_IYL
  49. #define M2 AT_IMM_U16
  50. #define M1 AT_IMM_U8
  51. #define ML AT_IMM_REL
  52. #define MB AT_IMM_BIT
  53. #define MR AT_IMM_RST
  54. #define MI AT_IMM_IM
  55. #define NH AT_IDR_HL
  56. #define NB AT_IDR_BC
  57. #define ND AT_IDR_DE
  58. #define NS AT_IDR_SP
  59. #define NM AT_IDR_IMM
  60. #define XY AT_IX_IY
  61. #define NZ AT_COND_NZ
  62. #define Z_ AT_COND_Z
  63. #define NC AT_COND_NC
  64. #define CC AT_COND_C
  65. #define PO AT_COND_PO
  66. #define PE AT_COND_PE
  67. #define P_ AT_COND_P
  68. #define M_ AT_COND_M
  69. #define PC AT_PORT_C
  70. #define PM AT_PORT_IM
  71. static ArgType instr_args[3][256] = {
  72. {
  73. __, BC, NB, BC, B_, __, B_, __, __, __, __, BC, C_, C_, C_, __,
  74. __, DE, ND, DE, D_, __, __, __, __, __, __, DE, E_, E_, E_, __,
  75. __, HL, __, HL, H_, __, __, __, __, __, __, HL, L_, L_, L_, __,
  76. __, SP, __, SP, __, __, __, __, __, __, __, SP, A_, A_, A_, __,
  77. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  78. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  79. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  80. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  81. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  82. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  83. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  84. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  85. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  86. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  87. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  88. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __
  89. },
  90. {
  91. __, M2, __, __, __, __, M1, __, __, __, __, __, __, __, M1, __,
  92. __, M2, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  93. __, M2, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  94. __, M2, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  95. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  96. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  97. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  98. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  99. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  100. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  101. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  102. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  103. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  104. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  105. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  106. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __
  107. },
  108. {
  109. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  110. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  111. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  112. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  113. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  114. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  115. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  116. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  117. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  118. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  119. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  120. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  121. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  122. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  123. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  124. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __
  125. }
  126. };
  127. static ArgType instr_args_extended[3][256] = {
  128. {
  129. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  130. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  131. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  132. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  133. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  134. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  135. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  136. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  137. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  138. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  139. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  140. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  141. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  142. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  143. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  144. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __
  145. },
  146. {
  147. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  148. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  149. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  150. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  151. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  152. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  153. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  154. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  155. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  156. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  157. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  158. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  159. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  160. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  161. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  162. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __
  163. },
  164. {
  165. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  166. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  167. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  168. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  169. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  170. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  171. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  172. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  173. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  174. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  175. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  176. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  177. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  178. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  179. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  180. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __
  181. }
  182. };
  183. static ArgType instr_args_bits[3][256] = {
  184. {
  185. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  186. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  187. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  188. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  189. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  190. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  191. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  192. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  193. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  194. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  195. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  196. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  197. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  198. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  199. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  200. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __
  201. },
  202. {
  203. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  204. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  205. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  206. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  207. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  208. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  209. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  210. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  211. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  212. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  213. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  214. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  215. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  216. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  217. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  218. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __
  219. },
  220. {
  221. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  222. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  223. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  224. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  225. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  226. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  227. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  228. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  229. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  230. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  231. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  232. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  233. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  234. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  235. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  236. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __
  237. }
  238. };
  239. static ArgType instr_args_index[3][256] = {
  240. {
  241. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  242. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  243. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  244. __, __, __, __, XY, __, __, __, __, __, __, __, __, __, __, __,
  245. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  246. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  247. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  248. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  249. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  250. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  251. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  252. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  253. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  254. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  255. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  256. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __
  257. },
  258. {
  259. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  260. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  261. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  262. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  263. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  264. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  265. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  266. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  267. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  268. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  269. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  270. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  271. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  272. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  273. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  274. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __
  275. },
  276. {
  277. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  278. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  279. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  280. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  281. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  282. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  283. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  284. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  285. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  286. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  287. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  288. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  289. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  290. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  291. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  292. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __
  293. }
  294. };
  295. static ArgType instr_args_index_bits[3][256] = {
  296. {
  297. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  298. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  299. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  300. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  301. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  302. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  303. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  304. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  305. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  306. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  307. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  308. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  309. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  310. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  311. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  312. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __
  313. },
  314. {
  315. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  316. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  317. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  318. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  319. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  320. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  321. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  322. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  323. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  324. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  325. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  326. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  327. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  328. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  329. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  330. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __
  331. },
  332. {
  333. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  334. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  335. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  336. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  337. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  338. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  339. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  340. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  341. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  342. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  343. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  344. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  345. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  346. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  347. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  348. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __
  349. }
  350. };
  351. #undef __
  352. #undef A_
  353. #undef B_
  354. #undef C_
  355. #undef D_
  356. #undef E_
  357. #undef H_
  358. #undef L_
  359. #undef I_
  360. #undef R_
  361. #undef AF
  362. #undef BC
  363. #undef DE
  364. #undef HL
  365. #undef IX
  366. #undef IY
  367. #undef SP
  368. #undef AS
  369. #undef XH
  370. #undef XL
  371. #undef YH
  372. #undef YL
  373. #undef M2
  374. #undef M1
  375. #undef ML
  376. #undef MB
  377. #undef MR
  378. #undef MI
  379. #undef NH
  380. #undef NB
  381. #undef ND
  382. #undef NS
  383. #undef NM
  384. #undef XY
  385. #undef NZ
  386. #undef Z_
  387. #undef NC
  388. #undef CC
  389. #undef PO
  390. #undef PE
  391. #undef P_
  392. #undef M_
  393. #undef PC
  394. #undef PM
  395. /*
  396. Decode an immediate argument.
  397. */
  398. static void decode_immediate(char *arg, ArgType type, const uint8_t *bytes)
  399. {
  400. char *format;
  401. switch (type) {
  402. case AT_IMM_U16:
  403. sprintf(arg, "$%04X", bytes[1] + (bytes[2] << 8));
  404. break;
  405. case AT_IMM_U8:
  406. // TODO: one byte?
  407. strcpy(arg, "???");
  408. break;
  409. case AT_IMM_REL:
  410. // TODO: one byte, signed, plus 2?
  411. strcpy(arg, "???");
  412. break;
  413. case AT_IMM_BIT:
  414. // TODO: bit ...
  415. strcpy(arg, "???");
  416. break;
  417. case AT_IMM_RST:
  418. // TODO: reset ...
  419. strcpy(arg, "???");
  420. break;
  421. case AT_IMM_IM:
  422. // TODO: interrupt mode ...
  423. strcpy(arg, "???");
  424. break;
  425. case AT_IDR_IMM:
  426. // TODO: two bytes?
  427. strcpy(arg, "???");
  428. break;
  429. case AT_IX_IY:
  430. format = bytes[0] == 0xDD ? "(ix%+hhd)" : "(iy%+hhd)";
  431. sprintf(arg, format, (int8_t) bytes[1]);
  432. break;
  433. case AT_PORT_IM:
  434. sprintf(arg, "(%u)", bytes[1]);
  435. break;
  436. default:
  437. FATAL("invalid call: decode_immediate(arg, %d, ...)", type)
  438. return;
  439. }
  440. }
  441. /*
  442. Decode a single argument, given its type.
  443. */
  444. static void decode_argument(char *arg, ArgType type, const uint8_t *bytes)
  445. {
  446. const char *value;
  447. switch (type) {
  448. case AT_NONE:
  449. arg[0] = '\0';
  450. return;
  451. case AT_REG_A: value = "a"; break;
  452. case AT_REG_B: value = "b"; break;
  453. case AT_REG_C: value = "c"; break;
  454. case AT_REG_D: value = "d"; break;
  455. case AT_REG_E: value = "e"; break;
  456. case AT_REG_H: value = "h"; break;
  457. case AT_REG_L: value = "l"; break;
  458. case AT_REG_I: value = "i"; break;
  459. case AT_REG_R: value = "r"; break;
  460. case AT_REG_AF: value = "af"; break;
  461. case AT_REG_BC: value = "bc"; break;
  462. case AT_REG_DE: value = "de"; break;
  463. case AT_REG_HL: value = "hl"; break;
  464. case AT_REG_IX: value = "ix"; break;
  465. case AT_REG_IY: value = "iy"; break;
  466. case AT_REG_SP: value = "sp"; break;
  467. case AT_REG_AF_: value = "af'"; break;
  468. case AT_REG_IXH: value = "ixh"; break;
  469. case AT_REG_IXL: value = "ixl"; break;
  470. case AT_REG_IYH: value = "iyh"; break;
  471. case AT_REG_IYL: value = "iyl"; break;
  472. case AT_IDR_HL: value = "(hl)"; break;
  473. case AT_IDR_BC: value = "(bc)"; break;
  474. case AT_IDR_DE: value = "(de)"; break;
  475. case AT_IDR_SP: value = "(sp)"; break;
  476. case AT_COND_NZ: value = "nz"; break;
  477. case AT_COND_Z: value = "z"; break;
  478. case AT_COND_NC: value = "nc"; break;
  479. case AT_COND_C: value = "c"; break;
  480. case AT_COND_PO: value = "po"; break;
  481. case AT_COND_PE: value = "pe"; break;
  482. case AT_COND_P: value = "p"; break;
  483. case AT_COND_M: value = "m"; break;
  484. case AT_PORT_C: value = "(c)"; break;
  485. case AT_IMM_U16:
  486. case AT_IMM_U8:
  487. case AT_IMM_REL:
  488. case AT_IMM_BIT:
  489. case AT_IMM_RST:
  490. case AT_IMM_IM:
  491. case AT_IDR_IMM:
  492. case AT_IX_IY:
  493. case AT_PORT_IM:
  494. decode_immediate(arg, type, bytes);
  495. return;
  496. default:
  497. FATAL("invalid call: decode_argument(arg, %d, ...)", type)
  498. return;
  499. }
  500. strcpy(arg, value);
  501. }
  502. /*
  503. Return the appropriate argument table for the given instruction.
  504. This function also increments the instruction bytes array to skip any
  505. prefix bits, so bytes[0] will always be the instruction.
  506. This function return type is ridiculous, but it returns a pointer to an
  507. array of 3 arrays of 256 ArgTypes.
  508. */
  509. static inline ArgType (*get_table_and_adjust(const uint8_t **bytes))[3][256]
  510. {
  511. uint8_t b = (*bytes)[0];
  512. if (b == 0xED)
  513. return (*bytes)++, &instr_args_extended;
  514. if (b == 0xCB)
  515. return (*bytes)++, &instr_args_bits;
  516. if (b == 0xDD || b == 0xFD) {
  517. if ((*bytes)[1] == 0xCB)
  518. return (*bytes) += 2, &instr_args_index_bits;
  519. return (*bytes)++, &instr_args_index;
  520. }
  521. return &instr_args;
  522. }
  523. /*
  524. Extract the arguments for the given instruction.
  525. The return value must be free()d.
  526. */
  527. char* decode_arguments(const uint8_t *bytes)
  528. {
  529. char args[3][MAX_ARG_SIZE], *result;
  530. ArgType (*table)[3][256], type;
  531. size_t i, len;
  532. table = get_table_and_adjust(&bytes);
  533. for (i = 0; i < 3; i++) {
  534. type = (*table)[i][bytes[0]];
  535. decode_argument(args[i], type, bytes);
  536. }
  537. if (!*args[0])
  538. return NULL;
  539. if (!*args[1])
  540. return cr_strdup(args[0]);
  541. // Two or three arguments; need to add commas:
  542. len = strlen(args[0]) + strlen(args[1]) + strlen(args[2]);
  543. result = malloc(sizeof(char) * (len + 2 * (*args[2] ? 3 : 2) + 1));
  544. if (*args[2])
  545. sprintf(result, "%s, %s, %s", args[0], args[1], args[2]);
  546. else
  547. sprintf(result, "%s, %s", args[0], args[1]);
  548. return result;
  549. }