Browse code

(uxnasm) Added support for label sized pads

Devine Lu Linvega authored on 05/04/2023 03:02:33
Showing 1 changed files
... ...
@@ -253,6 +253,7 @@ parse(char *w, FILE *f)
253 253
 {
254 254
 	int i;
255 255
 	char word[0x40], subw[0x40], c;
256
+	Label *l;
256 257
 	Macro *m;
257 258
 	if(slen(w) >= 63)
258 259
 		return error("Invalid token", w);
... ...
@@ -278,14 +279,30 @@ parse(char *w, FILE *f)
278 279
 			return error("Invalid macro", w);
279 280
 		break;
280 281
 	case '|': /* pad-absolute */
281
-		if(!sihx(w + 1))
282
-			return error("Invalid padding", w);
283
-		p.ptr = shex(w + 1);
282
+		if(sihx(w + 1))
283
+			p.ptr = shex(w + 1);
284
+		else if(w[1] == '&') {
285
+			if(!sublabel(subw, p.scope, w + 2) || !(l = findlabel(subw)))
286
+				return error("Invalid sublabel", w);
287
+			p.ptr = l->addr;
288
+		} else {
289
+			if(!(l = findlabel(w + 1)))
290
+				return error("Invalid label", w);
291
+			p.ptr = l->addr;
292
+		}
284 293
 		break;
285 294
 	case '$': /* pad-relative */
286
-		if(!sihx(w + 1))
287
-			return error("Invalid padding", w);
288
-		p.ptr += shex(w + 1);
295
+		if(sihx(w + 1))
296
+			p.ptr += shex(w + 1);
297
+		else if(w[1] == '&') {
298
+			if(!sublabel(subw, p.scope, w + 2) || !(l = findlabel(subw)))
299
+				return error("Invalid sublabel", w);
300
+			p.ptr += l->addr;
301
+		} else {
302
+			if(!(l = findlabel(w + 1)))
303
+				return error("Invalid label", w);
304
+			p.ptr += l->addr;
305
+		}
289 306
 		break;
290 307
 	case '@': /* label */
291 308
 		if(!makelabel(w + 1))