mirror of
https://github.com/RevCurtisP/C02.git
synced 2025-02-19 19:31:04 +00:00
Implemented Indirect Goto
This commit is contained in:
parent
b6cec4d75a
commit
0150493748
@ -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
|
||||
|
20
src/expr.c
20
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)
|
||||
}
|
||||
|
@ -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
|
||||
|
13
src/stmnt.c
13
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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user