xref: /csrg-svn/usr.bin/pascal/src/pc.h (revision 30030)
122228Sdist /*
222228Sdist  * Copyright (c) 1980 Regents of the University of California.
322228Sdist  * All rights reserved.  The Berkeley software License Agreement
422228Sdist  * specifies the terms and conditions for redistribution.
522228Sdist  *
6*30030Smckusick  *	@(#)pc.h	5.2 (Berkeley) 11/12/86
722228Sdist  */
8738Speter 
99120Smckusick #include <setjmp.h>
109120Smckusick 
11738Speter     /*
1210659Speter      *	random constants for pc
13738Speter      */
14738Speter 
15738Speter     /*
16738Speter      *	the name of the display.
17738Speter      */
18738Speter #define	DISPLAYNAME	"__disply"
19738Speter 
20738Speter     /*
21738Speter      *	the structure below describes the locals used by the run time system.
22738Speter      *	at function entry, at least this much space is allocated,
23738Speter      *	and the following information is filled in:
24738Speter      *	the address of a routine to close the current frame for unwinding,
25738Speter      *	a pointer to the display entry for the current static level and
26738Speter      *	the previous contents of the display for this static level.
27738Speter      *	the curfile location is used to point to the currently active file,
28738Speter      *	and is filled in as io is initiated.
29738Speter      *	one of these structures is allocated on the (negatively growing) stack.
30738Speter      *	at function entry, fp is set to point to the last field of the struct,
31738Speter      *	thus the offsets of the fields are as indicated below.
32738Speter      */
33*30030Smckusick #ifdef vax
34738Speter struct rtlocals {
359120Smckusick     jmp_buf		gotoenv;
36738Speter     struct iorec	*curfile;
37738Speter     struct dispsave	dsave;
38738Speter } rtlocs;
39*30030Smckusick #endif vax
40*30030Smckusick 
41*30030Smckusick #ifdef tahoe
42*30030Smckusick struct rtlocals {
43*30030Smckusick     jmp_buf		gotoenv;
44*30030Smckusick     struct iorec	*curfile;
45*30030Smckusick     struct dispsave	dsave;
46*30030Smckusick     long		savedregs[9];
47*30030Smckusick } rtlocs;
48*30030Smckusick #endif tahoe
49*30030Smckusick 
50*30030Smckusick #ifdef mc68000
51*30030Smckusick struct rtlocals {
52*30030Smckusick     jmp_buf		gotoenv;
53*30030Smckusick     struct iorec	*curfile;
54*30030Smckusick     struct dispsave	dsave;
55*30030Smckusick } rtlocs;
56*30030Smckusick #endif mc68000
57*30030Smckusick 
589120Smckusick #define	GOTOENVOFFSET	( -sizeof rtlocs )
599120Smckusick #define	CURFILEOFFSET	( GOTOENVOFFSET + sizeof rtlocs.gotoenv )
60738Speter #define	DSAVEOFFSET	( CURFILEOFFSET + sizeof rtlocs.curfile )
61738Speter 
62738Speter     /*
6310659Speter      *	this is a cookie used to communicate between the
6410659Speter      *	routine entry code and the routine exit code.
6510659Speter      *	mostly it's for labels shared between the two.
66738Speter      */
6710659Speter #ifdef vax
6810659Speter struct entry_exit_cookie {
6910659Speter     struct nl	*nlp;
7010659Speter     char	extname[BUFSIZ];
7110659Speter     int		toplabel;
7210659Speter     int		savlabel;
7310659Speter };
7410659Speter #define	FRAME_SIZE_LABEL	"LF"
7510659Speter #define	SAVE_MASK_LABEL		"L"
7610659Speter #endif vax
77738Speter 
78*30030Smckusick #ifdef tahoe
79*30030Smckusick struct entry_exit_cookie {
80*30030Smckusick     struct nl	*nlp;
81*30030Smckusick     char	extname[BUFSIZ];
82*30030Smckusick     int		toplabel;
83*30030Smckusick     int		savlabel;
84*30030Smckusick };
85*30030Smckusick #define	FRAME_SIZE_LABEL	"LF"
86*30030Smckusick #define	SAVE_MASK_LABEL		"L"
87*30030Smckusick #endif tahoe
88*30030Smckusick 
8910659Speter #ifdef mc68000
9010659Speter struct entry_exit_cookie {
9110659Speter     struct nl	*nlp;
9210659Speter     char	extname[BUFSIZ];
9310659Speter     int		toplabel;
9410659Speter };
9510659Speter #define	FRAME_SIZE_LABEL	"LF"
9610659Speter #define	PAGE_BREAK_LABEL	"LP"
9710659Speter #define	SAVE_MASK_LABEL		"LS"
9810659Speter #endif mc68000
99738Speter 
100738Speter     /*
101738Speter      *	formats for various names
102738Speter      *	    NAMEFORMAT		arbitrary length strings.
103738Speter      *	    EXTFORMAT		for externals, a preceding underscore.
1044880Speter      *	    LABELFORMAT		for label names, a preceding dollar-sign.
105738Speter      *	    PREFIXFORMAT	used to print made up names with prefixes.
106738Speter      *	    LABELPREFIX		with getlab() makes up label names.
107738Speter      *	    LLABELPREFIX	with getlab() makes up sdb labels.
1083428Speter      *	    FORMALPREFIX	prefix for EXTFORMAT for formal entry points.
109738Speter      *	a typical use might be to print out a name with a preceeding underscore
110738Speter      *	with putprintf( EXTFORMAT , 0 , name );
111738Speter      */
112738Speter #define	NAMEFORMAT	"%s"
113738Speter #define	EXTFORMAT	"_%s"
1144880Speter #define	LABELFORMAT	"$%s"
115738Speter #define	PREFIXFORMAT	"%s%d"
116738Speter #define	LABELPREFIX	"L"
117738Speter #define	LLABELPREFIX	"LL"
1183428Speter #define	FORMALPREFIX	"__"
119738Speter 
120738Speter     /*
121738Speter      *	the name of the statement counter
122738Speter      */
123738Speter #define	STMTCOUNT	"__stcnt"
124738Speter 
125738Speter     /*
126738Speter      *	the name of the pcp counters
127738Speter      */
128738Speter #define	PCPCOUNT	"__pcpcount"
129738Speter 
130738Speter     /*
131738Speter      *	a vector of pointer to enclosing functions for fully qualified names.
132738Speter      */
133738Speter char	*enclosing[ DSPLYSZ ];
134738Speter 
13510659Speter #ifdef vax
136738Speter     /*
13710659Speter      *	the runtime framepointer and argumentpointer registers
13810659Speter      */
13910659Speter #   define	P2FP		13
14010659Speter #   define	P2FPNAME	"fp"
14110659Speter #   define	P2AP		12
14210659Speter #   define	P2APNAME	"ap"
14310659Speter 
14410659Speter     /*
14510659Speter      *	the register save mask for saving no registers
14610659Speter      */
14710659Speter #   define	RSAVEMASK	( 0 )
14810659Speter 
14910659Speter     /*
15010659Speter      *	runtime check mask for divide check and integer overflow
15110659Speter      */
15210659Speter #   define	RUNCHECK	( ( 1 << 15 ) | ( 1 << 14 ) )
15311328Speter 
15410659Speter     /*
155738Speter      *	and of course ...
156738Speter      */
15710659Speter #   define	BITSPERBYTE	8
15810659Speter #endif vax
15910659Speter 
160*30030Smckusick #ifdef tahoe
161*30030Smckusick     /*
162*30030Smckusick      *	the runtime framepointer and argumentpointer registers
163*30030Smckusick      */
164*30030Smckusick #   define	P2FP		13
165*30030Smckusick #   define	P2FPNAME	"fp"
166*30030Smckusick #   define	P2AP		13
167*30030Smckusick #   define	P2APNAME	"fp"
168*30030Smckusick 
169*30030Smckusick     /*
170*30030Smckusick      *	the register save mask for saving no registers
171*30030Smckusick      */
172*30030Smckusick #   define	RSAVEMASK	( 0 )
173*30030Smckusick 
174*30030Smckusick     /*
175*30030Smckusick      *	divide check and integer overflow don't exist in the save mask
176*30030Smckusick      */
177*30030Smckusick #   define	RUNCHECK	( 0 )
178*30030Smckusick 
179*30030Smckusick     /*
180*30030Smckusick      *	and of course ...
181*30030Smckusick      */
182*30030Smckusick #   define	BITSPERBYTE	8
183*30030Smckusick #endif tahoe
184*30030Smckusick 
18510659Speter #ifdef mc68000
18610659Speter     /*
18711328Speter      *	these magic numbers lifted from pcc/mac2defs
18814905Speter      *	the offsets are for mapping data and address register numbers
18914905Speter      *	to linear register numbers.  e.g. d2 ==> r2, and a2 ==> r10.
19010659Speter      */
19114905Speter #   define	DATA_REG_OFFSET	0
19214905Speter #   define	ADDR_REG_OFFSET 8
19310659Speter #   define	P2FPNAME	"a6"
19414905Speter #   define	P2FP		(ADDR_REG_OFFSET + 6)
19510659Speter #   define	P2APNAME	"a6"
19614905Speter #   define	P2AP		(ADDR_REG_OFFSET + 6)
19710659Speter 
19810659Speter     /*
19910659Speter      *	and still ...
20010659Speter      */
20110659Speter #   define	BITSPERBYTE	8
20210659Speter #endif mc68000
203