diff options
author | mrb0nk500 <b0nk@b0nk.xyz> | 2020-11-20 15:10:24 -0500 |
---|---|---|
committer | mrb0nk500 <b0nk@b0nk.xyz> | 2020-11-20 15:10:24 -0500 |
commit | 83ce1151ee1f06ae6b1c5c1018cc2489494e5ea4 (patch) | |
tree | ba4edade46c57ec5119d01ab8a7ad9f7943c6804 /lexer.c | |
parent | dc7ebb9d424bb39d59f09b8498746beb871c46f4 (diff) |
- Implemented support for Sux's base extension.
This is the biggest milestone I've reached for this
project, since the base extension changes alot about
what Sux can do by default, and now makes it a viable
instruction set for modern day use, when compared
with other instruction sets.
Diffstat (limited to 'lexer.c')
-rw-r--r-- | lexer.c | 36 |
1 files changed, 22 insertions, 14 deletions
@@ -242,6 +242,7 @@ uint64_t lex(char *str, uint64_t address, uint16_t bline, uint8_t dbg) { lex_type = 0xFF; uint8_t k = 0; + uint8_t k2 = 0; union reg ch; ch.u64 = 0; uint8_t rs = 0; @@ -324,12 +325,13 @@ uint64_t lex(char *str, uint64_t address, uint16_t bline, uint8_t dbg) { offset++; } switch (get_ptok(str[i+offset], dbg)) { - case PTOK_B : - case PTOK_X : - case PTOK_Y : - case PTOK_S : - case PTOK_P : - case PTOK_ALPHA : + case PTOK_B : + case PTOK_E : + case PTOK_X : + case PTOK_Y : + case PTOK_S : + case PTOK_P : + case PTOK_ALPHA : case PTOK_NUMBER: ptok = PTOK_ALPHA; break; } if ((ptok == PTOK_S && toupper(str[i+1]) != 'P') || (ptok == PTOK_P && toupper(str[i+1]) != 'C')) { @@ -584,6 +586,7 @@ uint64_t lex(char *str, uint64_t address, uint16_t bline, uint8_t dbg) { (t) ? (t->subspace = space) : (lt->subspace = space); (t) ? (t->subtab = tab) : (lt->subtab = tab); break; + case PTOK_E: case PTOK_X: case PTOK_Y: lexeme[j] = str[i++]; @@ -593,8 +596,9 @@ uint64_t lex(char *str, uint64_t address, uint16_t bline, uint8_t dbg) { break; } switch (ptok) { - case PTOK_X: l->tok->type = (lex_type == TOK_IND) ? INDX : ZMX; break; - case PTOK_Y: l->tok->type = (lex_type == TOK_IND) ? INDY : ZMY; break; + case PTOK_E: l->tok->type = (lex_type == TOK_IND) ? EIND : l->tok->type; break; + case PTOK_X: l->tok->type = (lex_type == TOK_IND) ? INDX : ZMX; break; + case PTOK_Y: l->tok->type = (lex_type == TOK_IND) ? INDY : ZMY; break; } break; case PTOK_S: @@ -697,13 +701,17 @@ uint64_t lex(char *str, uint64_t address, uint16_t bline, uint8_t dbg) { isch = 0; isop = 0; if (j == 3 && str[i] != ':' && !is_struct) { - for (k = 0; k < OPNUM; k++) { - if (toupper(lexeme[0]) == mne[k][0]) { - if (!strcasecmp(lexeme, mne[k])) { - lex_type = TOK_OPCODE; + for (k = 0, k2 = 0; k < OPNUM || k2 < EXT_OPNUM; k++, k2++) { + int find_ext = (k2 < EXT_OPNUM); + int upper = toupper(lexeme[0]); + if (upper == mne[k][0] || (find_ext && upper == ext_mne[k2][0])) { + int is_base = !strcasecmp(lexeme, mne[k]); + int is_ext = (find_ext && !strcasecmp(lexeme, ext_mne[k2])); + if (is_base || is_ext) { + lex_type = (is_base && !is_ext) ? TOK_OPCODE : TOK_EXTOP; isop = 1; l->count++; - t = make_token(lex_type, 0xFF, space, tab, k, "", NULL); + t = make_token(lex_type, 0xFF, space, tab, (is_base && !is_ext) ? k : k2, "", NULL); break; } } @@ -791,7 +799,7 @@ uint64_t lex(char *str, uint64_t address, uint16_t bline, uint8_t dbg) { printf("lex(): lexeme: %s, lex_type: %s\n", lexeme, (lex_type != 0xFF) ? lex_tok[lex_type] : "TOK_NONE"); } j = 0; - if (lex_type == TOK_OPCODE && !isop) { + if ((lex_type == TOK_OPCODE || lex_type == TOK_EXTOP) && !isop) { j = 0; } else if (lex_type == TOK_EXPR || (lex_type != TOK_MEMBER && !isdelm2(str[i], dbg))) { i++; |