...
|
...
|
@@ -263,11 +263,11 @@ walktoken(char *w)
|
263
|
263
|
if(findopcode(w) || scmp(w, "BRK", 4))
|
264
|
264
|
return 1;
|
265
|
265
|
switch(w[0]) {
|
266
|
|
- case '=': return 4; /* STR helper (lit addr-hb addr-lb str) */
|
267
|
|
- case '~': return 4; /* LDR helper (lit addr-hb addr-lb ldr) */
|
268
|
|
- case ',': return 3; /* lit2 addr-hb addr-lb */
|
269
|
|
- case '.': return 2; /* addr-hb addr-lb */
|
270
|
|
- case '^': return 2; /* Relative jump: lit addr-offset */
|
|
266
|
+ case '=': return 4 - (findlabeladdr(w + 1) < 0x0100); /* POK/STR helper (lit addr(1/2) str) */
|
|
267
|
+ case '~': return 4 - (findlabeladdr(w + 1) < 0x0100); /* PEK/LDR helper (lit addr(1/2) ldr) */
|
|
268
|
+ case ',': return 3; /* lit2 addr-hb addr-lb */
|
|
269
|
+ case '.': return 2; /* addr-hb addr-lb */
|
|
270
|
+ case '^': return 2; /* Relative jump: lit addr-offset */
|
271
|
271
|
case '#': return (slen(w + 1) == 2 ? 2 : 3);
|
272
|
272
|
}
|
273
|
273
|
if((m = findmacro(w))) {
|
...
|
...
|
@@ -298,15 +298,25 @@ parsetoken(char *w)
|
298
|
298
|
} else if(w[0] == '=' && (l = findlabel(w + 1))) {
|
299
|
299
|
if(!findlabellen(w + 1) || findlabellen(w + 1) > 2)
|
300
|
300
|
return error("Invalid store helper", w);
|
301
|
|
- pushshort(findlabeladdr(w + 1), 1);
|
302
|
|
- pushbyte(findopcode(findlabellen(w + 1) == 2 ? "STR2" : "POK2"), 0);
|
|
301
|
+ if(findlabeladdr(w + 1) < 0x0100) {
|
|
302
|
+ pushbyte(findlabeladdr(w + 1), 1);
|
|
303
|
+ pushbyte(findopcode(findlabellen(w + 1) == 2 ? "STR" : "POK"), 0);
|
|
304
|
+ } else {
|
|
305
|
+ pushshort(findlabeladdr(w + 1), 1);
|
|
306
|
+ pushbyte(findopcode(findlabellen(w + 1) == 2 ? "STR2" : "POK2"), 0);
|
|
307
|
+ }
|
303
|
308
|
l->refs++;
|
304
|
309
|
return 1;
|
305
|
310
|
} else if(w[0] == '~' && (l = findlabel(w + 1))) {
|
306
|
311
|
if(!findlabellen(w + 1) || findlabellen(w + 1) > 2)
|
307
|
312
|
return error("Invalid load helper", w);
|
308
|
|
- pushshort(findlabeladdr(w + 1), 1);
|
309
|
|
- pushbyte(findopcode(findlabellen(w + 1) == 2 ? "LDR2" : "PEK2"), 0);
|
|
313
|
+ if(findlabeladdr(w + 1) < 0x0100) {
|
|
314
|
+ pushbyte(findlabeladdr(w + 1), 1);
|
|
315
|
+ pushbyte(findopcode(findlabellen(w + 1) == 2 ? "LDR" : "PEK"), 0);
|
|
316
|
+ } else {
|
|
317
|
+ pushshort(findlabeladdr(w + 1), 1);
|
|
318
|
+ pushbyte(findopcode(findlabellen(w + 1) == 2 ? "LDR2" : "PEK2"), 0);
|
|
319
|
+ }
|
310
|
320
|
l->refs++;
|
311
|
321
|
return 1;
|
312
|
322
|
} else if((op = findopcode(w)) || scmp(w, "BRK", 4)) {
|