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