Advertisement
Guest User

Untitled

a guest
Sep 30th, 2016
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.60 KB | None | 0 0
  1. #include "EP6502Instr.h"
  2. #include "6502.h"
  3.  
  4.  
  5. static EP6502Instruction s_instructions[256] = {
  6. {/*0x00,*/ kMnemonic_BRK, kAddrMode_Implied, 1, 7, 0},
  7. {/*0x01,*/ kMnemonic_ORA, kAddrMode_IndirectX, 2, 6, 0},
  8. {/*0x02,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  9. {/*0x03,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  10. {/*0x04,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  11. {/*0x05,*/ kMnemonic_ORA, kAddrMode_ZeroPage, 2, 3, 0},
  12. {/*0x06,*/ kMnemonic_ASL, kAddrMode_ZeroPage, 2, 5, 0},
  13. {/*0x07,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  14. {/*0x08,*/ kMnemonic_PHP, kAddrMode_Implied, 1, 3, 0},
  15. {/*0x09,*/ kMnemonic_ORA, kAddrMode_Immediate, 2, 2, 0},
  16. {/*0x0a,*/ kMnemonic_ASL, kAddrMode_Accumulator, 1, 2, 0},
  17. {/*0x0b,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  18. {/*0x0c,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  19. {/*0x0d,*/ kMnemonic_ORA, kAddrMode_Absolute, 3, 4, 0},
  20. {/*0x0e,*/ kMnemonic_ASL, kAddrMode_Absolute, 3, 6, 0},
  21. {/*0x0f,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  22. {/*0x10,*/ kMnemonic_BPL, kAddrMode_Relative, 2, 2, kCyclesPlus1IfBranchToSamePage | kCyclesPlus2IfBranchToDiffPage},
  23. {/*0x11,*/ kMnemonic_ORA, kAddrMode_IndirectY, 2, 5, kCyclesPlus1IfPageBoundryCrossed},
  24. {/*0x12,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  25. {/*0x13,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  26. {/*0x14,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  27. {/*0x15,*/ kMnemonic_ORA, kAddrMode_ZeroPageX, 2, 4, 0},
  28. {/*0x16,*/ kMnemonic_ASL, kAddrMode_ZeroPageX, 2, 6, 0},
  29. {/*0x07,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  30. {/*0x18,*/ kMnemonic_CLC, kAddrMode_Implied, 1, 2, 0},
  31. {/*0x19,*/ kMnemonic_ORA, kAddrMode_AbsoluteY, 3, 4, kCyclesPlus1IfPageBoundryCrossed},
  32. {/*0x1a,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  33. {/*0x1b,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  34. {/*0x1c,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  35. {/*0x1d,*/ kMnemonic_ORA, kAddrMode_AbsoluteX, 3, 4, kCyclesPlus1IfPageBoundryCrossed},
  36. {/*0x1e,*/ kMnemonic_ASL, kAddrMode_AbsoluteX, 3, 7, 0},
  37. {/*0x1f,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  38. {/*0x20,*/ kMnemonic_JSR, kAddrMode_Absolute, 3, 6, 0},
  39. {/*0x21,*/ kMnemonic_AND, kAddrMode_IndirectX, 2, 6, 0},
  40. {/*0x22,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  41. {/*0x23,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  42. {/*0x24,*/ kMnemonic_BIT, kAddrMode_ZeroPage, 2, 3, 0},
  43. {/*0x25,*/ kMnemonic_AND, kAddrMode_ZeroPage, 2, 3, 0},
  44. {/*0x26,*/ kMnemonic_ROL, kAddrMode_ZeroPage, 2, 5, 0},
  45. {/*0x27,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  46. {/*0x28,*/ kMnemonic_PLP, kAddrMode_Implied, 1, 4, 0},
  47. {/*0x29,*/ kMnemonic_AND, kAddrMode_Immediate, 2, 2, 0},
  48. {/*0x2a,*/ kMnemonic_ROL, kAddrMode_Accumulator, 1, 2, 0},
  49. {/*0x2b,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  50. {/*0x2c,*/ kMnemonic_BIT, kAddrMode_Absolute, 3, 4, 0},
  51. {/*0x2d,*/ kMnemonic_AND, kAddrMode_Absolute, 3, 4, 0},
  52. {/*0x2e,*/ kMnemonic_ROL, kAddrMode_Absolute, 3, 6, 0},
  53. {/*0x2f,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  54. {/*0x30,*/ kMnemonic_BMI, kAddrMode_Relative, 2, 2, kCyclesPlus1IfBranchToSamePage | kCyclesPlus2IfBranchToDiffPage},
  55. {/*0x31,*/ kMnemonic_AND, kAddrMode_IndirectY, 2, 5, kCyclesPlus1IfPageBoundryCrossed},
  56. {/*0x32,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  57. {/*0x33,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  58. {/*0x34,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  59. {/*0x35,*/ kMnemonic_AND, kAddrMode_ZeroPageX, 2, 4, 0},
  60. {/*0x36,*/ kMnemonic_ROL, kAddrMode_ZeroPageX, 2, 6, 0},
  61. {/*0x37,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  62. {/*0x38,*/ kMnemonic_SEC, kAddrMode_Implied, 1, 2, 0},
  63. {/*0x39,*/ kMnemonic_AND, kAddrMode_AbsoluteY, 3, 4, kCyclesPlus1IfPageBoundryCrossed},
  64. {/*0x3a,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  65. {/*0x3b,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  66. {/*0x3c,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  67. {/*0x3d,*/ kMnemonic_AND, kAddrMode_AbsoluteX, 3, 4, kCyclesPlus1IfPageBoundryCrossed},
  68. {/*0x3e,*/ kMnemonic_ROL, kAddrMode_AbsoluteX, 3, 7, 0},
  69. {/*0x3f,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  70. {/*0x40,*/ kMnemonic_RTI, kAddrMode_Implied, 1, 6, 0},
  71. {/*0x41,*/ kMnemonic_EOR, kAddrMode_IndirectX, 2, 6, 0},
  72. {/*0x42,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  73. {/*0x43,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  74. {/*0x44,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  75. {/*0x45,*/ kMnemonic_EOR, kAddrMode_ZeroPage, 2, 3, 0},
  76. {/*0x46,*/ kMnemonic_LSR, kAddrMode_ZeroPage, 2, 5, 0},
  77. {/*0x07,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  78. {/*0x48,*/ kMnemonic_PHA, kAddrMode_Implied, 1, 3, 0},
  79. {/*0x49,*/ kMnemonic_EOR, kAddrMode_Immediate, 2, 2, 0},
  80. {/*0x4a,*/ kMnemonic_LSR, kAddrMode_Accumulator, 1, 2, 0},
  81. {/*0x0b,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  82. {/*0x4c,*/ kMnemonic_JMP, kAddrMode_Absolute, 3, 3, 0},
  83. {/*0x4d,*/ kMnemonic_EOR, kAddrMode_Absolute, 3, 4, 0},
  84. {/*0x4e,*/ kMnemonic_LSR, kAddrMode_Absolute, 3, 6, 0},
  85. {/*0x4f,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  86. {/*0x50,*/ kMnemonic_BVC, kAddrMode_Relative, 2, 2, kCyclesPlus1IfBranchToSamePage | kCyclesPlus2IfBranchToDiffPage},
  87. {/*0x51,*/ kMnemonic_EOR, kAddrMode_IndirectY, 2, 5, kCyclesPlus1IfPageBoundryCrossed},
  88. {/*0x52,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  89. {/*0x53,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  90. {/*0x54,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  91. {/*0x55,*/ kMnemonic_EOR, kAddrMode_ZeroPageX, 2, 4, 0},
  92. {/*0x56,*/ kMnemonic_LSR, kAddrMode_ZeroPageX, 2, 6, 0},
  93. {/*0x57,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  94. {/*0x58,*/ kMnemonic_CLI, kAddrMode_Implied, 1, 2, 0},
  95. {/*0x59,*/ kMnemonic_EOR, kAddrMode_AbsoluteY, 3, 4, kCyclesPlus1IfPageBoundryCrossed},
  96. {/*0x5a,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  97. {/*0x5b,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  98. {/*0x5c,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  99. {/*0x5d,*/ kMnemonic_EOR, kAddrMode_AbsoluteX, 3, 4, kCyclesPlus1IfPageBoundryCrossed},
  100. {/*0x5e,*/ kMnemonic_LSR, kAddrMode_AbsoluteX, 3, 7, 0},
  101. {/*0x5f,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  102. {/*0x60,*/ kMnemonic_RTS, kAddrMode_Implied, 1, 6, 0},
  103. {/*0x61,*/ kMnemonic_ADC, kAddrMode_IndirectX, 2, 6, 0},
  104. {/*0x62,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  105. {/*0x63,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  106. {/*0x64,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  107. {/*0x65,*/ kMnemonic_ADC, kAddrMode_ZeroPage, 2, 3, 0},
  108. {/*0x66,*/ kMnemonic_ROR, kAddrMode_ZeroPage, 2, 5, 0},
  109. {/*0x67,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  110. {/*0x68,*/ kMnemonic_PLA, kAddrMode_Implied, 1, 4, 0},
  111. {/*0x69,*/ kMnemonic_ADC, kAddrMode_Immediate, 2, 2, 0},
  112. {/*0x6a,*/ kMnemonic_ROR, kAddrMode_Accumulator, 1, 2, 0},
  113. {/*0x6b,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  114. {/*0x6c,*/ kMnemonic_JMP, kAddrMode_Indirect, 3, 5, 0},
  115. {/*0x6d,*/ kMnemonic_ADC, kAddrMode_Absolute, 3, 4, 0},
  116. {/*0x6e,*/ kMnemonic_ROR, kAddrMode_Absolute, 3, 6, 0},
  117. {/*0x6f,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  118. {/*0x70,*/ kMnemonic_BVS, kAddrMode_Relative, 2, 2, kCyclesPlus1IfBranchToSamePage | kCyclesPlus2IfBranchToDiffPage},
  119. {/*0x71,*/ kMnemonic_ADC, kAddrMode_IndirectY, 2, 5, kCyclesPlus1IfPageBoundryCrossed},
  120. {/*0x72,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  121. {/*0x73,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  122. {/*0x74,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  123. {/*0x75,*/ kMnemonic_ADC, kAddrMode_ZeroPageX, 2, 4, 0},
  124. {/*0x76,*/ kMnemonic_ROR, kAddrMode_ZeroPageX, 2, 6, 0},
  125. {/*0x77,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  126. {/*0x78,*/ kMnemonic_SEI, kAddrMode_Implied, 1, 2, 0},
  127. {/*0x79,*/ kMnemonic_ADC, kAddrMode_AbsoluteY, 3, 4, kCyclesPlus1IfPageBoundryCrossed},
  128. {/*0x7a,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  129. {/*0x7b,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  130. {/*0x7c,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  131. {/*0x7d,*/ kMnemonic_ADC, kAddrMode_AbsoluteX, 3, 4, kCyclesPlus1IfPageBoundryCrossed},
  132. {/*0x7e,*/ kMnemonic_ROR, kAddrMode_AbsoluteX, 3, 7, 0},
  133. {/*0x7f,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  134. {/*0x80,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  135. {/*0x81,*/ kMnemonic_STA, kAddrMode_IndirectX, 2, 6, 0},
  136. {/*0x82,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  137. {/*0x83,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  138. {/*0x84,*/ kMnemonic_STY, kAddrMode_ZeroPage, 2, 3, 0}, // cycles ???
  139. {/*0x85,*/ kMnemonic_STA, kAddrMode_ZeroPage, 2, 3, 0}, // cycles ???
  140. {/*0x86,*/ kMnemonic_STX, kAddrMode_ZeroPage, 2, 3, 0}, // cycles ???
  141. {/*0x87,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  142. {/*0x88,*/ kMnemonic_DEY, kAddrMode_Implied, 1, 2, 0},
  143. {/*0x89,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  144. {/*0x8a,*/ kMnemonic_TXA, kAddrMode_Implied, 1, 2, 0},
  145. {/*0x8b,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  146. {/*0x8c,*/ kMnemonic_STY, kAddrMode_Absolute, 3, 4, 0},
  147. {/*0x8d,*/ kMnemonic_STA, kAddrMode_Absolute, 3, 4, 0},
  148. {/*0x8e,*/ kMnemonic_STX, kAddrMode_Absolute, 3, 4, 0},
  149. {/*0x8f,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  150. {/*0x90,*/ kMnemonic_BCC, kAddrMode_Relative, 2, 2, kCyclesPlus1IfBranchToSamePage | kCyclesPlus2IfBranchToDiffPage},
  151. {/*0x91,*/ kMnemonic_STA, kAddrMode_IndirectY, 2, 6, 0},
  152. {/*0x92,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  153. {/*0x93,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  154. {/*0x94,*/ kMnemonic_STY, kAddrMode_ZeroPageX, 2, 4, 0},
  155. {/*0x95,*/ kMnemonic_STA, kAddrMode_ZeroPageX, 2, 4, 0},
  156. {/*0x96,*/ kMnemonic_STX, kAddrMode_ZeroPageY, 2, 4, 0},
  157. {/*0x97,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  158. {/*0x98,*/ kMnemonic_TYA, kAddrMode_Implied, 1, 2, 0},
  159. {/*0x99,*/ kMnemonic_STA, kAddrMode_AbsoluteY, 3, 5, 0},
  160. {/*0x9a,*/ kMnemonic_TXS, kAddrMode_Implied, 1, 2, 0},
  161. {/*0x9b,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  162. {/*0x9c,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  163. {/*0x9d,*/ kMnemonic_STA, kAddrMode_AbsoluteX, 3, 5, 0},
  164. {/*0x9e,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  165. {/*0x9f,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  166. {/*0xa0,*/ kMnemonic_LDY, kAddrMode_Immediate, 2, 2, 0},
  167. {/*0xa1,*/ kMnemonic_LDA, kAddrMode_IndirectX, 2, 6, 0},
  168. {/*0xa2,*/ kMnemonic_LDX, kAddrMode_Immediate, 2, 2, 0},
  169. {/*0xa3,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  170. {/*0xa4,*/ kMnemonic_LDY, kAddrMode_ZeroPage, 2, 3, 0},
  171. {/*0xa5,*/ kMnemonic_LDA, kAddrMode_ZeroPage, 2, 3, 0},
  172. {/*0xa6,*/ kMnemonic_LDX, kAddrMode_ZeroPage, 2, 3, 0},
  173. {/*0xa7,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  174. {/*0xa8,*/ kMnemonic_TAY, kAddrMode_Implied, 1, 2, 0},
  175. {/*0xa9,*/ kMnemonic_LDA, kAddrMode_Immediate, 2, 2, 0},
  176. {/*0xaa,*/ kMnemonic_TAX, kAddrMode_Implied, 1, 2, 0},
  177. {/*0xab,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  178. {/*0xac,*/ kMnemonic_LDY, kAddrMode_Absolute, 3, 4, 0},
  179. {/*0xad,*/ kMnemonic_LDA, kAddrMode_Absolute, 3, 4, 0},
  180. {/*0xae,*/ kMnemonic_LDX, kAddrMode_Absolute, 3, 4, 0},
  181. {/*0xaf,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  182. {/*0xb0,*/ kMnemonic_BCS, kAddrMode_Relative, 2, 2, kCyclesPlus1IfBranchToSamePage | kCyclesPlus2IfBranchToDiffPage},
  183. {/*0xb1,*/ kMnemonic_LDA, kAddrMode_IndirectY, 2, 5, kCyclesPlus1IfPageBoundryCrossed},
  184. {/*0xb2,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  185. {/*0xb3,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  186. {/*0xb4,*/ kMnemonic_LDY, kAddrMode_ZeroPageX, 2, 4, 0},
  187. {/*0xb5,*/ kMnemonic_LDA, kAddrMode_ZeroPageX, 2, 4, 0},
  188. {/*0xb6,*/ kMnemonic_LDX, kAddrMode_ZeroPageY, 2, 4, 0},
  189. {/*0xb7,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  190. {/*0xb8,*/ kMnemonic_CLV, kAddrMode_Implied, 1, 2, 0},
  191. {/*0xb9,*/ kMnemonic_LDA, kAddrMode_AbsoluteY, 3, 4, 0},
  192. {/*0xba,*/ kMnemonic_TSX, kAddrMode_Implied, 1, 2, 0},
  193. {/*0xbb,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  194. {/*0xbc,*/ kMnemonic_LDY, kAddrMode_AbsoluteX, 3, 4, kCyclesPlus1IfPageBoundryCrossed},
  195. {/*0xbd,*/ kMnemonic_LDA, kAddrMode_AbsoluteX, 3, 4, kCyclesPlus1IfPageBoundryCrossed},
  196. {/*0xbe,*/ kMnemonic_LDX, kAddrMode_AbsoluteY, 3, 4, kCyclesPlus1IfPageBoundryCrossed},
  197. {/*0xbf,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  198. {/*0xc0,*/ kMnemonic_CPY, kAddrMode_Immediate, 2, 2, 0},
  199. {/*0xc1,*/ kMnemonic_CMP, kAddrMode_IndirectX, 2, 6, 0},
  200. {/*0xc2,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  201. {/*0xc3,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  202. {/*0xc4,*/ kMnemonic_CPY, kAddrMode_ZeroPage, 2, 3, 0},
  203. {/*0xc5,*/ kMnemonic_CMP, kAddrMode_ZeroPage, 2, 3, 0},
  204. {/*0xc6,*/ kMnemonic_DEC, kAddrMode_ZeroPage, 2, 5, 0},
  205. {/*0xc7,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  206. {/*0xc8,*/ kMnemonic_INY, kAddrMode_Implied, 1, 2, 0},
  207. {/*0xc9,*/ kMnemonic_CMP, kAddrMode_Immediate, 2, 2, 0},
  208. {/*0xca,*/ kMnemonic_DEX, kAddrMode_Implied, 1, 2, 0},
  209. {/*0xcb,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  210. {/*0xcc,*/ kMnemonic_CPY, kAddrMode_Absolute, 3, 4, 0},
  211. {/*0xcd,*/ kMnemonic_CMP, kAddrMode_Absolute, 3, 4, 0},
  212. {/*0xce,*/ kMnemonic_DEC, kAddrMode_Absolute, 3, 6, 0},
  213. {/*0xcf,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  214. {/*0xd0,*/ kMnemonic_BNE, kAddrMode_Relative, 2, 2, kCyclesPlus1IfBranchToSamePage | kCyclesPlus2IfBranchToDiffPage},
  215. {/*0xd1,*/ kMnemonic_CMP, kAddrMode_IndirectY, 2, 5, kCyclesPlus1IfPageBoundryCrossed},
  216. {/*0xd2,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  217. {/*0xd3,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  218. {/*0xd4,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  219. {/*0xd5,*/ kMnemonic_CMP, kAddrMode_ZeroPageX, 2, 4, 0},
  220. {/*0xd6,*/ kMnemonic_DEC, kAddrMode_ZeroPageX, 2, 6, 0},
  221. {/*0xd7,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  222. {/*0xd8,*/ kMnemonic_CLD, kAddrMode_Implied, 1, 2, 0},
  223. {/*0xd9,*/ kMnemonic_CMP, kAddrMode_AbsoluteY, 3, 4, kCyclesPlus1IfPageBoundryCrossed},
  224. {/*0xda,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  225. {/*0xdb,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  226. {/*0xdc,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  227. {/*0xdd,*/ kMnemonic_CMP, kAddrMode_AbsoluteX, 3, 4, kCyclesPlus1IfPageBoundryCrossed},
  228. {/*0xde,*/ kMnemonic_DEC, kAddrMode_AbsoluteX, 3, 7, 0},
  229. {/*0xdf,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  230. {/*0xe0,*/ kMnemonic_CPX, kAddrMode_Immediate, 2, 2, 0},
  231. {/*0xe1,*/ kMnemonic_SBC, kAddrMode_IndirectX, 2, 6, 0},
  232. {/*0xe2,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  233. {/*0xe3,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  234. {/*0xe4,*/ kMnemonic_CPX, kAddrMode_ZeroPage, 2, 3, 0},
  235. {/*0xe5,*/ kMnemonic_SBC, kAddrMode_ZeroPage, 2, 3, 0},
  236. {/*0xe6,*/ kMnemonic_INC, kAddrMode_ZeroPage, 2, 5, 0},
  237. {/*0xe7,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  238. {/*0xe8,*/ kMnemonic_INX, kAddrMode_Implied, 1, 2, 0},
  239. {/*0xe9,*/ kMnemonic_SBC, kAddrMode_Immediate, 2, 2, 0},
  240. {/*0xea,*/ kMnemonic_NOP, kAddrMode_Implied, 1, 2, 0},
  241. {/*0xeb,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  242. {/*0xec,*/ kMnemonic_CPX, kAddrMode_Absolute, 3, 4, 0},
  243. {/*0xed,*/ kMnemonic_SBC, kAddrMode_Absolute, 3, 4, 0},
  244. {/*0xee,*/ kMnemonic_INC, kAddrMode_Absolute, 3, 6, 0},
  245. {/*0xef,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  246. {/*0xf0,*/ kMnemonic_BEQ, kAddrMode_Relative, 2, 2, kCyclesPlus1IfBranchToSamePage | kCyclesPlus2IfBranchToDiffPage},
  247. {/*0xf1,*/ kMnemonic_SBC, kAddrMode_IndirectY, 2, 5, kCyclesPlus1IfPageBoundryCrossed},
  248. {/*0xf2,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  249. {/*0xf3,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  250. {/*0xf4,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  251. {/*0xf5,*/ kMnemonic_SBC, kAddrMode_ZeroPageX, 2, 4, 0},
  252. {/*0xf6,*/ kMnemonic_INC, kAddrMode_ZeroPageX, 2, 6, 0},
  253. {/*0xf7,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  254. {/*0xf8,*/ kMnemonic_SED, kAddrMode_Implied, 1, 2, 0},
  255. {/*0xf9,*/ kMnemonic_SBC, kAddrMode_AbsoluteY, 3, 4, kCyclesPlus1IfPageBoundryCrossed},
  256. {/*0xfa,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  257. {/*0xfb,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  258. {/*0xfc,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  259. {/*0xfd,*/ kMnemonic_SBC, kAddrMode_AbsoluteX, 3, 4, kCyclesPlus1IfPageBoundryCrossed},
  260. {/*0xfe,*/ kMnemonic_INC, kAddrMode_AbsoluteX, 3, 7, 0},
  261. {/*0xff,*/ kMnemonic_nil, kAddrMode_nil, 0, 0, 0},
  262. };
  263.  
  264. static char s_mnemonics[] =
  265. "???\0"
  266. "ADC\0AND\0ASL\0"
  267. "BCC\0BCS\0BEQ\0BIT\0BMI\0BNE\0BPL\0BRK\0BVC\0BVS\0"
  268. "CLC\0CLD\0CLI\0CLV\0CMP\0CPX\0CPY\0"
  269. "DEC\0DEX\0DEY\0"
  270. "EOR\0"
  271. "INC\0INX\0INY\0"
  272. "JMP\0JSR\0"
  273. "LDA\0LDX\0LDY\0LSR\0"
  274. "NOP\0"
  275. "ORA\0"
  276. "PHA\0PHP\0PLA\0PLP\0"
  277. "ROL\0ROR\0RTI\0RTS\0"
  278. "SBC\0SEC\0SED\0SEI\0STA\0STX\0STY\0"
  279. "TAX\0TAY\0TSX\0TXA\0TXS\0TYA\0";
  280.  
  281. #define kMnemonicStrLen 3
  282.  
  283.  
  284. EP6502Instructions::EP6502Instructions()
  285. {
  286. instructions = s_instructions;
  287. }
  288.  
  289. UInt8 EP6502Instructions::size(UInt8 opcode)
  290. {
  291. const EP6502Instruction* instr = instruction(opcode);
  292. if (instr->mnemonic == kMnemonic_nil)
  293. return 0;
  294. return instr->size;
  295. }
  296.  
  297. UInt8 EP6502Instructions::operandSize(UInt8 opcode)
  298. {
  299. const EP6502Instruction* instr = instruction(opcode);
  300. if (instr->mnemonic == kMnemonic_nil)
  301. return 0;
  302. return instr->size - 1;
  303. }
  304.  
  305. const char* EP6502Instructions::GetMnemonicStrFromID(UInt8 mnemonic)
  306. {
  307. return s_mnemonics + (mnemonic * (kMnemonicStrLen + 1));
  308. }
  309.  
  310. const char* EP6502Instructions::GetMnemonicStrFromOpcode(UInt8 opcode)
  311. {
  312. return s_mnemonics + (s_instructions[opcode].mnemonic * (kMnemonicStrLen + 1));
  313. }
  314.  
  315. UInt8 EP6502Instructions::GetMnemonicFromOpcode(UInt8 opcode)
  316. {
  317. return s_instructions[opcode].mnemonic;
  318. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement