diff --git a/src/common.h b/src/common.h index 0df5aa8..e83af00 100644 --- a/src/common.h +++ b/src/common.h @@ -61,7 +61,7 @@ int savchr; //Holds nxtchr when switching input files int wrdlen; //Length of Parsed Word char word[LINELEN]; //Word parsed from source file -char uword[LINELEN]; //Word converted too uppercase +char uword[LINELEN]; //Word converted to uppercase char cmtasm[LINELEN]; //Assembly Language Comment Text char hdrnam[FNAMLEN]; //Header File Name diff --git a/src/expr.c b/src/expr.c index c34d8c6..a1d736c 100644 --- a/src/expr.c +++ b/src/expr.c @@ -330,15 +330,23 @@ int prsxpf(char trmntr) { return prsxpp(trmntr, TRUE); } -/* Parse and compile integer expression */ -void prsxpi(char trmntr) { +/* Parse and Compile Integer Expression * + * (Address, Integer Literal, Variable, * + * Struct Member, or Function) * + * Args: trmntr - expression terminator * + * asmxpr - assemble expression * + * Sets: value - Parsed Value or Symbol */ +void prsxpi(char trmntr, int asmxpr) { skpspc(); + DEBUG("Parsing integer expression\n", 0) if (!chkadr(TRUE, FALSE)) { if (isnpre()) { DEBUG("Parsing Integer Literal\n", 0) - int number = prsnum(0xFFFF); - sprintf(value, "%d", number & 0xFF); asmlin("LDX", value); - sprintf(value, "%d", number >> 8); asmlin("LDY", value); + int number = prsnum(0xFFFF); //Parse Number into value + if (asmxpr) { + sprintf(value, "%d", number & 0xFF); asmlin("LDX", value); + sprintf(value, "%d", number >> 8); asmlin("LDY", value); + } } else if (isalph()) { prsvar(FALSE, TRUE); if (valtyp == FUNCTION) { @@ -348,7 +356,7 @@ void prsxpi(char trmntr) { prsmbr(value); if (vartyp != VTINT) ERROR("Illegal Member %s In Integer Expression", value, EXIT_FAILURE) } else if (valtyp == VARIABLE && vartyp == VTINT) { - prcvri(); //Process Integer Variable + if (asmxpr) prcvri(); //Process Integer Variable } else { ERROR("Illegal Variable %s In Integer Expression", value, EXIT_FAILURE) } diff --git a/src/expr.h b/src/expr.h index 8963cd8..f57a653 100644 --- a/src/expr.h +++ b/src/expr.h @@ -27,4 +27,4 @@ int prstrm(int alwint); //Parse Term in Expression void prsrxp(char trmntr); //Parse Rest of Expression int prsxpf(char trmntr); //Parse Expression in Function Call void prsxpr(char trmntr); //Parse Expression -void prsxpi(char trmntr); //Parse Integer Expression +void prsxpi(char trmntr, int asmxpr); //Parse Integer Expression diff --git a/src/stmnt.c b/src/stmnt.c index 24c617f..8b49535 100644 --- a/src/stmnt.c +++ b/src/stmnt.c @@ -129,7 +129,7 @@ void prcasi(char trmntr) { strcpy(xsnvar, vrname); //Set Assignment LSB strcpy(ysnvar, vrname); strcat(ysnvar, "+1"); //Set Assignment MSB ysnidx[0] = 0; //No Y Index - prsxpi(trmntr); + prsxpi(trmntr, TRUE); //Parse Integer Expression, Allowing Functions prcaxy(); } @@ -298,11 +298,12 @@ void pelse(void) { /* parse and compile if statement */ void pgoto(void) { DEBUG("Parsing GOTO statement\n", 0) - int indrct = look('('); - if (!chkadr(ADNONE, FALSE)) getwrd(); - if (indrct) { - expect(')'); - ERROR("Indirect GOTO Not Implemented\n", 0, EXIT_FAILURE) + if (look('(')) { + DEBUG("Processing Indirect GOTO\n", 0); + prsxpi(')', FALSE); //Parse Integer Expression w/o Assembly + sprintf(word, "(%s)", value); //Set Indirect Argument + } else { + if (!chkadr(ADNONE, FALSE)) getwrd(); } expect(';'); asmlin("JMP", word);