Updated uxnasm to create symbols
This commit is contained in:
parent
bce4438469
commit
7edbaa0a87
73
src/uxnasm.c
73
src/uxnasm.c
|
@ -303,22 +303,31 @@ parse(char *w, FILE *f)
|
||||||
if(!writeshort(shex(w + 1), 1)) return 0;
|
if(!writeshort(shex(w + 1), 1)) return 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '.': /* literal byte zero-page */
|
case '_': /* raw byte relative */
|
||||||
makereference(p.scope, w, p.ptr);
|
makereference(p.scope, w, p.ptr);
|
||||||
if(!writelitbyte(0xff)) return 0;
|
if(!writebyte(0xff)) return 0;
|
||||||
break;
|
break;
|
||||||
case ',': /* literal byte relative */
|
case ',': /* literal byte relative */
|
||||||
makereference(p.scope, w, p.ptr);
|
makereference(p.scope, w, p.ptr);
|
||||||
if(!writelitbyte(0xff)) return 0;
|
if(!writelitbyte(0xff)) return 0;
|
||||||
break;
|
break;
|
||||||
|
case '-': /* raw byte absolute */
|
||||||
|
makereference(p.scope, w, p.ptr);
|
||||||
|
if(!writebyte(0xff)) return 0;
|
||||||
|
break;
|
||||||
|
case '.': /* literal byte zero-page */
|
||||||
|
makereference(p.scope, w, p.ptr);
|
||||||
|
if(!writelitbyte(0xff)) return 0;
|
||||||
|
break;
|
||||||
|
case ':': /* raw short absolute */
|
||||||
|
case '=':
|
||||||
|
makereference(p.scope, w, p.ptr);
|
||||||
|
if(!writeshort(0xffff, 0)) return 0;
|
||||||
|
break;
|
||||||
case ';': /* literal short absolute */
|
case ';': /* literal short absolute */
|
||||||
makereference(p.scope, w, p.ptr);
|
makereference(p.scope, w, p.ptr);
|
||||||
if(!writeshort(0xffff, 1)) return 0;
|
if(!writeshort(0xffff, 1)) return 0;
|
||||||
break;
|
break;
|
||||||
case ':': /* raw short absolute */
|
|
||||||
makereference(p.scope, w, p.ptr);
|
|
||||||
if(!writeshort(0xffff, 0)) return 0;
|
|
||||||
break;
|
|
||||||
case '"': /* raw string */
|
case '"': /* raw string */
|
||||||
i = 0;
|
i = 0;
|
||||||
while((c = w[++i]))
|
while((c = w[++i]))
|
||||||
|
@ -360,10 +369,12 @@ resolve(void)
|
||||||
for(i = 0; i < p.rlen; i++) {
|
for(i = 0; i < p.rlen; i++) {
|
||||||
Reference *r = &p.refs[i];
|
Reference *r = &p.refs[i];
|
||||||
switch(r->rune) {
|
switch(r->rune) {
|
||||||
case '.':
|
case '_':
|
||||||
if(!(l = findlabel(r->name)))
|
if(!(l = findlabel(r->name)))
|
||||||
return error("Unknown zero-page reference", r->name);
|
return error("Unknown relative reference", r->name);
|
||||||
p.data[r->addr + 1] = l->addr & 0xff;
|
p.data[r->addr] = (Sint8)(l->addr - r->addr - 2);
|
||||||
|
if((Sint8)p.data[r->addr] != (l->addr - r->addr - 2))
|
||||||
|
return error("Relative reference is too far", r->name);
|
||||||
l->refs++;
|
l->refs++;
|
||||||
break;
|
break;
|
||||||
case ',':
|
case ',':
|
||||||
|
@ -374,6 +385,26 @@ resolve(void)
|
||||||
return error("Relative reference is too far", r->name);
|
return error("Relative reference is too far", r->name);
|
||||||
l->refs++;
|
l->refs++;
|
||||||
break;
|
break;
|
||||||
|
case '-':
|
||||||
|
if(!(l = findlabel(r->name)))
|
||||||
|
return error("Unknown absolute reference", r->name);
|
||||||
|
p.data[r->addr] = l->addr & 0xff;
|
||||||
|
l->refs++;
|
||||||
|
break;
|
||||||
|
case '.':
|
||||||
|
if(!(l = findlabel(r->name)))
|
||||||
|
return error("Unknown zero-page reference", r->name);
|
||||||
|
p.data[r->addr + 1] = l->addr & 0xff;
|
||||||
|
l->refs++;
|
||||||
|
break;
|
||||||
|
case ':':
|
||||||
|
case '=':
|
||||||
|
if(!(l = findlabel(r->name)))
|
||||||
|
return error("Unknown absolute reference", r->name);
|
||||||
|
p.data[r->addr] = l->addr >> 0x8;
|
||||||
|
p.data[r->addr + 1] = l->addr & 0xff;
|
||||||
|
l->refs++;
|
||||||
|
break;
|
||||||
case ';':
|
case ';':
|
||||||
if(!(l = findlabel(r->name)))
|
if(!(l = findlabel(r->name)))
|
||||||
return error("Unknown absolute reference", r->name);
|
return error("Unknown absolute reference", r->name);
|
||||||
|
@ -381,13 +412,6 @@ resolve(void)
|
||||||
p.data[r->addr + 2] = l->addr & 0xff;
|
p.data[r->addr + 2] = l->addr & 0xff;
|
||||||
l->refs++;
|
l->refs++;
|
||||||
break;
|
break;
|
||||||
case ':':
|
|
||||||
if(!(l = findlabel(r->name)))
|
|
||||||
return error("Unknown absolute reference", r->name);
|
|
||||||
p.data[r->addr + 0] = l->addr >> 0x8;
|
|
||||||
p.data[r->addr + 1] = l->addr & 0xff;
|
|
||||||
l->refs++;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
return error("Unknown reference", r->name);
|
return error("Unknown reference", r->name);
|
||||||
}
|
}
|
||||||
|
@ -424,6 +448,22 @@ review(char *filename)
|
||||||
p.mlen);
|
p.mlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
writesym(char *filename)
|
||||||
|
{
|
||||||
|
char symdst[0x40];
|
||||||
|
FILE *fp = fopen(scat(scpy(filename, symdst, slen(filename) + 1), ".sym"), "w");
|
||||||
|
int i;
|
||||||
|
if(fp != NULL) {
|
||||||
|
for(i = 0; i < p.llen; i++) {
|
||||||
|
fwrite(&p.labels[i].addr + 1, 1, 1, fp);
|
||||||
|
fwrite(&p.labels[i].addr, 1, 1, fp);
|
||||||
|
fwrite(p.labels[i].name, slen(p.labels[i].name) + 1, 1, fp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
@ -440,5 +480,6 @@ main(int argc, char *argv[])
|
||||||
return !error("Assembly", "Output rom is empty.");
|
return !error("Assembly", "Output rom is empty.");
|
||||||
fwrite(p.data + TRIM, p.length - TRIM, 1, dst);
|
fwrite(p.data + TRIM, p.length - TRIM, 1, dst);
|
||||||
review(argv[2]);
|
review(argv[2]);
|
||||||
|
writesym(argv[2]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue