xref: /csrg-svn/usr.bin/pascal/src/pc.h (revision 62213)
148117Sbostic /*-
2*62213Sbostic  * Copyright (c) 1980, 1993
3*62213Sbostic  *	The Regents of the University of California.  All rights reserved.
422228Sdist  *
548117Sbostic  * %sccs.include.redist.c%
648117Sbostic  *
7*62213Sbostic  *	@(#)pc.h	8.1 (Berkeley) 06/06/93
822228Sdist  */
9738Speter 
109120Smckusick #include <setjmp.h>
119120Smckusick 
12738Speter     /*
1310659Speter      *	random constants for pc
14738Speter      */
15738Speter 
16738Speter     /*
17738Speter      *	the name of the display.
18738Speter      */
19738Speter #define	DISPLAYNAME	"__disply"
20738Speter 
21738Speter     /*
22738Speter      *	the structure below describes the locals used by the run time system.
23738Speter      *	at function entry, at least this much space is allocated,
24738Speter      *	and the following information is filled in:
25738Speter      *	the address of a routine to close the current frame for unwinding,
26738Speter      *	a pointer to the display entry for the current static level and
27738Speter      *	the previous contents of the display for this static level.
28738Speter      *	the curfile location is used to point to the currently active file,
29738Speter      *	and is filled in as io is initiated.
30738Speter      *	one of these structures is allocated on the (negatively growing) stack.
31738Speter      *	at function entry, fp is set to point to the last field of the struct,
32738Speter      *	thus the offsets of the fields are as indicated below.
33738Speter      */
3430030Smckusick #ifdef vax
35738Speter struct rtlocals {
369120Smckusick     jmp_buf		gotoenv;
37738Speter     struct iorec	*curfile;
38738Speter     struct dispsave	dsave;
39738Speter } rtlocs;
4030030Smckusick #endif vax
4130030Smckusick 
4230030Smckusick #ifdef tahoe
4330030Smckusick struct rtlocals {
4430030Smckusick     jmp_buf		gotoenv;
4530030Smckusick     struct iorec	*curfile;
4630030Smckusick     struct dispsave	dsave;
4730030Smckusick     long		savedregs[9];
4830030Smckusick } rtlocs;
4930030Smckusick #endif tahoe
5030030Smckusick 
5130030Smckusick #ifdef mc68000
5230030Smckusick struct rtlocals {
5330030Smckusick     jmp_buf		gotoenv;
5430030Smckusick     struct iorec	*curfile;
5530030Smckusick     struct dispsave	dsave;
5630030Smckusick } rtlocs;
5730030Smckusick #endif mc68000
5830030Smckusick 
599120Smckusick #define	GOTOENVOFFSET	( -sizeof rtlocs )
609120Smckusick #define	CURFILEOFFSET	( GOTOENVOFFSET + sizeof rtlocs.gotoenv )
61738Speter #define	DSAVEOFFSET	( CURFILEOFFSET + sizeof rtlocs.curfile )
62738Speter 
63738Speter     /*
6410659Speter      *	this is a cookie used to communicate between the
6510659Speter      *	routine entry code and the routine exit code.
6610659Speter      *	mostly it's for labels shared between the two.
67738Speter      */
6810659Speter #ifdef vax
6910659Speter struct entry_exit_cookie {
7010659Speter     struct nl	*nlp;
7110659Speter     char	extname[BUFSIZ];
7210659Speter     int		toplabel;
7310659Speter     int		savlabel;
7410659Speter };
7510659Speter #define	FRAME_SIZE_LABEL	"LF"
7610659Speter #define	SAVE_MASK_LABEL		"L"
7710659Speter #endif vax
78738Speter 
7930030Smckusick #ifdef tahoe
8030030Smckusick struct entry_exit_cookie {
8130030Smckusick     struct nl	*nlp;
8230030Smckusick     char	extname[BUFSIZ];
8330030Smckusick     int		toplabel;
8430030Smckusick     int		savlabel;
8530030Smckusick };
8630030Smckusick #define	FRAME_SIZE_LABEL	"LF"
8730030Smckusick #define	SAVE_MASK_LABEL		"L"
8830030Smckusick #endif tahoe
8930030Smckusick 
9010659Speter #ifdef mc68000
9110659Speter struct entry_exit_cookie {
9210659Speter     struct nl	*nlp;
9310659Speter     char	extname[BUFSIZ];
9410659Speter     int		toplabel;
9510659Speter };
9610659Speter #define	FRAME_SIZE_LABEL	"LF"
9710659Speter #define	PAGE_BREAK_LABEL	"LP"
9810659Speter #define	SAVE_MASK_LABEL		"LS"
9910659Speter #endif mc68000
100738Speter 
101738Speter     /*
102738Speter      *	formats for various names
103738Speter      *	    NAMEFORMAT		arbitrary length strings.
104738Speter      *	    EXTFORMAT		for externals, a preceding underscore.
1054880Speter      *	    LABELFORMAT		for label names, a preceding dollar-sign.
106738Speter      *	    PREFIXFORMAT	used to print made up names with prefixes.
107738Speter      *	    LABELPREFIX		with getlab() makes up label names.
108738Speter      *	    LLABELPREFIX	with getlab() makes up sdb labels.
1093428Speter      *	    FORMALPREFIX	prefix for EXTFORMAT for formal entry points.
110738Speter      *	a typical use might be to print out a name with a preceeding underscore
111738Speter      *	with putprintf( EXTFORMAT , 0 , name );
112738Speter      */
113738Speter #define	NAMEFORMAT	"%s"
114738Speter #define	EXTFORMAT	"_%s"
1154880Speter #define	LABELFORMAT	"$%s"
116738Speter #define	PREFIXFORMAT	"%s%d"
117738Speter #define	LABELPREFIX	"L"
118738Speter #define	LLABELPREFIX	"LL"
1193428Speter #define	FORMALPREFIX	"__"
120738Speter 
121738Speter     /*
122738Speter      *	the name of the statement counter
123738Speter      */
124738Speter #define	STMTCOUNT	"__stcnt"
125738Speter 
126738Speter     /*
127738Speter      *	the name of the pcp counters
128738Speter      */
129738Speter #define	PCPCOUNT	"__pcpcount"
130738Speter 
131738Speter     /*
132738Speter      *	a vector of pointer to enclosing functions for fully qualified names.
133738Speter      */
134738Speter char	*enclosing[ DSPLYSZ ];
135738Speter 
13610659Speter #ifdef vax
137738Speter     /*
13810659Speter      *	the runtime framepointer and argumentpointer registers
13910659Speter      */
14010659Speter #   define	P2FP		13
14110659Speter #   define	P2FPNAME	"fp"
14210659Speter #   define	P2AP		12
14310659Speter #   define	P2APNAME	"ap"
14410659Speter 
14510659Speter     /*
14610659Speter      *	the register save mask for saving no registers
14710659Speter      */
14810659Speter #   define	RSAVEMASK	( 0 )
14910659Speter 
15010659Speter     /*
15110659Speter      *	runtime check mask for divide check and integer overflow
15210659Speter      */
15310659Speter #   define	RUNCHECK	( ( 1 << 15 ) | ( 1 << 14 ) )
15411328Speter 
15510659Speter     /*
156738Speter      *	and of course ...
157738Speter      */
15810659Speter #   define	BITSPERBYTE	8
15910659Speter #endif vax
16010659Speter 
16130030Smckusick #ifdef tahoe
16230030Smckusick     /*
16330030Smckusick      *	the runtime framepointer and argumentpointer registers
16430030Smckusick      */
16530030Smckusick #   define	P2FP		13
16630030Smckusick #   define	P2FPNAME	"fp"
16730030Smckusick #   define	P2AP		13
16830030Smckusick #   define	P2APNAME	"fp"
16930030Smckusick 
17030030Smckusick     /*
17130030Smckusick      *	the register save mask for saving no registers
17230030Smckusick      */
17330030Smckusick #   define	RSAVEMASK	( 0 )
17430030Smckusick 
17530030Smckusick     /*
17630030Smckusick      *	divide check and integer overflow don't exist in the save mask
17730030Smckusick      */
17830030Smckusick #   define	RUNCHECK	( 0 )
17930030Smckusick 
18030030Smckusick     /*
18130030Smckusick      *	and of course ...
18230030Smckusick      */
18330030Smckusick #   define	BITSPERBYTE	8
18430030Smckusick #endif tahoe
18530030Smckusick 
18610659Speter #ifdef mc68000
18710659Speter     /*
18811328Speter      *	these magic numbers lifted from pcc/mac2defs
18914905Speter      *	the offsets are for mapping data and address register numbers
19014905Speter      *	to linear register numbers.  e.g. d2 ==> r2, and a2 ==> r10.
19110659Speter      */
19214905Speter #   define	DATA_REG_OFFSET	0
19314905Speter #   define	ADDR_REG_OFFSET 8
19410659Speter #   define	P2FPNAME	"a6"
19514905Speter #   define	P2FP		(ADDR_REG_OFFSET + 6)
19610659Speter #   define	P2APNAME	"a6"
19714905Speter #   define	P2AP		(ADDR_REG_OFFSET + 6)
19810659Speter 
19910659Speter     /*
20010659Speter      *	and still ...
20110659Speter      */
20210659Speter #   define	BITSPERBYTE	8
20310659Speter #endif mc68000
204