1
0
mirror of https://github.com/RevCurtisP/C02.git synced 2024-06-08 06:29:32 +00:00

Implemented Indirect Goto

This commit is contained in:
Curtis F Kaylor 2019-05-18 12:19:47 -04:00
parent b6cec4d75a
commit 0150493748
4 changed files with 23 additions and 14 deletions

View File

@ -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

View File

@ -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)
}

View File

@ -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

View File

@ -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);