/*
 * OPCODES.H -- This structure is a template for each instruction in the
 * dictionary.  C_opcode is a constant, from below, and is an index into
 * opcodetbl[]; c_length is the total length, including the opcode, in # of
 * integers; the address of c_args will be the address of the first argument
 * (or if there is just one, it IS the first argument).
 *
 * The intent is to allow invoking the opcode with
 * 	(*opcodetbl[cp->c_opcode]) (&cp->c_args)
 *	where cp is a ptr to struct codeentry.
 */

struct codeentry {
	memel c_opcode;		/* opcodetbl index; see below		*/
	memel c_length;		/* total length in memory elements	*/
	memel c_args;		/* addr of this is addr of first arg	*/
};

extern void (*opcodetbl[])(memel *arg);

/* manifest constant opcodes used in c_opcode.
 * value is index into opcodetbl[].
 */

#define	ABSARGSET	1
#define	ADD		2
#define	ADDASSIGN	3
#define	ADDPIPE		4
#define	ALLAPPEND 	5

#define	ALLREDIR	6
#define	AND		7
#define	APPENDOUT	8
#define	ASSIGN		9
#define	BIFF		10

#define	CALL		11
#define CASE		12
#define	CHSIGN		13
#define	CONCAT		14
#define DEFAULT		15

#define	DIV		16
#define DIVASSIGN	17
#define	END		18
#define	EQ		19
#define	EXEC		20

#define FSCAN		21
#define FSCANF		22
#define	GE		23
#define	GOTO		24
#define	GETPIPE		25

#define	GT		26
#define	IMMED		27
#define	INDIRABSSET	28
#define	INDIRPOSSET	29
#define INDXINCR	30

#define	INSPECT		31
#define	INTRINSIC	32
#define	LE		33
#define	LT		34
#define	MUL		35

#define	MULASSIGN	36
#define	NE		37
#define	NOT		38
#define	OR		39
#define	OSESC		40

#define	POSARGSET	41
#define	POW		42
#define	PRINT		43
#define	PUSHCONST	44
#define	PUSHINDEX	45

#define	PUSHPARAM	46
#define	REDIR		47
#define	REDIRIN		48
#define	RMPIPES		49
#define	RETURN		50

#define	SCAN		51
#define	SCANF		52
#define	SUB		53
#define	SUBASSIGN	54
#define	SWITCH		55

#define	SWOFF		56
#define	SWON		57
#define	FIXLANGUAGE	58
#define	GSREDIR		59
#define	CATASSIGN	60
