commit ae61e92

Devine Lu Linvega  ·  2023-05-02 16:57:01 +0000 UTC
parent e191a16
Added special POPk/NIPk modes
2 files changed,  +15, -14
+4, -4
 1@@ -61,10 +61,10 @@ uxn_eval(Uxn *u, Uint16 pc)
 2 			/* ALU */
 3 			case 0x01: /* INC  */ t=T;            SET(1, 0) PUT(0, t + 1) break;
 4 			case 0x21:            t=T2;           SET(2, 0) PUT2(0, t + 1) break;
 5-			case 0x02: /* POP  */                 SET(1,-1) break;
 6-			case 0x22:                            SET(2,-2) break;
 7-			case 0x03: /* NIP  */ t=T;            SET(2,-1) PUT(0, t) break;
 8-			case 0x23:            t=T2;           SET(4,-2) PUT2(0, t) break;
 9+			case 0x02: /* POP  */                 SET(1,-1) if(k) PUT(0, 0) break;
10+			case 0x22:                            SET(2,-2) if(k) PUT2(0, 0) break;
11+			case 0x03: /* NIP  */ t=T;            SET(2,-1) PUT(0, t) if(k) PUT(1, 0) break;
12+			case 0x23:            t=T2;           SET(4,-2) PUT2(0, t) if(k) PUT2(2, 0) break;
13 			case 0x04: /* SWP  */ t=T;n=N;        SET(2, 0) PUT(0, n) PUT(1, t) break;
14 			case 0x24:            t=T2;n=N2;      SET(4, 0) PUT2(0, n) PUT2(2, t) break;
15 			case 0x05: /* ROT  */ t=T;n=N;l=L;    SET(3, 0) PUT(0, l) PUT(1, t) PUT(2, n) break;
+11, -10
 1@@ -53,16 +53,17 @@ main(int argc, char **argv)
 2 	if(!system_load(&u, argv[i++]))
 3 		return system_error("Load", "Failed");
 4 	u.dev[0x17] = argc - i;
 5-	if(!uxn_eval(&u, PAGE_PROGRAM))
 6-		return u.dev[0x0f] & 0x7f;
 7-	for(; i < argc; i++) {
 8-		char *p = argv[i];
 9-		while(*p) console_input(&u, *p++, CONSOLE_ARG);
10-		console_input(&u, '\n', i == argc - 1 ? CONSOLE_END : CONSOLE_EOA);
11-	}
12-	while(!u.dev[0x0f]) {
13-		int c = fgetc(stdin);
14-		if(c != EOF) console_input(&u, (Uint8)c, CONSOLE_STD);
15+	if(uxn_eval(&u, PAGE_PROGRAM)) {
16+		for(; i < argc; i++) {
17+			char *p = argv[i];
18+			while(*p) console_input(&u, *p++, CONSOLE_ARG);
19+			console_input(&u, '\n', i == argc - 1 ? CONSOLE_END : CONSOLE_EOA);
20+		}
21+		while(!u.dev[0x0f]) {
22+			int c = fgetc(stdin);
23+			if(c != EOF) console_input(&u, (Uint8)c, CONSOLE_STD);
24+		}
25 	}
26+	free(u.ram);
27 	return u.dev[0x0f] & 0x7f;
28 }