comparison lwasm/lwasm.h @ 0:2c24602be78f

Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
author lost@l-w.ca
date Wed, 19 Jan 2011 22:27:17 -0700
parents
children 7317fbe024af
comparison
equal deleted inserted replaced
-1:000000000000 0:2c24602be78f
1 /*
2 lwasm.h
3
4 Copyright © 2010 William Astle
5
6 This file is part of LWTOOLS.
7
8 LWTOOLS is free software: you can redistribute it and/or modify it under the
9 terms of the GNU General Public License as published by the Free Software
10 Foundation, either version 3 of the License, or (at your option) any later
11 version.
12
13 This program is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 more details.
17
18 You should have received a copy of the GNU General Public License along with
19 this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21
22 #ifndef ___lwasm_h_seen___
23 #define ___lwasm_h_seen___
24
25 #include <lw_expr.h>
26 #include <lw_stringlist.h>
27 #include <lw_stack.h>
28
29
30 // these are allowed chars BELOW 0x80 for symbols
31 // first is symbol start chars, second is anywhere in symbol
32 #define SSYMCHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_@$"
33 #define SYMCHARS SSYMCHARS ".?0123456789"
34
35 typedef struct asmstate_s asmstate_t;
36
37 enum
38 {
39 lwasm_expr_linelen = 1, // length of ref'd line
40 lwasm_expr_lineaddr = 2, // addr of ref'd line
41 lwasm_expr_nextbp = 3, // next branch point
42 lwasm_expr_prevbp = 4, // previous branch point
43 lwasm_expr_syment = 5, // symbol table entry
44 lwasm_expr_import = 6, // symbol import entry
45 lwasm_expr_secbase = 7 // section base address
46 };
47
48 enum lwasm_output_e
49 {
50 OUTPUT_DECB = 0, // DECB multirecord format
51 OUTPUT_RAW, // raw sequence of bytes
52 OUTPUT_OBJ, // proprietary object file format
53 OUTPUT_RAWREL, // raw bytes where ORG causes a SEEK in the file
54 OUTPUT_OS9 // os9 module target
55 };
56
57 enum lwasm_target_e
58 {
59 TARGET_6309 = 0, // target 6309 CPU
60 TARGET_6809 // target 6809 CPU (no 6309 ops)
61 };
62
63 enum lwasm_flags_e
64 {
65 FLAG_LIST = 0x0001,
66 FLAG_DEPEND = 0x0002,
67 FLAG_SYMBOLS = 0x004,
68 FLAG_NONE = 0
69 };
70
71 enum lwasm_pragmas_e
72 {
73 PRAGMA_NONE = 0, // no pragmas in effect
74 PRAGMA_DOLLARNOTLOCAL = 0x0001, // dollar sign does not make a symbol local
75 PRAGMA_NOINDEX0TONONE = 0x0002, // do not change implicit 0,R to ,R
76 PRAGMA_UNDEFEXTERN = 0x0004, // undefined symbols are considered to be external
77 PRAGMA_CESCAPES = 0x0008, // allow C style escapes in fcc, fcs, fcn, etc.
78 PRAGMA_IMPORTUNDEFEXPORT = 0x0010, // imports symbol if undefined upon export
79 PRAGMA_PCASPCR = 0x0020 // treats ,PC as ,PCR instead of constant offset
80 };
81
82
83 enum
84 {
85 section_flag_bss = 1, // BSS section
86 section_flag_none = 0 // no flags
87 };
88
89 typedef struct reloctab_s reloctab_t;
90 struct reloctab_s
91 {
92 lw_expr_t offset; // offset of relocation
93 int size; // size of relocation
94 lw_expr_t expr; // relocation expression
95 reloctab_t *next;
96 };
97
98 typedef struct sectiontab_s sectiontab_t;
99 struct sectiontab_s
100 {
101 char *name; // section name
102 int flags; // section flags;
103 lw_expr_t offset; // offset for next instance
104 int oblen; // size of section output
105 int obsize; // size of output buffer
106 unsigned char *obytes; // output buffer
107 reloctab_t *reloctab; // table of relocations
108 sectiontab_t *next;
109 };
110
111 typedef struct lwasm_error_s lwasm_error_t;
112 struct lwasm_error_s
113 {
114 char *mess; // actual error message
115 lwasm_error_t *next; // ptr to next error
116 };
117
118 struct line_expr_s
119 {
120 lw_expr_t expr;
121 int id;
122 struct line_expr_s *next;
123 };
124
125 typedef struct line_s line_t;
126
127 typedef struct exportlist_s exportlist_t;
128 struct exportlist_s
129 {
130 char *symbol; // symbol to export
131 struct symtabe *se; // symbol table entry
132 line_t *line; // line the export is on
133 exportlist_t *next; // next in the export list
134 };
135
136 typedef struct importlist_s importlist_t;
137 struct importlist_s
138 {
139 char *symbol; // symbol to import
140 importlist_t *next; // next in the import list
141 };
142
143 struct line_s
144 {
145 lw_expr_t addr; // assembly address of the line
146 int len; // the "size" this line occupies (address space wise) (-1 if unknown)
147 int insn; // number of insn in insn table
148 int symset; // set if the line symbol was consumed by the instruction
149 char *sym; // symbol, if any, on the line
150 unsigned char *output; // output bytes
151 int outputl; // size of output
152 int outputbl; // size of output buffer
153 int dpval; // direct page value
154 lwasm_error_t *err; // list of errors
155 lwasm_error_t *warn; // list of errors
156 line_t *prev; // previous line
157 line_t *next; // next line
158 int inmod; // inside a module?
159 sectiontab_t *csect; // which section are we in?
160 struct line_expr_s *exprs; // expressions used during parsing
161 char *lstr; // string passed forward
162 int pb; // pass forward post byte
163 int lint; // pass forward integer
164 int lint2; // another pass forward integer
165 asmstate_t *as; // assembler state data ptr
166 int pragmas; // pragmas in effect for the line
167 int context; // the symbol context number
168 char *ltext; // line number
169 char *linespec; // line spec
170 int lineno; // line number
171 int soff; // struct offset (for listings)
172 int dshow; // data value to show (for listings)
173 int dsize; // set to 1 for 8 bit dshow value
174 int isbrpt; // set to 1 if this line is a branch point
175 struct symtabe *dptr; // symbol value to display
176 };
177
178 enum
179 {
180 symbol_flag_set = 1, // symbol was used with "set"
181 symbol_flag_nocheck = 2, // do not check symbol characters
182 symbol_flag_none = 0 // no flags
183 };
184
185 struct symtabe
186 {
187 char *symbol; // the name of the symbol
188 int context; // symbol context (-1 for global)
189 int version; // version of the symbol (for "set")
190 int flags; // flags for the symbol
191 sectiontab_t *section; // section the symbol is defined in
192 lw_expr_t value; // symbol value
193 struct symtabe *next; // next symbol in the table
194 };
195
196 typedef struct
197 {
198 struct symtabe *head; // start of symbol table
199 } symtab_t;
200
201 typedef struct macrotab_s macrotab_t;
202 struct macrotab_s
203 {
204 char *name; // name of macro
205 char **lines; // macro lines
206 int numlines; // number lines in macro
207 macrotab_t *next; // next macro in list
208 };
209
210 typedef struct structtab_s structtab_t;
211 typedef struct structtab_field_s structtab_field_t;
212
213 struct structtab_field_s
214 {
215 char *name; // structure field name - NULL for anonymous
216 int size; // structure field size
217 structtab_t *substruct; // sub structure if there is one
218 structtab_field_t *next; // next field entry
219 };
220
221 struct structtab_s
222 {
223 char *name; // name of structure
224 int size; // number of bytes taken by struct
225 structtab_field_t *fields; // fields in the structure
226 structtab_t *next; // next structure
227 };
228
229 struct asmstate_s
230 {
231 int output_format; // output format
232 int target; // assembly target
233 int debug_level; // level of debugging requested
234 FILE *debug_file; // FILE * to output debug messages to
235 int flags; // assembly flags
236 int pragmas; // pragmas currently in effect
237 int errorcount; // number of errors encountered
238 int inmacro; // are we in a macro?
239 int instruct; // are w in a structure?
240 int skipcond; // skipping a condition?
241 int skipcount; // depth of "skipping"
242 int skipmacro; // are we skipping in a macro?
243 int endseen; // have we seen an "end" pseudo?
244 int execaddr; // address from "end"
245 int inmod; // inside an os9 module?
246 unsigned char crc[3]; // crc accumulator
247 int badsymerr; // throw error on undef sym if set
248
249 line_t *line_head; // start of lines list
250 line_t *line_tail; // tail of lines list
251
252 line_t *cl; // current line pointer
253
254 sectiontab_t *csect; // current section
255
256 int context; // the current "context"
257 int nextcontext; // the next available context
258
259 symtab_t symtab; // meta data for the symbol table
260 macrotab_t *macros; // macro table
261 sectiontab_t *sections; // section table
262 exportlist_t *exportlist; // list of exported symbols
263 importlist_t *importlist; // list of imported symbols
264 char *list_file; // name of file to list to
265 char *output_file; // output file name
266 lw_stringlist_t input_files; // files to assemble
267 void *input_data; // opaque data used by the input system
268 lw_stringlist_t include_list; // include paths
269 lw_stack_t file_dir; // stack of the "current file" dir
270 lw_stack_t includelist;
271
272 structtab_t *structs; // defined structures
273 structtab_t *cstruct; // current structure
274
275 int exportcheck; // set if we need to collapse out the section base to 0
276 };
277
278 #ifndef ___symbol_c_seen___
279
280 extern struct symtabe *register_symbol(asmstate_t *as, line_t *cl, char *sym, lw_expr_t value, int flags);
281 extern struct symtabe *lookup_symbol(asmstate_t *as, line_t *cl, char *sym);
282
283 #endif
284
285 #ifndef ___lwasm_c_seen___
286
287 extern void lwasm_register_error(asmstate_t *as, line_t *cl, const char *msg, ...);
288 extern void lwasm_register_warning(asmstate_t *as, line_t *cl, const char *msg, ...);
289 extern int lwasm_next_context(asmstate_t *as);
290 extern void lwasm_emit(line_t *cl, int byte);
291 extern void lwasm_emitop(line_t *cl, int opc);
292
293 extern void lwasm_save_expr(line_t *cl, int id, lw_expr_t expr);
294 extern lw_expr_t lwasm_fetch_expr(line_t *cl, int id);
295 extern lw_expr_t lwasm_parse_expr(asmstate_t *as, char **p);
296 extern int lwasm_emitexpr(line_t *cl, lw_expr_t expr, int s);
297
298 extern void skip_operand(char **p);
299
300 extern int lwasm_lookupreg2(const char *rlist, char **p);
301 extern int lwasm_lookupreg3(const char *rlist, char **p);
302
303 extern void lwasm_show_errors(asmstate_t *as);
304
305 extern int lwasm_reduce_expr(asmstate_t *as, lw_expr_t expr);
306
307 extern void debug_message(asmstate_t *as, int level, const char *fmt, ...);
308 extern void dump_state(asmstate_t *as);
309
310 extern lw_expr_t lwasm_parse_cond(asmstate_t *as, char **p);
311
312 #endif
313
314 #define OPLEN(op) (((op)>0xFF)?2:1)
315 #define CURPRAGMA(l,p) (((l)->pragmas & (p)) ? 1 : 0)
316
317 #endif /* ___lwasm_h_seen___ */