X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=expr.c;h=c89b1828b6f4f88acf1707b21f248a4b24ddcff5;hp=4c4168f4a0c543eb45179a5ac376ff2337f8dc7c;hb=96a5cd69571096f11a3a2a40f6133374f0adc9bb;hpb=a29cbeceeadc92ff48ffa70a51135b503c96cc6d diff --git a/expr.c b/expr.c index 4c4168f..c89b182 100644 --- a/expr.c +++ b/expr.c @@ -1,7 +1,7 @@ // -// RMAC - Reboot's Macro Assembler for the Atari Jaguar Console System +// RMAC - Reboot's Macro Assembler for all Atari computers // EXPR.C - Expression Analyzer -// Copyright (C) 199x Landon Dyer, 2017 Reboot and Friends +// Copyright (C) 199x Landon Dyer, 2011-2017 Reboot and Friends // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986 // Source utilised with the kind permission of Landon Dyer // @@ -244,10 +244,10 @@ int expr2(void) if (sy->sattre & EQUATEDREG) { if ((regbank == BANK_0) && (sy->sattre & BANK_1) && !altbankok) - warns("equated symbol \'%s\' cannot be used in register bank 0", sy->sname); + warn("equated symbol \'%s\' cannot be used in register bank 0", sy->sname); if ((regbank == BANK_1) && (sy->sattre & BANK_0) && !altbankok) - warns("equated symbol \'%s\' cannot be used in register bank 1", sy->sname); + warn("equated symbol \'%s\' cannot be used in register bank 1", sy->sname); } *evalTokenBuffer++ = SYMBOL; @@ -264,7 +264,7 @@ int expr2(void) return ERROR; if (*tok++ != ')') - return error("missing close parenthesis ')'"); + return error("missing closing parenthesis ')'"); break; case '[': @@ -272,7 +272,7 @@ int expr2(void) return ERROR; if (*tok++ != ']') - return error("missing close parenthesis ']'"); + return error("missing closing bracket ']'"); break; case '$': @@ -287,6 +287,20 @@ int expr2(void) *evalTokenBuffer++ = (orgactive ? orgaddr : pcloc); // '*' takes attributes of current section, not ABS! *evalTokenBuffer++ = cursect | DEFINED; + break; + case '{': + if (expr0() != OK) // Eat up first parameter (register or immediate) + return ERROR; + + if (*tok++ != ':') // Demand a ':' there + return error("missing colon ':'"); + + if (expr0() != OK) // Eat up second parameter (register or immediate) + return ERROR; + + if (*tok++ != '}') + return error("missing closing brace '}'"); + break; default: return error("bad expression"); @@ -386,7 +400,7 @@ if (symbol) // means it will be fixed up later, and thus, not an error. if ((symbol->sattre & UNDEF_EQUR) && !riscImmTokenSeen) { - errors("undefined register equate '%s'", symbol->sname); + error("undefined register equate '%s'", symbol->sname); //if we return right away, it returns some spurious errors... // return ERROR; } @@ -395,10 +409,10 @@ if (symbol) if (symbol->sattre & EQUATEDREG) { if ((regbank == BANK_0) && (symbol->sattre & BANK_1) && !altbankok) - warns("equated symbol '%s' cannot be used in register bank 0", symbol->sname); + warn("equated symbol '%s' cannot be used in register bank 0", symbol->sname); if ((regbank == BANK_1) && (symbol->sattre & BANK_0) && !altbankok) - warns("equated symbol '%s' cannot be used in register bank 1", symbol->sname); + warn("equated symbol '%s' cannot be used in register bank 1", symbol->sname); } *evalTokenBuffer++ = SYMBOL; @@ -680,7 +694,7 @@ printf("EVEXPR (-): sym1 = %X, sym2 = %X\n", attr, sattr[1]); sattr--; // Pop attrib if (sval[1] == 0) - return error("divide by zero"); + return error("division by zero"); //printf("--> N/N: %i / %i = ", sval[0], sval[1]); // Compiler is picky here: Without casting these, it discards