1/*	$NetBSD: gsp_ass.h,v 1.12 2009/04/15 08:26:34 lukem Exp $	*/
2/*
3 * GSP assembler - definitions
4 *
5 * Copyright (c) 1993 Paul Mackerras.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 *    must display the following acknowledgement:
18 *      This product includes software developed by Paul Mackerras.
19 * 4. The name of the author may not be used to endorse or promote products
20 *    derived from this software without specific prior written permission
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34#include <stddef.h>
35#include <sys/types.h>
36#include <err.h>
37
38#define MAXLINE		133
39
40typedef char	bool;
41#define TRUE	1
42#define FALSE	0
43
44#define YYDEBUG	1
45
46/* Structure for symbol in symbol table */
47typedef struct symbol {
48	int16_t	flags;
49	int16_t	ndefn;
50	unsigned	value;
51	unsigned	lineno;
52	struct symbol	*next;
53	struct numlab	*nlab;
54	char		name[1];
55} *symbol;
56
57/* Values for flags */
58#define DEFINED		1
59#define SET_LABEL	2
60#define NUMERIC_LABEL	4
61
62#define NOT_YET		65535U		/* line no. for `not defined yet' */
63
64/* Info about successive numeric labels */
65struct numlab {
66	unsigned	value;
67	unsigned	lineno;
68	struct numlab	*next;
69};
70
71/* Structure for expressions */
72typedef struct expr {
73	int	e_op;
74	union {
75		struct {
76			struct expr *left;
77			struct expr *right;
78		} e_s;
79		symbol	sym;
80		int32_t	val;
81	} e_u;
82} *expr;
83#define e_left	e_u.e_s.left
84#define e_right	e_u.e_s.right
85#define e_sym	e_u.sym
86#define e_val	e_u.val
87
88/* Operators other than '+', '-', etc. */
89#define SYM	1
90#define CONST	2
91#define NEG	3
92
93/* Structure for an operand */
94typedef struct operand {
95	char	type;
96	char	mode;			/* EA mode */
97	int16_t	reg_no;
98	union {
99		expr	value;
100		char	*string;
101	} op_u;
102	struct operand	*next;
103} *operand;
104
105/* Values for operand type */
106#define REG	1		/* register operand */
107#define EXPR	2		/* expression operand */
108#define EA	4		/* effective address */
109#define STR_OPN	8		/* string operand */
110
111/* Addressing modes */
112/* NB codes for modes with an expression must be > other modes */
113#define M_REG		0	/* R */
114#define M_IND		1	/* *R */
115#define M_POSTINC	2	/* *R+ */
116#define M_PREDEC	3	/* *-R */
117#define M_INDXY		4	/* *R.XY (pixt only) */
118#define M_INDEX		5	/* *R(n) */
119#define M_ABSOLUTE	6	/* @adr */
120
121/* Register names */
122#define GSPA_A0	0x20
123#define GSPA_B0	0x50
124#define GSPA_SP	0x6F		/* (r1 & r2 & REGFILE) != 0 iff */
125#define GSPA_REGFILE	0x60	/* r1 and r2 are in the same file */
126
127/* Prototypes */
128operand abs_adr(expr);
129operand add_operand(operand, operand);
130expr bexpr(int, expr, expr);
131void do_asg(char *, expr, int flags);
132void do_list_pc(void);
133void do_show_val(int32_t);
134int eval_expr(expr, int32_t *, unsigned *);
135operand expr_op(expr);
136expr fold(expr);
137void free_expr(expr);
138void free_operands(operand);
139int get_line(char *lp, int maxlen);
140expr here_expr(void);
141expr id_expr(char *);
142void lex_init(char *line);
143void list_error(char *);
144void listing(void);
145symbol lookup(char *id, bool makeit);
146expr num_expr(int);
147void p1err(const char *fmt, ...) __printflike(1, 2);
148void perr(const char *fmt, ...) __printflike(1, 2);
149void pseudo(int code, operand operands);
150void push_input(char *fn);
151void putcode(u_int16_t *, int);
152operand reg_ind(int, int);
153operand reg_index(int, expr);
154operand reg_indxy(int, char *);
155operand reg_op(int reg);
156void reset_numeric_labels(void);
157void set_label(char *);
158void set_numeric_label(int);
159void start_at(u_int32_t);
160void statement(char *opcode, operand operands);
161operand string_op(char *);
162void ucasify(char *);
163__dead void yyerror(const char *err);
164int yylex(void);
165
166
167extern unsigned pc;
168extern short pass2;
169
170extern unsigned lineno;
171extern int err_count;
172extern char line[], *lineptr;
173
174#if defined(sparc) && !defined(__NetBSD__)
175#include <alloca.h>
176#else
177#ifdef __GNUC__
178#define alloca __builtin_alloca
179#endif
180#endif
181
182#define new(x)	((x) = emalloc(sizeof(*(x))))
183