|
|
1.1 ! root 1: # ! 2: /* ! 3: * px - Berkeley Pascal interpreter ! 4: * ! 5: * Version 2.0, January 1979 ! 6: * ! 7: * Original version by Ken Thompson ! 8: * ! 9: * Substantial revisions by Bill Joy and Chuck Haley ! 10: * November-December 1976 ! 11: * ! 12: * Rewritten for VAX 11/780 by Kirk McKusick ! 13: * Fall 1978 ! 14: * ! 15: * Px is described in detail in the "PX 1.0 Implementation Notes" ! 16: * The source code for px is in several major pieces: ! 17: * ! 18: * int.c C main program which reads in interpreter code ! 19: * 00case.s Driver including main interpreter loop ! 20: * dd*.s Where dd are digits, interpreter instructions ! 21: * grouped by their positions in the interpreter table. ! 22: * p*.c Various C language routines supporting the system. ! 23: * ! 24: * In addition there are several headers defining mappings for error ! 25: * messages names into codes, and a definition of the interpreter transfer ! 26: * table. These are made by the script Emake in this directory and the scripts ! 27: * in the directory '../opcodes'. ! 28: */ ! 29: ! 30: long argc; ! 31: char **argv; ! 32: ! 33: /* ! 34: * Pascal runtime errors transfer to the routine ! 35: * 'error' in the file perror.c to decode them. ! 36: */ ! 37: int perrno; /* number of error which occurred */ ! 38: ! 39: /* ! 40: * Definitions for memory allocation ! 41: * Memory allocation is done by palloc in utilities.c ! 42: */ ! 43: ! 44: /* ! 45: * The file i/o routines maintain a notion of a "current file". ! 46: * The printing name of this file is kept in the variable ! 47: * "file" for use in error messages. ! 48: */ ! 49: char *file; /* ptr to active file name */ ! 50: long fchain; /* head of active file chain */ ! 51: int bufopt; /* controls flushing of std output as follows: ! 52: * 0 => flush on every write ! 53: * 1 => flush before std read or at end of line ! 54: * 2 => normal buffering ! 55: */ ! 56: /* ! 57: * THE RUNTIME DISPLAY ! 58: * ! 59: * The entries in the display point to the active static block marks. ! 60: * The first entry in the display is for the global variables, ! 61: * then the procedure or function at level one, etc. ! 62: * Each display entry points to a stack frame as shown: ! 63: * ! 64: * base of stack frame ! 65: * --------------- ! 66: * | | ! 67: * | block mark | ! 68: * | | ! 69: * --------------- <-- display entry points here ! 70: * | | ! 71: * | local | ! 72: * | variables | ! 73: * | | ! 74: * --------------- ! 75: * | | ! 76: * | expression | ! 77: * | temporary | ! 78: * | storage | ! 79: * | | ! 80: * - - - - - - - - ! 81: * ! 82: * The information in the block mark is thus at positive offsets from ! 83: * the display pointer entries while the local variables are at negative ! 84: * offsets. The block mark actually consists of two parts. The first ! 85: * part is created at CALL and the second at entry, i.e. BEGIN. Thus: ! 86: * ! 87: * ------------------------- ! 88: * | | ! 89: * | Saved lino | ! 90: * | Saved lc | ! 91: * | Saved dp | ! 92: * | | ! 93: * ------------------------- ! 94: * | | ! 95: * | Saved (dp) | ! 96: * | | ! 97: * | Current section name | ! 98: * | and entry line ptr | ! 99: * | | ! 100: * | Saved file name and | ! 101: * | file buffer ptr | ! 102: * | | ! 103: * | Empty tos value | ! 104: * | | ! 105: * ------------------------- ! 106: */ ! 107: ! 108: /* ! 109: * Structure for accessing things in the block mark ! 110: */ ! 111: struct stack { ! 112: long *tos; /* pointer to top of stack frame */ ! 113: char *file; /* pointer to active file name */ ! 114: long buf; /* pointer to active file record */ ! 115: struct { ! 116: char name[8];/* name of active procedure */ ! 117: short offset; /* offset of procedure in source file */ ! 118: } *entry; ! 119: struct stack *disp; /* previous display value for this level */ ! 120: struct stack **dp; /* pointer to active display entry */ ! 121: long lc; /* previous location counter */ ! 122: long lino; /* previous line number */ ! 123: } *display[40]; ! 124: ! 125: long addrsze; /* size of display addresses */ ! 126: ! 127: ! 128: /* ! 129: * Program option variables ! 130: */ ! 131: long stcnt; /* number of statements executed */ ! 132: long stlim; /* max number of statements to execute */ ! 133: long llimit; /* max number of lines per text file */ ! 134: short nodump; /* 1 => no post mortum dump */ ! 135: short mode; /* mode of input to interpreter */ ! 136: #define PX 0 /* normal run of px */ ! 137: #define PIX 1 /* load and go */ ! 138: #define PIPE 2 /* bootstrap via a pipe */ ! 139: ! 140: /* ! 141: * Pxp variables ! 142: */ ! 143: char *pxpbuf; /* pointer to pxp buffer */ ! 144: long pxpsize; /* size of pxp buffer */ ! 145: ! 146: #ifdef profile ! 147: /* ! 148: * Px execution profile data ! 149: */ ! 150: #define numops 256 ! 151: struct cntrec { ! 152: double counts[numops]; /* instruction counts */ ! 153: long runs; /* number of interpreter runs */ ! 154: long startdate; /* date profile started */ ! 155: long usrtime; /* total user time consumed */ ! 156: long systime; /* total system time consumed */ ! 157: double stmts; /* number of pascal statements executed */ ! 158: } profdata; ! 159: long profcnts[numops]; ! 160: #define proffile "/usr/ucb/pascal/px/pcnt.out" ! 161: FILE *datafile; /* input datafiles */ ! 162: #else ! 163: int profcnts; /* dummy just to keep the linker happy */ ! 164: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.