/*
 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
 * See the copyright notice in the ACK home directory, in the file "Copyright".
 */
#define RCSID5 "$Id$"

/*
 * Zilog Z80 special routines
 */

void xyreg(int r,int byte)
{

	if (r==IX)
		emit1(0335);
	else if (r==IY)
		emit1(0375);
	else if (r!=HL)
		serror("register error");
	emit1(byte);
}

void xymem(int r,int byte)
{

	xyreg(r,byte);
	if (r != HL) {
#ifdef RELOCATION
		RELOMOVE(relonami, rel_ind);
		newrelo(exp_ind.typ, RELO1);
#endif
		emit1(exp_ind.val);
	}
}

void branch(register int opc,expr_t exp)
{
	register int sm,dist;

	dist = exp.val - (DOTVAL + 2);
	if (pass == PASS_2 && dist > 0 && !(exp.typ & S_DOT))
		dist -= DOTGAIN;
	sm = fitb(dist);
	if ((exp.typ & ~S_DOT) != DOTTYP)
		sm = 0;
	if (opc == 020) {		/* DJNZ must be short */
		fit(sm);
		sm = 1;
	} else if ((sm = small(sm,1)) == 0) {
		if (opc == 030)		/* 'JR exp' */
			opc = 0303;	/* replace by 'JP exp' */
		else			/* 'JR CC,exp' */
			opc ^= 0342;	/* replace by 'JP CC,exp' */
	}
	emit1(opc);
	if (sm == 0) {
#ifdef RELOCATION
		newrelo(exp.typ, RELO2);
#endif
		emit2(exp.val);
	} else {
		emit1(lowb(dist));
	}
}
