// TinC - Tiny, in C
// tinc13.h

#define COMPILER "TinC v1.3\n\n"

/*--------------------------------------------------------------*/
/* A clutch of constants */

#define FALSE        	0
#define TRUE         	-1
#define EXIT_SUCCESS 	0
#define EXIT_FAIL    	1
#define STRTMPSIZE   	256

#define TAB             '\t'
#define CR              '\015'
#define LF              '\n'

#define MAXSYMSIZE	16
#define MAXGLOBALS      1000
#define MAXLOCALS	64
#define MAXSTAGE	128000
#define MAXDEFS		5000
#define MAXLINESIZE	80
#define MAXPARAMS	16
#define MAXCONSTS	100
#define MAXCONSTSIZE    80
#define MAXINCL		9


/*--------------------------------------------------------------*/
/* Register control and data type bits */

#define DT_UCHAR	1
#define DT_CHAR		2
#define DT_INT		4
#define DT_UINT		8
#define DT_CPTR		16
#define DT_IPTR		32
#define DT_UCPTR	64
#define DT_UIPTR	128
#define DT_PROCEDURE	256
#define DT_INTERRUPT	512

#define DT_XCHAR	DT_CHAR | DT_UCHAR
#define DT_XINT		DT_INT | DT_UINT
#define DT_XCPTR	DT_CPTR | DT_UCPTR
#define DT_XIPTR	DT_IPTR | DT_UIPTR
#define DT_XPTR		DT_XCPTR | DT_XIPTR

#define DT_ALL		DT_XCHAR | DT_XINT | DT_XPTR

#define TYPEDESCSIZE	10


/*--------------------------------------------------------------*/
/* Definition of Token Types, etc */

typedef char  Symbol[MAXSYMSIZE+1];

#define NKW             20
#define NKW1            21

static Symbol KWlist[NKW] =    {"if", "else", "endif", "while",
				"endwhile", "char", "end",
				"int", "#define", "unsigned",
				"#inline", "#ifdef", "#endif",
				"program", "procedure", "begin",
				"interrupt", "#include", "for",
				"endfor"
			       };

#define TOK_IDENTIFIER		'x'
#define TOK_IF			'i'
#define TOK_ELSE		'l'
#define TOK_ENDIF		'e'
#define TOK_WHILE		'w'
#define TOK_ENDWHILE		'e'
#define TOK_CHARDEF		'C'
#define TOK_END			'e'
#define TOK_NUM			'N'
#define TOK_INTDEF		'I'
#define TOK_DEFINE		'd'
#define TOK_UNSIGNED		'U'
#define TOK_INLINE		'a'
#define TOK_IFDEF		0x03
#define TOK_ENDIFDEF		0x04
#define TOK_PROGRAM		'P'
#define TOK_PROCEDURE		'R'
#define TOK_BEGIN		'B'
#define TOK_INTERRUPT		'S'
#define TOK_INCLUDE		'E'
#define TOK_FOR			'f'
#define TOK_ENDFOR		'e'

#define TOK_HEX			'H'
#define TOK_DIRECTIVE		'#'
#define TOK_BLOCK_COMMENT	0x01
#define TOK_LINE_COMMENT	0x02
#define TOK_UCHARDEF		'D'
#define TOK_UINTDEF		'J'

static char KWcode[NKW1 + 1] = {TOK_IDENTIFIER, TOK_IF, TOK_ELSE,
				TOK_ENDIF, TOK_WHILE, TOK_ENDWHILE,
				TOK_CHARDEF, TOK_END,TOK_INTDEF,
				TOK_DEFINE, TOK_UNSIGNED, TOK_INLINE,
				TOK_IFDEF, TOK_ENDIFDEF, TOK_PROGRAM,
				TOK_PROCEDURE, TOK_BEGIN, TOK_INTERRUPT,
				TOK_INCLUDE, TOK_FOR, TOK_ENDFOR
				};


/*--------------------------------------------------------------*/
/* return codes for WhatIs() */

#define UNKNOWN		0
#define PARAM		1
#define LOCAL		2
#define GLOBAL		3


/*--------------------------------------------------------------*/
/* pcode definitions - DO NOT CHANGE */

#define PC_GETREG		 1
#define PC_FREEREG		 2

#define PC_FIRST_REAL		 3

#define PC_LABEL                 3
#define PC_BRANCH                4
#define PC_BRANCH_FALSE          5
#define PC_HEADER                6
#define PC_PROLOG                7
#define PC_EPILOG                8
#define PC_ALLOCATE              9
#define PC_GROWSTACK	        10
#define PC_SHRINKSTACK	        11
#define PC_MOVE_REG		12
#define PC_ADD_REG		13
#define PC_SUB_REG		14
#define PC_MOVE_VAR_REG         15
#define PC_MOVE_LVAR_REG        16
#define PC_MOVE_REG_VAR         17
#define PC_MOVE_REG_LVAR        18
#define PC_MUL_REG		19
#define PC_DIV_REG		20
#define PC_CLEAR_REG		21
#define PC_COMPARE_REG		22
#define PC_AND_REG		23
#define PC_OR_REG		24
#define PC_XOR_REG		25
#define PC_NOT_REG		26
#define PC_MOVE_A_REG           27
#define PC_MOVE_AL_REG          28
#define PC_MOVE_I_REG           29
#define PC_ADJUST_REG           30
#define PC_MOVE_REG_I           31
#define PC_MOVE_CONST_REG	32
#define PC_SET_REG_EQ           33
#define PC_SET_REG_NE           34
#define PC_SET_REG_LT           35
#define PC_SET_REG_GT           36
#define PC_SET_REG_GE           37
#define PC_SET_REG_LE           38
#define PC_INLINE		39
#define PC_SHIFTRIGHT		40
#define PC_SHIFTLEFT		41
#define PC_SETFP		42
#define PC_PUSHFP		43
#define PC_POPFP		44
#define PC_DOCALL		45
#define PC_CALLRET		46
#define PC_INTRET		47
#define PC_MOVE_PVAR_REG        48
#define PC_MOVE_REG_PVAR        49
#define PC_MOVE_AP_REG          50
#define PC_PUSH_REG		51
#define PC_PROGSEC		52
#define PC_DATASEC		53
#define PC_CONST		54

#define PC_OPTSTART		55

#include "tinct13.h"