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. ;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,1987. 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 ,MOVEI T1,L$TERM+.NSAST ;GET THE LENGTH OF A TERMINAL STRING BLOCK MOVEM T1,MYTERM ;SETUP THE WORD COUNT IFN ,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 ;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,,) 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 "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 "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, ;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 ;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 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 ;TYPE THE CHANNEL NUMBER IN OCTAL PUSHJ P,TTCOCT ; SO WE CAN TRACK WHEN WE GRABBED WHAT. CTYSTR CRLFM ;END LINE 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 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 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 JUMPL T4,TTWIN2 ;IF WRAPPED AROUND MIDNIGHT, RESET EVERYTHING JUMPLE T1,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 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 @TTWPRS ;WANT TO CHECK THIS LINE? JRST TTWSP7 ;NO HRRZ T1,T7 ;YES, GET LINE NUMBER PUSHJ P,CVTSIX ;MAKE SIXBIT NNN IORI T1,'TTY' ;MAKE INTO TTY NAME (SWAPPED) TTWSP5: 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 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. 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 CRLFM ;END LINE WITH CRLF POPJ P, ;FINISHED DUMPING JUNK. 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 "0"(T4) ;TYPE OUT THE DIGIT CORRESPONDING. POPJ P, ;RETURN, EITHER MORE DIGITS, OR TO USER. 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,) 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: ;CONNECT IF NOTHING MATCHED SO FAR ;APPLIES TO EVERYTHING WITH NODE MATCH ;MATCH IF AUTOBAUD LINE ;MATCH IF SPEED MATCHES ;MATCH IF OTHER THAN SPEED GIVEN ;CONNECT ANF NETWORK LINES ;START THE TTY STOMPER ;MATCH IF WE'RE FRCLIN ;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-CMDLL-CMDLT,CMDT+CMDLL+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, 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., LIST > DEFINE Y(A,B,C), 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), 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 ; 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 BLOCKM,ATRBMT,T,B W BLOCKT,ATRBMT,T,B W BLOCKA,ATRBTA,T,B W IDCHAR,ATRCID,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 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 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 DECLVL,DECLVL,T,D W DECLEV,DECLVL,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>,< EXP ; $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>,< EXP ; $KEY >> CMDLST (-1,1,2,4) CMDLT==.-CMDT ;HERE FOR THE STOMP COMMANDS DEFINE W($KEY,$PROC,$COM,$JUMP),< IFIDN <$COM>,< EXP ; $KEY >> CMDLST (-1,1,2,4) CMDS==.-CMDT DEFINE W($KEY,$PROC,$COM,$JUMP),< IFDIF <$COM>,< IFDIF <$COM>,< IFDIF <$COM>,< EXP ; $KEY >>>> CMDLST (-1,1,2,4) CMDL==.-CMDT DEFINE W($KEY,$PROC,$COM,$JUMP),< IFIDN <$COM>,< XWD $JUMP,$PROC ; $KEY >> ;LIST OF PROCESSORS CMDP: CMDLST (-1,1,2,4) DEFINE W($KEY,$PROC,$COM,$JUMP),< IFIDN <$COM>,< XWD $JUMP,$PROC ; $KEY >> CMDLST (-1,1,2,4) DEFINE W($KEY,$PROC,$COM,$JUMP),< IFIDN <$COM>,< XWD $JUMP,$PROC ;$KEY >> CMDLST (-1,1,2,4) DEFINE W($KEY,$PROC,$COM,$JUMP),< IFDIF <$COM>,< IFDIF <$COM>,< IFDIF <$COM>,< 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, EXP > 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 ADD T1,[%CVRUN] ;.CPRUN GETTAB FOR OUR CPU GETTAB T1, ;READ IT SETZ T1, ;OK IF NOT AVAILABLE SKIPGE T1 ;IF CP.RUN IS ON, 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 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,MODEL ;SAVE MODEL NAME TO SET 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,MODEL ;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,MODEL ;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 1, ;FLUSH BUFFER AND RETURN ;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 ,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 SKIPLE T1,PRMLST+1 ;IF WIDTH RETURNED MOVEM T1,WIDTH ;USE IT SKIPLE T1,PRMLST ;IF LENGTH RETURNED, 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? PJRST CSIFLS ;NO--EAT THE SEQUENCE 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: EPASCC <.CHESC,"Z"> ;DECID EPASCC <.CHESC,"[","c",.CHESC,"\"> ;DA + ST CHKNM1==.-CHKTB1 ;NUMBER OF ENTRIES CHKAC1: -DECIDL,,DECIDT ;RESPONSE TABLE FOR DECID -ANSDAL,,ANSDAT ;RESPONSE TABLE FOR DA DECIDT: 433,,DECID ;7-BIT ESCAPE,,DISPATCH DECIDL==.-DECIDT ;LENGTH OF TABLE ANSDAT: 33,,ESCID ;ESCAPE,,DISPATCH 233,,CSIID ;CSI,,DISPATCH ANSDAL==.-ANSDAT ;LENGTH OF TABLE ;ROUTINES TO IDENTIFY TERMINAL TYPES -- DECID RESPONSE DECID: SETOM ATRV52 ;DECID IMPLIES VT52 EMULATION MOVEM CH,VT52CH ;SAVE INITIAL CHARACTER 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 POPJ P, ;ABORT RETURN PJRST (T1) ;CONTINUE IN NEXT HANDLER 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 ;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 ;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 ;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 ; ^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,MODEL ;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 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,MODEL ;TYPE NAME JRST CPOPJ1 ;SUCCEED LN03: MOVE T2,['LN03 '] ;MODEL NAME HRROI T1,MODEL ;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 SKIPA T1,.+1 ;GET S8C1T SEQUENCE EPASCC <.CHESC," ","G"> 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 SKIPA T1,.+1 ;GET DECSCL(3) SEQUENCE EPASCC <.CHESC,"[","6","3",";","2","""","p"> DSP3.1: 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+1 ;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 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 T2,DA2DEF ;FETCH TYPE/MODEL NAME AGAIN HRROI T1,MODEL ;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: DA2DSL==.-DA2DSP DA2TYP: 1,,['VT220 '] 2,,['VT240 '] ^D18,,['VT330 '] ^D19,,['VT340 '] DA2MAX==.-DA2TYP DISPCL: MOVSI T1,-DA1MAX ;TABLE SIZE HRROI T2,2 ;'NO' VALUE MOVEM T2,@DA1TAB(T1) ;CLEAR A PARAMETER AOBJN T1,.-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 SETOM @DA1TAB(T1) ;SET THIS ONE AOBJN T7,DSPS.1 ;LOOP OVER ALL ATTRIBUTES IN DA RESPONSE POPJ P, ;DONE DA1TAB: EXP T3,ATRVFW,ATRPPO,ATRGPO,ATRSXL,ATRJTK,ATRSEM EXP ATRRCS,ATRUDK,ATRNRC,T3,ATRESL,T3,ATRBMT,ATR8BA EXP ATRTCS,LOCDVT,ATRTSI,ATRUWN,ATRSSU,T3,ATRHSR DA1MAX==.-DA1TAB 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),> ATR <8BA,8BT,AVO,BMT,BTA,CID,CLR,DIS> ATR ATR ATR 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), DPYTRM: DPYNAM DPYOFF=.-DPYTRM DEFINE X(TERM,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 TXZ F,F.REMO ;[267] 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 DMPBUF ;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,,) 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$: DMPBUF ;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,,) 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,,) 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,,)] 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),< IFNB,<[ASCIZ |TEXT|],,[POINTR TERAT'NUM,T'NUM'.'NAME]> IFB, > 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>, IFNB,< 0,,[ASCIZ /NAME/] > IFB,< 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,
; MOVEI T2,
; 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 REPEAT 0,< ;NO LONGER USED NOW THAT WE DON'T READ AUXACC.SYS TXNE F,F.BIN ;SEE IF BINARY FILE JRST [LDB CH,IBF+.BFPTR JRST CPOPJ1] ;IF SO, RETURN WORD > ;END REPEAT 0 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,,) 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,,) INTWRN (ESA,,)] 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 MOVE T3,[JP.NSP] ;WHO ONLY NEEDS UNSPOOLING 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 FIND THE PPN IN SYS:AUXACC.SYS IF POSSIBLE ;IF ANY PROBLEMS, PROCEED ONWARD AND DUPLICATE THE SYS S/L NOLOC: REPEAT 0,< ;NO LONGER USED DUE TO ACTDAE MOVE T1,[UU.PHS!.IOBIN] ;BINARY MODE, PHYSICAL ONLY. MOVSI T2,'SYS' ;SYS: MOVEI T3,IBF ;INPUT BUFFER HEADER OPEN TI,T1 ;GET DEVICE JRST STRN.6 ;GIVE UP IF UNAVAILABLE! MOVE T1,['AUXACC'] ;FILE MOVSI T2,'SYS' ; NAMED SETZB T3,T4 ; SYS:AUXACC.SYS[-] LOOKUP TI,T1 ;GET IT JRST STRN.6 ;GIVE UP IF MISSING TXO F,F.BIN ;TELL INPUTTER BINARY TXZ F,F.EOF ;CLEAR EOF FLAG PUSHJ P,FILIN ;GET FIRST WORD JRST STRN.6 ;IF NULL FILE, GIVE UP JUMPN CH,STRN.6 ;ONLY FORMAT V.0 WORKS ;BACK HERE TO LOOP OVER PPNS IN FILE STRN.1: PUSHJ P,FILIN ;GET INDICATOR JRST STRN.6 ;OUR PPN MISSING! AOJN CH,STRN.6 ;-1 IS FLAG PUSHJ P,FILIN ;GET SIZE JRST STRN.6 ;BAD FILE SOSGE T6,CH ;GET COUNT LESS PPN JRST STRN.6 ;ERROR IF NEGATIVE SIZE PUSHJ P,FILIN ;GET PPN JRST STRN.6 ;BAD FILE MOVE T1,CH ;GET PPN XOR T1,REQPPN ;COMPARE TO DESIRED TRC CH,-1 ;SEE IF FILE IS WILD TRNN CH,-1 ;TEST WILD TRZ T1,-1 ;YES--PROGRAMMER ALWAYS MATCHES JUMPE T1,STRN.3 ;JUMP IF MATCH!!! ;LOOP TO SKIP ENTRY WE WANT TO IGNORE STRN.2: PUSHJ P,FILIN ;DISCARD JRST STRN.6 ;(BAD FILE) SOJG T6,STRN.2 ;UNTIL COUNT EXHAUSTED JRST STRN.1 ;THEN TRY NEXT PPN ;HERE WHEN ENTRY MATCHES STRN.3: IDIVI T6,5 ;GET STR COUNT JUMPN T7,STRN.6 ;ERROR IF NOT MULTIPLE OF 5 MOVEI T7,1 ;START INDEX INTO ANSWER ;LOOP OVER STRS FOR THIS PPN STRN.4: JUMPE T6,STRN.5 ;EXIT WHEN DONE CAIGE T7,ENDSTR-STRBLK ;SEE IF OVERFLOW PUSHJ P,FILIN ;NO--GET NEXT STR JRST STRN.5 ;EXIT IF EOF (EVEN THO ERROR) MOVEM CH,STRBLK(T7) ;SAVE STR NAME SETZM STRBLK+1(T7) ;CLEAR PPN OF THIS STR PUSHJ P,FILIN ;GET/IGNORE NEXT WORD JRST STRN.5 ;(ERROR) PUSHJ P,FILIN ;GET/IGNORE NEXT WORD JRST STRN.5 ;(ERROR) PUSHJ P,FILIN ;GET/IGNORE NEXT WORD JRST STRN.5 ;(ERROR) PUSHJ P,FILIN ;GET STATUS BIT WORD JRST STRN.5 ;(ERROR) MOVEM CH,STRBLK+2(T7) ;SAVE BITS MOVE T1,[1,,T2] ;POINTER FOR DSKCHR MOVE T2,STRBLK(T7) ;GET STR NAME DSKCHR T1, ;GET ITS STATUS SETOM T1 ;ERROR TXC T1,<.DCTFS_> TXNN T1, ;MUST BE MULTI-ACCESS ; ,ACCESSIBLE, AND A FILE-STRUCTURE ADDI T7,3 ;YES--ADVANCE ANSWER POINTER SOJG T6,STRN.4 ;LOOP OVER ALL STRS THIS PPN ;HERE WHEN A LIST HAS BEEN BUILT IN CORE STRN.5: RELEAS TI, ;RELEASE INPUT CHANNEL TXZ F,F.BIN!F.EOF ;CLEAR BINARY INDICATOR AND EOF MOVE T1,T7 ;POSITION COUNTER JRST STRN.8 ;PROCEED TO TELL MONITOR ;HERE WHEN CAN'T USE SYS:AUXACC.SYS FOR ANY REASON STRN.6: RELEAS TI, ;RELEASE INPUT CHANNEL TXZ F,F.BIN!F.EOF ;CLEAR BINARY INDICATOR AND EOF > ;END REPEAT 0 FOR AUXACC.SYS ;HERE TO COPY THE SYS: SEARCH LIST 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,]> ;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,SIGN3B ;SKIP THIS IF NOTHING THERE TTYSTR [ASCIZ /(/] HLRZ T1,NL.ME ; GET NODE NUMBER PUSHJ P,TYPOCT TTYSTR [ASCIZ /)/] ;CLOSE OFF THE NODE NUMBER SIGN3B: HLRZ T1,MYTERM+.NSASL ;SEE IF ANY TERMINAL NAME STRING JUMPE T1,SIGN3A ;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 [PUSHJ P,TYPAS8 ;NO, JUST TYPE THE NAME STRING IN FULL JRST SIGN3A] ;AND CONTINUE BELOW 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 SIGN3A: 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,,) 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 ;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 ;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 MOVE OC,SLPTIM ;WAIT FOR CHARACTER OR TIMEOUT HIBER OC, ;WAIT A WHILE JFCL ;FTHIBWAKE IS REMOVED ON INCHRS OC ;GET THE CHARACTER TDZA OC,OC ;NONE, CLAIM A NULL JRST PIMIN2 ;RETURN IT 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 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, ; PUSHJ P,NDNAM ; RETURN ; ;WHERE IS SIXBIT NODE NAME, SIXBIT NODE NUMBER, OR OCTAL NODE NUMBER. ; ;ON RETURN T1 WILL HAVE THE NODE NAME IF IS MEANINGFUL, OTHERWISE ;T1 WILL HAVE , 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 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 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 /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 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. EZER: BLOCK 0 ;LAST LOCATION (+1) FOR ZEROING END INITIA