| 1 |
37 |
robfinch |
/*
|
| 2 |
|
|
* 68000 C compiler
|
| 3 |
|
|
*
|
| 4 |
|
|
* Copyright 1984, 1985, 1986 Matthew Brandt.
|
| 5 |
|
|
* all commercial rights reserved.
|
| 6 |
|
|
*
|
| 7 |
|
|
* This compiler is intended as an instructive tool for personal use. Any
|
| 8 |
|
|
* use for profit without the written consent of the author is prohibited.
|
| 9 |
|
|
*
|
| 10 |
|
|
* This compiler may be distributed freely for non-commercial use as long
|
| 11 |
|
|
* as this notice stays intact. Please forward any enhancements or questions
|
| 12 |
|
|
* to:
|
| 13 |
|
|
*
|
| 14 |
|
|
* Matthew Brandt
|
| 15 |
|
|
* Box 920337
|
| 16 |
|
|
* Norcross, Ga 30092
|
| 17 |
|
|
*/
|
| 18 |
|
|
|
| 19 |
|
|
/* global ParseSpecifierarations */
|
| 20 |
|
|
|
| 21 |
|
|
extern FILE *input,
|
| 22 |
|
|
*list,
|
| 23 |
|
|
*output;
|
| 24 |
51 |
robfinch |
extern FILE *outputG;
|
| 25 |
|
|
extern int incldepth;
|
| 26 |
37 |
robfinch |
extern int lineno;
|
| 27 |
|
|
extern int nextlabel;
|
| 28 |
|
|
extern int lastch;
|
| 29 |
|
|
extern int lastst;
|
| 30 |
|
|
extern char lastid[33];
|
| 31 |
|
|
extern char laststr[MAX_STLP1];
|
| 32 |
|
|
extern __int64 ival;
|
| 33 |
|
|
extern double rval;
|
| 34 |
|
|
|
| 35 |
|
|
extern TABLE gsyms[257],
|
| 36 |
|
|
lsyms;
|
| 37 |
|
|
extern SYM *lasthead;
|
| 38 |
|
|
extern struct slit *strtab;
|
| 39 |
|
|
extern int lc_static;
|
| 40 |
|
|
extern int lc_auto;
|
| 41 |
|
|
extern struct snode *bodyptr; /* parse tree for function */
|
| 42 |
|
|
extern int global_flag;
|
| 43 |
|
|
extern TABLE defsyms;
|
| 44 |
|
|
extern int save_mask; /* register save mask */
|
| 45 |
|
|
extern int uctran_off;
|
| 46 |
|
|
extern int isPascal;
|
| 47 |
|
|
extern int isOscall;
|
| 48 |
|
|
extern int isInterrupt;
|
| 49 |
|
|
extern int isNocall;
|
| 50 |
|
|
extern int asmblock;
|
| 51 |
|
|
extern int optimize;
|
| 52 |
|
|
extern int exceptions;
|
| 53 |
|
|
extern SYM *currentFn;
|
| 54 |
|
|
|
| 55 |
|
|
extern void error(int n);
|
| 56 |
|
|
extern void needpunc(enum e_sym p);
|
| 57 |
|
|
// Memmgt.c
|
| 58 |
|
|
extern char *xalloc(int);
|
| 59 |
|
|
extern SYM *allocSYM();
|
| 60 |
|
|
extern TYP *allocTYP();
|
| 61 |
|
|
extern AMODE *allocAmode();
|
| 62 |
|
|
|
| 63 |
|
|
// NextToken.c
|
| 64 |
|
|
extern void initsym();
|
| 65 |
|
|
extern void NextToken();
|
| 66 |
|
|
extern int getch();
|
| 67 |
|
|
extern int isspace(char c);
|
| 68 |
|
|
extern void getbase(b);
|
| 69 |
|
|
extern void SkipSpaces();
|
| 70 |
|
|
|
| 71 |
|
|
// Stmt.c
|
| 72 |
|
|
extern struct snode *ParseCompoundStatement();
|
| 73 |
|
|
|
| 74 |
|
|
extern void GenerateDiadic(int op, int len, struct amode *ap1,struct amode *ap2);
|
| 75 |
|
|
// Symbol.c
|
| 76 |
|
|
extern SYM *gsearch(char *na);
|
| 77 |
|
|
extern SYM *search(char *na,SYM *thead);
|
| 78 |
|
|
extern void insert(SYM* sp, TABLE *table);
|
| 79 |
|
|
|
| 80 |
|
|
extern char *litlate(char *);
|
| 81 |
|
|
// Decl.c
|
| 82 |
|
|
extern void dodecl(int defclass);
|
| 83 |
|
|
extern void ParseParameterDeclarations(int);
|
| 84 |
|
|
extern void ParseAutoDeclarations();
|
| 85 |
|
|
extern void ParseSpecifier(TABLE *table);
|
| 86 |
|
|
extern void ParseDeclarationPrefix();
|
| 87 |
|
|
extern void ParseStructDeclaration(int);
|
| 88 |
|
|
extern void ParseEnumerationList(TABLE *table);
|
| 89 |
|
|
|
| 90 |
|
|
extern void initstack();
|
| 91 |
|
|
extern int getline(int listflag);
|
| 92 |
|
|
|
| 93 |
|
|
// Init.c
|
| 94 |
|
|
extern void doinit(SYM *sp);
|
| 95 |
|
|
// Func.c
|
| 96 |
|
|
extern void funcbody(SYM *sp);
|
| 97 |
|
|
// Intexpr.c
|
| 98 |
51 |
robfinch |
extern __int64 GetIntegerExpression();
|
| 99 |
37 |
robfinch |
// Expr.c
|
| 100 |
|
|
extern ENODE *makenode(int nt, ENODE *v1, ENODE *v2);
|
| 101 |
|
|
extern ENODE *makeinode(int nt, __int64 v1);
|
| 102 |
|
|
extern TYP *expression(struct enode **node);
|
| 103 |
|
|
extern int IsLValue(struct enode *node);
|
| 104 |
|
|
// Optimize.c
|
| 105 |
|
|
extern void opt4(struct enode **node);
|
| 106 |
|
|
// GenerateStatement.c
|
| 107 |
|
|
extern void GenerateStatement(struct snode *stmt);
|
| 108 |
|
|
extern void GenerateFunction(struct snode *stmt);
|
| 109 |
|
|
extern void GenerateIntoff(struct snode *stmt);
|
| 110 |
|
|
extern void GenerateInton(struct snode *stmt);
|
| 111 |
|
|
extern void GenerateStop(struct snode *stmt);
|
| 112 |
|
|
extern void GenerateAsm(struct snode *stmt);
|
| 113 |
|
|
extern void GenerateFirstcall(struct snode *stmt);
|
| 114 |
|
|
extern void gen_regrestore();
|
| 115 |
|
|
extern AMODE *make_direct(__int64 i);
|
| 116 |
|
|
// Outcode.c
|
| 117 |
|
|
extern void GenerateByte(int val);
|
| 118 |
|
|
extern void GenerateChar(int val);
|
| 119 |
|
|
extern void genhalf(int val);
|
| 120 |
|
|
extern void GenerateWord(__int64 val);
|
| 121 |
51 |
robfinch |
extern void GenerateLong(__int64 val);
|
| 122 |
37 |
robfinch |
extern void genstorage(int nbytes);
|
| 123 |
|
|
extern void GenerateReference(SYM *sp,int offset);
|
| 124 |
|
|
extern void GenerateLabelReference(int n);
|
| 125 |
|
|
extern void gen_strlab(char *s);
|
| 126 |
|
|
extern void dumplits();
|
| 127 |
|
|
extern int stringlit(char *s);
|
| 128 |
|
|
extern void nl();
|
| 129 |
|
|
extern void cseg();
|
| 130 |
|
|
extern void dseg();
|
| 131 |
|
|
extern void put_code(int op, int len,AMODE *aps, AMODE *apd, AMODE *);
|
| 132 |
|
|
extern void put_label(int lab);
|
| 133 |
|
|
// Peepgen.c
|
| 134 |
|
|
extern void flush_peep();
|
| 135 |
|
|
extern void GenerateLabel(int labno);
|
| 136 |
|
|
// Gencode.c
|
| 137 |
|
|
extern AMODE *make_label(__int64 lab);
|
| 138 |
|
|
extern AMODE *make_immed(__int64);
|
| 139 |
|
|
extern AMODE *make_indirect(int i);
|
| 140 |
|
|
extern AMODE *make_offset(struct enode *node);
|
| 141 |
|
|
extern void swap_nodes(struct enode *node);
|
| 142 |
|
|
extern int isshort(struct enode *node);
|
| 143 |
|
|
// IdentifyKeyword.c
|
| 144 |
|
|
extern int IdentifyKeyword();
|
| 145 |
|
|
// Preproc.c
|
| 146 |
|
|
extern int preprocess();
|
| 147 |
|
|
// CodeGenerator.c
|
| 148 |
|
|
extern AMODE *make_indirect(int i);
|
| 149 |
|
|
extern AMODE *make_indexed(__int64 o, int i);
|
| 150 |
|
|
extern void GenerateFalseJump(struct enode *node,int label);
|
| 151 |
51 |
robfinch |
extern char *GetNamespace();
|
| 152 |
|
|
extern char nmspace[20][100];
|
| 153 |
|
|
enum e_sg { noseg, codeseg, dataseg, bssseg, idataseg };
|
| 154 |
37 |
robfinch |
|
| 155 |
|
|
|