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.
 
 
 
 
 

676 lines
16 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. /*
  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. Most of this information can be found in the Z80 User Manual, Revision 06.
  8. Undocumented opcodes, flags, and some additional details come from:
  9. - http://clrhome.org/table/
  10. - http://www.z80.info/z80sflag.htm
  11. */
  12. /*
  13. Unimplemented opcode handler.
  14. */
  15. static uint8_t z80_inst_unimplemented(Z80 *z80, uint8_t opcode)
  16. {
  17. z80->except = true;
  18. z80->exc_code = Z80_EXC_UNIMPLEMENTED_OPCODE;
  19. z80->exc_data = opcode;
  20. return 2;
  21. }
  22. // LD r, r'
  23. /*
  24. LD r, n (0x06, 0x0E, 0x16, 0x1E, 0x26, 0x2E, 0x3E):
  25. Load the immediate value into the 8-bit register.
  26. */
  27. static uint8_t z80_inst_ld_r_n(Z80 *z80, uint8_t opcode)
  28. {
  29. uint8_t *reg;
  30. switch(opcode) {
  31. case 0x3E: reg = &z80->regfile.a; break;
  32. case 0x06: reg = &z80->regfile.b; break;
  33. case 0x0E: reg = &z80->regfile.c; break;
  34. case 0x16: reg = &z80->regfile.d; break;
  35. case 0x1E: reg = &z80->regfile.e; break;
  36. case 0x26: reg = &z80->regfile.h; break;
  37. case 0x2E: reg = &z80->regfile.l; break;
  38. }
  39. *reg = mmu_read_byte(z80->mmu, ++z80->regfile.pc);
  40. z80->regfile.pc++;
  41. return 7;
  42. }
  43. // LD r, (HL)
  44. // LD r, (IX+d)
  45. // LD r, (IY+d)
  46. // LD (HL), r
  47. // LD (IX+d), r
  48. // LD (IY+d), r
  49. // LD (HL), n
  50. // LD (IX+d), n
  51. // LD (IY+d), n
  52. // LD A, (BC)
  53. // LD A, (DE)
  54. // LD A, (nn)
  55. // LD (BC), A
  56. // LD (DE), A
  57. // LD (nn), A
  58. // LD A, I
  59. // LD A, R
  60. // LD I,A
  61. // LD R, A
  62. /*
  63. LD dd, nn (0x01, 0x11, 0x21, 0x31):
  64. Load the two-byte immediate into the 16-bit register.
  65. */
  66. static uint8_t z80_inst_ld_dd_nn(Z80 *z80, uint8_t opcode)
  67. {
  68. uint8_t pair;
  69. switch(opcode) {
  70. case 0x01: pair = REG_BC; break;
  71. case 0x11: pair = REG_DE; break;
  72. case 0x21: pair = REG_HL; break;
  73. case 0x31: pair = REG_SP; break;
  74. }
  75. set_pair(z80, pair, mmu_read_double(z80->mmu, ++z80->regfile.pc));
  76. z80->regfile.pc += 2;
  77. return 6;
  78. }
  79. // LD IX, nn
  80. // LD IY, nn
  81. // LD HL, (nn)
  82. // LD dd, (nn)
  83. // LD IX, (nn)
  84. // LD IY, (nn)
  85. // LD (nn), HL
  86. // LD (nn), dd
  87. // LD (nn), IX
  88. // LD (nn), IY
  89. // LD SP, HL
  90. // LD SP, IX
  91. // LD SP, IY
  92. // PUSH qq
  93. // PUSH IX
  94. // PUSH IY
  95. // POP qq
  96. // POP IX
  97. // POP IY
  98. // EX DE, HL
  99. // EX AF, AF′
  100. // EXX
  101. // EX (SP), HL
  102. // EX (SP), IX
  103. // EX (SP), IY
  104. // LDI
  105. // LDIR
  106. // LDD
  107. // LDDR
  108. // CPI
  109. // CPIR
  110. // CPD
  111. // CPDR
  112. // ADD A, r
  113. // ADD A, n
  114. // ADD A, (HL)
  115. // ADD A, (IX + d)
  116. // ADD A, (IY + d)
  117. // ADC A, s
  118. // SUB s
  119. // SBC A, s
  120. // AND s
  121. // OR s
  122. // XOR s
  123. // CP s
  124. /*
  125. INC r (0x04, 0x0C, 0x14, 0x1C, 0x24, 0x2C, 0x3C):
  126. Increment the 8-bit register encoded in the opcode.
  127. */
  128. static uint8_t z80_inst_inc_r(Z80 *z80, uint8_t opcode)
  129. {
  130. uint8_t *reg;
  131. switch(opcode) {
  132. case 0x3C: reg = &z80->regfile.a; break;
  133. case 0x04: reg = &z80->regfile.b; break;
  134. case 0x0C: reg = &z80->regfile.c; break;
  135. case 0x14: reg = &z80->regfile.d; break;
  136. case 0x1C: reg = &z80->regfile.e; break;
  137. case 0x24: reg = &z80->regfile.h; break;
  138. case 0x2C: reg = &z80->regfile.l; break;
  139. }
  140. bool halfcarry = !!(((*reg & 0x0F) + 1) & 0x10);
  141. (*reg)++;
  142. update_flags(z80, 0, 0, *reg == 0x80, !!(*reg & 0x08), halfcarry,
  143. !!(*reg & 0x20), *reg == 0, !!(*reg & 0x80), 0xFE);
  144. z80->regfile.pc++;
  145. return 4;
  146. }
  147. // INC (HL)
  148. // INC (IX+d)
  149. // INC (IY+d)
  150. // DEC m
  151. // DAA
  152. // CPL
  153. // NEG
  154. // CCF
  155. // SCF
  156. /*
  157. NOP (0x00):
  158. No operation is performed.
  159. */
  160. static uint8_t z80_inst_nop(Z80 *z80, uint8_t opcode)
  161. {
  162. (void) opcode;
  163. z80->regfile.pc++;
  164. return 4;
  165. }
  166. // HALT
  167. // DI
  168. // EI
  169. // IM 0
  170. // IM 1
  171. // IM 2
  172. // ADD HL, ss
  173. // ADC HL, ss
  174. // SBC HL, ss
  175. // ADD IX, pp
  176. // ADD IY, rr
  177. /*
  178. INC ss (0x03, 0x13, 0x23, 0x33):
  179. Increment the 16-bit register encoded in the opcode.
  180. */
  181. static uint8_t z80_inst_inc_ss(Z80 *z80, uint8_t opcode)
  182. {
  183. uint8_t pair;
  184. switch(opcode) {
  185. case 0x03: pair = REG_BC; break;
  186. case 0x13: pair = REG_DE; break;
  187. case 0x23: pair = REG_HL; break;
  188. case 0x33: pair = REG_SP; break;
  189. }
  190. set_pair(z80, pair, get_pair(z80, pair) + 1);
  191. z80->regfile.pc++;
  192. return 6;
  193. }
  194. // INC IX
  195. // INC IY
  196. // DEC ss
  197. // DEC IX
  198. // DEC IY
  199. // RLCA
  200. // RLA
  201. // RRCA
  202. // RRA
  203. // RLC r
  204. // RLC (HL)
  205. // RLC (IX+d)
  206. // RLC (IY+d)
  207. // RL m
  208. // RRC m
  209. // RR m
  210. // SLA m
  211. // SRA m
  212. // SRL m
  213. // RLD
  214. // RRD
  215. // BIT b, r
  216. // BIT b, (HL)
  217. // BIT b, (IX+d)
  218. // BIT b, (IY+d)
  219. // SET b, r
  220. // SET b, (HL)
  221. // SET b, (IX+d)
  222. // SET b, (IY+d)
  223. // RES b, m
  224. // JP nn
  225. // JP cc, nn
  226. // JR e
  227. // JR C, e
  228. // JR NC, e
  229. // JR Z, e
  230. // JR NZ, e
  231. // JP (HL)
  232. // JP (IX)
  233. // JP (IY)
  234. // DJNZ, e
  235. // CALL nn
  236. // CALL cc, nn
  237. // RET
  238. // RET cc
  239. // RETI
  240. // RETN
  241. // RST p
  242. // IN A, (n)
  243. // IN r (C)
  244. // INI
  245. // INIR
  246. // IND
  247. // INDR
  248. // OUT (n), A
  249. // OUT (C), r
  250. // OUTI
  251. // OTIR
  252. // OUTD
  253. // OTDR
  254. static uint8_t (*instruction_lookup_table[256])(Z80*, uint8_t) = {
  255. [0x00] = z80_inst_nop,
  256. [0x01] = z80_inst_ld_dd_nn,
  257. [0x02] = z80_inst_unimplemented, // TODO
  258. [0x03] = z80_inst_inc_ss,
  259. [0x04] = z80_inst_inc_r,
  260. [0x05] = z80_inst_unimplemented, // TODO
  261. [0x06] = z80_inst_ld_r_n,
  262. [0x07] = z80_inst_unimplemented, // TODO
  263. [0x08] = z80_inst_unimplemented, // TODO
  264. [0x09] = z80_inst_unimplemented, // TODO
  265. [0x0A] = z80_inst_unimplemented, // TODO
  266. [0x0B] = z80_inst_unimplemented, // TODO
  267. [0x0C] = z80_inst_inc_r,
  268. [0x0D] = z80_inst_unimplemented, // TODO
  269. [0x0E] = z80_inst_ld_r_n,
  270. [0x0F] = z80_inst_unimplemented, // TODO
  271. [0x10] = z80_inst_unimplemented, // TODO
  272. [0x11] = z80_inst_ld_dd_nn,
  273. [0x12] = z80_inst_unimplemented, // TODO
  274. [0x13] = z80_inst_inc_ss,
  275. [0x14] = z80_inst_inc_r,
  276. [0x15] = z80_inst_unimplemented, // TODO
  277. [0x16] = z80_inst_ld_r_n,
  278. [0x17] = z80_inst_unimplemented, // TODO
  279. [0x18] = z80_inst_unimplemented, // TODO
  280. [0x19] = z80_inst_unimplemented, // TODO
  281. [0x1A] = z80_inst_unimplemented, // TODO
  282. [0x1B] = z80_inst_unimplemented, // TODO
  283. [0x1C] = z80_inst_inc_r,
  284. [0x1D] = z80_inst_unimplemented, // TODO
  285. [0x1E] = z80_inst_ld_r_n,
  286. [0x1F] = z80_inst_unimplemented, // TODO
  287. [0x20] = z80_inst_unimplemented, // TODO
  288. [0x21] = z80_inst_ld_dd_nn,
  289. [0x22] = z80_inst_unimplemented, // TODO
  290. [0x23] = z80_inst_inc_ss,
  291. [0x24] = z80_inst_inc_r,
  292. [0x25] = z80_inst_unimplemented, // TODO
  293. [0x26] = z80_inst_ld_r_n,
  294. [0x27] = z80_inst_unimplemented, // TODO
  295. [0x28] = z80_inst_unimplemented, // TODO
  296. [0x29] = z80_inst_unimplemented, // TODO
  297. [0x2A] = z80_inst_unimplemented, // TODO
  298. [0x2B] = z80_inst_unimplemented, // TODO
  299. [0x2C] = z80_inst_inc_r,
  300. [0x2D] = z80_inst_unimplemented, // TODO
  301. [0x2E] = z80_inst_ld_r_n,
  302. [0x2F] = z80_inst_unimplemented, // TODO
  303. [0x30] = z80_inst_unimplemented, // TODO
  304. [0x31] = z80_inst_ld_dd_nn,
  305. [0x32] = z80_inst_unimplemented, // TODO
  306. [0x33] = z80_inst_inc_ss,
  307. [0x34] = z80_inst_unimplemented, // TODO
  308. [0x35] = z80_inst_unimplemented, // TODO
  309. [0x36] = z80_inst_unimplemented, // TODO
  310. [0x37] = z80_inst_unimplemented, // TODO
  311. [0x38] = z80_inst_unimplemented, // TODO
  312. [0x39] = z80_inst_unimplemented, // TODO
  313. [0x3A] = z80_inst_unimplemented, // TODO
  314. [0x3B] = z80_inst_unimplemented, // TODO
  315. [0x3C] = z80_inst_inc_r,
  316. [0x3D] = z80_inst_unimplemented, // TODO
  317. [0x3E] = z80_inst_ld_r_n,
  318. [0x3F] = z80_inst_unimplemented, // TODO
  319. [0x40] = z80_inst_unimplemented, // TODO
  320. [0x41] = z80_inst_unimplemented, // TODO
  321. [0x42] = z80_inst_unimplemented, // TODO
  322. [0x43] = z80_inst_unimplemented, // TODO
  323. [0x44] = z80_inst_unimplemented, // TODO
  324. [0x45] = z80_inst_unimplemented, // TODO
  325. [0x46] = z80_inst_unimplemented, // TODO
  326. [0x47] = z80_inst_unimplemented, // TODO
  327. [0x48] = z80_inst_unimplemented, // TODO
  328. [0x49] = z80_inst_unimplemented, // TODO
  329. [0x4A] = z80_inst_unimplemented, // TODO
  330. [0x4B] = z80_inst_unimplemented, // TODO
  331. [0x4C] = z80_inst_unimplemented, // TODO
  332. [0x4D] = z80_inst_unimplemented, // TODO
  333. [0x4E] = z80_inst_unimplemented, // TODO
  334. [0x4F] = z80_inst_unimplemented, // TODO
  335. [0x50] = z80_inst_unimplemented, // TODO
  336. [0x51] = z80_inst_unimplemented, // TODO
  337. [0x52] = z80_inst_unimplemented, // TODO
  338. [0x53] = z80_inst_unimplemented, // TODO
  339. [0x54] = z80_inst_unimplemented, // TODO
  340. [0x55] = z80_inst_unimplemented, // TODO
  341. [0x56] = z80_inst_unimplemented, // TODO
  342. [0x57] = z80_inst_unimplemented, // TODO
  343. [0x58] = z80_inst_unimplemented, // TODO
  344. [0x59] = z80_inst_unimplemented, // TODO
  345. [0x5A] = z80_inst_unimplemented, // TODO
  346. [0x5B] = z80_inst_unimplemented, // TODO
  347. [0x5C] = z80_inst_unimplemented, // TODO
  348. [0x5D] = z80_inst_unimplemented, // TODO
  349. [0x5E] = z80_inst_unimplemented, // TODO
  350. [0x5F] = z80_inst_unimplemented, // TODO
  351. [0x60] = z80_inst_unimplemented, // TODO
  352. [0x61] = z80_inst_unimplemented, // TODO
  353. [0x62] = z80_inst_unimplemented, // TODO
  354. [0x63] = z80_inst_unimplemented, // TODO
  355. [0x64] = z80_inst_unimplemented, // TODO
  356. [0x65] = z80_inst_unimplemented, // TODO
  357. [0x66] = z80_inst_unimplemented, // TODO
  358. [0x67] = z80_inst_unimplemented, // TODO
  359. [0x68] = z80_inst_unimplemented, // TODO
  360. [0x69] = z80_inst_unimplemented, // TODO
  361. [0x6A] = z80_inst_unimplemented, // TODO
  362. [0x6B] = z80_inst_unimplemented, // TODO
  363. [0x6C] = z80_inst_unimplemented, // TODO
  364. [0x6D] = z80_inst_unimplemented, // TODO
  365. [0x6E] = z80_inst_unimplemented, // TODO
  366. [0x6F] = z80_inst_unimplemented, // TODO
  367. [0x70] = z80_inst_unimplemented, // TODO
  368. [0x71] = z80_inst_unimplemented, // TODO
  369. [0x72] = z80_inst_unimplemented, // TODO
  370. [0x73] = z80_inst_unimplemented, // TODO
  371. [0x74] = z80_inst_unimplemented, // TODO
  372. [0x75] = z80_inst_unimplemented, // TODO
  373. [0x76] = z80_inst_unimplemented, // TODO
  374. [0x77] = z80_inst_unimplemented, // TODO
  375. [0x78] = z80_inst_unimplemented, // TODO
  376. [0x79] = z80_inst_unimplemented, // TODO
  377. [0x7A] = z80_inst_unimplemented, // TODO
  378. [0x7B] = z80_inst_unimplemented, // TODO
  379. [0x7C] = z80_inst_unimplemented, // TODO
  380. [0x7D] = z80_inst_unimplemented, // TODO
  381. [0x7E] = z80_inst_unimplemented, // TODO
  382. [0x7F] = z80_inst_unimplemented, // TODO
  383. [0x80] = z80_inst_unimplemented, // TODO
  384. [0x81] = z80_inst_unimplemented, // TODO
  385. [0x82] = z80_inst_unimplemented, // TODO
  386. [0x83] = z80_inst_unimplemented, // TODO
  387. [0x84] = z80_inst_unimplemented, // TODO
  388. [0x85] = z80_inst_unimplemented, // TODO
  389. [0x86] = z80_inst_unimplemented, // TODO
  390. [0x87] = z80_inst_unimplemented, // TODO
  391. [0x88] = z80_inst_unimplemented, // TODO
  392. [0x89] = z80_inst_unimplemented, // TODO
  393. [0x8A] = z80_inst_unimplemented, // TODO
  394. [0x8B] = z80_inst_unimplemented, // TODO
  395. [0x8C] = z80_inst_unimplemented, // TODO
  396. [0x8D] = z80_inst_unimplemented, // TODO
  397. [0x8E] = z80_inst_unimplemented, // TODO
  398. [0x8F] = z80_inst_unimplemented, // TODO
  399. [0x90] = z80_inst_unimplemented, // TODO
  400. [0x91] = z80_inst_unimplemented, // TODO
  401. [0x92] = z80_inst_unimplemented, // TODO
  402. [0x93] = z80_inst_unimplemented, // TODO
  403. [0x94] = z80_inst_unimplemented, // TODO
  404. [0x95] = z80_inst_unimplemented, // TODO
  405. [0x96] = z80_inst_unimplemented, // TODO
  406. [0x97] = z80_inst_unimplemented, // TODO
  407. [0x98] = z80_inst_unimplemented, // TODO
  408. [0x99] = z80_inst_unimplemented, // TODO
  409. [0x9A] = z80_inst_unimplemented, // TODO
  410. [0x9B] = z80_inst_unimplemented, // TODO
  411. [0x9C] = z80_inst_unimplemented, // TODO
  412. [0x9D] = z80_inst_unimplemented, // TODO
  413. [0x9E] = z80_inst_unimplemented, // TODO
  414. [0x9F] = z80_inst_unimplemented, // TODO
  415. [0xA0] = z80_inst_unimplemented, // TODO
  416. [0xA1] = z80_inst_unimplemented, // TODO
  417. [0xA2] = z80_inst_unimplemented, // TODO
  418. [0xA3] = z80_inst_unimplemented, // TODO
  419. [0xA4] = z80_inst_unimplemented, // TODO
  420. [0xA5] = z80_inst_unimplemented, // TODO
  421. [0xA6] = z80_inst_unimplemented, // TODO
  422. [0xA7] = z80_inst_unimplemented, // TODO
  423. [0xA8] = z80_inst_unimplemented, // TODO
  424. [0xA9] = z80_inst_unimplemented, // TODO
  425. [0xAA] = z80_inst_unimplemented, // TODO
  426. [0xAB] = z80_inst_unimplemented, // TODO
  427. [0xAC] = z80_inst_unimplemented, // TODO
  428. [0xAD] = z80_inst_unimplemented, // TODO
  429. [0xAE] = z80_inst_unimplemented, // TODO
  430. [0xAF] = z80_inst_unimplemented, // TODO
  431. [0xB0] = z80_inst_unimplemented, // TODO
  432. [0xB1] = z80_inst_unimplemented, // TODO
  433. [0xB2] = z80_inst_unimplemented, // TODO
  434. [0xB3] = z80_inst_unimplemented, // TODO
  435. [0xB4] = z80_inst_unimplemented, // TODO
  436. [0xB5] = z80_inst_unimplemented, // TODO
  437. [0xB6] = z80_inst_unimplemented, // TODO
  438. [0xB7] = z80_inst_unimplemented, // TODO
  439. [0xB8] = z80_inst_unimplemented, // TODO
  440. [0xB9] = z80_inst_unimplemented, // TODO
  441. [0xBA] = z80_inst_unimplemented, // TODO
  442. [0xBB] = z80_inst_unimplemented, // TODO
  443. [0xBC] = z80_inst_unimplemented, // TODO
  444. [0xBD] = z80_inst_unimplemented, // TODO
  445. [0xBE] = z80_inst_unimplemented, // TODO
  446. [0xBF] = z80_inst_unimplemented, // TODO
  447. [0xC0] = z80_inst_unimplemented, // TODO
  448. [0xC1] = z80_inst_unimplemented, // TODO
  449. [0xC2] = z80_inst_unimplemented, // TODO
  450. [0xC3] = z80_inst_unimplemented, // TODO
  451. [0xC4] = z80_inst_unimplemented, // TODO
  452. [0xC5] = z80_inst_unimplemented, // TODO
  453. [0xC6] = z80_inst_unimplemented, // TODO
  454. [0xC7] = z80_inst_unimplemented, // TODO
  455. [0xC8] = z80_inst_unimplemented, // TODO
  456. [0xC9] = z80_inst_unimplemented, // TODO
  457. [0xCA] = z80_inst_unimplemented, // TODO
  458. [0xCB] = z80_inst_unimplemented, // TODO
  459. [0xCC] = z80_inst_unimplemented, // TODO
  460. [0xCD] = z80_inst_unimplemented, // TODO
  461. [0xCE] = z80_inst_unimplemented, // TODO
  462. [0xCF] = z80_inst_unimplemented, // TODO
  463. [0xD0] = z80_inst_unimplemented, // TODO
  464. [0xD1] = z80_inst_unimplemented, // TODO
  465. [0xD2] = z80_inst_unimplemented, // TODO
  466. [0xD3] = z80_inst_unimplemented, // TODO
  467. [0xD4] = z80_inst_unimplemented, // TODO
  468. [0xD5] = z80_inst_unimplemented, // TODO
  469. [0xD6] = z80_inst_unimplemented, // TODO
  470. [0xD7] = z80_inst_unimplemented, // TODO
  471. [0xD8] = z80_inst_unimplemented, // TODO
  472. [0xD9] = z80_inst_unimplemented, // TODO
  473. [0xDA] = z80_inst_unimplemented, // TODO
  474. [0xDB] = z80_inst_unimplemented, // TODO
  475. [0xDC] = z80_inst_unimplemented, // TODO
  476. [0xDD] = z80_inst_unimplemented, // TODO
  477. [0xDE] = z80_inst_unimplemented, // TODO
  478. [0xDF] = z80_inst_unimplemented, // TODO
  479. [0xE0] = z80_inst_unimplemented, // TODO
  480. [0xE1] = z80_inst_unimplemented, // TODO
  481. [0xE2] = z80_inst_unimplemented, // TODO
  482. [0xE3] = z80_inst_unimplemented, // TODO
  483. [0xE4] = z80_inst_unimplemented, // TODO
  484. [0xE5] = z80_inst_unimplemented, // TODO
  485. [0xE6] = z80_inst_unimplemented, // TODO
  486. [0xE7] = z80_inst_unimplemented, // TODO
  487. [0xE8] = z80_inst_unimplemented, // TODO
  488. [0xE9] = z80_inst_unimplemented, // TODO
  489. [0xEA] = z80_inst_unimplemented, // TODO
  490. [0xEB] = z80_inst_unimplemented, // TODO
  491. [0xEC] = z80_inst_unimplemented, // TODO
  492. [0xED] = z80_inst_unimplemented, // TODO
  493. [0xEE] = z80_inst_unimplemented, // TODO
  494. [0xEF] = z80_inst_unimplemented, // TODO
  495. [0xF0] = z80_inst_unimplemented, // TODO
  496. [0xF1] = z80_inst_unimplemented, // TODO
  497. [0xF2] = z80_inst_unimplemented, // TODO
  498. [0xF3] = z80_inst_unimplemented, // TODO
  499. [0xF4] = z80_inst_unimplemented, // TODO
  500. [0xF5] = z80_inst_unimplemented, // TODO
  501. [0xF6] = z80_inst_unimplemented, // TODO
  502. [0xF7] = z80_inst_unimplemented, // TODO
  503. [0xF8] = z80_inst_unimplemented, // TODO
  504. [0xF9] = z80_inst_unimplemented, // TODO
  505. [0xFA] = z80_inst_unimplemented, // TODO
  506. [0xFB] = z80_inst_unimplemented, // TODO
  507. [0xFC] = z80_inst_unimplemented, // TODO
  508. [0xFD] = z80_inst_unimplemented, // TODO
  509. [0xFE] = z80_inst_unimplemented, // TODO
  510. [0xFF] = z80_inst_unimplemented // TODO
  511. };