1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-02-28 17:09:15 +00:00
Files
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

1149 lines
40 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
TITLE LNKLOG - LOG/ERROR MODULE FOR LINK
SUBTTL D.M.NIXON/DMN/JLd/JNG/DZN/PY/PAH/JBS/HD/RJF 5-Feb-88
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1973,1986,1988.
; 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,<SEARCH MONSYM> ;[2257]
SALL
ENTRY LNKLOG
EXTERN .TYOCH,LNKSCN,LNKERR
CUSTVR==0 ;CUSTOMER VERSION
DECVER==6 ;DEC VERSION
DECMVR==0 ;DEC MINOR VERSION
DECEVR==2417 ;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.
;2403 New corporate Copywrite statement.
;2417 Update Copywrite statement to 1988.
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 <TYPE><JMP>,<IFDIF <TYPE><RTN>,<..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,<PURGE ERSTR> ;[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,<Output error on log file, file closed, load continuing>)
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,<BYTE (7) 0,0,0,177,177 (1) 1>
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/ <ADDRESS OF FIRST LINE TEXT>
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,<F%VER!F%SEV>;[1144] VERBOSITY AND SEVERITY
SLPTR: POINTR P1,<F%SEV!F%LVL>;[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 <ENTER error> ;[1212]
.ERFLE::ASCIZ \FLE\
.ASCIZ <LOOKUP error> ;[1212]
.ERFRE::ASCIZ \FRE\
.ASCIZ <RENAME error> ;[1212]
.ERGSE::ASCIZ \GSE\
.ASCIZ <GETSEG error> ;[1212]
.ERNED::ASCIZ \NED\
.ASCIZ <Non-existent device >
.EROFD::ASCIZ \OFD\
.ASCIZ <OPEN failure for device >
.EREIF::ASCIZ \EIF\
.ASCIZ <Error for input file >
.ERCNW::ASCIZ \CNW\
.ASCIZ <Code not yet written at >
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,,,,,<Detected in module >) ;[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,,,,,<Error detected in module >) ;[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/ <PUSHJ P,LOCN>, 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 <T1,T2,T3> ;[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 <T3,T2,T1> ;[2257] RESTORE ACS
POPJ P, ;[2257] DO USER'S ERROR HANDLING ROUTINE
E$$UIE: .ERR. (MS,,V%L,L%F,S%F,UIE,<Unexpected internal error during error processing>) ;[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,<Unexpected monitor call failure for >)
.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