Browse code

Assembler will now use a single byte when on the zero-page

neauoire authored on 28/03/2021 16:48:00
Showing 1 changed files
... ...
@@ -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)) {