/*
** CC.H -- Symbol Definitions for Small-C compiler.
*/
#ifdef __GNUC__
#define YES      1		/* true */
#define NO       0		/* false */
#define CR      13		/* ASCII carriage return */
#define LF      10		/* ASCII line feed */
#define BELL     7		/* ASCII bell */
#define SPACE  ' '		/* ASCII space */
#define NEWLINE LF		/* Small C newline character */
#endif

/*
** ALIGNMENT
*/

#define ALIGN	4


/*
** machine dependent parameters
*/
#define BPD	4		/* bytes per dword */
#define LBPD	2		/* log2(BPD) */
#define BPW     2		/* bytes per word */
#define LBPW    1		/* log2(BPW) */
#define SBPC    1		/* stack bytes per character */
#define ERRCODE 7		/* op sys return code */
#define INTSIZE	4

/*
** symbol table format
*/
#define IDENT    0
#define TYPE     1
#define CLASS    2
#define SIZE     3
#define OFFSET   5+2
#define NAME     (7+4)

#define SYMAVG  (12+4)
#define SYMMAX  (16+4)

/*
** symbol table parameters
*/
#define NUMLOCS   25
#define STARTLOC  symtab
#define ENDLOC    (symtab+NUMLOCS*SYMAVG)
#define NUMGLBS   200
#define STARTGLB  ENDLOC
#define ENDGLB    (ENDLOC+(NUMGLBS-1)*SYMMAX)
#define SYMTBSZ   /*3050*/ (NUMLOCS*SYMAVG + NUMGLBS*SYMMAX)

/*
** system wide name size (for symbols)
*/
#define NAMESIZE 9
#define NAMEMAX  8

/*
** values for "IDENT"
*/
#define LABEL    0
#define VARIABLE 1
#define ARRAY    2
#define POINTER  3
#define FUNCTION 4

#define PTRSIZE	 INTSIZE	/* Size of pointer (must match an int!) */


/*
** values for "TYPE"
**    high order 14 bits give length of object
**    low order 2 bits make type unique within length
*/
/*      LABEL   0 */
#define CHR     (  1 << 2)
#define SHORT   (BPW << 2)
#define INT     (INTSIZE << 2)
#define UCHR   ((  1 << 2) + 1)
#define USHORT ((BPW << 2) + 1)
#define UINT   ((INTSIZE << 2) + 1)
#define UNSIGNED             1

/*
** values for "CLASS"
*/
/*      LABEL     0 */
#define AUTOMATIC 1
#define STATIC    2
#define EXTERNAL  3
#define AUTOEXT   4

/*
** segment types
*/
#define DATASEG 1
#define CODESEG 2

/*
** "switch" table
*/
#define SWSIZ   (2*BPW)
#define SWTABSZ (90*SWSIZ)

/*
** "while" queue
*/
#define WQTABSZ  30
#define WQSIZ     3
#define WQMAX   (wq+WQTABSZ-WQSIZ)

/*
** field offsets in "while" queue
*/
#define WQSP    0
#define WQLOOP  1
#define WQEXIT  2

/*
** literal pool
*/
#define LITABSZ 3000
#define LITMAX  (LITABSZ-1)

/*
** input line
*/
#define LINEMAX  127
#define LINESIZE 128

/*
** entries in staging buffer
*/
#define STAGESIZE   200

/*
** macro (#define) pool
*/
#define MACNBR   300
#define MACNSIZE (MACNBR*(NAMESIZE+2))
#define MACNEND  (macn+MACNSIZE)
#define MACQSIZE (MACNBR*7)
#define MACMAX   (MACQSIZE-1)

/*
** statement types
*/
#define STIF      1
#define STWHILE   2
#define STRETURN  3
#define STBREAK   4
#define STCONT    5
#define STASM     6
#define STEXPR    7
#define STDO      8
#define STFOR     9
#define STSWITCH 10
#define STCASE   11
#define STDEF    12
#define STGOTO   13
#define STLABEL  14

/*
** p-code symbols
**
** legend:
**  1 = primary register (pr in comments)
**  2 = secondary register (sr in comments)
**  b = byte
**  f = jump on false condition
**  l = current literal pool label number
**  m = memory reference by label
**  n = numeric constant
**  p = indirect reference thru pointer in sr
**  r = repeated r times
**  s = stack frame reference
**  u = unsigned
**  w = word
**  _ (tail) = another p-code completes this one
*/

	/* compiler-generated */
#define ADD12     1		/* add sr to pr */
#define ADDSP     2		/* add to stack pointer */
#define AND12     3		/* AND sr to pr */
#define ANEG1     4		/* arith negate pr */
#define ARGCNTn   5		/* pass arg count to function */
#define ASL12     6		/* arith shift left sr by pr into pr */
#define ASR12     7		/* arith shift right sr by pr into pr */
#define CALL1     8		/* call function thru pr */
#define CALLm     9		/* call function directly */
#define BYTE_    10		/* define bytes (part 1) */
#define BYTEn    11		/* define byte of value n */
#define BYTEr0   12		/* define r bytes of value 0 */
#define COM1     13		/* ones complement pr */
#define DBL1     14		/* double pr */
#define DBL2     15		/* double sr */
#define DIV12    16		/* div pr by sr */
#define DIV12u   17		/* div pr by sr unsigned */

#define DWORD_  111		/* define dword (part 1) */
#define DWORDn  112		/* define dword of value n */
#define DWORDr0 113		/* define r dwords of value 0 */

