diff --git a/include/asm/lexer.h b/include/asm/lexer.h index 0f33c916..6f9d1fa1 100644 --- a/include/asm/lexer.h +++ b/include/asm/lexer.h @@ -30,6 +30,19 @@ static inline void lexer_SetStateAtEOL(struct LexerState *state) lexerStateEOL = state; } +extern char const *binDigits; +extern char const *gfxDigits; + +static inline void lexer_SetBinDigits(char const *digits) +{ + binDigits = digits; +} + +static inline void lexer_SetGfxDigits(char const *digits) +{ + gfxDigits = digits; +} + struct LexerState *lexer_OpenFile(char const *path); struct LexerState *lexer_OpenFileView(char *buf, size_t size, uint32_t lineNo); void lexer_RestartRept(uint32_t lineNo); diff --git a/src/asm/fstack.c b/src/asm/fstack.c index 0a8cf5f1..a464f436 100644 --- a/src/asm/fstack.c +++ b/src/asm/fstack.c @@ -336,7 +336,7 @@ char const *fstk_GetFileName(void) int nbChars = snprintf(dest, remainingChars, __VA_ARGS__); \ \ if (nbChars >= remainingChars) \ - fatalerror("File stack entry too large"); \ + fatalerror("File stack entry too large\n"); \ remainingChars -= nbChars; \ dest += nbChars; \ } while (0) diff --git a/src/asm/lexer.c b/src/asm/lexer.c index 15483226..762fa148 100644 --- a/src/asm/lexer.c +++ b/src/asm/lexer.c @@ -966,20 +966,26 @@ static void readFractionalPart(void) yylval.nConstValue |= fractional * (yylval.nConstValue >= 0 ? 1 : -1); } +char const *binDigits; + static void readBinaryNumber(void) { uint32_t value = 0; - dbgPrint("Reading binary number\n"); + dbgPrint("Reading binary number with digits [%c,%c]\n", binDigits[0], binDigits[1]); for (;;) { int c = peek(0); + int bit; - /* TODO: handle `-b`'s dynamic chars */ - if (c != '0' && c != '1') + if (c == binDigits[0]) + bit = 0; + else if (c == binDigits[1]) + bit = 1; + else break; - if (value > (UINT32_MAX - (c - '0')) / 2) + if (value > (UINT32_MAX - bit) / 2) warning(WARNING_LARGE_CONSTANT, "Integer constant is too large\n"); - value = value * 2 + (c - '0'); + value = value * 2 + bit; shiftChars(1); } @@ -1019,19 +1025,29 @@ static void readHexNumber(void) yylval.nConstValue = value; } +char const *gfxDigits; + static void readGfxConstant(void) { uint32_t bp0 = 0, bp1 = 0; uint8_t width = 0; - dbgPrint("Reading gfx constant\n"); + dbgPrint("Reading gfx constant with digits [%c,%c,%c,%c]\n", + gfxDigits[0], gfxDigits[1], gfxDigits[2], gfxDigits[3]); for (;;) { int c = peek(0); + uint32_t pixel; - /* TODO: handle `-g`'s dynamic chars */ - if (c < '0' || c > '3') + if (c == gfxDigits[0]) + pixel = 0; + else if (c == gfxDigits[1]) + pixel = 1; + else if (c == gfxDigits[2]) + pixel = 2; + else if (c == gfxDigits[3]) + pixel = 3; + else break; - uint8_t pixel = c - '0'; if (width < 8) { bp0 = bp0 << 1 | (pixel & 1); @@ -1531,7 +1547,7 @@ static int yylex_NORMAL(void) case '%': /* Either a modulo, or a binary constant */ secondChar = peek(0); - if (secondChar != '0' && secondChar != '1') + if (secondChar != binDigits[0] && secondChar != binDigits[1]) return T_OP_MOD; yylval.nConstValue = 0; diff --git a/src/asm/main.c b/src/asm/main.c index 4f264d36..c57b7fba 100644 --- a/src/asm/main.c +++ b/src/asm/main.c @@ -71,10 +71,11 @@ struct sOptionStackEntry { struct sOptionStackEntry *pOptionStack; -void opt_SetCurrentOptions(struct sOptions *pOpt) +void opt_SetCurrentOptions(struct sOptions *opt) { - /* TODO */ - (void)pOpt; + CurrentOptions = *opt; + lexer_SetGfxDigits(CurrentOptions.gbgfx); + lexer_SetBinDigits(CurrentOptions.binary); } void opt_Parse(char *s) diff --git a/test/asm/opt-b.asm b/test/asm/opt-b.asm new file mode 100644 index 00000000..cd16ab38 --- /dev/null +++ b/test/asm/opt-b.asm @@ -0,0 +1,2 @@ +OPT b.X +PRINTV %..X.X.X. diff --git a/test/asm/opt-b.err b/test/asm/opt-b.err new file mode 100644 index 00000000..e69de29b diff --git a/test/asm/opt-b.out b/test/asm/opt-b.out new file mode 100644 index 00000000..fce2ec6e --- /dev/null +++ b/test/asm/opt-b.out @@ -0,0 +1 @@ +$2A \ No newline at end of file diff --git a/test/asm/opt-g.asm b/test/asm/opt-g.asm new file mode 100644 index 00000000..5c165817 --- /dev/null +++ b/test/asm/opt-g.asm @@ -0,0 +1,2 @@ +OPT g.x0X +PRINTV `.x.x0X0X diff --git a/test/asm/opt-g.err b/test/asm/opt-g.err new file mode 100644 index 00000000..e69de29b diff --git a/test/asm/opt-g.out b/test/asm/opt-g.out new file mode 100644 index 00000000..e0c24b67 --- /dev/null +++ b/test/asm/opt-g.out @@ -0,0 +1 @@ +$F55 \ No newline at end of file