xref: /csrg-svn/usr.bin/pascal/src/pc.h (revision 14905)
1738Speter /* Copyright (c) 1979 Regents of the University of California */
2738Speter 
3*14905Speter /* static	char sccsid[] = "@(#)pc.h 1.9 09/05/83"; */
4738Speter 
59120Smckusick #include <setjmp.h>
69120Smckusick 
7738Speter     /*
810659Speter      *	random constants for pc
9738Speter      */
10738Speter 
11738Speter     /*
12738Speter      *	the name of the display.
13738Speter      */
14738Speter #define	DISPLAYNAME	"__disply"
15738Speter 
16738Speter     /*
17738Speter      *	the structure below describes the locals used by the run time system.
18738Speter      *	at function entry, at least this much space is allocated,
19738Speter      *	and the following information is filled in:
20738Speter      *	the address of a routine to close the current frame for unwinding,
21738Speter      *	a pointer to the display entry for the current static level and
22738Speter      *	the previous contents of the display for this static level.
23738Speter      *	the curfile location is used to point to the currently active file,
24738Speter      *	and is filled in as io is initiated.
25738Speter      *	one of these structures is allocated on the (negatively growing) stack.
26738Speter      *	at function entry, fp is set to point to the last field of the struct,
27738Speter      *	thus the offsets of the fields are as indicated below.
28738Speter      */
29738Speter struct rtlocals {
309120Smckusick     jmp_buf		gotoenv;
31738Speter     struct iorec	*curfile;
32738Speter     struct dispsave	dsave;
33738Speter } rtlocs;
349120Smckusick #define	GOTOENVOFFSET	( -sizeof rtlocs )
359120Smckusick #define	CURFILEOFFSET	( GOTOENVOFFSET + sizeof rtlocs.gotoenv )
36738Speter #define	DSAVEOFFSET	( CURFILEOFFSET + sizeof rtlocs.curfile )
37738Speter 
38738Speter     /*
3910659Speter      *	this is a cookie used to communicate between the
4010659Speter      *	routine entry code and the routine exit code.
4110659Speter      *	mostly it's for labels shared between the two.
42738Speter      */
4310659Speter #ifdef vax
4410659Speter struct entry_exit_cookie {
4510659Speter     struct nl	*nlp;
4610659Speter     char	extname[BUFSIZ];
4710659Speter     int		toplabel;
4810659Speter     int		savlabel;
4910659Speter };
5010659Speter #define	FRAME_SIZE_LABEL	"LF"
5110659Speter #define	SAVE_MASK_LABEL		"L"
5210659Speter #endif vax
53738Speter 
5410659Speter #ifdef mc68000
5510659Speter struct entry_exit_cookie {
5610659Speter     struct nl	*nlp;
5710659Speter     char	extname[BUFSIZ];
5810659Speter     int		toplabel;
5910659Speter };
6010659Speter #define	FRAME_SIZE_LABEL	"LF"
6110659Speter #define	PAGE_BREAK_LABEL	"LP"
6210659Speter #define	SAVE_MASK_LABEL		"LS"
6310659Speter #endif mc68000
64738Speter 
65738Speter     /*
66738Speter      *	formats for various names
67738Speter      *	    NAMEFORMAT		arbitrary length strings.
68738Speter      *	    EXTFORMAT		for externals, a preceding underscore.
694880Speter      *	    LABELFORMAT		for label names, a preceding dollar-sign.
70738Speter      *	    PREFIXFORMAT	used to print made up names with prefixes.
71738Speter      *	    LABELPREFIX		with getlab() makes up label names.
72738Speter      *	    LLABELPREFIX	with getlab() makes up sdb labels.
733428Speter      *	    FORMALPREFIX	prefix for EXTFORMAT for formal entry points.
74738Speter      *	a typical use might be to print out a name with a preceeding underscore
75738Speter      *	with putprintf( EXTFORMAT , 0 , name );
76738Speter      */
77738Speter #define	NAMEFORMAT	"%s"
78738Speter #define	EXTFORMAT	"_%s"
794880Speter #define	LABELFORMAT	"$%s"
80738Speter #define	PREFIXFORMAT	"%s%d"
81738Speter #define	LABELPREFIX	"L"
82738Speter #define	LLABELPREFIX	"LL"
833428Speter #define	FORMALPREFIX	"__"
84738Speter 
85738Speter     /*
86738Speter      *	the name of the statement counter
87738Speter      */
88738Speter #define	STMTCOUNT	"__stcnt"
89738Speter 
90738Speter     /*
91738Speter      *	the name of the pcp counters
92738Speter      */
93738Speter #define	PCPCOUNT	"__pcpcount"
94738Speter 
95738Speter     /*
96738Speter      *	a vector of pointer to enclosing functions for fully qualified names.
97738Speter      */
98738Speter char	*enclosing[ DSPLYSZ ];
99738Speter 
10010659Speter #ifdef vax
101738Speter     /*
10210659Speter      *	the runtime framepointer and argumentpointer registers
10310659Speter      */
10410659Speter #   define	P2FP		13
10510659Speter #   define	P2FPNAME	"fp"
10610659Speter #   define	P2AP		12
10710659Speter #   define	P2APNAME	"ap"
10810659Speter 
10910659Speter     /*
11010659Speter      *	the register save mask for saving no registers
11110659Speter      */
11210659Speter #   define	RSAVEMASK	( 0 )
11310659Speter 
11410659Speter     /*
11510659Speter      *	runtime check mask for divide check and integer overflow
11610659Speter      */
11710659Speter #   define	RUNCHECK	( ( 1 << 15 ) | ( 1 << 14 ) )
11811328Speter 
11910659Speter     /*
120738Speter      *	and of course ...
121738Speter      */
12210659Speter #   define	BITSPERBYTE	8
12310659Speter #endif vax
12410659Speter 
12510659Speter #ifdef mc68000
12610659Speter     /*
12711328Speter      *	these magic numbers lifted from pcc/mac2defs
128*14905Speter      *	the offsets are for mapping data and address register numbers
129*14905Speter      *	to linear register numbers.  e.g. d2 ==> r2, and a2 ==> r10.
13010659Speter      */
131*14905Speter #   define	DATA_REG_OFFSET	0
132*14905Speter #   define	ADDR_REG_OFFSET 8
13310659Speter #   define	P2FPNAME	"a6"
134*14905Speter #   define	P2FP		(ADDR_REG_OFFSET + 6)
13510659Speter #   define	P2APNAME	"a6"
136*14905Speter #   define	P2AP		(ADDR_REG_OFFSET + 6)
13710659Speter 
13810659Speter     /*
13910659Speter      *	and still ...
14010659Speter      */
14110659Speter #   define	BITSPERBYTE	8
14210659Speter #endif mc68000
143