From df81112b8369eeca5788a6f28c6b6b85ca911a95 Mon Sep 17 00:00:00 2001 From: mrb0nk500 Date: Mon, 1 Jun 2020 15:15:17 -0400 Subject: Did some more refactoring to the assembler. - Refactored the symbol, and fixup table to now use a linked list - Added support for local symbols to the assembler. - Rewrote SuBEditor, and SuBAsm to use local symbols. --- asmmon.h | 109 +++++++++++++++++++++++++-------------------------------------- 1 file changed, 43 insertions(+), 66 deletions(-) (limited to 'asmmon.h') diff --git a/asmmon.h b/asmmon.h index 53fdea2..213c9b5 100644 --- a/asmmon.h +++ b/asmmon.h @@ -4,37 +4,19 @@ #define MAX_TOK 0x1000 -struct line { - uint8_t stab; - uint8_t sspace; - uint8_t dir; - uint8_t mne; - uint8_t rs; - uint8_t opbase; - uint8_t aopbase; - uint8_t am; - uint8_t cm; - uint8_t etab; - uint8_t espace; - uint8_t islabel; - uint8_t issym; - uint16_t sym; - uint16_t com; - uint16_t str; - uint16_t incl; - uint16_t linenum; - uint64_t op; - uint64_t aop; - uint64_t addr; -}; +typedef struct tok token ; +typedef struct ln line ; +typedef struct sym symbol; +typedef struct fix fixup ; struct tok { - struct tok *next; /* Pointer to the next token. */ - uint8_t id; /* Token ID. */ - uint8_t type; /* Token type ID. */ + token *next; /* Pointer to the next token. */ + uint8_t id; /* Token ID. */ + uint8_t type; /* Token type ID. */ /* Token value(s). */ union { + symbol *sym; char *str; uint8_t byte ; uint16_t word ; @@ -44,8 +26,8 @@ struct tok { }; struct ln { - struct ln *next; /* Pointer to the next line. */ - struct tok *tok; /* The token(s) for this line. */ + line *next; /* Pointer to the next line. */ + token *tok; /* The token(s) for this line. */ uint16_t count; /* Total tokens for this line. */ uint32_t linenum; /* Line number. */ uint64_t addr; /* The address of this line. */ @@ -55,20 +37,22 @@ struct ln { uint8_t espace; /* Number of ending spaces. */ }; -typedef struct tok token; -typedef struct ln line; -struct fixup { - struct symbol *s; +struct fix { + fixup *next; + symbol *s; token *t; uint64_t adr; }; -struct symbol { +struct sym { + symbol *next; + symbol *local; + uint16_t count; uint64_t val; uint8_t def; - char name[128]; + char *name; uint16_t id; }; @@ -80,10 +64,9 @@ 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[]; -extern struct fixup *fixups[]; +extern symbol *symbols; +extern symbol *locals; +extern fixup *fixups; extern uint8_t lex_type; @@ -98,6 +81,7 @@ enum dir { enum token { TOK_DIR, + TOK_LOCAL, TOK_LABEL, TOK_SYM, TOK_EXPR, @@ -117,6 +101,7 @@ enum token { enum pre_token { PTOK_DOT, + PTOK_AT, PTOK_COLON, PTOK_EQU, PTOK_PLUS, @@ -255,23 +240,24 @@ static const char *rs_t[4] = { [3] = ".q" }; -static const char *lex_tok[16] = { - [0x0] = "TOK_DIR", - [0x1] = "TOK_LABEL", - [0x2] = "TOK_SYM", - [0x3] = "TOK_EXPR", - [0x4] = "TOK_CSV", - [0x5] = "TOK_STRING", - [0x6] = "TOK_CHAR", - [0x7] = "TOK_IND", - [0x8] = "TOK_IMM", - [0x9] = "TOK_OPCODE", - [0xA] = "TOK_RS", - [0xB] = "TOK_COMMENT", - [0xC] = "TOK_HEX", - [0xD] = "TOK_DEC", - [0xE] = "TOK_BIN", - [0xF] = "TOK_INCLUDE" +static const char *lex_tok[17] = { + [0x00] = "TOK_DIR", + [0x01] = "TOK_LOCAL", + [0x02] = "TOK_LABEL", + [0x03] = "TOK_SYM", + [0x04] = "TOK_EXPR", + [0x05] = "TOK_CSV", + [0x06] = "TOK_STRING", + [0x07] = "TOK_CHAR", + [0x08] = "TOK_IND", + [0x09] = "TOK_IMM", + [0x0A] = "TOK_OPCODE", + [0x0B] = "TOK_RS", + [0x0C] = "TOK_COMMENT", + [0x0D] = "TOK_HEX", + [0x0E] = "TOK_DEC", + [0x0F] = "TOK_BIN", + [0x10] = "TOK_INCLUDE" }; static const char *adrmode[9] = { @@ -504,19 +490,10 @@ typedef struct bc bytecount; extern uint8_t defined; extern uint8_t isfixup; -extern void init_symbol(); -extern uint16_t mksymbol(const char *name, uint64_t val, uint8_t def, uint8_t useid, uint16_t id, uint8_t dbg); -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, token *t, uint8_t dbg); -extern uint16_t get_comment(const char *cmnt, uint8_t dbg); -extern uint16_t reslv_fixups(uint8_t dbg); extern line *find_line(uint32_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 token *make_token(uint8_t id, uint8_t type, uint64_t value, char *str, symbol *sym); extern void assemble(line *ln, bytecount *bc, uint8_t dbg); -extern void free_tokens(token *t, uint16_t count); -extern void free_lines(); +extern void cleanup(); -- cgit v1.2.3-13-gbd6f