annotate lwasm/lwasm.h @ 519:724bcc4508bc

Add SETSTR/INCLUDESTR for some basic code building It seemed useful to have the ability to build up a variable containing arbitrary text and then to be able to include that in the assembly process like an include file. So add, undocumented for now, the following: SETTSTR varname="string" INCLUDESTSR "string" "string" must be enclosed in double quotes and may contain most of the usual escape sequences (\t, \r, etc.) as well as %(varname) to interpolate a variable value. To use it to create assembleable source code, you need to make sure it creates lines (ended by either \r or \n) with appropriate whitespace in appropriate places.
author William Astle <lost@l-w.ca>
date Sun, 19 Dec 2021 17:01:42 -0700
parents bab891d85a53
children e10618b48e68
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1 /*
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
2 lwasm.h
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
3
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
4 Copyright © 2010 William Astle
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
5
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
6 This file is part of LWTOOLS.
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
7
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
8 LWTOOLS is free software: you can redistribute it and/or modify it under the
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
9 terms of the GNU General Public License as published by the Free Software
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
10 Foundation, either version 3 of the License, or (at your option) any later
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
11 version.
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
12
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
13 This program is distributed in the hope that it will be useful, but WITHOUT
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
16 more details.
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
17
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
18 You should have received a copy of the GNU General Public License along with
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
19 this program. If not, see <http://www.gnu.org/licenses/>.
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
20 */
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
21
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
22 #ifndef ___lwasm_h_seen___
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
23 #define ___lwasm_h_seen___
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
24
361
4130ffdeb5c8 Add contributed support for building with Microsoft's compiler
William Astle <lost@l-w.ca>
parents: 343
diff changeset
25 #ifdef _MSC_VER
386
221b5f58d8ad Port remainder of tools to Windows
William Astle <lost@l-w.ca>
parents: 385
diff changeset
26 #include <lw_win.h> // windows build
361
4130ffdeb5c8 Add contributed support for building with Microsoft's compiler
William Astle <lost@l-w.ca>
parents: 343
diff changeset
27 #endif
4130ffdeb5c8 Add contributed support for building with Microsoft's compiler
William Astle <lost@l-w.ca>
parents: 343
diff changeset
28
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
29 #include <lw_expr.h>
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
30 #include <lw_stringlist.h>
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
31 #include <lw_stack.h>
519
724bcc4508bc Add SETSTR/INCLUDESTR for some basic code building
William Astle <lost@l-w.ca>
parents: 509
diff changeset
32 #include <lw_dict.h>
467
a6c9129e5948 Move version header into a common direction to better reflect what it is.
William Astle <lost@l-w.ca>
parents: 455
diff changeset
33
a6c9129e5948 Move version header into a common direction to better reflect what it is.
William Astle <lost@l-w.ca>
parents: 455
diff changeset
34 #include <version.h>
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
35
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
36 // these are allowed chars BELOW 0x80 for symbols
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
37 // first is symbol start chars, second is anywhere in symbol
509
bab891d85a53 Allow dot at start of symbol per documentation
William Astle <lost@l-w.ca>
parents: 487
diff changeset
38 #define SSYMCHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_@$."
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
39 #define SYMCHARS SSYMCHARS ".?0123456789"
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
40
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
41 typedef struct asmstate_s asmstate_t;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
42
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
43 enum
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
44 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
45 lwasm_expr_linelen = 1, // length of ref'd line
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
46 lwasm_expr_lineaddr = 2, // addr of ref'd line
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
47 lwasm_expr_nextbp = 3, // next branch point
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
48 lwasm_expr_prevbp = 4, // previous branch point
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
49 lwasm_expr_syment = 5, // symbol table entry
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
50 lwasm_expr_import = 6, // symbol import entry
142
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 115
diff changeset
51 lwasm_expr_secbase = 7, // section base address
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 115
diff changeset
52 lwasm_expr_linedaddr = 8, // data address of the line
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 115
diff changeset
53 lwasm_expr_linedlen = 9 // data length of the line
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
54 };
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
55
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
56 enum lwasm_output_e
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
57 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
58 OUTPUT_DECB = 0, // DECB multirecord format
406
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 399
diff changeset
59 OUTPUT_BASIC, // Color BASIC program
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
60 OUTPUT_RAW, // raw sequence of bytes
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
61 OUTPUT_OBJ, // proprietary object file format
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
62 OUTPUT_RAWREL, // raw bytes where ORG causes a SEEK in the file
321
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 241
diff changeset
63 OUTPUT_OS9, // os9 module target
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 241
diff changeset
64 OUTPUT_SREC, // motorola SREC format
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 241
diff changeset
65 OUTPUT_IHEX, // intel hex format
432
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 406
diff changeset
66 OUTPUT_HEX, // generic hexadecimal format
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 406
diff changeset
67 OUTPUT_LWMOD // special module format for LW
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
68 };
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
69
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
70 enum lwasm_flags_e
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
71 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
72 FLAG_LIST = 0x0001,
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
73 FLAG_DEPEND = 0x0002,
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
74 FLAG_SYMBOLS = 0x004,
73
1f77ae5c3590 Added --dependnoerr flag to list dependencies on non-existent files without bailing out; also suppress error reports during dependency generation
lost@l-w.ca
parents: 70
diff changeset
75 FLAG_DEPENDNOERR = 0x0008,
222
03f7192fcd20 Add --unicorns option for IDE integration
William Astle <lost@l-w.ca>
parents: 219
diff changeset
76 FLAG_UNICORNS = 0x0010,
484
469a130e7029 Add option to suppress output file
William Astle <lost@l-w.ca>
parents: 474
diff changeset
77 FLAG_MAP = 0x0020,
469a130e7029 Add option to suppress output file
William Astle <lost@l-w.ca>
parents: 474
diff changeset
78 FLAG_SYMBOLS_NOLOCALS = 0x0040,
469a130e7029 Add option to suppress output file
William Astle <lost@l-w.ca>
parents: 474
diff changeset
79 FLAG_NOOUT = 0x80,
487
7fbf3171ca15 Add symbol table dump in assembly format
William Astle <lost@l-w.ca>
parents: 484
diff changeset
80 FLAG_SYMDUMP = 0x100,
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
81 FLAG_NONE = 0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
82 };
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
83
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
84 enum lwasm_pragmas_e
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
85 {
375
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
86 PRAGMA_NONE = 0, // no pragmas in effect
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
87 PRAGMA_DOLLARNOTLOCAL = 1 << 0, // dollar sign does not make a symbol local
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
88 PRAGMA_NOINDEX0TONONE = 1 << 1, // do not change implicit 0,R to ,R
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
89 PRAGMA_UNDEFEXTERN = 1 << 2, // undefined symbols are considered to be external
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
90 PRAGMA_CESCAPES = 1 << 3, // allow C style escapes in fcc, fcs, fcn, etc.
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
91 PRAGMA_IMPORTUNDEFEXPORT = 1 << 4, // imports symbol if undefined upon export
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
92 PRAGMA_PCASPCR = 1 << 5, // treats ,PC as ,PCR instead of constant offset
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
93 PRAGMA_SHADOW = 1 << 6, // allow macros to shadow builtin operations
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
94 PRAGMA_NOLIST = 1 << 7, // don't show line in listing
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
95 PRAGMA_AUTOBRANCHLENGTH = 1 << 8, // automatically select proper length for relative branches
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
96 PRAGMA_EXPORT = 1 << 9, // export symbols by default, unless local
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
97 PRAGMA_SYMBOLNOCASE = 1 << 10, // symbols defined under this pragma are matched case insensitively
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
98 PRAGMA_CONDUNDEFZERO = 1 << 11, // treat undefined symbols as zero in conditionals during pass 1
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
99 PRAGMA_6800COMPAT = 1 << 12, // enable 6800 compatibility opcodes
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
100 PRAGMA_FORWARDREFMAX = 1 << 13, // force incomplete references on pass 1 to maximum mode
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
101 PRAGMA_6809 = 1 << 14, // 6809/6309 assembly mode
376
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
102 PRAGMA_TESTMODE = 1 << 15, // enable test mode (for internal unit testing)
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
103 PRAGMA_C = 1 << 16, // enable cycle counts
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
104 PRAGMA_CD = 1 << 17, // enable detailed cycle count
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
105 PRAGMA_CT = 1 << 18, // enable cycle count running total
377
67373a053c49 Add ?rts target for branch instructions
William Astle <lost@l-w.ca>
parents: 376
diff changeset
106 PRAGMA_CC = 1 << 19, // clear cycle count running total
379
d791d47afc48 Add m80ext pragma for Macro-80C compatibility and ignore END in includes
William Astle <lost@l-w.ca>
parents: 377
diff changeset
107 PRAGMA_QRTS = 1 << 20, // enable BRA ?RTS support
384
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 382
diff changeset
108 PRAGMA_M80EXT = 1 << 21, // enable Macro-80C assembler extensions
385
4fd16faa4d93 Add various "convenience" ops
William Astle <lost@l-w.ca>
parents: 384
diff changeset
109 PRAGMA_6809CONV = 1 << 22, // enable 6809 convenience ops
4fd16faa4d93 Add various "convenience" ops
William Astle <lost@l-w.ca>
parents: 384
diff changeset
110 PRAGMA_6309CONV = 1 << 23, // enable 6309 convenience ops
399
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 390
diff changeset
111 PRAGMA_NEWSOURCE = 1 << 24, // don't use compatibility source format
455
cad5937314cb Add operandsizewarning pragma
William Astle <lost@l-w.ca>
parents: 442
diff changeset
112 PRAGMA_OPERANDSIZE = 1 << 25, // warn if operand size is bigger than required
472
e97f9a302c6a Add emuext pragma and associated instructions.
William Astle <lost@l-w.ca>
parents: 470
diff changeset
113 PRAGMA_EMUEXT = 1 << 26, // enable emulator extensions
473
8181ddd707f1 Add "nooutput" pragma
William Astle <lost@l-w.ca>
parents: 472
diff changeset
114 PRAGMA_NOOUTPUT = 1 << 27, // disable object code output
474
74d0c394666e Add "noexpandcond" pragma (cleans up listings)
William Astle <lost@l-w.ca>
parents: 473
diff changeset
115 PRAGMA_NOEXPANDCOND = 1 << 28, // hide conditionals and skipped output in listings
384
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 382
diff changeset
116 PRAGMA_CLEARBIT = 1 << 31 // reserved to indicate negated pragma flag status
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
117 };
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
118
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
119 enum
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
120 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
121 section_flag_bss = 1, // BSS section
156
fc8386b13399 Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents: 142
diff changeset
122 section_flag_constant = 2, // constants - no base offset
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
123 section_flag_none = 0 // no flags
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
124 };
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
125
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
126 typedef struct reloctab_s reloctab_t;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
127 struct reloctab_s
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
128 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
129 lw_expr_t offset; // offset of relocation
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
130 int size; // size of relocation
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
131 lw_expr_t expr; // relocation expression
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
132 reloctab_t *next;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
133 };
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
134
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
135 typedef struct sectiontab_s sectiontab_t;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
136 struct sectiontab_s
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
137 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
138 char *name; // section name
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
139 int flags; // section flags;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
140 lw_expr_t offset; // offset for next instance
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
141 int oblen; // size of section output
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
142 int obsize; // size of output buffer
432
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 406
diff changeset
143 int tbase; // temporary base value for resolution
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
144 unsigned char *obytes; // output buffer
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
145 reloctab_t *reloctab; // table of relocations
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
146 sectiontab_t *next;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
147 };
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
148
375
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
149 typedef enum
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
150 {
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
151 TF_EMIT = 1,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
152 TF_ERROR = 2
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
153 } lwasm_testflags_t;
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
154
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 367
diff changeset
155 typedef enum
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 367
diff changeset
156 {
375
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
157 E_6309_INVALID = 1,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
158 E_6809_INVALID = 2,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
159 E_ALIGNMENT_INVALID = 3,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
160 E_BITNUMBER_UNRESOLVED = 4,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
161 E_BITNUMBER_INVALID = 5,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
162 E_BYTE_OVERFLOW = 6,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
163 E_CONDITION_P1 = 7,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
164 E_DIRECTIVE_OS9_ONLY = 8,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
165 E_DIV0 = 9,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
166 E_EXEC_ADDRESS = 10,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
167 E_FILL_INVALID = 11,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
168 E_IMMEDIATE_INVALID = 12,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
169 E_IMMEDIATE_UNRESOLVED = 13,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
170 E_EXPRESSION_BAD = 14,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
171 E_EXPRESSION_NOT_CONST = 15,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
172 E_EXPRESSION_NOT_RESOLVED = 16,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
173 E_FILE_OPEN = 17,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
174 E_FILENAME_MISSING = 18,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
175 E_INSTRUCTION_FAILED = 19,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
176 E_INSTRUCTION_SECTION = 20,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
177 E_LINE_ADDRESS = 21,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
178 E_LINED_ADDRESS = 22,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
179 E_MACRO_DUPE = 23,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
180 E_MACRO_ENDM = 24,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
181 E_MACRO_NONAME = 25,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
182 E_MACRO_RECURSE = 26,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
183 E_MODULE_IN = 27,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
184 E_MODULE_NOTIN = 28,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
185 E_NEGATIVE_BLOCKSIZE = 29,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
186 E_NEGATIVE_RESERVATION = 30,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
187 E_NW_8 = 31,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
188 E_OPCODE_BAD = 32,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
189 E_OPERAND_BAD = 33,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
190 E_OBJTARGET_ONLY = 34,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
191 E_PADDING_BAD = 35,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
192 E_PRAGMA_UNRECOGNIZED = 36,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
193 E_REGISTER_BAD = 37,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
194 E_SECTION_END = 38,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
195 E_SECTION_EXTDEP = 39,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
196 E_SECTION_FLAG = 40,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
197 E_SECTION_NAME = 41,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
198 E_SECTION_TARGET = 42,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
199 E_SETDP_INVALID = 43,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
200 E_SETDP_NOT_CONST = 44,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
201 E_STRING_BAD = 45,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
202 E_STRUCT_DUPE = 46,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
203 E_STRUCT_NONAME = 47,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
204 E_STRUCT_NOSYMBOL = 48,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
205 E_STRUCT_RECURSE = 49,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
206 E_SYMBOL_BAD = 50,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
207 E_SYMBOL_DUPE = 51,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
208 E_SYMBOL_MISSING = 52,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
209 E_SYMBOL_UNDEFINED = 53,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
210 E_SYMBOL_UNDEFINED_EXPORT = 54,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
211 E_UNKNOWN_OPERATION = 55,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
212 E_USER_SPECIFIED = 56,
382
80d615a6642c Add REORG pseudo op
William Astle <lost@l-w.ca>
parents: 381
diff changeset
213 E_ORG_NOT_FOUND = 57,
432
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 406
diff changeset
214 E_COMPLEX_INCOMPLETE = 58,
470
2c1c5dd84024 Add << prefix to force 5 bit offsets in indexed modes
William Astle <lost@l-w.ca>
parents: 467
diff changeset
215 E_ILL5 = 59,
432
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 406
diff changeset
216
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 367
diff changeset
217 /* warnings must be 1000 or greater */
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 367
diff changeset
218
375
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
219 W_DUPLICATE_SECTION = 1000,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
220 W_ENDSTRUCT_WITHOUT = 1001,
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
221 W_NOT_SUPPORTED = 1002,
455
cad5937314cb Add operandsizewarning pragma
William Astle <lost@l-w.ca>
parents: 442
diff changeset
222 W_USER_SPECIFIED = 1003,
cad5937314cb Add operandsizewarning pragma
William Astle <lost@l-w.ca>
parents: 442
diff changeset
223 W_OPERAND_SIZE = 1004
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 367
diff changeset
224 } lwasm_errorcode_t;
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 367
diff changeset
225
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
226 typedef struct lwasm_error_s lwasm_error_t;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
227 struct lwasm_error_s
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
228 {
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 367
diff changeset
229 lwasm_errorcode_t code; // error code
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
230 char *mess; // actual error message
226
7c2c2239ec9c Make unicorns grok errors and warnings.
William Astle <lost@l-w.ca>
parents: 223
diff changeset
231 int charpos; // character position on line where parsing stopped
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
232 lwasm_error_t *next; // ptr to next error
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
233 };
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
234
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
235 struct line_expr_s
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
236 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
237 lw_expr_t expr;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
238 int id;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
239 struct line_expr_s *next;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
240 };
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
241
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
242 typedef struct line_s line_t;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
243
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
244 typedef struct exportlist_s exportlist_t;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
245 struct exportlist_s
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
246 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
247 char *symbol; // symbol to export
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
248 struct symtabe *se; // symbol table entry
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
249 line_t *line; // line the export is on
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
250 exportlist_t *next; // next in the export list
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
251 };
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
252
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
253 typedef struct importlist_s importlist_t;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
254 struct importlist_s
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
255 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
256 char *symbol; // symbol to import
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
257 importlist_t *next; // next in the import list
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
258 };
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
259
376
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
260 typedef enum
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
261 {
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
262 CYCLE_ADJ = 1,
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
263 CYCLE_ESTIMATED = 2
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
264 } cycle_flags;
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
265
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
266 struct line_s
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
267 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
268 lw_expr_t addr; // assembly address of the line
142
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 115
diff changeset
269 lw_expr_t daddr; // data address of the line (os9 only)
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
270 int len; // the "size" this line occupies (address space wise) (-1 if unknown)
142
697bc543368c Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents: 115
diff changeset
271 int dlen; // the data "size" this line occupies (-1 if unknown)
241
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 226
diff changeset
272 int minlen; // minimum length
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 226
diff changeset
273 int maxlen; // maximum length
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
274 int insn; // number of insn in insn table
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
275 int symset; // set if the line symbol was consumed by the instruction
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
276 char *sym; // symbol, if any, on the line
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
277 unsigned char *output; // output bytes
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
278 int outputl; // size of output
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
279 int outputbl; // size of output buffer
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
280 int dpval; // direct page value
376
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
281 int cycle_base; // base instruction cycle count
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
282 int cycle_adj; // cycle adjustment
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
283 int cycle_flags; // cycle flags
380
17fcd0c3ee45 Allow multibyte ascii constants in m80ext mode
William Astle <lost@l-w.ca>
parents: 379
diff changeset
284 int genmode; // generation mode (insn_parse_gen0/8/16)
381
e3f4aaa2a4e8 Allow FCB-like syntax after constant in FCC under m80ext
William Astle <lost@l-w.ca>
parents: 380
diff changeset
285 int fcc_extras; // fcc extra bytes
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
286 lwasm_error_t *err; // list of errors
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
287 lwasm_error_t *warn; // list of errors
375
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
288 lwasm_errorcode_t err_testmode; // error code in testmode
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
289 line_t *prev; // previous line
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
290 line_t *next; // next line
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
291 int inmod; // inside a module?
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
292 sectiontab_t *csect; // which section are we in?
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
293 struct line_expr_s *exprs; // expressions used during parsing
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
294 char *lstr; // string passed forward
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
295 int pb; // pass forward post byte
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
296 int lint; // pass forward integer
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
297 int lint2; // another pass forward integer
377
67373a053c49 Add ?rts target for branch instructions
William Astle <lost@l-w.ca>
parents: 376
diff changeset
298 int conditional_return; // for ?RTS handling (1 if RTS follows)
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
299 asmstate_t *as; // assembler state data ptr
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
300 int pragmas; // pragmas in effect for the line
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
301 int context; // the symbol context number
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
302 char *ltext; // line number
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
303 char *linespec; // line spec
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
304 int lineno; // line number
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
305 int soff; // struct offset (for listings)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
306 int dshow; // data value to show (for listings)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
307 int dsize; // set to 1 for 8 bit dshow value
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
308 int isbrpt; // set to 1 if this line is a branch point
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
309 struct symtabe *dptr; // symbol value to display
49
bd8b3fbd1e28 Added ability to flag macros as "noexpand" so they are not expanded in the listing
lost@l-w.ca
parents: 2
diff changeset
310
bd8b3fbd1e28 Added ability to flag macros as "noexpand" so they are not expanded in the listing
lost@l-w.ca
parents: 2
diff changeset
311 int noexpand_start; // start of a no-expand block
bd8b3fbd1e28 Added ability to flag macros as "noexpand" so they are not expanded in the listing
lost@l-w.ca
parents: 2
diff changeset
312 int noexpand_end; // end of a no-expand block
219
afd50d6b4113 Add --preprocess option
William Astle <lost@l-w.ca>
parents: 211
diff changeset
313 int hideline; // set if we're going to hide this line on output
474
74d0c394666e Add "noexpandcond" pragma (cleans up listings)
William Astle <lost@l-w.ca>
parents: 473
diff changeset
314 int hidecond; // set if we're going to hide this line due to condition hiding
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
315 };
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
316
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
317 enum
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
318 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
319 symbol_flag_set = 1, // symbol was used with "set"
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
320 symbol_flag_nocheck = 2, // do not check symbol characters
81
428068681cbf Added nolist pragma to suppress listing output of non-code generating lines
Lost Wizard (lost@starbug3)
parents: 73
diff changeset
321 symbol_flag_nolist = 4, // no not show symbol in symbol table
207
07e1fac76321 Added pragma to allow non case sensitive symbols
William Astle <lost@l-w.ca>
parents: 206
diff changeset
322 symbol_flag_nocase = 8, // do not match case of symbol
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
323 symbol_flag_none = 0 // no flags
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
324 };
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
325
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
326 struct symtabe
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
327 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
328 char *symbol; // the name of the symbol
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
329 int context; // symbol context (-1 for global)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
330 int version; // version of the symbol (for "set")
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
331 int flags; // flags for the symbol
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
332 sectiontab_t *section; // section the symbol is defined in
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
333 lw_expr_t value; // symbol value
195
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
334 struct symtabe *left; // left subtree pointer
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
335 struct symtabe *right; // right subtree pointer
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
336 struct symtabe *nextver; // next lower version
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
337 };
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
338
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
339 typedef struct
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
340 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
341 struct symtabe *head; // start of symbol table
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
342 } symtab_t;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
343
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
344 typedef struct macrotab_s macrotab_t;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
345 struct macrotab_s
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
346 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
347 char *name; // name of macro
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
348 char **lines; // macro lines
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
349 int numlines; // number lines in macro
49
bd8b3fbd1e28 Added ability to flag macros as "noexpand" so they are not expanded in the listing
lost@l-w.ca
parents: 2
diff changeset
350 int flags; // flags for the macro
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
351 macrotab_t *next; // next macro in list
222
03f7192fcd20 Add --unicorns option for IDE integration
William Astle <lost@l-w.ca>
parents: 219
diff changeset
352 line_t *definedat; // the line where the macro definition starts
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
353 };
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
354
49
bd8b3fbd1e28 Added ability to flag macros as "noexpand" so they are not expanded in the listing
lost@l-w.ca
parents: 2
diff changeset
355 enum
bd8b3fbd1e28 Added ability to flag macros as "noexpand" so they are not expanded in the listing
lost@l-w.ca
parents: 2
diff changeset
356 {
bd8b3fbd1e28 Added ability to flag macros as "noexpand" so they are not expanded in the listing
lost@l-w.ca
parents: 2
diff changeset
357 macro_noexpand = 1 // set to not expland the macro by default in listing
bd8b3fbd1e28 Added ability to flag macros as "noexpand" so they are not expanded in the listing
lost@l-w.ca
parents: 2
diff changeset
358 };
bd8b3fbd1e28 Added ability to flag macros as "noexpand" so they are not expanded in the listing
lost@l-w.ca
parents: 2
diff changeset
359
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
360 typedef struct structtab_s structtab_t;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
361 typedef struct structtab_field_s structtab_field_t;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
362
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
363 struct structtab_field_s
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
364 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
365 char *name; // structure field name - NULL for anonymous
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
366 int size; // structure field size
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
367 structtab_t *substruct; // sub structure if there is one
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
368 structtab_field_t *next; // next field entry
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
369 };
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
370
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
371 struct structtab_s
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
372 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
373 char *name; // name of structure
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
374 int size; // number of bytes taken by struct
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
375 structtab_field_t *fields; // fields in the structure
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
376 structtab_t *next; // next structure
223
211fc8038b8d More unicorn stuff - structs and macros
William Astle <lost@l-w.ca>
parents: 222
diff changeset
377 line_t *definedat; // line where structure is defined
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
378 };
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
379
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
380 struct asmstate_s
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
381 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
382 int output_format; // output format
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
383 int debug_level; // level of debugging requested
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
384 FILE *debug_file; // FILE * to output debug messages to
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
385 int flags; // assembly flags
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
386 int pragmas; // pragmas currently in effect
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
387 int errorcount; // number of errors encountered
209
52d9dd71f555 Make warning actually work.
William Astle <lost@l-w.ca>
parents: 207
diff changeset
388 int warningcount; // number of warnings issued
375
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
389 int testmode_errorcount; // number of errors in testmode
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
390 int inmacro; // are we in a macro?
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
391 int instruct; // are w in a structure?
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
392 int skipcond; // skipping a condition?
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
393 int skipcount; // depth of "skipping"
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
394 int skipmacro; // are we skipping in a macro?
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
395 int endseen; // have we seen an "end" pseudo?
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
396 int execaddr; // address from "end"
432
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 406
diff changeset
397 lw_expr_t execaddr_expr; // address from "end" but as an expression
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
398 int inmod; // inside an os9 module?
210
5d969517db74 Added condundefzero pragma
William Astle <lost@l-w.ca>
parents: 209
diff changeset
399 int undefzero; // used for handling "condundefzero"
211
6f2e18f1fe67 Improve autobranchlength pragma
William Astle <lost@l-w.ca>
parents: 210
diff changeset
400 int pretendmax; // set if we need to pretend the instruction is max length
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
401 unsigned char crc[3]; // crc accumulator
376
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
402 int cycle_total; // cycle count accumulator
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
403 int badsymerr; // throw error on undef sym if set
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
404
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
405 line_t *line_head; // start of lines list
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
406 line_t *line_tail; // tail of lines list
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
407
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
408 line_t *cl; // current line pointer
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
409
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
410 sectiontab_t *csect; // current section
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
411
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
412 int context; // the current "context"
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
413 int nextcontext; // the next available context
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
414
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
415 symtab_t symtab; // meta data for the symbol table
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
416 macrotab_t *macros; // macro table
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
417 sectiontab_t *sections; // section table
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
418 exportlist_t *exportlist; // list of exported symbols
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
419 importlist_t *importlist; // list of imported symbols
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
420 char *list_file; // name of file to list to
487
7fbf3171ca15 Add symbol table dump in assembly format
William Astle <lost@l-w.ca>
parents: 484
diff changeset
421 char *symbol_dump_file; // name of file to dump symbol table to
390
1ebb5a0b2874 Add option to specify tab width in listing
William Astle <lost@l-w.ca>
parents: 386
diff changeset
422 int tabwidth; // tab width in list file
365
3f8abaac214c Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents: 361
diff changeset
423 char *map_file; // name of map file
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
424 char *output_file; // output file name
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
425 lw_stringlist_t input_files; // files to assemble
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
426 void *input_data; // opaque data used by the input system
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
427 lw_stringlist_t include_list; // include paths
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
428 lw_stack_t file_dir; // stack of the "current file" dir
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
429 lw_stack_t includelist;
519
724bcc4508bc Add SETSTR/INCLUDESTR for some basic code building
William Astle <lost@l-w.ca>
parents: 509
diff changeset
430 lw_dict_t stringvars; // dictionary of string variables (SETSTR/INCLUDESTR)
724bcc4508bc Add SETSTR/INCLUDESTR for some basic code building
William Astle <lost@l-w.ca>
parents: 509
diff changeset
431
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
432
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
433 structtab_t *structs; // defined structures
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
434 structtab_t *cstruct; // current structure
61
ccaecdff3fc2 Make structure definitions not affect current assembly address and fix up cosmetic offset display in listings
lost@l-w.ca
parents: 53
diff changeset
435 lw_expr_t savedaddr; // old address counter before struct started
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
436 int exportcheck; // set if we need to collapse out the section base to 0
70
ceab04fd2969 Fixed premature installation of external reference under UNDEFEXTERN pragma; should not resolve to external references until after the initial parsing pass
lost@l-w.ca
parents: 61
diff changeset
437 int passno; // set to the current pass number
219
afd50d6b4113 Add --preprocess option
William Astle <lost@l-w.ca>
parents: 211
diff changeset
438 int preprocess; // set if we are prepocessing
afd50d6b4113 Add --preprocess option
William Astle <lost@l-w.ca>
parents: 211
diff changeset
439 int fileerr; // flags error opening file
366
433dbc18fb41 Make byte overflow detection for 8 bit immediate not fail with COM operator
William Astle <lost@l-w.ca>
parents: 365
diff changeset
440 int exprwidth; // the bit width of the expression being evaluated
442
61580fc48f98 Add option to omit file names from lwasm listings
William Astle <lost@l-w.ca>
parents: 432
diff changeset
441 int listnofile; // nonzero to suppress printing file name in listings
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
442 };
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
443
374
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 370
diff changeset
444 struct symtabe *register_symbol(asmstate_t *as, line_t *cl, char *sym, lw_expr_t value, int flags);
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 370
diff changeset
445 struct symtabe *lookup_symbol(asmstate_t *as, line_t *cl, char *sym);
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
446
384
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 382
diff changeset
447 int parse_pragma_helper(char *p);
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 382
diff changeset
448
376
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
449 int lwasm_cycle_calc_ind(line_t *cl);
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
450 int lwasm_cycle_calc_rlist(line_t *cl);
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
451 void lwasm_cycle_update_count(line_t *cl, int opc);
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
452
375
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
453 void lwasm_parse_testmode_comment(line_t *cl, lwasm_testflags_t *flags, lwasm_errorcode_t *err, int *len, char **buf);
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
454 void lwasm_error_testmode(line_t *cl, const char* msg, int fatal);
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
455
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 367
diff changeset
456 void lwasm_register_error(asmstate_t *as, line_t *cl, lwasm_errorcode_t err);
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 367
diff changeset
457 void lwasm_register_error2(asmstate_t *as, line_t *cl, lwasm_errorcode_t err, const char* fmt, ...);
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
458
374
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 370
diff changeset
459 int lwasm_next_context(asmstate_t *as);
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 370
diff changeset
460 void lwasm_emit(line_t *cl, int byte);
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 370
diff changeset
461 void lwasm_emitop(line_t *cl, int opc);
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
462
374
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 370
diff changeset
463 void lwasm_save_expr(line_t *cl, int id, lw_expr_t expr);
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 370
diff changeset
464 lw_expr_t lwasm_fetch_expr(line_t *cl, int id);
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 370
diff changeset
465 lw_expr_t lwasm_parse_expr(asmstate_t *as, char **p);
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 370
diff changeset
466 int lwasm_emitexpr(line_t *cl, lw_expr_t expr, int s);
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
467
399
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 390
diff changeset
468 void skip_operand_real(line_t *l, char **p);
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 390
diff changeset
469 /* this macro can only be used where "l" is the current line pointer */
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 390
diff changeset
470 #define skip_operand(p) skip_operand_real(l, p)
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
471
374
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 370
diff changeset
472 int lwasm_lookupreg2(const char *rlist, char **p);
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 370
diff changeset
473 int lwasm_lookupreg3(const char *rlist, char **p);
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
474
374
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 370
diff changeset
475 void lwasm_show_errors(asmstate_t *as);
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
476
374
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 370
diff changeset
477 int lwasm_reduce_expr(asmstate_t *as, lw_expr_t expr);
2
7317fbe024af Clean up insane number of compiler warnings under -Wall
lost@l-w.ca
parents: 0
diff changeset
478
374
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 370
diff changeset
479 lw_expr_t lwasm_parse_cond(asmstate_t *as, char **p);
241
d0e9dbe9afbe Add new heuristic for resolving instruction sizes.
William Astle <lost@l-w.ca>
parents: 226
diff changeset
480
374
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 370
diff changeset
481 int lwasm_calculate_range(asmstate_t *as, lw_expr_t expr, int *min, int *max);
336
30b2bad9b5eb Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents: 333
diff changeset
482
374
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 370
diff changeset
483 void lwasm_reduce_line_exprs(line_t *cl);
2
7317fbe024af Clean up insane number of compiler warnings under -Wall
lost@l-w.ca
parents: 0
diff changeset
484
338
5d401d1eb3e9 Allow disabling debugging messages.
William Astle <lost@l-w.ca>
parents: 336
diff changeset
485 #ifdef LWASM_NODEBUG
5d401d1eb3e9 Allow disabling debugging messages.
William Astle <lost@l-w.ca>
parents: 336
diff changeset
486 #define debug_message(...)
5d401d1eb3e9 Allow disabling debugging messages.
William Astle <lost@l-w.ca>
parents: 336
diff changeset
487 #define dump_state(...)
5d401d1eb3e9 Allow disabling debugging messages.
William Astle <lost@l-w.ca>
parents: 336
diff changeset
488 #else
374
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 370
diff changeset
489 void real_debug_message(asmstate_t *as, int level, const char *fmt, ...);
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 370
diff changeset
490 void dump_state(asmstate_t *as);
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
491
338
5d401d1eb3e9 Allow disabling debugging messages.
William Astle <lost@l-w.ca>
parents: 336
diff changeset
492 #define debug_message(as,level,...) do { asmstate_t *ras = (as); int rlevel = (level); if (ras->debug_level >= rlevel) { real_debug_message(ras, rlevel, __VA_ARGS__); } } while (0)
5d401d1eb3e9 Allow disabling debugging messages.
William Astle <lost@l-w.ca>
parents: 336
diff changeset
493 #endif
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
494
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
495 #define OPLEN(op) (((op)>0xFF)?2:1)
101
ed7f970f3688 Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents: 81
diff changeset
496 #define CURPRAGMA(l,p) (((l) && ((l)->pragmas & (p))) ? 1 : 0)
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
497
399
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 390
diff changeset
498 /* some functions for parsing */
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 390
diff changeset
499 /* skip to the start of the next token if the current parsing mode allows it */
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 390
diff changeset
500 void lwasm_skip_to_next_token(line_t *cl, char **p);
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 390
diff changeset
501
519
724bcc4508bc Add SETSTR/INCLUDESTR for some basic code building
William Astle <lost@l-w.ca>
parents: 509
diff changeset
502 /* parse a generalized string enclosed in double quotes */
724bcc4508bc Add SETSTR/INCLUDESTR for some basic code building
William Astle <lost@l-w.ca>
parents: 509
diff changeset
503 char *lwasm_parse_general_string(line_t *cl, char **p);
724bcc4508bc Add SETSTR/INCLUDESTR for some basic code building
William Astle <lost@l-w.ca>
parents: 509
diff changeset
504
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
505 #endif /* ___lwasm_h_seen___ */