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.
 
 
 
 
 

289 lines
10 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 contains code to implement the Z80 instruction set. Since there
  5. are a lot of functions, it is kept separate from the main z80.c file. It is
  6. included in the middle of z80.c and should not be compiled separately.
  7. */
  8. /*
  9. 0x00: NOP
  10. */
  11. static uint8_t z80_inst_nop(Z80 *z80, uint8_t opcode)
  12. {
  13. (void) opcode;
  14. z80->regfile.pc++;
  15. return 4;
  16. }
  17. /*
  18. Unimplemented opcode handler.
  19. */
  20. static uint8_t z80_inst_unimplemented(Z80 *z80, uint8_t opcode)
  21. {
  22. z80->except = true;
  23. z80->exc_code = Z80_EXC_UNIMPLEMENTED_OPCODE;
  24. z80->exc_data = opcode;
  25. return 2;
  26. }
  27. static uint8_t (*instruction_lookup_table[256])(Z80*, uint8_t) = {
  28. /* 0x00 */ z80_inst_nop,
  29. /* 0x01 */ z80_inst_unimplemented,
  30. /* 0x02 */ z80_inst_unimplemented,
  31. /* 0x03 */ z80_inst_unimplemented,
  32. /* 0x04 */ z80_inst_unimplemented,
  33. /* 0x05 */ z80_inst_unimplemented,
  34. /* 0x06 */ z80_inst_unimplemented,
  35. /* 0x07 */ z80_inst_unimplemented,
  36. /* 0x08 */ z80_inst_unimplemented,
  37. /* 0x09 */ z80_inst_unimplemented,
  38. /* 0x0A */ z80_inst_unimplemented,
  39. /* 0x0B */ z80_inst_unimplemented,
  40. /* 0x0C */ z80_inst_unimplemented,
  41. /* 0x0D */ z80_inst_unimplemented,
  42. /* 0x0E */ z80_inst_unimplemented,
  43. /* 0x0F */ z80_inst_unimplemented,
  44. /* 0x10 */ z80_inst_unimplemented,
  45. /* 0x11 */ z80_inst_unimplemented,
  46. /* 0x12 */ z80_inst_unimplemented,
  47. /* 0x13 */ z80_inst_unimplemented,
  48. /* 0x14 */ z80_inst_unimplemented,
  49. /* 0x15 */ z80_inst_unimplemented,
  50. /* 0x16 */ z80_inst_unimplemented,
  51. /* 0x17 */ z80_inst_unimplemented,
  52. /* 0x18 */ z80_inst_unimplemented,
  53. /* 0x19 */ z80_inst_unimplemented,
  54. /* 0x1A */ z80_inst_unimplemented,
  55. /* 0x1B */ z80_inst_unimplemented,
  56. /* 0x1C */ z80_inst_unimplemented,
  57. /* 0x1D */ z80_inst_unimplemented,
  58. /* 0x1E */ z80_inst_unimplemented,
  59. /* 0x1F */ z80_inst_unimplemented,
  60. /* 0x20 */ z80_inst_unimplemented,
  61. /* 0x21 */ z80_inst_unimplemented,
  62. /* 0x22 */ z80_inst_unimplemented,
  63. /* 0x23 */ z80_inst_unimplemented,
  64. /* 0x24 */ z80_inst_unimplemented,
  65. /* 0x25 */ z80_inst_unimplemented,
  66. /* 0x26 */ z80_inst_unimplemented,
  67. /* 0x27 */ z80_inst_unimplemented,
  68. /* 0x28 */ z80_inst_unimplemented,
  69. /* 0x29 */ z80_inst_unimplemented,
  70. /* 0x2A */ z80_inst_unimplemented,
  71. /* 0x2B */ z80_inst_unimplemented,
  72. /* 0x2C */ z80_inst_unimplemented,
  73. /* 0x2D */ z80_inst_unimplemented,
  74. /* 0x2E */ z80_inst_unimplemented,
  75. /* 0x2F */ z80_inst_unimplemented,
  76. /* 0x30 */ z80_inst_unimplemented,
  77. /* 0x31 */ z80_inst_unimplemented,
  78. /* 0x32 */ z80_inst_unimplemented,
  79. /* 0x33 */ z80_inst_unimplemented,
  80. /* 0x34 */ z80_inst_unimplemented,
  81. /* 0x35 */ z80_inst_unimplemented,
  82. /* 0x36 */ z80_inst_unimplemented,
  83. /* 0x37 */ z80_inst_unimplemented,
  84. /* 0x38 */ z80_inst_unimplemented,
  85. /* 0x39 */ z80_inst_unimplemented,
  86. /* 0x3A */ z80_inst_unimplemented,
  87. /* 0x3B */ z80_inst_unimplemented,
  88. /* 0x3C */ z80_inst_unimplemented,
  89. /* 0x3D */ z80_inst_unimplemented,
  90. /* 0x3E */ z80_inst_unimplemented,
  91. /* 0x3F */ z80_inst_unimplemented,
  92. /* 0x40 */ z80_inst_unimplemented,
  93. /* 0x41 */ z80_inst_unimplemented,
  94. /* 0x42 */ z80_inst_unimplemented,
  95. /* 0x43 */ z80_inst_unimplemented,
  96. /* 0x44 */ z80_inst_unimplemented,
  97. /* 0x45 */ z80_inst_unimplemented,
  98. /* 0x46 */ z80_inst_unimplemented,
  99. /* 0x47 */ z80_inst_unimplemented,
  100. /* 0x48 */ z80_inst_unimplemented,
  101. /* 0x49 */ z80_inst_unimplemented,
  102. /* 0x4A */ z80_inst_unimplemented,
  103. /* 0x4B */ z80_inst_unimplemented,
  104. /* 0x4C */ z80_inst_unimplemented,
  105. /* 0x4D */ z80_inst_unimplemented,
  106. /* 0x4E */ z80_inst_unimplemented,
  107. /* 0x4F */ z80_inst_unimplemented,
  108. /* 0x50 */ z80_inst_unimplemented,
  109. /* 0x51 */ z80_inst_unimplemented,
  110. /* 0x52 */ z80_inst_unimplemented,
  111. /* 0x53 */ z80_inst_unimplemented,
  112. /* 0x54 */ z80_inst_unimplemented,
  113. /* 0x55 */ z80_inst_unimplemented,
  114. /* 0x56 */ z80_inst_unimplemented,
  115. /* 0x57 */ z80_inst_unimplemented,
  116. /* 0x58 */ z80_inst_unimplemented,
  117. /* 0x59 */ z80_inst_unimplemented,
  118. /* 0x5A */ z80_inst_unimplemented,
  119. /* 0x5B */ z80_inst_unimplemented,
  120. /* 0x5C */ z80_inst_unimplemented,
  121. /* 0x5D */ z80_inst_unimplemented,
  122. /* 0x5E */ z80_inst_unimplemented,
  123. /* 0x5F */ z80_inst_unimplemented,
  124. /* 0x60 */ z80_inst_unimplemented,
  125. /* 0x61 */ z80_inst_unimplemented,
  126. /* 0x62 */ z80_inst_unimplemented,
  127. /* 0x63 */ z80_inst_unimplemented,
  128. /* 0x64 */ z80_inst_unimplemented,
  129. /* 0x65 */ z80_inst_unimplemented,
  130. /* 0x66 */ z80_inst_unimplemented,
  131. /* 0x67 */ z80_inst_unimplemented,
  132. /* 0x68 */ z80_inst_unimplemented,
  133. /* 0x69 */ z80_inst_unimplemented,
  134. /* 0x6A */ z80_inst_unimplemented,
  135. /* 0x6B */ z80_inst_unimplemented,
  136. /* 0x6C */ z80_inst_unimplemented,
  137. /* 0x6D */ z80_inst_unimplemented,
  138. /* 0x6E */ z80_inst_unimplemented,
  139. /* 0x6F */ z80_inst_unimplemented,
  140. /* 0x70 */ z80_inst_unimplemented,
  141. /* 0x71 */ z80_inst_unimplemented,
  142. /* 0x72 */ z80_inst_unimplemented,
  143. /* 0x73 */ z80_inst_unimplemented,
  144. /* 0x74 */ z80_inst_unimplemented,
  145. /* 0x75 */ z80_inst_unimplemented,
  146. /* 0x76 */ z80_inst_unimplemented,
  147. /* 0x77 */ z80_inst_unimplemented,
  148. /* 0x78 */ z80_inst_unimplemented,
  149. /* 0x79 */ z80_inst_unimplemented,
  150. /* 0x7A */ z80_inst_unimplemented,
  151. /* 0x7B */ z80_inst_unimplemented,
  152. /* 0x7C */ z80_inst_unimplemented,
  153. /* 0x7D */ z80_inst_unimplemented,
  154. /* 0x7E */ z80_inst_unimplemented,
  155. /* 0x7F */ z80_inst_unimplemented,
  156. /* 0x80 */ z80_inst_unimplemented,
  157. /* 0x81 */ z80_inst_unimplemented,
  158. /* 0x82 */ z80_inst_unimplemented,
  159. /* 0x83 */ z80_inst_unimplemented,
  160. /* 0x84 */ z80_inst_unimplemented,
  161. /* 0x85 */ z80_inst_unimplemented,
  162. /* 0x86 */ z80_inst_unimplemented,
  163. /* 0x87 */ z80_inst_unimplemented,
  164. /* 0x88 */ z80_inst_unimplemented,
  165. /* 0x89 */ z80_inst_unimplemented,
  166. /* 0x8A */ z80_inst_unimplemented,
  167. /* 0x8B */ z80_inst_unimplemented,
  168. /* 0x8C */ z80_inst_unimplemented,
  169. /* 0x8D */ z80_inst_unimplemented,
  170. /* 0x8E */ z80_inst_unimplemented,
  171. /* 0x8F */ z80_inst_unimplemented,
  172. /* 0x90 */ z80_inst_unimplemented,
  173. /* 0x91 */ z80_inst_unimplemented,
  174. /* 0x92 */ z80_inst_unimplemented,
  175. /* 0x93 */ z80_inst_unimplemented,
  176. /* 0x94 */ z80_inst_unimplemented,
  177. /* 0x95 */ z80_inst_unimplemented,
  178. /* 0x96 */ z80_inst_unimplemented,
  179. /* 0x97 */ z80_inst_unimplemented,
  180. /* 0x98 */ z80_inst_unimplemented,
  181. /* 0x99 */ z80_inst_unimplemented,
  182. /* 0x9A */ z80_inst_unimplemented,
  183. /* 0x9B */ z80_inst_unimplemented,
  184. /* 0x9C */ z80_inst_unimplemented,
  185. /* 0x9D */ z80_inst_unimplemented,
  186. /* 0x9E */ z80_inst_unimplemented,
  187. /* 0x9F */ z80_inst_unimplemented,
  188. /* 0xA0 */ z80_inst_unimplemented,
  189. /* 0xA1 */ z80_inst_unimplemented,
  190. /* 0xA2 */ z80_inst_unimplemented,
  191. /* 0xA3 */ z80_inst_unimplemented,
  192. /* 0xA4 */ z80_inst_unimplemented,
  193. /* 0xA5 */ z80_inst_unimplemented,
  194. /* 0xA6 */ z80_inst_unimplemented,
  195. /* 0xA7 */ z80_inst_unimplemented,
  196. /* 0xA8 */ z80_inst_unimplemented,
  197. /* 0xA9 */ z80_inst_unimplemented,
  198. /* 0xAA */ z80_inst_unimplemented,
  199. /* 0xAB */ z80_inst_unimplemented,
  200. /* 0xAC */ z80_inst_unimplemented,
  201. /* 0xAD */ z80_inst_unimplemented,
  202. /* 0xAE */ z80_inst_unimplemented,
  203. /* 0xAF */ z80_inst_unimplemented,
  204. /* 0xB0 */ z80_inst_unimplemented,
  205. /* 0xB1 */ z80_inst_unimplemented,
  206. /* 0xB2 */ z80_inst_unimplemented,
  207. /* 0xB3 */ z80_inst_unimplemented,
  208. /* 0xB4 */ z80_inst_unimplemented,
  209. /* 0xB5 */ z80_inst_unimplemented,
  210. /* 0xB6 */ z80_inst_unimplemented,
  211. /* 0xB7 */ z80_inst_unimplemented,
  212. /* 0xB8 */ z80_inst_unimplemented,
  213. /* 0xB9 */ z80_inst_unimplemented,
  214. /* 0xBA */ z80_inst_unimplemented,
  215. /* 0xBB */ z80_inst_unimplemented,
  216. /* 0xBC */ z80_inst_unimplemented,
  217. /* 0xBD */ z80_inst_unimplemented,
  218. /* 0xBE */ z80_inst_unimplemented,
  219. /* 0xBF */ z80_inst_unimplemented,
  220. /* 0xC0 */ z80_inst_unimplemented,
  221. /* 0xC1 */ z80_inst_unimplemented,
  222. /* 0xC2 */ z80_inst_unimplemented,
  223. /* 0xC3 */ z80_inst_unimplemented,
  224. /* 0xC4 */ z80_inst_unimplemented,
  225. /* 0xC5 */ z80_inst_unimplemented,
  226. /* 0xC6 */ z80_inst_unimplemented,
  227. /* 0xC7 */ z80_inst_unimplemented,
  228. /* 0xC8 */ z80_inst_unimplemented,
  229. /* 0xC9 */ z80_inst_unimplemented,
  230. /* 0xCA */ z80_inst_unimplemented,
  231. /* 0xCB */ z80_inst_unimplemented,
  232. /* 0xCC */ z80_inst_unimplemented,
  233. /* 0xCD */ z80_inst_unimplemented,
  234. /* 0xCE */ z80_inst_unimplemented,
  235. /* 0xCF */ z80_inst_unimplemented,
  236. /* 0xD0 */ z80_inst_unimplemented,
  237. /* 0xD1 */ z80_inst_unimplemented,
  238. /* 0xD2 */ z80_inst_unimplemented,
  239. /* 0xD3 */ z80_inst_unimplemented,
  240. /* 0xD4 */ z80_inst_unimplemented,
  241. /* 0xD5 */ z80_inst_unimplemented,
  242. /* 0xD6 */ z80_inst_unimplemented,
  243. /* 0xD7 */ z80_inst_unimplemented,
  244. /* 0xD8 */ z80_inst_unimplemented,
  245. /* 0xD9 */ z80_inst_unimplemented,
  246. /* 0xDA */ z80_inst_unimplemented,
  247. /* 0xDB */ z80_inst_unimplemented,
  248. /* 0xDC */ z80_inst_unimplemented,
  249. /* 0xDD */ z80_inst_unimplemented,
  250. /* 0xDE */ z80_inst_unimplemented,
  251. /* 0xDF */ z80_inst_unimplemented,
  252. /* 0xE0 */ z80_inst_unimplemented,
  253. /* 0xE1 */ z80_inst_unimplemented,
  254. /* 0xE2 */ z80_inst_unimplemented,
  255. /* 0xE3 */ z80_inst_unimplemented,
  256. /* 0xE4 */ z80_inst_unimplemented,
  257. /* 0xE5 */ z80_inst_unimplemented,
  258. /* 0xE6 */ z80_inst_unimplemented,
  259. /* 0xE7 */ z80_inst_unimplemented,
  260. /* 0xE8 */ z80_inst_unimplemented,
  261. /* 0xE9 */ z80_inst_unimplemented,
  262. /* 0xEA */ z80_inst_unimplemented,
  263. /* 0xEB */ z80_inst_unimplemented,
  264. /* 0xEC */ z80_inst_unimplemented,
  265. /* 0xED */ z80_inst_unimplemented,
  266. /* 0xEE */ z80_inst_unimplemented,
  267. /* 0xEF */ z80_inst_unimplemented,
  268. /* 0xF0 */ z80_inst_unimplemented,
  269. /* 0xF1 */ z80_inst_unimplemented,
  270. /* 0xF2 */ z80_inst_unimplemented,
  271. /* 0xF3 */ z80_inst_unimplemented,
  272. /* 0xF4 */ z80_inst_unimplemented,
  273. /* 0xF5 */ z80_inst_unimplemented,
  274. /* 0xF6 */ z80_inst_unimplemented,
  275. /* 0xF7 */ z80_inst_unimplemented,
  276. /* 0xF8 */ z80_inst_unimplemented,
  277. /* 0xF9 */ z80_inst_unimplemented,
  278. /* 0xFA */ z80_inst_unimplemented,
  279. /* 0xFB */ z80_inst_unimplemented,
  280. /* 0xFC */ z80_inst_unimplemented,
  281. /* 0xFD */ z80_inst_unimplemented,
  282. /* 0xFE */ z80_inst_unimplemented,
  283. /* 0xFF */ z80_inst_unimplemented
  284. };