@@ -17,7 +17,7 @@ extern int currentbank;
1717extern int currentdmahole ;
1818extern int numredefvars ;
1919extern int numconstants ;
20- extern char constants [MAXCONSTANTS ][100 ];
20+ extern char constants [MAXCONSTANTS ][CONSTANTLEN ];
2121extern char incbasepath [500 ];
2222extern char redefined_variables [80000 ][100 ];
2323extern char bannerfilenames [1000 ][100 ];
@@ -27,8 +27,10 @@ extern int graphicsdatawidth[16];
2727extern char charactersetchars [257 ];
2828extern int passes ;
2929extern int line ;
30+ extern int savelevel ;
3031extern int dmaplain ;
3132extern int templabel ;
33+ extern int plotlabel ;
3234extern int tallspritecount ;
3335extern int fourbitfade_alreadyused ;
3436extern int zonelocking ;
@@ -57,15 +59,18 @@ extern int romsize_already_set;
5759extern int firstfourbyte ;
5860extern int firstcompress ;
5961extern int dumpgraphics_index ;
62+ extern int TIGHTPACKBORDER ;
63+ extern int changedmaholescalled ;
6064int maxpasses = 2 ;
6165
62- #define BASIC_VERSION_INFO "7800basic v0.33 "
66+ #define BASIC_VERSION_INFO "7800basic v0.34 "
6367
6468int main (int argc , char * argv [])
6569{
6670 char * * statement ;
6771 char * * deallocate_mem ;
6872 int i , j , k ;
73+ int def_idx ;
6974 int unnamed , defcount , defi ;
7075 char * c ;
7176 char single ;
@@ -77,8 +82,8 @@ int main (int argc, char *argv[])
7782 char * filename = "7800basic_variable_redefs.h" ;
7883 char * prefilename = NULL ;
7984 char * path = 0 ;
80- char def [250 ][100 ];
81- char defr [250 ][100 ];
85+ char def [500 ][100 ];
86+ char defr [500 ][100 ];
8287 char finalcode [500 ];
8388 char * codeadd ;
8489 char mycode [500 ];
@@ -117,6 +122,7 @@ int main (int argc, char *argv[])
117122 // we were called without the "-p" switch, so revert to the historic
118123 // single-pass behavior, since the basic source is coming from stdin,
119124 // and we can't rewind stdin.
125+ prwarn ("7800basic was launched without -p. Using single-pass only." );
120126 maxpasses = 1 ;
121127 preprocessedfd = stdin ;
122128 }
@@ -161,17 +167,20 @@ int main (int argc, char *argv[])
161167 prout ("%s %s %s\n" , BASIC_VERSION_INFO , __DATE__ , __TIME__ );
162168
163169 // a bunch of vars that should be reset each pass.
170+ changedmaholescalled = 0 ;
164171 numredefvars = 0 ;
165172 numconstants = 0 ;
166173 incbasepath [0 ] = 0 ;
167174 currentcharset [0 ] = 0 ;
168175 line = 0 ;
176+ savelevel = 0 ;
169177 unnamed = 0 ;
170178 defcount = 0 ;
171179 multiplespace = 0 ;
172180 defi = 0 ;
173181 dmaplain = 0 ;
174182 templabel = 0 ;
183+ plotlabel = 0 ;
175184 currentbank = 0 ;
176185 branchtargetnumber = 0 ;
177186 doingfunction = 0 ;
@@ -200,6 +209,7 @@ int main (int argc, char *argv[])
200209 numthens = 0 ;
201210 firstfourbyte = 1 ;
202211 firstcompress = 1 ;
212+ TIGHTPACKBORDER = 0 ;
203213
204214 // global variable init...
205215 strcpy (redefined_variables [numredefvars ++ ], "collisionwrap = 1" );
@@ -262,32 +272,59 @@ int main (int argc, char *argv[])
262272
263273 // look for defines and remember them
264274 strcpy (mycode , code );
265- for (i = 0 ; i < 495 ; ++ i )
266- if (code [i ] == ' ' )
275+ int k_def_search ;
276+ for (k_def_search = 0 ; k_def_search < 495 ; ++ k_def_search )
277+ if (code [k_def_search ] == ' ' )
267278 break ;
268- if (code [i + 1 ] == 'd' && code [i + 2 ] == 'e' && code [i + 3 ] == 'f' && code [i + 4 ] == ' ' )
279+ if (k_def_search < 495 && code [k_def_search ] == ' ' &&
280+ (k_def_search + 4 < 499 ) && code [k_def_search + 1 ] == 'd' &&
281+ code [k_def_search + 2 ] == 'e' && code [k_def_search + 3 ] == 'f' &&
282+ code [k_def_search + 4 ] == ' ' )
269283 { // found a define
270- i += 5 ;
271- for (j = 0 ; code [i ] != ' ' ; i ++ )
284+ int current_pos = k_def_search + 5 ; // current_pos now points to start of define name.
285+ if (defi >= 499 ) { // Max 500 defines
286+ fprintf (stderr , "(%d) ERROR: Maximum number of defines (500) reached.\n" , bbgetline ());
287+ exit (1 );
288+ }
289+ for (j = 0 ; current_pos < 499 && code [current_pos ] != ' ' && code [current_pos ] != '\0' && code [current_pos ] != '\n' && code [current_pos ] != '\r' ; current_pos ++ )
272290 {
273- def [defi ][j ++ ] = code [i ]; // get the define
291+ if (j >= 99 ) {
292+ fprintf (stderr , "(%d) ERROR: Define name too long (max 99 chars).\n" , bbgetline ());
293+ exit (1 );
294+ }
295+ def [defi ][j ++ ] = code [current_pos ];
274296 }
275297 def [defi ][j ] = '\0' ;
276298
277- i += 3 ;
299+ if (j == 0 ) { // Empty define name
300+ fprintf (stderr , "(%d) ERROR: Malformed define statement. Empty define name.\n" , bbgetline ());
301+ exit (1 );
302+ }
303+
304+ // Expect " = " sequence after define name
305+ if (!(current_pos < 497 && code [current_pos ] == ' ' && code [current_pos + 1 ] == '=' && code [current_pos + 2 ] == ' ' )) {
306+ fprintf (stderr , "(%d) ERROR: Malformed define statement. Expected \" = \" after define name '%s'.\n" ,
307+ bbgetline (), def [defi ]);
308+ exit (1 );
309+ }
310+ current_pos += 3 ; // Skip " = "
278311
279- for (j = 0 ; code [i ] != '\0' ; i ++ )
312+ for (j = 0 ; current_pos < 499 && code [current_pos ] != '\0' && code [ current_pos ] != '\n' && code [ current_pos ] != '\r' ; current_pos ++ )
280313 {
281- defr [defi ][j ++ ] = code [i ]; // get the definition
314+ if (j >= 99 ) {
315+ fprintf (stderr , "(%d) ERROR: Define replacement string too long (max 99 chars) for define '%s'.\n" , bbgetline (), def [defi ]);
316+ exit (1 );
317+ }
318+ defr [defi ][j ++ ] = code [current_pos ];
282319 }
283320 defr [defi ][j ] = '\0' ;
284321 removeCR (defr [defi ]);
285- printf (";.%s.%s.\n" , def [defi ], defr [defi ]);
322+ printf (";PARSED_DEFINE: .%s. = .%s.\n" , def [defi ], defr [defi ]);
286323 defi ++ ;
287324 }
288- else if (defi )
325+ else if (defi ) // This 'i' refers to the outer loop variable for iterating through existing defines
289326 {
290- for (i = 0 ; i < defi ; ++ i )
327+ for (def_idx = 0 ; def_idx < defi ; ++ def_idx )
291328 {
292329 codeadd = NULL ;
293330 finalcode [0 ] = '\0' ;
@@ -301,15 +338,15 @@ int main (int argc, char *argv[])
301338 bbgetline ());
302339 exit (1 );
303340 }
304- codeadd = strstr (mycode , def [i ]);
341+ codeadd = strstr (mycode , def [def_idx ]);
305342 if (codeadd == NULL )
306343 break ;
307344 for (j = 0 ; j < 500 ; ++ j )
308345 finalcode [j ] = '\0' ;
309346 strncpy (finalcode , mycode , 500 );
310347 finalcode [(strlen (mycode ) - strlen (codeadd ))] = 0 ;
311- strcat (finalcode , defr [i ]);
312- strcat (finalcode , codeadd + strlen (def [i ]));
348+ strcat (finalcode , defr [def_idx ]);
349+ strcat (finalcode , codeadd + strlen (def [def_idx ]));
313350 strcpy (mycode , finalcode );
314351 }
315352 }
@@ -390,7 +427,7 @@ int main (int argc, char *argv[])
390427 printf (" echo \"######## ERROR: space overflow detected in\",[SPACEOVERFLOW]d,\"areas.\"\n" );
391428 printf (" echo \"######## look above for areas with negative ROM space left.\"\n" );
392429 printf (" echo \"######## Aborting assembly.\"\n" );
393- printf ("SET SPACEOVERFLOWPASS = (SPACEOVERFLOWPASS + 1)\n" );
430+ printf ("SPACEOVERFLOWPASS SET (SPACEOVERFLOWPASS + 1)\n" );
394431 printf (" if SPACEOVERFLOWPASS > 0\n" );
395432 printf (" ERR\n" );
396433 printf (" endif\n" );
0 commit comments