TITLE SCNSRF - SCANNER AND CONSOLE TELETYPE SERVICE ROUTINE - V415 SUBTTL R CLEMENTS.RCC TS 03 JUN 69 XP VSCNSF,415 ENTRY SCNSRF SCNSRF: ;SCANSER IS ORGANIZED INTO THE FOLLOWING SECTIONS ; I. COMMENTARY ON OPERATION AND DATA STRUCTURES ; II. SYSTEM INITIALIZATION ROUTINE - SCNINI ; III. UUO LEVEL ROUTINES ; A. DDTIN ; B. DDOUT ; C. TTYUUO ; D. TTYIN ; E. TTYOUT ; IV. COMAND LEVEL ROUTINES ; A. TTYATT ; B. TTYCOM ; C. TTYDCM ; D. TTYDET ; E. TTYFND,TTYFNU ; F. TTYKIL ; G. TTYSET ; H. TTYSRC ; I. TTYSTC ; J. TTYTLK ; K. TTYUSR ; V. INTERRUPT SERVICE ROUTINES ; A. CTYINT ; B. SCNINT ; C. RFCINT - ALL LINES RECEIVER INTERRUPT ; 1. TTEDIT - EDITS AND ECHOS ; D. XMTINT - TRANSMIT INTERRUPT ; 1. GETCHR ; 2. TYP ;DATA STRUCTURES AND PARAMETERS ; DEFINED BY BUILD PROCESS FOR THE CONFIGURATION ; SCNLIN=OCTAL NO. OF SCANNER LINES (0 THRU SCNLIN-1) ; TRANSLATOR TABLE PARAMETERS ; TTYLEN=SCNLIN+1 LENGTH OF TTY TRANSLATOR TABLE (INCLUDING CTY) ; TTYTAB: BLOCK TTYLEN TTY TRANSLATOR TABLE ; SIGN BIT=1 IF COMMAND JUST TYPED ; BIT 1 =1 IF DELAYED COMMAND ; BITS 3-11 = JOB NO TTY IS ATTACHED TO (TPCJOBN) ; BITS 12-17=TALK RING LINE # (PTALK) ; BITS 18-35=ADDR. OF DEVICE DATA BLOCK ; FOR THIS LINE. ; DEVOPR: 0 SIXBIT PHYSICAL NAME OF OPERATORS ; CONSOLE ; DEFINED IN IOINI2 ; LINE NUMBER PARAMETERS ; MLTTYL=-NO. OF TTY DEVICE DATA BLOCKS ; TCONLN=SCNLIN CTY LINE NUMBER ; MTTYLN=-TTYLEN -LENGTH OF TRANSLATOR TABLE ; TTYLST=TTY0D0 FIRST TTY DEVICE DATA BLOCK ; TTY DEVICE DATA BLOCK FORMAT ; (STANDARD IS AS DEFINED ON SYSTEM PARAMETER TAPE) ; DEVNAM: PHYSICAL DEVICE NAME SET UP DYNAMICALLY ; VIA SCNIN0. ; DEVCHR: LEFT HALF IS STANDARD ; BITS 18-23=LINE NUMBER(BYTE POINTER=PUNIT) ; BITS 24-35=MONITOR BUFFER SIZE + 1 ; DEVIOS: LEFT HALF ; 1,2,4,20,40 ARE STANDARD USRB=100 ;SET TTY TO USER MODE ;WHEN OUTPUT FINISHES IOSUPR=200 ;SUPPRESS ALL OUTPUT ;TILL NEXT INPUT OR INIT (^O). TPMON=400 ;TTY IS IN MONITOR ;COMMAND MODE. DDTM=1000 ;DDT MDDE TTYDTC=2000 ;TTY DDB IS DETACHED FROM LINE SYNC=20000 ;BREAK CHARACTER SEEN ;SIGNAL TO INCREMENT SYNC COUNT ;FOR BUFFER INVOLVED TTYIOW=400000 ;TTY INPUT WAIT BIT IFNDEF FTHDPX, ;NON-ZERO TO INCLUDE HALF-DUPLEX CODE IFNDEF FTDDTM, ;NON-ZERO TO IUNCLUDE CALLI DDTIN,OUT FTTTYSER=-1 ;DEFINE THIS SYSTEM TO HAVE SCNSRF INTERN FTTTYSER ;ASSURE MULT DEF GLOBALS IF WRONG APSER ; RIGHT HALF BITS (USER MODE0 FCS=100 ;FULL CHARACTER SET. PASS ;ON ALL CHARACTERS EXCEPT ^C ;NO SPECIAL CHARACTER PROCESSING NOECHO=200 ;ECHO SUPPRESSION REQ BY PROG DLRSUP=400 ;400 SUPPPRES "$" FOR ALTMODE MERTPO=IOIMPM ;MONITOR ERROR TYPE-OUT IGNOR=IODERR ;IGNORE ALL INT, FOR 1/2 ;OF A SECOND WHEN ECHO ;FAILURE OCCURS. ECHOF=IODTER ;ECHO FAILURE OCCURED. ; DEVSER: STANDARD ; DEVBUF: STANDARD ; DEVIAD: BITS 6-12=HORIZONTAL POSITION (BYTE ; POINTER = PHPOS). ; BITS 13-35 ARE STANDARD. ; DEVOAD: BITS 0-8=NUMBER OF CHARACTERS TO FIT ; ;INTO OUTPUT BUFFER ; (POINTER= PFITCH) ; BITS 13-35 ARE STANDARD ;THE FOLLOWING ARE DEFINITIONS OF THE RELATIVE LOCATIONS OF THE ;BUFFER PARAMETER WORDS OF THE DEVICE DATA BLOCK FOR EACH BUFFER. WITH ;TTX'BUF AS THE BASE (DETAILED DESCRIPTIN IN SCNDDB COMMENTS): XP BUF,0 ;BUF(DAT) CONTAINS POINTER TO BEG. OF CURRENT BUFFER XP PUTR,1 ;PUTR(DAT)-PUTS CHARACTER INTO BUFFER XP PCTR,2 ;NUMBER OF TIMES TO INCR. PUTR BEFORE REINITING XP TAKR,3 ;TAKER POINTER TO PICK UP CHARACTERS XP TCTR,4 ;COUNT OF NUMBER OF TIMES TAKR CAN BE INCREMENTED XP FCTR,5 ;COUNT OF FREE SPACES LEFT IN BUFFER ;DEFINITION OF LINE CHARACTERISTICS TABLE BITS ;LINTAB MADE BY SYSTEM BYUILDER ;FOLLOWING IS FORMAT AS SET UP BY SCNINI ; XWD BITS,LOGICAL LINE# EXTERNAL LINTAB PTYLIN=400000 ;THIS LINE LINKED TO PTY CTYLIN=200000 ;THIS "LINE" IS CONSOLE DEVICE "TTY" DISLIN=100000 ;THIS LINE IS TO A DISPLAY KEYBOARD DSDTLN=40000 ;DATA SET DATA LINE DSCTLN=20000 ;DATA SET CONTROL LINE HLFDPX=10000 ;HALF DUPLEX LINE TTYRMT=4000 ;REMOTE TTY LINE ;ABOVE ARE "PERMANENT" CHARACTERISTICS TLKRNG=1 ;THIS LINE CURRENTLY IN A TALK RING XON=2 ;^Q TYPED, PAPER TAPE INPUT FULTWX=4 ;SELF ECHOING FULL DUPLEX T35=10 ;MODEL 35 T37=20 ;MODEL 37 ROBTPD=40 ;RUBOUT TYPED LAST (ECHO \ BEFORE NEXT CHAR.) LINRDY=100 ;LINE TYPED IN BY USER (TISYNC .G.0) ; NOT ACTUALLY IN LINTAB. BUT RETURNED BY ; GETLIN IN TTCALL ;ABOVE ARE TEMPORARY BITS, TURNED ON AND OFF BY VARIOUS MEANS ;(BY MONITOR, TYPE-IN COMMANDS, OR PROGRAM) LGLSET=T37+T35+FULTWX+XON ;THESE CAN BE SET OR ZEROED BY PROGRAM KILMSK=ROBTPD+TLKRNG+XON ;CLEARED AT TTYKIL ;DECLARE THESE AS INTERNS TO GET THEM IN THE MAP ;AND TO CHECK AGAINST S IN COMMON INTERNAL PTYLIN,CTYLIN,DISLIN,DSDTLN,DSCTLN,HLFDPX,TTYRMT INTERNAL T35,T37,FULTWX,LGLSET,KILMSK,XON ;ACCUMULATOR ASSIGNMENTS CHREC=TEM ;AC FOR CHARACTER DDB=DEVDAT ;ADDRESS OF DEVICE DATA BLOCK LINE=TAC1 ;SCANNER LINE NUMBER HPOS=ITEM ;HORIZONTAL POSITION OF TTY,(0-71) ;SPECIAL SYMBOLS PION=200 ;TURN PI ON BIT PIOFF=400 ;TURN PI OFF BIT IDLECH=1 ;DELAY CHAR FOR TABS, ETC, ; SHOULD BE ^V, BUT FOR 37'S ;BYTE POINTERS INTERNAL TPCJOBN,TYPX,FULTWX,TYPE,TAKR,BREAKB PHPOS: POINT 7,DEVIAD(DEVDAT),12 ;HORIZONTAL POSITION TPCJOBN:POINT 9,TTYTAB(LINE),11 ;JOB NUMBER FOR TTY. PSAVCH: POINT 7,TTYPTR(DDB),10 ;SAVE CHAR TO ECHO ON UUO LEVEL INTERNAL FTTALK IFN FTTALK,< PTALK: POINT 6,TTYTAB(LINE),17 ;POINTER TO ANOTHER TTY IN TALK RING > INTERN PLASTC,PCOMIC PLASTC: POINT 7,TTYPTR(DDB),35 ;FOR EACH CHECKING ON HDX LINES PCOMIC: POINT 9,TTYPTR(DDB),19 ;FOR RESCANNING COMMAND INPUT LINE ;"COMMAND INPUT COUNTER" SAVES TITCTR PLSTLC: POINT 9,TTYPTR(DDB),28 ;FOR ^U DELETION TOIP=400000 ;SIGN OF TTYPTR(DDB) - TYPE-OUT IN PROGRESS ;TTYPTR CONTAINS THE FOLLOWING BYTES: ; ; 0 ON IF TYPE-OUT IN PROGRESS ; 1-3 SPARE ; 4-10 PSAVCH, FOR INTERRUPTED ECHO ; 11-19 PCOMIC, FOR COMMAND RESCAN ; 20-28 PLSTLC, FOR ^U ; 29-35 PLASTC, FOR EACH CHECKING HALF DUPLEX LINES ;SCNINI IS CALLED AT SYSTEM INITIALIZATION TIME FROM ;IOGO IN SYSINI VIA DISPATCH TABLE ;IT 1)CLEARS ALL RECEIVER FLAGS. ; 2)CLEARS THE PHYSICAL NAME (DEVNAM) OF ALL UNUSED ; (TTYUSE=0) TTY DEVICE DATA BLOCKS, ; 3)SETS DEVIOD TO XWD TPMON+IOFST,0 IN ALL TTY DEVICE ; DATA BLOCKS. ; 4)SETS TTYUSE#1 IN ALL TTY DDBS IN THE TRANSLATOR TABLE. EXTERNAL SCNCHN,MLTTYL,MTTYLN,TTYTAB,SCNINI TTYINI: MOVEI TAC,SCNCHN CONO TTY,1200(TAC) ;CLEAR CTY, ASSIGN CHANNEL PUSHJ PDP,SCNINI ;DEVICE DEPENDENT SCANNER INIT MOVSI TAC1,MLTTYL ;NO. OF TTY DEV. DATA BLOCKS. NOT LINES MOVSI IOS,TPMON+IOFST ;VIRGIN STATUS MOVEI DDB,TTYLST ;FIRST TTY DDB ADDRESS SCN1: MOVSI DAT,TTYUSE ;TTY DDB IN USE BIT TDNN DAT,DEVMOD(DDB) ;IS THIS TTY DDB IN USE? SETZM DEVNAM(DDB) ;NO, SET PHYSICAL NAME TO 0. MOVEM IOS,DEVIOS(DDB) ;SET IOS TO INITIAL STATE ANDCAM DAT,DEVMOD(DDB) ;CLEAR TTYUSE BIT. SETZM TTYPTR(DDB) ;CLEAR TOIP, ETC MOVSI TAC,TTYCHR ;NUMBER OF CHARACTERS IN BUFFER HRRI TAC,TIBF(DDB) ;ADDRESS OF TTY INPUT BUFFER MOVEM TAC,TTIBUF(DDB) ;SET IT UP HRRI TAC,TOBF(DDB) ;ADDRESS OF TTY OUTPUT BUFFER MOVEM TAC,TTOBUF(DDB) ;SET UP INFO FOR THAT PUSHJ PDP,TSETBF ;CLEAR MONITOR BUFFERS HLRZ DDB,DEVSER(DDB) ;GET NEXT TTY DDB AOBJN TAC1,SCN1 MOVSI TAC1,MTTYLN ;SET DDB USE BITS FROM TRANSLATOR TABLE SCN2: MOVSI TAC,TTYUSE SKIPE DDB,TTYTAB(TAC1) IORM TAC,DEVMOD(DDB) HRRZ TAC,TAC1 ;SET UP PERMANENT LINTAB BITS CAIGE TAC,TCONLN ;ORDINARY TTY LINE? JRST SCN3 ;YES CAIE TAC,TCONLN ;CTY LINE? TLOA TAC,PTYLIN ;NO. MUST BE PTY LINE NR TLO TAC,CTYLIN+T35 ;YES SCN3: HRRM TAC,LINTAB(TAC1) ;SET LOG. LINE NUMBERS IORB TAC,LINTAB(TAC1) ;SET SIGNIFICANT BITS TLZ TAC,KILMSK ;ZAP INSIGNIFICANT BITS TLNE TAC,DSDTLN ;IF A DATAPHONE, TLZ TAC,LGLSET ; CLEAR OTHERS TOO HLLM TAC,LINTAB(TAC1) ;LEAVING REST OF BITS AS THEY WERE AOBJN TAC1,SCN2 POPJ PDP, ;ROUTINES TO SET UP BUFFERS INTERNAL TSETBF,SETBFI,PUTCHI SETBFI: MOVEI DAT,1 DPB DAT,PCOMIC DPB DAT,PLSTLC MOVEI DAT,TTIBUF(DDB) ;SPECIFY INPUT BUFFER SETZM TISYNC(DDB) ;NO LINES IN BUFFER JRST SETBF0 ;INIT BUFFER TSETBF: PUSHJ PDP,SETBFI ;INIT TTI BUFFER SETBF2: MOVEI DAT,TTOBUF(DDB) ;SPECIFY OUTPUT BUFFER SETBF0: MOVE TAC,BUF(DAT) HRLI TAC,440700 ;INITIAL TAKR AND PUTR MOVEM TAC,TAKR(DAT) MOVEM TAC,PUTR(DAT) MOVEI TAC,1 ;INITIALIZE COUNTERS TOO MOVEM TAC,TCTR(DAT) MOVEM TAC,PCTR(DAT) HLRZ TAC,BUF(DAT) ;CHARACTER COUNT MOVEM TAC,FCTR(DAT) ;UPDATE FREE CHARACTER COUNT POPJ PDP, ;ROUTINE TO PUT A CHARACTER INTO A BUFFER (FOR INPUT,MERTPO, AND ONCE) ;CALL MOVEI DAT,TTYBUF(DDB) ;TO SPECIFY BUFFER ; PUSHJ PDP,PUTCHI ; ERROR RETURN, BUFFER "FULL" ; SUCCESSFUL RETURN PUTCHI: SOSGE FCTR(DAT) ;ANY FREE SPACES LEFT? JRST PUTCI0 ;NO PUTCI2: SOSLE PCTR(DAT) ;LAST BYTE IN BUFFER FILLED? JRST PUTCI1 ;NO, GO AHEAD PUSH PDP,TAC MOVE TAC,BUF(DAT) ;GET ADR AND SIZE OF BUFFER HLRZM TAC,PCTR(DAT) ;INITIAL COUNTER HRLI TAC,440700 ;MAKE A BYTE POINTER MOVEM TAC,PUTR(DAT) ;STORE IT POP PDP,TAC ;RESTORE TAC PUTCI1: IDPB CHREC,PUTR(DAT) JRST CPOPJ1 ;ROUTINE TO STUFF MONITOR ERROR MESSAGE IN TTI BUFFER ;CALLED IN LINE FROM PUTCH0 TTIOUT: MOVE IOS,DEVIOS(DDB) AOS TOFCTR(DDB) ;RE-ADJUST FREE CHAR COUNT TRNN IOS,MERTPO ;MONITOR ERROR MESSAGES? JRST GETCH1 ;NO, ZERO CHREC TO INDICATE MOVEI DAT,TTIBUF(DDB) ;YES, PUT REST IN TTI BUFFER SOSGE FCTR(DAT) ;ANY SPACE? JRST PUTCI0 ;NO. SOS 0(PDP) ;YES, COMPENSATE SKIP RETURN JRST PUTCI2 ;AND GO TO MIDDLE OF PUTCHI ;CHARACTER AND BUFFER HANDLING ROUTINES ;ROUTINE TO PICK UP A CHARACTER FROM ANY BUFFER ;CALL MOVEI DAT,TTXBUF(DDB) ;TO SPECIFY BUFFER ; PUSHJ PDP,GETCHR ; ONLY RETURN ;CHARACTER OR ZERO IN CHREC ; ;ZERO INDICATES BUFFER "EMPTY"(TAKR=PUTR) INTERNAL GETCHR GETCHR: HLRZ CHREC,BUF(DAT) ;SIZE OF THIS BUFFER CAMG CHREC,FCTR(DAT) ;IS FREE COUNTER EQUAL TO SIZE? ;I.E., IS THE BUFFER EMPTY? JRST GETCH1 ;YES. LOAD CHREC WITH ZERO AND EXIT SOSLE TCTR(DAT) ;NO, ARE WE AT END OF BUFFER? JRST GETCH2 ;YES. GO ON. MOVE CHREC,BUF(DAT) ;YES. START AT TOP AGAIN HLRZM CHREC,TCTR(DAT) ;INITIAL COUNTER HRLI CHREC,440700 ;MAKE A BYTE POINTER MOVEM CHREC,TAKR(DAT) ;INITIAL POINTER GETCH2: ILDB CHREC,TAKR(DAT) ;GET CHARACTER AOS FCTR(DAT) ;INCREMENT FREE CHAR. COUNT JUMPE CHREC,GETCHR ;SKIP NULLS POPJ PDP, GETCH1: TDZA CHREC,CHREC ;RETURN 0 INDICATING END OF BUFFER PUTCI0: AOS FCTR(DAT) ;READJUST FREE COUNTER POPJ PDP, ;ROUTINE TO PLACE A CHARACTER INTO THE OUTPUT BUFFER ;CALLED AT INTERRUPT LEVEL ;CALL MOVE CHREC,CHARACTER TO PLACE INTO BUFFER ; PUSHJ PDP,PUTCHO ; ONLY RETURN, WHETHER OR NOT CHARACTER WAS PLACED PUTCHO: SOSGE TOFCTR(DDB) ;RETURN IMMEDIATELY IF NO ROOM JRST TTIOUT ;UNLESS MONITOR ERROR MESSAGE CONO PI,PIOFF ;PREVENT PCTR AND PUTR DIFFERENCE SOSLE TOPCTR(DDB) ;LAST BYTE IN BUFFER? JRST PUTCO1 ;NO. GO ON. MOVE TAC,TTOBUF(DDB) ;GET COUNT AND ADDRESS HLRZM TAC,TOPCTR(DDB) ;INITIAL COUNTER HRLI TAC,440700 ;MAKE A BYTE POINTER MOVEM TAC,TOPUTR(DDB) ;INITIAL POINTER PUTCO1: IDPB CHREC,TOPUTR(DDB) ;PUT CHARACTER INTO BUFFER CONO PI,PION ;GET PI BACK ON POPJ PDP, ;ROUTINE TO CHECK IF A CHARACTER IS SPECIAL(ASCII 0-37, 175-177) ;CALL MOVE CHREC,CHAR. TO BE CHECKED ; PUSHJ PDP,SPCHEK ; RETURN1 IF REGULAR ASCII CHAR (40-174), C(TAC)=0 ; RETURN2 IF SPECIAL CHAR., TAC LOADED WITH WORD FROM SPCTAB INTERNAL SPCHEK SPCHEK: MOVEI TAC,0 ;LOAD TAC WITH 0 OR SPECIAL CHAR. WORD CAIGE CHREC,40 JRST SPCHK1 CAIG CHREC,174 POPJ PDP, SKIPA TAC,SPCTAB-135(CHREC) SPCHK1: MOVE TAC,SPCTAB(CHREC) JRST CPOPJ1 ;SPECIAL CHARACTER TABLE ;FORMAT XWD BITS+CHAR,ADRESS OF ROUTINE ;HIGH ORDER BITS IN LH: SPACTN=400000 ;SPECIAL ACTION TO BE TAKEN SPOUT=100000 ;SPECIAL HANDLING ON UUO OUTPUT BREAKB=20000 ;BREAK CHARACTER SPHPOS=10000 ;CHARACTER AFFECTS HORIZONTAL POSITION FCSBRK=4000 ;BREAK CHARACTER IN FCS(100) MODE ECHSUP=2000 ;SUPRESS ECHO OF CHAR ITSELF SPCTAB: XWD ECHSUP,0 ;NULL XWD ECHSUP,0 ;^A SOH XWD SPACTN+ECHSUP,CONTB ;^B FULTWX SH XWD SPACTN+ECHSUP+BREAKB,CONTC ;^C XWD ECHSUP,0 ;^D EOT XWD ECHSUP,0 ;^E WRU XWD SPACTN+ECHSUP,CONTF ;^F T37 SW XWD FCSBRK,0 ;^G (BELL) XWD SPACTN+SPHPOS,CONTH ;^H OR BACKSPACE KEY XWD SPACTN+SPHPOS+SPOUT,CONTI ;^I OR TAB XWD BREAKB,0 ;^J OR LINE FEED XWD SPACTN+SPOUT+BREAKB,CONTK ;^K OR VERT TAB XWD SPACTN+SPOUT+BREAKB,CONTL ;^L OR FORM FEED XWD SPACTN+SPHPOS,CRLF ;^M OR CARRIAGE RETURN XWD ECHSUP,0 ;^N XWD SPACTN,CONTO ;^O SUPP OUTPUT XWD SPACTN+ECHSUP,CONTP ;^P T35 SW XWD SPACTN+ECHSUP,CONTQ ;^Q XON (PAPERTAPE) XWD ECHSUP,0 ;^R TAPE PUNCH OFF XWD SPACTN+ECHSUP,CONTS ;^S XOFF XWD ECHSUP,0 ;^T TAPE PUNCH OFF XWD SPACTN,CONTU ;^U DELETE LINE XWD ECHSUP,0 ;^V XWD ECHSUP,0 ;^W XWD ECHSUP,0 ;^X XWD ECHSUP,0 ;^Y XWD SPACTN+BREAKB+ECHSUP,CONTZ ;^Z TTY EOF XWD SPACTN+BREAKB+ECHSUP,ALTMOD ;ASCII 33 (ALT-MODE) XWD ECHSUP,0 ;ASCII 34 XWD ECHSUP,0 ;ASCII 35 XWD ECHSUP,0 ;ASCII 36 XWD ECHSUP,0 ;ASCII 37 ;ABOVE ARE CONTROL CHARACTERS, BELOW ASCII 175-177 XWD SPACTN+BREAKB+ECHSUP,ALTMOD ;OLD DEC ALTMOD 175 XWD SPACTN+BREAKB+ECHSUP,ALTMOD ;ALT-MODE 176 XWD SPACTN+ECHSUP+FCSBRK,RUBOUT ;177 RUBOUT IFN FTDDTM,< ;INPUT TO DDT ;CALL AC,[SIXBIT /DDTIN/] AC CONTAINS POINTER TO BUFFER AREA ;BUFFER AREA MUST BE 21 WORDS LONG INTERNAL DDTIN EXTERNAL WSYNC,IADRCK,ADRERR EXTERNAL PTYOW DDTIN: PUSHJ PDP,TTYFNU ;SET UP DEVDAT,LINE MOVE IOS,[XWD TTYIOW+DDTM,IOACT] IORB IOS,DEVIOS(DDB) ;PUT INTO I/O WAIT MOVE TAC,TIPUTR(DDB) CAMN TAC,TITAKR(DDB) ;ANYTHING IN BUFFER; PUSHJ PDP,TWSYNC ;NO, WAIT FOR SOME DDTIW: MOVE IOS,[XWD TTYIOW,IOACT] ANDCAB IOS,DEVIOS(DDB) MOVSI TAC,IOFST+DDTM IORM TAC,DEVIOS(DEVDAT) ;STOP ALL IO HRRZ TAC,@UUO ;CONTENTS OF USER (DDT) AC ADDI TAC,21 PUSHJ PDP,IADRCK JRST ADRERR SUBI TAC,21 PUSHJ PDP,IADRCK JRST ADRERR MOVSI AC2,440700+PROG HRR AC2,TAC MOVE TAC1,TIPUTR(DDB) MOVEI DAT,TTIBUF(DDB) MOVEI AC1,<21*5>-1 ;NUMBER OF CHARACTERS ALLOWED XFRIN: PUSHJ PDP,GETCHR ;TRANSFER INTO USER'S AREA JUMPE CHREC,XFRIN2 PUSHJ PDP,SPCHEK JRST XFRIN1 TLNE TAC,FCSBRK+BREAKB SOS TISYNC(DDB) XFRIN1: CAIN CHREC,3 ;PRESTORED CONTROL C? JRST DDTCNC ;YES, GO INTO MONITOR MODE IDPB CHREC,AC2 SOJG AC1,XFRIN ;LOOP TILL DONE XFRIN2: MOVEI CHREC,0 ;TERMINATE STRING IDPB CHREC,AC2 MOVSI TAC,IOSUPR ;MAKE SURE IO NO LONGER SUPR. ANDCAM TAC,DEVIOS(DEVDAT) POPJ PDP, DDTCNC: PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS JRST MONUS6 ;GO PROCESS ^C > EXTERNAL PTYOW,WSYNC ;TWSYNC IS CALLED FOR INPUT IO WAIT TWSYNC: TLNE LINE,PTYLIN ;PSEUDO TELETYPE TTYDDB? PUSHJ PDP,PTYOW ;SET OUTPUT WAIT BIT IN PTY DEVIOS WORD TLNE LINE,XON ;DO WE WANT TO START RDR? TLNE LINE,PTYLIN+HLFDPX+FULTWX ;CAN WE? JRST WSYNC ;NO MOVEI CHREC,21 ;READER START CHAR PUSHJ PDP,OUTCHS ;TO OUTPUT BUFFER PUSHJ PDP,UTYPET ;START TTY, AND JRST WSYNC ;WAIT FOR INPUT EXTERNAL WSYNC,IADRCK,ADRERR,CPOPJ EXTERNAL JOBPFI,GETWD1 IFN FTDDTM,< ;OUTPUT FROM DDT ;CALL AC,[SIXBIT /DDTOUT/] AC HAS POINTER TO DDT OUTPUT BUFFER INTERNAL DDTOUT DDTOUT: PUSHJ PDP,TTYFNU MOVE UUO,@UUO > DDT5: MOVSI IOS,IO+DDTM IORB IOS,DEVIOS(DDB) HRLI UUO,PROG ;POINT TO USER AC HRRI UUO,-1(UUO) ;COMPENSATE FOR GETWD1 DDT2: MOVE DAT,[XWD 440700,TAC] ;BYTE POINTER TO TAC PUSHJ PDP,GETWD1 ;GET THE USER'S WORD DDT3: TLNN DAT,760000 ;ANY CHARS LEFT? JRST DDT2 ;NO, GET ANOTHER WORD DDT4: ILDB CHREC,DAT ;BYTE FROM TAC JUMPE CHREC,DDTUTT ;NULL IS END OF STRING PUSHJ PDP,OUTCHR ;PLACE CHAR IN OUTPUT BUFFER JUMPN CHREC,DDT3 ;LOOP IF CHARACTER WAS PLACED ADD DAT,[XWD 070000,0] ;BACK UP POINTER PUSH PDP,DAT ;SAVE BYTE POINTER TO TAC PUSH PDP,TAC ;AND SAVE THE CHARS IN TAC PUSHJ PDP,DDTUTT ;START OUTPUT DDTWAT: MOVEI IOS,IOACT ;WAIT UNTIL MONITOR BUFFER EMPTY IORB IOS,DEVIOS(DDB) PUSHJ PDP,WSYNC POP PDP,TAC ;RESTORE CHARSIN TAC POP PDP,DAT ;RESTORE BYTE POINTER TO TAC JRST DDT3 ;TRY AGAIN DDTUTT: PUSHJ PDP,TTYFNU ;RESTORE DAT,LINE JRST UTYPET ;AND START OUTPUT ;MORE CHARACTER AND BUFFER HANDLING ROUTINES ;OUTCHR CALLED AT UUO LEVEL TO OUTPUT A CHARACTER ;DAT AND DDB MUST BE SET UP ;CHECK IS MADE FOR WHETHER SPECIAL ECHO IS REQUIRED ;RIGHT THINGS ARE DONES WITH PHPOS & HPOS(NEEDNT BE SET) ;CALL MOVE CHREC,CHAR TO BE OUTPUT ; PUSHJ PDP,OUTCHR ; ONLY RETURN, WITH CHAR, OR ITS SPECIAL ECHO PLACED IN OUT BUFFER INTERNAL OUTCHS OUTCHR: TLNE IOS,IOSUPR ;I/O OFF BY ^O? POPJ PDP, ;YES. RETURN MOVEI HPOS,20 ;CHECK FREE SPACE CAML HPOS,TOFCTR(DDB) ; FOR EXPANDING CHARS JRST GETCH1 ;NOT ENOUGH ROOM OUTCHS: PUSH PDP,TAC PUSH PDP,HPOS PUSH PDP,TAC1 ;SAVE LINE PUSHJ PDP,STLNAC ;GET LINE DATA ANDI CHREC,177 ;MASK ANYT JUNK LDB HPOS,PHPOS ;GET HORIZONTAL POSITION PUSHJ PDP,ADJHP ;NEW HPOS AFTER CHAR OUTPUT JFCL TLNE LINE,DISLIN+PTYLIN ;IS IT A DISPLAY OR PTY? JRST OUTCH2 ;YES, IGNORE HPOS AND FILLERS CAIL HPOS,^D72 ;DID IT GO OVER LINE? PUSHJ PDP,CRLFEC ;YES, OUTPUT CRLF TLNE TAC,SPOUT ;VT,FF,HT? JUMPGE LINE,OUTCH1 ;YES, HANDLE THEM UNLESS PTY OUTCH2: PUSHJ PDP,PUTCHO ;PLACE IN BUFFER OUTCH3: DPB HPOS,PHPOS ;UPDATE IN CORE POP PDP,TAC1 ;RESTORE LINE POP PDP,HPOS JRST TPOPJ ;HERE ON UUO OUTPUT OF HT,FF,VT OUTCH1: PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS TLNE LINE,T35 ;SMART TTY? JRST OUTC1A ;YES MOVE TAC,CHREC ;COPY THE CHARACTER MOVEI CHREC,40 ;STUPID TTY. LDB HPOS,PHPOS ;GET OLD POSITION CAIE TAC,11 ;H TAB? MOVEI CHREC,12 ;NO. OUTPUT LF'S. OUTC1C: CAIN TAC,14 ;FF? MOVNI HPOS,10 ;YES. 8 LF'S CAIN TAC,13 ;VT? MOVNI HPOS,4 ;YES. 4 LF'S OUTC1B: PUSHJ PDP,PUTCHO ;OUTPUT THE PHONEY CHAR ADDI HPOS,1 ;COUNT THE OUTPUTS TRNE HPOS,7 ;ENOUGH? JRST OUTC1B ;NO. MORE. JRST OUTCH3 ;NO MORE. OUTC1A: ;HERE ON OUTPUT OF SLOW CHARS TO SMART TTY PUSHJ PDP,PUTCHO ;SENT THE REAL CHAR MOVE TAC,CHREC ;COPY THE CHARACTER MOVEI CHREC,IDLECH ;A DELAY CHARACTER SUBI HPOS,2 ;TWO SHLUFF CHARACTERS JRST OUTC1C ;GO OUTPUT THE SLUFFS. ;COUNT WILL BE MODIFIED ON VT,FF ;CALLED AT UUO AND INT LEVEL ;TO ADJUST HPOS FOR OUTPUT OF CHREC ;SKIPS IF SPCHECK SAYS SPECIAL CHAR ADJHP: CAILE CHREC,174 ;HIGH SPECIALS? JRST SPCHEK ;YES, NO HPOS MOTION CAIL CHREC,40 ;CONTROL CHARACTERS? AOJA HPOS,SPCHEK ;NO. COUNT HPOS FOR PRINT CHAR CAIN CHREC,10 ;BACKSP? SOJL HPOS,.+2 ;YES CAIN CHREC,15 ;CARRIAGE RETURN? MOVEI HPOS,0 ;YES. CAIE CHREC,11 ;TAB? JRST SPCHEK ;NO. NO HP MOD TRO HPOS,7 ;TAB. TO NEXT 8 AOJA HPOS,SPCHEK INTERNAL FTCHECK,FTMONP IFN FTCHECK+FTMONP,< EXTERNAL SCNDDB,TTYLST,TTIBUF,TIPUTR,TITAKR,TITCTR,TIFCTR,TISYNC EXTERNAL TTOBUF,TOPUTR,TOPCTR,TOTAKR,TTYCHR,SCNDDS,CCHAR,LINSAV EXTERNAL TOTCTR,TOFCTR > IFE FTCHECK+FTMONP,< ;DESCRIPTION OF DEVICE DATA BLOCK FOR TELETYPES ;THERE IS ONE DEVICE DATA BLOCK FOR EACH JOB THAT CAN BE INITIALIZED ;UNDER TIME-SHARING, WHETHER THIS JOB IS ATTACHED TO A PHYSICAL LINE ;NUMBER OR NOT, THEREFORE THERE SHOULD BE ONE DDB FOR EVERY LINE NUMBER ;PLUS ONE FOR EVERY PSEUDO-TELETYPE PLUS ONE FOR EVERY ADDITIONAL JOB ;THAT AN INSTALATION MAY WISH TO RUN DETACHED FROM A PHYSICAL LINE ;PLUS ONE DDB TO PRINT ERROR MESSAGES WHEN ALL JOBS (DDB'S ARE ;INITIALIZED. ;THE FUNCTIONS OF THE FIRST EIGHT WORDS ARE AS DESCRIBED IN THE ;COMMENTS IN THE SYSTEM PARAMETER TAPE( FILE NAME S). LOCATION 11 ;THROUGH 27 (OCTAL) RELATIVE TO SCNDDB PERTAIN DIRECTLY TO THE ;SCANNER SERVICE BUFFERING SCHEME. THE SUBSEQUENT 2*20(OCTAL) LOCATIONS ;ARE CURRENTLY THE TWO TELETYPE BUFFERS. THEY NEED NOT BE IN THE DDB ;AS LONG AS THEIR ADDRESSES ARE PLACED IN THE RIGHT HALF OF TTIBUF. ;AND TTOBUF EITHER AT ASSEMBLY, BUILD OR RUN TIME, IF DYNAMIC ;BUFFER CONSTRUCTION IS TO BE ADDED THESE BUFFERS MAY BE PLACED ANYWHERE IN ;FRE CORE STORAGE, AND THE RIGHT HALF OF THE REQUIRED TTXBUF(WHERE "X" ;MAY BE "I" OR "O")MAY BE LOADED ONLY WHEN THAT BUFFER IS REQUIRED. ;THERE ARE TWO BUFFERS, EACH OF WHICH IS A "RING" UNTO ITSELF: ;INPUT---POINTED TO BY TTIBUF ; ALL CHARACTERS TYPED GO INTO THIS BUFFER, IN ADDITION, ALL ;OTHER COMMANDS TO BE READ BY THE COMMAND INTERPRETER IN COMCON ;(APRSER) ARE STORED HERE, ;OUTPUT BUFFER---POINTED TO BY TTOBUF ; ALL CHARACTERS THAT ARE OUTPUT ARE PLACED SEQUENTIALLY IN THIS ;BUFFER; THIS INCLUDES ECHOED CHARACTERS AS WELL AS NORMAL OUTPUT OF ;CHARACTER STRINGS. ;THERE ARE NINE BUFFER PARAMETER WORDS ASSOCIATED WITH EACH BUFFER ;(EXCEPT FOR THE OUTPUT BUFFER, WHICH ONLY NEEDS SIX), THE LAST ;FOUR CHARACTERS IUN THE MNEMONIC DESCRIBES THE FUNCTION OF THE WORD ;WHILE THE FIRST TWO CHARACTERS IDENTIFY WHICH BUFFER THAT THE ;FUNCTION APPLIES TO. THE FORMULA FOR THESE WORDS IS TX'FUNC, WHERE ;THE RELATIVE POSITION OF ALL TX'FNC1 TO TTX'BUF IS THE SAME FOR ;ALL BUFFERES. IN THE MANNER, THE ADDRESS OF TTX'BUF IS LOADED INTO ;ACCUMULATOR DAT, AND THE RELATIVE POSITIONS FUNCT1-FUNCT9 ARE ;DEFINED TO BE 0-10(OCTAL); I.E., FUNCT(DAT) WILL IDENTIFY THE DESIRED ;BUFFER PARAMETER WORD REGARDLESS OF BUFFER. ;FOLLOWING ARE DEFINITIONS OF THE RELATIVE BUFFER PARAMETER WORDS: ;TTX'BUF OR BUF(DAT)---THE LEFT HALF CONTAINS NUMBER OF BYTES IN BUFFER AND THE RIGHT ; HALF THE ADDRESS OF THE FIRST WORD OF THE BUFFER, THIS WORD IS ; ONLY READ BY THE CURRENT CODE. UPON THE ADDITION OF DYNAMIC ; BUFFER ALLOCATION. THIS WORD WOULD BE LOADED IN THE SAME FORMAT ; AT THE TIME THAT THE BUFFER WOULD BE BUILT. ; ;SCNINI SETS BUFFERS TO LENGTH TTYCHR AT PRESENT. ALSO ;PRESENT CODE OCCASIONALLY USES TTYCHR RATHER THEN READING LH ;OR TTXBUF ; ;TX'PUTR OR PUTR(DAT)---BYTE POINTER USED TO PLACE CHARACTERS INTO THE ; BUFFER. IT MUST ALWAYS BE AHEAD OF OR EQUAL TO THE TAKER POINTER. ;TX'PCTR OR PCTR(DAT)---COUNT OF NUMBER OF TIMES THAT PUTR MAY BE INCREMENTED ; BEFORE REACHING THE LAST BYTE IN THE LAST WORD OF THE BUFFER ; (NOT THE AMMOUNT OF FREE SPACE LEFT) ;TX'TAKR OR TAKR(DAT)---BYTE POIUNTER USED BY ALL ROUTINES TO PICK UP ; CHARACTERS FRM THE BFFER. WHEN THE TAKR IS EQUAL TO THE PUTR. ; THE BUFFER IS "EMPTY". ;TX'TCTR OR TCTR(DAT)---COUNT OF THE NUMBER OF TIMES THAT THE TAKR CAN ; BE INCREMENTED BEFORE REACHING THE PHYSICAL END OF THE BUFFER. ;TX'FCTR OR FCTR(DAT)---FREE CHARACTER COUNT; I.E., HOW MANY TIMES MAY THE ; PUTR BE INCREMENTED BEFORE IT WOULD COME AROUND AND "STEP ON" ; THE TAKR, WHEN THE FREE CHAR. COUNT IS ZERO, NO MORE CHARACTERS ; MAY BE PLACED IN THE BUFFER (USUAL RESULT IS GOING INTO IO WAIT) ;TISYNC---COUNT OF NUMBER OF "LINES" THAT HAVE BEEN TYPED ; INTO INPUT BUFFER. ;SCANNER DEVICE DATA BLOCK ;REMAINING SCN DDB'S ARE GENERATED ;OUT OF LINE AT BUILD TIME. INTERNAL SCNDDB,LINSAV TTYLST=. ;FIRST TTT DDB ZZ=. SCNDDB: SIXBIT /TTY0/ ;DEVNAME XWD 0,STTYBF+1 ;DEVCHR Z ;DEVIOS EXP SCNDSP ;DEVSER XWD DVTTY+DVIN+DVOUT,3 ;DEVMOD Z ;DEVLOG Z ;DEVBUF XWD PROG,0 ;DEVIAD, PHPOS BITS 6-12 XWD PROG,0 ;DEVOAD, PFITCH BITS 0-8 XP TTYPTR,.-ZZ ;TTYPTR Z ;PLASTC,PLSTLC,PCOMIC,POSAVCH,TOIP XP TISYNC,.-ZZ Z XP TTIBUF,.-ZZ XWD STTYBF*5,0 ;RH IS BUFFER ADR XP TIPUTR,.-ZZ Z XP TIPCTR,.-ZZ Z XP TITAKR,.-ZZ Z XP TITCTR,.-ZZ Z XP TIFCTR,.-ZZ Z XP SYSPDL,. ;BUFFER USED AS PUSH-DOWN LIST BY SYSTEM DURING ;INITIALIZATION AND RESTARTING XP TIBF,.-ZZ REPEAT STTYBF,< 0> XP TTOBUF,.-ZZ XWD STTYBF*5,0 XP TOPUTR,.-ZZ Z XP TOPCTR,.-ZZ Z XP TOTAKR,.-ZZ Z XP TOTCTR,.-ZZ Z XP TOFCTR,.-ZZ Z XP TOBF,.-ZZ REPEAT STTYBF,<0> ;NO. OF CHAR. IN MON. BUF. XP TTYCHR,<*5> XP SCNDDS,.-ZZ ;SIZE OF SCN DDB LINSAV: 0 > ;CLOSE IFE FTMONP WAY BACK ;DEVICE DEPENDENT PART OF IO UUOS. ;DISPATCH TABLE INTERNAL SCNDSP EXTERNAL OUT,SCNON,SCNOFF JRST TTYINI ;INITIALIZATION JRST CPOPJ1 ;TTY HUNG TIME-OUT, IGNORE SCNDSP: JRST TTYREL ;RELEASE JRST OUT ;CLOSE JRST TTYOUT ;OUTPUT TTYIN: MOVE IOS,[XWD TTYIOW,IOACT] ;INDICATE INPUT WAIT IORB IOS,DEVIOS(DDB) MOVSI IOS,DDTM+TPMON ANDCAB IOS,DEVIOS(DDB) PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS IFN FTHDPX,< TLNE LINE,HLFDPX TLNN IOS,IO > TTYIN1: SKIPG TISYNC(DDB) PUSHJ PDP,TWSYNC PUSHJ PDP,MONUSR TENDIN: MOVE IOS,[XWD TTYIOW+DDTM+IOSUPR,ECHOF+MERTPO+IGNOR+IOACT] T0POPJ: ANDCAB IOS,DEVIOS(DDB) POPJ PDP, ;ROUTINE TO MOVE A LINE OR STRING FROM TTY INPUT BUFFER TO USER'S INPUT BUFFER ;CALLED ONLY FROM UUO LEVEL,FROM INPUT UUO ONLY EXTERNAL ADVBFF,STTIOD,BUFCLR MONUSR: HRRZ TAC,DEVIAD(DDB) ;ADDRESS OF BUFFER IN USER AREA PUSHJ PDP,BUFCLR ;CLEAR WHOLE BUFFER JRST ADRERR ;ADDRESS CHECK RETURN PUSHJ PDP,STLNAC ;SETUP LINE MOVEI AC2,TTYCHR ;MAX NR OF CHARACTERS MOVEI AC1,@DEVIAD(DDB) ;ADDRESS OF USR BUFFER-1 ADD AC1,[XWD 10700,1] ;MAKE BYTE POINTER POINT RIGHT MOVEI DAT,TTIBUF(DDB) ;SPECIFY USER MODE INPUT BUFFER MONUS1: PUSHJ PDP,GETCHR ;GET A CHAR, FROM IT JUMPE CHREC,MONUS3 ;ZERO IMPLIES EMPTY BFR IDPB CHREC,AC1 ;PLACE CHAR. IN USER BUFFER PUSHJ PDP,SPCHEK ;SPECIAL CHARACTER? JRST MONUS2 ;NO TLNE TAC,FCSBRK+BREAKB ;A BREAK CHARACTER? SOSA TISYNC(DDB) ;SOME BREAK, COUNT IT DOWN MONUS2: SOJG AC2,MONUS1 ;NO, USER BUFFER FULL? CAIN CHREC,3 ;STORED CONTROL C? JRST MONUS7 ;YES, HANDLE IT MOVEI IOS,0 CAIN CHREC,"Z"-100 ;^Z READ? MOVSI IOS,IOEND IORB IOS,DEVIOS(DDB) MONUS3: MOVEI AC2,@DEVIAD(DDB) ;BREAK CHAR OR COUNTED OUT, INPUT UUO DONE SUBI AC1,1(AC2) ;CALCULATE NUMBER OF WORDS HRRM AC1,1(AC2) ;STORE IN 3RD BUFFER WORD MONUS4: PUSHJ PDP,ADVBFF ;INPUT UUO DONE,NEXT BUFFER FULL? JRST MONUS5 ;YES, INPUT REALLY IS DONE SKIPLE TISYNC(DDB) ;NO, DO WE HAVE MORE LINES FOR IT? JRST MONUS8 ;YES, GIVE USER NEXT LINE, TOO MONUS5: MOVSI IOS,IOFST IORB IOS,DEVIOS(DDB) TLZE IOS,IOW ;TTY IN INPUT WAIT? PUSHJ PDP,STTIOD ;YES., TAKE IT OUT OF IT POPJ PDP,0 MONUS6: PUSHJ PDP,CNCMOD ;CONTROL C MODE MOVSI TAC,70000 ;DECREMENT TAKR POINTER ADDM TAC,TITAKR(DDB) ;SO NEXT ILDB WILL GET ^C AOS TITCTR(DDB) ;ADJUST COUNTER SOS TIFCTR(DDB) ;ADJUST FREE CHAR. COUNT AOS TISYNC(DDB) ;SEE THE ^C AGAIN PUSHJ PDP,COMSET ;WAKE UP COMMAND DECODER JRST WSYNC ;AND WAIT FOR INTERPRETATION MONUS7: MOVE IOS,[XWD TTYIOW,IOACT] IORB IOS,DEVIOS(DDB) ;PUT JOB BACK IN IOWAIT PUSHJ PDP,MONUS6 JRST TTYIN ;RESTART INPUT UUO MONUS8: TLNN IOS,IOEND ;ROOM FOR ANOTHER BUFFER, ^Z SEEN? JRST MONUSR ;NO, GO PASS ANOTHER LINE POPJ PDP, ;YES, LET UUOCON HANDLE EOF ;OUTPUT UUO EXTERNAL PTYPE,ADVBFE TTYOUT: MOVSI IOS,IOBEG TDNE IOS,DEVIOS(DDB) TLO IOS,IOSUPR ;KILL ^O ON FIRST OUTPUT IOR IOS,[XWD TPMON+DDTM,ECHOF+MERTPO+IGNOR+IOACT] ANDCAM IOS,DEVIOS(DDB) MOVSI IOS,IO+IOFST IORB IOS,DEVIOS(DDB) PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS PUSH PDP,LINE ;SAVE INFO PUSHJ PDP,USRMON ;MOVE USER'S BUFFER TO TTO BUFFER PUSHJ PDP,ADVBFE ;ADVANCE USER'S HEADERS SKIPA JRST .+3 ;MOVE BUFFERS AVAILABLE MOVEI IOS,IOACT ;NO MORE BUFFERS ANDCAB IOS,DEVIOS(DDB) ;CLEAR ACTIVE IN IOS POP PDP,LINE ;RESTORE LINE INFO UTYPET: JUMPL LINE,PTYPE ;START PTY EXCHANGE IF PTY LINE MOVSI TAC,TOIP CONO PI,PIOFF ;PREVENT TIMING GLITCH TDNN TAC,TTYPTR(DDB) ;IS TYPE-OUT ALREADY ON? JRST UTYPT1 CONO PI,PION POPJ PDP,0 UTYPT1: IORM TAC,TTYPTR(DDB) ;START TYPTEOUT JRST XMTIN1 ;ROUTINE TO MOVE USER OUTPUT BUFFER TO MON. OUTPUT BUFFER ;CALLED ONLY AT UUO LEVEL,BY OUTPUT UUO EXTERN UADRCK USRMON: MOVEI AC2,@DEVOAD(DDB) ;ADDRESS OF 2ND BUFFER WORD MOVE AC2,1(AC2) ;NUMBER OF WORDS TO OUTPUT IMULI AC2,5 ;NR OF CHARACTERS USRMN1: HRRZ AC1,DEVOAD(DDB) ;ADDRESS OF BUFFER PUSHJ PDP,UADRCK ;MAKE SURE IT IS OK ADD AC1,[XWD 10700+PROG,1] ;MAKE POINTER RELOCATABLE USRMN2: ILDB CHREC,AC1 ;PICK UP CHARACTER USRMN4: JUMPE CHREC,USRMN5 ;IF NULL, IGNORE PUSHJ PDP,OUTCHR ;PLACE IN OUTPUT BUFFER JUMPE CHREC,USRMN3 ;IF NO MORE ROOM IN MON. BUFFER USRMN5: SOJG AC2,USRMN2 ;LOOP AS LONG AS THERE ARE CHAR'S, POPJ PDP, ;DONE USRMN3: PUSH PDP,AC2 ;NUMBER OF CHARACTERS TO GO PUSH PDP,AC1 ;SAVE RELOCATABLE POINTER MOVE LINE,-3(PDP) ;GET SAVED LINE CHAR WORD PUSHJ PDP,TTOUWS ;WAIT FOR ID POP PDP,AC1 ;RESTORE POINTER POP PDP,AC2 ;RESTORE COUNT MOVE IOS,DEVIOS(DDB) ;RESTORE IOS LDB CHREC,AC1 ;GET LAST CHARACTER JRST USRMN4 ;RETURN TO OUT LOOP TTOUWS: MOVE IOS,[XWD IO,IOACT] ;SET DEVICE ACTIVE (TTY) IORB IOS,DEVIOS(DDB) PUSHJ PDP,UTYPET ;START TYPING IF NEEDED JRST WSYNC ;WAIT TILL ROOM IN BUFFER ;TTCALL - QUANTITY IN AC FIELD DETERMINES ACTION OF UUO (051) INTERNAL TTYUUO EXTERN UADCK1 TTYUUO: PUSHJ PDP,TTYFNU CAIL UCHN,TTUUOL ;TOO HIGH AC FIELD? POPJ PDP, ;YES, NO-OP CAIE UCHN,1 ;A READ OPERATION? CAIN UCHN,3 ;I.E., PURE? JRST @TTUUOT(UCHN) ;YES. DONT ADR CHECK HRRZ AC1,UUO PUSHJ PDP,UADCK1 JRST @TTUUOT(UCHN) ;DISPATCH TO UUO ROUTINES TTUUOT: EXP INCHRW ;(0)INPUT CHAR. WAIT TILL TYPED EXP ONEOUT ;(1)OUTPUT A CHARACTER EXP INCHRS ;(2)INPUT A CHAR. & SKIP EXP OUTSTR ;(3)OUTPUT A STRING EXP INCHWL ;(4)INPUT CHAR, WAIT.LINE MODE EXP INCHSL ;(5)INPUT CHAR, SKIP. LINE MODE EXP GETLIN ;(6)GET LINE CHARACTERISTICS WORD EXP SETLIN ;(7)SET BITS IN LH LINTAB EXP TRESCU ;(10)BACK UP POINTER TO COMMAND EXP SETBFI ;(11)CLEAR INPUT BUFFER EXP SETBF2 ;(12)CLEAR OUTPUT BUFFER EXP SKPINC ;(13)SKIP IF CHAR TO INPUT EXP SKPINL ;(14)SKIP IF LINE TO INPUT TTUUOL=.-TTUUOT ;INPUT A CHARACTER AND SKIP---IF NONE TYPED, DON'T SKIP INCHSL: SKIPG TISYNC(DDB) ;ANY LINES IN BUFFER? POPJ PDP,0 ;NO, RETURN INCHRS: MOVEI DAT,TTIBUF(DDB) ;GET A CHARACTER PUSHJ PDP,GETCHR ;FROM TTI BUFFER JUMPE CHREC,CPOPJ ;RETURN IF NULL(EMPTY BUFFER) PUSHJ PDP,SPCHEK JFCL TLNE TAC,FCSBRK+BREAKB SOS TISYNC(DDB) ;KEEP BREAK COUNT RIGHT PUSHJ PDP,TENDIN ;CLEAR UP IOACT, IOSUPR, ETC CAIN CHREC,3 JRST MONUS6 ;STORED ^C MOVEM CHREC,@UUO ;MOVE INTO LOC, SPECIFIED BY UUO JRST CPOPJ1 ;AND SKIP RETURN ;INPUT CHARACTER AND WAIT, LINE MODE INCHWL: PUSHJ PDP,INCHSL ;SEE IF ANY CHARS. JRST .+2 ;NO POPJ PDP,0 ;YES. GIVE IT TO USER MOVE IOS,[XWD TTYIOW,IOACT] ;NONE, WAIT FOR IT IORM IOS,DEVIOS(DDB) ;TTY TO IOW STATE MOVSI IOS,DDTM ;JUST IN CASE ANDCAB IOS,DEVIOS(DDB) ;CLEAR DDTMODE BREAK FLAG PUSHJ PDP,TWSYNC ;WAIT FOR CHAR JRST INCHWL ;AND TRY AGAIN ;OUTPUT A STRING OUTSTR: JRST DDT5 ;JUST USE DDT OUTPUT CODE SKPINL: SKIPLE TISYNC(DDB) ;INPUT BUFFER HAVE A LINE? AOS 0(PDP) ;YES, SKIP. POPJ PDP,0 ;RETURN SKPINC: HLRZ TAC,TTIBUF(DDB) ;SIZE OF IN BUFFER CAMLE TAC,TIFCTR(DDB) ;SIZE > # FREE CHARS? AOS 0(PDP) ;YES. SKIP. POPJ PDP,0 ;RETURN. ;MORE ROUTINES CALLED BY TTY UUO DISPATCHER EXTERNAL TTPLEN,GETWDU ;INCHRW GOES INTO I/O WAIT IF NO CHARACTER HAS BEEN TYPED--NO SKIPS INCHRW: PUSHJ PDP,INCHRS ;GET ACHAR IF ONE IS THERE JRST .+2 ;NONE THERE POPJ PDP, ;CHAR, PICKED UP AND STORED MOVE IOS,[XWD TTYIOW+DDTM,IOACT] ;SETUP FOR IOWAIT IORB IOS,DEVIOS(DDB) ;SPECIFICALLY FOR INPUT WAIT PUSHJ PDP,TWSYNC ;WAIT FOR CHAR. TO BE TYPED JRST INCHRW ;GO GET IT ;ONEOUT OUTPUTS ONE CHARACTER ONEOUT: PUSHJ PDP,GETWDU ;PICK UP CHAR FROM USER MOVE CHREC,TAC ;PUT IT IN PROPER AC ANDI CHREC,177 ;MASK ANY JUNK JUMPE CHREC,CPOPJ ;DONT STORE NULLS PUSHJ PDP,OUTCHR ;PLACE IT IN TTO BUFFER JUMPN CHREC,DDTUTT ;IF IT STORED, RETURN PUSHJ PDP,TTOUWS ;BUFFER WAS FULL. TRY AGAIN LATER JRST ONEOUT ;GETLIN PUTS LINE CHARACTERISTICS WORD INTO ADR. IN UUO ADR. FIELD GETLIN: SKIPGE TAC,@UUO ;DOES USER WANT ONE LINE CHAR. WD.? JRST GETLN1 ;YES MOVEI LINE,0 ;NO, CHECK SIZE OF NUMBER CAIL TAC,TTPLEN ;TOO HIGH? JRST GETLN1 ;YES, GIVE HIM THE 0. MOVE LINE,LINTAB(LINE) ;OK, GET THE ENTRY HRRZ DEVDAT,TTYTAB(TAC) ;GET DEVDAT ON REQUESTED LINE ; NOTE - NO LONGER ON JOB'S TTY LDB TAC,PJOBN ;GET JOB NUMBER OF REQUESTED TTY JUMPE TAC,GETLN1 ;IF NONE, NO LINES. SKIPLE TISYNC(DEVDAT) ;ANY TYPE-IN? TLO LINE,LINRDY ;YES. FLAG. GETLN1: MOVEM LINE,@UUO ;GIVE IT TO USER POPJ PDP, ;ROUTINE TO SET LINE CHARACTERISTICS THAT ARE SETABLE SETLIN: MOVSI TAC,LGLSET ;MAKE MASK OF ALL OF THEM ANDCAM TAC,LINTAB(LINE) AND TAC,@UUO ;SET ONLY THOSE BITS USER WANTS SET IORM TAC,LINTAB(LINE) ;SET RESULTANT POPJ PDP, ;ROUTINE TO ATTACH TTY TO A JOB ;CALL: MOVE DEVDAT,ADDRESS OF TTY DEVICE DATA BLOCK ; MOVE ITEM,JOB NUMBER ; PUSHJ PDP,TTYATT ; ERROR ;DEVDAT=DDB ADR OF OTHER TTY ;IF ANOTHER ALREADY IS ATTACHED. ; OK RETURN ;DEVDAT, DAT AND TRANSLATOR TABLE SET ;CALLED FROM COMCON (ATTACH) AND COMCSS (JOBINI) ;ON OK RETURN 1)SETS TTYATC ; 3)PUTS ADDRESS OF ATTACHED DDB INTO DEVDAT. ; 4)SETS PHYSICAL NAME TO SIXBIT /TTY LINE #/ ; OR SIXBIT /CTY/, ; 5)SETS DEVOPR IF IT IS NON-ZERO. INTERNAL TTYATT,TTYATI EXTERNAL PUNIT,PJOBN,TTYTAB TTYATI: INTERNAL FTATTACH IFN FTATTACH,< TTYATT: PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS MOVEI DEVDAT,TTYLST ;SEARCH FOR DDB THAT IS ATTACHED SKIPA TTYAT2: HLRZ DEVDAT,DEVSER(DEVDAT) JUMPE DEVDAT,TTYAT4 ;HAVE ALL TTY DDB'S BEEN LOOKED AT? LDB TAC,PJOBN ;NO, GET JOB NUMBER. HLL TAC,DEVMOD(DEVDAT) ;ATTACH AND USE BITS TLNN TAC,DVTTY ;IS THIS STILL A TTY DDB? JRST TTYAT4 ;NO. THIS MUST BE IJOB. MOVE IOS,DEVIOS(DDB) CAIN ITEM,(TAC) ;JOB NUMBER THE ONE TO ATTACH? TLNN TAC,TTYATC ;YES, IS DDB ATTACHED TO JOB? JRST TTYAT2 ;NO, KEEP LOOKING, TLNE IOS,TTYDTC ;IS DDB DETACHED FROM LINE? JRST TTYAT5 ;YES, OK TO ATTACH TTY OF REQUESETER TO JOB MOVE TAC,-3(PDP) ;NO. GET TTY DEVDAT OF JOB DOING ATTACH COM. ; AS PUSHED BY COMMAND DECODER SKIPE TAC,DEVNAM(TAC) ;PHYSICAL NAME OF REQUESTOR TTY CAME TAC,DEVOPR ; CHECK IF OPR IS REQUESTOR POPJ PDP, ;NO, ERROR RETURN, CAN'T ATTACH PUSH PDP,LINE ;YES, SAVE LINE CHARACTERISTICS LDB LINE,PUNIT ;GET LINE NO. OF TTY BEING GRABBED HRRZ TAC,(PDP) ;OPERATOR'S LINE NUMBER? CAME LINE,TAC ;IS OPERATOR TRYING TO GRAB HIMSELF? ; IF YES, DO NOT DETACH HIM PUSHJ PDP,TTYDET ;DETACH TTY OF JOB BEING GRABBED BY OPR POP PDP,LINE ;RESTORE LINE CHARACTERISTICS TTYAT5: PUSH PDP,DEVDAT ;SAVE NEW DDB ADDRESS. MOVE DEVDAT,TTYTAB(LINE) PUSHJ PDP,TTYDET ;DETACH DDB FROM TTY POP PDP,DEVDAT TTYAT3: DPB ITEM,TPCJOBN ;STORE ATTACHED JOB NO. DPB ITEM,PJOBN ;SET JOB NUMBER MOVSI IOS,TTYDTC ;INDICATE DDB NO LONGER DET. FROM LINE ANDCAB IOS,DEVIOS(DDB) MOVSI TAC,TTYATC ;SET ATTACHED BIT JRST SCNIN ;SO INITIALIZE DDB TTYAT4: MOVE DEVDAT,TTYTAB(LINE);RESTORE OLD DDB ADDRESS. JRST TTYAT3 > IFE FTATTACH,< TTYATT: LDB LINE,PUNIT ;LINE NO. OF THIS TTY DPB ITEM,TPCJOBN DPB ITEM.PJOBN MOVSI TAC,TTYATC JRST SCNIN> ;ROUTINE TO SETUP AC DEVDAT TO ADDRESS OF TTY WHICH HAS TYPED A COMMAND ;AC DAT TO BYTE POINTER TO OUTPUT BUFFER FOR COMMAND MESSAGES ;AC TAC TO BYTE POINTER TO COMMAND STRING ;AC ITEM TO JOB NUMBER TTY IS ATACHED TO ;CALL: PUSHJ PDP,TTYCOM ; NONE FOUND ; AC'S SETUP ;CALLED FROM COMMAND INTERNAL TTYCOM,TTYCM EXTERNAL MTTYLN,TTYTAB,CPOPJ TTYCOM: SKIPL LINE,LINSAV MOVSI LINE,MTTYLN SKIPL TAC,TTYTAB(LINE) TTYCM1: AOBJN LINE,.-1 MOVEM LINE,LINSAV JUMPG LINE,CPOPJ HRRZ DEVDAT,TTYTAB(LINE) JUMPE DDB,TTYCM2 ;THIS SHOULDNT HAPPEN, BUT... MOVEI DAT,TTIBUF(DDB) ;SO GETCHR CAN BE CALLED FROM COMCON MOVE LINE,TITCTR(DDB) DPB LINE,PCOMIC ;SAVE COMMAND INPUT COUNTER LDB LINE,PUNIT ;LINE NO. LDB ITEM,PJOBN ;JOB NO. TTY ATTACHED TO TLNN TAC,200000 ;IS THIS A DELAYED COMMAND? JRST CPOPJ1 ;NO, RETURN TO SCAN IT MOVSI TAC,200000 ;INDICATED NO LONGER DELAYED COMMAND ANDCAM TAC,TTYTAB(LINE) JRST CPOPJ1 ;RETURN TO COMMAND SCAN TTYCM: MOVSI DDB,200000 ;INDICATE DELAYED COMMAND IORB DDB,TTYTAB(LINE) PUSHJ PDP,TRESCN ;BACK UP TO START OF COMMAND MOVE LINE,LINSAV ;TRESCN HAS CALLED STLNAC JRST TTYCM1 ;LOOK FOR OTHER COMMAND TP PROCESS TTYCM2: MOVSI DDB,600000 ;CLEAR COMMAND BITS IN TTYTAB ANDCAM DDB,TTYTAB(LINE) JRST TTYCOM ;GO TRY AGAIN INTERNAL FTATTACH IFN FTATTACH,< ;ROUTINE TO DETACH TTY FROM JOB ;CALL: MOVE DEVDAT,ADDRESS OF TTY DDB TO BE DETACHED ; PUSHJ PDP,TTYDET ;CALLED FROM TTYATT AND COMCON (DETACH) ;CLEARS TTYATC AND TRNALSATOR TABLE ENTRY. ;SETS TTYDTC IN DEVIOS(DDB) INTERNAL TTYDET EXTERNAL PUNIT,TTYTAB TTYDET: MOVSI TAC,TTYATC TDNN TAC,DEVMOD(DDB) ;IS THIS DDB WORTH KEEPING? JRST TTYDT1 ;NO. GO JUNK IT MOVSI IOS,TTYDTC ;YES. MARK IT DETACHED IORM IOS,DEVIOS(DDB) JRST TTYKL1 ;GO CLEAR TTYTAB AND DEVNAM TTYDT1: MOVSI IOS,TTYDTC+IO ;CLEAR SOME BITS TO FORCE KILL ANDCAM IOS,DEVIOS(DDB) MOVSI IOS,TOIP ;ALSO TYPEOUT IN PROGRESS ANDCAM IOS,TTYPTR(DDB) JRST TTYKIL ;TTYKIL WILL NOW KILL DDB > INTERN TRESCN TRESCN: LDB TAC,PCOMIC ;GET OLD TITCTR MOVEM TAC,TITCTR(DDB) ;RESTORE IT PUSHJ PDP,TBYTEP MOVEM TAC,TITAKR(DDB) TRESC1: MOVE TAC,TIPCTR(DDB) ;CALLED HERE FROM ^U CODE CONO PI,PIOFF SUB TAC,TITCTR(DDB) SKIPG TAC ADDI TAC,TTYCHR MOVEM TAC,TIFCTR(DDB) CONO PI,PION JRST STLNAC TRESCU: PUSHJ PDP,TRESCN SETZM TISYNC(DDB) MOVEI DAT,TTIBUF(DDB) TRESCL: PUSHJ PDP,GETCHR JUMPE CHREC,TRESCN PUSHJ PDP,SPCHEK JRST TRESCL TLNE TAC,FCSBRK+BREAKB AOS TISYNC(DDB) JRST TRESCL TLHBYT: XWD 350700,0 XWD 260700,0 XWD 170700,0 XWD 100700,0 XWD 010700,0 TBYTEP: PUSH PDP,TAC1 ;SAVE LINE MOVNS TAC SKIPGE TAC ADDI TAC,TTYCHR IDIVI TAC,5 ADD TAC,TTIBUF(DDB) HLL TAC,TLHBYT(TAC1) POP PDP,TAC1 ;RESTORE LINE POPJ PDP,0 ;ROUTINE TO FIND TTY FOR A JOB ;CALL: MOVE ITEM,JOB NUMBER ; PUSHJ PDP, TTYFND ; RETURN WITH DEVDAT SET TO ADR OFF DDB ; AND DAT SET TO BYTE POINTER TO MONITOR OUTPUT BUFFER INTERNAL TTYFNU,TTYFND,TTYERP EXTERNAL JOB TTYFNU: MOVE ITEM,JOB TTYFND: PUSHJ PDP,TTYSRC TTYDAT: MOVEI DAT,TTOBUF(DDB) POPJ PDP, ;PUT JOB IN IO WAIT IF TTY BUFFER NOT EMPTY ;CALLED BY NON ERROR MESSAGE ROUTINES AT UUO LEVEL INTERNAL TTYFUW EXTERNAL WSYNC TTYFUW: PUSHJ PDP,TTYFNU MOVE TAC,TOPUTR(DDB) TLNN LINE,PTYLIN CAMN TAC,TOTAKR(DDB) POPJ PDP, MOVEI IOS,IOACT ;YES IORB IOS,DEVIOS(DDB) JRST WSYNC ;ROUTINE TO INDICATE MONITOR ERROR MESSAGE TO BE FORCED OUT ;WHEN NO MORE ROOM IN TTO BUFFER, TTI BUFFER WILL BE USED TTYERP: PUSHJ PDP,TTYSRC ;FIND TTY DDB MOVEI IOS,MERTPO ;SET MONITOR ERROR PRINT OUT BIT IORB IOS,DEVIOS(DDB) JRST SETBFI ;CLEAR TTI BUFFER TTYREL: MOVEI IOS,777777-IOACT ;CLEAR INITED STUFF IN IOS MOVSI TAC,TTYATC TDNE TAC,DEVMOD(DDB) JRST T0POPJ ;GO CLEAR OUT IOS BITS ;ROUTINE TO SET SCNSER TO RETURN TTY TO VIRGIN STATE ;CALL: MOVE DDB, ADDRESS OF DEVICE DATA BLOCK ; PUSHJ PDP,TTYKIL ;CALLED FROM COMCSS (JOBKIL). ;IF NOT OPERATOR CONSOL, THEN ; 1)CLEAR PHYSICAL AND LOGICAL NAMES, ; 2)CLEAR JOB NUMBER ASSIGNMENT ; 3)CLEAR TTYUSE,TTYATC,ASSCON,ASSPRG, ; 4)CLEAR ENTRY IN TRANSLATOR TABLE. INTERNAL TTYKIL EXTERNAL PJOBN,PTMNMD TTYKIL: MOVSI IOS,TTYIOW+IOW+TTYDTC+SYNC+DDTM+USRB ;CLEAR TTY INPUT AND OUTPUT ANDCAM IOS,DEVIOS(DDB) ;WAIT BITS SO TTY WILL BE KILLED ;PROPERLY AT INTER, LEVEL IS STILL OUTPUTING ; ALSO CLEAR DDT MODE AND SYNC FOR ; NEXT USER OF THE DDB MOVSI IOS,TPMON ;CLEAR JOB NUMBER DPB IOS,PJOBN IORB IOS,DEVIOS(DDB) ;TURN TPMON ON IN CASE TTY IS ;STILL OUTPUTTING PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS TLNE LINE,PTYLIN PUSHJ PDP,PTMNMD ;YES, PUT PTY INTO MONITOR MODE SKIPL TTYPTR(DDB) ;CHECK TOIP TLNE IOS,IO ;IS IT OUTPUTTING OR TALKING? POPJ PDP, ;YES, DDB WILL BE KILLED AT ;INTERRUPT LEVEL HLLZS DEVIOS(DDB) ;CLEAR INITTED STUFF IN IOS TLZ LINE,KILMSK ;CLEAR BITS IN LINE TABLE TLNE LINE,DSDTLN ;DATAPHONE? TLZ LINE,LGLSET ;INITIALIZE OTHER MODES HLLM LINE,LINTAB(LINE) SETZB TAC,DEVLOG(DEVDAT) ;CLEAR LOGICAL NAME MOVE TAC,[XWD TTYUSE+TTYATC,ASSCON+ASSPRG] ANDCAM TAC,DEVMOD(DEVDAT) ;CLEAR ATTACH,USE, AND ASSIGN BITS TTYKL1: LDB LINE,PUNIT ;LINE NO. SETZM TTYTAB(LINE) ;CLEAR TRANSLATOR TABLE SETZM DEVNAM(DDB) POPJ PDP,0 ;ROUTINE TO SET TTY INTO USER MODE NOW. ;CALL: MOVE DEVDAT,ADDRESS OF DEVICE DATA BLOCK ; PUSHJ PDP,TTYSET ;CALLED FROM RUNCSS (START1) ;CLEARS DDTM,IOUPR,USRB,TTYIOW AND IOW INTERNAL TTYSET TTYSET: MOVSI IOS,DDTM+IOSUPR+USRB+TTYIOW+IOW JRST T0POPJ ;GO CLEAR BITS INTERN STLNAC EXTERNAL JOB,MTTYLN,TTYTAB,DEVPHY,DEVOPR,ERROR ;ROUTINE TO SEARCH TRANSLATOR TABLE FOR TTY ;CALL: MOVE ITEM,JOB NUMBER ; PUSHJ PDP,TTYSRC ; RETURN WITH ADDRESS OF DEVICE DATA BLOCK IN DEVDAT. TTYSRC: JUMPE ITEM,TTYF1 ;SEARCH FOR OPER. TTY IF JOB NO. 0 MOVSI LINE,MTTYLN ;NUMBER OF TTY DDBS TTYSRA: HRRZ DEVDAT,TTYTAB(LINE) JUMPE DEVDAT,TTYF0 LDB TAC,TPCJOBN CAIN TAC,(ITEM) JRST TTYF9 ;FOUND TTYF0: AOBJN LINE,TTYSRA TTYF1: MOVSI TAC,576062 ;LOOK FOR DEVICE "OPR" PUSHJ PDP,DEVPHY ;SEARCH PHYSICAL DEVICE NAMES FOR OPR SKIPA TAC,DEVOPR ;NOT FOUND. JRST TTYF9 JUMPN TAC,TTYF3 ;WAS OPR SPECIFIED IN ONCE ONLY CODE? MOVEI DDB,TTYLST ;NO SKIPE DEVNAM(DDB) ;HAS A TTY BEEN TYPED ON? JRST TTYF9 MOVEI LINE,TCONLN ;NO USE CTY. HRRZ DDB,TTYTAB(LINE) ;DOES IT HAVE A DDB? JUMPN DDB,TTYF9 ;YES. USE IT. MOVSI TAC,(SIXBIT /CTY/) ;NO TTYF3: PUSHJ PDP,GETDDB ;GET A DDB FOR DEVOPR JSP DAT,ERROR ;SHOULD NEVER HAPPEN TTYF9: MOVE IOS,DEVIOS(DDB) ;SET UP IOS STLNAC: LDB LINE,PUNIT ;GET UNIT # FROM DDB HLL LINE,LINTAB(LINE) ;AND LINE BITS POPJ PDP,0 ;RETURN ;ROUTINE TO START TTY OUTPUT AFTER CLEARING USRB EXTERNAL PTMNMD,PTMNMZ INTERNAL TTYSTC,TTYTCM TTYTCM: TTYSTC: MOVSI TAC,USRB ;CLEAR BIT IN MEMORY ANDCAM TAC,DEVIOS(DDB) PUSHJ PDP,STLNAC TLNE LINE,PTYLIN PUSHJ PDP,PTMNMD ;ROUTINE TO START TTY OUTPUT ;CALL: MOVE DAT,BYTE POINTER TO LAST OUTPUT ITEM ; MOVE DEVDAT,ADDRESS OF TTY DDB ; MOVE ITEM,JOB NUMBER ;(MUST BE PRESERVED) ; PUSHJ PDP,TTYSTR ;CALLED FROM COMINI ;INITIALIZED TTY FOR MONITOR OUTPUT AND STARTS OUTPUT INTERNAL TTYSTR EXTERNAL CLRBYT TTYSTR: MOVE IOS,[XWD DDTM+IOSUPR+IOBEG+IO+TPMON,IODTER+IOBKTL+IGNOR+IOACT] ANDCAB IOS,DEVIOS(DDB) PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS JUMPGE LINE,TTSTR1 ;IF NOT PTY, JUMP TLNE IOS,USRB PUSHJ PDP,PTMNMZ TTSTR1: MOVSI TAC,IO+TPMON TLNE IOS,USRB ;GOING OUT OF MONITOR MODE? TLZ TAC,TPMON ;YES IORM TAC,DEVIOS(DDB) MOVSI TAC,USRB+TPMON TLNE IOS,USRB ANDCAM TAC,DEVIOS(DDB) MOVE IOS,DEVIOS(DDB) ;GET CORRECT IOS SKIPLE TISYNC(DDB) ;HAS USER TYPED AHEAD? PUSHJ PDP,COMSET ;YES, WAKE UP COMMAND DECODER(IF IN MON. MODE) JRST UTYPET ;GO TYPE FIRST CHAR. ;ROUTINE TO ADD TTY TO TALK RING ;CALL: ADR. OF DDB TO BE ADDED TO RING AT -3(PDP) ; MOVE TAC,SIXBIT /TTYN/ ; PUSHJ PDP,TTYTLK ; TTY IS BUSY RETURN OR NOT A TTY OR TOO BIT A LINE NO. ; OLK RETURN, TTY ADDED TO TALK RING INTERNAL FTTALK IFN FTTALK,< INTERNAL TTYTLK EXTERNAL PUNIT,CPOPJ1 TTYTLK: PUSHJ PDP,GETDDB ;IN CASE NOT SET UP POPJ PDP,0 ;NONE AVAIL. GIVE UP MOVE TAC,DEVMOD(DEVDAT) TLNN TAC,DVTTY POPJ PDP, MOVE IOS,DEVIOS(DEVDAT) ;IS TTY IN MONITOR MODE AND LEFT HAND MARGIN? MOVE TAC1,-3(PDP) ;TTY GIVING TALK COMMAND MOVE TAC1,DEVNAM(TAC1) ;ITS NAME MOVE TAC,DEVNAM(DEVDAT) ;OPR IS NEVER TOO BUSY... CAME TAC1,DEVOPR ;EITHER ONE OPR? CAMN TAC,DEVOPR JRST TTYTK1 TLNE IOS,TPMON TLNN IOS,IOFST POPJ PDP, ;NO, HE IS BUSY. TTYTK1: CONO PI,SCNOFF LDB LINE,PUNIT ;LINE NUMBER IS RING. MOVSI TAC,TLKRNG LDB CHREC,PTALK TDNN TAC,LINTAB(LINE) HRRZ CHREC,LINE IORM TAC,LINTAB(LINE) EXCH DDB,-3(PDP) ;GET DDB OF TALKER LDB LINE,PUNIT ;LINE NO. OF TALKER DPB CHREC,PTALK ;SET POINTER INTO RING HRLI LINE,TLKRNG IORB LINE,LINTAB(LINE) MOVEM LINE,TAC ;SAVE LINE NO. OF TALKER EXCH DDB,-3(PDP) ;RESTORE LDB LINE,PUNIT ;LINE NO. IN RING AGAIN DPB TAC,PTALK ;MADE IT POINT TO TALKER CONO PI,SCNON JRST CPOPJ1 ;OK RETURN > ;ROUTINES TO SET SCANNER TO START UP JOB WHEN OUTPUT FINISHES ;CALL: MOVE DEVDAT,TTYDDB ADR. ; PUSHJ PDP,TTYUSR ; TTY WILL GO TO USER MODE WHEN TYPING OUT STOPS EXTERNAL SETRUN INTERNAL TTYUSR TTYUSR: MOVSI IOS,USRB ;SET BIT TO SWITCH TTY TO USER MODE IORM IOS,DEVIOS(DDB) ;WHEN MONITOR OUTPUT FINISHES JRST SETRUN ;GO FLAG JOB AS RUNABLE IMMEDIATELY ;CTY INTERRUPT SERVICE ROUTINE INTERNAL CTYINT EXTERNAL SCNSAV,SCNCHN,TCONLN CTYINT: CONSO TTY,50 ;TTI OR TTO FLAG? JRST CTYINT ;NO JSR SCNSAV ;YES, SAVE AC'S MOVEI LINE,TCONLN ;LOAD LINE WITH PROPER CONSO TTY,40 ;YES. TTI FLAG? JRST CTYOU1 ;NO. DATAI TTY,CHREC JRST RECINT ;RECEIVER INTERRUPT HANDLER CTYOU1: MOVEI CHREC,SCNCHN CONO TTY,200(CHREC) ;CLEAR TTO FLAG. JRST XMTINT ;COMMON TRANSMIT INTERRUPT HANDLER ;SCANNER INTERRUPT SERVICE ROUTINE IS IN SEPARATE DEVICE DEPENDENT SECTION EXTERNAL SCNSAV,TCONLN,TTYTAB ;COMMON RECEIVER INTERRUPT FOR ALL KEYBOARD DEVICES INTERNAL RECINT,INUS2,INJEST EXTERNAL COMCNT RECINT: INUS2: ;TAG FOR INTERRUPT SERVICE INJEST: ;ANOTHER TAG, NOT USED, BUT WANTED BY LOSING DLSINT TRNN CHREC,177 ;IGNORE NULLS POPJ PDP,0 ;DISMISS INTERRUPT HLL LINE,LINTAB(LINE) ;GET LINE CHARACTERISTICS HRRZ DDB,TTYTAB(LINE) ;IS THERE A DDB FOR THIS LINE? JUMPN DDB,RECIN1 ;YES. GO NO PUSHJ PDP,DDBSRC ;NO, FIND ONE JRST TYPX RECIN1: TLNE LINE,HLFDPX ;HALF DUPLEX LINE? JRST RECHDX ;GO SEE WHETHER INPUT OR OUTPUT RECIN8: ;RETURN FROM RECHDX IFN FTTALK,< TLNE LINE,TLKRNG ;IN A TALK RING? JRST DOTALK ;YES, GO TALK > MOVE IOS,DEVIOS(DDB) ;SET UP IOS RECIN2: ANDI CHREC,177 ;7-BIT ASCII ONLY CAIN CHREC,3 ;CONTROL C? PUSHJ PDP,CNCTST ;YES, SEE IF 2ND CONTROL C LDB HPOS,PHPOS ;PICK UP HORIZONTAL POSITION OF OUTPUT CHAR. MOVEI DAT,TTIBUF(DDB) ;USER MODE INPUT BUFFER PUSHJ PDP,TTEDIT ;GO EDIT (AND ECHO) CHARACTER DPB HPOS,PHPOS ;STORE HORIZONTAL POSITION HLLM LINE,LINTAB(LINE) ;UPDATE LINE TABLE MOVE TAC,TIFCTR(DDB) ;FRE SPACES LEFT? CAIG TAC,12 ;ONLY 10 LEFT? JRST RWARN ;YES, GO OUTPUT XOFF TLNN IOS,SYNC+DDTM ;WAS A BREAK CHARACTER TYPED? JRST TYPTST ;NO, GO SEE IF ECHO NEED BE TYPED INTERN RECIN3 ;FOR PTYSRF RECIN3: MOVE TAC,TTYTAB(LINE) ;IS IT IN COMMAND WAIT NOW? TLNE TAC,600000 ;.. JRST RECIN4 ;YES. NOT AGAIN. SKIPG TISYNC(DDB) ;HAS USER TYPED AHEAD? PUSHJ PDP,COMSET ;NO, WAKE UP COMMAND DECORDER NOW RECIN4: TLNE IOS,SYNC AOS TISYNC(DDB) ;BREAK CHARACTER (BUMP LINE COUNT) MOVSI IOS,SYNC ;CLEAR SYNC IN CORE ANDCAB IOS,DEVIOS(DDB) ; .. MOVE TAC,TIPCTR(DDB) ;UPDATE COUNTER FOR ^U DPB TAC,PLSTLC TLZN IOS,TTYIOW ;IN TELETYPE INPUT WAIT? JRST TYPTST ;NO, GO ECHO PUSHJ PDP,STTIOD ;YES, SET IO DONE(OUT OF TTY IOW) MOVSI IOS,IOW+TTYIOW ANDCAB IOS,DEVIOS(DDB) ;CLEAR WAIT BITS TYPTST: MOVSI TAC,TOIP ;CHECK TOIP CONO PI,PIOFF SKIPGE TTYPTR(DDB) ;TYPEOUT HAPPENING? JRST TYPT1 IORM TAC,TTYPTR(DDB) ;NO, BUT THERE IS NOW CONO PI,PION PUSHJ PDP,STLNAC ;TAC1 CLOBBERED ABOVE BY STTIOD JRST XMTIN1 ;START OUTPUT TYPT1: CONO PI,PION POPJ PDP, RWARN: TLNE LINE,HLFDPX+FULTWX ;CAN LINE BE STOPPED? JRST RECIN3 ;NO. WAKE JOB AND CROSS FINGERS. MOVEI CHREC,23 ;YES. SEND AN XOFF. PUSHJ PDP,PUTCHO ; .. MOVEI CHREC,IDLECH ;AND AND IDLE FOR TTY TO THINK ON. PUSHJ PDP,PUTCHO ;OUTPUT IT. JRST RECIN3 ;GO WAKE JOB. IFN FTHDPX,< ;ROUTINE TO HANDLE HALF DUPLEX RECEIVE INTERRUPTS ;CALLED ONLY AT RCV INTERRUPT LEVEL EXTERN CLOCK RECHDX: MOVE IOS,DEVIOS(DDB) ;SETUP IOS TRNE IOS,IGNOR ;IN AN ECHO CHECK? POPJ PDP, ;YES, IGNORE THIS TRZE IOS,ECHOF JRST RECHD1 SKIPL TTYPTR(DDB) ;SHOULD THIS BE AN ECHO? JRST RECIN8 ;NO. ITS A RECEIVE CHARACTER ANDI CHREC,177 ;AN ECHO. CHECK IT LDB TAC,PLASTC ;GET WHAT WAS SENT CAMN TAC,CHREC ;SAME? POPJ PDP,0 ;YES, DISMISS INT. ECHO: MOVSI TAC,TOIP ANDCAM TAC,TTYPTR(DDB) ;TURN OFF TOIP TLZ IOS,IO ;BAD CHARACTER, SHUT DOWN XMT. TRO IOS,ECHOF+IGNOR ;MARK FOR THE 1/2 SEC IGNORE. MOVEI TAC,(LINE) ;SETUP CLOCK REQUEST LSH TAC,^D12 TRO TAC,^D30 ;1/2 SECOND HRLI TAC,ENDECH ;WHERE TO RESPOND TO CONO PI,PIOFF IDPB TAC,CLOCK ;REQUEST FROM CLOCK CONO PI,PION MOVEM IOS,DEVIOS(DDB) ;ONLY AT INTERRUPT LEVEL POPJ PDP, ;DISMISS INTERRUPT ENDECH: MOVE DDB,TTYTAB(TAC) ;HERE ON TIMEOUT OF ECHOCHECK MOVEI IOS,IGNOR ;KILL IGNORE INT BIT JRST T0POPJ ;CLEAR BIT IN IOS, RETURN TO CLK RECHD1: ANDI CHREC,177 CAIN CHREC,3 ;^C DURING ECHO CHECK? DPB CHREC,TITAKR(DDB) ;YES, MAKE IT LIKE 2 OF THEM JRST RECIN8 ;PROCESS AS INPUT > ;END OF FTHDPX ;ROUTINE TO TYPE X IF LINE CANNOT GET INTO SYSTEM TYPX: ANDI CHREC,177 CAIN CHREC,"X" ;CHAR, RECEIVED AN "X" POPJ PDP, ;YES, MAY BE ECHO, DISMISS INT. MOVEI CHREC,"X" JRST TYPL ;TYPE OUT "X" ;ROUTINE TO WAKE UP COMMAND DECORDER IF TPMON IS SET COMSET: TLNN IOS,TPMON ;MONITOR MODE? POPJ PDP, ;NO, NOT MONITOR COMMAND MOVSI IOS,IOFST IORB IOS,DEVIOS(DDB) MOVSI TAC,400000 ;SET SIGN BIT IORM TAC,TTYTAB(LINE) ;IN TTY TRANSLATOR TABLE AOS COMCNT ;INDICATE ONE MORE COMMAND POPJ PDP, INTERNAL XMTINT,PTYGET XMTINT: HLL LINE,LINTAB(LINE) ;GET LIN CHAR. HRRZ DDB,TTYTAB(LINE) ;GET DDB ADDRESS JUMPE DDB,CPOPJ ;IF NONE, X BEING TYPED MOVE IOS,DEVIOS(DDB) ;GET IO STATUS TLNN LINE,HLFDPX ;HALF DUPLEX LINE? JRST XMTIN1 ;NO, REGULAR TRANSMIT INTERRUPT PTYGET: ;CALL HERE TO SKIP ABOVE OVERHEAD SKIPL TTYPTR(DDB) ;WAS TYPE-OUT IN PROGRESS? POPJ PDP, ;IGNORE XMT DURING ECHO CK XMTIN1: MOVEI DAT,TTOBUF(DDB) ;SPECIFY TTO BUFFER XMTI1A: CONO PI,PIOFF ;KEEP TOIP AND PUTR/TAKR EQUAL HLRZ TAC,BUF(DAT) ;IS OUTPUT BUFFER EMPTY? CAMLE TAC,FCTR(DAT) ;I.E. FREE COUNT AT MAX? JRST XMTIN2 ;NO, TYPING STILL IN PROGRESS TRNE IOS,MERTPO ;MONITOR ERROR MESSAGE? CAIE DAT,TTOBUF(DDB) ;OUTPUT BUFFER? JRST XMTIN4 ;NO, MUST REALLY BE DONE MOVEI DAT,TTIBUF(DDB) ;YES. NOW EMPTY OUT TTI BUFFER JRST XMTI1A ;HERE WHEN OUTPUT BUFFER(S) EMPTIED XMTIN4: MOVEI IOS,MERTPO ANDCAB IOS,DEVIOS(DDB) MOVSI CHREC,TOIP ANDCAM CHREC,TTYPTR(DDB) ;CLEAR MERTPO AND TOIP CONO PI,PION MOVEI CHREC,0 LDB HPOS,PJOBN ;JOB NUMBER DDB IS ATTACHED TO TLNN IOS,IO JRST LINDON MOVSI IOS,IO ANDCAB IOS,DEVIOS(DDB) TLNE LINE,TLKRNG ;OR TALKING? JRST LINDON ;YES JUMPN HPOS,LINDON ;LINE DONE IF DDB IS A JOB ;OTHERWISE, DDB ONLY USED TO TYPE A JRST TTYKIL ;MESSAGE; KILL TTY DDB XMTIN2: CONO PI,PION PUSHJ PDP,GETCHR ;NO, GET NEXT CHAR. IN BUFFER JUMPE CHREC,XMTIN1 ;IGNORE NULLS JUMPL IOS,TYPE ;KEEP TYPING IF INPUT I/O WAIT TRNN IOS,IOACT ;ARE WE IN I/O WAIT? JRST TYPE ;NOT IN IO WAIT MOVEI HPOS,TTYCHR-10 ;WAKE 8 CHARS BEFORE END CAML HPOS,FCTR(DAT) ;IS THERE ROOM ENOUGH NOW? JRST TYPE ;NO, KEEP TYPING LINDON: TLNE IOS,IOW ;IN IO WAIT? TLNE IOS,TTYIOW ;YES. TTY INPUT WAIT? JRST TYPE ;NO. GO TYPE CHAR. PUSHJ PDP,STTIOD ;YES, SET IO DONE (OUT OF WSYNC) PUSHJ PDP,STLNAC ;RESTORE TAC1 MOVE IOS,[XWD IOW,IOACT] ;INDICATE NO IO ACTIVE OR WAIT ANDCAB IOS,DEVIOS(DDB) TYPE: JUMPE CHREC,CPOPJ ;IS TYPING STILL TO BE IN PROGRESS? JRST TYPL ;YES. ;TTY KEYBOARD EDITOR ROUTINE ;UPON RECEIPT OF A CHARACTER, THIS ROUTINE DETERMINES WHAT TO DO ;WITH IT: WHETHER IT'S A SPECIAL CHARACTER NEEDING SPECIAL ECHOING, ;WHETHER SOME OTHER CHARACTER IS TO BE STORED IN ITS PLACE, WHETHER ;IT IS A BREAK CHARACTER (LINE TERMINATOR), OR WHETHER THE CHARACTER ;TYPED IS A SIGNAL TO UNDERTAKE SOME SPECIAL ACTION. ;IN ANY CASE, ALL SPECIAL ACTION, INCLUDING DUPLEXING TAKES PLACE ON ;THE LEVEL OF THIS ROUTINE. ; THIS ROUTINE CALLS SPCHEK, WHICH MAKES USE OF THE SPECIAL ;CHARACTER TABLE, SPCTAB, TO MAKE ANY CHANGES IN THE ACTION GENERATED ;BY SPECIFIC CHARACTERS MAKE THE ALTERATIONS REQUIRED BY THE ;COMMENTS DESCRIBING SPCTAB. NOTE THAT IF A CHARACTER IS TO DISPATCH ;TO A "SPECIAL ACTION ROUTINE" OR SPECIAL ECHO ROUTINE, THE LEFT ;HALF OF THE CORRESPONDING CHARACTER-WORD MUST HAVE SPACTN ;SET AND THE ADDRESS OF THE SPECIAL ROUTINE MUST BE ;ASSEMBLED INTO THE RIGHT HALF OF THE WORD. ;CALL HAVE 7-BIT ASCII CHARACTER IN CHREC ; LDB HPOS,PHPOS ; MOVEI DAT,TTIBUF(DDB) ; PUSHJ PDPD,TTEDIT ; RETURN WITH ACTION DONE, SYNC (LH IOS) SET IF BREAK CHAR. STORED TTEDIT: PUSHJ PDP,ADJHP ;ADJUST HP AND CHECK SPECIAL JRST TIPACK ;NOT SPECIAL MOVSI IOS,0 TLNE TAC,BREAKB+FCSBRK ;BREAK CHAR? TLO IOS,SYNC ;BREAK CHAR, SET SYNC IORB IOS,DEVIOS(DDB) ;SET SYNC JUMPL TAC,0(TAC) ;DISPATCH IF SPACTN SET TIPACK: CAIGE CHREC,140 ;LOWER CASE LETTER? JRST TTIPUT ;NO TLNN LINE,T37 ;YES. IS THIS TTY IN 37 MODE? TRZ CHREC,40 ;NO. MAKE CHAR UPPER CASE TTIPUT: TLZE LINE,ROBTPD ;HAVE WE BEEN DELETING? PUSHJ PDP,BSECHO ;YES. OUTPUT A BACKSLASH TTIPT1: PUSHJ PDP,PUTCHI ;PUT CHAR IN INPUT BUFFER JRST INBFUL ;IT DIDNT FIT TLNN TAC,ECHSUP ;SHOULD THIS CHAR BE ECHOED? DUPLEX: TLNE LINE,FULTWX+HLFDPX ;IS THIS LINE ECHOING ITSELF? POPJ PDP,0 ;JUST RETURN WITHOUT ECHO DUPLX1: PUSH PDP,TAC ;SAVE TAC OVER PUTCHO TLNN IOS,TPMON ;SHOULD ECHO IF IN MONITOR MODE TRNN IOS,NOECHO ;AND UNLESS USER SAYS NO, IN USER MODE PUSHJ PDP,PUTCHO ;SO ECHO IT. JRST TPOPJ ;RESTORE TAC AND RETURN INTERNAL INBFUL ;FOR THE PTY INBFUL: MOVSI IOS,SYNC ;DONT COUNT SYNC COUNT ANDCAB IOS,DEVIOS(DDB) ; SINCE CHAR NOT STORED CAIN CHREC,3 ;CHAR WONT FIT, WAS IT ^C? JRST CNCTS1 ;YES. PANIC OUT OF THIS BIND MOVEI CHREC,7 ;NO. JUST ECHO BELL TO SHOW LOSS JRST PUTCHO ;OUTPUT BELL ;CALLED WITH A JUMPL TAC,(TAC), WHERE TAC IS LOADED FROM SPCTAB ;SPECIAL CHARACTER HANDLING ROUTINES CONTC: PUSHJ PDP,DELETL ;SINCE PEOPLE WANT FREE ^U MOVE TAC,SPCTAB+3 ;SINCE DELETL CLOBBERS TAC CONTZ: PUSHJ PDP,CNTLEC ;OUTPUT ^C OR ^Z PUSHJ PDP,CRLFEC ;OUTPUT A CRLF JRST TTIPUT ;AND STORE THE 003 OR 032 CONTO: PUSHJ PDP,SETBF2 ;CLEAR THE OUTPUT BUFFER MOVSI IOS,IOSUPR ;SET TO JUNK FURTHER OUTPUT IORB IOS,DEVIOS(DDB) JRST CONTU1 ;ECHO, ETC. CONTU: TLNE IOS,DDTM ;IN DDTMODE, JRST TTIPUT ; PASS THIS CHARACTER TLZ LINE,ROBTPD ;NO MORE BACKSLASH PUSHJ PDP,DELETL ;^U DELETES INPUT LINE CONTU1: PUSHJ PDP,CNTLEC ;ECHO ^O OR ^U JRST CRLFEC ;OUTPUT A CRLF AND RETURN WITHOUT ; STORING THE ^O OR ^Z ALTMOD: HRRI TAC,(CHREC) ;SAVE WHICH KIND OF ALTMOD MOVEI CHREC,44 ;ECHO A $ TLNN IOS,TPMON TRNN IOS,DLRSUP ;400 IN IOS REMOVES ECHO OF $ PUSHJ PDP,AOJDPX MOVEI CHREC,(TAC) ;RESTORE THE CHARACTER TRNN IOS,FCS ;UNLESS FCS MODE, MOVEI CHREC,175 ;TURN INTO OLD ALTMOD JRST TTIPUT ;STORE THE CHARACTER CONTF: TLC LINE,T35+T37 ;COMPLEMENT T37 ON ^F CONTP: TLCA LINE,T35 ;COMPLEMENT T35 ON ^P CONTB: TLC LINE,FULTWX ;COMPLEMENT FULTWX ON ^B POPJ PDP,0 ;AND RETURN WITHOUT STORING THESE CONTQ: TLOA LINE,XON ;PAPER TAPE MODE CONTS: TLZ LINE,XON ;NOT PAPER TAPE JRST TTIPUT ;DO STORE THESE FOR CUSP CONTH: TLNE LINE,T37 ;BACKSPACE JRST TTIPUT ;JUST PASS TO PROG IF 37 TTY RUBOUT: TLNN LINE,XON JRST RUBOU3 RUBOU4: MOVSI IOS,SYNC ;IF PAPER TAPE, NO BREAK JRST T0POPJ ;OR STORE, RETURN. RUBOU3: TLNE IOS,TPMON ;IN MONITOR MODE, NOT A BREAK CHAR JRST RUBOU2 TDNE IOS,[XWD DDTM,FCS] JRST TTIPT1 ;STORE RUBOUT IF DDT OR FCS RUBOU2: PUSHJ PDP,RUBOU4 ;NOT A BREAK AFTER ALL LDB CHREC,PUTR(DAT) ;GET LAST CHAR IN PUSHJ PDP,DCPUTR ;BACK UP TIPUTR JRST RUBOU1 ;IT'S EMPTY ALREADY TLON LINE,ROBTPD ;MARK IN RUBOUT SEQUENCE PUSHJ PDP,BSECHO ;AND OUTPUT BACKSLASH IF FIRST AOJDPX: AOJA HPOS,DUPLX1 ;OUTPUT AND COUNT HPOS RUBOU1: TLZE LINE,ROBTPD ;END OF INPUT STREAM REACHED PUSHJ PDP,BSECHO ;OUTPUT A BACKSLASH JRST CRLFEC ;AND A CR LF CONTK: HRRI TAC,4 ;HERE ON V TAB SKIPA CONTL: HRRI TAC,10 ;HERE ON FORMFEED TLNN LINE,T35 ;THIS TTY HAVE VERT MECHANICS? JRST SIMFF ;NO, SIMULATE IT PUSHJ PDP,TTIPUT ;PUT CHAR IN BUFFER AND ECHO IT CONTI1: MOVEI CHREC,IDLECH ;SYNCHRONOUS IDLE CHARACTERS SIMFF1: PUSHJ PDP,DUPLX1 ;OUTPUT ECHO OF LF OR IDL TRNE TAC,17 ;DONE YET? SOJA TAC,.-2 ;NO. OUTPUT MORE POPJ PDP,0 ;DONE SIMFF: TLO TAC,ECHSUP ;DON'T OUTPUT FF OR VT TO A 33 PUSHJ PDP,TTIPUT ;PUT IT IN BUFFER MOVEI CHREC,12 ;SIMULATE WITH LF'S JRST SIMFF1 CONTI: TLNN LINE,T35 TLO TAC,ECHSUP ;DONT OUTPUT TAB TO 33 PUSHJ PDP,TTIPUT ;PUT IN BUFFER AND MAYBE ECHO TLNE LINE,XON+DISLIN ;IF PAPER TAPE,DISMISS POPJ PDP,0 ; SO AS NOT TO OVERFILL OUTBUF ;ALSO, DISPLAY DOESNT WANT FILLER HRRI TAC,1 ;TWO IDLES TLNE LINE,T35 JRST CONTI1 ;GO SEND SLUFFS CONTI2: MOVEI CHREC,40 ;SPACES FOR THE 33'S LDB HPOS,PHPOS ;WHERE WAS I BEFORE TAB? PUSHJ PDP,AOJDPX ;OUTPUT A SPACE TRNE HPOS,7 ;AT A TAB STOP? JRST .-2 ;NO. MORE SPACES. POPJ PDP,0 ;RETURN FROM TTEDIT CRLFEC: MOVEI HPOS,0 ;ECHO A CR LF, SAVING CHREC PUSH PDP,CHREC MOVEI CHREC,15 ;CARRIAGE RETURN PUSHJ PDP,DUPLX1 ;OUTPUT IT MOVEI CHREC,12 ;LINE FEED PUSHJ PDP,DUPLX1 ;OUTPUT THAT TOO CHPOPJ: POP PDP,CHREC ;RESTORE CHREC POPJ PDP,0 CNTLEC: HRRI TAC,100(CHREC) ;SAVE UN-CNTL CHARACTER MOVEI CHREC,"^" PUSHJ PDP,AOJDPX MOVEI CHREC,(TAC) ;TYPE ^ CHAR PUSHJ PDP,AOJDPX TRZ CHREC,100 ;RESTORE IT TO A CNTL CHAR POPJ PDP,0 CRLF: MOVEI HPOS,0 ;HERE ON INPUT OF A CARRIAGE RETURN TLNE LINE,XON ;IF PAPER TAPE, NO FREE LF JRST TTIPUT ;JUST STORE THE CR PUSHJ PDP,TTIPUT ;ORDINARILY, STORE AND GO ON HERE MOVEI CHREC,12 ;BY ADDING A LF MOVSI IOS,SYNC ;WHICH IS A BREAK CHARACTER IORB IOS,DEVIOS(DDB) TLNN LINE,FULTWX+HLFDPX ;IF NOT SELF ECHOING. JRST TTIPUT ;THIS WILL GIVE LF ECHO PUSHJ PDP,TTIPUT ;OTHERWISE, THIS WONT JRST DUPLX1 ;BUT THIS WILL INTERN FTLOGIN INTERN CNCTST CNCTST: IFN FTLOGIN,< EXTERN JBTSTS LDB TAC,PJOBN MOVE TAC,JBTSTS(TAC) TLNE TAC,JACCT MOVEI CHREC,175 > LDB TAC,TIPUTR(DDB) CAIE TAC,3 POPJ PDP, CNCTS1: PUSHJ PDP,TSETBF ;STOP ALL I/O, BY CLEARING BUFFERS MOVEI DAT,TTIBUF(DDB) ;GET POINTER BACK TO INPUT BFR MOVE TAC,SPCTAB+3 ;AND BITS FOR CONTROL C CNCMOD: MOVE IOS,[XWD DDTM+IO+IOSUPR+USRB,MERTPO+ECHOF+IGNOR] ANDCAM IOS,DEVIOS(DDB) MOVSI IOS,TPMON+IOFST IORB IOS,DEVIOS(DDB) TLNE LINE,PTYLIN ;* PUSHJ PDP,PTMNMD ;* POPJ PDP, ;ROUTINE TO ECHO BACK-SLASH BSECHO: PUSH PDP,CHREC ;* MOVEI CHREC,"\" PUSHJ PDP,AOJDPX JRST CHPOPJ ;ROUTINE TO DECREMENT PUTR INTERN DCPUTR DCPUTR: LDB TAC,PLSTLC ;CHECK FOR NONE TO DELETE CAMN TAC,PCTR(DAT) POPJ PDP, MOVSI TAC,70000 ADD TAC,PUTR(DAT) ;* TLNE TAC,400000 ADD TAC,[XWD 347777,-1] MOVEM TAC,PUTR(DAT) AOS FCTR(DAT) AOS TAC,PCTR(DAT) CAIG TAC,TTYCHR ;* JRST CPOPJ1 ;* SUBI TAC,TTYCHR ;* MOVEM TAC,PCTR(DAT) MOVEI TAC,STTYBF ADDM TAC,PUTR(DAT) ;* JRST CPOPJ1 ;ROUTINE TO DELETE CURRENT LINE (^U) DELETL: LDB TAC,PLSTLC ;WAS THERE LAST BREAK? MOVEM TAC,TIPCTR(DDB) ;STORE COUNT PUSHJ PDP,TBYTEP ;CONVERT TO A BYTE POINTER MOVEM TAC,TIPUTR(DDB) ;SAVE POINTER JRST TRESC1 ;GO COMPUTE TIFCTR IFN FTTALK,< EXTERNAL TPOPJ DOTALK: ANDI CHREC,177 HRRZ DDB,TTYTAB(LINE) JUMPE DDB,CPOPJ ;NO SUCH LINE CAIN CHREC,3 JRST NOTALK PUSH PDP,LINE DOTAL1: LDB LINE,PTALK HLL LINE,LINTAB(LINE) HRRZ DDB,TTYTAB(LINE) JUMPE DDB,DOTAL2 PUSH PDP,CHREC CAMN LINE,-1(PDP) TLNN LINE,FULTWX+HLFDPX PUSHJ PDP,PUTCHO MOVE IOS,DEVIOS(DEVDAT) PUSHJ PDP,TYPTST POP PDP,CHREC DOTAL2: CAME LINE,0(PDP) JRST DOTAL1 JRST TPOPJ ;IF I TYPE A ^C IN TALK RING, THEN ;ASSUME NEXT_ME_PREV ;SET NEXT_PREV ;IF NEXT=PREV, CLEAR ITS TLKRNG BIT ;SET ME_ME ;CLEAR TLKRNG BIT IN LINTAB(ME) NOTALK: MOVEI HPOS,0(LINE) ;ME LDB CHREC,PTALK ;NEXT NOTAL1: LDB TAC,PTALK CAMN TAC,HPOS ;ME_? JRST NOTAL2 ;YES. LINE=PREV MOVE LINE,TAC ;NO. FIND PREV JRST NOTAL1 NOTAL2: DPB CHREC,PTALK ;MAKE NEXT_PREV CAIE CHREC,(LINE) ;RING NOW EMPTY? JRST NOTAL3 ;NO MOVSI CHREC,TLKRNG ;YES, CLR HIS BIT ANDCAM CHREC,LINTAB(LINE) NOTAL3: MOVSI CHREC,TLKRNG MOVE LINE,HPOS ;ME DPB HPOS,PTALK ;ME_ME ANDCAM CHREC,LINTAB(LINE) ;CLR MY BIT MOVEI CHREC,3 ;GET A ^C AGAIN DPB CHREC,TIPUTR(DDB) ;LOOK LIKE 2 OF THEM JRST RECINT ;AND PROCESS IT FROM THE TOP > ;ROUTINE TO TYPE CHAR ;CALL MOVE LINE,LINE NO. ; MOVE CHREC,CHARACTER ; PUSHJ PDP,TYP INTERNAL TYPL EXTERNAL TCONLN,SCNTYP,PEVEN8 TYP: TYPL: TLNE LINE,PTYLIN POPJ PDP, ;YES PUSHJ PDP,PEVEN8 ;GENERATE CORRECT PARITY TLNN LINE,CTYLIN ;NO,CONSOLE TTY? JRST SCNTYP ;TYPE CHAR. CTYP: DATAO TTY,CHREC DPB CHREC,PLASTC POPJ PDP, ;ROUTINE TO SETUP DDB FOR OUTPUT ;CALL MOVE TAC,[SIXBIT /TTY#/ ; PUSHJ PDP,GETDDB ; NONE AVAILABLE RETURN ; RETURN WITH LINE AND DDB SETUP EXTERNAL TCONLN,CPOPJ,CPOPJ1,TPOPJ1 INTERNAL GETDDB GETDDB: MOVEI LINE,TCONLN CAMN TAC,[SIXBIT /CTY/] ;CTY? JRST GETDB1 ;YES HLLZ LINE,TAC ;NO CAME LINE,[SIXBIT /TTY/] ;TTY PREFIX? POPJ PDP, ;NO TLZ TAC,-1 ;YES JUMPE TAC,CPOPJ ;TTY? ROTC TAC,30 ;NO TRZE LINE,20 ;IS FIRST SUFFIX AN OCTA;L DIGIT? TRNE LINE,70 POPJ PDP, ;NO ROT TAC,3 ;YES TRC TAC,2 ;IS THERE A 2ND SUFFIX THAT IS AN TRNN TAC,7 ;OCTAL DIGIT? ROTC TAC,3 ;YES CAIL LINE,TCONLN ;LEGAL LINE NUMBER? POPJ PDP, ;NO GETDB1: HRRZ DDB,TTYTAB(LINE) ;DOES THIS LINE HAVE A DDB? JUMPN DDB,CPOPJ1 ;JUMP IF SO. PUSHJ PDP,DDBSRC ;NO. SEARCH FOR FREE DDB POPJ PDP, ;NONE AVAILABLE HLLZM IOS,DEVIOS(DDB) ;INITIALIZE STATE PUSH PDP,DEVNAM(DDB) MOVEI TAC,ASSCON+ASSPRG ANDCAM TAC,DEVMOD(DDB) JRST TPOPJ1 ;ROUTINE TO SEARCH FOR FREE TTY DEV DATA BLOCK ;CALL: MOVE LINE,TTY LINE NO. ; PUSHJ PDP,DDBSRC ; NONE FOUND OR LINE NO, TOO BIG ; RETURN DEVDAT,LINE AND DEVNAME SET AND BITS TPMON,IOFST,IOACT, ; TTYUSE,ASSCON SET. EXTERNAL TTPLEN,MLTTYL,CPOPJ INTERNAL DDBSRC DDBSRC: HRRZ TAC,LINE ;NUMBER OF LINE ONLY CAILE TAC,TTPLEN ;IS LINE NO. TOO BIG POPJ PDP, ;YES. MOVSI IOS,MLTTYL ;NO. OF TTY DDBS MOVEI DEVDAT,TTYLST ;ADDRESS OF FIRST TTY DDB SKIPA TAC,[XWD TTYUSE+TTYATC,ASSCON+ASSPRG] HLRZ DEVDAT,DEVSER(DEVDAT) ;CHAIN THRU DDBS TDNE TAC,DEVMOD(DEVDAT) ;USE,ATTACH OR ASSIGN BITS ON? AOBJN IOS,.-2 ;YES. DONE? JUMPGE IOS,CPOPJ ;YES. DEVICE DATA BLOCK FOUND? MOVSI TAC,TOIP ;CLEAR TOIP IN DDB ANDCAM TAC,TTYPTR(DDB) ;IN CASE OF PREVIOUS DETACH MOVSI TAC,PROG MOVEM TAC,DEVIAD(DDB) ;CLEARS PHPOS MOVEM TAC,DEVOAD(DDB) ;CLEARS PFITCH MOVE IOS,[XWD TPMON+IOFST,IOACT] PUSH PDP,DAT PUSHJ PDP,TSETBF ;INITIALIZE BUFFERS POP PDP,DAT MOVE TAC,[XWD TTYUSE,ASSCON];INITIALIZE DATA BLOCK. ;FALL INTO SCNIN ;INITIALIZE TTY DEVICE DATA BLOCK(CALLED FROM TTYATT TOO) ;CALL: MOVE TAC,BITS IN DEVMOD TO BE TURNED ON ; MOVE DEVDAT,ADDRESS OF DEVICE DATA BLOCK ; PUSHJ PDP,SCNIN ; SKIP RETURN ALWAYS ; CALLED BY JRST FROM TTYATT ; AND FALLS IN FROM DDBSRC ABOVE ;SETS PHYSICAL NAME TO SIXBIT /TTY#/ OR SIXBIT /CTY/ ; WHERE # IS THE LINE NUMBER. ;STORES LINE NUMBER IN DEVICE DATA BLOCK EXTERNAL PUNIT,TTYTAB,TCONLN,CPOPJ1 SCNIN: IORM TAC,DEVMOD(DEVDAT) DPB LINE,PUNIT ;SET LINE NO. IN DDB. INTERNAL FTTALK IFN FTTALK,< DPB LINE,PTALK ;SETUP TALK RING TO CONTAIN ;ONLY THIS TTY. > MOVSI TAC,646471 ;SIXBIT /TTY/ MOVEM TAC,DEVNAM(DEVDAT) MOVE TAC,[POINT 6,DEVNAM(DEVDAT),17] TRNN LINE,70 ;IS THERE A HIGH ORDER OCTAL DIGIT? JRST SCNIN0 ;NO ROT LINE,-3 ;YES, CONVERT TO SIXBIT. ADDI LINE,20 IDPB LINE,TAC ;STORE HIGH ORDER SIXBIT DIGIT TRZ LINE,-1 ;LOW ORDER DIGIT IN LINE ROT LINE,3 SCNIN0: ADDI LINE,20 IDPB LINE,TAC ;STORE LOW ORDER DIGIT PUSHJ PDP,STLNAC HRRM DEVDAT,TTYTAB(LINE) ;SET DDB ADR. IN TRANSLATOR TABLE. MOVSI TAC,436471 ;SIXBIT /CTY/ TLNE LINE,CTYLIN ;IS THIS CONSOLE TTY? MOVEM TAC,DEVNAM(DEVDAT);YES, SET NAME TO CTY. TLNE LINE,PTYLIN ;IS THIS A PTY? PUSHJ PDP,PTMNMD ;YES. SET IT INTO MONITOR MODE JRST CPOPJ1 ;SUCCESSFUL RETURN. SCNEND: END