An emulator, assembler, and disassembler for the Sega Game Gear
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 
 

578 rader
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. __, __, __, __, __, __, __, MR, __, __, __, __, __, __, __, __,
  87. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, MR,
  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. __, __, __, __, __, __, __, __, __, __, __, __, __, __, MI, __,
  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. __, __, __, __, __, __, __, __, MB, __, __, __, __, __, __, __,
  192. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  193. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  194. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  195. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  196. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  197. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  198. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  199. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  200. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __
  201. },
  202. {
  203. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  204. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  205. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  206. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  207. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  208. __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
  209. __, __, __, __, __, __, __, __, B_, __, __, __, __, __, __, __,
  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(
  399. char *arg, ArgType type, const uint8_t *bytes, size_t shift)
  400. {
  401. char *format;
  402. size_t take;
  403. uint8_t b = bytes[shift];
  404. switch (type) {
  405. case AT_IMM_U16: // 16-bit immediate
  406. sprintf(arg, "$%04X", bytes[shift + 1] + (bytes[shift + 2] << 8));
  407. break;
  408. case AT_IMM_U8: // 8-bit unsigned immediate
  409. if ((bytes[0] == 0xDD || bytes[0] == 0xFD) && bytes[1] == 0x36)
  410. take = 2;
  411. else
  412. take = 1;
  413. sprintf(arg, "$%02X", bytes[shift + take]);
  414. break;
  415. case AT_IMM_REL: // 8-bit relative offset (JP and DJNZ)
  416. sprintf(arg, "%hhd", (int8_t) (bytes[shift + 1] + 2));
  417. break;
  418. case AT_IMM_BIT: // Bit position
  419. sprintf(arg, "%d", (b & 0x38) >> 3);
  420. break;
  421. case AT_IMM_RST: // Reset
  422. sprintf(arg, "$%02X", b & 0x38);
  423. break;
  424. case AT_IMM_IM: // Interrupt mode
  425. sprintf(arg, "%d", !(b & (1 << 4)) ? 0 : !(b & (1 << 3)) ? 1 : 2);
  426. break;
  427. case AT_IDR_IMM: // Indirect immediate
  428. sprintf(arg, "($%04X)", bytes[shift + 1] + (bytes[shift + 2] << 8));
  429. break;
  430. case AT_IX_IY: // Indexed offset
  431. format = bytes[0] == 0xDD ? "(ix%+hhd)" : "(iy%+hhd)";
  432. sprintf(arg, format, (int8_t) bytes[shift + 1]);
  433. break;
  434. case AT_PORT_IM: // Immediate port
  435. sprintf(arg, "(%u)", bytes[shift + 1]);
  436. break;
  437. default:
  438. FATAL("invalid call: decode_immediate(arg, %d, ...)", type)
  439. return;
  440. }
  441. }
  442. /*
  443. Decode a single argument, given its type.
  444. */
  445. static void decode_argument(
  446. char *arg, ArgType type, const uint8_t *bytes, size_t shift)
  447. {
  448. const char *value;
  449. switch (type) {
  450. case AT_NONE:
  451. arg[0] = '\0';
  452. return;
  453. case AT_REG_A: value = "a"; break;
  454. case AT_REG_B: value = "b"; break;
  455. case AT_REG_C: value = "c"; break;
  456. case AT_REG_D: value = "d"; break;
  457. case AT_REG_E: value = "e"; break;
  458. case AT_REG_H: value = "h"; break;
  459. case AT_REG_L: value = "l"; break;
  460. case AT_REG_I: value = "i"; break;
  461. case AT_REG_R: value = "r"; break;
  462. case AT_REG_AF: value = "af"; break;
  463. case AT_REG_BC: value = "bc"; break;
  464. case AT_REG_DE: value = "de"; break;
  465. case AT_REG_HL: value = "hl"; break;
  466. case AT_REG_IX: value = "ix"; break;
  467. case AT_REG_IY: value = "iy"; break;
  468. case AT_REG_SP: value = "sp"; break;
  469. case AT_REG_AF_: value = "af'"; break;
  470. case AT_REG_IXH: value = "ixh"; break;
  471. case AT_REG_IXL: value = "ixl"; break;
  472. case AT_REG_IYH: value = "iyh"; break;
  473. case AT_REG_IYL: value = "iyl"; break;
  474. case AT_IDR_HL: value = "(hl)"; break;
  475. case AT_IDR_BC: value = "(bc)"; break;
  476. case AT_IDR_DE: value = "(de)"; break;
  477. case AT_IDR_SP: value = "(sp)"; break;
  478. case AT_COND_NZ: value = "nz"; break;
  479. case AT_COND_Z: value = "z"; break;
  480. case AT_COND_NC: value = "nc"; break;
  481. case AT_COND_C: value = "c"; break;
  482. case AT_COND_PO: value = "po"; break;
  483. case AT_COND_PE: value = "pe"; break;
  484. case AT_COND_P: value = "p"; break;
  485. case AT_COND_M: value = "m"; break;
  486. case AT_PORT_C: value = "(c)"; break;
  487. case AT_IMM_U16:
  488. case AT_IMM_U8:
  489. case AT_IMM_REL:
  490. case AT_IMM_BIT:
  491. case AT_IMM_RST:
  492. case AT_IMM_IM:
  493. case AT_IDR_IMM:
  494. case AT_IX_IY:
  495. case AT_PORT_IM:
  496. decode_immediate(arg, type, bytes, shift);
  497. return;
  498. default:
  499. FATAL("invalid call: decode_argument(arg, %d, ...)", type)
  500. return;
  501. }
  502. strcpy(arg, value);
  503. }
  504. /*
  505. Return the appropriate argument table for the given instruction.
  506. This function also adds the number of instruction bytes to skip to its
  507. shift argument (corresponding to any prefix bits), so bytes[*shift] will
  508. always be the instruction opcode.
  509. This function return type is ridiculous, but it returns a pointer to an
  510. array of 3 arrays of 256 ArgTypes.
  511. */
  512. static inline ArgType (*get_table_and_shift(
  513. const uint8_t *bytes, size_t *shift))[3][256]
  514. {
  515. uint8_t b = bytes[0];
  516. if (b == 0xED)
  517. return (*shift)++, &instr_args_extended;
  518. if (b == 0xCB)
  519. return (*shift)++, &instr_args_bits;
  520. if (b == 0xDD || b == 0xFD) {
  521. if (bytes[1] == 0xCB)
  522. return (*shift) += 2, &instr_args_index_bits;
  523. return (*shift)++, &instr_args_index;
  524. }
  525. return &instr_args;
  526. }
  527. /*
  528. Extract the arguments for the given instruction.
  529. The return value must be free()d.
  530. */
  531. char* decode_arguments(const uint8_t *bytes)
  532. {
  533. char args[3][MAX_ARG_SIZE], *result;
  534. ArgType (*table)[3][256], type;
  535. size_t shift = 0, i, len;
  536. table = get_table_and_shift(bytes, &shift);
  537. for (i = 0; i < 3; i++) {
  538. type = (*table)[i][bytes[shift]];
  539. decode_argument(args[i], type, bytes, shift);
  540. }
  541. if (!*args[0])
  542. return NULL;
  543. if (!*args[1])
  544. return cr_strdup(args[0]);
  545. // Two or three arguments; need to add commas:
  546. len = strlen(args[0]) + strlen(args[1]) + strlen(args[2]);
  547. result = malloc(sizeof(char) * (len + 2 * (*args[2] ? 3 : 2) + 1));
  548. if (*args[2])
  549. sprintf(result, "%s, %s, %s", args[0], args[1], args[2]);
  550. else
  551. sprintf(result, "%s, %s", args[0], args[1]);
  552. return result;
  553. }