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.
 
 
 
 
 

166 lines
10 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 "mnemonics.h"
  4. static char* const instr_mnemonics[256] = {
  5. /* 00 */ "nop", "ld", "ld", "inc", "inc", "dec", "ld", "rlca",
  6. /* 08 */ "ex", "add", "ld", "dec", "inc", "dec", "ld", "rrca",
  7. /* 10 */ "djnz", "ld", "ld", "inc", "inc", "dec", "ld", "rla",
  8. /* 18 */ "jr", "add", "ld", "dec", "inc", "dec", "ld", "rra",
  9. /* 20 */ "jr", "ld", "ld", "inc", "inc", "dec", "ld", "daa",
  10. /* 28 */ "jr", "add", "ld", "dec", "inc", "dec", "ld", "cpl",
  11. /* 30 */ "jr", "ld", "ld", "inc", "inc", "dec", "ld", "scf",
  12. /* 38 */ "jr", "add", "ld", "dec", "inc", "dec", "ld", "ccf",
  13. /* 40 */ "ld", "ld", "ld", "ld", "ld", "ld", "ld", "ld",
  14. /* 48 */ "ld", "ld", "ld", "ld", "ld", "ld", "ld", "ld",
  15. /* 50 */ "ld", "ld", "ld", "ld", "ld", "ld", "ld", "ld",
  16. /* 58 */ "ld", "ld", "ld", "ld", "ld", "ld", "ld", "ld",
  17. /* 60 */ "ld", "ld", "ld", "ld", "ld", "ld", "ld", "ld",
  18. /* 68 */ "ld", "ld", "ld", "ld", "ld", "ld", "ld", "ld",
  19. /* 70 */ "ld", "ld", "ld", "ld", "ld", "ld", "halt", "ld",
  20. /* 78 */ "ld", "ld", "ld", "ld", "ld", "ld", "ld", "ld",
  21. /* 80 */ "add", "add", "add", "add", "add", "add", "add", "add",
  22. /* 88 */ "adc", "adc", "adc", "adc", "adc", "adc", "adc", "adc",
  23. /* 90 */ "sub", "sub", "sub", "sub", "sub", "sub", "sub", "sub",
  24. /* 98 */ "sbc", "sbc", "sbc", "sbc", "sbc", "sbc", "sbc", "sbc",
  25. /* A0 */ "and", "and", "and", "and", "and", "and", "and", "and",
  26. /* A8 */ "xor", "xor", "xor", "xor", "xor", "xor", "xor", "xor",
  27. /* B0 */ "or", "or", "or", "or", "or", "or", "or", "or",
  28. /* B8 */ "cp", "cp", "cp", "cp", "cp", "cp", "cp", "cp",
  29. /* C0 */ "ret", "pop", "jp", "jp", "call", "push", "add", "rst",
  30. /* C8 */ "ret", "ret", "jp", "", "call", "call", "adc", "rst",
  31. /* D0 */ "ret", "pop", "jp", "out", "call", "push", "sub", "rst",
  32. /* D8 */ "ret", "exx", "jp", "in", "call", "", "sbc", "rst",
  33. /* E0 */ "ret", "pop", "jp", "ex", "call", "push", "and", "rst",
  34. /* E8 */ "ret", "jp", "jp", "ex", "call", "", "xor", "rst",
  35. /* F0 */ "ret", "pop", "jp", "di", "call", "push", "or", "rst",
  36. /* F8 */ "ret", "ld", "jp", "ei", "call", "", "cp", "rst"
  37. };
  38. static char* const instr_mnemonics_extended[256] = {
  39. /* 00 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  40. /* 08 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  41. /* 10 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  42. /* 18 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  43. /* 20 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  44. /* 28 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  45. /* 30 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  46. /* 38 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  47. /* 40 */ "in", "out", "sbc", "ld", "neg", "retn", "im", "ld",
  48. /* 48 */ "in", "out", "adc", "ld", "neg", "reti", "im", "ld",
  49. /* 50 */ "in", "out", "sbc", "ld", "neg", "retn", "im", "ld",
  50. /* 58 */ "in", "out", "adc", "ld", "neg", "retn", "im", "ld",
  51. /* 60 */ "in", "out", "sbc", "ld", "neg", "retn", "im", "rrd",
  52. /* 68 */ "in", "out", "adc", "ld", "neg", "retn", "im", "rld",
  53. /* 70 */ "in", "out", "sbc", "ld", "neg", "retn", "im", "nop",
  54. /* 78 */ "in", "out", "adc", "ld", "neg", "retn", "im", "nop",
  55. /* 80 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  56. /* 88 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  57. /* 90 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  58. /* 98 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  59. /* A0 */ "ldi", "cpi", "ini", "outi", "nop", "nop", "nop", "nop",
  60. /* A8 */ "ldd", "cpd", "ind", "outd", "nop", "nop", "nop", "nop",
  61. /* B0 */ "ldir", "cpir", "inir", "otir", "nop", "nop", "nop", "nop",
  62. /* B8 */ "lddr", "cpdr", "indr", "otdr", "nop", "nop", "nop", "nop",
  63. /* C0 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  64. /* C8 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  65. /* D0 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  66. /* D8 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  67. /* E0 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  68. /* E8 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  69. /* F0 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  70. /* F8 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop"
  71. };
  72. static char* const instr_mnemonics_bits[256] = {
  73. /* 00 */ "rlc", "rlc", "rlc", "rlc", "rlc", "rlc", "rlc", "rlc",
  74. /* 08 */ "rrc", "rrc", "rrc", "rrc", "rrc", "rrc", "rrc", "rrc",
  75. /* 10 */ "rl", "rl", "rl", "rl", "rl", "rl", "rl", "rl",
  76. /* 18 */ "rr", "rr", "rr", "rr", "rr", "rr", "rr", "rr",
  77. /* 20 */ "sla", "sla", "sla", "sla", "sla", "sla", "sla", "sla",
  78. /* 28 */ "sra", "sra", "sra", "sra", "sra", "sra", "sra", "sra",
  79. /* 30 */ "sl1", "sl1", "sl1", "sl1", "sl1", "sl1", "sl1", "sl1",
  80. /* 38 */ "srl", "srl", "srl", "srl", "srl", "srl", "srl", "srl",
  81. /* 40 */ "bit", "bit", "bit", "bit", "bit", "bit", "bit", "bit",
  82. /* 48 */ "bit", "bit", "bit", "bit", "bit", "bit", "bit", "bit",
  83. /* 50 */ "bit", "bit", "bit", "bit", "bit", "bit", "bit", "bit",
  84. /* 58 */ "bit", "bit", "bit", "bit", "bit", "bit", "bit", "bit",
  85. /* 60 */ "bit", "bit", "bit", "bit", "bit", "bit", "bit", "bit",
  86. /* 68 */ "bit", "bit", "bit", "bit", "bit", "bit", "bit", "bit",
  87. /* 70 */ "bit", "bit", "bit", "bit", "bit", "bit", "bit", "bit",
  88. /* 78 */ "bit", "bit", "bit", "bit", "bit", "bit", "bit", "bit",
  89. /* 80 */ "res", "res", "res", "res", "res", "res", "res", "res",
  90. /* 88 */ "res", "res", "res", "res", "res", "res", "res", "res",
  91. /* 90 */ "res", "res", "res", "res", "res", "res", "res", "res",
  92. /* 98 */ "res", "res", "res", "res", "res", "res", "res", "res",
  93. /* A0 */ "res", "res", "res", "res", "res", "res", "res", "res",
  94. /* A8 */ "res", "res", "res", "res", "res", "res", "res", "res",
  95. /* B0 */ "res", "res", "res", "res", "res", "res", "res", "res",
  96. /* B8 */ "res", "res", "res", "res", "res", "res", "res", "res",
  97. /* C0 */ "set", "set", "set", "set", "set", "set", "set", "set",
  98. /* C8 */ "set", "set", "set", "set", "set", "set", "set", "set",
  99. /* D0 */ "set", "set", "set", "set", "set", "set", "set", "set",
  100. /* D8 */ "set", "set", "set", "set", "set", "set", "set", "set",
  101. /* E0 */ "set", "set", "set", "set", "set", "set", "set", "set",
  102. /* E8 */ "set", "set", "set", "set", "set", "set", "set", "set",
  103. /* F0 */ "set", "set", "set", "set", "set", "set", "set", "set",
  104. /* F8 */ "set", "set", "set", "set", "set", "set", "set", "set"
  105. };
  106. static char* const instr_mnemonics_index[256] = {
  107. /* 00 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  108. /* 08 */ "nop", "add", "nop", "nop", "nop", "nop", "nop", "nop",
  109. /* 10 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  110. /* 18 */ "nop", "add", "nop", "nop", "nop", "nop", "nop", "nop",
  111. /* 20 */ "nop", "ld", "ld", "inc", "inc", "dec", "ld", "nop",
  112. /* 28 */ "nop", "add", "ld", "dec", "inc", "dec", "ld", "nop",
  113. /* 30 */ "nop", "nop", "nop", "nop", "inc", "dec", "ld", "nop",
  114. /* 38 */ "nop", "add", "nop", "nop", "nop", "nop", "nop", "nop",
  115. /* 40 */ "nop", "nop", "nop", "nop", "ld", "ld", "ld", "nop",
  116. /* 48 */ "nop", "nop", "nop", "nop", "ld", "ld", "ld", "nop",
  117. /* 50 */ "nop", "nop", "nop", "nop", "ld", "ld", "ld", "nop",
  118. /* 58 */ "nop", "nop", "nop", "nop", "ld", "ld", "ld", "nop",
  119. /* 60 */ "ld", "ld", "ld", "ld", "ld", "ld", "ld", "ld",
  120. /* 68 */ "ld", "ld", "ld", "ld", "ld", "ld", "ld", "ld",
  121. /* 70 */ "ld", "ld", "ld", "ld", "ld", "ld", "nop", "ld",
  122. /* 78 */ "nop", "nop", "nop", "nop", "ld", "ld", "ld", "nop",
  123. /* 80 */ "nop", "nop", "nop", "nop", "add", "add", "add", "nop",
  124. /* 88 */ "nop", "nop", "nop", "nop", "adc", "adc", "adc", "nop",
  125. /* 90 */ "nop", "nop", "nop", "nop", "sub", "sub", "sub", "nop",
  126. /* 98 */ "nop", "nop", "nop", "nop", "sbc", "sbc", "sbc", "nop",
  127. /* A0 */ "nop", "nop", "nop", "nop", "and", "and", "and", "nop",
  128. /* A8 */ "nop", "nop", "nop", "nop", "xor", "xor", "xor", "nop",
  129. /* B0 */ "nop", "nop", "nop", "nop", "or", "or", "or", "nop",
  130. /* B8 */ "nop", "nop", "nop", "nop", "cp", "cp", "cp", "nop",
  131. /* C0 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  132. /* C8 */ "nop", "nop", "nop", "", "nop", "nop", "nop", "nop",
  133. /* D0 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  134. /* D8 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  135. /* E0 */ "nop", "pop", "nop", "ex", "nop", "push", "nop", "nop",
  136. /* E8 */ "nop", "jp", "nop", "nop", "nop", "nop", "nop", "nop",
  137. /* F0 */ "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop",
  138. /* F8 */ "nop", "ld", "nop", "nop", "nop", "nop", "nop", "nop"
  139. };
  140. /*
  141. Extract the assembly mnemonic for the given opcode.
  142. The return value is a string literal and should not be freed.
  143. */
  144. char* decode_mnemonic(const uint8_t *bytes)
  145. {
  146. uint8_t b = bytes[0];
  147. if (b == 0xED)
  148. return instr_mnemonics_extended[bytes[1]];
  149. if (b == 0xCB)
  150. return instr_mnemonics_bits[bytes[1]];
  151. if (b == 0xDD || b == 0xFD) {
  152. if (bytes[1] == 0xCB)
  153. return instr_mnemonics_bits[bytes[3]];
  154. return instr_mnemonics_index[bytes[1]];
  155. }
  156. return instr_mnemonics[b];
  157. }