Browse code

(uxnasm) Experimental implementation of JM/JC/JS runes

Devine Lu Linvega authored on 03/01/2023 01:45:06
Showing 1 changed files
... ...
@@ -211,9 +211,7 @@ writebyte(Uint8 b)
211 211
 static int
212 212
 writeopcode(char *w)
213 213
 {
214
-	Uint8 res;
215
-	res = writebyte(findopcode(w));
216
-	return res;
214
+	return writebyte(findopcode(w));
217 215
 }
218 216
 
219 217
 static int
... ...
@@ -227,9 +225,7 @@ writeshort(Uint16 s, int lit)
227 225
 static int
228 226
 writelitbyte(Uint8 b)
229 227
 {
230
-	if(!writebyte(findopcode("LIT"))) return 0;
231
-	if(!writebyte(b)) return 0;
232
-	return 1;
228
+	return writebyte(findopcode("LIT")) && writebyte(b);
233 229
 }
234 230
 
235 231
 static int
... ...
@@ -295,39 +291,38 @@ parse(char *w, FILE *f)
295 291
 			return error("Invalid sublabel", w);
296 292
 		break;
297 293
 	case '#': /* literals hex */
298
-		if(!sihx(w + 1) || (slen(w) != 3 && slen(w) != 5))
294
+		if(sihx(w + 1) && slen(w) == 3)
295
+			return writelitbyte(shex(w + 1));
296
+		else if(sihx(w + 1) && slen(w) == 5)
297
+			return writeshort(shex(w + 1), 1);
298
+		else
299 299
 			return error("Invalid hex literal", w);
300
-		if(slen(w) == 3) {
301
-			if(!writelitbyte(shex(w + 1))) return 0;
302
-		} else if(slen(w) == 5) {
303
-			if(!writeshort(shex(w + 1), 1)) return 0;
304
-		}
305 300
 		break;
306 301
 	case '_': /* raw byte relative */
307 302
 		makereference(p.scope, w, p.ptr);
308
-		if(!writebyte(0xff)) return 0;
309
-		break;
303
+		return writebyte(0xff);
310 304
 	case ',': /* literal byte relative */
311 305
 		makereference(p.scope, w, p.ptr);
312
-		if(!writelitbyte(0xff)) return 0;
313
-		break;
306
+		return writelitbyte(0xff);
314 307
 	case '-': /* raw byte absolute */
315 308
 		makereference(p.scope, w, p.ptr);
316
-		if(!writebyte(0xff)) return 0;
317
-		break;
309
+		return writebyte(0xff);
318 310
 	case '.': /* literal byte zero-page */
319 311
 		makereference(p.scope, w, p.ptr);
320
-		if(!writelitbyte(0xff)) return 0;
321
-		break;
312
+		return writelitbyte(0xff);
322 313
 	case ':': /* raw short absolute */
323 314
 	case '=':
324 315
 		makereference(p.scope, w, p.ptr);
325
-		if(!writeshort(0xffff, 0)) return 0;
326
-		break;
316
+		return writeshort(0xffff, 0);
327 317
 	case ';': /* literal short absolute */
328 318
 		makereference(p.scope, w, p.ptr);
329
-		if(!writeshort(0xffff, 1)) return 0;
330
-		break;
319
+		return writeshort(0xffff, 1);
320
+	case '!': /* JMI */
321
+		makereference(p.scope, w, p.ptr);
322
+		return writebyte(0x20) && writeshort(0xffff, 0);
323
+	case '?': /* JCI */
324
+		makereference(p.scope, w, p.ptr);
325
+		return writebyte(0x40) && writeshort(0xffff, 0);
331 326
 	case '"': /* raw string */
332 327
 		i = 0;
333 328
 		while((c = w[++i]))
... ...
@@ -338,25 +333,24 @@ parse(char *w, FILE *f)
338 333
 		if(slen(w) == 1) break; /* else fallthrough */
339 334
 	default:
340 335
 		/* opcode */
341
-		if(findopcode(w) || scmp(w, "BRK", 4)) {
342
-			if(!writeopcode(w)) return 0;
343
-		}
336
+		if(findopcode(w) || scmp(w, "BRK", 4))
337
+			return writeopcode(w);
344 338
 		/* raw byte */
345
-		else if(sihx(w) && slen(w) == 2) {
346
-			if(!writebyte(shex(w))) return 0;
347
-		}
339
+		else if(sihx(w) && slen(w) == 2)
340
+			return writebyte(shex(w));
348 341
 		/* raw short */
349
-		else if(sihx(w) && slen(w) == 4) {
350
-			if(!writeshort(shex(w), 0)) return 0;
351
-		}
342
+		else if(sihx(w) && slen(w) == 4)
343
+			return writeshort(shex(w), 0);
352 344
 		/* macro */
353 345
 		else if((m = findmacro(w))) {
354 346
 			for(i = 0; i < m->len; i++)
355 347
 				if(!parse(m->items[i], f))
356 348
 					return 0;
357 349
 			return 1;
358
-		} else
359
-			return error("Unknown token", w);
350
+		} else {
351
+			makereference(p.scope, w - 1, p.ptr);
352
+			return writebyte(0x60) && writeshort(0xffff, 0);
353
+		}
360 354
 	}
361 355
 	return 1;
362 356
 }
... ...
@@ -405,15 +399,13 @@ resolve(void)
405 399
 			p.data[r->addr + 1] = l->addr & 0xff;
406 400
 			l->refs++;
407 401
 			break;
408
-		case ';':
402
+		default:
409 403
 			if(!(l = findlabel(r->name)))
410 404
 				return error("Unknown absolute reference", r->name);
411 405
 			p.data[r->addr + 1] = l->addr >> 0x8;
412 406
 			p.data[r->addr + 2] = l->addr & 0xff;
413 407
 			l->refs++;
414 408
 			break;
415
-		default:
416
-			return error("Unknown reference", r->name);
417 409
 		}
418 410
 	}
419 411
 	return 1;