/*
 * (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 "$Header$"

/*
** 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",