op_rmw.b 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. inc(0x1a, regs.p.m, a),
  2. inx(0xe8, regs.p.x, x),
  3. iny(0xc8, regs.p.x, y) {
  4. 1:last_cycle();
  5. op_io_irq();
  6. if($1) {
  7. regs.$2.l++;
  8. regs.p.n = !!(regs.$2.l & 0x80);
  9. regs.p.z = (regs.$2.l == 0);
  10. } else {
  11. regs.$2.w++;
  12. regs.p.n = !!(regs.$2.w & 0x8000);
  13. regs.p.z = (regs.$2.w == 0);
  14. }
  15. }
  16. dec(0x3a, regs.p.m, a),
  17. dex(0xca, regs.p.x, x),
  18. dey(0x88, regs.p.x, y) {
  19. 1:last_cycle();
  20. op_io_irq();
  21. if($1) {
  22. regs.$2.l--;
  23. regs.p.n = !!(regs.$2.l & 0x80);
  24. regs.p.z = (regs.$2.l == 0);
  25. } else {
  26. regs.$2.w--;
  27. regs.p.n = !!(regs.$2.w & 0x8000);
  28. regs.p.z = (regs.$2.w == 0);
  29. }
  30. }
  31. asl(0x0a) {
  32. 1:last_cycle();
  33. op_io_irq();
  34. if(regs.p.m) {
  35. regs.p.c = !!(regs.a.l & 0x80);
  36. regs.a.l <<= 1;
  37. regs.p.n = !!(regs.a.l & 0x80);
  38. regs.p.z = (regs.a.l == 0);
  39. } else {
  40. regs.p.c = !!(regs.a.w & 0x8000);
  41. regs.a.w <<= 1;
  42. regs.p.n = !!(regs.a.w & 0x8000);
  43. regs.p.z = (regs.a.w == 0);
  44. }
  45. }
  46. lsr(0x4a) {
  47. 1:last_cycle();
  48. op_io_irq();
  49. if(regs.p.m) {
  50. regs.p.c = regs.a.l & 1;
  51. regs.a.l >>= 1;
  52. regs.p.n = !!(regs.a.l & 0x80);
  53. regs.p.z = (regs.a.l == 0);
  54. } else {
  55. regs.p.c = regs.a.w & 1;
  56. regs.a.w >>= 1;
  57. regs.p.n = !!(regs.a.w & 0x8000);
  58. regs.p.z = (regs.a.w == 0);
  59. }
  60. }
  61. rol(0x2a) {
  62. 1:last_cycle();
  63. op_io_irq();
  64. uint16 c = regs.p.c;
  65. if(regs.p.m) {
  66. regs.p.c = !!(regs.a.l & 0x80);
  67. regs.a.l <<= 1;
  68. regs.a.l |= c;
  69. regs.p.n = !!(regs.a.l & 0x80);
  70. regs.p.z = (regs.a.l == 0);
  71. } else {
  72. regs.p.c = !!(regs.a.w & 0x8000);
  73. regs.a.w <<= 1;
  74. regs.a.w |= c;
  75. regs.p.n = !!(regs.a.w & 0x8000);
  76. regs.p.z = (regs.a.w == 0);
  77. }
  78. }
  79. ror(0x6a) {
  80. 1:last_cycle();
  81. op_io_irq();
  82. uint16 c;
  83. if(regs.p.m) {
  84. c = regs.p.c ? 0x80 : 0;
  85. regs.p.c = regs.a.l & 1;
  86. regs.a.l >>= 1;
  87. regs.a.l |= c;
  88. regs.p.n = !!(regs.a.l & 0x80);
  89. regs.p.z = (regs.a.l == 0);
  90. } else {
  91. c = regs.p.c ? 0x8000 : 0;
  92. regs.p.c = regs.a.w & 1;
  93. regs.a.w >>= 1;
  94. regs.a.w |= c;
  95. regs.p.n = !!(regs.a.w & 0x8000);
  96. regs.p.z = (regs.a.w == 0);
  97. }
  98. }
  99. inc_addr(0xee, inc),
  100. dec_addr(0xce, dec),
  101. asl_addr(0x0e, asl),
  102. lsr_addr(0x4e, lsr),
  103. rol_addr(0x2e, rol),
  104. ror_addr(0x6e, ror),
  105. trb_addr(0x1c, trb),
  106. tsb_addr(0x0c, tsb) {
  107. 1:aa.l = op_readpc();
  108. 2:aa.h = op_readpc();
  109. 3:rd.l = op_readdbr(aa.w);
  110. 4:if(!regs.p.m) rd.h = op_readdbr(aa.w + 1);
  111. 5:op_io();
  112. if(regs.p.m) { op_$1_b(); }
  113. else { op_$1_w();
  114. 6:op_writedbr(aa.w + 1, rd.h); }
  115. 7:last_cycle();
  116. op_writedbr(aa.w, rd.l);
  117. }
  118. inc_addrx(0xfe, inc),
  119. dec_addrx(0xde, dec),
  120. asl_addrx(0x1e, asl),
  121. lsr_addrx(0x5e, lsr),
  122. rol_addrx(0x3e, rol),
  123. ror_addrx(0x7e, ror) {
  124. 1:aa.l = op_readpc();
  125. 2:aa.h = op_readpc();
  126. 3:op_io();
  127. 4:rd.l = op_readdbr(aa.w + regs.x.w);
  128. 5:if(!regs.p.m) rd.h = op_readdbr(aa.w + regs.x.w + 1);
  129. 6:op_io();
  130. if(regs.p.m) { op_$1_b(); }
  131. else { op_$1_w();
  132. 7:op_writedbr(aa.w + regs.x.w + 1, rd.h); }
  133. 8:last_cycle();
  134. op_writedbr(aa.w + regs.x.w, rd.l);
  135. }
  136. inc_dp(0xe6, inc),
  137. dec_dp(0xc6, dec),
  138. asl_dp(0x06, asl),
  139. lsr_dp(0x46, lsr),
  140. rol_dp(0x26, rol),
  141. ror_dp(0x66, ror),
  142. trb_dp(0x14, trb),
  143. tsb_dp(0x04, tsb) {
  144. 1:dp = op_readpc();
  145. 2:op_io_cond2();
  146. 3:rd.l = op_readdp(dp);
  147. 4:if(!regs.p.m) rd.h = op_readdp(dp + 1);
  148. 5:op_io();
  149. if(regs.p.m) { op_$1_b(); }
  150. else { op_$1_w();
  151. 6:op_writedp(dp + 1, rd.h); }
  152. 7:last_cycle();
  153. op_writedp(dp, rd.l);
  154. }
  155. inc_dpx(0xf6, inc),
  156. dec_dpx(0xd6, dec),
  157. asl_dpx(0x16, asl),
  158. lsr_dpx(0x56, lsr),
  159. rol_dpx(0x36, rol),
  160. ror_dpx(0x76, ror) {
  161. 1:dp = op_readpc();
  162. 2:op_io_cond2();
  163. 3:op_io();
  164. 4:rd.l = op_readdp(dp + regs.x.w);
  165. 5:if(!regs.p.m) rd.h = op_readdp(dp + regs.x.w + 1);
  166. 6:op_io();
  167. if(regs.p.m) { op_$1_b(); }
  168. else { op_$1_w();
  169. 7:op_writedp(dp + regs.x.w + 1, rd.h); }
  170. 8:last_cycle();
  171. op_writedp(dp + regs.x.w, rd.l);
  172. }