Browse code

Replaced NOP with NIP

Andrew Alderwick authored on 15/08/2021 20:22:01
Showing 4 changed files
... ...
@@ -917,12 +917,12 @@
917 917
 @asma-opcodes
918 918
 	&BRK        :&AND      :&DEI &_disasm "BRK 00
919 919
 	&_entry     :&EQU      :&ROT        "LIT 00
920
-	&NOP        :&MUL      :&OVR        "NOP 00
920
+	&NIP        :&MUL      :&OVR        "NIP 00
921 921
 	&POP         $2         $2          "POP 00
922 922
 	&DUP        :&DIV      :&EOR        "DUP 00
923 923
 	&SWP         $2         $2          "SWP 00
924 924
 	&OVR        :&ORA      :&POP        "OVR 00
925
-	&ROT        :&NOP      :&STR        "ROT 00
925
+	&ROT        :&NIP      :&STR        "ROT 00
926 926
 	&EQU        :&DEO      :&JSR        "EQU 00
927 927
 	&NEQ         $2         $2          "NEQ 00
928 928
 	&GTH         $2         $2          "GTH 00
... ...
@@ -81,17 +81,19 @@ uxn_eval(Uxn *u, Uint16 vec)
81 81
 				u->wst.ptr += 1;
82 82
 			}
83 83
 			break;
84
-		case 0x02: /* NOP */
85
-		case 0x22: /* NOP2 */
86
-		case 0x42: /* NOPr */
87
-		case 0x62: /* NOP2r */
88
-		case 0x82: /* NOPk */
89
-		case 0xa2: /* NOP2k */
90
-		case 0xc2: /* NOPkr */
91
-		case 0xe2: /* NOP2kr */
92
-			__asm__("evaluxn_02_NOP:");
84
+		case 0x02: /* NIP */
85
+			__asm__("evaluxn_02_NIP:");
93 86
 			{
94
-				(void)u;
87
+				Uint8 a = u->wst.dat[u->wst.ptr - 1];
88
+				u->wst.dat[u->wst.ptr - 2];
89
+				u->wst.dat[u->wst.ptr - 2] = a;
90
+#ifndef NO_STACK_CHECKS
91
+				if(__builtin_expect(u->wst.ptr < 2, 0)) {
92
+					u->wst.error = 1;
93
+					goto error;
94
+				}
95
+#endif
96
+				u->wst.ptr -= 1;
95 97
 			}
96 98
 			break;
97 99
 		case 0x03: /* POP */
... ...
@@ -546,6 +548,22 @@ uxn_eval(Uxn *u, Uint16 vec)
546 548
 				u->wst.ptr += 2;
547 549
 			}
548 550
 			break;
551
+		case 0x22: /* NIP2 */
552
+			__asm__("evaluxn_22_NIP2:");
553
+			{
554
+				Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
555
+				(u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8));
556
+				u->wst.dat[u->wst.ptr - 4] = a >> 8;
557
+				u->wst.dat[u->wst.ptr - 3] = a & 0xff;
558
+#ifndef NO_STACK_CHECKS
559
+				if(__builtin_expect(u->wst.ptr < 4, 0)) {
560
+					u->wst.error = 1;
561
+					goto error;
562
+				}
563
+#endif
564
+				u->wst.ptr -= 2;
565
+			}
566
+			break;
549 567
 		case 0x23: /* POP2 */
550 568
 			__asm__("evaluxn_23_POP2:");
551 569
 			{
... ...
@@ -1031,6 +1049,21 @@ uxn_eval(Uxn *u, Uint16 vec)
1031 1049
 				u->rst.ptr += 1;
1032 1050
 			}
1033 1051
 			break;
1052
+		case 0x42: /* NIPr */
1053
+			__asm__("evaluxn_42_NIPr:");
1054
+			{
1055
+				Uint8 a = u->rst.dat[u->rst.ptr - 1];
1056
+				u->rst.dat[u->rst.ptr - 2];
1057
+				u->rst.dat[u->rst.ptr - 2] = a;
1058
+#ifndef NO_STACK_CHECKS
1059
+				if(__builtin_expect(u->rst.ptr < 2, 0)) {
1060
+					u->rst.error = 1;
1061
+					goto error;
1062
+				}
1063
+#endif
1064
+				u->rst.ptr -= 1;
1065
+			}
1066
+			break;
1034 1067
 		case 0x43: /* POPr */
1035 1068
 			__asm__("evaluxn_43_POPr:");
1036 1069
 			{
... ...
@@ -1483,6 +1516,22 @@ uxn_eval(Uxn *u, Uint16 vec)
1483 1516
 				u->rst.ptr += 2;
1484 1517
 			}
1485 1518
 			break;
