 	return -9999;
 }
 
-#define isVarName( L ) ( (L)>='a' && (L)<='z' )
+#define OpcodeIs( A, B )	(op0 == (A) && op1 == (B) )
+
+#define isVarName( L )		( (L)>='a' && (L)<='z' )
 
 int evaluate_line( char * line )
 {

	else if( !strcmp( linebuf, "eload" )) { cmd_eload(); }
	else if( !strcmp( linebuf, "esave" )) { cmd_esave(); }

	else if( !strcmp( linebuf, "tron" )) { cmd_tron(); }
	else if( !strcmp( linebuf, "troff" )) { cmd_troff(); }
	else if( !strcmp( linebuf, "run" )) { cmd_run(); }

	else if( linebuf[0] >= '0' && linebuf[0] <= '9' ) {

	char varname;
	int value;

	char op0, op1;

	if( !line ) return kJRStop;

	// make sure there's an opcode
	while( *buf != '\0' && *buf != '\n' ) { len++; buf++; }
	if( len < 2 ) return kJRStop;

	// store the opcode, and increment past it.
	op0 = *line++;
	op1 = *line++;

	// skip any pre-pended whitespace
	SKIP_WHITESPACE( line );

	// the do-nothing ops
	if( OpcodeIs( 'N', 'P' )) return kJRNextLine;
	if( OpcodeIs( 'R', 'E' )) return kJRNextLine;


	// stop.
	if( OpcodeIs( 'S', 'T' )) return kJRStop;


	// io
	// PP print (Special case of the interpreter)
	if(    OpcodeIs( 'P', 'P' )
	    || OpcodeIs( 'P', 'L' ) ) {

		if( *line == '\0' || *line == '\n' ) {
			// nothing.
			// this lets people do PL for newlines
