/*
 * px - Berkeley Pascal interpreter
 *
 * Version 1.0, July 1977
 *
 * Written by Bill Joy and Chuck Haley
 * November-December 1976
 *
 * Based on an earlier version by Ken Thompson
 *
 * Px is described in detail in the "PX 1.0 Implementation Notes"
 * The source code for px is in several major pieces:
 *
 *	int.c		C main program which reads in interpreter code
 *	00int.s		Driver including main interpreter loop
 *	dd*.s		Where dd are digits, interpreter instructions
 *			grouped by their positions in the interpreter table.
 *	p*.c		Various C language routines supporting the system.
 *
 * In addition there are several headers defining mappings for error
 * messages names into codes, and a definition of the interpreter transfer
 * table. These are made by the script Emake in this directory and the scripts
 * in the directory '../opcodes'.
 */

int	argc;
char	**argv;

/*
 * Pascal runtime errors cause emulator traps
 * to the routine onemt which transfers to the
 * routine 'error' in the file perror.c to decode them.
 * This method saves at least one word per static error.
 */
int	onemt();

/*
 * Definitions for memory allocation
 * Memory allocation routines are in 'palloc.c'
 */
char	*bottmem, *memptr, *high, *maxstk;

/*
 * The file i/o routines maintain a notion of a "current file".
 * The printing name of this file is kept in the variable
 * "file" for use in error messages.
 */
char	*file;

/*
 * THE RUNTIME DISPLAY
 *
 * The entries in the display point to the active static block marks.
 * The first entry in the display is for the global variables,
 * then the procedure or function at level one, etc.
 * Each display entry points to a stack frame as shown:
 *
 *		base of stack frame
 *		  ---------------
 *		  |		|
 *		  | block mark  |
 *		  |		|
 *		  ---------------  <-- display entry points here
 *		  |             |
 *		  |   local	|
 *		  |  variables  |
 *		  |		|
 *		  ---------------
 *		  |		|
 *		  |  expression |
 *		  |  temporary  |
 *		  |  storage	|
 *		  |		|
 *		  - - - - - - - -
 *
 * The information in the block mark is thus at positive offsets from
 * the display pointer entries while the local variables are at negative
 * offsets. The block mark actually consists of two parts. The first
 * part is created at CALL and the second at entry, i.e. BEGIN. Thus:
 *
 *		-------------------------
 *		|			|
 *		|  Saved lino		|
 *		|  Saved lc		|
 *		|  Saved dp		|
 *		|			|
 *		-------------------------
 *		|			|
 *		|  Saved (dp)		|
 *		|			|
 *		|  Current section name	|
 *		|   and entry line ptr	|
 *		|			|
 *		|  Saved file name and	|
 *		|   file buffer ptr	|
 *		|			|
 *		|  Empty tos value	|
 *		|			|
 *		-------------------------
 */
int	display[20], *dp;

int	lino;
int	nodump;

/*
 * Random number generator constants
 */
long	seed;
double	randa;
double	randc;
double	randm;
double	randim;

/*
 * Structures to access things on the stack
 */
struct {
	char	pchar;
};
struct {
	int	pint;
	int	p2int;
};
struct {
	long	plong;
};
struct {
	double	pdouble;
};

char	discard;
