commit 5ed07f5
zzo38
·
2022-11-16 03:59:33 +0000 UTC
parent 2d67137
Implement left/right shift in special calculations of assembler (by \_ command).
M
asm.doc
+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.
M
uxnasm.c
+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)) {