commit 7edbaa0

neauoire  ·  2022-12-10 03:54:04 +0000 UTC
parent bce4438
Updated uxnasm to create symbols
1 files changed,  +52, -11
+52, -11
  1@@ -303,22 +303,31 @@ parse(char *w, FILE *f)
  2 			if(!writeshort(shex(w + 1), 1)) return 0;
  3 		}
  4 		break;
  5-	case '.': /* literal byte zero-page */
  6+	case '_': /* raw byte relative */
  7 		makereference(p.scope, w, p.ptr);
  8-		if(!writelitbyte(0xff)) return 0;
  9+		if(!writebyte(0xff)) return 0;
 10 		break;
 11 	case ',': /* literal byte relative */
 12 		makereference(p.scope, w, p.ptr);
 13 		if(!writelitbyte(0xff)) return 0;
 14 		break;
 15-	case ';': /* literal short absolute */
 16+	case '-': /* raw byte absolute */
 17 		makereference(p.scope, w, p.ptr);
 18-		if(!writeshort(0xffff, 1)) return 0;
 19+		if(!writebyte(0xff)) return 0;
 20+		break;
 21+	case '.': /* literal byte zero-page */
 22+		makereference(p.scope, w, p.ptr);
 23+		if(!writelitbyte(0xff)) return 0;
 24 		break;
 25 	case ':': /* raw short absolute */
 26+	case '=':
 27 		makereference(p.scope, w, p.ptr);
 28 		if(!writeshort(0xffff, 0)) return 0;
 29 		break;
 30+	case ';': /* literal short absolute */
 31+		makereference(p.scope, w, p.ptr);
 32+		if(!writeshort(0xffff, 1)) return 0;
 33+		break;
 34 	case '"': /* raw string */
 35 		i = 0;
 36 		while((c = w[++i]))
 37@@ -360,10 +369,12 @@ resolve(void)
 38 	for(i = 0; i < p.rlen; i++) {
 39 		Reference *r = &p.refs[i];
 40 		switch(r->rune) {
 41-		case '.':
 42+		case '_':
 43 			if(!(l = findlabel(r->name)))
 44-				return error("Unknown zero-page reference", r->name);
 45-			p.data[r->addr + 1] = l->addr & 0xff;
 46+				return error("Unknown relative reference", r->name);
 47+			p.data[r->addr] = (Sint8)(l->addr - r->addr - 2);
 48+			if((Sint8)p.data[r->addr] != (l->addr - r->addr - 2))
 49+				return error("Relative reference is too far", r->name);
 50 			l->refs++;
 51 			break;
 52 		case ',':
 53@@ -374,20 +385,33 @@ resolve(void)
 54 				return error("Relative reference is too far", r->name);
 55 			l->refs++;
 56 			break;
 57-		case ';':
 58+		case '-':
 59 			if(!(l = findlabel(r->name)))
 60 				return error("Unknown absolute reference", r->name);
 61-			p.data[r->addr + 1] = l->addr >> 0x8;
 62-			p.data[r->addr + 2] = l->addr & 0xff;
 63+			p.data[r->addr] = l->addr & 0xff;
 64+			l->refs++;
 65+			break;
 66+		case '.':
 67+			if(!(l = findlabel(r->name)))
 68+				return error("Unknown zero-page reference", r->name);
 69+			p.data[r->addr + 1] = l->addr & 0xff;
 70 			l->refs++;
 71 			break;
 72 		case ':':
 73+		case '=':
 74 			if(!(l = findlabel(r->name)))
 75 				return error("Unknown absolute reference", r->name);
 76-			p.data[r->addr + 0] = l->addr >> 0x8;
 77+			p.data[r->addr] = l->addr >> 0x8;
 78 			p.data[r->addr + 1] = l->addr & 0xff;
 79 			l->refs++;
 80 			break;
 81+		case ';':
 82+			if(!(l = findlabel(r->name)))
 83+				return error("Unknown absolute reference", r->name);
 84+			p.data[r->addr + 1] = l->addr >> 0x8;
 85+			p.data[r->addr + 2] = l->addr & 0xff;
 86+			l->refs++;
 87+			break;
 88 		default:
 89 			return error("Unknown reference", r->name);
 90 		}
 91@@ -424,6 +448,22 @@ review(char *filename)
 92 		p.mlen);
 93 }
 94 
 95+static void
 96+writesym(char *filename)
 97+{
 98+	char symdst[0x40];
 99+	FILE *fp = fopen(scat(scpy(filename, symdst, slen(filename) + 1), ".sym"), "w");
100+	int i;
101+	if(fp != NULL) {
102+		for(i = 0; i < p.llen; i++) {
103+			fwrite(&p.labels[i].addr + 1, 1, 1, fp);
104+			fwrite(&p.labels[i].addr, 1, 1, fp);
105+			fwrite(p.labels[i].name, slen(p.labels[i].name) + 1, 1, fp);
106+		}
107+	}
108+	fclose(fp);
109+}
110+
111 int
112 main(int argc, char *argv[])
113 {
114@@ -440,5 +480,6 @@ main(int argc, char *argv[])
115 		return !error("Assembly", "Output rom is empty.");
116 	fwrite(p.data + TRIM, p.length - TRIM, 1, dst);
117 	review(argv[2]);
118+	writesym(argv[2]);
119 	return 0;
120 }