1 /* 2 * Copyright (c) 1980 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 * 6 * @(#)vars.h 5.2 (Berkeley) 11/05/86 7 */ 8 9 #include <stdio.h> 10 11 /* 12 * px - Berkeley Pascal interpreter 13 * 14 * Version 4.0, January 1981 15 * 16 * Original version by Ken Thompson 17 * 18 * Substantial revisions by Bill Joy and Chuck Haley 19 * November-December 1976 20 * 21 * Rewritten for VAX 11/780 by Kirk McKusick 22 * Fall 1978 23 * 24 * Rewritten in ``C'' using libpc by Kirk McKusick 25 * Winter 1981 26 * 27 * Px is described in detail in the "PX 4.0 Implementation Notes" 28 * The source code for px is in several major pieces: 29 * 30 * int.c C main program which reads in interpreter code 31 * interp.c Driver including main interpreter loop and 32 * the interpreter instructions grouped by their 33 * positions in the interpreter table. 34 * utilities.c Interpreter exit, backtrace, and runtime statistics. 35 * 36 * In addition there are several headers defining mappings for panic 37 * names into codes, and a definition of the interpreter transfer 38 * table. These are made by the script make.ed1 in this directory and 39 * the routine opc.c from ${PASCALDIR}. (see the makefile for details) 40 */ 41 #define PXPFILE "pmon.out" 42 #define BITSPERBYTE 8 43 #define BITSPERLONG (BITSPERBYTE * sizeof(long)) 44 #define HZ 100 45 #define NAMSIZ 76 46 #define MAXFILES 32 47 #define PREDEF 2 48 #ifdef ADDR32 49 #ifndef tahoe 50 #define STDLVL ((struct iorec *)(0x7ffffff1)) 51 #define GLVL ((struct iorec *)(0x7ffffff0)) 52 #else tahoe 53 #define STDLVL ((struct iorec *)(0xbffffff1)) 54 #define GLVL ((struct iorec *)(0xbffffff0)) 55 #endif tahoe 56 #endif ADDR32 57 #ifdef ADDR16 58 #define STDLVL ((struct iorec *)(0xfff1)) 59 #define GLVL ((struct iorec *)(0xfff0)) 60 #endif ADDR16 61 #define FILNIL ((struct iorec *)(0)) 62 #define INPUT ((struct iorec *)(&input)) 63 #define OUTPUT ((struct iorec *)(&output)) 64 #define ERR ((struct iorec *)(&_err)) 65 #define PX 0 /* normal run of px */ 66 #define PIX 1 /* load and go */ 67 #define PIPE 2 /* bootstrap via a pipe */ 68 #define PDX 3 /* invoked by the debugger "pdx" */ 69 #define releq 0 70 #define relne 2 71 #define rellt 4 72 #define relgt 6 73 #define relle 8 74 #define relge 10 75 typedef enum {FALSE, TRUE} bool; 76 77 /* 78 * interrupt and allocation routines 79 */ 80 extern long createtime; 81 extern char *PALLOC(); 82 extern char *malloc(); 83 extern long time(); 84 extern intr(); 85 extern memsize(); 86 extern syserr(); 87 extern liberr(); 88 89 /* 90 * stack routines and structures 91 */ 92 struct sze8 { 93 char element[8]; 94 }; 95 extern short pop2(); 96 extern long pop4(); 97 extern double pop8(); 98 extern struct sze8 popsze8(); 99 extern char *pushsp(); 100 101 /* 102 * emulated pc types 103 */ 104 union progcntr { 105 char *cp; 106 unsigned char *ucp; 107 short *sp; 108 unsigned short *usp; 109 long *lp; 110 double *dbp; 111 struct hdr *hdrp; 112 }; 113 114 /* 115 * THE RUNTIME DISPLAY 116 * 117 * The entries in the display point to the active static block marks. 118 * The first entry in the display is for the global variables, 119 * then the procedure or function at level one, etc. 120 * Each display entry points to a stack frame as shown: 121 * 122 * base of stack frame 123 * --------------- 124 * | | 125 * | block mark | 126 * | | 127 * --------------- <-- display entry "stp" points here 128 * | | <-- display entry "locvars" points here 129 * | local | 130 * | variables | 131 * | | 132 * --------------- 133 * | | 134 * | expression | 135 * | temporary | 136 * | storage | 137 * | | 138 * - - - - - - - - 139 * 140 * The information in the block mark is thus at positive offsets from 141 * the display.stp pointer entries while the local variables are at negative 142 * offsets from display.locvars. The block mark actually consists of 143 * two parts. The first part is created at CALL and the second at entry, 144 * i.e. BEGIN. Thus: 145 * 146 * ------------------------- 147 * | | 148 * | Saved lino | 149 * | Saved lc | 150 * | Saved dp | 151 * | | 152 * ------------------------- 153 * | | 154 * | Saved (dp) | 155 * | | 156 * | Pointer to current | 157 * | routine header info | 158 * | | 159 * | Saved value of | 160 * | "curfile" | 161 * | | 162 * | Empty tos value | 163 * | | 164 * ------------------------- 165 */ 166 167 /* 168 * program variables 169 */ 170 extern union display _display; /* runtime display */ 171 extern struct dispsave *_dp; /* ptr to active frame */ 172 extern long _lino; /* current line number */ 173 extern int _argc; /* number of passed args */ 174 extern char **_argv; /* values of passed args */ 175 extern bool _nodump; /* TRUE => no post mortum dump */ 176 extern long _runtst; /* TRUE => runtime tests */ 177 extern long _mode; /* execl by PX, PIPE, or PIX */ 178 extern long _stlim; /* statement limit */ 179 extern long _stcnt; /* statement count */ 180 extern long _seed; /* random number seed */ 181 extern char *_maxptr; /* maximum valid pointer */ 182 extern char *_minptr; /* minimum valid pointer */ 183 extern long *_pcpcount; /* pointer to pxp buffer */ 184 extern long _cntrs; /* number of counters */ 185 extern long _rtns; /* number of routine cntrs */ 186 187 /* 188 * The file i/o routines maintain a notion of a "current file". 189 * A pointer to this file structure is kept in "curfile". 190 * 191 * file structures 192 */ 193 struct iorechd { 194 char *fileptr; /* ptr to file window */ 195 long lcount; /* number of lines printed */ 196 long llimit; /* maximum number of text lines */ 197 FILE *fbuf; /* FILE ptr */ 198 struct iorec *fchain; /* chain to next file */ 199 struct iorec *flev; /* ptr to associated file variable */ 200 char *pfname; /* ptr to name of file */ 201 short funit; /* file status flags */ 202 short fblk; /* index into active file table */ 203 long fsize; /* size of elements in the file */ 204 char fname[NAMSIZ]; /* name of associated UNIX file */ 205 }; 206 207 struct iorec { 208 char *fileptr; /* ptr to file window */ 209 long lcount; /* number of lines printed */ 210 long llimit; /* maximum number of text lines */ 211 FILE *fbuf; /* FILE ptr */ 212 struct iorec *fchain; /* chain to next file */ 213 struct iorec *flev; /* ptr to associated file variable */ 214 char *pfname; /* ptr to name of file */ 215 short funit; /* file status flags */ 216 short fblk; /* index into active file table */ 217 long fsize; /* size of elements in the file */ 218 char fname[NAMSIZ]; /* name of associated UNIX file */ 219 char buf[BUFSIZ]; /* I/O buffer */ 220 char window[1]; /* file window element */ 221 }; 222 223 /* 224 * unit flags 225 */ 226 #define FDEF 0x80 /* 1 => reserved file name */ 227 #define FTEXT 0x40 /* 1 => text file, process EOLN */ 228 #define FWRITE 0x20 /* 1 => open for writing */ 229 #define FREAD 0x10 /* 1 => open for reading */ 230 #define TEMP 0x08 /* 1 => temporary file */ 231 #define SYNC 0x04 /* 1 => window is out of sync */ 232 #define EOLN 0x02 /* 1 => at end of line */ 233 #define EOFF 0x01 /* 1 => at end of file */ 234 235 /* 236 * file routines 237 */ 238 extern struct iorec *GETNAME(); 239 extern char *MKTEMP(); 240 241 /* 242 * file record variables 243 */ 244 extern struct iorechd _fchain; /* head of active file chain */ 245 extern struct iorec *_actfile[]; /* table of active files */ 246 extern long _filefre; /* last used entry in _actfile */ 247 248 /* 249 * standard files 250 */ 251 extern struct iorechd input; 252 extern struct iorechd output; 253 extern struct iorechd _err; 254 255 /* 256 * Px execution profile array 257 */ 258 #ifdef PROFILE 259 #define NUMOPS 256 260 extern long _profcnts[NUMOPS]; 261 #endif PROFILE 262