# HG changeset patch # User lost # Date 1230866246 0 # Node ID c0ff62e5ad3915c73db70542fdc30b2a588384ce # Parent f736579569b4c4fc382732c00b6ce1ea9e595f9d Added register list mode handler diff -r f736579569b4 -r c0ff62e5ad39 src/Makefile.am --- a/src/Makefile.am Fri Jan 02 02:56:04 2009 +0000 +++ b/src/Makefile.am Fri Jan 02 03:17:26 2009 +0000 @@ -1,3 +1,3 @@ bin_PROGRAMS = lwasm -lwasm_SOURCES = main.c expr.c pass1.c pass2.c util.c instab.c parse.c lwasm.c insn_inh.c insn_rtor.c +lwasm_SOURCES = main.c expr.c pass1.c pass2.c util.c instab.c parse.c lwasm.c insn_inh.c insn_rtor.c insn_rlist.c EXTRA_DIST = instab.h lwasm.h expr.h util.h diff -r f736579569b4 -r c0ff62e5ad39 src/insn_misc.c --- a/src/insn_misc.c Fri Jan 02 02:56:04 2009 +0000 +++ b/src/insn_misc.c Fri Jan 02 03:17:26 2009 +0000 @@ -28,44 +28,6 @@ extern void insn_gen_aux(asmstate_t *as, sourceline_t *cl, char **optr, int *b1, int *b2, int *b3, int *op); -void insn_rlist(asmstate_t *as, sourceline_t *cl, char **optr) -{ - int rb = 0; - int rn; - static const char *regs = "CCA B DPX Y U PCD S "; - - emitop(instab[cl -> opcode].ops[0]); - cl -> addrmode = OPER_RLIST; - while (**optr && !isspace(**optr)) - { - rn = lookupreg(regs, optr); - if (rn < 0) - { - printf("Bad reg (%s)\n", *optr); - errorp1(ERR_BADOPER); - emit(0); - return; - } - if (**optr && **optr != ',' && !isspace(**optr)) - { - printf("Bad char (%c)\n", **optr); - errorp1(ERR_BADOPER); - emit(0); - return; - } - if (**optr == ',') - (*optr)++; - if (rn == 8) - rn = 6; - else if (rn == 9) - rn = 0x40; - else - rn = 1 << rn; - rb |= rn; - } - emit(rb); -} - // for aim, oim, eim, tim void insn_logicmem(asmstate_t *as, sourceline_t *cl, char **optr) { diff -r f736579569b4 -r c0ff62e5ad39 src/insn_rlist.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/insn_rlist.c Fri Jan 02 03:17:26 2009 +0000 @@ -0,0 +1,62 @@ +/* +insn_rlist.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 . +*/ + +/* +for handling inherent mode instructions +*/ + +#define __insn_inh_c_seen__ + +#include "lwasm.h" +#include "instab.h" + +OPFUNC(insn_rlist) +{ + int rb = 0; + int rn; + static const char *regs = "CCA B DPX Y U PCD S "; + + lwasm_emitop(as, l, instab[opnum].ops[0]); + while (**p && !isspace(**p)) + { + rn = lwasm_lookupreg2(regs, p); + if (rn < 0) + { + register_error(as, l, 1, "Bad register '%s'", *p); + lwasm_emit(as, l, 0); + return; + } + if (**p && **p != ',' && !isspace(**p)) + { + register_error(as, l, 1, "Bad operand"); + lwasm_emit(as, l, 0); + } + if (**p == ',') + (*p)++; + if (rn == 8) + rn = 6; + else if (rn == 9) + rn = 0x40; + else + rn = 1 << rn; + rb |= rn; + } + lwasm_emit(as, l, rb); +} diff -r f736579569b4 -r c0ff62e5ad39 src/lwasm.h --- a/src/lwasm.h Fri Jan 02 02:56:04 2009 +0000 +++ b/src/lwasm.h Fri Jan 02 03:17:26 2009 +0000 @@ -45,6 +45,7 @@ lwasm_line_t *next; // next line lwasm_line_t *prev; // previous line lwasm_error_t *err; // error messages + int fsize; // forced size (0 = no forced size) }; // keep track of current assembler state diff -r f736579569b4 -r c0ff62e5ad39 src/pass1.c --- a/src/pass1.c Fri Jan 02 02:56:04 2009 +0000 +++ b/src/pass1.c Fri Jan 02 03:17:26 2009 +0000 @@ -131,6 +131,7 @@ nl -> next = NULL; nl -> prev = as -> linestail; nl -> err = NULL; + nl -> fsize = 0; if (as -> linestail) as -> linestail -> next = nl; else