| ... | ... |
@@ -14,10 +14,6 @@ WITH REGARD TO THIS SOFTWARE. |
| 14 | 14 |
#define TRIM 0x0100 |
| 15 | 15 |
#define LENGTH 0x10000 |
| 16 | 16 |
|
| 17 |
-#define REFERENCES 2048 |
|
| 18 |
-#define LABELS 512 |
|
| 19 |
-#define MACROS 256 |
|
| 20 |
- |
|
| 21 | 17 |
typedef unsigned char Uint8; |
| 22 | 18 |
typedef signed char Sint8; |
| 23 | 19 |
typedef unsigned short Uint16; |
| ... | ... |
@@ -40,9 +36,9 @@ typedef struct {
|
| 40 | 36 |
typedef struct {
|
| 41 | 37 |
Uint8 data[LENGTH]; |
| 42 | 38 |
Uint16 ptr, length, llen, mlen, rlen; |
| 43 |
- Label labels[LABELS]; |
|
| 44 |
- Macro macros[MACROS]; |
|
| 45 |
- Reference refs[REFERENCES]; |
|
| 39 |
+ Label labels[512]; |
|
| 40 |
+ Macro macros[256]; |
|
| 41 |
+ Reference refs[2048]; |
|
| 46 | 42 |
char scope[64]; |
| 47 | 43 |
} Program; |
| 48 | 44 |
|
| ... | ... |
@@ -132,7 +128,7 @@ makemacro(char *name, FILE *f) |
| 132 | 128 |
return error("Macro name is hex number", name);
|
| 133 | 129 |
if(findopcode(name) || scmp(name, "BRK", 4) || !slen(name)) |
| 134 | 130 |
return error("Macro name is invalid", name);
|
| 135 |
- if(p.mlen == MACROS) |
|
| 131 |
+ if(p.mlen == 256) |
|
| 136 | 132 |
return error("Too many macros", name);
|
| 137 | 133 |
m = &p.macros[p.mlen++]; |
| 138 | 134 |
scpy(name, m->name, 64); |
| ... | ... |
@@ -156,7 +152,7 @@ makelabel(char *name) |
| 156 | 152 |
return error("Label name is hex number", name);
|
| 157 | 153 |
if(findopcode(name) || scmp(name, "BRK", 4) || !slen(name)) |
| 158 | 154 |
return error("Label name is invalid", name);
|
| 159 |
- if(p.llen == LABELS) |
|
| 155 |
+ if(p.llen == 512) |
|
| 160 | 156 |
return error("Too many labels", name);
|
| 161 | 157 |
l = &p.labels[p.llen++]; |
| 162 | 158 |
l->addr = p.ptr; |
| ... | ... |
@@ -165,20 +161,6 @@ makelabel(char *name) |
| 165 | 161 |
return 1; |
| 166 | 162 |
} |
| 167 | 163 |
|
| 168 |
-static int |
|
| 169 |
-doinclude(const char *filename) |
|
| 170 |
-{
|
|
| 171 |
- FILE *f; |
|
| 172 |
- char w[64]; |
|
| 173 |
- if(!(f = fopen(filename, "r"))) |
|
| 174 |
- return error("Include failed to open", filename);
|
|
| 175 |
- while(fscanf(f, "%63s", w) == 1) |
|
| 176 |
- if(!tokenize(w, f)) |
|
| 177 |
- return error("Unknown token", w);
|
|
| 178 |
- fclose(f); |
|
| 179 |
- return 1; |
|
| 180 |
-} |
|
| 181 |
- |
|
| 182 | 164 |
static void |
| 183 | 165 |
writebyte(Uint8 b, int lit) |
| 184 | 166 |
{
|
| ... | ... |
@@ -231,6 +213,20 @@ prefill(char *scope, char *label, Uint16 addr) |
| 231 | 213 |
r->addr = addr; |
| 232 | 214 |
} |
| 233 | 215 |
|
| 216 |
+static int |
|
| 217 |
+doinclude(const char *filename) |
|
| 218 |
+{
|
|
| 219 |
+ FILE *f; |
|
| 220 |
+ char w[64]; |
|
| 221 |
+ if(!(f = fopen(filename, "r"))) |
|
| 222 |
+ return error("Include failed to open", filename);
|
|
| 223 |
+ while(fscanf(f, "%63s", w) == 1) |
|
| 224 |
+ if(!tokenize(w, f)) |
|
| 225 |
+ return error("Unknown token", w);
|
|
| 226 |
+ fclose(f); |
|
| 227 |
+ return 1; |
|
| 228 |
+} |
|
| 229 |
+ |
|
| 234 | 230 |
static int |
| 235 | 231 |
tokenize(char *w, FILE *f) |
| 236 | 232 |
{
|
| ... | ... |
@@ -368,18 +364,6 @@ resolve(void) |
| 368 | 364 |
return 1; |
| 369 | 365 |
} |
| 370 | 366 |
|
| 371 |
-static void |
|
| 372 |
-review(char *filename) |
|
| 373 |
-{
|
|
| 374 |
- int i; |
|
| 375 |
- for(i = 0; i < p.llen; ++i) |
|
| 376 |
- if(p.labels[i].name[0] >= 'A' && p.labels[i].name[0] <= 'Z') |
|
| 377 |
- continue; /* Ignore capitalized labels(devices) */ |
|
| 378 |
- else if(!p.labels[i].refs) |
|
| 379 |
- fprintf(stderr, "--- Unused label: %s\n", p.labels[i].name); |
|
| 380 |
- fprintf(stderr, "Assembled %s in %d bytes(%.2f%% used), %d labels, %d macros.\n", filename, p.length - TRIM, p.length / 652.80, p.llen, p.mlen); |
|
| 381 |
-} |
|
| 382 |
- |
|
| 383 | 367 |
static int |
| 384 | 368 |
assemble(FILE *f) |
| 385 | 369 |
{
|
| ... | ... |
@@ -392,6 +376,18 @@ assemble(FILE *f) |
| 392 | 376 |
return 1; |
| 393 | 377 |
} |
| 394 | 378 |
|
| 379 |
+static void |
|
| 380 |
+review(char *filename) |
|
| 381 |
+{
|
|
| 382 |
+ int i; |
|
| 383 |
+ for(i = 0; i < p.llen; ++i) |
|
| 384 |
+ if(p.labels[i].name[0] >= 'A' && p.labels[i].name[0] <= 'Z') |
|
| 385 |
+ continue; /* Ignore capitalized labels(devices) */ |
|
| 386 |
+ else if(!p.labels[i].refs) |
|
| 387 |
+ fprintf(stderr, "--- Unused label: %s\n", p.labels[i].name); |
|
| 388 |
+ fprintf(stderr, "Assembled %s in %d bytes(%.2f%% used), %d labels, %d macros.\n", filename, p.length - TRIM, p.length / 652.80, p.llen, p.mlen); |
|
| 389 |
+} |
|
| 390 |
+ |
|
| 395 | 391 |
int |
| 396 | 392 |
main(int argc, char *argv[]) |
| 397 | 393 |
{
|