TITLE LNKLOG - LOG/ERROR MODULE FOR LINK SUBTTL D.M.NIXON/DMN/JLd/JNG/DZN/PY/PAH/JBS 2-OCT-85 ;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1973,1984,1986. ALL RIGHTS RESERVED. ; ; ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ;INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ;TRANSFERRED. ; ; ;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ;CORPORATION. ; ;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. SEARCH LNKPAR,LNKLOW,OVRPAR,MACTEN,UUOSYM,SCNMAC IFN TOPS20, ;[2257] SALL ENTRY LNKLOG EXTERN .TYOCH,LNKSCN,LNKERR CUSTVR==0 ;CUSTOMER VERSION DECVER==6 ;DEC VERSION DECMVR==0 ;DEC MINOR VERSION DECEVR==2352 ;DEC EDIT VERSION SEGMENT SUBTTL REVISION HISTORY ;START OF VERSION 1A ;64 MAKE LNK999 BE USEFUL ;71 MAKE CONTINUE MESSAGE STANDARD FORM ;103 SAVE BOTH HALVES OF FL ON EDITED LOOKUP ERROR ;START OF VERSION 2 ;135 ADD OVERLAY CAPABILITY ;146 (12860) MAKE S%E ENTER ERRORS FATAL (S%F) ;START OF VERSION 2B ;277 Don't clobber stack contents on editable error ;420 Always output a "[" when expected to. ;434 Don't clear OFFSET and OSCANF when doing an edit. ;START OF VERSION 2C ;464 Make .TEBLK internal for LNKLOG. ;473 Delete all .TMP files before exiting on a fatal error. ;557 Clean up the listing for release. ;START OF VERSION 3A ;560 Release on both TOPS-10 and TOPS-20 as LINK version 3A(560) ;START OF VERSION 4 ;564 Make LINK assemble with MACRO 52. ;605 Use OUTSTR's to TTY whenever possible. ;625 Support .EB (Print blank line in log) ;634 Never delete input file on a fatal error. ;637 Always print the continuation error message in batch jobs. ;650 Use VM on TOPS-10 if available. ;657 Setup IO.EMG before deleting temp files on an error. ;731 SEARCH MACTEN,UUOSYM ;765 Release on both TOPS-10 and TOPS-20 as LINK version 4(765) ;START OF VERSION 4A. ;1144 Support .EN (no message specified with .ETC.). ;1174 Label and clean up all error messages. Remove most of edit 1144. Support ; .ETC. codes RTN, NLN, XCT, BKL, DAT and NOP. Support S%C. Clean up the ; listing. ;1202 Make S%E severity on code I messages work after edit 1174. ;1212 Make indexed LRE messages 7 and 10 consistent with others, fix missing ; space in LRE messages. ;1217 Clean up the listings for release. ;1220 Release on both TOPS-10 and TOPS-20 as version 4A(1220). ;START OF VERSION 4B. ;1301 Use bits for verbosity, Don't always print prefix or tabs. ;1311 Fix problem with edit 1301. ;1331 Fix BKL to check more carefully for log file. ;START OF VERSION 5 ;1400 Use OVRPAR.MAC. ;Start of Version 5.1 ;1535 Invoke LNKMAP after fatal error if /MAP:ERR seen. ;2005 Get severity and level from stack if S%D used in MS. ;2026 Update copyright and cleanup listings for release. ;Start of Version 6 ;2216 Type long symbols correctly. ;2257 Add generic JSYS error subroutine. ;2300 Don't get ERSTR definition from MONSYM. ;2301 Type TOPS-20 native errors and filespecs. ;2304 Change label name in JSERR. ;2323 Type case-sensitive symbols. ;2325 Add to and fix up TOPS-20 editible message table. ;2330 Put TOPS-20 editable messages in a TOPS-20 conditional. ;2351 Fix E$$UMF routine to print JSYS names. ;2352 Update copyright statement. SUBTTL DISPATCH TABLES FOR MESSAGE CLASSES ;DISPATCH TABLE FOR MAIN MESSAGE TYPE. THE MESSAGE TYPE IS SPECIFIED IN THE ;FIRST ARGUMENT TO THE .ERR. MACRO. DEFINE XXX(TYPE)< EXP ER.'TYPE > XALL TYPTAB: ERRTYPE ;DISPATCH TABLE FOR CONTINUATION MESSAGE TYPE. THE CONTINUATION TYPE IS ;SPECIFIED IN THE FIRST ARGUMENT TO THE .ETC. MACRO. DEFINE XXX(TYPE)< ..CTRL==1 ;;[1217] ASSUME CONTROL ONLY IFDIF ,,<..CTRL==0>> ;;[1217] COMPILE WITH MACRO 53(1020) IFN ..CTRL,< XWD 1B18,ER'TYPE ;FLOW OF CONTROL ONLY > IFE ..CTRL,< EXP ER'TYPE ;PRINT TEXT > > ER.TAB: ETCTYPE ERLEN==.-ER.TAB SALL IF1, ;[2300] So value does not come from MONSYM SUBTTL ENTRY FROM ERRUUO AND MESSAGE DISPATCH IFN FTSINGLE,< %%UUO:: PORTAL LNKLOG ;ENTRY FROM UUO > LNKLOG: MOVEM P1,SAVEAC+P1 ;SAVE P1 MOVE P1,[T2,,SAVEAC+T2] BLT P1,SAVEAC+T4 ;AND REST OF ACCS MOVE P1,@UUOTRAP ;GET FIRST ERROR ARG JUMPGE P1,@TYPTAB(T1) ;GO TO REQUIRED FUNCTION MOVE P1,@P1 ;GET A VALID ARG JUMPL P1,.-1 ;EVENTUALLY JRST @TYPTAB(T1) ;[1174] ROUTINES RETURN TO ERRFIN BELOW ERRFIN: SKIPGE PRTMSG ;[1174] DID WE PRINT ANYTHING AT ALL? JRST ERRET ;[1174] NO--NO LINE TO FINISH OFF THEN MOVE T1,VERLVL ;[1174] DID USER REQUEST LONG MESSAGE? TXNN T1,M%C ;[1301] OR CONTINUATION PART OF MESSAGE? JRST ERRFN0 ;NO LDB T1,VERPTR ;GET VERBOSITY LEVEL POSSIBLE CAIL T1,V%L ;POSSIBLE TO HAVE MORE JRST LNKERR## ;GO TO LONG ERROR MODULE ER.FIN:: ;RETURN HERE, IN OTHER SEGMENT ERRFN0: LDB T2,SEVPTR ;GET SEVERITY CAMGE T2,SEVLVL ;[1174] SUPPRESS ] IF MESSAGE FORCED TO FATAL CAIL T2,S%W ;WAS IT JRST ERRFN2 ;NO, DID NOT TYPE MESSAGE PUSHJ P,TTYOUT ;[1301] MESSAGE TYPED ON TTY? PUSHJ P,ERRFN1 ;[1301] YES, TYPE "]" ERRFN2: OUTVIA .TCRLF## ;[1301] END WITH CR-LF JRST ERRET ;[1301] ERRFN1: MOVEI T1," " ;[1301] GET THE SPACE SKIPL TABCHR ;[1301] SPACE INSERTED AFTER "[" PUSHJ P,.TCHAR## ;[1301] YES, PUT SPACE BEFORE "]" MOVEI T1,"]" ;[1301] INFO ENDS WITH "]" PJRST .TCHAR## ;[1301] OUTPUT THE BRACKET ; .. ; .. ;HERE WHEN THE MESSAGE HAS BEEN TYPED. SHOULD WE CONTINUE? ERRET: LDB T1,SEVPTR ;GET ERROR SEVERITY CAML T1,SEVLVL ;OK TO CONTINUE? CAXN T1,S%C ;[1174] .. SKIPA ;[1174] YES--RETURN TO CALLER JRST ERXIT ;[1174] NO--GO EXIT HRRZS LOGSUB ;CLEAR FLAG CAIN T1,S%E ;[1174] DO WE NEED TO EDIT THIS ERROR FIRST JRST EDITER ;YES, FATAL IF WE DON'T MOVE P1,SAVEAC+P1 ;RESTORE P1 SKIPG T1,LOGTTY ;NEED TO RESTORE LOG SUB? JRST RPOPJ1 ;NO PUSHJ P,.TYOCH ;YES, SETZM LOGTTY ;[605] BACK TO 0 RPOPJ1: AOS UUOTRAP RPOPJ: JRST .RPOPJ## ;RETUTN TO CPOPJ ;HERE TO "EDIT" THE ERRONEOUS FILE SPECIFICATION. THIS OCCURS WHEN A MESSAGE OF ;SEVERITY S%E IS PRINTED UNDER TIMESHARING. STORE THE STILL PENDING LIST OF SCAN ;BLOCKS IN F.EDIT, AND RETURN TO THE LNKSCN FOR THE CORRECTION LINE. EDITER: MOVEI T2,1 ;GET A WORD TO HOLD FL PUSHJ P,DY.GET## MOVEM FL,(T1) ;SO WE CAN RESTORE LATER HRL T1,F.INZR ;GET THIS FILE SPEC MOVSM T1,F.EDIT ;STORE IT SETZM F.INZR ;CLEAR ALL TRACES SETZM F.NXZR ;SO SCAN THINKS ITS A NEW LINE HRROI T1,EDTMES ;[1301] GET THE PREFIX WITH TAB SKIPL TABCHR ;[1301] /MESSAGE:NOPREF? HRROI T1,EDTMS1 ;[1301] YES, GET PREFIX WITHOUT TAB .XERR. ;[1301] WARN USER WHAT TO EXPECT JRST LNKSCN ;NO PUSHJ P,.TYOCH ;YES, SETZM LOGTTY ;[605] BACK TO 0 JRST LNKSCN ;SCAN NEW LINE EDTMES: .ASCIZ <[ Please retype the incorrect parts of the file specification] > EDTMS1: .ASCIZ <[ Please retype the incorrect parts of the file specification ] > ;[1301] ;HERE WHEN LOG FILE GETS ERROR ;FINISH ORIGINAL MESSAGE THEN OUTPUT LOG ERROR MESSAGE REPEAT 0,< ;NOT YET WORKING ERRLOG: POP P,T1 ;GET RETURN OFF STACK PUSH P,UUOTRAP ;SAVE REAL RETURN ADDRESS PUSH P,T1 ;STACK RETURN MOVEI T1,E$$OEL-1 ;[1174] FAKE RETURN HRRM T1,UUOTRAP ;SO WE CAN TYPE 2ND MESSAGE POPJ P, ;IF NOTHING MORE IMPORTANT OCCURS E$$OEL::PUSH P,[RC] ;CHANNNEL # .ERR. (ST,0,V%L,L%W,S%W,OEL,) POP P,T1 ;GET ORIGINAL RETURN JRSTF @T1 ;RETURN >;END OF REPEAT 0 SUBTTL FATAL ERROR FINAL CLEAN-UP AND EXIT ;HERE IF FATAL NON-CONTINUABLE (E.G., NOT EDITABLE) ERROR OCCURS, AFTER PRINTING ;THE MESSAGE. CLOSE THE LOG FILE AND DELETE ALL OF LINK'S .TMP FILES. IF WE'RE ;UNDER BATCH, FORCE OUT THE LONG MESSAGE IF APPLICABLE. OTHERWISE, MERELY GIVE ;THE USER A HINT THAT THE LONG MESSAGE MAY BE TYPED IF DESIRED. ERXIT: MOVE T1,MAPSW ;[1535] /MAP:ERROR? CAIN T1,$MAPER ;[1535] IF SO DO IT NOW PUSHJ P,LNKMAP## ;[1535] MOVEI T1,FINMES ;TELL USER WE CLOSED FILE SKIPE LOGSUB ;BUT ONLY ON LOG FILE PUSHJ P,.TSTRG## RELEASE RC, ;CLOSE LOG FILE RELEASE DC, ;[634] CLOSE REL FILE (DON'T DELETE) PUSH P,P1 ;SAVE A PERM AC MOVSI P1,-20 ;SETUP TO SCAN ALL CHANNELS ERXIT1: HRRZ T1,P1 ;GET THIS CHANNEL NUMBER DEVCHR T1, ;FIND OUT ABOUT THE ASSOCIATED DEV JUMPE T1,ERXIT2 ;FORGET IT IF NONE MOVE T1,IO.PTR(P1) ;SOMETHING THERE, GET IO BLOCK HRRZM T1,IO.EMG ;[657] USE SAME BLOCK IN DVDEL. HLRZ T1,I.EXT(T1) ;GET THE FILE EXTENSION CAIE T1,'TMP' ;ONLY DELETE .TMP FILES JRST ERXIT2 ;NOT USER'S INPUT REL FILE ETC. HRRZ T1,P1 ;GOT ONE! GET I/O CHANNEL PUSHJ P,DVDEL.## ;DELETE IT JFCL ;IGNORE FAILURE ERXIT2: AOBJN P1,ERXIT1 ;LOOP OVER ALL CHANNELS POP P,P1 ;RESTORE PERM AC MOVEI T1,M%C ;[1301] GET CONTINUATION BIT LDB T2,VERPTR ;AND POSSIBLE MESSAGE VERBOSITY TDNN T1,VERLVL ;[1301] NOT WANT LONG MESSAGES? CAIGE T2,V%L ;OR NOTHING MORE EXIT MOVEM T1,VERLVL ;FAKE /VER:LONG SETZM LOGSUB ;FORGET LOG DEVICE SETZM LOGTTY MOVE T1,HIORGN ;[650] SEE WHO CALLED HRRZ T1,.JBHNM(T1) ;[650] CAIN T1,'999' ;[650] SOME FLAVOR OF XXX999? EXIT ;GIVE UP, GETSEG WILL FAIL ETC. MOVE T1,TTYSUB ;MAKE SURE WE POINT TO TTY PUSHJ P,.TYOCH## CLRBFI ;[637] CLEAR JUNK SKIPE BATCH ;[637] CAN USER TYPE CONTINUE? JRST LNKERR## ;[637] NO, GIVE HIM THE MESSAGE FOR FREE HRROI T1,[ASCIZ \[ Type CONTINUE for more information]\] ;[1311] SKIPL TABCHR ;[1311] WITH TAB OR WITHOUT? HRROI T1,[ASCIZ \[ Type CONTINUE for more information ]\] ;[1311] .XERR. ;[1311] OUTPUT MESSAGE EXIT 1, ;MONRET JRST LNKERR## ;SO CONTINUE WILL GET REST OF TEXT FINMES: .ASCIZ < [End of log file] > SUBTTL MAIN ERROR MESSAGE SUBROUTINES ;ENTRY POINT FOR ASCII STRING ;CALLED BY ; ERRUUO ER%MS ; ARGS ER.MS: SETOM ERCHAN ;[1202] SIGNAL NO CHANNEL INVOLVED LDB T1,SEVPTR ;[2005] GET THE SEVERITY JUMPN T1,ER.MS1 ;[2005] IT HAS ONE POP P,T1 ;[2005] IT'S ON THE STACK (S%D) DPB T1,SEVPTR ;[2005] PUT IT IN AS THE SEVERITY CAIN T1,S%C ;[2005] IS IT FATAL BUT CONTINUE? MOVEI T1,L%F ;[2005] YES, TYPE AS FATAL DPB T1,LVLPTR ;[2005] STORE THE LEVEL ER.MS1: PUSHJ P,CHKLVL ;[2005] OUTPUT %,? OR TIME STAMP ETC JRST ERRNXT ;[1174] NOTHING TO OUTPUT HRRZ T1,P1 ;ADDRESS OF MESSAGE STRING OUTVIA .TSTRG## ;OUTPUT MESSAGE JRST ERRNXT ;[1174] GO PROCESS .ETC. WORDS ;HERE FOR LOOKUP/ENTER/RENAME ERROR ;CALLED BY ; PUSH P,[CHAN#] ; ERRUUO ER%LRE ; ARGS ER.LRE: POP P,ERCHAN ;[1174] RESCUE CHANNEL FROM STACK MOVE T4,ERCHAN ;[1174] GET CHANNEL MOVE T2,IO.PTR(T4) ;GET I/O BLOCK HRRE T2,I.EXT(T2) ;GET ERROR CODE IFN TOPS20,< CAME T2,[-1] ;[2301] MINUS ONE IS SPECIAL JUMPL T2,ERLREN ;[2301] ALL OTHER NEGATIVE IS TOPS-20 STYLE >;[2301] IFN TOPS20 TXNE P1,F%SEV ;[2301] DO WE HAVE SEVERITY? JRST ERLRE2 ;[2301] YES CAILE T2,LRELEN ;IN RANGE? MOVEI T2,LRELEN ;NO, USE DEFAULT VALUE HLRZ T3,LRETAB(T2) ;PICKUP LVL FOR THIS MESSAGE TLNE T4,(%ENT) ;ENTER HAS SPECIAL MESSAGES SKIPLE T2 ;CHANGE IF 0 OR -1 CAIA ;NOT SPECIAL HLRZ T3,ENTAB(T2) ;GET RIGHT MESSAGE DPB T3,SLPTR ;[1144] STORE SEVERITY AND LEVEL LDB T3,SEVPTR ;GET SEVERITY TXNE T4,%ENT ;IF ENTER UUO CAIE T3,S%E ;AND MARKED AS EDITABLE JRST ERLRE2 ;NO TXO P1,F%SEV ;[1144] MARK AS FATAL IFN TOPS20,< JRST ERLRE2 ;[2301] CONTINUE ;[2301] Here if TOPS-20 style error. If input file, check the ;[2301] table of editable TOPS-20 messages. Get the JSYS text ;[2301] for later printout. ERLREN: TXO P1,F%LVL ;[2301] Always type TOPS-20 messages TXNE P1,F%SEV ;[2301] DO WE HAVE SEVERITY? JRST ERLREJ ;[2301] YES TXNE T4,%ENT ;[2301] Output file? JRST ERLREF ;[2301] Yes, it's fatal HRRZS T2 ;[2301] Want RH only HRLZI T3,T20SIZ ;[2301] Minus count of editable errors ERLRE1: CAMN T2,T20TAB(T3) ;[2301] Is this editable? JRST ERLREE ;[2301] Yes, set it as such AOBJN T3,ERLRE1 ;[2301] No, do them all ERLREF: TXO P1,F%SEV ;[2301] Mark it as fatal JRST ERLREJ ;[2301] Continue ERLREE: MOVX T3,S%E ;[2301] Get severity as editable DPB T3,SEVPTR ;[2301] And set it ERLREJ: HRROI T1,ERRJSY ;[2301] Point to buffer HRLI T2,.FHSLF ;[2301] This process HRLZI T3,-ERRLEN ;[2301] Length of buffer ERSTR% ;[2301] Get text for the error ERJMP E$$UIE ;[2304] Catch errors within an error PJRST E$$UIE ;[2304] Error if string too long >;[2301] IFN TOPS20 ;[2301] ERLRE2: PUSHJ P,CHKLVL ;[1202] OUTPUT TIME ETC JRST ERRNXT ;[1174] NOTHING TO DO HRRZ T1,P1 ;ADDRESS OF MESSAGE OUTVIA .TSTRG## ;OUTPUT ON TTY AND/OR LOG OUTVIA .TSPAC## ;[1212] PRINT SPACE BETWEEN FAILURE AND REASON MOVE T4,ERCHAN ;[1202] RESTORE CHAN PLUS FLAGS IFE FTSINGLE,< JUMPE T4,ERGSEG ;GETSEG ERROR IF CHAN# 0 > ;NOW TYPE APPROPRIATE MESSAGE FOR ERROR CODE HRR P1,IO.PTR(T4) ;GET POINTER TO I/O BLOCK HRRE T2,I.EXT(P1) ;GET ERROR CODE IFN TOPS20,< CAME T2,[-1] ;[2301] MINUS ONE IS SPECIAL JUMPL T2,ERFNOS ;[2301] ALL OTHER NEGATIVE IS TOPS-20 STYLE >;[2301] IFN TOPS20 CAILE T2,LRELEN ;DO WE KNOW ABOUT IT? PUSHJ P,ERLDEF ;NO SETUP DEFAULT SKIPGE T1,T2 ;BUT IF NEGATIVE ANDI T1, IORM T1,ERRCOD ;STORE TABLE INDEX HRRZ T1,LRETAB(T2) ;GET MESSAGE TLNE T4,(%ENT) ;SPECIAL IF ENTER SKIPLE T2 ;AND 0 OR -1 CAIA HRRZ T1,ENTAB(T2) ;GET RIGHT MESSAGE OUTVIA .TSTRG## ;OUTPUT IT ERFNOS: HRRZ T1,P1 ;[2301] POINT TO SCAN BLOCK ERFSPC: OUTVIA .TEBLK ;OUTPUT LOOKUP BLOCK IFN TOPS20,< ;[2301] MOVE T2,IO.CHN ;[2301] Get back the channel SKIPN T1,CHAN.JF(T2) ;[2301] Get the JFN JRST ERRNXT ;[2301] No JFN SETZM CHAN.JF(T2) ;[2301] Zero it RLJFN% ;[2301] Return the JFN ERNAM (RLJFN%) ;[2301] Should not fail >;[2301] IFN TOPS20 JRST ERRNXT ;[2301] See if more to do IFE FTSINGLE,< ERGSEG: HRRZ T2,SEGBLK+2 ;GET ERROR CODE CAILE T2,LRELEN ;RANGE CHECK PUSHJ P,ERLDEF ;NO SETUP DEFAULT HRRZ T1,LRETAB(T2) ;GET MESSAGE OUTVIA .TSTRG## HRRZI T1,SEGBLK ;POINT TO GETSEG BLOCK OUTVIA .TSBLK ;OUTPUT SEGMENT BLOCK JRST ERRFIN >;END IFE FTSINGLE ERLDEF: PUSH P,T2 ;SAVE ERROR CODE MOVEI T1,"(" OUTVIA .TCHAR## POP P,T1 OUTVIA .TOCTW MOVEI T2,LRELEN ;USE DEFAULT POPJ P, ;INIT/OPEN ERROR ;CALLED BY ; PUSH P,[CHAN#] ; ERRUUO ER%I ; ARGS ER.I: POP P,ERCHAN ;[1174] RESCUE CHANNEL FROM STACK PUSHJ P,CHKLVL ;OUTPUT % OR ? JRST ERRNXT ;[1174] NOTHING TO DO HRRZ T1,P1 ;GET MESSAGE OUTVIA .TSTRG## MOVE T4,ERCHAN ;[1202] GET CHANNEL HRRZ T4,IO.PTR(T4) ;GET IO POINTER MOVE T1,I.DEV(T4) SETZM I.DEV(T4) ;DELETE IT INCASE TRYING TO RECOVER OUTVIA .TSIXN## ;DEVICE OUTVIA .TCOLN## JRST ERRFIN ;RETURN OR EXIT ;STATUS CHECK ERRORS ;CALLED BY ; PUSH P,[CHAN#] ; ERRUUO ER%ST ; ARGS ER.ST: POP P,ERCHAN ;[1174] RESCUE CHANNEL FROM STACK PUSHJ P,CHKLVL ;OUTPUT % OR ? PJRST ERRNXT ;[1174] NOTHING TO DO HRRZ T1,P1 ;GET MESSAGE OUTVIA .TSTRG## MOVX T1," " ;[1144] SEPARATE MESSAGE FROM REST OUTVIA .TCHAR## ;[1144] .. MOVEI T1,[ASCIZ \Status \] ;[1144] OUTVIA .TSTRG## HRLZ T1,ERCHAN ;[1174] GET CHANNEL FOR GETSTS LSH T1,5 ;PUT IN AC FIELD IOR T1,[GETSTS T1] ;FORM INST XCT T1 ;DO IT HRRZ T1,T1 OUTVIA .TOEP## ;(XXXXXX) MOVEI T1,[ASCIZ \ for file \] ;[1144] OUTVIA .TSTRG## MOVE T4,ERCHAN ;[1202] GET CHANNEL NUMBER HRRZ T1,IO.PTR(T4) ;GET IO POINTER JRST ERFSPC ;REST OF FILE SPEC SUBTTL CONTINUATION OF FIRST LINE DISPATCH ;HERE AFTER PROCESSING AN .ETC. FUNCTION. IF THERE ARE NO MORE LEFT, RETURN VIA ;ERRFIN. OTHERWISE, PROCESS THE NEXT .ETC. FUNCTION ONLY IF THE FIRST LINE OF ;THE MESSAGE SHOULD BE PRINTED OR IF THE .ETC. REPRESENTS FLOW-OF-CONTROL RATHER ;THAN TEXT. ERRNXT: TXNN P1,.EC ;MORE TO DO? JRST ERRFIN ;NO, END LINE LDB T1,VSPTR ;[1144] GET VERBOSITY AND SEVERITY AOS UUOTRAP ;ADVANCE RETURN POINTER MOVE P1,@UUOTRAP ;GET ADDRESS OF OUTPUT INFO DPB T1,VSPTR ;[1144] STORE VERBOSITY AND SEVERITY AGAIN SKIPLE PRTMSG ;[1174] ARE WE SUPPOSED TO PRINT FIRST LINE? JRST ERRNX1 ;[1174] YES--GO STRAIGHT TO IT LDB T1,LVLPTR ;[1174] NO--ONLY PROCESS CONTROL .ETC. WORDS SKIPL ER.TAB(T1) ;[1174] ONE THAT PRINTS TEXT? JRST ERRNXT ;[1174] NO--IGNORE IT AND GET NEXT ERRNX1: HRRZ T1,P1 ;[1174] GET VALUE TXNN P1,.EP ;ONLY A POINTER? JRST .+4 ;NO, ALL SET CAIG T1,P1 ;IS IT ONE OF THE SAVED ONES? SKIPA T1,SAVEAC(T1) ;YES, GET FROM SAVED SET MOVE T1,(T1) ;NO, GET REAL VALUE LDB T2,LVLPTR ;[1174] GET .ETC. TYPE CODE JRST @ER.TAB(T2) ;DO CORRECT FUNCTION ;PRINT ASCII TEXT IN ASCIZ FORMAT. ERSTR: OUTVIA .TSTRG## JRST ERRNXT ;SEE IF MORE ;PRINT A SIXBIT WORD WITHOUT TRAILING SPACES. ERSBX: OUTVIA .TSYMB ;[2216] Output potentially long symbol JRST ERRNXT ;PRINT AN OCTAL FULL WORD WITHOUT LEADING ZEROS. EROCT: OUTVIA .TOCTW## JRST ERRNXT ;PRINT A SIGNED DECIMAL VALUE. ERDEC: OUTVIA .TDECW## JRST ERRNXT ;PRINT A FILE SPECIFICATION. THE ARGUMENT IS LINK'S INTERNAL CHANNEL NUMBER. ERFSP: HRR P1,IO.PTR(P1) ;GET ADDRESS HRRZ T1,P1 ;PTR IN T1 OUTVIA .TEBLK JRST ERRNXT ;PRINT A SINGLE ASCII CHARACTER. ERASC: OUTVIA .TCHAR## JRST ERRNXT ;MEMORY SIZE ARGUMENT. PRINT MEMORY SIZE IN K FOR KA'S, PAGES FOR ALL OTHERS. ERCOR: ADD. T1,.PGSIZ ;[1174] ROUND UP TO MONITOR'S PAGE SIZE ANDCM. T1,.PGSIZ ;[1174] .. OUTVIA .TCORW## ;[1174] .TOUTS HAS THE SMARTS JRST ERRNXT ;[1174] DONE ;JUMP TO A CONTINUATION LIST OF .ETC. MACROS. CONTROL RETURNS FROM LNKLOG TO THE ;INSTRUCTIONS AFTER THE CONTINUATION LIST, NOT THE OLD LIST. WE ALSO SAVE THE ;ADDRESS OF THE CURRENT .ETC. WORD SO RTN BELOW CAN USE IT. ERJMP: HRRZ T2,UUOTRAP ;[1174] GET ADDRESS OF CURRENT .ETC. MOVEM T2,RTNPC ;[1174] SAVE IN CASE RTN NEEDS IT SUBI T1,1 ;[1174] LOOK LIKE WE JUST PROCESSED PREVIOUS WORD HRRM T1,UUOTRAP ;[1174] .. TXO P1,.EC ;[1174] IMPLIED CONTINUATION FOR JMP'S JRST ERRNXT ;[1174] ;RETURN FROM PREVIOUS JUMP. NOTE THAT THE .EC FLAG OF THE JUMP THAT GOT US HERE ;CONTROLS WHETHER THERE ARE ANY MORE .ETC. WORDS, NOT THE .EC FLAG OF THE RTN ;FUNCTION. ERRTN: ADD T1,RTNPC ;[1174] FOR CPOPJ1, ETC. HRRM T1,UUOTRAP ;[1174] LOOK LIKE WE JUST PROCESSED LAST JMP LDB T2,VSPTR ;[1174] SAVE ORIGINAL VERBOSITY, SEVERITY MOVE P1,(T1) ;[1174] FINISH LOOKING LIKE THE JMP DPB T2,VSPTR ;[1174] RESTORE ORIGINAL VERBOSITY AND SEVERITY JRST ERRNXT ;[1174] DONE ;PRINT A NEW LINE. THIS PRINTS A CRLF FOLLOWED BY THE RIGHT INDENTATION FOR THE ;DESTINATION. FOR A REAL LOG FILE, THIS INCLUDES THE TIME STAMP PLUS LEVEL, ;SEVERITY AND MESSAGE PREFIX. FOR A REAL TERMINAL, THIS INCLUDES A TAB FOR NOW, ;BUT SHOULD OPTIONALLY BE 2 SPACES IF LINK EVER LOOKS AT THE JOB'S MESSAGE BITS. ERNLN: MOVEI T1,[ASCIZ / /] ;[1174] INDENT PAST TIME STAMP IN LOG FILE SKIPE LOGSUB ;[1174] REAL LOG FILE? PUSHJ P,.TSTRG## ;[1174] YES--PRINT IT TO JUST LOG FILE SKIPN LOGTTY ;[1174] NOW, OUTPUT GOING TO TERMINAL? SKIPG LOGSUB ;[1174] .. SKIPA ;[1174] YES JRST ERRNXT ;[1174] NO--DONE SKIPL LOGTTY ;[1174] TERMINAL A LOG FILE? JRST ERNLN1 ;[1174] NO--DO IT THE HARD WAY PUSHJ P,ERNLN2 ;[1301] PRINT CRLF AND INDENTATION JRST ERRNXT ;[1174] DONE ERNLN1: MOVE T1,TTYSUB ;[1174] NEW LINE ON TERMINAL--SET TO JUST TERMINAL PUSHJ P,.TYOCH## ;[1174] .. PUSH P,T1 ;[1174] SAVE LOG FILE ROUTINE PUSHJ P,ERNLN2 ;[1301] PRINT CRLF AND INDENTATION POP P,T1 ;[1174] RESTORE LOG FILE ROUTINE PUSHJ P,.TYOCH## ;[1174] .. JRST ERRNXT ;[1174] DONE ERNLN2: MOVEI T1,[ASCIZ / /] ;[1301] ASSUME A TAB SKIPL TABCHR ;[1301] PREFIX SUPPRESSED? MOVEI T1,[ASCIZ / /] ;[1301] YES, USE 2 SPACES PJRST .TSTRG## ;[1301] SEND NEW LINE AND INDENTATION ;RELATIVE POINTER TO TRIPLET(S) IN LS AREA. IFN .NWBLK,< ERLSP: SUB T1,LW.LS ;CONVERT TO OFFSET FROM LS.LB JUMPL T1,[HALT] ;ALREADY PAGED OUT ADD T1,LS.LB ;CONVERT TO PHYSICAL ADDRESS HRR P1,T1 ;USE RH(P1) AS PHYSICAL POINTER MOVE T1,1(P1) ;GET 1ST 6 CHARS OUTVIA .TSIXN## ;TYPE THEM SKIPL T1,(P1) ;WAS THIS A PRIMARY TRIPLET? HALT ;NO, ERROR TXNN T1,PT.EXT ;EXTENDED TRIPLET? JRST ERRNXT ;NO, FINISHED ERLSP1: ADDI P1,3 ;POINT TO NEXT TRIPLET SKIPL T1,(P1) ;SECONDARY? TXNE T1,<-1B17>&<^-S.TTL> ;AND STILL IN NAME TRIPLETS? JRST ERRNXT ;NO, QUIT MOVE T1,1(P1) ;GET 1ST SIX CHARS OUTVIA .TSIXN## ;TYPE THEM SKIPN T1,2(P1) ;ANY MORE? JRST ERRNXT ;NO, QUIT OUTVIA .TSIXN## ;YES, TYPE THEM TOO JRST ERLSP1 ;LOOP FOR ALL SECONDARY TRIPLETS > ;END IFN .NWBLK ;EXECUTE AN INSTRUCTION. THIS IS USEFUL WHEN THE SET-UP PERFORMED BY LNKLOG IS ;DESIRED, BUT A COMPLEX MESSAGE IS NEEDED. ERXCT: XCT (T1) ;[1174] EXECUTE THE INSTRUCTION JRST ERRNXT ;[1174] NON-SKIP--CONTINUE NORMAL FLOW AOS UUOTRAP ;[1174] SKIP--SKIP NEXT .ETC. JRST ERRNXT ;[1174] DONE ;BLANK LINE IN THE LOG FILE. THIS IS USEFUL FOR SEPARATING SECTIONS OF THE LOG ;FILE, AS BETWEEN OVERLAY LINKS. ERBKL: SKIPN LOGSUB ;[1331] LOG FILE? JRST ERRNXT ;[1331] NO SKIPN LOGTTY ;[1331] NOT TO TERMINAL? PUSHJ P,.TCRLF## ;[1174] YES--SEND A CRLF JRST ERRNXT ;[1174] DONE ;PRINT TODAY'S DATE. ERDAT: OUTVIA .TDATN## ;[1174] PRINTS TODAY'S DATE JRST ERRNXT ;[1174] DONE ;NO OPERATION. THIS FUNCTION IS GOOD FOR NOTHING. ERNOP: JRST ERRNXT ;[1174] DONE SUBTTL USEFUL SUBROUTINES ;CHKLVL CHECKS TO SEE IF THE CURRENT MESSAGE SHOULD GO TO LOG FILE, THE ;TERMINAL, OR BOTH. IF THE MESSAGE IS DESTINED TO THE LOG FILE, A TIME STAMP IS ;PRINTED, AND IF THE MESSAGE IS DESTINED FOR THE TERMINAL THEN THE PROPER ERROR ;CHARACTER ("?", "%" OR "[") PLUS THE LNK??? PREFIX IS PRINTED. ; ;CALL: ; LOGSUB/ NON-ZERO IF REAL NON-CONTROLLING TERMINAL LOG FILE ; LOGTTY/ -1 IF LOG FILE IS THE CONTROLLING TERMINAL ;SKIP RETURNS IF FIRST LINE MESSAGE SHOULD REALLY BE PRINTED SOMEWHERE, WITH: ; LOGSUB/ <-1,,NON-ZERO> IF BOTH LOG AND TERMINAL OUTPUT REQUIRED ; LOGTTY/ <0,,NON-ZERO> IF TERMINAL BUT NOT LOG FILE OUTPUT REQUIRED ; PRTMSG/ -1: PRINT NOTHING; 0: ONLY PREFIX; 1: PRINT FIRST LINE TEXT ; P1/
CHKLVL: SKIPGE T1,ERCHAN ;[1202] I/O ERROR? JRST CHKLV1 ;[1202] NO--SKIP EDITABLE TEST HRRZS T1 ;[1202] CLEAR FLAGS IN LH LDB T2,SEVPTR ;[1202] GET SEVERITY CAXN T2,S%E ;[1202] EDITABLE? CAXN T1,DC ;[1202] AND NOT INPUT REL FILE CHANNEL? JRST CHKLV1 ;[1202] YES--LEAVE EDITABLE MOVX T2,S%F ;[1202] NO--NOT EDITABLE FOR NOW, MAKE FATAL DPB T2,SEVPTR ;[1202] STORE SEVERITY BACK CHKLV1: LDB T1,LVLPTR ;[1202] GET LIST LEVEL CAMGE T1,LOGLVL ;ABOVE CUTOFF? JRST CHKLV2 ;NO, TRY TTY ONLY SKIPE LOGTTY ;YES, THEN IS LOG = TTY? JRST [MOVEI T1,1 ;[1174] POSITIVE FOR FIRST LINE MOVEM T1,PRTMSG ;[1174] .. JRST CHKLV4] ;OUTPUT [, % OR ? AND CODE SKIPN LOGSUB ;DO WE REALLY HAVE A LOG DEVICE? JRST CHKLV2 ;NO, JUST TRY TTY ;HERE FOR A REAL NON-CONTROLLING TERMINAL LOG FILE. PRINT THE TIME STAMP IN THE ;LOG FILE ONLY. THEN SEE IF THE TERMINAL SHOULD SEE THE MESSAGE TOO. IF SO, ;PRINT THE PREFIX THERE AND CAUSE THE OUTVIA MACRO TO PRINT ALL TEXT TO BOTH. MOVEI T1,1 ;[1174] MARK THAT WE SHOULD PRINT THE MESSAGE MOVEM T1,PRTMSG ;[1174] .. PUSHJ P,TSTAMP ;PUT TIME STAMP ON LOG FILE LDB T1,LVLPTR ;GET LEVEL AGAIN CAMGE T1,ERRLVL ;ABOVE ERROR CUTOFF? JRST CHKLV5 ;NO, NOT TO TTY MOVE T1,TTYSUB ;POINT TO TTY LINE BUFFER PUSHJ P,.TYOCH ;SWAP WITH LOG PUSH P,T1 ;SAVE IT PUSHJ P,SEVTST ;USE TTY TO OUTPUT [, % OR ? POP P,T1 ;GET OUTPUT ROUTINE BACK PUSHJ P,.TYOCH ;AS IT WAS HRROS LOGSUB ;SIGNAL TO BOTH DEVICES JRST CHKLV5 ;NOW FOR REST OF MESSAGE ;HERE WHEN THERE IS NO REAL LOG FILE, OR THE MESSAGE TO IT IS CUT OFF DUE TO ;/LOGLEVEL:. CHECK FOR TERMINAL OUTPUT. IF THE MESSAGE SHOULD GO THERE, CHECK ;FOR THE SPECIAL CASE OF THE TERMINAL BEING THE LOG FILE (TO PREVENT TIME STAMPS ;ON THE TERMINAL) THEN PRINT THE ERROR CHARACTER AND THE MESSAGE PREFIX. ;OTHERWISE, GIVE NON-SKIP RETURN SINCE NOTHING SHOULD GET PRINTED. NOTE THAT THE ;PREFIX MUST END WITH A TAB SO THAT MESSAGES WITH IMBEDDED TABS LOOK THE SAME ON ;THE TERMINAL AND IN THE LOG FILE. CHKLV2: LDB T1,LVLPTR ;GET ERROR LEVEL CAMGE T1,ERRLVL ;TO GO TO TTY? JRST [SETOM PRTMSG ;[1174] NO--REMEMBER NOTHING TO DO JRST CHKLV6] ;[1174] GO RETURN MOVEI T1,1 ;[1174] YES--THEN REMEMBER SOMETHING TO PRINT MOVEM T1,PRTMSG ;[1174] .. SKIPE LOGTTY ;LOG = TTY? JRST CHKLV4 ;YES, JUST PRINT CODE AND RETURN HRRZ T1,LOWSUB ;[1174] SET FOR TTY OUTPUT ONLY PUSHJ P,.TYOCH ;GET OLD RETURN HRRZM T1,LOGTTY ;STORE OLD RETURN ;HERE WHEN LOG FILE IS THE USER'S TERMINAL. CHKLV4: PUSHJ P,SEVTST ;OUTPUT [, % OR ? ;HERE TO PRINT THE MESSAGE PREFIX TO POTENTIALLY BOTH THE USER'S TERMINAL AND ;THE LOG FILE. CHKLV5: MOVE T1,(P1) ;[1174] GET MESSAGE PREFIX MOVEM T1,ERRCOD ;SAVE IN CASE LONG MESSAGE REQUIRED LATER MOVEI T1,ERRCOD ;[1301] GET THE PREFIX PUSHJ P,LOGOUT ;[1301] PRINTING ON LOG FILE? PUSHJ P,.TSTRG## ;[1301] YES, OUTPUT PREFIX MOVE T1,VERLVL ;[1301] GET THE VERSION LEVEL TXNN T1,M%P ;[1301] PRINT THE PREFIX? JRST CHKLV7 ;[1301] NO MOVEI T1,ERRCOD ;[1301] GET THE PREFIX PUSHJ P,TTYOUT ;[1301] PRINTING ON TTY? PUSHJ P,.TSTRG## ;[1301] YES CHKLV7: MOVE T1,VERLVL ;[1301] GET THE VERBOSITY TXNN T1,M%F ;[1301] IS FIRST LINE WANTED? JRST [SETZM PRTMSG ;[1301] NO--NO FIRST LINE MSG JRST CHKLV6] ;[1301] GO RETURN MOVX T1,.CHTAB ;[1301] GET A TAB PUSHJ P,LOGOUT ;[1301] PRINTING TO LOG FILE? PUSHJ P,.TCHAR## ;[1301] YES, OUTPUT TAB MOVE T1,VERLVL ;[1311] GET THE VERBOSITY BACK TXNN T1,M%P ;[1301] PREFIX WANTED? SKIPA T1,[" "] ;[1301] NO, GET A SPACE MOVX T1,.CHTAB ;[1301] YES, GET A TAB PUSHJ P,TTYOUT ;[1301] PRINTING TO TERMINAL? PUSHJ P,.TCHAR## ;[1301] YES, OUTPUT TAB OR SPACE CHKLV6: ADDI P1,1 ;[1174] POINT TO BEGINNING OF FIRST LINE TEXT SKIPLE PRTMSG ;[1174] SHOULD FIRST LINE BE PRINTED? CPOPJ1: AOS (P) ;[1174] YES--SKIP RETURN CPOPJ: POPJ P, ;[1174] NO--NON-SKIP RETURN ;SEVTST PRINTS THE PROPER ERROR CHARACTER [, % OR ? BASED ON THE MESSAGE'S ;ASSIGNED SEVERITY AND THE USER'S /SEVERITY: SWITCH. IF THE MESSAGE IS FATAL, ;CLEAR TYPE-AHEAD FIRST. FINALLY, PRINT THE FIRST PART OF THE MESSAGE PREFIX. ;SEVTST ASSUMES THAT IT WILL ONLY PRINT TO THE USER'S TERMINAL. SEVTST: LDB T2,SEVPTR ;GET SEVERITY MOVEI T1,"[" ;ASSUME INFO CAIL T2,S%W ;IS IT A WARNING? MOVEI T1,"%" ;YES, OR WORSE CAML T2,SEVLVL ;IS IT FATAL? MOVEI T1,"?" ;YES, SETZM TABCHR ;[1301] CLEAR TAB CHARACTER FLAG CAIN T1,"[" ;IF MORE THAN INFO JRST SEVTS1 ;NO CLEARO ;CLEAR ^O SEVTS1: PUSHJ P,.TCHAR## ;TYPE CHARACTER MOVE T1,VERLVL ;[1301] GET VERBOSITY FLAGS TXNN T1,M%P ;[1301] PREFIX WANTED? POPJ P, ;[1301] NO SETOM TABCHR ;[1301] YES, SET FLAG NEGATIVE MOVEI T1,[ASCIZ \LNK\] PJRST .TSTRG## TTYCHK::SKIPL LOGSUB ;ANY NEED TO DO IT? POPJ P, ;NO PUSH P,T1 ;SAVE ENTRY TO .TOUTS XCT @-1(P) ;PUT IN LOG FILE TTYSET: MOVE T1,TTYSUB ;GET TTY LINE BUFFER SUB PUSHJ P,.TYOCH ;INITIALIZE FOR IT EXCH T1,(P) ;SWAP OUT SUB FOR ENTRY PTR XCT @-1(P) ;GO TO .TOUTS POP P,T1 ;RESTORE OUTSUB AOS (P) ;SKIP OVER XCT'ED INST PJRST .TYOCH ;RESET AND RETURN TTYOUT::SKIPE LOGTTY ;[1301] OUTPUT TO TTY AS LOGFILE? POPJ P, ;[1301] YES, JUST OUTPUT SKIPLE LOGSUB ;[1301] OUTPUT TO TTY? JRST CPOPJ1 ;[1301] NO, DON'T OUTPUT PUSH P,T1 ;[1301] SAVE ENTRY TO .TOUTS JRST TTYSET ;[1301] OUTPUT TO TERMINAL LOGOUT::SKIPN LOGTTY ;[1301] OUTPUT TO TTY AS LOGFILE? SKIPN LOGSUB ;[1301] OR NOT TO LOG FILE? JRST CPOPJ1 ;[1301] YES, DON'T OUTPUT AS LOG PUSH P,T1 ;[1301] SAVE ENTRY TO .TOUTS XCT @-1(P) ;[1301] OUTPUT TO LOG FILE POP P,T1 ;[1301] RESTORE T1 JRST CPOPJ1 ;[1301] RETURN TSTAMP: PUSHJ P,.TTIMN## ;STANDARD TIME OUTPUT PUSHJ P,.TSPAC## ;SPACE PUSHJ P,.TSPAC## ;[1174] ANOTHER SPACE LDB T1,LVLPTR ;GET PRINT LEVEL MOVEI T2," " ;FILLER CHAR IF 1 DIGIT PUSHJ P,.TDEC2## ;OUTPUT IT PUSHJ P,.TSPAC## PUSHJ P,.TSPAC## ;[1174] ANOTHER SPACE LDB T1,SEVPTR ;ERR LEVEL MOVEI T2," " PUSHJ P,.TDEC2## MOVEI T1,[ASCIZ / /];[1174] FINISH WITH 3 SPACES PJRST .TSTRG## ;[1174] .. VERPTR: POINTR P1,F%VER ;[1144] VERBOSITY LEVEL SEVPTR: POINTR P1,F%SEV ;[1144] SEVERITY LEVEL LVLPTR: POINTR P1,F%LVL ;[1144] OUTPUT MESSAGE LEVEL VSPTR: POINTR P1,;[1144] VERBOSITY AND SEVERITY SLPTR: POINTR P1,;[1144] SEVERITY AND MESSAGE LEVEL SUBTTL EXTENSIONS TO SCAN'S .TOUTS SUBROUTINES ;.TEBLK --TYPE LOOKUP/ENTER/RENAME BLOCK (NOT SAME AS .TFBLK##) ;CALL: MOVEI T1,ADDR OF BLOCK ; PUSHJ P,.TEBLK ;USES T1-4 .TEBLK::MOVE T4,T1 ;SAVE ARGUMENT IFN TOPS20,< MOVE T1,I.CHN(T4) ;[2301] GET THE CHANNEL LSH T1,-27 ;[2301] AS AN INDEX SKIPN T2,CHAN.JF(T1) ;[2301] IS THERE A JFN? JRST TEBLK1 ;[2301] NO, PRINT IT FROM THE BLOCK PUSH P,T4 ;[2301] SAVE THE POINTER IN CASE ERROR HRROI T1,FILBLK ;[2301] POINT TO THE FILE BLOCK SETZB T3,T4 ;[2301] WANT DEFAULTS JFNS% ;[2301] GET THE FILESPEC ERJMP TEBLK0 ;[2301] DIDN'T WORK POP P,T4 ;[2301] FIX UP THE STACK MOVEI T1,FILBLK ;[2301] GET THE BLOCK PJRST .TSTRG## ;[2301] OUTPUT THE BLOCK TEBLK0: POP P,T4 ;[2301] RESTORE THE POINTER TEBLK1: >;[2301] IFN TOPS20 MOVE T1,I.DEV(T4) ;DEVICE PUSHJ P,.TSIXN## PUSHJ P,.TCOLN## MOVE T1,I.NAM(T4) ;NAME PUSHJ P,.TSIXN## HLLZ T1,I.EXT(T4) ;EXTENSION MOVE T2,I.SCN(T4) ;GET MOD WORD TXNE T2,FX.NUL ;TEST FOR NULL EXTENSION (NO DOT) JUMPE T1,TEBLK2 ;NO EXT TRO T1,'.' ROT T1,-6 ;PUT IN LEADING PLACE PUSHJ P,.TSIXN## TEBLK2: MOVEI T1,I.PPN(T4) ;POINTER TO PPN OR SFD IFN LN.DRB,< ;ENABLED FOR SFD'S? MOVE T2,(T1) ;GET UFD TLNE T2,-1 ;0,,+ IS A PNTR PJRST .TDIRB## ;NO, JUST [PPN] MOVE T1,(T1) ;GET 0,,SFDARG ADD T1,[1,,2] ;POINT TO SFDDIR > PJRST .TDIRB## ;OUTPUT DIRECTORY ;.TSBLK --TYPE GETSEG BLOCK (NOT SAME AS .TFBLK##) ;CALL: MOVEI T1,ADDR OF BLOCK ; PUSHJ P,.TSBLK ;USES T1-4 .TSBLK: MOVE T4,T1 ;SAVE ARGUMENT MOVE T1,0(T4) ;DEVICE PUSHJ P,.TSIXN## PUSHJ P,.TCOLN## MOVE T1,1(T4) ;NAME PUSHJ P,.TSIXN## HLLZ T1,2(T4) ;EXTENSION TRO T1,'.' ROT T1,-6 ;PUT IN LEADING PLACE PUSHJ P,.TSIXN## MOVEI T1,4(T4) ;PPN PJRST .TDIRB## ;OUTPUT DIRECTORY ;[2216] .TSYMB --Type potentially long symbol .TSYMB::PUSH P,P2 ;[2323] Get an upper/lower flag SETZ P2, ;[2323] In upper case mode TLNE T1,770000 ;[2216] Long symbol? PJRST TSYMB1 ;[2216] No PUSH P,P1 ;[2216] Yes, get a save AC HLRZ P1,T1 ;[2216] Get the count MOVNS P1 ;[2216] Negate it HRLZ P1,P1 ;[2216] Put it in left half HRR P1,T1 ;[2216] -Length,,pointer TSYMBL: MOVE T1,(P1) ;[2216] Get the next word PUSHJ P,.TULCS ;[2323] Type it AOBJN P1,TSYMBL ;[2216] Do the entire symbol POP P,P1 ;[2216] Done, restore AC POP P,P2 ;[2323] Restore the AC used as flag POPJ P, ;[2216] Return TSYMB1: PUSHJ P,.TULCS ;[2323] Type the short symbol POP P,P2 ;[2323] Restore the AC POPJ P, ;[2323] Done ;Here to type an upper/lower case sixbit word .TULCS::MOVE T2,T1 ;[2323] Move argument TULC1: JUMPE T2,CPOPJ ;[2323] Loop until only blanks left MOVEI T1,0 ;[2323] Clear next character LSHC T1,6 ;[2323] Get next character CAIN T1,'/' ;[2323] Upper case shift? JRST TULCU ;[2323] Yes CAIN T1,'\' ;[2323] Lower case shift? JRST TULCL ;[2323] Yes ADDI T1," "-' ' ;[2323] Convert to ASCII JUMPE P2,TULC2 ;[2323] Don't convert if in upper case mode CAIL T1,"A" ;[2323] Is it below A? CAILE T1,"Z" ;[2323] Or above Z? CAIA ;[2323] Not alphabetic, don't convert ADDI T1,"a"-"A" ;[2323] Alphabetic, convert to lower case TULC2: PUSHJ P,.TCHAR## ;[2323] Type it JRST TULC1 ;[2323] .. TULCL: SETO P2, ;[2323] Lower case JRST TULC1 ;[2323] Continue TULCU: SETZ P2, ;[2323] Upper case JRST TULC1 ;[2323] Continue SUBTTL COMMON .ERR. SUBROUTINES .ERFEE::ASCIZ \FEE\ .ASCIZ ;[1212] .ERFLE::ASCIZ \FLE\ .ASCIZ ;[1212] .ERFRE::ASCIZ \FRE\ .ASCIZ ;[1212] .ERGSE::ASCIZ \GSE\ .ASCIZ ;[1212] .ERNED::ASCIZ \NED\ .ASCIZ .EROFD::ASCIZ \OFD\ .ASCIZ .EREIF::ASCIZ \EIF\ .ASCIZ .ERCNW::ASCIZ \CNW\ .ASCIZ SUBTTL DEFERRED SEVERITY AND LEVEL TABLE FOR INDEXED FILE ERRORS .ERR. (,0,V%L,L%F,S%F,,<(2) directory full >) ENTAB: .ERR. (,0,V%L,L%F,S%F,,<(0) Illegal file name >) LRETAB: .ERR. (,0,V%L,L%F,S%E,,<(0) file was not found >) .ERR. (,0,V%L,L%F,S%E,,<(1) no directory for project-programmer number >) .ERR. (,0,V%L,L%F,S%E,,<(2) protection failure >) .ERR. (,0,V%L,L%F,S%E,,<(3) file was being modified >) .ERR. (,0,V%L,L%F,S%E,,<(4) rename file name already exists >) .ERR. (,0,V%L,L%F,S%F,,<(5) illegal sequence of UUOs >) .ERR. (,0,V%L,L%F,S%F,,<(6) bad UFD or bad RIB >) .ERR. (,0,V%L,L%F,S%F,,<(7) not a saved file >) .ERR. (,0,V%L,L%F,S%F,,<(10) not enough memory >) .ERR. (,0,V%L,L%F,S%F,,<(11) device not available >) .ERR. (,0,V%L,L%F,S%F,,<(12) no such device >) .ERR. (,0,V%L,L%F,S%F,,<(13) not two reloc reg. capability >) .ERR. (,0,V%L,L%F,S%E,,<(14) no room or quota exceeded >) .ERR. (,0,V%L,L%F,S%E,,<(15) write lock error >) .ERR. (,0,V%L,L%F,S%F,,<(16) not enough monitor table space >) .ERR. (,0,V%L,L%I,S%I,,<(17) partial allocation only >) .ERR. (,0,V%L,L%F,S%F,,<(20) block not free on allocation >) .ERR. (,0,V%L,L%F,S%F,,<(21) can't supersede (enter) an existing directory >) .ERR. (,0,V%L,L%F,S%F,,<(22) can't delete (rename) a non-empty directory >) .ERR. (,0,V%L,L%F,S%E,,<(23) SFD not found >) .ERR. (,0,V%L,L%F,S%E,,<(24) search list empty >) .ERR. (,0,V%L,L%F,S%E,,<(25) SFD nested too deeply >) .ERR. (,0,V%L,L%F,S%E,,<(26) no-create on for specified SFD path >) .ERR. (,0,V%L,L%F,S%E,,<(27) segment not on swap space >) .ERR. (,0,V%L,L%F,S%E,,<(30) can't update file >) .ERR. (,0,V%L,L%F,S%E,,<(31) low segment overlaps high segment >) .ERR. (,0,V%L,L%F,S%F,,<(32) RUN not allowed when not logged in >) ;[1174] .ERR. (,0,V%L,L%F,S%F,,<(33) file still has outstanding ENQ/DEQ locks >) ;[1174] .ERR. (,0,V%L,L%F,S%F,,<(34) bad EXE file directory format >) ;[1174] .ERR. (,0,V%L,L%F,S%F,,<(35) EXE format files must have .EXE extension >) ;[1174] .ERR. (,0,V%L,L%F,S%F,,<(36) EXE file directory is too big >) ;[1174] .ERR. (,0,V%L,L%F,S%F,,<(37) network capability exceeded for TSK: >) ;[1174] .ERR. (,0,V%L,L%F,S%F,,<(40) task is not available >) ;[1174] .ERR. (,0,V%L,L%F,S%F,,<(41) undefined network node for TSK: >) ;[1174] LRELEN==:.-LRETAB ;[1174] **MUST** AGREE WITH LNKERR LREDEF: .ERR. (,0,V%L,L%F,S%F,,<) Unknown cause >) IFN TOPS20,< ;[2330] ;[2301] Table of editable TOPS-20 messages. These come only from the ;[2301] GTJFN% and OPENF% monitor calls (Except DESX8 which is forced) ;[2301] and are only for input files. T20TAB: GJFX4 ;[2301] Invalid character in filename GJFX16 ;[2301] No such device GJFX17 ;[2301] No such directory name GJFX19 ;[2325] No such file type GJFX18 ;[2301] No such filename GJFX24 ;[2301] File not found GJFX28 ;[2301] Device is not on-line GJFX31 ;[2325] Invalid wildcard designator GJFX34 ;[2301] Invalid character "?" in filename GJFX35 ;[2301] Directory access priviledges required DESX8 ;[2301] File is not on disk DESX9 ;[2301] Invalid operation for this device STRX09 ;[2301] Prior structure mount required GFDBX3 ;[2301] List access required OPNX2 ;[2301] File does not exist OPNX3 ;[2301] Read access required OPNX8 ;[2301] Device is not on line OPNX9 ;[2301] Invalid simultaneous access OPNX12 ;[2301] List access required OPNX13 ;[2301] Invalid access requested T20SIZ=T20TAB-. >;[2330] IFN TOPS20 SUBTTL COMMON .ETC. SUBROUTINES ;PRINT 'DETECTED IN MODULE [SYMBOL] FROM FILE [FILE]' IF WE'RE CURRENTLY LOADING ;A MODULE. CALLED FROM ALL ERROR MESSAGES THAT POTENTIALLY PERTAIN TO A ;PATICULAR MODULE. .ETIMF::.ETC. (XCT,.EC,,,,<[TRNN FL,R.LOD]>) ;[1174] .ETC. (RTN) ;[1174] NO MODULE, MAYBE A SWITCH .ETC. (NLN,.EC) ;[1174] .ETC. (STR,.EC,,,,,) ;[1174] .ETC. (SBX,.EC!.EP,,,,PRGNAM) ;[1174] .ETC. (STR,.EC,,,,,< from file >) ;[1174] .ETC. (FSP,.EC,,,,DC) ;[1174] .ETC. (RTN) ;[1174] IFN .NWBLK,< .ETNMF::.ETC. (XCT,.EC,,,,<[TRNN FL,R.LOD]>) ;[1174] .ETC. (RTN) ;[1174] NO MODULE, MAYBE A SWITCH .ETC. (NLN,.EC) ;[1174] .ETC. (STR,.EC,,,,,) ;[1174] .ETC. (LSP,.EC!.EP,,,,NAMPTR) ;[1174] .ETC. (STR,.EC,,,,,< from file >) ;[1174] .ETC. (FSP,.EC,,,,DC) ;[1174] .ETC. (RTN) ;[1174] > ;[1174] END OF IFN .NWBLK IFN FTOVERLAY,< ;PRINT ' LINK NUMBER n[, NAME x]'. .ETLNN::.ETC. (STR,.EC,,,,,< link number >) ;[1174] .ETC. (DEC,.EC!.EP,,,,CS+CS.NUM) ;[1400] .ETC. (XCT,.EC,,,,<[SKIPN CS+CS.LNM]>) ;[1400] .ETC. (RTN) ;[1174] DON'T PRINT NAME IF NONE .ETC. (STR,.EC,,,,,< name >) ;[1174] .ETC. (SBX,.EC!.EP,,,,CS+CS.LNM) ;[1400] .ETC. (RTN) > ;PRINT SYMBOLS WITH VALUES. THIS IS CALLED FROM VARIOUS PLACES, SUCH AS /ENTRY, ;/REQUEST, /UNDEFINED. THIS IS A LOOP THAT PRINTS ALL APPLICABLE SYMBOLS UNTIL ;DONE. ; ;CALL: ; W1/ SIXBIT SYMBOL NAME ; W2/ OCTAL SYMBOL VALUE ; NXTGLB/ , WHERE LOCN IS NEXT SYMBOL ROUTINE ;W3 IS SAVED AND CAN BE USED FOR DATA. THE ROUTINE REFERENCED IN NXTGLB SHOULD ;GIVE A NON-SKIP RETURN IF THERE ARE NO MORE SYMBOLS. OTHERWISE, IT SHOULD GIVE ;A SKIP RETURN WITH W1-W3 SET UP AS ABOVE. .ETSAV::.ETC. (NLN,.EC) ;[1174] NEW LINE FOR NEXT SYMBOL .ETC. (SBX,.EC!.EP,,,,W1) ;[1174] PRINT SYMBOL NAME .ETC. (ASC,.EC,,,,.CHTAB) ;[1174] .ETC. (OCT,.EC!.EP,,,,W2) ;[1174] PRINT SYMBOL VALUE .ETC. (XCT,.EC,,,,NXTGLB) ;[1174] FETCH NEXT SYMBOL .ETC. (JMP,.EC,,,,.ETDON) ;[1174] NO MORE LEFT .ETC. (JMP,.EC,,,,.ETSAV) ;[1174] LOOP FOR THIS ONE .ETDON::.ETC. (NOP) ;[1174] DONE POPJ P, ;[1174] ALL DONE SUBTTL GENERIC JSYS ERROR HANDLER IFN TOPS20,< ;[2257] ; ; Subroutine to put last TOPS-20 process error string into a buffer. ; Output the buffer with the following line during error processing: ; ; .ETC. (STR,,,,,ERRJSY) ; ; Used ACs: none ; JSERR:: SPUSH ;[2257] SAVE ACS FOR A MOMENT HRROI T1,ERRJSY ;[2257] POINT TO BUFFER FOR ERSTR% STRING MOVX T2,<.FHSLF,,-1> ;[2257] GET OUR PROCESS,,LAST ERROR HRLZI T3,-ERRLEN ;[2257] LENGTH OF ERSTR% BUFFER ERSTR% ;[2257] GET TEXT FOR THE ERROR ERJMP E$$UIE ;[2304] CATCH ERRORS WITHIN AN ERROR PJRST E$$UIE ;[2304] ERROR IF STRING TOO LONG SPOP ;[2257] RESTORE ACS POPJ P, ;[2257] DO USER'S ERROR HANDLING ROUTINE E$$UIE: .ERR. (MS,,V%L,L%F,S%F,UIE,) ;[2304] ; ; Generic JSYS error routine. Call when all has failed and it's time ; to die because of a JSYS error. ; ; Call: P2/ sixbit% JSYS name (6 chrs. max) ; Return: never (fatal error) ; ; Used ACs: P1 ; E$$UMF::PUSHJ P,JSERR ;[2257] SETUP ERROR TEXT BUFFER PUSH P,P1 ;[2257] SAVE P1 BEFORE USING (DON'T RESTORE) MOVE P1,-1(P) ;[2257] GET PC OF FAILING JSYS TXZ P1,^-<37,,-1> ;[2257] CLEAN OUT FLAG BITS SUBI P1,2 ;[2257] GO BACK TO JSYS ADDR .ERR. (MS,.EC,V%L,L%F,S%F,UMF,) .ETC. (SBX,.EC!.EP,,,,P2) ;[2351] .ETC. (STR,.EC,,,,,< at PC >) ;[2257] .ETC. (OCT,.EC!.EP,,,,P1) ;[2257] .ETC. (NLN,.EC) ;[2257] NEW LINE FOR NEXT SYMBOL .ETC. (STR,,,,,ERRJSY) ;[2257] TYPE ERSTR% TEXT > ;[2257] END IFN TOPS20 LOGLIT: END