1519
+		case 0x62: /* NIP2r */
1520
+			__asm__("evaluxn_62_NIP2r:");
1521
+			{
1522
+				Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
1523
+				(u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8));
1524
+				u->rst.dat[u->rst.ptr - 4] = a >> 8;
1525
+				u->rst.dat[u->rst.ptr - 3] = a & 0xff;
1526
+#ifndef NO_STACK_CHECKS
1527
+				if(__builtin_expect(u->rst.ptr < 4, 0)) {
1528
+					u->rst.error = 1;
1529
+					goto error;
1530
+				}
1531
+#endif
1532
+				u->rst.ptr -= 2;
1533
+			}
1534
+			break;
1486 1535
 		case 0x63: /* POP2r */
1487 1536
 			__asm__("evaluxn_63_POP2r:");
1488 1537
 			{
... ...
@@ -1954,6 +2003,25 @@ uxn_eval(Uxn *u, Uint16 vec)
1954 2003
 				u->rst.ptr -= 1;
1955 2004
 			}
1956 2005
 			break;
2006
+		case 0x82: /* NIPk */
2007
+			__asm__("evaluxn_82_NIPk:");
2008
+			{
2009
+				Uint8 a = u->wst.dat[u->wst.ptr - 1];
2010
+				u->wst.dat[u->wst.ptr - 2];
2011
+				u->wst.dat[u->wst.ptr] = a;
2012
+#ifndef NO_STACK_CHECKS
2013
+				if(__builtin_expect(u->wst.ptr < 2, 0)) {
2014
+					u->wst.error = 1;
2015
+					goto error;
2016
+				}
2017
+				if(__builtin_expect(u->wst.ptr > 254, 0)) {
2018
+					u->wst.error = 2;
2019
+					goto error;
2020
+				}
2021
+#endif
2022
+				u->wst.ptr += 1;
2023
+			}
2024
+			break;
1957 2025
 		case 0x83: /* POPk */
1958 2026
 			__asm__("evaluxn_83_POPk:");
1959 2027
 			{
... ...
@@ -2458,6 +2526,26 @@ uxn_eval(Uxn *u, Uint16 vec)
2458 2526
 				u->wst.ptr += 1;
2459 2527
 			}
2460 2528
 			break;
2529
+		case 0xa2: /* NIP2k */
2530
+			__asm__("evaluxn_a2_NIP2k:");
2531
+			{
2532
+				Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
2533
+				(u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8));
2534
+				u->wst.dat[u->wst.ptr] = a >> 8;
2535
+				u->wst.dat[u->wst.ptr + 1] = a & 0xff;
2536
+#ifndef NO_STACK_CHECKS
2537
+				if(__builtin_expect(u->wst.ptr < 4, 0)) {
2538
+					u->wst.error = 1;
2539
+					goto error;
2540
+				}
2541
+				if(__builtin_expect(u->wst.ptr > 253, 0)) {
2542
+					u->wst.error = 2;
2543
+					goto error;
2544
+				}
2545
+#endif
2546
+				u->wst.ptr += 2;
2547
+			}
2548
+			break;
2461 2549
 		case 0xa3: /* POP2k */
2462 2550
 			__asm__("evaluxn_a3_POP2k:");
2463 2551
 			{
... ...
@@ -2985,6 +3073,25 @@ uxn_eval(Uxn *u, Uint16 vec)
2985 3073
 				u->wst.ptr += 2;
2986 3074
 			}
2987 3075
 			break;
3076
+		case 0xc2: /* NIPkr */
3077
+			__asm__("evaluxn_c2_NIPkr:");
3078
+			{
3079
+				Uint8 a = u->rst.dat[u->rst.ptr - 1];
3080
+				u->rst.dat[u->rst.ptr - 2];
3081
+				u->rst.dat[u->rst.ptr] = a;
3082
+#ifndef NO_STACK_CHECKS
3083
+				if(__builtin_expect(u->rst.ptr < 2, 0)) {
3084
+					u->rst.error = 1;
3085
+					goto error;
3086
+				}
3087
+				if(__builtin_expect(u->rst.ptr > 254, 0)) {
3088
+					u->rst.error = 2;
3089
+					goto error;
3090
+				}
3091
+#endif
3092
+				u->rst.ptr += 1;
3093
+			}
3094
+			break;
2988 3095
 		case 0xc3: /* POPkr */
2989 3096
 			__asm__("evaluxn_c3_POPkr:");
2990 3097
 			{
... ...
@@ -3489,6 +3596,26 @@ uxn_eval(Uxn *u, Uint16 vec)
3489 3596
 				u->rst.ptr += 1;
3490 3597
 			}
3491 3598
 			break;
3599
+		case 0xe2: /* NIP2kr */
3600
+			__asm__("evaluxn_e2_NIP2kr:");
3601
+			{
3602
+				Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
3603
+				(u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8));
3604
+				u->rst.dat[u->rst.ptr] = a >> 8;
3605
+				u->rst.dat[u->rst.ptr + 1] = a & 0xff;
3606
+#ifndef NO_STACK_CHECKS
3607
+				if(__builtin_expect(u->rst.ptr < 4, 0)) {
3608
+					u->rst.error = 1;
3609
+					goto error;
3610
+				}
3611
+				if(__builtin_expect(u->rst.ptr > 253, 0)) {
3612
+					u->rst.error = 2;
3613
+					goto error;
3614
+				}
3615
+#endif
3616
+				u->rst.ptr += 2;
3617
+			}
3618
+			break;
3492 3619
 		case 0xe3: /* POP2kr */
