Beispiel #1
0
int assemble_operand(void) {
	u16 n;
	next();
	switch (token) {
	case tA: case tB: case tC: case tX:
	case tY: case tZ: case tI: case tJ:
		return token & 7;
	case tPOP: return 0x18;
	case tPEEK: return 0x19;
	case tPUSH: return 0x1a;
	case tSP: return 0x1b;
	case tPC: return 0x1c;
	case tO: return 0x1d;
	case tNUMBER:
		if (tnumber < 0x20)
			return tnumber + 0x20;
		image[PC++] = tnumber;
		return 0x1f;
	case tSTRING:
		image[PC] = 0;
		use_label(tstring, PC++);
		return 0x1f;
	default:
		if (token != tOBRACK)
			die("expected [");
	}
	next();
	switch (token) {
	case tA: case tB: case tC: case tX:
	case tY: case tZ: case tI: case tJ:
		n = token & 7;
		expect(tCBRACK);
		return n;
	case tSTRING:
		use_label(tstring, PC);
	case tNUMBER:
		image[PC++] = tnumber;
		next();
		if (token == tCBRACK) {
			return 0x1e;
		} else if ((token == tCOMMA) || (token == tPLUS)) {
			next();
			if ((token >= tA) && (token <= tJ)) {
				n = 0x10 | (token & 7);
			} else {
				die("invalid register");
			}
			expect(tCBRACK);
			return n;
		} else {
			die("invalid operand");
		}
	default:
		die("invalid operand");
	}
	return 0;
}
Beispiel #2
0
void assemble_imm_or_label(void) {
	next();
	if (token == tNUMBER) {
		image[PC++] = tnumber;
	} else if (token == tSTRING) {
		image[PC] = 0;
		use_label(tstring, PC++);
	} else {
		die("expected number or label");
	}
}
Beispiel #3
0
expression make_label_address(location loc, id_label label)
{
  expression result = CAST(expression, new_label_address(parse_region, loc, label));

  use_label(label);

  result->type = ptr_void_type;
  result->cst = fold_label_address(result);

  if (pedantic)
    pedwarn("ANSI C forbids `&&'");

  return result;
}
Beispiel #4
0
void assemble_imm_or_label(void) {
	do {
		next();
		if (token == tNUMBER) {
			note[PC] = 'd';
			image[PC++] = tnumber;
		} else if (token == tSTRING) {
			note[PC] = 'd';
			image[PC] = 0;
			use_label(tstring, PC++);
		} else if (token == tQSTRING) {
			char *x = tstring;
			while (*x) {
				note[PC] = 'd';
				image[PC++] = *x++;
			}
		} else {
			die("expected number or label");
		}
		next();
	} while (token == tCOMMA);
}
Beispiel #5
0
int assemble_operand(void) {
	u16 n;

	next();
	switch (token) {
	case tA: case tB: case tC: case tX:
	case tY: case tZ: case tI: case tJ:
		return token & 7;
	case tR0: case tR1: case tR2: case tR3:
	case tR4: case tR5: case tR6: case tR7:
		return (token - 8) & 7;
	case tPOP: return 0x18;
	case tPEEK: return 0x19;
	case tPUSH: return 0x1a;
	case tSP: return 0x1b;
	case tPC: return 0x1c;
	case tEX: return 0x1d;
	case tNUMBER:
		if (tnumber < 0x20)
			return tnumber + 0x21;
		image[PC++] = tnumber;
		return 0x1f;
	case tSTRING:
		image[PC] = 0;
		use_label(tstring, PC++);
		return 0x1f;
	default:
		if (token != tOBRACK)
			die("expected [");
	}

	/* we must have seen a '[' */
	next();
	switch (token) {
	case tA: case tB: case tC: case tX:
	case tY: case tZ: case tI: case tJ:
		n = token & 7;
		next();
		if (token == tCBRACK)
			return 0x08 | n;
		if ((token != tCOMMA) && (token != tPLUS))
			die("expected , or +");
		next();
		if (token == tSTRING) {
			use_label(tstring, PC++);
		} else if (token == tNUMBER) {
			image[PC++] = tnumber;
		} else {
			die("expected immediate value");
		}
		expect(tCBRACK);
		return 0x10 | n;
	case tSTRING:
		use_label(tstring, PC++);
	case tNUMBER:
		if (token == tNUMBER)
			image[PC++] = tnumber;

		next();
		if (token == tCBRACK) {
			return 0x1e;
		} else if ((token == tCOMMA) || (token == tPLUS)) {
			next();
			if ((token >= tA) && (token <= tJ)) {
				n = 0x10 | (token & 7);
			} else {
				die("invalid register");
			}
			expect(tCBRACK);
			return n;
		} else {
			die("invalid operand");
		}
	default:
		die("invalid operand");
	}
	return 0;
}