op_rmw.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. #ifdef SCPU_CPP
  2. //inc
  3. case 0x1a: {
  4. last_cycle();
  5. op_io_irq();
  6. if(regs.p.m) {
  7. regs.a.l++;
  8. regs.p.n = !!(regs.a.l & 0x80);
  9. regs.p.z = (regs.a.l == 0);
  10. } else {
  11. regs.a.w++;
  12. regs.p.n = !!(regs.a.w & 0x8000);
  13. regs.p.z = (regs.a.w == 0);
  14. }
  15. } break;
  16. //inx
  17. case 0xe8: {
  18. last_cycle();
  19. op_io_irq();
  20. if(regs.p.x) {
  21. regs.x.l++;
  22. regs.p.n = !!(regs.x.l & 0x80);
  23. regs.p.z = (regs.x.l == 0);
  24. } else {
  25. regs.x.w++;
  26. regs.p.n = !!(regs.x.w & 0x8000);
  27. regs.p.z = (regs.x.w == 0);
  28. }
  29. } break;
  30. //iny
  31. case 0xc8: {
  32. last_cycle();
  33. op_io_irq();
  34. if(regs.p.x) {
  35. regs.y.l++;
  36. regs.p.n = !!(regs.y.l & 0x80);
  37. regs.p.z = (regs.y.l == 0);
  38. } else {
  39. regs.y.w++;
  40. regs.p.n = !!(regs.y.w & 0x8000);
  41. regs.p.z = (regs.y.w == 0);
  42. }
  43. } break;
  44. //dec
  45. case 0x3a: {
  46. last_cycle();
  47. op_io_irq();
  48. if(regs.p.m) {
  49. regs.a.l--;
  50. regs.p.n = !!(regs.a.l & 0x80);
  51. regs.p.z = (regs.a.l == 0);
  52. } else {
  53. regs.a.w--;
  54. regs.p.n = !!(regs.a.w & 0x8000);
  55. regs.p.z = (regs.a.w == 0);
  56. }
  57. } break;
  58. //dex
  59. case 0xca: {
  60. last_cycle();
  61. op_io_irq();
  62. if(regs.p.x) {
  63. regs.x.l--;
  64. regs.p.n = !!(regs.x.l & 0x80);
  65. regs.p.z = (regs.x.l == 0);
  66. } else {
  67. regs.x.w--;
  68. regs.p.n = !!(regs.x.w & 0x8000);
  69. regs.p.z = (regs.x.w == 0);
  70. }
  71. } break;
  72. //dey
  73. case 0x88: {
  74. last_cycle();
  75. op_io_irq();
  76. if(regs.p.x) {
  77. regs.y.l--;
  78. regs.p.n = !!(regs.y.l & 0x80);
  79. regs.p.z = (regs.y.l == 0);
  80. } else {
  81. regs.y.w--;
  82. regs.p.n = !!(regs.y.w & 0x8000);
  83. regs.p.z = (regs.y.w == 0);
  84. }
  85. } break;
  86. //asl
  87. case 0x0a: {
  88. last_cycle();
  89. op_io_irq();
  90. if(regs.p.m) {
  91. regs.p.c = !!(regs.a.l & 0x80);
  92. regs.a.l <<= 1;
  93. regs.p.n = !!(regs.a.l & 0x80);
  94. regs.p.z = (regs.a.l == 0);
  95. } else {
  96. regs.p.c = !!(regs.a.w & 0x8000);
  97. regs.a.w <<= 1;
  98. regs.p.n = !!(regs.a.w & 0x8000);
  99. regs.p.z = (regs.a.w == 0);
  100. }
  101. } break;
  102. //lsr
  103. case 0x4a: {
  104. last_cycle();
  105. op_io_irq();
  106. if(regs.p.m) {
  107. regs.p.c = regs.a.l & 1;
  108. regs.a.l >>= 1;
  109. regs.p.n = !!(regs.a.l & 0x80);
  110. regs.p.z = (regs.a.l == 0);
  111. } else {
  112. regs.p.c = regs.a.w & 1;
  113. regs.a.w >>= 1;
  114. regs.p.n = !!(regs.a.w & 0x8000);
  115. regs.p.z = (regs.a.w == 0);
  116. }
  117. } break;
  118. //rol
  119. case 0x2a: {
  120. last_cycle();
  121. op_io_irq();
  122. uint16 c = regs.p.c;
  123. if(regs.p.m) {
  124. regs.p.c = !!(regs.a.l & 0x80);
  125. regs.a.l <<= 1;
  126. regs.a.l |= c;
  127. regs.p.n = !!(regs.a.l & 0x80);
  128. regs.p.z = (regs.a.l == 0);
  129. } else {
  130. regs.p.c = !!(regs.a.w & 0x8000);
  131. regs.a.w <<= 1;
  132. regs.a.w |= c;
  133. regs.p.n = !!(regs.a.w & 0x8000);
  134. regs.p.z = (regs.a.w == 0);
  135. }
  136. } break;
  137. //ror
  138. case 0x6a: {
  139. last_cycle();
  140. op_io_irq();
  141. uint16 c;
  142. if(regs.p.m) {
  143. c = regs.p.c ? 0x80 : 0;
  144. regs.p.c = regs.a.l & 1;
  145. regs.a.l >>= 1;
  146. regs.a.l |= c;
  147. regs.p.n = !!(regs.a.l & 0x80);
  148. regs.p.z = (regs.a.l == 0);
  149. } else {
  150. c = regs.p.c ? 0x8000 : 0;
  151. regs.p.c = regs.a.w & 1;
  152. regs.a.w >>= 1;
  153. regs.a.w |= c;
  154. regs.p.n = !!(regs.a.w & 0x8000);
  155. regs.p.z = (regs.a.w == 0);
  156. }
  157. } break;
  158. //inc_addr
  159. case 0xee: {
  160. aa.l = op_readpc();
  161. aa.h = op_readpc();
  162. rd.l = op_readdbr(aa.w);
  163. if(!regs.p.m) rd.h = op_readdbr(aa.w + 1);
  164. op_io();
  165. if(regs.p.m) { op_inc_b(); }
  166. else { op_inc_w();
  167. op_writedbr(aa.w + 1, rd.h); }
  168. last_cycle();
  169. op_writedbr(aa.w, rd.l);
  170. } break;
  171. //dec_addr
  172. case 0xce: {
  173. aa.l = op_readpc();
  174. aa.h = op_readpc();
  175. rd.l = op_readdbr(aa.w);
  176. if(!regs.p.m) rd.h = op_readdbr(aa.w + 1);
  177. op_io();
  178. if(regs.p.m) { op_dec_b(); }
  179. else { op_dec_w();
  180. op_writedbr(aa.w + 1, rd.h); }
  181. last_cycle();
  182. op_writedbr(aa.w, rd.l);
  183. } break;
  184. //asl_addr
  185. case 0x0e: {
  186. aa.l = op_readpc();
  187. aa.h = op_readpc();
  188. rd.l = op_readdbr(aa.w);
  189. if(!regs.p.m) rd.h = op_readdbr(aa.w + 1);
  190. op_io();
  191. if(regs.p.m) { op_asl_b(); }
  192. else { op_asl_w();
  193. op_writedbr(aa.w + 1, rd.h); }
  194. last_cycle();
  195. op_writedbr(aa.w, rd.l);
  196. } break;
  197. //lsr_addr
  198. case 0x4e: {
  199. aa.l = op_readpc();
  200. aa.h = op_readpc();
  201. rd.l = op_readdbr(aa.w);
  202. if(!regs.p.m) rd.h = op_readdbr(aa.w + 1);
  203. op_io();
  204. if(regs.p.m) { op_lsr_b(); }
  205. else { op_lsr_w();
  206. op_writedbr(aa.w + 1, rd.h); }
  207. last_cycle();
  208. op_writedbr(aa.w, rd.l);
  209. } break;
  210. //rol_addr
  211. case 0x2e: {
  212. aa.l = op_readpc();
  213. aa.h = op_readpc();
  214. rd.l = op_readdbr(aa.w);
  215. if(!regs.p.m) rd.h = op_readdbr(aa.w + 1);
  216. op_io();
  217. if(regs.p.m) { op_rol_b(); }
  218. else { op_rol_w();
  219. op_writedbr(aa.w + 1, rd.h); }
  220. last_cycle();
  221. op_writedbr(aa.w, rd.l);
  222. } break;
  223. //ror_addr
  224. case 0x6e: {
  225. aa.l = op_readpc();
  226. aa.h = op_readpc();
  227. rd.l = op_readdbr(aa.w);
  228. if(!regs.p.m) rd.h = op_readdbr(aa.w + 1);
  229. op_io();
  230. if(regs.p.m) { op_ror_b(); }
  231. else { op_ror_w();
  232. op_writedbr(aa.w + 1, rd.h); }
  233. last_cycle();
  234. op_writedbr(aa.w, rd.l);
  235. } break;
  236. //trb_addr
  237. case 0x1c: {
  238. aa.l = op_readpc();
  239. aa.h = op_readpc();
  240. rd.l = op_readdbr(aa.w);
  241. if(!regs.p.m) rd.h = op_readdbr(aa.w + 1);
  242. op_io();
  243. if(regs.p.m) { op_trb_b(); }
  244. else { op_trb_w();
  245. op_writedbr(aa.w + 1, rd.h); }
  246. last_cycle();
  247. op_writedbr(aa.w, rd.l);
  248. } break;
  249. //tsb_addr
  250. case 0x0c: {
  251. aa.l = op_readpc();
  252. aa.h = op_readpc();
  253. rd.l = op_readdbr(aa.w);
  254. if(!regs.p.m) rd.h = op_readdbr(aa.w + 1);
  255. op_io();
  256. if(regs.p.m) { op_tsb_b(); }
  257. else { op_tsb_w();
  258. op_writedbr(aa.w + 1, rd.h); }
  259. last_cycle();
  260. op_writedbr(aa.w, rd.l);
  261. } break;
  262. //inc_addrx
  263. case 0xfe: {
  264. aa.l = op_readpc();
  265. aa.h = op_readpc();
  266. op_io();
  267. rd.l = op_readdbr(aa.w + regs.x.w);
  268. if(!regs.p.m) rd.h = op_readdbr(aa.w + regs.x.w + 1);
  269. op_io();
  270. if(regs.p.m) { op_inc_b(); }
  271. else { op_inc_w();
  272. op_writedbr(aa.w + regs.x.w + 1, rd.h); }
  273. last_cycle();
  274. op_writedbr(aa.w + regs.x.w, rd.l);
  275. } break;
  276. //dec_addrx
  277. case 0xde: {
  278. aa.l = op_readpc();
  279. aa.h = op_readpc();
  280. op_io();
  281. rd.l = op_readdbr(aa.w + regs.x.w);
  282. if(!regs.p.m) rd.h = op_readdbr(aa.w + regs.x.w + 1);
  283. op_io();
  284. if(regs.p.m) { op_dec_b(); }
  285. else { op_dec_w();
  286. op_writedbr(aa.w + regs.x.w + 1, rd.h); }
  287. last_cycle();
  288. op_writedbr(aa.w + regs.x.w, rd.l);
  289. } break;
  290. //asl_addrx
  291. case 0x1e: {
  292. aa.l = op_readpc();
  293. aa.h = op_readpc();
  294. op_io();
  295. rd.l = op_readdbr(aa.w + regs.x.w);
  296. if(!regs.p.m) rd.h = op_readdbr(aa.w + regs.x.w + 1);
  297. op_io();
  298. if(regs.p.m) { op_asl_b(); }
  299. else { op_asl_w();
  300. op_writedbr(aa.w + regs.x.w + 1, rd.h); }
  301. last_cycle();
  302. op_writedbr(aa.w + regs.x.w, rd.l);
  303. } break;
  304. //lsr_addrx
  305. case 0x5e: {
  306. aa.l = op_readpc();
  307. aa.h = op_readpc();
  308. op_io();
  309. rd.l = op_readdbr(aa.w + regs.x.w);
  310. if(!regs.p.m) rd.h = op_readdbr(aa.w + regs.x.w + 1);
  311. op_io();
  312. if(regs.p.m) { op_lsr_b(); }
  313. else { op_lsr_w();
  314. op_writedbr(aa.w + regs.x.w + 1, rd.h); }
  315. last_cycle();
  316. op_writedbr(aa.w + regs.x.w, rd.l);
  317. } break;
  318. //rol_addrx
  319. case 0x3e: {
  320. aa.l = op_readpc();
  321. aa.h = op_readpc();
  322. op_io();
  323. rd.l = op_readdbr(aa.w + regs.x.w);
  324. if(!regs.p.m) rd.h = op_readdbr(aa.w + regs.x.w + 1);
  325. op_io();
  326. if(regs.p.m) { op_rol_b(); }
  327. else { op_rol_w();
  328. op_writedbr(aa.w + regs.x.w + 1, rd.h); }
  329. last_cycle();
  330. op_writedbr(aa.w + regs.x.w, rd.l);
  331. } break;
  332. //ror_addrx
  333. case 0x7e: {
  334. aa.l = op_readpc();
  335. aa.h = op_readpc();
  336. op_io();
  337. rd.l = op_readdbr(aa.w + regs.x.w);
  338. if(!regs.p.m) rd.h = op_readdbr(aa.w + regs.x.w + 1);
  339. op_io();
  340. if(regs.p.m) { op_ror_b(); }
  341. else { op_ror_w();
  342. op_writedbr(aa.w + regs.x.w + 1, rd.h); }
  343. last_cycle();
  344. op_writedbr(aa.w + regs.x.w, rd.l);
  345. } break;
  346. //inc_dp
  347. case 0xe6: {
  348. dp = op_readpc();
  349. op_io_cond2();
  350. rd.l = op_readdp(dp);
  351. if(!regs.p.m) rd.h = op_readdp(dp + 1);
  352. op_io();
  353. if(regs.p.m) { op_inc_b(); }
  354. else { op_inc_w();
  355. op_writedp(dp + 1, rd.h); }
  356. last_cycle();
  357. op_writedp(dp, rd.l);
  358. } break;
  359. //dec_dp
  360. case 0xc6: {
  361. dp = op_readpc();
  362. op_io_cond2();
  363. rd.l = op_readdp(dp);
  364. if(!regs.p.m) rd.h = op_readdp(dp + 1);
  365. op_io();
  366. if(regs.p.m) { op_dec_b(); }
  367. else { op_dec_w();
  368. op_writedp(dp + 1, rd.h); }
  369. last_cycle();
  370. op_writedp(dp, rd.l);
  371. } break;
  372. //asl_dp
  373. case 0x06: {
  374. dp = op_readpc();
  375. op_io_cond2();
  376. rd.l = op_readdp(dp);
  377. if(!regs.p.m) rd.h = op_readdp(dp + 1);
  378. op_io();
  379. if(regs.p.m) { op_asl_b(); }
  380. else { op_asl_w();
  381. op_writedp(dp + 1, rd.h); }
  382. last_cycle();
  383. op_writedp(dp, rd.l);
  384. } break;
  385. //lsr_dp
  386. case 0x46: {
  387. dp = op_readpc();
  388. op_io_cond2();
  389. rd.l = op_readdp(dp);
  390. if(!regs.p.m) rd.h = op_readdp(dp + 1);
  391. op_io();
  392. if(regs.p.m) { op_lsr_b(); }
  393. else { op_lsr_w();
  394. op_writedp(dp + 1, rd.h); }
  395. last_cycle();
  396. op_writedp(dp, rd.l);
  397. } break;
  398. //rol_dp
  399. case 0x26: {
  400. dp = op_readpc();
  401. op_io_cond2();
  402. rd.l = op_readdp(dp);
  403. if(!regs.p.m) rd.h = op_readdp(dp + 1);
  404. op_io();
  405. if(regs.p.m) { op_rol_b(); }
  406. else { op_rol_w();
  407. op_writedp(dp + 1, rd.h); }
  408. last_cycle();
  409. op_writedp(dp, rd.l);
  410. } break;
  411. //ror_dp
  412. case 0x66: {
  413. dp = op_readpc();
  414. op_io_cond2();
  415. rd.l = op_readdp(dp);
  416. if(!regs.p.m) rd.h = op_readdp(dp + 1);
  417. op_io();
  418. if(regs.p.m) { op_ror_b(); }
  419. else { op_ror_w();
  420. op_writedp(dp + 1, rd.h); }
  421. last_cycle();
  422. op_writedp(dp, rd.l);
  423. } break;
  424. //trb_dp
  425. case 0x14: {
  426. dp = op_readpc();
  427. op_io_cond2();
  428. rd.l = op_readdp(dp);
  429. if(!regs.p.m) rd.h = op_readdp(dp + 1);
  430. op_io();
  431. if(regs.p.m) { op_trb_b(); }
  432. else { op_trb_w();
  433. op_writedp(dp + 1, rd.h); }
  434. last_cycle();
  435. op_writedp(dp, rd.l);
  436. } break;
  437. //tsb_dp
  438. case 0x04: {
  439. dp = op_readpc();
  440. op_io_cond2();
  441. rd.l = op_readdp(dp);
  442. if(!regs.p.m) rd.h = op_readdp(dp + 1);
  443. op_io();
  444. if(regs.p.m) { op_tsb_b(); }
  445. else { op_tsb_w();
  446. op_writedp(dp + 1, rd.h); }
  447. last_cycle();
  448. op_writedp(dp, rd.l);
  449. } break;
  450. //inc_dpx
  451. case 0xf6: {
  452. dp = op_readpc();
  453. op_io_cond2();
  454. op_io();
  455. rd.l = op_readdp(dp + regs.x.w);
  456. if(!regs.p.m) rd.h = op_readdp(dp + regs.x.w + 1);
  457. op_io();
  458. if(regs.p.m) { op_inc_b(); }
  459. else { op_inc_w();
  460. op_writedp(dp + regs.x.w + 1, rd.h); }
  461. last_cycle();
  462. op_writedp(dp + regs.x.w, rd.l);
  463. } break;
  464. //dec_dpx
  465. case 0xd6: {
  466. dp = op_readpc();
  467. op_io_cond2();
  468. op_io();
  469. rd.l = op_readdp(dp + regs.x.w);
  470. if(!regs.p.m) rd.h = op_readdp(dp + regs.x.w + 1);
  471. op_io();
  472. if(regs.p.m) { op_dec_b(); }
  473. else { op_dec_w();
  474. op_writedp(dp + regs.x.w + 1, rd.h); }
  475. last_cycle();
  476. op_writedp(dp + regs.x.w, rd.l);
  477. } break;
  478. //asl_dpx
  479. case 0x16: {
  480. dp = op_readpc();
  481. op_io_cond2();
  482. op_io();
  483. rd.l = op_readdp(dp + regs.x.w);
  484. if(!regs.p.m) rd.h = op_readdp(dp + regs.x.w + 1);
  485. op_io();
  486. if(regs.p.m) { op_asl_b(); }
  487. else { op_asl_w();
  488. op_writedp(dp + regs.x.w + 1, rd.h); }
  489. last_cycle();
  490. op_writedp(dp + regs.x.w, rd.l);
  491. } break;
  492. //lsr_dpx
  493. case 0x56: {
  494. dp = op_readpc();
  495. op_io_cond2();
  496. op_io();
  497. rd.l = op_readdp(dp + regs.x.w);
  498. if(!regs.p.m) rd.h = op_readdp(dp + regs.x.w + 1);
  499. op_io();
  500. if(regs.p.m) { op_lsr_b(); }
  501. else { op_lsr_w();
  502. op_writedp(dp + regs.x.w + 1, rd.h); }
  503. last_cycle();
  504. op_writedp(dp + regs.x.w, rd.l);
  505. } break;
  506. //rol_dpx
  507. case 0x36: {
  508. dp = op_readpc();
  509. op_io_cond2();
  510. op_io();
  511. rd.l = op_readdp(dp + regs.x.w);
  512. if(!regs.p.m) rd.h = op_readdp(dp + regs.x.w + 1);
  513. op_io();
  514. if(regs.p.m) { op_rol_b(); }
  515. else { op_rol_w();
  516. op_writedp(dp + regs.x.w + 1, rd.h); }
  517. last_cycle();
  518. op_writedp(dp + regs.x.w, rd.l);
  519. } break;
  520. //ror_dpx
  521. case 0x76: {
  522. dp = op_readpc();
  523. op_io_cond2();
  524. op_io();
  525. rd.l = op_readdp(dp + regs.x.w);
  526. if(!regs.p.m) rd.h = op_readdp(dp + regs.x.w + 1);
  527. op_io();
  528. if(regs.p.m) { op_ror_b(); }
  529. else { op_ror_w();
  530. op_writedp(dp + regs.x.w + 1, rd.h); }
  531. last_cycle();
  532. op_writedp(dp + regs.x.w, rd.l);
  533. } break;
  534. #endif