.TITLE LTY - LOCAL PORTION OF VIRTUAL TERMINAL SUPPORT .SBTTL LTY - TITLE PAGE .IDENT /V01.01/ ; ; ************************************************************************ ; * ; THIS PROGRAM IS PROVIDED ON AN "AS IS" BASIS ONLY. DIGITAL EQUIPMENT * ; COMPUTER USER'S SOCIETY, DIGITAL EQUIPMENT CORPORATION, MONSANTO, AND * ; THE AUTHOR DISCLAIM ALL WARRANTIES ON THE PROGRAM, INCLUDING WITHOUT * ; LIMITATION, ALL IMPLIED WARRANTIES OF MERCHANTABLITY AND FITNESS. * ; * ; FULL PERMISSION AND CONSENT IS HEREBY GIVEN TO DECUS AND TO THE DECUS * ; SPECIAL INTEREST GROUPS TO REPRODUCE, DISTRIBUTE, AND PUBLISH AND * ; PERMIT OTHERS TO REPRODUCE IN WHOLE OR IN PART, IN ANY FORM AND * ; WITHOUT RESTRICTION, THIS PROGRAM AND ANY INFORMATION RELATING THERETO * ; * ; ************************************************************************ ; ; THIS TASK PROVIDES VTY SUPPORT FROM AN RSX-11M SYSTEM. ; ; VERSION: V01.01 ; ; AUTHOR: D.A. PURVIS MAPC 10-NOV-78 ; ; MODIFICATION HISTORY: ; ; V01.01 RWS 03-AOR-79 CORRECT MINOR ERRORS .SBTTL LTY - DOCUMENTATION ; ;+ ; THIS PROGRAM IS THE LOCAL SIDE OF VIRTUAL TERMINAL SUPPORT. THE REMOTE ; SIDE IS VTY. ; ; TO OVERCOME THE LACK OF A FULL DUPLEX TERMINAL DRUVER, THE TERMINAL IS ; ATTACHED, AND ALL INPUT FROM THE TERMINAL IS CAPTURED BY AN AST. THE AST ; RUNS IN TWO MODES OF OPERATION. IN REGULAR MODE, THE AST ECHOS THE ; CHARACTERS, BUFFERS THEM, AND SENDS THEM TO THE REMOTE COMPUTER WHEN ; IT RECOGNIZES A TERMINATING CHARACTER. IN ODT MODE, THE AST DOES NOT ; ECHO THE CHAR OR BUFFER THE CHAR, BUT RATHER SENDS IT IMMEDIATELY TO THE ; REMOTE COMPUTER. THE REMOTE COMPUTER WILL ECHO THE CHARACTER. ; ; IT IS POSSIBLE TO LOSE CHARACTERS ON INPUT, ALL CHARS TYPED WHILE THE ; PROGRAM IS INSIDE THE INPUT AST CODE WILL BE LOST. FOR THIS REASON, ; AST'S ARE DISABLED IN TWO PLACES: ; ; 1) IN REGULAR MODE, AST'S ARE DISABLED AFTER A TERMINATING CHAR IS ; RECOGNIZED. WHENEVER A TERMINATING CHAR IS INPUTTED IN REGULAR MODE ; A MARKER CHAR IS ADDED TO THE BUFFER THAT IS SENT TO THE REMOTE NODE. ; THE REMOTE NODE WILL RETURN THE MARKER CHAR WHEN IT RECOGNIZES ONE. ; AST'S WILL BE ENABLED WHEN THE MARKER CHAR IS RECOGNIZED IN THE ; DECNET BUFFER RECEIVED FROM THE REMOTE NODE. WHILE WAITING FOR THIS ; RETURNED MARKER, DISABLING AST'S SHOULD PREVENT TYPED CHARS FROM BEING ; LOST SINCE THE SYSTEM SHOULD BE QUEUEING UP THE AST'S. ; ; 2) AST'S ARE ALSO DISABLED WHILE INSIDE THE VARIOUS MARK TIME LOOPS. ; THESE LOOPS ARE USED TO SEQUENTIALLY ORDER I/O TO THE TERMINAL. ; ; NOTE THAT WHEN OUTPUTTING RECEIVED BUFFERS FROM DECNET, THE CODE ; DOES NOT LOOK AT THE TTY BUSY FLAG(TTYBSY). ONLY WHEN TRYING TO ECHO ; CHARS, OR PRINT MESSAGES GENERATED INTERNALLY TO LTY DOES THE CODE ; WAIT FOR TTYBSY = 0. ; ; NOTE THAT SINCE ^O IS NOT PASSED TO THE AST FOR AN ATTACHED TERMINAL, ; THIS PROGRAM WILL USE ^B FOR THAT FUNCTION. THEREFORE, WHILE RUNNING ; THIS PROGRAM, ^B WILL DISABLE OUTPUT JUST AS ^O DOES FOR NORMAL ; PROGRAMS. WHEN THIS PROGRAM SEES A ^B, IT WILL SEND A ^O TO THE ; REMOTE NODE SO THAT THE REMOTE NODE WILL KNOW THAT THE USER WANTS ; TO DISABLE OUTPUT. ; ; THE FOLLOWING ARE DIRECTIVE ERROR NUMBERS. THESE NUMBERS ARE USED ; TO DETERMINE WHICH DIRECTIVE COMPLETED UNSUCCESSFULLY. ; ; 1 DECNET OPEN ; 2 DECNET SPA ; 3 DECNET CONNECT ; 4 DECNET GND ; 5 DECNET ACCEPT CONNECT ; 6 DECNET RECEIVE (FIRST RECEIVE, EXPECTING TTY #) ; 7 MARK TIME IN NETWORK DATA QUEUE AST ; 8 ATTACH TERMINAL ; 9 MARK TIME IN ATTACH AST CODE ;- .SBTTL LTY - GLOBAL DEFINITIONS ; ; SYSTEM MACROS ; ; SYSTEM DIRECTIVE MACROS ; .MCALL ENAR$S .MCALL DRERR$ .MCALL DIR$ .MCALL ALUN$S .MCALL MRKT$S .MCALL ASTX$S .MCALL EXIT$S .MCALL WTSE$S .MCALL DSAR$S .MCALL QIOW$S,QIOW$ .MCALL QIO$S,QIO$ .MCALL SETF$S .MCALL DECL$S .MCALL RDAF$S ;READ ALL EVENT FLAGS .MCALL WTLO$S ;WAIT ON 'OR' OF EVENT FLAGS .MCALL SETF$S ;SET EVENT FLAG .MCALL QIOSY$ ; ; DECNET MACROS ; .MCALL OPN$,OPN$E,OPNW$,OPNW$E .MCALL CLSW$,CLSW$E,CLS$ .MCALL SPAW$,SPAW$E .MCALL DSCW$E,DSCW$,DSC$,DSC$E .MCALL GNDW$,GNDW$E .MCALL ACCW$,ACCW$E .MCALL REC$,REC$E,RECW$S,RECW$ .MCALL SND$,SND$E .MCALL CNBDF$ ;DEFINE CONNECT BLOCK OFFSETS .MCALL CRBDF$ ;DEFINE CONNECT BLOCK OFFSETS .MCALL NSSYM$ ;DEFINE NETWORK SYMBOLS .MCALL IOERR$ ;DEFINE ERROR SYMBOLS .MCALL CONW$,CONW$E,CON$ .MCALL CONB$$ ; ; ERROR PROCESSING MACROS ; .MCALL DIRERR .MCALL QIOERR ; ; GLOBAL DECLARATIONS ; .GLOBL LTY ;TASK ENTRY ; ; GLOBAL REFERENCES ; .GLOBL $DSW ;DIRECTIVE STATUS RETURN ; ; DEFINE DECNET SYMBOLS ; CRBDF$ CNBDF$ NSSYM$ IOERR$ ; ; DEFINE DIRECTIVE ERROR RETURN SYMBOLS ; DRERR$ .SBTTL LTY - DEFINITIONS .PSECT $LTY,D,RW ; ; LOCAL SYMBOLS ; ; BUFFER SIZES ; BFSIZE == 80. ;INPUT TTY BUFFER SIZE NETSZE == 124 ;DECNET RECEIVE BUFFER SIZE ; ; LUN DEFINITIONS ; OUTLUN == 1 INLUN == 2 TTYLUN == 3 NETLUN == 4 ; ; EVENT FLAGS ; NTEFN == 17. ;NETWORK EVENT FLAG EV.DON == 18. ;INITIAL WAIT EVENT FLAG MEFN == 19. ;MARK TIME EVENT FLAG CONEFN == 20. ;CONNECT AST EVENT FLAG NTSND == 21. ;DECNET SEND EVENT FLAG NTDIS == 22. ;DECNET DISCONNECT EVENT FLAG NTCLS ==23. ;DECNET CLOSE EVENT FLAG ; ; NETWORK CALLS ; OPNNET::OPNW$ NETLUN,NTEFN,IOSTAT CLSNET::CLS$ NETLUN,NTCLS,IOSTAT MAILBX::SPAW$ NETLUN,NTEFN,IOSTAT,, MAILGT::GNDW$ NETLUN,NTEFN,IOGND,, ACCEPT::ACCW$ INLUN,NTEFN,IOSTAT,, RCVIN:: RECW$ INLUN,NTEFN,IORCV1,, SNDOUT::SND$ OUTLUN,NTSND,IOSND,,<0,0> CONNCT::CON$ OUTLUN,NTEFN,IOCON,CONAST, DISCON::DSC$ OUTLUN,NTDIS,IOSTAT,, SNDBUF::SND$ OUTLUN,,IOSTAT,, ; ; CONNECT REQUEST BLOCK ; CRBLK:: CONB$$ N,0,2,<1,10,VTY3..> ; ; RSX-11M I/O CALLS ; ECHOCH::QIOW$ IO.WLB,TTYLUN,TTYLUN,,IOECH,, ATTACH::QIOW$ IO.ATA,TTYLUN,TTYLUN,,IOSTAT,, .SBTTL LTY - PURE DATA SEGSZE::.WORD 32. ;= # OF CHARS TO SEND TO ;REMOTE IN ONE TRANSMISSION BUFTOP::.WORD WT ;CONTAINS ADDR OF INPUT BUFFER BUFEND::.WORD WE ;CONTAINS ADDR OF END OF INPUT BUFFER NETTOP::.WORD NETBUF ;CONTAINS ADDR OF NETWORK RECEIVE BUFFER NETEND::.WORD NE ;CONTAINS ADDR OF END OF NTWRK RCV BUF MARKER::.WORD 377 ;MARKER CHAR USED TO DELIMIT MESSAGES ; ; MESSAGES ; MSG1T:: .ASCII <15><12>/<*ENTERING ODT MODE*>/<15><12> MSG1E:: MSG2T:: .ASCII <15><12>/RSX-11M VTY SERVICE V01.00/<15><12> MSG2E:: P1:: .ASCII <15><12>/NODE: / MSG4T:: .ASCII <15><12>/<*LEAVING ODT MODE*>/<15><12> MSG4E:: MSG5T:: .ASCII <15><12>/EXITING VTY SERVICE/<15><12> MSG5E:: ; ; ERROR MESSAGES ; ERRM3T::.ASCII <15><12>/<*CONNECT TO REMOTE FAILED*>/<15><12> ERRM3E:: ERRM4T::.ASCII <15><12>/<*NODE DOES NOT EXIST*>/<15><12> ERRM4E:: ERRM5T::.ASCII <15><12>/<*VTY3.. NOT INSTALLED ON REMOTE NODE*>/<15><12> ERRM5E:: ERRM6T::.ASCII <15><12>/<*TIME OUT ON CONNECT TO REMOTE*>/<15><12> ERRM6E:: ERRM7T::.ASCII <15><12>/<*DECNET RECEIVE FAILED*>/<15><12> ERRM7E:: ERRM8T::.ASCII <15><12>/<*LOGICAL LINK DISCONNECTED*>/<15><12> ERRM8E:: ERRM9T::.ASCII <15><12>/<*DATA OVERRUN*>/<15><12> ERRM9E:: ERM10T::.ASCII <15><12>/<*NO LOGICAL LINK ESTABLISED ON LUN*>/<15><12> ERM10E:: ERM11T::.ASCII <15><12>/<*NOT A NETWORK TASK*>/<15><12> ERM11E:: ERM12T::.ASCII <15><12>/<*ILLEGAL BUFFER ADDRESS*>/<15><12> ERM12E:: .SBTTL LTY - IMPURE DATA ; ; INPUT BUFFER USED BY TTY INPUT AST TO TEMPORARILY STORE INPUTTED ; CHARS UNTIL THEY CAN BE SENT TO THE REMOTE NODE ; .EVEN WT:: .BLKB BFSIZE .WORD 0 ;EXTRA ROOM FOR A MARKER CHAR WE:: BUFPTR::.WORD WT BFCHAR::.WORD 0 ; ; NETWORK RECEIVE BUFFER ; NETBUF::.BLKB NETSZE ;BUFFER TO HOLD INCOMING MESSAGES NE:: ;FROM DECNET NETPTR::.WORD 0 NETCNT::.WORD 0 ; ; FLAGS USED AS SEMAPHORES IN LTY ; ODTFLG::.WORD 0 ;ODT MODE FLAG; =1, IN ODT MODE BFLAG:: .WORD 0 ;CNTRL B FLAG, =1, ^B ENABLED TTYBSY::.WORD 0 ; =1, I/O OCCURING TO TTY N:: .BLKB 6 ;USED TO STORE NODE NAME OF REMOTE ; ;STATION NP:: .BLKB 8. ;USED TO STORE REMOTE NODE'S PASSWORD ; ; I/O STATUS BLOCKS ; IOGND:: .BLKW 2 ;DECNET GND IORCV1::.BLKW 2 ;DECNET RECEIVE IORCV2::.BLKW 2 ;DECNET RECEIVE IOECH:: .BLKW 2 ;TTY INPUT AST ECHO IOSND:: .BLKW 2 ;DECNET SEND IOCON:: .BLKW 2 ;DECNET CONNECT IOSTAT::.BLKW 2 ;I/O STATUS BUFFER ; ; MESSAGES THAT HAVE INFORMATION ADDED TO THEM DYNAMICALLY ; MSG3:: .ASCII <15><12>/CONNNECTION COMPLETE TO RSX-11M VTY # / REMTTY::.BYTE 0,0 ;USED TO STORE VTY # FOR MSG3 ERRM1T:: .ASCII <15><12>/DIRECTIVE ERROR, #/ ERRM1E:: .EVEN ECODE:: .WORD 0 ;DIRECTIVE NUMBER ERROR ERRM2:: .ASCII <15><12>#I/O STATUS =# .EVEN STATS:: .BLKW 2 ;I/O STATUS ; ; MISC STORAGE ; SAVCHR::.WORD 0 ;USED TO SAVE CHAR FROM TI INPUT AST ERRCDE::.WORD 0 ;USED TO STORE DIRECTIVE ERROR # MAILBF::.BLKB N.CBL ;NETWORK MAIL BUFFER MASK:: .WORD 14 ;EVENT FLAG MASK FOR MEFN AND CONEFN FLGBUF::.BLKW 4 ;USED TO STORE EVENT FLAGS FROM RDAF ; ; FLAGS USED TO DETERMINE WHETHER OR NOT A PARTICULAR LUN WAS ; SUCCESSFULLY CONNECTED TO THE NETWORK. THESE FLAGS ARE USED IN THE ; EXITING SEQUENCE TO CONTROL EXECUTION OF DISCONNECTS. DECNET DOES ; NOT APPROVE OF ISSUING DISCONNECTS ON LUNS THAT WERE NEVER ; SUCCESSFULLY CONNECTED(EXECUTION WILL HANG ON THE DISCONNECT IF YOU ; ISSUE A DISCONNECT ON A LUN THAT WAS NOT CONNECTED). ; FNETLU::.BLKW 1 ;NETLUN FOUTLU::.BLKW 1 ;OUTLUN FINLUN::.BLKW 1 ;INLUN EXITF:: .BLKW 1 ;EXIT FLAG, USED TO PREVENT THE CONNECT ; ;AST FROM REENTERING THE EXIT SEQUENCE ; ;(SEE DESCRIPTION OF THIS FLAG IS THE ; ;CONAST CODE) .SBTTL LTY * MAIN LINE CODE .PSECT LTY LTY:: ALUN$S #TTYLUN,#"TI,#0 ALUN$S #OUTLUN,#"NS,#0 ;NETWORK LUN'S ALUN$S #INLUN,#"NS,#0 ALUN$S #NETLUN,#"NS,#0 CLR FOUTLU ;CLEAR CONNECT FLAGS CLR FNETLU CLR FINLUN CLR EXITF ;CLEAR EXIT FLAG OPNW$E OPNNET CMPB $DSW,#IS.SUC BEQ L1 MOV #1,ERRCDE JMP FATERR L1: INC FNETLU ;SHOW OPEN NETWORK SUCCESSFUL SPAW$E MAILBX CMPB $DSW,#IS.SUC BEQ OUT1 MOV #2,ERRCDE JMP FATERR ; PRINT OUT INTRODUCTORY MESSAGE OUT1: MOV BUFTOP,BUFPTR ;INIT AST INPUT BUFFER PTR INC TTYBSY ;ALLOCATE TTY QIOW$S #IO.WLB,#TTYLUN,#TTYLUN,,#IOSTAT,,<#MSG2T,#> ; ; ASK WHICH NODE THE USER WANTS TO CONNECT UP WITH ; 1$: QIOW$S #IO.RPR,#TTYLUN,#TTYLUN,,#IOSTAT,,<#N,#6,,#P1,#8.> ; ; MOVE NODE NAME AND PASSWORD INTO CONNECT BLOCK ; MOV IOSTAT+2,R0 ;SET COUNT OF NUMBER OF CHARACTERS BEQ 1$ ; IF EQ - NONE, PROMPT AGAIN CLR TTYBSY ;SAY WE ARE NOT USING TTY MOV #CRBLK+N.RND,R1 ;POINT TO WHERE NODE NAME GOES MOV #N,R2 ;POINT TO WHERE NAME IS NOW 5$: CMPB (R2),#141 ;LOOK FOR A LOWER CASE LETTER BLT 6$ ;IF SO, CONVERT TO UPPERCASE SINCE CMPB (R2),#172 ;DECNET WANTS TO SEE UPPERCASE BGT 6$ ;NODE NAMES BICB #40,(R2) ;CONVERT TO UPPERCASE 6$: MOVB (R2)+,(R1)+ ;COPY NODE NAME TO CONNECT BLOCK SOB R0,5$ ;DO IT ALL ; ATTEMPT TO CONNECT UP TO REMOTE NODE MRKT$S #MEFN,#10,#2 ;GIVE REMOTE NODE 8 SECS TO DIR$ #CONNCT ;RESPOND TO CONNECT REQUEST WTLO$S 1,#14 ;WAIT FOR EITHER MARK TIME TO TIME ; ;OUT OR CONNECT AST RDAF$S #FLGBUF ;READ EVENT FLAGS BIT #10,FLGBUF+2 ;LOOK FOR CONNECT AST EVENT FLAG BNE CONUP ;SUCCESSFUL CONNECT ; ; CONNECT TIMED OUT, PRINT OUT MESSAGE AND EXIT ; QIOW$S #IO.WLB,#TTYLUN,#TTYLUN,,,,<#ERRM6T,#> JMP YEXIT ; ; CONNECT SUCCESSFUL ; WAIT UNTIL REMOTE NODE SENDS HIS CONNECT REQUEST ; CONUP: WTSE$S #EV.DON JMP RECNET .SBTTL CONAST * DECNET CONNECT AST ; ; RECEIVE CONNECT ACKNOWLEDGED FROM REMOTE NODE ; CONAST:: MOV (SP)+,SAVCHR MOV R0,-(SP) MOV SAVCHR,R0 L2: CMPB (R0),#IS.SUC ;LOOK FOR SOME CONNECT ERRORS BEQ ECAST ;CONNECT SUCCESSFUL ; ; CONNECT ERROR OCCURED, ; LOOK FOR SOME COMMON ERRORS ; ; ; TEST EXIT FLAG, IF = 1, THEN PROGRAM HAS ALREADY BEGUN EXIT SEQUENCE ; AND THIS CONNECT ERROR IS DUE TO A DISCONNECT OR CLOSE NETWORK DIRECTIVE. ; IT IS NOT NECESSARY TO REENTER THE EXIT SEQUENCE, SO IF EXIT FLAG = 1; ; JUST EXIT THE AST ; TST EXITF BEQ 1$ BR EXTAST 1$: CMPB (R0),#266 BEQ CONERR BR MCERR ;MISC CONNECT ERROR ECAST: SETF$S #CONEFN ;ANNOUNCE CONNECT SUCCESSFUL INC FOUTLU ;FLAG THAT DISCONNECT ON THIS LUN ; ;IS NOW NECESSARY EXTAST: MOV (SP)+,R0 ASTX$S ; ; A CONNECT ERROR OCCURED, LOOK FOR SOME COMMON FAULTS ; CONERR:: CMPB 2(R0),#2 ;REMOTE NODE DOES NOT EXIST BEQ E2 CMPB 2(R0),#4 ;VTY3.. NOT INSTALLED BEQ E4 ; ; MISC CONNECT ERROR ; MCERR: QIOW$S #IO.WLB,#TTYLUN,#TTYLUN,,,,<#ERRM3T,#> MOV 2(R0),R0 ;PRINT OUT I/O ERROR CODE MOVB IOSTAT,R1 CLR R2 ;SUPPRESS LEADING ZEROS CALL $CBOMG ;CONVERT BINARY TO OCTAL SUB #ERRM2,R0 ;GENERATE MESSAGE LENGTH QIOW$S #IO.WLB,#TTYLUN,#TTYLUN,,,,<#ERRM2,R0> JMP YEXIT ; ; COMMON CONNECT ERRORS ; E2: QIOW$S #IO.WLB,#TTYLUN,#TTYLUN,,,,<#ERRM4T,#> JMP YEXIT E4: QIOW$S #IO.WLB,#TTYLUN,#TTYLUN,,,,<#ERRM5T,#> JMP YEXIT .SBTTL SPAAST * NETWORK DATA QUEUE AST SPAAST:: GNDW$E MAILGT CMPB $DSW,#IS.SUC BEQ 5$ MOV #4,ERRCDE JMP FATERR 5$: CMPB IOGND,#IE.NDA ;END OF DATA BEQ 30$ BR 10$ ; ; NO MORE DATA IN MAILBOX, ISSUE EVENT EV.DON SO THAT THE MAIN LINE ; CODE WILL BE REACTIVATED 30$: SETF$S #EV.DON DECL$S ASTX$S 10$: CMPB #NT.CON,IOGND+1 ;IS THIS A CONNECT REQUEST BEQ 20$ ;YES JMP SPAAST ;ONLY CONNECT REQUEST'S ARE PROCESSED 20$: ACCW$E ACCEPT ;ACCEPT HIS CONNECT REQUEST CMPB $DSW,#IS.SUC BEQ 15$ MOV #5,ERRCDE JMP FATERR ; AFTER THE CONNECT REQUEST, THE REMOTE COMPUTER WILL IMMEDIATELY ; SEND THE TTY# HE HAS ASSIGNED TO THIS PROGRAM. 15$: INC FINLUN ;FLAG THAT DISCONNECT ON THIS LUN IS ; ;NOW NECESSARY RECW$S #INLUN,#NTEFN,#IORCV2,,<#NETBUF,#124> CMPB $DSW,#IS.SUC BEQ 40$ MOV #6,ERRCDE JMP FATERR ; ; CONVERT TTY # TO ASCII, THEN OUTPUT # TO USER ; 40$: MOV #REMTTY,R0 ;SET UP FOR CALL TO CONVERSION ROUTINE MOV NETBUF,R1 ;TTY # CLR R2 ;SUPRESS LEADING ZEROS CALL $CBOMG ;CONVERT BINARY TO OCTAL MAGNITUDE SUB #MSG3,R0 ;GENERATE LENGTH OF MESSAGE TO OUTPUT WAITL1: TST TTYBSY BEQ OUTTN ;TTY FREE TO USE MRKT$S #MEFN,#2,#2 ;WAIT FOR 2 SECS AT A TIME WTSE$S #MEFN CMPB $DSW,#IS.SUC BEQ WAITL1 MOV #7,ERRCDE JMP FATERR ; ; INFORM THE USER THAT THE CONNECTION TO THE REMOTE COMPUTER IS COMPLETE ; INC TTYBSY OUTTN: QIOW$S #IO.WLB,#TTYLUN,#TTYLUN,,#IORCV1,,<#MSG3,R0> ; ; ENTER ODT MODE AND INFORM THE USER THAT HE ; WILL START UP IN ODT MODE ; INC ODTFLG QIOW$S #IO.WLB,#TTYLUN,#TTYLUN,,,,<#MSG1T,#> CLR TTYBSY CLR BFLAG ;START OUT WITH OUTPUT ENABLED ; ; ATTACH THE TERMINAL, FROM NOW ON ALL INPUTTED CHARS WILL BE CAPTURED ; BY THE ATTACH AST ; DIR$ #ATTACH,ERR JMP SPAAST ERR: MOV #8.,ERRCDE JMP FATERR .SBTTL RECNET * NETWORK DATA BUFFER RECEIVE CODE ; ******* ; ; RECEIVE DECNET BUFFER ; ; ******* RECNET:: DIR$ #RCVIN ;ISSUE DECNET RECEIVE AND WAIT CMPB IORCV1,#IS.SUC BNE CERROR JMP CONT CERROR: ; ; ON ANY ERRORS FROM RECEIVE, PRINT OUT ERROR MESSAGE ; AND EXIT ; QIOW$S #IO.WLB,#TTYLUN,#TTYLUN,,,,<#ERRM7T,#> ; ; DETERMINE REASON FOR FAILURE ; CMPB IORCV1,#IE.ABO BNE 6$ QIOW$S #IO.WLB,#TTYLUN,#TTYLUN,,,,<#ERRM8T,#> JMP YEXIT 6$: CMPB IORCV1,#IE.DAO ;DATA OVERRUN BNE 16$ QIOW$S #IO.WLB,#TTYLUN,#TTYLUN,,,,<#ERRM9T,#> JMP YEXIT 16$: CMPB IORCV1,#IE.NLN ;NO LOGICAL LINK BNE 26$ QIOW$S #IO.WLB,#TTYLUN,#TTYLUN,,,,<#ERM10T,#> JMP YEXIT 26$: CMPB IORCV1,#IE.NNT ;NOT A NETWORK TASK BNE 36$ QIOW$S #IO.WLB,#TTYLUN,#TTYLUN,,,,<#ERM11T,#> JMP YEXIT 36$: CMPB IORCV1,#IE.SPC ;ILLEGAL BUFFER ADDRESS BNE 46$ QIOW$S #IO.WLB,#TTYLUN,#TTYLUN,,,,<#ERM12T,#> JMP YEXIT 46$: JMP YEXIT ;MISC DIRECTIVE ERROR CONT: MOV NETTOP,NETPTR ;INITIALIZE BUFFER POINTER MOV IORCV1+2,R1 ; # OF CHARS IN BUFFER TST BFLAG ;SHOULD THIS BUFFER BE DISCARDED BEQ CONT1 ;NO ; ; ^O IS ENABLED, DISCARD OUTPUT UNTIL THE REMOTE COMPUTER SENDS A ^O ; BACK. THE REMOTE COMPUTER WILL SEND A ^O BACK WHEN IT RECOGNIZES THAT ; ONE WAS SENT. ; AT THAT POINT, IT IS NO LONGER NECESSARY FOR LTY TO DISCARD OUTPUT SINCE ; THE REMOTE COMPUTER WILL STOP ALL OUTPUT OVER THE LINK ; OLOOP: CMPB @NETPTR,MARKER BEQ EAST ;UPON RECEIPT OF MARKER, ENABLE AST'S CMPB @NETPTR,#017 ;LOOK FOR CONTROL O BEQ REENBL ;CONTROL O, REENABLE OUTPUT NXTCHR: INC NETPTR SOB R1,OLOOP ;SEARCH ENTIRE BUFFER EXIT1: JMP RECNET EAST: ENAR$S ;ENABLE AST'S BR NXTCHR REENBL: CLR BFLAG ;REENABLE OUTPUT BR NXTCHR ; ; OUTPUT IS ENABLED. LOOK FOR RETURNED MARKER CHAR IN THE BUFFER ; THEN OUTPUT BUFFER TO TTY ; CONT1: CMPB @NETPTR,MARKER ;1ST SEARCH ENTIRE BUFFER BEQ MARK ;FOR A MARKER SO THAT AST'S WILL INC NETPTR ;BE ENNABLED SOB R1,CONT1 BR CONT3 MARK: ENAR$S CONT3: INC TTYBSY MOV NETTOP,R1 MOV IORCV1+2,R2 ;# OF CHARS IN BUFFER QIOW$S #IO.WLB,#TTYLUN,#TTYLUN,,#IOSTAT,, CLR TTYBSY JMP RECNET ;REISSUE RECEIVE .SBTTL TRYSND * SEND A BUFFER ACROSS LINK ; ; THIS SUBROUTINE WILL TRANSFER THE INPUT BUFFER ACROSS DECNET TO THE ; REMOTE CONNECTION. IT WILL TRANSFER THE BUFFER IN SEGMENTS OF SEGSZE ; BYTES EACH. IT WILL RESET THE BUFFER POINTER TO POINT THE THE BEGINNING ; OF THE BUFFER. ; ; IT DESTROYS R0,R1, AND R2 ; TRYSND: MOV BUFPTR,R2 SUB BUFTOP,R2 ;R2 = # OF CHARS IN INPUT BUFFER BEQ ETRYSN ;NO CHARS IN THE INPUT BUFFER ; ; THERE ARE CHARS IN THE INPUT BUFFER. SEND THEM ACROSS DECNET IN ; SEGMENTS = SEGSZE ; MOV BUFTOP,R1 MOV SEGSZE,R0 SLOOP: CMP R2,SEGSZE BGE FULLSG ;TRANSFER ONE FULL SEGMENT MOV R2,R0 FULLSG: SND$E SNDOUT,,,,, SUB SEGSZE,R2 BLE DONE1 ADD SEGSZE,R1 JMP SLOOP DONE1: MOV BUFTOP,BUFPTR ;RESET BUFFER PTR TO REFLECT ; ;AN EMPTY INPUT BUFFER ETRYSN: RTS PC .SBTTL TIAST * UNSOLICITED TTY INPUT AST ; ******* ; ; AST TO CAPTURE ALL(HOPEFULLY) UNSOLICITED INPUT FROM THE ATTCHED ; TERMINAL ; ; ******* TIAST:: MOV (SP)+,SAVCHR ;SAVE INCOMING CHAR MOV R0,-(SP) ;SAVE REGISTERS USED MOV R1,-(SP) MOV R2,-(SP) MOV SAVCHR,R0 CMPB R0,#031 BNE NOTY TST EXITF ;ALREADY IN EXIT SEQUENCE? BEQ EXITP ;NO, EXIT PROGRAM JMP EXITAS ;YES, JUST LEAVE AST EXITP: JMP YEXIT ;^Y EXITS PROGRAM NOTY: CMPB R0,#020 ; BNE 2$ JMP CNTRLP ;^P TOGGLES ODT MODE 2$: CMPB R0,#002 BNE 11$ ; ; ^B ENTERED, CHANGE IT TO A ^O SO THAT THE REMOTE NODE WILL ; KNOW THAT OUTPUT SHOULD BE DISABLED ; INC BFLAG MOV #017,R0 ;CHANGE TO ^O 11$: TST ODTFLG ;IN ODT MODE? BEQ 3$ ;NO JMP SENDC ;YES, SEND CHAR TO REMOTE NODE 3$: CMPB R0,#040 BLT 5$ ;CHARS < 40 ARE CONSIDERED SPECIAL CMPB R0,#175 ;TERMINATORS, AS ARE CHARS > 175 BGT 5$ BR 10$ 5$: JMP ST ; ; NOT IN ODT MODE ; ECHO THE CHAR AND BUFFER IT. THE BUFFER WILL BE SENT ACROSS DECNET ; UPON RECEIPT OF A TERMINATING CHAR ; 10$: BIS #200,R0 ;SET BIT SO THAT REMOTE NODE ; ;WILL NOT ECHO CHAR TST TTYBSY ;IS THERE ACTIVE I/O TO THE TTY BEQ ECHOC ;NO, OK TO ECHO DSAR$S ;DISABLE AST'S WHILE WAITING SO THAT ; ;CHARS WON'T BE LOST 20$: TST TTYBSY ;WAIT FOR TTY TO BECOME AVAILABLE BNE 30$ ENAR$S BR ECHOC 30$: MRKT$S #MEFN,#2,#2 ;WAIT FOR 2 SECS AT A TIME WTSE$S #MEFN CMPB $DSW,#IS.SUC BEQ 20$ MOV #9.,ERRCDE JMP CALLFE ECHOC: INC TTYBSY MOVB R0,BFCHAR DIR$ #ECHOCH,EXITAS ;ECHO CHAR CLR TTYBSY MOVB R0,@BUFPTR ;BUFFER CHAR INC BUFPTR CMP BUFPTR,BUFEND BEQ SENDBF ;REACHED END OF INPUT BUFFER,SEND IT ; ; EXITAS: MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 ASTX$S ; ; TERMINATING CHAR RECEIVED. DISABLE FURTHER AST RECOGNITION IN ORDER TO ; SAVE FURTHER INCOMING CHARS. ADD A MARKER CHAR INTO THE BUFFER, THEN ; SEND BUFFER ; ST: MOVB R0,@BUFPTR INC BUFPTR SENDBF: MOVB MARKER,@BUFPTR INC BUFPTR DSAR$S JSR PC,TRYSND ;SEND BUFFER BR EXITAS ; ; IN ODT MODE - JUST SEND CHAR ; SENDC: MOVB R0,BFCHAR SND$E SNDBUF,,,,,<#BFCHAR,#1> DONE: JMP EXITAS ; ; TOGGLE ODT MODE ; CNTRLP: TST ODTFLG ;ALREADY IN ODT MODE? BNE 10$ ;YES, SWITCHING OUT OF ODT MODE JMP INTODT ;NO, GOING INTO ODT MODE 10$: CLR ODTFLG TST TTYBSY ;OK TO PRINT MESSAGE? BEQ PRNTM ;YES DSAR$S ;DISABLE AST'S WHILE WAITING FOR ; ;TTY TO OPEN UP. THIS WILL HOPEFULLY ; ;SAVE INCOMING CHARS 40$: TST TTYBSY BNE 41$ ENAR$S BR PRNTM 41$: MRKT$S #MEFN,#2,#2 ;WAIT FOR TTY TO OPEN UP WTSE$S #MEFN CMPB $DSW,#IS.SUC BEQ 40$ MOV #10,ERRCDE JMP CALLFE ; ; PRINT OUT LEAVING ODT MODE MESSAGE ; PRNTM: QIOW$S #IO.WLB,#TTYLUN,#TTYLUN,,,,<#MSG4T,#> JMP EXITAS ; ; SWITCHING INTO ODT MODE, IF THERE ARE ANY CHARS IN THE INPUT AST BUFFER, ; THE SEND THEM ACROSS ; INTODT: JSR PC,TRYSND INC ODTFLG ;SET ODT MODE ; ; PRINT OUT ENTERING ODT MODE MESSAGE ; QIOW$S #IO.WLB,#TTYLUN,#TTYLUN,,,,<#MSG1T,#> JMP EXITAS ; ;DIRECTIVE ERROR, JUMP TO FATAL ERROR CODE IF NOT ALREADY IN ;THE EXIT SEQUENCE ; CALLFE: TST EXITF BEQ 10$ JMP EXITAS ;ALREADY IN EXIT SEQUENCE, JUST EXIT AST 10$: JMP FATERR .SBTTL VEXIT * EXIT PROGRAM ; ;^Y WILL EXIT PROGRAM, IF THERE ARE ANY CHARS IN THE INPUT BUFFER, ; SEND THEM ACROSS. ; YEXIT: INC EXITF ;SET EXIT FLAG(SEE DESCRIPTION OF EXIT FLAG ; ;IN THE CONNECT AST CODE) JSR PC,TRYSND ;SEND ANY CHARS IN THE BUFFER ; ; PRINT OUT EXITING MESSAGE ; QIOW$S #IO.WLB,#TTYLUN,#TTYLUN,,,,<#MSG5T,#> ; ; DISCONNECT LOGICAL LINKS AND END NETWORK OPERATIONS ; TST FOUTLU ;WAS OUTLUN CONNECTION MADE BEQ 1$ ;NO, DO NOT DISCONNECT DSC$E DISCON,#OUTLUN 1$: TST FINLUN ;WAS INLUN CONNECTION MADE BEQ 5$ ;NO DSC$E DISCON,#INLUN 5$: TST FNETLU ;WAS NETWORK OPENED SUCCESSFULLY BEQ 10$ ;NO DSC$E DISCON,#NETLUN 10$: DIR$ #CLSNET ;CLOSE NETWORK MRKT$S #MEFN,#2,#2 ;GIVE DIRECTIVES A COUPLE OF SECS ; ;TO COMPLETE WTSE$S #MEFN EXIT$S .SBTTL FATERR * ERROR HANDLER FATERR: MOV #ECODE,R0 ;TRANSLATE DIRECTIVE ERROR # MOV ERRCDE,R1 ;INTO ASCII MOV #17012,R2 CALL $CBTA QIOW$S #IO.WLB,#TTYLUN,#TTYLUN,,,,<#ERRM1T,#> JMP YEXIT .END LTY