Mercurial > hg-old > index.cgi
diff src/lwasm.h @ 0:57495da01900
Initial checking of LWASM
author | lost |
---|---|
date | Fri, 03 Oct 2008 02:44:20 +0000 |
parents | |
children | 34568fab6058 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lwasm.h Fri Oct 03 02:44:20 2008 +0000 @@ -0,0 +1,219 @@ +/* + * lwasm.h + * + * main defs used by the assembler + * + */ + + +#ifndef __lwasm_h_seen__ +#define __lwasm_h_seen__ + +#define MAX_OP_LEN 32 +#define SYMCHAR_START "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +#define SYMCHAR "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_$." + +#define MACROCHAR_START "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" +#define MACROCHAR "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + + +#define OPER_INH 0 +#define OPER_RTOR 1 +#define OPER_RLIST 2 +#define OPER_TFM 3 +#define OPER_IMM8 4 +#define OPER_IMM16 5 +#define OPER_IMM32 6 +#define OPER_DIR 7 +#define OPER_EXT 8 +#define OPER_INDEX 9 // indexed with no offset +#define OPER_DIREXT 10 // used as a placeholder when direct/extended unknown +#define OPER_BITBIT 11 // bit to bit direct page opers +#define OPER_REL8 12 +#define OPER_REL16 13 +#define OPER_INDEX5 14 // 5 bit offset indexed +#define OPER_INDEX8 15 // 8 bit offset indexed +#define OPER_INDEX16 16 // 16 bit offset indexed +#define OPER_INDEXV 17 // unknown size offset indexed +#define OPER_EXTIND 18 // extended indirect +#define OPER_LOGICD 19 // logic on mem, direct mode +#define OPER_LOGICE 20 // logic on mem, extended mode +#define OPER_LOGICEI 21 // logic on mem, extended indir mode +#define OPER_LOGICI 22 // logic on mem, indexed no offset +#define OPER_LOGICI5 23 // logic on mem, 5 bit indexed offset +#define OPER_LOGICI8 24 // logic on mem, 8 bit indexed offset +#define OPER_LOGICI16 25 // logic on mem, 16 bit indexed offset +#define OPER_LOGICIV 26 // logic on mem, unknown size offset + +#define OUTPUT_DECB 0 // DECB multirecord format +#define OUTPUT_RAW 1 // raw sequence of bytes +#define OUTPUT_RAWREL 2 // raw but with ORG as a relative offset + +enum +{ + ERR_NONE, // no error + ERR_BADOP, // bad opcode + ERR_BADSYM, // illegal symbol + ERR_DUPSYM, // duplicate symbol definition + ERR_NOSYM, // symbol required but not present + ERR_FORWARD, // forward references not permitted here + ERR_OVERFLOW, // byte overflow + ERR_PHASE, // phasing error + ERR_BADOPER, // bad operand + ERR_SYM, // symbol present where not permitted + ERR_UNDEF, // undefined symbol + ERR_OVERFLOW3, // bit number out of range + ERR_BADEXPR, // invalid expression + ERR_BADREG, // invalid register + ERR_BADFN, // bad file name + ERR_ENDM, // end macro without macro + ERR_MACRO, // redefined macro + ERR_NESTNAME, // nested namespace + ERR_BADCOND, // bad condition + ERR_USER, // user error + ERR_PRAGMA, // bad pragma + + ERR_MAXERR // last error in the list +}; + +typedef struct sourceline_s sourceline_t; + +// structure to keep track of errors +typedef struct errortab_s errortab_t; +struct errortab_s { + int errnum; + sourceline_t *line; + errortab_t *next; +}; + +typedef struct macroline_s macroline_t; +struct macroline_s +{ + char *linetext; + macroline_t *next; +}; + +typedef struct macrotab_s macrotab_t; +struct macrotab_s +{ + char *name; // name of the macro + macroline_t *linehead; // start of the macro lines + macroline_t *linetail; // last line of macro + macrotab_t *next; +}; + + +// structure to keep track of each line of the source +// this also keeps various bits of state about a line +struct sourceline_s { + char *sourcefile; // name of the source file + int lineno; // line number in the source file + char *symstr; // symbol on this line (if any) + int opcode; // index to instab for this line + int opbytes; // actual bytes of opcode + int postbyte; // post byte for the instruction + int numcodebytes; // how many code bytes for this line + unsigned char *codebytes; // actual code for this line + int codesize; // size of codebytes +// if minaddr and maxaddr are the same, we know exactly which address +// we are at so there can be no possible phase error with symbols defined +// here; these are *code* addresses + int len; // length of this insn + int in_macro; // set if it's a macro expansion line + int code_symloc; + int addrmode; // addressing mode of this insn + int addr; // the lowest possible address of this line + int dpval; // dp value at this point in the code + int hassym; // is there a symbol on this line + int addrset; // is this insn a point where the address is *set* (org) + int isequ; // does this insn set a symbol address (equ)? + int isset; // is the address setting from a "set"? + int issetdp; // this insn sets DP + int symaddr; // address for the symbol (if we're setting one) + // also used for "setdp" + int undef; // set if the symbol is undefined + int p1f16; // if we forced 16 bit on pass 1 so we can force it on pass 2 + int nocode; // if set, there is no code to output (rmb) + int notinsn; // if this is not a regular insn (used for formatting output) + char *line; // the text of the line + char *opcstr; // opcode string + char *operstr; // operand string + char *remainder; // remainder string (whole line if no opcode/operand + errortab_t *errors; // errors on this line + sourceline_t *next; // next line + sourceline_t *prev; // previous line + macrotab_t *macro; // pointer to macro table entry if this is a macro + int skipped; // set if the line was skipped + char *user_error; // user error message + int macrodef; // set if it's a macro definition line +}; + +// structure to keep the symbol table +typedef struct symtab_s symtab_t; +struct symtab_s { + char *symbol; // symbol name + sourceline_t *line; // pointer to the line where symbol is defined + int addr; // address of symbol (-1 for unknown) + int flags; // flags for symbol + symtab_t *next; // next symbol +}; + + +// keep track of current assembler state +typedef struct { + int dpval; // current dp value (setdp) + int addr; // current address + symtab_t *symbol_table; + sourceline_t *source_head; + sourceline_t *source_tail; + int errorcount; // error count + int passnum; // which pass are we on? + const char *infile; // input file + const char *outfile;// output file + const char *listfile; // output listing file + int debug; // debug mode + int outformat; // output format type: 0 = decb, 1 = raw + int execaddr; // execution address for the program (END ....) + macrotab_t *macros; // pointer to macros + int inmacro; // are we in a macro? + char *cur_namespace; // current namespace prefix + int skipcond; // are we skipping a condition? + int skipcount; // number of endc we need before we stop skipping + int skipmacro; // are we skipping a macro definition? + int noelse; // skipped an else? + int pragmas; // what pragmas are in effect? +} asmstate_t; + +#define PRAGMA_NOINDEX0TONONE 1 + + +#ifndef __lwasm_c_seen__ +extern int eval_expr(asmstate_t *as, sourceline_t *cl, char **optr, int *val); +extern void register_error(asmstate_t *as, sourceline_t *cl, int errcode); +extern int lookupreg3(const char *rlist, char **str); +extern int lookupreg(const char *reglist, char **str); +extern void lwasm_read_file(asmstate_t *as, char *fname); +extern void addcodebyte(asmstate_t *as, sourceline_t *cl, int cb); +#endif + +#define SYMFLAG_NONE 0 +#define SYMFLAG_SET 1 + +#ifndef __symtab_c_seen__ +#include <stdio.h> +extern void register_symbol(asmstate_t *as, sourceline_t *cl, char *symstr, int val, int flags); +extern int lookup_symbol(asmstate_t *as, char *symstr); +extern void list_symbols(asmstate_t *as, FILE *f); +#endif + + +#ifndef __index_c_seen__ +extern int parse_index_expr(asmstate_t *as, sourceline_t *cl, char **optr, int *postbyte, int *opmode, int *v1); +#endif + +#define emit(cb) do { addcodebyte(as, cl, (cb)); } while (0) +#define emitop(cb) do { if ((cb) > 0xff) addcodebyte(as, cl, (cb)>>8); addcodebyte(as, cl, (cb) & 0xff); } while (0) +#define errorp1(e) do { if (as -> passnum == 1) register_error(as, cl, (e)); } while (0) +#define errorp2(e) do { if (as -> passnum == 2) register_error(as, cl, (e)); } while (0) + +#endif //__lwasm_h_seen__