| ... | ... |
@@ -185,13 +185,15 @@ makelabel(char *name) |
| 185 | 185 |
} |
| 186 | 186 |
|
| 187 | 187 |
static int |
| 188 |
-addref(Label *l) |
|
| 188 |
+addref(Label *l, Uint8 rel) |
|
| 189 | 189 |
{
|
| 190 |
- int pos = cpos(l->name, '/'); |
|
| 191 |
- if(pos != -1) {
|
|
| 192 |
- char root[64]; |
|
| 193 |
- Label *rl = findlabel(scpy(l->name, root, pos)); |
|
| 194 |
- ++rl->refs; |
|
| 190 |
+ if(rel) {
|
|
| 191 |
+ int pos = cpos(l->name, '/'); |
|
| 192 |
+ if(pos != -1) {
|
|
| 193 |
+ char root[64]; |
|
| 194 |
+ Label *rl = findlabel(scpy(l->name, root, pos)); |
|
| 195 |
+ ++rl->refs; |
|
| 196 |
+ } |
|
| 195 | 197 |
} |
| 196 | 198 |
return ++l->refs; |
| 197 | 199 |
} |
| ... | ... |
@@ -244,19 +246,19 @@ parsetoken(char *w) |
| 244 | 246 |
if(l->addr > 0xff) |
| 245 | 247 |
return error("Address is not in zero page", w);
|
| 246 | 248 |
pushbyte(l->addr, 1); |
| 247 |
- return addref(l); |
|
| 249 |
+ return addref(l, 1); |
|
| 248 | 250 |
} else if(w[0] == ',' && (l = findlabel(w + 1))) { /* relative */
|
| 249 | 251 |
int off = l->addr - p.ptr - 3; |
| 250 | 252 |
if(off < -126 || off > 126) |
| 251 | 253 |
return error("Address is too far", w);
|
| 252 | 254 |
pushbyte((Sint8)off, 1); |
| 253 |
- return addref(l); |
|
| 255 |
+ return addref(l, 0); |
|
| 254 | 256 |
} else if(w[0] == ':' && (l = findlabel(w + 1))) { /* raw */
|
| 255 | 257 |
pushshort(l->addr, 0); |
| 256 |
- return addref(l); |
|
| 258 |
+ return addref(l, 1); |
|
| 257 | 259 |
} else if(w[0] == ';' && (l = findlabel(w + 1))) { /* absolute */
|
| 258 | 260 |
pushshort(l->addr, 1); |
| 259 |
- return addref(l); |
|
| 261 |
+ return addref(l, 1); |
|
| 260 | 262 |
} else if(findopcode(w) || scmp(w, "BRK", 4)) { /* opcode */
|
| 261 | 263 |
pushbyte(findopcode(w), 0); |
| 262 | 264 |
return 1; |