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