.TITLE RJEMSG - VAX/XRB HOST MESSAGE PROCESSOR ;----------------------------------------------------------------------; ; MODULE: RJEMSG ; ; LANGUAGE: DEC PDP-11/34 MACRO ASSEMBLY LANGUAGE (V3.2) ; ; SYSTEM: DEC PDP-11/34 RUNNING UNDER RSX-11M V3.2 ; ; MOSTEK CORPORATION ; ; COMPUTER AIDS TO DESIGN DIVISION ; ; 1215 WEST CROSBY ROAD ; ; CARROLLTON, TEXAS 75006 ; ; (214) 323-8813 ; ;----------------------------------------------------------------------; ; PROGRAMMER: KEVIN KLUGHART ; ;----------------------------------------------------------------------; ; DATE: 03-13-82 @ 16:00 CDST ; ;----------------------------------------------------------------------; ; PURPOSE: THIS MODULE IS THE REMOTE HOST MESSAGE ; ; PROCESSOR FOR THE VAX/XRB SUBSYSTEM. THIS ; ; TASK DIRECTS ALL OUTPUT MESSAGES BACK TO THE ; ; REMOTE VAX SYSTEMS VIA THE NETWORK MAILBOX ; ; MECHANISM AND ALSO ALLOWS REMOTE VAX USERS TO ; ; TRANSMIT MESSAGES TO THE REMOTE HOST VIA THE ; ; SAME FACILITY. ; ;----------------------------------------------------------------------; .IDENT /V01.00/ ; CURRENT RELEASE .PSECT $DATA .ENABLE LC .SBTTL PROGRAM PARAMETERS ;----------------------------------------------------------------------; ; ; ; ; ; PROGRAM PARAMETERS ; ; ; ; ; ;----------------------------------------------------------------------; ; LOGICAL UNIT ASSIGNMENTS ; ;----------------------------------------------------------------------; TILUN = 1 ; LOGICAL UNIT FOR TERMINAL I/O NTLUN = TILUN+1 ; START OF NETWORK LUN LIST ;----------------------------------------------------------------------; ; EVENT FLAG ASSIGNMENTS ; ;----------------------------------------------------------------------; TIFLAG= 1 ; EVENT FLAG FOR TERMINAL I/O WTFLAG= TIFLAG+1 ; EVENT FLAG FOR MARK TIME DIRECTIVE NTFLAG= WTFLAG+1 ; START OF NETWORK EVENT FLAG LIST ;----------------------------------------------------------------------; ; BUFFER DEFINITION PARAMETERS ; ;----------------------------------------------------------------------; MAXSND= 26. ; MAXIMUM NUMBER OF BYTES IN SDAT$ DIRECTIVE MAXLIN= 4*MAXSND ; MAXIMUM COMMAND LINE LENGTH ;----------------------------------------------------------------------; ; NETWORK TASK-TO-TASK COMMUNICATION PARAMETERS ; ;----------------------------------------------------------------------; MAXBUF= 08. ; NUMBER OF HOST MESSAGES TO QUEUE MAXLNK= 04. ; MAXIMUM NUMBER OF LOGICAL LINKS (VAX USERS) NETTIM= 01. ; PHYSICAL LINK RECOVERY PERIOD (MINUTES) NODLEN= 06. ; MAXIMUM LENGTH OF NETWORK NODE NAMES TSKLEN= 16. ; MAXIMUM LENGTH OF A NETWORK PROCESS NAME .SBTTL EXTERNAL MACROS ;----------------------------------------------------------------------; ; ; ; ; ; EXTERNAL MACROS ; ; ; ; ; ;----------------------------------------------------------------------; ; EXECUTIVE DIRECTIVE MACROS ; ;----------------------------------------------------------------------; .MCALL ASTX$S ; EXIT AST .MCALL CALL ; CALL SUBROUTINE .MCALL DIR$ ; EXECUTE DIRECTIVE .MCALL DSAR$S ; DISABLE AST RECOGNITION .MCALL ENAR$S ; ENABLE AST RECOGNITION .MCALL EXIT$S ; EXIT TASK .MCALL MRKT$S ; MARK TIME (DELAY) .MCALL QIOW$S ; QUEUE I/O .MCALL RCVD$ ; RECEIVE DATA .MCALL RETURN ; RETURN FROM SUBROUTINE .MCALL SDAT$ ; SEND DATA TO A TASK .MCALL SRDA$S ; SPECIFY RECEIVE DATA AST .MCALL WTSE$S ; WAIT FOR SINGLE EVENT FLAG ;----------------------------------------------------------------------; ; NETWORK INTERTASK COMMUNICATION MACROS ; ;----------------------------------------------------------------------; .MCALL ABTW$S ; ABORT A LOGICAL LINK .MCALL ACCW$S ; ACCEPT A LOGICAL LINK REQUEST .MCALL CNBDF$ ; NETWORK CONNECT BLOCK OFFSET DEFINITIONS .MCALL DSCW$S ; DISCONNECT A LOGICAL LINK .MCALL GLNW$S ; GET LOCAL NODE INFORMATION .MCALL GNDW$S ; GET NETWORK CONNECTION REQUEST DATA .MCALL NSSYM$ ; NETWORK FUNCTION SYMBOLIC OFFSET DEFINITIONS .MCALL OPNW$S ; ACCESS (OPEN) THE NETWORK .MCALL REC$S ; RECEIVE DATA OVER A LOGICAL LINK .MCALL REJW$S ; REJECT A LOGICAL LINK CONNECTION REQUEST .MCALL SND$S ; SEND DATA OVER A LOGICAL LINK .MCALL SNDW$S ; SEND DATA OVER A LOGICAL LINK & WAIT .MCALL SPAW$S ; SPECIFY USER NETWORK AST ROUTINE .SBTTL LOCAL MACRO DEFINITIONS ;----------------------------------------------------------------------; ; ; ; ; ; LOCAL MACRO DEFINITIONS ; ; ; ; ; ;----------------------------------------------------------------------; ; ERROR REPORTING MACRO ; ;----------------------------------------------------------------------; ; THIS MACRO ALLOWS THE PROGRAMMER TO SPECIFY AN ERROR VALUE OR ; ; ALLOW THE ERROR MACRO TO SPECIFY AN ERROR INDEX WHICH IS PUT ; ; IN REGISTER R5 PRIOR TO TRAPPING BY AN ODD ADDRESS TRAP. ; ;----------------------------------------------------------------------; .MACRO ERROR ERR,ERRBYT .IF NDF $$$ERR ; DEFINE ERROR COUNT IF FIRST INVOCATION $$$ERR= 0 ; INITIALIZE ERROR COUNT .ENDC .NARG $$$ERC ; COMPUTE NUMBER OF ERROR ARGUMENTS $$$ERR= $$$ERR+1 ; *********** ERROR INDEX *********** .PRINT $$$ERR ; *********** ERROR INDEX *********** MOVB #$$$ERR,R5 ; GET ERROR INDEX POINTER ASL R5 ; SHIFT ERROR TO UPPER 3 OCTAL DIGITS (XXX.000) ASL R5 ; ASL R5 ; ASL R5 ; ASL R5 ; ASL R5 ; ASL R5 ; ASL R5 ; ASL R5 ; RESULT IS CNT.ERR (000.000) .IF NE $$$ERC ; IF NUMBER OF ARGUMENTS IS NOT ZERO, SHOW ERROR BISB ERR,R5 ; GET ERROR NUMBER .ENDC .IF EQ $$$ERC-2 ; IF 2 ARGUMENTS, LOAD R4 WITH ERROR BYTE MOVB ERRBYT,R4 ; GET ERROR BYTE .ENDC TST .+1 ; EXIT WITH FATAL ODD ADDRESS TRAP .ENDM ;----------------------------------------------------------------------; ; ; ; PRINT MESSAGE TO CONSOLE MACRO ; ; ; ;----------------------------------------------------------------------; ; THIS MACRO ALLOWS THE USER TO QUEUE A MESSAGE TO THE USER ; ; TERMINAL, AND LOGS THE MESSAGE TO THE OPERATOR CONSOLE ; ;----------------------------------------------------------------------; .MACRO PRINT MSG,LEN,SPC .NARG $$$CNT ; GET NUMBER OF ARGUMENTS MOV MSG,MS.PTR ; GET ADDRESS OF MESSAGE TO PRINT MOV LEN,MS.LEN ; GET LENGTH OF MESSAGE .IF EQ $$$CNT-2 ; FOR 2 ARGUMENTS MOV #40,MS.SPC ; SINGLE SPACE OUTPUT .ENDC .IF EQ $$$CNT-3 ; FOR 3 ARGUMENTS MOV SPC,MS.SPC ; SELECT CARRIAGE CONTROL .ENDC CALL $MSG ; PRINT THE MESSAGE .ENDM ; END OF PRINT MACRO ;----------------------------------------------------------------------; ; ; ; MOVE BYTE MACRO (3 OPERAND) ; ; ; ;----------------------------------------------------------------------; ; THIS MACRO ALLOWS THE USER TO MOVE A SPECIFIED NUMBER OF BYTES ; ; FROM ONE LOCATION IN MEMORY TO ANOTHER. THIS MACRO CONFORMS ; ; TO THE INSTRUCTION SPECIFICATIONS FOR THE VAX MOVC3 OPCODE ; ;----------------------------------------------------------------------; .MACRO MOVC3 LEN,SRC,DST,?LOOP,?QUIT MOV R0,-(SP) ; PUSH R0, R1, AND R2 MOV R1,-(SP) ; MOV R2,-(SP) ; MOV LEN,R0 ; GET LENGTH OF TRANSFER IN BYTES MOV SRC,R1 ; GET SOURCE OPERAND MOV DST,R2 ; GET DESTINATION OPERAND LOOP: MOVB (R1)+,(R2)+ ; TRANSFER 1 BYTE FROM SOURCE TO DESTINATION DEC R0 ; DECREMENT TRANSFER COUNT BGT LOOP ; AND CONTINUE UNTIL TRANSFER COMPLETE QUIT: MOV (SP)+,R2 ; POP REGISTERS R0, R1, AND R2 MOV (SP)+,R1 ; MOV (SP)+,R0 ; .ENDM ;----------------------------------------------------------------------; ; ; ; STACK MANIPULATION MACROS ; ; ; ;----------------------------------------------------------------------; ; PUSH: PUSH ARGUMENT ON STACK ; ;----------------------------------------------------------------------; .MACRO PUSH ARG MOV ARG,-(SP) .ENDM ;----------------------------------------------------------------------; ; POP: POP ARGUMENT OFF STACK ; ;----------------------------------------------------------------------; .MACRO POP ARG MOV (SP)+,ARG .ENDM ;----------------------------------------------------------------------; ; SAVREG: SAVE REGISTERS R0,R1,R2,R3,R4,R5 ON STACK ; ;----------------------------------------------------------------------; .MACRO SAVREG PUSH R0 PUSH R1 PUSH R2 PUSH R3 PUSH R4 PUSH R5 .ENDM ;----------------------------------------------------------------------; ; RSTREG: RESTORE REGISTERS R0,R1,R2,R3,R4,R5 FROM STACK ; ;----------------------------------------------------------------------; .MACRO RSTREG POP R5 POP R4 POP R3 POP R2 POP R1 POP R0 .ENDM .SBTTL DIRECTIVE PARAMETER BLOCKS ;----------------------------------------------------------------------; ; ; ; ; ; DIRECTIVE PARAMETER BLOCKS ; ; ; ; ; ;----------------------------------------------------------------------; ; ALLOCATE QIO STATUS BLOCK FOR I/O RETURN STATUS ; ;----------------------------------------------------------------------; .EVEN IOSTAT: .BLKW 1 ; I/O STATUS & DEVICE DATA BYTCNT: .BLKW 1 ; TRANSFER COUNT IN BYTES ;----------------------------------------------------------------------; ; ALLOCATE SEND DATA DIRECTIVE BUFFER TO SEND COMMANDS TO RJE ; ;----------------------------------------------------------------------; SNDCMD: SDAT$ RJERSX ; SEND VAX USER COMMAND TO RJE EMULATOR ;----------------------------------------------------------------------; ; ALLOCATE RECEIVE DATA DIRECTIVE BUFFER TO RECEIVE HOST MESSAGES; ;----------------------------------------------------------------------; RCVMSG: RCVD$ RJERSX,MSGTSK ; RECEIVE HOST MESSAGE FROM EMULATOR ;----------------------------------------------------------------------; ; ALLOCATE QIO STATUS BLOCK FOR NETWORK I/O RETURN STATUS ; ;----------------------------------------------------------------------; NTSTAT: .BLKB 1 ; NETWORK I/O STATUS & QUEUE DATA NTTYPE: .BLKB 1 ; NETWORK DATA QUEUE TYPE NTQCNT: ; COUNT OF ITEMS IN NETWORK DATA QUEUE NTBCNT: .BLKB 1 ; TRANSFER COUNT IN BYTES NTVLUN: .BLKB 1 ; NETWORK LUN NUMBER ;----------------------------------------------------------------------; ; ALLOCATE DATA BLOCK FOR GET LOCAL NODE INFORMATION REQUEST ; ;----------------------------------------------------------------------; ; THE FOLLOWING INFORMATION IS RETURNED BY THE GLN$ NETWORK MACRO; ;----------------------------------------------------------------------; .EVEN NTNODE: .BLKB NODLEN ; LOCAL NODE NAME IN ASCII (LEFT-JUSTIFIED ; AND FILLED WITH SPACES IF THE NAME IS ; LESS THAN 'NODLEN' CHARACTERS) NTSIZE: .BLKB 2 ; DEFAULT SEGMENT SIZE USED BY NSP FOR ; TRANSMITTING DATA ON A LOGICAL LINK NTNLEN= .-NTNODE ; COMPUTE LENGTH OF LOCAL NODE INFO BUFFER ;----------------------------------------------------------------------; ; ALLOCATE DATA BLOCK FOR NETWORK AST CONNECT BLOCK ; ;----------------------------------------------------------------------; ; THE FOLLOWING INFORMATION IS RETURNED BY THE GND$ NETWORK MACRO; ;----------------------------------------------------------------------; NSSYM$ ; DEFINE NETWORK SYMBOLIC OFFSETS CNBDF$ ; DEFINE CONNECT BLOCK OFFSETS .PSECT $DATA ; RESET DATA PROGRAM SECTION NTMAIL: .BLKB N.CBL ; ALLOCATE NETWORK MAIL CONNECT BLOCK NM.SND= NTMAIL+N.SND ; DEFINE OFFSET TO NODE NAME OF THE ; NODE THAT REQUESTED THE CONNECTION NM.SDE= NTMAIL+N.SDE ; DEFINE OFFSET TO TASK NAME OF THE ; REMOTE PROCESS THAT REQUESTED THE CONNECTION .SBTTL OPERATOR MESSAGES ;----------------------------------------------------------------------; ; ; ; ; ; OPERATOR MESSAGES ; ; ; ; ; ;----------------------------------------------------------------------; ; DEFINE DESCRIPTOR BLOCK FOR ALL OPERATOR MESSAGES ; ;----------------------------------------------------------------------; .EVEN MS.PTR: .BLKW 1 ; DEFINE MESSAGE ADDRESS MS.LEN: .BLKW 1 ; DEFINE MESSAGE LENGTH MS.SPC: .BLKW 1 ; DEFINE CARRIAGE CONTROL ;----------------------------------------------------------------------; ; OPERATOR MESSAGE TEXT ; ;----------------------------------------------------------------------; ; NOTIFY OPERATOR OF VAX/XRB INITIALIZATION ; ;----------------------------------------------------------------------; INIMSG: .ASCII \XRB -- Message Processor Initialized on Node _\ ININOD: .BLKB NODLEN .ASCII /::/ INILEN= .-INIMSG ;----------------------------------------------------------------------; ; PERIODIC XRB TIME STAMP MESSAGE ; ;----------------------------------------------------------------------; WT.MSG: .ASCII /XRB -- Periodic Time Stamp/ WT.LEN= .-WT.MSG ;----------------------------------------------------------------------; ; NOTIFY OPERATOR OF NETWORK DATA QUEUE CONNECT REQUEST ENTRY ; ;----------------------------------------------------------------------; QM.CON: .ASCII /XRB -- Connect request received from _/ QN.CON: .BLKB NODLEN .ASCII /::/ QT.CON: .BLKB TSKLEN QL.CON= .-QM.CON ;----------------------------------------------------------------------; ; NOTIFY OPERATOR OF LOGICAL LINK QUEUE OVERFLOW ; ;----------------------------------------------------------------------; QM.FUL: .ASCII /XRB -- Logical queue overflow while connecting node _/ QN.FUL: .BLKB NODLEN .ASCII /::/ QL.FUL= .-QM.FUL ;----------------------------------------------------------------------; ; NOTIFY REMOTE OPERATOR OF NETWORK LOGICAL LINK ACCEPTANCE ; ;----------------------------------------------------------------------; QM.ACC: .ASCII /XRB -- Remote console connected to server node _/ QN.ACC: .BLKB NODLEN .ASCII /::/ QL.ACC= .-QM.ACC ;----------------------------------------------------------------------; ; NOTIFY OPERATOR OF NETWORK DATA QUEUE INTERRUPT MESSAGE ENTRY ; ;----------------------------------------------------------------------; QM.INT: .ASCII /XRB -- Interrupt message received from node _/ QN.INT: .BLKB NODLEN .ASCII /::/ QL.INT= .-QM.INT ;----------------------------------------------------------------------; ; NOTIFY OPERATOR OF NETWORK DATA QUEUE USER DISCONNECT ENTRY ; ;----------------------------------------------------------------------; QM.DSC: .ASCII /XRB -- User disconnect message received from node _/ QN.DSC: .BLKB NODLEN .ASCII /::/ QL.DSC= .-QM.DSC ;----------------------------------------------------------------------; ; NOTIFY OPERATOR OF NETWORK DATA QUEUE USER ABORT ENTRY ; ;----------------------------------------------------------------------; QM.ABT: .ASCII /XRB -- User abort message received from node _/ QN.ABT: .BLKB NODLEN .ASCII /::/ QL.ABT= .-QM.ABT ;----------------------------------------------------------------------; ; NOTIFY OPERATOR OF NETWORK DATA QUEUE NETWORK ABORT ENTRY ; ;----------------------------------------------------------------------; QM.ABO: .ASCII /XRB -- Network abort message received from node _/ QN.ABO: .BLKB NODLEN .ASCII /::/ QL.ABO= .-QM.ABO ;----------------------------------------------------------------------; ; NOTIFY OPERATOR OF UNKNOWN TYPE NETWORK DATA QUEUE ENTRY ; ;----------------------------------------------------------------------; QM.UNK: .ASCII /XRB -- WARNING: Unknown network queue entry from node _/ QN.UNK: .BLKB NODLEN .ASCII /::/ QL.UNK= .-QM.UNK ;----------------------------------------------------------------------; ; NOTIFY OPERATOR OF INVALID LUN NUMBER IN DEACTIVATING NET LINK ; ;----------------------------------------------------------------------; QM.LUN: .ASCII /XRB -- WARNING: Invalid lun specified in network / .ASCII /disconnect request/ QL.LUN= .-QM.LUN ;----------------------------------------------------------------------; ; NOTIFY OPERATOR OF REMOTE USER RJE COMMAND ; ;----------------------------------------------------------------------; QM.CMD: .BLKB NODLEN .ASCII / -- / QL.CMD= .-QM.CMD ; SET LENGTH OF COMMAND HEADER QU.CMD: .BLKB MAXLIN .SBTTL DATA BUFFERS ;----------------------------------------------------------------------; ; ; ; ; ; DATA BUFFERS ; ; ; ; ; ;----------------------------------------------------------------------; ; HOST RECEIVE DATA MESSAGE BUFFER ; ;----------------------------------------------------------------------; ; THIS DATA BUFFER IS USED TO RECEIVE TASK-TO-TASK MESSAGES FROM ; ; THE RJE/RSX HASP EMULATOR. THESE HOST MESSAGES ARE THEN ; ; BUFFERED UP AND SENT TO ALL ATTACHED REMOTE VAX USERS. ; ;----------------------------------------------------------------------; .EVEN MSGTSK: .BLKW 02. ; RECEIVE HOST DATA BUFFER - TASK MSGBUF: .BLKW 13. ; RECEIVE HOST DATA BUFFER - MESSAGE .SBTTL VAX HOST MESSAGE RING ;----------------------------------------------------------------------; ; HOST MESSAGE BUFFER TO BE QUEUED TO REMOTE VAX USERS ; ;----------------------------------------------------------------------; ; THIS DATA BUFFER QUEUE IS USED TO BUFFER UP COMPLETE HOST ; ; MESSAGES FOR TRANSFER TO REMOTE VAX USERS. SINCE THE HOST ; ; MESSAGES MAY BE RECEIVED AT A GREATER RATE THAN THEY CAN BE ; ; TRANSMITTED OVER THE NETWORK, A MESSAGE RING MUST BE SET UP ; ; TO BUFFER THE MESSAGES SO THAT HOST MESSAGES ARE NOT LOST. ; ;----------------------------------------------------------------------; ; MESSAGE QUEUE ENTRY OFFSETS ; ;----------------------------------------------------------------------; VT.NXT= 0 ; POINTER TO NEXT QUEUE ENTRY VT.BYT= VT.NXT+2 ; POINTER TO BYTE COUNT OF MESSAGE (0=FREE ENTRY) VT.MSA= VT.BYT+2 ; POINTER TO ADDRESS OF FIRST HOST MESSAGE BYTE VT.MSG= VT.MSA+2 ; POINTER TO FIRST BYTE OF HOST MESSAGE VT.END= VT.MSG+MAXLIN ; POINT TO END OF QUEUE ENTRY VT.LEN= VT.END-VT.NXT ; COMPUTE LENGTH OF QUEUE ENTRY VT.LEN= /2*2 ; INSURE WORD ALIGNMENT ;----------------------------------------------------------------------; ; ALLOCATE CURRENT QUEUE POINTER ; ;----------------------------------------------------------------------; ; THIS LOCATION CONTAINS THE ADDRESS OF THE NEXT FREE ENTRY IN ; ; THE CIRCULAR TRANSMIT BUFFER QUEUE. AS EACH MESSAGE IS PUT ; ; IN THE QUEUE, THIS LOCATION IS ADJUSTED TO POINT TO THE NEXT ; ; FREE QUEUE ENTRY, SO THAT THE MESSAGE TRANSMISSIONS OVER THE ; ; NETWORK MAY PROCEED ASYNCHRONOUSLY WITH THE RECEPTION OF ; ; HOST MESSAGES FROM THE RJE EMULATOR. ; ;----------------------------------------------------------------------; VTXPTR: .WORD VTXQUE ; POINTER TO NEXT FREE BUFFER IN XMT QUEUE ;----------------------------------------------------------------------; ; MESSAGE QUEUE BUFFER ALLOCATION ; ;----------------------------------------------------------------------; ; TO MAKE THE HOST MESSAGE QUEUE CIRCULAR, INSURE THAT THE LAST ; ; LINK POINTER POINTS BACK TO THE BEGINNING OF THE QUEUE HEAD. ; ;----------------------------------------------------------------------; $$$ = MAXBUF ; PRESET REPETITION COUNTER VTXQUE: .REPT MAXBUF ; REPEAT FOR EACH BUFFER LEVEL $$$ = $$$-1 ; DECREMENT REPETION COUNTER .IF NE $$$ ; FOR ALL BUT LAST QUEUE ENTRY .WORD .+VT.LEN ; VT.NXT - POINTER TO NEXT QUEUE ENTRY .IFF ; VT.NXT - FOR LAST QUEUE ENTRY .WORD VTXQUE ; POINT TO BEGINNING OF MESSAGE QUEUE (RING) .ENDC .BLKW 1 ; VT.BYT - BYTE COUNT OF MESSAGE .WORD .+2 ; VT.MSA - ADDRESS OF QUEUE TRANSMIT BUFFER .BLKB MAXLIN ; VT.MSG - MESSAGE BUFFER (HOST--->VAX) .ENDR ; END OF HOST MESSAGE TRANSMIT QUEUE .SBTTL VAX USER LOGICAL LINK TABLE ;----------------------------------------------------------------------; ; TRANSMIT BUFFER (USER HOST COMMAND BUFFERS) ; ;----------------------------------------------------------------------; ; THIS DATA BUFFER IS USED TO MAINTAIN A DATA BASE OF ALL ; ; NETWORK LOGICAL LINKS TO REMOTE VAX USERS. THIS QUEUE ; ; CONTAINS INFORMATION SUCH AS WHICH REMOTE NODE THE LOGICAL ; ; LINK IS CONNECTED TO, AND OTHER IMPORTANT PARAMETERS, SUCH ; ; AS NETWORK I/O STATUS BLOCKS, EVENT FLAG NUMBERS, AND RECEIVE ; ; USER COMMAND DATA BUFFERS. ; ;----------------------------------------------------------------------; ; NETWORK LOGICAL LINK QUEUE OFFSETS ; ;----------------------------------------------------------------------; VR.NXT= 0 ; POINTER TO NEXT LOGICAL LINK QUEUE ENTRY VR.ACT= VR.NXT+2 ; POINTER TO ACTIVITY MASK (0=FREE,-1=USED) VR.NDA= VR.ACT+2 ; POINTER TO REMOTE NODE NAME ADDRESS VR.NOD= VR.NDA+2 ; POINTER TO REMOTE NODE NAME (ASCII) VR.LUN= VR.NOD+NODLEN ; POINTER TO NETWORK LUN NUMBER VR.RXF= VR.LUN+2 ; POINTER TO RECEIVE EVENT FLAG VR.RXA= VR.RXF+2 ; POINTER TO RECEIVE I/O STATUS BLOCK ADDRESS VR.RXS= VR.RXA+2 ; POINTER TO RECEIVE I/O STATUS BLOCK VR.RXB= VR.RXS+2 ; POINTER TO RECEIVE I/O BYTE COUNT VR.TXF= VR.RXS+4 ; POINTER TO TRANSMIT EVENT FLAG VR.TXA= VR.TXF+2 ; POINTER TO TRANSMIT I/O STATUS BLOCK ADDRESS VR.TXS= VR.TXA+2 ; POINTER TO TRANSMIT I/O STATUS BLOCK VR.TXB= VR.TXS+2 ; POINTER TO TRANSMIT I/O BYTE COUNT VR.MSA= VR.TXS+4 ; POINTER TO ADDRESS OF VAX USER COMMAND VR.MSG= VR.MSA+2 ; POINTER TO FIRST BYTE OF VAX USER COMMAND VR.END= VR.MSG+MAXLIN ; END OF VAX LOGICAL LINK QUEUE VR.LEN= VR.END-VR.NXT ; LENGTH OF VAX LOGICAL LINK QUEUE ENTRY VR.LEN= /2*2 ; INSURE WORD ALIGNMENT ;----------------------------------------------------------------------; ; NETWORK AST I/O STATUS BLOCK ADDRESS BUFFERS ; ;----------------------------------------------------------------------; VRIOSB: .BLKW 1 ; RECEIVE USER COMMAND I/O STATUS BLOCK ADDRESS VTIOSB: .BLKW 1 ; TRANSMIT HOST MESSAGE I/O STATUS BLOCK ADDRESS ;----------------------------------------------------------------------; ; NETWORK LOGICAL LINK QUEUE ALLOCATION ; ;----------------------------------------------------------------------; $$$ = 1 ; INITIALIZE COUNTER FOR EVENT FLAGS + LUNS VRXQUE: .REPT MAXLNK ; REPEAT FOR EACH LOGICAL LINK SUPPORTED .WORD .+VR.LEN ; POINT TO NEXT QUEUE ENTRY .WORD 0 ; ACTIVITY MASK (0=FREE ENTRY, -1=USED ENTRY) .WORD .+2 ; ADDRESS OF REMOTE VAX NODE NAME .BLKB NODLEN ; REMOTE VAX NODE NAME (ASCII) .WORD NTLUN+$$$ ; NETWORK LUN NUMBER .WORD 2*$$$+NTFLAG-1 ; RECEIVE EVENT FLAG (VAX-->HOST) .WORD .+2 ; POINT TO RECEIVE I/O STATUS BLOCK .BLKW 2 ; RECEIVE I/O STATUS BLOCK .WORD 2*$$$+NTFLAG ; TRANSMIT EVENT FLAG (HOST-->VAX) .WORD .+2 ; POINT TO TRANSMIT I/O STATUS BLOCK .BLKW 2 ; TRANSMIT I/O STATUS BLOCK .WORD .+2 ; POINT TO VAX USER COMMAND MESSAGE BUFFER .BLKB MAXLIN ; ALLOCATE VAX USER COMMAND RECEIVE BUFFER $$$ = $$$+1 ; INCREMENT COUNTER .ENDR .WORD 0 ; END OF LOGICAL LINK QUEUE .SBTTL RJEMSG - MAIN PROGRAM INITIALIZATION ;----------------------------------------------------------------------; ; ; ; ; ; ; ; RJEMSG - PROGRAM INITIALIZATION ; ; ; ; ; ; ; ;----------------------------------------------------------------------; ; ACCESS THE NETWORK ; ;----------------------------------------------------------------------; ; CALL OPN$ TO ESTABLISH THIS TASK AS AN ACTIVE NETWORK TASK AND ; ; CREATE THE TASK'S NETWORK DATA QUEUE. ; ;----------------------------------------------------------------------; ; OPN$ MACRO - OPN[W]$S ([LUN],[EFN],[STATUS],[AST],[] ;----------------------------------------------------------------------; .PSECT RJEMSG .EVEN START: OPNW$S #NTLUN,#NTFLAG,#NTSTAT,,<#MAXLNK,#NETTIM> BCC 10$ ; BRANCH ON NO NETWORK ERROR ERROR $DSW ; SIGNAL DIRECTIVE EXECUTION ERROR ;----------------------------------------------------------------------; ; INSURE THAT NETWORK ACCESS COMPLETED SUCCESSFULLY ; ;----------------------------------------------------------------------; 10$: CMPB #IS.SUC,NTSTAT ; NORMAL SUCCESSFUL COMPLETION? BEQ 20$ ; YES, CONTINUE PROCESSING ERROR NTSTAT ; NO, SIGNAL NETWORK ERROR TO USER ;----------------------------------------------------------------------; ; GET INFORMATION ABOUT THE LOCAL NODE (NODE NAME + NSP SIZE) ; ;----------------------------------------------------------------------; ; GLN$ MACRO - GLN[W]$S ([LUN],[EFN],[STATUS],[AST],; ;----------------------------------------------------------------------; 20$: GLNW$S #NTLUN,#NTFLAG,#NTSTAT,,<#NTNODE,#NTNLEN> BCC 30$ ; BRANCH ON NO DIRECTIVE ERROR ERROR $DSW ; SIGNAL DIRECTIVE EXECUTION ERROR ;----------------------------------------------------------------------; ; INSURE THAT NETWORK LOCAL NODE ENQUIRY COMPLETED WITH SUCCESS ; ;----------------------------------------------------------------------; 30$: CMPB #IS.SUC,NTSTAT ; NORMAL SUCCESSFUL COMPLETION? BEQ INITNT ; YES, INITIALIZE NETWORK PROCESSING ERROR NTSTAT ; NO, SIGNAL NETWORK ERROR TO USER .SBTTL MAIN MESSAGE QUEUE INITIALIZATION ;----------------------------------------------------------------------; ; ; ; ; ; MAIN MESSAGE QUEUE INITIALIZATION ; ; ; ; ; ;----------------------------------------------------------------------; ; INFORM USER OF SUCCESSFUL NETWORK INITIALIZATION ; ;----------------------------------------------------------------------; INITNT: MOVC3 #NODLEN,#NTNODE,#ININOD ; LOAD LOCAL NODE NAME FOR MESSAGE PRINT #INIMSG,#INILEN,#60 ; PRINT INITIALIZATION MESSAGE ;----------------------------------------------------------------------; ; DISABLE AST RECOGNITION FOR THIS INITIALIZATION SECTION ; ;----------------------------------------------------------------------; DSAR$S ; DISABLE AST RECOGNITION BCC 10$ ; BRANCH ON NO DIRECTIVE ERROR ERROR $DSW ; SIGNAL DIRECTIVE EXECUTION ERROR ;----------------------------------------------------------------------; ; SPECIFY USER-MODE NETWORK AST TO BE EXECUTED EVERY TIME THAT ; ; DATA IS AVAILABLE IN THE NETWORK DATA QUEUE ; ;----------------------------------------------------------------------; 10$: SPAW$S #NTLUN,#NTFLAG,#NTSTAT,,<#SPAAST> BCC 20$ ; BRANCH ON NO DIRECTIVE ERROR ERROR $DSW ; SIGNAL DIRECTIVE EXECUTION ERROR ;----------------------------------------------------------------------; ; INSURE THAT USER-MODE AST QUEUE INSERTION COMPLETED W/SUCCESS ; ;----------------------------------------------------------------------; 20$: CMPB #IS.SUC,NTSTAT ; NORMAL SUCCESSFUL COMPLETION? BEQ 30$ ; YES, CONTINUE PROCESSING ERROR NTSTAT ; NO, SIGNAL SPA$ NETWORK ERROR ;----------------------------------------------------------------------; ; NOW PROCESS ANY ITEMS THAT WERE INITIALLY IN NETWORK DATA QUEUE; ;----------------------------------------------------------------------; ; THIS CODE EXECUTES IN USER MODE AND CALLS THE USER AST. THIS ; ; MAY SEEM STRANGE BUT IT IS AN ACCEPTABLE PRACTICE USED BY DEC. ; ; THE KEY TO ITS OPERATION IS THE FACT THAT THE EXIT AST (ASTX$) ; ; DIRECTIVE IS IGNORED IN USER MODE, SO AN AST MAY BE CALLED AS ; ; A SUBROUTINE IN USER MODE IF A 'RETURN' IS PLACED AFTER ASTX$. ; ;----------------------------------------------------------------------; 30$: MOV NTQCNT,R5 ; GET COUNT OF # OF ITEMS IN QUEUE 40$: DEC R5 ; DECREMENT QUEUE ITEM COUNT BLT 50$ ; STOP IF QUEUE COUNT IS NEGATIVE CALL SPAAST ; PROCESS NETWORK QUEUE ENTRY BR 40$ ; AND LOOP UNTIL QUEUE IS EMPTY ;----------------------------------------------------------------------; ; ENABLE AST RECOGNITION TO TURN ON MESSAGE PROCESSING ; ;----------------------------------------------------------------------; 50$: ENAR$S ; ENABLE AST RECOGNITION BCC 60$ ; BRANCH ON NO DIRECTIVE ERROR ERROR $DSW ; SIGNAL DIRECTIVE EXECUTION ERROR ;----------------------------------------------------------------------; ; INITIALIZE TASK-TO-TASK RECEIVE DATA AST ; ;----------------------------------------------------------------------; 60$: SRDA$S #RECAST ; SPECIFY RECEIVE DATA AST BCC WAIT ; BRANCH ON NO DIRECTIVE ERROR ERROR $DSW ; SIGNAL DIRECTIVE EXECUTION ERROR .SBTTL PRODUCE PERIODIC TIME STAMPS ;----------------------------------------------------------------------; ; ; ; ; ; PRODUCE PERIODIC TIME STAMPS ; ; ; ; ; ;----------------------------------------------------------------------; ; MARK TIME FOR 1 HOUR UNTIL NEXT TIME STAMP MESSAGE ; ;----------------------------------------------------------------------; WAIT: MRKT$S #WTFLAG,#1,#4 ; DELAY 1 HOUR WTSE$S #WTFLAG ; AND WAIT FOR SIGNIFICANT EVENT ;----------------------------------------------------------------------; ; DISPLAY PERIODIC TIME STAMP MESSAGE ; ;----------------------------------------------------------------------; PRINT #WT.MSG,#WT.LEN,#60 BR WAIT .SBTTL PRINT MESSAGE TO USER TERMINAL ;----------------------------------------------------------------------; ; ; ; ; ; PRINT MESSAGE TO USER TERMINAL ; ; ; ; ; ;----------------------------------------------------------------------; ; THIS SUBROUTINE PRINTS A MESSAGE TO THE USER TERMINAL ; ;----------------------------------------------------------------------; ; REGISTER USEAGE: MS.PTR - ADDRESS OF USER MESSAGE ; ; MS.LEN - LENGTH OF USER MESSAGE ; ; MS.SPC - PRINT CARRIAGE CONTROL ; ;----------------------------------------------------------------------; ; QUEUE MESSAGE TO OPERATOR ; ;----------------------------------------------------------------------; $MSG:: QIOW$S #IO.WBT,#TILUN,#TIFLAG,,#IOSTAT,, BCC 10$ ; CHECK FOR ERRORS ERROR $DSW ; SIGNAL DIRECTIVE EXECUTION ERROR ;----------------------------------------------------------------------; ; CHECK FOR SUCCESSFUL I/O COMPLETION ; ;----------------------------------------------------------------------; 10$: CMPB #IS.SUC,IOSTAT ; NORMAL SUCCESSFUL COMPLETION? BEQ 20$ ; YES, OUTPUT TO SYSTEM CONSOLE ERROR IOSTAT ; NO, SIGNAL QIO ERROR TO USER ;----------------------------------------------------------------------; ; RETURN TO CALLER ; ;----------------------------------------------------------------------; 20$: RETURN ; RETURN TO MAINLINE CODE .SBTTL HOST RECEIVE DATA AST ;----------------------------------------------------------------------; ; ; ; ; ; HOST RECEIVE DATA AST ; ; ; ; ; ;----------------------------------------------------------------------; ; EXECUTE THE RCVD$ DIRECTIVE TO OBTAIN THE HOST MESSAGE FROM RJE; ;----------------------------------------------------------------------; RECAST: SAVREG ; SAVE REGISTERS R0-R5 ON STACK 10$: DIR$ #RCVMSG ; RECEIVE DATA FROM LOCAL HOST TASK (RJE) BCC 100$ ; BRANCH ON NO DIRECTIVE ERROR ;----------------------------------------------------------------------; ; IF THERE WAS NO DATA QUEUED TO RECEIVE, THEN TERMINATE AST ; ;----------------------------------------------------------------------; CMP #IE.ITS,$DSW ; NO DATA CURRENTLY QUEUED? BNE 20$ ; NO, SIGNAL FATAL DIRECTIVE EXECUTION ERROR JMP 1000$ ; YES, WAIT UNTIL THERE IS DATA QUEUED 20$: ERROR $DSW ; SIGNAL FATAL RCVD$ DIRECTIVE ERROR ;----------------------------------------------------------------------; ; ; ; LOAD RECEIVED TASK DATA INTO NETWORK TRANSMIT QUEUE BUFFER ; ; ; ;----------------------------------------------------------------------; 100$: MOV VTXPTR,R4 ; GET ADDRESS OF TRANSMIT QUEUE HEAD MOV R4,R1 ; POINT TO HEAD OF QUEUE ADD #VT.MSG,R1 ; POINT TO START OF XMT MESSAGE ADD VT.BYT(R4),R1 ; POINT TO NEXT FREE BYTE IN XMT MSG ;----------------------------------------------------------------------; ; INITIALIZE RCVD$ BUFFER COUNTER AND CHECK FOR END-OF-DATA ; ;----------------------------------------------------------------------; CLR R0 ; CLEAR POINTER INTO RECEIVE DATA BUFFER 110$: CMP #MAXSND,R0 ; HAVE WE REACHED END OF RECEIVE DATA? BLE 10$ ; YES, TRY TO GET ANOTHER RCVD$ BUFFER ;----------------------------------------------------------------------; ; MOVE A DATA BYTE FROM RCVD$ DATA BUFFER TO XMT QUEUE BUFFER ; ;----------------------------------------------------------------------; MOVB MSGBUF(R0),(R1)+ ; TRANSFER INPUT BUFFER TO XMT QUEUE BEQ 200$ ; IF END-OF-MESSAGE THEN XMT QUEUE BUFFER ;----------------------------------------------------------------------; ; INCREMENT THE QUEUE BYTE COUNT AND CHECK FOR BUFFER OVERFLOW ; ;----------------------------------------------------------------------; INC VT.BYT(R4) ; INCREMENT TRANSMIT BYTE COUNT CMP #MAXLIN,VT.BYT(R4) ; CHECK FOR BUFFER OVERFLOW BLT 200$ ; YES, TERMINATE BUFFER COPY AND XMT ;----------------------------------------------------------------------; ; INCREMENT THE RECEIVE DATA BYTE COUNT AND PROCESS NEXT BYTE ; ;----------------------------------------------------------------------; INC R0 ; INCREMENT RECEIVE DATA BUFFER BYTE CNT BR 110$ ; PROCESS NEXT HOST MESSAGE BYTE ;----------------------------------------------------------------------; ; ; ; LINK SEARCH: END-OF-BUFFER OR END-OF-COMMAND HAS BEEN REACHED ; ; ; ;----------------------------------------------------------------------; ; WE NOW HAVE A COMPLETE BUFFER TO TRANSMIT. MAKE A COMPLETE ; ; SEARCH OF THE LOGICAL LINK QUEUE AND DETERMINE WHICH LINKS ; ; ARE ACTIVE. QUEUE THE MESSAGE TO EACH OF THESE REMOTE VAX ; ; USERS. AFTER COMPLETION OF THIS, ATTEMPT TO READ ADDITIONAL ; ; HOST MESSAGES AFTER ADJUSTING THE FREE TRANSMIT QUEUE POINTER. ; ;----------------------------------------------------------------------; 200$: MOV #VRXQUE,R5 ; GET ADDRESS OF LINK QUEUE HEADER 210$: TST VR.NXT(R5) ; IS THIS THE END OF THE QUEUE? BEQ 300$ ; YES, ADJUST XMT QUEUE POINTER ;----------------------------------------------------------------------; ; TEST THE ACTIVITY FLAG WORD IN THE LOGICAL LINK QUEUE LIST ; ; TO DETERMINE IF THE LINK IS ACTIVE. IF SO, SEND MESSAGE. ; ;----------------------------------------------------------------------; 220$: TST VR.ACT(R5) ; IS THIS QUEUE ENTRY ACTIVE? BEQ 230$ ; NO, SKIP TO NEXT LOGICAL LINK ENTRY ;----------------------------------------------------------------------; ; ; ; TRANSMIT HOST MESSAGE IN QUEUE TO REMOTE VAX COMMAND TERMINAL ; ; ; ;----------------------------------------------------------------------; ; SND$ MACRO - SND[W]$S ([LUN],[EFN],[STATUS],[AST],) ;----------------------------------------------------------------------; SNDW$S VR.LUN(R5),VR.TXF(R5),VR.TXA(R5),#XMTAST, BCC 230$ ; BRANCH ON NO DIRECTIVE ERROR ERROR $DSW ; SIGNAL DIRECTIVE EXECUTION ERROR ;----------------------------------------------------------------------; ; MESSAGE HAS BEEN SENT OR ENTRY IS NOT ACTIVE - GET NEXT LINK ; ;----------------------------------------------------------------------; 230$: MOV VR.NXT(R5),R5 ; PROCEED TO NEXT LINK SLOT BR 210$ ; AND CHECK TO SEE IF IT IS ACTIVE ;----------------------------------------------------------------------; ; ; ; ADJUST TRANSMIT QUEUE BUFFER POINTER AND RECEIVE NEXT MESSAGE ; ; ; ;----------------------------------------------------------------------; 300$: MOV VT.NXT(R4),R4 ; POINT TO NEXT XMT QUEUE ENTRY MOV R4,VTXPTR ; AND ADJUST QUEUE POINTER ACCORDINGLY CLR VT.BYT(R4) ; INITIALIZE BYTE COUNT FOR MESSAGE JMP 10$ ; AND RECEIVE ANY PENDING MESSAGES ;----------------------------------------------------------------------; ; TERMINATE RECEIVE DATA AST PROCESSING ; ;----------------------------------------------------------------------; ; NOTE THAT THIS AST DOES NOT NEED TO POP ANYTHING OFF OF THE ; ; STACK PRIOR TO RETURNING TO USER MODE PROCESSING. ; ;----------------------------------------------------------------------; 1000$: RSTREG ; RESTORE REGISTERS R0-R5 ASTX$S ; EXIT AST PROCESSING .SBTTL NETWORK TRANSMIT HOST MESSAGE AST ;----------------------------------------------------------------------; ; ; ; ; ; NETWORK TRANSMIT HOST MESSAGE AST ; ; ; ; ; ;----------------------------------------------------------------------; ; THIS ROUTINE IS EXECUTED EVERY TIME A MESSAGE IS TRANSMITTED ; ; TO A REMOTE VAX COMMAND TERMINAL. THIS AST IS CURRENTLY ; ; ONLY INTENDED TO ACKNOWLEDGE THAT THE NETWORK I/O COMPLETED ; ; WITH SUCCESS (OR THE LINK WAS ABORTED). HOWEVER, IN THE ; ; FUTURE IT MAY INCORPORATE SOME TRANSMIT QUEUE OVERFLOW ; ; PROTECTION SO THAT THE TRANSMIT QUEUE RING WILL NOT OVERWRITE ; ; ITSELF IF THE NUMBER OF ENTRIES RECEIVED FROM THE EMULATOR ; ; EXCEEDS THE CURRENT NUMBER OF QUEUE ENTRIES AVAILABLE. THE ; ; ONLY WAY TO INSURE THAT THIS DOES NOT HAPPEN IS TO FLAG EACH ; ; QUEUE ENTRY WITH AN ACTIVITY BIT FOR EACH ACTIVE LOGICAL LINK ; ; SO THAT THE ENTRY WILL BE CONSIDERED "USED" UNTIL THE TRANSMIT ; ; OF THE MESSAGE COMPLETES. ; ;----------------------------------------------------------------------; ; NOTE THAT THIS AST ROUTINE MUST POP THE FIRST WORD OFF OF THE ; ; STACK PRIOR TO EXITING AST MODE. THIS TOP WORD OF THE STACK ; ; CONTAINS THE ADDRESS OF THE I/O STATUS BLOCK. ; ;----------------------------------------------------------------------; XMTAST: POP VTIOSB ; GET ADDRESS OF I/O STATUS BLOCK SAVREG ; SAVE REGISTERS R0-R5 MOV VTIOSB,R5 ; GET ADDRESS IN QUEUE LIST SUB #VR.TXS,R5 ; SUBTRACT OFFSET TO GET QUEUE HEADER ;----------------------------------------------------------------------; ; CHECK I/O COMPLETION STATUS TO INSURE THAT RECEIVE WAS OK ; ;----------------------------------------------------------------------; CMPB #IS.SUC,VR.TXS(R5) ; NORMAL SUCCESSFUL COMPLETION? BEQ 1000$ ; YES, CONTINUE PROCESSING ;----------------------------------------------------------------------; ; IF THE LOGICAL LINK WAS ABORTED DURING I/O, DO NO PROCESSING ; ;----------------------------------------------------------------------; CMPB #IE.ABO,VR.TXS(R5) ; LOGICAL LINK DISCONNECTED? BEQ 1000$ ; YES, TERMINATE AST PROCESSING ERROR VR.TXS(R5) ; NO, SIGNAL FATAL NETWORK SND$ ERROR ;----------------------------------------------------------------------; ; ; ; NETWORK TRANSMIT VAX HOST MESSAGE AST COMPLETION ; ; ; ;----------------------------------------------------------------------; ; RESTORE REGISTERS FROM STACK AND RETURN TO USER MODE PROCESSING; ;----------------------------------------------------------------------; 1000$: RSTREG ; RESTORE REGISTERS R0-R5 ASTX$S ; RETURN FROM AST LEVEL .SBTTL NETWORK DATA QUEUE AST ;----------------------------------------------------------------------; ; ; ; ; ; NETWORK DATA QUEUE AST ; ; ; ; ; ;----------------------------------------------------------------------; ; THIS ROUTINE IS EXECUTED EVERY TIME AN ENTRY APPEARS ON THE ; ; NETWORK DATA QUEUE. QUEUE ENTRIES MAY BE OF THE FOLLOWING ; ; TYPES: CONNECT REQUEST, INTERRUPT MESSAGE, USER DISCONNECT, ; ; USER ABORT, NETWORK ABORT. IN THE CASE OF THIS TASK, ; ; INTERRUPT MESSAGES, USER ABORTS, AND NETWORK ABORTS WILL BE ; ; TREATED AS USER DISCONNECTS, WITH A WARNING MESSAGE PRINTED ; ; ON THE CONSOLE. USER CONNECTS WILL BE ENTERED IN THE LOGICAL ; ; LINK QUEUE IF THERE ARE SUFFICIENT ENTRIES TO PERMIT AN ENTRY. ; ;----------------------------------------------------------------------; ; GND$ MACRO - GND[W]$S ([LUN],[EFN],[STATUS],[AST], ; ; [] ; ; [,NT.TYP] ; ; [,,NT.LON]) ; ;----------------------------------------------------------------------; SPAAST: SAVREG ; SAVE REGISTERS R0-R5 GNDW$S #NTLUN,#NTFLAG,#NTSTAT,,<#NTMAIL,#N.CBL> BCC 10$ ; BRANCH ON NO DIRECTIVE ERROR ERROR $DSW ; SIGNAL DIRECTIVE EXECUTION ERROR TO USER ;----------------------------------------------------------------------; ; INSURE THAT GET NETWORK QUEUE DATA EXECUTED SUCCESSFULLY ; ;----------------------------------------------------------------------; 10$: CMPB #IS.SUC,NTSTAT ; NORMAL SUCCESSFUL COMPLETION? BEQ 100$ ; YES, CONTINUE EXECUTION ERROR NTSTAT ; NO, SIGNAL FATAL GND$ NETWORK ERROR ;----------------------------------------------------------------------; ; ; ; IF THE REQUEST IS A CONNECT REQUEST, THEN ENTER IN LOG LINK Q ; ; ; ;----------------------------------------------------------------------; ; CHECK FOR CONNECT LINK REQUEST AND DISPLAY OPERATOR MESSAGE ; ;----------------------------------------------------------------------; 100$: CMPB #NT.CON,NTTYPE ; NETWORK CONNECT REQUEST? BEQ 110$ ; YES, CONTINUE CONNECT PROCESSING JMP 200$ ; NO, CHECK OTHER QUEUE DATA TYPES 110$: MOVC3 #NODLEN,#NM.SND,#QN.CON ; LOAD REMOTE NODE NAME MOVC3 #TSKLEN,#NM.SDE,#QT.CON ; LOAD REMOTE TASK NAME PRINT #QM.CON,#QL.CON,#60 ; PRINT CONNECT MESSAGE ;----------------------------------------------------------------------; ; FIND FIRST FREE ENTRY IN LOGICAL LINK QUEUE ; ;----------------------------------------------------------------------; MOV #VRXQUE,R5 ; GET ADDRESS OF LINK QUEUE HEADER 120$: TST VR.NXT(R5) ; IS THIS THE END OF THE QUEUE? BEQ 130$ ; YES, SIGNAL QUEUE FULL ERROR TST VR.ACT(R5) ; IS THIS QUEUE ENTRY ACTIVE? BEQ 160$ ; NO, PROCESS USING THIS LINK SLOT MOV VR.NXT(R5),R5 ; YES, PROCEED TO NEXT LINK SLOT BR 120$ ; AND CHECK TO SEE IF IT IS EMPTY ;----------------------------------------------------------------------; ; THERE ARE NO AVAILABLE LOGICAL LINK QUEUE SLOTS - REPORT ERROR ; ;----------------------------------------------------------------------; 130$: MOVC3 #NODLEN,#NM.SND,#QN.FUL ; LOAD REMOTE NODE NAME PRINT #QM.FUL,#QL.FUL,#60 ; REPORT QUEUE OVERFLOW TO CONSOLE REJW$S #NTLUN,#NTFLAG,#NTSTAT,,<#NTMAIL,#N.CBL>; REJECT LINK REQUEST BCC 140$ ; BRANCH ON NO DIRECTIVE ERROR ERROR $DSW ; SIGNAL DIRECTIVE EXECUTION ERROR ;----------------------------------------------------------------------; ; CHECK NETWORK I/O STATUS TO INSURE CORRECT REJECTION OF LINK ; ;----------------------------------------------------------------------; 140$: CMPB #IS.SUC,NTSTAT ; NORMAL SUCCESSFUL COMPLETION? BEQ 150$ ; YES, CONTINUE PROCESSING ERROR NTSTAT ; NO, SIGNAL FATAL NETWORK REJ$ ERROR 150$: JMP 1000$ ; EXIT AST PROCESSING ;----------------------------------------------------------------------; ; A FREE QUEUE ENTRY HAS BEEN FOUND - ACCEPT NETWORK LINK ; ;----------------------------------------------------------------------; ; ACC$ MACRO - ACC[W]$S ([LUN],[EFN],[STATUS],[AST], ; ; ) ; ;----------------------------------------------------------------------; 160$: ACCW$S VR.LUN(R5),VR.RXF(R5),VR.RXA(R5),,<#NTMAIL,#N.CBL> BCC 170$ ; BRANCH ON NO DIRECTIVE ERROR ERROR $DSW ; SIGNAL DIRECTIVE EXECUTION ERROR ;----------------------------------------------------------------------; ; INSURE THAT NETWORK LOGICAL LINK REQUEST WAS ACCEPTED ; ;----------------------------------------------------------------------; 170$: CMPB #IS.SUC,VR.RXS(R5) ; NORMAL SUCCESSFUL COMPLETION? BEQ 180$ ; YES, CONTINUE PROCESSING ERROR VR.RXS(R5) ; NO, SIGNAL FATAL NETWORK ACC$ ERROR ;----------------------------------------------------------------------; ; ACTIVATE LOGICAL LINK QUEUE ENTRY AND LOAD REMOTE NODE NAME ; ;----------------------------------------------------------------------; 180$: COM VR.ACT(R5) ; ACTIVATE LOGICAL LINK QUEUE ENTRY MOVC3 #NODLEN,#NM.SND,VR.NDA(R5) ; LOAD REMOTE NODE NAME ;----------------------------------------------------------------------; ; POST ASYNCHRONOUS NETWORK READ TO GET REMOTE VAX USER COMMAND. ; ; THIS INITIAL NETWORK READ "PRIMES THE PUMP" FOR ALL FUTURE ; ; COMMANDS WHICH WILL BE RECEIVED FROM THE REMOTE VAX USER. ; ;----------------------------------------------------------------------; ; REC$ MACRO - REC[W]$S ([LUN],[EFN],[STATUS],[AST],]) ;----------------------------------------------------------------------; REC$S VR.LUN(R5),VR.RXF(R5),VR.RXA(R5),#CMDAST, BCC 190$ ; BRANCH ON NO DIRECTIVE ERROR ERROR $DSW ; SIGNAL DIRECTIVE EXECUTION ERROR ;----------------------------------------------------------------------; ; SEND NETWORK OPERATOR CONNECT ACCEPT MESSAGE TO REMOTE USER ; ;----------------------------------------------------------------------; ; SND$ MACRO - SND[W]$S ([LUN],[EFN],[STATUS],[AST],; ;----------------------------------------------------------------------; 190$: MOVC3 #NODLEN,VR.NDA(R5),#QN.ACC ; LOAD REMOTE NODE NAME SND$S VR.LUN(R5),VR.TXF(R5),VR.TXA(R5),,<#QM.ACC,#QL.ACC> BCC 195$ ; BRANCH ON NO DIRECTIVE ERROR ERROR $DSW ; SIGNAL DIRECTIVE EXECUTION ERROR ;----------------------------------------------------------------------; ; RETURN TO NORMAL USER-LEVEL PROCESSING ; ;----------------------------------------------------------------------; 195$: JMP 1000$ ; EXIT AST PROCESSING ;----------------------------------------------------------------------; ; ; ; IF THE REQUEST IS AN INTERRUPT MESSAGE, ISSUE ERROR MESSAGE ; ; ; ;----------------------------------------------------------------------; 200$: CMPB #NT.INT,NTTYPE ; NETWORK INTERRUPT MESSAGE? BNE 300$ ; NO, CHECK OTHER QUEUE DATA TYPES MOVC3 #NODLEN,#NM.SND,#QN.INT ; LOAD REMOTE NODE NAME PRINT #QM.INT,#QL.INT,#60 ; PRINT INTERRUPT MESSAGE JMP 700$ ; AND ABORT LOGICAL LINK ;----------------------------------------------------------------------; ; ; ; IF THE REQUEST IS A USER DISCONNECT, PURGE ENTRY IN LOG LINK Q ; ; ; ;----------------------------------------------------------------------; ; CHECK FOR USER DISCONNECT DATA QUEUE ENTRIES ; ;----------------------------------------------------------------------; 300$: CMPB #NT.DSC,NTTYPE ; NETWORK USER DISCONNECT REQUEST? BNE 400$ ; NO, CHECK OTHER QUEUE DATA TYPES ;----------------------------------------------------------------------; ; INFORM OPERATOR OF USER DISCONNECT ; ;----------------------------------------------------------------------; MOVC3 #NODLEN,#NM.SND,#QN.DSC ; LOAD REMOTE NODE NAME PRINT #QM.DSC,#QL.DSC,#60 ; PRINT DISCONNECT MESSAGE ;----------------------------------------------------------------------; ; DISCONNECT LOGICAL LINK TO REMOTE VAX USER ; ;----------------------------------------------------------------------; ; DSC$ MACRO - DSC[W]$S ([LUN],[EFN],[STATUS],[AST],[] ;----------------------------------------------------------------------; MOVB NTVLUN,R4 ; SAVE DISCONNECT NETWORK LOGICAL LINK DSCW$S R4,#NTFLAG,#NTSTAT ; DISCONNECT NETWORK LOGICAL LINK BCC 310$ ; BRANCH ON NO DIRECTIVE ERROR ERROR $DSW ; SIGNAL DIRECTIVE EXECUTION ERROR ;----------------------------------------------------------------------; ; INSURE THAT USER LOGICAL LINK DISCONNECT COMPLETED SUCCESSFULLY; ;----------------------------------------------------------------------; 310$: CMPB #IS.SUC,NTSTAT ; NORMAL SUCCESSFUL COMPLETION? BEQ 320$ ; YES, CONTINUE PROCESSING ERROR NTSTAT ; NO, SIGNAL FATAL NETWORK DSC$ ERROR ;----------------------------------------------------------------------; ; REMOVE LOGICAL LINK ENTRY FROM NETWORK LOGICAL LINK TABLE ; ;----------------------------------------------------------------------; 320$: JMP 800$ ; REMOVE NETWORK LINK FROM QUEUE TABLE ;----------------------------------------------------------------------; ; ; ; IF THE REQUEST IS A USER ABORT, PURGE ENTRY IN LOG LINK QUEUE ; ; ; ;----------------------------------------------------------------------; 400$: CMPB #NT.ABT,NTTYPE ; NETWORK USER ABORT REQUEST? BNE 500$ ; NO, CHECK OTHER QUEUE DATA TYPES MOVC3 #NODLEN,#NM.SND,#QN.ABT ; LOAD REMOTE NODE NAME PRINT #QM.ABT,#QL.ABT,#60 ; PRINT DISCONNECT MESSAGE JMP 700$ ; AND ABORT LOGICAL LINK ;----------------------------------------------------------------------; ; ; ; IF THE REQUEST IS A NETWORK ABORT, PURGE ENTRY IN LOG LINK Q ; ; ; ;----------------------------------------------------------------------; 500$: CMPB #NT.ABO,NTTYPE ; NETWORK ABORT REQUEST? BNE 600$ ; NO, ISSUE ERROR MESSAGE - UNKNOWN DATA TYPE MOVC3 #NODLEN,#NM.SND,#QN.ABO ; LOAD REMOTE NODE NAME PRINT #QM.ABO,#QL.ABO,#60 ; PRINT USER ABORT MESSAGE JMP 700$ ; AND ABORT LOGICAL LINK ;----------------------------------------------------------------------; ; ; ; ERROR - NETWORK DATA QUEUE TYPE IS UNKNOWN - INFORM USER ; ; ; ;----------------------------------------------------------------------; 600$: MOVC3 #NODLEN,#NM.SND,#QN.UNK ; LOAD NODE NAME PRINT #QM.UNK,#QL.UNK,#60 ; PRINT ERROR MESSAGE ;----------------------------------------------------------------------; ; ; ; ABORT REMOTE VAX LOGICAL LINK ; ; ; ;----------------------------------------------------------------------; ; ABT$ MACRO - ABT[W]$S ([LUN],[EFN],[STATUS],[AST],[] ;----------------------------------------------------------------------; 700$: MOVB NTVLUN,R4 ; GET REMOTE VAX NETWORK LUN # ABTW$S R4,#NTFLAG,#NTSTAT ; ABORT REMOTE NETWORK LOGICAL LINK BCC 710$ ; BRANCH ON NO DIRECTIVE ERROR ERROR $DSW ; SIGNAL DIRECTIVE EXECUTION ERROR ;----------------------------------------------------------------------; ; INSURE THAT REMOTE NETWORK LINK WAS ABORTED SUCCESSFULLY ; ;----------------------------------------------------------------------; 710$: CMPB #IS.SUC,NTSTAT ; NORMAL SUCCESSFUL COMPLETION? BEQ 800$ ; YES, RETURN TO USER MODE ; ERROR NTSTAT ; NO, SIGNAL FATAL NETWORK ABT$ ERROR ;----------------------------------------------------------------------; ; ; ; REMOVE REMOTE VAX NODE FROM LOGICAL LINK QUEUE ; ; ; ;----------------------------------------------------------------------; ; SEARCH THE NETWORK LOGICAL LINK QUEUE FOR THE CORRECT LUN #(R4); ;----------------------------------------------------------------------; 800$: MOV #VRXQUE,R5 ; GET ADDRESS OF NETWORK LINK QUE HEAD 810$: TST VR.NXT(R5) ; IS THIS THE END OF THE QUEUE? BEQ 820$ ; YES, SIGNAL LUN SEARCH ERROR CMP R4,VR.LUN(R5) ; IS THIS THE CORRECT ENTRY? BEQ 830$ ; YES, DEACTIVATE IT MOV VR.NXT(R5),R5 ; NO, PROCEED TO NEXT LINK SLOT BR 810$ ;----------------------------------------------------------------------; ; NO QUEUE ENTRY WAS FOUND TO MATCH LUN # - REPORT ERROR TO USER ; ;----------------------------------------------------------------------; 820$: PRINT #QM.LUN,#QL.LUN,#60 ; REPORT INVALID NETWORK LUN TO USER BR 1000$ ; AND RETURN TO USER MODE ;----------------------------------------------------------------------; ; THE CORRECT LUN HAS BEEN FOUND - DEACTIVATE LOGICAL LINK ENTRY ; ;----------------------------------------------------------------------; 830$: CLR VR.ACT(R5) ; DEACTIVATE THE LOGICAL LINK ENTRY ;----------------------------------------------------------------------; ; ; ; NETWORK USER AST COMPLETION ; ; ; ;----------------------------------------------------------------------; ; RESTORE REGISTERS FROM STACK AND RETURN TO USER MODE PROCESSING; ;----------------------------------------------------------------------; 1000$: RSTREG ; RESTORE REGISTERS R0-R5 ASTX$S ; RETURN FROM AST LEVEL RETURN ; RETURN FROM USER MODE LEVEL .SBTTL RECEIVE REMOTE VAX USER COMMAND AST ;----------------------------------------------------------------------; ; ; ; ; ; RECEIVE REMOTE VAX USER COMMAND AST ; ; ; ; ; ;----------------------------------------------------------------------; ; THIS ROUTINE IS EXECUTED EVERY TIME A REMOTE VAX USER SENDS ; ; A COMMAND LINE TO THIS TASK VIA THE NETWORK MAILBOX. THIS ; ; HOST-DIRECTED COMMAND IS BUFFERED UP AND SENT TO THE MAIN ; ; EMULATOR TASK VIA THE USE OF SEND DATA SDAT$ DIRECTIVES. ; ;----------------------------------------------------------------------; ; NOTE THAT THIS IS AN AST ROUTINE AND AS SUCH MUST REMOVE THE ; ; TOP WORD OF THE STACK BEFORE ISSUING THE ASTX$ DIRECTIVE. ; ; THIS TOP WORD OF THE STACK CONTAINS THE ADDRESS OF THE I/O ; ; STATUS BLOCK FOR THE NETWORK RECEIVE WHICH HAS JUST COMPLETED. ; ;----------------------------------------------------------------------; CMDAST: POP VRIOSB ; GET ADDRESS OF I/O STATUS BLOCK SAVREG ; SAVE REGISTERS R0-R5 MOV VRIOSB,R5 ; GET ADDRESS IN QUEUE LIST SUB #VR.RXS,R5 ; SUBTRACT OFFSET TO GET QUEUE HEADER ;----------------------------------------------------------------------; ; CHECK I/O COMPLETION STATUS TO INSURE THAT RECEIVE WAS OK ; ;----------------------------------------------------------------------; CMPB #IS.SUC,VR.RXS(R5) ; NORMAL SUCCESSFUL COMPLETION? BEQ 20$ ; YES, CONTINUE PROCESSING ;----------------------------------------------------------------------; ; IF ERROR WAS DATA OVERRUN, CONSIDER THE READ SUCCESSFUL ; ;----------------------------------------------------------------------; CMPB #IE.DAO,VR.RXS(R5) ; DATA OVERRUN? BEQ 20$ ; YES, CONTINUE PROCESSING ;----------------------------------------------------------------------; ; IF THE LOGICAL LINK WAS ABORTED DURING I/O, DO NO PROCESSING ; ;----------------------------------------------------------------------; CMPB #IE.ABO,VR.RXS(R5) ; LOGICAL LINK DISCONNECTED? BEQ 10$ ; YES, TERMINATE AST PROCESSING ERROR VR.RXS(R5) ; NO, SIGNAL FATAL NETWORK REC$ ERROR ;----------------------------------------------------------------------; ; TRANSFER TO AST TERMINATION ROUTINE ; ;----------------------------------------------------------------------; 10$: JMP 1000$ ; TERMINATE AST PROCESSING ;----------------------------------------------------------------------; ; ; ; TRANSMIT COMMAND BUFFER TO RJE EMULATOR AS AN MCR COMMAND ; ; ; ;----------------------------------------------------------------------; ; CLEAR LAST BYTE OF USER COMMAND TO SIGNIFY END-OF-COMMAND ; ;----------------------------------------------------------------------; 20$: MOV VR.MSA(R5),R0 ; GET ADDRESS OF RECEIVED BUFFER MOV R0,R2 ; POINT TO FIRST BYTE OF COMMAND MOV VR.RXB(R5),R1 ; GET NUMBER OF BYTES RECEIVED ADD R1,R2 ; POINT TO LAST BYTE+1 OF COMMAND MOVB #CR,(R2)+ ; SIGNAL END-OF-COMMAND LINE CLRB (R2) ; SIGNAL END OF BUFFER ADD #2,R1 ; AND ADJUST BYTE COUNT ACCORDINGLY ;----------------------------------------------------------------------; ; START OF TASK-TO-TASK TRANSMIT OF VAX USER COMMAND TO EMULATOR ; ;----------------------------------------------------------------------; 30$: MOV R0,SNDCMD+S.DABA ; LOAD BUFFER ADDRESS OF COMMAND DIR$ #SNDCMD ; SEND PART OF COMMAND TO EMULATOR BCC 40$ ; BRANCH ON NO DIRECTIVE ERROR ERROR $DSW ; SIGNAL DIRECTIVE EXECUTION ERROR ;----------------------------------------------------------------------; ; INCREMENT BUFFER POINTER TO NEXT BLOCK OF DATA TO BE SENT ; ;----------------------------------------------------------------------; 40$: ADD #MAXSND,R0 ; POINT TO NEXT SEND DATA PACKET SUB #MAXSND,R1 ; AND ADJUST BYTE COUNT BGT 30$ ; SEND NEXT PACKET IF DATA AVAILABLE ;----------------------------------------------------------------------; ; DISPLAY USER MESSAGE ON OPERATOR CONSOLE ; ;----------------------------------------------------------------------; MOVC3 #NODLEN,VR.NDA(R5),#QM.CMD ; LOAD REMOTE NODE NAME MOVC3 VR.RXB(R5),VR.MSA(R5),#QU.CMD ; LOAD REMOTE USER COMMAND MOV VR.RXB(R5),R0 ; GET LENGTH OF USER COMMAND ADD #QL.CMD,R0 ; ADD LENGTH OF COMMAND STAMP PRINT #QM.CMD,R0,#60 ; AND PRINT MESSAGE TO CONSOLE ;----------------------------------------------------------------------; ; ; ; QUEUE NEXT READ REQUEST FROM THE REMOTE VAX USER TERMINAL ; ; ; ;----------------------------------------------------------------------; ; REC$ MACRO - REC[W]$S ([LUN],[EFN],[STATUS],[AST],) ;----------------------------------------------------------------------; REC$S VR.LUN(R5),VR.RXF(R5),VR.RXA(R5),#CMDAST, BCC 1000$ ; BRANCH ON NO DIRECTIVE ERROR ERROR $DSW ; SIGNAL DIRECTIVE EXECUTION ERROR ;----------------------------------------------------------------------; ; ; ; NETWORK RECEIVE VAX USER COMMAND AST COMPLETION ; ; ; ;----------------------------------------------------------------------; ; RESTORE REGISTERS FROM STACK AND RETURN TO USER MODE PROCESSING; ;----------------------------------------------------------------------; 1000$: RSTREG ; RESTORE REGISTERS R0-R5 ASTX$S ; RETURN FROM AST LEVEL .SBTTL TASK TERMINATION ;----------------------------------------------------------------------; ; ; ; TASK TERMINATION ; ; ; ;----------------------------------------------------------------------; EXIT: EXIT$S ; TERMINATE EXECUTION ;----------------------------------------------------------------------; ; END OF MODULE RJEMSG ; ;----------------------------------------------------------------------; .END START ; SPECIFY PROGRAM START