.TITLE RSTINI -- INITIALIZE RSX TO RSTS REMOTE TERMINAL .IDENT /X01.05/ ;* ;* LAST EDIT: WOLERY 9 JULY 80 ; ; COPYRIGHT (C) 1979 ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED ; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; VERSION X01.00 ; M.L. SPENCE ; MODIFIED FROM RVT PROGRAM, BY R. E. CALDWELL 15-DEC-79 ; RVT MODIFIED BY: R. E. CALDWELL 11-JAN-80 ; RCXXX -- CORRECTLY HANDLE CARRAIGE CONTROL FOR RPR FUNCTIONS. ; ; REMOTE VIRTUAL TERMINAL ; ; THIS PROGRAM RUNS ON A LOCAL NODE (M/M-PLUS ONLY) TO ALLOW A TERMINAL ; TO APPEAR TO BE LOCALLY ATTACHED TO A REMOTE RSTS/E NODE. ; THE USER INTERFACE AND THE PROTOCOL OF THE DECNET/E "NET" TASK ARE USED. ; ; ALL I/O IS INITIATED WITHIN AST'S; ALL I/O HAS COMPLETION AST'S DECLARED. ; ; ; MACRO LIBRARY CALLS .MCALL DIR$ .MCALL NETDF$,CRBDF$,TTSYM$ NETDF$ ; DEFINE NET SYMBOLICS CRBDF$ ; DEFINE CON BLOCK SYMBOLICS TTSYM$ ; DEFINE TT SYMBOLICS .MACRO CALLR A JMP A .ENDM .PSECT $$CODE,RO,I ;* ;* IF THE FOLLOWING PARAMETER IS DEFINED, CALLS TO A NETWORK ;* MESSAGE-TRACING PACKAGE WILL BE INSERTED IN THE INITIALIZATION, ;* LINK RECEIVE, AND LINK TRANSMIT SECTIONS. ;* MTRACE=1 ;TRACE MESSAGES SENT AND RECEIVED .SBTTL SETUP -- INITIALIZATION PROCESSING ;+ ; ; ; SUBROUTINE TO ESTABLISH ENVIRONMENT AND SET UP THE LINK TO ; THE REQUESTED NODE ; ; FOR RSTS, CHANGES TO THE CONTENT AND CHECKING OF CONFIGURATION ; MESSAGES HAVE BEEN MADE. ; ;- SETUP:: CALL GTCMDL ; GET COMMAND LINE BCS 70$ ; IF CS, FAILED - FATAL CALL ASGLUN ; ASSIGNED NEEDED LUNS BCS 70$ ; IF CS, FAILED - FATAL MOV #POOL,R0 ; R0 = ADDRESS OF POOL LISTHEAD CALL $INIDM ; INITIALIZE THE POOL CMP R2,#<$MXMSG*$BFLVL*4> ; POOL LARGE ENOUGH TO RUN ? BGT 30$ ; IF GT, YES CALL ERR14 ; INSUFFICIENT DYNAMIC MEMORY BR 70$ ; RETURN WITH CARRY SET 30$: CALL TRMSET ; SETUP THE TERMINAL BCS 70$ ; IF CS, FAILED - FATAL CALL NETINI ; INITIALIZE NETWORK ACCESS BCS 70$ ; IF CS, FAILED - FATAL CALL HOSTMS ; INITIAL MESSAGE SEQUENCE WITH HOST NODE 70$: RETURN ; RETURN TO CALLER .SBTTL GTCMDL -- INITIAL USER INPUT ;+ ; ; ; GET COMMAND LINE AND NODE NAME ; ;- GTCMDL:: ; REFERENCE LABEL MOV #CONBL+N.RND,R0 ; R0 = POINTER TO NODE NAME MOV #6.,R1 ; R1 = COUNTER 5$: MOVB #' ,(R0)+ ; BLANK THE NODE NAME SOB R1,5$ ; DIR$ #GMCR ; GET COMMAND LINE BCC 10$ ; IF CC, SUCCESS BR 40$ ; IF CS, FAILED - PROMPT AND USE DEFAULT NAME 10$: MOV #GMCR+G.MCRB,R1 ; R1 = ADDRESS OF COMMAND LINE MOVB (R1)+,RSTSK+0 ; SAVE TASK NAME MOVB (R1)+,RSTSK+1 ; MOVB (R1)+,RSTSK+2 ; MOV $DSW,R0 ; R0 = BYTE COUNT SUB #3,R0 ; ADJUST BY TASK NAME LENGTH BEQ 40$ ; IF EQ, PROMPT FOR NODE NAME CMPB #' ,(R1) ; BLANK ? BNE 20$ ; IF NE, PROCEED DEC R0 ; REDUCE COUNT BEQ 40$ ; IF EQ NOW, PROMPT FOR NODE NAME ;* ;* REMOTE HOST NODENAME WAS ON SAME LINE WITH TASK INVOCATION ;* INC R1 ; POSITION TO NODE NAME 20$: MOV R0,LNODE ; SET LENGTH OF NODE NAME MOV R1,NODPTR ; SAVE POINTER TO NODENAME STRING BR 60$ ; PROCEED ;* ;* TASK WAS INVOKED WITHOUT COMMAND -- PROMPT FOR HOST NODENAME ;* ;* EXIT HERE IF USER TYPES ^Z ;* 40$: DIR$ #NODQIO ; PROMPT FOR NODE NAME BCC 50$ ; IF CC, SUCCESS CALL ERR2 ; FAILED TO GET NODE NAME BR 70$ ; 50$: TSTB IOSB ; SUCCESSFUL ? BGT 55$ ; IF GT, YES CMPB #IE.EOF,IOSB ; CTLZ ? BEQ 52$ ; IF EQ, YES EXIT RVT CALL ERR2 ; BR 70$ ; 52$: SEC ; MAKE LIKE ERROR TO FORCE EXIT BR 70$ 55$: MOV IOSB+2,LNODE ; SET LENGTH OF NODE NAME BEQ 52$ ; IF NO INPUT, EXIT QUIETLY. MOV #GMCR+G.MCRB,NODPTR ;SAVE POINTER TO NODENAME STRING ;* ;* HAVE REMOTE NODENAME IN CONNECT BLOCK -- CONVERT IT TO UPPERCASE ;* AND TERMINATE PROPERLY FOR PMR CONNECT ;* 60$: MOV NODPTR,R2 ; POINT TO NODE NAME MOV LNODE,R1 ; COUNT 65$: MOVB (R2),R0 ; BYTE MOVB CVTLUP(R0),(R2)+; CONVERT TO UPPERCASE SOB R1,65$ ; CMPB -1(R2),#': ;TERMINATED WITH CORRECT PUNCTUATION? BEQ 68$ ; YES MOVB #':,(R2)+ ; NO -- PLANT NODENAME TERMINATORS MOVB #':,(R2)+ ; DOUBLE COLON 68$: CLRB (R2)+ ;MAKE STRING ASCIZ FOR PMR ROUTINE SUB NODPTR,R2 ;COMPUTE LENGTH OF STRING MOV R2,LNODE ;AND SAVE FOR LATER CLC ; INDICATE SUCCESS 70$: RETURN ; RETURN TO CALLER .SBTTL ASGLUN - ASSIGN NEEDED LUNS ;+ ; ; ; ; SUBROUTINE TO ASSIGN NEEDED LUNS ; ;- ASGLUN:: MOV #NDATA,ALUN+A.LULU ; SET LUN IN DPB MOV #"NS,ALUN+A.LUNA ; SET DEVICE IN DPB DIR$ #ALUN ; ASSIGN THE LUN BCC 10$ ; IF CC, SUCCESS BR 40$ ; TAKE ERROR OUT 10$: MOV #LINK,ALUN+A.LULU ; SET LUN IN DPB DIR$ #ALUN ; ASSIGN THE LUN BCC 20$ ; IF CC, SUCCESS BR 40$ ; TAKE ERROR EXIT 20$: CLC ; INDICATE ASSIGNMENTS COMPLETE RETURN ; RETURN TO CALLER 40$: CALL ERR3 ; FAILED TO ASSIGN LUN RETURN ; RETURN TO CALLER .SBTTL TRMSET - INITIALIZE THE USER TERMINAL ;+ ; ; ; SETUP THE TERMINAL -- ATTACH IT ; ;- TRMSET:: ; REFERENCE LABEL DIR$ #GLUN ; GET LUN INFORMATION FOR TERMINAL CMP #"HT,LBUF ; IF THIS IS AN RSX NETWORK TERMINAL, BNE 5$ ; THEN CAN'T ATTACH IN USUAL MANNER. INCB HTRFLG ; SET FLAG FOR STATUS. 5$: DIR$ #QIOGTS ; GET TERMINAL DRIVER SUPPORT INFO BCC 20$ ; IF CC, SUCCESS 10$: TSTB HTRFLG ; IF THIS IS ANOTHER NETWORK TERMINAL, BNE 30$ ; THEN FORGET CHARACTERISTICS. CALL ERR19 ; INDICATE THE ERROR SEC ; CAUSE EXIT BR 70$ ; PROCEED 20$: TSTB IOSB ; SUCCESS ? BLE 10$ ; IF LE, NO MOV #GTSBUF,R0 ; POINT TO BUFFER ; VERIFY THE NEEDED FUNCTIONS BIT #F1.BTW,(R0) ; BREAK-THROUGH WRITE BEQ 10$ ; IF EQ, NOT ENOUGH SUPPORT BIT #F1.UIA,(R0) ; UNSOLICITED INPUT AST BEQ 10$ ; BIT #F1.ESQ,(R0) ; ESCAPE-SEQUENCE RECOGNITION BEQ 10$ ; BIT #F1.RPR,(R0) ; READ-AFTER-PROMPT BEQ 10$ ; ; ; THE FOLLOWING TEST WILL BE ENABLED AS SOON AS TTDRV IS CHANGED. ; ; BIT #F2.FDX,2(R0) ; IS IT FDX TERMINAL DRIVER ; BEQ 10$ ; IF EQ, NO BIT #F2.GCH,2(R0) ; CAN WE GET MULTIPLE CHARACTERISTICS? BEQ 30$ ; IF EQ, NO DIR$ #QIOGMC ; FIND OUT EVERYTHING INTERESTING 30$: DIR$ #QIOATT ; ATTACH TERMINAL -- TAKE OVER BCC 40$ ; IF CC, SUCCESS CALL ERR6 ; SET ERROR BR 70$ ; RETURN 40$: TSTB IOSB ; OK ? BGT 60$ ; IF CC, SUCCESS TSTB HTRFLG ; IF THIS IS NOT ANOTHER NETWORK TERMINAL, BEQ 50$ ; WE CAN'T TALK TO THIS GUY MOVB #RE.OFF,INIMSG+R.CMN+1 ; START OUT IN ODT MODE INCB MODE ; SET OUR ODT MODE FLAG BIC #TF.NOT!TF.ESQ,QIOATT+Q.IOFN ; CLEAR NOTIFICATION OPTION DIR$ #QIOATT ; TRY TO GET STANDARD ATTACH TO ARM AST'S BCS 50$ ; IF THIS DOESN'T WORK, CAN'T TALK TO TERMINAL TSTB IOSB ; REALLY OK? BLE 50$ ; IF NOT, WE REALLY CAN'T RUN CALL ERR21 ; TELL USER WE'RE STUCK IN ODT MODE BR 60$ ; LET PROGRAM PLOD ALONG 50$: CALL ERR6 ; SET ERROR; WARN NET USER BR 70$ ; MIGHT AS WELL EXIT TASK 60$: CLC ; PROCEED TO CONNECT TO REMOTE HOST 70$: RETURN ; RETURN TO CALLER .SBTTL CTLSET - SET UP CONTROL MSG FOR HOST ABOUT TERMINAL ;+ ; ; ; THIS ROUTINE USES THE DATA OBTAINED ABOUT THE USER TERMINAL ; TO INFORM THE HOST ABOUT ITS OPERATING CHARACTERISTICS ; BY SETTING UP THE PROPER FIELDS IN THE INITIAL CONTROL MESSAGE. ; INIMSG IS ALREADY SET UP WITH DEFAULT VALUES. ; ; INPUT: LBUF = GET-LUN INFORMATION ; GTSBUF = TERMINAL DRIVER CHARACTERISTICS ; GMCBUF = TERMINAL MULTIPLE CHARACTERISTICS ; ; OUTPUT: INIMSG = INITIAL CONTROL MESSAGE FOR REMOTE HOST ; ;- CTLSET:: TSTB HTRFLG ;IS THIS A NETWORK TERMINAL ALREADY? BNE 90$ ;MUST USE DEFAULTS, CAN'T GET REAL DATA MOVB TRPWID,I.WID ;TERMINAL WIDTH MOVB TRVFIL,I.FIL ;TERMINAL VERTICAL FILL CHARACTERS NEEDED TSTB TRIESC ;INPUT ESCAPE SEQENCES RECOGNIZED? BNE 10$ ; YES -- THIS IS DEFAULT BIC #RP.ESC,I.TYP ; SET NO INPUT ESCAPE SEQUENCES 10$: TSTB TRHTAB ;HARDWARE TAB CAPABILITY? BNE 20$ ; YES -- THIS IS DEFAULT BIC #RP.TAB,I.TYP ; SET NO HORIZONTAL TAB CAPABILITY 20$: CMPB #T.LA36,TRTTYP ;LA36 TERMINAL? BEQ 30$ ; YES -- CAN PRINT LOWER CASE CMPB #T.VT52,TRTTYP ;VT52 OR LATER-MODEL TERMINAL? BLE 30$ ; YES -- CAN PRINT LOWER CASE BIC #RP.LWO,I.TYP ; SET NO LOWER CASE OUTPUT CAPABILITY 30$: 90$: RETURN .SBTTL NETINI - INITIALIZE NETWORK ACCESS ;+ ; ; ; SUBROUTINE TO ASK FOR NETWORK ACCESS, CONNECT TO HOST ;- NETINI:: DIR$ #OPNET ; ACCESS THE NETWORK TSTB IOSB ; CHECK STATUS BGT 10$ ; IF GT, SUCCESS CALL ERR3 ; FAILED TO ACCESS NET BR 70$ ; 10$: DIR$ #GLND ; GET LOCAL NODE NAME MOV #MRR18N,R0 ; POINT TO LOCAL NODE NAME MOV #RSTN,R1 ; POINT TO TASK PROMPT TEXT 20$: CMPB #' ,(R0) ; BLANK ? BEQ 25$ ; REACHED END OF STRING MOVB (R0)+,(R1)+ ; MOVE LOCAL NODE NAME TO PROMPT BR 20$ ; REPEAT 25$: MOVB #':,(R0)+ ; INSERT : MOVB #':,(R0) ; DIR$ #NTDATA ; SET UP FOR UNSOLICITED NET DATA TSTB IOSB ; OK ? BGT 30$ ; IF GT, SUCCESS CALL ERR4 ; FAILED TO SET MAILBOX BR 70$ ; RETURN WITH CARRY SET 30$: MOV #PMRBLK,R5 ; POINT TO THE CONTROL BLOCK MOV NODPTR,P$NOD(R5) ;SET UP NODENAME STRING POINTER CALL $CONN ; ATTEMPT THE CONNECT WITH PMR ROUTINE BCC 35$ ; OK? CALL ERR5 ; NO, INDICATE ERROR BR 70$ ; RETURN WITH CARRY SET 35$: MOV NODPTR,R1 ; POINT TO NODE NAME STRING MOV LNODE,R2 ; GET LENGTH OF STRING SUB #3,R2 ; BACK UP OVER END PUNCTUATION ADD R2,R1 ; POINT TO END 36$: CMPB -(R1),#': ; LOOK FOR PREVIOUS NODENAME BEQ 37$ ; FOUND END OF PREVIOUS NODENAME IN PATH SOB R2,36$ ; LOOP TO BEGINNING OF STRING BR 38$ ; ONLY ONE NODENAME IN STRING 37$: INC R1 ; HAVE BEGINNING OF TARGET NODENAME 38$: MOV R1,TGTPTR ; SAVE POINTER TO ACTUAL HOST NAME MOV NODPTR,R0 ; POINT TO NODENAME STRING ADD LNODE,R0 ; POINT TO END OF STRING DEC R0 ; POINT TO LAST : (SKIP ZERO BYTE) SUB TGTPTR,R0 ; R0 = LENGTH OF HOST NODE NAME MOV R0,LTGTND ; SAVE LENGTH OF ACTUAL HOST NAME MOV #MRR17N,R3 ; R3 = ADDRESS OF MESSAGE 17 AREA FOR NODENAME MOV #MRR20N,R4 ; R4 = ADDRESS OF MESSAGE 20 AREA FOR NODENAME 40$: MOVB (R1),(R3)+ ; COPY HOST NODENAME INTO MESSAGE MOVB (R1)+,(R4)+ ; ONCE MORE SOB R0,40$ ; PROCEED 60$: .IF DF MTRACE ;MESSAGE-TRACE DEBUGGING PACKAGE CALL TRCINI ; INITIALIZE TRACE ROUTINES .ENDC INCB LNKFLG ; INDICATE LINK EXISTS CLC ; INDICATE SUCCESSFUL SETUP 70$: RETURN .SBTTL HOSTMS - INITIAL MESSAGE SEQUENCE WITH HOST NODE ;+ ; ; ; EXCHANGE CONFIGURATION MESSAGES WITH REMOTE HOST, ; AND SEND INITIAL CONTROL MESSAGE TO SET DEFAULTS. ; INITIALIZATION IS A SYNCHRONOUS PROCESS. ;- HOSTMS:: DIR$ #RCVCNF ; REC CONFIGURATION AND VERIFY TSTB IOSB ; OK ? BGT 10$ ; IF GT, SUCCESS CALL ERR8 ; FAILED TO REC CONF MESSAGE BR 70$ 10$: .IF DF MTRACE ;MESSAGE-TRACE DEBUGGING PACKAGE MOV #CNFBUF,R0 ; POINT TO RECEIVED MESSAGE CALL TRCRCV ; RECORD RECEIVED MESSAGE .ENDC CMPB #RT.CFG,CNFBUF+R.TYP ;* IS IT A CONFIGURATION MESSAGE BEQ 40$ ; IF EQ, YES 20$: CALL ERR17 ; ISSUE ERROR MESSAGE BR 70$ ; PROCEED 40$: CMPB #RO.RST,CNFBUF+R.OST ;* DOES REMOTE SPEAK RSTS PROTOCOL BEQ 45$ ;* IF EQ, YES CMPB #RO.RST,CNFBUF+4 ;* RSTS PROTOCOL WITH STANDARD CFG? BNE 20$ ;* NO, REJECT THIS HOST 45$: .IF DF MTRACE ;MESSAGE-TRACE DEBUGGING PACKAGE MOV #CNFMSG,R0 ; POINT TO CONFIGURATION MESSAGE SENT CALL TRCXMT ; RECORD TRANSMITTED MESSAGE .ENDC DIR$ #SNDCNF ; SEND CONFIGURATION MESSAGE TSTB IOSB ; OK ? BGT 50$ ; IF GT, SUCCESS CALL ERR7 ; FAILED TO SEND CONFIGURATION MESSAGE BR 70$ ; 50$: CALL CTLSET ; SET TERMINAL CHARACTERISTICS IN CONTROL MSG .IF DF MTRACE ;MESSAGE-TRACE DEBUGGING PACKAGE MOV #INIMSG,R0 ; POINT TO INITIAL CONTROL MESSAGE SENT CALL TRCXMT ; RECORD TRANSMITTED MESSAGE .ENDC DIR$ #SNDINI ; SEND INITIAL CONTROL MSG TO HOST TSTB IOSB ; OK ? BGT 60$ ; IF GT, SUCCESS CALL ERR9 ; FAILED TO SEND INITIAL CONTROL MSG BR 70$ ; 60$: CALL ERR20 ; INFORM USER HOST IS PREPARED NOW INCB HINFLG ; INDICATE HOST INITIALIZATION COMPLETE CLC ; INDICATE SUCCESSFUL SETUP 70$: RETURN .PAGE .END