perm filename COMSER[S,AIL] blob
sn#429856 filedate 1979-04-07 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00010 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 HISTORY
C00005 00003 Comser Data -- Povtab, Dsplin stuff
C00007 00004 Strngc Supply Routines for Compiler Structures
C00009 00005 Compiler-Specific portion of Error UUO stuff
C00022 00006 SERVICE ROUTINES TO MYERR
C00025 00007 MORE SERVICE ROUTINES FOR MYERR
C00030 00008 DSCR PRINT.
C00032 00009 Dsplin Routine for Displaying Input Line
C00036 00010 Interrupt Handler -- Intrpt, Povtrp
C00044 ENDMK
C⊗;
COMMENT ⊗HISTORY
AUTHOR,REASON
021 102100000032 ⊗;
COMMENT ⊗
VERSION 17-1(27) 10-5-78 BY RNG INSTALL TOPS-20 EDITOR INTERFACE
VERSION 17-1(26) 11-1-75 BY RLS TENEX-ONLY CHANGES
VERSION 17-1(25) 11-1-75
VERSION 17-1(24) 10-18-74 BY RLS CHECK EDIT CODE FOR FEAT %BV%
VERSION 17-1(23) 10-10-74 BY RLS BETTER IMSSS EDITOR INTERFACE
VERSION 17-1(22) 10-10-74
VERSION 17-1(21) 10-10-74
VERSION 17-1(20) 9-27-74 BY JFR FIX AUTHOR REASON STUFF
VERSION 17-1(18) 3-19-74 BY RHT LOOK OVER CODE WITH RLS
VERSION 17-1(17) 3-17-74 BY RLS INSTALL TENEX
VERSION 17-1(16) 12-8-73 BY JRL REMOVE SPECIAL STANFORD CHARACTERS(WHERE POSSIBLE)
VERSION 17-1(15) 11-17-73
VERSION 17-1(14) 11-10-73 BY KVL %AI% ADD <ESC> I INTERRUPT TO RESET ERROR HANDLER
VERSION 17-1(13) 7-26-73 BY RHT **** VERSION 17 ****
VERSION 16-2(12) 6-29-73 BY JRL END RINGSORT WITH POPJ P,
VERSION 16-2(11) 3-13-73 BY JRL REMOVE REFERENCES TO GAG
VERSION 16-2(10) 7-3-72 BY DCS INSTALL VERSION 16
VERSION 15-2(9) 2-26-72 BY DCS <ESC> I ALWAYS BREAKS
VERSION 15-2(8) 2-6-72 BY DCS BUG #GM# RETURN ADDRESS BEING WIPED OUT IN POVTRP
VERSION 15-2(7) 2-5-72 BY DCS BUG #GJ# ADD LSTON LISTING CONTROL STUFF
VERSION 15-2(6) 2-1-72 BY DCS BUG #GH# <ESC>I CAUSES PARSER TO BREAK AFTER NEXT SCAN
VERSION 15-2(5) 12-26-71 BY DCS BUG #FU# REENABLE ACCESS TO FTDEBUG FROM ERR UUO
VERSION 15-2(4) 12-22-71 BY DCS BUG #FT# DSPLIN CLEANED UP
VERSION 15-2(3) 12-22-71 BY DCS BUG #FT# MYERR RETURNS BINLIN (SEQUENTIAL LINE #)
VERSION 15-2(2) 12-21-71 BY DCS BUG #FS# REMOVE COM2 REFS (ASSUME RUNTIM OR LIB)
VERSION 15-2(1) 12-2-71 BY DCS INSTALL VERSION NUMBER
⊗;
COMMENT ⊗Comser Data -- Povtab, Dsplin stuff⊗
LSTON (COMSER)
BEGIN COMSER ;SERVICE ROUTINES FOR COMPILER.
ZERODATA (COMSER VARIABLES)
COMMENT ⊗
POVTAB -- table of ASCIZ strings, one per AC, giving reasonable
messages to be typed when PDL overflow occurs. 0 if none
provided -- set up in POVSET from SAIL INIT -- changed
occasionally as needs change. Used by POVTRP below
⊗
↑↑POVTAB: BLOCK 10
;PDLSV, PDLSV1 -- save AC's when PDL trapping
?PDLSV: 0
?PDLSV1:0
DATA (COMSER VARIABLES)
COMMENT ⊗
DSPLIN and MYERR variables
⊗
DLINBF: BLOCK 53
ENDDBF←DLINBF+53
DATA(LOGGING VARIABLES)
NOTENX <
MAKCDB(LOG,LOG,0,0,1)
>;NOTENX
TENX <
LOGJFN: 0 ;LOGFLN, a bp to log file name, is set up in SAIL
;in the command scanner
>;TENX
ZERODATA( LOGGING VARIABLES)
↑..STR:0
↑..LOCA:0
↑%QUIET: 0
%MINUS: 0
%NUMBS: 0
%LOGGIN:0
ENDDATA
COMMENT ⊗Strngc Supply Routines for Compiler Structures⊗
; SORT THE STRINGS IN SYMBOL TABLE
DSCR RINGSORT
CAL PUSHJ from STRINGC.
DES It passes off to the GC all of the Strings located in
symbol table Semblks in the compiler. It does this by
searching down the %RSTR ring (STRRNG).
⊗
T←←11
↑RINGSORT:
HRRZ T,STRRNG ;PTR TO LAST BLOCK IN STRING RING
JUMPE T,CPOPJ ;DONE WHEN 0, GO MARK VARIABLES
RGSLUP: MOVEI A,$PNAME(T) ;PTR TO STRING DESCRIPTOR
PUSHJ P,@-1(P) ;SORT IT INTO LISTS
HLRZ T,%RSTR(T) ;NEXT BLOCK
JUMPN T,RGSLUP ;CONTINUE UNLESS DONE
POPJ P,
; SORT STRINGS IN DEFINE STACK
DSCR DEFSRT
CAL PUSHJ from STRINGC
DES Passes off all Strings currently in the Define stack to be collected.
⊗;
↑DEFSRT:
HRRZ A,DFSTRT ;SORT STRINGS ON DEFINE STACK
HRRZ T,DEFPDP ;TERMINATION VALUE
SUBI A,1 ;INIT
JRST SGDTST ;JUMP INTO THINGS
DEFMRK:
PUSHJ P,@-1(P) ;SORT INTO STRUCTURE
SGDTST:
ADDI A,2 ;AUTO-INCR DOESN'T GO FAR ENOUGH
CAMGE A,T ;DONE?
JRST DEFMRK ; NO
POPJ P, ; YES
RINGSORT ;1 ROUTINE
0
LINK 4,.-1 ;FOR STRING GARBAGE COLL.
DEFSRT
0
LINK 4,.-1 ;AND ANOTHER ROUTINE.
COMMENT ⊗Compiler-Specific portion of Error UUO stuff⊗
TENX <
SUMEX<;MYERR FOR SUMEX SYSTEM
DSCR MYERR
DES Part of the second segment kludge -- so that the error
handler can call some routines which are specific to the
compiler. There routines are -- display the current line.
-- call the editor on the current input file.
⊗;
IFN FTDEBUG,<
INNA ;FR0M ERR -- TO LOOK AT STACK
;> 0 ;NO DEBUGGER
↑↑MYERR:
DSCR
Glorious SUMEX EDITOR interface. (Patent pending.)
Here we are going to decide whether we want to edit,
and if so, which editor.
If ac A has 1, then we want some kind of edit.
The information as to which editor we use is on the
stack -- 0 for whichever editor is appropriate to the device,
non-zero for STOPGAP, regardless of the device.
⊗;
EXTERNAL RUNPRG
CAIE A,1 ;REQUEST FOR EDIT?
JRST NOE ;NO
;definitely call some editor. First store things that
;are the same for all editors.
MOVE TEMP,[XWD TMPCBF,TMPCBF+1]
SETZM TMPCBF
BLT TEMP,TMPCBF+37 ;clear before starting
EXCH SP,STPSAV ;STRING STACK
HRROI 1,TMPCBF+1
HRRZ 2,SRCJFN
SETZ 3,
JSYS JFNS ;NAME OF FILE
SETZ 3,
IDPB 3,2 ;PUT A ZERO THERE IN CASE
HRROI 1,TMPCBF+13
HRROI 2,[ASCIZ/<SUBSYS>SAIL.SAV/]
SETZ 3,
JSYS SOUT ;COPY STRING FOR RETURN
MOVE TEMP,[XWD CMDLIN,TMPCBF+21]
BLT TEMP,TMPCBF+37 ;COPY OVER COMMAND
SKIPN TEMP,ASCLIN ;LINE NUMBER
MOVE TEMP,[ASCID/00000/]
TRO TEMP,1 ;TURN ON BIT IF OFF
MOVEM TEMP,TMPCBF+20 ;STORE
MOVE TEMP,FPAGNO ;THE PAGE
DPB TEMP,[POINT 12,TMPCBF,11]
MOVE TEMP,BINLIN ;THE LINE
DPB TEMP,[POINT 12,TMPCBF,23]
;TRICKY CODE TO GET THE BYTE NUMBER
MOVE A,PNEXTC ;BP TO NEXT CHAR
SKIPN LSTCHR ;NEED TO BACK UP BP?
JRST DOTEC1 ;NO
REPEAT 4,<IBP A>
SOJ A, ;BACK IT UP
DOTEC1: SETZ C, ;KEEP COUNT IN 3
MOVE B,PLINE ;POINTER TO BEGINNING OF CURRENT LINE
DOTECL: IBP B ;INCREMENT
AOJ C, ;ONE MORE CHAR
CAMN A,B ;SAME YET?
JRST GOTIT ;YES
CAIG C,=300 ;NO LINE GOES MORE THAN 300 CHARS
JRST DOTECL ;ANOTHER
SETZ C, ;ASSUME NONE
GOTIT:
DPB C,[POINT 12,TMPCBF,35]
MOVEI TEMP,[=15
POINT 7,[ASCIZ/<SUBSYS>TV.SAV/],-1]
SKIPE -1(P) ;INSIST ON STOPGAP
MOVEI TEMP,[=15
POINT 7,[ASCIZ/<SUBSYS>SOS.SAV/],-1]
DORUNC:
SETO A,
MOVEI B,TMPCBF
JSYS PTINF ;SPECIAL IMSSS PTINF JSYS
JFCL ;ERROR RETURN
MOVEI A,400000 ;THIS FORK
SETO B,
JSYS DIC ;DEACTIVATE ALL CHANNELS
JSYS CIS ;CLEAR INTERRUPT SYSTEM
MOVEI A,10 ;CONTROL-H INTERRUPT
JSYS DTI ;DISABLE IT
JSYS RESET ;CLOSE ALL FILES ETC MUMBLE
PUSH P,[1] ;INCREMENT FOR CCL STUFF
PUSH P,[0] ;SAME FORK
PUSH SP,(TEMP) ;PROGRAM TO RUN
PUSH SP,1(TEMP)
PUSHJ P,RUNPRG ;SHOULD NEVER RETURN
HRROI 1,[ASCIZ/
Runcall error for IMSSS editor interface.
/]
JSYS PSOUT
EXCH SP,STPSAV
JRST SAIL ;AND RESTART
>;SUMEX
NOSUMEX<
IMSSS<;MYERR FOR IMSSS SYSTEM
DSCR MYERR
DES Part of the second segment kludge -- so that the error
handler can call some routines which are specific to the
compiler. There routines are -- display the current line.
-- call the editor on the current input file.
⊗;
IFN FTDEBUG,<
INNA ;FR0M ERR -- TO LOOK AT STACK
;> 0 ;NO DEBUGGER
↑↑MYERR:
DSCR
Glorious IMSSS EDITOR interface. (Patent pending.)
Here we are going to decide whether we want to edit,
and if so, which editor.
If ac A has 1, then we want some kind of edit.
The information as to which editor we use is on the
stack -- 0 for whichever editor is appropriate to the device,
non-zero for STOPGAP, regardless of the device.
⊗;
EXTERNAL JFNS,CVSIX,JFNTBL,RUNPRG
DEFINE JFNSMK(X,Y)<
PUSH P,[1]
PUSH P,[XWD X,0]
PUSHJ P,JFNS
PUSHJ P,CVSIX
MOVEM A,Y
>
CAIE A,1 ;REQUEST FOR EDIT?
JRST NOE ;NO
;definitely call some editor. First store things that
;are the same for all editors.
MOVE TEMP,[XWD TMPCBF,TMPCBF+1]
SETZM TMPCBF
BLT TEMP,TMPCBF+37 ;clear before starting
MOVEW JFNTBL+1,SRCJFN ;FAKE FOR JFNS -- WHAT A KROK
MOVEW TMPCBF+32,<[SIXBIT/SYS/]>
MOVEW TMPCBF+33,<[SIXBIT/SAIL/]> ;return to SAIL
MOVE TEMP,[XWD CMDLIN,TMPCBF+6]
BLT TEMP,TMPCBF+30 ;COPY OVER COMMAND
EXCH SP,STPSAV ;GET STRING PDL
JFNSMK(001000,TMPCBF) ;GET FILE NAME PIECES
JFNSMK(000100,TMPCBF+1)
JFNSMK(010000,TMPCBF+3)
MOVEW TMPCBF+5,FPAGNO ;page number
SKIPN -1(P) ;STOPGAP?
JRST DECIDE ;NOPE, DECIDE WHICH EDITOR
DOSOS: SKIPN TEMP,ASCLIN ;THE LINE NO
MOVE TEMP,[ASCID/00000/];SUPPLY ONE
TRO TEMP,1 ;TURN ON BIT, IN CASE OFF
MOVEM TEMP,TMPCBF+4
;STORE RUNCALL INFO IN TEMP
MOVEI TEMP,[ =16
POINT 7,[ASCIZ/<SUBSYS>EDIT.SAV/],-1]
DORUNC:
SETO A,
MOVEI B,TMPCBF
JSYS PTINF ;SPECIAL IMSSS PTINF JSYS
JFCL
MOVEI A,400000 ;THIS FORK
SETO B,
JSYS DIC ;DEACTIVATE ALL CHANNELS
JSYS CIS ;CLEAR INTERRUPT SYSTEM
MOVEI A,10 ;CONTROL-H INTERRUPT
JSYS DTI ;DISABLE IT
JSYS RESET ;CLOSE ALL FILES ETC MUMBLE
PUSH P,[1] ;INCREMENT FOR CCL STUFF
PUSH P,[0] ;SAME FORK
PUSH SP,(TEMP) ;PROGRAM TO RUN
PUSH SP,1(TEMP)
PUSHJ P,RUNPRG
HRROI A,[ASCIZ/
Runcall error for IMSSS editor interface.
/]
JSYS PSOUT
EXCH SP,STPSAV ;PUT BACK THE STRING PDL
JRST SAIL
DECIDE:
MOVE TEMP,BINLIN ;LINE NUMBER
;TRICKY CODE TO GET THE BYTE NUMBER
MOVE A,PNEXTC ;BP TO NEXT CHAR
SKIPN LSTCHR ;NEED TO BACK UP BP?
JRST DOTEC1 ;NO
REPEAT 4,<IBP A>
SOJ A, ;BACK IT UP
DOTEC1: SETZ C, ;KEEP COUNT IN 3
MOVE B,PLINE ;POINTER TO BEGINNING OF CURRENT LINE
DOTECL: IBP B ;INCREMENT
AOJ C, ;ONE MORE CHAR
CAMN A,B ;SAME YET?
JRST GOTIT ;YES
CAIG C,=300 ;NO LINE GOES MORE THAN 300 CHARS
JRST DOTECL ;ANOTHER
SETZ C, ;ASSUME NONE
GOTIT:
HRL TEMP,C ;XWD BYTENO,LINENO
MOVEM TEMP,TMPCBF+4 ;STORE IT
MOVEI TEMP,[=15
POINT 7,[ASCIZ/<SUBSYS>TV.SAV/],-1]
JRST DORUNC ;STORE INFO AND DO RUN CALL
>;IMSSS
NOIMSSS<;MYERR FOR NON-IMSSS TENEX SYSTEM
DSCR MYERR
DES TOPS-20 EDITOR interface. Calls logical name EDIT: as an editor
after putting "EDIT <filename><crlf>" in the RSCAN buffer and
storing the following seven 36-bit words into the PRARG buffer.
Note that this could be read by looking up the file "EDI" in
TMPCOR using the emulator, though we expect editors to do
PRARG directly.
1 - number of argument blocks
2 - start of first argument block
'EDI',,4 - argument name,,length
ASCLIN - The ascii line number on which the
error handler was called, or 00100 if
the file does not have line numbers.
FPAGNO - The binary page number, e.g. 2.
BINLIN - The binary line number on this page.
BYTENO - The byte within the line which is
about to be scanned by the compiler.
The editor is expected to look for the PRARG block
whenever it is started. DEC is using the +1 start
address for reenter, so we can't use it. Editors
that don't understand PRARG should at least get the
file name right.
⊗;
EXTERNAL RUNPRG,$OSTYP;
↑↑MYERR:
SKIPE $OSTYP ;[clh] only on Tops-20
CAIE A,1 ;REQUEST FOR EDIT?
JRST NOE ;NO
MOVE TEMP,[XWD TMPCBF,TMPCBF+1] ;ZERO BUFFER
SETZM TMPCBF
BLT TEMP,TMPCBF+37 ;WITH BLT TRICK
EXCH SP,STPSAV ;GET STRING PDL
HRROI A,TMPCBF ;PLACE TO PUT RSCAN STRING
HRROI B,[ASCIZ/EDIT /];SET UP TO DO SOUT TO TMPCBF
SETZ C,
JSYS SOUT ;SEND IT TO TMPCBF
MOVE C,A ;SAVE POINTER
HRLZI A,100003 ;I/O to terminal, short form
MOVE B,[xwd 100,101]
JSYS GTJFN
ERJMP [CAIN A,600115 ;Null file name?
MOVE A,SRCJFN ;Yes, get default
JRST .+1]
HRRZ B,A ;GET JFN IN B
MOVE A,C ;RESTORE POINTER TO A
MOVE C,[222200,,1] ;Format with no generation number
JSYS JFNS ;FILE NAME
SETZ C,
HRROI B,CRLF..
JSYS SOUT ;FINISH LINE
SETZ B,
IDPB B,A ;MAKE STRING ASCIZ
HRROI A,TMPCBF ;BEGINNING OF RSCAN STRING
JSYS RSCAN ;STUFF IT IN BUFFER
JFCL ;IGNORE ERRORS
;; Now put 4 words of info in the PRARG buffer
MOVE D,[XWD [,1
,2
XWD 'EDI',4],TMPCBF]
BLT D,TMPCBF+2 ;SET UP +0 TO +2 IN BUFFER
SKIPN D,ASCLIN ;LINE NUMBER
MOVE D,[ASCID/00100/];CHOOSE A REASONABLE DEFAULT
TRO D,1 ;Make sure bit is on
MOVEM D,TMPCBF+3 ;First word of buffer is ASCLIN
MOVE D,FPAGNO
MOVEM D,TMPCBF+4 ;Second word is FPAGNO
MOVE D,BINLIN
MOVEM D,TMPCBF+5 ;Third word is BINLIN
;TRICKY CODE TO GET THE BYTE NUMBER
MOVE A,PNEXTC ;BP TO NEXT CHAR
SKIPN LSTCHR ;NEED TO BACK UP BP?
JRST DOTEC1 ;NO
REPEAT 4,<IBP A>
SOJ A, ;BACK IT UP
DOTEC1: SETZ C, ;KEEP COUNT IN 3
MOVE B,PLINE ;POINTER TO BEGINNING OF CURRENT LINE
DOTECL: IBP B ;INCREMENT
AOJ C, ;ONE MORE CHAR
CAMN A,B ;SAME YET?
JRST GOTIT ;YES
CAIG C,=300 ;NO LINE GOES MORE THAN 300 CHARS
JRST DOTECL ;ANOTHER
SETZ C, ;ASSUME NONE
GOTIT:
MOVEM C,TMPCBF+6 ;Fourth word is Byte number in line
MOVE A,[2,,400000] ;store in PRARG,current process
MOVEI B,TMPCBF ;Where PRARG will find args
MOVEI C,7 ;Length of arg block
JSYS PRARG ;always returns .+1
;; Now run the editor
MOVEI TEMP,[=5 ;LENGTH OF STRING.
POINT 7,[ASCIZ/EDIT:/],-1] ;EDIT: SHOULD BE DEFINED
;BY SYSTEM TO BE DEFAULT
;EDITOR. USER CAN
;REDEFINE IF HE WANTS
MOVEI A,400000 ;THIS FORK
SETO B,
JSYS DIC ;DEACTIVATE ALL CHANNELS
JSYS CIS ;CLEAR INTERRUPT SYSTEM
MOVEI A,10 ;CONTROL-H INTERRUPT
JSYS DTI ;DISABLE IT
JSYS RESET ;CLOSE ALL FILES ETC MUMBLE
PUSH P,[0] ;INCREMENT FOR CCL STUFF
PUSH P,[0] ;SAME FORK
PUSH SP,(TEMP) ;PROGRAM TO RUN
PUSH SP,1(TEMP)
PUSHJ P,RUNPRG
HRROI A,[ASCIZ/
? Could not run "EDIT:" as an editor.
/]
JSYS PSOUT
EXCH SP,STPSAV ;PUT BACK THE STRING PDL
JRST SAIL
>;NOIMSSS
>;NOSUMEX
>;TENX
NOTENX <
COMMENT ⊗Compiler-Specific portion of Error UUO stuff⊗
DSCR MYERR
DES Part of the second segment kludge -- so that the error
handler can call some routines which are specific to the
compiler. There routines are -- display the current line.
-- call the editor on the current input file -- log error messages.
⊗;
↑↑MYERR:
MOVE 13,SRCFIL ;FILE NAME NEEDED IN ANY CASE
MOVE 14,SRCEXT
MOVE 11,SRCPPN
SKIPE A,-1(P) ;GO TO EDITOR?
JRST NOE ;NOPE, DO DSPLIN & LOGGING STUFF
MOVE 16,FPAGNO ;AS IS THIS
SKIPN 15,ASCLIN
MOVE 15,[ASCID/00000/]
TRO 15,1 ;FOR WFW
SKIPA 12,BINLIN ;TV WILL WANT THIS NUMBER INSTEAD
>;NOTENX
GOHOHO: SUB SP,X44 ;GET RID OF STRINGS
SUB P,X22
JRST @2(P)
NOE: HRRZM A,..LOCA ;STORE NUMBERS
MOVE A,-2(SP) ;GET STRING
HRRZM A,..STR ;STORE IT TOO
SKIPL %RECOV
SETZM %QUIET ;MAKE FATAL ERRORS PRINT
PUSHJ P,ERPRIN ;PRINT MSG, ETC.
;;=I02= CHECK TO SEE IF A BATCH JOB. CLH 31-MAY-75
DEC<
EXTERNAL %BATCH
SKIPN %BATCH ;DO WE KNOW IF BATCH?
JRST [AOS %BATCH ;NO- ASSUME IT IS
MOVE A,[XWD -1,40]
CALLI A,41 ;GETTAB
JFCL
TLNN A,200 ;BATCH?
SETOM %BATCH ;NO - SET TO -1
JRST .+1]
SKIPL %BATCH ;BATCH?
JRST HOME2 ;YES
> ;DEC
;;=I02= ↑
SKIPE %ERGO ;AUTO CONTINUE?
JRST HOME2
;;#PR# RHT FLUSH TYPE AHEAD (1 OF 2)
PUUO 2,B ;INCHRS
JRST PROMPT ;NO TYPE AHEAD
PUUO 11,0 ;CLEAR BUFFER
CAIN B,12 ;ONLY USE TYPE AHEAD IF WAS A LF
JRST CHRGOT ;HAVE GOT IT
;;#PR#
PROMPT: PUUO 3,CRLF..
MOVEI A,"?" ;PRINT ? FOR IRRECOVERABLE ERRORS,
SKIPGE %RECOV ;CAN CONTINUE?
MOVEI A,"↑" ;SOMETHING PRINTABLE
PUUO 1,A ;PRINT IT
NOPROM:
PUUO 0,B ;GET RESPONSE CHAR
CHRGOT: PUSHJ P,DSPATC ;GO DO THE RIGHT THINGS
JRST HOME0 ;GOT AN ACTIVATION LETTER
SKIPE %MINUS ;DONOT PROMPT IF WE RECEIVED A MINUS
JRST NOPROM
JRST PROMPT
;;#PR#
HOME0: CAIN B,15 ;IF A CR
PUUO 2,A ;GOBBLE THE LF
JRST HOME1 ;NOT ONE THERE
JRST HOME1 ;
;;#PR#
HOME2: SKIPA A,[0]
HOME1: HRRZ A,B ;PUT LEFTOVER CHARACTER IN
TLO A,3 ;DO NOT PRINT OR GIVE NUMBERS
JRST GOHOHO ; AND A BOTTLE OF RUM
; SERVICE ROUTINES TO MYERR
;Dspatc is also called from GEN in the routine that does REQUIRE ERROR!MODES.
;Dspatc skip returns if the contents of B was any of the error modes.
;It does a regular return if B was any of the activation responses.
;It skip returns if it doesn't recognize the character.
↑DSPATC:
CAIL B,"a" ;lower case?
SUBI B,40 ;YES, CONVERT TO UPPER
CAIN B,"Q"
JRST SETQT
CAIN B,"N"
JRST SETNUM
CAIN B,"L"
JRST SETLOG
CAIN B,"F"
JRST SETFL
CAIN B,"-"
JRST SETMN
CAIN B,"B"
JRST DEBUGA
CAIE B,12 ;LF
CAIN B,15 ;CR
JRST GOTRY
CAIE B,"X"
CAIN B,"S"
JRST GOTRY
CAIE B,"T"
CAIN B,"E"
JRST GOTRY
CAIE B,"B"
CAIN B,"D"
JRST GOTRY
CAIE B,"A"
CAIN B,"C"
JRST GOTRY
NOTYMSHR<
NODEC<
PUUO 3,[ASCIZ /Error modes are: Q(quiet), L or F (logging), N (numbers).
Precede a mode letter by - to reset the mode. Action responses are: <CR>(continue),
<LF>(auto cont), D(DDT), B(debugger), E(SOS), T(TV editor), X(exit), S(restart)
/]
>;NODEC
DEC<
PUUO 3,[ASCIZ /Error modes are: Q(quiet), L or F (logging), N (numbers).
Precede a mode letter by - to reset the mode. Action responses are: <CR>(continue),
<LF>(auto cont), D(DDT), B(debugger), E(SOS), T(TECO), X(exit), S(restart)
/]
>;DEC
>;NOTYMSHR
TYMSHR<
PUUO 3,[ASCIZ /Error modes are: Q(quiet), L or F (logging), N (numbers).
Precede a mode letter by - to reset the mode. Action responses are: <CR>(continue),
<LF>(auto cont), D(DDT), B(debugger), E(EDIT10), T(TV editor), X(exit), S(restart)
/]>;TYMSHR
GOFLY: AOS (P) ;SKIP RETURN (SETMN ROLLS ITS OWN)
GOTRY: SETZM %MINUS
POPJ P,
;MORE SERVICE ROUTINES FOR MYERR
SETMN: SETOM %MINUS
AOS (P)
POPJ P,
SETNUM: SKIPE %MINUS
SOSA %NUMBS
AOSA %NUMBS
JRST GOFLY ;GO AWAY, HE DOESNOT WANT NUMBERS
JRST DOOVER
SETQT: SKIPN %MINUS
AOSA %QUIET
SOSA %QUIET
JRST GOFLY ;GO AWAY - HE WANTS QUIET
DOOVER: PUSH P,%LOGGIN ;SAVE
SETZM %LOGGIN
PUSHJ P,ERPRIN ;PRINT AGAIN - DON'T BOTHER GETTING %ERFLGS
POP P,%LOGGIN ;RESTORE
JRST GOFLY
NOTENX <
SETFL: RELEASE LOG,0
SETZM %LOGGIN
SKIPE %MINUS
JRST GOFLY ;THE END (WAS A -F)
PUSH P,TTYTYI ;SPECIAL INCHWL KLUGE
SETOM TTYTYI ;
HRLZI 14,'LOG' ;
MOVEM 14,EXTEN ;
PUSHJ P,FILNAM ;I HOPE THIS DOESN'T CLOBBER NAME... TOO BAD
POP P,TTYTYI ;
SKIPE NOFILE
JRST [PUUO 3,[ASCIZ/INVALID FILE NAME SYNTAX
/]
JRST GOFLY]
JRST SETLF
SETLOG: RELEASE LOG,0 ;ALWAYS START WITH CLEAN SLATE
SETZM %LOGGIN
SKIPE %MINUS
JRST GOFLY ;WAS A -L
HRLZI TEMP,'LOG' ;DEFAULT EXTENSION
MOVEM TEMP,EXTEN
SETZM WORD3
MOVE TEMP,SRCPPN ;REDUNDANCY FOR REQUIRE...ERROR!MODES BENEFIT
MOVEM TEMP,PPN
MOVE TEMP,SRCFIL
MOVEM TEMP,NAME
SETLF: HRLZI TEMP,'DSK'
MOVEM TEMP,LOGDEV ;
MOVEI SBITS2,LOGCDB ;READY TO OPEN LOG FILE
PUSHJ P,OPNUP ;OPEN SEZ ME!
JRST [PUUO 3,[ASCIZ /ERROR LOGGER: OPEN FAILURE
/]
JRST GOFLY]
JRST [PUUO 3,[ASCIZ /ERROR LOGGER: ENTER FAILURE
/]
JRST GOFLY]
>;NOTENX
TENX <
SETFL: HRROI 1,[ASCIZ/ Logfile:/]
SKIPE %MINUS ;WAS -F, DON'T PROMPT
JSYS PSOUT ;PROMPT HIM
MOVEI 1,ELOGF ;FILENAME FROM TERMINAL
JRST SETXX
SETLOG: MOVEI 1,ELOGL ;STANDARD FILENAME
SETXX: SKIPE %MINUS
JRST SHUTLG ;WAS -F OR -L (CLOSE LOGFILE)
EXCH 1,LOGJFN ;TAKE CARE OF ANY LEFTOVER JFN
SKIPE %LOGGIN
JRST [HRRZI 1,(1) ;CLEAR LH SO CLOSF WILL DO RLJFN
JSYS CLOSF ;AND DROP OLD LOGFILE
JFCL
JRST .+1]
MOVE 1,LOGJFN ;RECOVER FILE SPECS
SETZB B,LOGJFN ;SET FOR GTJFN, CLEAR OLD LOG JFN
JSYS GTJFN
JRST [HRROI 1,[ASCIZ/
Can't GTJFN your logfile.
/]
JRST LEAVLG]
MOVEM 1,LOGJFN ;SAVE JFN
MOVE B,[XWD 70000,100000] ;7 BIT WRITING
JSYS OPENF
JRST [HRRZ 1,LOGJFN ;CLOSE AND RELEASE JFN
JSYS CLOSF
HRROI 1,[ASCIZ/
Can't OPENF your logfile.
/]
JRST LEAVLG]
>;TENX
SETOM %LOGGIN
PUSH P,%QUIET ;SAVE FLAGS
SETOM %QUIET ;MAKE IT NOT PRINT
PUSHJ P,ERPRIN ;PRINT AGAIN
POP P,%QUIET ;RESTORE FLAGS
JRST GOFLY
TENX <
SHUTLG: HRROI 1,[ASCIZ / No logfile to shut. /]
SKIPE %LOGGIN ;ALREADY OFF
JRST [HRRZ 1,LOGJFN ;GET RID OF JFN
JSYS CLOSF ;DROP OLD LOGFILE
JFCL
HRROI 1,[ASCIZ / Logfile shut. /]
JRST .+1]
LEAVLG: JSYS PSOUT ;PRINT MESSAGE,
SETZM LOGJFN ;GET RID OF JFN
SETZM %LOGGIN ;CLEAR LOGGING
JRST GOFLY ;AND CONTINUE
;long form GTJFN block -- this is for default file name
ELOGL: XWD 400000,0
XWD 377777,377777
0
0
XWD -1,DEFFLN ;set in CC
XWD -1,[ASCIZ/LOG/]
BLOCK 3
;this one is for file from terminal
ELOGF: XWD 460000,0 ;CONFIRM BITS ON
XWD 100,101
0
0
XWD -1,DEFFLN
XWD -1,[ASCIZ/LOG/]
BLOCK 3
>;TENX
DEBUGA:
IFN FTDEBUG <PUSHJ P,INNA ;GO TO COMPILER DEBUGGER
>; FTDEBUG
JRST GOFLY
DSCR PRINT.
PAR A points to some asciz
SID none
DES prints the string given it, and logs it out if the
guy is enabled for that.
⊗
↑↑PRINT.:
SKIPN %QUIET
PUUO 3,(A) ;PRINT THE MSG
SKIPN %LOGGIN
POPJ P,
PUSH P,B
NOTENX <
HRLI A,(<POINT 7,0>) ;BYTE POINTER
GG..: ILDB B,A ;GET BYTE
JUMPE B,MPOPJ ;END OF LINE
SOSG LOGCNT
OUTPUT LOG,
IDPB B,LOGPNT
JRST GG..
>;NOTENX
TENX <
HRROI 2,(1)
HRRZ 1,LOGJFN
PUSH P,3
SETZ 3,
JSYS SOUT
POP P,3
>;TENX
MPOPJ: POP P,B
POPJ P, ;SUPER-DUPER ERROR RECOVERY, HUH?
ERPRIN:
MOVE A,..STR ;GET MSG - ITS ALREADY ASCIZ!
PUSHJ P,PRINT. ;PRINT IT!
PUSHJ P,DSPLIN ;PRINT CURRENT LINE AND SUCH
SKIPN %NUMBS ;WANT NUMBERS?
POPJ P,
MOVEI A,[ASCIZ /CALLED FROM /]
PUSHJ P,PRINT.
MOVE B,..LOCA ;THE LOCATION
SUBI B,1
PUSH P,C
PUSHJ P,PRNT.
POP P,C
MOVEI A,CRLF..
PUSHJ P,PRINT.
POPJ P,
PRNT.: IDIVI B,10 ;FAMOUS DEC RECURSIVE NUMBER PRINTER.
IORI C,"0"
HRLM C,(P)
SKIPE B
PUSHJ P,PRNT.
HLRZ C,(P)
ROT C,-7
MOVEI A,C
PUSHJ P,PRINT.
POPJ P,
CRLF..: ASCIZ /
/
COMMENT ⊗Dsplin Routine for Displaying Input Line⊗
DSCR DSPLIN
PAR Line specs from compiler,
CAL PUSHJ
RES Types out current input line on tty, may log if that is on.
SID changes A,B,C,TEMP
⊗
↑DSPLIN:
SETZM DLINBF
MOVE TEMP,[XWD DLINBF,DLINBF+1]
BLT TEMP,ENDDBF-1 ;MAKE ALL DISPLAY BUFFER ASCID
PUSH P,PNEXTC ;SAVE BECAUSE MIGHT GRONK
SKIPN LSTCHR
JRST NOBAK
REPEAT 4,<IBP PNEXTC
>
SOS PNEXTC
NOTENX <
NOBAK: PUSH P,12 ;SAVE TEMPORARILY
PUSH P,B
MOVE 12,[POINT 7,DLINBF] ;OUTPUT POINTER, PRINSYM WANTS HERE
MOVE A,SRCFIL ;PRINT FILE NAME
PUSHJ P,PRINSYM ;WITH THIS ROUT
MOVE TEMP,12 ;OUTPUT HERE FROM NOW ON
POP P,B
POP P,12
>;NOTENX
TENX <
NOBAK: PUSH P,B
MOVE TEMP,[POINT 7,DLINBF] ;OUTPUT POINTER
MOVE A,[POINT 7,SRCFLN] ;NAME, SET UP IN CC
PUSHJ P,ASCFIL ;COPY OVER, LEAVING UPDATED BP IN TEMP
POP P,B
>;TENX
MOVE D,FPAGNO
SETZM BKR ;DENOTE 0 AS BREAK CHAR
MOVE A,[POINT 7,[ASCII /, Page /]]
PUSHJ P,ASCFIL ;TELL HIM WHAT IT IS
PUSHJ P,DECFIL ;STUFF PAGE NUM IN BUFFER
MOVE A,[POINT 7,[<BYTE (7) 15,12>]] ;MAKE SPACE
PUSHJ P,ASCFIL
SETOM BKR ;BREAK ON 0, 177, OR 12
MOVE A,[POINT 7,ASCLIN] ;PREPARE TO OUTPUT LINE NO.
SKIPE (A)
PUSHJ P,ASCFIL ;DO IT
MOVE A,[POINT 7,[ASCII / /]]
PUSHJ P,ASCFIL
MOVE C,SCNWRD ;GET LIST CONTROL BITS
TLNN C,4000 ;IN A MACRO?
JRST NOMAC ;NO
HRRZ C,DFSTRT
MOVE C,2(C) ;PNEXTC AT THAT TIME
MOVEM C,FILBP ;ARROW CONTROL
MOVE A,IPLINE ;WHERE IT ALL BEGAN
PUSHJ P,ASCFIL ;DO THE LINE
SETZM BKR ;TEMP
MOVE A,[POINT 7,[BYTE (7) 15,12,12]]
PUSHJ P,ASCFIL ;GO TO NEXT LINE
SETOM BKR
MOVE A,[POINT 7,[ASCIZ / /]]
SKIPE ASCLIN ;IF PUT OUT LINE BEFORE,
PUSHJ P,ASCFIL ;MATCH IT
NOMAC: MOVE C,PNEXTC ;SAME FOR CURRENT LINE
MOVEM C,FILBP
MOVE A,PLINE
PUSHJ P,ASCFIL
;; \UR#8\ PUT A LINEFEED AFTER DISPLAYED LINE
MOVEI A,12
IDPB A,TEMP
;;
MOVEI A,0
IDPB A,TEMP ;MAKE INTO ASCIZ
SETZM FILBP ;PRECAUTION
;;%AI% 11/10/73 KVL STANDARDIZE ERROR PRINTING
MOVEI A,DLINBF ;PRINT (AND/OR LOG) MESSAGE
PUSHJ P,PRINT.
;; %AI%
POPOP: POP P,PNEXTC ;GET REAL ONE BACK
POPJ P,
↑.CORERR:ERR <NO CORE AVAILABLE>
COMMENT ⊗Interrupt Handler -- Intrpt, Povtrp⊗
DSCR POVTRP
CAL SYSTEM INTERRUPT
PAR JOBTPC is 1 past bad instr.
RES POVTAB(offending AC) is inspected for a string address.
If it is there, the string is TTYOUTed as an error, indicating
to the user which PDL oved. This is a fatal error message.
Continuation is in general quite futile.
⊗
;;%AY% -- REWORK TO USE THE RUNTIME ROUTINES
;;#GH# DCS 2-1-72 (5-5) <ESC>I CAUSES PARSER TO BREAK AFTER NEXT SCAN
NOTENX <
↑INTRPT:
NOEXPO <
;; RHT 2-12-73 INTMOD NOW DOES THE DISPATCH (%AY%)
;; MOVE TEMP,JOBCNI ;REASON
;; TLNN TEMP,INTTTI ;<ESC> I?
;; JRST POVDO ; NO, PDL OV
;; %AI% 11/10/73 KVL <ESC> I RESETS THE ERROR HANDLER
↑ITTYDO:
SETZM %QUIET
SETZM %ERGO ;MAKE THE NEXT ERROR VISIBLE
IFN FTDEBUG, <
MOVE TEMP,[XWD 400000,377777];INTERRUPT INDICATION
SETZM MULTP ;NOT IN MULTIPLE-PROCEED,
MOVEM TEMP,.DBG. ; IT IS GOING TO STOP
>;IFN FTDEBUG
CALL6 DISMIS ; OR ELSE COULD JUST RETURN
↑POVDO:
EXTERNAL XJBTPC
MOVE LPSA,GOGTAB ;
MOVE TEMP,XJBTPC ;REAL TRAP LOCN
MOVEM TEMP,UUO1(LPSA) ;"RETURN"
CALL6 (UWAIT) ;GET OUT OF MONITOR MODE, GET ACS
CALL6 (DEBREAK) ;"JRST" .+1
>;NOEXPO
;;#GH# (5-5)
EXPO <
;; IN THIS CASE, MUST SIMULATE A DEBREAK.
↑POVDO:
MOVE LPSA,GOGTAB ;
MOVE TEMP,JOBTPC ;REAL TRAP LOCN
MOVEM TEMP,UUO1(LPSA) ;"RETURN"
MOVEI TEMP,POVTRP ;WHERE GO TO
MOVEM TEMP,JOBTPC ;
POPJ P, ;THIS "DISMISSES" US
>;EXPO
;;%AY%
↑POVTRP: MOVEM TEMP,PDLSV ;SAVE ACS
MOVEM LPSA,PDLSV1
;;#GM# DCS 2-6-72 (1-1) WAS WIPING OUT TEMP WITH MOVEW
MOVE LPSA,GOGTAB ;NOW RECORD WHERE IT HAPPENED FOR ERR MSG
;;%AY% MOVEW UUO1(LPSA),JOBTPC -- USED TO BE
MOVE TEMP,UUO1(LPSA) ;CAREFULLY SET UP ABOVE
>;NOTENX
TENX <
;First the TENEX equivalent of <ESC>I - currently control H - which
;is copied somewhat blindly from DCS's code @ INTRPT above. The only
;other TENX switched code related to this is in SAILNIT where
;the compiler sticks the right vector into the channel table to direct
;the interrupt here and arm the control character (ATI jsys).
↑ITTYDO: SETZM %ERGO
SETZM %QUIET
SETZM MULTP
MOVEM TEMP,.DBG. ;SAVE TEMP
MOVE TEMP,[XWD 400000,377777] ;MAGIC NUMBER WORKS FOR DCS
EXCH TEMP,.DBG. ;OUGHT TO WORK FOR ME. RESTORE TEMP
JSYS DEBRK ;CONTINUE INTERRUPTED CODE
;Now for PDLOV stuff. Like <ESC I> requires SAIL init. to set up CHNTAB
;but in this case it MUST set it up as a level 3 interrupt or at least
;the same level assumed by the EXCH below. Also Stanford people beware
;of TENEX DEBRK which is just different enough from your DEBREAK to be
;confusing. See a JSYS manual.
EXTERNAL LPC3
↑POVDO: MOVEM TEMP,PDLSV
MOVEM LPSA,PDLSV1
HRRZI TEMP,.+3
EXCH TEMP,LPC3 ;ASSUME LEVEL 3. FORCE CONTINUATION
;OF INTERRUPTED CODE AT THE DEBRK+1
JSYS DEBRK
;BACK TO NORMAL USERMODE NOW; AC'S NOT CHANGED (I.E. SAVED OR RESTORED)
;THUS TEMP STILL HOLDS REAL INTERRUPT ADDR FOR PUTTING INTO JOBTPC
>;TENX
MOVEM TEMP,JOBTPC ;SO CODE BELOW WORKS (A REAL HACK)
;;#GM# (1-1) TEMP STILL HOLDS JOBTPC
LDB TEMP,[POINT 4,-1(TEMP),12] ;HOW DID IT HAPPEN?
ADDI TEMP,17 ;ADJUSTMENT
ANDI TEMP,17
ROT TEMP,-1 ;GET INDEX TO HALF-WORDS, LOW BIT TO SIGN
HRRZ LPSA,POVTAB(TEMP) ;ASSUME ODD -- RIGHT HAND
JUMPL TEMP,.+2 ;CORRECT
HLRZ LPSA,POVTAB(TEMP);EVEN -- WRONG
JUMPN LPSA,.+2 ;WAS THERE A CLUE?
MOVEI LPSA,[ASCIZ /UNKNOWN STACK/]
ERRPRI <PUSH-DOWN OVERFLOW -- > ;TELL HIM SOME
MOVE TEMP,PDLSV
EXCH LPSA,PDLSV1 ;RESTORE ACS
ERR. @PDLSV1 ;TELL HIM MORE
JRST 2,@JOBTPC ;IF HE SOMEHOW CONTINUES
BEND
USE ZVBLS
↑ZZZ←←.
USE VBLS
↑VVV←←.
USE
↑↑ZHI: ZZZ
↑↑VHI: VVV
BEND SAIL ;WOW
PATCH: BLOCK 50
VAR
XLIST
END START