|
|
1.1 root 1: /* @(#)as.h 1.1 86/02/03 SMI */
2:
3: /*
4: * Copyright (c) 1985 by Sun Microsystems, Inc.
5: */
6:
7: #include <stdio.h>
8:
9: /* Assembler parameters */
10: #define FILES_MAX 10 /* Max number of source files read */
11: #define STR_MAX 32 /* number of chars in any single token */
12: #define OPERANDS_MAX 6 /* number of operands allowed per instruction */
13: #define HASH_MAX 256 /* size of symbol, command, and macro hash tables */
14: #define CODE_MAX 12 /* number of bytes generated for 1 machine instruction */
15:
16: /* Error Codes -- See error.c */
17:
18: typedef enum { E_NOERROR = 0, E_BADCHAR, E_MULTSYM, E_NOSPACE, E_OFFSET,
19: E_SYMLEN, E_SYMDEF, E_CONSTANT, E_TERM, E_OPERATOR,
20: E_RELOCATE, E_TYPE, E_OPERAND, E_SYMBOL, E_EQUALS,
21: E_NLABELS, E_OPCODE, E_STRING, E_PHASE,
22: E_NUMOPS, E_LINELONG, E_REG, E_IADDR, E_PAREN,
23: E_ODDADDR, E_UNDEFINED_L, E_REGLIST
24: } err_code;
25:
26: /* Symbol attributes */
27: #define S_DEC 01
28: #define S_DEF 02
29: #define S_EXT 04
30: #define S_LABEL 010
31: #define S_CRT 020
32: #define S_REG 040
33: #define S_LOCAL 0100
34: #define S_COMM 0200
35: #define S_PERM 0400
36:
37: #include "inst.h"
38:
39: #include "oper.h"
40:
41: /* local names for csects */
42: #define C_UNDEF 0
43: #define C_TEXT 1
44: #define C_DATA 2
45: #define C_DATA1 3
46: #define C_DATA2 4
47: #define C_BSS 5
48:
49: /* Symbol bucket definition */
50: struct sym_bkt {
51: char *name_s; /* symbol identifier */
52: struct sym_bkt *next_s; /* next bkt on linked list */
53: long value_s; /* it's value */
54: #if AS
55: short id_s; /* id number for .b file */
56: int final;
57: #endif
58: #if C2
59: char builtin_s[4]; /* read-write attributes for D0,D1,A0,A1 */
60: #endif
61: short attr_s; /* attributes */
62: short csect_s; /* name of its csect */
63: short nuse_s; /* number of references */
64: struct node *where_s; /* first use, or defining node */
65: };
66:
67: extern char *soperand(),*exp();
68: extern char iline[],code[];
69: extern short cinfo[];
70: extern int numops, errors, line_no;
71: extern struct oper operands[];
72: extern struct ins_ptr *ins_hash_tab[];
73: extern struct sym_bkt *lookup();
74: extern struct sym_bkt *last_symbol;
75: extern struct sym_bkt *dot_bkt;
76: extern struct ins_bkt *sopcode();
77: extern long dot;
78: extern short cur_csect_name;
79: extern char rel_name[], *source_name;
80: extern int pass, bc;
81:
82: #if AS
83: extern int d2flag, jsrflag, pcflag, rflag;
84: #ifdef EBUG
85: extern int debflag;
86: #endif
87: extern long tsize, dsize, d1size, d2size, bsize;
88: extern int code_length; /* number of bytes in WCode */
89: /* complain during second pass only */
90: #define PROG_ERROR( n ) {if(pass == 2)prog_error( n );}
91: #endif
92: #if C2
93: #define PROG_ERROR( n ) prog_error( n )
94: #endif
95:
96: /* skip to next non-spacing character */
97: #define skipb(p) while (cinfo[*p] == SPC) p++
98:
99: /* skip to end of symbol */
100: #define skips(p) while (cinfo[*p] & T) p++
101:
102: #if C2
103: # define C2MAGIC "|#"
104: # define C2MAGICSIZE 2
105: extern char * p2pseudocomment();
106: #endif
107:
108: /* some register names (indexes into the register table) */
109: /* also used as bit indexes in register mask structures! */
110: # define D0REG 0
111: # define D7REG 7
112: # define A0REG 8
113: # define A6REG 14
114: # define A7REG 15
115: # define FPREG A6REG
116: # define SPREG A7REG
117: # define FP0REG 16
118: # define FP7REG 23
119: # define CCREG 24
120: # define FPCCREG 25
121: # define PCREG 26
122: # define SRREG 27
123: # define USPREG 28
124: # define FPCREG 36
125: # define FPSREG 37
126: # define FPIREG 38
127:
128: /* what the registers are good for */
129: extern /* const */ unsigned reg_access[];
130: #define ctrl_reg(reg) (reg_access[(reg)]&AM_CTRLREG)
131: #define dreg(reg) (reg_access[(reg)]&AM_DREG)
132: #define areg(reg) (reg_access[(reg)]&AM_AREG)
133: #define freg(reg) (reg_access[(reg)]&AM_FREG)
134: #define dareg(reg) (reg_access[(reg)]&(AM_AREG|AM_DREG))
135: #define datareg(reg) (reg_access[(reg)]&(AM_AREG|AM_DREG|AM_FREG))
136: #define pcreg(reg) (reg_access[(reg)]&AM_PCREG)
137: #define srreg(reg) (reg_access[(reg)]&AM_CCREG)
138: #define sr_addr(op) ((op)->type_o==T_REG && srreg((op)->value_o))
139: #define usp_addr(op) ((op)->type_o==T_REG && (reg_access[(op)->value_o]&AM_USPREG))
140: #define dreg_addr(op) ((op)->type_o==T_REG && dreg((op)->value_o))
141: #define areg_addr(op) ((op)->type_o==T_REG && areg((op)->value_o))
142: #define freg_addr(op) ((op)->type_o==T_REG && freg((op)->value_o))
143: #define dareg_addr(op) ((op)->type_o==T_REG && dareg((op)->value_o))
144: #define datareg_addr(op) ((op)->type_o==T_REG && datareg((op)->value_o))
145: #define fctrlreg_addr(op) ((op)->type_o==T_REG && (reg_access[(op)->value_o]&AM_FCTRLREG))
146:
147: /* bits found in character info array cinfo[] */
148: #define D 0x0100 /* digit */
149: #define S 0x0200 /* can start symbol */
150: #define T 0x0400 /* can be part of symbol */
151:
152: #define COL 0x00 /* label definition */
153: #define EQL 0x01 /* label assignment */
154: #define EOL 0x02 /* end of line -- newline or comment char */
155: #define ADD 0x03 /* addition operator */
156: #define SUB 0x04 /* subtraction operator */
157: #define SPC 0x05 /* spacing character */
158: #define ERR 0x06 /* illegal character */
159: #define IMM 0x07 /* immediate operand indicator */
160: #define LP 0x08 /* left paren */
161: #define RP 0x09 /* right paren */
162: #define COM 0x0A /* operand separator */
163: #define IND 0x0B /* indirection operator */
164: #define MUL 0x0C /* multiplication operator */
165: #define NOT 0x0D /* complement operator */
166: #define QUO 0x0E /* beginning/end of string */
167: #define DIV 0x0F /* division operator */
168: #define LB 0x10 /* left square bracket */
169: #define RB 0x11 /* right square bracket */
170:
171: #if AS
172: /* flavors of sdi's */
173: #define SDI4 0
174: #define SDI6 1
175: #define SDI8 2
176: #define SDIP 3
177: #define SDIX 4
178: #define SDIL 5
179: #endif AS
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.