forked from KolibriOS/kolibrios
321 lines
10 KiB
C
321 lines
10 KiB
C
|
/*
|
||
|
** CC.H -- Symbol Definitions for Small-C compiler.
|
||
|
*/
|
||
|
|
||
|
#ifdef _MSC_VER
|
||
|
#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
|
||
|
|
||
|
/*
|
||
|
** size of 'int'
|
||
|
*/
|
||
|
|
||
|
#define INT32 /* if #defined int = 32 bits, else 16 */
|
||
|
|
||
|
/*
|
||
|
** 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]) */
|
||
|
|