commit 5ed07f5

zzo38  ·  2022-11-16 03:59:33 +0000 UTC
parent 2d67137
Implement left/right shift in special calculations of assembler (by \_ command).
2 files changed,  +8, -1
+4, -0
 1@@ -168,6 +168,10 @@ $  ( -- x )  Get current length.
 2 
 3 ^  ( x y -- z )  Bitwise XOR.
 4 
 5+<  ( x y -- z )  Left shift x by y bits.
 6+
 7+>  ( x y -- z )  Right shift x by y bits.
 8+
 9 :  ( x -- x x )  Duplicate.
10 
11 ,  ( x y -- y x )  Swap.
+4, -1
 1@@ -299,6 +299,8 @@ static int special_calc(const char*w) {
 2     case '&': if(ssptr<2) return 0; b=sstack[--ssptr]; a=sstack[--ssptr]; sstack[ssptr++]=a&b; break;
 3     case '|': if(ssptr<2) return 0; b=sstack[--ssptr]; a=sstack[--ssptr]; sstack[ssptr++]=a|b; break;
 4     case '^': if(ssptr<2) return 0; b=sstack[--ssptr]; a=sstack[--ssptr]; sstack[ssptr++]=a^b; break;
 5+    case '<': if(ssptr<2) return 0; b=sstack[--ssptr]; a=sstack[--ssptr]; sstack[ssptr++]=(b&~15?0:a<<b); break;
 6+    case '>': if(ssptr<2) return 0; b=sstack[--ssptr]; a=sstack[--ssptr]; sstack[ssptr++]=(b&~15?0:a>>b); break;
 7     case ':': if(ssptr<1 || ssptr>255) return 0; a=sstack[ssptr-1]; sstack[ssptr++]=a; break;
 8     case ',': if(ssptr<2) return 0; b=sstack[--ssptr]; a=sstack[--ssptr]; sstack[ssptr++]=b; sstack[ssptr++]=a; break;
 9     case '.': if(ssptr<1) return 0; --ssptr; break;
10@@ -438,7 +440,7 @@ parse(char *w, FILE *f)
11 		break;
12 	case '[':
13 	case ']':
14-		if(slen(w) == 1) break; /* else fallthrough */
15+		if(slen(w) == 1) break;
16 		if((w[1]=='.' || w[1]==',' || w[1]==':' || w[1]==';' || w[1]=='@' || w[1]=='\\') && !w[2]) {
17 		  if(*w=='[') {
18 		    if(bsptr==256) return error("Stack overflow",w);
19@@ -455,6 +457,7 @@ parse(char *w, FILE *f)
20 		  }
21 		  break;
22 		}
23+		/* fall through */
24 	default: defa:
25 		/* opcode */
26 		if(findopcode(w) || scmp(w, "BRK", 4)) {