rl78-decode.opc 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298
  1. /* -*- c -*- */
  2. /* Copyright (C) 2012-2022 Free Software Foundation, Inc.
  3. Contributed by Red Hat.
  4. Written by DJ Delorie.
  5. This file is part of the GNU opcodes library.
  6. This library is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 3, or (at your option)
  9. any later version.
  10. It is distributed in the hope that it will be useful, but WITHOUT
  11. ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  12. or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
  13. License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with this program; if not, write to the Free Software
  16. Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
  17. MA 02110-1301, USA. */
  18. #include "sysdep.h"
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include "bfd.h"
  23. #include "opintl.h"
  24. #include "opcode/rl78.h"
  25. static int trace = 0;
  26. typedef struct
  27. {
  28. RL78_Opcode_Decoded * rl78;
  29. int (* getbyte)(void *);
  30. void * ptr;
  31. unsigned char * op;
  32. } LocalData;
  33. #define ID(x) rl78->id = RLO_##x, rl78->lineno = __LINE__
  34. #define OP(n,t,r,a) (rl78->op[n].type = t, \
  35. rl78->op[n].reg = r, \
  36. rl78->op[n].addend = a )
  37. #define OPX(n,t,r1,r2,a) \
  38. (rl78->op[n].type = t, \
  39. rl78->op[n].reg = r1, \
  40. rl78->op[n].reg2 = r2, \
  41. rl78->op[n].addend = a )
  42. #define W() rl78->size = RL78_Word
  43. #define AU ATTRIBUTE_UNUSED
  44. #define OP_BUF_LEN 20
  45. #define GETBYTE() (ld->rl78->n_bytes < (OP_BUF_LEN - 1) ? ld->op [ld->rl78->n_bytes++] = ld->getbyte (ld->ptr): 0)
  46. #define B ((unsigned long) GETBYTE())
  47. #define SYNTAX(x) rl78->syntax = x
  48. #define UNSUPPORTED() \
  49. rl78->syntax = "*unknown*"
  50. #define RB(x) ((x)+RL78_Reg_X)
  51. #define RW(x) ((x)+RL78_Reg_AX)
  52. #define Fz rl78->flags = RL78_PSW_Z
  53. #define Fza rl78->flags = RL78_PSW_Z | RL78_PSW_AC
  54. #define Fzc rl78->flags = RL78_PSW_Z | RL78_PSW_CY
  55. #define Fzac rl78->flags = RL78_PSW_Z | RL78_PSW_AC | RL78_PSW_CY
  56. #define Fa rl78->flags = RL78_PSW_AC
  57. #define Fc rl78->flags = RL78_PSW_CY
  58. #define Fac rl78->flags = RL78_PSW_AC | RL78_PSW_CY
  59. #define IMMU(bytes) immediate (bytes, 0, ld)
  60. #define IMMS(bytes) immediate (bytes, 1, ld)
  61. static int
  62. immediate (int bytes, int sign_extend, LocalData * ld)
  63. {
  64. unsigned long i = 0;
  65. switch (bytes)
  66. {
  67. case 1:
  68. i |= B;
  69. if (sign_extend && (i & 0x80))
  70. i -= 0x100;
  71. break;
  72. case 2:
  73. i |= B;
  74. i |= B << 8;
  75. if (sign_extend && (i & 0x8000))
  76. i -= 0x10000;
  77. break;
  78. case 3:
  79. i |= B;
  80. i |= B << 8;
  81. i |= B << 16;
  82. if (sign_extend && (i & 0x800000))
  83. i -= 0x1000000;
  84. break;
  85. default:
  86. opcodes_error_handler
  87. /* xgettext:c-format */
  88. (_("internal error: immediate() called with invalid byte count %d"),
  89. bytes);
  90. abort();
  91. }
  92. return i;
  93. }
  94. #define DC(c) OP (0, RL78_Operand_Immediate, 0, c)
  95. #define DR(r) OP (0, RL78_Operand_Register, RL78_Reg_##r, 0)
  96. #define DRB(r) OP (0, RL78_Operand_Register, RB(r), 0)
  97. #define DRW(r) OP (0, RL78_Operand_Register, RW(r), 0)
  98. #define DM(r,a) OP (0, RL78_Operand_Indirect, RL78_Reg_##r, a)
  99. #define DM2(r1,r2,a) OPX (0, RL78_Operand_Indirect, RL78_Reg_##r1, RL78_Reg_##r2, a)
  100. #define DE() rl78->op[0].use_es = 1
  101. #define DB(b) set_bit (rl78->op, b)
  102. #define DCY() DR(PSW); DB(0)
  103. #define DPUSH() OP (0, RL78_Operand_PreDec, RL78_Reg_SP, 0);
  104. #define SC(c) OP (1, RL78_Operand_Immediate, 0, c)
  105. #define SR(r) OP (1, RL78_Operand_Register, RL78_Reg_##r, 0)
  106. #define SRB(r) OP (1, RL78_Operand_Register, RB(r), 0)
  107. #define SRW(r) OP (1, RL78_Operand_Register, RW(r), 0)
  108. #define SM(r,a) OP (1, RL78_Operand_Indirect, RL78_Reg_##r, a)
  109. #define SM2(r1,r2,a) OPX (1, RL78_Operand_Indirect, RL78_Reg_##r1, RL78_Reg_##r2, a)
  110. #define SE() rl78->op[1].use_es = 1
  111. #define SB(b) set_bit (rl78->op+1, b)
  112. #define SCY() SR(PSW); SB(0)
  113. #define COND(c) rl78->op[1].condition = RL78_Condition_##c
  114. #define SPOP() OP (1, RL78_Operand_PostInc, RL78_Reg_SP, 0);
  115. static void
  116. set_bit (RL78_Opcode_Operand *op, int bit)
  117. {
  118. op->bit_number = bit;
  119. switch (op->type) {
  120. case RL78_Operand_Register:
  121. op->type = RL78_Operand_Bit;
  122. break;
  123. case RL78_Operand_Indirect:
  124. op->type = RL78_Operand_BitIndirect;
  125. break;
  126. default:
  127. break;
  128. }
  129. }
  130. static int
  131. saddr (int x)
  132. {
  133. if (x < 0x20)
  134. return 0xfff00 + x;
  135. return 0xffe00 + x;
  136. }
  137. static int
  138. sfr (int x)
  139. {
  140. return 0xfff00 + x;
  141. }
  142. #define SADDR saddr (IMMU (1))
  143. #define SFR sfr (IMMU (1))
  144. int
  145. rl78_decode_opcode (unsigned long pc AU,
  146. RL78_Opcode_Decoded * rl78,
  147. int (* getbyte)(void *),
  148. void * ptr,
  149. RL78_Dis_Isa isa)
  150. {
  151. LocalData lds, * ld = &lds;
  152. unsigned char op_buf[OP_BUF_LEN] = {0};
  153. unsigned char *op = op_buf;
  154. int op0, op1;
  155. lds.rl78 = rl78;
  156. lds.getbyte = getbyte;
  157. lds.ptr = ptr;
  158. lds.op = op;
  159. memset (rl78, 0, sizeof (*rl78));
  160. start_again:
  161. /* Byte registers, not including A. */
  162. /** VARY rba 000 010 011 100 101 110 111 */
  163. /* Word registers, not including AX. */
  164. /** VARY ra 01 10 11 */
  165. /*----------------------------------------------------------------------*/
  166. /* ES: prefix */
  167. /** 0001 0001 es: */
  168. DE(); SE();
  169. op ++;
  170. pc ++;
  171. goto start_again;
  172. /*----------------------------------------------------------------------*/
  173. /** 0000 1111 add %0, %e!1 */
  174. ID(add); DR(A); SM(None, IMMU(2)); Fzac;
  175. /** 0000 1101 add %0, %e1 */
  176. ID(add); DR(A); SM(HL, 0); Fzac;
  177. /** 0110 0001 1000 000 add %0, %e1 */
  178. ID(add); DR(A); SM2(HL, B, 0); Fzac;
  179. /** 0000 1110 add %0, %ea1 */
  180. ID(add); DR(A); SM(HL, IMMU(1)); Fzac;
  181. /** 0110 0001 1000 0010 add %0, %e1 */
  182. ID(add); DR(A); SM2(HL, C, 0); Fzac;
  183. /** 0000 1100 add %0, #%1 */
  184. ID(add); DR(A); SC(IMMU(1)); Fzac;
  185. /** 0110 0001 0000 1rba add %0, %1 */
  186. ID(add); DR(A); SRB(rba); Fzac;
  187. /** 0000 1011 add %0, %1 */
  188. ID(add); DR(A); SM(None, SADDR); Fzac;
  189. /** 0110 0001 0000 0reg add %0, %1 */
  190. ID(add); DRB(reg); SR(A); Fzac;
  191. /** 0000 1010 add %0, #%1 */
  192. ID(add); DM(None, SADDR); SC(IMMU(1)); Fzac;
  193. /*----------------------------------------------------------------------*/
  194. /** 0001 1111 addc %0, %e!1 */
  195. ID(addc); DR(A); SM(None, IMMU(2)); Fzac;
  196. /** 0001 1101 addc %0, %e1 */
  197. ID(addc); DR(A); SM(HL, 0); Fzac;
  198. /** 0110 0001 1001 0000 addc %0, %e1 */
  199. ID(addc); DR(A); SM2(HL, B, 0); Fzac;
  200. /** 0110 0001 1001 0010 addc %0, %e1 */
  201. ID(addc); DR(A); SM2(HL, C, 0); Fzac;
  202. /** 0001 1110 addc %0, %ea1 */
  203. ID(addc); DR(A); SM(HL, IMMU(1)); Fzac;
  204. /** 0001 1100 addc %0, #%1 */
  205. ID(addc); DR(A); SC(IMMU(1)); Fzac;
  206. /** 0110 0001 0001 1rba addc %0, %1 */
  207. ID(addc); DR(A); SRB(rba); Fzac;
  208. /** 0110 0001 0001 0reg addc %0, %1 */
  209. ID(addc); DRB(reg); SR(A); Fzac;
  210. /** 0001 1011 addc %0, %1 */
  211. ID(addc); DR(A); SM(None, SADDR); Fzac;
  212. /** 0001 1010 addc %0, #%1 */
  213. ID(addc); DM(None, SADDR); SC(IMMU(1)); Fzac;
  214. /*----------------------------------------------------------------------*/
  215. /** 0000 0010 addw %0, %e!1 */
  216. ID(add); W(); DR(AX); SM(None, IMMU(2)); Fzac;
  217. /** 0110 0001 0000 1001 addw %0, %ea1 */
  218. ID(add); W(); DR(AX); SM(HL, IMMU(1)); Fzac;
  219. /** 0000 0100 addw %0, #%1 */
  220. ID(add); W(); DR(AX); SC(IMMU(2)); Fzac;
  221. /** 0000 0rw1 addw %0, %1 */
  222. ID(add); W(); DR(AX); SRW(rw); Fzac;
  223. /** 0000 0110 addw %0, %1 */
  224. ID(add); W(); DR(AX); SM(None, SADDR); Fzac;
  225. /** 0001 0000 addw %0, #%1 */
  226. ID(add); W(); DR(SP); SC(IMMU(1)); Fzac;
  227. /*----------------------------------------------------------------------*/
  228. /** 0101 1111 and %0, %e!1 */
  229. ID(and); DR(A); SM(None, IMMU(2)); Fz;
  230. /** 0101 1101 and %0, %e1 */
  231. ID(and); DR(A); SM(HL, 0); Fz;
  232. /** 0110 0001 1101 0000 and %0, %e1 */
  233. ID(and); DR(A); SM2(HL, B, 0); Fz;
  234. /** 0101 1110 and %0, %ea1 */
  235. ID(and); DR(A); SM(HL, IMMU(1)); Fz;
  236. /** 0110 0001 1101 0010 and %0, %e1 */
  237. ID(and); DR(A); SM2(HL, C, 0); Fz;
  238. /** 0101 1100 and %0, #%1 */
  239. ID(and); DR(A); SC(IMMU(1)); Fz;
  240. /** 0110 0001 0101 1rba and %0, %1 */
  241. ID(and); DR(A); SRB(rba); Fz;
  242. /** 0110 0001 0101 0reg and %0, %1 */
  243. ID(and); DRB(reg); SR(A); Fz;
  244. /** 0101 1011 and %0, %1 */
  245. ID(and); DR(A); SM(None, SADDR); Fz;
  246. /** 0101 1010 and %0, #%1 */
  247. ID(and); DM(None, SADDR); SC(IMMU(1)); Fz;
  248. /*----------------------------------------------------------------------*/
  249. /** 0111 0001 1bit 0101 and1 cy, %e1 */
  250. ID(and); DCY(); SM(HL, 0); SB(bit);
  251. /** 0111 0001 1bit 1101 and1 cy, %1 */
  252. ID(and); DCY(); SR(A); SB(bit);
  253. /** 0111 0001 0bit 1101 and1 cy, %s1 */
  254. ID(and); DCY(); SM(None, SFR); SB(bit);
  255. /** 0111 0001 0bit 0101 and1 cy, %s1 */
  256. ID(and); DCY(); SM(None, SADDR); SB(bit);
  257. /*----------------------------------------------------------------------*/
  258. /* Note that the branch insns need to be listed before the shift
  259. ones, as "shift count of zero" means "branch insn" */
  260. /** 1101 1100 bc $%a0 */
  261. ID(branch_cond); DC(pc+IMMS(1)+2); SR(None); COND(C);
  262. /** 1101 1110 bnc $%a0 */
  263. ID(branch_cond); DC(pc+IMMS(1)+2); SR(None); COND(NC);
  264. /** 0110 0001 1100 0011 bh $%a0 */
  265. ID(branch_cond); DC(pc+IMMS(1)+3); SR(None); COND(H);
  266. /** 0110 0001 1101 0011 bnh $%a0 */
  267. ID(branch_cond); DC(pc+IMMS(1)+3); SR(None); COND(NH);
  268. /** 1101 1101 bz $%a0 */
  269. ID(branch_cond); DC(pc+IMMS(1)+2); SR(None); COND(Z);
  270. /** 1101 1111 bnz $%a0 */
  271. ID(branch_cond); DC(pc+IMMS(1)+2); SR(None); COND(NZ);
  272. /*----------------------------------------------------------------------*/
  273. /** 0011 0001 1bit 0101 bf %e1, $%a0 */
  274. ID(branch_cond); DC(pc+IMMS(1)+3); SM(HL,0); SB(bit); COND(F);
  275. /** 0011 0001 0bit 0101 bf %1, $%a0 */
  276. ID(branch_cond); DC(pc+IMMS(1)+3); SR(A); SB(bit); COND(F);
  277. /** 0011 0001 1bit 0100 bf %s1, $%a0 */
  278. ID(branch_cond); SM(None, SFR); SB(bit); DC(pc+IMMS(1)+4); COND(F);
  279. /** 0011 0001 0bit 0100 bf %s1, $%a0 */
  280. ID(branch_cond); SM(None, SADDR); SB(bit); DC(pc+IMMS(1)+4); COND(F);
  281. /*----------------------------------------------------------------------*/
  282. /** 1110 1100 br !%!a0 */
  283. ID(branch); DC(IMMU(3));
  284. /** 1110 1101 br %!a0 */
  285. ID(branch); DC(IMMU(2));
  286. /** 1110 1110 br $%!a0 */
  287. ID(branch); DC(pc+IMMS(2)+3);
  288. /** 1110 1111 br $%a0 */
  289. ID(branch); DC(pc+IMMS(1)+2);
  290. /** 0110 0001 1100 1011 br ax */
  291. ID(branch); DR(AX);
  292. /*----------------------------------------------------------------------*/
  293. /** 1111 1111 brk1 */
  294. ID(break);
  295. /** 0110 0001 1100 1100 brk */
  296. ID(break);
  297. /*----------------------------------------------------------------------*/
  298. /** 0011 0001 1bit 0011 bt %e1, $%a0 */
  299. ID(branch_cond); DC(pc+IMMS(1)+3); SM(HL,0); SB(bit); COND(T);
  300. /** 0011 0001 0bit 0011 bt %1, $%a0 */
  301. ID(branch_cond); DC(pc+IMMS(1)+3); SR(A); SB(bit); COND(T);
  302. /** 0011 0001 1bit 0010 bt %s1, $%a0 */
  303. ID(branch_cond); SM(None, SFR); SB(bit); DC(pc+IMMS(1)+4); COND(T);
  304. /** 0011 0001 0bit 0010 bt %s1, $%a0 */
  305. ID(branch_cond); SM(None, SADDR); SB(bit); DC(pc+IMMS(1)+4); COND(T);
  306. /*----------------------------------------------------------------------*/
  307. /** 0011 0001 1bit 0001 btclr %e1, $%a0 */
  308. ID(branch_cond_clear); DC(pc+IMMS(1)+3); SM(HL,0); SB(bit); COND(T);
  309. /** 0011 0001 0bit 0001 btclr %1, $%a0 */
  310. ID(branch_cond_clear); DC(pc+IMMS(1)+3); SR(A); SB(bit); COND(T);
  311. /** 0011 0001 1bit 0000 btclr %s1, $%a0 */
  312. ID(branch_cond_clear); SM(None, SFR); SB(bit); DC(pc+IMMS(1)+4); COND(T);
  313. /** 0011 0001 0bit 0000 btclr %s1, $%a0 */
  314. ID(branch_cond_clear); SM(None, SADDR); SB(bit); DC(pc+IMMS(1)+4); COND(T);
  315. /*----------------------------------------------------------------------*/
  316. /** 1111 1100 call !%!a0 */
  317. ID(call); DC(IMMU(3));
  318. /** 1111 1101 call %!a0 */
  319. ID(call); DC(IMMU(2));
  320. /** 1111 1110 call $%!a0 */
  321. ID(call); DC(pc+IMMS(2)+3);
  322. /** 0110 0001 11rg 1010 call %0 */
  323. ID(call); DRW(rg);
  324. /** 0110 0001 1nnn 01mm callt [%x0] */
  325. ID(call); DM(None, 0x80 + mm*16 + nnn*2);
  326. /*----------------------------------------------------------------------*/
  327. /** 0111 0001 0bit 1000 clr1 %e!0 */
  328. ID(mov); DM(None, IMMU(2)); DB(bit); SC(0);
  329. /** 0111 0001 1bit 0011 clr1 %e0 */
  330. ID(mov); DM(HL, 0); DB(bit); SC(0);
  331. /** 0111 0001 1bit 1011 clr1 %0 */
  332. ID(mov); DR(A); DB(bit); SC(0);
  333. /** 0111 0001 1000 1000 clr1 cy */
  334. ID(mov); DCY(); SC(0);
  335. /** 0111 0001 0bit 1011 clr1 %s0 */
  336. op0 = SFR;
  337. ID(mov); DM(None, op0); DB(bit); SC(0);
  338. if (op0 == RL78_SFR_PSW && bit == 7)
  339. rl78->syntax = "di";
  340. /** 0111 0001 0bit 0011 clr1 %0 */
  341. ID(mov); DM(None, SADDR); DB(bit); SC(0);
  342. /*----------------------------------------------------------------------*/
  343. /** 1111 0101 clrb %e!0 */
  344. ID(mov); DM(None, IMMU(2)); SC(0);
  345. /** 1111 00rg clrb %0 */
  346. ID(mov); DRB(rg); SC(0);
  347. /** 1111 0100 clrb %0 */
  348. ID(mov); DM(None, SADDR); SC(0);
  349. /*----------------------------------------------------------------------*/
  350. /** 1111 0110 clrw %0 */
  351. ID(mov); DR(AX); SC(0);
  352. /** 1111 0111 clrw %0 */
  353. ID(mov); DR(BC); SC(0);
  354. /*----------------------------------------------------------------------*/
  355. /** 0100 0000 cmp %e!0, #%1 */
  356. ID(cmp); DM(None, IMMU(2)); SC(IMMU(1)); Fzac;
  357. /** 0100 1010 cmp %0, #%1 */
  358. ID(cmp); DM(None, SADDR); SC(IMMU(1)); Fzac;
  359. /** 0100 1111 cmp %0, %e!1 */
  360. ID(cmp); DR(A); SM(None, IMMU(2)); Fzac;
  361. /** 0100 1101 cmp %0, %e1 */
  362. ID(cmp); DR(A); SM(HL, 0); Fzac;
  363. /** 0110 0001 1100 0000 cmp %0, %e1 */
  364. ID(cmp); DR(A); SM2(HL, B, 0); Fzac;
  365. /** 0110 0001 1100 0010 cmp %0, %e1 */
  366. ID(cmp); DR(A); SM2(HL, C, 0); Fzac;
  367. /** 0100 1110 cmp %0, %ea1 */
  368. ID(cmp); DR(A); SM(HL, IMMU(1)); Fzac;
  369. /** 0100 1100 cmp %0, #%1 */
  370. ID(cmp); DR(A); SC(IMMU(1)); Fzac;
  371. /** 0110 0001 0100 1rba cmp %0, %1 */
  372. ID(cmp); DR(A); SRB(rba); Fzac;
  373. /** 0110 0001 0100 0reg cmp %0, %1 */
  374. ID(cmp); DRB(reg); SR(A); Fzac;
  375. /** 0100 1011 cmp %0, %1 */
  376. ID(cmp); DR(A); SM(None, SADDR); Fzac;
  377. /*----------------------------------------------------------------------*/
  378. /** 1101 0101 cmp0 %e!0 */
  379. ID(cmp); DM(None, IMMU(2)); SC(0); Fzac;
  380. /** 1101 00rg cmp0 %0 */
  381. ID(cmp); DRB(rg); SC(0); Fzac;
  382. /** 1101 0100 cmp0 %0 */
  383. ID(cmp); DM(None, SADDR); SC(0); Fzac;
  384. /*----------------------------------------------------------------------*/
  385. /** 0110 0001 1101 1110 cmps %0, %ea1 */
  386. ID(cmp); DR(X); SM(HL, IMMU(1)); Fzac;
  387. /*----------------------------------------------------------------------*/
  388. /** 0100 0010 cmpw %0, %e!1 */
  389. ID(cmp); W(); DR(AX); SM(None, IMMU(2)); Fzac;
  390. /** 0110 0001 0100 1001 cmpw %0, %ea1 */
  391. ID(cmp); W(); DR(AX); SM(HL, IMMU(1)); Fzac;
  392. /** 0100 0100 cmpw %0, #%1 */
  393. ID(cmp); W(); DR(AX); SC(IMMU(2)); Fzac;
  394. /** 0100 0ra1 cmpw %0, %1 */
  395. ID(cmp); W(); DR(AX); SRW(ra); Fzac;
  396. /** 0100 0110 cmpw %0, %1 */
  397. ID(cmp); W(); DR(AX); SM(None, SADDR); Fzac;
  398. /*----------------------------------------------------------------------*/
  399. /** 1011 0000 dec %e!0 */
  400. ID(sub); DM(None, IMMU(2)); SC(1); Fza;
  401. /** 0110 0001 0110 1001 dec %ea0 */
  402. ID(sub); DM(HL, IMMU(1)); SC(1); Fza;
  403. /** 1001 0reg dec %0 */
  404. ID(sub); DRB(reg); SC(1); Fza;
  405. /** 1011 0100 dec %0 */
  406. ID(sub); DM(None, SADDR); SC(1); Fza;
  407. /*----------------------------------------------------------------------*/
  408. /** 1011 0010 decw %e!0 */
  409. ID(sub); W(); DM(None, IMMU(2)); SC(1);
  410. /** 0110 0001 1000 1001 decw %ea0 */
  411. ID(sub); W(); DM(HL, IMMU(1)); SC(1);
  412. /** 1011 0rg1 decw %0 */
  413. ID(sub); W(); DRW(rg); SC(1);
  414. /** 1011 0110 decw %0 */
  415. ID(sub); W(); DM(None, SADDR); SC(1);
  416. /*----------------------------------------------------------------------*/
  417. /** 0110 0001 1110 1101 halt */
  418. ID(halt);
  419. /*----------------------------------------------------------------------*/
  420. /** 1010 0000 inc %e!0 */
  421. ID(add); DM(None, IMMU(2)); SC(1); Fza;
  422. /** 0110 0001 0101 1001 inc %ea0 */
  423. ID(add); DM(HL, IMMU(1)); SC(1); Fza;
  424. /** 1000 0reg inc %0 */
  425. ID(add); DRB(reg); SC(1); Fza;
  426. /** 1010 0100 inc %0 */
  427. ID(add); DM(None, SADDR); SC(1); Fza;
  428. /*----------------------------------------------------------------------*/
  429. /** 1010 0010 incw %e!0 */
  430. ID(add); W(); DM(None, IMMU(2)); SC(1);
  431. /** 0110 0001 0111 1001 incw %ea0 */
  432. ID(add); W(); DM(HL, IMMU(1)); SC(1);
  433. /** 1010 0rg1 incw %0 */
  434. ID(add); W(); DRW(rg); SC(1);
  435. /** 1010 0110 incw %0 */
  436. ID(add); W(); DM(None, SADDR); SC(1);
  437. /*----------------------------------------------------------------------*/
  438. /** 1100 1111 mov %e!0, #%1 */
  439. ID(mov); DM(None, IMMU(2)); SC(IMMU(1));
  440. /** 1001 1111 mov %e!0, %1 */
  441. ID(mov); DM(None, IMMU(2)); SR(A);
  442. /** 1001 1001 mov %e0, %1 */
  443. ID(mov); DM(DE, 0); SR(A);
  444. /** 1100 1010 mov %ea0, #%1 */
  445. ID(mov); DM(DE, IMMU(1)); SC(IMMU(1));
  446. /** 1001 1010 mov %ea0, %1 */
  447. ID(mov); DM(DE, IMMU(1)); SR(A);
  448. /** 1001 1011 mov %e0, %1 */
  449. ID(mov); DM(HL, 0); SR(A);
  450. /** 0110 0001 1101 1001 mov %e0, %1 */
  451. ID(mov); DM2(HL, B, 0); SR(A);
  452. /** 1100 1100 mov %ea0, #%1 */
  453. ID(mov); DM(HL, IMMU(1)); SC(IMMU(1));
  454. /** 1001 1100 mov %ea0, %1 */
  455. ID(mov); DM(HL, IMMU(1)); SR(A);
  456. /** 0110 0001 1111 1001 mov %e0, %1 */
  457. ID(mov); DM2(HL, C, 0); SR(A);
  458. /** 1100 1000 mov %a0, #%1 */
  459. ID(mov); DM(SP, IMMU(1)); SC(IMMU(1));
  460. /** 1001 1000 mov %a0, %1 */
  461. ID(mov); DM(SP, IMMU(1)); SR(A);
  462. /** 1000 1111 mov %0, %e!1 */
  463. ID(mov); DR(A); SM(None, IMMU(2));
  464. /** 1000 1001 mov %0, %e1 */
  465. ID(mov); DR(A); SM(DE, 0);
  466. /** 1000 1010 mov %0, %ea1 */
  467. ID(mov); DR(A); SM(DE, IMMU(1));
  468. /** 1000 1011 mov %0, %e1 */
  469. ID(mov); DR(A); SM(HL, 0);
  470. /** 1000 1100 mov %0, %ea1 */
  471. ID(mov); DR(A); SM(HL, IMMU(1));
  472. /** 0110 0001 1100 1001 mov %0, %e1 */
  473. ID(mov); DR(A); SM2(HL, B, 0);
  474. /** 0110 0001 1110 1001 mov %0, %e1 */
  475. ID(mov); DR(A); SM2(HL, C, 0);
  476. /** 1000 1000 mov %0, %ea1 */
  477. ID(mov); DR(A); SM(SP, IMMU(1));
  478. /** 0101 0reg mov %0, #%1 */
  479. ID(mov); DRB(reg); SC(IMMU(1));
  480. /** 0110 0rba mov %0, %1 */
  481. ID(mov); DR(A); SRB(rba);
  482. /** 1000 1110 1111 1101 mov %0, %1 */
  483. ID(mov); DR(A); SR(ES);
  484. /** 0000 1001 mov %0, %e1 */
  485. ID(mov); DR(A); SM(B, IMMU(2));
  486. /** 0100 1001 mov %0, %e1 */
  487. ID(mov); DR(A); SM(BC, IMMU(2));
  488. /** 0010 1001 mov %0, %e1 */
  489. ID(mov); DR(A); SM(C, IMMU(2));
  490. /** 1000 1110 mov %0, %s1 */
  491. ID(mov); DR(A); SM(None, SFR);
  492. /** 1000 1101 mov %0, %1 */
  493. ID(mov); DR(A); SM(None, SADDR);
  494. /** 1110 1001 mov %0, %e!1 */
  495. ID(mov); DR(B); SM(None, IMMU(2));
  496. /** 0111 0rba mov %0, %1 */
  497. ID(mov); DRB(rba); SR(A);
  498. /** 1110 1000 mov %0, %1 */
  499. ID(mov); DR(B); SM(None, SADDR);
  500. /** 1111 1001 mov %0, %e!1 */
  501. ID(mov); DR(C); SM(None, IMMU(2));
  502. /** 1111 1000 mov %0, %1 */
  503. ID(mov); DR(C); SM(None, SADDR);
  504. /** 1101 1001 mov %0, %e!1 */
  505. ID(mov); DR(X); SM(None, IMMU(2));
  506. /** 1101 1000 mov %0, %1 */
  507. ID(mov); DR(X); SM(None, SADDR);
  508. /** 1001 1110 1111 1100 mov %0, %1 */
  509. ID(mov); DR(CS); SR(A);
  510. /** 0100 0001 mov %0, #%1 */
  511. ID(mov); DR(ES); SC(IMMU(1));
  512. /** 1001 1110 1111 1101 mov %0, %1 */
  513. ID(mov); DR(ES); SR(A);
  514. /** 0110 0001 1011 1000 mov %0, %1 */
  515. ID(mov); DR(ES); SM(None, SADDR);
  516. /** 0001 1001 mov %e0, #%1 */
  517. ID(mov); DM(B, IMMU(2)); SC(IMMU(1));
  518. /** 0001 1000 mov %e0, %1 */
  519. ID(mov); DM(B, IMMU(2)); SR(A);
  520. /** 0011 1001 mov %e0, #%1 */
  521. ID(mov); DM(BC, IMMU(2)); SC(IMMU(1));
  522. /** 0100 1000 mov %e0, %1 */
  523. ID(mov); DM(BC, IMMU(2)); SR(A);
  524. /** 0011 1000 mov %e0, #%1 */
  525. ID(mov); DM(C, IMMU(2)); SC(IMMU(1));
  526. /** 0010 1000 mov %e0, %1 */
  527. ID(mov); DM(C, IMMU(2)); SR(A);
  528. /** 1100 1101 mov %0, #%1 */
  529. ID(mov); DM(None, SADDR); SC(IMMU(1));
  530. /** 1001 1101 mov %0, %1 */
  531. ID(mov); DM(None, SADDR); SR(A);
  532. /** 1100 1110 mov %s0, #%1 */
  533. op0 = SFR;
  534. op1 = IMMU(1);
  535. ID(mov); DM(None, op0); SC(op1);
  536. if (op0 == 0xffffb && isa == RL78_ISA_G14)
  537. switch (op1)
  538. {
  539. case 0x01:
  540. rl78->syntax = "mulhu"; ID(mulhu);
  541. break;
  542. case 0x02:
  543. rl78->syntax = "mulh"; ID(mulh);
  544. break;
  545. case 0x03:
  546. rl78->syntax = "divhu"; ID(divhu);
  547. break;
  548. case 0x04:
  549. rl78->syntax = "divwu <old-encoding>"; ID(divwu);
  550. break;
  551. case 0x05:
  552. rl78->syntax = "machu"; ID(machu);
  553. break;
  554. case 0x06:
  555. rl78->syntax = "mach"; ID(mach);
  556. break;
  557. case 0x0b:
  558. rl78->syntax = "divwu"; ID(divwu);
  559. break;
  560. }
  561. /** 1001 1110 mov %s0, %1 */
  562. ID(mov); DM(None, SFR); SR(A);
  563. /*----------------------------------------------------------------------*/
  564. /** 0111 0001 1bit 0001 mov1 %e0, cy */
  565. ID(mov); DM(HL, 0); DB(bit); SCY();
  566. /** 0111 0001 1bit 1001 mov1 %e0, cy */
  567. ID(mov); DR(A); DB(bit); SCY();
  568. /** 0111 0001 1bit 0100 mov1 cy, %e1 */
  569. ID(mov); DCY(); SM(HL, 0); SB(bit);
  570. /** 0111 0001 1bit 1100 mov1 cy, %e1 */
  571. ID(mov); DCY(); SR(A); SB(bit);
  572. /** 0111 0001 0bit 0100 mov1 cy, %1 */
  573. ID(mov); DCY(); SM(None, SADDR); SB(bit);
  574. /** 0111 0001 0bit 1100 mov1 cy, %s1 */
  575. ID(mov); DCY(); SM(None, SFR); SB(bit);
  576. /** 0111 0001 0bit 0001 mov1 %0, cy */
  577. ID(mov); DM(None, SADDR); DB(bit); SCY();
  578. /** 0111 0001 0bit 1001 mov1 %s0, cy */
  579. ID(mov); DM(None, SFR); DB(bit); SCY();
  580. /*----------------------------------------------------------------------*/
  581. /** 0110 0001 1100 1110 movs %ea0, %1 */
  582. ID(mov); DM(HL, IMMU(1)); SR(X); Fzc;
  583. /*----------------------------------------------------------------------*/
  584. /** 1011 1111 movw %e!0, %1 */
  585. ID(mov); W(); DM(None, IMMU(2)); SR(AX);
  586. /** 1011 1001 movw %e0, %1 */
  587. ID(mov); W(); DM(DE, 0); SR(AX);
  588. /** 1011 1010 movw %ea0, %1 */
  589. ID(mov); W(); DM(DE, IMMU(1)); SR(AX);
  590. /** 1011 1011 movw %e0, %1 */
  591. ID(mov); W(); DM(HL, 0); SR(AX);
  592. /** 1011 1100 movw %ea0, %1 */
  593. ID(mov); W(); DM(HL, IMMU(1)); SR(AX);
  594. /** 1011 1000 movw %a0, %1 */
  595. ID(mov); W(); DM(SP, IMMU(1)); SR(AX);
  596. /** 1010 1111 movw %0, %e!1 */
  597. ID(mov); W(); DR(AX); SM(None, IMMU(2));
  598. /** 1010 1001 movw %0, %e1 */
  599. ID(mov); W(); DR(AX); SM(DE, 0);
  600. /** 1010 1010 movw %0, %ea1 */
  601. ID(mov); W(); DR(AX); SM(DE, IMMU(1));
  602. /** 1010 1011 movw %0, %e1 */
  603. ID(mov); W(); DR(AX); SM(HL, 0);
  604. /** 1010 1100 movw %0, %ea1 */
  605. ID(mov); W(); DR(AX); SM(HL, IMMU(1));
  606. /** 1010 1000 movw %0, %a1 */
  607. ID(mov); W(); DR(AX); SM(SP, IMMU(1));
  608. /** 0011 0rg0 movw %0, #%1 */
  609. ID(mov); W(); DRW(rg); SC(IMMU(2));
  610. /** 0001 0ra1 movw %0, %1 */
  611. ID(mov); W(); DR(AX); SRW(ra);
  612. /** 0001 0ra0 movw %0, %1 */
  613. ID(mov); W(); DRW(ra); SR(AX);
  614. /** 0101 1001 movw %0, %e1 */
  615. ID(mov); W(); DR(AX); SM(B, IMMU(2));
  616. /** 0110 1001 movw %0, %e1 */
  617. ID(mov); W(); DR(AX); SM(C, IMMU(2));
  618. /** 0111 1001 movw %0, %e1 */
  619. ID(mov); W(); DR(AX); SM(BC, IMMU(2));
  620. /** 0101 1000 movw %e0, %1 */
  621. ID(mov); W(); DM(B, IMMU(2)); SR(AX);
  622. /** 0110 1000 movw %e0, %1 */
  623. ID(mov); W(); DM(C, IMMU(2)); SR(AX);
  624. /** 0111 1000 movw %e0, %1 */
  625. ID(mov); W(); DM(BC, IMMU(2)); SR(AX);
  626. /** 1010 1101 movw %0, %1 */
  627. ID(mov); W(); DR(AX); SM(None, SADDR);
  628. /** 1010 1110 movw %0, %s1 */
  629. ID(mov); W(); DR(AX); SM(None, SFR);
  630. /** 11ra 1011 movw %0, %es!1 */
  631. ID(mov); W(); DRW(ra); SM(None, IMMU(2));
  632. /** 11ra 1010 movw %0, %1 */
  633. ID(mov); W(); DRW(ra); SM(None, SADDR);
  634. /** 1100 1001 movw %0, #%1 */
  635. ID(mov); W(); DM(None, SADDR); SC(IMMU(2));
  636. /** 1011 1101 movw %0, %1 */
  637. ID(mov); W(); DM(None, SADDR); SR(AX);
  638. /** 1100 1011 movw %s0, #%1 */
  639. ID(mov); W(); DM(None, SFR); SC(IMMU(2));
  640. /** 1011 1110 movw %s0, %1 */
  641. ID(mov); W(); DM(None, SFR); SR(AX);
  642. /*----------------------------------------------------------------------*/
  643. /** 1101 0110 mulu x */
  644. ID(mulu);
  645. /*----------------------------------------------------------------------*/
  646. /** 0000 0000 nop */
  647. ID(nop);
  648. /*----------------------------------------------------------------------*/
  649. /** 0111 0001 1100 0000 not1 cy */
  650. ID(xor); DCY(); SC(1);
  651. /*----------------------------------------------------------------------*/
  652. /** 1110 0101 oneb %e!0 */
  653. ID(mov); DM(None, IMMU(2)); SC(1);
  654. /** 1110 00rg oneb %0 */
  655. ID(mov); DRB(rg); SC(1);
  656. /** 1110 0100 oneb %0 */
  657. ID(mov); DM(None, SADDR); SC(1);
  658. /*----------------------------------------------------------------------*/
  659. /** 1110 0110 onew %0 */
  660. ID(mov); DR(AX); SC(1);
  661. /** 1110 0111 onew %0 */
  662. ID(mov); DR(BC); SC(1);
  663. /*----------------------------------------------------------------------*/
  664. /** 0110 1111 or %0, %e!1 */
  665. ID(or); DR(A); SM(None, IMMU(2)); Fz;
  666. /** 0110 1101 or %0, %e1 */
  667. ID(or); DR(A); SM(HL, 0); Fz;
  668. /** 0110 0001 1110 0000 or %0, %e1 */
  669. ID(or); DR(A); SM2(HL, B, 0); Fz;
  670. /** 0110 1110 or %0, %ea1 */
  671. ID(or); DR(A); SM(HL, IMMU(1)); Fz;
  672. /** 0110 0001 1110 0010 or %0, %e1 */
  673. ID(or); DR(A); SM2(HL, C, 0); Fz;
  674. /** 0110 1100 or %0, #%1 */
  675. ID(or); DR(A); SC(IMMU(1)); Fz;
  676. /** 0110 0001 0110 1rba or %0, %1 */
  677. ID(or); DR(A); SRB(rba); Fz;
  678. /** 0110 0001 0110 0reg or %0, %1 */
  679. ID(or); DRB(reg); SR(A); Fz;
  680. /** 0110 1011 or %0, %1 */
  681. ID(or); DR(A); SM(None, SADDR); Fz;
  682. /** 0110 1010 or %0, #%1 */
  683. ID(or); DM(None, SADDR); SC(IMMU(1)); Fz;
  684. /*----------------------------------------------------------------------*/
  685. /** 0111 0001 1bit 0110 or1 cy, %e1 */
  686. ID(or); DCY(); SM(HL, 0); SB(bit);
  687. /** 0111 0001 1bit 1110 or1 cy, %1 */
  688. ID(or); DCY(); SR(A); SB(bit);
  689. /** 0111 0001 0bit 1110 or1 cy, %s1 */
  690. ID(or); DCY(); SM(None, SFR); SB(bit);
  691. /** 0111 0001 0bit 0110 or1 cy, %s1 */
  692. ID(or); DCY(); SM(None, SADDR); SB(bit);
  693. /*----------------------------------------------------------------------*/
  694. /** 1100 0rg0 pop %0 */
  695. ID(mov); W(); DRW(rg); SPOP();
  696. /** 0110 0001 1100 1101 pop %s0 */
  697. ID(mov); W(); DR(PSW); SPOP();
  698. /*----------------------------------------------------------------------*/
  699. /** 1100 0rg1 push %1 */
  700. ID(mov); W(); DPUSH(); SRW(rg);
  701. /** 0110 0001 1101 1101 push %s1 */
  702. ID(mov); W(); DPUSH(); SR(PSW);
  703. /*----------------------------------------------------------------------*/
  704. /** 1101 0111 ret */
  705. ID(ret);
  706. /** 0110 0001 1111 1100 reti */
  707. ID(reti);
  708. /** 0110 0001 1110 1100 retb */
  709. ID(reti);
  710. /*----------------------------------------------------------------------*/
  711. /** 0110 0001 1110 1011 rol %0, %1 */
  712. ID(rol); DR(A); SC(1);
  713. /** 0110 0001 1101 1100 rolc %0, %1 */
  714. ID(rolc); DR(A); SC(1);
  715. /** 0110 0001 111r 1110 rolwc %0, %1 */
  716. ID(rolc); W(); DRW(r); SC(1);
  717. /** 0110 0001 1101 1011 ror %0, %1 */
  718. ID(ror); DR(A); SC(1);
  719. /** 0110 0001 1111 1011 rorc %0, %1 */
  720. ID(rorc); DR(A); SC(1);
  721. /*----------------------------------------------------------------------*/
  722. /* Note that the branch insns need to be listed before the shift
  723. ones, as "shift count of zero" means "branch insn" */
  724. /** 0011 0001 0cnt 1011 sar %0, %1 */
  725. ID(sar); DR(A); SC(cnt);
  726. /** 0011 0001 wcnt 1111 sarw %0, %1 */
  727. ID(sar); W(); DR(AX); SC(wcnt);
  728. /*----------------------------------------------------------------------*/
  729. /** 0110 0001 11rb 1111 sel rb%1 */
  730. ID(sel); SC(rb);
  731. /*----------------------------------------------------------------------*/
  732. /** 0111 0001 0bit 0000 set1 %e!0 */
  733. ID(mov); DM(None, IMMU(2)); DB(bit); SC(1);
  734. /** 0111 0001 1bit 0010 set1 %e0 */
  735. ID(mov); DM(HL, 0); DB(bit); SC(1);
  736. /** 0111 0001 1bit 1010 set1 %0 */
  737. ID(mov); DR(A); DB(bit); SC(1);
  738. /** 0111 0001 1000 0000 set1 cy */
  739. ID(mov); DCY(); SC(1);
  740. /** 0111 0001 0bit 1010 set1 %s0 */
  741. op0 = SFR;
  742. ID(mov); DM(None, op0); DB(bit); SC(1);
  743. if (op0 == RL78_SFR_PSW && bit == 7)
  744. rl78->syntax = "ei";
  745. /** 0111 0001 0bit 0010 set1 %0 */
  746. ID(mov); DM(None, SADDR); DB(bit); SC(1);
  747. /*----------------------------------------------------------------------*/
  748. /** 0011 0001 0cnt 1001 shl %0, %1 */
  749. ID(shl); DR(A); SC(cnt);
  750. /** 0011 0001 0cnt 1000 shl %0, %1 */
  751. ID(shl); DR(B); SC(cnt);
  752. /** 0011 0001 0cnt 0111 shl %0, %1 */
  753. ID(shl); DR(C); SC(cnt);
  754. /** 0011 0001 wcnt 1101 shlw %0, %1 */
  755. ID(shl); W(); DR(AX); SC(wcnt);
  756. /** 0011 0001 wcnt 1100 shlw %0, %1 */
  757. ID(shl); W(); DR(BC); SC(wcnt);
  758. /*----------------------------------------------------------------------*/
  759. /** 0011 0001 0cnt 1010 shr %0, %1 */
  760. ID(shr); DR(A); SC(cnt);
  761. /** 0011 0001 wcnt 1110 shrw %0, %1 */
  762. ID(shr); W(); DR(AX); SC(wcnt);
  763. /*----------------------------------------------------------------------*/
  764. /** 0110 0001 1100 1000 sk%c1 */
  765. ID(skip); COND(C);
  766. /** 0110 0001 1110 0011 sk%c1 */
  767. ID(skip); COND(H);
  768. /** 0110 0001 1101 1000 sk%c1 */
  769. ID(skip); COND(NC);
  770. /** 0110 0001 1111 0011 sk%c1 */
  771. ID(skip); COND(NH);
  772. /** 0110 0001 1111 1000 sk%c1 */
  773. ID(skip); COND(NZ);
  774. /** 0110 0001 1110 1000 sk%c1 */
  775. ID(skip); COND(Z);
  776. /*----------------------------------------------------------------------*/
  777. /** 0110 0001 1111 1101 stop */
  778. ID(stop);
  779. /*----------------------------------------------------------------------*/
  780. /** 0010 1111 sub %0, %e!1 */
  781. ID(sub); DR(A); SM(None, IMMU(2)); Fzac;
  782. /** 0010 1101 sub %0, %e1 */
  783. ID(sub); DR(A); SM(HL, 0); Fzac;
  784. /** 0110 0001 1010 000 sub %0, %e1 */
  785. ID(sub); DR(A); SM2(HL, B, 0); Fzac;
  786. /** 0010 1110 sub %0, %ea1 */
  787. ID(sub); DR(A); SM(HL, IMMU(1)); Fzac;
  788. /** 0110 0001 1010 0010 sub %0, %e1 */
  789. ID(sub); DR(A); SM2(HL, C, 0); Fzac;
  790. /** 0010 1100 sub %0, #%1 */
  791. ID(sub); DR(A); SC(IMMU(1)); Fzac;
  792. /** 0110 0001 0010 1rba sub %0, %1 */
  793. ID(sub); DR(A); SRB(rba); Fzac;
  794. /** 0010 1011 sub %0, %1 */
  795. ID(sub); DR(A); SM(None, SADDR); Fzac;
  796. /** 0110 0001 0010 0reg sub %0, %1 */
  797. ID(sub); DRB(reg); SR(A); Fzac;
  798. /** 0010 1010 sub %0, #%1 */
  799. ID(sub); DM(None, SADDR); SC(IMMU(1)); Fzac;
  800. /*----------------------------------------------------------------------*/
  801. /** 0011 1111 subc %0, %e!1 */
  802. ID(subc); DR(A); SM(None, IMMU(2)); Fzac;
  803. /** 0011 1101 subc %0, %e1 */
  804. ID(subc); DR(A); SM(HL, 0); Fzac;
  805. /** 0110 0001 1011 0000 subc %0, %e1 */
  806. ID(subc); DR(A); SM2(HL, B, 0); Fzac;
  807. /** 0110 0001 1011 0010 subc %0, %e1 */
  808. ID(subc); DR(A); SM2(HL, C, 0); Fzac;
  809. /** 0011 1110 subc %0, %ea1 */
  810. ID(subc); DR(A); SM(HL, IMMU(1)); Fzac;
  811. /** 0011 1100 subc %0, #%1 */
  812. ID(subc); DR(A); SC(IMMU(1)); Fzac;
  813. /** 0110 0001 0011 1rba subc %0, %1 */
  814. ID(subc); DR(A); SRB(rba); Fzac;
  815. /** 0110 0001 0011 0reg subc %0, %1 */
  816. ID(subc); DRB(reg); SR(A); Fzac;
  817. /** 0011 1011 subc %0, %1 */
  818. ID(subc); DR(A); SM(None, SADDR); Fzac;
  819. /** 0011 1010 subc %0, #%1 */
  820. ID(subc); DM(None, SADDR); SC(IMMU(1)); Fzac;
  821. /*----------------------------------------------------------------------*/
  822. /** 0010 0010 subw %0, %e!1 */
  823. ID(sub); W(); DR(AX); SM(None, IMMU(2)); Fzac;
  824. /** 0110 0001 0010 1001 subw %0, %ea1 */
  825. ID(sub); W(); DR(AX); SM(HL, IMMU(1)); Fzac;
  826. /** 0010 0100 subw %0, #%1 */
  827. ID(sub); W(); DR(AX); SC(IMMU(2)); Fzac;
  828. /** 0010 0rw1 subw %0, %1 */
  829. ID(sub); W(); DR(AX); SRW(rw); Fzac;
  830. /** 0010 0110 subw %0, %1 */
  831. ID(sub); W(); DR(AX); SM(None, SADDR); Fzac;
  832. /** 0010 0000 subw %0, #%1 */
  833. ID(sub); W(); DR(SP); SC(IMMU(1)); Fzac;
  834. /*----------------------------------------------------------------------*/
  835. /** 0110 0001 1010 1010 xch %0, %e!1 */
  836. ID(xch); DR(A); SM(None, IMMU(2));
  837. /** 0110 0001 1010 1110 xch %0, %e1 */
  838. ID(xch); DR(A); SM(DE, 0);
  839. /** 0110 0001 1010 1111 xch %0, %ea1 */
  840. ID(xch); DR(A); SM(DE, IMMU(1));
  841. /** 0110 0001 1010 1100 xch %0, %e1 */
  842. ID(xch); DR(A); SM(HL, 0);
  843. /** 0110 0001 1011 1001 xch %0, %e1 */
  844. ID(xch); DR(A); SM2(HL, B, 0);
  845. /** 0110 0001 1010 1101 xch %0, %ea1 */
  846. ID(xch); DR(A); SM(HL, IMMU(1));
  847. /** 0110 0001 1010 1001 xch %0, %e1 */
  848. ID(xch); DR(A); SM2(HL, C, 0);
  849. /** 0110 0001 1000 1reg xch %0, %1 */
  850. /* Note: DECW uses reg == X, so this must follow DECW */
  851. ID(xch); DR(A); SRB(reg);
  852. /** 0110 0001 1010 1000 xch %0, %1 */
  853. ID(xch); DR(A); SM(None, SADDR);
  854. /** 0110 0001 1010 1011 xch %0, %s1 */
  855. ID(xch); DR(A); SM(None, SFR);
  856. /** 0000 1000 xch a, x */
  857. ID(xch); DR(A); SR(X);
  858. /*----------------------------------------------------------------------*/
  859. /** 0011 0ra1 xchw %0, %1 */
  860. ID(xch); W(); DR(AX); SRW(ra);
  861. /*----------------------------------------------------------------------*/
  862. /** 0111 1111 xor %0, %e!1 */
  863. ID(xor); DR(A); SM(None, IMMU(2)); Fz;
  864. /** 0111 1101 xor %0, %e1 */
  865. ID(xor); DR(A); SM(HL, 0); Fz;
  866. /** 0110 0001 1111 0000 xor %0, %e1 */
  867. ID(xor); DR(A); SM2(HL, B, 0); Fz;
  868. /** 0111 1110 xor %0, %ea1 */
  869. ID(xor); DR(A); SM(HL, IMMU(1)); Fz;
  870. /** 0110 0001 1111 0010 xor %0, %e1 */
  871. ID(xor); DR(A); SM2(HL, C, 0); Fz;
  872. /** 0111 1100 xor %0, #%1 */
  873. ID(xor); DR(A); SC(IMMU(1)); Fz;
  874. /** 0110 0001 0111 1rba xor %0, %1 */
  875. ID(xor); DR(A); SRB(rba); Fz;
  876. /** 0110 0001 0111 0reg xor %0, %1 */
  877. ID(xor); DRB(reg); SR(A); Fz;
  878. /** 0111 1011 xor %0, %1 */
  879. ID(xor); DR(A); SM(None, SADDR); Fz;
  880. /** 0111 1010 xor %0, #%1 */
  881. ID(xor); DM(None, SADDR); SC(IMMU(1)); Fz;
  882. /*----------------------------------------------------------------------*/
  883. /** 0111 0001 1bit 0111 xor1 cy, %e1 */
  884. ID(xor); DCY(); SM(HL, 0); SB(bit);
  885. /** 0111 0001 1bit 1111 xor1 cy, %1 */
  886. ID(xor); DCY(); SR(A); SB(bit);
  887. /** 0111 0001 0bit 1111 xor1 cy, %s1 */
  888. ID(xor); DCY(); SM(None, SFR); SB(bit);
  889. /** 0111 0001 0bit 0111 xor1 cy, %s1 */
  890. ID(xor); DCY(); SM(None, SADDR); SB(bit);
  891. /*----------------------------------------------------------------------*/
  892. /** */
  893. return rl78->n_bytes;
  894. }