370 lines
10 KiB
C
370 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"},
|