mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 08:24:18 +00:00
206 lines
6.5 KiB
C
206 lines
6.5 KiB
C
|
|
#define PROGNAME "LINK68" /* name of this program */
|
|
#define CBMAIN "__cbmain" /* main entry point in CBASIC program */
|
|
|
|
#include "machine.h"
|
|
/* format of a symbol entry in the main table*/
|
|
|
|
#define SEEKREL 1 /*relative seek flag*/
|
|
|
|
#define DRIVELEN 2 /* drive spec length -- FOO */
|
|
|
|
#define LINELEN 132 /* maximum input/output string length */
|
|
#define FNAMELEN 15 /* drive, name, and type, null terminated */
|
|
#define MAXOVLS 255 /* maximum number of overlays */
|
|
#define MAXOVDEP 5 /* maximum nesting depth for overlays */
|
|
#define ROOT 0 /* overlay number for root */
|
|
#define EOS '\0' /* end of string */
|
|
#define JSRL 0x4EB9 /* jsr to long address */
|
|
#define JMPL 0x4EF9 /* jmp to long address */
|
|
#define BDOSFNAM 12 /* length of a filename for a BDOS call */
|
|
#define PREORDER 1 /* preorder search of command tree */
|
|
#define POSTORDER 2 /* postorder search of command tree */
|
|
#define DEFTYPE ".O" /* default file type */
|
|
#define DEFLEN 2 /* length of deftype */
|
|
|
|
extern VOID banner(); /* prints sign-on banner */
|
|
|
|
/* stuff for error processor */
|
|
|
|
extern VOID errorx(); /* error handler in main module */
|
|
extern VOID putarrow(); /* print arrow under bad token */
|
|
|
|
|
|
extern char *errst1; /* used for passing values to */
|
|
extern char *errst2; /* error processor */
|
|
extern long errnum1;
|
|
extern long errnum2;
|
|
|
|
/* some global file stuff */
|
|
|
|
extern char cmdline[]; /* command line buffer */
|
|
extern FILE *fopen();
|
|
extern FILE *fopenb();
|
|
extern char tdisk[]; /* drive for temp files */
|
|
|
|
|
|
/* option flag/switches */
|
|
|
|
extern int mapflg; /* generate a load map */
|
|
extern int absflg; /* absolute load */
|
|
extern int tdrflg; /* temp files go on spec. drive */
|
|
extern int symflg; /* set to output symbol table */
|
|
extern int ovflag; /* set if loading overlays */
|
|
extern int ignflg; /* ignore 16-bit address overflow */
|
|
extern int udfflg; /* allow undefined symbols */
|
|
extern int chnflg; /* chained program */
|
|
extern int dmpflg; /* dump symbols -- undocumented */
|
|
|
|
/* flags for input files */
|
|
|
|
#define FNALL 0100000 /* don't search library */
|
|
#define FNINCL 0040000 /* load named symbol from file */
|
|
#define FNSYM 0020000 /* symbol name -- not a file */
|
|
#define FNLOCS 0010000 /* put locals in symbol table */
|
|
|
|
/* error numbers -- see errorx() in main module for exact messages */
|
|
|
|
#define BADCHAR 1 /* illegal character */
|
|
#define BADSYNT 2 /* catchall syntax error */
|
|
#define CMDTRUNC 3 /* unexpected end of command */
|
|
#define BADOPT 4 /* junk or out-of-place option */
|
|
#define NOROOM 5 /* no more heap space */
|
|
#define BADNUM 6 /* ill-formed hex number */
|
|
#define MORECMD 7 /* parse done - stuff left over */
|
|
#define BADINFIL 8 /* can't open file for reading */
|
|
#define XTRACFIL 9 /* nested command file */
|
|
#define XESSOVLS 10 /* too many overlays */
|
|
#define CMDLONG 11 /* command line too long */
|
|
#define OVTODEEP 12 /* overlays nested too deep */
|
|
#define DISCONTIG 13 /* discontig. load with overlays*/
|
|
#define BADOVREF 14 /* illegal reference to overlay */
|
|
#define READERR 15 /* file read error */
|
|
#define FORMATERR 16 /* file format error */
|
|
#define NORELOC 17 /* no relocation bits in file */
|
|
#define BADSYMFLG 18 /* invalid symbol flags */
|
|
#define DUPDEF 19 /* duplicate definition */
|
|
#define SYMOFL 20 /* symbol table overflow */
|
|
#define BADTEMP 21 /* cannot open temp file */
|
|
#define INTERR 22 /* internal error */
|
|
#define UNDEF 23 /* undefined symbol */
|
|
#define BADOUT 24 /* cannot open output file */
|
|
#define SEEKERR 25 /* seek read error */
|
|
#define SHRTOFL 26 /* short address overflow */
|
|
#define TSZERR 27 /* text size error */
|
|
#define OWRTERR 28 /* output file write error */
|
|
#define REOPNERR 29 /* unable to reopen temp file */
|
|
#define RELADROFL 30 /* relative address overflow */
|
|
#define BADRELOC 31 /* bad relocation flag */
|
|
|
|
|
|
/* command tree structures */
|
|
|
|
#define NOPARENT -1 /* normal NULL == 0 */
|
|
|
|
|
|
struct filenode { /* info about input file */
|
|
char fnfname[FNAMELEN]; /* input file name */
|
|
short fnflags; /* option flags for file */
|
|
struct filenode *fnnext; /* next file in list */
|
|
};
|
|
|
|
|
|
struct jmpblock { /* used for building overlay calls */
|
|
char *globref; /* pointer to global symbol */
|
|
struct jmpblock *nxtjbl; /* next jump block in list */
|
|
};
|
|
|
|
struct ovtrnode { /* info about each overlay */
|
|
char ovfname[FNAMELEN]; /* output filename */
|
|
long ovtxbase; /* base of text segment */
|
|
long ovdtbase; /* base of init. data segment */
|
|
long ovbsbase; /* base of local uninit. data */
|
|
long ovcap; /* first word above overlay */
|
|
char *ovfsym; /* 1st sym tab ent for module */
|
|
short ovnxtsib; /* next sibling overlay node */
|
|
short ovfstkid; /* first descendant overlay */
|
|
short ovparent; /* parent node link */
|
|
struct filenode *ovflist; /* list of input files */
|
|
struct jmpblock *ovjblck; /* list of jump blocks */
|
|
};
|
|
|
|
extern struct ovtrnode *ovtree[MAXOVLS+1]; /* leave room for root info */
|
|
extern int numovls; /* number of actual overlays */
|
|
|
|
/* structure of entry in output overlay table */
|
|
|
|
struct ovtab {
|
|
char tbname[8]; /* file name -- pad with blanks */
|
|
char tbext[4]; /* file extension -- no dot (.) */
|
|
long tbldpt; /* load point for module */
|
|
};
|
|
|
|
/* structure of an indirect call to an overlay routine */
|
|
|
|
struct ovcalblk {
|
|
short jsrovh; /* call overlay handler */
|
|
long ovhandlr; /* address of overlay handlr */
|
|
long ovtabad; /* pointer into overlay table */
|
|
short jmprout; /* jump to overlayed routine */
|
|
long routaddr; /* address to jump to */
|
|
};
|
|
|
|
|
|
/* symbol table stuff */
|
|
|
|
#define SYNAMLEN 8
|
|
|
|
struct symtab {
|
|
char name[SYNAMLEN]; /*symbol name*/
|
|
short flags; /*bit flags*/
|
|
long vl1; /*symbol value*/
|
|
short ovlnum; /*overlay number*/
|
|
char *tlnk; /*table link*/
|
|
};
|
|
|
|
#define OSTSIZE 14 /*entry length on object file without tlnk*/
|
|
|
|
/* flags for symbols*/
|
|
# define SYDF 0100000 /*defined*/
|
|
# define SYEQ 0040000 /*equated*/
|
|
# define SYGL 0020000 /*global - entry or external*/
|
|
# define SYER 0010000 /*equated register*/
|
|
# define SYXR 0004000 /*external reference*/
|
|
# define SYDA 0002000 /*DATA based relocatable*/
|
|
# define SYTX 0001000 /*TEXT based relocatable*/
|
|
# define SYBS 0000400 /*BSS based relocatable*/
|
|
|
|
struct irts {
|
|
char *irle; /*ptr to last entry in chain*/
|
|
char *irfe; /*ptr to first entry in chain*/
|
|
};
|
|
#ifdef VAX
|
|
struct {
|
|
short loword;
|
|
short hiword;
|
|
};
|
|
#endif
|
|
#ifdef PDP11
|
|
struct {
|
|
short loword;
|
|
short hiword;
|
|
};
|
|
#endif
|
|
#ifdef MC68000
|
|
struct {
|
|
short hiword;
|
|
short loword;
|
|
};
|
|
#endif
|
|
extern long textstart;
|
|
extern long datastart;
|
|
extern long bssstart;
|
|
extern int Bflag;
|
|
extern int Dflag;
|
|
extern int Zflag;
|