Home | History | Annotate | Line # | Download | only in gspa
      1 /*	$NetBSD: gsp_ass.h,v 1.13 2011/08/30 18:53:41 joerg 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 
     40 typedef char	bool;
     41 #define TRUE	1
     42 #define FALSE	0
     43 
     44 #define YYDEBUG	1
     45 
     46 /* Structure for symbol in symbol table */
     47 typedef 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 */
     65 struct numlab {
     66 	unsigned	value;
     67 	unsigned	lineno;
     68 	struct numlab	*next;
     69 };
     70 
     71 /* Structure for expressions */
     72 typedef 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 */
     94 typedef 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 */
    128 operand abs_adr(expr);
    129 operand add_operand(operand, operand);
    130 expr bexpr(int, expr, expr);
    131 void do_asg(char *, expr, int flags);
    132 void do_list_pc(void);
    133 void do_show_val(int32_t);
    134 int eval_expr(expr, int32_t *, unsigned *);
    135 operand expr_op(expr);
    136 expr fold(expr);
    137 void free_expr(expr);
    138 void free_operands(operand);
    139 int get_line(char *lp, int maxlen);
    140 expr here_expr(void);
    141 expr id_expr(char *);
    142 void lex_init(char *line);
    143 void list_error(char *);
    144 void listing(void);
    145 symbol lookup(char *id, bool makeit);
    146 expr num_expr(int);
    147 void p1err(const char *fmt, ...) __printflike(1, 2);
    148 void perr(const char *fmt, ...) __printflike(1, 2);
    149 void pseudo(int code, operand operands);
    150 void push_input(char *fn);
    151 void putcode(u_int16_t *, int);
    152 operand reg_ind(int, int);
    153 operand reg_index(int, expr);
    154 operand reg_indxy(int, char *);
    155 operand reg_op(int reg);
    156 void reset_numeric_labels(void);
    157 void set_label(char *);
    158 void set_numeric_label(int);
    159 void start_at(u_int32_t);
    160 void statement(char *opcode, operand operands);
    161 operand string_op(char *);
    162 void ucasify(char *);
    163 __dead void yyerror(const char *err);
    164 int yylex(void);
    165 
    166 
    167 extern unsigned pc;
    168 extern short pass2;
    169 
    170 extern unsigned lineno;
    171 extern int err_count;
    172 extern 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