Mercurial > hg-old > index.cgi
view src/insn_tfm.c @ 282:2ca46690162b 2.3
Branched for 2.3 release
author | lost |
---|---|
date | Fri, 24 Apr 2009 22:14:47 +0000 |
parents | 74a3fef7c8d0 |
children |
line wrap: on
line source
/* insn_tfm.c Copyright © 2009 William Astle This file is part of LWASM. LWASM is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ /* for handling inherent mode instructions */ #define __insn_tfm_c_seen__ #include <ctype.h> #include <string.h> #include "lwasm.h" #include "instab.h" OPFUNC(insn_tfm) { static const char *reglist = "DXYUS AB 00EF"; int r0, r1; char *c; int tfm = 0; c = strchr(reglist, toupper(*(*p)++)); if (!c) { register_error(as, l, 1, "Unknown operation"); return; } r0 = c - reglist; if (**p == '+') { (*p)++; tfm = 1; } else if (**p == '-') { (*p)++; tfm = 2; } if (*(*p)++ != ',') { register_error(as, l, 1, "Unknown operation"); return; } c = strchr(reglist, toupper(*(*p)++)); if (!c) { register_error(as, l, 1, "Unknown operation"); return; } r1 = c - reglist; if (**p == '+') { (*p)++; tfm |= 4; } else if (**p == '-') { (*p)++; tfm |= 8; } if (**p && !isspace(**p)) { register_error(as, l, 1, "Bad operand"); return; } // valid values of tfm here are: // 1: r0+,r1 (2) // 4: r0,r1+ (3) // 5: r0+,r1+ (0) // 10: r0-,r1- (1) switch (tfm) { case 5: //r0+,r1+ lwasm_emitop(as, l, instab[opnum].ops[0]); break; case 10: //r0-,r1- lwasm_emitop(as, l, instab[opnum].ops[1]); break; case 1: // r0+,r1 lwasm_emitop(as, l, instab[opnum].ops[2]); break; case 4: // r0,r1+ lwasm_emitop(as, l, instab[opnum].ops[3]); break; default: register_error(as, l, 1, "Unknown operation"); return; } lwasm_emit(as, l, (r0 << 4) | r1); }