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

/*
** Zilog z8000 machine dependent C declarations
*/
#define	REG	1
#define	IM	2
#define	IR	4
#define	DA	8
#define	X	16
#define	RA	32
#define	BA	64
#define	BX	128

#define	TYPE_11a23	IR | DA | X
#define	TYPE_11b23	REG | IR | DA | X
#define	TYPE_12		REG | IR | DA | X
#define	TYPE_1263	REG | IR | DA | X
#define	TYPE_jp		IR | DA | X
#define	TYPE_21a	REG | IR | DA | X
#define	TYPE_21b	REG
#define	TYPE_2151	REG | IM | IR | DA | X
#define	TYPE_pop	REG | IR | DA | X
#define	TYPE_push	REG | IM | IR | DA | X
#define	TYPE_ldm	IR | DA | X
#define	TYPE_ld		IR | DA | X

#define	DST	0
#define	SRC	1

#define DJNZ_	0xF000
#define JR_	0xE000
#define CALR_	0xD000

#define low3(z)		( ((short) z) & 07 )
#define low4(z)		( ((short) z) & 017 )
#define low5(z)		( ((short) z) & 037 )
#define low7(z)		( ((short) z) & 0177 )
#define low8(z)		( ((short) z) & 0377 )
#define low11(z)	( ((short) z) & 03777 )
#define low12(z)	( ((short) z) & 07777 )
#define low15(z)	( ((short) z) & 077777 )
#define fit3(z)		( low3(z) == (z) )
#define fit4(z)		( low4(z) == (z) )
#define fit5(z)		( low5(z) == (z) )
#define fit7(z)		( low7(z) == (z) )
#define fit8(z)		( low8(z) == (z) )
#define fits8(z)	( low7(z) == (z) || low7(-z-1) == (-z-1) )
#define fits12(z)	( low11(z) == (z) || low11(-z-1) == (-z-1) )
#define fits16(z)	( low15(z) == (z) || low15(-z-1) == (-z-1) )

#define bitset(x,b)	( ((int) x) & ((int) 1<<b) ) /*bit b set in x?*/

typedef struct address	ATYPE;

struct address
{	short	seg;
	short	off;
};

extern expr_t	displ;	/* never more than 16 bits */
extern short	offset;	/* never more than 16 bits */
extern short	mode;
#ifndef extern
extern short	modetbl[ 5 ];
#else
short modetbl[5] = { 8, 0, 0, 4, 4 };
	      /* Modes for REG, IM, IR, DA, X.  e.g. modetbl[ 2log REG ]
	      ** is the mode if operand is of type REG.
	      ** No entries for RA, BA and BX are needed.
	      */
#endif
extern short	operand;
extern short	oprtype[ 2 ];
extern expr_t	addr_inf;	/* .val (address) up to 23 bits! */
extern expr_t	immed;

#define regerr()	serror("register error")

/* Z8000 specific routines */
void settype( int type );
int	twolog(int s);
void setmod(int opr);
void chtype(int opr, int typerange );
void chreg(int opc, int reg);
ATYPE	checkaddr(valu_t addr );
void emit_ad(expr_t ad_inf);
void ldmcode(int wrd1,int wrd2, int num);
valu_t	adjust(valu_t absval);
void branch(int opc,expr_t exp);
void ldrel(int opc,expr_t exp);
void shiftcode(int w1, int w2);
void argerr(void);
