Trailing-Edge
-
PDP-10 Archives
-
BB-4170G-SM
-
sources/ttntdv.mac
There are 23 other files named ttntdv.mac in the archive. Click here to see a list.
;<3A.MONITOR>TTNTDV.MAC.7, 13-Jun-78 00:30:35, Edit by JBORCHEK
;DO SOME CLEAN UP
;<3A.MONITOR>TTNTDV.MAC.5, 7-Apr-78 21:56:30, Edit by BORCHEK
;INCREASE NVT OUTPUT BUFFER TO 40 WORDS AT NETTC8
;<3A.MONITOR>TTNTDV.MAC.4, 6-Apr-78 01:49:06, Edit by BORCHEK
;FIX BYTE POINTER AT NETTC8
;<3A.MONITOR>TTNTDV.MAC.3, 27-Mar-78 11:41:19, EDIT BY MILLER
;ADD TTYDIS AND TTYAWK AS TEMP FIX
;<3.SM10-RELEASE-3>TTNTDV.MACC.31, 20-Dec-77 10:03:53, EDIT BY KIRSCHEN
;CORRECTLY GET DYNAMIC DATA FOR TTYDIS CALL IN NVTNGC
;<4.MONITOR>TTNTDV.MAC.2, 5-Dec-77 15:46:18, EDIT BY CROSSLAND
;REMOVE MORE RCTE CODE AND DO NOT CLEAR OUTPUT BUFFERS IF IN SCED
;<3-MONITOR>TTNTDV.MAC.31, 20-Nov-77 19:53:53, EDIT BY CROSSLAND
;FIX IMPNEA BUGCHECKS WITH NEW TELNET IN IMPS
;<3-MONITOR>TTNTDV.MAC.30, 9-Nov-77 09:59:05, EDIT BY KIRSCHEN
;MORE COPYRIGHT UPDATING...
;<3-MONITOR>TTNTDV.MAC.29, 7-Nov-77 18:02:06, EDIT BY CROSSLAND
;MAKE BINARY AND TRANSPARENT MODES WORK
;<3-MONITOR>TTNTDV.MAC.28, 20-Oct-77 23:53:06, EDIT BY CROSSLAND
;<3-MONITOR>TTNTDV.MAC.27, 19-Oct-77 01:07:45, EDIT BY CROSSLAND
;ONE MORE TRY AT NVTDET.
;<3-MONITOR>TTNTDV.MAC.26, 12-Oct-77 14:21:03, EDIT BY KIRSCHEN
;UPDATE COPYRIGHT FOR RELEASE 3
;<3-MONITOR>TTNTDV.MAC.25, 29-Sep-77 02:28:53, EDIT BY CROSSLAND
;<3-MONITOR>TTNTDV.MAC.24, 28-Sep-77 04:23:17, EDIT BY CROSSLAND
;MAKE CHKNVT AND NVTCHK CHECK FOR LEGAL LINE NUMBER
;<3-MONITOR>TTNTDV.MAC.23, 25-Sep-77 00:19:45, EDIT BY CROSSLAND
;MAKE SNDALL'S TIME OUT FOR NVT'S
;<3-MONITOR>TTNTDV.MAC.22, 23-Sep-77 04:37:23, EDIT BY CROSSLAND
;<3-MONITOR>TTNTDV.MAC.21, 23-Sep-77 04:25:05, EDIT BY CROSSLAND
;FIX NVTDET TO GENERATE CARRIER OFF PSI ONLY WHEN NCP BREAKS CONNECTION
;<3-MONITOR>TTNTDV.MAC.20, 14-Sep-77 16:16:15, EDIT BY MILLER
;CHANGE "CALL DYNSTA" TO "DYNST"
;<3-MONITOR>TTNTDV.MAC.19, 1-Sep-77 12:10:42, EDIT BY CROSSLAND
;FIX ERROR RETURN FROM NVTDET
;<3-MONITOR>TTNTDV.MAC.18, 3-Aug-77 23:50:23, EDIT BY CROSSLAND
;MAKE NEW TELNET NVT'S WORK
;<3-MONITOR>TTNTDV.MAC.17, 30-Jul-77 01:44:00, EDIT BY CROSSLAND
;REUSE TTVT11 FOR DEASIGNING DYNAMIC DATA
;<3-MONITOR>TTNTDV.MAC.16, 23-Jul-77 23:03:32, EDIT BY CROSSLAND
;MOVE NETWORK BUFFERS TO ANBSEC SECTION
;<3-MONITOR>TTNTDV.MAC.15, 5-Jul-77 00:05:35, EDIT BY CROSSLAND
;MAKE NVTDET CLEAR SENDALL DATA
;<3-MONITOR>TTNTDV.MAC.14, 1-Jul-77 02:48:08, EDIT BY CROSSLAND
;CHANGE OKSKED'S AND NOSKED'S THAT CAN BE REACHED AT SCHED LEVEL TO
; OKSKD1'S AND NOSKD1'S. FIX ASSIGNING AND DEASSIGNING OF NVT'S
;<3-MONITOR>TTNTDV.MAC.13, 17-Jun-77 05:40:45, EDIT BY CROSSLAND
;FIX UP CALL TO NVTDET
;<3-MONITOR>TTNTDV.MAC.12, 10-Jun-77 20:58:43, EDIT BY CROSSLAND
;MORE DEBUGING OF TCO 1742
;<3-MONITOR>TTNTDV.MAC.11, 7-Jun-77 17:17:46, EDIT BY HALL
;TCO 1740 - ADD TTVT38
;<3-MONITOR>TTNTDV.MAC.10, 24-May-77 16:31:37, EDIT BY CROSSLAND
;<3-MONITOR>TTNTDV.MAC.9, 14-May-77 19:43:30, EDIT BY CROSSLAND
;TCO 1742 MERGE ARPANET SOURCES MERGE WITH NVT.MAC
;<3-MONITOR>TTNTDV.MAC.8, 12-May-77 00:50:05, Edit by MCLEAN
;CHANGE SO DUMMY MODULES NOT NECESSARY
;<3-MONITOR>TTNTDV.MAC.7, 6-May-77 12:33:28, EDIT BY HALL
;TCO 1740 -VECTOR CHANGES FOR TTMSG JSYS
;<3-MONITOR>TTNTDV.MAC.6, 3-May-77 22:52:56, EDIT BY CROSSLAND
;<3-MONITOR>TTNTDV.MAC.5, 27-Apr-77 17:41:24, EDIT BY CROSSLAND
;<3-MONITOR>TTNTDV.MAC.4, 22-Mar-77 01:19:57, Edit by MCLEAN
;<3-MONITOR>TTNTDV.MAC.3, 22-Mar-77 01:18:41, Edit by MCLEAN
;ADD PRINTX
;<3-MONITOR>TTNTDV.MAC.2, 20-Mar-77 02:47:49, Edit by MCLEAN
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1976, 1977, 1978 BY DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
SUBTTL NVT DEPENDENT CODE
;THIS MODULE IS NECESSARY TO SUPPORT THE NETWORK VIRTUAL TERMINALS (NVT)
;OVER THE ARPANET.
;NVT VECTOR TABLE ENTRYS
RESCD
TTNTVT=.
NVTLEN ;LENGTH OF DYNAMIC DATA FOR THIS TYPE
-1 ;FIRST LINE OF THIS TYPE/-1 NO LINES
IFIW!R ;TTVT00 - INITALIZATION
IFIW!R ;RESTART
IFIW!NVTCOB ;CLEAR OUTPUT BUFFER
IFIW!R ;SET LINE SPEED
IFIW!TTRSP2 ;READ TTY SPEED
IFIW!TTSNT2 ;SET NON-TERM STATUS
IFIW!TTRNT1 ;READ NON-TERM STATUS
IFIW!TTSTO5 ;REMOVE CHAR FROM OUTPUT BUFFER
IFIW!NVTPAR ;STPAR JSYS
IFIW!R ;CHECK PHYSICAL LINE
IFIW!TTXON2 ;TTVT10 - XON
IFIW!NVTDET ;DEASIGN DYNAMIC DATA
ANDI T1,177 ;TTY OUTPUT PARITY OFF
IFIW!NTTCSO ;START OUTPUT LINE
IFIW!R ;XOFF
IFIW!R ;XON
IFIW!TTCQ1 ;EMPTY BUFFER
IFIW!R ;CARRIER ON
IFIW!NTYCOF ;CARRIER OFF
IFIW!NVTDTS ;HANGUP
IFIW!R ;TTVT20 - ^S
IFIW!TTC7SN ;NO LOGINS
IFIW!R ;STORE CHARACTER
IFIW!R ;SEND CHARACTER
IFIW!TTDAL6 ;DEALLOCATE LINE
IFIW!DLSSX2 ;BUFFER OVERFLOW
IFIW!R ;EMPTY BUFFER
IFIW!RSKP ;TTVT27 - SENDALL TO SINGLE LINE
IFIW!R ;ENABLE/DISABLE DATASETS
IFIW!R ;INIT
IFIW!R ;30 CLEAR INPUT BUFFER
IFIW!NVTDOB ;31 DOBE
IFIW!NETCAP ;32 INPUT GA
IFIW!TTSET1 ;33 SET INIT. VALUES FOR A LINE
IFIW!TTSBE1 ;34 SOBE
IFIW!TTOBE1 ;35 WAKEUP IF OUTPUT BUFFER EMPTY
IFIW!TTMSNT ;TTVT36 - SENDALL TO SINGLE LINE
IFIW!TTMSNT ;TTVT37 - SENDALL TO ALL LINES
JFCL ;TTVT38 - ADJUST WAKEUP CLASS
IFN <.-TTVTMX>-TTNTVT,<PRINTX %%INVALID DEVICE DEPENDENT TABLE SIZE>
;PARAMETERS
NEGTM0==^D30000 ;NEGOTIATION TIME-OUT (BETWEEN 1 & 2 OF THESE)
TMSNTT==^D500 ;TIME PER CHARACTER OF TTMSG BEFORE FLUSHING
;NVT SPECIAL CHARACTERS
IACCH==377 ;INITIATE COMMAND
DNTCH==376 ;DON'T
DOCH==375 ;DO
WNTCH==374 ;WON'T
WILCH==373 ;WILL
SBCH==372 ;SB BEGINNING OF SUB NEGOTIATION
GACH==371 ;GA GO AHEAD
ELCH==370 ;EL ERASE LINE
ECCH==367 ;EC ERASE CHARACTER
AYTCH==366 ;AYT ARE YOU THERE?
AOCH==365 ;AO ABORT OUTPUT
IPCH==364 ;IP INTERRUPT PROCESS
BRKCH==363 ;BREAK
DMCH==362 ;DM DATA MARK
NOPCH==361 ;NOP
SECH==360 ;SE END OF SUBNEGOTIATION
;NVT OPTION DEFINITIONS
BINOPT==0 ;BINARY
ECHOPT==1 ;ECHO
RCNOPT==2 ;RECONNECTION
SGAOPT==3 ;SUPPRESS GA
NAMOPT==4 ;NEGOTIATE MESSAGE SIZE
STSOPT==5 ;STATUS
TMKOPT==6 ;TIMING MARK OPTION
RCTOPT==7 ;RCTE OPTION
WILOPT==10 ;OFFSET FOR REQUESTS
MAXOPT==^D18 ;ONLY 1 HALF WORD OF OPTION BITS
TTNETW=TTDEV
;BITS IN TTNETW
DEFSTR PTITC,TTNETW,5,3 ;COUNT, SYNC-INS
NV%WKS==1B8 ;RCTE WAKEUP SEEN
MSKSTR NVWKS,TTNETW,NV%WKS
NV%RCS==1B9 ;RCTE CHAAGE IN STATE
MSKSTR NVRCS,TTNETW,NV%RCS
NV%NNV==1B10 ;NEW STYLE NVT
MSKSTR NVNNV,TTNETW,NV%NNV
NV%TMO==1B11 ;NEGOTIATION TIME-OUT STARTED
MSKSTR NVTMO,TTNETW,NV%TMO
DEFSTR NVSTP,TTNETW,14,3 ;CURRENT NVT STATE
;THE FOLLOWING NVT STATES ARE STORED IN TTNETW BITS 12-14 (NVSTP)
.DFWIL==1 ;DEFERRED WILL
.DFWNT==2 ;DEFERRED WONT
.DFDO==3 ;DEFERRED DO
.DFDNT==4 ;DEFERRED DONT
.DFIAC==5 ;DEFERRED IAC
NV%GAB==1B15 ;BIT IN TTNETW -- SUPPRESS GO-AHEAD
MSKSTR NVGAB,TTNETW,NV%GAB
NV%CRI==1B16 ;BIT IN TTNETW, LAST CHAR IN WAS CR
MSKSTR NVCRI,TTNETW,NV%CRI
NV%CRP==1B17 ;BIT IN TTNETW -- LAST CHAR OUT WAS CR
MSKSTR NVCRP,TTNETW,NV%CRP
DEFSTR PTNTO,TTNETW,26,9 ;OUTPUT UNIT
DEFSTR PTNTI,TTNETW,35,9 ;INPUT UNIT
TTBRKC=TTDDLN ;BREAK CLASSES FOR NVT'S
DEFSTR PBRCT,TTBRKC,8,9 ;BITS 0-8: OUTSTANDING BREAK COUNT
;BITS 9-17: LAST RCTE COMMAND SENT
;BITS 18-35: LAST BREAK CLASSES SENT
MAXBRC==777
NVTOPF=TTDDLN+1 ;LH -- BIT FOR EACH OPTION IN PROGRESS
;RH -- BIT FOR RESULT OF EACH OPTION
NVTLEN=TTDDLN+2
;TEMP CODE TO DO TTYDIS AND TTYAWK CODE. REMOVED FROM TTYSRV
;ROUTINES TO ADJUST LOCK STATUS BEFORE AND AFTER DISMISSING.
;THIS CODE PUTS AN ENTRY ON THE JSB STACK IN THE EVENT THE PROCESS
;IS INTERRUPTED WHILE DISMISSED.
;PUT ENTRY ON JSB STACK, AND GO OKINT
;ACCEPTS: T2/ ADDRESS OF DYNAMIC DATA
TTYDIS: JE TTLCK,(T2),R ;THIS IS A HACK TO KEEP FSIINI HAPPY.
;SINCE THE SWAPPABLE MONITOR IS NOT
;LOADED YET, WE CAN'T USE THE NORMAL
;LOCKING STATEGY. THIS IS ACCEPTABLE
;HERE SINCE NO CONFUISION CAN RESULT.
SKIPE INSKED ;IN THE SCHEDULER?
RET ;YES. DON'T MANIPULATE THE JSB STACK
SAVET ;SAVE ALL REGISTERS
LOAD T1,TINTL,(T2) ;GET INTERNAL LINE NUMBER
MOVEI T2,STKCD3 ;GET PROPER CODE
CALL JSBSTK ;QUEUE UP THE ENTRY
OKINT ;ALLOW INTS NOW
RET ;AND DONE
;DISMISS WAS SATISFIED. DEQUEUE THE ENTRY AND GO NOINT
TTYAWK: JE TTLCK,(T2),R ;THIS IS A HACK TO KEEP FSIINI HAPPY.
;SINCE THE SWAPPABLE MONITOR IS NOT
;LOADED YET, WE CAN'T USE THE NORMAL
;LOCKING STATEGY. THIS IS ACCEPTABLE
;HERE SINCE NO CONFUISION CAN RESULT.
SKIPE INSKED ;IN THE SCHEDULER?
RET ;YES. DON'T MANIPULATE THE JSB STACK
SAVET ;SAVE ALL REGISTERS
NOINT ;PREVENT INTS
LOAD T1,TINTL,(T2) ;GET INTERNAL LINE NUMBER
MOVEI T2,STKCD3 ;GET TYPE
CALLRET JSFRMV ;REMOVE ENTRY AND DONE
;NVTCHK - SEE IF THIS LINE NUMBER IS A NVT AND GET ADDRESS OF DYNAMIC
; DATA IF IT IS
;ACCEPTS:
; T2/ INTERNAL LINE NUMBER
; CALL NVTCHK
;RETURNS +1: NOT A NVT OR NO DYNAMIC DATA
; TTY DATA BASE NOT LOCKED
; +2: A NVT
; T2/ ADDRESS OF DYNAMIC DATA
; AND TTY DATA BASE LOCKED
RESCD
NVTCHK::CAIL T2,NLINES ;LEGAL TERMINAL NUMBER
RETBAD ;NO. FAILURE
ACVAR <W1> ;GET AN AC TO WORK WITH
LOAD W1,TTSTY,(T2) ;GET LINE TYPE FOR THIS LINE
CAIE W1,TT.NVT ;IS IT A NVT?
RETBAD ;NO. FAILURE
CALL LCKTTY ;GET ADDRESS OF DYNAMIC DATA AND LOCK
JRST [CALL ULKTTY ;LINE NOT INITIALIZED UNLOCK
RETBAD] ;AND RETURN
RETSKP ;RETURN SUCCESS
;CHKNVT - SEE IF THIS LINE NUMBER IS A NVT
;ACCEPTS:
; T2/ INTERNAL LINE NUMBER
; CALL CHKNVT
;RETURNS +1: IF NOT NVT
; +2: IF NVT
RESCD
CHKNVT::ACVAR <W1> ;GET AN AC TO WORK WITH
LOAD W1,TTSTY,(T2) ;GET LINE TYPE FOR THIS LINE
CAIE W1,TT.NVT ;IS IT A NVT?
RETBAD ;NO. FAILURE
RETSKP ;RETURN SUCCESS
;TTMSNT - TEST TO SEE IF SEND ALL SHOULD BE DONE
; FNCALL OFF TTVT36,TTVT37
;ACCEPTS:
; T2/ LINE NUMBER
;RETURNS: +1 DO NOT SEND MESSAGE
; +2 SEND MESSAGE
SWAPCD
TTMSNT: PUSH P,T2 ;SAVE LINE NUMBER
CALL LCKTTY ;GET DYNAMIC DATA ADDRESS IF IT EXIST
JRST TTMSN1 ;NO DYNAMIC DATA DO NOT SEND
SKIPG TTNETW(T2) ;ANY CONNECTIONS?
JRST TTMSN1 ;NO DO NOT SEND MESSAGE
CALL ULKTTY ;YES UNLOCK TTY DATABASE
AOS TTNOF ;INDICATE OUTPUT FOR NVTS
MOVE T2,TTMSCT ;GET COUNT OF CHARACTERS IN MESSAGE
IMULI T2,TMSNTT ;MULTIPLY BY ALLOWABLE TIME PER CHAR.
ADD T2,TODCLK ;GET TIME MESSAGE TO BE DISCARDED
MOVEM T2,ITMSTM ;SAVE TIME FOR NCPFORK
POP P,T2 ;RESTORE T2
RETSKP ;SEND MESSAGE
TTMSN1: CALL ULKTTY ;UNLOCK TTY
POP P,T2 ;RESTORE T2
RETBAD ;NO DO NOT SEND MESSAGE
;TMSNTR - ROUTINE TO CLEAR ALL NVT SNDALL REQUEST
;CALLED NOSKED
RESCD
TMSNTR::MOVE T3,NVTPTR ;GET AOBJN COUNTER FOR NVT'S
TMSNR1: SKIPN T2,TTACTL(T3) ;GET ADDRESS OF DYNAMIC DATA
JRST TMSNR2 ;IF NON-STANDARD BLOCK CHECK
HRRZ T2,T2 ;GET JUST ADDRESS
JE TTSAL,(T2),TMSNR2 ;IF DOING SENDALL CLEAR IT
SETZRO TTSAL,(T2) ;ZERO SENDALL BIT
SOS SALCNT ;DECREMENT COUNT OF LINES DOING SENDALL
SETZRO TSALP,(T2) ;ZERO SENDALL POINTER
TMSNR2: AOBJN T3,TMSNR1 ;HAVE WE DONE ALL OF THE LINES
RET ;YES RETURN
;TCOBN - ENTRY FOR BINARY OUTPUT. NO TRANSLATION NO LINKS.
;TCOBQ - ENTRY FOR BINARY OUTPUT. NO TRANSLATION NO LINKS.
; NO SPECIAL HANDELING
;ACCEPTS:
; T1/ CHARACTER (UP TO 9 BITS)
; T2/ ADDRESS OF DYNAMIC DATA
; CALL TCOBN
;RETURNS +1: ALWAYS
TCOBQ: ;HERE FOR NOW EVENTUAL WILL GO PAST
; SPECIAL CHARATER VECTOR CALL
TCOBN: SAVELN ;SAVE LINE NUMBER
ANDI T1,377 ;8 BITS OF CHARACTER
CALL TCOU6 ;GO OUTPUT THE CHARACTER WITHOUT ADDING
; PARITY OR DOING LINKS
RET ;RETURN
;NVTIPU - GET NVT INPUT UNIT
;ACCEPTS:
; T2/ ADDRESS OF DYNAMIC DATA
; CALL NVTIPU
;RETURNS +1: FAILURE NO UNITS FOR THIS NVT
; +2: SUCCESS
; Q1/ (UNIT) INPUT UNIT
NVTIPU::LOAD Q1,PTNTI,(T2) ;GET INPUT UNIT
SKIPG TTNETW(T2) ;UNLESS NO UNITS ON TTY
RETBAD ;NO UNITS. FAIL
RETSKP ;SUCCESS
;NVTDSC - DECREMENT INS/SYNC COUNT AND RE-ALLOCATE IF NECESSARY
;ACCEPTS:
; T2/ ADDRESS OF DYNAMIC DATA
;RETURN +1: ALWAYS
NVTDSC::DECR PTITC,(T2) ;INS COUNTS -1, SYNC CHAR COUNTS 1
LOAD Q1,PTNTI,(T2) ;GET INPUT UNIT
SKIPN NETBAL(Q1) ;ANY ALLOCATION
CALL NVTRAL ;NO. SEND MORE ALLOCATION
RET
;NVTDWN - CLEAR UP ALL NVTS
;RETURN +1: ALWAYS
NVTDWN::MOVE T1,NVTPTR ;CLEAN UP ALL NVTS
NVTDW1: HRR T2,T1 ;GET TTY NUMBER
PUSH P,T1 ;SAVE LINE COUNTER
CALL NVTDET ;GO TRY TO DETACH IT
JFCL ;IGNORE ERRORS
POP P,T1 ;GET LINE COUNTER BACK
AOBJN T1,NVTDW1 ;CHECK ALL NET NVT LINES
RET
;TTC7SN - LINE IS A NVT. SEE IF NVT LOGINS ARE ALLOWED
TTC7SN: TXNE T1,SF%NVT ;SEE IF NVT LOGINS ALLOWED
JRST TTC7SK ;YES, GO LOGIN IN
HRROI T1,[ASCIZ/
?LOGGING IN OVER NVT'S IS CURRENTLY DISALLOWED.
/]
CALLRET TTEMES
;ASNNVT - ASSIGN A NETWORK VIRTUAL TERMINAL
;ACCEPTS:
; T1/ RECEIVE UNIT
; T2/ SEND UNIT
; CALL ASNNVT
;RETURNS +1: FAILURE
; +2: SUCESS
; T1/ LINE NUMBER
; T2/ ADDRESS OF DYNAMIC DATA AND DATA BASE LOCKED
SWAPCD
ASNNVT::STKVAR<NVREC,NVSEND,NVLIN>
MOVEM T2,NVSEND ;SAVE SEND AND RECEIVE UNITS
MOVEM T1,NVREC
HRRZ T1,NVTPTR ;GET FIRST NVT LINE NUMBER
SETZ T3, ;START WITH FIRST NVT
NOSKED
ASNNV1: MOVE T2,T1 ;GET FIRST NVT OFFSET
ADD T2,T3 ;ADD CURRENT NVT
MOVEM T2,NVLIN ;SAVE LINE NUMBER
CALL STADYN ;IS IT INITIALIZED
JUMPE T2,ASNNV4 ;NO. NO DYNAMIC DATA
SKIPG TTNETW(T2) ;FREE?
JRST ASNNV3 ;YES.
ASNNV2: CAIGE T3,NTTNVT ;LOOKED AT ALL NVT'S?
AOJA T3,ASNNV1 ;NO
OKSKED ;YES,
RETBAD ;RETURN BAD
ASNNV3: LOAD T2,TCJOB,(T2) ;GET JOB FOR WHICH THIS IS A CNTRL TTY.
CAIE T2,-1 ;IS THERE ONE
JRST ASNNV2 ;YES. TTY ALREADY ATTACHED?
ASNNV4: MOVE T2,NVLIN ;GET LINE NUMBER BACK
CALL TTYASC ;ASSIGN NVT
JRST ASNNV6 ;COULD NOT ASSIGN IT
MOVE T2,NVLIN ;GET LINE NUMBER
CALL LCKTTY ;AND LOCK DATA BASE
JRST ASNNV5 ;CANNOT LOCK DATA BASE. SHOULD'NT HAPPEN
SETONE TCJOB,(T2) ;INDICATE NO CONTROLLING JOB FOR TERM.
SETONE TTPRM,(T2) ;MAKE DATA PERMANENT UNTIL NVT CLOSED
MOVE T1,NVREC ;GET RECEIVE UNIT BACK
TXNN T1,AN%NTP ;NEW NVT PROTOCOL REQUEST?
TLZA T3,-1 ;NO, MAKE ZEROES
MOVX T3,NVNNV ;YES, MAKE NEW NVB BIT
HLLZM T3,TTNETW(T2) ;CLEAR TTNETW EXCEPT FOR NVNNV
SETZM NVTOPF(T2) ;CLEAR OPTION STATUS
OKSKED
MOVE T3,NVSEND ;GET BACK SEND UNIT
STOR T1,PTNTI,(T2) ;REMEMBER UNITS
STOR T3,PTNTO,(T2)
SETONE TT%DUM,TTFLGS(T2) ;SET DUPLEX MODE
MOVEI T1,.TTIDL ;SET TO BE AN "IDEAL" TERMINAL
STOR T1,TTTYP,(T2)
MOVE T1,NVLIN ;RETURN LINE NUMBER
RETSKP
ASNNV5: CALL ULKTTY ;UNLOCK DATA BASE
ASNNV6: HRRZ T1,NVTPTR ;GET FIRST NVT
MOVE T3,NVLIN ;SET UP TO TRY NEXT LINE
SUB T3,T1 ;GET NVT NUMBER IN 3
JRST ASNNV2 ;AND TRY NEXT NVT
;NVTDTS - CLOSE A FULL DUPLEX NET TTY CONNECTION ON CARRIER OFF
;ACCEPTS:
; T2/ LINE NUMBER
; FNJRST OFF TTVT19
;RETURNS +1: ALWAYS
RESCD
NVTDTS: CALL NVTDET ;DETACH NVT
RET ;IGNORE ERRORS
RET ;SUCESS
;NVTDET - CLOSE A FULL DUPLEX NET TTY CONNECTION
;ACCEPTS:
; T2/ LINE NUMBER
; CALL NVTDET
;RETURNS +1: FAILURE
; T1/ 1B0 + ADDRESS OF ROUTINE IF NEED TO DISMISS
; T1/ ERROR CODE IF FAILED
; +2: SUCCESS
RESCD
NVTDET::SE1CAL ;ENTER SECTION 1
SAVEQ ;SAVE Q1,Q2,Q3
STKVAR <NVTDLN,NVTDAD>
MOVEM T2,NVTDLN ;SAVE LINE NUMBER
CALL NVTCHK ;IS IT AN NVT
RETSKP ;NOT ASSIGNED RETURN
MOVEM T2,NVTDAD ;SAVE ADDRESS OF DYNAMIC DATA
CALL CLRPRM ;CLEAR PERMANENT BIT SO DEASSIGN WILL HAPPEN
SKIPG TTNETW(T2) ;REASONABLE UNITS?
JRST NVTDT1 ;NO GO CLEAN IT UP
LOAD Q1,PTNTI,(T2) ;INPUT UNIT
CALL NVTCLZ ;CLOSE IT
MOVE T2,NVTDAD ;GET ADDRESS OF DYNAMIC DATA BACK
LOAD Q1,PTNTO,(T2) ;OUTPUT UNIT
CALL NVTCLZ ;CLOSE IT
MOVE T2,NVTDAD ;GET ADDRESS OF DYNAMIC DATA BACK
NVTDT1: SETZM TTNETW(T2) ;ZERO OUT UNITS
LOAD T3,TCJOB,(T2) ;GET OWNING JOB
CAIN T3,-1 ;ANY JOB?
JRST NVTDT2 ;NO. GO DEALLOCATE DATA
MOVE T2,NVTDLN ;GET TTY LINE NUMBER
MOVEI T1,.TTDES(T2) ;MAKE DEVICE DESIGNATOR
CALL CHKDES ;GET INDEX TO DEVICE TABLES
JRST [ MOVE T2,NVTDAD ;GET ADDRESS OF DYNAMIC DATA BACK
CALL ULKTTY ;NO. SUCESSFUL RETURN
RETBAD] ;INVAILD DEVICE SHOULD NOT HAPPWN
SETZRO DV%OPN,DEVCHR(T2) ;CLEAR OPEN BIT SO RELD AT LOGOUT WILL
; DEASIGN IT
MOVE T2,NVTDAD ;GET ADDRESS OF DYNAMIC DATA
MOVE T1,NVTDLN ;GET TTY LINE NUMBER
CAMN T1,CTRLTT ;IS THIS THE CONTROLLING TTY
JRST NVTDT2 ;YES. GO DEASIGN DATABASE.
LOAD T3,TCJOB,(T2) ;GET OWNING JOB
HLRZ T3,JOBPT(T3) ;GET CONTROLLING TERMINAL OF JOB
CAME T1,T3 ;IS THIS A CONTROLLING TTY
JRST NVTDT2 ;NO. GO DETACH IT.
;A JOB EXISTS ON THIS LINE, AND THE NET CONNECTION HAS BEEN BROKEN.
;GENERATE A CARRIER OFF PSI FOR THE TOP FORK. THIS WILL CAUSE THE
;TERMINAL DATA BLOCK TO BE DEASSIGNED.
MOVE T2,NVTDLN ;GET TTY LINE NUMBER
NOSKD1
CALL NTYCOF ;CAUSE CARRIER OFF ACTION
OKSKD1
MOVE T2,NVTDAD ;GET ADDRESS OF DYNAMIC DATA BACK
CALL ULKTTY ;NO. SUCESSFUL RETURN
RETSKP
;DEASSIGN THE TERMINAL'S DATA BLOCK
NVTDT2: JE TTSAL,(T2),NVTDT3 ;IF DOING SENDALL CLEAR IT
SETZRO TTSAL,(T2) ;ZERO SENDALL BIT
SOS SALCNT ;DECREMENT COUNT OF LINES DOING SENDALL
SETZRO TSALP,(T2) ;ZERO SENDALL POINTER
NVTDT3: CALL ULKTTY ;UNLOCK DATA BASE
MOVE T2,NVTDLN ;GET TTY LINE NUMBER
MOVEI T1,.TTDES(T2) ;MAKE DEVICE DESIGNATOR
CALL CHKDES ;GET INDEX TO DEVICE TABLES
RETBAD ;INVAILD DEVICE SHOULD NOT HAPPWN
MOVEM T2,NVTDAD ;SAVE INDEX TO DEVICE TABLES
MOVE T2,NVTDLN ;GET TTY LINE NUMBER
CALL TTYDE0 ;DEALOCATE LINE
RETBAD ;RETURN ERROR OR TEST ROUTINE
MOVE T2,NVTDAD ;GET INDEX TO DEVICE TABLES
HRROS DEVUNT(T2) ;SET OWNING JOB TO -1
SETZRO DV%ASN!DV%OPN,DEVCHR(T2) ;MARK NOT ASSIGNED OR OPEN
MOVE T2,NVTDLN ;GET LINE NUMBER
CAME T2,CTRLTT ;CONTROLLING TERMINAL
RETSKP ;NO. SUCESSFUL RETURN
SETOM CTRLTT ;YES. INDICATE NO TERMINAL
MOVE T2,JOBNO ;GET JOB NUMBER
HRROS JOBPT(T2) ;THIS JOB NO LONGER HAS A TTY
RETSKP ;SUCESSFUL RETURN
;NETCAP - CALLED FROM TCI ON INPUT WAIT
;ACCEPTS:
; T2/ DYNAMIC DATA ADDRESS
; FNCALL OFF TTVT32
;RETURNS: +1: ALWAYS
; T2/ DYNAMIC DATA ADDRESS
NETCAP: SKIPG TTNETW(T2) ;STILL CONNECTED?
RET ;NO
PUSH P,Q1 ;SAVE Q1
PUSH P,T2 ;AND T2. MUST BE RETURNED
NOINT ;PROTECT ANY POSSIBLE ILOCKS
CALL CKNNVT ;NEW NVT PROTOCOL?
JRST NETCA1 ;NO. SKIP SENDING GA
CALL NVTXGA ;SEND GA IF NEEDED
NETCA1: LOAD Q1,PTNTI,(T2) ;INPUT UNIT
SKIPN NETBAL(Q1) ;IS THERE ANY ALLOCATION
CALL NVTRAL ;NO PROBABLY ONLY 1ST TIME, OR AFTER CFIBF
OKINT
POP P,T2 ;RESTORE T2
POP P,Q1 ;AND Q1
RET
;CKNNVT - CHECK IF THIS NVT IS USING NEW PROTOCOL
;ACCEPTS:
; T2/ ADDRESS OF DYNAMIC DATA
; CALL CKNNVT
;RETURNS +1: OLD NVT PROTOCOL
; +2: NEW NVT PROTOCOL
CKNNVT: JE NVNNV,TTNETW(T2),R ;OLD NVT PROTOCOL? RETURN
RETSKP ;NEW PROTOCOL. SKIP RETURN
REPEAT 0,<
;NVTCHO - CHECK FOR SPECIAL NVT OUTPUT PROCESSING
; CALLED FROM TCOUTX FOR NVT'S
NVTCHO: STKVAR<NVTCH>
CALL CKNNVT ;CHECK IF NEW NVT
RET ;NOT. NO SPECIAL PROCESSING
MOVEM T1,NVTCH ;SAVE CHARACTER
MOVX T3,NVCRP ;PREVIOUS CHARACTER CARRIAGE RETURN
TXNE T3,TTNETW(T2) ;WAS IT?
ANDCAM T3,TTNETW(T2) ;YES, CLEAR IT
CAIE T1,.CHLFD ;MUST BE FOLLOWED BY LF
CAIN T1,0 ;OR NULL
JRST .+1
SETZ T1, ;IF NOT FOLLOW IT WITH NULL
CALL TCOBQ ;GO PUT IT OUT
MOVE T1,NVTCH ;GET CHARACTER BACK
JRST .+1]
CAIN T1,IACCH ;IAC?
CALL TCOBQ ;YES. DOUBLE THE SPECIAL CHARACTER
MOVE T1,NVTCH ;GET CHARACTER BACK
RET
>;END OF REPEAT 0
REPEAT 0,<
;NVTXCR - SET NVCRP CALLED FROM TTYSRV
;ACCEPTS:
; T2/ ADDRESS OF DYNAMIC DATA
;RETURN +1: ALWAYS
NVTXCR: CALL CKNNVT
RET
SETONE NVCRP,TTNETW(T2)
RET
>;END OF REPEAT 0
;NTTCSO - START OUTPUT TO A LINE CALLED FROM STRTOU
; FNJRST OF TTVT13
;RETURNS +1: ALWAYS
NTTCSO: AOS TTNOF ;REQUEST TTY SCAN
AOS IMPFLG
RET
REPEAT 0,<
;NVTRCC - CHECK FOR ECHOS DONE BY RCTE
;ACCEPTS:
; T1/ CHARACTER
; T2/ LINE NUMBER
;RETURNS:
; +1 ;NO RCTE ACTION
; +2 ;CHARACTER NOT A BREAK CHARACTER
; +3 ;CHARACTER IS A RCTE BREAK
;THE 400 BIT IS SET IN THE CHARACTER IN AC1 IF RCTE DID THE ECHO.
NVTRCC: CALL NVTCHK ;IS IT AN NVT?
RETSKP ;RETURN AS NOT A BREAK CHARACTER
PUSH P,T3 ; STASH AC3
MOVEI T3,(1B<RCTOPT+WILOPT>) ;RCTE OPTION REQUEST
TDNN T3,NVTOPF(T2)
JRST NVTRC1 ;NO
MOVEI T3,0(T1) ;THE CHARACTER
ANDI T3,177 ;RETAIN LOW BITS
LSH T3,-2 ;DIVIDE BY 4 BYTES PER WORD
TRNE T1,2 ;IF SECOND TWO BYTES WANTED
SKIPA T3,CHWTB(T3) ;GET THEM
MOVS T3,CHWTB(T3) ;ELSE GET FIRST TWO BYTES
TRNN T1,1 ;IF BYTE 0 OR 2
LSH T3,-9 ;SHIFT OVER
HRROS T3
AND T3,TTBRKC(T2) ;RETAIN BITS SPECIFIED AS BREAKS
TRNN T3,777 ;IS THIS CHAR ONE OF THEM?
LSH T3,-1 ;YES, SHIFT BIT 15 INTO BIT 16
TLNE T3,2 ;WAS ECHO SUPPRESSED?
NVTRC1: AOSA -1(P) ;YES, INDICATE RCTE HAS DONE NOUGHT
IORI T1,400 ;ELSE INDICATE ECHO GENERATED
CALL ULKTTY ;UNLOCK DATA BASE
POP P,T3 ;RESTORE AC3
RET
>;END OF REPEAT 0
;NVTXGA - SEND GA
;ACCEPTS:
; T2/ ADDRESS OF DYNAMIC DATA
;RETURNS +1: ALWAYS
NVTXGA: MOVE T1,TTNETW(T2) ;GET STATUS WORD
TXNN T1,NVGAB ;GA SUPPRESSED
CALL CKNNVT ;OR NOT NEW PROTOCOL?
JRST NVTXG1 ;NO. SKIP GA
MOVEI T1,GACH ;GET GA CHARACTER
CALL NVTSSP ;SEND IT
NVTXG1: MOVEI T3,(1B<RCTOPT+WILOPT>) ;RCTE OPTION REQUEST
TDNN T3,NVTOPF(T2)
RET ;NO
LOAD T1,PBRCT,(T2) ;GET BREAK COUNT
ADDI T1,1 ;ADD ONE
CAILE T1,MAXBRC ;OVER MAXIMUN
BUG(CHK,IMPTMB,<NVTXG1: TOO MANY BREAKS OUTSTANDING>)
STOR T1,PBRCT,(T2) ;STORE COUNT OF BREAKS BACK
SETZRO NVWKS,TTNETW(T2) ;CANCEL WAKEUP SEEN
NVTRRR: STKVAR<NVTCH>
NVTRR0: SETZM NVTCH ;ASSUME ZERO COMMAND
JE NVRCS,TTNETW(T2),NVTRR1 ;ANY CHANGE IN STATE?
; NO, BYPASS THIS NONSENSE.
CALL GTBRKC ;GET BREAK CLASSES
MOVEM T1,NVTCH ;SAVE THAT
CALL GTSPCC ;GET BREAK CLASS FOR SPECIAL ECHO CHAR.
IORM T1,NVTCH ;MUST BREAK ON ALL OF THEM
SKIPE T1 ;ANY SPECIAL BREAKS?
MOVEI T1,2 ;YES, SUPPRESS ECHO OF BREAKS
MOVE T3,TTFLGS(T2) ;GET FLAGS
TXNN T3,<TT%ECO!TT%ECM> ;NO ECHO WANTED?
IORI T1,6 ;SUPPRESS ALL ECHOES
TXC T3,<TT%ECO!TT%ECM>
TXCN T3,<TT%ECO!TT%ECM> ;SUPPRESS ECHOES OF BREAKS?
IORI T1,2 ;YES, ...
IORI T1,11 ;CAUSE BREAK CLASS TO CHANGE
HRLM T1,NVTCH ;SAVE THE COMMAND
SKIPA T1,[^D10] ;NEED 4 CHARS FOR BREAK CLASSES
NVTRR1: MOVEI T1,6 ;NEED 6 FOR SB ETC
CALL NVTRSV ;RESERVE SPACE
RET ;RETURN
MOVEI T1,SBCH ;BEGINNING OF SUBNEGOTIATIONS
CALL NVTSSP ;SEND IAC-SB
MOVEI T1,RCTOPT
CALL TCOBQ ;SAY WHICH OPTION WE ARE CHANGING
HLRZ T1,NVTCH ;GET COMMAND
CALL TCOBN ;SEND THE COMMAND
JUMPE T1,NVTRR3 ;NO CHANGE, SKIP THE FOLLOWING
HRRZ T1,NVTCH ;GET NEW BREAK CLASSES
LSH T1,-8 ;GET HIGH ORDER BYTE
CALL TCOBN ;SEND IT
HRRZ T1,NVTCH ;AND LOW ORDER TOO.
CALL TCOBN ;SEND LOW ORDER BYTE
NVTRR3: MOVEI T1,SECH ;END OF SUBNEGOTIATIONS
CALL NVTSSP ;SEND SE
LOAD T1,PBRCT,(T2) ;GET OUTSTANDING BREAKS
MOVE T3,NVTCH ;GET BREAK INFO BACK
SKIPE T3 ;SKIP IF NONE
MOVEM T3,TTBRKC(T2) ;SET NEW CURRENT BREAK CLASSES
SOS T1 ;DECREMENT OUTSTANDING BRKS
STOR T1,PBRCT,(T2) ;STORE BACK
SETZRO NVRCS,TTNETW(T2) ;CANCEL STATE CHANGE
OKSKD1
JUMPN T1,NVTRR0 ;REPEAT IF BREAKS STILL OUTSTANDING
RET
; TABLE OF BREAK CLASS FOR EACH CHARACTER
U==1
L==2
N==4
FC==10
CC==20
P6==40
P7==100
P8==200
P9==400
CHWTB: BYTE(9)CC,CC,CC,CC,CC,CC,CC,CC ; ^@ - ^G
BYTE(9)FC,FC,FC,FC,FC,FC,CC,CC ; ^H - ^O
BYTE(9)CC,CC,CC,CC,CC,CC,CC,CC ; ^P - ^W
BYTE(9)CC,CC,CC,CC,CC,CC,CC,FC ; ^X - EOL
BYTE(9)P9,P6,P8,P8,P8,P8,P8,P8 ; SPACE - '
BYTE(9)P7,P7,P8,P8,P6,P8,P6,P8 ; ( - /
BYTE(9)N,N,N,N,N,N,N,N ; DIGITS
BYTE(9)N,N,P6,P6,P7,P8,P7,P6 ; 8, 9 - ?
BYTE(9)P8,U,U,U,U,U,U,U ; @ - G
BYTE(9)U,U,U,U,U,U,U,U ; H - O
BYTE(9)U,U,U,U,U,U,U,U ; P - W
BYTE(9)U,U,U,P7,P8,P7,P8,P8 ; X - _
BYTE(9)P8,L,L,L,L,L,L,L ; ' - g
BYTE(9)L,L,L,L,L,L,L,L ; h - o
BYTE(9)L,L,L,L,L,L,L,L ; p - w
BYTE(9)L,L,L,P7,P7,P7,P8,CC ; x - RUBOUT
;GTBRKC - GET TERMINAL BREAK CLASSES
;ACCEPTS:
; T2/ DYNAMIC DATA ADDRESS
;RETURNS +1: ALWAYS
; T1/ BREAK CLASSES
GTBRKC: SETZ T1,
MOVE T3,TTFLGS(T2)
TXNE T3,TT%WKA ;BREAK ON ALPHANUMERICS
TRO T1,7 ;UPPER AND LOWER CASE AND NUMBERS
TXNE T3,TT%WKP ;PUNCTUATION
TRO T1,740
TXNE T3,TT%WKN ;NON-FORMATTING CONTROLS
TRO T1,20
TXNE T3,TT%WKF ;FORMATTERS
TRO T1,10
RET
;GTSPCC - GET BREAK CLASS FOR CHARACTERS NEEDING SPECIAL ECHOES
;ACCEPTS:
; T2/ ADDRESS OF DYNAMIC DATA
;RETURNS +1: ALWAYS
; T1/ BREAK CLASS FOR CHARACTERS NEEDING SPECIAL OUTPUT
GTSPCC: STKVAR<NVCOC1,NVCOC2,NVFMCC>
CALL TTYGPI ;GET PI CHARACTERS AS COCFORMAT
MOVE T1,NVCOC1 ;SAVE COC WORDS FROM TTYGPI
MOVE T3,NVCOC2
CALL TTRCOC ;GET CONTROL CHAR OUTPUT MODES
ANDCMI T3,377 ;ONLY CONTROL CHARACTERS
IORI T3,2B<40*2-^D36+1> ;FAKE A NORMAL ECHO FOR SPACE
ANDCM T3,NVCOC2 ;FORCE ZEROES FOR INT CHARS
ANDCM T1,NVCOC1
XOR T1,NVTNMD ;COMPARE TO ASSUMED ECHO MODE
XOR T3,NVTNMD+1
MOVE T1,NVFMCC ;SAVE T1
MOVEI T1,FC ;ASSUME NEEDS FORMATTERS
EXCH T1,NVFMCC ;SAY SO AND GET T1 BACK
TDZN T1,[BYTE (2)0,0,0,0,0,0,0,0,3,3,3,3,3,3]
TDNE T3,[BYTE (2)0,0,0,0,0,0,0,0,0,0,0,0,0,3]
SKIPA
SETZM NVFMCC ;NOT NEEDED AFTER ALL
TDZN T1,[BYTE (2)3,3,3,3,3,3,3,3,0,0,0,0,0,0,3,3,3,3]
TDNE T3,[BYTE (2)3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3]
MOVEI T1,CC ;NEED SPECIAL ECHO FOR NON-FORMATTERS
IOR T1,NVFMCC
TRNE T3,<BYTE (2)0,0,0,0,0,0,0,0,0,0,0,0,0,0,3> ; SPACE?
IORI T1,P9 ;NEED SPECIAL ECHO FOR SPACE
RET
;TTYGPI - GET NORMAL MODES FOR ECHO (MUST AGREE WITH THAT IN USER TELNET)
;ACCEPTS:
; T2/ ADDRESS OF DYNAMIC DATA
;RETURNS +1: ALWAYS
; T1/ COC1 WORD BASED ON INTERRUPT CHARACTERS
; T3/ COC2 WORD BASED ON INTERRUPT CHARACTERS
TTYGPI: STKVAR<NVTCC1,NVTCC2,NVDYND>
SETZM NVTCC1 ;ZERO COC TYPE WORDS HERE
SETZM NVTCC2
MOVEM T2,NVDYND ;NEED THIS ACCUMULATOR
MOVE T1,TTPSI(T2) ;GET PSI BITS
ANDCMI T1,77 ;MASK OUT EXTRANEOUS BITS
TRZE T1,100 ;IS SPACE AN INTERRUPT?
TRO T1,10 ;YES, SET BIT 40(8)
TRZE T1,20 ;RUBOUT?
TRO T1,4 ;SET BIT 41(8)
LSH T1,-1 ;AVOID SIGN BIT
TTGPI1: MOVN T2,T1 ;COMPLEMENT ALL BUT RIGHTMOST 1
AND T2,T1 ;GET JUST THAT BIT
ANDCAM T2,T1 ;CLEAR IT
MUL T2,T2 ;SQUARE IT
LSH T3,1 ;FILL THE GAP
IORB T3,NVTCC2 ;OR IN BITS
IORB T2,NVTCC1
JUMPN T1,TTGPI1 ;LOOP TILL ALL ARE DONE
LSHC T2,1
IOR T2,NVTCC1 ;OR IN BITS
IOR T3,NVTCC2
LSHC T2,1
MOVE T1,T2 ;MOVE FIRST WORD TO T1
MOVE T2,NVDYND ;RESTORE ADDRESS OF DYNAMIC DATA
RET
NVTNMD: BYTE (2)0,0,0,0,0,0,0,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2
REPEAT 0,<
;NVTXWW - RCTE SET NVWKS
;ACCEPTS:
; T2/ ADDRESS OF DYNAMIC DATA
;RETURNS +1: ALWAYS
NVTXWW: SETONE NVWKS,TTNETW(T2) ;SET WAKEUP SEEN
RET
>;END OF REPEAT 0
REPEAT 0,<
;NVTXWK - RCTE CHECK FOR READING BREAK CHARACTERS AND SEND RCTRST IF NEEDED
;ACCEPTS:
; T1/ CHARACTER
; T2/ ADDRESS OF DYNAMIC DATA
;RETURNS +1: ALWAYS
NVTXWK: SKIPL TTNETW(T2) ;THAT IS STILL CONNECTED
CALL CKNNVT ;AND USING NEW PROTOCOL
RET ;NO, RETURN
PUSH P,T3 ;PRESERVE T3
MOVEI T3,(1B<RCTOPT+WILOPT>) ;RCTE OPTION REQUEST
TDNN T3,NVTOPF(T2)
JRST NVTXWX ;NO
JE NVWKS,TTNETW(T2),NVTXW1 ;JUST SAW WAKEUP? SEND A RCTE RESET
PUSH P,T1
CALL NVTXGA ;NOW SEND THIS ONE
POP P,T1 ;RESTORE AC1
NVTXW1: PUSH P,T1 ;SAVE ALL 8 BITS
ANDI T1,177 ;TABLE IS 128 LONG
LDB T1,PCLASS ;GET THE WAKEUP CLASS OF THIS CHAR
LOAD T3,TT%WAK,TTFLGS(T2) ;AND OF THIS LINE
TDNN T3,T1 ;IS THIS A WAKEUP?
JRST [POP P,T1 ;NO. RESTORE THE CHARACTER
JRST NVTXWX] ;DON'T WAKE IT.
POP P,T1 ;YES. RESTORE THE CHARACTER
SETONE NVWKS,TTNETW(T2) ;REMEMBER WE SAW IT
NVTXWX: POP P,T3 ;RETORE T3
RET
>;END OF REPEAT 0
REPEAT 0,<
;NVTCIB - NVT CLEAR INPUT BUFFER
;NEEDS NEW PROTOCOL FEATURE TO WORK PROPERLY
;ACCEPTS:
; T2/ ADDRESS OF DYNAMIC DATA
; FNCALL OFF TTVT30
;RETURN +1: ALWAYS
NVTCIB: SKIPL TTNETW(T2) ;STILL CONNECTED TO NETWORK?
CALL CKNNVT ;AND NEW STYLE NVT?
RET ;NO. DONE
MOVEI T1,RCTOPT ;USE RCTE OPTION IN REVERSE
SKIPN INSKED ;ARE WE IN THE SCHEDULER?
SKIPE NSKED ;OR NO SKED
SKIPA ;YES SKIP CALL
CALL NVTNGT ;TO CLEAR INPUT BUFFER
SETZRO PBRCT,(T2) ;CLEAR BREAK COUNT
RET
>;END OF REPEAT 0
REPEAT 0,<
;NVTXPI - NOTE CHANGE IN PSI SET
;ACCEPTS:
; T2/ ADDRESS OF DYNAMIC DATA
;RETURNS +1: ALWAYS
NVTXPI: CALL CKNNVT
RET
MOVEI T3,NVTOPF(T2) ;GET CURRENTLY ON OPTIONS
TDNN T3,(1B<RCTOPT+WILOPT>) ;RCTE OPTION REQUEST
JRST NVTXP1 ;NO
SETONE NVRCS,TTNETW(T2) ;NOTE STATE CHANGE
RET
>;END OF REPEAT 0
;NVTCOB - NVT CLEAR OUTPUT BUFFER CALLED FROM TTCBF2
;ACCEPTS:
; T2/ ADDRESS OF DYNAMIC DATA
; FNJRST OFF TTVT02
;RETURNS +1: ALWAYS
NVTCOB: CHNON DLSCHN
SKIPE INSKED ;IN SCHEDULER
RET ;YES RETURN IMMEDIATELY
OKSKED
SKIPG TTNETW(T2) ;STILL CONNECTED TO NETWORK?
JRST NVTCO3 ;NO. RETURN
NOINT ;PROTECT POSSIBLE ILOCKS
PUSH P,T2
LOAD T2,PTNTO,(T2) ;OUTPUT UNIT
LOAD T1,ANFHS,(T2) ;GET FOREIGN HOST
LOAD T2,ANLNK,(T2) ;GET LINK NUMBER
CALL IMPINS ;SEND CONTROL MESSAGE
POP P,T2 ;RESTORE REGISTERS
CALL CKNNVT ;NEW STYLE NVT?
JRST NVTCO1 ;OLD STYLE
MOVEI T1,DMCH ;DATA MARK CHARACTER
CALL NVTSSP ;SEND NEW DM
JRST NVTCO2
NVTCO1: MOVEI T1,1 ;RESERVE ONE CHARACTER
CALL NVTRSV ;GO REESERVE IT
JRST NVTCO2 ;NONE AVAILABLE CANNOT WAIT
MOVEI T1,200
CALL TCOBN ;SEND CHARACTER
OKSKD1
NVTCO2: OKINT
NVTCO3: CALL TTXON ;REACTIVATE OUTPUT IF NECESSARY
RET
;TTCOBN - NVT CLEAR OUTPUT BUFFERS
;ENTERS CLEAR BUFFER ROUTINE AFTER DEVICE DEPENDENT CODE TO PREVENT
; LOOPING
;ACCEPTS:
; T2/ ADDRESS OF DYNAMIC DATA
;RETURNS +1: ALWAYS
TTCOBN: NOSKD1
CHNOFF DLSCHN
CALLRET TTCOB5 ;GO CLEAR BUFFERS
;NVTDOB - PERFORM DOBE SEQUENCE CALLED FROM TTDOBE
;ACCEPTS:
; T2/ ADDRESS OF DYNAMIC DATA
; FNJRST OFF TTVT31
;RETURNS +1: ALWAYS
NVTDOB: CALL CKNNVT ;NEW NVT?
RET ;NO. JUST RETURN
MOVEI T1,TMKOPT ;TIMING MARK OPTION
CALL NVTNGT ;GO NEGOTIATE OPTION
JFCL ;IGNORE FAILURE
RET
;NVTPAR - CHECK STPAR ARGUMENT AND NEGOTIATE ANY NEEDED OPTIONS
;ACCEPTS:
; T1/ NEW JFN MODE WORD
; T2/ ADDRESS OF DYNAMIC DATA
; FNCALL OFF TTVT08
;RETURNS +1: ALWAYS
NVTPAR: STKVAR<NVJFMW>
MOVEM T1,NVJFMW ;SAVE NEW JFN MODE WORD
CALL CKNNVT ;NEW NVT?
JRST NVTPA1 ;NO OLD STYLE
MOVE T3,T1 ;COPY NEW STATE
XOR T1,TTFLGS(T2) ;GET DIFFERENCE
TXNN T1,TT%DUM ;CHANGE IN ECHO?
JRST NVTPA2 ;NO, TRY NEXT
MOVX T1,ECHOPT+WILOPT ;ECHO OPTION REQUEST
TXNN T3,TT%DUM ;NEGOTIATE ON?
SKIPA T3,[IFIW!NVTNGT] ;YES NEGOTIATE ECHO
MOVE T3,[IFIW!NVTNGF] ;NO
CALL @T3 ;CALL THE ROUTINE
SKIPA ;SET TO LINE HALF DUPLEX
JRST NVTPA2 ;CHECK FOR OTHER NEGOTIATIONS
SETONE TT%DUM,NVJFMW ;SET IT TO LINE HALF DUPLEX
NVTPA2: ;OTHER CHECKS GO HERE IF ANY
NVTPAX: MOVE T1,NVJFMW ;RESTORE NEW JFN MODE WORD
RET
NVTPA1: XOR T1,TTFLGS(T2) ;GET ANY CHANGES
TXNN T1,TT%DUM ;DUPLEX MODE
JRST NVTPAX ;NONE EXIT
MOVE T1,NVJFMW
TXNE T1,TT%DUM ;IS NEW FULL?
SKIPA T1,[204] ;NO. SEND "YOU ECHO"
MOVEI T1,203 ;YES. SEND "I ECHO"
CALL TCOBN
JRST NVTPAX ;RETURN
REPEAT 0,<
;NVTMOD - CHECK SFMOD ARGUMENT AND NEGOTIATE ANY OPTIONS NEEDED
;ACCEPTS:
; T1/ NEW JFN MODE WORD
; T2/ ADDRESS OF DYNAMIC DATA
;RETURN +1: ALWAYS
NVTMOD: STKVAR<MDJFMW,MDDIFW,MDRADD>
CALL CKNNVT ;NEW NVT?
RET ;NO. DO NOTHING
MOVEM T1,MDJFMW ;SAVE NEW JFN MODE WORD
MOVE T3,T1 ;COPY OF ARGUMENT
XOR T1,TTFLGS(T2) ;GET BIT DIFFERENCE
MOVEM T1,MDDIFW ;SAVE DIFFERENCE
TRNN T1,1B29 ;CHANGE IN BINARY?
JRST NVTMO1 ;NO. TRY OTHER OPTIONS
TRNN T3,1B29 ;BINARY REQUESTED
SKIPA T3,[IFIW!NVTNGT] ;YES NEGOTIATE BINARY
MOVE T3,[IFIW!NVTNGF] ;NO
MOVEM T3,MDRADD ;SAVE ROUTINE ADDRESS
MOVEI T1,BINOPT ;REQUEST FOR BINARY
CALL @T3 ;CALL THE ROUTINE
JRST [ MOVEI T1,1B29 ;SET TO ASCII
IORM T1,MDJFMW ; IN NEW JFN MODE WORD
JRST NVTMO1] ;GO TO NEXT OPTION
MOVEI T1,BINOPT+WILOPT ;BINARY REQUEST
MOVE T3,MDRADD ;GET ROUTINE ADDRESS
CALL @3 ;REQUEST OPTION
JRST [ MOVEI T1,BINOPT ;BINARY
CALL NVTNGF ;TELL HIM NO
JFCL
MOVEI T1,1B29 ;SET TO ASCII
IORM T1,MDJFMW ; IN JFN MODE WORD
JRST NVTMO1] ;TRY NEXT OPTION
NVTMO1: MOVE T3,MDDIFW ;GET BIT DIFFERENCE
MOVEI T1,(1B<RCTOPT+WILOPT>)
TDNE T1,NVTOPF(T2) ;NO RCTE ON?
TRNN T3,TT%WAK+TT%ECO+TT%ECM ;OR NO CHANGE IN WAKEUP SET
JRST NVTMO2 ;NO,, SKIP FOLLOWING
SETONE NVRCS,TTNETW(T2) ;NOTE CHANGE IN RCTE SETTINGS
NVTMO2: MOVE T1,MDJFMW ;GET BACK JFN MODE WORD
RET
>;END OF REPEAT 0
;NVTNGT - NEGOTIATE AN OPTION
;ACCEPTS:
; T1/ OPTION REQUEST
; T2/ ADDRESS OF DYNAMIC DATA
;RETURN +1: FAILURE COULD NOT GET OPTION
; +2: SUCCESS GOT OPTION
NVTNGT: MOVEI T3,[IFIW!NVTXWL ;GET ADDRESS OF WILL
IFIW!NVTXDO] ; AND DO ROUTINES
CALL NVTNGC ;GO NEGOTIATE THEM
AOS 0(P) ;SUCCESS
RET ;FAILURE
;NVTNGF - REFUSE OPTION
;ACCEPTS:
; T1/ OPTION REQUEST
; T2/ ADDRESS OF DYNAMIC DATA
;RETURN +1: SUCCESS REFUSED OPTION
; +2: FAILURE COULD NOT REFUSE OPTION
NVTNGF: MOVEI T3,[IFIW!NVTXWN ;GET ADDRESS OF WON'T
IFIW!NVTXDN] ; AND DON'T ROUTINES
NVTNGC: CAIL T1,MAXOPT ;LEGAL OPTION
RET ;NO
STKVAR<NNGOPT,NNGADD,NNGDAD>
MOVEM T1,NNGOPT ;SAVE OPTION
MOVEM T2,NNGDAD ;AND ADDRESS OF DYNAMIC DATA
MOVEM T3,NNGADD ;AND ADDRESS OF ROUTINES
MOVE T3,BITS(T1) ;CONVERT OPTION TO FLAG BITS
IORM T3,NVTOPF(T2) ;SET OPTION NEGOTIATION IN PROGRESS BIT
TRZN T1,WILOPT ;ARE WE ASKING FOR THIS OPTION
AOS NNGADD ;NO. BUMP TO DO OR DON'T
MOVE T3,NNGADD ;GET ADDRESS OF ROUTINE
CALL @0(T3) ;SAY "DO, WIL, DONT, WONT"
MOVE T1,NNGOPT ;GET OPTION BACK
ROT T1,-9 ;INTO TOP 9 BITS
MOVE T2,NNGDAD ;GET DYNAMIC DATA ADDRESS
CALL TTYDIS ;SET UP FOR DISMISS
MOVE T2,NNGDAD ;GET DYNAMIC DATA ADDRESS
DYNST ;GET STATIC LINE NUMBER
MOVSS T2 ;MOVE IT TO THE LEFT HALF
IOR T1,T2 ;LINE NUMBER IN 9-17
HRRI T1,NVTNTT ;ACTIVATION TEST
MDISMS
MOVE T2,NNGDAD ;GET ADDRESS OF DYNAMIC DATA
CALL TTYAWK ;GO NOINT AGAIN
SETZRO NVTMO,TTNETW(T2) ;CANCEL ANY TIME-OUT IN PROGRESS
MOVE T1,NNGOPT ;GET OPTION AGAIN
MOVS T3,BITS(T1) ;CONVERT TO FLAG
TDNN T3,NVTOPF(T2) ;IS IT OFF
AOS 0(P) ;SKIP IF SUCCESSFUL
RET
;NVTNTT - WAIT ROUTINE FOR NVT NEGOTIATIONS
;ACCEPTS T1/ BITS 18-26 OPTION NUMBER
; BITS 27-35 TTY NUMBER
NVTNTT: LDB T3,[POINT 9,1,26] ;GET OPTION NUMBER
MOVE T3,BITS(T3)
ANDI T1,777 ;LINE NUMBER
MOVE T2,T1 ;GET LINE NUMBER IN T2
CALL STADYN ;GET ADDRESS OF DYNAMIC DATA
JRST T1(T4) ;NOT ACTIVE. THIS SHOULD NOT HAPPEN
SKIPE TTNETW(T2) ;SATISFIED IF DISCONNECTED
TDNN T3,NVTOPF(T2)
JRST 1(T4) ;NEGOTIATION COMPLETE
JRST 0(T4)
;CHECK OVERDUE NEGOTIATIONS
NEGCHK::STKVAR<NVTCTR>
MOVE T2,NVTPTR ;POINTER TO NVTS
NEGCKL: MOVEM T2,NVTCTR ;SAVE NVT COUNTER
HRRZ T2,T2 ;GET JUST RIGHT HALF
CALL LCKTTY ;GET ADDRESS OF DYAMIC DATA AND LOCK
JRST NEGCKE ;NOT ACTIVE
SKIPGE TTNETW(T2) ;ATTACHED?
JRST NEGCKE ;NO, SKIP IT
MOVX T3,NVTMO ;TIME OUT
HLLZ T1,NVTOPF(T2) ;GET OUTSTANDING OPTIONS
JUMPE T1,[ANDCAM T3,TTNETW(T2) ;NONE, CANCEL TIME-OUT IF ANY
JRST NEGCKE]
XORB T3,TTNETW(T2) ;YES, COUNT COUNTER
TXNN T3,NVTMO ;COUNT FROM 1 TO 0?
HRRZS NVTOPF(T2) ;YES, CANCEL OUTSTANDING OPTION
NEGCKE: CALL ULKTTY ;UNLOCK DATA BASE
MOVE T2,NVTCTR ;GET AOBJ COUNTER
AOBJN T2,NEGCKL ;ANY MORE NVT'S
MOVE T1,TODCLK ;NO. GET TIME OF DAY
ADDI T1,NEGTM0 ;ADD TIME OUT QUANITY
MOVEM T1,NEGTIM ;SAVE TIME FOR NEXT CHECK
RET
;NETTCS - MOVE TTY OUTPUT TO NET BUFFERS
;ACCEPTS:
; T2/ ADDRESS OF DYNAMIC DATA
;RETURN +1: ALWAYS
NETTCS::MOVEI T3,(1B<RCTOPT+WILOPT>)
TDNE T3,NVTOPF(T2)
CALL CKNNVT
JRST NETTC8 ;NO RCTE
LOAD T3,PBRCT,(T2) ;LOAD BREAK COUNT
SKIPE T3 ;NEED TO SEND RESET?
CALL NVTRRR ;YES, TRY TO SEND
NETTC8: SKIPG TTNETW(T2) ;STILL CONNECTED?
JRST NETTCF ;NO, JUST CLEAR BUFFER
SETZ T4, ;INIT CHAR COUNT
MOVEI Q2,0(P) ;USE STACK AS LOCAL BUFFER
HRLI Q2,(<POINT 8,0,31>);CONSTRUCT 8-BIT BYTE PTR
LOAD Q1,PTNTO,(T2) ;GET UNIT INDEX
HLL FX,NETSTS(Q1) ;GET STATUS OF CONNECTION
TDNE FX,[EXP EOTF!DEDF] ;END OF TRANSMISSION OR DEAD HOST
JRST NETTCF ;YES, DON'T SEND ANY MORE
PUSH P,T2 ;PRESERVE DYNAMIC DATA ADDRESS
LOAD T1,LTIDX,(Q1) ;GET LINK TABLE INDEX
CALL PKCHK ;CHECK HOW MANY BYTES CAN BE SENT NOW
MOVE FX,T2 ;SAVE NUMBER OF BYTES
POP P,T2 ;GET BACK DYNAMIC DATA ADDRESS
JUMPLE FX,PKULCK ;IF NONE, GIVE UP
CAILE FX,200 ;BUT LIMIT TO 200 (40 WDS ON STACK)
MOVEI FX,200
ADJSP P,40 ;RESERVE SPACE ON STACK
PUSH P,Q2 ;SAVE BYTE PTR
SETONE TTOTP,(T2) ;INDICATE OUTPUT ACTIVE
NETTC2: SOJL FX,NETTC4 ;COUNT DOWN LIMIT
PUSH P,T2 ;SAVE ADDRESS OF DYNAMIC DATA
PUSH P,T4 ;SAVE T4
NOSKD1
CALL TTSND ;GET A CHARACTER FROM OUTPUT BUFFER
OKSKD1
POP P,T4 ;RETORE T4
POP P,T2 ;GET BACK DYNAMIC DATA ADDRESS
JE TTOTP,(T2),NETTC5 ;DID WE GET A CHARACTER?
IDPB T3,Q2 ;YES. PUT CHAR ON STACK BUFFER
AOJA T4,NETTC2
NETTC4: SETZRO TTOTP,(T2) ;CLEAR OUTPUT ACTIVE BIT
NETTC5: POP P,T3 ;GET BACK BYTE POINTER
JUMPE T4,[ADJSP P,-40 ;NO CHARS TO SEND, CLEAR STACK
LOAD T1,LTIDX,(Q1) ;GET LINK TABLE INDEX
CALLRET PKULCK]
MOVNI T1,^D8 ;8 BIT BYTES
IMUL T1,T4 ;ADJUST BIT ALLOCATION
ADDM T1,NETBAL(Q1)
LOAD T1,LTIDX,(Q1) ;GET LINK TABLE INDEX
PUSH P,T2 ;SAVE DYNAMIC DATA ADDRESS
CALL PKMSG1 ;PACK THE MESSAGE
POP P,T2 ;RESTORE DYNAMIC DATA ADDRESS
ADJSP P,-40 ;CLEAR STACK
JRST NETTC8 ;SEE IF ANY MORE
NETTCF: CALL TTCOBN ;FLUSH OUTPUT BUFFER
LOAD T1,LTIDX,(Q1) ;GET LINK TABLE INDEX
RET
;NVTUPI - UNPACK MESSAGE INTO TTY BUFFERS
;ACCEPTS
; T1/ LT INDEX
; T2/ ADDRESS OF DYNAMIC DATA
; Q1/ IMPUN/SOCKET TABLE INDEX
NVTUPI::STKVAR<NVUPLT,NVUPCT,NVUPDD>
MOVEM T1,NVUPLT ;PRESERVE LINK TABLE INDEX
SETZM NVUPCT ;COUNT BYTES UNPACKED
MOVEM T2,NVUPDD ;SAVE DYNAMIC DATA ADDRESS
NVTUPL: MOVE T1,NVUPLT ;GET LINK TABLE INDEX
CALL UPBYT ;GET BYTE
JRST NVTUPD ;NOTHING TO UNPACK
AOS NVUPCT ;COUNT BYTES
MOVE T1,T3 ;SAVE CHARACTER
MOVE T2,NVUPDD ;GET ADDRESS OF DYNAMIC DATA
LOAD T3,NVSTP,(T2) ;GET THE CURRENT COMMAND STATE OF THIS
SETZRO NVSTP,(T2) ;ZERO CURRENT STATE
CALL @NVTSTD(T3) ;DISPATCH ON IT
JRST NVTUPL ;DO NEXT CHARACTER
NVTUPD: MOVE T4,NVUPCT ;BYTES UNPACKED
MOVE T2,NVUPDD ;GET ADDRESS OF DYNAMIC DATA
MOVE T1,NVUPLT ;RESTORE LT INDEX
IMUL T4,[-8] ;CALCULATE NEGATIVE BITS
HLRE Q1,IMPLT1(T1) ;GET CONNECTION NUMBER
ADDB T4,NETBAL(Q1) ;UPDATE BIT ALLOCATION
JUMPGE T4,NVTUP1 ;REALLOCATE
BUG(INF,IMPNEA,<NVT RECEIVED BYTES EXCEEDING ALLOCATION>)
SETZM NETBAL(Q1) ;ZERO ALLOCATION
NVTUP1: CALL NVTRAL ;REALLOCATE
MOVE T2,NVUPDD ;GET ADDRESS OF DYNAMIC DATA
RET
NVTSTD: IFIW!NVTNRM ;NOTHING DEFERRED
IFIW!NVTWIL ;DEFERRED WILL
IFIW!NVTWNT ;DEFERRED WONT
IFIW!NVTDO ;DEFERRED DO
IFIW!NVTDNT ;DEFERRED DONT
IFIW!NVTIAC ;DEFERRED IAC
IFIW!NVTNRM ;NOT USED
IFIW!NVTNRM ;NOT USED
;NVTNRM - NORMAL NVT CHARACTER PROCESSING
;ACCEPTS:
; T1/ CHARACTER
; T2/ ADDRESS OF DYNAMIC DATA
;RETURN +1: ALWAYS
NVTNRM: CAIL T1,200 ;POSSIBLE NVT CONTROL CHARACTER?
JRST NVTCTL ;PROCESS POSSIBLE NVT CONTROL CHARACTER
NVTDCH: LOAD T3,TYLMD,(T2) ;GET TERMINAL DATA MODE FOR LAST CHARACTER
JUMPE T3,NVTUPB ;BINARY, SKIP SPECIAL CHECKS
JE NVCRI,TTNETW(T2),[ ;WAS LAST CH CR?
CAIE T1,.CHCRT ;NO. IS THIS ONE?
JRST NVTUPB ;NO, PROCEED NORMALLY
SETONE NVCRI,(T2) ;YES, REMEMBER IT
JRST NVTUPB] ;AND SEND IT ON
SETZRO NVCRI,(T2) ;YES, FORGET THAT
CAIN T1,.CHLFD ;WAS THIS ONE A LINE FEED
RET ;YES, FORGET IT
NVTUPB: SETZ Q2, ;NO SPECIAL FLAGS
PUSH P,Q1 ;SAVE Q1
DYNST ;GET LINE NUMBER FOR TTCHI
NOSKD1 ;TTCHI EXPECTS TO BE CALLED NOSKED
CALL TTCHI ;STUFF IT IN TTY BUFFER
OKSKD1
POP P,Q1
RET
;NVTCTL - TELNET CONTROL CODES RECEIVED
;ACCEPTS:
; T1/ CHARACTER
; T2/ ADDRESS OF DYNAMIC DATA
;RETURN +1: ALWAYS
NVTCTL: SKIPGE TTNETW(T2) ;IF NO SOCKETS ATTACHED,
JRST NVTDCH ;IGNORE CHAR
CALL CKNNVT ;NEW STYLE NVT?
JRST NVTCT0 ;NO, LOOK FOR OLD STYLE COMMANDS
CAIE T1,IACCH ;YES, IS IAC
JRST NVTDCH ;NO, CONTINUE PROCESSING
JRST NVTCL4 ;YES. TAKE CARE OF IT
NVTCT0: CAIN T1,202 ;NOP
RET
CAIN T1,200 ;SYNC CHAR?
JRST NVTCL1
CAIN T1,203 ;ECHO OFF?
JRST NVTCL2
CAIN T1,204 ;ECHO ON?
JRST NVTCL3
JRST NVTDCH
NVTCL1: INCR PTITC,(T2) ;SYNC COUNTS 1, INS COUNTS -1
RET
NVTCL3: TDZA T1,T1 ;FULLDUPLEX ZERO AC AND SKIP
NVTCL2: MOVEI T1,.TTLDX ;LINE HALF DUPLEX
STOR T1,TT%DUM,TTFLGS(T2) ;SET DUPLEX MODE FULL/HALF
RET
;PROCESS IAC
NVTCL4: MOVEI T3,.DFIAC ;SET TO DEFFERED IAC
STOR T3,NVSTP,(T2)
RET
;NVTIAC - PROCESS BYTE AFTER IAC
;ACCEPTS:
; T1/ CHARACTER
; T2/ ADDRESS OF DYNAMIC DATA
;RETURN +1: ALWAYS
NVTIAC: CAIGE T1,SECH ;END OF SUBNEGOTIATIONS
RET ;NOT A VALID COMMAND
SETONE NVNNV,TTNETW(T2) ;MARK THIS NEW PROTOCOL
SETZ T3, ;NEXT STATE IF ANY
XCT NVTDTB-SECH(T1) ;DISPATCH ON THE CHARACTER
JRST NVTDCH ;SPECIAL FUNCTION CHARACTER
STOR T3,NVSTP,(T2) ;NEXT STATE
RET
NVTDTB: RET ;(360) END OF SUBNEGOTIATION
RET ;(361) NOP -- IGNORE
JRST NVTCL1 ;(362) NEW DATA MARK
RET ;(363) BREAK -- IGNORE
MOVEI T1,3 ;(364) IP -- CONVERT TO ^C
MOVEI T1,"O"-100 ;(365) AO -- CONVERT TO ^O
MOVEI T1,"T"-100 ;(366) AYT -- CONVERT TO ^T
MOVEI T1,177 ;(367) EC -- CONVERT TO DEL
MOVEI T1,"U"-100 ;(370) EL -- CONVERT TO ^U
RET ;(371) GA -- IGNORE
RET ;(372) SB -- SHOULDN'T GET THIS
TROA T3,.DFWIL ;(373) DEFER WILL
TROA T3,.DFWNT ;(374) DEFER WONT
TROA T3,.DFDO ;(375) DEFER DO
TROA T3,.DFDNT ;(376) DEFER DONT
JFCL ;(377) IAC IAC -- IAC
;NVTSSP - SEND SPECIAL CHARACTER
;ACCEPTS:
; T1/ CHARACTER
; T2/ ADDRESS OF DYNAMIC DATA
;RETURN +1: ALWAYS
NVTSSP: PUSH P,T1 ;SAVE CHARACTER
MOVEI T1,2 ;NEED 2 CHARACTERS
CALL NVTRSV ;RESERVE SPACE IN BUFFER (NOSKED)
JRST [ POP P,T1 ;COULDN'T GET DON'T WAIT
RET] ;RETURN
HRROI T1,IACCH ;SAME AS 377, BUT PREVENT ITS DOUBLING
CALL TCOBN ;CALL TCOBN TO GET CR-NULL IF NEEDED
POP P,T1 ;GET BACK SPECIAL CHARACTER
CALL TCOBQ ;SEND IT
OKSKD1
RET
;NVTRSV - RESERVE SPACE IN BUFFER FOR CHARACTERS SPECIFIED IN 1
;ACCEPTS:
; T1/ NUMBER OF CHARACTERS
; T2/ ADDRESS OF DYNAMIC DATA
;RETURN +1: FAILURE NO ROOM
; +2 SUCCESS
NVTRSV: NOSKD1 ;MAKE SURE SPACE DOESN'T DISAPPEAR
LOAD T3,TOMAX,(T2) ;MAXIMUM BYTES IN OUTPUT BUFFER
SUB T3,TTOCT(T2) ;SPACE IN OUTPUT BUFFERS
CAML T3,T1 ;WILL THEY FIT
RETSKP ;YES. ENOUGH ROOM, RETURN SKIP
OKSKD1
MOVE T3,FORKX ;GET FORK NUMBER
CAMN T3,NCPFRK ;IS THIS THE NCP FORK?
JRST NVTRV1 ;YES, ATTEMPT TO SEND THE BUFFER
SKIPN INSKED ;IN THE SCHEDULER
SKIPE NSKED ;OR NO SKED
RETBAD ;YES TELL HIM THERE WAS NO ROOM
PUSH P,T1 ;NO. WAIT FOR SPACE
PUSH P,T2 ;SAVE ARGUMENTS
MOVEI T1,TCOTST ;GET ADDRESS OF WAIT ROUTINE
CALL TTYDIS ;SET UP FOR DISMISS
DYNST ;GET LINE NUMBER
HRL T1,T2 ;MOVE IT TO THE LEFT HALF
MDISMS ;WAIT FOR SPACE
POP P,T2 ;RESTORE ARGUMENTS
CALL TTYAWK ;GO NOINT AGAIN
POP P,T1
JRST NVTRSV ;TRY AGAIN
NVTRV1: JN TTSFG,(T2),R ;IF STOPED RETURN
PUSH P,T1 ;SAVE NUMBER OF CHARACTERS
PUSH P,Q1 ;SAVE UNIT CALLED WITH
LOAD Q1,PTNTO,(T2) ;GET UNIT NUMBER
LOAD T1,LTIDX,(Q1) ;GET LINK TABLE INDEX
HRRZ T3,IMPLT4(T1) ;GET MSG ALLOC
SKIPE T3 ;IS THER ANY?
MOVE T3,NETBAL(Q1) ;YES. GET BIT ALLOC IF NON-ZERO MSG ALLOC
POP P,Q1 ;RESTORE UNIT CALLED WITH
LSH T3,-3 ;CONVERT TO BYTES
CAMGE T3,0(P) ;AT LEAST WHAT WE NEED?
JRST [ POP P,T1 ;NO. GIVE UP
RET]
PUSH P,T2 ;PRESERVE LINE NUMBER
CALL NETTC8 ;SEND AS MUCH AS POSSIBLE
POP P,T2 ;RESTORE ADDRESS OF DYNAMIC DATA
POP P,T1 ;AND NUMBER OF CHARACTERS WANTED
JRST NVTRSV ;AND TRY AGAIN
;NVTRFU - SEND WONT (REFUSE)
;ACCEPTS:
; T2/ ADDRESS OF DYNAMIC DATA
; OPTION ON TOP OF STACK
;RETURN +1: ALWAYS
NVTRFU: MOVEI T1,WNTCH
;NVTSRP - SEND REPLY IN 1 FOR OPTION ON STACK
;ACCEPTS:
; T1/ REPLY
; T2/ ADDRESS OF DYNAMIC DATA
; OPTION ON TOP OF STACK
;RETURN +1: ALWAYS
NVTSRP: PUSH P,T1 ;SAVE REPLY
MOVEI T1,3
CALL NVTRSV ;RESERVE SPACE FOR THREE CHARACTERS
JRST [ ADJSP P,-2 ;NO ROOM CLEAN UP STACK
RET]
HRROI T1,IACCH ;SAME AS 377 BUT PREVENT DOUBLING
CALL TCOBN ;USE TCOBN TO GET CR-NULL IF NEEDED
POP P,T1 ;GET REPLY
CALL TCOBQ ;SEND IT
POP P,T1 ;GET OPTION
CALL TCOBQ ;SEND IT
OKSKD1
RET
;NVTSWL - SEND WILL
;ACCEPTS:
; T2/ ADDRESS OF DYNAMIC DATA
; OPTION ON TOP OF STACK
;RETURN +1: ALWAYS
;NVTXWL - ENTRY FOR OPTION IN T1
NVTXWL: PUSH P,T1 ;SAVE OPTION
NVTSWL: MOVEI T1,WILCH ;ENTER HERE WHEN OPTION IS ON STACK
JRST NVTSRP ;SEND REPLY
;NVTSNR - SEND NO REPLY
;ACCEPTS:
; T2/ ADDRESS OF DYNAMIC DATA
; OPTION ON TOP OF STACK
;RETURN +1: ALWAYS
NVTSNR: ADJSP P,-1 ;NO REPLY NECESSARY OR POSSIBLE
RET
;NVTSWN - SEND WONT
;ACCEPTS:
; T2/ ADDRESS OF DYNAMIC DATA
; OPTION ON TOP OF STACK
;RETURN +1: ALWAYS
;NVTXWN - ENTRY FOR OPTION IN T1
NVTXWN: PUSH P,T1 ;SAVE OPTION
NVTSWN: MOVEI T1,WNTCH ;ENTER HERE WHEN OPTION ALREADY PUSHED
JRST NVTSRP
;NVTSDO - SEND "DO"
;ACCEPTS:
; T2/ ADDRESS OF DYNAMIC DATA
; OPTION ON TOP OF STACK
;RETURN +1: ALWAYS
;NVTXDO - ENTRY FOR OPTION IN T1
NVTXDO: PUSH P,T1 ;SAVE OPTION
NVTSDO: MOVEI T1,DOCH ;ENTER HERE WHEN OPTION ALREADY PUSHED
JRST NVTSRP
;NVTSDN - SEND "DONT"
;ACCEPTS:
; T2/ ADDRESS OF DYNAMIC DATA
; OPTION ON TOP OF STACK
;RETURN +1: ALWAYS
;NVTXDN - ENTRY FOR OPTION IN T1
NVTXDN: PUSH P,T1 ;SAVE OPTION
NVTSDN: MOVEI T1,DNTCH ;ENTER HERE WHEN OPTION ALREADY PUSHED
JRST NVTSRP
;NVTDO - PROCESS "DO"
;ACCEPTS:
; T1/ OPTION
; T2/ ADDRESS OF DYNAMIC DATA
;RETURN +1: ALWAYS
NVTDO: CAIL T1,WILOPT ;ARE WE WILLING?
JRST NVTDO1 ;NO
MOVE T3,BITS+WILOPT(T1) ;YES GET FLAG BITS
TDNE T3,NVTOPF(T2) ;OUTSTANDING REQUEST
JRST NVTWI2 ;YES GO PROCESS IT
NVTDO1: PUSH P,T1 ;REMEMBER THE OPTION
MOVSS T3 ;PUT BIT IN "OPTIONS ON" HALF
TDNE T3,NVTOPF(T2) ;IS THE OPTION ON?
JRST NVTSNR ;YES, SEND NO REPLY
CAIGE T1,NVTLOP ;DO WE KNOW ABOUT THIS OPTION
CALL @NVTDOD(T1) ;YES. ATTEMPT EXECUTION
JRST NVTRFU ;CAN'T DO IT -- REFUSE
IORM T3,NVTOPF(T2) ;SET OPTION ON
JRST NVTSWL ;AND SEND "WILL"
NVTDOD: IFIW!R ;BINARY XMIT -- REFUSE FOR NOW
IFIW!NVTECN ;TURN ECHOS ON
IFIW!R ;RECONNECT -- REFUSE FOR NOW
IFIW!NVTSGA ;SUPPRESS GA -- WONDERFUL NEWS
IFIW!R ;MESSAGE SIZE -- REFUSE
IFIW!R ;STATUS -- REFUSE
IFIW!NVTDTM ;TIMING MARK -- TRY TO DO IT
; IFIW!NVTDRC ;REMOTE CONTROLLED TRANS & ECHO
IFIW!R ;DO NOT DO IT FOR NOW
NVTLOP=.-NVTDOD
;ACTION ROUTINES FOR "DO"
;TURN ECHOES ON
NVTECN: MOVX T1,TT%DUM
ANDCAM T1,TTFLGS(T2) ;SET TO FULL DUPLEX
RETSKP
;SET SUPPRESS GA BIT
NVTSGA: SETONE NVGAB,TTNETW(T2)
RETSKP
;DO TIMING MARK PROTOCOL
NVTDTM: RETSKP
REPEAT 0,<
;TURN ON RCTE
NVTDRC: SETONE NVRCS,TTNETW(T2) ;END CURRENT STATE INFO WITH FIRST CMD
SETZM TTBRKC(T2) ;CLEAR BREAK STATUS INFO
MOVEI T1,1
STOR T1,PBRCT,(T2) ;SEND ONE RCTE COMMAND TO START
RETSKP ;WE ARE HAPPY TO DO RCTE
>;END OF REPEAT 0
;NVTDNT - PROCESS "DONT"
;ACCEPTS:
; T1/ OPTION
; T2/ ADDRESS OF DYNAMIC DATA
;RETURN +1: ALWAYS
NVTDNT: CAIL T1,WILOPT ;ARE WE WILLING FOR THIS OPTION
JRST NVTDN1 ;NO
MOVE T3,BITS+WILOPT(T1) ;GET FLAG BITS
TDNE T3,NVTOPF(T2) ;OUTSTANDING REQUEST
JRST NVTWN2 ;YES
NVTDN1: PUSH P,T1 ;SAVE OPTION
MOVSS T3 ;PUT BIT IN "OPTION ON" HALF
TDNN T3,NVTOPF(T2) ;OPTION ALREADY OFF?
JRST NVTSNR ;YES. SEND NO REPLY
CAIGE T1,NVTLOP ;DO WE KNOW ABOUT THIS OPTION?
CALL @NVTDND(T1) ;YES. PERFORM ACTION
ANDCAM T3,NVTOPF(T2) ;CLEAR THE OPTION
JRST NVTSWN ;AND SEND "WON'T"
NVTDND: IFIW!R ;DILEMMA -- HE WANTS OFF, BUT WE CAN'T
IFIW!NVTECF ;ECHO OFF
IFIW!R ;OPTION NOT ON, NO REPLY
IFIW!NVTAGA ;HE WONT SUPPRESS GA -- NUTS
IFIW!R ;MESSAGE SIZE OPTION
IFIW!R ;STATUS OPTION
IFIW!R ;TIMING MARK -- HUH?
IFIW!R ;TURN OFF RCTE
;"DONT" ACTION ROUTINES
;TURN ECHOS OFF
NVTECF: MOVX T1,TT%DUM ;DUPLEX MODE
IORM T1,TTFLGS(T2) ;SET TO LINE HALF DUPLEX
RET
;TURN OFF SUPPRESS GA BIT
NVTAGA: SETZRO NVGAB,TTNETW(T2)
RET
NVTWIL - ;PROCESS "WILL"
;ACCEPTS:
; T1/ OPTION
; T2/ ADDRESS OF DYNAMIC DATA
;RETURN +1: ALWAYS
NVTWIL: CAIL T1,WILOPT ;ONLY WILOPT OPTIONS
JRST NVTWI1 ;OTHERS CANNOT BE OUTSTANDING
MOVE T3,BITS(T1) ;GET THE BIT FOR THE OPTION
TDNN T3,NVTOPF(T2) ;IS THIS OPTION OUTSTANDING?
JRST NVTWI1 ;NO.
NVTWI2: MOVS T1,T3 ;PUT BITS IN OPTION ON HALF
IORM T1,NVTOPF(T2) ;SET WILL BIT
ANDCAM T3,NVTOPF(T2) ;AND CLEAR OUTSTANDING BIT
RET
NVTWI1: PUSH P,T1 ;SAVE THE OPTION
MOVSS T3 ;PUT BIT IN "OPTONS ON" HALF
TDNE T3,NVTOPF(T2) ;IS OPTION ALREADY ON?
JRST NVTSNR ;YES. SEND NO REPLY
CAIGE T1,NVTLOP ;LEGAL OPTION?
CALL @NVTWID(T1) ;YES. CALL ACTION ROUTINE
JRST NVTSDN ;UNIMPLEMENTED OPTION OR CAN'T COMPLY
IORM T3,NVTOPF(T2) ;DONE. SET OPTION "ON"
JRST NVTSDO ;AND SEND "DO"
NVTWID: IFIW!R ;WILL BINARY -- DONT
IFIW!R ;WILL ECHO -- DONT
IFIW!R ;RECONNECT -- DONT
IFIW!RSKP ;SUPPRESS GA -- DO, DO, DO , DO!
IFIW!R ;MESSAGE SIZE -- DONT
IFIW!R ;STATUS -- DONT
IFIW!R ;TIMING MARK -- HUH?
IFIW!R ;WHAT'S HE TRYING TO DO?
;NVTWNT - PROCESS "WONT"
;ACCEPTS:
; T1/ OPTION
; T2/ ADDRESS OF DYNAMIC DATA
;RETURN +1: ALWAYS
NVTWNT: CAIL T1,MAXOPT ;LEGAL OPTION
JRST NVTWN1 ;NO. OPTION NOT HANDLED
MOVE T3,BITS(T1) ;GET BIT FOR OPTION
TDNN T3,NVTOPF(T2) ;IS THIS OPTION OUTSTANDING
JRST NVTWN1 ;NO. REQUEST
NVTWN2: HLR T3,T3 ;YES. NEG ACKNOWLEDGE
ANDCAM T3,NVTOPF(T2) ;CLEAR BOTH OUTSTAND AND WILL FLAGS
RET
NVTWN1: PUSH P,T1 ;SAVE OPTION
MOVSS T3 ;PUT BIT IN "OPTIONS ON" HALF
TDNN T3,NVTOPF(T2) ;OPTION ALREADY OFF?
JRST NVTSNR ;YES. SEND NO RPLY
ANDCAM T3,NVTOPF(T2) ;STRANGELY ENOUGH, THE USER END
JRST NVTSDN ;NEVER HAS ANY OPTIONS TO TURN OFF
;NVTRAL - RE-ALLOCATE IF NEEDED TO BRING ALLOCATION UP TO OPERATING LEVEL
;ACCEPTS:
; T2/ ADDRESS OF DYNAMIC DATA
; Q1/ SOCKET TABLE INDEX (IMPUN)
;RETURN +1: ALWAYS
NVTRAL::CALL LCKNCP ;PREVENT NCP CHANGES
HLL T1,NETSTS(Q1) ;CHECK STATUS OF CONNECTION
TDNE T1,[EXP EOTF!DEDF] ;END OF TRANSMISSION OR DEAD HOST
JRST ULKNCP ;CONNECTION DEAD OR DONE
LOAD T3,TIMAX,(T2) ;CAPACITY OF LINE
SUB T3,TTICT(T2) ;GIVES SPACE NOW IN LINE BUFFER
JUMPE T3,[LOAD T1,PTITC,(T2) ;IF FULL, CHECK FOR INS RECEIVED
TRNE T1,4 ;COUNT IS SYNC-INS, 3 BIT FIELD
MOVEI T3,1 ;INS REQUESTED, ALLOCATE 1 BYTE
JRST .+1]
LSH T3,3 ;IMULI 3,8 (BYTE SIZE)
SUB T3,NETBAL(Q1) ;DESIRED ALL LESS ALL NOW OUT
MOVE T4,T3 ;SAVE DIFFERENCE
LOAD T1,LTIDX,(Q1) ;GET LINK TABLE INDEX
HRRZ T3,IMPLT4(T1) ;CURRENT MSG ALLOC
MOVN T3,T3 ;MAKE POSITIVE
ADDI T3,^D6 ;RAISE IT TO 6
LOAD T1,TIMAX,(T2) ;MAX SPACE IN BUFFER
ASH T1,-1 ;ONE-HALF
CAMGE T4,T1 ;RE-ALLOCATE IF MORE THAN HALF A BUFFER
CAIL T3,4 ;OR IF MORE THAN 3 MSGS
SKIPA ;YES. RE-ALLOCATE
JRST ULKNCP ;NO LEAVE
LOAD T1,ANFHS,(Q1) ;GET FOREIGN HOST
LOAD T2,ANLNK,(Q1) ;GET LINK NUMBER
CALL IMPALL ;GO ALLOCATE IT
CALLRET ULKNCP ;UNLOCK ON THE WAY OUT