File:  [Atari MiNT] / MiNT / src / trans.c
Revision 1.1.1.3 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:58:07 2018 UTC (8 years, 1 month ago) by root
Branches: mint, MAIN
CVS tags: mint112, mint110, HEAD
MiNT 1.10

/*

 * translation routines; sometimes we pass data on

 * through directly (asm syntax->asm syntax, with

 * some macro expansion), and other times we also

 * do asm syntax->gas syntax translation

 */



#include "asmtrans.h"



int syntax = GAS;



char *

immediate(op)

	char *op;

{

	return concat("#", op);

}



char *

indirect(op)

	char *op;

{

	if (syntax == GAS) {

		return concat(op, "@");

	} else {

		return concat3("(", op, ")");

	}

}



char *

postinc(op)

	char *op;

{

	if (syntax == GAS) {

		return concat(op, "@+");

	} else {

		return concat3("(", op, ")+");

	}

}



char *

predec(op)

	char *op;

{

	if (syntax == GAS) {

		return concat(op, "@-");

	} else {

		return concat3("-(", op, ")");

	}

}



char *

indexed(op1, op2)

	char *op1, *op2;

{

	if (syntax == GAS) {

		return concat4(op2, "@(", op1, ")");

	} else {

		return concat4(op1, "(", op2, ")");

	}

}



char *

sizedop(op, size)

	char *op, *size;

{

	if (syntax == GAS) {

		return changesiz(concat(op, size));

	} else {

		return concat4("(", op, ")", size);

	}

}



char *

twoindex(disp, base, index)

	char *disp, *base, *index;

{

	if (syntax == GAS) {

		return concat6(base, "@(", disp, ",", changesiz2(index), ")");

	} else {

		return concat6(disp, "(", base, ",", index, ")");

	}

}



char *

bitfield(op1, op2, op3)

	char *op1, *op2, *op3;

{

	if (syntax == GAS) {

		return concat6(op1, "{#", op2, ":#", op3, "}");

	} else {

		return concat6(op1, "{", op2, ":", op3, "}");

	}

}



char *

postindex(bd, an , index, od)

	char *bd, *an, *index , *od;

{

	if (syntax == GAS) {

		return concat8(an, "@(", bd, ")@(", od, ",", changesiz2(index), ")");

	} else {

		return concat9("([",an, ",", bd, "],", index, ",", od ,")");

	}

}



char *

postindex0(bd)

	char *bd;

{

	if (syntax == GAS) {

		return concat3("@(", bd, ")@()");

	} else {

		return concat3("([", bd, "])");

	}

}



char *

postindex1(bd,od)

	char *bd, *od;

{

	if (syntax == GAS) {

		return concat5("@(", bd, ")@(", od, ")");

	} else {

		return concat5("([", bd, "],", od, ")");

	}

}



char *

preindex(bd, an , index, od)

	char *bd, *an, *index , *od;

{

	if (syntax == GAS) {

		return concat8(an, "@(", bd, ",", changesiz2(index), ")@(", od, ")");

	} else {

		return concat9("([",an, ",", bd, ",", index, "],", od, ")");

	}

}



char *

do_ops(label, opcode, space, operand)

	char *label, *opcode, *space, *operand;

{

	static char temp[LINSIZ];

	static char optemp[40];

	char *to, *from;

	char c;



	if (syntax == GAS) {

	    if (!strcmp(opcode, "ds.l")) {

		strcpy(temp, "\t.even\n\t.comm");

		strcat(temp, space);

		strcat(temp, label);

		strcat(temp, ",");

		strcat(temp, "4*");

		strcat(temp, operand);

		return strdup(temp);

	    } else if (!strcmp(opcode, "ds.w")) {

		strcpy(temp, "\t.even\n\t.comm");

		strcat(temp, space);

		strcat(temp, label);

		strcat(temp, ",");

		strcat(temp, "2*");

		strcat(temp, operand);

		return strdup(temp);

	    } else if (!strcmp(opcode, "ds.b")) {

		strcpy(temp, "\t.comm");

		strcat(temp, space);

		strcat(temp, label);

		strcat(temp, ",");

		strcat(temp, operand);

		return strdup(temp);

	    } else {

		to = optemp;

		from = opcode;

		for(;;) {

			c = *from++;

			if (!c) break;

	/* change 'foo.b' -> 'foob' */

	/* special case: bra.s -> 'bra', since gas automatically

	 * selects offset sizes and since some gas's actually

	 * mess up if an explicit '.s' is given

	 */

			if (c == '.' && *from && from[1] == 0) {

				if (*from == 's') from++;

				continue;

			}

			*to++ = c;

		}

		*to = 0;

		opcode = optemp;

	    }

	}



	to = temp;



	if (*label) {

		int colonseen = 0;

		char c;



		for (from = label; (c = *from++) != 0;) {

			if (c == ':') colonseen = 1;

			*to++ = c;

		}

/* gas labels must have a ':' after them */

		if (!colonseen && syntax == GAS)

			*to++ = ':';

	}



	*to++ = '\t';

	strcpy(to, opcode);

	strcat(temp, space);

	strcat(temp, operand);

	return strdup(temp);

}



char *

changesiz(op)

	char *op;

{

	char *r = op;



	if (syntax != GAS) return op;



	while (*op) {

		if (*op == '.') *op = ':';

		op++;

	}

	return r;

}



char *

changesiz2(op)		/* rw: hack for scaled index	*/

	char *op;

{

	char *r = op;



	if (syntax != GAS) return op;



	while (*op) {

		if (*op == '.' || *op == '*' ) *op = ':';

		op++;

	}

	return r;

}



char *

hexop(op)

	char *op;

{

	if (syntax == GAS)

		return concat("0x", op);

	else

		return concat("$", op);

}


unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.