static int interpret() { fetch: Cyclecount++; W = M[C++]; if ((W & DBIT) == 0) D = W & ABITS; else D = M[C++]; if ((W & PBIT) != 0) D += P; if ((W & GBIT) != 0) D += G; if ((W & IBIT) != 0) D = M[D]; switch (W >> FSHIFT) { error: default: printf("\nINTCODE ERROR AT C = %d\n", C - 1); return -1; case 0: B = A; A = D; goto fetch; case 1: M[D] = A; goto fetch; case 2: A = A + D; goto fetch; case 3: C = D; goto fetch; case 4: A = !A; case 5: if (!A) C = D; goto fetch; case 6: D += P; M[D] = P; M[D + 1] = C; P = D; C = A; goto fetch; case 7: switch (D) { default: goto error; case 1: A = M[A]; goto fetch; case 2: A = -A; goto fetch; case 3: A = ~A; goto fetch; case 4: C = M[P + 1]; P = M[P]; goto fetch; case 5: A = B * A; goto fetch; case 6: A = B / A; goto fetch; case 7: A = B % A; goto fetch; case 8: A = B + A; goto fetch; case 9: A = B - A; goto fetch; case 10: A = B == A ? ~0 : 0; goto fetch; case 11: A = B != A ? ~0 : 0; goto fetch; case 12: A = B < A ? ~0 : 0; goto fetch; case 13: A = B >= A ? ~0 : 0; goto fetch; case 14: A = B > A ? ~0 : 0; goto fetch; case 15: A = B <= A ? ~0 : 0; goto fetch; case 16: A = B << A; goto fetch; case 17: A = B >> A; goto fetch; case 18: A = B & A; goto fetch; case 19: A = B | A; goto fetch; case 20: A = B ^ A; goto fetch; case 21: A = B ^ ~A; goto fetch; case 22: return 0; case 23: B = M[C]; D = M[C + 1]; while (B != 0) { B--; C += 2; if (A == M[C]) { D = M[C + 1]; break; } } C = D; goto fetch; case 24: selectinput(A); goto fetch; case 25: selectoutput(A); goto fetch; case 26: A = rdch(); goto fetch; case 27: wrch(A); goto fetch; case 28: A = findinput(A); goto fetch; case 29: A = findoutput(A); goto fetch; case 30: return A; case 31: A = M[P]; goto fetch; case 32: P = A; C = B; goto fetch; case 33: endread(); goto fetch; case 34: endwrite(); goto fetch; case 35: D = P + B + 1; M[D] = M[P]; M[D + 1] = M[P + 1]; M[D + 2] = P; M[D + 3] = B; P = D; C = A; goto fetch; case 36: A = getbyte(A, B); goto fetch; case 37: putbyte(A, B, M[P + 4]); goto fetch; case 38: A = input(); goto fetch; case 39: A = output(); goto fetch; } } }
PUBLIC WORD parse(INT old_nesting) { int nesting = (int) old_nesting; int quoted; nextsym(); if( symb==s_eof ) return nesting; parse_depth++; if( ( quoted = (symb==s_quote) ) != 0 ) nextsym(); /* trace("Parse %squoted depth %d",quoted?"":"un",parse_depth); */ for(;;) { switch ( (int)symb ) { case s_builtin: if(!quoted) { builtin(); break; } case s_macro: if(!quoted) { eval(); break; } case s_hexvar: case s_var: if(!quoted) { evalvar(); break; } default: case s_token: if( toksize == 1 ) wrch(token[0]); else wrstr(token); break; case s_lbra: if( nesting++ > 0) wrch(c_lbra); break; case s_rbra: if( --nesting > 0 ) wrch(c_rbra); break; case s_eof: return nesting; case s_quote: if( quoted ) wrch(c_quote); pbchar(c_quote); nesting = (int) parse((WORD)nesting); break; case s_concat: if( quoted ) wrch(c_concat); break; } if ( nesting <= old_nesting ) break; nextsym(); } parse_depth--; return nesting; }