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.
 
 
 
 
 

729 rader
18 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. /*
  101. EXX (0xD9):
  102. Exchange the 2-byte registers with their shadows
  103. (BC <=> BC', DE <=> DE', HL <=> HL').
  104. */
  105. static uint8_t z80_inst_exx(Z80 *z80, uint8_t opcode)
  106. {
  107. (void) opcode;
  108. uint16_t bc = get_pair(z80, REG_BC),
  109. de = get_pair(z80, REG_DE),
  110. hl = get_pair(z80, REG_HL);
  111. set_pair(z80, REG_BC, get_pair(z80, REG_BC_));
  112. set_pair(z80, REG_DE, get_pair(z80, REG_DE_));
  113. set_pair(z80, REG_HL, get_pair(z80, REG_HL_));
  114. set_pair(z80, REG_BC_, bc);
  115. set_pair(z80, REG_DE_, de);
  116. set_pair(z80, REG_HL_, hl);
  117. z80->regfile.pc++;
  118. return 4;
  119. }
  120. // EX (SP), HL
  121. // EX (SP), IX
  122. // EX (SP), IY
  123. // LDI
  124. // LDIR
  125. // LDD
  126. // LDDR
  127. // CPI
  128. // CPIR
  129. // CPD
  130. // CPDR
  131. // ADD A, r
  132. // ADD A, n
  133. // ADD A, (HL)
  134. // ADD A, (IX + d)
  135. // ADD A, (IY + d)
  136. // ADC A, s
  137. // SUB s
  138. // SBC A, s
  139. // AND s
  140. // OR s
  141. // XOR s
  142. // CP s
  143. /*
  144. INC r (0x04, 0x0C, 0x14, 0x1C, 0x24, 0x2C, 0x3C):
  145. Increment the 8-bit register encoded in the opcode.
  146. */
  147. static uint8_t z80_inst_inc_r(Z80 *z80, uint8_t opcode)
  148. {
  149. uint8_t *reg;
  150. switch(opcode) {
  151. case 0x3C: reg = &z80->regfile.a; break;
  152. case 0x04: reg = &z80->regfile.b; break;
  153. case 0x0C: reg = &z80->regfile.c; break;
  154. case 0x14: reg = &z80->regfile.d; break;
  155. case 0x1C: reg = &z80->regfile.e; break;
  156. case 0x24: reg = &z80->regfile.h; break;
  157. case 0x2C: reg = &z80->regfile.l; break;
  158. }
  159. bool halfcarry = !!(((*reg & 0x0F) + 1) & 0x10);
  160. (*reg)++;
  161. update_flags(z80, 0, 0, *reg == 0x80, !!(*reg & 0x08), halfcarry,
  162. !!(*reg & 0x20), *reg == 0, !!(*reg & 0x80), 0xFE);
  163. z80->regfile.pc++;
  164. return 4;
  165. }
  166. // INC (HL)
  167. // INC (IX+d)
  168. // INC (IY+d)
  169. // DEC m
  170. // DAA
  171. // CPL
  172. // NEG
  173. // CCF
  174. // SCF
  175. /*
  176. NOP (0x00):
  177. No operation is performed.
  178. */
  179. static uint8_t z80_inst_nop(Z80 *z80, uint8_t opcode)
  180. {
  181. (void) opcode;
  182. z80->regfile.pc++;
  183. return 4;
  184. }
  185. /*
  186. HALT (0x76):
  187. Suspend CPU operation by repeatedly executing NOPs until an interrupt or
  188. reset.
  189. */
  190. static uint8_t z80_inst_halt(Z80 *z80, uint8_t opcode)
  191. {
  192. (void) z80;
  193. (void) opcode;
  194. return 4;
  195. }
  196. /*
  197. DI (0xF3):
  198. Disable maskable interrupts by resetting both flip-flops.
  199. */
  200. static uint8_t z80_inst_di(Z80 *z80, uint8_t opcode)
  201. {
  202. (void) opcode;
  203. z80->regfile.iff1 = false;
  204. z80->regfile.iff2 = false;
  205. z80->regfile.pc++;
  206. return 4;
  207. }
  208. /*
  209. EI (0xFB):
  210. Enable maskable interrupts by setting both flip-flops.
  211. */
  212. static uint8_t z80_inst_ei(Z80 *z80, uint8_t opcode)
  213. {
  214. (void) opcode;
  215. z80->regfile.iff1 = true;
  216. z80->regfile.iff2 = true;
  217. z80->regfile.pc++;
  218. return 4;
  219. }
  220. // IM 0
  221. // IM 1
  222. // IM 2
  223. // ADD HL, ss
  224. // ADC HL, ss
  225. // SBC HL, ss
  226. // ADD IX, pp
  227. // ADD IY, rr
  228. /*
  229. INC ss (0x03, 0x13, 0x23, 0x33):
  230. Increment the 16-bit register encoded in the opcode.
  231. */
  232. static uint8_t z80_inst_inc_ss(Z80 *z80, uint8_t opcode)
  233. {
  234. uint8_t pair;
  235. switch(opcode) {
  236. case 0x03: pair = REG_BC; break;
  237. case 0x13: pair = REG_DE; break;
  238. case 0x23: pair = REG_HL; break;
  239. case 0x33: pair = REG_SP; break;
  240. }
  241. set_pair(z80, pair, get_pair(z80, pair) + 1);
  242. z80->regfile.pc++;
  243. return 6;
  244. }
  245. // INC IX
  246. // INC IY
  247. // DEC ss
  248. // DEC IX
  249. // DEC IY
  250. // RLCA
  251. // RLA
  252. // RRCA
  253. // RRA
  254. // RLC r
  255. // RLC (HL)
  256. // RLC (IX+d)
  257. // RLC (IY+d)
  258. // RL m
  259. // RRC m
  260. // RR m
  261. // SLA m
  262. // SRA m
  263. // SRL m
  264. // RLD
  265. // RRD
  266. // BIT b, r
  267. // BIT b, (HL)
  268. // BIT b, (IX+d)
  269. // BIT b, (IY+d)
  270. // SET b, r
  271. // SET b, (HL)
  272. // SET b, (IX+d)
  273. // SET b, (IY+d)
  274. // RES b, m
  275. // JP nn
  276. // JP cc, nn
  277. // JR e
  278. // JR C, e
  279. // JR NC, e
  280. // JR Z, e
  281. // JR NZ, e
  282. // JP (HL)
  283. // JP (IX)
  284. // JP (IY)
  285. // DJNZ, e
  286. // CALL nn
  287. // CALL cc, nn
  288. // RET
  289. // RET cc
  290. // RETI
  291. // RETN
  292. // RST p
  293. // IN A, (n)
  294. // IN r (C)
  295. // INI
  296. // INIR
  297. // IND
  298. // INDR
  299. // OUT (n), A
  300. // OUT (C), r
  301. // OUTI
  302. // OTIR
  303. // OUTD
  304. // OTDR
  305. static uint8_t (*instruction_lookup_table[256])(Z80*, uint8_t) = {
  306. [0x00] = z80_inst_nop,
  307. [0x01] = z80_inst_ld_dd_nn,
  308. [0x02] = z80_inst_unimplemented, // TODO
  309. [0x03] = z80_inst_inc_ss,
  310. [0x04] = z80_inst_inc_r,
  311. [0x05] = z80_inst_unimplemented, // TODO
  312. [0x06] = z80_inst_ld_r_n,
  313. [0x07] = z80_inst_unimplemented, // TODO
  314. [0x08] = z80_inst_unimplemented, // TODO
  315. [0x09] = z80_inst_unimplemented, // TODO
  316. [0x0A] = z80_inst_unimplemented, // TODO
  317. [0x0B] = z80_inst_unimplemented, // TODO
  318. [0x0C] = z80_inst_inc_r,
  319. [0x0D] = z80_inst_unimplemented, // TODO
  320. [0x0E] = z80_inst_ld_r_n,
  321. [0x0F] = z80_inst_unimplemented, // TODO
  322. [0x10] = z80_inst_unimplemented, // TODO
  323. [0x11] = z80_inst_ld_dd_nn,
  324. [0x12] = z80_inst_unimplemented, // TODO
  325. [0x13] = z80_inst_inc_ss,
  326. [0x14] = z80_inst_inc_r,
  327. [0x15] = z80_inst_unimplemented, // TODO
  328. [0x16] = z80_inst_ld_r_n,
  329. [0x17] = z80_inst_unimplemented, // TODO
  330. [0x18] = z80_inst_unimplemented, // TODO
  331. [0x19] = z80_inst_unimplemented, // TODO
  332. [0x1A] = z80_inst_unimplemented, // TODO
  333. [0x1B] = z80_inst_unimplemented, // TODO
  334. [0x1C] = z80_inst_inc_r,
  335. [0x1D] = z80_inst_unimplemented, // TODO
  336. [0x1E] = z80_inst_ld_r_n,
  337. [0x1F] = z80_inst_unimplemented, // TODO
  338. [0x20] = z80_inst_unimplemented, // TODO
  339. [0x21] = z80_inst_ld_dd_nn,
  340. [0x22] = z80_inst_unimplemented, // TODO
  341. [0x23] = z80_inst_inc_ss,
  342. [0x24] = z80_inst_inc_r,
  343. [0x25] = z80_inst_unimplemented, // TODO
  344. [0x26] = z80_inst_ld_r_n,
  345. [0x27] = z80_inst_unimplemented, // TODO
  346. [0x28] = z80_inst_unimplemented, // TODO
  347. [0x29] = z80_inst_unimplemented, // TODO
  348. [0x2A] = z80_inst_unimplemented, // TODO
  349. [0x2B] = z80_inst_unimplemented, // TODO
  350. [0x2C] = z80_inst_inc_r,
  351. [0x2D] = z80_inst_unimplemented, // TODO
  352. [0x2E] = z80_inst_ld_r_n,
  353. [0x2F] = z80_inst_unimplemented, // TODO
  354. [0x30] = z80_inst_unimplemented, // TODO
  355. [0x31] = z80_inst_ld_dd_nn,
  356. [0x32] = z80_inst_unimplemented, // TODO
  357. [0x33] = z80_inst_inc_ss,
  358. [0x34] = z80_inst_unimplemented, // TODO
  359. [0x35] = z80_inst_unimplemented, // TODO
  360. [0x36] = z80_inst_unimplemented, // TODO
  361. [0x37] = z80_inst_unimplemented, // TODO
  362. [0x38] = z80_inst_unimplemented, // TODO
  363. [0x39] = z80_inst_unimplemented, // TODO
  364. [0x3A] = z80_inst_unimplemented, // TODO
  365. [0x3B] = z80_inst_unimplemented, // TODO
  366. [0x3C] = z80_inst_inc_r,
  367. [0x3D] = z80_inst_unimplemented, // TODO
  368. [0x3E] = z80_inst_ld_r_n,
  369. [0x3F] = z80_inst_unimplemented, // TODO
  370. [0x40] = z80_inst_unimplemented, // TODO
  371. [0x41] = z80_inst_unimplemented, // TODO
  372. [0x42] = z80_inst_unimplemented, // TODO
  373. [0x43] = z80_inst_unimplemented, // TODO
  374. [0x44] = z80_inst_unimplemented, // TODO
  375. [0x45] = z80_inst_unimplemented, // TODO
  376. [0x46] = z80_inst_unimplemented, // TODO
  377. [0x47] = z80_inst_unimplemented, // TODO
  378. [0x48] = z80_inst_unimplemented, // TODO
  379. [0x49] = z80_inst_unimplemented, // TODO
  380. [0x4A] = z80_inst_unimplemented, // TODO
  381. [0x4B] = z80_inst_unimplemented, // TODO
  382. [0x4C] = z80_inst_unimplemented, // TODO
  383. [0x4D] = z80_inst_unimplemented, // TODO
  384. [0x4E] = z80_inst_unimplemented, // TODO
  385. [0x4F] = z80_inst_unimplemented, // TODO
  386. [0x50] = z80_inst_unimplemented, // TODO
  387. [0x51] = z80_inst_unimplemented, // TODO
  388. [0x52] = z80_inst_unimplemented, // TODO
  389. [0x53] = z80_inst_unimplemented, // TODO
  390. [0x54] = z80_inst_unimplemented, // TODO
  391. [0x55] = z80_inst_unimplemented, // TODO
  392. [0x56] = z80_inst_unimplemented, // TODO
  393. [0x57] = z80_inst_unimplemented, // TODO
  394. [0x58] = z80_inst_unimplemented, // TODO
  395. [0x59] = z80_inst_unimplemented, // TODO
  396. [0x5A] = z80_inst_unimplemented, // TODO
  397. [0x5B] = z80_inst_unimplemented, // TODO
  398. [0x5C] = z80_inst_unimplemented, // TODO
  399. [0x5D] = z80_inst_unimplemented, // TODO
  400. [0x5E] = z80_inst_unimplemented, // TODO
  401. [0x5F] = z80_inst_unimplemented, // TODO
  402. [0x60] = z80_inst_unimplemented, // TODO
  403. [0x61] = z80_inst_unimplemented, // TODO
  404. [0x62] = z80_inst_unimplemented, // TODO
  405. [0x63] = z80_inst_unimplemented, // TODO
  406. [0x64] = z80_inst_unimplemented, // TODO
  407. [0x65] = z80_inst_unimplemented, // TODO
  408. [0x66] = z80_inst_unimplemented, // TODO
  409. [0x67] = z80_inst_unimplemented, // TODO
  410. [0x68] = z80_inst_unimplemented, // TODO
  411. [0x69] = z80_inst_unimplemented, // TODO
  412. [0x6A] = z80_inst_unimplemented, // TODO
  413. [0x6B] = z80_inst_unimplemented, // TODO
  414. [0x6C] = z80_inst_unimplemented, // TODO
  415. [0x6D] = z80_inst_unimplemented, // TODO
  416. [0x6E] = z80_inst_unimplemented, // TODO
  417. [0x6F] = z80_inst_unimplemented, // TODO
  418. [0x70] = z80_inst_unimplemented, // TODO
  419. [0x71] = z80_inst_unimplemented, // TODO
  420. [0x72] = z80_inst_unimplemented, // TODO
  421. [0x73] = z80_inst_unimplemented, // TODO
  422. [0x74] = z80_inst_unimplemented, // TODO
  423. [0x75] = z80_inst_unimplemented, // TODO
  424. [0x76] = z80_inst_halt,
  425. [0x77] = z80_inst_unimplemented, // TODO
  426. [0x78] = z80_inst_unimplemented, // TODO
  427. [0x79] = z80_inst_unimplemented, // TODO
  428. [0x7A] = z80_inst_unimplemented, // TODO
  429. [0x7B] = z80_inst_unimplemented, // TODO
  430. [0x7C] = z80_inst_unimplemented, // TODO
  431. [0x7D] = z80_inst_unimplemented, // TODO
  432. [0x7E] = z80_inst_unimplemented, // TODO
  433. [0x7F] = z80_inst_unimplemented, // TODO
  434. [0x80] = z80_inst_unimplemented, // TODO
  435. [0x81] = z80_inst_unimplemented, // TODO
  436. [0x82] = z80_inst_unimplemented, // TODO
  437. [0x83] = z80_inst_unimplemented, // TODO
  438. [0x84] = z80_inst_unimplemented, // TODO
  439. [0x85] = z80_inst_unimplemented, // TODO
  440. [0x86] = z80_inst_unimplemented, // TODO
  441. [0x87] = z80_inst_unimplemented, // TODO
  442. [0x88] = z80_inst_unimplemented, // TODO
  443. [0x89] = z80_inst_unimplemented, // TODO
  444. [0x8A] = z80_inst_unimplemented, // TODO
  445. [0x8B] = z80_inst_unimplemented, // TODO
  446. [0x8C] = z80_inst_unimplemented, // TODO
  447. [0x8D] = z80_inst_unimplemented, // TODO
  448. [0x8E] = z80_inst_unimplemented, // TODO
  449. [0x8F] = z80_inst_unimplemented, // TODO
  450. [0x90] = z80_inst_unimplemented, // TODO
  451. [0x91] = z80_inst_unimplemented, // TODO
  452. [0x92] = z80_inst_unimplemented, // TODO
  453. [0x93] = z80_inst_unimplemented, // TODO
  454. [0x94] = z80_inst_unimplemented, // TODO
  455. [0x95] = z80_inst_unimplemented, // TODO
  456. [0x96] = z80_inst_unimplemented, // TODO
  457. [0x97] = z80_inst_unimplemented, // TODO
  458. [0x98] = z80_inst_unimplemented, // TODO
  459. [0x99] = z80_inst_unimplemented, // TODO
  460. [0x9A] = z80_inst_unimplemented, // TODO
  461. [0x9B] = z80_inst_unimplemented, // TODO
  462. [0x9C] = z80_inst_unimplemented, // TODO
  463. [0x9D] = z80_inst_unimplemented, // TODO
  464. [0x9E] = z80_inst_unimplemented, // TODO
  465. [0x9F] = z80_inst_unimplemented, // TODO
  466. [0xA0] = z80_inst_unimplemented, // TODO
  467. [0xA1] = z80_inst_unimplemented, // TODO
  468. [0xA2] = z80_inst_unimplemented, // TODO
  469. [0xA3] = z80_inst_unimplemented, // TODO
  470. [0xA4] = z80_inst_unimplemented, // TODO
  471. [0xA5] = z80_inst_unimplemented, // TODO
  472. [0xA6] = z80_inst_unimplemented, // TODO
  473. [0xA7] = z80_inst_unimplemented, // TODO
  474. [0xA8] = z80_inst_unimplemented, // TODO
  475. [0xA9] = z80_inst_unimplemented, // TODO
  476. [0xAA] = z80_inst_unimplemented, // TODO
  477. [0xAB] = z80_inst_unimplemented, // TODO
  478. [0xAC] = z80_inst_unimplemented, // TODO
  479. [0xAD] = z80_inst_unimplemented, // TODO
  480. [0xAE] = z80_inst_unimplemented, // TODO
  481. [0xAF] = z80_inst_unimplemented, // TODO
  482. [0xB0] = z80_inst_unimplemented, // TODO
  483. [0xB1] = z80_inst_unimplemented, // TODO
  484. [0xB2] = z80_inst_unimplemented, // TODO
  485. [0xB3] = z80_inst_unimplemented, // TODO
  486. [0xB4] = z80_inst_unimplemented, // TODO
  487. [0xB5] = z80_inst_unimplemented, // TODO
  488. [0xB6] = z80_inst_unimplemented, // TODO
  489. [0xB7] = z80_inst_unimplemented, // TODO
  490. [0xB8] = z80_inst_unimplemented, // TODO
  491. [0xB9] = z80_inst_unimplemented, // TODO
  492. [0xBA] = z80_inst_unimplemented, // TODO
  493. [0xBB] = z80_inst_unimplemented, // TODO
  494. [0xBC] = z80_inst_unimplemented, // TODO
  495. [0xBD] = z80_inst_unimplemented, // TODO
  496. [0xBE] = z80_inst_unimplemented, // TODO
  497. [0xBF] = z80_inst_unimplemented, // TODO
  498. [0xC0] = z80_inst_unimplemented, // TODO
  499. [0xC1] = z80_inst_unimplemented, // TODO
  500. [0xC2] = z80_inst_unimplemented, // TODO
  501. [0xC3] = z80_inst_unimplemented, // TODO
  502. [0xC4] = z80_inst_unimplemented, // TODO
  503. [0xC5] = z80_inst_unimplemented, // TODO
  504. [0xC6] = z80_inst_unimplemented, // TODO
  505. [0xC7] = z80_inst_unimplemented, // TODO
  506. [0xC8] = z80_inst_unimplemented, // TODO
  507. [0xC9] = z80_inst_unimplemented, // TODO
  508. [0xCA] = z80_inst_unimplemented, // TODO
  509. [0xCB] = z80_inst_unimplemented, // TODO
  510. [0xCC] = z80_inst_unimplemented, // TODO
  511. [0xCD] = z80_inst_unimplemented, // TODO
  512. [0xCE] = z80_inst_unimplemented, // TODO
  513. [0xCF] = z80_inst_unimplemented, // TODO
  514. [0xD0] = z80_inst_unimplemented, // TODO
  515. [0xD1] = z80_inst_unimplemented, // TODO
  516. [0xD2] = z80_inst_unimplemented, // TODO
  517. [0xD3] = z80_inst_unimplemented, // TODO
  518. [0xD4] = z80_inst_unimplemented, // TODO
  519. [0xD5] = z80_inst_unimplemented, // TODO
  520. [0xD6] = z80_inst_unimplemented, // TODO
  521. [0xD7] = z80_inst_unimplemented, // TODO
  522. [0xD8] = z80_inst_unimplemented, // TODO
  523. [0xD9] = z80_inst_exx,
  524. [0xDA] = z80_inst_unimplemented, // TODO
  525. [0xDB] = z80_inst_unimplemented, // TODO
  526. [0xDC] = z80_inst_unimplemented, // TODO
  527. [0xDD] = z80_inst_unimplemented, // TODO
  528. [0xDE] = z80_inst_unimplemented, // TODO
  529. [0xDF] = z80_inst_unimplemented, // TODO
  530. [0xE0] = z80_inst_unimplemented, // TODO
  531. [0xE1] = z80_inst_unimplemented, // TODO
  532. [0xE2] = z80_inst_unimplemented, // TODO
  533. [0xE3] = z80_inst_unimplemented, // TODO
  534. [0xE4] = z80_inst_unimplemented, // TODO
  535. [0xE5] = z80_inst_unimplemented, // TODO
  536. [0xE6] = z80_inst_unimplemented, // TODO
  537. [0xE7] = z80_inst_unimplemented, // TODO
  538. [0xE8] = z80_inst_unimplemented, // TODO
  539. [0xE9] = z80_inst_unimplemented, // TODO
  540. [0xEA] = z80_inst_unimplemented, // TODO
  541. [0xEB] = z80_inst_unimplemented, // TODO
  542. [0xEC] = z80_inst_unimplemented, // TODO
  543. [0xED] = z80_inst_unimplemented, // TODO
  544. [0xEE] = z80_inst_unimplemented, // TODO
  545. [0xEF] = z80_inst_unimplemented, // TODO
  546. [0xF0] = z80_inst_unimplemented, // TODO
  547. [0xF1] = z80_inst_unimplemented, // TODO
  548. [0xF2] = z80_inst_unimplemented, // TODO
  549. [0xF3] = z80_inst_di,
  550. [0xF4] = z80_inst_unimplemented, // TODO
  551. [0xF5] = z80_inst_unimplemented, // TODO
  552. [0xF6] = z80_inst_unimplemented, // TODO
  553. [0xF7] = z80_inst_unimplemented, // TODO
  554. [0xF8] = z80_inst_unimplemented, // TODO
  555. [0xF9] = z80_inst_unimplemented, // TODO
  556. [0xFA] = z80_inst_unimplemented, // TODO
  557. [0xFB] = z80_inst_ei,
  558. [0xFC] = z80_inst_unimplemented, // TODO
  559. [0xFD] = z80_inst_unimplemented, // TODO
  560. [0xFE] = z80_inst_unimplemented, // TODO
  561. [0xFF] = z80_inst_unimplemented // TODO
  562. };