@@ -17,7 +17,7 @@ extern int currentbank;
17
17
extern int currentdmahole ;
18
18
extern int numredefvars ;
19
19
extern int numconstants ;
20
- extern char constants [MAXCONSTANTS ][100 ];
20
+ extern char constants [MAXCONSTANTS ][CONSTANTLEN ];
21
21
extern char incbasepath [500 ];
22
22
extern char redefined_variables [80000 ][100 ];
23
23
extern char bannerfilenames [1000 ][100 ];
@@ -27,8 +27,10 @@ extern int graphicsdatawidth[16];
27
27
extern char charactersetchars [257 ];
28
28
extern int passes ;
29
29
extern int line ;
30
+ extern int savelevel ;
30
31
extern int dmaplain ;
31
32
extern int templabel ;
33
+ extern int plotlabel ;
32
34
extern int tallspritecount ;
33
35
extern int fourbitfade_alreadyused ;
34
36
extern int zonelocking ;
@@ -57,15 +59,18 @@ extern int romsize_already_set;
57
59
extern int firstfourbyte ;
58
60
extern int firstcompress ;
59
61
extern int dumpgraphics_index ;
62
+ extern int TIGHTPACKBORDER ;
63
+ extern int changedmaholescalled ;
60
64
int maxpasses = 2 ;
61
65
62
- #define BASIC_VERSION_INFO "7800basic v0.33 "
66
+ #define BASIC_VERSION_INFO "7800basic v0.34 "
63
67
64
68
int main (int argc , char * argv [])
65
69
{
66
70
char * * statement ;
67
71
char * * deallocate_mem ;
68
72
int i , j , k ;
73
+ int def_idx ;
69
74
int unnamed , defcount , defi ;
70
75
char * c ;
71
76
char single ;
@@ -77,8 +82,8 @@ int main (int argc, char *argv[])
77
82
char * filename = "7800basic_variable_redefs.h" ;
78
83
char * prefilename = NULL ;
79
84
char * path = 0 ;
80
- char def [250 ][100 ];
81
- char defr [250 ][100 ];
85
+ char def [500 ][100 ];
86
+ char defr [500 ][100 ];
82
87
char finalcode [500 ];
83
88
char * codeadd ;
84
89
char mycode [500 ];
@@ -117,6 +122,7 @@ int main (int argc, char *argv[])
117
122
// we were called without the "-p" switch, so revert to the historic
118
123
// single-pass behavior, since the basic source is coming from stdin,
119
124
// and we can't rewind stdin.
125
+ prwarn ("7800basic was launched without -p. Using single-pass only." );
120
126
maxpasses = 1 ;
121
127
preprocessedfd = stdin ;
122
128
}
@@ -161,17 +167,20 @@ int main (int argc, char *argv[])
161
167
prout ("%s %s %s\n" , BASIC_VERSION_INFO , __DATE__ , __TIME__ );
162
168
163
169
// a bunch of vars that should be reset each pass.
170
+ changedmaholescalled = 0 ;
164
171
numredefvars = 0 ;
165
172
numconstants = 0 ;
166
173
incbasepath [0 ] = 0 ;
167
174
currentcharset [0 ] = 0 ;
168
175
line = 0 ;
176
+ savelevel = 0 ;
169
177
unnamed = 0 ;
170
178
defcount = 0 ;
171
179
multiplespace = 0 ;
172
180
defi = 0 ;
173
181
dmaplain = 0 ;
174
182
templabel = 0 ;
183
+ plotlabel = 0 ;
175
184
currentbank = 0 ;
176
185
branchtargetnumber = 0 ;
177
186
doingfunction = 0 ;
@@ -200,6 +209,7 @@ int main (int argc, char *argv[])
200
209
numthens = 0 ;
201
210
firstfourbyte = 1 ;
202
211
firstcompress = 1 ;
212
+ TIGHTPACKBORDER = 0 ;
203
213
204
214
// global variable init...
205
215
strcpy (redefined_variables [numredefvars ++ ], "collisionwrap = 1" );
@@ -262,32 +272,59 @@ int main (int argc, char *argv[])
262
272
263
273
// look for defines and remember them
264
274
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 ] == ' ' )
267
278
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 ] == ' ' )
269
283
{ // 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 ++ )
272
290
{
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 ];
274
296
}
275
297
def [defi ][j ] = '\0' ;
276
298
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 " = "
278
311
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 ++ )
280
313
{
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 ];
282
319
}
283
320
defr [defi ][j ] = '\0' ;
284
321
removeCR (defr [defi ]);
285
- printf (";.%s.%s.\n" , def [defi ], defr [defi ]);
322
+ printf (";PARSED_DEFINE: .%s. = .%s.\n" , def [defi ], defr [defi ]);
286
323
defi ++ ;
287
324
}
288
- else if (defi )
325
+ else if (defi ) // This 'i' refers to the outer loop variable for iterating through existing defines
289
326
{
290
- for (i = 0 ; i < defi ; ++ i )
327
+ for (def_idx = 0 ; def_idx < defi ; ++ def_idx )
291
328
{
292
329
codeadd = NULL ;
293
330
finalcode [0 ] = '\0' ;
@@ -301,15 +338,15 @@ int main (int argc, char *argv[])
301
338
bbgetline ());
302
339
exit (1 );
303
340
}
304
- codeadd = strstr (mycode , def [i ]);
341
+ codeadd = strstr (mycode , def [def_idx ]);
305
342
if (codeadd == NULL )
306
343
break ;
307
344
for (j = 0 ; j < 500 ; ++ j )
308
345
finalcode [j ] = '\0' ;
309
346
strncpy (finalcode , mycode , 500 );
310
347
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 ]));
313
350
strcpy (mycode , finalcode );
314
351
}
315
352
}
@@ -390,7 +427,7 @@ int main (int argc, char *argv[])
390
427
printf (" echo \"######## ERROR: space overflow detected in\",[SPACEOVERFLOW]d,\"areas.\"\n" );
391
428
printf (" echo \"######## look above for areas with negative ROM space left.\"\n" );
392
429
printf (" echo \"######## Aborting assembly.\"\n" );
393
- printf ("SET SPACEOVERFLOWPASS = (SPACEOVERFLOWPASS + 1)\n" );
430
+ printf ("SPACEOVERFLOWPASS SET (SPACEOVERFLOWPASS + 1)\n" );
394
431
printf (" if SPACEOVERFLOWPASS > 0\n" );
395
432
printf (" ERR\n" );
396
433
printf (" endif\n" );
0 commit comments