dsmp.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. #ifdef SMP_CPP
  2. //virtual function, see src/cpu/dcpu.cpp
  3. //for explanation of this function
  4. bool SMP::in_opcode() { return false; }
  5. uint16 SMP::__relb(int8 offset, int op_len) {
  6. uint16 pc = regs.pc + op_len;
  7. return pc + offset;
  8. }
  9. void SMP::disassemble_opcode(char *output) {
  10. char *s, t[512];
  11. uint8 op, op0, op1;
  12. uint16 opw, opdp0, opdp1;
  13. s = output;
  14. if(in_opcode() == true) {
  15. strcpy(s, "..???? <SMP within opcode>");
  16. return;
  17. }
  18. sprintf(s, "..%.4x ", regs.pc);
  19. op = ram_read(regs.pc);
  20. op0 = ram_read(regs.pc + 1);
  21. op1 = ram_read(regs.pc + 2);
  22. opw = (op0) | (op1 << 8);
  23. opdp0 = ((regs.p.p)?0x100:0x000) + op0;
  24. opdp1 = ((regs.p.p)?0x100:0x000) + op1;
  25. strcpy(t, " ");
  26. switch(op) {
  27. case 0x00: sprintf(t, "nop"); break;
  28. case 0x01: sprintf(t, "tcall 0"); break;
  29. case 0x02: sprintf(t, "set0 $%.3x", opdp0); break;
  30. case 0x03: sprintf(t, "bbs0 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break;
  31. case 0x04: sprintf(t, "or a,$%.3x", opdp0); break;
  32. case 0x05: sprintf(t, "or a,$%.4x", opw); break;
  33. case 0x06: sprintf(t, "or a,(x)"); break;
  34. case 0x07: sprintf(t, "or a,($%.3x+x)", opdp0); break;
  35. case 0x08: sprintf(t, "or a,#$%.2x", op0); break;
  36. case 0x09: sprintf(t, "or $%.3x,$%.3x", opdp1, opdp0); break;
  37. case 0x0a: sprintf(t, "or1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break;
  38. case 0x0b: sprintf(t, "asl $%.3x", opdp0); break;
  39. case 0x0c: sprintf(t, "asl $%.4x", opw); break;
  40. case 0x0d: sprintf(t, "push p"); break;
  41. case 0x0e: sprintf(t, "tset $%.4x,a", opw); break;
  42. case 0x0f: sprintf(t, "brk"); break;
  43. case 0x10: sprintf(t, "bpl $%.4x", __relb(op0, 2)); break;
  44. case 0x11: sprintf(t, "tcall 1"); break;
  45. case 0x12: sprintf(t, "clr0 $%.3x", opdp0); break;
  46. case 0x13: sprintf(t, "bbc0 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break;
  47. case 0x14: sprintf(t, "or a,$%.3x+x", opdp0); break;
  48. case 0x15: sprintf(t, "or a,$%.4x+x", opw); break;
  49. case 0x16: sprintf(t, "or a,$%.4x+y", opw); break;
  50. case 0x17: sprintf(t, "or a,($%.3x)+y", opdp0); break;
  51. case 0x18: sprintf(t, "or $%.3x,#$%.2x", opdp1, op0); break;
  52. case 0x19: sprintf(t, "or (x),(y)"); break;
  53. case 0x1a: sprintf(t, "decw $%.3x", opdp0); break;
  54. case 0x1b: sprintf(t, "asl $%.3x+x", opdp0); break;
  55. case 0x1c: sprintf(t, "asl a"); break;
  56. case 0x1d: sprintf(t, "dec x"); break;
  57. case 0x1e: sprintf(t, "cmp x,$%.4x", opw); break;
  58. case 0x1f: sprintf(t, "jmp ($%.4x+x)", opw); break;
  59. case 0x20: sprintf(t, "clrp"); break;
  60. case 0x21: sprintf(t, "tcall 2"); break;
  61. case 0x22: sprintf(t, "set1 $%.3x", opdp0); break;
  62. case 0x23: sprintf(t, "bbs1 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break;
  63. case 0x24: sprintf(t, "and a,$%.3x", opdp0); break;
  64. case 0x25: sprintf(t, "and a,$%.4x", opw); break;
  65. case 0x26: sprintf(t, "and a,(x)"); break;
  66. case 0x27: sprintf(t, "and a,($%.3x+x)", opdp0); break;
  67. case 0x28: sprintf(t, "and a,#$%.2x", op0); break;
  68. case 0x29: sprintf(t, "and $%.3x,$%.3x", opdp1, opdp0); break;
  69. case 0x2a: sprintf(t, "or1 c,!$%.4x:%d", opw & 0x1fff, opw >> 13); break;
  70. case 0x2b: sprintf(t, "rol $%.3x", opdp0); break;
  71. case 0x2c: sprintf(t, "rol $%.4x", opw); break;
  72. case 0x2d: sprintf(t, "push a"); break;
  73. case 0x2e: sprintf(t, "cbne $%.3x,$%.4x", opdp0, __relb(op1, 3)); break;
  74. case 0x2f: sprintf(t, "bra $%.4x", __relb(op0, 2)); break;
  75. case 0x30: sprintf(t, "bmi $%.4x", __relb(op0, 2)); break;
  76. case 0x31: sprintf(t, "tcall 3"); break;
  77. case 0x32: sprintf(t, "clr1 $%.3x", opdp0); break;
  78. case 0x33: sprintf(t, "bbc1 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break;
  79. case 0x34: sprintf(t, "and a,$%.3x+x", opdp0); break;
  80. case 0x35: sprintf(t, "and a,$%.4x+x", opw); break;
  81. case 0x36: sprintf(t, "and a,$%.4x+y", opw); break;
  82. case 0x37: sprintf(t, "and a,($%.3x)+y", opdp0); break;
  83. case 0x38: sprintf(t, "and $%.3x,#$%.2x", opdp1, op0); break;
  84. case 0x39: sprintf(t, "and (x),(y)"); break;
  85. case 0x3a: sprintf(t, "incw $%.3x", opdp0); break;
  86. case 0x3b: sprintf(t, "rol $%.3x+x", opdp0); break;
  87. case 0x3c: sprintf(t, "rol a"); break;
  88. case 0x3d: sprintf(t, "inc x"); break;
  89. case 0x3e: sprintf(t, "cmp x,$%.3x", opdp0); break;
  90. case 0x3f: sprintf(t, "call $%.4x", opw); break;
  91. case 0x40: sprintf(t, "setp"); break;
  92. case 0x41: sprintf(t, "tcall 4"); break;
  93. case 0x42: sprintf(t, "set2 $%.3x", opdp0); break;
  94. case 0x43: sprintf(t, "bbs2 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break;
  95. case 0x44: sprintf(t, "eor a,$%.3x", opdp0); break;
  96. case 0x45: sprintf(t, "eor a,$%.4x", opw); break;
  97. case 0x46: sprintf(t, "eor a,(x)"); break;
  98. case 0x47: sprintf(t, "eor a,($%.3x+x)", opdp0); break;
  99. case 0x48: sprintf(t, "eor a,#$%.2x", op0); break;
  100. case 0x49: sprintf(t, "eor $%.3x,$%.3x", opdp1, opdp0); break;
  101. case 0x4a: sprintf(t, "and1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break;
  102. case 0x4b: sprintf(t, "lsr $%.3x", opdp0); break;
  103. case 0x4c: sprintf(t, "lsr $%.4x", opw); break;
  104. case 0x4d: sprintf(t, "push x"); break;
  105. case 0x4e: sprintf(t, "tclr $%.4x,a", opw); break;
  106. case 0x4f: sprintf(t, "pcall $ff%.2x", op0); break;
  107. case 0x50: sprintf(t, "bvc $%.4x", __relb(op0, 2)); break;
  108. case 0x51: sprintf(t, "tcall 5"); break;
  109. case 0x52: sprintf(t, "clr2 $%.3x", opdp0); break;
  110. case 0x53: sprintf(t, "bbc2 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break;
  111. case 0x54: sprintf(t, "eor a,$%.3x+x", opdp0); break;
  112. case 0x55: sprintf(t, "eor a,$%.4x+x", opw); break;
  113. case 0x56: sprintf(t, "eor a,$%.4x+y", opw); break;
  114. case 0x57: sprintf(t, "eor a,($%.3x)+y", opdp0); break;
  115. case 0x58: sprintf(t, "eor $%.3x,#$%.2x", opdp1, op0); break;
  116. case 0x59: sprintf(t, "eor (x),(y)"); break;
  117. case 0x5a: sprintf(t, "cmpw ya,$%.3x", opdp0); break;
  118. case 0x5b: sprintf(t, "lsr $%.3x+x", opdp0); break;
  119. case 0x5c: sprintf(t, "lsr a"); break;
  120. case 0x5d: sprintf(t, "mov x,a"); break;
  121. case 0x5e: sprintf(t, "cmp y,$%.4x", opw); break;
  122. case 0x5f: sprintf(t, "jmp $%.4x", opw); break;
  123. case 0x60: sprintf(t, "clrc"); break;
  124. case 0x61: sprintf(t, "tcall 6"); break;
  125. case 0x62: sprintf(t, "set3 $%.3x", opdp0); break;
  126. case 0x63: sprintf(t, "bbs3 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break;
  127. case 0x64: sprintf(t, "cmp a,$%.3x", opdp0); break;
  128. case 0x65: sprintf(t, "cmp a,$%.4x", opw); break;
  129. case 0x66: sprintf(t, "cmp a,(x)"); break;
  130. case 0x67: sprintf(t, "cmp a,($%.3x+x)", opdp0); break;
  131. case 0x68: sprintf(t, "cmp a,#$%.2x", op0); break;
  132. case 0x69: sprintf(t, "cmp $%.3x,$%.3x", opdp1, opdp0); break;
  133. case 0x6a: sprintf(t, "and1 c,!$%.4x:%d", opw & 0x1fff, opw >> 13); break;
  134. case 0x6b: sprintf(t, "ror $%.3x", opdp0); break;
  135. case 0x6c: sprintf(t, "ror $%.4x", opw); break;
  136. case 0x6d: sprintf(t, "push y"); break;
  137. case 0x6e: sprintf(t, "dbnz $%.3x,$%.4x", opdp0, __relb(op1, 3)); break;
  138. case 0x6f: sprintf(t, "ret"); break;
  139. case 0x70: sprintf(t, "bvs $%.4x", __relb(op0, 2)); break;
  140. case 0x71: sprintf(t, "tcall 7"); break;
  141. case 0x72: sprintf(t, "clr3 $%.3x", opdp0); break;
  142. case 0x73: sprintf(t, "bbc3 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break;
  143. case 0x74: sprintf(t, "cmp a,$%.3x+x", opdp0); break;
  144. case 0x75: sprintf(t, "cmp a,$%.4x+x", opw); break;
  145. case 0x76: sprintf(t, "cmp a,$%.4x+y", opw); break;
  146. case 0x77: sprintf(t, "cmp a,($%.3x)+y", opdp0); break;
  147. case 0x78: sprintf(t, "cmp $%.3x,#$%.2x", opdp1, op0); break;
  148. case 0x79: sprintf(t, "cmp (x),(y)"); break;
  149. case 0x7a: sprintf(t, "addw ya,$%.3x", opdp0); break;
  150. case 0x7b: sprintf(t, "ror $%.3x+x", opdp0); break;
  151. case 0x7c: sprintf(t, "ror a"); break;
  152. case 0x7d: sprintf(t, "mov a,x"); break;
  153. case 0x7e: sprintf(t, "cmp y,$%.3x", opdp0); break;
  154. case 0x7f: sprintf(t, "reti"); break;
  155. case 0x80: sprintf(t, "setc"); break;
  156. case 0x81: sprintf(t, "tcall 8"); break;
  157. case 0x82: sprintf(t, "set4 $%.3x", opdp0); break;
  158. case 0x83: sprintf(t, "bbs4 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break;
  159. case 0x84: sprintf(t, "adc a,$%.3x", opdp0); break;
  160. case 0x85: sprintf(t, "adc a,$%.4x", opw); break;
  161. case 0x86: sprintf(t, "adc a,(x)"); break;
  162. case 0x87: sprintf(t, "adc a,($%.3x+x)", opdp0); break;
  163. case 0x88: sprintf(t, "adc a,#$%.2x", op0); break;
  164. case 0x89: sprintf(t, "adc $%.3x,$%.3x", opdp1, opdp0); break;
  165. case 0x8a: sprintf(t, "eor1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break;
  166. case 0x8b: sprintf(t, "dec $%.3x", opdp0); break;
  167. case 0x8c: sprintf(t, "dec $%.4x", opw); break;
  168. case 0x8d: sprintf(t, "mov y,#$%.2x", op0); break;
  169. case 0x8e: sprintf(t, "pop p"); break;
  170. case 0x8f: sprintf(t, "mov $%.3x,#$%.2x", opdp1, op0); break;
  171. case 0x90: sprintf(t, "bcc $%.4x", __relb(op0, 2)); break;
  172. case 0x91: sprintf(t, "tcall 9"); break;
  173. case 0x92: sprintf(t, "clr4 $%.3x", opdp0); break;
  174. case 0x93: sprintf(t, "bbc4 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break;
  175. case 0x94: sprintf(t, "adc a,$%.3x+x", opdp0); break;
  176. case 0x95: sprintf(t, "adc a,$%.4x+x", opw); break;
  177. case 0x96: sprintf(t, "adc a,$%.4x+y", opw); break;
  178. case 0x97: sprintf(t, "adc a,($%.3x)+y", opdp0); break;
  179. case 0x98: sprintf(t, "adc $%.3x,#$%.2x", opdp1, op0); break;
  180. case 0x99: sprintf(t, "adc (x),(y)"); break;
  181. case 0x9a: sprintf(t, "subw ya,$%.3x", opdp0); break;
  182. case 0x9b: sprintf(t, "dec $%.3x+x", opdp0); break;
  183. case 0x9c: sprintf(t, "dec a"); break;
  184. case 0x9d: sprintf(t, "mov x,sp"); break;
  185. case 0x9e: sprintf(t, "div ya,x"); break;
  186. case 0x9f: sprintf(t, "xcn a"); break;
  187. case 0xa0: sprintf(t, "ei"); break;
  188. case 0xa1: sprintf(t, "tcall 10"); break;
  189. case 0xa2: sprintf(t, "set5 $%.3x", opdp0); break;
  190. case 0xa3: sprintf(t, "bbs5 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break;
  191. case 0xa4: sprintf(t, "sbc a,$%.3x", opdp0); break;
  192. case 0xa5: sprintf(t, "sbc a,$%.4x", opw); break;
  193. case 0xa6: sprintf(t, "sbc a,(x)"); break;
  194. case 0xa7: sprintf(t, "sbc a,($%.3x+x)", opdp0); break;
  195. case 0xa8: sprintf(t, "sbc a,#$%.2x", op0); break;
  196. case 0xa9: sprintf(t, "sbc $%.3x,$%.3x", opdp1, opdp0); break;
  197. case 0xaa: sprintf(t, "mov1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break;
  198. case 0xab: sprintf(t, "inc $%.3x", opdp0); break;
  199. case 0xac: sprintf(t, "inc $%.4x", opw); break;
  200. case 0xad: sprintf(t, "cmp y,#$%.2x", op0); break;
  201. case 0xae: sprintf(t, "pop a"); break;
  202. case 0xaf: sprintf(t, "mov (x)+,a"); break;
  203. case 0xb0: sprintf(t, "bcs $%.4x", __relb(op0, 2)); break;
  204. case 0xb1: sprintf(t, "tcall 11"); break;
  205. case 0xb2: sprintf(t, "clr5 $%.3x", opdp0); break;
  206. case 0xb3: sprintf(t, "bbc5 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break;
  207. case 0xb4: sprintf(t, "sbc a,$%.3x+x", opdp0); break;
  208. case 0xb5: sprintf(t, "sbc a,$%.4x+x", opw); break;
  209. case 0xb6: sprintf(t, "sbc a,$%.4x+y", opw); break;
  210. case 0xb7: sprintf(t, "sbc a,($%.3x)+y", opdp0); break;
  211. case 0xb8: sprintf(t, "sbc $%.3x,#$%.2x", opdp1, op0); break;
  212. case 0xb9: sprintf(t, "sbc (x),(y)"); break;
  213. case 0xba: sprintf(t, "movw ya,$%.3x", opdp0); break;
  214. case 0xbb: sprintf(t, "inc $%.3x+x", opdp0); break;
  215. case 0xbc: sprintf(t, "inc a"); break;
  216. case 0xbd: sprintf(t, "mov sp,x"); break;
  217. case 0xbe: sprintf(t, "das a"); break;
  218. case 0xbf: sprintf(t, "mov a,(x)+"); break;
  219. case 0xc0: sprintf(t, "di"); break;
  220. case 0xc1: sprintf(t, "tcall 12"); break;
  221. case 0xc2: sprintf(t, "set6 $%.3x", opdp0); break;
  222. case 0xc3: sprintf(t, "bbs6 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break;
  223. case 0xc4: sprintf(t, "mov $%.3x,a", opdp0); break;
  224. case 0xc5: sprintf(t, "mov $%.4x,a", opw); break;
  225. case 0xc6: sprintf(t, "mov (x),a"); break;
  226. case 0xc7: sprintf(t, "mov ($%.3x+x),a", opdp0); break;
  227. case 0xc8: sprintf(t, "cmp x,#$%.2x", op0); break;
  228. case 0xc9: sprintf(t, "mov $%.4x,x", opw); break;
  229. case 0xca: sprintf(t, "mov1 $%.4x:%d,c", opw & 0x1fff, opw >> 13); break;
  230. case 0xcb: sprintf(t, "mov $%.3x,y", opdp0); break;
  231. case 0xcc: sprintf(t, "mov $%.4x,y", opw); break;
  232. case 0xcd: sprintf(t, "mov x,#$%.2x", op0); break;
  233. case 0xce: sprintf(t, "pop x"); break;
  234. case 0xcf: sprintf(t, "mul ya"); break;
  235. case 0xd0: sprintf(t, "bne $%.4x", __relb(op0, 2)); break;
  236. case 0xd1: sprintf(t, "tcall 13"); break;
  237. case 0xd2: sprintf(t, "clr6 $%.3x", opdp0); break;
  238. case 0xd3: sprintf(t, "bbc6 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break;
  239. case 0xd4: sprintf(t, "mov $%.3x+x,a", opdp0); break;
  240. case 0xd5: sprintf(t, "mov $%.4x+x,a", opw); break;
  241. case 0xd6: sprintf(t, "mov $%.4x+y,a", opw); break;
  242. case 0xd7: sprintf(t, "mov ($%.3x)+y,a", opdp0); break;
  243. case 0xd8: sprintf(t, "mov $%.3x,x", opdp0); break;
  244. case 0xd9: sprintf(t, "mov $%.3x+y,x", opdp0); break;
  245. case 0xda: sprintf(t, "movw $%.3x,ya", opdp0); break;
  246. case 0xdb: sprintf(t, "mov $%.3x+x,y", opdp0); break;
  247. case 0xdc: sprintf(t, "dec y"); break;
  248. case 0xdd: sprintf(t, "mov a,y"); break;
  249. case 0xde: sprintf(t, "cbne $%.3x+x,$%.4x", opdp0, __relb(op1, 3)); break;
  250. case 0xdf: sprintf(t, "daa a"); break;
  251. case 0xe0: sprintf(t, "clrv"); break;
  252. case 0xe1: sprintf(t, "tcall 14"); break;
  253. case 0xe2: sprintf(t, "set7 $%.3x", opdp0); break;
  254. case 0xe3: sprintf(t, "bbs7 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break;
  255. case 0xe4: sprintf(t, "mov a,$%.3x", opdp0); break;
  256. case 0xe5: sprintf(t, "mov a,$%.4x", opw); break;
  257. case 0xe6: sprintf(t, "mov a,(x)"); break;
  258. case 0xe7: sprintf(t, "mov a,($%.3x+x)", opdp0); break;
  259. case 0xe8: sprintf(t, "mov a,#$%.2x", op0); break;
  260. case 0xe9: sprintf(t, "mov x,$%.4x", opw); break;
  261. case 0xea: sprintf(t, "not1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break;
  262. case 0xeb: sprintf(t, "mov y,$%.3x", opdp0); break;
  263. case 0xec: sprintf(t, "mov y,$%.4x", opw); break;
  264. case 0xed: sprintf(t, "notc"); break;
  265. case 0xee: sprintf(t, "pop y"); break;
  266. case 0xef: sprintf(t, "sleep"); break;
  267. case 0xf0: sprintf(t, "beq $%.4x", __relb(op0, 2)); break;
  268. case 0xf1: sprintf(t, "tcall 15"); break;
  269. case 0xf2: sprintf(t, "clr7 $%.3x", opdp0); break;
  270. case 0xf3: sprintf(t, "bbc7 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break;
  271. case 0xf4: sprintf(t, "mov a,$%.3x+x", opdp0); break;
  272. case 0xf5: sprintf(t, "mov a,$%.4x+x", opw); break;
  273. case 0xf6: sprintf(t, "mov a,$%.4x+y", opw); break;
  274. case 0xf7: sprintf(t, "mov a,($%.3x)+y", opdp0); break;
  275. case 0xf8: sprintf(t, "mov x,$%.3x", opdp0); break;
  276. case 0xf9: sprintf(t, "mov x,$%.3x+y", opdp0); break;
  277. case 0xfa: sprintf(t, "mov $%.3x,$%.3x", opdp1, opdp0); break;
  278. case 0xfb: sprintf(t, "mov y,$%.3x+x", opdp0); break;
  279. case 0xfc: sprintf(t, "inc y"); break;
  280. case 0xfd: sprintf(t, "mov y,a"); break;
  281. case 0xfe: sprintf(t, "dbnz y,$%.4x", __relb(op0, 2)); break;
  282. case 0xff: sprintf(t, "stop"); break;
  283. }
  284. t[strlen(t)] = ' ';
  285. strcat(s, t);
  286. sprintf(t, "A:%.2x X:%.2x Y:%.2x SP:01%.2x YA:%.4x ",
  287. regs.a, regs.x, regs.y, regs.sp, regs.ya);
  288. strcat(s, t);
  289. sprintf(t, "%c%c%c%c%c%c%c%c",
  290. regs.p.n ? 'N' : 'n',
  291. regs.p.v ? 'V' : 'v',
  292. regs.p.p ? 'P' : 'p',
  293. regs.p.b ? 'B' : 'b',
  294. regs.p.h ? 'H' : 'h',
  295. regs.p.i ? 'I' : 'i',
  296. regs.p.z ? 'Z' : 'z',
  297. regs.p.c ? 'C' : 'c');
  298. strcat(s, t);
  299. }
  300. #endif //ifdef SMP_CPP