FRIDAY JAN 13,1978 NM+4D.23H.1M.55S. LISP 383 -GLS, HIC- [@] SOME CHANGES IN NOMENCLATURE FOR VARIOUS VERSIONS [1] LAST MOST FINAL DOCUMENTATION OF THE HAIRY DEFUN FEATURE [2] (STATUS JNUMBER) RETURNS A JOB NUMBER [3] NEW EDIT COMMAND: YV FOO YANKS VALUE OF FOO [A] FILEPOS CAN TAKE T AND NIL AS POSITION SPECIFIERS [B] MEANINGS OF T AND NIL WHERE A FILE OBJECT IS REQUIRED [C] NEW IO-LOSSAGE ERROR FOR AN INVALID VALUE OF MSGFILES [D] SLIGHT INCOMPATIBILITY: UREAD AND UFILE NOW RETURN A FULL NAMELIST [E] UAPPEND NO LONGER RENAMES THE FILE ON OPENING IT [F] FOR THE RECORD, COMPLETE DEFINITIONS OF OLDIO IN TERMS OF NEWIO [G] RENAMEF AND DELETEF OF A FILE OBJECT NOW CLOSE THE FILE OBJECT [H] ALL ITS NEWIO I/O IS NOW DONE WITH SIOT SOME FEATURES PRESENTLY IMPLEMENTED ONLY FOR THE SAIL VERSION: [!] SAIL VERSION NOW USES TWO SEPARATE DISK FILES FOR SAVED LISPS ["] INITIALIZATION AUTOMATICALLY SAVES A HIGH SEGMENT [#] FASLOAD CAN LOAD INTO THE HIGH SEGMENT [$] HIGH-SEGMENT PURE FREE STORAGE [%] SUSPEND NOW TAKES ONE OR TWO ARGUMENTS SOME THINGS PROBABLY OF INTEREST ONLY TO LISP SYSTEM HACKERS: [{] NEW INTERNAL ROUTINES %CONS, %HUNK, ETC. SOLVE A PDLNMK PROBLEM [|] INITG IS NOW INITIALIZEG, TO PREVENT CONFLICT WITH DEC-10 INIT UUO [}] NEW MACROS PUSHN AND POPI ARE USED IN THE SOURCE [~] THE FORMAT OF FILE OBJECTS HAS CHANGED SOME - REASSEMBLE CODE IF NECESSARY ---------------------------------------------------------------- [@] THERE ARE MANY, MANY VERSIONS OF MACLISP FLOATING AROUND. EVEN JUST ON THE PDP-10, THERE ARE MANY BECAUSE OF THE POSSIBILITIES OF CONDITIONAL ASSEMBLY. WORK IS PROCEEDING APACE ON VERSIONS FOR THE TENEX AND TOPS-20 OPERATING SYSTEMS, AND ON NEWIO VERSIONS FOR SAIL AND TOPS-10. HERE WE LAY OUT SOME STANDARD NOMENCLATURE FOR THE VARIOUS VERSIONS. THE VARIOUS NAMES FALL INTO SETS WHICH REPRESENT ORTHOGONAL CHOICES. OPERATING SYSTEM: / ITS | / TOPS-10 | DEC-10 | SAIL PDP-10 | \ CMU | / | DEC-20 | TENEX \ \ TOPS-20 (AKA "TWENEX") MULTICS THE PDP-10 VERSION WILL EVENTUALLY RUN ON SIX DIFFERENT OPERATING SYSTEMS. TOPS-10, SAIL, AND CMU ARE SUFFICIENTLY SIMILAR TO WARRANT LUMPING THEM TOGETHER AS "DEC-10"; SIMILARLY TENEX AND TOPS-20 ARE LUMPED TOGETHER AS "DEC-20". MULTICS, OF COURSE, IS NOT A PDP-10 VERSION. PROCESSOR: KA10 KI10 KL10 THE KA10 VERSION WILL RUN ON ALL PROCESSORS; THE KI10 VERSION WILL RUN ONLY ON KI10 AND KL10 PROCESSORS; AND THE KL10 ONLY ON KL10'S. SO FAR WE HAVE BEEN GENERATING ONLY KA10 VERSIONS; WHEN THE NEW NUMBER STUFF IS IMPLEMENTED, THIS CHOICE WILL BECOME MORE IMPORTANT. I/O IMPLEMENTATION: OLDIO (UREAD, UWRITE, ETC. *ONLY*) NEWIO (MULTIPLE I/O CHANNELS; ALSO SUPPORTS UREAD) MINIMALITY: MINIMAL (FANCY FRILLS NOT INCLUDED) USELESS (FANCY "USELESS" FRILLS ARE INCLUDED) THE FRILLS INCLUDE THE GCD FUNCTION, PURIFY AND FRIENDS, AND LOTS OF LITTLE I/O HACKS LIKE ROMAN NUMERALS AND PRINLEVEL/PRINLENGTH. THE MINIMAL VERSION IS USUALLY USED ONLY FOR DEC-10 VERSIONS WHICH MUST RUN ON MACHINES WITH LITTLE PHYSICAL MEMORY; HOWEVER, IT IS AN OPTION INDEPENDENT OF OPERATING SYSTEM. ARITHMETIC: BIGNUMS DOUBLE-PRECISION FLONUMS COMPLEX NUMBERS THESE THREE ARE INDEPENDENT CHOICES WHICH MAY BE PRESENT OR ABSENT. THUS, TO IDENTIFY THE VERSION PRESENTLY RUNNING AT MIT-AI, WE MIGHT SAY "THE ITS KA10 NEWIO USELESS BIGNUM VERSION". [1] THE FOLLOWING ARE THE OFFICIAL SPECS FOR THE "HAIRY DEFUN" FEATURE, WHEREIN THE NAME OF THE FUNCTION IS ACTUALLY A LIST OF GOODIES. IF THE INTERPRETER OR COMPILER DOESN'T ACTUALLY DO WHAT FOLLOWS, IT'S A BUG. (UP TO NOW WE HAVEN'T BEEN ABLE TO DISTINGUISH BUGS AND MISFEATURES BECAUSE WE WEREN'T SURE PRECISELY WHAT THE FEATURE SHOULD DO IN ALL CASES.) THE GENERAL FORM OF A CALL TO DEFUN IS: (DEFUN <SPEC> <FLAG> <ARGS> . <BODY>) <SPEC> AND <FLAG> MAY BE INTERCHANGED. <FLAG> MAY BE OMITTED, OR MAY BE "EXPR", "FEXPR", OR "MACRO". <SPEC> MAY BE A SYMBOL (THE NAME OF THE FUNCTION), OR A LIST OF TWO TO FOUR SYMBOLS (IN WHICH CASE THE FLAG "MACRO" IS ILLEGAL). <ARGS> IS A NON-NIL SYMBOL OR A LIST OF SYMBOLS; THE FORMER INDICATES AN LEXPR (INCOMPATIBLE WITH THE "MACRO" AND "FEXPR" FLAGS). IF THE VALUE OF THE SWITCH DEFUN IS T, THEN THE EXPR-HASH HACK IS ENABLED. IN THIS CASE, DEFUN AVOIDS MAKING THE INTERPRETIVE DEFINITION IF HASHING THE DEFINITION INDICATES THAT IT IS THE SAME AS THE CURRENT, PRESUMABLY COMPILED, DEFINITION. THE VARIOUS CASES ARE: FORM OF <SPEC>: FOO (FOO BAR) (FOO BAR BAZ) (FOO BAR BAZ QUUX) EXPR-HASH PROPERTY IS ON THE ATOM: FOO THE RESULT OF - NONE - FOO (GET 'FOO 'BAR) IF THIS IS A SYMBOL EXPR-HASH PROPERTY INDICATOR IS: EXPR-HASH EXPR-HASH - NONE - QUUX DEFUN PUTS THE FUNCTION DEFINITION ON FOO UNDER THE PROPERTY: EXPR/FEXPR/MACRO BAR BAR BAR COMPILER PUTS THE FUNCTION DEFINITION ON FOO UNDER THE PROPERTY: SUBR/FSUBR/LSUBR BAR * BAZ BAZ * THE PROPERTY WILL BE A SYMBOL |FOO BAR| WHICH IN TURN WILL HAVE THE APPROPRIATE SUBR/FSUBR/LSUBR PROPERTY. [2] (STATUS JNUMBER) RETURNS THE NUMBER OF THE LISP JOB (AS DEFINED BY THE HOST OPERATING SYSTEM). [3] THE EDITOR COMMAND YV FOO IS THE SAME AS YP FOO VALUE . IT IS USEFUL FOR EDITING THE VALUE OF A SYMBOL. [A] T AND NIL AS THE SECOND ARGUMENT TO FILEPOS HAVE SPECIAL MEANINGS. T MEANS THE END OF THE FILE, AND NIL MEANS THE ACTUAL BEGINNING OF THE FILE. THE DIFFERENCE BETWEEN NIL AND 0 IS THAT 0 MEANS THE LOGICAL BEGINNING OF THE FILE, WHILE NIL MEANS THE PHYSICAL BEGINNING. THIS MAKES NO DIFFERENCE IN ANY CURRENT IMPLEMENTATION, BUT WILL MAKE A DIFFERENCE WHEN SAIL NEWIO EXISTS. FILEPOS WILL KNOW ABOUT THE SAIL RECORD OFFSET FEATURE, AND NIL WILL MEAN THE APPROPRIATE NEGATIVE RECORD NUMBER. [B] THERE ARE THREE KINDS OF CONTEXTS IN WHICH A FILE OBJECT CAN BE USED: (1) AN INPUT FILE IS NEEDED, E.G. FOR READ AND TYI. (2) AN OUTPUT FILE IS NEEDED, E.G. FOR PRINT AND TYO. (3) EITHER DIRECTION IS ACCEPTABLE, E.G. FOR LINEL AND (STATUS TTYCONS). IN THE PAST T HAS MEANT THE TTY (THE TERMINAL). UNFORTUNATELY, THERE IS AN AMBIGUITY IN CONTEXT (3). TO ALLEVIATE THIS, WE ARRANGED FOR THE VARIABLES TYI AND TYO TO CONTAIN THE FILES USED FOR THE TTY (AS ALREADY DOCUMENTED), SO THAT THE USER CAN REFER TO THESE VARIABLES IN CONTEXT (3). MOREOVER, IN CONTEXTS (1) AND (2) T IS TAKEN TO MEAN "THE FILE IN THE VARIABLE TYI OR TYO (RESPECTIVELY)". A PREVIOUSLY UNDOCUMENTED FEATURE OF THIS IS THAT MSGFILES, FOR EXAMPLE, CAN BE '(T) (WHICH IS IN FACT THE DEFAULT VALUE), WHICH CAUSES MESSAGES TO GO TO WHATEVER FILE IS IN TYO. IN THIS WAY ONE NEED NOT CHANGE MSGFILES JUST BECAUSE THE VALUE OF TYO IS CHANGED. WE NOW ALSO MAKE THE FURTHER EXTENSION THAT IN CONTEXT (2), WHERE ^W WOULD BE HEEDED IF A FILE ARGUMENT WERE OMITTED, THAT SPECIFYING THE FILE EXPLICITLY (BY REFERRING TO THE VALUE OF TYO) WILL NOT HEED ^W, BUT SPECIFYING T WILL ALLOW ^W TO FORCE THE FILE IN TYO TO BE IGNORED. THIS, FOR EXAMPLE, ALLOWS ^W TO SUPPRESS MSGFILES ACTIVITY TO THE TTY AND WELL AS ORDINARY ACTIVITY. NIL AS A FILE MEANS DIFFERENT THINGS IN DIFFERENT CONTEXTS. IN CONTEXTS (1) AND (2) IT MEANS THE SAME AS SPECIFYING NO FILE ARGUMENT AT ALL, AND SO USES THE DEFAULT (INFILE FOR CONTEXT (1), OUTFILES AND TYO AS CONTROLLED BY ^R AND ^W FOR CONTEXT (2)). FOR CONTEXT (3) IT MEANS "SET A DEFAULT VALUE" IF THAT IS APPROPRIATE (E.G. FOR LINEL), AND IS ILLEGAL IF NOT APPROPRIATE. [C] IF MSGFILES IS EVER FOUND TO HAVE A BAD VALUE, AND IO-LOSSAGE ERROR OCCURS, SIMILAR TO THE FAIL-ACT ERRORS FOR BAD VALUES OF BASE, IBASE, ETC. BEFORE THE ERROR OCCURS, MSGFILES IS SET TO '(T). [D] UREAD AND UFILE NOW HAVE AS THEIR VALUE A FULL NAMELIST, NOT JUST THE SIMPLE FILE NAMES. THUS UREAD MIGHT RETURN ((DSK LOSER) FOO BAR) WHERE FORMERLY IT WOULD HAVE RETURNED (FOO BAR). [E] UAPPEND NO LONGER RENAMES THE OPENED FILE TO ".LISP. APPEND"; THE FILE RETAINS ITS OWN NAME. (THIS IS PRIMARILY BECAUSE IT IS SO DIFFICULT TO RENAME AN OPEN FILE ON TOPS-10 - GRR!). [F] HERE ARE THE OFFICIAL DEFINITIONS OF THE OLDIO FUNCTIONS IN TERMS OF NEWIO FUNCTIONS: (DEFUN UREAD FEXPR (FILENAME) (UCLOSE) ((LAMBDA (FILE) (EOFFN UREAD (FUNCTION (LAMBDA (EOFFILE EOFVAL) (UCLOSE) EOFVAL))) (INPUSH (SETQ UREAD FILE)) (DEFAULTF FILE)) (OPEN (*UGREAT FILENAME) 'IN))) (DEFUN UCLOSE FEXPR (X) (COND (UREAD ((LAMBDA (OUREAD) (AND (EQ OUREAD INFILE) (INPUSH -1)) (SETQ UREAD NIL) (CLOSE OUREAD)) UREAD)) (T NIL))) (DEFUN UWRITE FEXPR (DEVDIR) (OR DEVDIR (SETQ DEVDIR (CAR (DEFAULTF NIL)))) (*UWRITE (CONS DEVDIR (COND ((STATUS FEATURE DEC10) (CONS (STATUS JNAME) '(OUT))) ((STATUS FEATURE DEC20) '(MACLISP OUTPUT)) ((STATUS FEATURE ITS) '(.LISP. OUTPUT)))) 'OUT (LIST DEVDIR))) (DEFUN UAPPEND FEXPR (FILENAME) (SETQ FILENAME (*UGREAT FILENAME)) (*UWRITE FILENAME 'APPEND FILENAME)) (DEFUN *UWRITE (NAME MODE NEWDEFAULT) ;INTERNAL ROUTINE (COND (UWRITE (SETQ OUTFILES (DELQ UWRITE OUTFILES)) (CLOSE UWRITE) (SETQ UWRITE NIL))) ((LAMBDA (FILE) (SETQ OUTFILES (CONS (SETQ UWRITE FILE) OUTFILES)) (CAR (DEFAULTF NEWDEFAULT))) (OPEN NAME MODE))) (DEFUN UFILE FEXPR (SHORTNAME) (COND ((NULL UWRITE) (ERROR 'NO/ UWRITE/ FILE (CONS 'UFILE SHORTNAME) 'IO-LOSSAGE)) (T (PROG2 NIL (DEFAULTF (RENAMEF UWRITE (*UGREAT SHORTNAME))) (SETQ OUTFILES (DELQ UWRITE OUTFILES)) (SETQ UWRITE NIL) (OR OUTFILES (SETQ ^R NIL)))))) (DEFUN *UGREAT (NAME) ;INTERNAL ROUTINE (MERGEF NAME (COND ((STATUS FEATURE DEC10) '(* . LSP)) ((STATUS FEATURE DEC20) '(* MACLISP *)) ((STATUS FEATURE ITS) '(* . >))))) (DEFUN UPROBE FEXPR (FILENAME) (SETQ FILENAME (MERGEF (*UGREAT FILENAME) NIL)) (PROBEF FILENAME)) (DEFUN UKILL FEXPR (FILENAME) (DEFAULTF (DELETEF FILENAME)))) [G] FOR CONSISTENCY WITH TOPS-10 (SIGH), THE NEWIO FUNCTIONS DELETEF AND RENAMEF WHEN APPLIED TO A FILE OBJECT WILL ALSO CLOSE THE FILE OBJECT. [H] IN CASE ANYONE CARES, ALL ITS NEWIO I/O TRANSACTIONS ARE NOW DONE WITH SIOT, NOT WITH BLOCK IOT. THIS MAY AFFECT INTERACTIONS WITH FILES WRITTEN BY PROGRAMS WHICH STILL USE BLOCK IOT (E.G. ^C PADDING AT ENDS OF FILES). THE FOLLOWING FEATURES EXIST ONLY IN THE SAIL VERSION. EVENTUALLY THEY WILL BE IMPLEMENTED IN ALL DEC-10 VERSIONS. SOME OF THESE PROVIDE ABILITIES ANALOGOUS TO, BUT NOT IDENTICAL WITH, FEATURES ALREADY PROVIDED ON ITS FOR HACKING SHARABLE CODE AND DATA. SYSTEMS PROGRAMMERS SHOULD EXAMINE THE FOLLOWING DESCRIPTIONS TO SEE HOW TO HANDLE THESE FEATURES IN A MANNER COMPATIBLE WITH ALL VERSIONS. AT THE END IS AN EXAMPLE OF HOW TO CREATE A SHARED SYSTEM IN A WAY THAT WILL WORK IN ALL EXISTING PDP-10 VERSIONS. [!] THE SAIL (SU-AI) TIME-SHARING SYSTEM ORDINARY SAVES TWO-SEGMENT PROGRAMS AS A SINGLE FILE, UNLIKE TOPS-10, WHICH USES TWO DISTINCT DISK FILES (ONE FOR EACH SEGMENT). MACLISP NOW GOES TO SOME TROUBLE TO USE TWO DISTINCT FILES ON SAIL ALSO. THE HIGH-SEGMENT FILE NORMALLY HAS THE EXTENSION ".SHR". THIS IS USED TO SUPPORT THE OTHER FEATURES BELOW. ["] WHEN A NEW MACLISP HAS BEEN ASSEMBLED, LOADED, AND STARTED BY THE SU-AI MAINTAINER, IT WILL AUTOMATICALLY TRY TO DUMP OUT THE HIGH SEGMENT AS A DISK FILE, AND WILL PRINT A MESSAGE REGARDING SUCCESS OR FAILURE. IT THEN LOADS THE LINE EDITOR WITH AN APPROPRIATE SAVE COMMAND (NOT SSAVE, BECAUSE ONLY THE LOW SEGMENT SHOULD BE SAVED) FOR THE USER TO APPROVE WITH "RETURN" IF DESIRED. (IF THE MAINTAINER WANTS TO USE NON-STANDARD FILE NAMES, HE CAN DEPOSIT THE NAMES IN LOCATIONS SGADEV, SGANAM, SGAEXT, AND SGAPPN.) [#] FASLOAD CAN NOW LOAD CODE INTO THE HIGH SEGMENT. RECALL THAT IN THE ITS VERSION, THE VARIABLE "PURE" CONTROLS THE LOADING OF PURIFIABLE (SHARABLE) CODE. THE MEANING OF THIS VARIABLE HAS BEEN EXTENDED. IF PURE IS A FIXNUM, THEN FASLOAD WILL SET UP FOR THE UUOLINKS HACK. THE EXTENSION IS TWOFOLD: (1) IF THE ABSOLUTE VALUE OF PURE IS LESS THAN 10, IT IS MULTIPLIED BY 1024. (1K). (2) THE ABSOLUTE VALUE OF THE RESULT IS AN ESTIMATE OF THE NUMBER OF *WORDS* DESIRED FOR THE UUOLINKS HACK. THIS SHOULD BE ABOUT 15% MORE THAN THE TOTAL NUMBER OF DIFFERENT COMPILED FUNCTIONS TO BE LOADED. (STEP 1 IS FOR COMPATIBILITY WITH THE OLD MEANING OF PURE, AS THE NUMBER OF 1K BLOCKS TO RESERVE.) IN THE ITS (AND DEC-20) VERSIONS, THE SIGN OF THE FIXNUM IS IRRELEVANT. FOR SAIL (AND EVENTUALLY TOPS-10 AND CMU), THE SIGN CONTROLS WHICH SEGMENT TO LOAD INTO. A POSITIVE VALUE LOADS INTO THE LOW SEGMENT, AS BEFORE. A NEGATIVE VALUE CAUSES THE HIGH SEGMENT TO BE DEPURIFIED (A WRITABLE COPY MADE) IF NECESSARY; THE CODE IS THEN LOADED INTO THE HIGH SEGMENT. ALSO, ONLY ONE OF THE UUOLINKS AREAS IS MADE IN THE LOW SEGMENT; THE OTHER IS PUT IN THE HIGH SEGMENT. (THUS THE HIGH-SEGMENT LOADING FEATURE IS TIED TO THE UUOLINKS FEATURE - SORRY ABOUT THAT.) [$] RECALL THAT *PURE CONTROLS WHETHER CERTAIN KINDS OF S-EXPRESSIONS ARE TO BE AUTOMATICALLY PURCOPY'D. FOR ITS (AND DEC-20) ALL THAT MATTERS IS WHETHER IT IS NIL OR NON-NIL. FOR SAIL (AND EVENTUALLY TOPS-10 AND CMU), IT MUST BE A FIXNUM TO CAUSE PURCOPY TO USE THE HIGH SEGMENT. THIS IN TURN WORKS ONLY IF PURE IS A NEGATIVE FIXNUM. THE VALUE OF *PURE SHOULD BE AN ESTIMATE OF THE TOTAL NUMBER OF WORDS OF PURE FREE STORAGE NEEDED, INCLUDING ALL THAT LOADED BY PREVIOUS FILES AND ALL THAT INCLUDED IN THE INITIAL LISP SYSTEM (PRESENTLY ABOUT 6000. WORDS). THIS CAUSES FASLOAD TO PREALLOCATE ENOUGH ADDITIONAL ROOM IN THE HIGH SEGMENT TO ACCOMODATE THE ESTIMATED TOTAL AMOUNT OF PURE STORAGE. (THE PREALLOCATION IS NECESSARY BECAUSE IT ISN'T POSSIBLE TO ALLOCATE LIST STORAGE IN THE HIGH SEGMENT ONCE THE LOADING OF CODE HAS BEGUN.) MAKING THE ESTIMATE IN *PURE TOO BIG MERELY WASTES SPACE IN THE HIGH SEGMENT; MAKING IT TOO SMALL CAUSES PURCOPY TO MAKE ITS COPIES IN THE LOW SEGMENT. [%] ONCE CODE AND DATA HAS BEEN LOADED INTO THE HIGH SEGMENT, ONE CAN USE SUSPEND TO REPURIFY AND DUMP IT. IF SUSPEND IS GIVEN TWO ARGUMENTS, IT WILL TAKE THE SECOND AS A FILE NAME, DUMP THE HIGH SEGMENT TO THAT FILE, AND EXPUNGE THE HIGH SEGMENT. IT THEN RETURNS TO MONITOR LEVEL. (THE SAIL VERSION ALSO LOADS THE FIRST ARGUMENT INTO THE LINE EDITOR; THIS WILL NORMALLY BE A SAVE (NOT SSAVE) COMMAND.) WHEN THE LOW SEGMENT IS SUBSEQUENTLY CONTINUED OR RUN FROM THE SAVE FILE, IT WILL ATTACH TO A HIGH SEGMENT MADE FROM THE SAVED HIGH-SEGMENT FILE. IN SO DOING IT WILL ARRANGE TO SHARE THAT HIGH SEGMENT WITH OTHER LISPS USING THAT SAME HIGH SEGMENT. CHANGES OF INTEREST TO LISP SYSTEM HACKERS: [{] THERE WAS A BUG WHICH OCCURRED BECAUSE CONS (AND HUNK) DID NOT PDLNMK ITS ARGUMENTS. THIS WAS CONSIDERED OKAY BECAUSE NCOMPLR KNOWS ABOUT THESE SPECIALLY, AND KNOWS THAT THEY MUST NOT BE GIVEN UNSAFE ARGUMENTS. HOWEVER, IT WAS POSSIBLE TO USE FUNCALL (OR SUBRCALL!) TO GIVE THEM UNSAFE ARGUMENTS. THE SOLUTION WAS TO MAKE CONS AND HUNK ALWAYS PDLNMK, AND TO HAVE SPECIAL ROUTINES %CONS, %NCONS, %XCONS, %HUNK3, AND %HUNK4, WHICH ARE CALLED BY JSP T, AND WHICH NCOMPLR KNOWS ABOUT. THESE EXPECT SAFE ARGUMENTS AND DO NOT PDLNMK. [|] INITG IS NOW INITIALIZEG, TO PREVENT CONFLICT WITH DEC-10 INIT UUO. [}] THE MACRO PUSHN PDL,N PUSHES N WORDS OF ZEROS ONTO PDL. THIS WORKS FOR ANY N; THE MACRO KNOWS ABOUT THE ROUTINES NPUSH, 0PUSH, AND 0.0PUSH AND GENERATES THE APPROPRIATE CALLS. THE MACRO IMPLICITLY DESTROYS T. THE MACRO POPI PDL,N POPS N WORDS FROM PDL BY SUBTRACTING AN APPROPRIATE LITERAL. THE MACRO KNOWS ABOUT LOCATION R70. [~] THE FORMAT OF FILE OBJECTS HAS BEEN CHANGED TO ACCOMODATE NEW INFORMATION. SOME EXTRA RESERVED SLOTS HAVE BEEN CREATED FOR FUTURE EXPANSION. IN PARTICULAR, NOTICE J.UIND (USER INDEX) FOR JOB ARRAYS, AND FB.BVC (VALID CHARACTER COUNT) FOR FILE OBJECTS.