... | ... |
@@ -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)) |