diff options
author | mrb0nk500 <b0nk@b0nk.xyz> | 2020-05-28 20:03:09 -0400 |
---|---|---|
committer | mrb0nk500 <b0nk@b0nk.xyz> | 2020-05-28 20:03:09 -0400 |
commit | 7ba25336342282bfe57dbb6ddf8f3e2ae3e1b719 (patch) | |
tree | 1e9a5921d19056be61b9f613f254556edf5242a7 /asmmon.h | |
parent | 691ae45b3916379b0b1d845a5581d9068426b134 (diff) |
Refactored the assembler, yet again, and implemented
support for comma separated values.
The assembler now uses a linked list of tokenized
lines, each containing a linked list of tokens for
that line.
I also moved all of the large tables into the higher
parts of memory, in order to free up the lower part of
memory for the user.
Comma sepparated values only work with directives, and
only with the byte", word, dword, and qword directives.
I also added support for getting the upper, and lower
halves of an address. The tokens for both of those are
'<', and '>' respectively.
Diffstat (limited to 'asmmon.h')
-rw-r--r-- | asmmon.h | 79 |
1 files changed, 62 insertions, 17 deletions
@@ -28,9 +28,40 @@ struct line { uint64_t addr; }; +struct tok { + struct tok *next; /* Pointer to the next token. */ + uint8_t id; /* Token ID. */ + uint8_t type; /* Token type ID. */ + + /* Token value(s). */ + union { + char *str; + uint8_t byte ; + uint16_t word ; + uint32_t dword; + uint64_t qword; + }; +}; + +struct ln { + struct ln *next; /* Pointer to the next line. */ + struct tok *tok; /* The token(s) for this line. */ + uint16_t count; /* Total tokens for this line. */ + uint16_t linenum; /* Line number. */ + uint64_t addr; /* The address of this line. */ + uint8_t stab; /* Number of starting tabs. */ + uint8_t sspace; /* Number of starting spaces. */ + uint8_t etab; /* Number of ending tabs. */ + uint8_t espace; /* Number of ending spaces. */ +}; + +typedef struct tok token; +typedef struct ln line; + + struct fixup { struct symbol *s; - uint16_t ln; + token *t; uint64_t adr; }; @@ -45,6 +76,10 @@ extern char lexeme[]; extern char *string[]; extern char *comment[]; extern uint16_t incl[]; +extern line *lines; +extern line *last_line; +extern token *tokens; +extern token *last_tok; extern struct line tokline[]; extern struct line tln[]; extern struct symbol *symbols[]; @@ -52,7 +87,7 @@ extern struct fixup *fixups[]; extern uint8_t lex_type; -enum { +enum dir { DIR_ORG, DIR_BYTE, DIR_WORD, @@ -61,12 +96,12 @@ enum { DIR_INCLUDE }; -enum { +enum token { TOK_DIR, TOK_LABEL, TOK_SYM, - TOK_PLUS, - TOK_MINUS, + TOK_EXPR, + TOK_COMMA, TOK_STRING, TOK_CHAR, TOK_IMM, @@ -79,11 +114,12 @@ enum { TOK_INCLUDE }; -enum { - BASE_HEX, - BASE_DEC, - BASE_BIN, - BASE_CHAR +enum expr { + EXPR_PLUS, + EXPR_MINUS, + EXPR_LOW, + EXPR_HIGH, + EXPR_NONE }; static const uint8_t opcodes[OPNUM][9] = { @@ -200,8 +236,8 @@ static const char *lex_tok[15] = { [0x0] = "TOK_DIR", [0x1] = "TOK_LABEL", [0x2] = "TOK_SYM", - [0x3] = "TOK_PLUS", - [0x4] = "TOK_MINUS", + [0x3] = "TOK_EXPR", + [0x4] = "TOK_COMMA", [0x5] = "TOK_STRING", [0x6] = "TOK_CHAR", [0x7] = "TOK_IMM", @@ -437,10 +473,12 @@ extern uint16_t stridx; extern uint16_t comidx; extern uint16_t inc_file; /* Number of included files. */ -typedef struct { +struct bc { uint64_t progsize; uint64_t datasize; -} bytecount; +}; + +typedef struct bc bytecount; extern uint8_t defined; extern uint8_t isfixup; @@ -450,7 +488,14 @@ extern uint16_t mksymbol(const char *name, uint64_t val, uint8_t def, uint8_t us extern uint64_t use_symbol(const char *name, uint16_t id, uint64_t val, uint8_t useid, uint8_t dbg); extern uint8_t set_symval(const char *name, uint16_t id, uint64_t val, uint8_t useid, uint8_t dbg); extern char *get_symname(uint16_t id, uint8_t dbg); -extern uint16_t get_symid(const char *name, uint64_t val, uint16_t ln, uint8_t dbg); +extern uint16_t get_symid(const char *name, uint64_t val, token *t, uint8_t dbg); extern uint16_t get_comment(const char *cmnt, uint8_t dbg); -extern uint16_t reslv_fixups(struct line *l, uint8_t dbg); -extern uint64_t lex(char *str, struct line *l, uint64_t address, uint8_t dbg); +extern uint16_t reslv_fixups(uint8_t dbg); +extern line *find_line(uint16_t ln, uint8_t dbg); +extern uint64_t lex(char *str, uint64_t address, uint8_t dbg); + +extern uint64_t parse_tokens(token *tm, bytecount *bc, uint8_t isasm, uint64_t address, uint8_t dbg); +extern token *make_token(uint8_t id, uint8_t type, uint64_t value, char *str); +extern void assemble(line *ln, bytecount *bc, uint8_t dbg); +extern void free_tokens(token *t, uint16_t count); +extern void free_lines(); |