369 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			369 lines
		
	
	
	
		
			10 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 RCSID3 "$Id$"
 | 
						|
 | 
						|
/*
 | 
						|
** Zilog z8000 keywords
 | 
						|
*/
 | 
						|
{0,		R8,		8,		"RL0"},
 | 
						|
{0,		R8,		0,		"RH0"},
 | 
						|
{0,		R8,		9,		"RL1"},
 | 
						|
{0,		R8,		1,		"RH1"},
 | 
						|
{0,		R8,		10,		"RL2"},
 | 
						|
{0,		R8,		2,		"RH2"},
 | 
						|
{0,		R8,		11,		"RL3"},
 | 
						|
{0,		R8,		3,		"RH3"},
 | 
						|
{0,		R8,		12,		"RL4"},
 | 
						|
{0,		R8,		4,		"RH4"},
 | 
						|
{0,		R8,		13,		"RL5"},
 | 
						|
{0,		R8,		5,		"RH5"},
 | 
						|
{0,		R8,		14,		"RL6"},
 | 
						|
{0,		R8,		6,		"RH6"},
 | 
						|
{0,		R8,		15,		"RL7"},
 | 
						|
{0,		R8,		7,		"RH7"},
 | 
						|
/* Special format for some byte-registers.  Not really available on
 | 
						|
** the z8000 but designed to ease writing a z8000-backend-table.
 | 
						|
** LR[0..7] are equivalent with RL[0..7].
 | 
						|
*/
 | 
						|
{0,		R8,		8,		"LR0"},
 | 
						|
{0,		R8,		9,		"LR1"},
 | 
						|
{0,		R8,		10,		"LR2"},
 | 
						|
{0,		R8,		11,		"LR3"},
 | 
						|
{0,		R8,		12,		"LR4"},
 | 
						|
{0,		R8,		13,		"LR5"},
 | 
						|
{0,		R8,		14,		"LR6"},
 | 
						|
{0,		R8,		15,		"LR7"},
 | 
						|
{0,		R16,		0,		"R0"},
 | 
						|
{0,		R16,		1,		"R1"},
 | 
						|
{0,		R16,		2,		"R2"},
 | 
						|
{0,		R16,		3,		"R3"},
 | 
						|
{0,		R16,		4,		"R4"},
 | 
						|
{0,		R16,		5,		"R5"},
 | 
						|
{0,		R16,		6,		"R6"},
 | 
						|
{0,		R16,		7,		"R7"},
 | 
						|
{0,		R16,		8,		"R8"},
 | 
						|
{0,		R16,		9,		"R9"},
 | 
						|
{0,		R16,		10,		"R10"},
 | 
						|
{0,		R16,		11,		"R11"},
 | 
						|
{0,		R16,		12,		"R12"},
 | 
						|
{0,		R16,		13,		"R13"},
 | 
						|
{0,		R16,		14,		"R14"},
 | 
						|
{0,		R16,		15,		"R15"},
 | 
						|
{0,		R32,		0,		"RR0"},
 | 
						|
{0,		R32,		2,		"RR2"},
 | 
						|
{0,		R32,		4,		"RR4"},
 | 
						|
{0,		R32,		6,		"RR6"},
 | 
						|
{0,		R32,		8,		"RR8"},
 | 
						|
{0,		R32,		10,		"RR10"},
 | 
						|
{0,		R32,		12,		"RR12"},
 | 
						|
{0,		R32,		14,		"RR14"},
 | 
						|
{0,		R64,		0,		"RQ0"},
 | 
						|
{0,		R64,		4,		"RQ4"},
 | 
						|
{0,		R64,		8,		"RQ8"},
 | 
						|
{0,		R64,		12,		"RQ12"},
 | 
						|
{0,		CC,		14,		"NZ"},
 | 
						|
{0,		CC,		15,		"NC"},
 | 
						|
{0,		CC,		13,		"PL"},
 | 
						|
{0,		CC,		5,		"MI"},
 | 
						|
{0,		CC,		14,		"NE"},
 | 
						|
{0,		CC,		6,		"EQ"},
 | 
						|
{0,		CC,		4,		"OV"},
 | 
						|
{0,		CC,		12,		"NOV"},
 | 
						|
{0,		CC,		4,		"PE"},
 | 
						|
{0,		CC,		12,		"PO"},
 | 
						|
{0,		CC,		9,		"GE"},
 | 
						|
{0,		CC,		1,		"LT"},
 | 
						|
{0,		CC,		10,		"GT"},
 | 
						|
{0,		CC,		2,		"LE"},
 | 
						|
{0,		CC,		15,		"UGE"},
 | 
						|
{0,		CC,		7,		"ULT"},
 | 
						|
{0,		CC,		11,		"UGT"},
 | 
						|
{0,		CC,		3,		"ULE"},
 | 
						|
{0,		FLAG,		0x80,		"C"},
 | 
						|
{0,		FLAG,		0x40,		"Z"},
 | 
						|
{0,		FLAG,		0x20,		"S"},
 | 
						|
{0,		FLAG,		0x10,		"P"},
 | 
						|
{0,		FLAG,		0x10,		"V"},
 | 
						|
{0,		INTCB,		2,		"VI"},
 | 
						|
{0,		INTCB,		1,		"NVI"},
 | 
						|
{0,		CTLRFLAGS,	1,		"FLAGS"},
 | 
						|
{0,		CTLR,		2,		"FCW"},
 | 
						|
{0,		CTLR,		3,		"REFRESH"},
 | 
						|
{0,		CTLR,		4,		"PSAPSEG"},
 | 
						|
{0,		CTLR,		5,		"PSAPOFF"},
 | 
						|
{0,		CTLR,		6,		"NSPSEG"},
 | 
						|
{0,		CTLR,		7,		"NSPOFF"},
 | 
						|
{0,		CTLR,		5,		"PSAP"},
 | 
						|
{0,		CTLR,		7,		"NSP"},
 | 
						|
 | 
						|
	/* TYPE_11a23	*/
 | 
						|
{0,		F1_1F2_3,	0x1F00,		"call"},
 | 
						|
{0,		F1_1F2_3,	0x3900,		"ldps"},
 | 
						|
	/* TYPE_11b23	*/
 | 
						|
{0,		F1_1F2_3,	0x0D08,		"clr"},
 | 
						|
{0,		F1_1F2_3,	0x0C08,		"clrb"},
 | 
						|
{0,		F1_1F2_3,	0x0D00,		"com"},
 | 
						|
{0,		F1_1F2_3,	0x0C00,		"comb"},
 | 
						|
{0,		F1_1F2_3,	0x0D02,		"neg"},
 | 
						|
{0,		F1_1F2_3,	0x0C02,		"negb"},
 | 
						|
{0,		F1_1F2_3,	0x0D04,		"test"},
 | 
						|
{0,		F1_1F2_3,	0x0C04,		"testb"},
 | 
						|
{0,		F1_1F2_3,	0x1C08,		"testl"},
 | 
						|
{0,		F1_1F2_3,	0x0D06,		"tset"},
 | 
						|
{0,		F1_1F2_3,	0x0C06,		"tsetb"},
 | 
						|
 | 
						|
{0,		F1_1a,		0xB000,		"dab"},
 | 
						|
{0,		F1_1a,		0xB10A,		"exts"},
 | 
						|
{0,		F1_1a,		0xB100,		"extsb"},
 | 
						|
{0,		F1_1a,		0xB107,		"extsl"},
 | 
						|
 | 
						|
{0,		F1_1b,		0xB300,		"rl"},
 | 
						|
{0,		F1_1b,		0xB200,		"rlb"},
 | 
						|
{0,		F1_1b,		0xB308,		"rlc"},
 | 
						|
{0,		F1_1b,		0xB208,		"rlcb"},
 | 
						|
{0,		F1_1b,		0xB304,		"rr"},
 | 
						|
{0,		F1_1b,		0xB204,		"rrb"},
 | 
						|
{0,		F1_1b,		0xB30C,		"rrc"},
 | 
						|
{0,		F1_1b,		0xB20C,		"rrcb"},
 | 
						|
 | 
						|
	/* TYPE_12	*/
 | 
						|
{0,		F1_2,		0x2B00,		"dec"},
 | 
						|
{0,		F1_2,		0x2A00,		"decb"},
 | 
						|
{0,		F1_2,		0x2900,		"inc"},
 | 
						|
{0,		F1_2,		0x2800,		"incb"},
 | 
						|
{0,		LDK,		0xBD00,		"ldk"},
 | 
						|
	/* TYPE_1263	*/
 | 
						|
{0,		F1_2F6_3,	0x2700,		"bit"},
 | 
						|
{0,		F1_2F6_3,	0x2600,		"bitb"},
 | 
						|
{0,		F1_2F6_3,	0x2300,		"res"},
 | 
						|
{0,		F1_2F6_3,	0x2200,		"resb"},
 | 
						|
{0,		F1_2F6_3,	0x2500,		"set"},
 | 
						|
{0,		F1_2F6_3,	0x2400,		"setb"},
 | 
						|
 | 
						|
	/* TYPE_jp	*/
 | 
						|
{0,		JP,		0x1E00,		"jp"},
 | 
						|
 | 
						|
{0,		TCC,		0xAF00,		"tcc"},
 | 
						|
{0,		TCC,		0xAE00,		"tccb"},
 | 
						|
 | 
						|
	/* TYPE_21a	*/
 | 
						|
{0,		F2_1,		0x2D00,		"ex"},
 | 
						|
{0,		F2_1,		0x2C00,		"exb"},
 | 
						|
	/* TYPE_21b	*/
 | 
						|
{0,		F2_1,		0x3500,		"adc"},
 | 
						|
{0,		F2_1,		0x3400,		"adcb"},
 | 
						|
{0,		F2_1,		0x3E00,		"rldb"},
 | 
						|
{0,		F2_1,		0x3C00,		"rrdb"},
 | 
						|
{0,		F2_1,		0x3700,		"sbc"},
 | 
						|
{0,		F2_1,		0x3600,		"sbcb"},
 | 
						|
	/* TYPE_2151.
 | 
						|
	**      Depending on their operands the cp-instructions might
 | 
						|
	** have an opcode of 0x201 more then listed below.    This is
 | 
						|
	** added at the appropriate place.
 | 
						|
	** 	The difference in opcode between byte-,word- and long-
 | 
						|
	** instructions of the F2_1F5_1 group is as follows:
 | 
						|
	**   If bit 8 is on it is a word instruction;  If it is not a
 | 
						|
	** word instruction and bit 12 is on it is a long instruction},
 | 
						|
	** else it is a byte instruction.    This information is used
 | 
						|
	** when one of the operands is of type IM.
 | 
						|
	*/
 | 
						|
{0,		F2_1F5_1,	0x0100,		"add"},
 | 
						|
{0,		F2_1F5_1,	0x0000,		"addb"},
 | 
						|
{0,		F2_1F5_1,	0x1600,		"addl"},
 | 
						|
{0,		F2_1F5_1,	0x0700,		"and"},
 | 
						|
{0,		F2_1F5_1,	0x0600,		"andb"},
 | 
						|
{0,		F2_1F5_1,	0x1B00,		"div"},
 | 
						|
{0,		F2_1F5_1,	0x1A00,		"divl"},
 | 
						|
{0,		F2_1F5_1,	0x1900,		"mult"},
 | 
						|
{0,		F2_1F5_1,	0x1800,		"multl"},
 | 
						|
{0,		F2_1F5_1,	0x0500,		"or"},
 | 
						|
{0,		F2_1F5_1,	0x0400,		"orb"},
 | 
						|
{0,		F2_1F5_1,	0x0300,		"sub"},
 | 
						|
{0,		F2_1F5_1,	0x0200,		"subb"},
 | 
						|
{0,		F2_1F5_1,	0x1200,		"subl"},
 | 
						|
{0,		F2_1F5_1,	0x0900,		"xor"},
 | 
						|
{0,		F2_1F5_1,	0x0800,		"xorb"},
 | 
						|
{0,		F2_1F5_1,	0x0B00,		"cp"},
 | 
						|
{0,		F2_1F5_1,	0x0A00,		"cpb"},
 | 
						|
{0,		F2_1F5_1,	0x1000,		"cpl"},
 | 
						|
 | 
						|
{0,		LDA,		0,		"lda"},
 | 
						|
	/* TYPE_pop	*/
 | 
						|
{0,		POP,		0x1700,		"pop"},
 | 
						|
{0,		POP,		0x1500,		"popl"},
 | 
						|
	/* TYPE_push	*/
 | 
						|
{0,		PUSH,		0x1300,		"push"},
 | 
						|
{0,		PUSH,		0x1100,		"pushl"},
 | 
						|
 | 
						|
	/* TYPE_ld	*/
 | 
						|
{0,		LD,		0x0100,		"ld"},
 | 
						|
{0,		LD,		0,		"ldb"},
 | 
						|
{0,		LDL,		0,		"ldl"},
 | 
						|
 | 
						|
{0,		DJNZ,		0xF080,		"djnz"},
 | 
						|
{0,		DJNZ,		0xF000,		"dbjnz"},
 | 
						|
{0,		JR,		0xE000,		"jr"},
 | 
						|
{0,		CALR,		0xD000,		"calr"},
 | 
						|
 | 
						|
	/*     Depending on their operands the LDR-instructions might
 | 
						|
	** have an opcode of 0x200 more then listed below.    This is
 | 
						|
	** or-ed in at the appropriate place.
 | 
						|
	*/
 | 
						|
{0,		LDR,		0x3100,		"ldr"},
 | 
						|
{0,		LDR,		0x3000,		"ldrb"},
 | 
						|
{0,		LDR,		0x3500,		"ldrl"},
 | 
						|
 | 
						|
{0,		LDAR,		0x3400,		"ldar"},
 | 
						|
 | 
						|
{0,		F5_1L,		0xB309,		"sla"},
 | 
						|
{0,		F5_1L,		0xB209,		"slab"},
 | 
						|
{0,		F5_1L,		0xB30D,		"slal"},
 | 
						|
{0,		F5_1L,		0xB301,		"sll"},
 | 
						|
{0,		F5_1L,		0xB201,		"sllb"},
 | 
						|
{0,		F5_1L,		0xB305,		"slll"},
 | 
						|
{0,		F5_1R,		0xB309,		"sra"},
 | 
						|
{0,		F5_1R,		0xB209,		"srab"},
 | 
						|
{0,		F5_1R,		0xB30D,		"sral"},
 | 
						|
{0,		F5_1R,		0xB301,		"srl"},
 | 
						|
{0,		F5_1R,		0xB201,		"srlb"},
 | 
						|
{0,		F5_1R,		0xB305,		"srll"},
 | 
						|
 | 
						|
	/*    Depending on its operands the LDM-instruction might have
 | 
						|
	** an opcode of 8 more then listed below.  This is added at the
 | 
						|
	** appropriate place.
 | 
						|
	** TYPE_ldm
 | 
						|
	*/
 | 
						|
{0,		LDM,		0x1C01,		"ldm"},
 | 
						|
 | 
						|
	/*   For the F6.4 instructions below the yylval-column contains
 | 
						|
	** the opcode for the instruction. However the third hexa-digit
 | 
						|
	** should be 0;   But this is the opcode which must be put into
 | 
						|
	** the second word of the instruction!
 | 
						|
	*/
 | 
						|
{0,		F6_4,		0x3B88,		"ind"},
 | 
						|
{0,		F6_4,		0x3A88,		"indb"},
 | 
						|
{0,		F6_4,		0x3B08,		"indr"},
 | 
						|
{0,		F6_4,		0x3A08,		"indrb"},
 | 
						|
{0,		F6_4,		0x3B80,		"ini"},
 | 
						|
{0,		F6_4,		0x3A80,		"inib"},
 | 
						|
{0,		F6_4,		0x3B00,		"inir"},
 | 
						|
{0,		F6_4,		0x3A00,		"inirb"},
 | 
						|
{0,		F6_4,		0xBB89,		"ldd"},
 | 
						|
{0,		F6_4,		0xBA89,		"lddb"},
 | 
						|
{0,		F6_4,		0xBB09,		"lddr"},
 | 
						|
{0,		F6_4,		0xBA09,		"lddrb"},
 | 
						|
{0,		F6_4,		0xBB81,		"ldi"},
 | 
						|
{0,		F6_4,		0xBA81,		"ldib"},
 | 
						|
{0,		F6_4,		0xBB01,		"ldir"},
 | 
						|
{0,		F6_4,		0xBA01,		"ldirb"},
 | 
						|
{0,		F6_4,		0x3B0A,		"otdr"},
 | 
						|
{0,		F6_4,		0x3A0A,		"otdrb"},
 | 
						|
{0,		F6_4,		0x3B02,		"otir"},
 | 
						|
{0,		F6_4,		0x3A02,		"otirb"},
 | 
						|
{0,		F6_4,		0x3B8A,		"outd"},
 | 
						|
{0,		F6_4,		0x3A8A,		"outdb"},
 | 
						|
{0,		F6_4,		0x3B82,		"outi"},
 | 
						|
{0,		F6_4,		0x3A82,		"outib"},
 | 
						|
{0,		F6_4,		0x3B89,		"sind"},
 | 
						|
{0,		F6_4,		0x3A89,		"sindb"},
 | 
						|
{0,		F6_4,		0x3B09,		"sindr"},
 | 
						|
{0,		F6_4,		0x3A09,		"sindrb"},
 | 
						|
{0,		F6_4,		0x3B81,		"sini"},
 | 
						|
{0,		F6_4,		0x3A81,		"sinib"},
 | 
						|
{0,		F6_4,		0x3B01,		"sinir"},
 | 
						|
{0,		F6_4,		0x3A01,		"sinirb"},
 | 
						|
{0,		F6_4,		0x3B0B,		"sotdr"},
 | 
						|
{0,		F6_4,		0x3A0B,		"sotdrb"},
 | 
						|
{0,		F6_4,		0x3B03,		"sotir"},
 | 
						|
{0,		F6_4,		0x3A03,		"sotirb"},
 | 
						|
{0,		F6_4,		0x3B8B,		"soutd"},
 | 
						|
{0,		F6_4,		0x3A8B,		"soutdb"},
 | 
						|
{0,		F6_4,		0x3B83,		"souti"},
 | 
						|
{0,		F6_4,		0x3A83,		"soutib"},
 | 
						|
{0,		F6_4,		0xB808,		"trdb"},
 | 
						|
{0,		F6_4,		0xB80C,		"trdrb"},
 | 
						|
{0,		F6_4,		0xB800,		"trib"},
 | 
						|
{0,		F6_4,		0xB804,		"trirb"},
 | 
						|
{0,		F6_4,		0xB80A,		"trtdb"},
 | 
						|
{0,		F6_4,		0xB8EE,		"trtdrb"},
 | 
						|
{0,		F6_4,		0xB802,		"trtib"},
 | 
						|
{0,		F6_4,		0xB8E6,		"trtirb"},
 | 
						|
 | 
						|
	/*   From the F6.5 instructions below the last eight ('string'-
 | 
						|
	** instructions) want an 'ir' as operand; The others want a 'r'.
 | 
						|
	** In the opcode for the string-instructions bit 1 is on, which
 | 
						|
	** indicates the difference.
 | 
						|
	*/
 | 
						|
{0,		F6_5,		0xBB08,		"cpd"},
 | 
						|
{0,		F6_5,		0xBA08,		"cpdb"},
 | 
						|
{0,		F6_5,		0xBB0C,		"cpdr"},
 | 
						|
{0,		F6_5,		0xBA0C,		"cpdrb"},
 | 
						|
{0,		F6_5,		0xBB00,		"cpi"},
 | 
						|
{0,		F6_5,		0xBA00,		"cpib"},
 | 
						|
{0,		F6_5,		0xBB04,		"cpir"},
 | 
						|
{0,		F6_5,		0xBA04,		"cpirb"},
 | 
						|
{0,		F6_5,		0xBB0A,		"cpsd"},
 | 
						|
{0,		F6_5,		0xBA0A,		"cpsdb"},
 | 
						|
{0,		F6_5,		0xBB0E,		"cpsdr"},
 | 
						|
{0,		F6_5,		0xBA0E,		"cpsdrb"},
 | 
						|
{0,		F6_5,		0xBB02,		"cpsi"},
 | 
						|
{0,		F6_5,		0xBA02,		"cpsib"},
 | 
						|
{0,		F6_5,		0xBB06,		"cpsir"},
 | 
						|
{0,		F6_5,		0xBA06,		"cpsirb"},
 | 
						|
 | 
						|
{0,		F6_6,		0xB30B,		"sda"},
 | 
						|
{0,		F6_6,		0xB20B,		"sdab"},
 | 
						|
{0,		F6_6,		0xB30F,		"sdal"},
 | 
						|
{0,		F6_6,		0xB303,		"sdl"},
 | 
						|
{0,		F6_6,		0xB203,		"sdlb"},
 | 
						|
{0,		F6_6,		0xB307,		"sdll"},
 | 
						|
 | 
						|
	/* The instructions in\b and out\b have two different opcodes
 | 
						|
	** depending on their operands (...).   Therefore the opcodes
 | 
						|
	** below are not complete.    The rest is or-ed in at the ap-
 | 
						|
	** propriate place!
 | 
						|
	**	rest	|  r and da	r and ir
 | 
						|
	**	---------------------------------
 | 
						|
	**	in\b	|   0xA04	0xC00
 | 
						|
	**	out\b	|   0xA06	OxE00
 | 
						|
	** Furthermore the 'special'-instructions don't allow an 'ir'
 | 
						|
	** as operand.   In their opcode bit 0 is on, which indicates
 | 
						|
	** the difference with the other instructions of this group.
 | 
						|
	*/
 | 
						|
{0,		IN,		0x3100,		"in"},
 | 
						|
{0,		IN,		0x3000,		"inb"},
 | 
						|
{0,		IN,		0x3B05,		"sin"},
 | 
						|
{0,		IN,		0x3A05,		"sinb"},
 | 
						|
{0,		OUT,		0x3100,		"out"},
 | 
						|
{0,		OUT,		0x3000,		"outb"},
 | 
						|
{0,		OUT,		0x3B07,		"sout"},
 | 
						|
{0,		OUT,		0x3A07,		"soutb"},
 | 
						|
 | 
						|
	/*   Depending on their operands the LDCTL-instructions might
 | 
						|
	** have an opcode of 8 more then listed below.  This is or-ed
 | 
						|
	** in at the appropriate place.
 | 
						|
	*/
 | 
						|
{0,		LDCTL,		0x7D00,		"ldctl"},
 | 
						|
{0,		LDCTLB,		0x8C00,		"ldctlb"},
 | 
						|
{0,		MREQ,		0x7B0D,		"mreq"},
 | 
						|
 | 
						|
{0,		F9_1,		0x8D05,		"comflg"},
 | 
						|
{0,		F9_1,		0x8D03,		"resflg"},
 | 
						|
{0,		F9_1,		0x8D01,		"setflg"},
 | 
						|
 | 
						|
{0,		F9_2,		0x7C00,		"di"},
 | 
						|
{0,		F9_2,		0x7C04,		"ei"},
 | 
						|
 | 
						|
{0,		F9_3,		0x7A00,		"halt"},
 | 
						|
{0,		F9_3,		0x7B00,		"iret"},
 | 
						|
{0,		F9_3,		0x7B0A,		"mbit"},
 | 
						|
{0,		F9_3,		0x7B09,		"mres"},
 | 
						|
{0,		F9_3,		0x7B08,		"mset"},
 | 
						|
{0,		F9_3,		0x8D07,		"nop"},
 | 
						|
 | 
						|
	/* Rest of the opcode-0x200 is or-ed in at the appropriate place
 | 
						|
	*/
 | 
						|
{0,		RET,		0x9E00,		"ret"},
 | 
						|
{0,		SC,		0x7F00,		"sc"},
 |