ack/mach/z8000/as/mach1.c
2019-03-25 00:14:38 +08:00

98 lines
2.6 KiB
C

/*
* (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);