xref: /csrg-svn/usr.bin/pascal/src/pc.h (revision 22228)
1*22228Sdist /*
2*22228Sdist  * Copyright (c) 1980 Regents of the University of California.
3*22228Sdist  * All rights reserved.  The Berkeley software License Agreement
4*22228Sdist  * specifies the terms and conditions for redistribution.
5*22228Sdist  *
6*22228Sdist  *	@(#)pc.h	5.1 (Berkeley) 06/05/85
7*22228Sdist  */
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      */
33738Speter struct rtlocals {
349120Smckusick     jmp_buf		gotoenv;
35738Speter     struct iorec	*curfile;
36738Speter     struct dispsave	dsave;
37738Speter } rtlocs;
389120Smckusick #define	GOTOENVOFFSET	( -sizeof rtlocs )
399120Smckusick #define	CURFILEOFFSET	( GOTOENVOFFSET + sizeof rtlocs.gotoenv )
40738Speter #define	DSAVEOFFSET	( CURFILEOFFSET + sizeof rtlocs.curfile )
41738Speter 
42738Speter     /*
4310659Speter      *	this is a cookie used to communicate between the
4410659Speter      *	routine entry code and the routine exit code.
4510659Speter      *	mostly it's for labels shared between the two.
46738Speter      */
4710659Speter #ifdef vax
4810659Speter struct entry_exit_cookie {
4910659Speter     struct nl	*nlp;
5010659Speter     char	extname[BUFSIZ];
5110659Speter     int		toplabel;
5210659Speter     int		savlabel;
5310659Speter };
5410659Speter #define	FRAME_SIZE_LABEL	"LF"
5510659Speter #define	SAVE_MASK_LABEL		"L"
5610659Speter #endif vax
57738Speter 
5810659Speter #ifdef mc68000
5910659Speter struct entry_exit_cookie {
6010659Speter     struct nl	*nlp;
6110659Speter     char	extname[BUFSIZ];
6210659Speter     int		toplabel;
6310659Speter };
6410659Speter #define	FRAME_SIZE_LABEL	"LF"
6510659Speter #define	PAGE_BREAK_LABEL	"LP"
6610659Speter #define	SAVE_MASK_LABEL		"LS"
6710659Speter #endif mc68000
68738Speter 
69738Speter     /*
70738Speter      *	formats for various names
71738Speter      *	    NAMEFORMAT		arbitrary length strings.
72738Speter      *	    EXTFORMAT		for externals, a preceding underscore.
734880Speter      *	    LABELFORMAT		for label names, a preceding dollar-sign.
74738Speter      *	    PREFIXFORMAT	used to print made up names with prefixes.
75738Speter      *	    LABELPREFIX		with getlab() makes up label names.
76738Speter      *	    LLABELPREFIX	with getlab() makes up sdb labels.
773428Speter      *	    FORMALPREFIX	prefix for EXTFORMAT for formal entry points.
78738Speter      *	a typical use might be to print out a name with a preceeding underscore
79738Speter      *	with putprintf( EXTFORMAT , 0 , name );
80738Speter      */
81738Speter #define	NAMEFORMAT	"%s"
82738Speter #define	EXTFORMAT	"_%s"
834880Speter #define	LABELFORMAT	"$%s"
84738Speter #define	PREFIXFORMAT	"%s%d"
85738Speter #define	LABELPREFIX	"L"
86738Speter #define	LLABELPREFIX	"LL"
873428Speter #define	FORMALPREFIX	"__"
88738Speter 
89738Speter     /*
90738Speter      *	the name of the statement counter
91738Speter      */
92738Speter #define	STMTCOUNT	"__stcnt"
93738Speter 
94738Speter     /*
95738Speter      *	the name of the pcp counters
96738Speter      */
97738Speter #define	PCPCOUNT	"__pcpcount"
98738Speter 
99738Speter     /*
100738Speter      *	a vector of pointer to enclosing functions for fully qualified names.
101738Speter      */
102738Speter char	*enclosing[ DSPLYSZ ];
103738Speter 
10410659Speter #ifdef vax
105738Speter     /*
10610659Speter      *	the runtime framepointer and argumentpointer registers
10710659Speter      */
10810659Speter #   define	P2FP		13
10910659Speter #   define	P2FPNAME	"fp"
11010659Speter #   define	P2AP		12
11110659Speter #   define	P2APNAME	"ap"
11210659Speter 
11310659Speter     /*
11410659Speter      *	the register save mask for saving no registers
11510659Speter      */
11610659Speter #   define	RSAVEMASK	( 0 )
11710659Speter 
11810659Speter     /*
11910659Speter      *	runtime check mask for divide check and integer overflow
12010659Speter      */
12110659Speter #   define	RUNCHECK	( ( 1 << 15 ) | ( 1 << 14 ) )
12211328Speter 
12310659Speter     /*
124738Speter      *	and of course ...
125738Speter      */
12610659Speter #   define	BITSPERBYTE	8
12710659Speter #endif vax
12810659Speter 
12910659Speter #ifdef mc68000
13010659Speter     /*
13111328Speter      *	these magic numbers lifted from pcc/mac2defs
13214905Speter      *	the offsets are for mapping data and address register numbers
13314905Speter      *	to linear register numbers.  e.g. d2 ==> r2, and a2 ==> r10.
13410659Speter      */
13514905Speter #   define	DATA_REG_OFFSET	0
13614905Speter #   define	ADDR_REG_OFFSET 8
13710659Speter #   define	P2FPNAME	"a6"
13814905Speter #   define	P2FP		(ADDR_REG_OFFSET + 6)
13910659Speter #   define	P2APNAME	"a6"
14014905Speter #   define	P2AP		(ADDR_REG_OFFSET + 6)
14110659Speter 
14210659Speter     /*
14310659Speter      *	and still ...
14410659Speter      */
14510659Speter #   define	BITSPERBYTE	8
14610659Speter #endif mc68000
147