op_pc.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. #ifdef SCPU_CPP
  2. //bcc
  3. case 0x90: {
  4. if(!!regs.p.c) last_cycle();
  5. rd.l = op_readpc();
  6. if(!regs.p.c) {
  7. aa.w = regs.pc.d + (int8)rd.l;
  8. regs.pc.w = aa.w;
  9. } else {
  10. break;
  11. }
  12. op_io_cond6(aa.w);
  13. last_cycle();
  14. op_io();
  15. } break;
  16. //bcs
  17. case 0xb0: {
  18. if(!regs.p.c) last_cycle();
  19. rd.l = op_readpc();
  20. if(regs.p.c) {
  21. aa.w = regs.pc.d + (int8)rd.l;
  22. regs.pc.w = aa.w;
  23. } else {
  24. break;
  25. }
  26. op_io_cond6(aa.w);
  27. last_cycle();
  28. op_io();
  29. } break;
  30. //bne
  31. case 0xd0: {
  32. if(!!regs.p.z) last_cycle();
  33. rd.l = op_readpc();
  34. if(!regs.p.z) {
  35. aa.w = regs.pc.d + (int8)rd.l;
  36. regs.pc.w = aa.w;
  37. } else {
  38. break;
  39. }
  40. op_io_cond6(aa.w);
  41. last_cycle();
  42. op_io();
  43. } break;
  44. //beq
  45. case 0xf0: {
  46. if(!regs.p.z) last_cycle();
  47. rd.l = op_readpc();
  48. if(regs.p.z) {
  49. aa.w = regs.pc.d + (int8)rd.l;
  50. regs.pc.w = aa.w;
  51. } else {
  52. break;
  53. }
  54. op_io_cond6(aa.w);
  55. last_cycle();
  56. op_io();
  57. } break;
  58. //bpl
  59. case 0x10: {
  60. if(!!regs.p.n) last_cycle();
  61. rd.l = op_readpc();
  62. if(!regs.p.n) {
  63. aa.w = regs.pc.d + (int8)rd.l;
  64. regs.pc.w = aa.w;
  65. } else {
  66. break;
  67. }
  68. op_io_cond6(aa.w);
  69. last_cycle();
  70. op_io();
  71. } break;
  72. //bmi
  73. case 0x30: {
  74. if(!regs.p.n) last_cycle();
  75. rd.l = op_readpc();
  76. if(regs.p.n) {
  77. aa.w = regs.pc.d + (int8)rd.l;
  78. regs.pc.w = aa.w;
  79. } else {
  80. break;
  81. }
  82. op_io_cond6(aa.w);
  83. last_cycle();
  84. op_io();
  85. } break;
  86. //bvc
  87. case 0x50: {
  88. if(!!regs.p.v) last_cycle();
  89. rd.l = op_readpc();
  90. if(!regs.p.v) {
  91. aa.w = regs.pc.d + (int8)rd.l;
  92. regs.pc.w = aa.w;
  93. } else {
  94. break;
  95. }
  96. op_io_cond6(aa.w);
  97. last_cycle();
  98. op_io();
  99. } break;
  100. //bvs
  101. case 0x70: {
  102. if(!regs.p.v) last_cycle();
  103. rd.l = op_readpc();
  104. if(regs.p.v) {
  105. aa.w = regs.pc.d + (int8)rd.l;
  106. regs.pc.w = aa.w;
  107. } else {
  108. break;
  109. }
  110. op_io_cond6(aa.w);
  111. last_cycle();
  112. op_io();
  113. } break;
  114. //bra
  115. case 0x80: {
  116. rd.l = op_readpc();
  117. aa.w = regs.pc.d + (int8)rd.l;
  118. regs.pc.w = aa.w;
  119. op_io_cond6(aa.w);
  120. last_cycle();
  121. op_io();
  122. } break;
  123. //brl
  124. case 0x82: {
  125. rd.l = op_readpc();
  126. rd.h = op_readpc();
  127. last_cycle();
  128. op_io();
  129. regs.pc.w = regs.pc.d + (int16)rd.w;
  130. } break;
  131. //jmp_addr
  132. case 0x4c: {
  133. rd.l = op_readpc();
  134. last_cycle();
  135. rd.h = op_readpc();
  136. regs.pc.w = rd.w;
  137. } break;
  138. //jmp_long
  139. case 0x5c: {
  140. rd.l = op_readpc();
  141. rd.h = op_readpc();
  142. last_cycle();
  143. rd.b = op_readpc();
  144. regs.pc.d = rd.d & 0xffffff;
  145. } break;
  146. //jmp_iaddr
  147. case 0x6c: {
  148. aa.l = op_readpc();
  149. aa.h = op_readpc();
  150. rd.l = op_readaddr(aa.w);
  151. last_cycle();
  152. rd.h = op_readaddr(aa.w + 1);
  153. regs.pc.w = rd.w;
  154. } break;
  155. //jmp_iaddrx
  156. case 0x7c: {
  157. aa.l = op_readpc();
  158. aa.h = op_readpc();
  159. op_io();
  160. rd.l = op_readpbr(aa.w + regs.x.w);
  161. last_cycle();
  162. rd.h = op_readpbr(aa.w + regs.x.w + 1);
  163. regs.pc.w = rd.w;
  164. } break;
  165. //jmp_iladdr
  166. case 0xdc: {
  167. aa.l = op_readpc();
  168. aa.h = op_readpc();
  169. rd.l = op_readaddr(aa.w);
  170. rd.h = op_readaddr(aa.w + 1);
  171. last_cycle();
  172. rd.b = op_readaddr(aa.w + 2);
  173. regs.pc.d = rd.d & 0xffffff;
  174. } break;
  175. //jsr_addr
  176. case 0x20: {
  177. aa.l = op_readpc();
  178. aa.h = op_readpc();
  179. op_io();
  180. regs.pc.w--;
  181. op_writestack(regs.pc.h);
  182. last_cycle();
  183. op_writestack(regs.pc.l);
  184. regs.pc.w = aa.w;
  185. } break;
  186. //jsr_long
  187. case 0x22: {
  188. aa.l = op_readpc();
  189. aa.h = op_readpc();
  190. op_writestackn(regs.pc.b);
  191. op_io();
  192. aa.b = op_readpc();
  193. regs.pc.w--;
  194. op_writestackn(regs.pc.h);
  195. last_cycle();
  196. op_writestackn(regs.pc.l);
  197. regs.pc.d = aa.d & 0xffffff;
  198. if(regs.e) regs.s.h = 0x01;
  199. } break;
  200. //jsr_iaddrx
  201. case 0xfc: {
  202. aa.l = op_readpc();
  203. op_writestackn(regs.pc.h);
  204. op_writestackn(regs.pc.l);
  205. aa.h = op_readpc();
  206. op_io();
  207. rd.l = op_readpbr(aa.w + regs.x.w);
  208. last_cycle();
  209. rd.h = op_readpbr(aa.w + regs.x.w + 1);
  210. regs.pc.w = rd.w;
  211. if(regs.e) regs.s.h = 0x01;
  212. } break;
  213. //rti
  214. case 0x40: {
  215. op_io();
  216. op_io();
  217. regs.p = op_readstack();
  218. if(regs.e) regs.p |= 0x30;
  219. if(regs.p.x) {
  220. regs.x.h = 0x00;
  221. regs.y.h = 0x00;
  222. }
  223. rd.l = op_readstack();
  224. if(regs.e) last_cycle();
  225. rd.h = op_readstack();
  226. if(regs.e) {
  227. regs.pc.w = rd.w;
  228. break;
  229. }
  230. last_cycle();
  231. rd.b = op_readstack();
  232. regs.pc.d = rd.d & 0xffffff;
  233. } break;
  234. //rts
  235. case 0x60: {
  236. op_io();
  237. op_io();
  238. rd.l = op_readstack();
  239. rd.h = op_readstack();
  240. last_cycle();
  241. op_io();
  242. regs.pc.w = rd.w;
  243. regs.pc.w++;
  244. } break;
  245. //rtl
  246. case 0x6b: {
  247. op_io();
  248. op_io();
  249. rd.l = op_readstackn();
  250. rd.h = op_readstackn();
  251. last_cycle();
  252. rd.b = op_readstackn();
  253. regs.pc.d = rd.d & 0xffffff;
  254. regs.pc.w++;
  255. if(regs.e) regs.s.h = 0x01;
  256. } break;
  257. #endif