Trailing-Edge
-
PDP-10 Archives
-
bb-h240e-bm_decnet-20_v4_0_dist
-
decnet-sources/sethos.mac
There are 4 other files named sethos.mac in the archive. Click here to see a list.
; UPD ID= 479, SNARK:<6.UTILITIES>SETHOS.MAC.4, 10-Feb-84 14:39:12 by EVANS
;Rescind previous work for decimal display.
; UPD ID= 469, SNARK:<6.UTILITIES>SETHOS.MAC.3, 8-Feb-84 10:01:28 by EVANS
;Add flag to edit number so I VER will display it in decimal.
; UPD ID= 195, SNARK:<6.UTILITIES>SETHOS.MAC.2, 22-Jan-83 05:16:31 by GRANT
;Update disconnect codes to Phase III terminology
; UPD ID= 86, SNARK:<5.UTILITIES>SETHOS.MAC.16, 10-Jun-82 09:23:35 by GRANT
;Improve user message when panic character is typed
; UPD ID= 63, SNARK:<5.UTILITIES>SETHOS.MAC.15, 4-Jan-82 08:34:44 by GRANT
;TCO - 5.1648 - When user types panic character, check for actual connection
; UPD ID= 44, SNARK:<5.UTILITIES>SETHOS.MAC.14, 1-Oct-81 14:26:39 by GRANT
;TCO 5.1553 - output remote system type when we don't support the protocol
; UPD ID= 31, SNARK:<5.UTILITIES>SETHOS.MAC.13, 15-Sep-81 11:33:07 by GRANT
;TCO 5.1509 - Enhance error message when remote system rejects connection
; UPD ID= 9, SNARK:<5.UTILITIES>SETHOS.MAC.12, 24-Jul-81 07:10:07 by GRANT
;Save destination node name so it can be printed out when reconnecting occurs
; UPD ID= 6, SNARK:<5.UTILITIES>SETHOS.MAC.11, 17-Jul-81 16:54:37 by GRANT
;Fix bug in parsing the input string of nodes - bug caused wrong message to
;be sent to PSTHRU
; UPD ID= 2, SNARK:<5.UTILITIES>SETHOS.MAC.10, 9-Jul-81 18:00:57 by GRANT
;Add version number, fix copyright
;Print out disconnect reason when ESC character is seen
; UPD ID= 2300, SNARK:<5.UTILITIES>SETHOS.MAC.9, 6-Jul-81 15:32:15 by MURPHY
;SAVE ONE PAGE WORTH OF TTY OUTPUT IF NOT .MOSNH
;Don't create fork when not needed.
;Switch for PTY/.MOSNH
; UPD ID= 2200, SNARK:<5.UTILITIES>SETHOS.MAC.8, 15-Jun-81 14:19:40 by GRANT
;CLOSF instead of RLJFN when " ? Remote node not responding "
; UPD ID= 2079, SNARK:<5.UTILITIES>SETHOS.MAC.7, 25-May-81 22:59:33 by GRANT
;check to see if link is really still there before saying "type continue to
;resume connection"
; UPD ID= 2034, SNARK:<5.UTILITIES>SETHOS.MAC.6, 19-May-81 15:00:45 by GRANT
;Force the input string to be syntactically correct before trying to open a link
; UPD ID= 1912, SNARK:<5.UTILITIES>SETHOS.MAC.5, 30-Apr-81 16:48:38 by GRANT
;Don't automatically reprompt when GTJFN or OPENF fail in DOJFN
; UPD ID= 1911, SNARK:<5.UTILITIES>SETHOS.MAC.4, 30-Apr-81 16:29:45 by GRANT
;Use .TICCZ instead of .TICTI in ESCHAR
; UPD ID= 1710, SNARK:<5.UTILITIES>SETHOS.MAC.3, 16-Mar-81 11:51:32 by GRANT
;Don't say "[TYPE ^Y, etc.]" until connection has been established
;Don't say "Reason n" when reporting the disconnect reeason
;Time out the attempted connection
;Don't say "Connection broken" when there really wasn't a connection
;If received configuration message doesn't support TOPS-20, say so
; UPD ID= 1646, SNARK:<5.UTILITIES>SETHOS.MAC.2, 4-Mar-81 12:14:55 by GRANT
;MAKE "SETHOST NODE::" CONNECT TO OBJECT 23 INSTEAD OF 123
;<MURPHY.MON>SETHOS.MAC.8, 20-Jan-81 16:07:11, EDIT BY MURPHY
;SH%LPM to prevent sending XON, XOFF
;<MURPHY.MON>SETHOS.MAC.7, 21-Nov-80 17:36:15, EDIT BY MURPHY
;<MURPHY.MON>SETHOS.MAC.4, 10-Oct-80 13:47:05, EDIT BY MURPHY
;<MURPHY.MON>SETHOST.MAC.2, 20-Aug-80 14:54:44, EDIT BY MURPHY
;USE .MOSNH FUNCTION TO MAKE MONITOR DO THE WORK
TITLE SETHOS - Program to permit logins to remote network host
;COPYRIGHT (C) 1981 BY
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE
;INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER
;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY
;TRANSFERRED.
;
;
;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
;CORPORATION.
;
;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
SALL ; Keep listing uncluttered, no macro expansion
SEARCH MONSYM,MACSYM,CMD ; Universals to search
.REQUIRE SYS:MACREL,SYS:CMD ; Make LINK load these automatically
; This program will allow a user to login in to a remote system in a
; DECnet network from a TOPS-20 host system. It demonstrates use of the
; TOPS-20 DECnet functionality in a program which performs a real function.
; The remote system must provide a program which acts as a server to
; this program. The MCBNRT program is an example of a program written for
; TOPS-20 which will perform that function on that system. Programs for
; other systems must perform functionally similar to MCBNRT.
;
SUBTTL DECLARED SYMBOLS
IPTYF==0 ;Use PTY if 1, otherwise use .MOSNH
T1=:1 ; AC definitions
T2=:2
T3=:3
T4=:4
Q1==:5
Q2==:6
CX=:16
P=:17
NPDL==100 ; Size of pushdown list
INSIZ==50 ; Terminal input buffer size, in words
MAXINP==INSIZ*5 ; Maximum number of terminal input characters
DBUFFR==100000 ; Data buffer on page 100
SDBUF==200 ;ASSUMED SIZE OF DBUFFR
MEMBUF==101000 ;MEMORY BFR FOR TTY OUTPUT
NMEMBF==777 ;SIZE THEREOF
TOPS20==^D8
TOPS10==^D9
VMAJOR==5 ;MAJOR VERSION NUMBER
VMINOR==0 ;MINOR VERSION NUMBER
VEDIT==^D1 ;EDIT NUMBER
VWHO==0 ;LAST EDITOR (0 = DEC DEVELOPMENT)
VSETHOS==<VWHO>B2+<VMAJOR>B11+<VMINOR>B17+VEDIT
SUBTTL IMPURE STORAGE
STATUS: BLOCK 3
STIMSK: BLOCK 1 ; Terminal interrupt word mask for STIW
UESCCH: BLOCK 1 ; User escape char
LOCAL: BLOCK 2 ; Local node name
DCNJFN: BLOCK 1 ; JFN of logical link to MCBNRT server
INSTR: BLOCK INSIZ ; Terminal input stream buffer
CTRLY: BLOCK 1 ;CTRL/Y FLAG
NODE0: BLOCK 20
ROUTE: BLOCK 40
DESTND: BLOCK 2 ;SPACE FOR DESTINATION NODE NAME
SAVACE: BLOCK 4 ; Register save area for AC's 1 - 4
SAVSTS: BLOCK 1 ;SAVE LOC FOR LINK STATUS
NAME: BLOCK 50 ; File spec name of logical link to MCBNRT
FORK: BLOCK 1 ; Handle of inferior process to read from TTY
PTYF: IPTYF ;PTY/.MOSNH FLAG
MEMPTR: BLOCK 1 ;PTR TO MEM BFR FOR TTY OUTPUT
NMSPC: BLOCK 1 ;SPACE REMAINING IN MEM BFR
VIRGIN: EXP -1 ; Flag to indicate fresh start, initially -1
PC: BLOCK 3 ; Storage for PC on interrupts
LEVTAB: PC ; Software interrupt level table
PC+1
PC+2
CHNTAB: 0 ; Software interrupt channel table
1,,ESC ; Panic character (default ^Y)
0
REPEAT ^D33,<0> ;FILL REST OF CHN TABLE
PDL: BLOCK NPDL ; Pushdown list (STACK)
CMDSTG ; Command parser storage (from CMDS)
SUBTTL START - Start of SETHOST program
EVEC: JRST START ;INITIAL START
JRST REENT ;CONTINUE EXISTING CONNECTION
EXP VSETHOS ;VERSION
START: RESET ; Intialize ourself
MOVE P,[IOWD NPDL,PDL] ; and set up pushdown list
AOS VIRGIN ; Bump count of times we come through here
CALL CMDINI ; Initialize command parser
SKIPN PTYF ;USING PTY?
IFSKP.
SETZM NMSPC ;NOTE MEM BFR HAS NO SPACE
MOVX T1,CR%MAP ;YES, Create process to read from TTY
SETZM T2
CFORK ; Make the process, same address map
JRST [JSHLT ; on error... halt and allow continue
JRST START]
MOVEM T1,FORK ; Save the process handle obtained
ENDIF.
MOVEI T1,.FHSLF ; Our process handle
RPCAP ; Get our capabilities
TXO T3,SC%CTC ; allow ^C trapping for job
EPCAP ; Enable new set of capabilities
MOVE T2,[LEVTAB,,CHNTAB] ; Address of software interrupt system tables
SIR ; Give them to monitor
MOVX T2,1B1 ; Channel number
AIC ; Activate software interrupt channels
EIR ; Enable software interrupt system
CALL ALLON ; Turn on all TTY interrupts
CALL PRESCN ; Prescan EXEC line for host name...
JRST PREHST ; Got it - skip the prompting
JRST ESCHAR ; Otherwise get it now
SUBTTL ESCHAR - Obtain the escape character user wants to use
ESCHAR: PROMPT <Escape character(^Y):> ; Put out prompt to users terminal
MOVEI T1,[FLDDB. (.CMTXT,CM%SDH,,<Character for interrupting connection>,<>)]
CALL CFIELD ; Read the escape character
LDB T1,[POINT 7,ATMBUF,6] ; Get character itself
MOVEM T1,UESCCH ;SAVE IT
CAILE T1,.TICCZ ; Is it a valid character? (^A to ^Z)
JRST [ HRROI T1,[ASCIZ /Invalid character/] ; No, tell user
ESOUT
JRST ESCHAR] ; and try again
MOVNI T2,0(T1) ; Save the character
HRLS T1 ; Character value is terminal code
HRRI T1,1 ; Channel number
ATI ; Assign terminal code to software interrupt channel
MOVX T1,1B0 ; Get a bit
LSH T1,0(T2) ; Make terminal interrupt word mask for character
TXO T1,1B<.TICTI> ; Allow typein
MOVEM T1,STIMSK ; Save for use later
JRST HSTNAM ; Get the host name
SUBTTL HSTNAM - Get the host name user wants to login on
HSTNAM: PROMPT <Host name: > ; Put out prompt to users terminal
PREHST: MOVEI T1,[FLDDB. (.CMTXT,CM%SDH,,<Name of system to connect to>)]
CALL CFIELD ; Read host name
HRROI T1,INSTR ; Pointer to destination buffer
HRROI T2,ATMBUF ; Pointer to source buffer
MOVEI T3,0 ; An ASCIZ string
SOUT ; Copy the host name
MOVX T1,177B6 ; See if real host name given
TDNN T1,INSTR ; Was one?
JRST [ HRROI T1,[ASCIZ /
[CONNECTING TO LOCAL HOST- /] ; No, tell user what's happening
PSOUT
MOVEI T1,.NDGLN ; Function code to get local node name
MOVEI T2,T3
HRROI T3,INSTR
NODE ; Obtain local node name
HRROI T1,INSTR
PSOUT ; Output to user's TTY
HRROI T1,[ASCIZ /]
/]
PSOUT ; Finish the message nicely
JRST .+1]
JRST SETTMD ; Have name. Now set TTY modes
SUBTTL SETTMD - Set TTY modes
SETTMD: MOVEI T1,.PRIIN ; Primary input
RFMOD ; Get current JFN mode word
TXO T2,TT%WAK ; Wake on all
TXZ T2,TT%ECO!TT%DAM ; Echoes off and binary data mode
SFMOD ; Set new JFN mode word
MOVX T1,.FHJOB ; Set terminal interrupt word for entire job
MOVE T2,STIMSK ; Get terminal interrupt word saved earlier
STIW ; Set it to allow only panic interrupts
CALL COLDSH ; Convert digraph :: to -
HRROI T1,NAME ; Build network file spec to MCBNRT
HRROI T2,[ASCIZ /DCN:/] ; The DECnet device for making connection
SETZM T3
SOUT
MOVE T2,[POINT 7,NODE0]
SOUT ; Copy node name as well
HRROI T2,[ASCIZ /-23/] ; MCBNRT's object type
SKIPE ROUTE ; Doing routing?
HRROI T2,[ASCIZ /-123/] ;PSTHRU'S OBJECT TYPE
SOUT
DOJFN: MOVX T1,GJ%SHT ; Do a short form GTJFN
HRROI T2,NAME ; Using the spec just built
GTJFN ; Get DCN connection
JRST [ JSERR ; If error, tell user
CALL ALLON ; Reset TTY to normal mode
HALTF ;STOP
JRST HSTNAM] ; And go back to get host name
MOVEM T1,DCNJFN ; Save JFN for the connection
;MOVEI T1,.PRIOU ; Check if parity OK on this TTY
;GDSTS ; Get device status
;ERJMP [SETZM T2 ; If error, set all status off
; JRST .+1] ; And continue along
;MOVE T1,DCNJFN ; Restore the JFN for network connection
;TXNE T2,GD%PAR ; Does terminal allow parity?
MOVE T2,[FLD(^D8,OF%BSZ)!FLD(.GSSMB,OF%MOD)!OF%RD!OF%WR]
; Yes, 8 bit bytes and read/write access
OPENF ; Open the network connection
ERJMP [JSERR ; If failed, tell user
MOVE T1,DCNJFN ; And release the JFN
RLJFN
JFCL
CALL ALLON ; Reset TTY to normal mode
TMSG <
>
JRST HSTNAM] ; And go back to get host name
MOVEI T4,6 ;6 TRIES FOR THE CONNECTION
TSTCON: MOVEI T1,^D2000 ;2 SECONDS BETWEEN TRIES
DISMS ;WAIT
MOVE T1,DCNJFN ;GET BACK THE JFN
MOVX T2,.MORLS ;READ LINK STATUS
MTOPR
ERJMP .+1
TXNE T3,MO%CON ;CONNECTED?
JRST GOTCON ;YES, GO TO IT
TXNE T3,MO%WFC ;NO, WAITING FOR A CONNECT?
JRST TSTCO1 ;YES, WAIT FOR A BIT
TXNE T3,MO%ABT ;NO, CONNECT BEEN REJECTED?
JRST [ HRROI T1,[ASCIZ/
? Remote system rejected connection - /]
PSOUT
JRST NOTCON]
TSTCO1: SOJE T4,[HRROI T1,[ASCIZ/
? Remote node not responding
/]
TSTCO2: PSOUT
MOVE T1,DCNJFN ; And release the JFN
CLOSF
JFCL
CALL ALLON ; Reset TTY to normal mode
JRST HSTNAM] ; And go back to get host name
JRST TSTCON ;TRY AGAIN
;CONNECTION TO REMOTE NODE HAS BEEN ESTABLISHED
GOTCON: SKIPN ROUTE ; want to route-through?
JRST NOR ; No. Go on
;Here to do pass-through
MOVE T1,DCNJFN ;GET BACK JFN
HRROI T2,ROUTE ;Get message
SETZM T3
SOUTR ; Send it
ERJMP RTERR
RT0: HRROI T2,DBUFFR
MOVNI T3,^D200
SINR ; Get message
ERJMP RTERR
SETZM T4
IDPB T4,T2 ; tie it off
LDB T4,[POINT 7,DBUFFR,6]
SOJG T4,RTERR0 ; bad
JUMPE T4,NOR
MOVE T1,[POINT 7,DBUFFR,6]
PSOUT
MOVE T1,DCNJFN
JRST RT0
NOR: SKIPN PTYF ;IF USING PTY...
IFSKP.
MOVE T1,FORK ; Restore the process handle obtained
MOVEI T2,DOINP0 ; The start address
SFORK ; Start the process to read input from TTY
ERJMP [RESET ; If failed, reset ourself
JSHLT ; Tell user and halt
JRST START] ; Go back to beginning if continued
ENDIF.
MOVE T1,DCNJFN
MOVE T2,[POINT ^D8,DBUFFR]
MOVNI 3,SDBUF
SINR ; Read status message
ERJMP BADCON
LDB T1,[POINT ^D8,DBUFFR,7]
SOJN T1,[MOVEI T4,SDBUF(T3) ;GeT count received-1
JRST GOTDAX]
LDB T1,[POINT ^D8,DBUFFR+1,7]
CAIL T1,0 ;IS OPERATING SYSTEM
CAILE T1,HSTTYN ; TYPE LEGAL?
IFNSK. ;NO
TMSG <
? Remote system sent an illegal configuration message
>
JRST QUIT ;BYE
ENDIF.
CAIE T1,TOPS20 ;TOPS-20?
CAIN T1,TOPS10 ;OR TOPS10?
SKIPA ;OK
IFNSK. ;NO
PUSH P,T1 ;STASH SYSTEM TYPE
TMSG <
? Communication with >
POP P,T1 ;RETRIEVE SYSTEM TYPE
HRROI T1,@HSTTYP(T1) ;MAKE BP TO REMOTE'S NAME
PSOUT ;PRINT IT OUT
TMSG < not supported by SETHOST
>
CALL ALLON ;RESET TTY TO NORMAL MODE
RESET ;CLEAR EVERYTHING
JRST HSTNAM ;START OVER
ENDIF.
SKIPN CTRLY ;TELL USER ABOUT CTRL/Y?
JRST GOTDA2 ;NO, USER SELECTED A CHAR
TMSG <
[Type ^Y to return to node > ; Tell user how to get back
MOVX T1,.NDGLN
MOVX T2,T3
MOVE T3,[POINT 7,LOCAL]
NODE ; And name of local node
JFCL
HRROI T1,LOCAL
PSOUT
TMSG <]
> ; Finish off nicely
JRST GOTDA2
RTERR:
RTERR0: HRROI T1,[ASCIZ /
?DECNET connection aborted by remote server
/]
PSOUT
MOVE T1,[POINT 7,DBUFFR,6]
PSOUT
HRROI T1,[ASCIZ /
/]
PSOUT
QUIT: RESET
HALTF
JRST START
;OPERATING SYSTEM TYPES
HSTTYP: [ASCIZ\RSTS\]
[ASCIZ\RT-11\]
[ASCIZ\RSTS/E\]
[ASCIZ\RSX-11S\]
[ASCIZ\RSX-11M\]
[ASCIZ\RSX-11D\]
[ASCIZ\IAS\]
[ASCIZ\VMS\]
[ASCIZ\TOPS-20\]
[ASCIZ\TOPS-10\]
[ASCIZ\RTS-8\]
[ASCIZ\OS-8\]
[ASCIZ\RSX-11M+\]
[ASCIZ\MCB\]
HSTTYN=.-HSTTYP-1 ;NUMBER OF DEFINED OPERATING SYSTEM TYPES
SUBTTL GOTDA1 - Read data from network connection
GOTDA1: SKIPE PTYF ;USING PTY?
IFSKP.
MOVE T1,DCNJFN ;NO, HAND CONNECTION TO MONITOR
MOVEI T2,.MOSNH
MOVEI T3,1(P)
PUSH P,[3] ;PUSH SIZE OF ARG BLOCK
PUSH P,[.PRIIN]
HRRZ T4,UESCCH
TXO T4,SH%LPM ;LOCAL PAGE MODE
PUSH P,T4
MTOPR ;CONNECT DCNJFN TO TTY
ERJMP [JSHLT]
ADJSP P,-3 ;FLUSH ARG BLOCK
WAIT
JRST GOTDA1
ENDIF.
MOVE T1,DCNJFN ; Get the network connection JFN
MOVE T2,[POINT ^D8,DBUFFR] ; Pointer to buffer
MOVNI T3,1 ; One byte only
SIN ; Read from logical link
ERJMP BADCON ; If error, connection broken
MOVE T3,T2 ; Save byte pointer
SIBE ; Any more data to read now ?
IFSKP.
MOVEI T4,1 ;NO, GO TYPE THE ONE CHARACTER
JRST GOTDAX
ENDIF.
EXCH T2,T3 ; Restore byte pointer
MOVE T4,T3 ; Save count
MOVNS T3 ; Read the exact number available
SIN ; Read remaining bytes
ERJMP BADCON ; If error, connection broken
ADDI T4,1 ;TOTAL COUNT OF BOTH SIN'S
GOTDAX: MOVEI T1,.PRIOU ; Output to users terminal
MOVE T2,[POINT ^D8,DBUFFR] ; Pointer to data from remote host
MOVN T3,T4 ; Output count
CALL SAVTTO ;SAVE TTY OUTPUT
SOUT ; Type data on users terminal
SKIPE PTYF ;USING PTY?
JRST GOTDA1 ;YES
GOTDA2: MOVE T1,DCNJFN
SIBE ;HAVE PROCESSED ALL OF INITIAL MESSAGE?
CAIA ;NO
JRST GOTDA1 ;YES, GO SPLICE CONNECTION
MOVE T4,T2 ;GET COUNT OF BYTES REMAINING
MOVN T3,T2 ;READ EXACTLY THAT NUMBER
MOVE T2,[POINT 8,DBUFFR]
SIN ; Read remaining bytes
ERJMP BADCON
JRST GOTDAX ;PRINT IT
;SAVE COPY OF OUTPUT GOING TO TERMINAL
;T1-T4 ARE SET FOR SOUT TO TTY
SAVTTO: SAVEAC <T1,T2,T3,T4> ;BE TRANSPARENT
MOVM T1,T3 ;GET POS COUNT OF CHARS HERE
CAMGE T1,NMSPC ;MORE THAN SPACE IN MEM BFR?
IFSKP.
; *** CODE COULD BE PUT HERE TO WRITE THE BFR TO A FILE ALSO ***
MOVE T1,[POINT 8,MEMBUF] ;YES, RESET BUFFER
MOVEM T1,MEMPTR
MOVEI T1,NMEMBF*5
MOVEM T1,NMSPC
ENDIF.
ADDM T3,NMSPC ;REDUCE SPACE BY AMOUNT OF THIS SOUT
MOVE T1,MEMPTR ;PTR TO MEMORY BUFFER
SOUT
MOVEM T1,MEMPTR ;SAVE UPDATED PTR
RET
SUBTTL ALLON - Restore echoing and interrupts on terminal
ALLON: MOVX T1,.FHJOB ; Set terminal interrupt word for entire job
SETOM T2 ; Terminal interrupt word mask for all codes
STIW ; Set terminal interrupt word
MOVEI T1,.PRIIN ; Primary input
RFMOD ; Read JFN mode word
TXO T2,TT%ECO!TT%DAM ; Echo on, ASCII data mode, output translation disabled
SFMOD ; Set new JFN mode word
RET ; Done, return to caller
;ROUTINE TO SCAN THE STRING IN INSTR AND CONVERT ANY
;INSTANCE OF THE DIGRAPH "::" TO "-". THIS IS DONE
;BECAUSE COLONS ARE DIFFICULT TO PASS VIA FILE
;SPECS BUT DASHES AREN'T.
COLDSH: MOVE T2,[POINT 7,INSTR] ; Source string
MOVE T3,[POINT 7,NODE0]
SETZM ROUTE
MOVE Q1,T2 ;STASH THE BP
ILDB T4,T2
CALL GUDCHR
JRST ENDO3
SKIPA
COLDS0: ILDB T4,T2 ; Get a byte
CAIN T4,":" ; Start of a digraph?
JRST ENDOF ;YES, GO FIGURE IT OUT
IDPB T4,T3 ;NO, stash it
JUMPN T4,COLDS0 ; If more to do, proceed
JRST DUN ;GO FINISH UP
;here is found : in file spec
ENDOF: SETZM T4
IDPB T4,T3 ; Tie it off
ILDB T4,T2 ; get next
CAIE T4,":" ; Another one?
ENDO3: JRST [ TMSG <
? Invalid node name format
>
CALL ALLON
JRST HSTNAM]
ILDB T4,T2 ;PEEK AHEAD 1 BYTE
SKIPN T4 ;IF NONE, NO ROUTING NEEDED
JRST DUN ;GO FINISH UP
CALL GUDCHR ;IS IT LEGIT?
ENDO4: JRST [ TMSG <
? Illegal character after ::
>
CALL ALLON
JRST HSTNAM]
SETO T4, ;BACKUP THE
ADJBP T4,T2 ; BYTE
MOVEM T4,T2 ; POINTER
MOVE Q1,T2 ;STASH THE BP
MOVE T3,[POINT 7,ROUTE]
MOVEI T4,1
IDPB T4,T3
ENDO0: ILDB T4,T2 ; Get next
CAIE T4,":" ;A DELIMITER?
JRST ENDO1 ;NO
ILDB T4,T2 ;YES, GET NEXT BYTE
CAIE T4,":" ;A SECOND DELIMITER?
JRST ENDO3 ;NO, CAN'T HAVE THAT
IDPB T4,T3 ;PUT IN :
IDPB T4,T3 ; AGAIN
ILDB T4,T2 ;PEEK AHEAD 1 BYTE
SKIPN T4 ;IF NONE, OK
JRST [ SETO T4,
ADJBP T4,T2
MOVEM T4,T2
JRST ATEND]
SETO Q1, ;FAKE A BACK UP
ADJBP Q1,T2 ; AND STASH THE BP
CALL GUDCHR ;IS IT LEGIT?
JRST ENDO4 ;NO, TOO BAD
ENDO1: JUMPE T4,ATEND ;IF NULL, DONE
IDPB T4,T3 ;STASH IT
JRST ENDO0 ; Copy string
ATEND: PUSH P,T1
LDB T1,T3 ; Look at last byte
CAIE T1,":" ; Finish correctly?
JRST [ MOVEI T1,":"
IDPB T1,T3
IDPB T1,T3
JRST .+1]
HRROI T1,[ASCIZ /"23="/]
MOVE T2,T3
SETZM T3
SIN ; Finish string
POP P,T1
IDPB T3,T2 ; Tie it off
DUN: MOVE T3,[POINT 7,DESTND] ;MAKE BP TO DESTINATION NODE NAME
DUN1: ILDB T4,Q1 ;GET A BYTE
CAIN T4,":" ;IS IT A DELIMITER?
IFNSK. ;YES
SETZ T4, ;END OF NODE NAME
JRST DUN2 ;AND FINISH
ENDIF.
CAILE T4,"Z" ;IS IT LOWER CASE?
SUBI T4,40 ;YES, MAKE IT UPPER CASE
DUN2: IDPB T4,T3 ;PUT IN THE BYTE
SKIPE T4 ;ARE WE DONE?
JRST DUN1 ;NO
RET ;YES
;ROUTINE TO CHECK FOR LEGITIMATE CHARACTERS IN A NODE NAME
;ACCEPTS: T4/ ASCIZ OF CHARACTER
;RETURNS: +1 ILLEGAL
; +2 OK
GUDCHR: CAIGE T4,"0"
RET
CAIG T4,"9"
RETSKP
CAIGE T4,"A"
RET
CAIG T4,"Z"
RETSKP
CAIGE T4,"a"
RET
CAIG T4,"z"
RETSKP
RET
SUBTTL PRESCN - Prescan EXEC command for host name
PRESCN: SKIPE VIRGIN ; Starting out fresh?
RETSKP ; No..., so return +2 to force prompt
MOVEI T1,.RSINI ; Make rescan buffer available
RSCAN ; as command line to process reading from CTTY
ERJMP PRESC1
MOVX T1,.RSCNT ; Get count of characters
RSCAN ; in rescan buffer
ERJMP PRESC1
JUMPE T1,[RETSKP] ; None there, so must prompt
MOVEI T1,.PRIIN ; Primary input
BIN ; Read a character
CAIE T2,"R" ; RUN or R (program name can't start with "R")
CAIN T2,"r" ; Check lowercase also
JRST PRESC0 ; Yes, no prescanning, go eat rest of line
PRES1: CAIE T2," " ; Have we hit a space yet?
CAIN T2," " ; Also accept a tab
JRST PRES2 ; Yes, read the node name
CAIN T2,.CHLFD ; Have we hit EOL yet?
RETSKP ; Yes, no node name, skip return to prompt
BIN ; Read the next character
JRST PRES1 ; And loop to test
PRES2: MOVSI T1,.TICCY ; Default to ^Y for interrupt character
MOVSM T1,UESCCH ;SAVE IT FOR MTOPR
HRRI T1,1 ; And use channel one
ATI ; Assign terminal code to interrupt channel
MOVX T1,1B0 ; Get a hi order bit
LSH T1,-.TICCY ; Shift bit by value of ^Y code
TXO T1,1B<.TICTI> ; Allow typein
MOVEM T1,STIMSK ; Save for use later
SETOM CTRLY ;SAY USE CTRL/Y
PROMPT <> ; Null prompt
RET ; Done, return no skip to not prompt
;HERE TO FLUSH REST OF EXEC COMMAND LINE
PRESC0: BIN ; Get next byte
CAIE T2,.CHLFD ; The end of line?
JRST PRESC0 ; No, Try again
RETSKP ; Yes, return +2 to prompt for node
;Here if rescan attempt does not succeed
PRESC1: HRROI T1,[ASCIZ/Unexpected error in scanning command line/] ; If error,
ESOUT ; tell user
HALTF ; and halt
JRST START ; Start over if continued...
SUBTTL BADCON - Handle a broken network connection
BADCON: CIS ; Prevent further interruption
CALL ALLON ; Restore TTY modes
SKIPN PTYF ;IF NON-MONITOR CHAR HANDLING,
IFSKP.
MOVE T1,FORK ; Restore the process handle
KFORK ; Kill the terminal input process
ENDIF.
MOVE T1,DCNJFN ; Get JFN
MOVEI T2,.MORDA
HRROI T3,INSTR
SETZM T4
MTOPR ; Get any optional data
ERJMP .+1
SETZM T1
IDPB T1,T3
HRROI T1,[ASCIZ /
?Connection broken/] ; Tell user bad news
PSOUT
JUMPN T4,[HRROI T1,[ASCIZ / at host /]
PSOUT
HRROI T1,INSTR
PSOUT
JRST .+1]
; HRROI T1,[ASCIZ /. Reason: /]
HRROI T1,[ASCIZ/ - /]
PSOUT
NOTCON: MOVE T1,DCNJFN ; Restore network connection JFN
MOVEI T2,.MORLS ; Get current link status
MTOPR
ERJMP [JSERR ; JFN must be bad
JRST START]
NOTCO1: HRRZ T2,T3 ; Get DECnet error reason code
; MOVEI T1,.PRIOU ; Output to users terminal
; MOVEI T3,12 ; In decimal
; NOUT ; Type it
; JFCL
CAIG T2,MAXMSG ; Know about this error?
SKIPN T1,MSGTBL(T2) ; Yes, have one to type?
SKIPA ; No
PSOUT ; Yes, type it then
HRROI T1,[ASCIZ /
/]
PSOUT ; Pretty it
MOVE T1,DCNJFN ; Get the JFN for the link
TXO T1,CZ%ABT ; Abort any operations
CLOSF ; Close it
ERJMP [JSERR ;If fails tell why
JRST .+1]
HALTF ; Halt here
JRST START ; And start at beginning if continued
SUBTTL ESC - Handle input of panic escape character from terminal
;
; Note: This routine runs at software interrupt level when the user
; types the specifed escape character. It resets the terminal
; to its normal mode and halts, thus causing the EXEC to regain
; control. If the EXEC CONTINUE command is issued data will be
; again directed to the remote host.
;
ESC: DMOVEM T1,SAVACE ; Save AC's we're going to use
DMOVEM T3,SAVACE+2
SKIPN PTYF ;PROGRAM PASSING CHARACTERS?
IFSKP.
MOVE T1,FORK ; Restore process handle
FFORK ; Freeze the terminal input process
ENDIF.
MOVEI T1,.PRIOU ; Users terminal
RFMOD ; Get current TTY modes
PUSH P,T2 ; Save them
TXO T2,TT%DAM ; ASCII data mode, output translation disabled
SFMOD ; Set new JFN mode word
CFOBF ; Flush any pending terminal output
MOVEI T1,.PRIIN ; Users terminal
CFIBF ; Flush terminal type ahead
MOVE T1,DCNJFN ;GET THE LINK
MOVEI T2,.MORLS ;READ THE
MTOPR ; LINK'S STATUS
ERJMP ESC1 ;TOO BAD
TXNE T3,MO%WCC ;WAITING FOR CONNECTION TO COME TRUE?
IFNSK. ;YES, STILL WAITING
TMSG <
Attempt to make connection has been aborted
>
CALL ALLON ;RESET TTY TO NORMAL MODE
RESET ;CLEAR EVERYTHING
JRST HSTNAM ;START OVER
ENDIF.
MOVEM T3,SAVSTS ;NO, WE'VE BEEN CONNECTED - SAVE THE LINK STATUS
TXNE T3,MO%CON ;STILL CONNECTED?
JRST ESC2 ;YES
ESC1: TMSG <
Back at node >
CALL GETUS ;OUTPUT OUR NODE NAME
TMSG <, connection broken - >
MOVE T3,SAVSTS ;RETRIEVE LINK STATUS
JRST NOTCO1
ESC2: TMSG <
Back at node >
CALL GETUS
HRROI T1,[ASCIZ/ - type CONTINUE to resume connection
/] ; Let him know how to restart
PSOUT
CIS
HALTF ; Halt here until continued
REENT: HRROI T1,[ASCIZ/
%Continuing at node /]
PSOUT ; Let user know we are restarting
HRROI T1,DESTND ;POINT TO NODE NAME
PSOUT ;PUT IT OUT
TMSG < ....
>
MOVEI T1,.PRIOU ; Users terminal
POP P,T2 ; Desired TTY modes
SFMOD ; Set new JFN mode word
SKIPN PTYF ;LOCAL CHARACTER HANDLING?
IFSKP.
MOVE T1,FORK ; Restore process handle
RFORK ; Resume the terminal input process
ENDIF.
DMOVE T1,SAVACE ; Restore the AC's
DMOVE T3,SAVACE+2
JRST GOTDA1
;OUTPUT THE LOCAL NODE NAME
;RETURNS: +1
GETUS: MOVX T1,.NDGLN
MOVX T2,T3
MOVE T3,[POINT 7,LOCAL]
NODE ; Get our node name
JFCL
HRROI T1,LOCAL
PSOUT ; Type node name to user
RET
SUBTTL DOINP0 - Read terminal input and send to remote host
;
; Note: This routine runs as a separate process to read characters
; from the users terminal and send them to the NRTSRV server
; which is running on the remote host system.
; It is only started if PTYF is on.
DOINP0: MOVEI T4,MAXINP ; Maximum input characters
MOVE T3,[POINT 7,INSTR] ; Where they are going
MOVEI T1,.PRIIN ; Primary input
BIN ; Wait for a byte
JRST DOIN0 ; Got one, go handle it...
DOINP: SIBE ; Any bytes?
SKIPA ; Yes
JRST EMPTY ; No
BIN ; Get another byte
DOIN0: IDPB T2,T3 ; Stash it in input stream buffer
SOJG T4,DOINP ; Do it all
EMPTY: MOVNI T3,MAXINP ; Maximum characters
ADD T3,T4 ; Compute number to send
JUMPE T3,DOINP0 ; If none, go wait
MOVE T1,DCNJFN ; The network JFN
HRROI T2,INSTR ; Pointer to input stream buffer
SOUTR ; Send this buffer to remote MCBNRT
JRST DOINP0 ; And continue
SUBTTL MSGTBL - Table of DECnet disconnect/abort reason text
;
; This table is used by the BADCON routine to provide an english
; text translation for the DECnet error codes which indicate why
; the network logical link connection was broken
;
;MACRO TO MAKE ENTRIES IN NSP ERROR TABLE
MAXMSG==^D50 ; Maximum number of NSP error messages
DEFINE NSPERR (CODE,TEXT,BASE<MSGTBL>),<
.ORG BASE+CODE
POINT 7,[ASCIZ\ TEXT\]
.ORG
>
MSGTBL: ;DECNET ERROR TEXT TABLE
REPEAT MAXMSG,<POINT 7,[ASCIZ\: Undefined NSP error\]> ;MAKE TABLE SPACE
; & UNDEFINED ENTRIES
NSPERR (.DCX0,<Reject or disconnect by object>)
NSPERR (.DCX1,<Resource allocation failure>)
NSPERR (.DCX2,<Destination node does not exist>)
NSPERR (.DCX3,<Remote node shutting down>)
NSPERR (.DCX4,<Destination NVT process does not exist>)
NSPERR (.DCX5,<Invalid process name field>)
NSPERR (.DCX6,<NVT server is busy>)
NSPERR (.DCX7,<Unspecified error>)
NSPERR (.DCX8,<Abort by management>)
NSPERR (.DCX9,<Abort by NVT server>)
NSPERR (.DCX10,<Invalid node name>)
NSPERR (.DCX11,<Local node shut>)
NSPERR (.DCX21,<CI with illegal destination address>)
NSPERR (.DCX24,<Flow control violation>)
NSPERR (.DCX32,<Too many connections to node>)
NSPERR (.DCX33,<Too many connections to destination NVT process>)
NSPERR (.DCX34,<Access not permitted>)
NSPERR (.DCX35,<Logical link services mismatch>)
NSPERR (.DCX36,<Invalid account>)
NSPERR (.DCX37,<Segment size too small>)
NSPERR (.DCX38,<No response from remote system>)
NSPERR (.DCX39,<Node unreachable>)
NSPERR (.DCX40,<Link aborted due to data loss>)
NSPERR (.DCX41,<Destination process does not exist>)
NSPERR (.DCX42,<Confirmation of disconnect initiate>)
NSPERR (.DCX43,<Image data field too long>)
END 3,,EVEC