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