#define ENTER    18		/* set stack frame on function entry */
#define EQ10f    19		/* jump if (pr == 0) is false */
#define EQ12     20		/* set pr TRUE if (sr == pr) */
#define GE10f    21		/* jump if (pr >= 0) is false */
#define GE12     22		/* set pr TRUE if (sr >= pr) */
#define GE12u    23		/* set pr TRUE if (sr >= pr) unsigned */
#define POINT1l  24		/* point pr to function's literal pool */
#define POINT1m  25		/* point pr to mem item thru label */
#define GETb1m   26		/* get byte into pr from mem thru label */
#define GETb1mu  27		/* get unsigned byte into pr from mem thru label */
#define GETb1p   28		/* get byte into pr from mem thru sr ptr */
#define GETb1pu  29		/* get unsigned byte into pr from mem thru sr ptr */

#define GETd1m  107		/* get dword into pr from mem thru label */
#define GETd1n  108		/* get dword of value n into pr */
#define GETd1p  109		/* get dword into pr from mem thru sr ptr */
#define GETd2n  110		/* get word of value n into sr */

#define GETw1m   30		/* get word into pr from mem thru label */
#define GETw1n   31		/* get word of value n into pr */
#define GETw1p   32		/* get word into pr from mem thru sr ptr */
#define GETw2n   33		/* get word of value n into sr */
#define GT10f    34		/* jump if (pr > 0) is false */
#define GT12     35		/* set pr TRUE if (sr > pr) */
#define GT12u    36		/* set pr TRUE if (sr > pr) unsigned */
#define WORD_    37		/* define word (part 1) */
#define WORDn    38		/* define word of value n */
#define WORDr0   39		/* define r words of value 0 */
#define JMPm     40		/* jump to label */
#define LABm     41		/* define label m */
#define LE10f    42		/* jump if (pr <= 0) is false */
#define LE12     43		/* set pr TRUE if (sr <= pr) */
#define LE12u    44		/* set pr TRUE if (sr <= pr) unsigned */
#define LNEG1    45		/* logical negate pr */
#define LT10f    46		/* jump if (pr < 0) is false */
#define LT12     47		/* set pr TRUE if (sr < pr) */
#define LT12u    48		/* set pr TRUE if (sr < pr) unsigned */
#define MOD12    49		/* modulo pr by sr */
#define MOD12u   50		/* modulo pr by sr unsigned */
#define MOVE21   51		/* move pr to sr */
#define MUL12    52		/* multiply pr by sr */
#define MUL12u   53		/* multiply pr by sr unsigned */
#define NE10f    54		/* jump if (pr != 0) is false */
#define NE12     55		/* set pr TRUE if (sr != pr) */
#define NEARm    56		/* define near pointer thru label */
#define OR12     57		/* OR sr onto pr */
#define POINT1s  58		/* point pr to stack item */
#define POP2     59		/* pop stack into sr */
#define PUSH1    60		/* push pr onto stack */
#define PUTbm1   61		/* put pr byte in mem thru label */
#define PUTbp1   62		/* put pr byte in mem thru sr ptr */

#define PUTdm1  114		/* put pr dword in mem thru label */
#define PUTdp1  115		/* put pr dword in mem thru sr ptr */

#define PUTwm1   63		/* put pr word in mem thru label */
#define PUTwp1   64		/* put pr word in mem thru sr ptr */
#define rDEC1    65		/* dec pr (may repeat) */
#define REFm     66		/* finish instruction with label */
#define RETURN   67		/* restore stack and return */
#define rINC1    68		/* inc pr (may repeat) */
#define SUB12    69		/* sub sr from pr */
#define SWAP12   70		/* swap pr and sr */
#define SWAP1s   71		/* swap pr and top of stack */
#define SWITCH   72		/* find switch case */
#define XOR12    73		/* XOR pr with sr */

	/* optimizer-generated */
#define ADD1n    74		/* add n to pr */
#define ADD21    75		/* add pr to sr */
#define ADD2n    76		/* add immediate to sr */
#define ADDbpn   77		/* add n to mem byte thru sr ptr */
#define ADDwpn   78		/* add n to mem word thru sr ptr */
#define ADDm_    79		/* add n to mem byte/word thru label (part 1) */
#define COMMAn   80		/* finish instruction with ,n */
#define DECbp    81		/* dec mem byte thru sr ptr */
#define DECwp    82		/* dec mem word thru sr ptr */
#define POINT2m  83		/* point sr to mem thru label */
#define POINT2m_ 84		/* point sr to mem thru label (part 1) */
#define GETb1s   85		/* get byte into pr from stack */
#define GETb1su  86		/* get unsigned byte into pr from stack */
#define GETw1m_  87		/* get word into pr from mem thru label (part 1) */
#define GETw1s   88		/* get word into pr from stack */
#define GETw2m   89		/* get word into sr from mem (label) */
#define GETw2p   90		/* get word into sr thru sr ptr */
#define GETw2s   91		/* get word into sr from stack */
#define INCbp    92		/* inc byte in mem thru sr ptr */
#define INCwp    93		/* inc word in mem thru sr ptr */
#define PLUSn    94		/* finish instruction with +n */
#define POINT2s  95		/* point sr to stack */
#define PUSH2    96		/* push sr */
#define PUSHm    97		/* push word from mem thru label */
#define PUSHp    98		/* push word from mem thru sr ptr */
#define PUSHs    99		/* push word from stack */
#define PUT_m_  100		/* put byte/word into mem thru label (part 1) */
#define rDEC2   101		/* dec sr (may repeat) */
#define rINC2   102		/* inc sr (may repeat) */
#define SUB_m_  103		/* sub from mem byte/word thru label (part 1) */
#define SUB1n   104		/* sub n from pr */
#define SUBbpn  105		/* sub n from mem byte thru sr ptr */
#define SUBwpn  106		/* sub n from mem word thru sr ptr */

#define PCODES  116		/* size of code[] (it's a [+ 1]) */
