+/*
+ * Redefinitions of the fields in symtab for
+ * use when the symbol table entry marks a jxxx instruction.
+ */
+#define s_jxbump s_ptype /* tag == JX..., how far to expand */
+#define s_jxfear s_desc /* how far needs to be bumped */
+/*
+ * Redefinitions of fields in the struct nlist for symbols so that
+ * one saves typing, and so that they conform
+ * with the old naming conventions.
+ */
+#ifdef FLEXNAMES
+#define s_name s_nm.n_un.n_name /* name pointer */
+#define s_nmx s_nm.n_un.n_strx /* string table index */
+#else not FLEXNAMES
+#define s_name s_nm.n_name
+#endif
+#define s_type s_nm.n_type /* type of the symbol */
+#define s_other s_nm.n_other /* other information for sdb */
+#define s_desc s_nm.n_desc /* type descriptor */
+#define s_value s_nm.n_value /* value of the symbol, or sdb delta */
+
+struct instab{
+ struct nlist s_nm; /* instruction name, type (opcode) */
+ u_char s_tag;
+ u_char s_eopcode;
+ char s_pad[2]; /* round to 20 bytes */
+};
+typedef struct instab *Iptr;
+/*
+ * The fields nm.n_desc and nm.n_value total 6 bytes; this is
+ * just enough for the 6 bytes describing the argument types.
+ * We use a macro to define access to these 6 bytes, assuming that
+ * they are allocated adjacently.
+ * IF THE FORMAT OF STRUCT nlist CHANGES, THESE MAY HAVE TO BE CHANGED.
+ *
+ * Instab is cleverly declared to look very much like the combination of
+ * a struct symtab and a struct nlist.
+ */
+/*
+ * With the 1981 VAX architecture reference manual,
+ * DEC defined and named two byte opcodes.
+ * In addition, DEC defined four new one byte instructions for
+ * queue manipulation.
+ * The assembler was patched in 1982 to reflect this change.
+ *
+ * The two byte opcodes are preceded with an escape byte
+ * (usually an ESCD) and an opcode byte.
+ * For one byte opcodes, the opcode is called the primary opcode.
+ * For two byte opcodes, the second opcode is called the primary opcode.
+ *
+ * We store the primary opcode in I_popcode,
+ * and the escape opcode in I_eopcode.
+ *
+ * For one byte opcodes in the basic arhitecture,
+ * I_eopcode is CORE
+ * For one byte opcodes in the new architecture definition,
+ * I_eopcode is NEW
+ * For the two byte opcodes, I_eopcode is the escape byte.
+ *
+ * The assembler checks if a NEW or two byte opcode is used,
+ * and issues a warning diagnostic.
+ */
+/*
+ * For upward compatability reasons, we can't have the two opcodes
+ * forming an operator specifier byte(s) be physically adjacent
+ * in the instruction table.
+ * We define a structure and a constructor that is used in
+ * the instruction generator.
+ */
+struct Opcode{
+ u_char Op_eopcode;
+ u_char Op_popcode;
+};