Trailing-Edge
-
PDP-10 Archives
-
BB-F494Z-DD_1986
-
10,7/maclib.mac
There are 3 other files named maclib.mac in the archive. Click here to see a list.
TITLE NULL - COVER MODULE
COMMENT\
THIS MODULE REPRESENTS WORK DONE IN THE PUBLIC DOMAIN. THEREFORE, THIS
MODULE IS NOT COPYRIGHTED BY DIGITAL EQUIPMENT CORP.
\
PRGEND
TITLE DTADIR - DECTAPE DIRECTORY PRINTER
SUBTTL RIC WERME JAN. 1975
SEARCH TULIP ;TULLIB DEFINITIONS
SEARCH JOBDAT, MACTEN, UUOSYM ;STANDARD DEFINITIONS
SALL ;PRETTY LISTINGS
.DIRECT FLBLST ;PRETTIER LISTINGS
TWOSEG
RELOC 400000
VERSION (1,,1,,%DTADIR)
ENTRY DTADRS,DTADRL
DIRSIZ==200 ;SIZE OF DTA DIRECTORY BLOCK
DIRADR==^D100 ;ADDRESS OF DIRECTORY BLOCK
MAXFIL==^D22 ;MAX # OF FILES THAT WILL FIT ON A TAPE
TAPLEN==^D578 ;# OF BLOCKS ON A DECTAPE
DIRBYT==0 ;RELATIVE ADDR OF DIRECTORY BYTE MAP (5 BIT BYTES)
DIRFIL==^D83 ;RELATIVE ADDR OF FIRST FILENAME
DIREXT==^D105 ;RELATIVE ADDR OF EXTENSION/DATE WORD
DIRLBL==^D127 ;RELATIVE ADDR OF LABEL WORD
;SUBROUTINE TO PRINT A DECTAPE DIRECTORY POINTED AT BY T1 ON
;THE CURRENT OUTPUT CHANNEL. USES T1-T4
;WARNING: ZERDIR AND DIRXIT MAY BE REACHED WITHOUT SAVE1 BEING CALLED!!
DTADRS::HRLI T1,-MAXFIL ;MAKE AN AOBJN POINTER (MUCH MORE USEFUL)
SETZ T2, ;USE T2 TO 'COUNT' FILES WE SEE
FSTLOP: SKIPE T3,DIRFIL(T1) ;THIS IS SO EASY MIGHT AS WELL DO IT IN A SEPARATE LOOP
DISIX [[SIXBIT\%.%#!\];CRAM FILE AND EXTENSION
WSIX 6,DIRFIL(T1);ON EACH LINE
WSIX 3,DIREXT(T1)]
IOR T2,T3 ;OR IT IN...NON 0 WILL SAY WE FOUND SOME
AOBJN T1,FSTLOP ;GET ANOTHER
JUMPE T2,ZERDIR ;SAY IF DIRECTORY EMPTY
JRST DIRXIT ;A COUPLE OF CRLFS AND RETURN
;HERE TO PRINT ALL THE USEFUL DIRECTORY INFORMATION FOR THE LONG FORMAT
DTADRL::PUSHJ P,SAVE1## ;NEED A PERMANENT AC FOR DIRECTORY ADDR
HRLI T1,-MAXFIL ;MAKE T1 BE AOBJN POINTER
MOVE P1,T1 ;KEEP A COPY OF THE AOBJN WORD FOR LATER USE
;COUNT ALL THE FREE FILES (SHOWN BY A ZERO FILE NAME)
SETZ T2, ;CLEAR FILE COUNTER
FILLOP: SKIPN DIRFIL(T1) ;FREE FILES HAVE A ZERO NAME
MOVEI T2,1(T2) ;WHICH THIS ONE DOES
AOBJN T1,FILLOP ;LOOK AT REST
MOVEM T2,FREFIL ;SAVE FOR LATER USE.
;FIGURE OUT HOW MANY BLOCKS EACH FILE HAS ALLOCATED
SETZM FILSIZ ;CLEAR OUT COUNT LIST OF FILE SIZES
MOVE T1,[FILSIZ,,FILSIZ+1]
BLT T1,FILSIZ+MAXFIL-1;USING TRIED, TRUE AND SLOW BLT
MOVEI T1,TAPLEN-1 ;# OF BLOCKS TO SCAN (0 ISN'T IN BYTE MAP)
MOVX T2,<POINT 5,DIRBYT(P1)>;POINT TO BEFORE FIRST BYTE IN MAP
SIZLOP: ILDB T3,T2 ;GET OWNER OF THIS BLOCK
AOS FILSIZ(T3) ;COUNT IT (N.B. - FREE BLOCKS ARE IN FILSIZ)
SOJG T1,SIZLOP ;GO FOR NEXT
;COLLECTED ALL THE DATA WE NEED, PRINT THE HEADER NOW
DISIX [[SIXBIT\D&IRECTORY %#&F&REE: % BLOCKS, % FILES#!\]
PUSHJ P,DATTIM##;PRINT DIRECTORY HEADER. FIRST DATE AND TIME
WDEC FILSIZ ;THEN THE FREE BLOCKS
WDEC FREFIL] ;AND THE FREE FILES
SKIPE T1,DIRLBL(P1) ;DOES THIS TAPE HAVE A LABEL?
DISIX [[SIXBIT\T&APE &ID: %#!\]
WNAME T1]
W2CHI CRLF ;SEPARATE HEADER FROM DATA
MOVE T1,FREFIL ;CHECK TO SEE IF ANY REASON TO PRINT
CAIN T1,MAXFIL ; DIRECTORY. SAY EMPTY IF NO FILES WRITTEN
ZERDIR: DISIX [CPOPJ##,,[SIXBIT\D&IRECTORY EMPTY###!\]]
MOVEI T4,1 ;MAKE INDEX INTO FILSIZ FOR BLOCKS USED
;NO NEED TO SAVE P1 NOW, USE IT AS AOBJN WORD
;NOW PRINT OUT INFO FOR EACH FILE
DIRLOP: SKIPN DIRFIL(P1) ;DOES THIS FILE EXIST?
JRST DIRAOB ;NO, TRY NEXT
LDB T1,[POINT 12,DIREXT(P1),35];GET LOW 12 BITS OF CREATION DATE
MOVEI T2,1 ;CHECK THE BYTE MAP FOR THE TOP 3 BITS
TDNE T2,DIRBYT(P1)
IORI T1,1B23 ;BRING UPTO 1985
TDNE T2,DIRBYT+MAXFIL(P1)
IORI T1,1B22 ;UPTO 2007
TDNE T2,DIRBYT+<2*MAXFIL>(P1)
IORI T1,1B21 ;UPTO 2051 (FOR THE PDP-10 IN THE SMITHSONIAN)
DISIX [[SIXBIT\%.% % %#!\]
WSIX 6,DIRFIL(P1);FILE
WSIX 3,DIREXT(P1);AND EXTENSION
WDEC 3,FILSIZ(T4);THEN LENGTH
PUSHJ P,DATTHN##] ;AND CREATION DATE
DIRAOB: MOVEI T4,1(T4) ;POINT TO NEXT FILE NUMBER
AOBJN P1,DIRLOP ;AND LOOP FOR NEXT FILE
DIRXIT: WSIX [SIXBIT\##!\] ;ADD A LITTLE SPACE
POPJ P, ;OR RETURN WHEN DONE
RELOC 0
FREFIL: BLOCK 1 ;WHERE WE PUT # OF FREE FILES
FILSIZ: BLOCK 40 ;NEED 40 ENTRIES FOR ANY BYTE SIZE
RELOC
PRGEND
TITLE FILSPC - SIMPLE FILENAME PARSER
SEARCH TULIP ;TULLIB DEFINITIONS
SEARCH JOBDAT, MACTEN, UUOSYM ;STANDARD DEFINITIONS
SALL ;PRETTY LISTINGS
.DIRECT FLBLST ;PRETTIER LISTINGS
TWOSEG
RELOC 400000
VERSION(1,A,2,,%FILSPC)
XP(FB,11) ;REGISTER THAT CONTAINS ADDRESS OF FILEBLOCK TO FILL
ENTRY SIXLXC,SIXLXR,FILLXC,FILLXR
SIXLXC::LCH T1 ;BACKUP TO COMPENSATE FOR LEXINT
JRST SIXLXR
FILLXC::LCH FB
FILLXR::SKIPA FB,T1 ;GET FILE BLOCK ADDRESS
SIXLXR::SKIPA T1,[SIXSCN,,FILSPC]
MOVEI T1,FILSPC
PJRST LEXINT##
;PRODUCTIONS TO PARSE THE CLASSIC FILE SPECIFIER (DEV:FILE.EXT[P,PN]
;IN ITS BIGGEST FORM)
;CALL WITH REGISTER FB POINTING TO THE LOSEG FILE BLOCK TO FILL.
TBLBEG(FILSPC)
PROD( <SG> ,FILI, , ) ;INIT FILE PARSER FLAGS
NXTATM: PROD( <SG> ,CALL, ,SIXSCN) ;GET A NAME
PROD( ":" ,DEV ,*,NXTATM) ;COLON MEANS A DEVICE
PROD( "." ,NAME,*,NXTATM) ;AND PERIOD MEANS NAME
PROD( "[" ,NAMX, ,PPNSCN) ;THEN BRACKET MEANS NAME OR EXT
PROD( <SG> ,NAMX, , ) ;ANYTHING ELSE IS SAME
PPNDON: PROD( <SG> ,RET , , ) ;QUIT WHILE AHEAD
PPNSCN: PROD( <SG> ,GPRJ, , ) ;GET PROJECT NUMBER
PROD( <SG> ,PROJ, , ) ;SAVE PROJECT. PROJ WILL FAKE CALL
PROD( "]" , ,*, ) ;OPTIONAL CLOSE BRACKET
PROD( <SG> ,PROG, ,PPNDON) ;MERGE WITH PROJECT
SIXSCN: PROD( <BLANK> , ,*,. ) ;SKIP BLANKS
PROD( <SG> ,SIXI, , ) ;SETUP SIXBIT PACKER
PROD( <LETTER!DIGIT> ,SIXS,*,. ) ;SAVE ANY ALPHANUMERICS
SKPBLA: PROD( <BLANK> , ,*,. ) ;IGNORE BLANKS
PROD( <SG> ,RET , , ) ;AND RETURN
TBLEND
SUBTTL FILE SPECIFIER ROUTINES
A.FILI: TDZA T3,T3 ;ALL WE NEED DO IS NOTE WE HAVEN'T SEEN A FILENAME
A.DEV: MOVEM T1,FILDEV(FB) ;SAVE DEVICE NAME
POPJ P, ;THESE ROUTINES ARE OFTEN THIS SHORT!
A.NAME: ;GOT NAME, PRSDFL WILL BE OFF AND MUST BE SET
A.NAMX: TROE T3,-1 ;SET FILE SEEN FLAG AND CHECK TO SEE IF IT WAS
JRST A.EXT ;YES, MUST BE EXTENSION
JUMPE T1,CPOPJ## ;DON'T OVERWRITE DEFAULT
MOVEM T1,FILNAM(FB) ;SAVE FILE NAME
POPJ P,
A.EXT: MOVEM T1,FILEXT(FB) ;SAVE EXTENSION
POPJ P,
A.GPRJ==OCTLXR##
A.PROJ: HRLZM T1,FILPPN(FB) ;SAVE PROJECT (LEFT HALF)
PJRST OCTLXR## ;AND CALL OCTLXR AGAIN FOR THE SECOND HALF
A.PROG: HRRM T1,FILPPN(FB) ;AND REMEMBER IT
POPJ P, ;BEFORE RETURNING
;ROUTINE TO HANDLE DATA FLOW WHILE PARSING A SIXBIT WORD. RETURNS:
; T1/ SIXBIT DATA
; T2/ BYTE POINTER POINTING TO LAST BYTE
A.SIXS: TRNE P3,LGLSIX ;THIS IS CUTE. WE MAY HAVE ONE OF 3 TYPES OF CHARS:
;NUM, RANGE 60-71 (SIXBIT 20-31)
;UC, RANGE 101-132 (41-72)
;LC, RANGE 141-172 (41-72)
;SO, IF IT IS LEGAL SIXBIT, WE HAVE TO COMPLEMENT
;BIT 40:
XORI P2,40 ;LIKE THAT, WHILE LEAVING LOWER CASE ALONE
TLNE T2,770000 ;MORE CUTENESS. THIS FIELD IS 0 AFTER T1 IS FILLED
IDPB P2,T2 ;STUFF INTO T1
POPJ P, ;AND BACK FOR MORE
A.SIXI: MOVE T2,[POINT 6,T1] ;SETUP POINTER TO WHERE WE'LL ACCUMULATE THE NAME
SETZ T1, ;AND CLEAR THAT OF ANY GARBAGE IT MIGHT HAVE
POPJ P, ;BACK TO SCAN FIRST CHARACTER
PRGEND
TITLE NUMGET - GET A DECIMAL/OCTAL NUMBER FROM INPUT STREAM
SUBTTL RIC WERME, SEPT. 1976
SEARCH TULIP ;TULLIB DEFINITIONS
SEARCH JOBDAT, MACTEN, UUOSYM ;STANDARD DEFINITIONS
SALL ;PRETTY LISTINGS
.DIRECT FLBLST ;PRETTIER LISTINGS
TWOSEG
RELOC 400000
VERSION(1,A,2,,%DECGET)
ENTRY DECLXC,DECLXR,OCTLXC,OCTLXR
;SUBROUTINE TO READ A DECIMAL NUMBER FROM THE INPUT STREAM AND
;RETURN IT IN T1
DECLXC::LCH T1 ;COMPENSATE FOR LEXINT
DECLXR::MOVEI T1,12 ;DECIMAL BASE
JRST CALLEX ;SAVE BASE AND DO THE PARSE
OCTLXC::LCH T1 ;JUST LIKE DECLX?
OCTLXR::MOVEI T1,10 ;USE BASE 8
CALLEX: MOVEM T1,BASE ;SAVE IT
MOVEI T1,NUMSPC ;ADDRESS OF PRODUCTION TABLE
PJRST LEXINT## ;DO IT AND RETURN
TBLBEG(NUMSPC)
PROD( <BLANK> , ,*,. )
PROD( <SG> ,NUMI, , )
PROD( <DIGIT> ,NUMS,*,. )
PROD( <BLANK> , ,*,. )
PROD( <SG> ,RET , , )
TBLEND
A.NUMI: SETZ T1, ;START AT 0 (WHAT ELSE?)
POPJ P,
A.NUMS: IMUL T1,BASE ;MAKE SOME SPACE
ADDI T1,-"0"(P2) ;ADD IN THIS DIGIT
POPJ P,
RELOC 0
BASE: BLOCK 1 ;NUMBER BASE USED STORED HERE
PRGEND
TITLE DATTIM - UTILITY PRINTERS
SEARCH TULIP ;TULLIB DEFINITIONS
SEARCH JOBDAT, MACTEN, UUOSYM ;STANDARD DEFINITIONS
SALL ;PRETTY LISTINGS
.DIRECT FLBLST ;PRETTIER LISTINGS
TWOSEG
RELOC 400000
VERSION(1,,2,,%DATTIM)
ENTRY DATTIM,DATPRT,DATTHN,TIMPRT,TIMTHN
;SUBROUTINE TO PRINT CURRENT DATE AND TIME AS
; 'ON <DATE> AT <TIME>'
;USES T1-T4
DATTIM::DISIX [CPOPJ##,,[SIXBIT\&ON % AT %!\];PRINT DATE, TIME, THEN RETURN
PUSHJ P,DATPRT ;PRINT CURRENT DATE
PUSHJ P,TIMPRT];PRINT CURRENT TIME
;SUBROUTINE TO PRINT EITHER CURRENT DATE (ENTER AT DATPRT) OR DATE
;PASSED IN T1 (ENTER AT DATTHN). USES T1-T4
DATPRT::MOVX T3,%CNDTM ;GET SMITHSONIAN DATE/TIME
GETTAB T3, ;SINCE IT'S VERY EASY TO CALCULATE THE DAY OF WEEK
SETO T3, ;KLUDGE THAT WILL PRINT 'SOMEDAY' FOR US
HLRE T3,T3 ;EXTRACT DATE (OR -1)
DATTHN::IDIVI T3,7 ;CONVERT TO DAY OF WEEK (0-6) OR SOMEDAY (-1)
DATE T1, ;GET TODAY'S DATE
IDIVI T1,^D<12*31> ;T1_YEAR-64
IDIVI T2,^D< 31> ;T2_MONTH-1, T3_DAY-1
DISIX [CPOPJ##,,[SIXBIT\%, % %, %!\]
WSIX @DAYTAB+1(T4) ;DAY OF WEEK
WSIX @MONTAB(T2) ;MONTH
WDECI 1(T3) ;DAY
WDECI ^D1964(T1)] ;AND YEAR
;SUBROUTINE TO PRINT TODAYS TIME. USES T1-T3, EXITS WITH LZEFLG OFF
TIMPRT::MSTIME T1, ;TOP OFF WITH TIME
TIMTHN::IDIVI T1,^D1000 ;DISCARD THOUSANTHS
IDIVI T1,^D<60*60> ;T1_HOURS
IDIVI T2,^D< 60> ;T2_MINUTES; T3_SECONDS
TXO F,LZEFLG ;PRINT TIME WITH LEADING ZEROS
DISIX [[SIXBIT\%:%:%!\]
WDEC 2,T1 ;HOURS
WDEC 2,T2 ;MINUTES
WDEC 2,T3] ;SECONDS
TXZ F,LZEFLG ;TURN OFF AS PROMISED
POPJ P, ;AND RETURN
DEFINE MAKLST (A)<
IRP A<[SIXBIT/A!/]>>
MONTAB: MAKLST <J&ANUARY,F&EBRUARY,M&ARCH,A&PRIL,M&AY,J&UNE,J&ULY,A&UGUST,
S&EPTEMBER,O&CTOBER,N&OVEMBER,D&ECEMBER>
DAYTAB: MAKLST <S&OMEDAY,W&EDNESDAY,T&HURSDAY,F&RIDAY,S&ATURDAY,S&UNDAY,M&ONDAY,T&UESDAY>
PRGEND
TITLE SIXSRC - SIXBIT TABLE SEARCH ROUTINE
SEARCH TULIP ;TULLIB DEFINITIONS
SEARCH JOBDAT, MACTEN, UUOSYM ;STANDARD DEFINITIONS
SALL ;PRETTY LISTINGS
.DIRECT FLBLST ;PRETTIER LISTINGS
TWOSEG
RELOC 400000
ENTRY SIXSRC
COMMENT \ROUTINE TO SCAN A SIXBIT LIST LOOKING FOR EXACT OR PARTIAL MATCH
ENTER WITH
T1/ SIXBIT NAME TYPED
T2/ MASK TO USE
T3/ AOBJN WORD POINTING TO A TABLE OF SIXBIT NAMES
INTERNAL USE:
T1-T3 - AS ABOVE
T4/ TEMPORARY (CURRENT NAME AND ABBREVIATION
P1/ COROUTINE PC
P2/ USED BY COROUTINE CODE...SEE COMMENTS THERE
RETURNS
T1/ NAME TYPED
T2/ MASK
T3/ RH - RELATIVE INDEX FOR COMMAND (NOT ADDRESS!!)
IF THERE ARE ANY SHORT COMMANDS THAT ARE ABBREVIATIONS OF LONGER ONES,
THEY MUST PRECEDE THE LONG ONE OR ELSE SIXSRC WILL BECOME QUITE CONFUSED,
E. G. IF FOOBAR AND FOONLY PRECEDED FOO, AND SIXSRC WAS ASKED TO SCAN
FOR FOO, AN ERROR MESSAGE WILL RESULT COMPLAINING THAT FOOBAR AND FOONLY ARE
AMBIGUOUS YET SIXSRC WILL TAKE THE SUCCESSFUL RETURN SINCE FOO IS AN
EACT MATCH.\
SIXSRC::PUSHJ P,SAVE2## ;4 TEMP ACS NOT ENOUGH HERE
HRLM T3,(P) ;SAVE TABLE ADDR SO WE CAN RETURN CMD INDEX
MOVEI P1,SIXMAT ;SETUP COROUTINE ADDR
SIXS1: MOVE T4,(T3) ;GET REAL COMMAND NAME
CAMN T1,T4 ;EXACT MATCH?
JRST SIXS2 ;YES, WE HAVE WHAT WE WANT!
AND T4,T2 ;TRIM NAME DOWN TO SIZE (OF WHAT WAS TYPED)
CAMN T1,T4 ;NOW DOES IT MATCH?
JSP P1,(P1) ;CALL COROUTINE TO DETERMINE CORRECTNESS
; OF THIS MATCH
AOBJN T3,SIXS1 ;GO TRY ANOTHER
CJSP1: JSP P1,1(P1) ;DONE. LET AMBIGUOUS CHECKER FINISH UP IF NECESSARY
SIXS2: AOS (P) ;THE JSP WILL DO A SKIP RETURN IF ERROR
HLRZ T4,(P) ;GET SWITCH TABLE ADDRESS BACK
SUB T3,T4 ;MAKE T3 BE INDEX. NOTE THAT T3 WILL BE
; GARBAGE IF WE WILL TAKE THE ERROR RETURN.
POPJ P, ;TELL CALLER HOW WE DID
COMMENT \
COROUTINE USED TO HANDLE PARTIAL MATCHES FOUND BY SIXSRC. THIS SCHEME ALLOWS
BOTH THE EASE OF A LOOP TO SEARCH A LIST WHILE AT THE SAME TIME ALLOWING THE
EASE OF A COROUTINE TO BE USED INSTEAD OF INCREMENTING AND CHECKING AN
EVENT COUNTER.
THE COROUTINE IS CALLED BY EITHER:
JSP P1,(P1) ;FOR EACH MATCH DETECTED. THE FIRST
TIME IT IS CALLED, THE FIRST MATCH WILL HAVE BEEN FOUND AND MAY
REPRESENT A VALID MATCH. NOT UNTIL THE THE SECOND CALL MAY IT REPORT
AN ERROR, AND THEN IT MUST REPORT 2 OF THEM SINCE 2 MATCHES WILL
HAVE OCCURED. ALL FUTURE CALLS WILL HAVE TO REPORT ONE ERROR.
JSP P1,1(P1) ;AT THE END OF SIXSRC. THE COROUTINE IS
QUERIED AS TO WHAT IT HAS FOUND AND MUST DO A SKIP RETURN IF A BAD
(AMBIGUOUS OR NONEXISTANT) NAME WAS SEARCHED FOR. THIS CALL ALSO ALLOWS
SIXMAT TO FINISH ANY ERROR REPORTING IF NECESSARY. IF
THIS IS THE FIRST CALL TO SIXMAT, NO MATCHES HAVE BEEN FOUND AND
SIXMAT REPORTS SO. IF THIS IS THE SECOND CALL, THEN PRECISELY
ONE MATCH HAS BEEN FOUND, AND THE NON-SKIP RETURN IS TAKEN TO
SIGNIFY SUCCESS WITH T3 POINTING TO THE COMMAND.
IF THIS THE THIRD OR GREATER CALL, THEN THE AMBIGUOUS
ERROR MESSAGE IS FINISHED WITH A ')'. IN THE CASE OF THE SUCCESSFUL
RETURN, ACCUMULATOR T3 WILL BE SETUP WITH ADDRESS OF MATCHED SWITCH.
THE CJSP1 LABEL BACK IN SIXSRC IS SIMPLY A MEANS TO SAVE AN INSTRUCTION
HERE. IT MAY BE USED SINCE THE COROUTINE WILL BE CALLED NO LONGER.
ALL WE NEED TO DO IS A SKIP RETURN, AND A JSP DOES IT QUITE WELL.
COROUTINES ARE NEAT!\
SIXMAT: JRST SIXMA1 ;FIRST MATCH, NOTHING TO WORRY ABOUT
EDISIX [CJSP1,,[SIXBIT\? % &IS NOT DEFINED.#!\]
WNAME T1] ;IDENTIFY IT
SIXMA1: MOVE P2,T3 ;REMEMBER MATCH IN CASE OF SUCCESSFUL RETURN
; AND FOR AMBIGUOUS ERROR CODE BELOW
JSP P1,(P1) ;FROM SIXERR. JUST GO GET SOME MORE
EDISIX [SIXAMB,,[SIXBIT\? % &IS AMBIGUOUS (%, %!\]
WNAME T1 ;SWITCH HE TYPED
WNAME (P2) ;LAST MATCH
WNAME (T3)] ;THIS MATCH
MOVEI T3,(P2) ;HERE FROM END OF SIXSRC TO WHEN WE FOUND JUST
; THE ONE MATCH WE WERE HOPING FOR.
; RETURN T3/ ADDR OF MATCH
SIXAMB: JSP P1,(P1) ;DO COROUTINE CALL BACK TO CALLER
EDISIX [SIXAMB,,[SIXBIT\, %!\];HERE FOR 3RD OR GTR MATCH
WNAME (T3)] ;CURRENT MATCH
EDISIX [CJSP1,,[SIXBIT\)#!\]]
PRGEND
TITLE SAVT - ROUTINE TO SAVE/RESTORE ALL TEMPORARY ACS
SUBTTL RIC WERME, JUNE 1977
SEARCH TULIP ;TULLIB DEFINITIONS
SEARCH JOBDAT, MACTEN, UUOSYM ;STANDARD DEFINITIONS
SALL ;PRETTY LISTINGS
.DIRECT FLBLST ;PRETTIER LISTINGS
VERSION(1,,1,,%SAVT)
ENTRY SAVT
SAVT:: EXCH T1,(P) ;SAVE T1, GET RETURN
HRLI T1,(P) ;MAKE A JRA POINTER
PUSH P,T2
PUSH P,T3
PUSH P,T4
PUSHJ P,[JRA T1,(T1)] ;CALL CALLER
SOS -4(P) ;COMPENSATE FOR AOS BELOW
POP P,T4
POP P,T3
POP P,T2
POP P,T1
PJRST CPOPJ1## ;GIVE SKIP OR NORMAL RETURN
END