Trailing-Edge
-
PDP-10 Archives
-
BB-BT99T-BB_1990
-
10,7/initia/initia.mac
There are 10 other files named initia.mac in the archive. Click here to see a list.
SUBTTL AUTHOR:P.CONKLIN /PMW/JNG/WLH/KPY/WCL/GMU/CDO/TARL/RCB
; OLD AUTHOR INITIALS:/RCC/DAL/PFC
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1970,1971,1972,1973,1974,1975,1976,1977,1978,1980,1982,1984,1985,1986,1987,1988,1989,1990.
;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.
SALL ; CLEAN ASSEMBLY LISTINGS
SEARCH INTPRM
PROLOG (INITIA)
COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1970,1990.
ALL RIGHTS RESERVED.
\;END OF COPYRIGHT MACRO
.REQUEST REL:HELPER ;LOAD LIBRARY MODULE
; JOB DATA AREA
INT137
SUBTTL INITIALIZATION
INITIA: TDZA F,F ;ALLOW FOR CCL ENTRY
MOVX F,F.NOHD!F.CCLC ;IF CCL CALL, SUPPRESS HEADER
RESET ;CLEAR THE WORLD
SETZB 1,ZER ;CLEAR OUT STORAGE
MOVE P,[ZER,,ZER+1]
BLT P,EZER-1
MOVE P,[1,,2]
BLT P,P
MOVE P,[IOWD L$PDL,PDL] ;INITIALIZE PUSH-DOWN LIST
MOVEI T1,L$SBLK+.NSAST ;GET THE LENGTH OF OUR GENERIC STRING BLOCK
MOVEM T1,STR8BK ;SETUP THE WORD COUNT HALFWORD
IFN <L$SBLK-L$TERM>,MOVEI T1,L$TERM+.NSAST ;GET THE LENGTH OF A TERMINAL STRING BLOCK
MOVEM T1,MYTERM ;SETUP THE WORD COUNT
IFN <L$TERM-L$NNAM>,MOVEI T1,L$NNAM+.NSAST ;GET THE LENGTH OF A NODE NAME BLOCK
MOVEM T1,MYNODE ;SETUP THE WORD COUNT
MOVEM T1,MYNUMB ; OF BOTH TYPES OF NODE NAMES
MOVE T1,[POINT 8,OUTPXX] ;BUFFER POINTER FOR DEBUGGING
MOVEM T1,OUTPXY ;SET FOR PIMGET
MOVX T1,OUTPXS ;THE SIZE COUNTER
MOVEM T1,OUTPXZ ;SAVE THAT, TOO
;NOW FIND SOME INITIAL SYSTEM VALUES
MOVX T1,%LDFFA ;GET [1,2]
GETTAB T1, ;PPN
MOVE T1,[1,,2] ;(DEFAULT)
MOVEM T1,FFAPPN ;SAVE FOR LATER
MOVX T1,%LDSYS ;GET SYS:
GETTAB T1, ; PPN
MOVE T1,[1,,1] ;LEVEL C?!?!?
MOVEM T1,SYSPPN ;SAVE FOR LATER
MOVX T1,%CNFLN ;FRCLIN GETTAB INDEX
GETTAB T1, ;GET FRCLIN TTY LINE NUMBER
SETO T1, ;OOPS - NO SUCH BEAST
TXO T1,.UXTRM ;FAKE IT INTO A UDX
MOVEM T1,FLNNUM ;REMEMBER FRCLIN NUMBER
GETPPN T1, ;GET THIS JOB'S PPN
JFCL ;(IN CASE OF JACCT)
MOVEM T1,MYPPN ;SAVE FOR LATER USE
PJOB T1, ;GET THIS JOB NUMBER
MOVEM T1,JOBN ;REMEMBER IT
MOVN T2,T1 ;NEGATIVE JOB NUMBER FOR JOBSTS TO
JOBSTS T2, ;GET THIS JOB'S STATUS
JRST [TXO F,F.NJBS ;INDICATE JOBSTS FAILED
MOVX T2,%LDHLP ;CAN'T TELL--GET
GETTAB T2, ;HELP PPN (UNLOGGED JOB)
MOVE T2,[2,,5] ; FROM SYSTEM
CAME T2,MYPPN ;SEE IF SAME
TXO F,F.LOGI ;NO--MUST BE LOGGED IN
JRST .+1] ;AND PROCEED
TXNE T2,JB.ULI ;SEE IF LOGGED IN YET
TXO F,F.LOGI ;YES. REMEMBER THAT
;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE
MOVX T1,%CNDTT ;DEFAULT TERMINAL TYPE
GETTAB T1, ;ASK THE MONITOR
MOVSI T1,'TTY' ;PRE-7.04
MOVEM T1,DEFTYP ;SAVE FOR CHECK ROUTINE
MOVX T1,%CNDVN ;GET THE MONITOR'S
GETTAB T1, ; VERSION NUMBER
SETZ T1, ;ASSUME NO VERSION?
ANDX T1,VR.VER ;MASK DOWN TO THE MAJOR VERSION NUMBER
CAMGE T1,[INSVL.(703,VR.VER)] ;IS IT A GOOD VERSION NUMBER?
TXO F,F.OLD ;NO, OLD MONITOR
MOVE T3,FFAPPN ;GET FULL-FILE-ACCESS (OPR) PPN
SETOM T1 ;-1 := PROGRAM'S CONTROLLING TTY
GETLCH T1 ;GET OUR LINE CHARACTERISTICS
MOVEM T1,SAVLCH ;REMEMBER FOR THOSE WHO CARE
HRRZ T2,T1 ;COPY OF JUST LINE INDEX
MOVEM T2,TERNUM ;REMEMBER TERMINAL UDX
MOVEM T2,TRMNUM ;ASSUME WANT OUR OWN TTY IN TYPTTY
CAMN T2,FLNNUM ;RUNNING ON FRCLIN?
TXO F,F.FLN ;YES, NOTE THAT FACT
TXNE F,F.FLN ;RUNNING ON FRCLIN?
JRST INITI2 ;YES
TXNN T1,GL.CTY ;ON THE CTY?
JRST INITI4 ;NO
TXNE F,F.LOGI ;ARE WE LOGGED IN?
CAMN T3,MYPPN ;YES, AS OPR?
TXOA F,F.CTY ;NOT LOGGED IN OR LOGGED IN AS OPR
JRST INITI4 ;LOGGED IN AS RANDOM USER, NO CTY-SPECIAL
INITI2: TXNN F,F.LOGI ;ALREADY LOGGED IN?
CHGPPN T3, ;NO, REALLY WANT PRIVILEGES (FOR HPQ OR FRCUUO)
JFCL ;OH WELL, BLUNDER ONWARDS
IFG CTYHPQ,< ;IF WANT TO RUN IN HPQ
MOVEI T3,CTYHPQ ;SELECT DESIRED HPQ
HPQ T3, ;AND ASK MONITOR FOR PREFERENTIAL TREATMENT
JFCL ;HOHUM
> ;END IFG CTYHPQ
INITI4: OPEN TTY,[UU.AIO+.IOAS8
SIXBIT /TTY/
XWD TTYOBF,0]
JRST LOGOF$ ;CAN NOT FIX THIS
MOVE T1,[BF.VBR+TTYBUF+1] ;SETUP BUFFER HEADER
MOVEM T1,TTYOBF ; TO POINT TO OUR
MOVE T1,[POINT 8,0,35] ; OVERSIZED TTY
MOVEM T1,TTYPNT ; BUFFER
MOVE T1,[L$TTBF+1,,TTYBUF+1]
MOVEM T1,TTYBUF+1 ;STORE POINTER IN BUFFER
MOVE T1,[PUSHJ P,LUUO] ;SET UP LOCATION 41
MOVEM T1,.JB41
;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE
MOVSI T1,'CTY' ; GET NODE,LINE FOR CENTRAL STATION
PUSHJ P,GTNTN$
HRRZM T1,NL.CTY
IORI T1,.UXTRM ;MAKE INTO A UDX
HRRZM T1,CTYNUM ;REMEMBER UDX FOR THE CTY
; NOW GET THE SIXBIT TTY NAME FOR THE CTY
TLZ T1,-1 ; CLEAR OUT THE NODE
PUSHJ P,CVTSIX ; CONVERT TO SIXBIT
LSH T1,-^D18 ; SHIFT NUMBER INTO RIGHT HALF
HRLI T1,'TTY' ; PLANT TTY
MOVEM T1,CTYTTY ; AND STORE AWAY FOR LATER
MOVE T1,['OPR0 '] ; GET NODE,LINE FOR CENTRAL OPR
PUSHJ P,GTNTN$
MOVEM T1,NL.OPR
GETLIN ME,0
MOVE WD,ME ; COPY THE TERMINAL NAME
PUSHJ P,XPNTTY ; EXPAND THE TERMINAL NUMBER
MOVEM WD,TRMNAM ; SAVE IT FOR LATER
MOVE T1,ME
PUSHJ P,GTNTN$
MOVEM T1,NL.ME
TLZ T1,-1 ; GET RID OF THE NODE NUMBER
PUSHJ P,CVTSIX ; CONVERT TO A SIXBIT NUMBER
HRRI T1,'TTY' ; FILL IN THE OTHER HALF WITH A NAME
MOVS WD,T1 ; COPY THE TERMINAL NAME
PUSHJ P,XPNTTY ; EXPAND THE NAME
MOVEM WD,TRMNNM ; SAVE THE NODE RELATIVE FLAVOR
MOVE T1,[.NOPNM+1,,.NOGDI] ; GET OUR NETOP. FUNCTION CODE AND ARG LENGTH
MOVEM T1,NOPBLK+.NOFCN; TO READ THE TERMINAL INFO
MOVEM ME,NOPBLK+.NODEV; STORE THE DEVICE NAME
XMOVEI T1,MYNODE ; GET STORAGE FOR THE NODE NAME STRING
MOVEM T1,NOPBLK+.NONOD; AND STORE IN THE NETOP. ARG BLOCK
XMOVEI T1,MYTERM ; GET THE STRING BLOCK FOR THE PORT ID
MOVEM T1,NOPBLK+.NOPNM; STORE IT TOO.
XMOVEI T1,NOPBLK ; POINT TO THE ARG BLOCK
NETOP. T1, ; GET OUR TERMINAL'S REAL NAME
JRST INITI3 ; ERROR, GO TRY OLD ANF WAY
MOVEI T1,MYNODE ; OK, POINT AT MY NODE NAME
PUSHJ P,GET826 ; CONVERT IT TO SIXBIT
MOVEM WD,MYNNAM ; STORE MY SIXBIT NODE NAME
MOVE T1,NOPBLK+.NOFLG; GET THE RETURNED FLAGS WORD
TXNE T1,NO.DCN ; IS THIS A DECNET LINE?
TXO F,F.DCNL ; YES, REMEMBER THAT
TXNN T1,NO.DCN!NO.LAT; ARE WE A FUNNY TERMINAL?
TXOA F,F.ANFL ; NO, ASSUME ANF
JRST INITI5 ; YES, DON'T GET A NUMERIC NODE NAME THEN
INITI3: HLRZ T1,NL.ME ; GET MY NODE NUMBER
PUSHJ P,CVTSIX ; CONVERT TO SIXBIT-LEFT JUSTIFIED
EXCH WD,T1 ; PUT THE WORD WHERE WE CAN COPY IT
MOVEI T1,MYNUMB ; POINT TO THE ASCII STORAGE BLOCK
PUSHJ P,GET628 ; GET AN ASCII VERSION OF THIS
EXCH T1,WD ; PUT THE NODE NAME BACK INTO T1
LSH T1,-^D18 ; SHIFT RESULT TO RIGHT HALF
HRLI T1,'OPR'
PUSHJ P,GTNTN$ ; GET OUR, POSSIBLY LOCAL, OPR
MOVEM T1,NL.LOP
TXOE F,F.ANFL ;ALREADY HAVE OUR NODE NAME SETUP?
JRST INITI5 ;YES, SKIP THIS
MOVE T2,[2,,T3] ; NODE. UUO ARGUMENT POINTER
MOVEI T3,2 ; COUNT
HLRZ T4,NL.ME ; MY NODE
NODE. T2,0
MOVE T2,['CENTRA']
MOVEM T2,MYNNAM ; SAVE SIXBIT NODE NAME
MOVE WD,T2 ;COPY THE NODE NAME
MOVEI T1,MYNODE ;POINT TO THE NODE NAME STRING BLOCK
PUSHJ P,GET628 ;CONVERT IT TO ASCII
HRRZ T1,NL.ME ;GET MY LINE NUMBER ON ANF NODE
PUSHJ P,CVTSIX ;CONVERT IT TO SIXBIT
HRRI T1,'TTY' ;MAKE IT INTO 'TTYNN' (SORT OF)
MOVS WD,T1 ;COPY THE TERMINAL NAME
MOVEI T1,MYTERM ;POINT TO THE STORAGE FOR THE ASCII VERSION
PUSHJ P,GET628 ;GET THE ASCII VERSION OF THE TERMINAL NAME
INITI5: MOVX T1,%CNSER ;GET APR
GETTAB T1, ; SERIAL
MOVEI T1,0 ; NUMBER
MOVEM T1,APRSN ;SAVE FOR LATER
MOVE T2,JOBN ;GET JOB NUMBER
IDIVI T2,^D36 ;COMPUTE WORD AND POSITION FOR MY JOB
MOVSI T1,(1B0) ;IN "JOB WAITING FOR HIGHSEG LOCK" TABLE
MOVNS T3 ;TO SPEED UP SYSTEM STARTUP
LSH T1,(T3) ;BY ONLY WAKING UP THE JOBS ACTUALLY
MOVEM T1,MYBIT ;WAITING, THIS PREVENTS LOTS OF
ADDI T2,JOBWAT ;JOBS FIGHTING FOR THE INTERLOCK
MOVEM T2,MYWRD
INIT.1: MOVE T2,TERNUM ;GET TERMINAL NUMBER
MOVEI T1,.TORSP ; GET RECEIVE SPEED
MOVE T3,[2,,T1]
TRMOP. T3,
SETO T3, ; IF FAILS, USE ONES
MOVEM T3,MYSPD
SUBTTL CODE TO HANDLE SPECIAL STARTUP CONDITIONS
MOVE T1,NL.ME ; GET OUR NODE/LINE
TXNE F,F.ANFL ; SKIP IF NOT ON AN ANF-10 LINE
TLNN T1,-1 ; NODE ZERO?
JRST NOTREM ; YES, CAN'T BE REMOTE OPR THEN
CAMN T1,NL.LOP ; AM I A REMOTE OPR?
CAMN T1,NL.OPR ; ..
JRST NOTREM ; NO
MOVEI T1,4 ;YES, MAKE SURE IT'S A REMOTE STATION
MOVE T2,MYNNAM ;OUR NODE NAME
SETZ T3, ;BLANK (RESERVED)
MOVEI T4,.TYMCR ;COMMAND PROCESSOR
MOVE T5,[.NDRCI,,T1] ;FUNCTION CODE FOR NODE.
NODE. T5, ;ASK
TLO T4,1 ;FAILED, CAN'T BE REMOTE OPR
TLNN T4,-1 ;DOES THIS NODE HAVE ANY COMMAND DECODERS?
TXO F,F.REMO ;NO, MUST BE REMOTE OPERATOR
;HERE TO SEE IF CALLED FROM FORCED .HELLO COMMAND OR
;IF NORMAL COMMAND WITH ARGUMENTS.
NOTREM: TLNE ME,-1 ;SEE IF DETACHED
TXNE F,F.CCLC ;OR IF CCL CALL
JRST INIC.6 ;RIGHT--NO RESCAN
;HERE TO SEE IF WE HAVE COMMANDS ON LINE
MOVEI T1,TTYIN ;SET FOR TTY INPUT
MOVEM T1,GETCH ; IN CHARACTER GETTER
RESCAN 1 ;RETRY LINE
SKPINL ;SEE IF SOMETHING THERE
JRST INIC.3 ;NOTHING--CHECK FOR FORCED CALL
TXO F,F.RTTY ;INDICATE COMMITMENT TO REEAT LINE
PUSHJ P,GETSIX ;SEE IF INITIA
CAIN CH,":" ;SEE IF DEVICE
JRST .-2 ;YES--TRY AGAIN
XOR WD,['INITIA'] ;SEE IF INITIA COMMAND
TDNN WD,T1 ; OR ABBREVIATION
JRST INIC.2 ;YES--GO SET FLAG
INIC.1: CAIN CH,"(" ;SEE IF THIS FORM
JRST INIC.2 ;YES--FLAG COMMAND
PUSHJ P,GETSIX ;NO--MOVE ON FOR (...) FORM
TXNE F,F.ECMD!F.EOF ;SEE IF END OF LINE YET
JRST INIC.6 ;YES--GIVE UP
JRST INIC.1 ;NO--LOOP ONWARDS
INIC.2: TXO F,F.ICMD ;SET COMMAND FLAG
JRST INIC.6 ;AND PROCEED
;HERE IF NO COMMAND IN INPUT BUFFER.
INIC.3: ;COULD CHECK FOR .HELLO HERE
TXNN F,F.LOGI ;SEE IF LOGGED IN
TXO F,F.ANSW ;NO--INDICATE ANSWER MODE
INIC.6:
;CONTINUED ON NEXT PAGE
SUBTTL MAIN PROGRAM--HANDLE COMMAND SCANNING AND DISPATCH
;CONTINUED FROM PREVIOUS PAGE
;HERE WHEN DONE WITH COMMAND ANALYSIS AND READY TO ISSUE
;THE SYSTEM SIGNON MESSAGE
INIS.0: SETZM GETCH ;CLEAR CHARACTER GETTER
;HERE TO LOOK FOR FILE SYS:TTY.INI
MOVSI T5,(UU.PHS) ;ASCII MODE, PHYSICAL ONLY.
MOVSI T6,'SYS' ;DEVICE SYS:
MOVEI T7,IBF ;POINT TO BUFFER HEADER
MOVSI T1,'TTY' ;FILE NAMED
MOVSI T2,'INI' ; TTY.INI[-]
SETZB T3,T4 ; ..
PUSHJ P,HILOOK ;LOOK IN HISEG OR ON DSK:
INTERR(TNF,<SYS:TTY.INI not found>,<JRST TYIN.2>)
MOVEI T1,FILINC ;SET FOR FILE INPUT
MOVEM T1,GETCH ; FOR CHARACTER GRABBER
TXZ F,F.ECMD!F.EOF!F.ALIN ;CLEAR SCANNING FLAGS
;HERE TO LOOP OVER LINES IN FILE TO FIND ONE FOR THIS TTY
TYIN.1: PUSHJ P,FILELC ;CONDITIONALLY DO THIS LINE
JUMPGE CH,TYIN.1 ;UNLESS EOF, LOOP THROUGH FILE
SETZM GETCH ;CLEAR CHARACTER GETTER
SETZM LOWPTR ;CLEAR PTR TO HISEG
TXNE F,F.LOGI ;ARE WE LOGGED IN?
SETZM FLCHEK ;YES--IGNORE CHECK FROM TTY.INI
TYIN.2: RELEAS TI, ;RELEASE FILE
;HERE TO LOOK FOR ENTRY IN DSK:SWITCH.INI[,]/PHY IF LOGGED IN
TXNN F,F.LOGI ;SEE IF LOGGED IN
JRST SWIN.3 ;NO--SKIP SWITCH.INI
MOVX T1,UU.PHS ;YES--SET /PHYSICAL
MOVSI T2,'DSK' ;DSK:
MOVEI T3,IBF ;BUFFER HEADER
OPEN TI,T1 ;OPEN
JRST SWIN.3 ;IGNORE IF CAN'T OPEN
MOVE T1,['SWITCH'] ;FILE
MOVSI T2,'INI' ; SWITCH.INI
MOVEI T3,0 ; ..
MOVE T4,MYPPN ; [,]
LOOKUP TI,T1 ;GET FILE
JRST SWIN.3 ;IGNORE IF NOT THERE
MOVEI T1,FILINC ;SET FOR FILE INPUT
MOVEM T1,GETCH ; FOR CHARACTER GRABBER
TXZ F,F.ECMD!F.EOF!F.ALIN ;CLEAR SCANNING FLAGS
;HERE TO LOOP OVER LINES IN FILE TO FIND ONE FOR INITIA THIS TTY
SWIN.1: PUSHJ P,GETSIX ;GET FIRST WORD OF LINE
CAME WD,['INITIA'] ;SEE IF FOR INITIA
JRST [PUSHJ P,FILELS ;NO--SKIP LINE
JRST SWIN.2] ;AND FINISH LINE
CAIE CH,":" ;YES--SEE IF OPTION
JRST [PUSHJ P,FILELN ;NO--ASSUME ALL
JRST SWIN.2] ;AND FINISH LINE
PUSHJ P,FILELC ;YES--DO IF THIS TTY
SWIN.2: JUMPGE CH,SWIN.1 ;LOOP TO EOF
SETZM GETCH ;CLEAR CHARACTER GRABBER
SWIN.3: RELEAS TI, ;FREE CHANNEL
;HERE TO LOOK FOR THIS PROCESSOR S/N IN TABLE
PUSHJ P,DOCMD ;GO HANDLE COMMAND LINE
PUSHJ P,DOTTYS ;GO DO TTY SETUP
TXNE F,F.FLN ;FRCLIN?
JRST INIF.0 ;YES, START DUMPING STUFF DOWN FRCLIN
SKIPE T1,JUMPPR ;SEE IF PROCESSOR SET
JRST (T1) ;YES--GO DO THAT
MOVE T1,APRSN ;GET APR S/N
MOVSI T2,-APRTBL ;INITIALIZE FOR SEARCH ON APR S/N
CAME T1,APRTAB(T2) ;TEST FOR MATCH
AOBJN T2,.-1 ;NO--LOOP UNTIL DONE
;IF NOT FOUND, USE CATCHALL SET
;HERE TO LOOK THROUGH SPECIAL PROCESSING TABLE
HRRZ T3,APRTBV(T2) ;GET ADDRESS OF JUMP TABLE
HLRZ T2,APRTBV(T2) ;GET ADDRESS OF NAME TABLE
HRLI T2,T1 ;ADD INDEXING
HRLI T3,T1 ; ..
MOVSI T1,-SPTABL ;INITIALIZE FOR SEARCH ON NAME
TTYS.1: SKIPN T4,@T2 ;FETCH TTY NAME, CHECK FOR END
JRST NOTFND ;END OF TABLE
CAME ME,T4 ;TEST FOR MATCH
AOBJN T1,TTYS.1 ;NO--LOOP UNTIL DONE
JUMPGE T1,NOTFND ;YES--IF NOT FOUND, GIVE UP
HLRZ T2,@T3 ;SEE IF ANY TTY SET-UP NEEDED
SKIPE T2 ;NO--SKIP
PUSHJ P,(T2) ;YES--SEND IT VIA SPECIAL ROUTINES
HRRZ T2,@T3 ;GET SPECIAL PROCESSOR
JUMPN T2,(T2) ;GO TO IT IF NEEDED
;HERE IF NO SPECIAL PROCESSING REQUESTED IN TABLES
;SEE IF DEVICE OPR:, IF SO, BRING UP OPSER IN CCL MODE.
;THIS WILL CAUSE OPSER TO READ THE AUTO FILE AUTOMATICALLY.
NOTFND: MOVX T1,%CNOPR ;GET NAME OF
GETTAB T1, ; DEVICE OPR:
JRST GEN ; IGNORE IF UNKNOWN
TXNN F,F.REMO ;YES--SEE IF REMOTE OPR
CAMN T1,ME ;NO--SEE IF LOCAL OPR
JRST OPSER1 ;YES--GO DO OPSER CCL
;HERE FOR NON-INTERESTING TERMINAL
GEN: MOVX T1,%CNSTS ;GET SYSTEM STATES
GETTAB T1, ; FROM MONITOR
MOVEI T1,0 ;(ASSUME OK)
TXNN T1,ST%BON!ST%NRL!ST%NLG ;IF LOGIN ALLOWED,
TXNE F,F.LOGI ;SEE IF MIGHT WANT TO LOGIN
JRST GEN.4 ;NO--JUST FINISH UP
TTYSTR [ASCIZ \Please LOGIN\]
TXNE F,F.NJBS ;SEE IF JOBSTS WORKED
JRST GEN.2 ;NO--SKIP THIS LOGIC
MOVEI T1,1 ;YES--START AT JOB 1
GEN.1: MOVE T2,T1 ;GET THIS JOB NUMBER
TRMNO. T2, ;GET ITS TERMINAL
JRST [JUMPN T2,GEN.2 ;FAILED--IF NO ANSWER, GIVE UP
MOVN T2,T1 ;GET JOB
JOBSTS T2, ;GET ITS STATUS
JRST GEN.3 ;OK IF NONE
HRLZ T3,T1 ;GET JOB NUMBER
HRRI T3,.GTPPN ;GET ITS PPN
GETTAB T3, ;(FROM MONITOR)
MOVEI T3,0 ; ..
CAME T3,FFAPPN ;UNLESS [1,2],
JUMPL T2,GEN.2 ; IF DETACHED, ISSUE MESSAGE
JRST .+1] ;ELSE, CONTINUE LOOP
AOJA T1,GEN.1 ;LOOP
GEN.2: TTYSTR [ASCIZ / or ATTACH/]
GEN.3: TTYSTR CRLFM
GEN.4: JRST KILJOB ;JUST TYPE SYSTEM START-UP MESSAGE
; AND RETURN TO MONITOR
SUBTTL FRCLIN PROCESSING
;HERE TO FIND SYS:SYSJOB.INI AND FORCE IT DOWN FRCLIN'S THROAT
INIF.0: CTYSTR [ASCIZ\[FRCLIN INITIA: running]
\] ;LEAVE INCONTESTABLE TRACKS
RELEAS TTY, ;LEGGO OF TTY (AKA FRCLIN)
MOVSI T1,-1 ;-1,,0 = DETACH
ATTACH T1, ;DETACH FROM FRCLIN
JRST [CTYSTR [ASCIZ\?FRCLIN INITIA: Unable to DETACH from FRCLIN
\]
JRST LOGO1$] ;SLIP BACK INTO THE CRACKS
PUSHJ P,ACCT$ ;GO SET THE ACCOUNT STRING
CTYSTR [ASCIZ\%FRCLIN INITIA: Unable to set account string for TTY STOMPER
\] ;COMPLAIN IF ERRORS HERE
MOVE T1,[-4,,T2] ;I'M DETACHED, ITS SAFE TO LOG IN AS [1,2]
MOVE T2,FFAPPN ;PPN WE ARE GOING TO LOGIN TO. (OPR JOB)
MOVX T3,%CNPRV ;GET THE PRIVILEGE
GETTAB T3, ; BITS THAT WE'RE ALLOWED
MOVSI T3,-1 ;ERROR? DEC PRIVS ONLY,
DMOVE T4,[SIXBIT /TTY STOMPER/] ;USER NAME, MNEMONIC FOR JOB
LOGIN T1, ;LOG US IN, TO KEEP US SAFE FROM PROGRAMS
;THAT DESTROY LOGGED OUT JOBS
; JFCL ;Documentation claims this is an error return.
MOVE T1,[.STUVM,,[^D16384,,^D16384]] ;SET THE PHYSICAL AND VIRTUAL
SETUUO T1, ; PAGE LIMITS FOR THIS JOB
SKIPA T1,[.STUVM,,[^D512,,^D512]] ;FAILED? TRY LOWER LIMITS
SKIPA ;OK, GO ON
SETUUO T1, ;TRY TO SET THE LOWER LIMITS
JFCL ;NOT REALLY THAT IMPORTANT I GUESS
MOVSI T5,(UU.PHS) ;PHYSICAL ONLY SYS
MOVSI T6,'SYS'
MOVEI T7,IBF ;THE INPUT BUFFER
MOVE T1,[SIXBIT/SYSJOB/]
MOVSI T2,'INI' ;THE FILE TO READ
SETZB T3,T4 ;REST OF THE LOOKUP BLOCK
SETZM LOWPTR ;IN CASE JUNK THERE
OPEN TI,T5 ;OPEN DEVICE FOR SYSJOB
JRST INIF.1 ;SYS ISN'T THERE? LOSE.
LOOKUP TI,T1 ;FIND SYSJOB.INI
JRST INIF.1 ;HMM. TELL CTY WE CAN'T FIND SYSJOB
TXZ F,F.EOF ;HAVEN'T SEEN EOF YET
SETZM FLNPNT ;NEED TO INIT BYTE STUFFER
SETO T7, ;SET THE INITIAL STATE FOR LOOKING FOR "LOG"
MOVEI CH,.CHCNC ;A CONTROL-C TO START THINGS OFF WITH A BANG
TXO F,F.ECMD ;"EOL"
JRST INIF.5 ;ENTER SYSJOB.INI LOOP
INIF.1: CTYSTR [ASCIZ\%FRCLIN INITIA: Can't read SYS:SYSJOB.INI
\]
JRST TTWINI ;KEEP GOING
;LOOP SENDING SYSJOB.INI TO FRCLIN
INIF.3: PUSHJ P,FILIN ;GET ANOTHER CHARACTER
SKIPA ;EOL OR EOF. SEE WHICH
JRST INIF.5 ;NORMAL CHARACTER, STUFF IT
TXNN F,F.OLD ;IF OLD MONITOR, END OF LINE MEANS END OF CMD
SKIPGE CH ;END OF FILE?
TXO F,F.ECMD ;YES, SAY SO.
MOVEI CH,.CHCRT ;GET EOL INDICATOR
;HERE WITH CHARACTER IN CH FOR FRCLIN
INIF.5: SKIPN FLNPNT ;READY FOR CHARACTERS?
JRST [MOVEI T1,FLN$MX-1 ;MAXIMUM BYTE COUNT
TXNE F,F.OLD ;OLD MONITOR?
MOVEI T1,FLO$MX-1 ;YES, GET OLD MAXIMUM BYTE COUNT
MOVEM T1,FLNCNT ;SET THAT FOR CHAR LOOP
MOVE T1,[POINT 7,FLNBUF] ;INITIAL BYTE POINTER
MOVEM T1,FLNPNT ;SET FOR CHAR LOOP
TXNN F,F.OLD ;NOT IF OLD MONITOR
SKIPG T7 ;DID WE FIND "<CR>LOG"?
JRST .+1 ;NO, JUST CONTINUE WITH THIS CHARACTER
MOVEI T1,FLN$MX-4 ;YES, SAY WE ATE FOUR CHARACTERS
MOVEM T1,FLNCNT ;STORE THE NEW BYTE COUNT
MOVE T1,[POINT 7,FLNBUF,20] ;GET THE CORRECT BYTE POINTER
MOVEM T1,FLNPNT ;STORE THE NEW BYTE POINTER
MOVE T1,[ASCII \LOG\] ;GET THE CHARACTERS WE ATE
MOVEM T1,FLNBUF ;PUT THEM IN THE BUFFER
JRST .+1] ;CONTINUE WITH CHARACTER
IDPB CH,FLNPNT ;STASH THIS CHARACTER
CAIL CH,"a" ;IS THIS CHARACTER
CAILE CH,"z" ; LOWER CASE?
SKIPA ;NO, GO ON
SUBI CH,"a"-"A" ;YES, MAKE IT UPPER CASE NOW
CAIN CH,.CHCRT ;IS THIS AN EOL?
SETO T7, ;YES, WE'RE ALWAYS WILLING TO FIND AN EOL
CAMN CH,[EXP .CHCRT,"L","O","G"]+1(T7) ;IS IT WHAT WE'RE LOOKING FOR NOW?
XCT [AOSA T7 ;YES, INCREMENT THE STATE
AOSA T7
AOSA T7
JRST [TXNE F,F.OLD ;IF OLD MONITOR,
JRST .+1 ;DON'T DO IT
TXO F,F.ECMD ;END OF STRING. SAY END OF COMMAND TOO
MOVEM T6,FLNPNT ;RESET THE BUFFER POINTER TO BEFORE COMMAND
JRST INIF.4]]+1(T7) ;SEND THE STRING
SETO T7, ;NO MATCH, RESET THE STATE
SKIPN T7 ;JUST MOVE TO STATE ZERO?
MOVE T6,FLNPNT ;YES, SAVE THE STORAGE POINTER
SOSLE FLNCNT ;IF BUFFER FULL,
TXNE F,F.ECMD ;OR IF EOL
CAIA ;EOL, OR BUFFER FULL
JRST INIF.3 ;WANT MORE CHARACTERS
;TYPE THE CHARACTER STRING INTO FRCLIN AS A COMMAND
INIF.4: MOVEI T4,0 ;A NULL
IDPB T4,FLNPNT ;ASCIZIZE THE STRING
MOVEI T4,FLNBUF ;THE BUFFER/STRING ADDRESS
MOVE T3,FLNNUM ;FRCLIN UDX
MOVEI T2,.TOTYP ;"TYPE" FUNCTION
MOVE T1,[3,,T2] ;TRMOP. ARG POINTER TO
TRMOP. T1, ;TYPE INTO FRCLIN
JRST [CTYSTR [ASCIZ\?FRCLIN INITIA: Error typing SYSJOB.INI into FRCLIN
\]
JRST TTWINI] ;KEEP GOING
SETZB T4,FLNPNT ;RESET BYTE POINTER
TXZN F,F.ECMD ;WAS THAT EOL, OR LONG LINE?
JRST [CTYSTR [ASCIZ \%FRCLIN INITIA: FRCLIN command too long
\] ;LONG LINE, JUST WARN ABOUT IT
SETO T7, ;RESET THE STATE
JRST INIF.3] ;GO GET THE REST OF THIS BUNCH
TXZE F,F.EOF ;EOL, ANY MORE FILE TO DO?
JRST TTWINI ;NO, JUST SLIP AWAY
TXNE F,F.OLD ;IF OLD MONITOR,
SETO T7, ;DON'T ALLOW THE "<CR>LOG" HACK
MOVEI T2,.TOTTC ;SKIP IF INPUT IN PROGRESS
INIF.8: MOVE T1,[2,,T2] ;TRMOP. ARG POINTER TO
TRMOP. T1, ;SEE IF INPUT IN PROGRESS ON FRCLIN
JRST INIF.9 ;THIS CAN'T FAIL.
JUMPE T1,INIF.3 ;WHEN INPUT BUFFER EMPTY, GIVE HIM MORE
SLEEP T4, ;WAIT TWO TICS
JRST INIF.8 ;SEE IF READY YET
INIF.9: CTYSTR [ASCIZ \%FRCLIN INITIA - Problem checking FRCLIN buffer
\]
JRST LOGO2$ ;QUIT
;HERE WHEN SYSJOB.INI HAS BEEN STUFFED DOWN FRCLIN'S THROAT.
;NOW WATCH FOR OPEN TTY LINES BOGGING DOWN THE SYSTEM, IF SO DESIRED.
TTWINI:
IFLE TTWMAX,<JRST LOGO2$> ;NO STOMPR DESIRED, GO AWAY.
IFG TTWMAX,<
SKIPN TTWFLG ;START UP STOMPR?
JRST [CTYSTR [ASCIZ \%%TTY STOMPER - Not starting
\]
JRST LOGO2$]
RELEASE TI, ;LET GO OF ANYTHING ON THIS CHANNEL, SINCE
;WE ARE GOING TO BE AROUND FOREVER.
CTYSTR [ASCIZ \%%TTY STOMPER - Starting
\]
MOVE T1,[SIXBIT \STOMPR\] ;SET NAME TO SOMETHING RECOGNIZABLE.
SETNAM T1, ;(SINCE WE DON'T NEED JACCT ANY MORE)
MOVE T1,[%FTDEB] ;GETTAB TABLE WITH FTRSP IN IT
GETTAB T1, ;FIND OUT THIS SET OF FEATURE TESTS
SKIPA ;FAIL
TRNN T1,F%RSP&777777 ;DO WE HAVE FTRSP?
JRST [CTYSTR[ASCIZ\?TTY STOMPER - FTRSP is turned off, aborting
\]
JRST LOGO2$]
SKIPE TTWPCT ;GOT POINTERS?
JRST TTWIN0 ;YES
AOS T1,.JBREL ;CALCULATE START ADDRESS OF CHAR COUNT BUFFER
HRLI T1,(<1B0 (T7)>) ;SO INDIRECT INDEXES OFF OF T7
MOVEM T1,TTWPCT ;SET LINE-INDEXED CHAR COUNT POINTER
ADD T1,NL.CTY ;ALLOW FOR ALL POSSIBLE TTY'S
MOVEM T1,TTWPTM ;SET LINE-INDEXED COUNT TIMER
ADD T1,NL.CTY ;ALLOW FOR ALL POSSIBLE TTY'S
MOVEM T1,TTWPRS ;SET LINE-INDEXED CHANNEL,,RECEIVE SPEED
ADD T1,NL.CTY ;ALLOW FOR ALL POSSIBLE TTY'S
MOVEM T1,TTWP2R ;SET LINE-INDEXED TWICE-IN-A-ROW FLAG
ADD T1,NL.CTY ;T1 := FIRST ADDRESS PAST LAST DESIRED ADDRESS
TLZ T1,-1 ;CLEAR JUNK OUT OF LEFT HALF
MOVEM T1,.JBFF ;NOTIFY .JBFF OF HAVING GRABBED MEMORY
SUBI T1,1 ;T1 := LAST DESIRED ADDRESS
CORE T1, ;EXPAND MEMORY AS NEEDED FOR BUFFERS
JRST [CTYSTR [ASCIZ\?TTY STOMPER - Memory expansion failure
\]
JRST LOGO2$] ;GO AWAY
;MAP LINTAB AND LDBS IN, SO WE DON'T HAVE TO EXPEND UUOS.
MOVE T1,[%CNLNP] ;POINTER TO LINTAB
GETTAB T1, ;ASK MONITOR FOR POINTER
JRST [CTYSTR[ASCIZ\?TTY STOMPER - Gettab failed
\]
JRST LOGO2$]
HRRZS T2,T1 ;CLEAR LEFT HALF, COPY ADDRESS
ADD T2,NL.CTY ;POINT TO END OF LINTAB
LSHC T1,-9 ;CONVERT TO PAGE NUMBERS
HLRZ T4,T2 ;COPY OFFSET WITHIN PAGE TO LINTAB
SUBI T1,1(T2) ;CONVERT TO NUMBER OF PAGES
ADDI T2,1(T1) ;POINT TO STARTING PAGE
HRLZ T2,T2 ;PUT IN LEFT HALF AS MONITOR SOURCE ADDRESS
HRRI T2,LNTPAG ;PAGE IN OUR ADDRESS SPACE
MOVE T3,[.PAGSP,,T1] ;ARG FOR PAGE UUO
PAGE. T3, ;MAP IN LINTAB
JRST [CTYSTR[ASCIZ\?TTY STOMPER - PAGE. to map LINTAB failed
\]
JRST LOGO2$] ;GO AWAY.
HRLI T4,LNTPAG ;OUR PAGE FOR LINTAB
LSH T4,-9 ;RIGHT JUSTIFY
HRLI T4,(<1B0(T7)>) ;MAKE IT AN INDIRECT POINTER
MOVEM T4,LINTAB ;ESTABLISH POINTER TO LINTAB
;MAP LDBS
SETZ T7, ;GET ZEROETH LDB
MOVE T1,@LINTAB ;GET POINTER TO FIRST LDB
TXNE F,F.OLD ;OLD MONITOR?
TLZ T1,-1 ;YES, GET RID OF JUNK
MOVE T7,NL.CTY ;NUMBER OF LDBS
SUBI T7,1 ;POINT TO LAST
MOVE T2,@LINTAB ;GET LAST LDB
TXNE F,F.OLD ;OLD MONITOR?
TLZ T2,-1 ;YES, GET RID OF JUNK AGAIN
LSHC T1,-9 ;CONVERT TO PAGE NUMBERS
SUBI T1,1(T2) ;CONVERT TO NUMBER OF PAGES
ADDI T2,1(T1) ;CONVERT TO STARTING PAGE
HRLZ T2,T2 ;PUT IN LEFT HALF AS MONITOR SOURCE PAGE
HRRI T2,LDBPAG ;PAGE IN OUR ADDRESS SPACE
MOVE T4,T2 ;SAVE FOR LATER
MOVE T3,[.PAGSP,,T1] ;ARG FOR PAGE UUO
PAGE. T3, ;ASK FOR THE PAGES
JRST [CTYSTR[ASCIZ\?TTY STOMPER - PAGE. to map LDBs failed
\]
JRST LOGO2$] ;GO AWAY
HLRZ T1,T4 ;MONITOR'S PAGE
SUBI T1,(T4) ;MINUS OUR PAGE
ASH T1,9 ;CONVERT TO ADDRESS (OFFSET)
MOVEM T1,LDBOFF ;SAVE AS OFFSET FROM LDB ADDR TO VIRTUAL ADDR
TTWIN0: HRRZ T8,NL.CTY ;LAST PHYSICAL TTY IN SYSTEM
MOVNI T8,-1(T8) ;(NEGATIVE) LAST "USER" TTY IN SYSTEM
HRLZ T8,T8 ;T8 := MASTER AOBJN INDEXER FOR TTW LOOP
;FIRST MAKE A PASS OVER THE TTY LINES GETTING BASE VALUES
TTWIN2: MOVE T7,T8 ;COPY OF AOBJN INDEXER
TTWIN3: MOVEI T3,.UXTRM(T7) ;TTY UDX
MOVEI T2,.TOICT ;TOTAL INPUT CHARACTER COUNT
MOVE T1,[2,,T2] ;TRMOP. ARG POINTER TO
TRMOP. T1, ;READ TERMINAL INPUT CHARACTER COUNT
SETZ T1, ;FAILED? ASSUME 0
MOVEM T1,@TTWPCT ;SAVE COUNT FOR THIS LINE
MSTIME T4, ;TIME OF DAY (MILLISECONDS)
MOVEM T4,@TTWPTM ;REMEMBER WHEN THE LAST COUNT WAS TAKEN
SKIPE @TTWPRS ;BETTER NOT HAVE ANY LINES HANGING AROUND
HALT .+1 ;OH WELL
SETZM @TTWPRS ;CLEAR NEED-TO-GRAB FLAG
SETZM @TTWP2R ;CLEAR TWICE-IN-A-ROW FLAG
AOBJN T7,TTWIN3 ;LOOP FOR ALL REAL TTY'S
MOVX T1,%SCNRI ;GETTAB INDEX TO
GETTAB T1, ;READ TOTAL SYSTEM CHARACTER COUNT
JRST LOGO2$ ;DON'T BOTHER
MOVEM T1,TTWNRI ;SAVE LAST TOTAL SYSTEM COUNT
MOVEM T4,TTWNTM ;AND THE TIME IT WAS SAMPLED
;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE
;NOW CHECK ONCE A MINUTE FOR LINES RUNNING OPEN
TTWSL:
MOVEI T1,TTWSLP ;SLEEP INTERVAL
SLEEP T1, ;A (YAWN) QUICK NAP
TTWSL2: MOVX T1,%SCNRI ;GETTAB ITEM TO
GETTAB T1, ;OBTAIN SYSTEM CHARACTERS RECEIVED
JFCL ;CAN'T HAPPEN
SUB T1,TTWNRI ;T1 := INCREMENTAL CHARACTER COUNT
ADDM T1,TTWNRI ;ACCUMULATE TOTAL
MSTIME T4, ;GET CURRENT TIME OF DAY
SUB T4,TTWNTM ;T4 := MILLISECONDS SINCE LAST SAMPLE
ADDM T4,TTWNTM ;KEEP TOTAL UP TO DATE
JUMPLE T4,TTWIN2 ;IF WRAPPED PAST MIDNIGHT, RESET
IMULI T1,^D1000 ;ALLOW FOR UNITS CONVERSION
IDIVI T1,(T4) ;T1 := SYSTEM CHARACTERS PER SECOND THIS SAMPLE
HRRZ T2,NL.CTY ;NUMBER OF PHYSICAL TTY'S POSSIBLE
ASH T2,-4 ;SCALE IT DOWN
SKIPE TTWILC ;INIT'ED LINE COUNT ZERO?
JRST TTWCHN ;NO--GO POLL
CAMGE T1,T2 ;SEEING MUCH TTY ACTIVITY?
JRST TTWSL ;NO
TTWCHN: SETZM TTWILC ;RESET INIT'ED LINE COUNT
MOVEI T5,20 ;FIRST CHANNEL WE USE
TTWCH0: CAMLE T5,TTWMCN ;PAST HIGHEST CHANNEL YET?
JRST TTWSP ;YUP - GO AND CHECK FOR NEW OPEN LINES.
HRLZ T2,T5 ;GET COPY OF CHANNEL NUMBER
HRRI T2,.FOGET ;FUNCTION CODE TO FILOP
MOVE T1,[XWD 1,T2] ;1 WORD, AND IT IS IN T2
FILOP. T1, ;GET STATUS OF THIS DEVICE
AOJA T5,TTWCH0 ;NOTHING THERE, TRY NEXT CHANNEL
AOS TTWILC ;COUNT THE INIT'ED LINE
TRNE T1,IO.ERR ;ANY ERROR ON IT?
JRST TTWDET ;YES, LET GO OF THIS TTY
MOVE T2,T5 ;GET THE CHANNEL NUMBER
IONDX. T2, ;GET THE UDX FOR THE CHANNEL
AOJA T5,TTWCH0 ;LOST. IGNORE THIS CHANNEL.
HRRZI T7,-.UXTRM(T2) ;COPY THE TERMINAL'S NUMBER FOR INDEXING
MOVEI T1,.TOICT ;NUMBER OF CHARACTERS SEEN (SHOULD BE 0)
MOVE T4,[2,,T1] ;ARG FOR TRMOP.
TRMOP. T4, ;GET NUMBER OF CHARACTER SINCE LAST TIME
MOVE T4,@TTWPCT ;IF WE CAN'T, ASSUME NO CHARACTERS
CAMG T4,@TTWPCT ;DID WE GET ANYTHING?
AOJA T5,TTWCH0 ;NOPE - IGNORE THIS TERMINAL
MOVEI T1,.TOCIB ;CLEAR INPUT BUFFER
MOVE T4,[2,,T1] ;ARG FOR TRMOP
TRMOP. T4, ;CLEAR HIS INPUT BUFFER
AOJA T5,TTWCH0 ;NO CAN DO, MONITOR IS CONFUSED
MOVEI T1,.TORSP ;GET THE RECEIVE SPEED.
MOVE T4,[2,,T1] ;ARG FOR TRMOP.
TRMOP. T4, ;GET THE RECEIVE SPEED FOR THIS TERMINAL
AOJA T5,TTWCH0 ;THE MONITOR IS CONFUSED, IGNORE HIM.
JUMPE T4,TTWCH1 ;SPEED IS ALREADY ZERO. CAN'T HELP THIS.
SETZ T3, ;MAKE HIS SPEED 0
ADDI T1,.TOSET ;SET FUNCTION.
MOVE T4,[3,,T1] ;ARG FOR TRMOP UUO.
TRMOP. T4, ;ZAP HIS SPEED.
AOJA T5,TTWCH0 ;THIS CANNOT HAPPEN. (KNOCK ON WOOD)
CTYSTR [ASCIZ \%TTY STOMPER: Zero-bauded line at \]
PUSHJ P,TTCNOD ;TYPE NODE SPECIFICATION FOR TTY ON CTY
TTWCH1: MOVE T7,T2 ;LETS CLEAN THAT TTY A BIT.
TRZ T7,777000 ;LEAVE ONLY THE LINE NUMBER.
PUSHJ P,TTWTCL ;CLEAN UP INPUT AND OUTPUT.
AOJA T5,TTWCH0 ;AND GO ON TO THE NEXT TERMINAL
TTWDET: MOVE T3,T5 ;GET COPY OF CHANNEL
RESDV. T3, ;RELEASE THE CHANNEL.
JFCL ;NO ERROR RECOVERY HERE.
SOSGE TTWILC ;COUNT DOWN NUMBER OF INIT'ED LINES
SETZM TTWILC ;BE REASONABLE
AOJA T5,TTWCH0 ;TRY NEXT CHANNEL
;NOW SEE IF ANY LINES ARE BEHAVING OBNOXIOUSLY
TTWSP: MOVE T7,T8 ;RESET LINE INDEXER
SETZ T6, ;OPEN LINES FLAG
TTWSP1: MOVE T1,@LINTAB ;GET LINTAB ENTRY FOR THIS TTY
SUB T1,LDBOFF ;CONVERT TO USER VIRTUAL ADDRESS
HRRZ T1,0(T1) ;GET DDB ADDRESS
JUMPN T1,[SETOM @TTWPTM ;FLAG DDB OCCUPIED
SETZM @TTWP2R ;NOT SECOND TIME IN A ROW
JRST TTWSP2] ;AND JOIN COMMON CODE
MOVEI T3,.UXTRM(T7) ;TTY UDX
MOVEI T2,.TOICT ;TOTAL INPUT CHARACTER COUNT
MOVE T1,[2,,T2] ;TRMOP. ARG POINTER TO
TRMOP. T1, ;SEE HOW MANY CHARACTERS THIS LINE HAS SEEN
MOVE T1,@TTWPCT ;DUH? ASSUME NO CHANGE
MSTIME T4, ;TIME OF DAY
SKIPGE @TTWPTM ;MAKE SURE WE COUNTED LAST TIME THROUGH.
JRST [MOVEM T1,@TTWPCT ;WE DIDN'T, SET THINGS UP NOW
MOVEM T4,@TTWPTM
SETZM @TTWP2R
JRST TTWSP2] ;AND FALL INTO COMMON CODE.
SUB T1,@TTWPCT ;T1 := COUNT OF CHARACTERS SINCE LAST TIME
ADDM T1,@TTWPCT ;UPDATE TOTAL FOR NEXT ITERATION
SUB T4,@TTWPTM ;T4 := MILLISECONDS ELAPSED TIME
ADDM T4,@TTWPTM ;UPDATE TOTAL FOR NEXT ITERATION
JUMPLE T4,TTWIN2 ;IF WRAPPED AROUND MIDNIGHT, RESET EVERYTHING
JUMPLE T1,[SETZM @TTWP2R ;NOT SECOND TIME IN A ROW
JRST TTWSP2] ;IF NO INPUT ACTIVITY THEN TTY IS OK
IMULI T1,^D1000 ;SAME MULTIPLE AS TIME OF DAY
IDIVI T1,(T4) ;T1 := CHARACTERS PER SECOND
CAIL T1,TTWMAX ;SEEING "LOTS" OF ACTIVITY
SETOB T6,@TTWPRS ;FLAG TO STOMP ON THIS TTY
CAIGE T1,TTWMAX ;IF NOT MUCH ACTIVITY,
SETZM @TTWP2R ;THEN NOT SECOND TIME IN A ROW
TTWSP2: AOBJN T7,TTWSP1 ;SEE WHAT ELSE IS RUNNING OPEN
JUMPE T6,TTWSL ;IF NO LIKELY CANDIDATES, GO BACK TO SLEEP
;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE
;AT LEAST ONE LIKELY CANDIDATE, SEE IF RUNNING OPEN, AND STOMP ON IT IF SO
MOVE T7,T8 ;RESET AOBJN INDEXER
TTWSP4: SKIPN T1,@TTWPRS ;WANT TO CHECK THIS LINE?
JRST TTWSP7 ;NO
EXCH T1,@TTWP2R ;YES, NOTE WE GOT HERE AND CHECK IF 2ND TIME
JUMPE T1,TTWSP7 ;DO NOTHING UNLESS GET HERE TWICE IN A ROW
HRRZ T1,T7 ;YES, GET LINE NUMBER
PUSHJ P,CVTSIX ;MAKE SIXBIT NNN
IORI T1,'TTY' ;MAKE INTO TTY NAME (SWAPPED)
MOVS T3,T1 ;PHYSICAL NAME OF THE TERMINAL
SETZ T4, ;NO BUFFERS
MOVX T2,UU.PHS+IO.SUP+.IOASC;NO ECHO, BUT ALLOW ^C
MOVE T1,[FO.PRV!FO.ASC+.FORED] ;"OPEN" FILOP. FUNCTION
MOVE WD,[4,,T1] ;FILOP. ARG POINTER TO
FILOP. WD, ;OPEN THE TTY AS AN I/O DEVICE
JRST [SETZM @TTWPRS ;ASSUME IN USE AND VALID
SETOM @TTWPTM ;FLAG AS IF SO
SETZM @TTWP2R ;NOT SECOND TIME IN A ROW
JRST TTWSP7] ;CHECK THE REST
LDB T1,[POINTR T1,FO.CHN] ;GET MONITOR-ALLOCATED CHANNEL
CAMLE T1,TTWMCN ;GREATER THAN MAX. CHANNEL?
MOVEM T1,TTWMCN ;YUP. SAVE AWAY NEW HIGH.
PUSH P,T3 ;SAVE DEVICE NAME FOR A WHILE
GTNTN. T3, ;CONVERT TO NODE,,LINE
JRST [RESDV. T1, ;NOT CONNECTED ANYWHERE - LET GO OF HIM.
JFCL ;IF WE CAN'T GET RID OF HIM, DON'T WORRY.
POP P,(P) ;POP DEVICE NAME OFF FOR A WHILE.
SETZM @TTWPRS ;ASSUME IN USE.
SETOM @TTWPTM ;FLAG AS IF SO
SETZM @TTWP2R ;NOT SECOND TIME IN A ROW
JRST TTWSP7] ;KEEP ON CHECKING FOR OTHER TTYS
AOS TTWILC ;REMEMBER ANOTHER INIT'ED LINE
;BUILD A LOGICAL NAME THAT LOOKS LIKE "NODE_TTY", WHERE NODE IS TWO DIGITS,
;AND TTY IS THREE DIGITS. IF NODE .GT. 100 (OCTAL), THE TOP DIGIT WILL BE JUNK.
TTWNAM: HLRZ T4,T3 ;GET NODE NUMBER
LSHC T4,-3 ;DROP LOW ORDER BYTE DIGIT FOR A WHILE
ADDI T4,'0' ;MAKE IT A SIXBIT NUMBER
LSH T4,3 ;MAKE ROOM FOR PART OF A SIXBIT DIGIT
LSHC T4,3 ;MAKE ROOM FOR THE REST, BRINGING IT IN.
ADDI T4,'0' ;MAKE IT A SIXBIT DIGIT
LSH T4,6 ;MAKE ROOM FOR ANOTHER SIXBIT DIGIT
ADDI T4,'_' ;ADD IT IN
MOVS T5,T4 ;SAVE NODE NUMBER FOR A WHILE
;NOW DO THE TTY NUMBER
LSHC T3,-6 ;DROP LOW ORDER TWO BYTES FOR A WHILE
ANDI T3,7 ;KEEP ONLY HUNDREDS (64'S) DIGIT
ADDI T3,'0' ;MAKE IT SIXBIT
LSH T3,3 ;MAKE ROOM FOR PART OF NEXT DIGIT
LSHC T3,3 ;ROOM FOR REST, BRINGING IT IN
ADDI T3,'0' ;MAKE IT SIXBIT
LSH T3,3 ;ROOM FOR LAST DIGIT
LSHC T3,3 ;..
ADDI T3,'0' ;.....
HLL T3,T5 ;GET "NODE_"
POP P,T2 ;AND GET BACK TTY NAME
DEVLNM T2, ;SET LOGICAL NAME TO NODE,,LINE
JFCL ;IGNORE ANY ERROR.
HRLOM T1,@TTWPRS ;SAVE THE CHANNEL NUMBER AWAY
;NOW TRY TO CALM THE TTY DOWN
MOVEI T3,.UXTRM(T7) ;TTY UDX
MOVEI T2,.TORSP ;TTY RECEIVE SPEED
MOVE T1,[2,,T2] ;TRMOP. ARG POINTER TO
TRMOP. T1, ;READ TTY RECEIVE SPEED
SETO T1, ;DUH?
HRRM T1,@TTWPRS ;SAVE AWAY OLD TERMINAL RECEIVE SPEED
MOVEI T4,0 ;0 BAUD
MOVEI T2,.TORSP+.TOSET;TTY RECEIVE SPEED
MOVE T1,[3,,T2] ;TRMOP. ARG POINTER TO
TRMOP. T1, ;SET TERMINAL RECEIVE SPEED
JFCL ;OH WELL
PUSHJ P,TTWTCL ;CLEAR OUT ANY CHARACTERS
AOS T6 ;FLAG WE DID SOMETHING
PUSH P,T3 ;Save UDX for this terminal
CTYSTR [ASCIZ \%%TTY STOMPER: Quieting open line on TTY\]
HRRZ T3,T7 ;GET TTY NUMBER
PUSHJ P,TTCOCT ;TYPE DIGITS
CTYSTR [ASCIZ \ at \]
POP P,T2 ;GET UDX BACK INTO T2
PUSHJ P,TTCNOD ;AND TYPE OUT THE NETWORK SPECIFICATION
TTWSP7: AOBJN T7,TTWSP4 ;LOOK FOR ANY MORE TERMINALS
JUMPL T6,TTWSL ;IF NOTHING ACCOMPLISHED, BACK TO SLEEP
;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE
;NOW WAIT AROUND A BIT FOR THE LINES TO SETTLE DOWN
TTWSQ: MOVEI T6,4 ;REPEATITION COUNTER
TTWSQ0: MOVE T7,T8 ;RESET INDEXER
TTWSQ1: SKIPE @TTWPRS ;POUNDING ON THIS TERMINAL?
PUSHJ P,TTWTCL ;YES, EAT ANY STRAGGLING CHARACTERS
AOBJN T7,TTWSQ1 ;CHECK EM ALL
MOVEI T1,1 ;A FEW SECONDS
SLEEP T1, ;TO WAIT FOR STRAGGLERS
SOJG T6,TTWSQ0 ;LOOK FOR STRAGGLING STRAGGLERS
;NOW RESET THE TERMINALS TO A WORKABLE STATE
TTWSR: MOVE T7,T8 ;RESET AOBJN INDEXER
TTWSR1: SKIPN T6,@TTWPRS ;HAVE WE GRABBED THIS LINE?
JRST TTWSR7 ;NO
HRRE T4,T6 ;GET ORIGINAL TERMINAL RECEIVE SPEED
JUMPL T4,TTWSR3 ;IF NO RECEIVE SPEED DON'T RESET IT
MOVEI T3,.UXTRM(T7) ;TTY UDX
MOVEI T2,.TORSP+.TOSET;TTY RECEIVE SPEED
MOVE T1,[3,,T2] ;TRMOP. ARG POINTER TO
TRMOP. T1, ;RESTORE TERMINAL RECEIVE SPEED
JFCL ;TOO BAD
TTWSR3: SETZM @TTWPRS ;THIS TTY LINE OF NO FURTHER INTEREST
TTWSR7: AOBJN T7,TTWSR1 ;LOOP FOR EM ALL
JRST TTWSL2 ;BACK AND TRY AGAIN
;HELPER TO CLEAR TTY INPUT AND OUTPUT (ASSUMES T7 IS LINE NUMBER)
TTWTCL: MOVEI T3,.UXTRM(T7) ;TTY UDX
MOVEI T2,.TOCIB ;CLEAR INPUT BUFFER FUNCTION
MOVE T1,[2,,T2] ;TRMOP. ARG POINTER TO
TRMOP. T1, ;EAT ALL INPUT PENDING
JFCL ;DUH?
MOVEI T2,.TOCOB ;CLEAR OUTPUT BUFFER FUNCTION
MOVE T1,[2,,T2] ;TRMOP. ARG POINTER TO
TRMOP. T1, ;EAT ALL OUTPUT TOO
JFCL ;SHOULDN'T HAPPEN
MOVE T1,[2,,T2] ;TRMOP. ARG POINTER TO
MOVEI T2,.TOICT ;READ INPUT CHARACTER COUNT
TRMOP. T1, ;GO READ IT
MOVE T1,@TTWPCT ;CAN'T? JUST USE AN OLD VALUE
MOVEM T1,@TTWPCT ;STORE NUMBER OF CHARACTERS SEEN.
POPJ P, ;ALL CHARACTERS EATEN
;Type out a node specification for a TTY on the CTY
;Assumes UDX is in T2
TTCNOD: MOVE T1,T2 ;UDX, TO GET THE NODE NUMBER
GTNTN. T1, ;WE GET NODE,,LINE NUMBER
JRST TTCGER ;FAILED??
HLRZM T1,NODLOC ;GET NODE NUMBER
MOVEI T3,2 ;LENGTH OF ARGLIST
MOVEM T3,NODLEN ;NUMBER OF WORDS FOR NODE UUO
MOVE T3,[.NDRNN,,NODBLK];ARGUMENT FOR NODE. UUO
NODE. T3, ;TRANSALATE NODE NUMBER TO NODE NAME
JRST TTCNER ;THIS SHOULDN'T HAPPEN.
PUSHJ P,TTCSIX ;TYPE IT OUT ON THE CTY
CTYSTR [ASCIZ \_TTY\] ;NODE_TTYNNN SEPARATOR
TTWT1O: HRRZ T3,T1 ;LINE NUMBER
PUSHJ P,TTCOCT ;TYPE THE OCTAL LINE NUMBER ON CTY
CTYSTR 1,CRLFM ;END LINE WITH CRLF AND RETURN
TTCGER: CTYSTR [ASCIZ\ GTNTN. failed, code \]
TRNA ;FALL INTO TYPEOUT CODE
TTCNER: CTYSTR [ASCIZ\ NODE. failed, code \]
JRST TTWT1O ;TYPE OUT T1 IN OCTAL
;Type out an octal number on the CTY.
;Assumes octal number in T3
TTCOCT: IDIVI T3,10 ;GET OUT A DIGIT
PUSH P,T4 ;PUSH THE DIGIT
SKIPE T3 ;HAVE WE EXTRACTED ALL WE CAN?
PUSHJ P,TTCOCT ;NOPE, TRY FOR ANOTHER DIGIT OR TWO.
POP P,T4 ;GET TOP DIGIT (FIRST DIGIT)
CTYCHR 1,"0"(T4) ;TYPE OUT THE DIGIT CORRESPONDING AND RETURN
TTCSIX: JUMPE T3,CPOPJ ;IF NOTHING LEFT, RETURN
SETZ T4, ;CLEAR DESTINATION
ROTC T3,6 ;SHIFT BY ONE CHARACTER
CTYCHR " "(T4) ;OUTPUT THE CHARACTER IN ASCII ON THE CTY
JRST TTCSIX ;AND TRY FOR A FEW MORE CHARACTERS.
>;END IFG TTWMAX
SUBTTL HANDLE COMMAND LINE
;SUBROUTINE TO HANDLE COMMAND LINE
DOCMD: TXNE F,F.RTTY ;IF NO COMMAND LEFT, RETURN
TXNN F,F.ICMD ;SEE IF COMMAND
POPJ P, ;NO--GIVE UP
MOVEI T1,TTYIN ;SET FOR TTY
MOVEM T1,GETCH ; IN CHARACTER GRABBER
MOVEI CH,0 ;CLEAR CHARACTER GRABBER
TXZ F,F.ECMD!F.EOF!F.ALIN ;CLEAR SCANNING FLAGS
PUSH P,FLSET ;SAVE PREVIOUS VALUE
SETZM FLSET ;MAKE SURE WE ONLY LOOK AT COMMAND LINE
DOCM.1: TXNN F,F.ECMD!F.EOF ;SEE IF END OF COMMAND
CAIN CH,")" ;SEE IF END OF COMMAND YET
JRST DOCM.3 ;YES--ALL DONE
PUSHJ P,GETSIX ;GET NEXT COMMAND WORD
JUMPE WD,DOCM.2 ;LOOP IF NULL
MOVE T2,FLSET ;SEE IF "SET" TYPED YET
CAIN T2,2 ;WAS IT?
SKIPA T2,[IOWD CMDLT,CMDT] ;YES, USE EXTENDED POSSIBILITIES
MOVE T2,[IOWD CMDLL,CMDT] ;NO, POINT TO NORMAL POSSIBILITIES
PUSHJ P,FNDCMD ;FIND AND STORE COMMAND
INTERR (CER,Command Error,<JRST KILJOB>)
DOCM.2: CAIN CH,"-" ;SEE IF -XYZ
PUSHJ P,NO$ ;YES--SET NOXYZ
TXZN F,F.CERR ;SEE IF ERROR
JRST DOCM.1 ;NO--LOOP
;HERE AT END OF COMMAND--CLEAN UP LINE
DOCM.3: TXZE F,F.ECMD!F.EOF ;SEE IF END OF LINE
JRST DOCM.4 ;YES--RETURN
PUSHJ P,GETSIX ;NO--GET NEXT WORD
JRST DOCM.3 ;LOOP UNTIL DONE
DOCM.4: POP P,T1 ;GET PREVIOUS "SETTTY"
SKIPN FLSET ;IF NOT TYPED,
MOVEM T1,FLSET ;USE IT
SETZM GETCH ;CLEAR CHARACTER GRABBER
POPJ P, ;RETURN
;ROUTINES TO HANDLE A LINE IN TTY.INI
;FILELC--CONDITIONAL BASED ON FIRST WORD BEING THIS TTY
;FILELN--ALWAYS
;FILELS--NEVER
;ALL RETURN AT END OF LINE
FILELC: TXZ F,F.PARN!F.NODL ;CLEAR THE PAREN INDICATOR
;TOP OF LOOP FOR LIST OF THE FORM (NODE_ID,NODE_ID):
FILE.0: MOVE T8,TRMNAM ;GET OUR EXPANDED TERMINAL NAME
SETZ T7, ;CAN'T USE OUR ASCII NAME UNLESS NODE MATCH
;GET A NODE NAME:
MOVEI T1,STR8BK ;POINT TO OUR STRING STORAGE
PUSHJ P,GETAS8 ;GET THE NODE NAME
;SEE IF WE'VE GOT A LIST OF NODE_ID PAIRS:
HLRZ T1,STR8BK+.NSASL ;GET THE NUMBER OF BYTES READ
JUMPE T1,[CAIE CH,"(" ;NONE. ARE WE DOING A LIST?
JRST FILELS ;NOPE. LOOPS LIKE GARBAGE
TXO F,F.PARN!F.NODL;YEAH, SAY WE'RE DOING A LIST
JRST FILE.0] ;RESTART THE LOOP
;SEE IF IT REALLY LOOKS LIKE A NODE NAME:
SETZ WD, ;ASSUME QUOTED NODE NAME STRING
MOVEI T1,STR8BK ;POINT TO THE STRING STORAGE
TXNN F,F.QUOT ;WAS IT QUOTED?
PUSHJ P,GET826 ;NO, CONVERT IT TO SIXBIT
CAIE CH,":" ;IS THIS ANY SORT OF
CAIN CH,"_" ; NODE NAME TERMINATOR?
SKIPA ;YES, PROCESS THE NODE NAME
JRST FILE.3 ;NO, GO DO A RAW TERMINAL NAME THEN
CAIN CH,":" ;IS IT A NEW FLAVOR TERMINATOR?
JRST [PUSHJ P,GETCHA ;MAYBE, GET THE NEXT CHARACTER
CAIN CH,":" ;IS IT "::"?
JRST .+1 ;YEAH, GO ON THEN
MOVEM CH,REEAT ;NO, PUT THE CHARACTER BACK
JRST FILE.3] ;AND TRY THE TERMINAL NAME
;GOT A NODE NAME. SEE IF IT MATCHES SOME FORM OF OUR NODE NAME OR "ALL"
CAMN WD,['ALL '] ;UNIVERSAL NODE DESIGNATOR?
JRST FILE.1 ;YES, THIS NODE NAME WINS
MOVEI T1,STR8BK ;NO, POINT TO THE NODE NAME
MOVEI T2,MYNODE ; AND MY NODE NAME
PUSHJ P,CMPS8 ;ARE THEY THE SAME?
SKIPA ;NO, TRY THE NODE NUMBER IF THERE IS ONE
JRST FILE.1 ;YES, GO LOOK FOR THE TERMINAL NAME
MOVEI T1,STR8BK ;POINT TO THE NODE NAME AGAIN
MOVEI T2,MYNUMB ; BUT THIS TIME, TRY MY NODE NUMBER
PUSHJ P,CMPS8 ;ARE THEY THE SAME?
SKIPA ;NO, SKIP THIS LINE
JRST FILE.1 ;YES, GO PROCESS THIS LINE
;IF NODE NAME DOESN'T MATCH, GO AHEAD AND EAT THE PORT ID JUST IN CASE WE'RE
;PROCESSING A LIST (WE'D LIKE TO SEE THE ",")
MOVEI T1,STR8BK ;POINT TO THE SCRATCH STORAGE
PUSHJ P,GETAS8 ;GO READ THE PORT ID ANYWAY
JRST FILE.7 ;THEN SEE IF WE'RE IN A LIST
;NODE NAMES MATCH. READ THE TERMINAL NAME, AND MAKE SURE WE ONLY TRY TO MATCH
;THE NODE'S TTY NUMBER INSTEAD OF THE CENTRAL STATION'S
FILE.1: MOVE T8,TRMNNM ;GET THE NODE RELATIVE TERMINAL NAME
MOVEI T7,MYTERM ;AND POINT TO THE ASCII TERMINAL NAME STRING
;TOP OF LOOP FOR LISTS OF THE FORM NODE_(ID,ID,ID)
FILE.2: MOVEI T1,STR8BK ;POINT BACK AT OUR SCRATCH STORAGE
PUSHJ P,GETAS8 ;GET THE NEXT PIECE OF ASCII
MOVEI T1,STR8BK ;POINT AT THE NEWLY FILLED BLOCK
SETZ WD, ;ASSUME IT WAS A QUOTED STRING
TXNN F,F.QUOT ;WAS IT?
PUSHJ P,GET826 ;NO, CONVERT IT TO SIXBIT
;HERE IF NO NODE NAME, OR IF NODE NAMES MATCH. SEE IF THE APPARENT TERMINAL
;NAME IS REALLY SOME MAGIC COMMAND:
FILE.3: MOVSI T1,-FILECL ;GET THE NUMBER OF MAGIC COMMANDS
FILE.4: CAMN WD,FILECM(T1) ;HAVE WE GOT A MATCH?
JRST @FILECD(T1) ;YES, GO DISPATCH IT
AOBJN T1,FILE.4 ;NO, TRY THE NEXT ONE
;NOT A COMMAND, TRY TERMINAL LIST, TERMINAL NAME, ETC
HLRZ T1,STR8BK+.NSASL ;GET THE NUMBER OF BYTES READ
JUMPE T1,[CAIN CH,"(" ;NONE? IS THIS A LIST?
TXOE F,F.PARN ;YES, ALREADY DOING A LIST?
JRST FILELS ;NO, YES. PUNT OFF THIS LINE
JRST FILE.2] ;YES, NO. GO GET FIRST LIST ITEM
SKIPE WD ;ANY SIXBIT TERMINAL NAME?
PUSHJ P,XPNTTY ;YES, EXPAND THE NUMBER
CAIE CH,"-" ;ARE WE DOING A RANGE?
JRST FILE.5 ;NO, TRY AN EXPLICIT TERMINAL NAME THEN
TXNN F,F.ANFL ;IS THIS AN ANF-10 NODE?
JRST FILELS ;NO, CAN'T DO LISTS ON DECNET/LAT PORT IDS
;WE'VE BEEN GIVEN A RANGE OF TTY NUMBERS OF THE FORM "TTYnn-TTYmm" or "TTYnn-mm"
PUSHJ P,CVTBIN ;YES, CONVERT THE NUMBER TO BINARY
MOVE T6,WD ;COPY THE LOWER BOUND
PUSHJ P,GETSIX ;GET THE NEXT BIT OF BINARY
JUMPG WD,[HLRZS WD ;IF DIGITS ONLY,
HRLI WD,'TTY' ; MAKE IT TTYNN
JRST .+1] ;AND CONTINUE
PUSHJ P,XPNTTY ;EXPAND THE TERMINAL NUMBER
PUSHJ P,CVTBIN ;AND CONVERT THE NUMBER TO BINARY
MOVE T5,WD ;COPY THE UPPER BOUND
CAMGE T5,T6 ;ARE THEY IN REVERSE ORDER?
EXCH T6,T5 ;YES, UNREVERSE THEM
MOVE WD,T8 ;GET OUR CURRENT LINE NAME
PUSHJ P,CVTBIN ;PULL THE NUMBER OUT OF IT
CAMG T6,WD ;IS IT IN THE
CAMGE T5,WD ;SPECIFIED RANGE?
JRST FILE.7 ;NO, SKIP IT
JRST FILE.6 ;YES, WE WIN
;HERE IF JUST A GENERIC TTY DESIGNATOR. SEE IF THE SIXBIT LINE ID MATCHES.
;IF NOT, COMPARE THE ASCII VERSIONS. THE ASCII COMPARISON CAN ONLY HAPPEN
;WHEN WE'VE SEEN AN EXPLICIT NODE NAME MATCH.
FILE.5: HLRZ T1,STR8BK ;GET THE NUMBER OF BYTES FROM TTY.INI
JUMPE T1,FILE.7 ;NOTHING? TRY NEXT LIST ITEM
CAMN WD,T8 ;DO WE MATCH LINE NAMES?
CAILE T1,6 ;YES. IS IT BIGGER THAN A SIXBIT WORD THOUGH?
SKIPA ;NO. TRY THE REGULAR NAME
JRST FILE.6 ;YES, GO DO IT THEN
MOVEI T1,STR8BK ;NO, POINT AT THE STRING STORAGE
SKIPE T2,T7 ;AND AT OUR PORT ID IF APPROPRIATE
PUSHJ P,CMPS8 ;DO THEY MATCH?
JRST FILE.7 ;NO, PUNT IT
SKIPA ;YES, SKIP "OTHER" ENTRY
;HERE IF "OTHER" FOR THE TERMINAL NAME:
FILEOT: TXNN F,F.ALIN ;SKIP IF WE'VE EVER DONE ANYTHING
;HERE IF WE WANT TO DO A LINE:
FILE.6: PUSHJ P,FILELN ;GO DO THE REST OF THE LINE
TXO F,F.ALIN ;SAVE WE'VE BEEN HERE
POPJ P, ;AND RETURN
;HERE IF THIS LINE DOESN'T MATCH. SEE IF WE'RE DOING A LIST:
FILE.7: CAIN CH,"," ;DOES IT LOOK LIKE A LIST?
TXNN F,F.PARN ;YES, DOES IT SMELL LIKE ONE TOO?
JRST FILELS ;NOPE. SKIP THE REST OF THE LINE
TXNN F,F.NODL ;YES, ARE WE LOOPING ON IDS ONLY?
JRST FILE.2 ;YES, GO TRY THE NEXT ID
JRST FILE.0 ;NO, TRY FOR A NEW NODE NAME
;TABLE OF MAGIC COMMANDS THAT CAN OCCUR IN PLACE OF A TERMINAL NAME:
FILECM: <SIXBIT \OTHER\> ;CONNECT IF NOTHING MATCHED SO FAR
<SIXBIT \ALL\> ;APPLIES TO EVERYTHING WITH NODE MATCH
<SIXBIT \DETECT\> ;MATCH IF AUTOBAUD LINE
<SIXBIT \LINSPD\> ;MATCH IF SPEED MATCHES
<SIXBIT \OTHSPD\> ;MATCH IF OTHER THAN SPEED GIVEN
<SIXBIT \CONNECT\> ;CONNECT ANF NETWORK LINES
<SIXBIT \STOMP\> ;START THE TTY STOMPER
<SIXBIT \FRCLIN\> ;MATCH IF WE'RE FRCLIN
<SIXBIT \APC\> ;MATCH ON .TOAPC VALUE
FILECL==.-FILECM ;NUMBER OF ENTRIES IN THIS TABLE
FILECD: FILEOT ;DISPATCHES FOR ABOVE COMMANDS
FILELN
FILDET
FILASP
FILOSP
FILCON
STOMP
FRCLIN
FILAPC
;HERE IF WE'VE GOT A TERMINAL MATCH. PROCESS COMMANDS ON THIS LINE
FILELN: TXZE F,F.PARN ;DO COMMAND--SEE IF IN LIST
JRST [CAIN CH,")" ;YES--SEE IF DONE YET
JRST .+1 ;YES--PROCEED
PUSHJ P,GETSIX ;NO--GET ANOTHER WORD
CAIN CH,.CHLFD ;CHECK FOR END-OF-LINE
JRST FILE.8 ;FOUND IT, STOP LOSING SEARCH
JUMPE CH,FILE.8 ;STOP ON END-OF-FILE TOO
JRST .] ;AND LOOP
PUSHJ P,DOFILE ;DO THIS COMMAND
FILELS: JUMPLE CH,FILE.9 ;IF END OF FILE, SKIP ON
CAIN CH,.CHLFD ;IF END OF LINE,
JRST FILE.9 ; SKIP ON
PUSHJ P,GETSIX ;ELSE, SKIP THIS LINE
JRST FILELS ; AND LOOP
;HERE WHEN TIME TO PROCEED ON THROUGH FILE
FILE.8: PUSHJ P,ERRFCR ;UNMATCHED LEFT PAREN -- COMPLAIN
FILE.9: TXZ F,F.ECMD ;CLEAR END OF COMMAND LINE
TXZ F,F.PARN ;CLEAR PAREN INDICATOR
POPJ P, ;RETURN
; ROUTINES TO SCAN LINES BASED ON SPEEDS
SCNSPD: ; SCAN OFF THE SPEED PART
PUSHJ P,SKIPTV ;SKIP TO VALUE
PUSHJ P,GETSIX ;GET SIXBIT WORD
MOVE T2,[IOWD SPEEDL,SPEEDT]
PUSHJ P,FNDWRD ;FIND SPEED
SKIPA ; TRY SPEED UNKNOWN
POPJ P, ;RETURN
MOVNI T2,2 ; USE -2 FOR ERROR, -1 FOR UNKNOWN
MOVE T3,['UNKNOW'] ; SEE IF UNKNOWN
AND T3,T1 ; GET TO RIGHT LENGTH
CAMN WD,T3 ; SEE IF SAME
SETO T2, ; YES, USE -1
POPJ P,
FILASP: PUSHJ P,SCNSPD ; GET THE SPEED INDICATED
CAME T2,MYSPD ; SAME AS MINE?
JRST FILE.7 ; NO, TRY ANOTHER LINE
JRST FILE.6 ; YES, DO THIS LINE
FILOSP: PUSHJ P,SCNSPD ; GET THE SPEED
CAMN T2,MYSPD ; SAME AS MINE?
JRST FILE.7 ; YES, TRY ANOTHER
JRST FILE.6 ; NO, SO DO THIS ONE
FILDET: PUSHJ P,SCNSPD ; GET SPEED
CAMN T2,MYSPD ; SAME AS MINE?
TXNN F,F.ANSW ; AND ARE WE DOING .HELLO?
JRST FILE.7 ; NO
JRST FILE.6 ; YES
;HERE IF "FRCLIN" SEEN IN TTY.INI
FRCLIN: TXNN F,F.FLN ;RUNNING ON FRCLIN?
JRST FILELS ;NO, IGNORE THIS COMMAND
JRST STMP.0 ;GO LOOK FOR FRCLIN COMMANDS
;HERE TO FLAG STOMP SEEN IN TTY.INI
STOMP: TXNN F,F.FLN ;RUNNING ON FRCLIN?
JRST FILELS ;NO, IGNORE THIS COMMAND
SETOM TTWFLG ;FLAG THAT WE SHOULD START STOMPER
STMP.0: TXNE F,F.ECMD!F.EOF ;SEE IF END OF COMMAND
POPJ P, ;YES--RETURN
PUSHJ P,GETSIX ;GET NEXT WORD
JUMPE WD,STMP.1 ;IF NULL, IGNORE IT
MOVE T2,[IOWD CMDS-CMDLT,CMDT+CMDLT]
;ALLOWABLE STOMP COMMANDS TABLE
PUSHJ P,FNDCMD ;FIND AND STORE COMMAND
JRST ERRFCR ;ERROR IF MISSING
STMP.1: CAIN CH,"-" ;SEE IF - XYZ
PUSHJ P,NO$ ;YES--SET NOXYZ
TXZN F,F.CERR ;SEE IF ERROR
JRST STMP.0 ;NO--LOOP
JRST ERRFCR ;YES--SAY SO
;HERE TO CONNECT REMOTE NETWORK TERMINALS
FILCON: TXNN F,F.CTY ;RUNNING ON THE CTY?
JRST FILELS ;NO, IGNORE THE CONNECT COMMAND(S)
MOVEI T1,NETSLP ;GET SECONDS TO WAIT
MOVEM T1,FILCWT ;SET MAXIMUM WAITABILITY
;LOOP READING NODE_TTY PAIRS FROM TTY.INI
FILCO2: PUSHJ P,GETSIX ;GET A NODE ID
CAIE CH,"_" ;LOOK LIKE A NODE?
JRST FILELS ;NO, EAT THE LINE
FILCO3: MOVE T3,WD ;YEAH, POSITION
PUSHJ P,NDNAM ;AND TRY TO DECIPHER THE NODE ID
JUMPLE T2,[SOSGE FILCWT ;TIME TO FLICK IT IN?
JRST FILCE3 ;YES
MOVEI T1,1 ;NO,
SLEEP T1, ;GIVE THE NETWORK A CHANCE TO COME UP
JRST FILCO3] ;AND TRY AGAIN
MOVE T6,T1 ;SAVE REAL NODE NAME
HRLZ T8,T2 ;SAVE NODE NUMBER
PUSHJ P,GETSIX ;READ IN THE TTY ID
PUSHJ P,XPNTTY ;FORCE INTO KNOWN FORMAT
PUSHJ P,CVTBIN ;AND CONVERT TO LINE NUMBER
JUMPLE T8,FILCO7 ;IF UNKNOWN NODE, JUST IGNORE IT
HRR T8,WD ;MAKE NODE,,LINE ARG
MOVEI T7,2 ;LENGTH OF NODE. ARG LIST BLOCK
FILCO4: MOVE WD,[.NDTCN,,T7] ;ARG POINTER TO
NODE. WD, ;TRY TO CONNECT NETWORK TERMINAL
JRST [SOSGE FILCWT ;WILLING TO WAIT AROUND A BIT?
JRST FILCE4 ;TIMED OUT, JUST IGNORE IT
MOVEI WD,1 ;ONE SECOND
SLEEP WD, ;WAIT TO GIVE THE NET A CHANCE
JRST FILCO4] ;TRY TO CONNECT AGAIN
MOVX T1,UU.PHS ;PHYSICAL ONLY
MOVE T2,WD ;RESULTANT TERMINAL NAME
SETZ T3, ;NO BUFFER RINGS
OPEN TTZ,T1 ;IS TERMINAL IN USE?
JRST FILCO7 ;YES, DON'T FORCE AN INITIA ON IT
MOVEI T8,TTZ ;NO, TERMINAL IS FREE,
IONDX. T8, ;GET ITS UDX
JRST FILCO7 ;THIS JUST CAN'T FAIL
RELEAS TTZ, ;NO, RETURN IT TO MONITOR
MOVE T7,['INITIA'] ;YOURS TRULY
MOVE T1,[2,,T7] ;FRCUUO ARG POINTER TO
FRCUUO T1, ;RUN INITIA ON NEW-FOUND LINE
JRST FILCE6 ;WIN A FEW, LOSE A FEW . . .
;SEE IF MORE TO DO
FILCO7: CAIE CH,.CHLFD ;END OF LINE?
JUMPG CH,FILCO2 ;NO, MORE TO DO
JRST FILE.9 ;MARK END OF COMMAND
;VARIOUS "CONNECT" COMMAND ERRORS OF NOTE
;NO SUCH NODE
FILCE3: TTYSTR [ASCIZ\% No such node "\]
MOVE T2,WD ;COPY OF THE NODE NAME
PUSHJ P,TYPSIX ;TYPE SIXBIT NODE NAME
TTYSTR [ASCIZ\" in CONNECT command\]
TTYSTR CRLF ;CAP OFF WITH A CRLF
JRST FILCO7 ;CONTINUE WITH TTY.INI
;CAN'T CONNECT TO TERMINAL
FILCE4: TTYSTR [ASCIZ\% Can't CONNECT to \]
PUSHJ P,FILCET ;TYPE NODE_TTY
TTYSTR CRLF ;CAP OFF WITH A CRLF
JRST FILCO7 ;CONTINUE WITH TTY.INI
;CAN'T FORCE AN INITIA
FILCE6: TTYSTR [ASCIZ\% Can't force an INITIA on \]
PUSHJ P,FILCET ;LIST THE NODE_TTY
TTYSTR [ASCIZ\ (\]
MOVE T2,WD ;GET -10'S TTY NAME
PUSHJ P,TYPSIX ;TYPE THE RESULTANT TTY NAME
TTYCHR ")" ;END PARENTHESIZED TTY NAME
TTYSTR CRLF ;CAP OFF WITH A CRLF
JRST FILCO7 ;CONTINUE WITH TTY.INI
;TYPE NODE_TTY
FILCET: MOVE T2,T6 ;COPY OF RESULTANT NODE NAME
PUSHJ P,TYPSIX ;LIST SIXBIT NODE NAME
TTYSTR [ASCIZ\_TTY\] ;SEPARATE NODE NAME FROM TTY NAME
HRRZ T1,T8 ;GET NODE LINE NUMBER
PJRST TYPOCT ;AND LIST OCTAL LINE NUMBER
;HERE TO CHECK APC CONDITION OF FILE
FILAPC: PUSHJ P,SKIPTV ;SKIP TO VALUE
PUSHJ P,GETSIX ;READ APC NAME
MOVE T2,[IOWD APCL,APCT] ;APC NAME TABLE
PUSHJ P,FNDWRD ;SEE WHICH WE HAVE
JRST ERRFCR ;GENERIC FILE COMMAND ERROR
MOVE T3,[2,,T4] ;POINTER FOR TRMOP
MOVEI T4,.TOAPC ;FUNCTION TO READ APC
MOVE T5,TERNUM ;OUR TTY
TRMOP. T3, ;ASK THE MONITOR
MOVEI T3,.TOUNK ;UNKNOWN IF ANCIENT MONITOR
CAME T2,T3 ;DO THEY AGREE?
JRST FILE.7 ;NO, PUNT
JRST FILE.6 ;YES, DO THIS LINE
APCT:
DEFINE YY(CODE,NAME),<
IFN <.-APCT>-.TO'CODE,<PRINTX ? APC ENTRY NAME IS OUT OF ORDER IN APCT>
EXP SIXBIT |NAME|
>
YY UNK,UNKNOWN
YY HWD,HARDWIRED
YY DSD,DATASET
YY TSN,TSN
YY GAN,GANDALF
YY ADL,AUTODIALER
YY MCM,MICOM
YY NRT,NRTSER
YY LAT,LAT
YY CTM,CTERM
APCL==.-APCT
;SUBROUTINE TO HANDLE LINE OF COMMAND FILE
;CALLED AFTER FIRST WORD OF LINE IS FOR US
DOFILE: TXNE F,F.ECMD!F.EOF ;SEE IF END OF COMMAND
POPJ P, ;YES--RETURN
PUSHJ P,GETSIX ;GET NEXT WORD
JUMPE WD,DOFI.1 ;IF NULL, IGNORE IT
MOVE T2,[IOWD CMDL,CMDT] ;FULL COMMAND TABLE
PUSHJ P,FNDCMD ;FIND AND STORE COMMAND
JRST ERRFCR ;ERROR IF MISSING
DOFI.1: CAIN CH,"-" ;SEE IF - XYZ
PUSHJ P,NO$ ;YES--SET NOXYZ
TXZN F,F.CERR ;SEE IF ERROR
JRST DOFILE ;NO--LOOP
ERRFCR: INTWRN (FCR,File command error)
OUTSTR CRLFM
POPJ P,0
SUBTTL SUBROUTINE TO IDENTIFY AND SAVE COMMAND
;CALL: MOVE T2,[IOWD LENGTH,LIST]
; PUSHJ P,FNDCMD
;NON-SKIP RETURN IF ERROR
;SKIP RETURN IF DONE
;VALUES CAN BE SEPARATED BY
FNDCMD: MOVE T7,T2 ;SAVE A COPY OF LIST
FNDC.1: PUSHJ P,FNDWRD ;LOOK WD UP IN TABLE
JRST [XOR WD,['NO ']
TLNE WD,777700 ;SEE IF NOXYZ
POPJ P, ;NO--ERROR
PUSHJ P,NO$ ;YES--SET FLAG
LSH T1,^D12 ;ADJUST MASK
LSH WD,^D12 ;ADJUST REST OF WORD
MOVE T2,T7 ;RESTORE LIST OF WORDS
JRST FNDC.1] ;AND TRY AGAIN
ADDI T2,CMDP-CMDT+1(T7);POINT TO THE PROCESSOR
SKIPGE T1,(T2) ;GET PROCESSOR
HRRZM T1,JUMPPR ;IF -1,,ADDR, GIVES FINAL ROUTINE
TXNE F,F.NO ;SEE IF NO XXX
JUMPL T1,CPOPJ ;IF ROUTINE, ERROR
HLRE T2,T1 ;GET POSSIBLE VALUE
JUMPLE T2,FNDC.2 ;IF JUMP/ROUTINE, GO HANDLE
TXZE F,F.NO ;SEE IF NO XXX
TRC T2,3 ;YES--INTERCHANGE 1-2
CAIE T2,1 ;SEE IF YES
CAIN T2,2 ;SEE IF NO
MOVEM T2,(T1) ;YES--STORE VALUE
CAIG T2,3 ;SEE IF BIT VALUE
JRST CPOPJ1 ;YES--ALL OK
CAIE T2,4 ;SEE IF DECIMAL VALUE
POPJ P, ;NO--MUST BE ERROR
PUSH P,T1 ;SAVE LOCATION
PUSHJ P,SKIPTV ;SKIP TO VALUE
PUSHJ P,GETDEC ;GET DECIMAL VALUE
POP P,T2 ;RESTORE LOCATION
HRROM T1,(T2) ;STORE VALUE
JRST CPOPJ1 ;GIVE GOOD RETURN
FNDC.2: TLNN T1,-1 ;SEE IF 0,,ADDR
PUSHJ P,(T1) ; CALL ROUTINE
TXZE F,F.CERR ;SEE IF COMMAND ERROR
POPJ P, ;YES--GIVE ERROR
JRST CPOPJ1 ;NO--GIVE SUCCESS
SUBTTL DEFINE SYSTEMS WHICH NEED SPECIAL SET-UP
DEFINE APRS,<
X 546
;OTHERS MAY BE ADDED--EACH REQUIRES A SP MACRO
>
;DEFINE TABLE OF APR S/N TO PROCESS
DEFINE X(A),<
XLIST
EXP A
LIST
>
RADIX 10
APRTAB: APRS
APRTBL==.-APRTAB
RADIX 8
;DEFINE LIST OF TTY NAME TABLE AND PROCESSING TABLE
DEFINE X(A),<
XLIST
XWD TT'A,JJ'A
LIST
>
APRTBV: APRS
XWD TTXXX,JJXXX ;CATCHALL
SUBTTL SYSTEM TABLES
;SYSTEM 546 TABLES
DEFINE SP546,<
>
;CATCHALL TABLES FOR UNRECOGNIZED SYSTEMS
DEFINE SPXXX,<
>
;PEEL OUT THE TTY NAMES
T.==0
DEFINE X(A),<
XLIST
TT'A: SP'A
0
IFG .-TT'A-T.,<T.==.-TT'A>
LIST
>
DEFINE Y(A,B,C),<EXP SIXBIT /A/>
APRS
X XXX
SPTABL==T. ;SAFETY FACTOR FOR LOOP
;PEEL OUT JUMP TABLES
DEFINE X(A),< XLIST
JJ'A: SP'A
LIST>
DEFINE Y(A,B,C),<XWD C,B>
APRS
X XXX
SUBTTL STANDARD COMMAND TABLES
;FOR EACH KEYWORD, DEFINE LOCATION OF
;PROCESSOR AND WHETHER OR NOT COMMAND CAN GIVE
;W KEY,PROCESSOR,X,Y
; X=C IF COMMAND ALLOWED
; S IF ALLOWED ON STOMP OR FRCLIN
; T IF ALLOWED AS SETTTY COMMAND
; Y=J IF CALLED WITH JRST
; B IF SET A BIT
; I IF INVERT (OFF) A BIT
; D IF DECIMAL NUMBER
DEFINE CMDLST(J,B,I,D),<
;;FIRST THE COMMANDS ET AL
W H,HELP,C,
W HELP,HELP,C,
W KSYS,FLKSYS,C,B
W NAME,FLNAME,C,I
W NO,NO$,C,
W NORUN,GEN,C,J
W NOTICE,FLNOTC,C,B
W STRUCTURES,FLSTR,C,B
W SYSTEM,SYSIN$,C,
W STOMP,STOMP$,C,
W TEXT,FLTEXT,C,B
W UN,NO$,C,
W CHECK,CHECK$,C,
W ACCOUNT,REDACT,S,
W AUTOMATIC,OPSER1,,J
W CHKPNT,CHKPNT,,J
W CRASH,FILEX,,J
W DAEMON,DAEMON,,J
W GALOPR,GALOPR,,J
W LOCATE,LOCAT,,D
W OMOUNT,OMOUNT,,J
W OPSER,OPSER,,J
W SYSDLT,SYSDPY,,J
W SYSDPA,SYSDPY,,J
W SYSDPB,SYSDPY,,J
W SYSDPY,SYSDPY,,J
W SYSHZL,SYSDPY,,J
W SYSV52,SYSDPY,,J
W SYSV61,SYSDPY,,J
W SYSVFT,SYSDPY,,J
W SYSVSO,SYSDPY,,J
;;THEN THE TTY PARAMETERS
W ALTMODE,ALT,T,I
W BLANKS,BLANK,T,I
W CRLF,CRLF,T,I
W DEFER,ECHDEF,T,B
W DIALOUT,DIAL$,,
W ECHO,ECHO,T,B
W EDITOR,EDITOR,T,B
W ESCAPE,ESCCMD,T,
W FILL,FILL,T,D
W FORM,FORM,T,B
W GAG,GAG,T,I
W IDLEDISC,IDLE,T,D
W LC,LC,T,I
W LENGTH,LENGTH,T,D
W LOCALCOPY,LOCALC,T,B
W MODEL,MODEL$,T,
W PAGE,PAGCMD,T,
W QUOTE,QUOTE,T,B
W RCVSPEED,RCV$,T,
W REMOTE,REM,T,B
W RTCOMPATABILITY,RTCOMP,T,B
W SBELL,SBELL,T,B
W SETTTY,FLSET,C,I
W SLAVE,SLAVE,T,B
W SPEED,SPEED$,T,
W SSIZE,SSIZE,T,D
W SSTOP,SSTOP,T,B
W STOP,STOP,T,B
W TABS,TAB,T,B
W TAPE,TAPE,T,B
W TERMINET,TRMNET,C,
W TTY,TTYCMD,C,
W ATTRIBUTES,FLATTR,C,B
W TYPE,TYPE$,T,
W UC,LC,T,B
W UNPAUSE,UNPCMD,T,
W WIDTH,WIDTH,T,D
W XMTSPEED,XMT$,T,
W XONXOFF,XONXOF,T,B
;;HERE FOR TTY ATTRIBUTES
W 8BITAR,ATR8BA,T,B
W 8BIT,ATR8BT,T,B
W EIGHTB,ATR8BT,T,B
W AVO,ATRAVO,T,B
W BLOCK,ATRBMT,T,B
W BLOCKM,ATRBMT,T,B
W BLOCKT,ATRBMT,T,B
W BLOCKA,ATRBTA,T,B
W IDCHAR,ATRCID,T,B
W COL,ATRCLR,T,B
W COLO,ATRCLR,T,B
W COLOR,ATRCLR,T,B
W COLOUR,ATRCLR,T,B
W DISPLA,ATRDIS,T,B
W STATUS,ATRESL,T,B
W GAT,ATRGAT,T,B
W GUARDE,ATRGAT,T,B
W GPO,ATRGPO,T,B
W REGIS,ATRGPO,T,B
W HORIZO,ATRHSR,T,B
W HSCROL,ATRHSR,T,B
W ISO,ATRISO,T,B
W KATAKA,ATRJTK,T,B
W JTK,ATRJTK,T,B
W IDLINE,ATRLID,T,B
W KEYBOA,ATRNKB,T,I
W NRC,ATRNRC,T,B
W OVERST,ATROVR,T,B
W PRINTE,ATRPPO,T,B
W PPORT,ATRPPO,T,B
W DRCS,ATRRCS,T,B
W SEM,ATRSEM,T,B
W SEL,ATRSEM,T,B
W SELE,ATRSEM,T,B
W SELECT,ATRSEM,T,B
W SELERA,ATRSEM,T,B
W SCROLL,ATRSRM,T,B
W VSCROL,ATRSRM,T,B
W SREGIO,ATRSRM,T,B
W SESSIO,ATRSSU,T,B
W SIXEL,ATRSXL,T,B
W DECTCS,ATRTCS,T,B
W TEK,ATRTEK,T,B
W TEKEM,ATRTEK,T,B
W TEKTRO,ATRTEK,T,B
W INTERR,ATRTSI,T,B
W UDKEYS,ATRUDK,T,B
W UWINDO,ATRUWN,T,B
W VT52EM,ATRV52,T,B
W VLENGT,ATRVFL,T,B
W VWIDTH,ATRVFW,T,B
W DECL,DECLVL,T,D
W DECLVL,DECLVL,T,D
W DECLEV,DECLVL,T,D
W ANSL,ANSLVL,T,D
W ANSLVL,ANSLVL,T,D
W ANSLEV,ANSLVL,T,D
W LDT,LOCDV$,T,
W LOCATO,LOCDV$,T,
>
XALL
DEFINE W($KEY,$PROC,$COM,$JUMP),<
IFIDN <$COM><C>,<
EXP <SIXBIT /$KEY/> ; $KEY
>>
;TABLE OF COMMAND NAMES
CMDT: CMDLST (-1,1,2,4)
CMDLL==.-CMDT
;HERE FOR THE SET TTY COMMANDS
DEFINE W($KEY,$PROC,$COM,$JUMP),<
IFIDN <$COM><T>,<
EXP <SIXBIT /$KEY/> ; $KEY
>>
CMDLST (-1,1,2,4)
CMDLT==.-CMDT
;HERE FOR THE STOMP COMMANDS
DEFINE W($KEY,$PROC,$COM,$JUMP),<
IFIDN <$COM><S>,<
EXP <SIXBIT /$KEY/> ; $KEY
>>
CMDLST (-1,1,2,4)
CMDS==.-CMDT
DEFINE W($KEY,$PROC,$COM,$JUMP),<
IFDIF <$COM><C>,< IFDIF <$COM><S>,< IFDIF <$COM><T>,<
EXP <SIXBIT /$KEY/> ; $KEY
>>>>
CMDLST (-1,1,2,4)
CMDL==.-CMDT
DEFINE W($KEY,$PROC,$COM,$JUMP),<
IFIDN <$COM><C>,<
XWD $JUMP,$PROC ; $KEY
>>
;LIST OF PROCESSORS
CMDP: CMDLST (-1,1,2,4)
DEFINE W($KEY,$PROC,$COM,$JUMP),<
IFIDN <$COM><T>,<
XWD $JUMP,$PROC ; $KEY
>>
CMDLST (-1,1,2,4)
DEFINE W($KEY,$PROC,$COM,$JUMP),<
IFIDN <$COM><S>,<
XWD $JUMP,$PROC ;$KEY
>>
CMDLST (-1,1,2,4)
DEFINE W($KEY,$PROC,$COM,$JUMP),<
IFDIF <$COM><C>,< IFDIF <$COM><S>,< IFDIF <$COM><T>,<
XWD $JUMP,$PROC ;$KEY
>>>>
CMDLST (-1,1,2,4)
SALL
SUBTTL ROUTINES FOR VARIOUS COMMANDS
SUBTTL NO COMMAND HANDLER
NO$: TXOE F,F.NO ;SET NO FLAG
TXO F,F.CERR ;IF ON, ERROR
POPJ P, ;RETURN
SUBTTL RCV/XMT SPEED COMMAND HANDLER
SPEED$: MOVEI T7,3 ;BOTH SPEEDS
JRST SPEED ;GO HANDLE
RCV$: MOVEI T7,2 ;REC SPEED
JRST SPEED ;GO HANDLE
XMT$: MOVEI T7,1 ;XMT SPEED
SPEED: PUSHJ P,SKIPTV ;SKIP TO VALUE
PUSHJ P,GETSIX ;GET SIXBIT WORD
MOVE T2,[IOWD SPEEDL,SPEEDT]
PUSHJ P,FNDWRD ;FIND SPEED
TXO F,F.CERR ;ERROR IF UNKNOWN
TXZE F,F.NO ;SEE IF NO
TXO F,F.CERR ;YES--COMMAND ERROR
TRNE T7,2 ;SEE IF RCV
HRROM T2,RCV ;YES
TRNE T7,1 ;SEE IF XMT
HRROM T2,XMT ;YES
TRNE T7,2 ; IF RECEIVE SPEED
HRRZM T2,MYSPD ; CHANGE MYSPEED
POPJ P, ;RETURN
SPEEDT: SIXBIT /0/
SIXBIT /50/
SIXBIT /75/
SIXBIT /110/
SIXBIT /134/
SIXBIT /150/
SIXBIT /200/
SIXBIT /300/
SIXBIT /600/
SIXBIT /1200/
SIXBIT /1800/
SIXBIT /2400/
SIXBIT /4800/
SIXBIT /9600/
SIXBIT /EXTA/
SIXBIT /EXTB/
SPEEDL==.-SPEEDT
SUBTTL TTY COMMAND HANDLER
TTYCMD: MOVEI T1,2 ;BOOLEAN NO
TXZE F,F.NO ;DID USER SAY NO?
JRST TTYCM2 ;YES, DO IT THAT WAY
CAIE CH,":" ;NO, DO WE HAVE A VALUE?
JRST TTYCM1 ;NO, JUST LIGHT FLTTY
PUSHJ P,GETSIX ;YES, READ IT
PUSHJ P,XPNTTY ;CONVERT TO A TTY NAME
IONDX. WD, ;GET ITS UDX
SETZ WD, ;DUH?
CAIL WD,.UXTRM ;IS IT A VALID TTY UDX?
CAILE WD,.UXTRM+777 ; ...
TXOA F,F.CERR ;NO, MAKE IT A COMMAND ERROR
MOVEM WD,TRMNUM ;YES, SAVE FOR TYPTTY
TTYCM1: MOVEI T1,1 ;BOOLEAN TRUE
TTYCM2: MOVEM T1,FLTTY ;SAVE VALUE FOR DOTTYS TO TEST
POPJ P, ;RETURN TO DOCMD
SUBTTL PAGE COMMAND HANDLER
PAGCMD: PUSHJ P,SKIPTV ;SKIP TO VALUE IF ANY
CAIN CH,":" ;SEE IF VALUE
JRST PAGCM1 ;YES--SETTING NUMBER
CAIL CH,"0" ;OR
CAILE CH,"9" ; DECIMAL
JRST PAGCM2 ;NO--MUST JUST BE ON/OFF
PAGCM1: TXZE F,F.NO ;NUMBER
TXO F,F.CERR ;NO IS ERROR
PUSHJ P,GETDEC ;GET DECIMAL PAGE COUNT
HRROM T1,PAGE ;SET PAGE NUMBER
PAGCM2: TXZE F,F.NO ;ON/OFF--SEE IF OFF
TDZA T1,T1 ;NO SO OFF
MOVEI T1,1 ;ELSE ON
HRROM T1,PAGEON ;SET FOR PAGE FLAG
POPJ P, ;RETURN
SUBTTL DIAL COMMAND HANDLER
DIAL$: PUSHJ P,SKIPTV ;SKIP TO VALUE
SETOM DIAL ;FILL WITH MARKERS
SETOM DIAL+1 ;..
MOVE T7,[POINT 4,DIAL]
MOVEI T6,^D18 ;PROTECTIVE COUNT
DIAL.1: PUSHJ P,GETCHA ;GET NEXT DIGIT
CAIE CH," " ;SEE IF TAB
CAIN CH," " ; OR SPACE
JRST DIAL.1 ;YES--DISCARD
CAIN CH,"-" ;SEE IF SEPARATOR
JRST DIAL.1 ;YES--DISCARD
CAIE CH,"(" ;SEE IF
CAIN CH,")" ; AREA CODE SEPARATOR
JRST DIAL.1 ;YES--DISCARD
CAIN CH,"*" ;SEE IF DELAY MARKER
JRST [MOVEI CH,16 ;YES--INDICATE THAT
JRST DIAL.2] ;AND STORE
CAIL CH,"0" ;SEE IF
CAILE CH,"9" ; DIGIT
POPJ P, ;NO--MUST BE END
DIAL.2: IDPB CH,T7 ;STORE DIGIT
SOJG T6,DIAL.1 ;SEE IF OVERFLOW
TXO F,F.CERR ;YES--SET ERROR
SETZM DIAL ;AND CLEAR
SETZM DIAL+1 ; RESULT
POPJ P, ;RETURN
SUBTTL LOCATOR COMMAND HANDLER
LOCDV$: PUSHJ P,SKIPTV ;SKIP TO VALUE
PUSHJ P,GETSIX ;READ A TOKEN
MOVE T2,[IOWD LOCDVL,LOCDVN] ;LOOKUP TABLE FOR DEVICE NAMES
PUSHJ P,FNDWRD ;SEE WHICH ONE WE FOUND
TXOA F,F.CERR ;ERROR IF NONE
HRROM T2,LOCDVT ;SET FOR LATER
POPJ P, ;RETURN
;TABLE OF LOCATOR DEVICE TYPE NAMES
LOCDVN:
DEFINE DVN(NAME,VAL),<
IFN <.-LOCDVN>-.T2'VAL,<PRINTX ENTRY NAME IS OUT OF ORDER IN LOCDVN>
EXP <SIXBIT |NAME|>
>
DVN UNKNOWN,UNK
DVN MOUSE,MOU
DVN TABLET,TAB
LOCDVL==.-LOCDVN ;HOW MANY SUCH NAMES
SUBTTL ESCAPE COMMAND HANDLER
ESCCMD: MOVX T1,.CHESC ;GET THE DEFAULT ESCAPE CHARACTER
PUSH P,[ESCAPE] ;GET THE STORAGE ADDRESS
PJRST UNPC.0 ;CALL THE COMMON CODE BELOW
SUBTTL UNPAUSE COMMAND HANDLER
UNPCMD: MOVEI T1,.CHCNQ ;GET THE DEFAULT FOR THIS GUY
PUSH P,[UNPAUSE] ;GET THE STORAGE ADDRESS
UNPC.0: TXZE F,F.NO ;DID HE SAY NO?
JRST UNPC.1 ;YES, JUST USED THE DEFAULT
PUSHJ P,GCHVAL ;NO, GO GET THE CHARACTER VALUE
TXOA F,F.CERR ;ERROR, DON'T STORE
UNPC.1: HRROM T1,@(P) ;OK, STORE THE CHARACTER
POP P,(P) ;CLEAN UP THE STACK
POPJ P, ;RETURN
SUBTTL ACCOUNT COMMAND HANDLER
REDACT: TXZN F,F.NO ;DID HE SAY NO?
JRST REDA.1 ;NO, GET THE STRING VALUE
SETZM ACTSTR ;YES, THEN
MOVE T1,[ACTSTR,,ACTSTR+1] ; ZERO
BLT T1,ACTSTR+7 ; ANY LEFTOVER STUFF
REDA.1: MOVE T1,[POINT 7,ACTSTR] ;POINT TO THE STRING STORAGE
MOVEI T2,^D39 ;GET THE MAXIMUM LENGTH (NOT INCL NULL)
PUSHJ P,GSTARG ;GET THE STRING ARGUMENT
TXO F,F.CERR ;ERROR, SO LITE THE BIT
POPJ P, ;RETURN
SUBTTL ROUTINE TO SETUP TTY
DOTTYS: SKIPN T1,FLSET ;SEE IF
TXNN F,F.LOGI ; (IF DIDN'T SAY, AND LOGGED IN, ASSUME NO)
TRNE T1,1 ; USER SAID NOSETTTY
JRST DOTTY0 ;RIGHT--SKIP THIS
MOVE T1,TERNUM ;TTY WE'LL SET
CAME T1,TRMNUM ;IS IT THE ONE WE'LL REPORT?
JRST DOTTY0 ;NO--SKIP THIS
PUSHJ P,DOTTYA ;SET PRE-TYPEOUT TRMOP.S
SETOM FLSET ;REMEMBER THAT WE WANT THIS
JRST DOTTY1 ;SKIP TO SOME TYPEOUT
DOTTY0: SETZM FLSET ;REMEMBER NOT TO DO THIS
MOVE T1,[TTBZER,,TTBZER+1] ;CLEAR TTY PARAMETERS IN CASE OF CHECK
SETZM TTBZER ;ZERO FIRST WORD
BLT T1,TTEZER ;SPREAD IT AROUND
DOTTY1: MOVE T1,[2,,T2] ;POINTER FOR TRMOP
MOVEI T2,.TODSS ;GET DATASET STATUS
MOVE T3,TERNUM ;MY LINE
TRMOP. T1, ;CHECK CARRIER
SETO T1, ;ON IF NOT A DATASET
GETLCH T3 ;GET SOME OTHER RANDOM BITS
TXNN T3,GL.SLV ;IF A SLAVED TERMINAL,
SKIPL T1 ;OR NO CARRIER ON A DATASET,
JRST DOTTY2 ;GO SILENCE THIS OPERATION
MOVE T1,[.RCCPU,,T2] ;RECON. FUNCTION FOR CPU MASK
MOVEI T2,2 ;NUMBER OF WORDS IN BLOCK
MOVSI T3,'TTY' ;OUR TERMINAL
RECON. T1,UU.PHY ;GET OUR BITS
JRST DOTTY3 ;PRE-7.03?
MOVE T4,[.RCCPU,,T2] ;GET A DIFFERENT CPU MASK
MOVSI T3,'CPU' ;THE RUNNING CPUS
RECON. T4,UU.PHY ;ASK THE MONITOR
JRST DOTTY3 ;SNH
TDNN T1,T4 ;IF WE ARE OFF-LINE
JRST DOTTY2 ;GO SILENCE OURSELVES
MOVN T4,T1 ;GET FUDGED BITS
AND T4,T1 ;ISOLATE RIGHTMOST BIT
CAME T1,T4 ;SINGLE-CPU TTY?
JRST DOTTY3 ;NO--ASSUME SOMETHING'S RUNNABLE
JFFO T1,.+1 ;YES--GET THE BIT NUMBER
MOVN T1,T2 ;FAKE A SUBTRACT
ADDI T1,^D35 ;CONVERT TO CPU NUMBER
LSH T1,1 ;*2 FOR GETTAB TABLE PAIRING
MOVE T2,T1 ;COPY TABLE OFFSET
ADD T1,[%CVRUN] ;.CPRUN GETTAB FOR OUR CPU
GETTAB T1, ;READ IT
SETZ T1, ;OK IF NOT AVAILABLE
ADD T2,[%CCOKP] ;.CPOK GETTAB FOR OUR CPU
GETTAB T2, ;READ IT
SETZ T2, ;OK IF NOT AVAILABLE
SKIPL T1 ;IF CP.RUN IS ON,
SKIPL T2 ;OR WE'RE NOT ALIVE,
DOTTY2: SETOM SILENC ;DON'T TRY TO TYPE ANYTHING AGAIN
DOTTY3: PUSHJ P,SIGNON ;ISSUE SIGNON MESSAGE (MAYBE)
MOVE T1,FLKSYS ;SEE IF
TRNE T1,1 ; USER WANTS KSYS
PUSHJ P,TYKSYS ;YES--ISSUE IT
MOVE T1,FLTEXT ;SEE IF
TRNE T1,1 ; USER WANTS INITIA.TXT
PUSHJ P,TEXT ;YES--TYPE IT
MOVE T1,FLCHEK ;GET CHECK FLAG
TRNE T1,1 ;IF SET,
PUSHJ P,CHECK ;QUERY THE TERMINAL FOR ITS TYPE
MOVE T1,FLCHEK ;GET CHECK FLAG AGAIN
TRNN T1,1 ;IF CHECK WANTED TO SET SOMETHING,
SKIPE FLSET ;OR THE USER WANTS TO SET SOME MORE,
PUSHJ P,DOTTYB ;SET THE REMAINING CHARACTERISTICS
MOVE T1,FLSTR ;SEE IF STRUCT
TRNE T1,1 ; ..
PUSHJ P,STRUCT ;YES--TYPE STRUCTURE NOTES
MOVE T1,FLTTY ;GET TTY FLAG
TRNE T1,1 ;SEE IF SET
PUSHJ P,TYPTTY ;YES--TYPE TTY SETTINGS
MOVE T1,FLATTR ;GET ATTRIBUTE FLAG
TRNE T1,1 ;SEE IF SET
PUSHJ P,TYPATR ;YES--TYPE ATTRIBUTE SETTINGS
MOVE T1,FLNOTC ;GET NOTICE FLAG
TRNE T1,1 ;SEE IF SET
PUSHJ P,NOTICE ;YES--TYPE NOTICE.TXT
POPJ P, ;RETURN
SUBTTL ROUTINES TO SET TERMINAL CHARACTERISTICS (DOTTYA,DOTTYB)
DOTTYA: MOVE T7,[-DOTTLA,,DOTTTA] ;AOBJN POINTER TO SETUP TABLE
PUSHJ P,DOTTYC ;SET FROM THE TABLE
MOVE T7,[-DOTTLC,,DOTTTC] ;AOBJN POINTER TO SPECIAL TABLE
TXNN F,F.LOGI ;IF NOT LOGGED IN,
PUSHJ P,DOTTYC ;SET FROM THIS TABLE, TOO
MOVE T1,[4,,T2] ;POINTER FOR TRMOP
MOVEI T2,.TODSC ;INDICATE CALL
MOVE T3,TERNUM ;GET OUR NUMBER
MOVE T4,DIAL ;GET FIRST HALF OF NUMBER
SKIPE T5,DIAL+1 ;IF SET,
TRMOP. T1, ; MAKE CALL
JFCL ;IGNORE ERRORS
POPJ P, ;RETURN
DOTTYB: MOVE T7,[-DOTTLG,,DOTTYT] ;AOBJN POINTER TO USER-SETTABLE ITEMS
TXNN F,F.LOGI ;IF NOT LOGGED IN,
HRLI T7,-DOTTYU ;USE FULL TABLE
PUSHJ P,DOTTYC ;SET THE CHARACTERISTICS
;HERE TO DO ATTRIBUTES
MOVE T1,[2,,T2] ;POINTER FOR TRMOP
MOVEI T2,.TOATR ;FIRST ATTR WORD
MOVE T3,TERNUM ;GET TERMINAL NUMBER
TRMOP. T1, ;READ LDBATR
JRST NOATTR ;OLD MONITOR
MOVEM T1,TERATR ;SAVE CURRENT VALUES
MOVEM T1,TRMATR ;AGAIN FOR COMPARISON
MOVE T1,[2,,T2] ;POINTER FOR TRMOP
MOVEI T2,.TOAT2 ;SECOND ATTR WORD
TRMOP. T1, ;READ LDBAT2
SETZ T1, ;SNH
MOVEM T1,TERAT2 ;SAVE CURRENT
MOVEM T1,TRMAT2 ;AGAIN FOR COMPARISON
MOVE T1,[2,,T2] ;POINTER FOR TRMOP
MOVEI T2,.TOAT3 ;CUSTOMER ATTR WORD
TRMOP. T1, ;READ LDBAT3
SETZ T1, ;SNH
MOVEM T1,TERAT3 ;SAVE CURRENT
MOVEM T1,TRMAT3 ;AGAIN FOR COMPARISON
MOVSI T7,-ATRNM1 ;AOBJN POINTER FOR BITS IN LDBATR
ATTR.0: HLRZ T1,ATRTB1(T7) ;GET ADDRESS OF FIRST VALUE
SKIPN T1,(T1) ;IF NOT EXPLICITLY SET,
JRST ATTR.1 ;DON'T CHANGE IT
HRRZ T2,ATRTB1(T7) ;GET ADDRESS OF BIT
MOVE T2,(T2) ;AND BIT
IORM T2,TERATR ;SET IN VALUES
TRNN T1,1 ;IF 'NO',
ANDCAM T2,TERATR ;CLEAR IN VALUES INSTEAD
ATTR.1: AOBJN T7,ATTR.0 ;LOOP OVER LDBATR BITS
MOVE T1,[3,,T2] ;POINTER FOR TRMOP
MOVEI T2,.TOATR+.TOSET ;FUNCTION TO SET LDBATR
MOVE T4,TERATR ;WITH THIS NEW VALUE
XORM T4,TRMATR ;MAKE A CHANGE MASK
SKIPE TRMATR ;IF SOMETHING CHANGED,
TRMOP. T1, ;DO IT
JFCL ;IGNORE ERRORS
MOVSI T7,-ATRNM2 ;AOBJN POINTER FOR LDBAT2 BYTES
ATTR.2: HLRZ T1,ATRTB2(T7) ;GET POINTER TO VALUE
SKIPN T1,(T1) ;IF NOT EXPLICITLY SET,
JRST ATTR.3 ;DON'T DO IT
HRRZ T2,ATRTB2(T7) ;GET ADDRESS OF BYTE POINTER
DPB T1,(T2) ;SET IN TERAT2
ATTR.3: AOBJN T7,ATTR.2 ;LOOP OVER ALL KNOWN BYTES IN LDBAT2
MOVE T1,[3,,T2] ;POINTER FOR TRMOP
MOVEI T2,.TOSET+.TOAT2 ;FUNCTION TO SET LDBAT2
MOVE T4,TERAT2 ;WITH THIS VALUE
XORM T4,TRMAT2 ;MAKE A CHANGE MASK
SKIPE TRMAT2 ;IF CHANGED,
TRMOP. T1, ;DO IT
JFCL ;IGNORE ERRORS
MOVSI T7,-ATRNM3 ;AOBJN POINTER TO CUSTOMER ATTRIBUTES TABLE
JUMPE T7,NOATTR ;DONE IF NONE DEFINED
ATTR.4: HLRZ T1,ATRTB3(T7) ;GET ADDRESS OF STORAGE
SKIPN T1,(T1) ;IF NOT EXPLICITLY SET,
JRST ATTR.5 ;DON'T DO IT
HRRZ T2,ATRTB3(T7) ;GET ADDRESS OF BYTE POINTER
DPB T1,(T2) ;SET NEW VALUE
ATTR.5: AOBJN T7,ATTR.4 ;LOOP OVER ALL KNOWN CUSTOMER VALUES
MOVE T1,[3,,T2] ;POINTER FOR TRMOP
MOVEI T2,.TOAT3+.TOSET ;FUNCTION TO SET LDBAT3
MOVE T4,TERAT3 ;WITH THIS VALUE
XORM T4,TRMAT3 ;MAKE A CHANGE MASK
SKIPE TRMAT3 ;IF SOMETHING CHANGED,
TRMOP. T1, ;SET IT
JFCL ;IGNORE ERRORS
NOATTR: POPJ P, ;DONE SETTYING TERMINAL VALUES
DOTTYC: MOVE T1,FFAPPN ;GET [1,2]
TXNE F,F.ANSW ;IF NOT LOGGED IN,
CHGPPN T1, ;CHANGE TO IT FOR
JFCL ; PRIVILEGED TRMOP.S
DOTC.1: MOVE T1,[3,,T2] ;POINTER FOR TRMOP
HLRZ T2,(T7) ;GET TRMOP FUNCTION
CAIL T2,1000 ;SEE IF READ TRMOP.
ADDI T2,.TOSET ;YES--CHANGE TO SET
MOVE T3,TERNUM ;GET TERMINAL NUMBER
HRRZ T5,(T7) ;GET POINTER TO VALUE
HLRZ T4,(T7) ;GET TRMOP FUNCTION
CAIE T4,.TOTTN ;MODEL NAME?
CAIN T4,.TOTRM ;IS IT .TOTRM?
SKIPA T4,(T5) ;YES--GET FULL WORD
HRRZ T4,(T5) ;GET VALUE IF ANY
SKIPE (T5) ;UNLESS NULL,
TRMOP. T1, ; SET VALUE
JFCL ;IGNORE ERRORS
AOBJN T7,DOTC.1 ;LOOP FOR ALL FUNCTIONS
MOVE T1,MYPPN ;RECOVER ORIGINAL PPN
TXNE F,F.ANSW ;IF CHANGED AWAY,
CHGPPN T1, ;CHANGE BACK TO IT
JFCL ;(IGNORE IF CAN'T)
POPJ P, ;DONE
SUBTTL ROUTINE TO QUERY TERMINAL TYPE (CHECK)
CHECK$: MOVEI T1,2 ;BOOLEAN NO
TXZE F,F.NO ;DID USER SAY THAT?
JRST CHECK2 ;YES--JUST GO SAY NO
MOVEI T1,1 ;NO--GET A BOOLEAN YES
CAIE CH,":" ;IF NO VALUE,
JRST CHECK2 ;GO SAY YES
PUSHJ P,GETSIX ;READ THE ARGUMENT
MOVE T2,[IOWD CHECKL,CHECKN] ;TABLE POINTER
PUSHJ P,FNDWRD ;LOOK IT UP
JRST [TXO F,F.CERR ;COMMAND ERROR IF NOT FOUND
POPJ P,] ;PUNT THE USER
;IF WE EVER HAVE MULTIPLE ARGUMENTS, WE'LL NEED TO DISPATCH BASED ON WHICH ONE
MOVE T1,[2,,T2] ;UUO ARG POINTER
MOVEI T2,.TOTRM ;TTY TYPE READ
MOVE T3,TERNUM ;GET THE UDX
TRMOP. T1, ;WHAT ARE WE?
JRST CHECK1 ;DON'T CHECK IF DETACHED
CAME T1,DEFTYP ;IS THIS THE DEFAULT TYPE?
JRST CHECK1 ;NO--DON'T CHECK
MOVEI T1,1 ;YES--RESTORE BOOLEAN YES
JRST CHECK2 ;AND STORE IT
CHECK1: MOVEI T1,2 ;RESTORE 'NO' VALUE
CHECK2: MOVEM T1,FLCHEK ;SAVE ANSWER FOR LATER
POPJ P, ;RETURN
;OPTIONS TABLE FOR CHECK COMMAND
CHECKN: EXP SIXBIT /DEFAULT/ ;ONLY IF .TOTRM==%CNDTT
CHECKL==.-CHECKN ;LENGTH OF OPTIONS TABLE
;HERE LATER TO DO THE TYPE CHECKING
CHECK: SETZM FLCHEK ;JUST IN CASE WE DON'T MAKE IT
TXNN F,F.FLN ;RUNNING ON FRCLIN?
SKIPE SILENC ;OR REQUESTED TO DO NO I/O?
POPJ P, ;YES--CAN'T DO THIS
MOVE T3,TERNUM ;MY TTY
CAME T3,TRMNUM ;WILL DOTTYS DO ANYTHING?
POPJ P, ;NO, SO NEITHER WILL WE
SETOM FLCHEK ;OK, WE'LL DO SOMETHING--CALL DOTTYB LATER
MOVEI T2,.TOFLM ;YES, GET FUNCTION TO FORCE LEFT MARGIN
MOVE T1,[2,,T2] ;POINTER FOR TRMOP
DMPBUF ;MAKE SURE SCNSER KNOWS OUR HPOS
SKPINL ;DEFEAT ^O
JFCL ; ...
TRMOP. T1, ;DO CRLF IF NEEDED
JFCL ;PRE-703? JUST HOPE.
TTYSTR [ASCIZ \[Checking terminal type . . .\]
DMPBUF ;FLUSH THE BUFFER
MOVEI T2,.TO8BT ;FUNCTION TO READ TA.8BT
MOVE T1,[2,,T2] ;POINTER FOR TRMOP
TRMOP. T1, ;READ IT
SETZ T1, ;JUST HOPE
MOVEM T1,CHKS8B ;SAVE FOR LATER RESTORE
SETSTS TTY,.IOPIM ;SET PACKED-IMAGE I/O MODE
MOVE T1,[3,,T2] ;POINTER FOR TRMOP
MOVEI T2,.TO8BT+.TOSET ;FUNCTION TO DIDDLE TA.8BT
MOVEI T4,1 ;TURN IT ON
CAME T4,CHKS8B ;IF WAS 7-BIT,
TRMOP. T1, ;MAKE IT 8-BIT
JFCL ;SNH
MOVEI T1,ASKWTM ;NOMINAL SLEEP TIME
SKIPL SAVLCH ;IF A PTY, OR
.CREF GL.ITY ;(NOTE BIT WE CHECKED)
TXNE F,F.DCNL ;DECNET TERMINAL?
IMULI T1,NETWTF ;YES, FUDGE
TXNE F,F.DCNL ;CHECK DECNET AGAIN
TDZA T2,T2 ;YES--DON'T FUDGE FOR SPEED
SKIPL T2,MYSPD ;NO--IF I HAVE A KNOWN SPEED
IDIV T1,TIMTBL(T2) ;BE LESS PATIENT WITH FASTER TTYS
CAIGE T1,MINWTM ;IF NOT AT LEAST OUR MINIMUM,
MOVEI T1,MINWTM ;MAKE IT BE
TXO T1,HB.RWJ!HB.RTC ;ADD IN HIBER CONDITIONS
MOVEM T1,SLPTIM ;SET FOR PIMGET
MOVE T7,[-CHKNM1,,CHKTB1] ;AOBJN POINTER TO DEC TABLE
MOVE T8,[CHKAC1-CHKTB1(T7)] ;OFFSET IW CORRESPONDING
CHK.1: MOVE T1,(T7) ;GET EPASCC TO TYPE
PUSHJ P,TYPIST ;SEND THE IMAGE STRING
CHK.2: MOVE T6,@T8 ;GET POINTER TO RESPONSE TABLE
PIMGET CH ;READ A CHARACTER
JRST [PIMGET CH ;BE KIND FOR THE FIRST CHARACTER
JRST CHKLOP ;TIMEOUT
JRST .+1] ;RE-JOIN MAIN LINE
PUSHJ P,RSPFND ;FIND DISPATCH FOR THIS CHARACTER
JRST CHK.2 ;TRY AGAIN IF JUNK IN BUFFER
PUSHJ P,(T1) ;CALL THE ROUTINE
JRST CHKABT ;ABORT
JRST CHKFIN ;SUCCESS
CHKLOP: AOBJN T7,CHK.1 ;LOOP OVER ENTIRE MAJOR TABLE
CAIE T7,CHKTB1+CHKNM1 ;DID WE JUST FINISH THE DEC TABLE?
JRST CHKABT ;NO, CUSTOMER--GIVE UP
MOVE T7,[-CHKNM2##,,CHKTB2##] ;AOBJN POINTER TO CUSTOMER TABLE
HRRI T8,CHKAC2##-CHKTB2## ;UPDATE OFFSET
JUMPL T7,CHK.1 ;TRY CUSTOMER TABLE IF IT HAS ANY ENTRIES
;GIVE UP IF NONE
CHKABT: CLRBFO ;GIVE UP ON JUNKY OUTPUT
TTYSTR [ASCIZ \ unknown\] ;GIVE UP ON TYPE
PJRST CHKDUN ;CLEAN UP AND RETURN
CHKFIN: MOVEM T2,CMODEL ;SAVE MODEL NAME TO REPORT
SKIPN MODEL ;IF NO BETTER IDEA,
MOVEM T2,MODEL ;SET THIS MODEL NAME
CHKF.1: MOVE T2,[3,,T3] ;POINTER FOR TRMOP
MOVEI T3,.TOTRM+.TOSET ;SET TTY TYPE FUNCTION
MOVE T4,TERNUM ;MY TTY
MOVE T5,(T1) ;GET AN ENTRY FROM THE TYPE TABLE
TRMOP. T2, ;TRY TO SET IT
CAIA ;FAILURE--TRY THE NEXT
JRST CHKF.2 ;WIN--GO ANNOUNCE
AOBJN T1,CHKF.1 ;LOOP OVER TABLE
TTYSTR [ASCIZ \ unknown\] ;WE DON'T KNOW
JRST CHKF.3 ;REPORT MODEL ANYWAY
CHKF.2: TTYSTR [ASCIZ \ found \] ;SAY WE FOUND A TYPE
MOVEM T5,TYPE ;SET IT FOR LATER
MOVE T2,T5 ;THE TYPE WE JUST SET
PUSHJ P,TYPSIX ;TYPE IT OUT
CAMN T5,CMODEL ;IS THE TYPE THE SAME AS THE MODEL?
JRST CHKF.4 ;YES, DON'T BE REDUNDANT
CHKF.3: TTYCHR "(" ;MODEL NAME GETS PARENTHESIZED
MOVE T2,CMODEL ;FETCH
PUSHJ P,TYPSIX ;AND TYPE
TTYCHR ")" ;CLOSE PARENTHESES
CHKF.4:! ;DONE
CHKDUN: MOVE T1,[3,,T2] ;POINTER FOR TRMOP
MOVEI T2,.TO8BT+.TOSET ;FUNCTION TO DIDDLE TA.8BT
MOVE T3,TERNUM ;MY TTY
SKIPN T4,CHKS8B ;IF WAS PREVIOUSLY 7-BIT,
TRMOP. T1, ;RESTORE IT
JFCL ;IGNORE ERRORS
DMPBUF ;FLUSH BUFFER
SETSTS TTY,.IOAS8 ;BACK TO NORMAL
TTYSTR [BYTE(7)"]",.CHCRT,.CHLFD,0] ;END MESSAGE & LINE
CLRBFI ;GET RID OF POSSIBLE LEFT-OVER JUNK
DMPBUF 1, ;FLUSH BUFFER AND RETURN
TIMTBL: DEC 1,1,1,1,1,1,1,1,1,2,3,4,8,16,16,16,16 ;SPEEDS 0 TO EXT.B
;SUBROUTINES USED IN TYPE CHECK DISPATCHING
DSPFND::MOVE T2,T1 ;COPY NUMBER
TSC T2,(T6) ;XOR WITH MATCH VALUE
TRNE T2,-1 ;CHECK FOR MATCH
AOBJN T6,DSPFND ;LOOP OVER DISPATCH TABLE
JUMPGE T6,CPOPJ ;RETURN NON-SKIP IF NO MATCH
HRRZ T1,(T6) ;POINT TO HANDLER ROUTINE
JRST CPOPJ1 ;AND SUCCEED
RSPFND::MOVE T1,CH ;COPY CHARACTER
TSC T1,(T6) ;XOR WITH MATCH CHARACTER
TRNE T1,400 ;IF FLAGGED,
TRZ T1,200 ;KEEP TO 7-BIT
TRNE T1,377 ;CHECK FOR MATCH
AOBJN T6,RSPFND ;LOOP OVER RESPONSE TABLE
JUMPGE T6,CPOPJ ;RETURN NON-SKIP IF NOT FOUND
HRRZ T1,(T6) ;POINT TO RESPONSE HANDLER
JRST CPOPJ1 ;SUCCEED WITH ROUTINE ADDRESS IN T1
TYPIST::HLRZ T2,T1 ;GET NUMBER OF BYTES
HRLI T1,(POINT 8) ;8-BIT BYTE STRING
CLRBFI ;TRY TO AVOID PARTIAL RESULTS
ILDB T3,T1 ;GET NEXT CHARACTER
TTYCHR (T3) ;SEND IT
SOJG T2,.-2 ;LOOP OVER ENTIRE STRING
DMPBUF ;FLUSH BUFFER
MOVEI T4,^D10 ;HOW MANY TIMES TO WAIT BEFORE GIVING UP
TYPI.1: MOVEI T2,.TOTOC ;OUTPUT CHECK FUNCTION
MOVE T3,TRMNUM ;MY TERMINAL
MOVE T1,[2,,T2] ;FUNCTION POINTER
TRMOP. T1, ;SEE IF OUTPUT IS STILL WAITING
SETZ T1, ;ASSUME DETACHED
JUMPE T1,CPOPJ ;PROCEED IF NO CHARACTERS WAITING
MOVE T1,SLPTIM ;WAIT A WHILE
HIBER T1, ;FOR OUTPUT TO COMPLETE
JFCL ;ALWAYS SKIPS
SOJG T4,TYPI.1 ;LOOK AGAIN FOR EMPTY CHUNK STREAM
POPJ P, ;PROCEED ANYWAY IF WE LOST PATIENCE
;HERE TO CHECK ON THE LENGTH & WIDTH OF A VARIABLY-SIZED TERMINAL
AVSIZE::PUSH P,T1 ;SAVE TYPE LIST
PUSH P,T2 ;SAVE MODEL
SKIPA T1,.+1 ;GET ASCIC STRING POINTER
EPASCC <.CHESC,"[","6","n",.CHESC,"\"> ;DSR(CPR) + ST
PUSHJ P,TYPIST ;ASK FOR CURRENT X & Y
PUSHJ P,GETSEQ ;READ IN THE SEQUENCE
JRST TTPPJ1 ;PUNT ON ERRORS
CAIE CH,"R" ;IS IT WHAT WE REQUESTED?
[PUSHJ P,CSIFLS ;NO--EAT SEQUENCE
JRST TTPPJ1] ;AND PUNT IT
AOBJP T7,TTPPJ1 ;MUST HAVE TWO PARAMETERS IN RESPONSE
SKIPA T1,.+1 ;GET PROTOTYPE ASCIC STRING POINTER
EPASCC <.CHESC,"[","2","5","5",";","2","5","5","H",
.CHESC,"[","6","n",
.CHESC,"[","0","0","0",";","0","0","0","H",.CHESC,"\"> ;POSITION+ASK+RETURN+ST
MOVE T3,T1 ;COPY ADDRESS
HRLI T3,(POINT 8) ;MAKE BYTE POINTER
MOVE T6,[POINT 8,STRBUF] ;GET DESTINATION BYTE POINTER
HLRZ T2,T1 ;GET SOURCE COUNT
MOVE T5,T2 ;SAME AS DESTINATION COUNT
SETZB T4,T7 ;MAKE SURE OF CLEAN BYTE POINTERS
EXTEND T2,[EXP <MOVSLJ>,0] ;TRANSFER THE BYTES
JFCL ;WILL ALWAYS SKIP
HRRI T1,STRBUF ;MAKE NEW ASCIC POINTER
MOVE T2,[POINT 8,STRBUF+4] ;IDPB POINTER TO "RESTORE" POSITION
MOVE T3,PRMLST ;GET CURRENT "X"
IDIVI T3,^D100 ;SPLIT OFF CENTURIES
IDIVI T4,^D10 ;AND DECADES FROM UNITS
MOVE T3,EPTABL(T3) ;GET EVEN PARITY
MOVE T4,EPTABL(T4) ; ...
MOVE T5,EPTABL(T5) ; ...
IDPB T3,T2 ;UPDATE THE "RESTORE" NUMBER
IDPB T4,T2 ;IN THE STRING WE'LL TYPE
IDPB T5,T2 ; ...
IBP T2 ;SKIP THE SEMICOLON
MOVE T3,PRMLST+1 ;GET CURRENT "Y"
IDIVI T3,^D100 ;SPLIT OFF CENTURIES
IDIVI T4,^D10 ;AND DECADES FROM UNITS
MOVE T3,EPTABL(T3) ;GET EVEN PARITY
MOVE T4,EPTABL(T4) ; ...
MOVE T5,EPTABL(T5) ; ...
IDPB T3,T2 ;UPDATE THE "RESTORE" NUMBER
IDPB T4,T2 ;IN THE STRING WE'LL TYPE
IDPB T5,T2 ; ...
PJRST VSIZ.1 ;FINALLY, ASK FOR SIZES AND DEAL WITH IT
EPTABL::EXP "0","1"!200,"2"!200,"3","4"!200,"5","6","7"!200,"8"!200,"9"
VSIZE:: PUSH P,T1 ;SAVE TYPE LIST
PUSH P,T2 ;SAVE MODEL
SKIPA T1,.+1 ;GET ASCIC STRING POINTER
EPASCC <.CHESC,"7",.CHESC,"[","2","5","5",";","2","5","5","H",
.CHESC,"[","6","n",.CHESC,"8",.CHESC,"\"> ;STRING TO ASK FOR LENGTH & WIDTH
VSIZ.1: PUSHJ P,TYPIST ;SEND THE STRING
PUSHJ P,GETSEQ ;READ IN THE SEQUENCE
JRST TTPPJ1 ;PUNT ON ERRORS
CAIE CH,"R" ;IS IT WHAT WE REQUESTED?
JRST [PUSHJ P,CSIFLS ;NO--EAT SEQUENCE
JRST TTPPJ1] ;AND PUNT
AOBJP T7,TTPPJ1 ;DEMAND TWO PARAMETERS
MOVE T1,PRMLST+1 ;GET THE WIDTH THAT WAS RETURNED
CAILE T1,^D40 ;IF BELIEVABLE,
MOVEM T1,WIDTH ;USE IT
MOVE T1,PRMLST ;GET THE LENGTH THAT WAS RETURNED
CAILE T1,^D9 ;IF BELIEVABLE,
MOVEM T1,LENGTH ;USE IT
TTPPJ1::POP P,T2 ;RESTORE MODEL
POP P,T1 ;RESTORE TYPE LIST
JRST CPOPJ1 ;SUCCEED
ANSPRM::SETZ T1, ;START WITH A VALUE OF ZERO
ANSP.1: ANDI CH,177 ;IGNORE PARITY HERE
CAIL CH,"0" ;IN RANGE FOR A DIGIT?
CAILE CH,"9" ; ...
JRST ANSP.2 ;NO--SEE IF LEGAL
IMULI T1,^D10 ;YES--ADVANCE DECADE
ADDI T1,-"0"(CH) ;ACCUMULATE NEW UNITS PLACE
PIMGET CH ;READ NEXT POSSIBLE DIGIT
POPJ P, ;TIMEOUT
JRST ANSP.1 ;LOOP OVER ALL DIGITS
ANSP.2: CAIE CH,":" ;VALID PARAMETER SEPARATION
CAIN CH,";" ; ...
JRST CPOPJ1 ;WIN
CAILE CH,"/" ;INTERMEDIATE?
CAILE CH,"?" ;OR FINAL?
AOS (P) ;YES, WIN
POPJ P, ;OR FAIL IF NOT
GETSEQ::PIMGET CH ;GET FIRST CHARACTER OF RESPONSE
PIMGET CH ;BE FORGIVING FOR FIRST ONE
JUMPE CH,CPOPJ ;DOUBLE-TIMEOUT IS FATAL
CAIE CH,.CHESC ;START WITH ESCAPE?
JRST GETS.1 ;NO--LOOK FOR CSI
PIMGET CH ;YES--LOOK FOR BRACKET
POPJ P, ;TIMEOUT
ANDI CH,177 ;IGNORE PARITY
CAIE CH,"[" ;IS THIS A 7-BIT CSI?
PJRST CSIFLS ;NO--EAT THE SEQUENCE
JRST GETPRM ;YES--GET THE NEXT CHARACTER
GETS.1: CAIE CH,233 ;LAST CHANCE--IS IT CSI?
JRST GETSEQ ;NO--LOOP UNTIL START OF SEQUENCE OR TIMEOUT
GETPRM::PIMGET CH ;PRIME THE PUMP
POPJ P, ;TIMEOUT
ANDI CH,177 ;IGNORE PARITY
GETPRP::MOVSI T7,-PRMMAX ;AOBJN LIMIT FOR ANSI PARAMETERS
SETZM PRVPRM ;ASSUME NOT PRIVATE PARAMETER LIST
CAIL CH,.CHLAB ;GOOD ASSUMPTION?
CAILE CH,"?" ;CHECK...
JRST GETP.2 ;SO FAR
MOVEM CH,PRVPRM ;NO, SAVE WHICH KIND OF PRIVATE
GETP.1: PIMGET CH ;READ NEXT CHARACTER
POPJ P, ;TIMEOUT
ANDI CH,177 ;STRIP POSSIBLE PARITY
GETP.2: PUSHJ P,ANSPRM ;READ AN OPTIONAL DECIMAL NUMBER
POPJ P, ;TIMEOUT OR INVALID TERMINATOR
CAIN CH,":" ;NEXT ONE SELECTIVE?
TLO T1,(1B0) ;YES, FLAG THIS ONE
MOVEM T1,PRMLST(T7) ;SAVE THE VALUE
GETP.3: CAILE CH,"/" ;IS IT AN INTERMEDIATE?
CAILE CH,"?" ;OR A FINAL?
JRST GETP.4 ;YES--DONE READING PARAMETERS
CAIE CH,";" ;NO, SEE IF SEPARATOR
CAIN CH,":" ;OF EITHER TYPE
AOBJN T7,GETP.1 ;YES--LOOP OVER ALL PARAMETERS
PIMGET CH ;TOO MANY PARAMETERS
POPJ P, ;TIMEOUT
ANDI CH,177 ;IGNORE POSSIBLE PARITY
JRST GETP.3 ;LOOK FOR END OF PARAMETER LIST
GETP.4: SKIPL T7 ;DID WE OVERFLOW?
MOVEI T7,PRMMAX-1 ;YES--BACK OFF TO THE LIMIT
MOVSI T7,1(T7) ;GET +VE LENGTH,,0
MOVN T7,T7 ;MAKE AOBJN INDEXER TO VALID PART OF PRMLST
JRST CPOPJ1 ;RETURN WINNITUDE
;DRIVER TABLES FOR CHECKING TERMINAL TYPE
CHKTB1:
IFL FTESCZ,<EPASCC <.CHESC,"Z">> ;DECID
EPASCC <.CHESC,"[","c",.CHESC,"\"> ;DA + ST
IFG FTESCZ,<EPASCC <.CHESC,"Z">> ;DECID
CHKNM1==.-CHKTB1 ;NUMBER OF ENTRIES
DECID$==0+IFG FTESCZ,<1> ;FOR ROUTINE VT52AN
ANSID$==1-DECID$ ;FOR DSP3.1
CHKAC1:
IFL FTESCZ,<-DECIDL,,DECIDT> ;RESPONSE TABLE FOR DECID
-ANSDAL,,ANSDAT ;RESPONSE TABLE FOR DA
IFG FTESCZ,<-DECIDL,,DECIDT> ;RESPONSE TABLE FOR DECID
IFN FTESCZ,<
DECIDT: 433,,DECID ;7-BIT ESCAPE,,DISPATCH
DECIDL==.-DECIDT ;LENGTH OF TABLE
> ;END IFN FTESCZ
ANSDAT: 33,,ESCID ;ESCAPE,,DISPATCH
233,,CSIID ;CSI,,DISPATCH
ANSDAL==.-ANSDAT ;LENGTH OF TABLE
;ROUTINES TO IDENTIFY TERMINAL TYPES -- DECID RESPONSE
IFN FTESCZ,<
DECID: SETOM ATRV52 ;DECID IMPLIES VT52 EMULATION
MOVEM CH,VT52CH ;SAVE INITIAL CHARACTER
DECI.0: PIMGET CH ;READ NEXT CHARACTER OF SEQUENCE
POPJ P, ;ABORT
MOVE T6,[-VT5XL,,VT5XT] ;POINT TO DISPATCH TABLE
PUSHJ P,RSPFND ;TRY TO FIND THIS CHARACTER
CAIA ;NOT THERE
PJRST (T1) ;THE LEAP OF FAITH
DECI.1: SKIPGE T6,[-ESCZL##,,ESCZT##] ;CHECK FOR A CUSTOMER TABLE
PUSHJ P,RSPFND ;TRY TO FIND IT THERE
TRNA ;NOT THERE
PJRST (T1) ;CONTINUE IN NEXT HANDLER
CAIE T1,.CHCNZ ;IF SUB
CAIN T1,.CHCNX ;OR CAN
POPJ P, ;ABORT
CAIL T1," " ;IF NOT A CONTROL CHARACTER,
POPJ P, ;ABORT
JRST DECI.0 ;LOOP OVER GARBAGE IN THE STRING
DECIDQ: MOVE T1,VT52CH ;GET SAVED CHARACTER
CAIE T1,233 ;WAS IT A CSI?
JRST DECI.1 ;NO--SEE IF CUSTOMER TABLE CAN HANDLE IT
PJRST CSII.0 ;YES--HANDLE AS A DA RESPONSE
VT5XT: "/"+400,,VT5XR ;7-BIT SLASH,,DISPATCH
"["+400,,ESCI.0 ;ANSI RESPONSE
"0",,DECIDQ ;CSI RESPONSE
"1",,DECIDQ ;CSI RESPONSE
"2",,DECIDQ ;CSI RESPONSE
"3",,DECIDQ ;CSI RESPONSE
"4",,DECIDQ ;CSI RESPONSE
"5",,DECIDQ ;CSI RESPONSE
"6",,DECIDQ ;CSI RESPONSE
"7",,DECIDQ ;CSI RESPONSE
"8",,DECIDQ ;CSI RESPONSE
"9",,DECIDQ ;CSI RESPONSE
.CHLAB,,DECIDQ ;CSI RESPONSE
"=",,DECIDQ ;CSI RESPONSE
.CHRAB,,DECIDQ ;CSI RESPONSE
"?",,DECIDQ ;CSI RESPONSE
VT5XL==.-VT5XT ;LENGTH OF TABLE
VT5XR: PIMGET CH ;READ NEXT CHARACTER OF SEQUENCE
POPJ P, ;ABORT
MOVE T6,[-SLAS.L,,SLAS.T] ;DISPATCH TABLE POINTER
PUSHJ P,RSPFND ;FIND THE ENTRY
CAIA ;NOT IN OUR TABLE
PJRST (T1) ;CONTINUE IN NEXT HANDLER
SKIPGE T6,[-SLASHL##,,SLASHT##] ;TRY CUSTOMER TABLE
PUSHJ P,RSPFND ;IF THERE IS ONE
POPJ P, ;ABORT
PJRST (T1) ;THE LEAP OF FAITH
SLAS.T: "#"+400,,VT71R ;VT71/VT72 RESPONSE
"A"+400,,VT50R ;VT50 RESPONSE
"B"+400,,VT50R ; ...
"C"+400,,VT55R ;VT55 RESPONSE
"E"+400,,VT55R ; ...
"H"+400,,VT52H ;VT52H RESPONSE
"J"+400,,VT52H ; ...
"K"+400,,VT52R ;VT52 RESPONSE
"L"+400,,VT52R ; ...
"M"+400,,VT52R ; ...
"Z"+400,,VT52AN ;FAKE VT52 RESPONSE
"`"+400,,VT61R ;VT61 RESPONSE
"a"+400,,VT61R ; ...
"b"+400,,VT61R ; ...
"c"+400,,VT61R ; ...
SLAS.L==.-SLAS.T ;LENGTH OF TABLE
VT50R: HRROI T1,['VT50 '] ;TYPE NAME
MOVE T2,(T1) ;MODEL
JRST CPOPJ1 ;SUCCESS AT LAST
VT55R: MOVE T1,[-2,,[EXP 'VT55 ','VT52 ']] ;TYPE LIST
MOVE T2,(T1) ;MODEL NAME
JRST CPOPJ1 ;SUCCESS
VT52H: HRROI T1,['VT52 '] ;TYPE NAME
MOVE T2,['VT52H '] ;MODEL NAME
JRST CPOPJ1 ;SUCCESS
VT52R: HRROI T1,['VT52 '] ;TYPE NAME
MOVE T2,(T1) ;MODEL NAME
CAIE CH,"M" ;HAVE A PRINTER?
CAIN CH,"M"+200 ;(CHECK WITH PARITY)
SETOM ATRPPO ;YES, REMEMBER THAT
JRST CPOPJ1 ;SUCCESS
VT71R: PIMGET CH ;READ NEXT CHARACTER
POPJ P, ;ABORT ON TIMEOUT
ANDI CH,177 ;KEEP ONLY 7-BIT VALUE
CAIG CH,"/" ;STILL AN INTERMEDIATE?
JRST VT71R ;YES, LOOP UNTIL A FINAL
MOVE T1,[-2,,[EXP 'VT72 ','DAS21 ']] ;TYPE LIST
MOVE T2,(T1) ;MODEL NAME
JRST CPOPJ1 ;SUCCESS
VT52AN: TTYCHR .CHESC ;LEAVE VT52 MODE
TTYCHR .CHLAB ; ...
MOVE T1,CHKTB1+DECID$ ;GET DECID STRING AGAIN
PUSHJ P,TYPIST ;SEND THE IMAGE STRING
PIMGET CH ;WAIT FOR A RESPONSE
PIMGET CH ;BE FORGIVING
JUMPE CH,CPOPJ ;GIVE UP IF DOUBLE-TIMEOUT
MOVE T6,CHKAC1+DECID$ ;GET RESPONSE TABLE POINTER
PUSHJ P,RSPFND ;SEE IF WE UNDERSTAND IT
CAIA ;OOPS
PUSHJ P,(T1) ;CALL THE NEW HANDLER
CAIA ;OOPS
AOS (P) ;SKIP IF SUCCESSFUL
PUSH P,T2 ;SAVE POSSIBLE MODEL NAME
SKIPA T1,.+1 ;GET STRING TO RESTORE VT52 MODE
EPASCC <.CHESC,"[","?","2","l",.CHESC,"\"> ; + ST
PUSHJ P,TYPIST ;SEND THE IMAGE STRING
POP P,T2 ;RESTORE MODEL NAME
HRROI T1,['VT52 '] ;TYPE NAME
SETZM ANSLVL ;NO MORE ANSI LEVEL
POPJ P, ;PROPAGATE SKIPNESS
VT61R: TRNE CH,2 ;PRT ATTRIBUTE IN RESPONSE?
SETOM ATRPPO ;YES, REMEMBER IT
SETOM ATRCID ;I&D CHAR
SETOM ATRLID ;I&D LINES
HRROI T1,['VT61 '] ;TYPE NAME
MOVE T2,(T1) ;MODEL NAME
JRST CPOPJ1 ;SUCCESS
> ;END OF IFN FTESCZ
;ROUTINES TO IDENTIFY TERMINAL TYPES -- ANSI DA RESPONSE
ESCID: PIMGET CH ;TRY FOR THE "["
POPJ P, ;ABORT ON TIMEOUT
ESCI.0: CAIE CH,333 ;IF PARITY,
TDZA T1,T1 ;NO--UNKNOWN IF 8-BIT
MOVEI T1,2 ;YES--DEFNITELY 7-BIT
MOVEM T1,CSIS8B ;REMEMBER IF WANT 7-BIT
MOVEM T1,ATR8BT ;HERE, TOO
SETZM CHKS8B ;GO BACK TO 7-BIT
PIMGET CH ;READ THE NEXT CHARACTER
POPJ P, ;ABORT ON TIMEOUT
ANDI CH,177 ;STRIP PARITY
PJRST CSII.1 ;HANDLE LIKE CSI FROM HERE
CSIID: SETZM CSIS8B ;CSI DIDN'T SET 8-BIT YET
PIMGET CH ;GET THE NEXT CHARACTER
POPJ P, ;ABORT ON TIMEOUT
CAIE CH,333 ;MARK PARITY 7-BIT?
JRST CSII.0 ;NO--WE WIN
MOVEI T1,2 ;'OFF'
MOVEM T1,ATR8BT ;NO WAY FOR 8-BIT
MOVEM T1,CSIS8B ;LIKEWISE
SETZM CHKS8B ;I MEAN IT
PIMGET CH ;TRY FOR PARAMETER CHARACTER
POPJ P, ;TIMEOUT
ANDI CH,177 ;IGNORE THE MARK PARITY
JRST CSII.1 ;PARSE PARAMETERS
CSII.0: SETOM ATR8BT ;REALLY 8-BIT
SETOM CHKS8B ;I MEAN IT
SETOM ATR8BA ;REALLY
SETOM CSIS8B ;I SAID SO
CSII.1: PUSHJ P,GETPRP ;READ IN THE PARAMETER LIST
POPJ P, ;PROPAGATE ERROR
CAIE CH,"c" ;IS IT WHAT WE REQUESTED?
PJRST CSIFLS ;NO--FLUSH IT AND GIVE UP
MOVE CH,PRVPRM ;GET PRIVATENESS
MOVE T6,[-CSIT.L,,CSITAB] ;DISPATCH TABLE
PUSHJ P,RSPFND ;LOOK IT UP
POPJ P, ;SNH
PJRST (T1) ;PASS THE BUCK
CSITAB: 0,,CSIANS## ;NON-PRIVATE (I NEVER HEARD OF ONE)
"?",,CSIDEC ;ASSUME IT'S OURS
.CHLAB,,CSILAB## ;LEFT-ANGLE
"=",,CSIEQL## ;EQUALS
.CHRAB,,CSIRAB## ;RIGHT-ANGLE (ANN ARBOR?)
CSIT.L==.-CSITAB ;LENGTH OF TABLE
CSIFLS::ANDI CH,177 ;IGNORE PARITY
CAIL CH,"@" ;IS THIS A FINAL?
POPJ P, ;YES--WE CAN ABORT NOW
PIMGET CH ;NO--READ NEXT
POPJ P, ;TIMEOUT
JRST CSIFLS ;LOOP UNTIL A FINAL CHARACTER IS SEEN
;ROUTINES TO IDENTIFY TERMINAL TYPES -- DEC-PRIVATE ANSI DA RESPONSE
CSIDEC: MOVE T1,PRMLST ;INITIAL NUMBER RECEIVED
MOVE T6,[-DECT.L,,DECTAB] ;DISPATCH TABLE
PUSHJ P,DSPFND ;FIND THIS VALUE IN THE TABLE
CAIA ;NOT A DEC TERMINAL
PJRST (T1) ;PASS THE BUCK
SKIPGE T6,[-CSID.L##,,CSID.T##] ;USE LIST OF CUSTOMER VALUES
PUSHJ P,DSPFND ;IF PRESENT
POPJ P, ;PUNT
PJRST (T1) ;THE LEAP OF FAITH
DECTAB: 1,,VT100R
2,,LA120R
3,,LA34R
4,,VT132R
5,,VK100R
6,,VT102R
7,,VT131R
; 8,,VT278R
; 9,,LQP8FR
^D10,,LA100R
^D11,,LA120K
^D12,,VT125R
^D13,,LQP02
; ^D15,,LA12
^D16,,VT102J
^D17,,LA50
; ^D18,,VT80R
^D20,,LA80
^D24,,LQP03
^D26,,LN03
^D61,,DISP1R
^D62,,DISP2R
^D63,,DISP3R
DECT.L==.-DECTAB ;LENGTH OF THE TABLE
;HERE FOR INDIVIDUAL DEC TERMINALS
VT100R: MOVE T1,PRMLST+1 ;GET SUB-IDENTIFIER
ANDI T1,17 ;MASK DOWN TO WHAT WE WANT TO SEE
MOVE T2,VT100T(T1) ;GET OUR TYPE TO SET
HRROI T3,2 ;'NO' SETTING
MOVEM T3,ATR8BT ;CLEAR SOME PARAMETERS
MOVEM T3,ATR8BA
MOVEM T3,ATRPPO
MOVEM T3,ATRAVO
MOVEM T3,ATRSXL
TRNE T1,2 ;THIS BIT
SETOM ATRAVO ;IMPLIES AVO
TRNE T1,10 ;THIS BIT
SETOM ATRPPO ;IMPLIES PPO
TRNE T1,4 ;THIS BIT
SETOM ATRSXL ;IMPLIES THE GPO
MOVE T1,ATRSXL ;THIS
MOVEM T1,ATRGPO ;IS THIS
MOVE T1,ATRPPO ;PRINTER PORT
MOVEM T1,ATRCID ;GIVES IDCHAR
MOVEM T1,ATRLID ;AND IDLINE
HRROI T1,CMODEL ;TYPE TO SET
PJRST VSIZE ;CHECK 132-COLUMN MODE AND SUCCEED
VT100T: 'VT101 '
'VT180 '
'VT100 '
'VT180 '
'VT125 '
'VT185 '
'VT125 '
'VT185 '
'VT100 '
'VT100 '
'VT102 '
'VT102 '
'VT125 '
'VT125 '
'VT125 '
'VT125 '
VT102J: SETOM ATRJTK ;KATAKNA IS PRESENT
SKIPA T2,['VT102J'] ;MODEL NAME
VT102R: MOVE T2,['VT102 '] ;NORMAL MODEL NAME
HRROI T1,['VT102 '] ;TYPE NAME
PJRST VSIZE ;CHECK 132-COLUMN MODE AND SUCCEED
LA120K: SETOM ATRJTK ;KATAKANA IS PRESENT
SKIPA T1,[-2,,[EXP 'LA120K','LA120 ']] ;TYPE LIST
LA120R: HRROI T1,['LA120 '] ;TYPE NAME
MOVE T2,(T1) ;MODEL NAME
JRST CPOPJ1 ;SUCCEED
LA50: SKIPA T1,[-2,,[EXP 'LA50 ','LA34 ']] ;TYPE LIST
LA80: MOVE T1,[-2,,[EXP 'LA80 ','LA34 ']] ;TYPE LIST
MOVE T2,(T1) ;MODEL NAME
JRST CPOPJ1 ;SUCCEED
LA100R: SKIPA T1,[-2,,[EXP 'LA100 ','LA34 ']] ;TYPE LIST
LA34R: HRROI T1,['LA34 '] ;TYPE NAME
MOVE T2,(T1) ;MODEL NAME
MOVE T3,PRMLST+1 ;OPTIONS PARAMETER
TRNE T3,2 ;THIS BIT
SETOM ATRJTK ;MEANS KATAKANA
JRST CPOPJ1 ;SUCCEED
VT132R: SKIPA T1,[-2,,[EXP 'VT132 ','VT131 ']] ;TYPE LIST
VT131R: HRROI T1,['VT131 '] ;TYPE NAME
MOVE T2,(T1) ;MODEL NAME
MOVE T3,PRMLST+1 ;OPTIONS PARAMETER
HRROI T4,2 ;'NO' VALUE
TRNE T3,4 ;THIS BIT
SETO T4, ;SAYS GPO
MOVEM T4,ATRGPO ;PROPAGATE TO REGIS
MOVEM T4,ATRSXL ;AND SIXEL
SETOM ATRPPO ;PRINTER PORT
SETOM ATRAVO ;AND AVO
SETOM ATRCID ;PPO IMPLIES IDCHAR
SETOM ATRLID ;AND IDLINE
PJRST VSIZE ;CHECK 132-COLUMN MODE AND SUCCEED
VK100R: MOVE T2,['VK100 '] ;MODEL NAME
HRROI T1,['VK100 '] ;TYPE NAME
JRST CPOPJ1 ;SUCCEED
VT125R: MOVE T2,['VT125 '] ;MODEL NAME
HRROI T1,['VT125 '] ;TYPE NAME
MOVE T3,PRMLST+1 ;OPTIONS PARAMETER
TRNE T3,2 ;THIS BIT
SETOM ATRAVO ;MEANS AVO
PJRST VSIZE ;CHECK 132-COLUMN MODE AND SUCCEED
LQP02: SKIPA T2,['LQP02 '] ;MODEL NAME
LQP03: MOVE T2,['LQP03 '] ;MODEL NAME
HRROI T1,CMODEL ;TYPE NAME
JRST CPOPJ1 ;SUCCEED
LN03: MOVE T2,['LN03 '] ;MODEL NAME
HRROI T1,CMODEL ;TYPE NAME
JRST CPOPJ1 ;SUCCEED
DISP1R: PUSHJ P,DISPCL ;CLEAR RANDOM ATTRIBUTES
MOVEI T1,1 ;OPERATING LEVELS
MOVEM T1,ANSLVL ;ANSI LEVEL
MOVEM T1,DECLVL ;DEC LEVEL
PUSHJ P,DISPST ;SET RANDOM ATTRIBUTES
HRROI T1,['VT102 '] ;TYPE NAME TO SET
MOVE T2,['VT1XX '] ;UNKNOWN EXTENDED MODEL
PJRST DSP3.4 ;MAYBE CHECK WIDTH, THEN SUCCEED
DISP2R: PUSHJ P,DISPCL ;CLEAR RANDOM ATTRIBUTES
MOVEI T1,2 ;OPERATING LEVELS
MOVEM T1,ANSLVL ;ANSI LEVEL
MOVEM T1,DECLVL ;DEC LEVEL
SETOM ATR8BA ;REALLY IS 8-BIT INTERFACE, BUT WON'T ADMIT IT
MOVE T1,['VT200 '] ;DEFAULT TYPE IF NO USEFUL DA2 RESPONSE
MOVEM T1,DA2DEF ;SAVE FOR LATER
PJRST DSP3.1 ;RE-JOIN COMMON DISPLAY CODE
DISP3R: PUSHJ P,DISPCL ;CLEAR RANDOM ATTRIBUTES
MOVEI T1,3 ;OPERATING LEVELS
MOVEM T1,ANSLVL ;ANSI LEVEL
MOVEM T1,DECLVL ;DEC LEVEL
MOVE T1,['VT300 '] ;DEFAULT TYPE IF UNKNOWN DA2 RESPONSE
MOVEM T1,DA2DEF ;SAVE FOR LATER
SETOM ATRTSI ;REALLY CAN BE INTERROGATED BUT WON'T ADMIT IT
DSP3.1: SKIPA T1,.+1 ;GET S8C1T SEQUENCE
EPASCC <.CHESC," ","G">
PUSHJ P,TYPIST ;SELECT CONFORMANCE LEVEL (2 OR 3)
SKIPE CSIS8B ;DO WE KNOW FOR SURE (CSI, MARK PARITY)?
JRST DSP3.2 ;YES--DON'T CHECK
MOVE T1,CHKTB1+ANSID$ ;GET DA SEQUENCE
PUSHJ P,TYPIST ;SOLICIT TYPE INFORMATION AGAIN
PIMGET CH ;GET FIRST CHARACTER OF RESPONSE
PIMGET CH ;WAIT AGAIN
JFCL ;IN CASE SECOND SUCCEEDS
CAIE CH,233 ;CSI?
TDZA T1,T1 ;NO, NOT 8-BIT
MOVEI T1,1 ;YES, SET 8-BIT
SKIPE CH ;UNLESS ALREADY TIMED OUT,
PIMGET CH ;CHECK NEXT CHARACTER, TOO
SETZ T1, ;CROCK TO GO BACK TO 7-BIT
CAIN CH,333 ;IF MARK PARITY,
SETZ T1, ;DON'T TRUST THE CSI
MOVEM T1,CHKS8B ;IN RESTORE VALUE
HRROM T1,ATR8BT ;AND ATTRIBUTE FLAG
PUSHJ P,CSIFLS ;PUNT REMAINDER OF STRING
DSP3.2: SKIPA T1,.+1 ;GET S7C1T STRING
EPASCC <.CHESC," ","F"> ;STRING TO SELECT 7-BIT C1 TRANSMISSION AGAIN
SKIPL CSIS8B ;UNLESS WAS ALREADY 8-BIT,
PUSHJ P,TYPIST ;PUT IT BACK TO 7-BIT CONTROLS
SKIPA T1,.+1 ;GET (DEC)DA2 SEQUENCE
EPASCC <.CHESC,"[",.CHRAB,"c"> ;SECONDARY ATTRIBUTES REQUEST
PUSHJ P,TYPIST ;TYPE THE STRING
PUSHJ P,DISPST ;SET RANDOM VALUES
SKIPE CHKS8B ;IF 8-BIT,
SETOM ATR8BA ;ENFORCE 8-BIT ARCHITECTURE
PUSHJ P,GETSEQ ;READ PARAMETERS FROM SEQUENCE
JRST DSP3.3 ;PUNT ON ERRORS
CAIE CH,"c" ;PROPER TERMINATOR?
JRST [PUSHJ P,CSIFLS ;NO, EAT ANY REMAINING SEQUENCE
JRST DSP3.3] ;AND PUNT IT
MOVEI T1,.CHRAB ;CHARACTER FOR DA2
CAME T1,PRVPRM ;RIGHT SORT OF PRIVATENESS?
JRST DSP3.3 ;NO--PUNT
MOVE T1,PRMLST ;GET DEVICE TYPE
MOVE T6,[-DA2MAX,,DA2TYP] ;AND TYPE CODE LIST
PUSHJ P,DSPFND ;SEE WHAT WE THINK OF THE VALUE
JRST [SKIPGE T6,[-DA2T.L##,,DA2T.T##] ;IF HAVE A CUSTOMER LIST,
PUSHJ P,DSPFND ;SEARCH IT
JRST DSP3.3 ;NOT THERE EITHER--PUNT IT
JRST .+1] ;RE-JOIN MAIN LINE
MOVE T1,(T1) ;FETCH THE TYPE
MOVEM T1,DA2DEF ;SAVE IT FOR LATER
MOVE T1,PRMLST ;GET DEVICE-TYPE CODE AGAIN
SKIPGE T6,[-DA2DSL,,DA2DSP] ;IF ANYTHING IN THE TABLE,
PUSHJ P,DSPFND ;LOOK IT UP
JRST [SKIPGE T6,[-DA2D.L##,,DA2D.T##] ;CHECK FOR A CUSTOMER TABLE
PUSHJ P,DSPFND ;AND SEARCH IT
JRST .+2 ;NO MATCH
JRST .+1] ;RE-JOIN MATCH CODE
PUSHJ P,(T1) ;CALL SPECIAL PROCESSOR
SKIPN LOCDVT ;DO WE EXPECT A LOCATOR?
JRST DSP3.3 ;NO--JUST SETUP THE TYPE
SETZM LOCDVT ;CLEAR, JUST IN CASE IT'S MISSING
AOBJP T7,DSP3.3 ;SKIP OVER DEVICE TYPE
AOBJP T7,DSP3.3 ;SKIP OVER FIRMWARE VERSION
MOVE T1,PRMLST(T7) ;GET LOCATOR DEVICE TYPE
MOVEM T1,LOCDVT ;PUT IT WHERE WE'LL USE IT
DSP3.3: MOVE T1,ATRTSI ;TERMINAL STATE INTERROGATION ATTRIBUTE
TRNE T1,1 ;IF ON,
PUSHJ P,DOTSI ;ASK IT ABOUT DEC/MCS VERSUS ISO LATIN-1
MOVE T2,DA2DEF ;FETCH TYPE/MODEL NAME AGAIN
HRROI T1,CMODEL ;TYPE IS SAME AS MODEL
TLC T2,777700 ;SEE IF LOOKS LIKE AN AOBJN POINTER
TLCE T2,777700 ; ...
JRST DSP3.4 ;NO--JUST USE WHAT WE SET UP
MOVE T1,T2 ;YES--USE THIS TYPE LIST
MOVE T2,(T1) ;AND THE FIRST ENTRY FOR THE MODEL NAME
DSP3.4: HRRZ T3,ATRVFW ;VARIABLE WIDTH SETTING
CAIE T3,2 ;STILL CLEAR?
PJRST VSIZE ;NO--CHECK 132-COLUMN MODE AND SUCCEED
JRST CPOPJ1 ;YES--JUST SUCCEED NOW
DA2DSP: ^D24,,VT320S ;NEED A SPECIAL FOR THIS ONE
^D18,,VT330S ;AND THIS ONE
^D19,,VT340S ;YOU GUESSED IT
^D28,,DWTRMS ;DECTERM WINDOW
DA2DSL==.-DA2DSP
DA2TYP: 1,,['VT220 ']
2,,['VT240 ']
^D18,,['VT330 ']
^D19,,['VT340 ']
^D24,,['VT320 ']
^D28,,[-2,,[EXP 'DXTERM','VT340 ']]
DA2MAX==.-DA2TYP
DISPCL: MOVSI T1,-DA1MAX ;TABLE SIZE
HRROI T2,2 ;'NO' VALUE
DSPC.1: HRRZ T3,DA1TAB(T1) ;GET NEXT PARAMETER LOCATION
SKIPN (T3) ;IF NOT ALREADY CHANGED BY USER,
MOVEM T2,(T3) ;CLEAR THIS PARAMETER
AOBJN T1,DSPC.1 ;LOOP OVER ALL KNOWN PARAMETERS
SETZM LOCDVT ;CLEAR THIS ONE SPECIALLY
POPJ P, ;DONE
DISPST: AOBJP T7,CPOPJ ;PRE-ADVANCE OVER CONFORMANCE LEVEL
DSPS.1: MOVE T1,PRMLST(T7) ;GET NEXT ATTRIBUTE INDEX
MOVE T6,[-DA1MAX,,DA1TAB] ;TABLE POINTER
PUSHJ P,DSPFND ;FIND WHERE TO STORE IT
TRNA ;NOT THERE--DON'T USE IT
SETOM (T1) ;YES--SET THIS ONE
AOBJN T7,DSPS.1 ;LOOP OVER ALL ATTRIBUTES IN DA RESPONSE
POPJ P, ;DONE
DA1TAB:
^D1,,ATRVFW
^D2,,ATRPPO
^D3,,ATRGPO
^D4,,ATRSXL
^D5,,ATRJTK
^D6,,ATRSEM
^D7,,ATRRCS
^D8,,ATRUDK
^D9,,ATRNRC
^D11,,ATRESL
^D13,,ATRBMT
^D14,,ATR8BA
^D15,,ATRTCS
^D16,,LOCDVT
^D17,,ATRTSI
^D18,,ATRUWN
^D19,,ATRSSU
^D21,,ATRHSR
DA1MAX==.-DA1TAB
;HERE TO DO SOME (MINOR) TERMINAL STATE INTERROGATION FOR VT300 TERMINALS
DWTRMS:!
VT340S:!
VT330S:!
VT320S: SETOM ATRTSI ;VT320 CAN TOO DO TSI
SETOM ATRESL ;AND IT HAS A STATUS LINE (EVEN IF DISABLED)
SETOM ATR8BA ;8-BIT ARCHITECTURE (JUST FOR GOOD MEASURE)
POPJ P, ;DONE
DOTSI: SKIPA T1,.+1 ;GET THE DECRQUPSS SEQUENCE
EPASCC <.CHESC,"[","&","u">
PUSHJ P,TYPIST ;ASK THE TERMINAL
PIMGET CH ;GET FIRST CHARACTER
JRST [PIMGET CH ;BE POLITE ABOUT THE FIRST CHARACTER
POPJ P, ;PUNT IF DOUBLE-TIMEOUT
JRST .+1] ;GOT IT, KEEP GOING
CAIN CH,220 ;IF DCS,
JRST DOTSI1 ;THEN GO WITH IT
ANDI CH,177 ;NO--MASK TO 7-BIT
CAIE CH,.CHESC ;BETTER BE ESCAPE
JRST CSIFLS ;NO--PUNT IT AND RETURN
PIMGET CH ;YES--GET NEXT CHARACTER
POPJ P, ;SIGH
ANDI CH,177 ;7-BIT ONLY HERE
CAIE CH,"P" ;IS THIS A 7-BIT DCS?
JRST CSIFLS ;NO--PUNT
DOTSI1: PUSHJ P,GETPRM ;READ THE PARAMETER(S)
POPJ P, ;PUNT IF CAN'T READ SEQUENCE
CAIE CH,"!" ;THIS IS OUR INTERMEDIATE
JRST DCSFLS ;SIGH--PUNT IT IF INVALID
PIMGET CH ;GET THE FINAL
POPJ P, ;TIMEOUT
CAIE CH,"u" ;THE EXPECTED FINAL
CAIN CH,"u"+200 ;MARK PARITY?
TRNA ;OK EITHER WAY
JRST DCSFLS ;PUNT IF INVALID
SKIPE T1,PRMLST ;IF NOT DEC/MCS,
MOVEI T1,1 ;THEN IT'S ISO SOMETHING-OR-OTHER
HRROM T1,ATRISO ;SET IT UP THAT WAY
DCSFLS: CAIN CH,234 ;IF <ST>
POPJ P, ;THEN WE'RE DONE
SKIPN CHKS8B ;IF 7-BIT INTERFACE,
CAIE CH,233 ;MARK-PARITY ESCAPE IS AN ESCAPE
CAIN CH,.CHESC ;IF AN ESCAPE,
JRST DCSFL0 ;THEN GO CHECK FOR 7-BIT <ST>
PIMGET CH ;NO--GET NEXT CHARACTER
POPJ P, ;PUNT ON TIMEOUT
JRST DCSFLS ;LOOP UNTIL DONE
DCSFL0: PIMGET CH ;GET NEXT CHARACTER
POPJ P, ;ABORT ON TIMEOUT
SKIPN CHKS8B ;IF 7-BIT,
CAIE CH,"\"+200 ;ACCEPT MARK PARITY
CAIN CH,"\" ;IN ANY CASE,
POPJ P, ;7-BIT <ST> MEANS WE'RE DONE
JRST DCSFLS ;NO--CHECK SOME MORE
SUBTTL ROUTINE TO SETUP TTY "TYPE"
TYPE$: TXZE F,F.NO ;TEST AND ZERO NO BIT
JRST [SETZ WD, ;BIT ON--CLEAR WD
JRST TYPE$1] ;AND WRAPUP
PUSHJ P,SKIPTV ;SKIP TO VALUE
PUSHJ P,GETSIX ;GET TERMINAL NAME
JUMPN WD,TYPE$1 ;WAS ANYTHING SPECIFIED?
INTWRN (NTS,No type specified)
POPJ P, ;OK RETURN
TYPE$1: MOVEM WD,TYPE ;STORE TERMINAL TYPE
SETZM FLCHEK ;DON'T CHECK IF ALREADY HAVE THE TYPE
POPJ P, ;OK RETURN
SUBTTL ROUTINE TO SETUP TTY "MODEL"
MODEL$: TXZE F,F.NO ;WAS "NO" TYPED?
JRST [SETZ WD, ;YES, CLEAR WORD
JRST MODEL1] ;AND SET THE ZERO
PUSHJ P,SKIPTV ;NO, SKIP SPACES
PUSHJ P,GETSIX ;READ IN THE TOKEN
JUMPN WD,MODEL1 ;JUST DO IT IF OK
INTWRN (NMS,No model specified)
POPJ P, ;RETURN IF JUNK
MODEL1: MOVEM WD,MODEL ;SAVE MODEL NAME
POPJ P, ;RETURN
SUBTTL TTY CONTROL LIST ROUTINE
;FORMAT IS XWD TRMOP.,VALUE
DOTTYT:
.TOTRM,,TYPE ;TTY TYPE:XXXXXX
.TOTTN,,MODEL ;TTY MODEL:XXXXXX
.TOTCN,,CLASS ;TTY CLASS:XXXXXX
.TOAPC,,APC ;TTY APC
DOTTTA: ;START HERE IN DOTTYA
.TORSP,,RCV ;TTY RCV:XX
.TOTSP,,XMT ;TTY XMT:XX
.TOLCP,,LOCALC ;TTY LOCALCOPY
.TOCLE,,ECHO ;TTY ECHO
.TODEM,,ECHDEF ;TTY DEFER
.TOWID,,WIDTH ;TTY WIDTH:N
.TOLNB,,LENGTH ;TTY LENGTH:N
.TOSSZ,,SSIZE ;TTY STOP:N
.TOSST,,SSTOP ;TTY SSTOP
.TOSTO,,STOP ;TTY STOP
.TOFLC,,FILL ;TTY FILL:N
.TOLCT,,LC ;TTY LC
.TOTAB,,TAB ;TTY TAB
.TOFRM,,FORM ;TTY FORM
.TONFC,,CRLF ;TTY NO CRLF
.TOSND,,GAG ;TTY NO GAG
.TOSBL,,SBELL ;TTY SBELL
.TODIS,,ATRDIS ;TTY DISPLAY
.TOTAP,,TAPE ;TTY TAPE
.TOPAG,,PAGEON ;TTY PAGE
.TOPSZ,,PAGE ;TTY PAGE:N
.TOBLK,,BLANK ;TTY NO BLANKS
.TOALT,,ALT ;TTY ALT
.TORTC,,RTCOMP ;TTY RTCOMP
.TORMT,,REM ;TTY REMOTE (NOT LOCAL)
.TOXNF,,XONXOFF ;TTY XONXOFF
DOTTLA==.-DOTTTA ;LENGTH FOR DOTTYA
.TOUNP,,UNPAUSE ;TTY UNPAUSE
.TOESC,,ESCAPE ;TTY ESCAPE
.TO8BT,,ATR8BT ;TTY EIGHTBIT
.TOQOT,,QUOTE ;TTY QUOTE
.TOMXT,,IDLE ;TTY IDLEDISC
.TOEDT,,EDITOR ;TTY EDITOR
DOTTLG==.-DOTTYT
;THE FOLLOWING ARE NOT SETTABLE BY THE USER, FOR TYPEOUT ONLY, AND MUST BE LAST
DOTTTC:
.TOSLV,,SLAVE ;TTY SLAVE
DOTTLC==.-DOTTTC ;LENGTH FOR SECOND HALF OF DOTTYA
DOTTYU==.-DOTTYT
;TABLE FOR .TOATR SETTING
;FORMAT IS: XWD STORAGE-ADDRESS,BIT-ADDRESS
ATRTB1:
DEFINE ATR(SYL),<IRP SYL,<XWD ATR'SYL,[TA.'SYL]>>
ATR <8BA,8BT,AVO,BMT,BTA,CID,CLR,DIS>
ATR <ESL,GAT,GPO,HSR,ISO,JTK,LID,NKB>
ATR <NRC,OVR,PPO,RCS,SEM,SRM,SSU,SXL>
ATR <TCS,TEK,TSI,UDK,UWN,V52,VFL,VFW>
ATRNM1==.-ATRTB1 ;NUMBER OF KNOWN ATTRIBUTES
;TABLES FOR .TOAT2 & .TOAT3
;FORMAT IS: XWD STORAGE-ADDRESS,BYTE-POINTER-ADDRESS
ATRTB2:
XWD ANSLVL,[POINTR TERAT2,T2.ACL]
XWD DECLVL,[POINTR TERAT2,T2.DCL]
XWD LOCDVT,[POINTR TERAT2,T2.LDT]
ATRNM2==.-ATRTB2
ATRTB3:
;ADD CUSTOMER-DEFINED FIELDS HERE
ATRNM3==.-ATRTB3
SUBTTL SPECIAL PROCESSORS
;HERE TO START UP FILEX UNDER [10,1] TO SAVE CRASH
SUBTTL FILEX PROCESSOR
FILEX: MOVX T2,%LDCRP ;GET NUMBER OF CRASH STORAGE AREA
GETTAB T2, ;FROM THE MONITOR
MOVE T2,[10,,1] ;(FOR PRE 5.3)
TLNE T2,777760 ;HACK TO GET AROUND 5.2 BUG
MOVE T2,[10,,1] ;WHICH GAVE JUNK IN 16,,16
MOVE T4,[SIXBIT /FILEX/] ;GET CUSP NAME
JRST LOGCSP ;GO LOGIN AND RUN CUSP
SUBTTL OMOUNT PROCESSOR
OMOUNT: MOVE T4,[SIXBIT /OMOUNT/] ;GET CUSP NAME
JRST CUSP12 ;GO LOGIN AND RUN IT
SUBTTL DAEMON PROCESSOR
DAEMON: MOVE T4,[SIXBIT /DAEMON/] ;GET THE CUSP NAME
JRST CUSP12 ;GO LOGIN AND RUN IT
SUBTTL CHKPNT PROCESSOR
CHKPNT: MOVE T4,[SIXBIT /CHKPNT/] ;GET THE CUSP NAME
JRST CUSP12 ;GO LOGIN AND RUN IT
SUBTTL OPSER PROCESSOR
OPSER1: TXO F,F.CCL ;FORCE CCL ENTRY POINT
OPSER: MOVE T4,[SIXBIT /OPSER/] ;GET CUSP NAME
JRST CUSP12 ;LOGIN AND RUN IT
SUBTTL PRINTR PROCESSOR
PRINTR: MOVE T4,[SIXBIT /PRINTR/] ;GET THE CUSP NAME
JRST CUSP12 ;AND LOGIN AND START IT
SUBTTL GALOPR PROCESSOR
GALOPR: TXO F,F.CCL!F.IPCQ ;FORCE CCL RUN AND LARGE IPCF QUOTAS
MOVSI T4,'OPR' ;NAME OF PROGRAM
JRST CUSP12 ;LOGIN AND START IT
SUBTTL SYSDPY PROCESSOR
DEFINE DPYNAM,<
X VT05A,SYSDPA
X VT05B,SYSDPB
X VT06 ,SYSDPY
X VT50 ,SYSV50
X VT52 ,SYSV52
X VT61 ,SYSV61
X VK100,SYSANS ;GIGI
X VT100,SYSANS
X VT101,SYSANS
X VT102,SYSANS
X VT103,SYSANS
X VT125,SYSANS
X VT180,SYSANS
X VT185,SYSANS
X VT220,SYSANS
X VT240,SYSANS
;NON-STANDARD TERMINAL TYPES, MONITOR DOESN'T KNOW ABOUT THEM.
X HAZELT,SYSHZL ;HAZELTINE 2000
X DELTA,SYSDLT ;DELTA DATATERM
X VB10C,SYSVBC ;VB10C. HAH!
X DAS21A,SYSANS ;DAS21 RUNNING ANSI CODE
>
DEFINE X(TERM,PROG),<SIXBIT \TERM\>
DPYTRM: DPYNAM
DPYOFF=.-DPYTRM
DEFINE X(TERM,PROG),<SIXBIT \PROG\>
DPYPRG: DPYNAM
PURGE X
DPYTAB: IOWD DPYOFF,DPYTRM
SYSDPY: MOVE T1,[2,,T2] ;ARG FOR TRMOP
MOVEI T2,.TOTRM ;TERMINAL TYPE
SETO T3, ;MYSELF
TRMOP. T1, ;ASK
SETZ T1, ;GIVE A NONEXISTANT TERMINAL TYPE
MOVE T2,DPYTAB ;AOBJN POINTER TO TERMINAL TYPE TO SYSDPY NAME
CAME T1,(T2) ;IS THIS THE RIGHT NAME?
AOBJN T2,.-1 ;NO, TRY NEXT NAME
JUMPL T2,SYSDP1 ;RUN CORRESPONDING VERSION IF GOT ONE
MOVE T1,[2,,T2] ;ARG FOR TRMOP
MOVEI T2,.TOTCN ;CLASS NAME
TRMOP. T1, ;ASK
JRST SYSDP0 ;PRE-7.04
MOVE T2,DPYTAB ;AOBJN POINTER TO TYPE TABLE
CAME T1,(T2) ;HAVE A MATCH?
AOBJN T2,.-1 ;LOOP OVER TABLE FOR A MATCH
JUMPL T2,SYSDP1 ;GOT ONE, USE IT
MOVE T1,[2,,T2] ;ARG FOR TRMOP
MOVEI T2,.TOAT2 ;ATTRIBUTE BYTES
TRMOP. T1, ;ASK
JRST SYSDP0 ;SNH
MOVEI T2,['SYSANS']-DPYOFF ;DEFAULT IF ANSI
TXNE T1,T2.ACL ;IS THIS AN ANSI TERMINAL?
JRST SYSDP1 ;YES, USE THE ANSI VERSION OF SYSDPY
SYSDP0: SKIPA T4,[SIXBIT \SYSV52\] ;NO, RUN A DEFAULT VERSION
SYSDP1: MOVE T4,DPYOFF(T2) ;GET PROGRAM NAME TO RUN
TXO F,F.LOGX ;FLAG OK TO RUN UNDER ANY NUMBER
TXO F,F.SDPY ;MAKE SURE WE GET OUR PRIVS
SUBTTL LOGIN TO 1,2 AND RUN CUSP NAMED IN T4
CUSP12: PUSH P,T4 ;SAVE T4
PUSHJ P,LOGI12 ;LOG INTO 1,2 TO DISPLAY PRIVILEGED INFORMATION
JRST CUSPXX ;GO FINISH RUNNING CUSP
;HERE TO DO ARBITRARY LOGIN TO (T2) AND RUN CUSP IN (T4)
LOGCSP: PUSH P,T4 ;SAVE COPY OF CUSP NAME
PUSHJ P,LOGIN$ ;GO DO LOGIN
CUSPXX: POP P,T2 ;RESTORE T2
SUBTTL START UP CUSP NAMED IN T2
CUSP: PUSH P,T2 ;SAVE NAME
TTYSTR [ASCIZ /.R /]
PUSHJ P,TYPSIX ;TYPE NAME
TTYSTR CRLFM
POP P,T2 ;RECOVER NAME
TXNN F,F.CCL ;SEE IF FORCED CCL ENTRY POINT
TLZA T1,-1 ;CLEAR RUN OFFSET
CUSP1: MOVSI T1,1 ;SET RUN OFFSET FOR CCL ENTRY
MOVEM T2,RUNBLK+1 ;SAVE CUSP NAME
MOVSI T2,(SIXBIT /SYS/) ;GET CUSPS FROM SYS
MOVEM T2,RUNBLK ;SAVE DEVICE
HRRI T1,RUNBLK ;SET POINTER FOR RUN UUO
MOVEM F,SAVEF ;SAVE FLAGS FOR LATER
FLSBUF ;DUMP TTY BUFFER
MOVE T2,[RUN T1,] ;GET RUN UUO
TXNE F,F.PHYS ;SEE IF PHYSICAL NEEDED
TXO T2,UU.PHY ;YES--SET IT
XCT T2 ;GO RUN THE CUSP
MOVE P,[IOWD L$PDL,PDL] ;IN CASE OF FAILURE--LOGOUT
MOVEI ME,0 ;CLEAR GARBAGE
MOVE F,SAVEF ;RESTORE FLAGS
INTERR (NFD,,<JRST .+1>)
MOVE T2,RUNBLK+1 ;GET CUSP NAME
PUSHJ P,TYPSIX ;TYPE IT OUT
TTYSTR [ASCIZ / not found
/]
SUBTTL KILL JOB ROUTINE
KILJOB: TXNE F,F.RTTY ;SEE IF STILL SOME TO REEAT
PUSHJ P,TTYIND ;YES--EAT IT UP
TXNN F,F.LOGI ;SEE IF LOGGED IN
TTYSTR [ASCIZ /
./] ;NO--GIVE CONVENTIONAL DOT
LOGOF$: FLSBUF ;EMPTY TTY BUFFER
LOGO1$: LOGOUT 1, ;EXIT WITH JUST A DOT
LOGOU$: LOGOUT ;DESTROY THE JOB
LOGO2$: CTYSTR [ASCIZ \%FRCLIN INITIA - Logging out
\]
MOVEI 1,[SIXBIT \SYS\
SIXBIT \LOGOUT\
EXP 0,0,0,0] ;SYS:LOGOUT, NOTHING FANCY.
RUN 1,
JFCL
LOGOUT ;IF RUN FAILED, GIVE UP.
SUBTTL SUBROUTINE TO LIST STRUCTURE NOTES
STRUCT: MOVEI T7,0 ;PRESET FOR SYSSTR
MOVE T6,.JBFF ;SAVE FREE CORE
STRUCL: MOVEM T6,.JBFF ;RESTORE FREE CORE
SYSSTR T7, ;GET NEXT STR IN SYSTEM
POPJ P, ;GIVE UP IF NOT LEVEL-D
JUMPE T7,CPOPJ ;RETURN WHEN DONE
PUSH P,T6 ;SAVE TWO AC'S
PUSH P,T7 ; ..
MOVX T5,UU.PHS ;ACCESS /PHYSICAL
MOVE T6,T7 ;GET STR NAME
MOVEI T7,IBF ;POINT TO INPUT BUFFER HEADER
MOVSI T1,'STR' ;PREPARE
MOVSI T2,'TXT' ; FILE
MOVEI T3,0 ; STR.TXT[1,4]
MOVE T4,SYSPPN ; ON EACH STRUCTURE
PUSHJ P,HILOOK ;LOOKUP FILE ON DISK OR HISEG
JRST STRUCO ;IGNORE IF MISSING OR SCREWY
MOVE T2,(P) ;GET STR NAME
PUSHJ P,TYPSIX ;TYPE IT
TTYSTR [ASCIZ /: /]
PUSHJ P,TYPFIL ;GO TYPE FILE
STRUCO: POP P,T7 ;RESTORE STR NAME
POP P,T6 ;RESTORE .JBFF
SETZM LOWPTR ;FORGET ABOUT FILE
RELEAS TI, ;RELEASE CHANNEL
HLLZS .JBINT ;CLEAR INTERCEPT
TXZ F,F.EOF ;CLEAR EOF FLAG
JRST STRUCL ;LOOP FOR NEXT STR
SUBTTL SYSTEM STARTUP COMMAND (FORCE INITIA ON FRCLIN)
SYSIN$: TXNN F,F.CTY ;ARE WE A GOOD GUY?
JRST SYSINE ;NO
MOVE T3,FLNNUM ;GET FRCLIN UDX
MOVE T2,['INITIA'] ;INITIA COMMAND
MOVE T1,[2,,T2] ;FRCUUO ARG POINTER TO
FRCUUO T1, ;FORCE AN INITIA COMMAND ON FRCLIN
JFCL ;OH WELL
POPJ P, ;SUCCESSFUL RETURN
SYSINE: INTERR (SLC,<SYSTEM command legal only from [OPR] on CTY:>,<JRST .+1>)
TXO F,F.CERR ;FLAG ERROR
POPJ P, ;AND DISAPPEAR
;NOTE, THAT IF WE GET HERE, WE DO NOT DO INITIA NORMAL STUFF
STOMP$:
MOVE T1,MYPPN ;FIND OUT WHAT I AM
CAMN T1,FFAPPN ;ARE WE GOD?
JRST STOMP1 ;I'M O.K. - GO AHEAD.
INTERR (STC,<STOMP command legal only from [OPR]>,<JRST .+1>)
TXO F,F.CERR ;FLAG AN ERROR
POPJ P, ;AND RETURN TO COMMAND PARSER
STOMP1: SETOM TTWFLG ;FLAG THAT WE WANT TO START STOMPING.
MOVEI T1,STOMP3 ;ROUTINE TO START STOMPING WITH
MOVEM T1,JUMPPR ;WILL CATCH THIS AT END OF PROCESSING.
POPJ P, ;AND RETURN
STOMP3: OUTSTR [ASCIZ \%%TTY STOMPER detaching from terminal
\]
HRROI T1, ;SET UP FOR DETACH
ATTACH T1, ;LET GO OF THE TERMINAL
JRST [INTERR (ATF,<ATTACH uuo to detach failed!!!>,<POPJ P,>)]
MOVEI T1,TTY ;CHANNEL TO RELEASE
RESDV. T1, ;SANS TYPEOUT
JFCL ;ALREADY RELEASED?
JRST TTWINI ;JUMP INTO TTY STOMPER CODE
SUBTTL HELP ROUTINE
HELP: MOVE T1,['INITIA']
PUSHJ P,.HELPR## ;GO GIVE HELP
JRST KILJOB ;GO KILL JOB
SUBTTL SUBROUTINES TO LIST SYSTEM AND TEXT NOTICES
;ROUTINE TO TYPE OUT INITIA.TXT FROM SYS:
TEXT: MOVEI T5,0 ;READ IN ASCII MODE
MOVSI T6,'SYS' ;SYS:
MOVEI T7,IBF ;INPUT BUFFER
MOVE T1,['INITIA'] ;LOOKUP
MOVSI T2,'TXT' ; FILE
SETZB T3,T4 ; SYS:INITIA.TXT[-]
PUSHJ P,HILOOK ;FIND FILE IN HISEG
POPJ P, ;GIVE UP IF NO FILE
PUSHJ P,TYPFIL ;TYPE CONTENTS OF FILE
SETZM LOWPTR ;FORGET FILE
RELEAS TI, ;RELEASE CHANNEL
TXZ F,F.EOF ;CLEAR EOF INDICATOR
POPJ P, ;RETURN
NOTICE: MOVEI T5,0 ;READ IN ASCII MODE
MOVSI T6,'SYS' ;SYS:
MOVEI T7,IBF ;INPUT BUFFER
MOVE T1,['NOTICE'] ;LOOKUP
MOVSI T2,'TXT' ; FILE
SETZB T3,T4 ; SYS:NOTICE.TXT[-]
PUSHJ P,HILOOK ;FIND FILE IN HISEG
POPJ P, ;GIVE UP IF NO FILE
PUSHJ P,TYPFIL ;TYPE CONTENTS OF FILE
SETZM LOWPTR ;FORGET FILE
RELEAS TI, ;RELEASE CHANNEL
TXZ F,F.EOF ;CLEAR EOF INDICATOR
POPJ P, ;RETURN
SUBTTL SUBROUTINE TO TYPE TTY SETTINGS
TYPTTY: MOVE T1,[2,,T2] ;ARG POINTER
MOVEI T2,.TOATR ;ATTRIBUTES
MOVE T3,TERNUM ;SEE IF I CAN READ THEM AT ALL
TRMOP. T1, ;CAN I?
SETZM FLATTR ;NO, SO TYPE OUT 8BIT & DISPLAY HERE
TYPT.1: MOVSI T7,-DOTTYU ;LOOP OF TTY SETUP TABLE
SETZB WD,CHRSOU ;CLEAR NUMBER OF THINGS TYPED
TYPT.2: MOVE T1,[2,,T2] ;ARG POINTER
HLRZ T2,DOTTYT(T7) ;GET FUNCTION
CAIGE T2,1000 ;SEE IF READ FUNCTION
JRST TYPT.6 ;NO--IGNORE IT
HRRZ T6,DOTTYT(T7) ;GET STORAGE
MOVSI T5,-TYPTTU ;LOOP OVER SPECIAL FORMATTERS
TYPT.3: HRRZ T4,TYPTTT(T5) ;GET ITS STORAGE
CAME T4,T6 ;SEE IF SAME
AOBJN T5,TYPT.3 ;NO--LOOP
MOVE T6,TYPTTW(T5) ;YES OR END--GET NAME
HLR T5,TYPTTT(T5) ;GET ADDRESS OF FORMATTER
JUMPL T5,TYPT.5 ;IF FOUND, GO DO IT
HRRZ T6,DOTTYT(T7) ;RESTORE MATCHING VALUE
MOVSI T5,-CMDL ;ELSE LOOP OVER COMMAND TABLE
TYPT.4: HRRZ T4,CMDP(T5) ;GET ITS STORAGE
CAME T4,T6 ;SEE IF SAME
AOBJN T5,TYPT.4 ;NO--LOOP
JUMPG T5,TYPT.6 ;IGNORE IF NOT IN EITHER TABLE
MOVE T6,CMDT(T5) ;GET NAME
HLRE T5,CMDP(T5) ;GET FORMAT INDICATOR
JUMPLE T5,TYPT.6 ;IF SPECIAL ROUTINE, IGNORE
CAIL T5,3 ;SEE IF 4
MOVEI T5,3 ;YES--MERGE INTO SEQUENCE
MOVE T5,[TYPBON ;1=BIT ON
TYPBOF ;2=BIT OFF
TYPVAL]-1(T5) ;3/4=DECIMAL VALUE
;HERE WHEN STYLE IDENTIFIED
TYPT.5: MOVE T3,TRMNUM ;GET TTY NUMBER
TRMOP. T1, ;READ VALUE
JRST TYPT.6 ;IGNORE IF ERROR
PUSHJ P,(T5) ;FORMAT OUTPUT
SKIPN T1,CHRSOU ;GET CHARACTERS TYPED
JRST TYPT.6 ;NO OUTPUT THIS TIME
AOS WD ;NUMBER OF THINGS TYPED
TLC T7,-1 ;THIS IS TO BUM THE TABS AFTER THE LAST ITEM
TLCE T7,-1 ;ONLY WORKS BECAUSE "REMOTE" TYPES SOMETHING
TRNN WD,3 ;DO ONLY 4 PER LINE
JRST [TTYSTR CRLFM ;END THIS LINE
JRST TYPT.6] ;AND GET THE NEXT THING
CAIGE T1,^D8 ;NUMBER OF CHARACTERS TYPED
TTYCHR " " ;SMALL, NEED 2 TABS
TTYCHR " " ;ALIGN NEXT OUTPUT FIELD
TYPT.6: SETZM CHRSOU ;COUNT FRESH
AOBJN T7,TYPT.2 ;LOOP OVER TRMOP TABLE
POPJ P, ;RETURN
SUBTTL SUBROUTINE TO TYPE TTY ATTRIBUTES
TYPATR: MOVE T1,[2,,T2] ;POINTER FOR TRMOP
MOVEI T2,.TOATR ;WORD TO READ
MOVE T3,TRMNUM ;TTY TO READ
TRMOP. T1, ;TRY FOR IT
POPJ P, ;OLD MONITOR
MOVEM T1,TERATR ;REMEMBER VALUES
MOVE T1,[2,,T2] ;POINTER FOR TRMOP
MOVEI T2,.TOAT2 ;SECOND ATTRIBUTES WORD
TRMOP. T1, ;READ IT
SETZ T1, ;SNH
MOVEM T1,TERAT2 ;SAVE IT
MOVE T1,[2,,T2] ;POINTER FOR TRMOP
MOVEI T2,.TOAT3 ;CUSTOMER ATTRIBUTE WORD
TRMOP. T1, ;READ IT
SETZ T1, ;SNH
MOVEM T1,TERAT3 ;SAVE IT
MOVSI T7,-ATRNUM ;AOBJN POINTER TO ATTRIBUTE TYPEOUT TABLE
SETZ WD, ;CLEAR COLUMN COUNTER
TYPA.1: SETZM CHRSOU ;NO CHARACTERS YET THIS FIELD
HRRZ T1,ATRTAB(T7) ;GET BYTE POINTER
LDB T1,(T1) ;AND VALUE
HLRZ T2,ATRTAB(T7) ;GET TEXT POINTER
CAIGE T2,TAIMAX ;OFF THE END OF THE PROCESSOR TABLE?
SKIPA T3,TATDSP(T2) ;NO, GET ROUTINE FROM TABLE
MOVEI T3,TYPA.0 ;YES, USE DEFAULT ROUTINE
PUSHJ P,(T3) ;FORMAT THE VALUE
SKIPN T1,CHRSOU ;GET CHARACTERS TYPED
JRST TYPA.2 ;NO OUTPUT THIS TIME
AOS WD ;NUMBER OF THINGS TYPED
TLC T7,-1 ;THIS IS TO BUM THE TABS AFTER THE LAST ITEM
TLCE T7,-1 ; ...
TRNN WD,3 ;DO ONLY 4 PER LINE
JRST [TTYSTR CRLFM ;END THIS LINE
JRST TYPA.2] ;AND GET THE NEXT THING
CAIGE T1,^D8 ;NUMBER OF CHARACTERS TYPED
TTYCHR " " ;SMALL, NEED 2 TABS
TTYCHR " " ;ALIGN NEXT OUTPUT FIELD
TYPA.2: AOBJN T7,TYPA.1 ;LOOP OVER ATTRIBUTE TABLE
POPJ P, ;RETURN
TYPA.0: SKIPN T1 ;CHECK VALUE
TTYSTR [ASCIZ /NO/] ;"NO" FOR VALUE OF ZERO
TTYSTR 1,(T2) ;TYPE ATTRIBUTE NAME & RETURN
ATRTAB:
TERATA==TERATR ;TO AVOID CONFUSION
DEFINE ATR(TEXT,NAME,NUM<A>),<
IFNB<TEXT>,<[ASCIZ |TEXT|],,[POINTR TERAT'NUM,T'NUM'.'NAME]>
IFB<TEXT>,<TAI'NAME,,[POINTR TERAT'NUM,T'NUM'.'NAME]>
>
ATR ,ACL,2
ATR ,DCL,2
ATR EIGHTBIT,8BT
ATR 8BITARCH,8BA
ATR DISPLAY,DIS
ATR OVERSTRIKE,OVR
ATR ,CLR
ATR STATUSLINE,ESL
ATR ISO,ISO
ATR NRC,NRC
ATR DRCS,RCS
ATR UDKEYS,UDK
ATR AVO,AVO
ATR PRINTERPORT,PPO
ATR IDCHAR,CID
ATR IDLINE,LID
ATR REGIS,GPO
ATR SIXEL,SXL
ATR TEKEMULATION,TEK
ATR VT52EMULATION,V52
ATR SREGION,SRM
ATR HSCROLL,HSR
ATR VLENGTH,VFL
ATR VWIDTH,VFW
ATR USERWINDOWS,UWN
ATR ,BMT
ATR GUARDEDAREA,GAT
ATR SELECTERASE,SEM
ATR KATAKANA,JTK
ATR SESSIONS,SSU
ATR DECTCS,TCS
ATR INTERROGATION,TSI
ATR ,LDT,2
ATR ,NKB
ATRNUM==.-ATRTAB ;NUMBER OF ATTRIBUTES TO TYPE
TATDSP: ;SPECIAL ATTRIBUTE FORMATTING DISPATCH
PHASE 0
TAILDT:! TYPLDT
TAIACL:! TYPACL
TAIDCL:! TYPDCL
TAIBMT:! TYPBMT
TAICLR:! TYPCLR
TAINKB:! TYPNKB
TAIMAX:! DEPHASE
TYPLDT: SKIPN T1 ;DO WE CARE?
TTYSTR 1,[ASCIZ /NOLOCATOR/] ;NO
CAIL T1,LOCDVL ;IN RANGE OF THE TABLE?
SETZ T1, ;NO, DEFAULT TO 'UNKNOWN'
MOVE T2,LOCDVN(T1) ;FETCH VALUE
TTYSTR [ASCIZ /LOCATOR:/] ;INTRODUCTION
PJRST TYPSIX ;TYPE IN SIXBIT & RETURN
TYPACL: TTYSTR [ASCIZ /ANSLEVEL:/] ;INTRODUCTION
PJRST TYPDEC ;TYPE IN DECIMAL & RETURN
TYPDCL: TTYSTR [ASCIZ /DECLEVEL:/] ;INTRODUCTION
PJRST TYPDEC ;TYPE IN DECIMAL & RETURN
TYPBMT: MOVEI T2,[ASCIZ /BLOCKMODE/] ;STRING TO USE
JUMPE T1,TYPA.0 ;HANDLE NORMALLY IF OFF
MOVX T3,TA.BTA ;BLOCK-TRANSFER-ANSI BIT
TDNN T3,TERATR ;IS IT?
PJRST TYPA.0 ;NO, JUST SAY "BLOCKMODE"
TTYSTR 1,[ASCIZ /BLOCK:ANSI/] ;YES, SAY THIS AND RETURN
TYPCLR: MOVEI T2,[ASCIZ /COLOR/] ;TEXT IF 60HZ
MOVX T3,%CNSTS ;CNFSTS GETTAB
GETTAB T3, ;FETCH FROM THE MONITOR
SETZ T3, ;SNH
TXNE T3,ST%CYC ;50HZ?
MOVEI T2,[ASCIZ /COLOUR/] ;YES, USE THIS INSTEAD
PJRST TYPA.0 ;TYPE NORMALLY FROM THIS TEXT
TYPNKB: TRC T1,1 ;INVERT VALUE
MOVEI T2,[ASCIZ /KEYBOARD/] ;TEXT TO USE
PJRST TYPA.0 ;AND NOW TREAT NORMALLY
TYPTTT: ;TABLE OF SPECIAL FORMATTERS,,VALUE
; TYPAGA,,PAGEON
; TYPAGB,,PAGE
CPOPJ,,PAGEON ;TTY PAGE (OBSOLETE)
CPOPJ,,PAGE ;TTY PAGE:N (OBSOLETE)
TYPSSI,,SSIZE ;TTY STOP N (DEFER UNTIL TTY STOP)
TYPSST,,SSTOP ;TTY SSTOP (DEFER UNTIL TTY STOP)
TYPSTP,,STOP ;TTY STOP (ONE OF: NO STOP; STOP:N; SSTOP:N)
TYPSPD,,RCV
TYPSPD,,XMT
TYPTYP,,TYPE
TYPECL,,LOCALC
TYPECA,,ECHO
TYPECB,,ECHDEF
TYPESC,,ESCAPE
TYPUNP,,UNPAUSE
TYPAPC,,APC
TYPTYP,,CLASS
TYPTYP,,MODEL
TYPATB,,ATR8BT
TYPATB,,ATRDIS
TYPTTU==.-TYPTTT
TYPTTW: ;TABLE OF NAMES OF ABOVE
SIXBIT /PAGE/
SIXBIT /PAGE/
SIXBIT /SSIZE/
SIXBIT /SSTOP/
SIXBIT /STOP/
SIXBIT /RCV/
SIXBIT /XMT/
SIXBIT /TYPE/
SIXBIT /LOCALC/
SIXBIT /ECHO/
SIXBIT /ECHO/
SIXBIT /ESCAPE/
SIXBIT /UNPAUS/
SIXBIT /APC/
SIXBIT /CLASS/
SIXBIT /MODEL/
SIXBIT /EIGHTB/
SIXBIT /DISPLA/
;ROUTINE TO TYPE ECHO:TEXT OR NO ECHO OR JUST ECHO
TYPECL: MOVEM T1,LOCALC ;SAVE FOR ECHO:DEFER LOGIC
POPJ P, ;WAIT FOR THE NEXT ONE TO DETERMINE
TYPECA: MOVEM T1,ECHO ;SAVE FOR ECHO:DEFER LOGIC
JUMPE T1,TYPBON ;TYPE NO ECHO IF NOT SET
POPJ P, ;ELSE WAIT FOR THE NEXT OONE
TYPECB: SKIPN ECHO ;DID WE ALREADY SAY "NO ECHO"
POPJ P, ;YES, THAT'S VERBOSE ENOUGH
JUMPE T1,TYPEC1 ;NO--IS IT DEFERRED?
SKIPE LOCALC ;DEFERRED--ALSO LOCALCOPY?
TTYSTR 1,[ASCIZ/ECHO:LDEFER/] ;YES--OUTPUT THAT AND RETURN
TTYSTR 1,[ASCIZ/ECHO:DEFER/] ;NO--OUTPUT IT AND RETURN
TYPEC1: SKIPN LOCALC ;NOT DEFERRED--IS IT LOCALCOPY?
JRST TYPBOF ;NO--JUST TYPE "ECHO"
TTYSTR 1,[ASCIZ/ECHO:LOCAL/] ;YES--TYPE THAT AND RETURN
;ROUTINE TO TYPE PAGE:N OR NOPAGE
TYPAGA: MOVEM T1,PAGEON ;SAVE FOR PAGE:N LOGIC
JUMPE T1,TYPBON ;IF NO PAGE, GO TYPE
POPJ P, ;ELSE, RETURN
TYPAGB: SKIPN PAGEON ;SEE IF NO PAGE
POPJ P, ;YES--RETURN
JUMPE T1,TYPBOF ;NO--IF PAGE:0 TYPE PAGE
JRST TYPVAL ;ELSE, TYPE DECIMAL PAGE
;ROUTINE TO FORMAT SPEED
TYPSPD: ANDI T1,17 ;PROTECT AGAINST JUNK
JUMPE T1,CPOPJ ;IGNORE IF ZERO
PUSH P,T1 ;SAVE VALUE
MOVE T2,T6 ;GET NAME
PUSHJ P,TYPSIX ;TYPE IN SIXBIT
TTYSTR [ASCIZ /SPEED:/]
POP P,T1 ;RECOVER SPEED INDEX
MOVE T2,SPEEDT(T1) ;GET SPEED
PJRST TYPSIX ;TYPE IN SIXBIT
;ROUTINE TO TYPE TYPE:XXXXXX
TYPTYP: PUSH P,T1 ;SAVE THE NAME
MOVE T2,T6 ;GET WHICH FIELD
PUSHJ P,TYPSIX ;TYPE IT OUT
TTYCHR ":" ;THEN A COLON TO SEPARATE
POP P,T2 ;GET NAME IN T2
PJRST TYPSIX ;TYPE IT OUT
;ROUTINE TO TYPE APC:XXXXXX
TYPAPC: SKIPN T2,APCTXT(T1) ;GET POINTER TO APC TYPE NAME
POPJ P, ;FORGET ABOUT IT IF NONE
TTYSTR [ASCIZ /APC:/]
TTYSTR 1,(T2) ;TYPE IT OUT AND RETURN
DEFINE YY(NAME,COD),<
IFN .TO'COD-<.-APCTXT>,<PRINTX ? .TO'COD (NAME) OUT OF ORDER>
IFNB<NAME>,< 0,,[ASCIZ /NAME/] >
IFB<NAME>,< EXP 0 >
>
APCTXT: YY ,UNK
YY HARDWIRED,HWD
YY DATASET ,DSD
YY TSN ,TSN
YY GANDALF ,GAN
YY AUTODIAL,ADL
YY MICOM ,MCM
YY NRT ,NRT
YY LAT ,LAT
YY CTERM ,CTM
;HANDLE STOP PARAMETER(S)
TYPSTP: JUMPE T1,TYPBNO ;TYPE "NO STOP" IF TTY NO STOP
SKIPN SSIZE ;OR IF TTY STOP:0
JRST TYPBNO ;THEN "TTY NO STOP"
SKIPE SSTOP ;SUPER-STOP SET?
TTYCHR "S" ;YES, SO INDICATE
TTYSTR [ASCIZ\STOP:\] ;NAME THE FIELD/FUNCTIONALITY
MOVE T1,SSIZE ;GET AUTO-STOP SIZE
PJRST TYPDEC ;AND LIST DECIMAL LINES
TYPSSI: MOVEM T1,SSIZE ;SAVE SSIZE PARAMETER FOR TYPSTP
POPJ P, ;BUT OTHERWISE IGNORE
TYPSST: MOVEM T1,SSTOP ;SAVE SSTOP PARAMETER FOR TYPSTP
POPJ P, ;BUT OTHERWISE IGNORE IT
;ROUTINE TO TYPE CHARACTER VALUES
TYPESC: CAIN T1,.CHESC ;REAL ESCAPE?
JRST TYPBNO ;YES, SAY "NOESCAPE"
JRST TYPCHR ;NO, TYPE THE VALUE
TYPUNP: CAIN T1,.CHCNQ ;REAL CONTROL-Q?
JRST TYPBNO ;YES, SAY "NOUNPAUSE"
TYPCHR: PUSH P,T1 ;SAVE VALUE
MOVE T2,T6 ;GET NAME
PUSHJ P,TYPSIX ;TYPE IN SIXBIT
TTYCHR ":" ;SEPARATE FROM VALUE
POP P,T1 ;RECOVER SPEED INDEX
PJRST TYPOCT ;TYPE THE CHARACTER VALUE IN OCTAL
TYPATB: MOVE T2,FLATTR ;TYPE-ATTRIBUTES FLAG
TRNE T2,1 ;IF ON,
POPJ P, ;DON'T BE REDUNDANT
PJRST TYPBON ;NO--ADMIT TO THE VALUE HERE
;ROUTINE TO FORMAT DECIMAL
TYPVAL: PUSH P,T1 ;SAVE VALUE
MOVE T2,T6 ;GET NAME
PUSHJ P,TYPSIX ;TYPE IN SIXBIT
TTYCHR ":" ;SEPARATE FROM VALUE
POP P,T1 ;RESTORE VALUE
PJRST TYPDEC ;TYPE IN DECIMAL
;ROUTINE TO FORMAT BIT VALUES
TYPBOF: TRC T1,1 ;VALUE NORMALLY ON SO SWITCH
TYPBON: TRNN T1,1 ;SEE IF SET
TYPBNO: TTYSTR [ASCIZ /NO/] ;NO--INDICATE
MOVE T2,T6 ;GET NAME
PJRST TYPSIX ;TYPE IN SIXBIT
SUBTTL TTY SETUP PROCESSORS
;NOTE--ALL MUST PRESERVE T1, T3
SUBTTL TERMINET ROUTINE
;TRMNET -- SETUP TERMINET 300 TABS
TRMNET: MOVEI T2,TRMIMG ;GET SPECIAL TEXT TO SEND
PUSHJ P,SNDIMG ;SEND TO UNIT
SETOM T2 ;FLAG FOR THIS UNIT
GETLCH T2 ;GET LINE CHARACTERISTICS
TXO T2,GL.TAB ;SET TABS FLAG
SETLCH T2 ;SET LINE CHARACTERISTICS
POPJ P, ;RETURN
SUBTTL COMPARE EIGHT BIT ASCII STRINGS (CMPS8)
;SUBROUTINE TO COMPARE TWO EIGHT BITS ASCII STRINGS
;CALL: MOVEI T1,<ADDRESS OF FIRST STRING BLOCK>
; MOVEI T2,<ADDRESS OF SECOND STRING BLOCK>
; PUSHJ P,CMPS8
; ERROR RETURN IF STRINGS DON'T MATCH
; SKIP RETURN IF MATCH
;USES T1, T2
CMPS8: PUSH P,T1 ;SAVE THE FIRST STRING BLOCK ADDRESS
PUSH P,T2 ;SAVE THE SECOND STRING BLOCK ADDRESS
HLRZ T1,.NSASL(T1) ;GET THE NUMBER OF BYTES IN THE FIRST STRING
PUSH P,T1 ;SAVE IT
HLRZ T1,.NSASL(T2) ;GET THE LENGTH OF THE SECOND STRING
CAME T1,(P) ;ARE THEY THE SAME LENGTH?
JRST CMPS.3 ;NO, RETURN ERROR
JUMPE T1,CMPS.2 ;IF ZERO LENGTH, ALWAYS WINS
MOVE T1,[POINT 8,.NSAST] ;GET THE BYTE POINTER BITS
ADDM T1,-2(P) ;AND FIX UP BOTH
ADDM T1,-1(P) ; OF THE BLOCK POINTERS
CMPS.1: ILDB T1,-2(P) ;GET A BYTE FROM THE FIRST STRING
CAIL T1,"a" ;IS IT
CAILE T1,"z" ; LOWER CASE?
CAIL T1,340 ; OR INTERNATIONALLY
CAILE T1,376 ; LOWER CASE?
SKIPA ;NOPE
SUBI T1,"a"-"A" ;YES, CONVERT TO UPPER
ILDB T2,-1(P) ;GET A BYTE FROM THE FIRST STRING
CAIL T2,"a" ;IS IT
CAILE T2,"z" ; LOWER CASE?
CAIL T2,340 ; OR INTERNATIONALLY
CAILE T2,376 ; LOWER CASE?
SKIPA ;NOPE
SUBI T2,"a"-"A" ;YES, CONVERT TO UPPER
CAME T1,T2 ;ARE THE TWO CHARACTERS EQUAL?
JRST CMPS.3 ;NOPE. THAT'S AN ERROR
SOSLE (P) ;YES, ANY MORE CHARACTERS?
JRST CMPS.1 ;YES, DO ANOTHER ONE THEN
CMPS.2: AOS -3(P) ;NO, WE'RE HAPPY THEN
CMPS.3: POP P,(P) ;CLEAN ALL
POP P,(P) ; THE JUNK
POP P,(P) ; OFF THE STACK
POPJ P, ;AND RETURN
SUBTTL INPUT ROUTINES
;SUBROUTINE TO FIND A WORD IN A TABLE
;CALL: MOVE WD,WORD IN SIXBIT
; MOVE T1,MASK OF WHAT TYPED
; MOVE T2,[IOWD LEN,TABLE]
; PUSHJ P,FNDWRD
; ERROR RETURN
; FOUND WITH T2=INDEX OF RESULT
;USES T3, T4, T5
SUBTTL TABLE SEARCH ROUTINE
FNDWRD: MOVE T3,T2 ;SAVE POINTER
MOVEI T5,0 ;CLEAR ABBREVIATION POINTER
FNDW.1: MOVE T4,1(T3) ;GET NEXT TRIAL
XOR T4,WD ;COMPARE
JUMPE T4,FNDW.3 ;GOOD MATCH
TDNE T4,T1 ;SEE IF OK AS ABBREVIATION
JRST FNDW.2 ;NOT ABBREVIATION
SKIPE T5 ;SEE IF ABBREVIATION KNOWN
SETOM T5 ;YES--SET FLAG
SKIPN T5 ;SEE IF ANY ABBREVIATION
HRRZ T5,T3 ;SAVE POINTER
FNDW.2: AOBJN T3,FNDW.1 ;LOOP OVER LIST
SKIPG T3,T5 ;RECOVER ABBREVIATION
POPJ P, ;ERROR RETURN IF NONE
FNDW.3: SUBI T3,(T2) ;GET INDEX
MOVEI T2,(T3) ;COPY RESULT
CPOPJ1::AOS (P) ;SUCCESS
CPOPJ:: POPJ P, ;RETURN
;SUBROUTINE TO GET A CHARACTER VALUE: WHICH IS EITHER AN OCTAL CHARACTER
;CODE, A SINGLE CHARACTER ^X FOR CONTROL CHARACTER OR ^^ FOR ^
;RETURNS VALUE IN T1; USES T2
GCHVAL: PUSHJ P,SKIPTV ;SKIP TO VALUE IF ANY
CAIN CH,":" ;SEE IF VALUE
JRST GCHVA1 ;YES--SETTING NUMBER
CAIL CH,"0" ;OR
CAILE CH,"7" ; OCTAL
JRST GCHVA2 ;NO. MUST BE REAL CHARACTER
GCHVA1: PUSHJ P,GETOCT ;GET THE OCTAL CHARACTER VALUE
JRST CPOPJ1 ;OK, RETURN WITH CHAR VALUE
GCHVA2: PUSHJ P,GETCHA ;GET THE NEXT CHARACTER
CAIE CH," " ;ANY LEADING WHITESPACE?
CAIN CH," " ; (INCLUDING TABS)?
JRST GCHVA2 ;YES, SKIP IT
CAIN CH,"^" ;DOES IT LOOK LIKE A CONTROL CHARACTER?
JRST [MOVE T1,CH ;NO, GET THE CHARACTER AS GIVEN
JRST CPOPJ1] ;AND GIVE THE SUCCESS RETURN
PUSHJ P,GETCHA ;YES, GET THE NEXT CHARACTER
MOVE T1,CH ;COPY THE CHARACTER
CAIN T1,"^" ;OR DID HE REALLY MEAN CIRCUMFLEX?
JRST CPOPJ1 ;HE REALLY MEANT ^
TRNN T1,100 ;IS IT SOMETHING WE CAN MAKE A CONTROL CHAR OUT OF?
JRST [MOVX T1,.CHESC ;NO, JUST ASSUME GOOD OL' ESCAPE
POPJ P,] ;GIVE ERROR RETURN
ANDI T1,37 ;YES, MAKE IT A CONTROL CHARACTER
JRST CPOPJ1 ;AND RETURN HAPPY
;SUBROUTINE TO READ A STRING ARGUMENT, DELIMITED BY EITHER FLAVOR OF QUOTE.
;CALLED WITH STRING POINTER IN T1, MAX BYTE COUNT (NOT INCLUDING TERMINATING
;NULL) IN T2.
;DESTROYS T1-T
GSTARG: PUSHJ P,SKIPTV ;SKIP TO VALUE IF ANY
PUSHJ P,GETCHA ;GET THE FIRST QUOTE
CAIE CH,"""" ;IS IT A QUOTE
CAIN CH,"'" ; OF EITHER TYPE?
SKIPA ;YES, GO ON
POPJ P, ;NO, RETURN ERROR
MOVE T3,CH ;SAVE THE DELIMITER
JRST GSTA.2 ;SKIP INTO THE LOOP
GSTA.1: SOSL T2 ;ALLOWED TO STORE THIS ONE?
IDPB CH,T1 ;YES, STORE IT THEN
GSTA.2: PUSHJ P,GETCHA ;GET THE NEXT CHARACTER
TXNE F,F.EOF!F.ECMD ;ARE WE AT THE END OF THE LINE?
POPJ P, ;YES, THAT'S AN ERROR
CAME CH,T3 ;IS IT THE DELIMITER AGAIN?
JRST GSTA.1 ;NO, STORE IT AND TRY ANOTHER
PUSHJ P,GETCHA ;GET THE NEXT CHARACTER
CAMN CH,T3 ;IS IT THE QUOTE AGAIN?
JRST GSTA.1 ;YES, GO STORE IT
MOVEM CH,REEAT ;NO, PUT IT BACK
SETZ T2, ;GET A NULL
IDPB T2,T1 ;TERMINATE THE STRING
JRST CPOPJ1 ;AND RETURN HAPPY
;SUBROUTINE TO SKIP TO VALUE IF ANY
;SKIPS ONE : OR SEVERAL SPACES/TABS
SUBTTL SKIP TO VALUE ROUTINE
SKIPTV: CAIN CH,":" ;SEE IF :
POPJ P, ;YES--OK TO PROCEED
SKTV.1: CAIE CH," " ;SEE IF SPACE
CAIN CH," " ; OR TAB
JRST [PUSHJ P,GETCHA ;YES--SKIP ON
JRST SKTV.1] ;AND LOOP
TXNN F,F.ECMD ;IF END OF LINE NOT REACHED,
HRROM CH,REEAT ;REEAT LAST CHAR
POPJ P, ;RETURN
;ROUTINE TO READ A DECIMAL NUMBER
;RETURNS VALUE IN T1; USES T2
SUBTTL DECIMAL READ ROUTINE
SUBTTL OCTAL READ ROUTINE
GETOCT: SKIPA T2,[10] ; LOAD OCTAL BASE
GETDEC: MOVEI T2,^D10 ; LOAD DECIMAL BASE
MOVEI T1,0 ; CLEAR RESULT
GTDC.0: PUSHJ P,GETCHA ;GET LEAD CHARACTER
CAIE CH," " ;IS IT A SPACE
CAIN CH," " ; OR A TAB?
JRST GTDC.0 ;YES, IGNORE IT.
CAIE CH,"#" ;SEE IF OCTAL FORCER
JRST GTDC.1 ;NO--START ACCUMULATION
MOVEI T2,10 ;YES--CHANGE TO OCTAL RADIX
PUSHJ P,GETCHA ;AND REPLACE FIRST CHARACTER
GTDC.1: CAIL CH,"0" ;SEE IF
CAIL CH,"0"(T2) ; NUMERIC
JRST GTDC.2 ;NO--MUST BE DONE
IMULI T1,(T2) ;YES--ROUND UP
ADDI T1,-"0"(CH) ;INCLUDE THIS DIGIT
PUSHJ P,GETCHA ;GET NEXT CHARACTER
JRST GTDC.1 ;LOOP
GTDC.2: CAIN CH,"." ;SEE IF DECIMAL SUFFIX
PUSHJ P,GETCHA ;YES--SKIP IT
POPJ P, ;RETURN VALUE
;SUBROUTINE TO GET AN EIGHT BIT ASCII STRING
;CALLED WITH STRING BLOCK POINTER IN T1, MAX LENGTH IN T2
;DESTROYS T1, T2, CH
SUBTTL EIGHT BIT ASCII STRING INPUT (GETAS8)
GETAS8: HRRZ T2,.NSASL(T1) ;GET THE LENGTH OF THE STRING BLOCK
SUBI T2,.NSAST ;ACCOUNT FOR THE COUNT WORDS
LSH T2,2 ;GET THE MAXIMUM NUMBER OF BYTES
PUSH P,[0] ;INIT THE CURRENT BYTE COUNT
PUSH P,[POINT 8,.NSAST(T1)] ;SETUP THE OUTPUT BYTE POINTER
PUSHJ P,GETCHA ;GET THE FIRST CHARACTER
TXNE F,F.ECMD ;END OF STRING ALREADY?
JRST GETA85 ;YES, EXIT THE LOOP
PUSH P,CH ;PUT IT ON THE STACK
JUMPE T2,GETA84 ;DON'T BOTHER IF NO STORAGE
CAIE CH,"""" ;IS IT SOME SORT
CAIN CH,"'" ;OF QUOTING CHARACTER?
JRST GETA81 ;YES, START READING THE STRING
SETZM (P) ;NO, NO QUOTING THEN
JRST GETA82 ;ENTER THE LOOP ALREADY IN PROGRESS
GETA81: PUSHJ P,GETCHA ;GOT SOME ROOM, GET A CHARACTER
TXNE F,F.ECMD ;END OF LINE?
JRST GETA84 ;YES, QUIT
SKIPN (P) ;DOING A QUOTED STRING?
JRST GETA82 ;NO, CHECK FOR ALPHANUMERIC
CAME CH,(P) ;IS IT OUR QUOTE CHARACTER COME BACK?
JRST GETA83 ;NO, GO ON
PUSHJ P,GETCHA ;YES, GET THE NEXT CHARACTER
TXNE F,F.ECMD ;END OF LINE?
JRST GETA84 ;YES, QUIT
CAME CH,(P) ;IS IT THE QUOTE CHARACTER AGAIN?
JRST GETA84 ;NO, END OF STRING
JRST GETA83 ;YES, GO STORE THE CHARACTER
GETA82: CAIN CH,.CHCNV ;CONTROL-V?
JRST [PUSHJ P,GETCHA ;YES, GET THE NEXT CHARACTER
JRST GETA83] ;SEND IT IN ANY CASE
CAIGE CH,"0" ;IS IT A DIGIT?
JRST GETA84 ;DEFINITELY NOT
CAIG CH,"9" ;MAYBE ...
JRST GETA83 ;YEP
CAIGE CH,"A" ;HOW ABOUT SOME UPPER CASE?
JRST GETA84 ;NOPE
CAIG CH,"Z" ;MAYBE AGAIN ...
JRST GETA83 ;YEP
CAIL CH,"a" ;LAST CHANCE IS LOWER CASE
CAILE CH,"z" ; ...
JRST GETA84 ;NOPE, END OF STRING
GETA83: IDPB CH,-1(P) ;STORE THE CHARACTER
AOS -2(P) ;COUNT THE CHARACTER
SOJG T2,GETA81 ;LOOP FOR ALL OF THEM
GETA84: SKIPN (P) ;WERE WE READING A QUOTED STRING?
TXZA F,F.QUOT ;NO, SAY WE WEREN'T
TXO F,F.QUOT ;YES, REMEMBER THAT
POP P,(P) ;GET RID OF THE QUOTE CHARACTER
GETA85: POP P,(P) ;GET RID OF THE BYTE POINTER
POP P,T2 ;GET THE BYTE COUNT
HRLM T2,.NSASL(T1) ;STORE THE BYTE COUNT
POPJ P, ;AND RETURN
;SUBROUTINES TO CONVERT A SIXBIT NAME TO AN EIGHT BIT ASCII STRING
;EXPECTS SIXBIT WORD IN WD, STRING BLOCK ADDRESS IN T1
;DESTROYS CH
SUBTTL EIGHT BIT STRING FROM SIXBIT WORD ROUTINE (GET628)
GET628: PUSH P,[POINT 6,WD] ;SETUP A POINTER TO THE SIXBIT WORD
PUSH P,T1 ;SAVE THE STRING BLOCK POINTER
HRRZ CH,.NSASL(T1) ;GET THE NUMBER OF WORDS IN THE BLOCK
SUBI CH,.NSAST ;ACCOUNT FOR THE HEADER WORDS
LSH CH,2 ;CONVERT TO A BYTE COUNT
CAIL CH,6 ;ENOUGH FOR A WHOLE WORD OF SIXBIT?
MOVEI CH,6 ;YES, LIMIT IT TO SIX CHARACTERS
PUSH P,CH ;SAVE THE BYTE COUNT
MOVE CH,[POINT 8,.NSAST] ;GET THE BYTE POINTER BITS
ADDM CH,-1(P) ;MAKE THE BLOCK POINTER A BYTE POINTER
HRLZS T1 ;INIT THE BYTE COUNTER, SAVE ADDR IN LH
GET6.1: SOSGE (P) ;ANY MORE BYTES TO DO?
JRST GET6.2 ;NO, EXIT LOOP
ILDB CH,-2(P) ;GET THE NEXT BYTE
JUMPE CH,GET6.2 ;END OF STRING IF ZERO
ADDI CH," "-' ' ;CONVERT IT TO ASCII
IDPB CH,-1(P) ;STORE IT IN THE OUTPUT STRING
AOJA T1,GET6.1 ;LOOP FOR ALL THE BYTES
GET6.2: MOVS T1,T1 ;SWAP HALVES OF COUNT WORD
HLLM T1,.NSASL(T1) ;STORE THE NEW BYTE COUNT
POP P,(P) ;GET RID OF THE BYTE LIMIT
POP P,(P) ;GET RID OF THE OUTPUT POINTER
POP P,(P) ;GET RID OF THE INPUT POINTER
POPJ P, ;AND RETURN
;SUBROUTINE TO GET A SIXBIT NAME FROM A STRING BLOCK
;EXPECTS STRING BLOCK ADDRESS IN T1
;RETURNS SIXBIT NAME IN WD, LEAVES WHATEVER WAS IN CH, MASK IN T1, DESTROYS T2
SUBTTL SIXBIT NAME FROM STRING BLOCK ROUTINE (GET826)
GET826: PUSH P,CH ;SAVE THE OLD TERMINATOR
MOVEI T2,.NSAST(T1) ;POINT TO THE EIGHT BIT STRING STORAGE
HRLI T2,(POINT 8,) ;MAKE IT A BYTE POINTER
PUSH P,T2 ;PUT THE BYTE POINTER ON THE STACK
HLRZ T1,.NSASL(T1) ;GET THE NUMBER OF BYTES IN THE STRING
PUSH P,T1 ;SAVE THE BYTE COUNT
SETZB T1,WD ;CLEAR RESULTS
MOVEI T2,6 ;GET MAX NUMBER OF BYTES
GET8.1: LSH WD,6 ;SHIFT THE RESULT ANOTHER CHARACTER
LSH T1,6 ;SHIFT THE MASK AS WELL
SOSGE (P) ;ANOTHER BYTE COMING?
SKIPA CH,[" "] ;NO, FILL WITH A SPACE
ILDB CH,-1(P) ;YES, GET IT
ANDI CH,177 ;FORCIBLY MAKE IT 7 BIT ASCII (WELL ...)
CAIL CH,"a" ;IS IT
CAILE CH,"z" ; LOWER CASE?
SKIPA ;NOPE
SUBI CH,"a"-"A" ;YES, CONVERT TO UPPER
IORI WD,' '-" "(CH) ;STORE THE CHARACTER
TRNE WD,77 ;DID WE JUST STORE SOMETHING?
TRO T1,77 ;YES, LITE THE MASK
SOJG T2,GET8.1 ;LOOP IF MORE BYTES TO DO
POP P,(P) ;GET RID OF THE COUNT
POP P,(P) ;AND THE BYTE POINTER
POP P,CH ;RESTORE THE OLD TERMINATOR
POPJ P, ;AND RETURN
SUBTTL SIXBIT NAME ROUTINE (GETSIX)
;SUBROUTINE TO GET A SIXBIT NAME
;RETURNS SIXBIT NAME IN WD, TERMINATOR IN CH, MASK IN T1
GETSIX: SETZB T1,WD ;CLEAR RESULTS
GETSI1: PUSHJ P,GETCHA ;GET NEXT CHARACTER
CAIL CH,"0" ;SEE IF ALPHANUMERIC
CAILE CH,"9"
CAIL CH,"A"
CAILE CH,"Z"
CAIL CH,"a"
CAILE CH,"z"
JRST GETSI3 ;NO--EXIT
CAIL CH,"a" ;IF LOWER CASE,
TRZ CH,40 ;FORCE UPPER
GETSI2: TLOE T1,(77B5) ;MASK NEXT CHAR ON
JRST GETSI1 ;LOOP
ROT T1,6 ;POSITION MASK
LSH WD,6 ;POSITION SIXBIT NAME
IORI WD,-40(CH) ;INCLUDE NEXT CHAR
JRST GETSI1 ;LOOP FOR MORE
GETSI3: CAIE CH," " ;SEE IF TAB OR
CAIN CH," " ;BLANK SEPARATOR
JUMPE T1,GETSIX ;IF BLANK OR TAB FIELD, SKIP LEADING BLANKS
JUMPE T1,CPOPJ ;RETURN IF NULL
GETSI4: TLNE T1,(77B5) ;SEE IF LEFT ADJUSTED
POPJ P, ;YES--RETURN
LSH T1,6
LSH WD,6
JRST GETSI4
;SUBROUTINE TO CHANGE TTXXX: INTO TTYXXX:
;THIS ALLOWS 2 LETTER GENERIC DEVICE NAMES
;ROUTINE ALSO INSERTS LEADING 0 IN TTY NUMBERS TO SIMPLIFY
;COMPARES
SUBTTL TTY EXPANSION ROUTINE (XPNTTY)
XPNTTY: CAMN WD,[SIXBIT /CTY/]
MOVE WD,CTYTTY ; GET TTY NNN FOR CTY
MOVE T1,WD ; COPY WORD
TRNN WD,777777 ;DOES THIS JUST LOOK LIKE
TLNE WD,^-'777' ; A STRING OF DIGITS?
JRST XPNT.0 ;NO, GO ON
MOVSS WD ;YES, PUT THE DIGITS INTO THE RIGHT HALF
HRLI WD,'TTY' ;AND FAKE UP A TTY NAME
XPNT.0: TLC T1,'TT0' ;TEST TT THEN DIGIT
TRNN T1,77 ;MUST BE LE 5 CHARS
TLNE T1,777770 ;AND THAT FORM
JRST XPNT.1 ;NOT--LEAVE ALONE
MOVE T1,WD ;MAKE ANOTHER COPY
LSHC T1,-^D24 ;IS--SEPARATE GENERIC PART
LSH T1,6 ;MOVE OVER
TRO T1,'Y' ;INCLUDE THE Y
LSHC T1,^D18 ;REJOIN
MOVE WD,T1 ;RESTORE TO NORMAL AC
XPNT.1: TRNN WD,77 ;SEE IF LESS THAN 6 CHARS
TRNN WD,-1 ;SEE IF GREATER THAN 3
POPJ P, ;NO--RETURN
TRNE T1,^-'777' ;IS THIS EVEN A NUMERIC NAME?
POPJ P, ;NO. MUST BE LAT STRING
HRRZ T1,WD ;YES--GET RIGHT HALF
TRC T1,'0 ' ;REMOVE DIGIT OFFSET
TRNE T1,7700 ;SEE IF SECOND DIGIT
TRC T1,'0 ' ;YES--REMOVE ITS OFFSET
TRNE T1,707070 ;VERIFY ALL DIGITS
POPJ P, ;NO--LEAVE ALONE
HRRZ T1,WD ;OK--GET CLEAN COPY
SKIPA ;ALL DIGITS
LSH T1,-6 ; ADJUST
TRNN T1,77 ; DIGITS
JRST .-2 ; ..
TRNN T1,770000 ;SEE IF FILL NEEDED
TRO T1,'0 ' ;YES--FILL WITH 0
TRNN T1,7700 ;SEE IF MORE FILL
TRO T1,'0 ' ;YES--AGAIN
HRR WD,T1 ;RETURN TO ANSWER
POPJ P, ;RETURN
SUBTTL CVTSIX
;SUBROUTINE CVTSIX - CONVERT OCTAL NUMBERS IN THE RANGE
; 0-777 TO LEFT-JUSTIFIED SIXBIT. ON ENTRY T1=BINARY, ON
; RETURN T1=SIXBIT VALUE
; NOTE: THIS SUBROUTINE STRIPS TRAILING ZEROS.
CVTSIX: TDZ T1,[-1,,777000] ; CLEAR OUT GARBAGE
MOVE T3,[POINT 6,T1] ; PREPARE BYTE POINTER
CVTLOP: IDIVI T1,10 ; DIVIDE OCTAL
HRLM T2,(P) ; STACK REMAINDER
SKIPE T1 ; QUIT WHEN DONE
PUSHJ P,CVTLOP ; ELSE LOOP
HLRZ T2,(P) ; UNSTACK
TRO T2,20 ; SIXBITIZE
IDPB T2,T3 ; STORE IN LEFT HALF OF T1
POPJ P,0
;SUBROUTINE CVTBIN - CONVERT RIGHT HALF OCTAL TO SIXBIT
;CALL MOVE WD,ARG
; PUSHJ P,CVTBIN
;RETURN CPOPJ
CVTBIN: PUSH P,WD+1
TDZ WD,[XWD -1,707070]
LSHC WD,-3
LSH WD,-3
LSHC WD,-3
LSH WD,-3
LSHC WD,6
POP P,WD+1
POPJ P,
;SUBROUTINE TO GET NEXT CHARACTER
;RETURNS CHARACTER IN CH
SUBTTL CHARACTER ROUTINE (GETCHA)
GETCHA: SKIPE REEAT ;SEE IF REPEATING CHAR
JRST [HRRE CH,REEAT ;REPEAT IT
SETZM REEAT ;ONLY ONCE
POPJ P,] ;RETURN
SETOM CH ;PRESET EOF
TXNE F,F.EOF ;SEE IF EOF ALREADY
POPJ P, ;YES--RETURN
MOVEI CH,.CHLFD ;PRESET EOL
TXNE F,F.ECMD ;SEE IF END ALREADY
POPJ P, ;RETURN IF SO
SKIPE CH,GETCH ;SEE IF INPUT ROUTINE
PUSHJ P,(CH) ;YES--GO READ
TXOA F,F.ECMD ;END OF LINE--SET FLAG
POPJ P, ;ELSE, RETURN
MOVEI CH,0 ;CLEAR CH IF END
POPJ P, ;RETURN
SUBTTL SUBROUTINE TO READ FROM COMMAND TTY
;SKIP RETURNS WITH VALUE IN CH
;NON-SKIPS IF END OF LINE (BREAK)
TTYIN: GETLIN ME, ;GET CURRENT LINE
TLNE ME,-1 ;IF DETACHED, ALL DONE
INCHSL CH ;GET CHARACTER
JRST TTYI.2 ;ALL DONE IF BUFFER EMPTY
JUMPE CH,TTYIN ;IGNORE IF NULL
CAIE CH,.CHCRT ;ALSO IF C.RET.
CAIN CH,.CHDEL ; OR NULL
JRST TTYIN ; IGNORE
CAIE CH,"!" ;SEE IF COMMENT
CAIN CH,";" ; OR OTHER FORM
JRST TTYIND ;YES--GO DISCARD LINE
TTYI.1: CAIE CH,.CHBEL ;IF BELL
CAIN CH,.CHESC ; OR ESCAPE,
JRST TTYI.2 ;IT IS ALL DONE
CAIL CH,.CHLFD ;IF LESS THAN LINE FEED
CAILE CH,.CHFFD ; OR GREATER THAN FORM FEED
JRST CPOPJ1 ; THEN OK
TTYI.2: TXZ F,F.RTTY ;INDICATE SUCCESSFUL REEATING
POPJ P, ;ELSE, ALL DONE
TTYIND: INCHSL CH ;GET CHARACTER TO DISCARD
JRST TTYI.2 ;RETURN IF DONE
PUSHJ P,TTYI.1 ;ANALYZE RESULT
POPJ P, ;RETURN IF EOL
JRST TTYIND ;LOOP UNTIL DONE
SUBTTL COMMAND LINE PROCESSOR
; SUBROUTINE TO INPUT FROM FILE DISCARDING
; COMMENTS AND HANDLING CONTINUATIONS
FILINC: SKIPE CH,FILICH ;SEE IF LEFT OVER CHARACTER
JRST FILI.1 ;YES--REUSE IT
PUSHJ P,FILI.3 ;NO--GET NEXT FROM FILE
POPJ P, ;AT END, RETURN
FILI.1: SETZM FILICH ;CLEAR LEFT OVERS
CAIE CH,"-" ;SEE IF CONTINUATION
JRST CPOPJ1 ;NO--GOOD RETURN
FILI.2: PUSHJ P,FILI.3 ;YES--SKIP ON
JRST FILINC ;IF END, GET CONTINUATION
CAIE CH," " ;IGNORE TRAILING
CAIN CH," " ; SPACES AND TABS
JRST FILI.2 ;LOOP
MOVEM CH,FILICH ;NOT EOL, MUST BE REAL -
MOVEI CH,"-" ;RETURN IT
JRST CPOPJ1 ;SAVING NEXT CHAR FOR LATER ON
;SUBROUTINE TO STRIP COMMENTS
FILI.3: PUSHJ P,FILIN ;GET NEXT CHAR
POPJ P, ;IF EOL, INDICATE THAT
CAIE CH,"!" ;ELSE SEE IF COMMENT
CAIN CH,";" ; OR OLD FORM
SKIPA ;YES
JRST CPOPJ1 ;NO--GOOD RETURN
FILI.4: PUSHJ P,FILIN ;SKIP REST OF LINE
POPJ P, ;GIVE EOL RETURN
JRST FILI.4 ;LOOP
SUBTTL SUBROUTINE TO TYPE CONTENTS OF FILE
TYPFIL: TXO F,F.TSOL ;INDICATE NOT AT START OF LINE
TXZ F,F.ECMD!F.EOF ;INDICATE NOT AT EOF
TYPF.1: PUSHJ P,FILIN ;GET NEXT CHARACTER
JUMPL CH,TYPF.2 ;RETURN AT EOF
CAIN CH,.CHLFD ;IF LINE FEED,
TXZA F,F.TSOL ;AT EOL, CLEAR LINE FULL FLAG
TXOA F,F.TSOL ;NOT EOL, INDICATE SOMETHING TYPED
TTYCHR .CHCRT ; OUTPUT C.RET.
TTYCHR (CH) ;OUTPUT CHARACTER
JRST TYPF.1 ;LOOP UNTIL DONE
TYPF.2: TXZE F,F.TSOL ;SEE IF ANYTHING ON THIS LINE
TTYSTR CRLFM
POPJ P, ;NOW RETURN
;SUBROUTINE TO LOOKUP A FILE (MAYBE IN HISEG)
;CALL WITH:
; T1 THRU T4 SET TO 4-WORD LOOKUP BLOCK
; T5 THRU T7 SET TO OPEN BLOCK
; PUSHJ P,HILOOK
; RETURN HERE IF FILE NOT FOUND
; RETURN HERE IF FILE EXISTS (LOWPTR SET TO BYTE PTR OR 0)
HILOOK: OPEN TI,T5 ;OPEN THE FILE
POPJ P, ;FILE NOT FOUND
TXNN F,F.ANSW ;IS THIS A FORCED COMMAND?
JRST HILK.7 ;NO--DO THE SLOW THING
PUSH P,T4 ;SAVE THE PPN FOR A SPELL
LOOKUP TI,T1 ;GO FIND THE FILE
SETO T3, ;NOT THERE? MAKE AN UNLIKELY DATE WORD
TRZ T2,-1 ;IN ANY CASE, CLEAR THE ACCESS DATE JUNK
POP P,T4 ;AND RESTORE THE PPN WORD
PUSHJ P,HIFIND ;IS THIS IN THE HISEG TABLES?
JRST HILK.2 ;NO--GO MEMORIZE THE FILE
HILK.1: SKIPN T1,HS$PTR(I) ;DOES THE FILE EXIST?
POPJ P,0 ;NO--GIVE NON-SKIP RETURN
MOVEM T1,LOWPTR ;REMEMBER BYTE POINTER TO STRING
JRST CPOPJ1 ;GIVE GOOD RETURN
;HERE TO REMEMBER A FILE
HILK.2: PUSHJ P,HILOCK ;INTERLOCK THE HISEG
JRST HILK.7 ;GIVE UP IF CAN'T LOCK
PUSHJ P,HIFIND ;GO FIND THE FILE IN THE HISEG TABLE
; ON THE CHANCE THAT IT SNUCK IT.
SKIPA ;NO--THAT IS WHAT I THOUGHT
JRST HILK.1 ;YES--IT HAS SNUCK IT
MOVE I,JOBN ;GET OUR JOB NUMBER
CAME I,LOKJOB ;DO WE OWN THE INTERLOCK
AOS ITLCNT ;NO, COUNT IT BUT TRY TO CONTINUE
MOVSI I,-N$HSGF ;MAKE AN AOBJN POINTER
HILK.3: SKIPE HS$DEV(I) ;IS THIS SLOT FREE?
AOBJN I,.-1 ;NO--KEEP LOOKING
JUMPGE I,HILK.7 ;TABLE FULL?
PUSH P,T6 ;REMEMBER DEVICE, BUT NOT SO THAT HIFIND
;FINDS IT BEFORE FILE ACTUALLY GETS IN
;(PUT IT IN HS$DEV(I) ON COMPLETION)
SETOM HS$DEV(I) ;RESERVE THIS SLOT
SETZM HS$PTR(I) ;ZERO POINTER
SETOM HS$DAT(I) ;ASSUME THE FILE'S NOT THERE
MOVEM T1,HS$FIL(I) ;REMEMBER FILE NAME
MOVEM T2,HS$EXT(I) ;REMEMBER EXTENSION
MOVEM T4,HS$PPN(I) ;REMEMBER PPN
LOOKUP TI,T1 ;FIND THE FILE
JRST HILK.8 ;FILE NOT FOUND
MOVEM T3,HS$DAT(I) ;REMEMBER THE FILE'S CREATION DATE/TIME
;HERE TO COPY FILE INTO THE HISEG
HLRZ T2,.JBHRL ;FIND WHERE IN HIGH SEGMENT
TRO T2,400000 ;PUT IN HIGH-SEG BIT
MOVE T1,HIPTR ;GET POINTER TO STRING
TRNN T1,-1 ;IF NOT SET...
HRRI T1,1(T2) ;...GET FIRST FREE IN HIGH SEG
MOVEM T1,HIPTR ;INITIALIZE IT
MOVEM T1,HS$PTR(I) ;REMEMBER FOR THE FUTURE
TXZ F,F.ECMD!F.EOF ;FLAG NOT AT EOF
HILK.4: HRRZ T1,HIPTR ;GET POINTER TO STRING
ADDI T1,10 ;AVOID USUAL END EFFECTS
HRRZ T2,.JBHRL ;GET SIZE OF HISEG
CAMG T1,T2 ;WILL WE NEED MORE CORE
JRST HILK.5 ;NO--KEEP GOING
HRLZ T1,T1 ;DO A CORE UUO FOR HISEG
CORE T1, ; ..
JRST [AOS CORCNT ;COUNT THE FAILURE FOR DEBUGGING
SETZM HS$DEV(I);FORGET THE FILE
SETZM HS$PTR(I);AND THE POINTER
POP P,T6
SETZM LOWPTR ;FILE NOT FOUND
JRST CPOPJ1] ;BUT STILL SET UP
HILK.5: PUSHJ P,FILIN ;GET A BYTE
JUMPL CH,HILK.6 ;EOF?
IDPB CH,HIPTR ;STORE THE BYTE IN THE HISEG
JRST HILK.4 ;KEEP LOOKING
HILK.6: SETZM CH ;FLAG END OF FILE
IDPB CH,HIPTR ; ..
IDPB CH,HIPTR ; ..
HILK.8: POP P,HS$DEV(I) ;NOW, REMEMBER DEVICE IN TABLE
JRST HILK.1 ;RETURN TO STORE POINTERS
;HERE IF USER IS LOGGED IN -- JUST DO THE LOOKUPS
HILK.7: SETZM LOWPTR ;MAKE SURE WE READ FILE
LOOKUP TI,T1 ;LOOK FOR THE FILE
POPJ P,0 ;FILE NOT FOUND
JRST CPOPJ1 ;FILE SETUP
;SUBROUTINE TO FIND A FILE IN HISEG TBALES
;CALL WITH:
; T1 = FILE NAME
; T2 = EXTENSION
; T3 = DATE/TIME/PROTECTION/MODE WORD
; T4 = PPN
; T6 = DEVICE
; PUSHJ P,HIFIND
; HERE IF NOT IN TABLE
; HERE IF IN TABLE (INDEX IN I)
HIFIND: MOVSI I,-N$HSGF ;AOBJN PTR
HFND.1: CAME T6,HS$DEV(I) ;RIGHT DEVICE
JRST HFND.2 ;NO.
CAME T1,HS$FIL(I) ;RIGHT FILE
JRST HFND.2 ;NO.
CAME T2,HS$EXT(I) ;RIGHT EXTENSION
JRST HFND.2 ;NO
CAME T4,HS$PPN(I) ;RIGHT PPN
JRST HFND.2 ;NO
CAMN T3,HS$DAT(I) ;RIGHT DATE/TIME
JRST CPOPJ1 ;YES--WE WON
MOVE T3,JOBN ;NO, THE FILE MUST HAVE CHANGED
CAMN T3,LOKJOB ;DO WE ALREADY OWN THE INTERLOCK?
JRST HFND.3 ;YES, DON'T TRY TO GET IT AGAIN THEN
PUSHJ P,HILOCK ;NO, GET THE INTERLOCK THEN
POPJ P, ;OH, BUGGER IT! IT AIN'T THERE.
HFND.3: SETZB T3,HS$DEV(I) ;FORGET THAT WE EVER SAW IT
EXCH T3,HS$PTR(I) ;GET AND ZERO THE MEMORY POINTER
MOVE T8,T3 ;SAVE IT INCASE IT'S THE END OF MEMORY
;PERFORM A RATHER TEDIOUS LOOP TO SEE IF THIS IS THE LAST FILE IN MEMORY.
ILDB CH,T3 ;GET A CHARACTER
JUMPN CH,.-1 ;LOOP IF THERE'S MORE GETTING TO BE HAD
ILDB CH,T3 ;SEEM TO REMEMBER THAT FILES END WITH 2 NULLS
JUMPN CH,.-3 ; ...
CAMN T3,HIPTR ;ARE WE AT THE END OF MEMORY?
MOVEM T8,HIPTR ;YES, RECLAIM THE SPACE
POPJ P, ;AND SAY IT ISN'T HERE
HFND.2: AOBJN I,HFND.1 ;LOOP OVER WHOLE TABLE
POPJ P,0 ;NOT THERE
;SUBROUTINE TO INTERLOCK THE HISEG
;CALL WITH:
; PUSHJ P,HILOCK
; ERROR RETURN IF CAN'T GET HISEG
; RETURN HERE
;NOTE: HISEG IS RELEASED ON POPJ
;
HILOCK: MOVE T8,[[XWD 4,INTLOC
XWD 0,ER.ICC!ER.OFL
0
0],,INTBLK]
BLT T8,INTBLK+3
MOVEI T8,INTBLK ; POINT TO TRAP BLOCK
MOVEM T8,.JBINT ; SET FOR TRAPPING!
TR.SET: MOVEI T8,0 ;CLEAR USER WRITE PROTECT
SETUWP T8, ; ..
JRST [SETZM NOINT
POPJ P,0]
SETOM NOINT ; NOT INTERRUPTABLE
AOSN LOCKWD ;GET THE INTERLOCK
JRST HLCK.2 ;IF THE RESULT IS ZERO WE WON
SETZM NOINT ;DIDN'T GET INTERLOCK, MAKE
; INTERRUPTABLE AGAIN
HLCK.1: MOVE T8,MYBIT ;BIT SAYING WE ARE WAITING FOR THE INTERLOCK
IORM T8,@MYWRD ;LIGHT FOR OWNER TO SEE
MOVEI T8,^D15000 ;SLEEP FOR 15 SECONDS
HIBER T8, ;
JRST [MOVEI T8,10 ;SLEEP 8 SECONDS
SLEEP T8, ;SLEEP IF HIBER NOT IMPLEMENTED
JRST .+1] ;CONTINUE
MOVE T8,MYBIT ;GET BIT AGAIN
ANDCAM T8,@MYWRD ;NOT ACTUALLY WAITING ANYMORE
PUSHJ P,HIFIND ;SEE IF THE FILE IS IN CORE YET
CAIA ;NO, MUST WAIT FOR IT
JRST UNLK.4 ;RETURN WITHOUT INTERLOCK
SETOM NOINT ;LOCK OUT INTS.
AOSN LOCKWD ;OPEN YET??
JRST HLCK.2 ;YES. PROCEED
SETZM NOINT ;STILL LOCKED. BETTER INVESTIGATE THIS...
HLCK.5: PUSH P,LOKJOB ;SAVE A COPY FOR CHECKING
PUSH P,LOKTTY ;GET HIM TOO
HRLZ T8,-1(P) ;POINT TO INTERLOCKER'S JBTSTS
GETTAB T8, ;GET IT
JRST FORCE ;??? FORCE THE LOCK
TLC T8,440000 ;RUN+JNA
TLCE T8,440000 ;BOTH ON?
JRST FORCE ;NO, SOMETHING WRONG
HRLZ T8,-1(P) ;SET UP JOB # AGAIN
HRRI T8,.GTPRG ;LOOK FOR PROGRAM NAME
GETTAB T8, ;GET IT
JRST FORCE ;TOO BAD
CAME T8,['INITIA'] ;RIGHT GUY?
JRST FORCE ;NO, TOO BAD
MOVE T8,(P) ;GET OWNER'S TTY UDX
DEVTYP T8, ;LOOK AT TTY'S PROPERTIES
JRST FORCE ;TOO BAD
LDB T8,[POINTR(T8,TY.JOB)] ;GET JOB # USING IT
CAME T8,-1(P) ;RIGHT GUY?
JRST FORCE ;NO, GOT HIM!!
SUB P,[2,,2] ;RESTORE THE PDL
JRST HLCK.1 ;GOOD LOCK, RETURN
HLCK.2: POP P,T8 ;GET RETURN PC
PUSH P,JOBN ;GET OUR JOB #
POP P,LOKJOB ;STORE FOR OTHERS
PUSH P,TERNUM ;AND OUR LINE
POP P,LOKTTY ;SAVE IT AWAY
PUSHJ P,1(T8) ;SKIP CALL COROUTINE
UNLOCK: SOS (P) ;INDICATE FAILURE
MOVE T8,JOBN ;GET OUR JOB NUMBER
CAME T8,LOKJOB ;WE OWN THE INTERLOCK?
JRST UNLK.4 ;NO
MOVE T8,TERNUM ;GET OUR TTY NUMBER
CAME T8,LOKTTY ;WE OWN IT?
JRST UNLK.4 ;NO
SETZM LOKJOB ;CLEAR OWNER
SETZM LOKTTY ;AND OWNER'S TTY
SETOM LOCKWD ;RESET INTERLOCK
PUSH P,T1 ;SAVE A FEW ACS
PUSH P,T2 ;...
PUSH P,T3 ;...
MOVSI T1,-JBWATL ;NUMBER OFF ENTRIES IN JOBWAT TABLE
SKIPN T2,JOBWAT(T1) ;ANYBODY WAITING HERE
AOBJN T1,.-1 ;NO, LOOK SOME MORE
JUMPGE T1,UNLK.1 ;NOBODY WAITING FOR THE INTERLOCK
JFFO T2,.+1 ;GET WAITERS BIT
MOVEI T2,(T1) ;GET THE WORD NUMBER
IMULI T2,^D36 ;TO A JOB NUMBER
ADDI T2,(T3) ;...
WAKE T2, ;WAKE UP THE JOB
JFCL ;OH WELL
MOVSI T2,(1B0) ;FIGURE OUT THE BIT TO CLEAR
MOVNS T3 ;...
LSH T2,(T3) ;POSITION IT
ANDCAM T2,JOBWAT(T1) ;SO OTHER INITIAS DONT TRIP OVER A STALE JOB
UNLK.1: POP P,T3 ;RESTORE
POP P,T2 ;...
POP P,T1 ;...
UNLK.4: MOVEI T8,1 ;GO AND WRITE PROTECT
SETUWP T8, ; THE HISEGMENT AGAIN
JFCL
SETZM .JBINT ; TURN OFF TRAPPING
SETZM NOINT ; CLEAR NO INTERRUPT WORD
JRST CPOPJ1 ;GIVE SKIP RETURN
;HERE TO FORCE THE LOCK
FORCE: AOS FRCTRY ;COUNT ATTEMPTS TO FORCE THE LOCK
MOVE T8,LOKJOB ;GET CURRENT OWNER OF LOCK
CAME T8,-1(P) ;SAME AS WE CHECKED?
JRST FORCE1 ;NO
MOVE T8,LOKTTY ;GET TTY OF OWNER
CAME T8,0(P) ;SAME AS WE CHECKED?
JRST FORCE1 ;NO
SETZM LOKJOB ;NO OWNER
SETZM LOKTTY ; OR TTY
SETOM LOCKWD ;GIVE UP INTERLOCK
AOS FRCCNT ;COUNT NUMBER OF ACTUAL FORCES
SUB P,[2,,2] ;RESTORE PDL
JRST HLCK.1 ;RE-JOIN THE COMPETITION
FORCE1: SUB P,[2,,2] ;RESTORE THE PDL
JRST HLCK.5 ;CHECK AGAIN
; HERE TO PROCESS CONTROL-C INTERCEPT
INTLOC: MOVEM T1,TEMP1 ; SAVE T1
HLRZ T1,INTBLK+3 ; GET REASON FOR INTERRUPT
CAIN T1,ER.OFL ; DSK OFF LINE?
JRST OFLPRC ; YES, GO PROCESS IT
CAIE T1,ER.ICC ; NO, CONTROL-C INTERRUPT?
HALT ; NO, MY GOD!
SKIPL NOINT ; INTERRUPTABLE?
EXIT ; YES, SO QUIT IF THAT'S WHAT HE WANTS
OUTSTR [ASCIZ /
Interlocked/]
OFLENT: EXCH T1,TEMP1 ; RESTORE T1
PUSH P,INTBLK+2 ; SETUP FOR POPJ RETURN
SETZM INTBLK+2 ; SET FOR ANOTHER TRAP
BADTRP: POPJ P,0 ; RETURN TO SEQUENCE
; HERE ON DSK OFF LINE INTERRUPTS
OFLPRC: MOVEI T1,STRUCO ; GET DESIRED RETURN ADDRESS
MOVEM T1,INTBLK+2 ; AND FUDGE IT
JRST OFLENT ; GO DO THE STANDARD STUFF
SUBTTL SUBROUTINE TO READ FROM FILE
;SKIP RETURNS WITH VALUE IN CH
;NON-SKIPS IF END OF LINE (CH=-1 AT EOF)
FILIN: TXNE F,F.EOF ;SEE IF EOF
JRST FLIN.3 ;YES--REPEAT THAT
ILDB CH,LOWPTR ;GET A BYTE FROM HISEG
JUMPN CH,FLIN.1 ;JUMP IF VALID DATA
SKIPE LOWPTR ;SKIP IF WE NEVER SETUP HISEG
JRST FLIN.3 ;ELSE THIS IS THE EOF MARK
SOSGE IBF+.BFCTR ;COUNT DOWN BYTES
JRST FLIN.2 ;EMPTY--GET NEXT BUFFER
IBP IBF+.BFPTR ;INCREMENT TO NEXT BYTE
MOVE CH,@IBF+.BFPTR ;GET NEXT WORD
TRNE CH,1 ;SEE IF SEQUENCED
JRST [AOS IBF+.BFPTR ;YES--SKIP 5
MOVNI CH,5 ; MORE CHARS
ADDM CH,IBF+.BFCTR
JRST FILIN] ;AND TRY AGAIN
LDB CH,IBF+.BFPTR ;GET CHARACTER
JUMPE CH,FILIN ;IGNORE NULLS
CAIE CH,.CHCRT ;ALSO C.RET.
CAIN CH,.CHDEL ; AND DELETE
JRST FILIN ;--JUST LOOP FOR NEXT
FLIN.1: CAIL CH,.CHLFD ;IF LESS THAN LINE FEED
CAILE CH,.CHFFD ; OR GT FORM FEED,
JRST CPOPJ1 ; GIVE SKIP RETURN
POPJ P, ;ELSE, GIVE END OF LINE
FLIN.2: IN TI, ;INPUT NEXT BUFFER
JRST FILIN ;LOOP IF OK
STATZ TI,IO.ERR ;SEE IF ERROR BITS
INTERR (IOE,<I/O Error>,<JRST FLIN.3>)
FLIN.3: SETOM CH ;SET FLAG
TXO F,F.EOF ;SET END FLAG
POPJ P, ;RETURN
SUBTTL SUBROUTINES
SUBTTL SUBROUTINE TO LOGIN A JOB
;CALL: T2/ PROJECT,,PROGRAMMER NUMBER
; T4/ "USER" NAME IN SIXBIT
; PUSHJ P,LOGIN$
;RETURNS IF SUCCESSFUL
LOGI12: TXO F,F.PRIV ;FLAG TO GET ALL PRIVILEGES
MOVE T2,FFAPPN ;GET [1,2]
TXNN F,F.REMO ;SEE IF REMOTE OPR
JRST LOGI.1 ;NO--PROCEED
HLRZ T1,NL.ME ;YES--GET STATION NUMBER
HRLI T2,100(T1) ;USE [100+SN,2]
JRST LOGIN$ ;AND GO LOGIN
;HERE IF LOGIN TO [1,2]
LOGI.1: TXNE F,F.LOGI ;SEE IF LOGGED IN
JRST LOGIN$ ;YES--NO SPECIAL TEST
SETOM T3 ;NO--GET MY TTY
GETLCH T3 ; CHARACTERISTICS
TXNE T3,GL.ITY!GL.DSL!GL.REM ;MAKE SURE LOCAL
JRST KILJOB ;NO--GO EXIT INSTEAD
LOGIN$: TXNN F,F.LOGI ;SEE IF ALREADY LOGGED IN
JRST LOGI.2 ;NO--GO LOG IT IN
TXNN F,F.LOGX ;SEE IF OK TO BE DIFFERENT
CAMN T2,MYPPN ;NO--SEE IF DIFFERENT
POPJ P, ;NO--RETURN
JRST KILJOB ;YES--GO EXIT INSTEAD
LOGI.2: MOVSI T1,.STOPP ;CODE TO SET (NO) OPERATOR PRIVS
HRRI T1,.OBNOP ;SET NO OPERATOR PRIVS BY DEFAULT
TXNE F,F.PRIV ;NEED PRIVS?
HRRI T1,.OBSOP ;YES, MAKE THIS JOB A SYSTEM OPR
TXNE F,F.REMO ;ARE WE BECOMING A REMOTE OPR?
HRRI T1,.OBROP ;YES, ONLY GIVE REMOTE OPR PRIVS
SETUUO T1, ;GIVE THE APPROPRIATE PRIV
JFCL ;OH WELL, WE TRIED!
PUSHJ P,ACCT$ ;GO SET THE ACCOUNT STRING
JRST [SKIPN ACTSTR ;ERROR. DO WE EVEN HAVE A STRING?
INTWRN (NAS,<No account string specified in TTY.INI
>,<JRST .+1>)
INTWRN (ESA,<Error setting account string
>,<JRST .+1>)]
MOVE T1,[.STUVM,,[^D16384,,^D16384]] ;SET THE PHYSICAL AND VIRTUAL
SETUUO T1, ; PAGE LIMITS FOR THIS JOB
SKIPA T1,[.STUVM,,[^D512,,^D512]] ;FAILED? TRY LOWER LIMITS
SKIPA ;OK, GO ON
SETUUO T1, ;TRY TO SET THE LOWER LIMITS
JFCL ;NOT REALLY THAT IMPORTANT I GUESS
MOVE T1,[-3,,T2] ;SETUP POINTER FOR UUO
MOVX T3,%CNPRV ;FIND OUT WHAT PRIVILEGES
GETTAB T3, ; WE'RE ALLOWED TO SET
MOVSI T3,-1 ;ERROR--SET ALL DEC PRIVILEGES.
TXNN F,F.PRIV ;SEE IF PRIVILEGES NEEDED
SETZ T3 ;NO--CLEAR THEM
TXNE F,F.REMO ;UNLESS REMOTE OPR
MOVX T3,JP.NSP ;WHO ONLY NEEDS UNSPOOLING
TXNE F,F.SDPY ;UNLESS WANT TO RUN SYSDPY,
TXO T3,JP.SPA!JP.SPM ; IN WHICH CASE WE NEED TO PEEK AND SPY
TXNE F,F.IPCQ ;IF WANT BIG IPCF QUOTAS,
TXO T3,JP.IPC ; THEN WE NEED THE PRIVS TO SET THEM
MOVEM T2,REQPPN ;SAVE REQUESTED PPN
LOGIN T1, ;TRY
TXNN F,F.IPCQ ;DO WE WANT BIG IPCF QUOTAS?
JRST LOGI.3 ;NO, DON'T SET THEM THEN.
MOVE T1,JOBN ;GET OUR JOB NUMBER
MOVEM T1,IPCCBK+.IPCS1 ;STORE IN THE [SYSTEM]IPCC BLOCK
MOVX T1,IP.CMP!<.IPCCC,,.IPCMP+1> ;GET THE HEADER WORD
MOVEM T1,IPCMHD+.IPCMF ;STORE AS THE IPCFM FUNCTION HEADER
XMOVEI T1,IPCCBK ;GET THE ADDRESS OF THE IPCC BLOCK
MOVEM T1,IPCMHD+.IPCMP ;STORE
MOVE T1,[3,,.IPCQS] ;GET THE LENGTH AND FUNCTION
MOVEM T1,IPCCBK+.IPCS0 ;TO SET THE PID QUOTA
MOVEI T1,777 ;GET A LARGE PID QUOTA
MOVEM T1,IPCCBK+.IPCS2 ;STORE
XMOVEI T1,IPCMHD ;POINT TO THE HEADER
IPCFM. T1, ;SET THE PID QUOTA
JRST LOGI.3 ;ERROR? SKIP IT
HLLOS IPCCBK+.IPCS2 ;SET LARGE SEND AND RECEIVE QUOTAS
MOVEI T1,.IPCSQ ;GET THE FUNCTION TO SET SEND/RCV QUOTAS
HRRM T1,IPCCBK+.IPCS0 ;STORE IT
XMOVEI T1,IPCMHD ;POINT TO THE HEADER AGAIN
IPCFM. T1, ;SET THE SEND/RECEIVE QUOTAS
JFCL ;OH WELL ...
LOGI.3: TTYSTR [ASCIZ /.LOGIN /]
HLRZ T1,REQPPN ;GET PROJECT
PUSHJ P,TYPOCT ;TYPE IN OCTAL
TTYCHR "," ;SEPARATE
HRRZ T1,REQPPN ;GET PROGRAMMER
PUSHJ P,TYPOCT ;TYPE IN OCTAL
TTYSTR CRLFM
;HERE TO LOCATE USER TO NODE SPECIFIED IN /LOCATE:NN OR
;IN THE ABSENCE OF A LOCATE COMMAND, TO THE CENTRAL SITE
;IF HE IS BEING LOGGED IN ON A NODE WITHOUT AN LPT
LOCAT$: SKIPGE T1,LOCAT ;DID USER SPECIFY LOCATE?
JRST LOCAT0 ;YES--LOCATE HIM THERE
LOCAT2: MOVEI T1,.GTLOC ;GETTAB FOR NODE # OF CENTRAL SITE
GETTAB T1, ;GET CENTRAL SITE NODE NUMBER
JRST NOLOC ;MONITOR MUST NOT SUPPORT NETWORKS
HRROI T2,.GTLOC ;THIS JOB'S LOCATION
GETTAB T2, ;GET THAT
JRST NOLOC ;NO NETWORK SOFTWARE
CAMN T1,T2 ;ALREADY LOCATED AT CENTRAL SITE?
JRST NOLOC ;YES, NO POTENTIAL PROBLEMS THEN
MOVEM T2,NODLOC ;STORE THIS JOB'S LOCATION IN NODE BLOCK
MOVEI T2,4 ;LENGTH OF THE ARGUMENT BLOCK
MOVEM T2,NODLEN ;STORE IN NODE UUO ARGUMENT BLOCK
MOVEI T2,.TYLPT ;DEVICE TYPE
MOVEM T2,NODDEV ;STORE THAT IN THE ARGUMENT BLOCK
MOVE T2,[.NDRCI,,NODBLK] ;NODE UUO ARGUMENT
NODE. T2, ;GET NODE CONFIGURATION INFORMATION
JRST NOLOC ;NOT IMPLEMENTED?
HLRZ T2,NODDEV ;NUMBER OF LPT'S AT THIS NODE
JUMPN T2,NOLOC ;JUMP IF THERE ARE SOME
JRST LOCAT1 ;NO LPT'S AT THIS NODE,
;LOCATE JOB AT CENTRAL SITE
LOCAT0: HRRZS T1 ;CLEAR LH
CAIG T1,^D77 ;NODE NUMBER .GT. 77?
JRST LOCAT3 ;NO--CONTINUE
INTWRN (NTL,NODE NUMBER TOO LARGE)
JRST LOCAT2 ;CANNOT LOCATE HIM, SAME AS IF NO SWITCH
LOCAT3: IDIVI T1,^D10 ;CONVERT NODE TO OCTAL
LSH T1,3 ;...
ADD T1,T2 ;...
LOCAT1: LOCATE T1, ;LOCATE USER
OUTSTR [ASCIZ /%INTLUF LOCATE UUO failed.
/]
;HERE TO COPY THE SYS: SEARCH LIST FOR THE USER
NOLOC: SETZM GETSTR ;SET GOBSTR ARGS TO JOB 0
MOVE T1,SYSPPN ;GET [1,4]
MOVEM T1,GETSTR+1 ;SET SYS PPN AS PPN IN QUESTION
SETOM GETSTR+2 ;SET TO START OF LIST
MOVNI T1,2 ;PRESET ANSWER BLOCK
STRN.7: MOVE T3,[5,,GETSTR] ;GET POINTER FOR GOBSTR
ADDI T1,3 ;ADVANCE ANSWER POINTER
CAIGE T1,ENDSTR-STRBLK ;SEE IF FULL
GOBSTR T3, ;NO--GET NEXT STR
JRST STRN.8 ;CAN'T--GO SEE IF CAN SET IT UP
SKIPE T3,GETSTR+2 ;GET STR NAME
CAMN T3,[-1] ;CHECK FOR FENCE
JRST STRN.8 ;YES--GO SEE IF CAN SET IT UP
MOVEM T3,STRBLK(T1) ;OK--STORE STR
MOVE T3,GETSTR+3 ;GET PPN JUST IN CASE IT EVER COUNTS
MOVEM T3,STRBLK+1(T1) ;STORE IN STRUUO BLOCK
MOVE T3,GETSTR+4 ;GET STATUS BITS
MOVEM T3,STRBLK+2(T1) ;STORE IN BLOCK
JRST STRN.7 ;LOOP BACK FOR MORE
STRN.8: SETZM STRBLK ;SET FUNCTION FOR STRUUO
MOVE T3,['DSKB '] ;SET FOR DSKB JUST IN CASE NONE
SKIPN STRBLK+1 ;SEE IF ANY STR SETUP
MOVEM T3,STRBLK+1 ;NO--FILL IN DEFAULT
HRLZI T1,(T1) ;GET LENGTH OF LIST
TLNN T1,-2 ;SEE IF ANYTHING THERE
HRLZI T1,4 ;NO--SET FOR AT LEAST ONE STR
HRRI T1,STRBLK ;POINT TO BLOCK
STRUUO T1, ;TELL MONITOR
JFCL ;WELL--NICE TRY
POPJ P, ;RETURN IF SUCCESSFUL
;HERE TO SET THE ACCOUNT STRING FOR A JOB THAT WE'RE GOING TO LOG IN.
;IF ONE IS SET, USE IT. OTHERWISE, GO LOOK FOR A SYSTEM DEFAULT ACCOUNT
;STRING. RETURN ERROR IF ACCOUNT VALIDATION IS REQUIRED AND WE FAILED
;IN SOME WAY.
;DESTROYS T1 AND T3
ACCT$: MOVX T3,%CNST2 ;GET THE SECOND MONITOR
GETTAB T3, ; STATES WORD
SETZ T3, ;WELL, ASSUME NO STATES
MOVX T1,<.ACTRD,,[EXP 2,0,ACTSTR]> ;GET ACCT. ARG BLOCK
SKIPN ACTSTR ;DO WE HAVE AN ACCOUNT STRING?
ACCT. T1, ;NO, READ JOB ZERO'S ACCOUNT STRING
JFCL ;ERRORS CAN ALWAYS HAPPEN
MOVX T1,<.ACTCH,,[EXP 1,<POINT 7,ACTSTR>]> ;GET ACCT. ARGUMENT BLOCK
SKIPE ACTSTR ;DO WE HAVE AN ACCOUNT STRING YET?
ACCT. T1, ;YES, GO SET IT
TXNN T3,ST%ACV ;ERROR, ACCOUNT VALIDATION REQUIRED?
AOS (P) ;NOPE. NO ERROR HERE
POPJ P, ;RETURN
SUBTTL SUBROUTINE TO TYPE SIGN ON MESSAGE
;CALL: PUSHJ P,SIGNON
;USES ALL TEMPS
SIGNON: MOVE T1,FLNAME ;SEE IF USER
TRNN T1,1 ; SAID NONAME
TXNE F,F.NOHD ;SEE IF HEADER SUPPRESSED
POPJ P, ;YES--RETURN QUICKLY
TTYSTR CRLFM
MOVSI T7,-5 ;SETUP POINTER TO READ
MOVX T6,%CNFG0 ;SYSTEM HEADER LINE
SIGN.1: MOVE T5,T6 ;MAKE POINTER
GETTAB T5, ;GET THE HEADER
MOVEI T5,0 ;DON'T REALLY CARE IF THIS FAILS
MOVEM T5,T1(T7) ;STORE IN ARRAY
ADD T6,[1,,0] ;ADVANCE INDEX
AOBJN T7,SIGN.1 ;LOOP FOR TITLE
MOVEI T6,0 ;GUARANTEE CLEAN END
TTYSTR T1 ;TYPE HEADER
TTYCHR " " ;SEND A SPACE
MSTIME T4, ;GET TIME OF DAY
IDIVI T4,^D1000 ;CONVERT TO SECONDS
IDIVI T4,^D3600 ;GET HOURS
PUSHJ P,TYPD2 ;TYPE HOURS
MOVE T4,T5 ;RE-POSITION REMAINDER
IDIVI T4,^D60 ;GET MINUTES
PUSHJ P,TYPD2C ;TYPE COLON, MINUTES
MOVE T4,T5 ;GET SECONDS
PUSHJ P,TYPD2C ;TYPE COLON, SECONDS
TTYCHR " " ;SEND A SPACE
MOVE T2,ME ;GET TTY NAME
PUSHJ P,TYPSIX ;TYPE IT
TTYSTR [ASCIZ / system /]
MOVE T1,[%CCSER] ;GET CPU0 SERIAL NUMBER
GETTAB T1, ;...
MOVE T1,APRSN ;USE DEFAULT
MOVNI T7,6*2 ;PRESET FOR 6 CPU'S
SIGN.2: PUSHJ P,TYPDEC ;LIST IN DECIMAL
AOS T1,T7 ;TRY NEXT CPU
ADD T1,[%CCSER+6*2+1] ;GET APR S/N
GETTAB T1, ; FROM MONITOR
MOVEI T1,0 ;STOP IF NO CPU
JUMPLE T1,SIGN.3 ;END LOOP IF JUNK
TTYCHR "/" ;SEPARATE
AOJL T7,SIGN.2 ;LOOP UNTIL DONE
;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE
SIGN.3: TTYSTR [ASCIZ /
Connected to Node /]
MOVEI T1,MYNODE ;POINT TO MY NODE NAME'S STRING BLOCK
PUSHJ P,TYPAS8 ;TYPE THE NODE NAME
HLRZ T1,MYNUMB+.NSASL ;GET THE LENGTH OF THE NODE NUMBER STRING
JUMPE T1,SIGN3D ;SKIP THIS IF NOTHING THERE
TTYSTR [ASCIZ /(/]
HLRZ T1,NL.ME ; GET NODE NUMBER
PUSHJ P,TYPOCT
TTYSTR [ASCIZ /)/] ;CLOSE OFF THE NODE NUMBER
SIGN3D: HLRZ T1,MYTERM+.NSASL ;SEE IF ANY TERMINAL NAME STRING
JUMPE T1,SIGN3B ;NOPE, DON'T TRY TO TYPE IT THEN
TTYSTR [ASCIZ / Line /];YEP. SAY WE'RE GOING TO TYPE THE LINE NAME
MOVEI T1,MYTERM ;POINT TO THE STRING BLOCK
TXNN F,F.ANFL!F.DCNL ;IS THIS AN ANF-10 OR CTERM CONNECTION?
JRST SIGN3A ;NO, JUST TYPE THE ASCII STRING AND CONTINUE
HLRZ T2,.NSASL(T1) ;GET THE COUNT AGAIN
CAILE T2,3 ;CAN WE HANDLE IT?
JRST SIGN3A ;NO--HOPE THIS LOOKS GOOD
MOVE T3,[POINT 8,.NSAST(T1)] ;YES--BUT WE WANT TO SEE IF WE SHOULD
SIGN3C: ILDB T4,T3 ;GET NEXT CHARACTER FROMT THE STRING
CAIL T4,"0" ;IS IT NUMERIC?
CAILE T4,"9" ;REALLY?
JRST SIGN3A ;NO--TYPE IT IN ASCII
SOJG T2,SIGN3C ;LOOP OVER ALL THE CHARACTERS
TTYSTR [ASCIZ /# /] ;YES, SAY THIS IS A TERMINAL NUMBER
PUSHJ P,GET826 ;CONVERT PORT NAME TO SIXBIT
PUSHJ P,XPNTTY ;EXPAND THE TTY NAME
PUSHJ P,CVTBIN ;GET THE LINE NUMBER OUT OF IT
MOVE T1,WD ;COPY THE LINE NUMBER
PUSHJ P,TYPOCT ;GO TYPE THE LINE NUMBER
TRNA ;SKIP TYPING IN ASCII
SIGN3A: PUSHJ P,TYPAS8 ;TYPE LINE NAME IN FULL IF NOT NUMERIC
SIGN3B: TTYSTR CRLFM
TXNN F,F.LOGI ;SEE IF LOGGED IN
POPJ P, ;NO--ALL DONE
TTYSTR [ASCIZ /Job /]
MOVE T1,JOBN ;GET JOB NUMBER
PUSHJ P,TYPDEC ;TYPE IN DECIMAL
HRROI T2,.GTNM1 ;GET USER'S NAME
GETTAB T2, ; FROM MONITOR
JRST SIGN.4 ;IGNORE IF UNAVAILABLE
JUMPE T2,SIGN.4 ;OR MISSING
TTYSTR [ASCIZ / User /]
PUSHJ P,TYPSX6 ;TYPE SIX CHARACTERS
HRROI T2,.GTNM2 ;GET 2ND HALF OF NAME
GETTAB T2, ; FROM MONITOR
MOVEI T2,0 ;(IMPOSSIBLE)
PUSHJ P,TYPSIX ;TYPE IN SIXBIT AND RETURN
TTYSTR [ASCIZ / [/] ;THEN ISSUE PPN
HLRZ T1,MYPPN ;GET MY PROJECT
PUSHJ P,TYPOCT ;ISSUE IN OCTAL
TTYCHR "," ;SEPARATE WITH COMMA
HRRZ T1,MYPPN ;GET MY PROGRAMMER
PUSHJ P,TYPOCT ;ISSUE IN OCTAL
TTYCHR "]" ;END PPN
SIGN.4: TTYSTR 1,CRLFM
SUBTTL SUBROUTINE TO TYPE KSYS MESSAGE
;CALL: PUSHJ P,TYKSYS
;USES ALL TEMPS
TYKSYS: MOVX T1,%NSKTM ;GET TIME TO GO
GETTAB T1, ; FROM MONITOR
POPJ P, ;RETURN IF NOT IMPLEMENTED
SKIPE T1 ;SEE IF SET
CAIL T1,^D24*^D60 ; AND LESS THAN 24 HRS.
POPJ P, ;NO--RETURN
JUMPL T1,TYKS.2 ;SEE IF ALREADY DOWN
TTYSTR [ASCIZ /Timesharing will cease in /]
PUSH P,T1 ;SAVE TIME
IDIVI T1,^D60 ;GET HOURS
JUMPE T1,TYKS.1 ;JUMP IF LT 1 HOUR
PUSHJ P,TYPDEC ;TYPE IN DECIMAL
TTYSTR [ASCIZ / hours /]
TYKS.1: MOVE T1,(P) ;GET TIME AGAIN
IDIVI T1,^D60 ;GET MINUTES
MOVE T1,T2 ; INTO RIGHT AC
PUSHJ P,TYPDEC ;TYPE IN DECIMAL
TTYSTR [ASCIZ / minutes, at /]
MSTIME T1, ;GET TIME OF DAY
IDIVI T1,^D60000 ;GET MINUTES OF DAY
POP P,T2 ;RESTORE KSYS TIMER
ADD T1,T2 ;FIND TIME OF DAY
CAIL T1,^D24*^D60 ;SEE IF TOMORROW
SUBI T1,^D24*^D60 ;YES--CORRECT TIME
IDIVI T1,^D60 ;GET HOURS
PUSH P,T2 ;SAVE MINUTES
MOVE T4,T1 ;POSITION HOURS
PUSHJ P,TYPD2 ;TYPE HOURS AS TWO DIGITS
POP P,T4 ;RESTORE MINUTES
PUSHJ P,TYPD2C ;TYPE AS :TWO DIGITS
JRST TYKS.3 ;AND FINISH LINE
;HERE IF KSYS TIMER ALREADY RUN OUT
TYKS.2: TTYSTR [ASCIZ /Timesharing is over/]
TYKS.3: TTYSTR 1,[ASCIZ /.
/]
SUBTTL ERROR HANDLERS
;HERE IF LOGICAL INCONSISTENCY IN PROGRAM--NOTE BP=ADDR. OF PROBLEM
E$$BMB: INTERR (BMB,<Bomb out >,<JRST .+1>)
MOVEI T1,(BP) ;GET ADDRESS
SUBI T1,INITIA+1 ;CONVERT TO RELATIVE
PUSHJ P,TYPOCT ;ISSUE IN OCTAL
EBMB.1: OUTSTR CRLFM ;END LINE
SUBI BP,INITIA+1 ;SUBTRACT RELOCATION AND PC INCREMENT
LIGHTS BP, ;FOR DEBUGGING, SEND TO LIGHTS
JRST KILJOB ;GO KILL OFF JOB
SUBTTL TYPEOUT ROUTINES
;SUBROUTINE TO TYPE THE CONTENTS OF AN EIGHT BITS ASCII STRING BLOCK
;CALL: MOVEI T1,STRING BLOCK ADDRESS
; PUSHJ P,TYPAS8
;USES T1, T2
TYPAS8: HLRZ T2,.NSASL(T1) ;GET THE STRING LENGTH
JUMPE T2,CPOPJ ;RETURN NOW IF NULL STRING
ADD T1,[POINT 8,.NSAST] ;SET THE BYTE POINTER
PUSH P,T1 ;SAVE THE BYTE POINTER
TYP8.1: ILDB T1,(P) ;GET A BYTE
TTYCHR (T1) ;TYPE IT
SOJG T2,TYP8.1 ;LOOP FOR ALL BYTES
POP P,(P) ;CLEAN UP THE STACK
POPJ P, ;AND RETURN
;SUBROUTINE TO TYPE TWO DECIMAL DIGITS
;WARNING--THIS DOES NOT HANDLE NEGATIVE NUMBERS OR NUMBERS
; GREATER THAN 99.
;CALL: MOVE T4,NUMBER
; PUSHJ P,TYPD2
;USES T1, T2
TYPD2C: TTYCHR ":"
TYPD2: MOVE T1,T4 ;GET NUMBER
IDIVI T1,^D10 ;GET TENS
TTYCHR "0"(T1) ;TYPE IT
TTYCHR 1,"0"(T2) ;TYPE IT AND RETURN
;SUBROUTINE TO TYPE A DECIMAL/OCTAL NUMBER
;CALL: MOVE T1,NUMBER
; PUSHJ P,TYPDEC/OCT
;USES T1,T2,T3
TYPOCT: SKIPA T3,[10] ;SET OCTAL RADIX
TYPDEC: MOVEI T3,^D10 ;SET DECIMAL RADIX
TYPRAD: SKIPGE T1 ;IF NEGATIVE,
TTYCHR "-" ; ISSUE MINUS
TYPR.1: IDIVI T1,(T3) ;GET LOWEST DIGIT
MOVMS T2 ;GET POSITIVE OF REMAINDER
HRLM T2,(P) ;STACK IT
SKIPE T1 ;UNLESS DONE
PUSHJ P,TYPR.1 ; TRY AGAIN
HLRZ T1,(P) ;GET TOP DIGIT
TTYCHR 1,"0"(T1) ;OUTPUT IT AND RETURN
;SUBROUTINE TO TYPE 6 SIXBIT CHARACTERS
;CALL: MOVE T2,WORD
; PUSHJ P,TYPSX6
;USES T1, T2, T3
TYPSX6: MOVEI T3,6 ;SET COUNT
TYPS.1: MOVEI T1,0 ;CLEAR NEXT CHARACTER
LSHC T1,6 ;GET NEXT CHAR
TTYCHR 40(T1) ;TYPE IT
SOJG T3,TYPS.1 ;LOOP UNTIL COUNT DONE
POPJ P, ;THEN RETURN
;SUBROUTINE TO TYPE A SIXBIT WORD
;CALL: MOVE T2,WORD
; PUSHJ P,TYPSIX
;USES T1, T2
TYPSIX: MOVEI T1,0 ;CLEAR NEXT CHAR
LSHC T1,6 ;GET NEXT CHAR
TTYCHR "A"-'A'(T1) ;TYPE IT
JUMPN T2,TYPSIX ;LOOP UNTIL ALL DONE
POPJ P, ;THEN RETURN
;SUBROUTINE TO TYPE AN ASCII STRING IN IMAGE MODE
;CALL: MOVEI T2,STRING POINTER
; PUSHJ P,SNDIMG
; RETURN
;USES T2, T6, T7
SNDIMG: HRLI T2,(POINT 7,) ;TURN INTO BYTE POINTER
SNDI.1: ILDB T7,T2 ;GET NEXT CHARACTER
JUMPE T7,CPOPJ ;RETURN IF NULL
;THE FOLLOWING COMES FROM 5.04 UUOCON(PEVEN8)
MOVEI T6,(T7) ;MAKE A COPY OF BYTE
LSH T6,-4 ;FOLD INTO LOW 4 BITS
XORI T6,(T7) ; ..
TRCE T6,14 ;CHECK BITS
TRNN T6,14 ; 32 AND 33
TRC T7,200 ;IF EVEN, COMPLIMENT RESULT
TRCE T6,3 ;CHECK BITS
TRNN T6,3 ; 34 AND 35
TRC T7,200 ;IF EVEN, COMPLEMENT RESULT
IONEOU T7 ;SEND OUT VIA IMAGE MODE
JRST SNDI.1 ;LOOP BACK FOR MORE
;THIS IS THE LUUO HANDLER
;IT SCRATCHES OC AND PRESERVES ALL OTHERS
LUUO: MOVE OC,.JBUUO ;GET UUO
TLNE OC,(Z 1,0) ;AC1 ON IN LUUO
POP P,(P) ;YES, REMOVE CALL
LSH OC,-^D27 ;ISOLATE OPCODE
CAIL OC,LUUOMX ;IN RANGE OF KNOWN OPCODES?
SETZ OC, ;NO, USE DISPATCH ZERO
PJRST @LUUORT(OC) ;LET THE ROUTINE HANDLE IT
LUUORT: LUUO0 ;INVALID
$TTOUT ;TTYCHR
$TTSTR ;TTYSTR
$CTSTR ;CTYSTR
$CTCHR ;CTYCHR
$PIMIN ;PIMGET
TTYPBF ;FLSBUF
TTYDBF ;DMPBUF
LUUOMX==.-LUUORT ;NUMBER OF LUUOS
LUUO0: OUTSTR [ASCIZ\? Illegal LUUO\] ;OOPS
EXIT ;DIE
;HERE ON A TTYSTR LUUO
$TTSTR: SKIPE SILENC ;ARE WE MUTE?
POPJ P, ;YES, JUST RETURN NOW
MOVSI OC,(POINT 7,) ;SETUP BYTE POINTER
HLLM OC,.JBUUO ; IN LOW CORE
TTSTR2: ILDB OC,.JBUUO ;GET A BYTE
JUMPE OC,CPOPJ ;RETURN ON NULL
PUSHJ P,TTCHR1 ;TYPE IT
JRST TTSTR2 ;LOOP OVER STRING
;HERE ON A TTYCHR LUUO
;WARNING--THIS IS IMMEDIATE MODE, UNLIKE OUTCHR
$TTOUT: SKIPE SILENC ;ARE WE MUTE?
POPJ P, ;YES, JUST RETURN NOW
HRRZ OC,.JBUUO ;GET THE BYTE
TTCHR1: SOSG TTYCNT ;COUNT DOWN SPACE IN BUFFER
PUSHJ P,TTYPBF ;WRITE THE DATA
IDPB OC,TTYPNT ;STORE THE BYTE
AOS CHRSOU ;COUNT CHARACTERS FOR TYPTTY
POPJ P, ;RETURN
;HERE ON A DMPBUF LUUO
TTYDBF: PUSHJ P,TTYPBF ;START SENDING CHARACTERS
;PJRST TTYPBF ;AND TRY IT AGAIN (MAKE SURE BUFFER IS EMPTY)
;SUBROUTINE TO DUMP THE TTY OUTPUT BUFFER
TTYPBF: SKIPN SILENC ;IF SILENCED, DO NO OUTPUT
OUT TTY, ;DO THE OUTPUT
POPJ P, ;ALL IS OK
STATZ TTY,IO.ERR ;ANY ERRORS?
JRST LOGO1$ ;YES--SEEMS SORT OF BAD
PUSH P,T1 ;SAVE AN AC
PUSH P,[EXP ^D10] ;NUMBER OF MINUTES TO WAIT
TTYP.1: MOVE T1,[HB.RIO!HB.RWJ+^D6000]
HIBER T1,
JRST LOGO1$ ;MUST WORK
OUT TTY, ;TRY AGAIN
JRST TTYP.2 ;WE ARE DONE
SOSLE (P) ;KEEP WAITING
JRST TTYP.1 ;YES--WAIT
CLRBFO ;NO--BOMB OUT
JRST LOGO1$ ;GO LOGOUT
TTYP.2: POP P,T1
POP P,T1
POPJ P,
;HERE FOR CTYSTR (OUTSTR TO THE CTY)
$CTSTR: PUSH P,T2 ;NEED
PUSH P,T3 ; SOME
PUSH P,T4 ; ACS
HRRZ T4,.JBUUO ;ADDRESS OF ASCIZ STRING
MOVE T3,CTYNUM ;UDX FOR CTY
MOVEI T2,.TOOUS ;OUTPUT STRING FUNCTION
MOVE OC,[3,,T2] ;TRMOP. ARG POINTER TO
TRMOP. OC, ;OUTPUT ASCIZ STRING TO THE CTY
JFCL ;OH WELL
POP P,T4 ; RESTORE
POP P,T3 ; USED
POP P,T2 ;ACS
POPJ P, ;RETURN TO CALLER
;HERE FOR CTYCHR LUUO
$CTCHR: PUSH P,T2 ;NEED
PUSH P,T3 ; SOME
PUSH P,T4 ; ACS
HRRZ T4,.JBUUO ;GET CHARACTER TO SEND
ANDI T4,177 ;AND ONLY THE CHARACTER
HRRZ T3,CTYNUM ;UDX FOR THE CTY
MOVEI T2,.TOOUC ;SEND CHARACTER FUNCTION
MOVE OC,[3,,T2] ;TRMOP. ARG BLOCK TO
TRMOP. OC, ;OUTPUT SINGLE CHARACTER TO THE CTY
JFCL ;HOHUM
POP P,T4 ; RESTORE
POP P,T3 ; THE
POP P,T2 ;ACS
POPJ P, ;RETURN TO CALLER
;HERE ON A PIMGET LUUO
$PIMIN: INCHRS OC ;GET A CHARACTER
JRST PIMIN1 ;DIDN'T WORK, WAIT FOR IT
JRST PIMIN2 ;GOT IT, RETURN IT
PIMIN1: SETO OC, ;OURSELVES
WAKE OC, ;MAKE SURE
JFCL ;CAN'T FAIL
HLLZ OC,SLPTIM ;SETUP CONDITIONS & CANCEL CLOCK REQUEST
HIBER OC, ;DO IT
JFCL ;CAN'T FAIL
movx oc,%cnsum ;system uptime gettab
gettab oc, ;get it
setz oc, ;sigh
movem oc,sysupt ;save for later comparison
pimin4: MOVE OC,SLPTIM ;WAIT FOR CHARACTER OR TIMEOUT
HIBER OC, ;WAIT A WHILE
JFCL ;FTHIBWAKE IS REMOVED ON
INCHRS OC ;GET THE CHARACTER
trna ;none there, check if ok
JRST PIMIN2 ;RETURN IT
movx oc,%cnsum ;system uptime gettab
gettab oc, ;get it
setz oc, ;sigh
sub oc,sysupt ;see how much time passed
sub oc,slptim ;relative to our desired sleep time
hrre oc,oc ;in 18 bits
jumpl oc,pimin4 ;wait some more if too little time has gone
setz oc, ;yes--return a null and fail
JRST PIMIN3 ;RETURN NON-SKIP WITH NULL
PIMIN2: JUMPE OC,$PIMIN ;TRY AGAIN IF GOT A NULL ON INPUT
AOS (P) ;SKIP ON SUCCESS
PIMIN3: MOVEM OC,@.JBUUO ;STUFF IN DESIRED DESTINATION
sosl outpxz ;if still room to store,
idpb oc,outpxy ;log for debugging
POPJ P, ;RETURN APPROPRIATELY
SUBTTL GTNTN. ROUTINE
; SUBROUTINE TO GET NODE,,LINE# FOR DEVICE SPECIFIED IN T1 IN T1
GTNTN$: GTNTN. T1,0 ; TRY DIRECTLY
SKIPA ; NOW THE HARD WAY
POPJ P,0 ; RETURN
PUSH P,T1 ; SAVE DEVICE NAME
IONDX. T1,0 ; GET THE LINE # + 200000
SETZ T1,0 ; NICE TRY
TXZ T1,.UXTRM ; CLEAR BIT 1
EXCH T1,(P) ; GET DEVICE AGAIN IN T1
WHERE T1,0 ; GET THE NODE NUMBER
SETZ T1,0 ; NICE TRY
HRLM T1,(P)
POP P,T1
POPJ P,0 ; RETURN
SUBTTL NDNAM TURN A NODE SPEC INTO A NODE NAME
;NDNAM -- TRY TO MAKE A NAME OUT OF A NODE SPECIFIER
;CALL IS:
;
; MOVX T3,<NODE>
; PUSHJ P,NDNAM
; RETURN
;
;WHERE <NODE> IS SIXBIT NODE NAME, SIXBIT NODE NUMBER, OR OCTAL NODE NUMBER.
;
;ON RETURN T1 WILL HAVE THE NODE NAME IF <NODE> IS MEANINGFUL, OTHERWISE
;T1 WILL HAVE <NODE>, ASSUMING WHOEVER WANTS TO USE IT WILL BE BETTER
;SITUATED TO COMPLAIN ABOUT NO SUCH NODE. T2 WILL HAVE THE NODE NUMBER
;ASSOCIATED WITH THE NAME IN T1, IF ANY.
NDNAM: PUSH P,T3 ;SAVE INPUT
CAMN T3,MYNNAM ;LOCAL (KNOWN) NAME?
JRST NDNAM5 ;YES, THEN ALL SET
TLNN T3,770000 ;SIXBIT OF SOME SORT?
JRST NDNAM3 ;NO, MUST BE OCTAL NODE NUMBER
MOVE T1,[.NDRNN,,T2] ;YES, MAY BE SIXBIT NODE NUMBER
MOVEI T2,2 ;SO ASK MONITOR FOR OCTAL NODE NUMBER
NODE. T1, ;SINCE WE CAN'T TELL THE DIFFERENCE
JRST NDNAM5 ;JUNK, PRESERVE INPUT
MOVE T3,T1 ;SET UP NODE NUMBER
NDNAM3: MOVE T1,[.NDRNN,,T2] ;ARG POINTER
MOVEI T2,2 ;AND ARG BLOCK LENGTH
NODE. T1, ;TO READ NODE NAME GIVEN NODE NUMBER
NDNAM5: MOVE T1,0(P) ;NO SUCH NODE, RETURN INPUT SPECIFIER
PUSH P,T1 ;SAVE NODE NAME
MOVE T3,T1 ;POSITION NAME IN T3
MOVE T1,[.NDRNN,,T2] ;ARG POINTER
MOVEI T2,2 ;AND ARG BLOCK LENGTH
NODE. T1, ;TO READ NODE NUMBER FOR NAME
SETO T1, ;NONE KNOWN
MOVE T2,T1 ;RETURN NODE NUMBER IN T2
POP P,T1 ;AND NODE NAME IN T1
POP P,T3 ;ADJUST STACK
POPJ P, ;AND RETURN
SUBTTL SPECIAL TTY SETUP SEQUENCES
;TERMINET 300--SET TABS AT 4,12,... (4 IS THEN C.RET.POINT)
TRMIMG: BYTE (7)15,12,33,62,177,177,15,40,40,40,33,61,40,40,40,40,40,40,40,40,33,61,40,40,40,40,40,40,40,40,33,61,40,40,40,40,40,40,40,40,33,61,40,40,40,40,40,40,40,40,33,61,40,40,40,40,40,40,40,40,33,61,40,40,40,40,40,40,40,40,33,61,40,40,40,40,40,40,40,40,33,61,40,40,40,40,40,40,40,40,33,61,15,0
SUBTTL STORAGE AREA
;STORAGE AREA
XLIST ;LITERALS
LIT
LIST
CRLFM: ASCIZ /
/
;TABLES SHARED AMONG ALL COPIES OF INITIA
LOCKWD: EXP -1 ;INTERLOCK FOR HISEG
LOKJOB: BLOCK 1 ;JOB # THAT HAS INTERLOCK
LOKTTY: BLOCK 1 ;ABOVE JOB'S TTY LINE
FRCTRY: BLOCK 1 ;NUMBER OF TIMES WE GOT TO FORCE
FRCCNT: BLOCK 1 ;NUMBER OF TIMES THAT WE ACTUALLY FORCED THE LOCK
ITLCNT: BLOCK 1 ;NUMBER OF TIMES WE THOUGHT WE HAD
;THE HIGH-SEG INTERLOCK BUT WE DIDN'T
CORCNT: BLOCK 1 ;NUMBER OF TIMES THE CORE UUO TO
;INCREASE THE HIGH-SEG FAILED
JOBWAT: BLOCK <^D512+^D35>/^D36 ;BIT TABLE FOR JOBS WAITING FOR THE INTERLOCK
JBWATL==.-JOBWAT ;NUMBER OF ENTRIES IN THE TABLE
HIPTR: POINT 7,0 ;BYTE POINTER TO TEXT STORAGE
HS$DEV: BLOCK N$HSGF ;DEVICE NAMES
HS$FIL: BLOCK N$HSGF ;FILE NAMES
HS$EXT: BLOCK N$HSGF ;EXTENSIONS
HS$PPN: BLOCK N$HSGF ;PPN'S
HS$DAT: BLOCK N$HSGF ;DATE/TIME WORDS
HS$PTR: BLOCK N$HSGF ;BYTE POINTER TO CONTENTS OF
; THE FILE. IF THIS WORD IS 0
; THE FILE DOES NOT EXIST
SUBTTL IMPURE DATA
RELOC
ZER:! ;START OF AREA TO ZERO ON RESTART
PDL: BLOCK L$PDL+1 ;PUSH-DOWN LIST
GETCH: BLOCK 1 ;ADDRESS OF TTY INPUT ROUTINE IF ANY
REEAT: BLOCK 1 ;CHARACTER TO REEAT
FILICH: BLOCK 1 ;REUSABLE CHARACTER IN STRIPPER
JUMPPR: BLOCK 1 ;ADDRESS OF SPECIAL STARTUP ROUTINE
SYSPPN: BLOCK 1 ;PPN OF SYS:
MYPPN: BLOCK 1 ;PPN OF THIS JOB
NOPBLK: BLOCK .NOPNM+1 ;BLOCK FOR NETOP.ING
DEFTYP: BLOCK 1 ;SYSTEM DEFAULT TTY TYPE
TERNUM: BLOCK 1 ;INDEX OF THIS TTY
TRMNAM: BLOCK 1 ;SIXBIT CENTRAL NODE TERMAL NAME ("TTYNNN"), EXPANDED
TRMNNM: BLOCK 1 ;SIXBIT NODE RELATIVE TERMINAL NAME (EXPANDED ALSO)
TRMNUM: BLOCK 1 ;UDX OF TTY FOR SET/READ IN TYPTTY
STR8BK: BLOCK L$SBLK+.NSAST ;EIGHT BIT ASCII STRING BLOCK
MYTERM: BLOCK L$TERM+.NSAST ;EIGHT BIT PORT ID STRING
MYNODE: BLOCK L$NNAM+.NSAST ;EIGHT BIT ASCII NODE NAME
MYNUMB: BLOCK L$NNAM+.NSAST ;EIGHT BIT ASCII NODE NUMBER
MYNNAM: BLOCK 1 ;SIXBIT NODE NAME
JOBN: BLOCK 1 ;OUR JOB NUMBER
MYBIT: BLOCK 1 ;BIT FOR THIS JOB IN JOBWAT TABLE
MYWRD: BLOCK 1 ;ADDRESS OF THE WORD CONTAING THE BIT
MYSPD: BLOCK 1 ;MY RECEIVE SPEED AS DETECTED
FFAPPN: BLOCK 1 ;PPN OF [1,2]
REQPPN: BLOCK 1 ;REQUESTED PPN
; SYMBOLIC LOCATIONS OF THE FORM "NL.???" STORE VALUES IN THE FORM
; XWD NODE,LINE
NL.CTY: BLOCK 1 ; CENTRAL STATION (CTY)
NL.OPR: BLOCK 1 ; CENTRAL OPR
NL.LOP: BLOCK 1 ; OUR LOCAL OPR
NL.ME: BLOCK 1 ; OUR LOCATION
CTYTTY: BLOCK 1 ; SIXBIT TTY NAME FOR CTY
CTYNUM: BLOCK 1 ;UDX FOR CTY
FLNNUM: BLOCK 1 ;UDX FOR FRCLIN
APRSN: BLOCK 1 ;APR SERIAL NUMBER
IBF: BLOCK 3 ;BUFFER HEADER BLOCK
RUNBLK: BLOCK 6 ;RUN UUO PARAMETERS
ACTSTR: BLOCK 10 ;ACCOUNT STRING FROM TTY.INI
INTBLK: BLOCK 4 ;INTERCEPT BLOCK
TEMP1: BLOCK 1 ; TEMPORARY STORAGE FOR INTERCEPT
NOINT: BLOCK 1 ; IF NEGATIVE DON'T INTERRUPT
SAVEF: BLOCK 1 ;PLACE TO HOLD F
FLKSYS: BLOCK 1 ;FLAG TO TYPE KSYS TIME
FLNAME: BLOCK 1 ;FLAG NONAME (SUPPRESS HEADER LINE)
FLSET: BLOCK 1 ;FLAG NOSETTTY (SUPRESS TTY SETUP)
FLSTR: BLOCK 1 ;FLAG TO DO STRUCTURE NOTES
FLTEXT: BLOCK 1 ;FLAG TO PRINT TEXT MSG
FLNOTC: BLOCK 1 ;FLAG TO TYPE NOTICE.TXT
FLTTY: BLOCK 1 ;FLAG TO TYPE TTY SETTINGS
FLATTR: BLOCK 1 ;FLAG TO TYPE TTY ATTRIBUTES
FLCHEK: BLOCK 1 ;FLAG TO QUERY TERMINAL FOR ITS TYPE
DIAL: BLOCK 2 ;NUMBER TO DIAL
LOCAT: BLOCK 1 ; LOCATE USER
NODBLK: ;START OF NODE. UUO ARGUMENT BLOCK
NODLEN: BLOCK 1 ;LENGTH OF NODE UUO ARGUMENT BLOCK
NODLOC: BLOCK 1 ;NODE NUMBER
BLOCK 1 ;RESERVED ARGUMENT
NODDEV: BLOCK 1 ;NUMBER OF DEVICES,,DEVICE TYPE
FILCWT: BLOCK 1 ;SLEEP COUNTER IN FILCON
TTBZER:! ;START CLEARING HERE IF CHECK BUT NOSET
;TTY PARAMETERS
APC:: BLOCK 1 ;TTY APC
ALT:: BLOCK 1 ;TTY ALT
BLANK:: BLOCK 1 ;TTY BLANK
CLASS: BLOCK 1 ;TTY CLASS
CRLF:: BLOCK 1 ;TTY CRLF
ECHO:: BLOCK 1 ;TTY ECHO
ECHDEF: BLOCK 1 ;TTY DEFER
EDITOR: BLOCK 1 ;TTY EDITOR
ESCAPE: BLOCK 1 ;TTY ESCAPE
FILL:: BLOCK 1 ;TTY FILL
FORM:: BLOCK 1 ;TTY FORM
GAG: BLOCK 1 ;TTY GAG
IDLE: BLOCK 1 ;TTY IDLEDISC
LC:: BLOCK 1 ;TTY LC
LENGTH::BLOCK 1 ;TTY LENGTH
LOCALC::BLOCK 1 ;TTY LOCALCOPY
MODEL:: BLOCK 1 ;TTY MODEL:NAME
PAGEON::BLOCK 1 ;TTY PAGE
PAGE: BLOCK 1 ;TTY PAGE:N
QUOTE: BLOCK 1 ;TTY QUOTE
RCV: BLOCK 1 ;TTY RCVSPEED
REM: BLOCK 1 ;TTY REMOTE
RTCOMP::BLOCK 1 ;TTY RTCOMP
SBELL:: BLOCK 1 ;TTY SBELL (RING BELL ON AUTO-STOP)
SLAVE:: BLOCK 1 ;TTY SLAVE
SSIZE:: BLOCK 1 ;TTY STOP N (THE "N" OF STOP EVERY N LINES)
SSTOP:: BLOCK 1 ;TTY SSTOP
STOP:: BLOCK 1 ;TTY STOP
TAB:: BLOCK 1 ;TTY TAB
TAPE:: BLOCK 1 ;TTY TAPE
TYPE:: BLOCK 1 ;TTY TYPE
UNPAUS: BLOCK 1 ;TTY UNPAUSE
WIDTH:: BLOCK 1 ;TTY WIDTH
XMT: BLOCK 1 ;TTY XMTSPEED
XONXOF::BLOCK 1 ;TTY XONXOF
;TTY ATTRIBUTES
ATR8BA::BLOCK 1 ;TTY ATR 8BITARCHITECURE
ATR8BT::BLOCK 1 ;TTY ATR EIGHTBIT
ATRAVO::BLOCK 1 ;TTY ATR AVO
ATRBMT::BLOCK 1 ;TTY ATR BLOCKMODETRANSFER
ATRBTA::BLOCK 1 ;TTY ATR BLOCKANSI
ATRCID::BLOCK 1 ;TTY ATR IDCHARACTER
ATRCLR::BLOCK 1 ;TTY ATR COLOR
ATRDIS::BLOCK 1 ;TTY ATR DISPLAY
ATRESL::BLOCK 1 ;TTY ATR STATUSLINE
ATRGAT::BLOCK 1 ;TTY ATR GUARDEDAREATRANSFER
ATRGPO::BLOCK 1 ;TTY ATR REGIS
ATRHSR::BLOCK 1 ;TTY ATR HORIZONTALSCROLLING
ATRISO::BLOCK 1 ;TTY ATR ISO
ATRJTK::BLOCK 1 ;TTY ATR KATAKANA
ATRLID::BLOCK 1 ;TTY ATR IDLINE
ATRNKB::BLOCK 1 ;TTY ATR [NO]KEYBOARD
ATRNRC::BLOCK 1 ;TTY ATR NRC
ATROVR::BLOCK 1 ;TTY ATR OVERSTRIKE
ATRPPO::BLOCK 1 ;TTY ATR PRINTERPORT
ATRRCS::BLOCK 1 ;TTY ATR DRCS
ATRSEM::BLOCK 1 ;TTY ATR SELECTIVEERASE
ATRSRM::BLOCK 1 ;TTY ATR SCROLLREGIONS
ATRSSU::BLOCK 1 ;TTY ATR SESSIONS
ATRSXL::BLOCK 1 ;TTY ATR SIXEL
ATRTCS::BLOCK 1 ;TTY ATR DECTCS
ATRTEK::BLOCK 1 ;TTY ATR TEKTRONIXEMULATION
ATRTSI::BLOCK 1 ;TTY ATR INTERROGATION
ATRUDK::BLOCK 1 ;TTY ATR UDKEYS
ATRUWN::BLOCK 1 ;TTY ATR UWINDOW
ATRV52::BLOCK 1 ;TTY ATR VT52EM
ATRVFL::BLOCK 1 ;TTY ATR VLENGTH
ATRVFW::BLOCK 1 ;TTY ATR VWIDTH
TERATR: BLOCK 1 ;BIT MASK
TRMATR: BLOCK 1 ;CHANGE MASK
DECLVL::BLOCK 1 ;TTY ATR DECLEVEL:N
ANSLVL::BLOCK 1 ;TTY ATR ANSLEVEL:N
LOCDVT::BLOCK 1 ;TTY ATR LOCATOR:XXXXXX
TERAT2: BLOCK 1 ;FIELDS
TRMAT2: BLOCK 1 ;CHANGE FLAG
;ADD .TOAT3 STORAGE HERE
TERAT3: BLOCK 1 ;FIELDS
TRMAT3: BLOCK 1 ;CHANGE FLAG
TTEZER==.-1 ;LAST WORD TO CLEAR WAS ABOVE
SAVLCH: BLOCK 1 ;SAVED GETLCH RESULTS
VT52CH: BLOCK 1 ;SAVED PRESUMED <ESC> AT START OF DECID RESPONSE
CHKS8B::BLOCK 1 ;SAVED COPY OF .TO8BT AT START OF CHECK ROUTINE
CSIS8B::BLOCK 1 ;FLAG WHETHER CSIID DETECTED 8-BIT OR MARK PARITY
DA2DEF::BLOCK 1 ;TYPE(S) TO SET AT END OF DA2 PARSING
PRVPRM::BLOCK 1 ;PRIVATE PARAMETER CHARACTER OR ZERO (CONTROL SEQ)
PRMLST::BLOCK PRMMAX+1 ;BLOCK OF PARAMETER VALUES FOLLOWING CSI
SLPTIM::BLOCK 1 ;HIBER ARGUMENT FOR PIMGET
STRBUF::BLOCK 7 ;SPACE TO BUILD A STRING FOR TYPIST ON THE FLY
CMODEL::BLOCK 1 ;SAVED MODEL I.D. FOR RESULTS FROM CHECK
LOWPTR: BLOCK 1 ;POINTER TO HISEG TEXT
CHRSOU: BLOCK 1 ;COUNT OF CHARACTERS OUTPUT FOR TYPTTY
SILENC: BLOCK 1 ;DON'T TYPE ANYTHING ON TTY IF NONZERO
TTYOBF: BLOCK 1 ;TTY OUTPUT RING HEADER
TTYPNT: BLOCK 1 ;TTY OUTPUT BYTE POINTER
TTYCNT: BLOCK 1 ;TTY OUTPUT BYTE COUNT
TTYBUF: BLOCK L$TTBF+3 ;SIZE OF OUTPUT BUFFER
FLNCNT: BLOCK 1 ;BYTE COUNTER FOR TYPER
FLNPNT: BLOCK 1 ;BYTE POINTER FOR TYPER
FLNBUF: BLOCK <FLN$MX+4>/5 ;BYTE BUFFER FOR TYPER
GETSTR: BLOCK 5 ;ARGUMENT BLOCK FOR GOBSTR UUO
STRBLK: BLOCK 1+3*N$STRS ;ARGUMENT BLOCK FOR STRUUO
ENDSTR==.
IPCMHD: BLOCK .IPCMP+1 ;HEADER BLOCK FOR IPCFM.
IPCCBK: BLOCK .IPCS2+1 ;[SYSTEM]IPCC MESSAGE BLOCK
TTWFLG: BLOCK 1 ;FLAG THAT WE WILL/ARE STOMP/ING
TTWNRI: BLOCK 1 ;TOTAL CHARACTER COUNT
TTWNTM: BLOCK 1 ;LAST TIMER
TTWPCT: BLOCK 1 ;POINTER (INDEXES T7) TO LINE-DEPENDENT CHAR COUNT
TTWPTM: BLOCK 1 ;POINTER (INDEXES T7) TO PARALLEL TIME OF LAST SAMPLE
TTWPRS: BLOCK 1 ;POINTER (INDEXES T7) TO CHANNEL,,.TORSP
TTWP2R: BLOCK 1 ;POINTER (INDEXES T7) TO TWICE-IN-A-ROW FLAG FOR STOMPR
LINTAB: BLOCK 1 ;POINTER (INDEXES T7) TO ENTRY IN MAPPED LINTAB
TTWMCN: BLOCK 1 ;HIGHEST CHANNEL WE ARE USING.
TTWILC: BLOCK 1 ;INIT'ED LINE COUNT
LDBOFF: BLOCK 1 ;OFFSET FROM MONITOR LDB ADDR TO USER LDB ADDR.
outpxx: block 1000 ;debugging buffer
outpxs==<.-outpxx>*4 ;size of buffer in bytes
EZER:! BLOCK 0 ;LAST LOCATION (+1) FOR ZEROING
outpxy: block 1 ;buffer pointer for debugging
outpxz: block 1 ;countdown limit for storing in outpxx
sysupt: block 1 ;timer value
END INITIA