diff --git a/src/c02.c b/src/c02.c index 840c51e..5c1a0bb 100644 --- a/src/c02.c +++ b/src/c02.c @@ -44,6 +44,8 @@ void init(void) { rambas = 0; //RAM Base Address wrtbas = 0; //Write Base Address zpaddr = 0; //Current Zero-Page Address + zpgbgn = 0; //Start of Free Zero-Page + zpgend = 0xFF; //End of Free Zero-Page invasc = FALSE; //Invert ASCII Flag mskasc = FALSE; //Set High Bit Flag fcase = FALSE; //First Case Statement Flag diff --git a/src/expr.c b/src/expr.c index 35a4ca7..e43c620 100644 --- a/src/expr.c +++ b/src/expr.c @@ -219,12 +219,12 @@ void prsadr(int adract) { void prsstr(int adract, int alwstr) { if (!alwstr) ERROR("Illegal String Reference", 0, EXIT_FAILURE) DEBUG("expr.prsstr: Parsing anonymous string\n", 0) - newlbl(vrname); //Generate Variable Name - value[0] = 0; //Use Variable Size 0 - setvar(MTNONE, VTCHAR); //Set Variable Name, Type, and Size - prsdts(); //Parse Data String - setdat(); //Set Variable Data - varcnt++; //Increment Variable Counter + newlbl(vrname); //Generate Variable Name + value[0] = 0; //Use Variable Size 0 + setvar(MTCONST, VTCHAR); //Set Variable Name, Type, and Size + prsdts(); //Parse Data String + setdat(); //Set Variable Data + varcnt++; //Increment Variable Counter if (adract) prcadr(adract, vrname); //Compile Address Reference else strcpy(word, vrname); //Save for Calling Routine } diff --git a/src/include.c b/src/include.c index 50df246..22c41bc 100644 --- a/src/include.c +++ b/src/include.c @@ -129,8 +129,12 @@ void pwrtbs(void) { /* Parse Zeropage Subdirective */ void pzropg(void) { - zpaddr = prsnum(0xFF); //Set Zero Page Address to Literal - DEBUG("Set zero page address to %d\n", zpaddr) + zpgbgn = prsnum(0xFF); //Set Zero Page Address to Literal + zpgend = prsnum(0xFF); //Set Zero Page Address to Literal + zpaddr = zpgbgn; + DEBUG("Set free zero page to %d ", zpgbgn) + DETAIL("through %d ", zpgend) + DETAIL("and zero page address to %d\n", zpaddr) } /* Process Vartable Subdirective */ diff --git a/src/vars.c b/src/vars.c index 31d2397..2f1e213 100644 --- a/src/vars.c +++ b/src/vars.c @@ -272,6 +272,8 @@ void addvar(int m, int t) { if (t == VTVOID) ERROR("Illegal Variable Type\n", 0, EXIT_FAILURE) if (m & MTZP) { if (alcvar) { + int zpgmax = (t == VTINT) ? zpgend -1 : zpgend; + if (zpaddr > zpgmax) ERROR("Free Zero Page Space Exceeded\n", 0, EXIT_FAILURE) setlbl(vrname); sprintf(word, "$%hhX", zpaddr++); if (t == VTINT) zpaddr++; //int uses two bytes diff --git a/src/vars.h b/src/vars.h index 5174cc8..fde96fc 100644 --- a/src/vars.h +++ b/src/vars.h @@ -75,6 +75,8 @@ int symdef(char *name); //Is Variable defined (TRUE or FALSE) int rambas; //RAM Base Address (0=None) int wrtbas; //Write Base Address (0=None) int zpaddr; //Current Zero-Page Address +int zpgbgn; //Start of Free Zero-Page +int zpgend; //End of Free Zero-Page char wrtofs[6]; //Write Address Offset void addvar(int m, int t); //Parse and Compile Variable Declaration