3493 3620
 			__asm__("evaluxn_e3_POP2kr:");
3494 3621
 			{
... ...
@@ -34,8 +34,8 @@ static void   devpoke16(Device *d, Uint8 a, Uint16 b) { devpoke8(d, a, b >> 8);
34 34
 static Uint16 devpeek16(Device *d, Uint16 a) { return (devpeek8(d, a) << 8) + devpeek8(d, a + 1); }
35 35
 /* Stack */
36 36
 static void op_brk(Uxn *u) { u->ram.ptr = 0; }
37
-static void op_nop(Uxn *u) { (void)u; }
38 37
 static void op_lit(Uxn *u) { push8(u->src, mempeek8(u->ram.dat, u->ram.ptr++)); }
38
+static void op_nip(Uxn *u) { Uint8 a = pop8(u->src); pop8(u->src); push8(u->src, a); }
39 39
 static void op_pop(Uxn *u) { pop8(u->src); }
40 40
 static void op_dup(Uxn *u) { Uint8 a = pop8(u->src); push8(u->src, a); push8(u->src, a); }
41 41
 static void op_swp(Uxn *u) { Uint8 a = pop8(u->src), b = pop8(u->src); push8(u->src, a); push8(u->src, b); }
... ...
@@ -70,6 +70,7 @@ static void op_eor(Uxn *u) { Uint8 a = pop8(u->src), b = pop8(u->src); push8(u->
70 70
 static void op_sft(Uxn *u) { Uint8 a = pop8(u->src), b = pop8(u->src); push8(u->src, b >> (a & 0x07) << ((a & 0x70) >> 4)); }
71 71
 /* Stack */
72 72
 static void op_lit16(Uxn *u) { push16(u->src, mempeek16(u->ram.dat, u->ram.ptr++)); u->ram.ptr++; }
73
+static void op_nip16(Uxn *u) { Uint16 a = pop16(u->src); pop16(u->src); push16(u->src, a); }
73 74
 static void op_pop16(Uxn *u) { pop16(u->src); }
74 75
 static void op_dup16(Uxn *u) { Uint16 a = pop16(u->src); push16(u->src, a); push16(u->src, a); }
75 76
 static void op_swp16(Uxn *u) { Uint16 a = pop16(u->src), b = pop16(u->src); push16(u->src, a); push16(u->src, b); }
... ...
@@ -104,12 +105,12 @@ static void op_eor16(Uxn *u) { Uint16 a = pop16(u->src), b = pop16(u->src); push
104 105
 static void op_sft16(Uxn *u) { Uint8 a = pop8(u->src); Uint16 b = pop16(u->src); push16(u->src, b >> (a & 0x0f) << ((a & 0xf0) >> 4)); }
105 106
 
106 107
 static void (*ops[])(Uxn *u) = {
107
-	op_brk, op_lit, op_nop, op_pop, op_dup, op_swp, op_ovr, op_rot,
108
+	op_brk, op_lit, op_nip, op_pop, op_dup, op_swp, op_ovr, op_rot,
108 109
 	op_equ, op_neq, op_gth, op_lth, op_jmp, op_jnz, op_jsr, op_sth, 
109 110
 	op_pek, op_pok, op_ldr, op_str, op_lda, op_sta, op_dei, op_deo,
110 111
 	op_add, op_sub, op_mul, op_div, op_and, op_ora, op_eor, op_sft,
111 112
 	/* 16-bit */
112
-	op_brk,   op_lit16, op_nop,   op_pop16, op_dup16, op_swp16, op_ovr16, op_rot16,
113
+	op_brk,   op_lit16, op_nip16, op_pop16, op_dup16, op_swp16, op_ovr16, op_rot16,
113 114
 	op_equ16, op_neq16, op_gth16, op_lth16, op_jmp16, op_jnz16, op_jsr16, op_sth16, 
114 115
 	op_pek16, op_pok16, op_ldr16, op_str16, op_lda16, op_sta16, op_dei16, op_deo16, 
115 116
 	op_add16, op_sub16, op_mul16, op_div16, op_and16, op_ora16, op_eor16, op_sft16
... ...
@@ -40,7 +40,7 @@ Program p;
40 40
 /* clang-format off */
41 41
 
42 42
 static char ops[][4] = {
43
-	"BRK", "LIT", "NOP", "POP", "DUP", "SWP", "OVR", "ROT",
43
+	"BRK", "LIT", "NIP", "POP", "DUP", "SWP", "OVR", "ROT",
44 44
 	"EQU", "NEQ", "GTH", "LTH", "JMP", "JCN", "JSR", "STH",
45 45
 	"LDZ", "STZ", "LDR", "STR", "LDA", "STA", "DEI", "DEO",
46 46
 	"ADD", "SUB", "MUL", "DIV", "AND", "ORA", "EOR", "SFT"