view lwasm/insn_logicmem.c @ 205:42df94f30d82

checkpoint
author lost
date Sun, 19 Apr 2009 17:44:46 +0000
parents 427e268e876b
children bae1e3ecdce1
line wrap: on
line source

/*
insn_logicmem.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/>.

Contains code for handling logic/mem instructions
*/

#include <ctype.h>
#include <stdio.h>
#include <string.h>

#include "lwasm.h"
#include "instab.h"
#include "expr.h"

extern void insn_gen_aux(asmstate_t *as, lwasm_line_t *l, char **optr, int opnum, int extra);

// for aim, oim, eim, tim
// the immediate operand must be constant on pass 2
OPFUNC(insn_logicmem)
{
	int rval, v1;
	const char *p2;
	lwasm_expr_stack_t *s;
	
	if (**p == '#')
		(*p)++;
	
	rval = lwasm_expr_result2(as, l, p, 0, &v1, 1);
	if (rval != 0)
		v1 = 0;
	if (rval == 1 && as -> passnum == 2)
		register_error(as, l, 2, "Illegal external or intersegment reference");

	if (v1 < -128 || v1 > 255)
		register_error(as, l, 2, "Byte overflow");
	
	if (**p != ',' && **p != ';')
	{
		register_error(as, l, 1, "Bad operand");
		return;
	}
	
	(*p)++;

	// now we have a general addressing mode - call for it
	insn_gen_aux(as, l, p, opnum, v1 & 0xff);
}