diff old-trunk/lwasm/old/lwasm.h @ 339:eb230fa7d28e

Prepare for migration to hg
author lost
date Fri, 19 Mar 2010 02:54:14 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/old-trunk/lwasm/old/lwasm.h	Fri Mar 19 02:54:14 2010 +0000
@@ -0,0 +1,254 @@
+/*
+lwasm.h
+Copyright © 2008 William Astle
+
+This file is part of LWASM.
+
+LWASM is free software: you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation, either version 3 of the License, or (at your option) any later
+version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+more details.
+
+You should have received a copy of the GNU General Public License along with
+this program. If not, see <http://www.gnu.org/licenses/>.
+
+Contains the main defs used by the assembler
+*/
+
+
+#ifndef __lwasm_h_seen__
+#define __lwasm_h_seen__
+
+#include <stdio.h>
+#include "expr.h"
+
+#define OUTPUT_DECB		0	// DECB multirecord format
+#define OUTPUT_RAW		1	// raw sequence of bytes
+#define OUTPUT_OBJ		2	// proprietary object file format
+#define OUTPUT_RAWREL	3	// raw bytes where ORG causes a SEEK in the file
+#define OUTPUT_OS9		4	// os9 module target
+
+// structure for tracking sections
+typedef struct section_reloc_list_s section_reloc_list_t;
+struct section_reloc_list_s
+{
+	int offset;						// offset into section
+	int relocsize;					// size of relocation in bytes
+	lwasm_expr_stack_t *expr;		// value definition
+	int context;					// symbol context (for local syms)
+	section_reloc_list_t *next;		// next relocation
+};
+
+typedef struct export_list_s export_list_t;
+struct export_list_s
+{
+	int offset;						// offset of symbol
+	char *sym;						// name of symbol
+	export_list_t *next;			// next export	
+};
+
+#define SECTION_BSS		1	// the section contains no actual code - just uninit vars
+typedef struct sectiontab_s sectiontab_t;
+struct sectiontab_s
+{
+	char *name;				// name of the section
+	int offset;				// current offset in the section
+	int flags;				// section flags
+	sectiontab_t *next;		// next section
+	// the following are used during code output
+	unsigned char *obytes;	// output bytes
+	int oblen;				// how many bytes output so far?
+	int obsize;				// how big is output buffer so far?
+	section_reloc_list_t *rl;	// relocation list
+	export_list_t *exports;	// export list for the section
+};
+
+// structure for tracking macros
+typedef struct macrotab_s macrotab_t;
+struct macrotab_s
+{
+	char *name;
+	char **lines;
+	int numlines;
+	macrotab_t *next;
+};
+
+// structure for tracking errors
+typedef struct lwasm_error_s lwasm_error_t;
+struct lwasm_error_s
+{
+	char *mess;				// the actual error message
+	lwasm_error_t *next;	// ptr to next error
+};
+
+// structure for keeping track of lines
+// it also as space for 4 expressions which is enough for all known
+// instructions and addressing modes
+// on pass 1, the expressions are parsed, on pass 2 they are re-evaluated
+// to determine constancy
+typedef struct lwasm_line_s lwasm_line_t;
+struct lwasm_line_s {
+	char *text;			// the actual text of the line
+	int lineno;			// line number within the file
+	char *filename;		// file name reference
+	lwasm_line_t *next;	// next line
+	lwasm_line_t *prev;	// previous line
+	lwasm_error_t *err;	// error messages
+	int fsize;			// forced size (0 = no forced size)
+	char *sym;			// scratch area to record the presence of a symbol
+	unsigned char *bytes;	// actual bytes emitted
+	int codelen;		// number of bytes emitted
+	int codesize;		// the size of the code buffer
+	int codeaddr;		// address the code goes at
+	int nocodelen;		// for "RMB" type instructions
+	int addrset;		// set if this instruction sets the assembly address
+	int symaddr;		// set if this instruction sets a symbol addr with EQU or the like
+	int badop;			// bad operation - ignore it
+	int context;		// the symbol context for this line
+	int forceglobal;	// force a "global" symbol definition if constant
+	
+	// the following are used for obj format - for external references, inter-section
+	// references, and intrasection relocations
+	int relocoff;		// offset into insn where relocation value goes
+	int reloc8bit;		// size of relocation (0 = 16 bit, 1 = 8 bit)
+	lwasm_expr_stack_t *exprs[4];	// non-constant expression values
+	int exprvals[4];	// constant expression values
+	char *exprends[4];	// pointer to character after end of expression
+	int inmod;			// in an os9 module
+	
+	sectiontab_t *sect;	// which section is the line in?
+};
+
+// for keeping track of symbols
+#define	SYMBOL_SET		1	// the symbol was used for "SET"
+#define SYMBOL_COMPLEX	2	// register symbol as a complex symbol (from l -> expr)
+#define SYMBOL_FORCE	4	// force resetting the symbol value if it already exists on pass 2
+#define SYMBOL_NORM		0	// no flags
+#define SYMBOL_EXTERN	8	// the symbol is an external reference
+#define SYMBOL_GLOBAL	16	// force global if non-complex symbol
+typedef struct lwasm_symbol_ent_s lwasm_symbol_ent_t;
+struct lwasm_symbol_ent_s
+{
+	char *sym;					// the symbol
+	int context;				// the context number of the symbol (-1 for global)
+	int value;					// the value of the symbol
+	int flags;					// flags for the symbol
+	char *externalname;			// for external references that are aliased locally
+	sectiontab_t *sect;			// the section the symbol exists in; NULL for none
+	lwasm_expr_stack_t *expr;	// expression for a symbol that is not constant NULL for const
+	lwasm_symbol_ent_t *next;	// next symbol in the table
+	lwasm_symbol_ent_t *prev;	// previous symbol in the table
+};
+
+// keep track of current assembler state
+typedef struct {
+	int dpval;					// current dp value (setdp)
+	int addr;					// current address
+	int context;				// context counter (for local symbols)
+	int errorcount;				// error count
+	int passnum;				// which pass are we on?
+	int execaddr;				// execution address for the program (END ....)
+	int pragmas;				// what pragmas are in effect?
+
+	lwasm_line_t *lineshead;	// first line of source code
+	lwasm_line_t *linestail;	// last line of source code
+	
+	lwasm_symbol_ent_t *symhead;	// first entry in symbol table
+	lwasm_symbol_ent_t *symtail;	// last entry in symbol table
+	
+	macrotab_t *macros;			// macro table
+
+	const char *infile;			// input file
+	const char *outfile;		// output file
+	const char *listfile;		// output listing file
+	int outformat;				// output format type
+	char **filelist;			// files that have been read
+	int filelistlen;			// number of files in the list
+	
+	int endseen;				// set to true if "end" has been seen
+	int skipcond;				// skipping a condition?
+	int skipcount;				// how many?
+	int skipmacro;				// skipping a macro?
+	int inmacro;				// are we currently in a macro?
+	int macroex;				// current depth of macro expansion
+	int nextcontext;			// next context number
+	int skiplines;				// number of lines to skip
+	
+	// items used only for the "object" target
+	sectiontab_t *sections;		// pointer to section table
+	sectiontab_t *csect;		// current section - NULL if not in one
+	
+	// only 6809 ops?
+	int no6309;	
+	
+	// for os9 mode
+	int inmod;					// in a module?
+	unsigned char crc[3];			// running crc count
+} asmstate_t;
+
+// do not rewrite XXX,r to ,r if XXX evaluates to 0
+#define PRAGMA_NOINDEX0TONONE	1
+// any undefined symbols are considered external
+#define PRAGMA_UNDEFEXTERN		2
+// allow C-style escapes in fcc, fcs, and fcn directives
+#define PRAGMA_CESCAPES			4
+// allow "export <undefsym>" to import the symbol
+#define PRAGMA_IMPORTUNDEFEXPORT	8
+// don't have $ as a local symbol
+#define PRAGMA_DOLLARNOTLOCAL	16
+
+#ifndef __lwasm_c_seen__
+#define __lwasm_E__ extern
+#else
+#define __lwasm_E__
+#endif
+
+__lwasm_E__ int debug_level;
+
+__lwasm_E__ int register_error(asmstate_t *as, lwasm_line_t *l, int pass, const char *fmt, ...);
+__lwasm_E__ void debug_message(int level, const char *fmt, ...);
+
+__lwasm_E__ void lwasm_emit(asmstate_t *as, lwasm_line_t *l, int b);
+__lwasm_E__ void lwasm_emitop(asmstate_t *as, lwasm_line_t *l, int o);
+__lwasm_E__ int lwasm_lookupreg2(const char *reglist, char **str);
+__lwasm_E__ int lwasm_lookupreg3(const char *rlist, const char **str);
+
+__lwasm_E__ lwasm_expr_stack_t *lwasm_evaluate_expr(asmstate_t *as, lwasm_line_t *l, const char *inp, const char **outp, int flags);
+
+
+// return next context number and update it
+__lwasm_E__ int lwasm_next_context(asmstate_t *as);
+
+// also throw an error on expression eval failure
+// return 0 on ok, -1 on error, 1 if a complex expression was returned
+#define EXPR_NOFLAG			0
+#define EXPR_PASS1CONST		1	// no forward references on pass 1
+#define EXPR_SECTCONST		2	// resolve symbols local to section
+#define EXPR_REEVAL			4	// re-evaluate the expression
+__lwasm_E__ int lwasm_expr_result(asmstate_t *as, lwasm_line_t *l, char **inp, int flag, int *val);
+__lwasm_E__ int lwasm_expr_result2(asmstate_t *as, lwasm_line_t *l, char **inp, int flag, int *val, int slot);
+
+#undef __lwasm_E__
+
+
+#ifndef __symbol_c_seen__
+#define __lwasm_E__ extern
+#else
+#define __lwasm_E__
+#endif
+
+__lwasm_E__ int lwasm_register_symbol(asmstate_t *as, lwasm_line_t *l, char *sym, int val, int flags);
+__lwasm_E__ lwasm_symbol_ent_t *lwasm_find_symbol(asmstate_t *as, char *sym, int scontext);
+__lwasm_E__ int lwasm_set_symbol(asmstate_t *as, char *sym, int scontext, int val);
+__lwasm_E__ void lwasm_list_symbols(asmstate_t *as, FILE *f);
+#undef __lwasm_E__
+
+
+#define skip_operand(p) do { char **p2 = (char **)(p); for ( ; **p2; (*p2)++ ) ; } while (0)
+
+#endif //__lwasm_h_seen__