;BLKK:LLMOP.MAC[30,5653,CPYRIT], 8-Feb-1988:20:42:12, Edit by SPIDER ;Update copyright notice. ;DSKT:LLMOP.MAC[30,5653,CPYRIT], 6-Sep-1985:21:11:54, Edit by SPIDER ;Update copyright notice. ; UPD ID= 1701, SNARK:<6.1.MONITOR>LLMOP.MAC.39, 30-Mar-85 11:26:40 by GROSSMAN ;TCO 6.1.1299 - Set RBABT in RCRRSV, RCRREL, and RCRRBT to force RB's to get ;released. ; UPD ID= 1700, SNARK:<6.1.MONITOR>LLMOP.MAC.38, 30-Mar-85 09:42:35 by GROSSMAN ;TCO 6.1.1298 - Don't queue up RB in RCSRCT. ; UPD ID= 1696, SNARK:<6.1.MONITOR>LLMOP.MAC.37, 28-Mar-85 15:09:01 by GROSSMAN ;TCO 6.1.1294 - Read service password for .RCRSV function. ; UPD ID= 1601, SNARK:<6.1.MONITOR>LLMOP.MAC.36, 7-Mar-85 16:10:31 by GROSSMAN ;TCO 6.1.1241 - Prevent COMMMS's when KLNI crashes and gets restarted. ; UPD ID= 1459, SNARK:<6.1.MONITOR>LLMOP.MAC.35, 1-Feb-85 17:46:07 by GUNN ;Clean up sources for final release; update copyright date, ; remove meaningless comments and unused code. ; ;Add call to MULKCR from RCSXTC if MSD points to user page. ; ; UPD ID= 1389, SNARK:<6.1.MONITOR>LLMOP.MAC.34, 22-Jan-85 13:29:02 by GUNN ;Fix source of COMMMS BUGHLT's. Call's to LLMRCV from LPSRCV and RCSRCV ; need to handle failure return. ; UPD ID= 1336, SNARK:<6.1.MONITOR>LLMOP.MAC.33, 15-Jan-85 14:01:29 by GROSSMAN ;TCO 6.1.1136 - Remove all references to KNIN - replace with NKLNI. ; UPD ID= 1314, SNARK:<6.1.MONITOR>LLMOP.MAC.32, 11-Jan-85 15:40:13 by GLINDELL ;Change KNIN to KNINS (number of supported NI's) ; UPD ID= 1295, SNARK:<6.1.MONITOR>LLMOP.MAC.31, 9-Jan-85 14:17:26 by GUNN ;Make some code common between RC and LP. Adds feature of allowing multiple ; loop responses from transmit to multicast address to be returned to ; user as is done for Remote Console. Also gives interrupt to user on ; receipt of response. ;Add some documentation of data structures. ;Change several BUGxxx's to output source Ethernet address for problem ;isolation. ;Put LLMSTC and LLMSCA BUGINF's under FTDEBUG conditional. ; ; UPD ID= 1144, SNARK:<6.1.MONITOR>LLMOP.MAC.30, 3-Dec-84 17:31:29 by GLINDELL ;Change calls to D36COM to call into XCDSEC ; UPD ID= 1116, SNARK:<6.1.MONITOR>LLMOP.MAC.29, 20-Nov-84 17:21:39 by GUNN ;Fix TYPO in IFKSP. ==> IFSKP. ; UPD ID= 1108, SNARK:<6.1.MONITOR>LLMOP.MAC.28, 20-Nov-84 15:24:33 by GUNN ;Fix .RCRBT function to properly handle -1 in .LMSID (Software Id field). ; UPD ID= 907, SNARK:<6.1.MONITOR>LLMOP.MAC.27, 22-Oct-84 15:34:11 by PAETZOLD ;Fix assembly error ; UPD ID= 906, SNARK:<6.1.MONITOR>LLMOP.MAC.26, 22-Oct-84 14:13:00 by GUNN ;Fix to make .ELRPY function return source address of loop response. Set up ;MS in routine LPRRPY. ; UPD ID= 891, SNARK:<6.1.MONITOR>LLMOP.MAC.25, 17-Oct-84 14:56:16 by GUNN ;Fix source of RCRRPY causing COMMMS BUGCHK's. Only store received MSD ; address in RB for first response. This is a quick fix. ; Really need to handle multiple responses to a loop request as is ; done for Remote Console. ;Remove GETWRD routine. It's no longer used. ;Update Table of Contents. ; UPD ID= 884, SNARK:<6.1.MONITOR>LLMOP.MAC.24, 15-Oct-84 16:39:27 by GUNN ;Make proper use of RBAIC bit, use SKIPN not SKIPE when testing. ;Fix definition of LMAIC and LMICH. ;Put Device Id field in BOOT message conditionally depending on ; value of Boot Device field. ;Protect against Ethernet Data Link Pad Counts that are too large. ; UPD ID= 854, SNARK:<6.1.MONITOR>LLMOP.MAC.23, 8-Oct-84 14:44:54 by GUNN ;Fix .RCRBT function. ; Move code to set receipt number in RB and LM blocks to separate ; routine and call only where needed. (From RCRRID and RCRCTR) ; This was overlaying user's verification password field in ; RCRRBT. ; Store RBICH in CRQINI since it's used by many functions. ; Remove call to DNG1BY from RCSRAK. It was also called from ; RCRPOL and caused the MDBYT field to go -1. ; Handle +1 return after call to DNG1BY in RCRPOL. ; Change all LOAD references to MDBYT to CALL's to DNRPOS. ; Comment out AOS MDBYT in RCSRID. I can't recall now why it was needed. ; ***** Still need to fix other references to MDBYT ***** ; UPD ID= 847, SNARK:<6.1.MONITOR>LLMOP.MAC.22, 2-Oct-84 15:29:02 by GUNN ;Fix .RCSND function. ; RCRSND didn't handle skip return from CALL SCCINI. ; LSH of UNSAD shifted wrong direction. ; Store RBICH in SCCINI. ; UPD ID= 841, SLICE:<6.1.MONITOR>LLMOP.MAC.20, 28-Sep-84 14:42:17 by GUNN ;Add a *HACK* in SCCINI to use the destination nodes Ethernet address ;as the RB Request Number when doing the Send Console Command function. ;This is so RCSRAK can find the RB on the Request Queue when the Console ;Response ACK message arrives. ;Also, fix routines called from RCSFCD to always RETSKP when succeding. ;I don't know how this was working to this point. Maybe this is the source ;of the COMMMS/COMFBO/COMFBT (COMBNP) bugs? ; UPD ID= 829, SLICE:<6.1.MONITOR>LLMOP.MAC.19, 26-Sep-84 14:18:22 by GUNN ;Finally fix LM structure symbols to make ULOAD/USTOR work. ; The last edit, UID 820, didn't cut it. ; UPD ID= 820, SLICE:<6.1.MONITOR>LLMOP.MAC.18, 24-Sep-84 17:25:49 by GUNN ;Fix LM% symbols. ; UPD ID= 810, SLICE:<6.1.MONITOR>LLMOP.MAC.17, 20-Sep-84 14:29:22 by GUNN ;Make LLMOP edit # be decimal. ; UPD ID= 809, SLICE:<6.1.MONITOR>LLMOP.MAC.16, 20-Sep-84 13:56:16 by GUNN ;Add code in LPRRPY to return Ethernet source address of Loop Response ; message to user. ;Move D36OFF/D36ON code sequence in RCRRPY to new routine DEQMSD. D36xxx ; have been changed to expand to PIOFF/PION and RCRRPY is SWAPCD. ;Change code to always pick up LLMOP% arguments from user correctly by ; using ULOAD and USTOR to make use of MONSYM defined fields. ; UPD ID= 808, SLICE:<6.1.MONITOR>LLMOP.MAC.15, 20-Sep-84 11:01:41 by GUNN ;Fix the elusive unpredictable MACRO bug. INPMSD which gets called at ;interrupt level from NISRV was using AC0, which is a preserved AC, ;without saving it. ; UPD ID= 790, SNARK:<6.1.MONITOR>LLMOP.MAC.14, 6-Sep-84 16:02:23 by GUNN ;Fix LPSRCI and LPSSCA to correctly store the local Ethernet address. ; UPD ID= 725, SNARK:<6.1.MONITOR>LLMOP.MAC.13, 3-Aug-84 17:05:28 by GUNN ;Remove LLMOPF BUGCHK. ; UPD ID= 722, SNARK:<6.1.MONITOR>LLMOP.MAC.12, 1-Aug-84 10:54:51 by GUNN ;Remove LIT Pseudo-Op after RSCOD. It causes MACRO to generate phase ;errors. ; UPD ID= 644, SNARK:<6.1.MONITOR>LLMOP.MAC.11, 29-Jun-84 12:08:19 by GUNN ;Fix RCRADR to return correct physical address. ; UPD ID= 636, SNARK:<6.1.MONITOR>LLMOP.MAC.10, 21-Jun-84 14:31:48 by GUNN ;Fix bug introduced in edit for UPD ID 634. Rearrange sequence of code ; in RCRRPY prior to calling DNCM2U. ;Accomodate for KLNI port putting bit mask in bit 31. ; UPD ID= 634, SNARK:<6.1.MONITOR>LLMOP.MAC.9, 19-Jun-84 16:45:06 by GUNN ;Fix code in QUEMSD ;Add code to return source address to user on RCS reply. ;Interlock RB when updating MSD queue. ;Set SVDLS to 0 or -1 only. ;Change TMNE to TMNN in code added for multiple responses. ; ;Make reset routines work for Remote Console. ; ;Allow for multiple reponses for Remote console request functions. ; Add a 'shadow' UN block when posting receive buffer. ; Copy from NISRV's UN block to 'shadow' on receive. ; Return Source Ethernet address to user from 'shadow' UN. ; Keep linked list of receive MSD datagrams. ; ;Add .RCADR function. ; ;Remove .LMCCL,.LMCBL,.LMLBL,.LMCCP,.LMCBP,.LMLBP and ; use .LMRBL,.LMRBP instead. ; ; UPD ID= 534, SNARK:<6.1.MONITOR>LLMOP.MAC.8, 21-May-84 13:29:04 by GUNN ;Fix KPALVH bug. LPSRCV/RCSRCV not checking receive status code. Add a ; quick fix. ; UPD ID= 528, SNARK:<6.1.MONITOR>LLMOP.MAC.7, 18-May-84 15:20:51 by GUNN ;Change calculation of RB address from MS address in RCSXTC. The ; Remote Console RB doesn't have an LB subblock. ;Add patches found while debugging. ;Make NU.RCI call to NISRV from BLDSID to get hardware address each time. ;Add code for RCRPOL. Need symbol for control flags in MONSYM. ;Clean up some structure references by using MS as index pointer. ;Move call to DNPINI to LRQINI from LPRDIR and LPRAST. Add call to DNPINI ; in CRQINI. ;Put RETBAD after CALL CRQINI, it returns +1/+2. ;Make quick fix to allow for bug in EVDWC sending 3 byte Request-ID message. ;Make XMTMSD resident, allow for skip return of DNG1BY in RCSFCD. ;Initialize SVDLS to be non-zero, so RCSIDS doesn't try to transmit until ; LLMOP has opened its portals. ;Add code for Remote Console Request Abort. ;Add SCCINI routine to initialize an ASCII Console Carrier request. ;Add code for Send Console Command. ;Add code for receipt of COUNTERS message. ;Add code for Request Counters. ;Put request state setting code in subroutine. ;Remove some unused code and symbol definitions. ; UPD ID= 501, SNARK:<6.1.MONITOR>LLMOP.MAC.6, 4-May-84 10:31:45 by GUNN ;Fix typo, change spelling of SAVPQ to SAVEPQ. ; UPD ID= 500, SNARK:<6.1.MONITOR>LLMOP.MAC.5, 3-May-84 15:35:17 by GUNN ;Consolidate all BUG.'s ;Remove ERRRET. ;Change LLMINI to loop thru all KNIN channels. ;Change LLMINI to reset the CLKLV2 timer only after portal is open. ;Pass SV address in all calls to PSTBUF. ;Fix RCSIDS. Fix multicast address in PIDSUN. ;Replace $HIGH/$LOW with RESCD/RESDT/RESVR ;Make RESBUG resident. ;Remove ACVAR's and use DEFAC's instead. ;Remove SVCPA and use UNCAR instead. ;Make major changes to loop server to use input MSD's. ;Change algorithm for posting receive buffers. ;Change to use 2 word global pointers for receive buffers. ;Release IM block in RCSIDS if DLLUNI transmit fails. ;Delete RB state handling code which was commented out. ;Fix RCSATB right this time. Define symbols for time units. ;Pass UN block address in T1 on call to INPMSD. ;Store a temporary MDBYT value when setting up input MSD. ;Handle skip return when calling INPMSD from RCSRCV. ;Change index pointer in DNP4BY from T6 to T4. ;Make the Identify Self interval be 1 minute in RCSATB. ;Fix ILLUUO bug in RCSIDS. Release IM block in RCSIDS. ;Go NOSKED while incrementing SVNXR. ;Add field SVCPA in SVB to hold Channel Physical Address and use it. ;Add more counters to track received message loss. ;Add INCRF and DECRF macros. ;Fix range check for LLMOP% function code in .LLMOP use of FUNTAB dispatch. ;Add code to send SYSTEM ID message. ;Implement changes to conform to new NISRV interface. ; 1. Search NIPAR in addition to D36PAR. ; 2. Remove use of packing mode (PMODE). ; 3. Remove use of channel scan (SCAN/NOSCAN). ; 4. Remove use of UNPSC for doing CRC generation. ; 5. Update calls to DLLUNI to new argument calling sequence. ; NU.CLO function ; NU.OPN function ; NU.EMA function ; NU.RCV function ; NU.XMT function (for LPS only) ; ; UPD ID= 327, SNARK:<6.1.MONITOR>LLMOP.MAC.16, 10-Feb-84 14:17:35 by GUNN ;Fix race in XMTREQ,LPSXTC ;Change use of VMC.NO type MSD to conform to new NISRV functionality ;Change all NOSKED's & OKSKED's to D36OFF & D36ON to handle PI Level NIDLL ;Fix LPRDIR & LPRAST to use RTRHOM as part of Ethernet address ;Release receive buffer in RCSSID if unsolicited System ID received. ;Expand scope of NOSKED's in various routines. ;Fix test for received Remote Console message length in RCSRCV ;Change LPRIXC from BUGCHK to BUGHLT. Fix typo in comment. ; UPD ID= 305, SNARK:<6.1.MONITOR>LLMOP.MAC.15, 23-Jan-84 21:03:04 by GUNN ;Add code to check for Request state in LPSXTC. ;Check for input buffer address in RB in LPRABT and release. ;Change LPSRMQ to BUGCHK on error ;Add some code to do read counters processing. ; ;Remove NOSKED from XMTREQ which is SWAPCD. ; ;Fix 'lost loop datagram' problem. Put RB on queue prior to transmitting ; the request packet. ; ;Add a comment section to record possible future enhancements, ; improvements, optimizations, etc. ; ; UPD ID= 272, SNARK:<6.1.MONITOR>LLMOP.MAC.14, 7-Dec-83 11:55:18 by GUNN ;Add code to do Loop Assisted. ; ; UPD ID= 262, SNARK:<6.1.MONITOR>LLMOP.MAC.13, 28-Nov-83 15:39:04 by GUNN ;Keep better track of received and transmitted messages by ; adding more counters. ; ;Add code to perform periodic Identify-Self. ; ; UPD ID= 230, SNARK:<6.1.MONITOR>LLMOP.MAC.12, 31-Oct-83 09:46:07 by GUNN ;Add code to store PRO and PID fields in UN Block allocated ; in XMTREQ. ; ;Allocate a UN block individually for each process at XMTREQ and go ; NOSKED during transmit call to DLL. ;Call DNGWDx individually at each place resources are needed. ; ;New code for RCS ; ;Change label DLLSPP to LPSDSP for consistency. ;Move MIN.,MAX., and MAKENT macros to definition section. ; ;Change code which increments SVRCT and SVTCT to not be dependent ; on full word fields. ; ;Change label DLLSPP to RCSDSP in routine RCSCBR ;Add start of code for Remote Console protocol server ; ;Change Remote Console to the correct architectural value, 60-02. ; ;Fix order of protocol type bytes in SV Blocks ; ;Add code to release loop reply buffer, if allocated, in LLMRSJ/LLMRSF ; ;Change Loop Server to use the UN block passed from the DLL on ; callback to transmit the loop replys, rather than the one ; built in the SV block. ; ;Make Loop Reply MSD separate from Loop Data MSD, they can't overlay ; each other since we can't be guaranteed that the transmit will ; complete before the reply is received. ; ; UPD ID= 202, SNARK:<6.1.MONITOR>LLMOP.MAC.11, 28-Sep-83 07:03:13 by GUNN ;Rework SUBTTL's for CONTEN ;Remove BUG. skeleton ;Add a table of contents ;Add check for lost buffers at label LPSRCX in routine LPSRCV ;Change check for buffer type in LPSXTC to use field UNBTY in UN block ;Rename routine LPSQUE to LLMQUE to reflect its use in both protocol servers ;Change use of FORKN to FORKX ;Remove routine LPSDEQ (Code is in LPSDEQ.MAC) ;Add routines LLMGNQ, LLMUNQ and LLMRSJ/LLMRSF ;TITLE LLMOP - Low Level Maintenance OPeration Layer of Phase IV DECnet V011 ; By D. C. Gunn 22 JULY 86 SUBTTL Module Header SEARCH D36PAR,MACSYM ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1985,1986,1988. ;ALL RIGHTS RESERVED. ; FUTURE ENHANCEMENT LOG ; 1. Change to use D36COM queue routines ; 2. Change buffer posting algorithm to account for responses to requests. ; 3. Fix D36SYM AC purge definition problem. ; 4. Add system time field to System Id message. ; 5. Move $BUILD macro and friends to MACSYM. ; DATE LOAD EDIT # ; ---- ---- ------ ; LLMOP==:1+^D1458 ;Insert file M61A:UID.TXT here ENTRY LLMINI ;The entry point ; see procedures for calling sequence SALL IFN FTOPS20,< SEARCH PROLOG,MONSYM,NIPAR TTITLE (LLMOP,,< - Low Level Maintenance OPeration Layer of Phase IV DECnet>) > IFN FTOPS10,< SEARCH F,S,LLMPRM,ETHPRM .CPYRT<1985,1988> $RELOC $HIGH TITLE LLMOP - Low Level Maintenance Operation Layer > D36SYM RESCD ;This module implements the Low Level Maintenance Operation (LLMOP) ;portion of the Network Management layer (NML) of Phase IV DECnet. It ;is the system independent MOP service for the Ethernet. Below LLMOP ;is the Data Link layer, which handles access to the NI Ethernet ;communications medium.. Above NML is the Application layer, in which ;the user of this service resides. SUBTTL Special Definitions for TOPS10/TOPS20 Compatibility DEFINE JSUERR(JSE,UUE),< IFN FTOPS20, IFN FTOPS10, >; END DEFINE JSUERR IFN FTOPS10,< EXTERN RTN ;COMMON SUBROUTINE RETURN (CPOPJ) EXTERN LLMACT ;IDENTIFY SELF TIMER WORD Q1==T5 Q2==T6 Q3==FREE1 OPDEF NOP [TRN] DEFINE RESCD <$HIGH> DEFINE SWAPCD <$HIGH> DEFINE EA.ENT DEFINE MCENT <> ;DON'T NEED THESE IN TOPS10 DEFINE NOSKED <> DEFINE OKSKED <> DEFINE SAVEPQ > DEFINE RETBAD(COD),< IFNB , IFB , >; END DEFINE RETBAD DEFINE RETBD1(COD),< IFLE , IFG , >; END DEFINE RETBD1 DEFINE DEFAC (NEW,OLD) < IF1,< NEW=OLD PURGE OLD>> XCDSEC==MS.HGH ;USED FOR TOPS20 SECTION CALLING ;THE FOLLOWONG IS USED IN PLACE OF THE LOAD AND STOR MACROS WHEN ;PREVIOUS CONTEXT IS TO BE REFERENCED. LOAD AND STOR CANNOT ;BE USED DIRECTLY UNDER XCTU BECAUSE THEY MAY ASSEMBLE BYTE ;INSTRUCTIONS WHICH REQUIRE DIFFERENT XCT BITS. DEFINE ULOAD (AC,STR,Y)< ..STR0 (..ULDB,AC,STR,Y)> DEFINE ..ULDB (AC,LOC,MSK)< ..TSIZ (..PST,MSK) .CASE ..PST,<< XCTU [MOVE AC,LOC]>,< XCTU [HRRZ AC,LOC]>,< XCTU [HLRZ AC,LOC]>,< XCTBMU[LDB AC,[POINTR (LOC,MSK)]]>>> DEFINE USTOR (AC,STR,Y)< ..STR0 (..UDPB,AC,STR,Y)> DEFINE ..UDPB (AC,LOC,MSK)< ..TSIZ (..PST,MSK) .CASE ..PST,<< XCTU [MOVEM AC,LOC]>,< XCTU [HRRM AC,LOC]>,< XCTU [HRLM AC,LOC]>,< XCTBMU[DPB AC,[POINTR (LOC,MSK)]]>>> >; END IFN FTOPS10 SUBTTL Table of Contents SUBTTL Symbol Definitions -- Register Definitions ;Registers T1 through T6 and P1 through P2 are defined in D36PAR for ;all of DECnet-36. Register P4 is redefined as MS for ;the DNxyBY routines in D36COM. Register MB is defined in D36PAR for ;NSP and Router only. The registers defined below are additions ;used in LLMOP only. The registers FREEn are defined in D36PAR to be ;registers not otherwise used in DECnet-36. MS=MS ;THESE ARE DEFINED AS .NODDT GLOBALS CX=CX ; IN THE UNIVERSAL, CHANGE THAT HERE DEFAC (WK,Q1) ;Define a preserved general purpose work AC DEFAC (FX,Q3) ;Define fork index pointer DEFAC (LM,FREE1) ;Preserved global DEFAC (RB,FREE2) DEFAC (SB,P1) DEFAC (UN,P2) SUBTTL Symbol Definitions -- Macros $BUILD,$SET,$EOB ;Following page is from GLXMAC... ; - Build pre-formed data blocks ;Many components have a need to build simple and complex blocks which ; contain pre-formatted data, such as FOBs,IBs and other blocks ; which are made up of several words, each containing from 1 to several ; fields. Since data structures change, these blocks should not be ; just created using EXP or whatever. These macros will take values ; and install them in the right field and word of a structure. ; Start off a structure, argument is the size of the structure. DEFINE $BUILD(SIZE)< IFDEF ..BSIZ, ..BSIZ==0 ;;START COUNTER ..BLOC==. ;;REMEMBER OUR STARTING ADDRESS REPEAT SIZE,< ;;FOR EACH WORD IN THE BLOCK BLD0.(\..BSIZ,0) ;;ZERO OUT IT'S ACCUMULATOR ..BSIZ==..BSIZ+1> ;;AND STEP TO NEXT >;END OF $BUILD DEFINITION ; For each value installed somewhere in the structure, set it into the block ; Arguments are word offset,field in word (optional) and value to set. DEFINE $SET(STR,VALUE,OFFSET),< IFNDEF ..BSIZ, IFNB ,< IFB ,<..STR0 (..SET,,STR)> IFNB ,<..STR0 (..SET,,STR,OFFSET)>> IFB ,< IFB ,<..STR0 (..SET,,FWMASK)> IFNB ,<..STR0 (..SET,,FWMASK,OFFSET)>> > ; END OF $SET DEFINITION DEFINE ..SET (VALUE,LOC,MSK) < IFGE <<&777777>-..BSIZ>,< PRINTX ?WORD offset greater than $BUILD size parameter> SET0. (\,MSK,) > ;END ..SET DEFINITION ; After all values are declared, the block must be closed to do its actual ; creation. DEFINE $EOB,< IFNDEF ..BSIZ, IFN <.-..BLOC>, LSTOF. ;;DON'T SHOW THE BLOCK ..T==0 REPEAT ..BSIZ,< BLD0.(\..T,1) ;;STORE EACH WORD ..T==..T+1 > PURGE ..BSIZ,..T,..BLOC ;;REMOVE SYMBOLS LSTON. >; END OF $EOB DEFINITION DEFINE BLD0.(N,WHAT),< IFE WHAT,<..T'N==0> IFN WHAT, > ;END OF BLD0. DEFINITION DEFINE SET0.(LOC,MSK,VALUE),< IFN <<..T'LOC>&MSK>, ..TVAL== ..TMSK== ..T'LOC==..T'LOC! PURGE ..TVAL,..TMSK >;END OF SET0. DEFINITION SUBTTL Symbol Definitions -- Macros LSTIN.,LSTOF. ;Other Miscellaneous GLXMAC def's ;Macros to turn on and off listings with nesting and level control ; LSTOF. ;TURNS OFF LISTINGS ONLY ; LSTOF. XCREF ;TURNS OFF LISTINGS AND CREF ; LSTON. ;RESTORES LISTINGS AND CREF AT TOP LEVEL ;IF LSTIN. IS DEFINED AS .MINFI THEN ALL LISTINGS ARE ON DEFINE LSTOF.(FOO),< IFNDEF LSTIN.,LSTIN.==0 ;;INITIALIZE LEVEL COUNTER IFE LSTIN.,< IFIDN ,<.XCREF> ;;CONDITIONALLY SUPPRESS CREF XLIST> ;;TURN OFF LISTINGS LSTIN.==LSTIN.+1> ;;BUMP LIST LEVEL DEFINE LSTON.,< IFG LSTIN.,LSTIN.==LSTIN.-1 ;;DECR LIST LEVEL IFLE LSTIN.,<.CREF ;;RESUME CREFS LIST>> ;;RESUME LISTS SUBTTL Symbol Definitions -- Macros INCRF and DECRF DEFINE INCRF (STR,Y),< ..STR1 (..INC1,,,)> DEFINE ..INC1 (AC,LOC,MSK),< ..TSIZ (..PST,MSK) ;;SET ..PST TO CASE NUMBER .CASE ..PST,<< JSP .SAC,[AOSG LOC ;;FULLWORD CASE SOS LOC JRST (.SAC)]>,< JSP .SAC,[HRRE AC,LOC ;;RIGHT HALFWORD CASE AOSLE AC HRRM AC,LOC JRST (.SAC)]>,< JSP .SAC,[HLRE AC,LOC ;;LEFT HALFWORD CASE SOSL AC HRLM AC,LOC JRST (.SAC)]>,< JSP .SAC,[LDB AC,[POINTR (,MSK)] ..MSK==MASK.(WID(MSK),35) TXNE AC,LFTBT.(..MSK) ;;TEST SIGN BIT OF BYTE TXO AC,^-..MSK ;;NEG, ALL 1S IN REST PURGE ..MSK SOSL AC DPB AC,[POINTR (),MSK)] JRST (.SAC)]>>> DEFINE DECRF (STR,Y),< ..STR1 (..DEC1,,,)> DEFINE ..DEC1 (AC,LOC,MSK),< ..TSIZ (..PST,MSK) ;;SET ..PST TO CASE NUMBER .CASE ..PST,<< JSP .SAC,[SOSGE LOC ;;FULLWORD CASE AOS LOC JRST (.SAC)]>,< JSP .SAC,[HRRE AC,LOC ;;RIGHT HALFWORD CASE SOSL AC HRRM AC,LOC JRST (.SAC)]>,< JSP .SAC,[HLRE AC,LOC ;;LEFT HALFWORD CASE SOSL AC HRLM AC,LOC JRST (.SAC)]>,< JSP .SAC,[LDB AC,[POINTR (,MSK)] ..MSK==MASK.(WID(MSK),35) TXNE AC,LFTBT.(..MSK) ;;TEST SIGN BIT OF BYTE TXO AC,^-..MSK ;;NEG, ALL 1S IN REST PURGE ..MSK SOSL AC DPB AC,[POINTR (),MSK)] JRST (.SAC)]>>> SUBTTL Symbol Definitions -- Macros MIN.,MAX.,MAXENT ; ; Macro MIN. (symbol,list) - Assigns minimum arithmetic value of list of items. ; DEFINE MIN. (SYM,LIST), IRP LIST,,<..X==LIST>> ;;Assign lowest in list SYM==:..X> ;;Generate value ; ; Macro MAX. (symbol,list) - Assigns maximum arithmetic value of list of items. ; DEFINE MAX. (SYM,LIST), IRP LIST,,<..X==LIST>> ;;Assign highest in list SYM==:..X> ;;Generate value DEFINE MAKENT (TABLE,CODE,ROUTINE) < .ORG IFIW ROUTINE .ORG> SUBTTL Data Structure Definitions -- Request Block (RB) ;Low Level MOP Request Block BEGSTR RB ;Common header portion of RB WORD FWD ;List chain pointer to next RB WORD STT ;Request State FIELD FLG,^D18 ;Flags BIT FTI ; Transmit Request Initiated BIT FTC ; Transmit Request Complete BIT FTF ; Transmit Request Failed BIT FRC ; Receive Response Complete BIT FRF ; Receive Response Failed BIT ABT ; Abort this request IFN FTOPS10,< BIT EVW ; Job in event wait for this RB >; END IFN FTOPS10 IFN FTOPS20,< FIELD AIC,^D1 ;Assign Interrupt Channel FILLER ^D10 FIELD ICH,^D6 ;Interrupt Channel Number (0 to 35) >; END IFN FTOPS20 WORD RNO ;Receipt Number WORD CID ;Channel Id WORD DST,2 ;Destination Address WORD MSO ;MSD Address for Output WORD MSI ;MSD Address for Input IFN FTOPS20,< WORD FRK ;Fork Number WORD JOB ;Job Number >; END IFN FTOPS20 IFN FTOPS10,< WORD JCH ;Job-Context Number >; END IFN FTOPS10 ENDSTR RBL.LN==:RB.LEN ;Save length of RB header ;Request (RB) State Definitions .RQINV==:-1 ;Request state invalid .RQPND==:.LMPND ;Request pending .RQCMP==:.LMSUC ;Request complete .RQCCE==:.LMCCE ;Channel Communication Error ;Loopback portion of Request Block BEGSTR LB,RB.LST ;Message Block for Loopback WORD AAD ;Assistant Address WORD ALV ;Assistance Level ENDSTR ;Loopback LLMOP Header MSD LHH.LN==^D<2+3*<2+6>+2+2+2> ;(32) Header Length in bytes BEGSTR LH,LB.LST ;MSD for header WORD IDD ;***** ID word to hack for Transmit Complete WORD MSD,MD.LEN WORD DAT,</4> ;Room for Largest Loopback header (Full Assist) ENDSTR ;Loopback Data Area, Data Buffer supplied by User BEGSTR LD,LH.LST ;Loopback Data Output MSD WORD MSD,MD.LEN ENDSTR ;Remote Console LLMOP Header MSD MAX. (RCH.LN,<<^D1+^D8+^D1+^D1+^D18+^D18>,<^D4>,<^D3>,<^D9>,1,2>) BEGSTR CH,RB.LST ;MSD for header WORD IDD ;***** ID word to hack for Transmit Complete WORD MSD,MD.LEN WORD DAT,</4> ;Room for Largest Remote Console header ENDSTR ;Remote Console Command Data Area, Data Buffer supplied by User BEGSTR CD,LH.LST ;Remote Console Command Data Output MSD WORD MSD,MD.LEN ENDSTR ;Remote Console Response Buffer MSD MAX. (RB.LEN,) ;Redefine length of RB SUBTTL Symbol Definitions -- External Declarations EXTERN RTN ;NON-SKIP RETURN LABEL EXTERN RSKP ;SKIP RETURN LABEL ;NISRV -- The NI Data Link Layer interface EXTERN DLLUNI ;DLL Interface Routine ;NTMAN -- The Network Management Interface ;D36COM -- The DECnet-36 Common Utilities IFN FTOPS20,< EXTERN DNPINI ;Initialize MSD for output use by DNPxxx EXTERN DNP1BY ;Put a byte EXTERN DNP2BY ;Put a word, 2 bytes EXTERN DNP4BY ;Put double word, 4 bytes EXTERN DNP2BS ;Put word at caller specified offset EXTERN DNPENA ;Put 6 byte Ethernet address EXTERN DNPHIO ;Put bytes 0,1,2,3 from AC EXTERN DNGMSI ;Initialize MSD to point to input buffer EXTERN DNGMSS ;Initialize MSD for input use by DNGxxx EXTERN DNRPOS ;Read the current position in the input data EXTERN DNG1BY ;Get a byte EXTERN DNG2BY ;Get a word, 2 bytes EXTERN DNSKBY ;Skip over caller specified number of bytes EXTERN DNBKBY ;Backup 'n' bytes in message EXTERN DNGENA ;Get 6 byte Ethernet address EXTERN DNGWDS ;Get block of memory words EXTERN DNGWDZ ;Get block of zeroed memory words EXTERN DNFWDS ;return free words EXTERN DNCM2U ;Copy message to user buffer EXTERN DNCU2M ;Copy user buffer to message ;PAGUTL -- Pager utility routines EXTERN MLKMA ;Lock down a page given virtual address EXTERN MULKCR ;Unlock a page given physical page number ;STG -- Monitor Storage EXTERN LLMACT ;CLK2TM entry, Periodic Identify-Self timer >; END IFN FTOPS20 SUBTTL Symbol Definitions -- LLMOP Internal Definitions NOPAD==0 ;Don't let KLNI do padding on transmit PAD==1 ;Let KLNI do padding on transmit EN.MAX==^D1500 ;Maximum Ethernet Data in Bytes EN.CRC==^D4 ;Ethernet CRC length BUFLEN==EN.MAX+EN.CRC ;Ethernet Buffer Length in Bytes BUFSIZ==</4> ;Ethernet Buffer Size in Words LPSIBN==^D20 ;Initial Number of Buffers for LPS IFN FTOPS20,< LLPILM==<1B> ;PI Level mask for KLNI >; END IFN FTOPS20 NKLNI==1 ;Number of KLNI's supported by LLMOP IFN FTOPS10,< VGNPTR== >; END IFN FTOPS10 ; ; Define LLMOP arg block fields as BEGSTR fields for use by ULOAD/USTOR ; MSKSTR LMMRF,.LMCID,LM%MRF MSKSTR LMCBF,.LMCID,LM%CBF MSKSTR LMMNO,.LMCID,LM%MNO MSKSTR LMCCF,.LMCID,LM%CCF MSKSTR LMRDL,.LMCID,LM%RDL MSKSTR LMRDO,.LMCID,LM%RDO MSKSTR LMCDL,.LMCID,LM%CDL MSKSTR LMRCF,.LMCID,LM%RCF MSKSTR LMCID,.LMCID,LM%CID MSKSTR LMDST,.LMDST,.FWORD MSKSTR LMSRC,.LMSRC,.FWORD MSKSTR LMMCA,.LMDST,LM%MCA MSKSTR LMRTC,.LMSTF,LM%RTC IFN FTOPS20,< MSKSTR LMAIC,.LMREQ,LM%AIC MSKSTR LMICH,.LMREQ,LM%ICH >; END IFN FTOPS20 MSKSTR LMHWA,.LMHWA,.FWORD MSKSTR LMCST,.LMCST,.FWORD MSKSTR LMPYA,.LMPYA,.FWORD MSKSTR LMPID,.LMPID,LM%PID MSKSTR LMREQ,.LMREQ,LM%REQ MSKSTR LMPWD,.LMPWD,.FWORD MSKSTR LMBSV,.LMCIF,LM%BSV MSKSTR LMBDV,.LMCIF,LM%BDV MSKSTR LMPRO,.LMCIF,LM%PRO MSKSTR LMCFB,.LMCIF, MSKSTR LMDID,.LMDID,.FWORD MSKSTR LMSID,.LMSID,.FWORD MSKSTR LMRML,.LMRBL,LM%RML MSKSTR LMMBL,.LMRBL,LM%MBL MSKSTR LMRBP,.LMRBP,.FWORD MSKSTR LMAST,.LMAST,.FWORD MSKSTR LMHLP,.LMHLP,.FWORD SUBTTL Symbol Definitions -- LLMOP Protocol ;MOP Message Function codes FCBOOT==^D6 ;Boot FCRQID==^D5 ;Request ID FCSSID==^D7 ;System ID FCRQCT==^D9 ;Request Counters FCCNTR==^D11 ;Counters FCRSVC==^D13 ;Reserve Console FCRELC==^D15 ;Release Console FCCCAP==^D17 ;Console Command and Poll FCCRAK==^D19 ;Console Response and Acknowledge ;INFO TYPE values IT.MVN==^D1 ;Maintenance Version IT.FCT==^D2 ;Functions IT.CSU==^D3 ;Console User IT.RVT==^D4 ;Reservation Timer IT.CCS==^D5 ;Console Command Size IT.CRS==^D6 ;Console Response Size IT.HAD==^D7 ;Hardware Address IT.SYT==^D8 ;System Time IT.CDV==^D100 ;Communication Device IT.SID==^D200 ;Software ID IT.SPR==^D300 ;System Processor IT.DLK==^D400 ;Data Link IT.DBS==^D401 ;Data Link Buffer Size ;PDP-11 bit definitions BIT0==1B35 BIT1==1B34 BIT2==1B33 BIT3==1B32 BIT4==1B31 BIT5==1B30 BIT6==1B29 BIT7==1B28 ;Maintenance Function bit definitions MFLOOP==BIT0 ;Loop MFDUMP==BIT1 ;Dump MFPLOD==BIT2 ;Primary Loader MFMBLD==BIT3 ;Multi-block Loader MFBOOT==BIT4 ;Boot MFCCAR==BIT5 ;Console Carrier MFDLCT==BIT6 ;Data Link Counters MFCCRS==BIT7 ;Console Carrier Reservation SUBTTL Symbol Definitions -- INTERNAL Symbols ;The following INTERNALs are for NMXSER, which reads and writes these ;parameters. INTERNAL MOPVER ;MOP VERSION NUMBER INTERNAL MOPECO ;MOP VENDOR ECO NUMBER INTERNAL MOPUEC ;MOP USER ECO NUMBER SUBTTL Data Structure Definitions -- Counters Block (CB) ;Counters Block BEGSTR CB WORD ID ;Requester ID for this block WORD BR ;BYTES RECEIVED WORD BX ;BYTES TRANSMITTED WORD FR ;FRAMES RECEIVED WORD FX ;FRAMES TRANSMITTED WORD MCB ;MULTICAST BYTES RECEIVED WORD MCF ;MULTICAST FRAMES RECEIVED WORD FXD ;FRAMES XMITTED, INITIALLY DEFERRED WORD FXS ;FRAMES XMITTED, SINGLE COLLISION WORD FXM ;FRAMES XMITTED, MULTIPLE COLLISIONS WORD XF ;TRANSMIT FAILURES WORD XFM ;TRANSMIT FAILURE BIT MASK WORD CDF ;CARRIER DETECT CHECK FAILED WORD RF ;RECEIVE FAILURES WORD RFM ;RECEIVE FAILURE BIT MASK WORD DUN ;DISCARDED UNKNOWN WORD D01 ;DISCARDED POSITION 1 WORD D02 ;DISCARDED POSITION 2 WORD D03 ;DISCARDED POSITION 3 WORD D04 ;DISCARDED POSITION 4 WORD D05 ;DISCARDED POSITION 5 WORD D06 ;DISCARDED POSITION 6 WORD D07 ;DISCARDED POSITION 7 WORD D08 ;DISCARDED POSITION 8 WORD D09 ;DISCARDED POSITION 9 WORD D10 ;DISCARDED POSITION 10 WORD D11 ;DISCARDED POSITION 11 WORD D12 ;DISCARDED POSITION 12 WORD D13 ;DISCARDED POSITION 13 WORD D14 ;DISCARDED POSITION 14 WORD D15 ;DISCARDED POSITION 15 WORD D16 ;DISCARDED POSITION 16 WORD FBE ;FREE BUFFER LIST EMPTY WORD SBU ;SYSTEM BUFFER UNAVAILABLE WORD UBU ;USER BUFFER UNAVAILABLE WORD UFD ;UNRECOGNIZED FRAME DEST WORD XXX ;THIS WORD ACTUALLY RESERVED FOR UCODE WORD UNI ;PORTAL ID ENDSTR SUBTTL Data Structure Definitions -- Overview ; The Request Block queue ; ; ;LPSSVB: +-------+ ; | | ; | | ; | | ; |-------| ; | SVRQH |========>RB:+-------+ ; |-------| | RBFWD |======>RB:+-------+ ; | SVRQT |====== |-------| | RBFWD |========>RB:+-------+ ; |-------| | | | |-------| =======>| RBFWD | ; | | | | | | | | |-------| ; | | | | | | | | | | ; | | | +-------+ | | | | | ; | | | +-------+ | | | ; | | | | +-------+ ; +-------+ | | ; ======================================== ; ; ; ; The Response MSD Input list ; ; ; RB:+-------+ ; | | ; |-------| ; | RBMSI |===========>MD:+-------+ ; |-------| | MDNXT |=============>MD:+-------+ ; | | |-------| =======> | MDNXT |=======>... ; | | | | | |-------| ; | | |-------| | | | ; +-------+ | MDALA | | |-------| ; |-------| | | MDALA |======= ; | | | |-------| | ; UN:|=======| | | | | ; | | | UN:|=======| | ; |-------| | | | | ; | UNRID | | |-------| | ; |-------| =========| UNRID | | ; | | |-------| | ; | | | | | ; |=======| | | | ; | | |=======| | ; | | | |<====== ; | | | | ; | | | | ; +-------+ | | ; +-------+ ; SUBTTL Data Structure Definitions -- Server Variable Block (SVB) ;LLMOP Generic Server Variable Block ; ; The definition, structure and use of this block ; is shared between the Loopback Protocol Server ; and the Remote Console Server. ; BEGSTR SV ;Server Variable Block WORD IFG ;Initialization Flag WORD DLS ;Data Link State WORD STT ;Server State WORD AST ;Server Assistant State IFN FTOPS20,< FIELD AIC,^D1 ;Assign Interrupt Channel FILLER ^D11 FIELD ICH,^D6 ;Interrupt Channel Number (0 to 35) FILLER ^D2 >; END IFN FTOPS20 FIELD NXR,^D16 ;Next Receipt Number WORD QLK ;Queue Lock WORD RQH ;Request Queue Head WORD RQT ;Request Queue Tail WORD RCT ;Total Receive Count WORD TIC ;Total Invalid Receive Count WORD SRC ;Server Receive Count WORD SIC ;Server Invalid Receive Count WORD RRC ;Requestor Receive Count WORD RIC ;Requestor Invalid Receive Count WORD TTI ;Total Transmit Initiated Count WORD TCT ;Total Transmit Complete Count WORD TTF ;Total Transmit Failure Count WORD STC ;Server Transmit Count WORD RTC ;Requestor Transmit Count WORD BPC ;Buffer Post Count WORD LBC ;Lost Buffer Count WORD IBN ;Initial Buffer Number WORD MCA,2 ;Multicast Address IFN FTOPS20,< WORD CJN ;Configurator Job Number WORD CFN ;Configurator Fork Number >; END IFN FTOPS20 IFN FTOPS10,< WORD CJC ;Configurator Job-Context Number >; END IFN FTOPS10 WORD IXB,UN.LEN ;DLL Interface Block WORD CCB,CC.LEN ;Start of Channel Counters Block ; WORD PCB,CB.LEN ;Start of Portal Counters Block ENDSTR SUBTTL Data Structure Definitions -- Identify-self Message Block (IM) SID.SZ==^D100 ;Size of System Id message in bytes BEGSTR IM WORD IDD ;Special ID word WORD MSD,MD.LEN ;MSD for System ID message WORD DAT,</4> ;Buffer for message ENDSTR SUBTTL Storage Allocation -- Resident Write-protected RESCD ;The architecture version number of this implementation MOPVER: DEC 3 ;MOP PROTOCOL VERSION NUMBER (AS SEEN BY USERS) MOPECO: DEC 0 ;DEC ECO NUMBER MOPUEC: DEC 0 ;USER ECO NUMBER SUBTTL LLMOP BUG. Expansions ;The following contains all BUG.'s issued within this module. BUG. (CHK,LPSIFC,LLMOP,SOFT,,<>,< Cause: The LLMOP Loopback Protocol Server Call Back Routine was called by the Data Link Layer with an invalid callback function code. This is a software bug. Call your DIGITAL Software Specialist. >) BUG. (INF,LLMIL1,LLMOP,SOFT,,<,,>,< Cause: LLMOP Received a Loopback message that was too short or was improperly formatted. This is a MOP protocol violation by a remote node. T1 contains the received message length. T2-T3 contains the Ethernet address of the transmitting node. >) BUG. (INF,LLMILF,LLMOP,SOFT,,<,,>,< Cause: LLMOP Received a Loopback message that was neither a Loopback reply message or a forward data message. This is a MOP protocol violation by a remote node. T1 contains the function code. T2-T3 contains the Ethernet address of the transmitting node. >) BUG. (HLT,LPRIXC,LLMOP,SOFT, ,<,>,< Cause: NIDLL called back to LLMOP with a transmit complete event for an RB which is not in Transmit Initiated state. This is a software bug. Call your DIGITAL Software Specialist. T1 contains the current RB state T3 contains the status in the UN block >) BUG. (INF,LLMSTC,LLMOP,SOFT,,<,,>,< Cause: LLMOP was called by NIDDL on change of state. This is for information only. No corrective action required. >) BUG. (INF,LLMSCA,LLMOP,SOFT,,<,,>,< Cause: LLMOP was called by NIDDL on change of state. >) BUG. (INF,LLMLXF,LLMOP,SOFT, ,<,,>,< Cause: LLMOP was unable to transmit a forward data message. T1 contains the error code returned from the DLL T2 contains the channel status returned from the DLL T3 contains the channel on which the failure occurred >) BUG. (CHK,RCSIFC,LLMOP,SOFT,,<>,< Cause: The LLMOP Remote Console Protocol Server Call Back Routine was called by the Data Link Layer with an invalid callback function code. This is a software bug. Call your DIGITAL Software Specialist. >) BUG. (INF,LLMIR1,LLMOP,SOFT,,<>,< Cause: LLMOP Received a Remote Console message that was too short, too long or was improperly formatted. This is a MOP protocol violation by a remote node. >) BUG. (INF,MOPIFC,LLMOP,SOFT,,<>,< Cause: The LLMOP Remote Console Protocol Server received a MOP message with an invalid function code. This is a MOP protocol violation by a remote node. >) BUG. (INF,LLMRRF,LLMOP,SOFT,,<,>,< Cause: LLMOP was unable to transmit a MOP request message. T1 contains the error code returned from the DLL T3 contains the channel on which the failure occurred >) BUG. (INF,RCS3XF,LLMOP,SOFT,,<,>,< Cause: LLMOP was unable to transmit a forward data message. T1 contains the error code returned from the DLL T2 contains the channel on which the failure occurred >) BUG. (INF,RCSPIS,LLMOP,SOFT,,,< Cause: This is a temporary debugging BUGINF. It is here to provide an indication that the periodic Identify-Self transmission is being performed. >) BUG. (INF,LPRLXF,LLMOP,SOFT,,<,,>,< Cause: LLMOP was unable to transmit a forward data message. T1 contains the error code returned from the DLL T3 contains the channel on which the failure occurred >) BUG. (CHK,LLMOPF,LLMOP,SOFT,,<>,< Cause: LLMOP Failed to open an NI portal with the Data Link Layer. T1 contains the error code returned from the DLL >) BUG. (CHK,LLMMCF,LLMOP,SOFT,,<>,< Cause: LLMOP Attempt to declare the Assistant Multi-Cast Address failed when the Data Link Layer was called. T1 contains the error code returned from the DLL >) BUG. (CHK,LLMRQC,LLMOP,SOFT,,<>,< Cause: LLMOP Attempted to remove an RB queue entry from an empty queue or the RB was not on the queue. >) SUBTTL Storage Allocation -- Resident Writeable RESDT ;Server Variable Blocks for Loopback Server, one per channel ..CH==0 ;Initialize at Channel 0 LPSSVB: REPEAT ,< $BUILD (SV.LEN) ;Loopback Protocol Server Variable Block $SET (SVIFG,0) ;Initialization Flag - Clear $SET (SVDLS,<-1>) ;Data Link State - Initially invalid $SET (SVSTT,1) ;Server State - ON $SET (SVAST,1) ;Server Assistant State - ON $SET (SVRQH,0) ;Request Queue Head - Empty $SET (SVRQT,<..LRQH>) ;Request Queue Tail - Empty $SET (SVIBN,2) ;Initial Buffer Number - 2 $SET (SVMCA,) ;Loopback Multicast $SET (SVMCA,,<+1>) ;Address CF-00-00-00-00-00 $SET (UNCHN,..CH,SV.IXB) ;Channel $SET (UNPAD,NOPAD,SV.IXB) ;No padding for Loopback $SET (UNPRO,,SV.IXB) ;Protocol Type 90-00 IFN FTOPS20,< $SET (UNPMS,,SV.IXB) ;PI level at which we call NI Data Link >; END IFN FTOPS20 $SET (UNUID,,SV.IXB) ;Address of SVB is our UID $SET (UNCBA,,SV.IXB) ;Call Back Vector Address $EOB ..LRQH==*SV.RQH>> ..CH==..CH+1> ;Server Variable Blocks for Remote Console Server, one per channel ..CH==0 ;Initialize at Channel 0 RCSSVB: REPEAT ,< $BUILD (SV.LEN) ;Remote Console Server Variable Block $SET (SVIFG,0) ;Initialization Flag - Clear $SET (SVDLS,<-1>) ;Data Link State - Initially invalid $SET (SVSTT,1) ;Server State - ON $SET (SVAST,1) ;Server Assistant State - ON $SET (SVRQH,0) ;Request Queue Head - Empty $SET (SVRQT,<..CRQH>) ;Request Queue Tail - Empty $SET (SVIBN,2) ;Initial Buffer Number - 2 $SET (SVMCA,) ;Remote Console Multicast $SET (SVMCA,,<+1>) ;Address AB-00-00-02-00-00 $SET (UNCHN,..CH,SV.IXB) ;Channel $SET (UNPAD,PAD,SV.IXB) ;Padding for Remote Console $SET (UNPRO,,SV.IXB) ;Protocol Type 60-02 IFN FTOPS20,< $SET (UNPMS,,SV.IXB) ;PI level at which we call NI Data Link >; END IFN FTOPS20 $SET (UNUID,,SV.IXB) ;Address of SVB is our UID $SET (UNCBA,,SV.IXB) ;Call Back Vector Address $EOB ..CRQH==*SV.RQH>> ..CH==..CH+1> SUBTTL Storage Allocation -- Resident Writeable ;Storage for Remote Console Server Identify Self function RCSSIM: $BUILD (IM.LEN) $SET (IMIDD,<'SID'>) $SET (MDVMC,,) $SET (MDALA,,) $EOB PIDSUN: $BUILD (UN.LEN) ;UN Block for Periodic Identify-Self $SET (UNCHN,0) ;Channel $SET (UNBSZ,0) ;Will always use MSD's $SET (UNUID,) ;Address of PIDSUN is our UID $SET (UNDAD,) ;Remote Console Multicast $SET (UNDAD,,<+1>) ;Address AB-00-00-02-00-00 $SET (UNCBA,) ;Call Back Vector Address $EOB ONESEC==<^D1000> ;One second -- 1000 milliseconds ONEMIN==<^D60*ONESEC> ;One minute -- sixty seconds TENMIN==<^D10*ONEMIN> ;Ten minutes RCSATB: EXP TENMIN ;Periodic Identify-Self Time Base (10 Min) RCSITF: EXP 0 ;Initial Timer Flag SUBTTL LLMINI - LLMOP Server/Requestor Initialization ;LLMINI - Initialize NI Ethernet LLMOP Protocol Servers ; ;Call: ; CALL LLMINI ; Normal Return, Always ;Changes T1 ;This entry is called at system startup. Before this initialization ;is done, all calls to LLMOP will fail. CN=WK RESCD LLMINI: SAVEAC ;Storage for negative channel loop counter SETZ CN, ;Set up loop counter to start at channel 0 LLMIN1: CAIL CN,NKLNI ;Done all channels? JRST LLMIN2 ;Yes, finish up initialization MOVE T1,CN ;Get channel number to initialize IMULI T1,SV.LEN ;Get offset of SVB for this channel XMOVEI T1,LPSSVB(T1) ;Get address of LPS SV block for this channel CALL PSVINI ;Initialize Loopback Protocol Server NOP ;Initialization Failed - Ignore MOVE T1,CN ;Get channel number to initialize IMULI T1,SV.LEN ;Get offset of SVB for this channel XMOVEI T1,RCSSVB(T1) ;Get address of SV block for RCS CALL PSVINI ;Initialize Remote Console Protocol Server NOP ;Initialization Failed - Ignore AOJA CN,LLMIN1 ;Bump channel number, loop for each channel LLMIN2: IFN FTOPS20,< CAILE CN,0 ;Any channels at all? IFSKP. ;Yes, Set up Identify Self timer CALL NRANDM ;Get a 16 bit random value treated as MS/4 LSH T1,2 ;Make it milliseconds and sign bit in B17 HRREI T1,(T1) ;Make it a signed value +/- 2 Min 11 Sec ADDX T1,TENMIN ;Timer goes off every ten (10) +/- minutes ELSE. MOVX T1,<^-<1_^D35>> ;Get largest positive 36 bit value ENDIF. >; END IFN TOPS20 IFN FTOPS10,< MOVEI T1,^D10 ;Identify self is every ten minutes >; END IFN FTOPS10 MOVEM T1,RCSATB ;Store in Identify-Self Timer Base MOVEM T1,LLMACT ;Yes, store in timer word RET ;RETURN from LLMINI ;END of Routine LLMINI SUBTTL LLMMIN - Once a minute identify self timer routine IFN FTOPS10,< ;Routine to decrement the identify self timer and send ;identify self message if time. ; ;Called from: CLOCK1 once a minute. ; ; PUSHJ P,LLMMIN## ; Always returns here LLMMIN::SE1ENT ;Run in NZS SAVEAC ;Storage for negative channel loop counter SETZ CN, ;Set up loop counter to start at channel 0 LLMMI1: CAIL CN,NKLNI ;Done all channels? JRST LLMMI2 ;Yes, go check if time to send SID message MOVE T1,CN ;Get channel number IMULI T1,SV.LEN ;Get offset of SVB for this channel XMOVEI T1,LPSSVB(T1) ;Get address of LPS SV block for this channel CALL PSTBUF ;Post any needed buffers NOP ;Error, ignore MOVE T1,CN ;Get channel number IMULI T1,SV.LEN ;Get offset of SVB for this channel XMOVEI T1,RCSSVB(T1) ;Get address of SV block for RCS CALL PSTBUF ;Post any needed buffers NOP ;Error, ignore AOJA CN,LLMMI1 ;Bump channel number, loop for each channel LLMMI2: SOSG LLMACT## ;TEN MINUTES UP YET? PUSHJ P,RCSIDS ;YES, SEND SID MESSAGE RET ;RETURN >; END IFN FTOPS10 SUBTTL LLMOFF - LLMOP Server/Requestor Reset (Turn OFF) ;LLMOFF - Reset (turn OFF) Ethernet LLMOP for a channel ; ;Call: T1/ NI Channel Number ; CALL LLMOFF ; Normal Return ;Changes T1 IFN FTDEBUG,< ;Include this code only for debugging ;until the network management MODULE ;LOOPER is implemented to call here. SWAPCD LLMOFF: SAVEAC ;Allocate named AC variables for block pointers MOVEM T1,CN ;Save channel number ;Turn off Loopback Protocol Server IMULI T1,SV.LEN ;Get offset of SVB for this channel XMOVEI SB,LPSSVB(T1) ;Get address of SV block for LPS MOVEI T1,NU.CLO ;DLL Close Function code XMOVEI T2,SV.IXB(SB) ;Pass address of UN Block CALL DLLUNI ;Call DLL User to NI Interface Block NOP ;Ignore any failure SETZRO SVIFG,(SB) ;Not initialized any longer MOVE T1,CN ;Restore channel number ;Turn off Remote Console Protocol Server IMULI T1,SV.LEN ;Get offset of SVB for this channel XMOVEI SB,RCSSVB(T1) ;Get address of SV block for LPS MOVEI T1,NU.CLO ;DLL Close Function code XMOVEI T2,SV.IXB(SB) ;Pass address of UN Block CALL DLLUNI ;Call DLL User to NI Interface Block NOP ;Ignore any failure SETZRO SVIFG,(SB) ;Not initialized any longer RET ;Return > ;END of Routine LLMOFF SUBTTL LLMPSI - PSISER Status Routine ;Routine called when an LLMOP PSI is granted by PSISER. Routine should ;return status word. ; ;Call: J/ JCH ; CALL LLMPSI ; ;Returns status word in T2. IFN FTOPS10,< LLMPSI::SETZ T2, ;Needs to be written POPJ P, ;Return >; END IFN FTOPS10 SUBTTL Loopback Protocol Server -- LPSCBR - DLL Callback Routine ;LPSCBR - DLL Callback Dispatch Routine ; ;Call: T1/ DLL Interface Function Code NU.xxx ; T2/ UN Block address ; CALL LPSCBR ; Normal Return ;Changes UN,SB ;Get minumum/maximum valued function MIN. (MINLPF,) MAX. (MAXLPF,) LPFSIZ== ;Size of Dispatch Table RESCD LPSCBR: SAVEPQ ;Save all AC's to be safe TRVAR ;Allocate named stack variables CAIL T1,MINLPF ;Range check function code CAILE T1,MAXLPF IFSKP. MOVE UN,T2 ;Get address of DLL's UN Block LOAD SB,UNUID,(UN) ;Get SVB address CALL @LPSDSP-MINLPF(T1) ;Call the function dependent routine ELSE. XCT LPSIFC ;Do the BUG. ENDIF. RET ;Return LPSDSP: BLOCK ;DLL Callback Dispatch Table MAKENT (LPSDSP,NU.CLO-MINLPF,RTN) ;Close complete MAKENT (LPSDSP,NU.RCV-MINLPF,LPSRCV) ;DLL Receive Complete MAKENT (LPSDSP,NU.XMT-MINLPF,LPSXTC) ;DLL Transmit Complete MAKENT (LPSDSP,NU.EMA-MINLPF,RTN) ;Enable Multicast Addr Complete MAKENT (LPSDSP,NU.DMA-MINLPF,RTN) ;Disable Multicast Addr Complete MAKENT (LPSDSP,NU.RPC-MINLPF,RTN) ;Read Portal Ctrs Complete MAKENT (LPSDSP,NU.RCI-MINLPF,LPSRCI) ;Read Channel Info Complete MAKENT (LPSDSP,NU.SCA-MINLPF,RTN) ;Set Channel Address Complete MAKENT (LPSDSP,NU.RCC-MINLPF,RTN) ;DLL Read Channel Ctrs Complete ;END of Routine LPSCBR SUBTTL Loopback Protocol Server -- LPSRCV - Receive Datagram Handler ;LPSRCV - Exit Routine to Handle Received Loopback Datagram ; ;This routine is called by the DLL at interrupt level, ;when an Ethernet Loopback Protocol Datagram is received. ; ;Call: T1/ NU.RCV ; T2,UN/ DLL's UN Block address ; SB/ SV Block address ; CALL LPSRCV ; Normal Return ;Changes T1,T2 ; SKPCNT/ Skip Count RESCD LPSRCV: CALL LLMRCV ;Do common receive processing RETBAD ;Return on failure CAILE T1,^D14 ;Message must be at least minimum size IFSKP. LOAD T2,UNSAD,(UN) ;Get source of this request LOAD T3,UNSAD,+1(UN) XCT LLMIL1 ;Do the BUG. JRST LPSRCY ;Go to common exit on BUG ENDIF. ;Get function code from loopback message CALL DNG2BY ;Get skip count JRST LPSRCY MOVEM T1,SKPCNT ;Save skip count CALL DNSKBY ;Skip past that in message JRST LPSRCY CALL DNG2BY ;Get the function code JRST LPSRCY CAIE T1,1 ;Is this a reply message? IFSKP. CALL LPSRPY ;Yes, go process reply JRST LLMRCX ;Error, Drop message RET ;Return to DLL ENDIF. CAIN T1,2 ;Is this a forward data message? IFSKP. ;No..., It's invalid LOAD T2,UNSAD,(UN) ;Get source of this request LOAD T3,UNSAD,+1(UN) XCT LLMILF ;Do the BUG. JRST LPSRCY ;Go to common exit on BUG ENDIF. ;YES, Check to ensure Loop Server state is enabled OPSTR ,SVSTT,(SB) ;Loopback server enabled? JRST LLMRCX ;No, Go to common exit ;Check if destination address is a multi-cast address (CF-00-00-00-00-00) LOAD T1,UNDAD,(UN) ;Get first 4 bytes of destination address LSH T1,^D7 ;Shift to make multicast bit the sign bit SKIPL T1 ;Is it multi-cast? IFSKP. ;Yes, Destination is Multicast address OPSTR ,SVAST,(SB) ;Loop Assistance enabled? IFSKP. ;Yes, Enabled CALL LPSLBK ;Process Loopback data message JRST LLMRCX ;Failed, Drop it, release buffer RET ;Return ELSE. ;No, Disabled JRST LLMRCX ;Drop it, release buffer ENDIF. ELSE. ;No, Destination not Multicast address CALL LPSLBK ;Process Loopback data message JRST LLMRCX ;Failed, Drop it, release buffer RET ;Return ENDIF. LPSRCY: MOVE T1,SB ;Pass SV block address CALL PSTBUF ;Post a receive buffer NOP ;Ignore failure CALLRET LLMRCX ;END of Routine LPSRCV SUBTTL Loopback Protocol Server -- LPSXTC - Process Transmit Complete ;LPSXTC - Exit Routine to Handle NI Datagram Transmit Completion ; ;Call: T1/ NU.XMT ; T2,UN/ UN Block address ; SB/ SV Block address ; CALL LPSXTC ; Normal Return ;Changes T1,T2,RB RESCD LPSXTC: LOAD T1,UNBSZ,(UN) ;Get Transmitted Message length INCRF SVTCT,(SB) ;Increment total count of transmits completed ;Nota Bene: Have to know whether this is transmitted by server or requester LOAD MS,UNRID,(UN) ;Get MSD address MOVX T2,'LLM' ;Get special ID CAMN T2,-1(MS) ;Transmitted by requester? IFSKP. ;NO - Transmitted by Loop Server INCRF SVSTC,(SB) ;Bump Loop Server transmit count MOVE T1,MS ;Pass buffer address CALL DNFWDS ;Release the buffer MOVE T1,SB ;Pass SV block address CALL PSTBUF ;Post a receive buffer NOP ;Ignore failure ELSE. ;YES - Transmitted by Loop Requestor XMOVEI RB,-(MS) ;Get address of RB TMNN RBFTI,(RB) ;Ensure transmit was initiated XCT LPRIXC ;It wasn't, Do the BUG. INCRF SVRTC,(SB) ;Bump requester transmit count SKIPN T3 ;Check Transmit Status IFSKP. ;Failed... SETONE RBFTF,(RB) ;Set Transmit Failure flag ELSE. ;Success... SETONE RBFTC,(RB) ;Set Transmit Complete flag ENDIF. CALL SETRBS ;Set state in RB IFN FTOPS20,< LOAD T1,MDALA,+LD.MSD(RB) ;Get physical address LSH T1,- ;Convert to core page number CALL MULKCR ;Unlock the page >; END IFN FTOPS20 IFN FTOPS10,< XMOVEI T1,LD.MSD(RB) ;Get address of MSD CALL FREMBF ;Free up monitor buffer >; END IFN FTOPS10 ENDIF. RET ;Success - RETURN from LPSXTC ;END of Routine LPSXTC SUBTTL Loopback Protocol Server -- LPSRCI - Process Chan State Change ;LPSRCI - Exit Routine to Handle NI Channel State Change ; ;Call: T1/ NU.RCI ; T2,UN/ UN Block address ; SB/ SV Block address ; CALL LPSRCI ; Normal Return ;Changes T1,T2 RESCD LPSRCI: LOAD T1,UNCHN,+SV.IXB(SB) ;Get channel from static UN block LOAD T2,UNPID,(UN) ;Get portal id LOAD T3,UNSTA,(UN) ;Get Data Link status IFN FTDEBUG,< IFN FTOPS10, ;Enable BUGINF by patching XCT LLMSTC ;BUGINF to let someone know what's happened > LOAD T1,UNCAR,(UN) ;Get current physical address LOAD T2,UNCAR,+1(UN) STOR T1,UNCAR,+SV.IXB(SB) ;Store physical adrress STOR T2,UNCAR,+SV.IXB+1(SB) ; in the static UN block STOR T3,UNSTA,+SV.IXB(SB) ;Store status in static UN Block LOAD T1,UNHAD,(UN) ;Get hardware address LOAD T2,UNHAD,+1(UN) STOR T1,UNHAD,+SV.IXB(SB) ;Store it in the static UN block STOR T2,UNHAD,+SV.IXB+1(SB) IFN FTOPS20,< LOAD T1,UNEXS,(UN) ;Get external DLL state CAIE T1,UNS.RN ;Running? >; END IFN FTOPS20 IFN FTOPS10,< TMNN UNRUN,(UN) ;Portal running? >; END IFNF TOPS10 IFSKP. SETZRO SVDLS,(SB) ;Yes... ELSE. SETONE SVDLS,(SB) ;No... ENDIF. RET ;Success - RETURN from LPSRCI ;END of Routine LPSRCI SUBTTL Loopback Protocol Server -- LPSSCA - Process Channel Address ;LPSSCA - Exit Routine to Handle Set Channel Address Callback ; ;Call: T1/ NU.SCA ; T2,UN/ UN Block address ; SB/ SV Block address ; CALL LPSSCA ; Normal Return ;Changes T1,T2 RESCD LPSSCA: LOAD T1,UNCHN,+SV.IXB(SB) ;Get channel LOAD T2,UNDAD,(UN) ;Get new physical address LOAD T3,UNDAD,+1(UN) IFN FTDEBUG,< IFN FTOPS10, ;Enable BUGINF by patching XCT LLMSCA ;BUGINF to let someone know what's happened > LOAD T1,UNSTA,(UN) ;Get Data Link status XMOVEI UN,SV.IXB(SB) ;Address the static UN block for this channel STOR T1,UNSTA,+SV.IXB(SB) ;Store status in static UN Block STOR T2,UNCAR,+SV.IXB(SB) ;Store new physical adrress STOR T3,UNCAR,+SV.IXB+1(SB) ; in the static UN block LOAD T1,UNHAD,(UN) ;Get hardware address LOAD T2,UNHAD,+1(UN) STOR T1,UNHAD,+SV.IXB(SB) ;Store it in the static UN block STOR T2,UNHAD,+SV.IXB+1(SB) IFN FTOPS20,< LOAD T1,UNEXS,(UN) ;Get external DLL state CAIE T1,UNS.RN ;Running? >; END IFN FTOPS20 IFN FTOPS10,< TMNN UNRUN,(UN) ;Portal running? >; END IFN FTOPS10 IFSKP. SETZRO SVDLS,(SB) ;Yes... ELSE. SETONE SVDLS,(SB) ;No... ENDIF. RET ;Success - RETURN from LPSSCA ;END of Routine LPSSCA SUBTTL Loop Server -- LPSLBK - Process Forward Data Loop Message ;LPSLBK - Loopback a message ; ;Call: ; T2,UN/ DLL's UN Block address ; SKPCNT/ Skip Count ; MS/ MSD address ; SB/ SVB address ; CALL LPSLBK ; Error Return, Drop message ; Normal Return ;Note: This routine expects the MSD pointer to point to the next byte ; after the function code in the loopback message. ; ;Changes T1,T2,T3,T4 RESCD LPSLBK: INCRF SVSRC,(SB) ;Bump received loopback server message count CALL DNGENA ;Get forward address in UNDAD format RET STOR T1,UNDAD,(UN) ;Set as destination address in UN block STOR T2,UNDAD,+1(UN) IFN FTOPS20,< SETZRO UNPTR,(UN) ;Indicate immediate address passed in UNDAD >; END IFN FTOPS20 ;If forward address is a multicast address (CF-00-00-00-00-00-00), ;then drop the message. Otherwise process for transmission. LOAD T1,UNDAD,(UN) ;Get first 4 bytes of destination address LSH T1,^D7 ;Shift to make multicast bit the sign bit SKIPGE T1 ;Is it multi-cast? RET ;Yes, It is; Drop this message ;Bump skip count by 8 and store in message MOVX T1,0 ;Position of skip count in message MOVE T2,SKPCNT ;Get current skip count ADDI T2,^D8 ;Add eight to skip count CALL DNP2BS ;Put back updated skip count ;Send to forward address on this portal id, using DLL's UN block MOVEI T1,NU.XMT ;DLL Transmit Function code MOVE T2,UN ;Pass address of UN Block CALL DLLUNI ;Call DLL User to NI Interface Block IFNSK. ; ;***** Analyze why failed here. If it's because the port is off or ;broken that's OK. But any other reason might indicate some software ;problem. If it's a port problem, that's interesting because it means ;the port was well enough to receive this datagram, but now it can't ;do a transmit. Or, maybe the driver is sick. LOAD T3,UNCHN,+SV.IXB(SB) ;Get channel number LOAD T2,UNSTA,(UN) ;Get Channel Status XCT LLMLXF ;Do the BUG. INCRF SVTTF,(SB) ;Bump count of total transmit failures RET ;Take failure return ENDIF. INCRF SVTTI,(SB) ;Keep count of transmits initiated RETSKP ;Success - RETURN from LPSLBK ;END of Routine LPSLBK SUBTTL Loop Requester -- LPSRPY - Process Loopback Reply Message ;LPSRPY - Handle Loopback Reply Message ; ;Call: ; SKPCNT/ Skip Count ; SB/ SVB address ; CALL LPSRPY ; Error Return, Drop message ; Normal Return ;Note: This routine expects the MSD pointer to point to the next byte ; after the function code in the loopback message. ;Changes T1,T2,RB ; RB/ Request Block address RESCD LPSRPY: INCRF SVRRC,(SB) ;Bump received loopback requestor message count CALL DNG2BY ;Get receipt number from message RET ;Lookup the request for this receipt number ;Pass the receipt number in T1 MOVE T2,SB ;Pass SVB address CALL LPSSXQ ;Search queue for this RB IFNSK. ;Not found..., count and drop the packet INCRF SVRIC,(SB) ;Bump count of invalid request replies RET ENDIF. MOVE RB,T2 ;Found, T2 contains address of RB CALL QUEMSD ;Queue this MSD SETONE RBFRC,(RB) ;Set receive complete flag CALL SETRBS ;Set state in RB IFN FTOPS20,< OPSTR ,RBAIC,(RB) ;Interrupt channel assigned? RETSKP ;No, return now LOAD T1,RBICH,(RB) ;Get Interrupt Channel number LOAD T2,RBFRK,(RB) ;Get Fork Index CALL PSIRQ ;Notify user that request completed >; END IFN FTOPS20 IFN FTOPS10,< CALL RBWAKE ;Wake up job >; END IFN FTOPS10 RETSKP ;Success - RETURN from LPSRPY ;END of Routine LPSRPY ENDTV. ;End scope of SKPCNT SUBTTL Remote Console Protocol Server -- RCSCBR - DLL Callback Routine ;RCSCBR - DLL Callback Dispatch Routine ; ;Call: T1/ DLL Interface Function Code NU.xxx ; T2/ UN Block address ; CALL RCSCBR ; Normal Return ;Changes ;Get minumum/maximum valued function MIN. (MINRCF,) MAX. (MAXRCF,) RCFSIZ== ;Size of Dispatch Table RESCD RCSCBR: SAVEPQ ;Save all AC's to be safe CAIL T1,MINRCF ;Range check function code CAILE T1,MAXRCF IFSKP. MOVE UN,T2 ;Get address of DLL's UN Block LOAD SB,UNUID,(UN) ;Get SVB address CALL @RCSDSP-MINRCF(T1) ;Call the function dependent routine ELSE. XCT RCSIFC ;Do the BUG. ENDIF. RET ;Return RCSDSP: BLOCK ;DLL Callback Dispatch Table MAKENT (RCSDSP,NU.CLO-MINRCF,RTN) ;Close complete MAKENT (RCSDSP,NU.RCV-MINRCF,RCSRCV) ;DLL Receive Complete MAKENT (RCSDSP,NU.XMT-MINRCF,RCSXTC) ;DLL Transmit Complete MAKENT (RCSDSP,NU.EMA-MINRCF,RTN) ;Enable Multicast Addr Complete MAKENT (RCSDSP,NU.DMA-MINRCF,RTN) ;Disable Multicast Addr Complete MAKENT (RCSDSP,NU.RPC-MINRCF,RTN) ;Read Portal Ctrs Complete MAKENT (RCSDSP,NU.RCI-MINRCF,RCSRCI) ;Read Channel Info Complete MAKENT (RCSDSP,NU.SCA-MINRCF,RTN) ;Set Channel Address Complete MAKENT (RCSDSP,NU.RCC-MINRCF,RCSRCC) ;DLL Read Channel Ctrs Complete ;END of Routine RCSCBR SUBTTL Remote Console Protocol Server -- RCSXTC - Process Transmit Complete ;RCSXTC - Exit Routine to Handle NI Datagram Transmit Completion ; ;Call: T1/ NU.XMT ; T2,UN/ UN Block address ; SB/ SV Block address ; CALL RCSXTC ; Normal Return ;Changes T1,T2,RB RESCD RCSXTC: LOAD T1,UNBSZ,(UN) ;Get Transmitted Message length INCRF SVTCT,(SB) ;Increment total count of transmits completed ;Nota Bene: Have to know whether this is transmitted by server or requester LOAD MS,UNRID,(UN) ;Get MSD address MOVX T2,'SID' ;Get special ID for Identify Self System ID CAMN T2,-1(MS) ;Transmitted by requester? IFSKP. ;NO - Transmitted by Remote Console Server MOVX T2,'LLM' ;Get special ID for RC Requestor CAMN T2,-1(MS) ;Transmitted by RC Server or Requestor? IFSKP. ;Transmitted by RC Server INCRF SVSTC,(SB) ;Bump server transmit count MOVE T1,MS ;Pass buffer address CALL DNFWDS ;Release the buffer MOVE T1,SB ;Pass SV block address CALL PSTBUF ;Post a receive buffer NOP ;Ignore failure ELSE. ;Transmitted by RC Requestor, Really have RB XMOVEI RB,-(MS) ;Get address of RB TMNN RBFTI,(RB) ;Ensure transmit was initiated XCT LPRIXC ;It wasn't, Do the BUG. INCRF SVRTC,(SB) ;Bump requester transmit count SKIPN T3 ;Check Transmit Status IFSKP. ;Failed... SETONE RBFTF,(RB) ;Set Transmit Failure flag ELSE. ;Success... SETONE RBFTC,(RB) ;Set Transmit Complete flag ENDIF. CALL SETRBS ;Set state in RB IFN FTOPS20,< LOAD T1,MDALA,+LD.MSD(RB) ;Get physical address LSH T1,- ;Convert to core page number LOAD T2,MDVMC,+LD.MSD(RB) ;Get the memory type code CAIN T2,VMC.NO ;If this was a user page... CALL MULKCR ;Unlock the page >; END IFN FTOPS20 IFN FTOPS10,< XMOVEI T1,LD.MSD(RB) ;Get address of MSD CALL FREMBF ;Free up monitor buffer >; END IFN FTOPS10 TMNN RBABT,(RB) ; Function aborted? IFSKP. ; Yes. LOAD T1,RBMSI,(RB) ; Get address of input MSD and buffer CAIN T1,0 ; An MSD there? IFSKP. ; Yes... CALL DNFWDS ; Release the buffer ENDIF. MOVE T1,RB ; Get address of RB CALLRET DNFWDS ; Release the RB ENDIF. ; End of abort code ENDIF. ELSE. ;MSD - SID Transmitted by Console Requestor INCRF SVRTC,(SB) ;Bump requester transmit count ENDIF. RET ;Success - RETURN from RCSXTC ;END of Routine RCSXTC SUBTTL Remote Console Protocol Server -- RCSRCI - Process Chan State Change ;RCSRCI - Exit Routine to Handle NI Channel State Change ; ;Call: T1/ NU.RCI ; T2,UN/ UN Block address ; SB/ SV Block address ; CALL RCSRCI ; Normal Return ;Changes T1,T2 RESCD RCSRCI: IFN FTOPS20,< LOAD T1,UNEXS,(UN) ;Get external DLL state CAIE T1,UNS.RN ;Running? >; END IFN FTOPS20 IFN FTOPS10,< TMNN UNRUN,(UN) ;Portal running? >; END IFNF TOPS10 IFSKP. SETZRO SVDLS,(SB) ;Yes... ELSE. SETONE SVDLS,(SB) ;No... ENDIF. RET ;Success - RETURN from RCSRCI ;END of Routine RCSRCI SUBTTL Remote Console Protocol Server -- RCSRCV - Receive Datagram Handler ;RCSRCV - Exit Routine to Handle Received Remote Console Datagram ; ;This routine is called by the DLL, at **scheduler/interrupt** level, ;when an Ethernet Remote Console Protocol Datagram is received. ; ;Call: T1/ NU.RCV ; T2,UN/ UN Block address ; SB/ SV Block address ; CALL RCSRCV ; Normal Return ;Changes T1,T2 RESCD RCSRCV: CALL LLMRCV ;Do common receive processing RETBAD ;Return on failure CAIL T1,^D1 ;Is it at least minimum of 1 byte? IFSKP. ;No... XCT LLMIR1 ;Do the BUG. JRST LLMRCX ;Go to common exit ELSE. ;Yes... CAIG T1,^D1500 ;Bigger than Ethernet allows? IFSKP. XCT LLMIR1 ;It's a BUG. JRST LLMRCX ;Go to common exit ENDIF. ENDIF. CALL RCSFCD ;Go process message based on function code JRST LLMRCX ;On RET RET ;On RETSKP Success - RETURN from RCSRCV ;END of Routine RCSRCV SUBTTL Protocol Server -- LLMRCV - Common Receive Datagram Processing ;LLMRCV - Routine to Handle Received Remote Console Datagram ; ; ;Call: T1/ NU.RCV ; T2,UN/ UN Block address ; SB/ SV Block address ; CALL LLMRCV ; Error Return, Drop message ; Normal Return T1/ Message length ;Changes T1,T2 RESCD LLMRCV: CAIE T3,0 ;Receive error? JRST LLMRCX ;Yes... MOVE T1,UN ;Pass UN Block address CALL INPMSD ;Set up input MSD INCRF SVRCT,(SB) ;Count receipt of all messages DECRF SVBPC,(SB) ;Decrement count of receive buffers posted MOVE T1,SB ;Pass SV block address CALL PSTBUF ;Post a receive buffer NOP ;Ignore failure CALL DNRPOS ;Get message length RETSKP ;Return +2 with length in T1 LLMRCX: ;Common error exit from LLMRCV INCRF SVTIC,(SB) ;Count Total Invalid receive Counter LOAD T1,UNRID,(UN) ;Get buffer address saved when buffer posted CALLRET DNFWDS ;Free the buffer and RETURN from LLMRCV ;END of Routine LLMRCV SUBTTL Remote Console Protocol Server -- RCSFCD - MOP Function Code Dispatch ;RCSFCD - Dispatch on Received MOP Function Code ; ;Call: SB/ SV Block address ; UN/ UN Block address ; MS/ MS Block address ; CALL RCSFCD ; Normal Return ;Changes T1,T2 MIN. (MINFCD,) MAX. (MAXFCD,) FCDSIZ== ;Size of Dispatch Table RESCD RCSFCD: CALL DNG1BY ;Get MOP function code RET ;Protect against short message CAIL T1,MINFCD ;Range check function code CAILE T1,MAXFCD IFSKP. CALL @FCDDSP-MINFCD(T1) ;Call the function dependent routine RET ;Pass RETURN upwards ELSE. XCT MOPIFC ;Do the BUG. RET ENDIF. RETSKP ;Success - RETURN from RCSFCD FCDDSP: BLOCK ;Remote Console MOP Functon Dispatch Table MAKENT (FCDDSP,FCBOOT-MINFCD,RTN) ;Don't support BOOT MAKENT (FCDDSP,FCRQID-MINFCD,RCSRID) ;Process REQUEST ID MAKENT (FCDDSP,FCSSID-MINFCD,RCSSID) ;Process SYSTEM ID MAKENT (FCDDSP,FCRQCT-MINFCD,RCSRCT) ;Process REQUEST COUNTERS MAKENT (FCDDSP,FCCNTR-MINFCD,RCSCTR) ;Process COUNTERS MAKENT (FCDDSP,FCRSVC-MINFCD,RTN) ;Don't support RESERVE CONSOLE MAKENT (FCDDSP,FCRELC-MINFCD,RTN) ;Don't support RELEASE CONSOLE MAKENT (FCDDSP,FCCCAP-MINFCD,RTN) ;Don't support CONSOLE COMMAND POLL MAKENT (FCDDSP,FCCRAK-MINFCD,RCSRAK) ;Process CONSOLE RESPONSE ACK ;END of Routine RCSFCD SUBTTL Console Server -- RCSRID - Process Request ID ;RCSRID - Process MOP REQUEST ID message ; ;Call: SB/ SV Block address ; UN/ UN Block address ; MS/ MS Block address ; CALL RCSRID ; Normal Return ;Changes T1,T2 RESCD RCSRID: CALL DNG1BY ;Get the reserved field RET ; OPSTRM ,MDBYT,(MS) ;***** Patch - EVDWC sends wrong pad count *** CALL DNG2BY ;Get the receipt number RET INCRF SVSRC,(SB) ;Bump count of server receives MOVE T2,MS ;Get MSD address CALL BLDSID CALL XMTRPY ;Transmit the reply resonse RET ;Take failure return RETSKP ;Success - RETURN from RCSRID ;END of Routine RCSRID SUBTTL Console Server/Requestor -- RCSSID - Process System ID ;RCSSID - Process MOP SYSTEM ID message ; ;Call: SB/ SV Block address ; UN/ UN Block address ; MS/ MS Block address ; CALL RCSSID ; Normal Return ;Changes T1,T2 RESCD RCSSID: CALL DNG1BY ;Ignore Reserved field RET CALL DNG2BY ;Get the receipt number RET SKIPE T1 ;Is the receipt number zero? IFSKP. ;Yes, this is an unsolicited configuration msg IFN FTOPS20,< OPSTR ,SVCFN,(SB) ;Is there a Configurator Fork? >; END IFN FTOPS20 IFN FTOPS10,< OPSTR ,SVCJC,(SB) ;Is there a Configurator JCH? >; END IFN FTOPS10 IFSKP. ;Yes..., Notify process requesting SID messages INCRF SVSRC,(SB) ;Bump count of server receives ;Note: The Configurator process obtains the ability to be notified when ; unsolicited SYSTEM ID messages arrive by issuing an LLMOP% JSYS with ; function code .RCAIC and flag LM%ENU set. The process will then get a ; software interrupt on the channel provided in the call. Only one process ; on the system may be enabled to get this interrupt. When the process ; gets the interrupt indicating a SYSTEM ID message is available it must ; issue an LLMOP% JSYS with function code .RCRPY with a request number of ; zero. ;Build an RB for this buffer... MOVEI T1,RB.LEN ;Allocate block for an RB CALL DNGWDZ ;Cleared to zeroes JSUERR (MONX07,) ;Failed... Return with Error Code MOVE RB,T1 ;Save address of RB STOR MS,RBMSI,(RB) ;Store address of input MSD in RB SETZRO RBRNO,(RB) ;Set Receipt Number to zero SETONE RBFRC,(RB) ;Set receive complete flag MOVX T1,.RQCMP ;Set state to COMPLETE STOR T1,RBSTT,(RB) ;Initialize the state in RB IFN FTOPS20,< LOAD T1,SVCFN,(SB) ;Get Fork Number of Configurator Module STOR T1,RBFRK,(RB) ;Store in RB LOAD T1,SVICH,(SB) ;Get PSI channel number STOR T1,RBICH,(RB) ;Store in RB >; END IFN FTOPS20 IFN FTOPS10,< LOAD T1,SVCJC,(SB) ;Get JCH of Configurator Module STOR T1,RBJCH,(RB) ;Store in RB >; END IFN FTOPS10 MOVE T1,RB ;Get address of RB MOVE T2,SB ;Pass address of SVB CALL LLMQUE ;Queue RB on request queue ELSE. ;No..., just drop the message and free buffer RET ;Return now ENDIF. ELSE. ;No..., Handle response to RC request INCRF SVRRC,(SB) ;Bump count of requestor receives MOVE T2,SB ;Pass SVB address CALL LPSSXQ ;Search the request queue for this RB RET ;Not found, drop it. Maybe keep a count? MOVE RB,T2 ;Found, T2 contains address of RB CALL QUEMSD ;Queue this MSD SETONE RBFRC,(RB) ;Set receive complete flag CALL SETRBS ;Set state in RB ENDIF. IFN FTOPS20,< OPSTR ,RBAIC,(RB) ;Interrupt channel assigned? RETSKP ;No, return now LOAD T1,RBICH,(RB) ;Get Interrupt Channel number LOAD T2,RBFRK,(RB) ;Get Fork Index CALL PSIRQ ;Notify user that request completed >; END IFN FTOPS20 IFN FTOPS10,< CALL RBWAKE ;Wake up job >; END IFN FTOPS10 RETSKP ;Success - RETURN from RCSSID ;END of Routine RCSSID SUBTTL Console Server -- RCSRCT - Process Request Counters ;RCSRCT - Process MOP REQUEST COUNTERS message ; ;Call: SB/ SV Block address ; UN/ UN Block address ; MS/ MS Block address ; CALL RCSRCT ; Normal Return ;Changes T1,T2 RESCD RCSRCT: STKVAR CALL DNG2BY ;Get the receipt number RET MOVEM T1,RCPTNO ;Save receipt number INCRF SVSRC,(SB) ;Bump count of server receives MOVX T1,RB.LEN ;Allocate an RB for this request CALL DNGWDZ RET MOVE RB,T1 ;Point to RB MOVE T2,SB ;Pass address of SVB STOR MS,RBMSO,(RB) ;Save MSD address for output later MOVE T1,RCPTNO ;Get receipt number STOR T1,RBRNO,(RB) ;Save it in RB LOAD T1,UNSAD,(UN) ;Get source of this request LOAD T2,UNSAD,+1(UN) STOR T1,RBDST,(RB) ;Store as request destination STOR T2,RBDST,+1(RB) ;Get the current counters from the port driver LOAD T1,UNCHN,(UN) ;Get channel request received on STOR T1,RBCID,(RB) ;Save Channel ID in RB XMOVEI T1,SV.CCB(SB) ;Get address of counters buffer STOR T1,UNBFA,(UN) ;Store in UN MOVEI T1,CC.LEN ;Size of Counters Block STOR T1,UNBSZ,(UN) ;Save length in UN STOR RB,UNRID,(UN) ;Store RB address SETZRO UNZRO,(UN) ;Don't zero counters when read MOVEI T1,NU.RCC ;DLL Read Counters Function code MOVE T2,UN ;Pass address of UN Block CALL DLLUNI ;Call DLL User to NI Interface Block RET ;A real problem? RETSKP ;Success - RETURN from RCSRCT ;END of Routine RCSRCT SUBTTL Console Requestor -- RCSCTR - Process Counters ;RCSCTR - Process MOP COUNTERS message ; ;Call: SB/ SV Block address ; UN/ UN Block address ; MS/ MS Block address ; CALL RCSCTR ; Normal Return ;Changes T1,T2 RESCD RCSCTR: CALL DNG2BY ;Get the receipt number RET INCRF SVRRC,(SB) ;Bump count of requestor receives MOVE T2,SB ;Pass SVB address CALL LPSSXQ ;Search the request queue for this RB RET ;Not found, drop it. Maybe keep a count? MOVE RB,T2 ;Found, T2 contains address of RB SETONE RBFRC,(RB) ;Set receive complete flag STOR MS,RBMSI,(RB) ;Store address of input MSD in RB CALL SETRBS ;Set state in RB IFN FTOPS20,< OPSTR ,RBAIC,(RB) ;Interrupt channel assigned? RETSKP ;No, return now LOAD T1,RBICH,(RB) ;Get Interrupt Channel number LOAD T2,RBFRK,(RB) ;Get Fork Index CALL PSIRQ ;Notify user that request completed >; END IFN FTOPS20 IFN FTOPS10,< CALL RBWAKE ;Wake up job >; END IFN FTOPS10 RETSKP ;Success - RETURN from RCSCTR ;END of Routine RCSCTR SUBTTL Console Requestor -- RCSRAK - Process Console Response Ack ;RCSRAK - Process MOP CONSOLE RESPONSE ACK message ; ;Call: SB/ SV Block address ; UN/ UN Block address ; MS/ MS Block address ; CALL RCSRAK ; Normal Return ;Changes T1,T2 RESCD RCSRAK: INCRF SVRRC,(SB) ;Bump count of requestor receives ; ;Here we use the low order source Ethernet address to use as a faked ;up Request Number. This was set in the RB in SCCINI. ; LOAD T1,UNSAD,+1(UN) ;Get the low order destination address LSH T1,-<^D36-^D16> MOVE T2,SB ;Pass SVB address CALL LPSSXQ ;Search the request queue for this RB RET ;Not found, drop it. Maybe keep a count? MOVE RB,T2 ;Found, T2 contains address of RB SETONE RBFRC,(RB) ;Set receive complete flag STOR MS,RBMSI,(RB) ;Store address of input MSD in RB CALL SETRBS ;Set state in RB IFN FTOPS20,< OPSTR ,RBAIC,(RB) ;Interrupt channel assigned? RETSKP ;No, return now LOAD T1,RBICH,(RB) ;Get Interrupt Channel number LOAD T2,RBFRK,(RB) ;Get Fork Index CALL PSIRQ ;Notify user that request completed >; END IFN FTOPS20 IFN FTOPS10,< CALL RBWAKE ;Wake up job >; END IFN FTOPS10 RETSKP ;Success - RETURN from RCSRAK ;END of Routine RCSRAK SUBTTL Remote Console Protocol Server -- RCSRCC - Process Read Counters Complete ;RCSRCC - Exit Routine to Handle KLNI Read Counters Completion ; ;Call: T1/ NU.RCC ; T2,UN/ UN Block address ; SB/ SV Block address ; CALL RCSRCC ; Normal Return ;Changes T1,T2,RB RESCD RCSRCC: LOAD RB,UNRID,(UN) ;Get RB address LOAD MS,RBMSO,(RB) ;Get MSD address LOAD T1,RBRNO,(RB) ;Pass receipt number LOAD T2,UNBFA,(UN) ;Pass address of counter block MOVE T3,MS ;Pass MSD address CALL BLDCTR ;Build counters message LOAD T1,RBDST,(RB) ;Get source of this request LOAD T2,RBDST,+1(RB) STOR T1,UNSAD,(UN) ;Store as request source for XMTRPY STOR T2,UNSAD,+1(UN) MOVE T1,RB ;Pass RB address CALL DNFWDS ;Release the RB CALL XMTRPY ;Transmit the reply resonse RET ;Take failure return RET ;Success - RETURN from RCSRCC ;END of Routine RCSRCC SUBTTL Remote Console Protocol Server -- RCSRSC - Process Read Station Complete ;RCSRSC - Exit Routine to Handle KLNI Read Station Info Completion ; ;Call: T1/ NU.RSC ; T2,UN/ UN Block address ; SB/ SV Block address ; CALL RCSRSC ; Normal Return ;Changes T1,T2,RB RESCD RCSRSC: RET RETSKP ;Success - RETURN from RCSRSC ;END of Routine RCSRSC SUBTTL Console Server -- XMTRPY - Transmit MOP Reply ;XMTRPY - Transmit LLMOP Reply Using Received MSD/Buffer and Callback UN ; ;Call: SB/ SV Block address ; UN/ UN Block address ; MS/ MSD address ; CALL XMTRPY ; Error Return ; Normal Return ;Changes T1,T2 ; RESCD XMTRPY: LOAD T1,UNSAD,(UN) ;Get Source Address LOAD T2,UNSAD,+1(UN) ; ans send from whence it came CALL XMTMSD ;Transmit this MSD RET ;Failed... RETSKP ;Success - RETURN from XMTRPY ;END of Routine XMTRPY SUBTTL Console Server -- RCSIDS - Identify Self ;RCSIDS - Perform Remote Console Server Identify Self Function ; ;Call: From SCHED CLKLV2 ; CALL RCSIDS ; Normal Return ;Changes T1 ; ;Nota Bene: The periodic Identify-Self function must always ; succeed in order to meet the DIGITAL Ethernet Node ; Product Architecture Specification requirements. To ; meet this requirement all memory for performing this ; function is preallocated here. ; ; ***** This routine needs to be updated to handle multiple KLNI's ***** ; RESCD RCSIDS::SAVEAC TRVAR XMOVEI SB,RCSSVB ;Set up SB MOVE T1,RCSATB ;Get Identify-Self Timer Base MOVEM T1,LLMACT ;Reset the clock timer TMNE SVDLS,(SB) ;Data Link State ON for this channel? RET ;No, just return ;Send to multi-cast address on each channel XMOVEI UN,SV.IXB(SB) ;Get address of RCS UN block LOAD T3,UNPID,(UN) ;Get RCS's Portal-id XMOVEI UN,PIDSUN ;Get address of our UN Block STOR T3,UNPID,(UN) ;Set our Portal-id in this UN XMOVEI T1,RCSSIM ;Get address of IM block XMOVEI MS,IM.MSD(T1) ;Get address of MSD MOVX T1,0 ;Pass receipt number of zero MOVE T2,MS ;Pass MSD address CALL BLDSID ;Build the SYSTEM ID message STOR MS,UNBFA,(UN) ;Store MSD address in UN STOR MS,UNRID,(UN) ;And make it our return ID MOVEI T1,NU.XMT ;DLL Transmit Function code MOVE T2,UN ;Pass address of UN Block CALL DLLUNI ;Call DLL User to NI Interface Block IFNSK. LOAD T2,UNCHN,(UN) ;Get channel number XCT RCS3XF ;Do the BUG. ELSE. INCRF SVTTI,(SB) ;Bump count of transmits initiated SKIPA ;Enable BUGINF by patching XCT RCSPIS ;Do the BUG. ENDIF. RET ;Normal return ;END of Routine RCSIDS SUBTTL Console Server -- BLDSID - Build SYSTEM ID message ;BLDSID - Build SYSTEM ID message ; ;Call: T1/ Receipt Number ; T2/ MSD Address ; CALL BLDSID ; Error Return ; Normal Return ;Changes T1,T2 ; RESCD BLDSID: SAVEAC ;Preserve an AC MOVE P1,T1 ;Save RECEIPT NUMBER MOVE T1,T2 ;Get MSD Address CALL DNPINI ;Initialize MSD for output MOVEI T1,FCSSID ;Get System ID function code CALL DNP1BY ;Store in message MOVEI T1,0 ;Store reserved field CALL DNP1BY MOVE T1,P1 ;Get receipt number given us CALL DNP2BY ;Store receipt number in message ;Build MAINTENANCE VERSION in SYSTEM ID message MOVEI T1,3 ;Pass INFO LENGTH MOVEI T2,IT.MVN ;Pass INFO TYPE CALL INFHDR ;Build INFO header MOVE T1,MOPVER CALL DNP1BY ;Store maintenance version MOVE T1,MOPECO CALL DNP1BY ;Store ECO MOVE T1,MOPUEC CALL DNP1BY ;Store User ECO ;Build FUNCTIONS in SYSTEM ID message MOVEI T1,2 MOVEI T2,IT.FCT ;Functions CALL INFHDR ;Build INFO header MOVX T1, ;We support Loop and Data Link counters CALL DNP2BY ;Build HARDWARE ADDRESS in SYSTEM ID message MOVX T1,NU.RCI ;Get Read Channel Info function code MOVE T2,UN ;Pass address of UN Block SETZRO UNBSZ,(UN) ;Indicate no aux buffer CALL DLLUNI ;Call DLL User to NI Interface NOP ;Ignore error MOVEI T1,6 MOVEI T2,IT.HAD ;Hardware Address CALL INFHDR ;Build INFO header LOAD T1,UNHAD,(UN) ;Get hardware address LOAD T2,UNHAD,+1(UN) CALL DNPENA ;Build SYSTEM TIME in SYSTEM ID message ; ;***** ;Might have to do this in JOB0 (MEXEC) or look into possibility ; of calling routines in DATIME. ;***** MOVEI T1,^D10 MOVEI T2,IT.SYT ;System Time CALL INFHDR ;Build INFO header MOVX T1,^D19 CALL DNP1BY ;Store CENTURY MOVX T1,^D84 CALL DNP1BY ;Store YEAR MOVX T1,^D2 CALL DNP1BY ;Store MONTH MOVX T1,^D23 CALL DNP1BY ;Store DAY MOVX T1,^D12 CALL DNP1BY ;Store HOUR MOVX T1,^D30 CALL DNP1BY ;Store MINUTE MOVX T1,^D30 CALL DNP1BY ;Store SECOND MOVX T1,^D50 CALL DNP1BY ;Store 100TH MOVX T1,-^D5 CALL DNP1BY ;Store TDFH MOVX T1,^D0 CALL DNP1BY ;Store TDFM ;Build COMMUNICATION DEVICE in SYSTEM ID message MOVEI T1,1 MOVEI T2,IT.CDV ;Communication Device CALL INFHDR ;Build INFO header MOVX T1,^D15 ;Code for KLNI Device CALL DNP1BY ;Build DATA LINK in SYSTEM ID message MOVEI T1,1 MOVEI T2,IT.DLK ;Data Link CALL INFHDR ;Build INFO header MOVX T1,1 CALL DNP1BY ;Build DATA LINK BUFFER SIZE in SYSTEM ID message MOVEI T1,2 MOVEI T2,IT.DBS ;Data Link Buffer Size CALL INFHDR ;Build INFO header MOVX T1,^D262 CALLRET DNP2BY ;END of Routine BLDSID SUBTTL Console Server -- QUEMSD - Queue an INPut MSD ;QUEMSD - Queue an INPut MSD ; ;Call: RB/ Request Block address ; MS/ address of MSD to be queued ; CALL QUEMSD ; Normal Return always ;Changes T1 ; RESCD QUEMSD: ETHLOK ;Interlock the RB TMNE RBMSI,(RB) ;Is the queue empty? IFSKP. ;Yes... STOR MS,RBMSI,(RB) ;Just link this MSD ELSE. ;No... LOAD T1,RBMSI,(RB) ;Get first MSD address DO. ;Loop thru to end of list TMNN MDNXT,(T1) ;At end? IFSKP. ;No... LOAD T1,MDNXT,(T1) ;Get next MSD address JRST TOP. ;Do next ENDIF. ENDDO. ;Yes.. STOR MS,MDNXT,(T1) ;Link this MSD at end ENDIF. ETHULK ;Let go of RB interlock RET ;END of Routine QUEMSD SUBTTL Console Server -- DEQMSD - DEQueue an input MSD ;DEQMSD - DEQueue an input MSD ; ;Call: RB/ Request Block address ; CALL DEQMSD ; Return +1: Queue Empty ; Return +2: MS/ Address of MSD Dequeued ;Changes T1 ; RESCD DEQMSD: ETHLOK ;Interlock the RB TMNE RBMSI,(RB) ;Is there an MSD available? IFSKP. ;No... ETHULK SETZ MS, ;Clear the MSD address RET ENDIF. LOAD MS,RBMSI,(RB) ;Get address of input MSD LOAD T1,MDNXT,(MS) ;Get next MSD address STOR T1,RBMSI,(RB) ;Make this the next MSD ETHULK ;Let go of RB interlock RETSKP ;END of Routine DEQMSD SUBTTL Console Server -- INFHDR - Build INFO Header ;INFHDR - Build INFO Header in SYSTEM ID message ; ;Call: T1/ INFO LENGTH value ; T2/ INFO TYPE value ; CALL INFHDR ; Error Return ; Normal Return ;Changes T1,T2 ; RESCD INFHDR: SAVEAC ;Preserve an AC MOVE P1,T1 ;Save INFO LENGTH MOVE T1,T2 ;Get INFO TYPE CALL DNP2BY ;Store INFO TYPE in message MOVE T1,P1 ;Get INFO LENGTH CALL DNP1BY ;Store INFO LENGTH in message RET ;END of Routine INFHDR SUBTTL Console Server -- BLDCTR - Build COUNTERS Message ;BLDCTR - Build COUNTERS Message ; ;Call: T1/ Receipt Number ; T2/ Counter Block Address ; T3/ MSD Address ; CALL BLDCTR ; Error Return ; Normal Return ;Changes T1,T2 ; CC=WK ;CC used in this routine only RESCD BLDCTR: SAVEAC ;Preserve some ACs DMOVE P1,T1 ;Save RECEIPT NUMBER and COUNTER BLOCK address SAVEAC MOVE T1,T3 ;Get MSD Address CALL DNPINI ;Initialize MSD for output MOVEI T1,FCCNTR ;Get COUNTERS function code CALL DNP1BY ;Store in message MOVE T1,P1 ;Get receipt number given us CALL DNP2BY ;Set receipt number MOVE CC,P2 ;Get address of counter block LOAD T1,CCSLZ,(CC) ;Pass Seconds since last zeroed CALL DNP2BY ;Output Seconds since last zeroed LOAD T1,CCBYR,(CC) ;Pass Bytes received CALL DNP4BY ;Output Bytes Received LOAD T1,CCBYS,(CC) ;Pass Bytes sent CALL DNP4BY ;Output Bytes Sent LOAD T1,CCDGR,(CC) ;Pass Datagrams received CALL DNP4BY ;Output Frames Received LOAD T1,CCDGS,(CC) ;Pass Datagrams sent CALL DNP4BY ;Output Frames Sent LOAD T1,CCMBR,(CC) ;Pass Multicast bytes received CALL DNP4BY ;Output Multicast Bytes Received LOAD T1,CCMDR,(CC) ;Pass Multicast datagrams received CALL DNP4BY ;Output Multicast Frames Received LOAD T1,CCDSD,(CC) ;Pass Datagrams sent, initially deferred CALL DNP4BY ;Output Frames Sent, Initially Deferred LOAD T1,CCDS1,(CC) ;Pass Datagrams sent, single collision CALL DNP4BY ;Output Frames Sent, Single Collision LOAD T1,CCDSM,(CC) ;Pass Datagrams sent multiple collisions CALL DNP4BY ;Output Frames Sent, Multiple Collisions LOAD T1,CCSF,(CC) ;Pass Send failures CALL DNP2BY ;Output Send Failure LOAD T1,CCSFM,(CC) ;Pass Send failure bit mask LSH T1,-4 ;Right justify it CALL DNP2BY ;Output Send Failure Reason Bitmap LOAD T1,CCRF,(CC) ;Pass Receive failure CALL DNP2BY ;Output Receive Failure LOAD T1,CCRFM,(CC) ;Pass Receive failure bit mask LSH T1,-4 ;Right justify it CALL DNP2BY ;Output Receive Failure Reason Bitmap LOAD T1,CCUFD,(CC) ;Pass Unrecognized frame destination CALL DNP2BY ;Output Unrecognized Frame Destination LOAD T1,CCDOV,(CC) ;Pass Data overrun CALL DNP2BY ;Output Data Overrun LOAD T1,CCSBU,(CC) ;Pass System buffer unavailable CALL DNP2BY ;Output System Buffer Unavailable LOAD T1,CCUBU,(CC) ;Pass User buffer unavailable CALL DNP2BY ;Output User Buffer Unavailable RET ;END of Routine BLDCTR SUBTTL Console Server -- INPMSD - Initialize INPut MSD ;INPMSD - Initialize INPut MSD ; ;Call: T1/ UN Block Address ; CALL INPMSD ; Normal Return always, MS/ MSD address ;Changes T1,T2,T3,T4 ; RESCD INPMSD: SAVEAC ;Allocate UN block pointer MOVE UN,T1 ;Save address of UN block MOVX T1,UN.LEN ;Get length of UN block MOVE T2,UN ;Get source UN address LOAD T3,UNRID,(UN) ;Get address of MSD we saved as ID XMOVEI T3,MD.LEN(T3) ;'Shadow' UN is appended to MD EXTEND T1,[XBLT] ;Copy the UN block to 'shadow' LOAD T1,UNRID,(UN) ;Get address of MSD we saved as ID LOAD T2,UNBFA,(UN) ;Get received pointer LOAD T3,UNBFA,+1(UN) ; and global address LOAD T4,UNBSZ,(UN) ;Get received message length in bytes CALLRET DNGMSS ;Set up MSD for receive buffer ;END of Routine INPMSD SUBTTL Protocol Server -- SETRBS - SET RB State ;SETRBS - SET RB State based on status flags ; ;Call: RB/ Request Block address ; CALL SETRBS ; Normal Return ;Changes T1 ; RESCD SETRBS: LOAD T1,RBFLG,(RB) ;Get flags TXNN T1,RB%FTI ;Transmit initiated? IFSKP. ;And... TXNN T1, ;Receive done? ANSKP. ;And... TXNN T1, ;Transmit done? ANSKP. ;Yes... MOVX T1,.RQCMP ;Then request is complete to user ELSE. ;No... MOVX T1,.RQPND ;Then its pending to user ENDIF. STOR T1,RBSTT,(RB) ;Set state in RB RET ;END of Routine SETRBS SUBTTL LLMOP Requestor -- .LLMOP - LLMOP% (Low Level MOP) JSYS Entry IFN FTOPS20,< ;.LLMOP - Entry point to LLMOP JSYS handler ; ;Call: T1/ LLMOP% Function Code ; T2/ Argument Block Address ; CALL .LLMOP ; Error Return ; Normal Return ;Changes T2,T3,SB,LM SWAPCD .LLMOP::MCENT ;Establish "slow" JSYS context SAVEAC ;Allocate named AC variables for block pointers MOVE LM,T2 ;Save address of users LLMOP% argument block MOVX T3,SC%WHL!SC%OPR!SC%MNT ;Check for sufficient privilege TDNN T3,CAPENB ;Against ENABLED capabilities ITERR ;Not good enough CAIGE T1,.LLMIN ;Function code within range? ITERR ;No, error return 'Invalid Function' ULOAD T2,LMCID,(LM) ;Get channel number CAIL T2,0 ;Check for valid channel 0 to NKLNI-1 CAILE T2,NKLNI-1 ITERR ;Not valid, return 'Invalid Channel Number' IMULI T2,SV.LEN ;Get offset to SVB for this channel CAILE T1,.ELSTS ;Is it a Loopback function? IFSKP. ;Yes... XMOVEI SB,LPSSVB(T2) ;Get address of channels SVB ELSE. ;No..., Not Loopback CAIL T1,LMTBMX ;Within range for Remote Console? ITERR ;No, error return 'Invalid Function' XMOVEI SB,RCSSVB(T2) ;Get address of channels SVB ENDIF. TMNE SVDLS,(SB) ;Data Link State ON for this channel? ITERR ;No, LLMOP is OFF CALL @FUNTAB(T1) ;Yes, Dispatch to Function specific routine ITERR ;Return on error from .LLMOP MRETNG ;Return on success from .LLMOP >; END IFN FTOPS20 SUBTTL LLMOP - TOPS10 .LLMOP UUO Handler IFN FTOPS10,< ;LLMOP. - Entry point for LLMOP. UUO handler ; ;Call: T1/ LLMOP. Function Code ; T2/ Argument Block Address ; CALL LLMOP. ; Error Return ; Normal Return ; ; Changes: T2,T3,SB,LM ULLMOP::SAVEAC ;ALLOCATE VARIABLES FOR BLOCK POINTERS CALL PRVJ## ;CHECK FOR SUFFICIENT PRIVILEGES SKIPA ;OK, CONTINUE JSUERR (,LMPRV%) ;INSUFFICIENT PRIVILEGES MOVE M,P1 ;GET UUO AC CALL GETWDU## ;GET FIRST AC MOVE P2,T1 ;SAVE FUNCTION CODE CALL GETWD1## ;GET SECOND AC MOVE LM,T1 ;SAVE ARG BLOCK ADDRESS MOVEI T2,10 ;CHECK ARG LIST PUSHJ P,ARNGE## ;... JSUERR (,LMADC%) ;ADDRESS CHECK JFCL ;ADDRESS ILLEGAL FOR I/O CAIGE P2,.LLMIN ;FUNCTION CODE WITHIN RANGE? JSUERR (,LMILF%) ;NO, ILLEGAL FUNCTION ULOAD T2,LMCID,(LM) ;GET CHANNEL NUMBER CAIL T2,0 ;CHECK FOR VALID CHANNEL 0 TO NKLNI-1 CAILE T2,NKLNI-1 JSUERR (,LMICN%) ;INVALID CHANNEL NUMBER IMULI T2,SV.LEN ;GET OFFSET TO SVB FOR THIS CHANNEL CAILE P2,.ELSTS ;IS IT A LOOPBACK FUNCTION? IFSKP. ;YES XMOVEI SB,LPSSVB(T2) ;GET ADDRESS OF CHANNELS SVB ELSE. ;NO, NOT LOOPBACK CAIL P2,LMTBMX ;WITHIN RANGE FOR REMOTE CONSOLE? JSUERR (,LMILF%) ;NO, ILLEGAL FUNCTION XMOVEI SB,RCSSVB(T2) ;GET ADDRESS OF CHANNELS SVB ENDIF. TMNE SVDLS,(SB) ;DATA LINK STATE ON FOR THIS CHANNEL? JSUERR (,LMOFF%) ;NO, LLMOP IS OFF MOVX T1,FUNBUF ;DOES THIS FUNCTION HAVE A BUFFER? TDNN T1,FUNTAB(P2) ;... PJRST @FUNTAB(P2) ;NO, DISPATCH TO ROUTINE ULOAD T1,LMRBP,(LM) ;GET BUFFER POINTER ULOAD T2,LMMBL,(LM) ;AND LENGTH OF BUFFER PUSHJ P,CHKBPT## ;ADDRESS CHECK BUFFER JSUERR (,LMADC%) ;ADDRESS CHECK PJRST @FUNTAB(P2) ;DISPATCH TO ROUTINE >; END IFN FTOPS10 SUBTTL LLMOP - JSYS/UUO FunctionTable FUNBUF==100000,,000000 ;Function has secondary buffer FUNTAB: IFIW+FUNBUF+LPRDIR ;Ethernet Loop Direct IFIW+FUNBUF+LPRAST ;Ethernet Loop Assisted IFIW+FUNBUF+LPRRPY ;Ethernet Loop Read Reply IFIW LPRAIC ;Ethernet Loop Assign Interrupt Channel IFIW LPRABT ;Ethernet Loop Abort IFIW LPRSTS ;Ethernet Loop Get Request Status IFIW RCRRID ;Remote Console Read Identity IFIW RCRRCT ;Remote Console Read Counters IFIW RCRIDS ;Remote Console Identify Self IFIW RCRRBT ;Remote Console Remote Boot IFIW+FUNBUF+RCRRPY ;Remote Console Read Reply IFIW RCRRSV ;Reserve Remote Console IFIW RCRREL ;Release Remote Console IFIW+FUNBUF+RCRSND ;Send Console Command IFIW+FUNBUF+RCRPOL ;Console Response Poll IFIW RCRAIC ;Assign Interrupt channel IFIW RCRABT ;Abort Request IFIW RCRSTS ;Remote Console Check Request Status IFIW RCRADR ;Obtain Ethernet Addresses LMTBMX==.-FUNTAB ;Maximum Table Entry SUBTTL Loop Protocol Requestor -- LPRDIR - Ethernet Loop Direct ;LPRDIR - Perform Ethernet Loop Direct Loopback Requestor Function ; ;Call: T1/ LLMOP% Function Code ; LM/ Argument Block address ; SB/ SV Block address ; CALL LPRDIR ; Error Return ; Normal Return ;Changes T1,T2 ; RB/ Request Block address ; SWAPCD LPRDIR: CALL LRQINI ;Initialize Protocol Request Block RETBAD ;If failed... CALL LPHDRI ;Initialize loopback message header LOAD T1,UNCAR,+SV.IXB(SB) ;Get HI order Channel Physical Address bytes LOAD T2,UNCAR,+(SB) ;Get LO order CPA CALL LPHDRF ;Create forward data packet CALL LPHDRN ;Create reply data packet ;Set up destination address ULOAD T2,LMDST,(LM) ;Get 1st word of destination address STOR T2,RBDST,(RB) ;Store in RB ULOAD T2,LMDST,+1(LM) ;Get 2nd word of destination address STOR T2,RBDST,+1(RB) ;Store in RB CALL XMTREQ ;Transmit the request message RETBAD ;If failed... RETSKP ;Success - RETURN from LPRDIR ;END of Routine LPRDIR SUBTTL Loop Protocol Requestor -- LPRAST - Ethernet Loop Assisted ;LPRAST - Perform Ethernet Loop Assisted Loopback Requestor Function ; ;Call: T1/ LLMOP% Function Code ; LM/ Argument Block Address ; SB/ SV Block address ; CALL LPRAST ; Error Return ; Normal Return ;Changes T1,T2 ; RB/ Request Block address ; SWAPCD LPRAST: CALL LRQINI ;Initialize Protocol Request Block RETBAD ;If failed... CALL LPHDRI ;Initialize loopback message header ULOAD T3,LMHLP,(LM) ;Get the assistance level CAIE T3,.LMRCV IFSKP. ;Do receive assistance ULOAD T2,LMDST,(LM) ;Get destination address STOR T2,RBDST,(RB) ;Store in RB ULOAD T2,LMDST,+1(LM) STOR T2,RBDST,+1(RB) ULOAD T1,LMAST,(LM) ;Get assistance address ULOAD T2,LMAST,+1(LM) CALL LPHDRF ;Create forward data packet ELSE. ;Do transmit or full assistance ULOAD T2,LMAST,(LM) ;Get assistance address STOR T2,RBDST,(RB) ;Store in RB ULOAD T2,LMAST,+1(LM) STOR T2,RBDST,+1(RB) ULOAD T1,LMDST,(LM) ;Get destination address ULOAD T2,LMDST,+1(LM) CAIN T3,.LMXMT IFSKP. CAIE T3,.LMFUL IFSKP. ;Do full assistance CALL LPHDRF ;Create forward data packet ULOAD T1,LMAST,(LM) ;Get assistance address ULOAD T2,LMAST,+1(LM) CALL LPHDRF ;Create forward data packet ELSE. ;Invalid assistance level RETBAD ENDIF. ELSE. ;Do transmit assistance CALL LPHDRF ;Create forward data packet ENDIF. ENDIF. LOAD T1,UNCAR,+SV.IXB(SB) ;Get HI order Channel Physical Address bytes LOAD T2,UNCAR,+(SB) ;Get LO order CPA CALL LPHDRF ;Create forward data packet CALL LPHDRN ;Create reply data packet CALL XMTREQ ;Transmit the request message RETBAD ;If failed... RETSKP ;Success - RETURN from LPRAST ;END of Routine LPRAST SUBTTL Loop Protocol Requestor -- LPHDRI - Loopback Message Header Initialization ;LPHDRI - Initialize the header portion of a loopback request message ; ;Call: RB/ Request Block address ; CALL LPHDRI ; Normal Return MS/ Loop header MSD address ;Changes T1,MS ; SWAPCD LPHDRI: ;Entry ;Set skip count to zero MOVEI T1,0 ;Skip count zero CALLRET DNP2BY ;Write into message and RETURN from LPHDRI ;END of Routine LPHDRI SUBTTL Loop Protocol Requestor -- LPHDRF - Loopback Message Header Forward Packet ;LPHDRF - Create Loopback Message Forward Packet ; ;Call: T1/ Bytes 0-3 of Ethernet Address ; T2/ Bytes 4,5 of Ethernet Address ; MS/ Loop header MSD address ; CALL LPHDRF ; Normal Return ;Changes T1,T2 ; SWAPCD LPHDRF: SAVEAC ;Preserve some ACs DMOVE P1,T1 ;Save Hi and LO order bytes ;Set function code to 'forward data' (02) MOVEI T1,2 ;Function code 02 CALL DNP2BY ;Write into message ;Store our Ethernet address as forward address MOVE T1,P1 ;Get Hi Order 4 bytes MOVE T2,P2 ;Get Lo Order 2 bytes CALL DNPENA ;Store address in message RET ;RETURN from LPHDRF ;END of Routine LPHDRF SUBTTL Loop Protocol Requestor -- LPHDRN - Loopback Message Header Reply and Request Number ;LPHDRN - Create Loopback Reply Packet ; ;Call: MS/ MSD address ; RB/ Request Block address ; CALL LPHDRN ; Normal Return ;Changes T1 ; SWAPCD LPHDRN: ;Entry ;Set next function code to 'reply data' (01) MOVEI T1,1 ;Function code 01 CALL DNP2BY ;Write into message ;Set receipt number LOAD T1,RBRNO,(RB) ;Get receipt number from RB CALL DNP2BY ;Write into message RET ;RETURN from LPHDRN ;END of Routine LPHDRN SUBTTL Loop Protocol Requestor -- LPRRPY - Read Loop Reply ;LPRRPY - Read Loop Reply ; ;Call: T1/ LLMOP% Function Code ; LM/ Argument Block Address ; SB/ SV Block address ; CALL LPRRPY ; Error Return ; Normal Return ;Changes T1,T2,MS SWAPCD LPRRPY: CALLRET RCRRPY ;Same function as RCRRPY ;END of Routine LPRRPY SUBTTL Loop Protocol Requestor -- LPRAIC - Assign Interrupt Channel ;LPRAIC - Assign Interrupt Channel ; ; Nota bene: This function was originally planned but later ; implemented by LPRAIC bit in request. It's not needed but left ; in as a dinosaur. ; ;Call: T1/ LLMOP% Function Code ; LM/ Flags, Interrupt Channel ; SB/ SV Block address ; CALL LPRAIC ; Error Return ; Normal Return ;Changes T1 SWAPCD LPRAIC: ;Ethernet Loop Assign Interrupt Channel JSUERR (ARGX02,) ;Error return 'Invalid Function' from LPRAIC ;END of Routine LPRAIC SUBTTL Loop Protocol Requestor -- LPRABT - Ethernet Loop Abort ;LPRABT - Perform Ethernet Loop Abort Loopback Requestor Function ; ;Call: T1/ LLMOP% Function Code ; LM/ Argument Block Address ; SB/ SV Block address ; CALL LPRABT ; Error Return ; Normal Return ;Changes T1,T2,RB SWAPCD LPRABT: ULOAD T1,LMREQ,(LM) ;Get the Receipt Number of the request MOVE T2,SB ;Pass address of SVB CALL LPSSXQ ;Search queue for RB for this request JSUERR (LLMX04,) ;Request does not exist MOVE RB,T2 ;Make RB Address safe MOVE T1,RB ;Get address of RB MOVE T2,SB ;Pass address of SVB CALL LPSRMQ ;Remove it from queue JFCL ;Failed... LOAD T1,RBMSI,(RB) ;Get address of input MSD and buffer CAIN T1,0 ;An MSD there? IFSKP. ;Yes... CALL DNFWDS ;Release the buffer ENDIF. MOVE T1,RB ;Get address of RB CALL DNFWDS ;Release the RB RETSKP ;Success - RETURN from LPRABT ;END of Routine LPRABT SUBTTL Loop Protocol Requestor -- LPRSTS - Get Request Status ;LPRSTS - Get Request Status of Loop Request ; ;Call: T1/ LLMOP% Function Code ; LM/ Argument Block Address ; SB/ SV Block address ; CALL LPRSTS ; Error Return ; Normal Return ;Changes T1,T2 SWAPCD LPRSTS: ULOAD T1,LMREQ,(LM) ;Get the Receipt Number of the request MOVE T2,SB ;Pass address of SVB CALL LPSSXQ ;Search queue for RB for this request JSUERR (LLMX04,) ;Request does not exist MOVE RB,T2 ;Get RB address LOAD T1,RBFLG,(RB) ;Get flags, Assume RB%FTI TXNN T1, ;Receive done? IFSKP. ;And... TXNN T1, ;Transmit done? ANSKP. ;Yes... MOVX T1,.RQCMP ;Then request is complete to user ELSE. ;No... MOVX T1,.RQPND ;Then its pending to user ENDIF. USTOR T1,LMRTC,(LM) ;Store the new status and flags RETSKP ;Success - RETURN from LPRSTS ;END of Routine LPRSTS SUBTTL Loop Protocol Requestor -- LRQINI - Request Block Initialization ;LRQINI - Perform Ethernet Protocol Requestor Request Block Initialization ; ;Call: LM/ Argument Block Address ; CALL LRQINI ; Error Return ; Normal Return RB/ Request Block Address ;Changes T1,T2,RB SWAPCD LRQINI: ;Request Block Initialization MOVEI T1,RB.LEN ;Obtain and Initialize a Request Block (RB) CALL DNGWDZ ;Get a clean block for RB JSUERR (MONX07,) ;Failed... Return with Error Code MOVE RB,T1 ;Save address of RB ;Initialize the state in RB MOVX T1,.RQINV ;Set request state invalid STOR T1,RBSTT,(RB) IFN FTOPS20,< MOVE T1,JOBNO ;Get Users Job Number STOR T1,RBJOB,(RB) ;Store in RB MOVE T1,FORKX ;Get Users Fork Number STOR T1,RBFRK,(RB) ;Store in RB >; END IFN FTOPS20 IFN FTOPS10,< MOVE T1,.CPJCH## ;Get current JCH STOR T1,RBJCH,(RB) ;Store in RB >; END IFN FTOPS10 ;Initialize MSD chain in RB XMOVEI MS,LH.MSD(RB) ;Get address of Header MSD XMOVEI T1,LD.MSD(RB) ;Get address of User Data MSD MOVX T2,LHH.LN ;Length of LH buffer XMOVEI T3,LH.DAT(RB) ;Get address of LH buffer CALL MSDINI ;Initialize MSD ;Store a special ID for transmit complete MOVX T1,'LLM' ;Identifier for LLMOP STOR T1,LHIDD,(RB) ;Store special ID ;Copy info from users argument block to RB ULOAD T2,LMCID,(LM) ;Get channel id STOR T2,RBCID,(RB) ;Store in RB IFN FTOPS20,< ULOAD T1,LMAIC,(LM) ;Interrupt channel assigned? STOR T1,RBAIC,(RB) ;Store interrupt assigned flag ULOAD T1,LMICH,(LM) ;Get the interrupt channel STOR T1,RBICH,(RB) ;Store Interrupt Channel number >; END IFN FTOPS20 ;Initialize User Data MSD SETZRO MDALL,+LD.MSD(RB) ;Clear allocated length, not relevant here SETZRO MDALA,+LD.MSD(RB) ;Clear allocated address, not relevant here ;Set receipt number in RB NOSKED ;Interlock the SVB from other processes LOAD T2,RBCID,(RB) ;Get channel number IMULI T2,SV.LEN ;Get offset of SVB for this channel XMOVEI SB,LPSSVB(T2) ;Get address of SV block for LPS CALL SETRNO ;Set up receipt number OKSKED ;Let go of SVB interlock ;Build Request Block (RB) from User's Argument Block ;Store receipt number in user argument block LOAD T2,RBRNO,(RB) ;Get receipt assigned to this request USTOR T2,LMREQ,(LM) ;Give to user as Request Number ;Set up MSD for user data ULOAD T1,LMMBL,(LM) ;Get length of user loopback data STOR T1,MDBYT,+LD.MSD(RB) ;Store bytes written in user data MSD ;***** ; ; Convert users Loopback data pointer to user virtual address. ; MAP User Virtual Address to Physical page number and LOCK ; the page down in resident memory. Store the Physical address ; in the MSD for use by the driver. LPSXTC will UNLOCK the page ; when Transmit is complete. ; ;***** ULOAD T1,LMRBP,(LM) ;Get users Loopback data pointer STOR T1,MDPTR,+LD.MSD(RB) ;Store users virtual pointer in MSD CALL CNVPTR ;Convert User pointer to address RET ;Illegal Ptr, Return with error STOR T1,MDAUX,+LD.MSD(RB) ;Store indexed pointer STOR T2,MDALA,+LD.MSD(RB) ;Store users virtual address IFN FTOPS20,< MOVE T1,T2 ;Make copy of virtual address TXO T1,<1B0> ;Set bit 0 to indicate user virtual CALL MLKMA ;Lock the page, returning core page number LSH T1,WID(777) ;Convert page to physical address LOAD T2,MDALA,+LD.MSD(RB) ;Get users virtual address TXZ T2,<777777,,777000> ;Get just the offset IOR T1,T2 ;Set offset into physical page STOR T1,MDALA,+LD.MSD(RB) ;Store physical address MOVX T1,VMC.NO ;Get code for Physical Address STOR T1,MDVMC,+LD.MSD(RB) ;Store it in MSD >; END IFN FTOPS20 IFN FTOPS10,< XMOVEI T1,LD.MSD(RB) ;Get address of MSD CALL MAKMBF ;Create a monitor buffer RET ;Error >; END IFN FTOPS10 RETSKP ;Success - RETURN from LRQINI ;END of Routine LRQINI SUBTTL Remote Console Protocol Requestor -- RCRRID - Read Identity ;RCRRID - Perform Read Identity Remote Console Requestor Function ; ;Call: T1/ LLMOP% Function Code ; LM/ Argument Block Address ; SB/ SV Block address ; CALL RCRRID ; Error Return ; Normal Return ;Changes SWAPCD RCRRID: CALL CRQINI ;Initialize Remote Console ReQuest Block RETBAD CALL SETRNO ;Set up receipt number MOVX T1,FCRQID ;Get Request ID function code CALL DNP1BY ;Store function code in message MOVX T1,0 CALL DNP1BY ;Store reserved byte in message LOAD T1,RBRNO,(RB) ;Get Receipt Number of this request CALL DNP2BY ;Store in message CALL XMTREQ ;Transmit the request message RETBAD ;If failed... RETSKP ;Success - RETURN from RCRRID ;END of Routine RCRRID SUBTTL Remote Console Protocol Requestor -- RCRRCT - Read Counters ;RCRRCT - Perform Read Counters Remote Console Requestor Function ; ;Call: T1/ LLMOP% Function Code ; LM/ Argument Block Address ; SB/ SV Block address ; CALL RCRRCT ; Error Return ; Normal Return ;Changes SWAPCD RCRRCT: CALL CRQINI ;Initialize Remote Console ReQuest Block RETBAD CALL SETRNO ;Set up receipt number MOVX T1,FCRQCT ;Get Request Counters function code CALL DNP1BY ;Store function code in message LOAD T1,RBRNO,(RB) ;Get Receipt Number of this request CALL DNP2BY ;Store in message CALL XMTREQ ;Transmit the request message RETBAD ;If failed... RETSKP ;Success - RETURN from RCRRCT ;END of Routine RCRRCT SUBTTL Remote Console Protocol Requestor -- RCRIDS - Identify Self ;RCRIDS - Perform Identify Self Remote Console Requestor Function ; ;Call: T1/ LLMOP% Function Code ; LM/ Argument Block Address ; SB/ SV Block address ; CALL RCRIDS ; Error Return ; Normal Return ;Changes SWAPCD RCRIDS: ;Remote Console Identify Self CALL RCSIDS ;Same as server RETSKP ;Success - RETURN from RCRIDS ;END of Routine RCRIDS SUBTTL Remote Console Protocol Requestor -- RCRRBT - Remote Boot ;RCRRBT - Perform Remote Boot Remote Console Requestor Function ; ;Call: T1/ LLMOP% Function Code ; LM/ Argument Block Address ; SB/ SV Block address ; CALL RCRRBT ; Error Return ; Normal Return ;Changes SWAPCD RCRRBT: IFN FTOPS10,< ULOAD T1,LMCFB,(LM) ;Get Control Information TXNN T1,LM%BDV ;Specify boot device? IFSKP. ;Yes, address check string ULOAD T1,LMDID,(LM) ;Get byte pointer to string MOVEI T2,^D18 ;And maximum string length PUSHJ P,CHKBPT## ;Check byte pointer JSUERR (,LMADC%) ;Address check ENDIF. ULOAD T1,LMSID,(LM) ;Get byte pointer to string MOVEI T2,^D18 ;And maximum string length PUSHJ P,CHKBPT## ;Check byte pointer JSUERR (,LMADC%) ;Address check >; END IFN FTOPS10 SAVEAC ;Save preserved work AC CALL CRQINI ;Initialize Remote Console ReQuest Block RETBAD MOVX T1,FCBOOT ;Get Remote Boot function code CALL DNP1BY ;Store function code in message ULOAD T1,LMPWD,(LM) ;Get Verification Password CALL DNPHIO ;Use this also for password bytes 0,1,2,3 ULOAD T1,LMPWD,+1(LM) ;And bytes 4,5,6,7 also CALL DNPHIO ULOAD T1,LMCFB,(LM) ;Get Control Information CALL DNP2BY ;Store fields in message TXNN T1,LM%BDV ;Boot Device Specified? IFSKP. ;Yes, put Device Id field in message MOVX T1,1 ;Copy just first byte (count) ULOAD T2,LMDID,(LM) ;Get Device Id (Pointer) CALL DNCU2M ;Copy from user buffer to message OPSTR ,MDPTR,(MS) ;Get the count byte back CAIG T1,^D17 ;Ensure C-17 field IFSKP. CALL DNBKBY ;Back up over count byte MOVX T1,^D17 ;Get maximum count CALL DNP1BY ;Put count in message ENDIF. ULOAD T2,LMDID,(LM) ;Get Device Id (Pointer) again IBP T2 ;Bump pointer past count byte CALL DNCU2M ;Copy from user buffer to message ENDIF. MOVX T1,1 ;Copy just first byte (count) ULOAD T2,LMSID,(LM) ;Get Software Id (Pointer) CALL DNCU2M ;Copy from user buffer to message OPSTR ,MDPTR,(MS) ;Get the count byte back CAILE T1,277 ;Is it negative? (-n for generic form) IFSKP. ;No, T1 has length of Id field CAIG T1,^D17 ;Ensure C-17 field IFSKP. ;Field too long... CALL DNBKBY ;Back up over count byte MOVX T1,^D17 ;Get maximum count CALL DNP1BY ;Put count in message ENDIF. ULOAD T2,LMSID,(LM) ;Get Software Id (Pointer) again IBP T2 ;Bump pointer past count byte CALL DNCU2M ;Copy from user buffer to message ENDIF. SETONE RBABT,(RB) ;Force interrupt level to release RB CALL XMTRCM ;Transmit the request message RETBAD ;If failed... RETSKP ;Success - RETURN from RCRRBT ;END of Routine RCRRBT SUBTTL Remote Console Protocol Requestor -- RCRRPY - Read Reply ;RCRRPY - Read Remote Console Requestor Reply Function ; ;Call: T1/ LLMOP% Function Code ; LM/ Argument Block Address ; SB/ SV Block address ; CALL RCRRPY ; Error Return ; Normal Return ;Changes SWAPCD RCRRPY: ULOAD T1,LMREQ,(LM) ;Get Request Number MOVE T2,SB ;Pass address of SVB CALL LPSSXQ ;Search RB queue JSUERR (LLMX04,) ;Not found MOVE RB,T2 ;Save RB address in RB LOAD T1,RBSTT,(RB) ;Get state CAIN T1,.RQCMP ;Complete? IFSKP. ;No..., Dismiss user until reply arrives IFN FTOPS20,< LOAD T1,RBRNO,(RB) ;Get request number HRL T1,T1 ;In left half HRRI T1,RCRWAI ;Wait routine address in right half MOVEM RB,FKSTA2(FX) ;Store RB address for use by SCHED test routine MDISMS ;T1/ Request #,,Routine Addr >; END IFN FTOPS20 IFN FTOPS10,< CALL RBWAIT ;Wait for RB completion >; END IFN FTOPS10 ENDIF. CALL DEQMSD ;Dequeue an MSD JSUERR (LLMX99,) ;None there... CALL DNRPOS ;Get length of user data ULOAD T2,LMMBL,(LM) ;Get User Max Buffer Length CAMLE T1,T2 ;Will it fit in buffer? MOVE T1,T2 ;No, truncate **** Or RETBAD? ***** USTOR T1,LMRML,(LM) ;Return received length to user ULOAD T2,LMRBP,(LM) ;Pass users command response buffer pointer CALL DNCM2U ;Move data to user JSUERR (ATSX17,) ;Failed, Why?... BUG? XMOVEI UN,MD.LEN(MS) ;Get address of 'shadow' UN block LOAD T1,UNSAD,(UN) ;Get the source address USTOR T1,LMSRC,(LM) ;Give to user LOAD T1,UNSAD,+1(UN) USTOR T1,LMSRC,+1(LM) TMNN RBMSI,(RB) ;Is there another MSD available? IFSKP. ;Yes... SETO T1, ;Set the 'more replies flag' USTOR T1,LMMRF,(LM) ; in users flags word ELSE. ;No... MOVE T1,RB ;Get address of RB MOVE T2,SB ;Pass address of SVB CALL LPSRMQ ;Remove it from queue JFCL ;Failed... MOVE T1,RB ;Get address of RB CALL DNFWDS ;Release the RB ENDIF. MOVE T1,MS ;Get address of input MSD and receive buffer CALL DNFWDS ;Release the MSD and buffer MOVE T1,SB ;Pass SV block address CALL PSTBUF ;Post a receive buffer NOP ;Ignore failure RETSKP ;Success - RETURN from RCRRPY ;Wait routine for scheduler, called with Request # in T1 ; RB address in FKSTA2, FX with fork table index RESCD IFN FTOPS20,< RCRWAI: MOVE T2,FKSTA2(FX) ;Get RB address OPSTR ,RBRNO,(T2) ;This the right request? RET ;No... LOAD T1,RBSTT,(T2) ;Get current request state CAIE T1,.RQCMP ;Is Request Complete? RET ;No, wait some more RETSKP ;Yes, let it go >; END IFN FTOPS20 ;END of Routine RCRRPY SUBTTL Remote Console Protocol Requestor -- RCRSTS - Check Request Status ;RCRSTS - Perform Check Request Status Remote Console Requestor Function ; ;Call: T1/ LLMOP% Function Code ; LM/ Argument Block Address ; SB/ SV Block address ; CALL RCRSTS ; Error Return ; Normal Return ;Changes SWAPCD RCRSTS: ULOAD T1,LMREQ,(LM) ;Get the Receipt Number of the request MOVE T2,SB ;Pass address of SVB CALL LPSSXQ ;Search queue for RB for this request JSUERR (LLMX04,) ;Request does not exist MOVE RB,T2 ;Get RB address LOAD T1,RBFLG,(RB) ;Get flags ;Assume RB%FTI TXNN T1, ;Receive done? IFSKP. ;And... TXNN T1, ;Transmit done? ANSKP. ;Yes... MOVX T1,.RQCMP ;Then request is complete to user ELSE. ;No... MOVX T1,.RQPND ;Then its pending to user ENDIF. USTOR T1,LMRTC,(LM) ;Store the new status and flags RETSKP ;Success - RETURN from RCRSTS ;END of Routine RCRSTS SUBTTL Remote Console Protocol Requestor -- RCRADR - Get Addresses ;RCRADR - Obtain KLNI Ethernet Local Addresses ; ;Call: T1/ LLMOP% Function Code ; LM/ Argument Block Address ; SB/ SV Block address ; CALL RCRADR ; Normal Return Always ;Changes SWAPCD RCRADR: XMOVEI UN,SV.IXB(SB) ;Get address of UN block MOVX T1,NU.RCI ;Get Read Channel Info function code MOVE T2,UN ;Pass address of UN Block SETZRO UNBSZ,(UN) ;Indicate no aux buffer CALL DLLUNI ;Call DLL User to NI Interface NOP ;Ignore error LOAD T1,UNHAD,(UN) ;Get hardware address LOAD T2,UNHAD,+1(UN) USTOR T1,LMHWA,(LM) ;Store the hardware address USTOR T2,LMHWA,+1(LM) LOAD T1,UNCAR,(UN) ;Get the current physical address LOAD T2,UNCAR,+1(UN) USTOR T1,LMPYA,(LM) ;Store the physical address USTOR T2,LMPYA,+1(LM) RETSKP ;Success - RETURN from RCRADR ;END of Routine RCRADR SUBTTL Remote Console Protocol Requestor -- RCRRSV - Reserve Remote Console ;RCRRSV - Perform Reserve Remote Console Requestor Function ; ;Call: T1/ LLMOP% Function Code ; LM/ Argument Block Address ; SB/ SV Block address ; CALL RCRRSV ; Error Return ; Normal Return ;Changes SWAPCD RCRRSV: CALL CRQINI ;Initialize Remote Console ReQuest Block RETBAD MOVX T1,FCRSVC ;Get Reserve Console function code CALL DNP1BY ;Store function code in message ULOAD T1,LMPWD,(LM) ;Get Verification Password CALL DNPHIO ;Use this also for password bytes 0,1,2,3 ULOAD T1,LMPWD,+1(LM) ;And bytes 4,5,6,7 also CALL DNPHIO SETONE RBABT,(RB) ;Force interrupt level to release RB CALL XMTRCM ;Transmit the request message RETBAD ;If failed... RETSKP ;Success - RETURN from RCRRSV ;END of Routine RCRRSV SUBTTL Remote Console Protocol Requestor -- RCRREL - Release Remote Console ;RCRREL - Perform Release Remote Console Requestor Function ; ;Call: T1/ LLMOP% Function Code ; LM/ Argument Block Address ; SB/ SV Block address ; CALL RCRREL ; Error Return ; Normal Return ;Changes SWAPCD RCRREL: CALL CRQINI ;Initialize Remote Console ReQuest Block RETBAD MOVX T1,FCRELC ;Get Release Console function code CALL DNP1BY ;Store function code in message SETONE RBABT,(RB) ;Force interrupt level to release RB CALL XMTRCM ;Transmit the request message RETBAD ;If failed... RETSKP ;Success - RETURN from RCRREL ;END of Routine RCRREL SUBTTL Remote Console Protocol Requestor -- RCRSND - Send Console Command ;RCRSND - Perform Send Console Command Remote Console Requestor Function ; ;Call: T1/ LLMOP% Function Code ; LM/ Argument Block Address ; SB/ SV Block address ; CALL RCRSND ; Error Return ; Normal Return ;Changes SWAPCD ;Send Console Command RCRSND: CALL CRQINI ;Initialize Remote Console ReQuest Block RETBAD CALL SCCINI ;Set up RB for Console Command data RETBAD XMOVEI T1,CH.MSD(RB) ;Get address of Console header MSD CALL DNPINI ;Initialize for output MOVX T1,FCCCAP ;Get Console Command and Poll function code CALL DNP1BY ;Store function code in message ULOAD T1,LMCCF,(LM) ;Get message number and command break flag CALL DNP1BY ;Store Control Flags CALL XMTREQ ;Transmit the request message RETBAD ;If failed... RETSKP ;Success - RETURN from RCRSND ;END of Routine RCRSND SUBTTL Remote Console Protocol Requestor -- RCRPOL - Console Response Poll ;RCRPOL - Perform Console Response Poll Remote Console Requestor Function ; ;Call: T1/ LLMOP% Function Code ; LM/ Argument Block Address ; SB/ SV Block address ; CALL RCRPOL ; Error Return ; Normal Return ;Changes SWAPCD RCRPOL: ;Console Response Poll ULOAD T1,LMREQ,(LM) ;Get Request Number MOVE T2,SB ;Pass address of SVB CALL LPSSXQ ;Search RB queue JSUERR (LLMX04,) ;Not found MOVE RB,T2 ;Save RB address in RB LOAD T1,RBSTT,(RB) ;Get state CAIN T1,.RQCMP ;Complete? IFSKP. ;No..., Dismiss user until reply arrives IFN FTOPS20,< LOAD T1,RBRNO,(RB) ;Get request number HRL T1,T1 ;In left half HRRI T1,RCRWAI ;Wait routine address in right half MOVEM RB,FKSTA2(FX) ;Store RB address for use by SCHED test routine MDISMS ;T1/ Request #,,Routine Addr >; END IFN FTOPS20 IFN FTOPS10,< CALL RBWAIT ;Wait for RB completion >; END IFN FTOPS10 ENDIF. LOAD MS,RBMSI,(RB) ;Get address of input MSD CALL DNG1BY ;Get control flags byte MOVEI T1,0 ;If short message, set flags to zero USTOR T1,LMRCF,(LM) ;Store Console Response Control Flags CALL DNRPOS ;Get length of user data CAIGE T1,0 ;If negative? SETZI T1,0 ; Make it zero ULOAD T2,LMMBL,(LM) ;Get User Max Buffer Length CAMLE T1,T2 ;Will it fit in buffer? MOVE T1,T2 ;No, truncate **** Or RETBAD? ***** USTOR T1,LMRML,(LM) ;Return received length to user ULOAD T2,LMRBP,(LM) ;Pass users command response buffer pointer CALL DNCM2U ;Move data to user JSUERR (ATSX17,) ;Failed, Why?... BUG? MOVE T1,RB ;Get address of RB MOVE T2,SB ;Pass address of SVB CALL LPSRMQ ;Remove it from queue JFCL ;Failed... LOAD T1,RBMSI,(RB) ;Get address of input MSD and receive buffer CALL DNFWDS ;Release the MSD and buffer MOVE T1,RB ;Get address of RB CALL DNFWDS ;Release the RB MOVE T1,SB ;Pass SV block address CALL PSTBUF ;Post a receive buffer NOP ;Ignore failure RETSKP ;Success - RETURN from RCRPOL ;END of Routine RCRPOL SUBTTL Remote Console Protocol Requestor -- RCRAIC - Assign Interrupt Channel ;RCRAIC - Assign Interrupt Channel Remote Console Requestor Function ; ;Call: T1/ LLMOP% Function Code ; LM/ Argument Block Address ; SB/ SV Block address ; CALL RCRAIC ; Error Return ; Normal Return ;Changes T1 SWAPCD RCRAIC: ;Assign Interrupt Channel IFN FTOPS20,< ULOAD T1,LMAIC,(LM) SKIPN T1 ;Assigning channel for unsolicited SID's? IFSKP. ;Yes... NOSKED ;Interlock the SVB OPSTR ,SVCFN,(SB) ;Already assigned? If so, don't allow. IFSKP. ;Not yet assigned, give it to this process ULOAD T1,LMICH,(LM) ;Get the interrupt channel CALL CHKCHL ;Verify it's validity IFSKP. ;If it's OK... STOR T1,SVICH,(SB) ;Store the Configurator Interrupt Channel MOVE T1,FORKX STOR T1,SVCFN,(SB) ;Store Configurator fork index OKSKED ELSE. ;If it's an invalid channel... OKSKED RETBAD ;Return error from CHKCHL ENDIF. ELSE. ;If it's already been assigned... OKSKED RETBAD (LLMX06) ;Give 'already assigned' error return ENDIF. ENDIF. >; END IFN TOPS20 RETSKP ;Success - RETURN from RCRAIC ;END of Routine RCRAIC SUBTTL Remote Console Protocol Requestor -- RCRABT - Abort Request ;RCRABT - Abort Remote Console Request Function ; ;Call: T1/ LLMOP% Function Code ; LM/ Argument Block Address ; SB/ SV Block address ; CALL RCRABT ; Error Return ; Normal Return ;Changes T1,T2 SWAPCD RCRABT: ULOAD T1,LMREQ,(LM) ;Get the Receipt Number of the request MOVE T2,SB ;Pass address of SVB CALL LPSSXQ ;Search queue for RB for this request JSUERR (LLMX04,) ;Request does not exist MOVE RB,T2 ;Make RB Address safe MOVE T1,RB ;Get address of RB MOVE T2,SB ;Pass address of SVB CALL LPSRMQ ;Remove it from queue JFCL ;Failed... ETHLOK ; Absolutely, positively, no interrupts LOAD T1,RBSTT,(RB) ; Get state CAIN T1,.RQCMP ; Did this request complete? IFSKP. ; Nope, abort this function SETONE RBABT,(RB) ; Abort when NISRV returns the buffer ETHULK ; Enable interrupts RETSKP ; Return success ENDIF. ETHULK ; Re-enable interrupts LOAD T1,RBMSI,(RB) ;Get address of input MSD and buffer CAIN T1,0 ;An MSD there? IFSKP. ;Yes... CALL DNFWDS ;Release the buffer ENDIF. MOVE T1,RB ;Get address of RB CALL DNFWDS ;Release the RB RETSKP ;Success - RETURN from RCRABT ;END of Routine RCRABT SUBTTL Remote Console Protocol Requestor -- CRQINI - Request Block Initialization ;CRQINI - Perform Ethernet Protocol Requestor Request Block Initialization ; ;Call: LM/ Argument Block Address ; SB/ SV Block address ; CALL CRQINI ; Error Return ; Normal Return RB/ Request Block Address ;Changes T1,T2,RB SWAPCD ;Request Block Initialization CRQINI: MOVEI T1,RB.LEN ;Obtain and Initialize a Request Block (RB) CALL DNGWDZ ;Get a clean block for RB JSUERR (MONX07,) ;Failed... Return with Error Code MOVE RB,T1 ;Save address of RB ;Initialize the state in RB MOVX T1,.RQINV ;Set request state invalid STOR T1,RBSTT,(RB) IFN FTOPS20,< MOVE T1,JOBNO ;Get Users Job Number STOR T1,RBJOB,(RB) ;Store in RB MOVE T1,FORKX ;Get Users Fork Number STOR T1,RBFRK,(RB) ;Store in RB >; END IFN FTOPS20 IFN FTOPS10,< MOVE T1,.CPJCH## ;Get current JCH STOR T1,RBJCH,(RB) ;Store in RB >; END IFN FTOPS10 ;Initialize MSD chain in RB XMOVEI MS,CH.MSD(RB) ;Get address of Header MSD SETZ T1, ;No Data MSD MOVX T2,RCH.LN ;Length of CH buffer XMOVEI T3,CH.DAT(RB) ;Get address of CH buffer CALL MSDINI ;Initialize MSD ;Store a special ID for transmit complete MOVX T1,'LLM' ;Identifier for LLMOP STOR T1,CHIDD,(RB) ;Store special ID ;Copy info from users argument block to RB ULOAD T2,LMCID,(LM) ;Get channel id STOR T2,RBCID,(RB) ;Store in RB IFN FTOPS20,< ULOAD T1,LMAIC,(LM) ;Interrupt channel assigned? STOR T1,RBAIC,(RB) ;Store interrupt assigned flag ULOAD T1,LMICH,(LM) ;Get the interrupt channel STOR T1,RBICH,(RB) ;Store Interrupt Channel number >; END IFN FTOPS20 ;Set up destination in RB ULOAD T2,LMDST,(LM) ;Get 1st word of destination address STOR T2,RBDST,(RB) ;Store in RB ULOAD T2,LMDST,+1(LM) ;Get 2nd word of destination address STOR T2,RBDST,+1(RB) ;Store in RB RETSKP ;Success - RETURN from CRQINI ;END of Routine CRQINI SUBTTL Remote Console Protocol Requestor -- MSDINI - MSD Request Block Initialization ;MSDINI - MSD Request Block Initialization ; ;Call: T1/ Address of Data MSD ; T2/ Length of Header MSD Data Buffer ; T3/ Address of Header MSD Data Buffer ; MS/ Address of (1st) Header MSD ; RB/ Request Block Address ; CALL MSDINI ; Normal Return Always ;Changes T1 MSDINI: SWAPCD ;Request Block MSD Initialization STOR MS,RBMSO,(RB) ;Initialize MSD chain in RB STOR T1,MDNXT,(MS) ;Link Data MSD to Header MSD SETZRO MDNXT,(T1) ;Clear link field of Data MSD ;Initialize Header MSD STOR T2,MDALL,(MS) ;Set allocated Header MSD Data Buffer size STOR T3,MDALA,(MS) ;Set address of Header MSD Data Buffer MOVX T1,VMC.XC ;Mark this as an EXEC context buffer STOR T1,MDVMC,(MS) ;Store it in MSD MOVE T1,MS ;Get address of Header MSD CALL DNPINI ;Initialize for output RET SUBTTL Remote Console Protocol Requestor -- SETRNO - Set Request Receipt Number ;SETRNO - Set Request Receipt Number in RB and User's argument block ; ;Call: LM/ Argument Block Address ; SB/ SV Block address ; RB/ Request Block Address ; CALL SETRNO ; Normal Return Always ;Changes T2 SWAPCD ;Request Block Initialization SETRNO: LOAD T2,SVNXR,(SB) ;Get next receipt number STOR T2,RBRNO,(RB) ;Store in RB ;Store receipt number in user argument block USTOR T2,LMREQ,(LM) ;Give to user as Request Number ;Calculate the Next Receipt Number ADDI T2,1 ;Increment receipt number TXNE T2,<1B<35-16>> ;Overflow 16 bits? MOVEI T2,1 ;Yes..., Start over again at 1 STOR T2,SVNXR,(SB) ;Store updated receipt number RET ;Success - RETURN from SETRNO ;END of Routine SETRNO SUBTTL Remote Console Protocol Requestor -- SCCINI - ASCII Console Cxr Initialization ;SCCINI - Perform Initialization for Send Console Command ; ;Call: LM/ Argument Block Address ; SB/ SV Block address ; RB/ Request Block Address ; CALL SCCINI ; Error Return ; Normal Return ;Changes T1,T2 SWAPCD ;ASCII Console Carrier RB Initialization SCCINI: XMOVEI MS,CD.MSD(RB) ;Point to Command Data MSD STOR MS,MDNXT,+CH.MSD(RB) ;Link CD from CH SETZRO MDNXT,(MS) ;Clear link field to make CD the last MSD ULOAD T1,LMMBL,(LM) ;Get length of Command data STOR T1,MDBYT,(MS) ;Store bytes written in Command data MSD ;***** ; ; Convert users data pointer to user virtual address. ; MAP User Virtual Address to Physical page number and LOCK ; the page down in resident memory. Store the Physical address ; in the MSD for use by the driver. The Transmit Callback ; routine will UNLOCK the page when Transmit is complete. ; ;***** ULOAD T1,LMRBP,(LM) ;Get Users Command data pointer STOR T1,MDPTR,(MS) ;Store User virtual pointer in MSD CALL CNVPTR ;Convert User pointer to address RET ;Illegal Ptr, Return with error STOR T1,MDAUX,(MS) ;Store indexed pointer STOR T2,MDALA,(MS) ;Store users virtual address IFN FTOPS20,< MOVE T1,T2 ;Make copy of virtual address TXO T1,<1B0> ;Set bit 0 to indicate user virtual CALL MLKMA ;Lock the page, returning core page number LSH T1,WID(777) ;Convert page to physical address LOAD T2,MDALA,(MS) ;Get users virtual address TXZ T2,<777777,,777000> ;Get just the offset IOR T1,T2 ;Set offset into physical page STOR T1,MDALA,(MS) ;Store physical address MOVX T1,VMC.NO ;Get code for Physical Address STOR T1,MDVMC,(MS) ;Store it in MSD >; END IFN FTOPS20 IFN FTOPS10,< MOVE T1,MS ;Get address of MSD CALL MAKMBF ;Create a monitor buffer RET ;Error >; END IFN FTOPS10 ; ;Hack a request number here as a special case for CONSOLE RESPONSE POLL. ;We use the low order portion of the destination Ethernet address. We ;can do this safely, since, there can be only one host node reserving ;the console on the remote node. Note, that this code overides what ;has already been done in CRQINI. ; LOAD T1,RBDST,+1(RB) ;Use low order bits of destination address LSH T1,-<^D36-^D16> STOR T1,RBRNO,(RB) ;Store in RB USTOR T1,LMREQ,(LM) RETSKP ;Success - RETURN from SCCINI ;END of Routine SCCINI SUBTTL Loop Protocol Requestor -- XMTREQ - Transmit MOP Request Message ;XMTREQ - Transmit LLMOP Request Message ; ;Call: RB/ Request Block address ; SB/ SV Block address ; CALL XMTREQ ; Error Return ; Normal Return ;Changes T1,T2 ; SWAPCD XMTREQ: MOVE T1,RB ;Pass address of RB MOVE T2,SB ;Pass address of SVB CALL LLMQUE ;Queue RB on protocol server request queue MOVE T1,SB ;Pass SV Block address CALL PSTBUF ;Try to have a receive buffer ready NOP ;Ignore failure CALL XMTRCM ;Transmit this MSD IFNSK. ;Failed... MOVE T1,RB ;Get address of RB MOVE T2,SB ;Pass address of SVB CALL LPSRMQ ;Remove RB from Queue JFCL ;Failed... RETBAD ;Error - Pass error up ENDIF. RETSKP ;Success - RETURN from XMTREQ ;END of Routine XMTREQ SUBTTL Loop Protocol Requestor -- XMTRCM - Transmit MOP Remote Console Message ;XMTRCM - Transmit LLMOP Remote Console Message ; ; Send a Remote Console message when no response is expected. ; ;Call: RB/ Request Block address ; SB/ SV Block address ; CALL XMTRCM ; Error Return ; Normal Return ;Changes T1,T2 ; SWAPCD XMTRCM: MOVX T1,UN.LEN ;Pass length of UN block CALL DNGWDZ ;Allocate a UN block JSUERR (MONX07,) ;Failed..., Say system resources exhausted XMOVEI UN,SV.IXB(SB) ;Get address of protocol server UN block LOAD T3,UNPID,(UN) ;Get Server's Portal-id MOVE UN,T1 ;Get address of our UN Block STOR T3,UNPID,(UN) ;Set our Portal-id LOAD MS,RBMSO,(RB) ;Get head of output MSD chain LOAD T1,RBDST,(RB) ;Get Destination Address LOAD T2,RBDST,+1(RB) SETONE RBFTI,(RB) ;Set Transmit Initiated flag CALL XMTMSD ;Transmit this MSD IFNSK. ;Failed... MOVE T1,RB ;Get address of RB CALL DNFWDS ;Release RB MOVE T1,UN ;Get address of UN CALL DNFWDS ;Release UN RETBAD ;Error - Pass error up ENDIF. MOVE T1,UN ;Get address of UN block CALL DNFWDS ;Release UN RETSKP ;Success - RETURN from XMTRCM ;END of Routine XMTRCM SUBTTL LLMOP Local Utility -- XMTMSD - Transmit MOP Message using MSD ;XMTMSD - Transmit LLMOP Message pointed to by MSD ; ;Call: MS/ MSD Address ; UN/ UN Block Address ; SB/ SV Block address ; T1,T2/ Ethernet Destination Address ; CALL XMTMSD ; Error Return ; Normal Return ;Changes T1,T2 ; RESCD XMTMSD: STOR MS,UNBFA,(UN) ;Store MSD as buffer address SETZRO UNBSZ,(UN) ;Must be zero for MSD buffer STOR MS,UNRID,(UN) ;Store our Request ID IFN FTOPS20,< SETZRO UNPTR,(UN) ;Indicate UNDAD contains immediate address >; END IFN FTOPS20 STOR T1,UNDAD,(UN) ;Set Destination Address in UN Block STOR T2,UNDAD,+1(UN) INCRF SVTTI,(SB) ;Bump count of transmits initiated MOVEI T1,NU.XMT ;DLL Transmit Function code MOVE T2,UN ;Pass address of UN Block CALL DLLUNI ;Call DLL User to NI Interface Block IFNSK. ;Failed... INCRF SVTTF,(SB) ;Bump count of transmit failures LOAD T2,UNSTA,(UN) ;Get Channel Status LOAD T3,UNCHN,(UN) ;Get channel number XCT LPRLXF ;Do the BUG. JSUERR (LLMX01,) ;Error - Transmit Failed ENDIF. RETSKP ;Success - RETURN from XMTMSD ;END of Routine XMTMSD SUBTTL LLMOP Global Utility -- LLMRSF/LLMRSJ - ReSet for Fork/Job IFN FTOPS20,< ;LLMRSQ - Reset RB Queue for LLMOP Protocol Servers ; ; This routine is called, at entry point LLMRSF, from .KFORK (.KSELF?) in ; FORK to release any RB's that might have been created by the ; fork which is being killed. The fork can be killed as a result ; of a superior fork doing either a RESET% or a KFORK% JSYS. ; ; This routine is called, at entry point LLMRSF, from .RESET in ; JSYSA to release any RB's that might have been created by the ; fork doing the RESET% JSYS. ; ; This routine is called, at entry point LLMRSJ, from FLOGO in ; MEXEC to clean up whenever the top fork in a job is killed. ; The top fork in a job is killed as a result of itself or some ; other fork doing a LGOUT% JSYS. This entry point may be ; unnecessary. ; ;Call: ; CALL LLMRSJ to kill LLMOP resources for entire job ; CALL LLMRSF to kill LLMOP resources for current fork ; Normal Return always ;Changes T1,T2 RESCD ;Entry for call to reset for whole job LLMRSQ:: LLMRSJ::MOVE T1,[LOAD T4,RBJOB,(T2)] ;Instruction to check job ownership MOVE T2,JOBNO ;Get this Job's number JRST LLMRS2 ;Entry for call to reset for current fork LLMRSF::MOVE T1,[LOAD T4,RBFRK,(T2)] ;Instruction to check fork ownership MOVE T2,FORKX ;Get this fork's fork index LLMRS2: SAVEAC ;Make SB safe TRVAR ;Place to store Job/Fork id and test instr MOVEM T1,TSTOWN ;Store instruction for owner compare MOVEM T2,XID ;Store Job/Fork ID XMOVEI SB,LPSSVB ;Get address of SVB for Loop Server CALL LLMRST ;Go do the work XMOVEI SB,RCSSVB ;Get address of SVB for Remote Console Server LOAD T1,SVCFN,(SB) ;Get fork number of configurator CAMN T1,FORKX ;This one?... SETZRO SVCFN,(SB) ;Yes, clear it CALL LLMRST ;Go do the work RET ;RETURN from LLMRSQ ;END of Routine LLMRSQ SUBTTL LLMOP Local Utility -- LLMRST - Reset Request Queue ;LLMRST - Reset Request Queue ; ;Call: SB/ Address of SVB ; XID/ Job/Fork Id (in TRansient VARiable) ; TSTOWN/ Instruction to test XID against RB (in TRansient VARiable) ; CALL LLMRST ; Normal Return Always ;Changes T1,T2 ; LLMRST: SAVEAC ;Make RB safe OPSTR ,SVRQH,(SB) ;Get address of RB queue head LLMRS1: ;Top of Loop CALL LLMGNQ ;Point to next RB in queue IFSKP. ;Got next RB MOVE RB,T2 ;Save RB XCT TSTOWN ;Get owners ID (Fork or Job) in T4 CAME T4,XID ;Belong to this owner? IFSKP. ;Yes... ETHLOK ;Interlock the queue structure MOVE T3,SB ;Get address of SVB ;T1 has previous RB address ;T2 has address of RB to unqueue CALL LLMUNQ ;Unqueue this RB NOP ;Failed, Probably BUG!? LOAD T3,RBSTT,(RB) ; Get state CAIN T3,.RQCMP ; Did this request complete? IFSKP. ; Nope, abort this function SETONE RBABT,(RB) ; Abort when NISRV returns the buffer ETHULK ; Enable interrupts JRST LLMRS1 ; Loop till done ENDIF. ETHULK ; Re-enable interrupts LOAD MS,RBMSI,(RB) ;Get Loop Reply MSD address SKIPN MS ;Buffer allocated? IFSKP. ;Yes, release it EXCH T1,MS ;Get address and save T1 CALL DNFWDS ;Release buffer EXCH MS,T1 ;Get T1 back ENDIF. EXCH T1,RB ;Pass address of RB, save previous CALL DNFWDS ;Release the RB MOVE T1,RB ;Restore previous JRST LLMRS1 ;Go check for next RB in queue until done ENDIF. ENDIF. RET ;End of queue - RETURN from LLMRST ;END of Routine LLMRST >; END IFN FTOPS20 SUBTTL LLMOP Local Utility -- PSVINI - Protocol Server Initialization ;PSVINI - Initialize an Ethernet Protocol Server ; ; This routine initializes a protocol server on a single ; channel. The SV block contains the channel number, protocol ; type, multicast address, and callback vector. ; ;Call: T1/ SV Block Address ; CALL PSVINI ; Error Return if not initialized ; Normal Return ;Changes T1 RESCD PSVINI: SAVEAC ;Allocate named AC variables for block pointers STKVAR MOVE SB,T1 ;Save Address of SV Block SETZRO SVIFG,(SB) ;Clear initialize flag and ... SETZRO SVRCT,(SB) ; Total Received Count SETZRO SVSRC,(SB) ; Server Received Count SETZRO SVRRC,(SB) ; Requestor Received Count SETZRO SVTTI,(SB) ; Total Transmits Initiated SETZRO SVTCT,(SB) ; Total Transmit Count (Completed) SETZRO SVSTC,(SB) ; Server Transmit Count SETZRO SVRTC,(SB) ; Requestor Transmit Count SETZRO SVBPC,(SB) ; Buffer Posted Count MOVX T1,1 ;Indicate we've tried to initialize STOR T1,SVIFG,(SB) XMOVEI UN,SV.IXB(SB) ;Get address of static UN Block LOAD T1,UNCBA,(UN) ;Get callback address XMOVEI T1,(T1) ;Make it extended address STOR T1,UNCBA,(UN) ;Set extended callback address ;Initialize the Protocol Server Next Receipt Number CALL NRANDM ;Get Non-Repeating Random Number STOR T1,SVNXR,(SB) ;Store as next receipt number to use ;Open an NI DLL Portal for this Protocol Type MOVEI T1,NU.OPN ;DLL Open Function code MOVE T2,UN ;Pass address of UN Block CALL DLLUNI ;Call DLL User to NI Interface IFNSK. ;Failed SETONE SVDLS,(SB) ;Set an invalid Data Link state RET ;Return on this failure ENDIF. IFN FTOPS20,< SETZRO UNRSP,(UN) ;Set no completion callback desired SETZRO UNPTR,(UN) ;Indicate UNDAD is immediate address >; END IFN FTOPS20 LOAD T1,SVMCA,(SB) ;Get Multicast Address Bytes 0-3 STOR T1,UNDAD,(UN) ;Set in UN Block LOAD T1,SVMCA,+1(SB) ;Get Multicast Address Bytes 4,5 STOR T1,UNDAD,+1(UN) ;Set in UN Block MOVEI T1,NU.EMA ;DLL Declare Multicast Address Function code MOVE T2,UN ;Pass address of UN Block CALL DLLUNI ;Call DLL User to NI Interface IFNSK. SETONE SVDLS,(SB) ;Set an invalid Data Link state XCT LLMMCF ;Do the BUG. RET ;Return on this failure ENDIF. ;Post Initial Protocol Server Receive Buffers MOVE T1,SB ;Pass SVB address CALL PSTBUF ;Post buffers NOP ;Ignore failure SETONE SVIFG,(SB) ;Set Initialize flag RETSKP ;Success - RETURN from PSVINI ;END of Routine PSVINI SUBTTL LLMOP Local Utility -- PSTBUF - Post Receive Buffer for Protocol Server ;PSTBUF - Routine to allocate and post receive buffer to Data Link ; ;Call: T1/ SV Block address ; CALL PSTBUF ; Error Return - Failed BUGCHKS's ; Normal Return ;Changes T1,T2 ;Updates SVBPC in SV Block RESCD PSTBUF: SAVEAC ;Allocate named AC variables for block pointers SAVEAC ;Save MS so we can use it here MOVE SB,T1 ;Set up SB TMNE SVDLS,(SB) ;Data Link State ON for this channel? RETSKP ;No, just return XMOVEI UN,+SV.IXB(SB) ;Set up UN PSTBF1: LOAD T1,SVBPC,(SB) ;Get count of receive buffers posted OPSTR ,SVIBN,(SB) ;Need to post receive buffers? RETSKP ;NO, just return MOVEI T1, ;Storage for MSD, UN and receive buffer CALL DNGWDS ;Allocate a buffer IFSKP. ;Got a buffer, post it for receive MOVE MS,T1 ;MSD is prepended to buffer STOR MS,UNRID,(UN) ;Save MSD address for receive completion XMOVEI T2,MD.LEN+UN.LEN(MS) ;Get address of receive data buffer STOR T2,UNBFA,+1(UN) ;Store as two word global address MOVX T3,BUFLEN ;Get length of buffer in bytes STOR T3,UNBSZ,(UN) ;Set in UN Block CALL DNGMSI ;Initialize MSD for raw buffer LOAD T1,MDPTR,(MS) ;Get standard pointer... Make it TXO T1,1B12 ; 2 word global, non-zero section TLZ T1,37 ; Clear indexing and indirection STOR T1,UNBFA,(UN) ;Store pointer in UN Block MOVX T1,UNA.EV ;Buffer is Exec Virtual STOR T1,UNADS,(UN) ;Indicate to driver MOVEI T1,NU.RCV ;DLL Receive Function code XMOVEI T2,SV.IXB(SB) ;Pass address of UN Block CALL DLLUNI ;Call DLL User to NI Interface Block IFNSK. ;Failed to accept buffer, BUGCHK OPSTRM ,SVLBC,(SB) ;Bump count of lost buffers LOAD T1,UNRID,(UN) ;Get Buffer address in UN Block CALLRET DNFWDS ;Release the buffer fail return ELSE. INCRF SVBPC,(SB) ;Bump count of buffers posted to the DLL ENDIF. ELSE. ;Failed to allocate buffer OPSTRM ,SVLBC,(SB) ;Bump count of lost buffers RET ;Fail return ENDIF. JRST PSTBF1 ;Loop back to post buffers ;END of Routine PSTBUF SUBTTL LLMOP Local Utility -- NRANDM - Non-Repeating Random Number ;NRANDM - Initialize Ethernet Loopback Protocol Server ; ;Call: ; CALL NRANDM ; Normal Return T1/ 16 bit Value ;Changes T1 RESCD NRANDM: ;Here we initialize the next receipt number to a pseudo-random number. ;This reduces the risk of a reloaded system continuing a maintenance ;operation from before the crash. We use the high-order 16 bits of ;the time to avoid any similarities in the number due to a similar ;number of seconds since startup. System time will always start on an ;even second. IFN FTOPS20,< CALL LGTAD ;Get time & date >; END IFN FTOPS20 IFN FTOPS10,< MOVE T1,DATE## ;Get date >; END IFN FTOPS10 ANDI T1,177777 ;Pare it down to 16 bits RET ;Success - RETURN from NRANDM ;END of Routine NRANDM SUBTTL LLMOP Local Utility -- LLMQUE - LLMOP Protocol Server Queue Routine ;LLMQUE - Queue RB for an LLMOP Protocol Server ; ;Call: T1/ RB address ; T2/ SVB address ; CALL LLMQUE ; Normal Return ;Changes T3 RESCD LLMQUE: ETHLOK ;Interlock the queue structure LOAD T3,SVRQT,(T2) ;Get address of RB queue tail STOR T1,RBFWD,(T3) ;Make old tail point to new tail STOR T1,SVRQT,(T2) ;Make this RB new tail SETZRO RBFWD,(T1) ;Ensure this is end of queue ETHULK ;Allow access to queue again RET ;Success - RETURN from LLMQUE ;END of Routine LLMQUE SUBTTL LLMOP Local Utility -- LLMGNQ - LLMOP Protocol Server Get Next RB in Queue ;LLMGNQ - Get address of next RB in Protocol Server Request Queue ; ;Call: T1/ Address of current RB ; CALL LLMGNQ ; Abnormal return, at end of queue T2/ 0 ; Normal Return T2/ Address of next RB in queue ;Changes T2 RESCD LLMGNQ: ETHLOK ;Interlock the queue structure LOAD T2,RBFWD,(T1) ;Get address of next RB in queue ETHULK ;Allow access to queue again SKIPN T2 ;Is this last RB in queue? RET ;Yes, Abnormal return RETSKP ;Success - RETURN from LLMGNQ ;END of Routine LLMGNQ SUBTTL LLMOP Local Utility -- LLMUNQ - LLMOP Protocol Server Unqueue RB from Queue ;LLMUNQ - Unqueue an RB in Protocol Server Request Queue ; ;Call: T1/ Address of RB preceding one to be unqueued ; T2/ Address of RB to be unqueued ; T3/ SVB Address for this queue ; CALL LLMUNQ ; Error return ; Normal Return ;Changes T4 RESCD LLMUNQ: SAVEAC ;Allocate named AC variables for block pointers ETHLOK ;Interlock the queue structure MOVE SB,T3 ;Point to SVB OPSTR ,RBFWD,(T1) ;This the one to remove? IFSKP. ;No..., Take error return ETHULK RET ENDIF. LOAD T4,RBFWD,(T2) ;Yes..., Get address of RB following SKIPE T4 ;At end of queue? IFSKP. ;Yes..., One being removed was last STOR T1,SVRQT,(SB) ;Make previous new tail ENDIF. STOR T4,RBFWD,(T1) ;Link from previous SETZRO RBFWD,(T2) ;Clear link field of unqueued RB ETHULK ;Allow access to queue again RETSKP ;Success - RETURN from LLMUNQ ;END of Routine LLMUNQ SUBTTL LLMOP Local Utility -- LPSRMQ - Loopback Protocol Server Remove RB from Queue ;LPSRMQ - Remove RB from Queue for Loopback Protocol Server ; ;Call: ; T1/ RB address ; T2/ SVB address ; CALL LPSRMQ ; Error return, Queue Empty or RB not in queue ; Normal Return T1/ RB Address ;Changes T1,T2 ;Note: BUGCHK's if queue empty or RB not in queue RESCD LPSRMQ: SAVEAC ;Allocate named AC variables for block pointers ETHLOK ;Interlock the queue structure MOVE SB,T2 ;Save SVB address XMOVEI T2,SV.RQH(SB) ;Get address of queue head LPSRM1: SKIPE T3,(T2) ;Get address of next RB in queue IFSKP. ETHULK ;Allow access to queue again XCT LLMRQC ;Do the BUG. RET ;Take error return ENDIF. CAME T1,T3 ;This the one to remove? IFSKP. ;Yes... LOAD T3,RBFWD,(T3) ;Get address of next SKIPE T3 ;Is there another? IFSKP. ;No..., One being removed was last STOR T2,SVRQT,(SB) ;Make previous new tail ENDIF. STOR T3,RBFWD,(T2) ;Link from previous SETZRO RBFWD,(T1) ;Clear link field ETHULK ;Allow access to queue again RETSKP ;Success - RETURN from LPSRMQ ENDIF. ;No... MOVE T2,T3 ;Look at next RB JRST LPSRM1 ;END of Routine LPSRMQ SUBTTL LLMOP Local Utility -- LPSSXQ - Loopback Protocol Server Search Queue ;LPSSXQ - Search RB Queue for Loopback Protocol Server ; ;Call: ; T1/ Receipt Number ; T2/ SVB address ; CALL LPSSXQ ; Error return Queue Empty or not found ; Normal Return T2/ RB Address ;Changes T1,T2 RESCD LPSSXQ: SAVEAC ;Allocate named AC variables for block pointers ETHLOK ;Interlock the queue structure MOVE SB,T2 ;Save SVB address XMOVEI T2,SV.RQH(SB) ;Get address of queue head SKIPE (T2) ;Queue Empty? IFSKP. ;Yes..., Error return ETHULK RET ENDIF. LPSSX1: ;Top of Loop LOAD T2,RBFWD,(T2) ;Get address of next RB in queue CAME T1,RB.RNO(T2) ;Receipt Number match? IFSKP. ETHULK ;Allow access to queue again RETSKP ;Yes..., return RB address ENDIF. CAME T2,SV.RQT(SB) ;Is this last RB in queue? JRST LPSSX1 ;No..., Keep looking ETHULK ;Allow access to queue again SKIPE T2 ;Yes, verify by having null pointer RET ;Whoops, BUG!. Tail doesn't have null pointer RET ;End of queue - RETURN from LPSSXQ ;END of Routine LPSSXQ SUBTTL LLMOP Local Utility -- CNVPTR - Convert User to MSD style pointer ;CNVPTR - Convert pointer in user context to one word local pointer ; indexed by T6 ; ;Call: ; T1/ users byte pointer ; CALL CNVPTR ; Error return (illegal pointer) ; Normal Return T1/ Pointer indexed by T6 ; T2/ Virtual Address ;Changes T1,T2,T3 SWAPCD CNVPTR: LDB T3,[POINT 6,T1,5] ;Get P field CAIG T3,44 ;P less than 36? IFSKP. ;Yes..., One word global byte pointer JSUERR (LLMX03,) ;Illegal! For now, but could convert to local ELSE. ;No..., Two word global or Local pointer TLNN T1,40 ;Bit 12 = 1? IFSKP. ;Yes..., 2 word global byte pointer JSUERR (LLMX03,) ;Illegal! ELSE. ;No..., One word local byte pointer MOVE T2,T1 ;Make a copy of pointer TLZ T1,000037 ;Clear I & X fields TRZ T1,777777 ;Clear Y field LDB T3,[POINT 6,T1,11] ;Get size field CAIE T3,^D8 ;Eight bit? RET ;No, error LDB T3,[POINT 6,T1,5] ;Get position field CAIE T3,04 ;Pointer to next word? IFSKP. HRLI T1,441000 ;Yes, update pointer AOJ T2, ;... ENDIF. MOVEI T3,T6 ;Get value of T6 DPB T3,[POINT 4,T1,17] ;Make pointer indexed by T6 in T1 TLZ T2,777740 ;Clear P & S fields and Bit 12 TXO T2, ;Build XMOVEI with users I, X & Y XCTU T2 ;Obtain address in T2 ENDIF. ENDIF. RETSKP ;RETURN from CNVPTR ;END of Routine CNVPTR SUBTTL LLMOP Local Utility -- CHKCHL - Check and Verify Interrupt Channel Number ;CHKCHL - Verify Interrupt Channel Number to be in range ; ;Call: ; T1/ Channel Number ; CALL CHKCHL ; Error return, Channel Invalid ; Normal Return, Channel Valid ; ;Changes T1 ; SWAPCD CHKCHL: CAIG T1,^D36 ;Within Range? (0 to 36) CAIGE T1,0 JRST CHKILL ;No CAILE T1,^D5 ;Within Range 0-5? CAIL T1,^D23 ;Or Within Range 23-35 AOSA T1 ;Yes. A Good Channel JRST CHKILL ;No. Illegal RETSKP ;Return Good Value CHKILL: JSUERR (ARGX13,) ;Invalid Channel ;END of Routine CHKCHL SUBTTL TOPS-10 Specifics IFN FTOPS10,< ;Routine called to create a monitor buffer for transmit datagrams ;Call: ; T1/ MSD address ; MDBYT: User byte count ; MDAUX: User byte pointer (P&S portion) ; MDALA: User buffer address ;Returns: ; CPOPJ on error ; CPOPJ1 on success MAKMBF: SAVEAC ;Save P1, P2 and J MOVE P1,T1 ;Save MSD address LOAD T1,MDBYT,(P1) ;Get user byte count JUMPE T1,[SETZRO MDALA,(P1) ;If no allocation, clear address RETSKP] ;And return LDB P2,[POINT 3,MD.AUX(P1),2] ;Pick up word alignment MOVNS P2 ;Negate ADDI P2,7(T1) ;Calculate word count ASH P2,-2 ;... MOVE T1,P2 ;Get size of monitor buffer MOVE J,.CPJOB## ;Get our job number CALL DNGWDZ ;Get core for monitor buffer RET ;Error, return LOAD T2,MDALA,(P1) ;Get user address of buffer MOVE T3,T1 ;Get monitor buffer address STOR T1,MDALA,(P1) ;Save address of buffer MOVE T1,P2 ;Get size of buffer XBLTUX ;Copy user buffer into monitor buffer RETSKP ;And return ;Routine called to free up monitor buffer ;Call: ; T1/ MSD address ; CALL FREMBF ;Returns: ; CPOPJ Always FREMBF: SAVEAC ;Save P1 MOVE P1,T1 ;Save MSD address SKIPE T1,MD.ALA(P1) ;Get address of monitor buffer CALL DNFWDS ;Release buffer and return RET >; END IFN FTOPS10 IFN FTOPS10,< ;Routine to wait in event wait for a request block to complete ;Call: ; RB/ Address of request block ; CALL RBWAIT ;Returns: ; CPOPJ when request completes RBWAIT: SAVEAC ;Save J SETONE RBEVW,(RB) ;Mark event wait RBWAI1: LOAD T1,RBSTT,(RB) ;Get request state CAXN T1,.RQCMP ;Completed? RET ;Yes, return MOVEI T1,EV.LLM ;Get LLMOP event wait code LOAD J,RBJCH,(RB) ;Get JCH ANDI J,JOBMSK## ;Mask to job number CALL FSLEEP## ;Wait for completion JRST RBWAI1 ;Loop back till request completes ;Routine to wake up waiting job ;Call: ; RB/ Address of request block ; CALL RBWAKE ;Returns: ; CPOPJ Always RBWAKE: SAVEAC ;Save J OPSTR ,RBEVW,(RB) ;Job in event wait for this request? IFNSK. LOAD J,RBJCH,(RB) ;No, get JCH of job SIGNAL C$LLM ;Signal LLMOP event JFCL ; ... RET ;And return ENDIF. LOAD T1,RBJCH,(RB) ;Get JCH of job CALL CTXEWK## ;Wake it up JFCL ;... RET ;Return >; END IFN FTOPS10 SUBTTL Core manager -- Get Some Words IFN FTOPS10,< ;DNGWDS - Get some words, not zeroed ; ; Call: ; T1/ Count of words we want ; ; Return: ; RET ;ON ALLOCATION FAILURE ; RETSKP ;WITH T1 POINTING TO WORDS ; ; ;Note: The count of words allocated is stored in the word before the ;returned pointer. DNGWDS: SAVEAC ;SAVE P1 HRRZ P1,T1 ;SAVE THE COUNT MOVEI T2,1(T1) ;T2 GETS NUMBER OF WORDS. MCALL (RG,MSEC1,GETEWS##) ; Go allocate memory RET ; Tell caller we failed to get memory MOVEM P1,(T1) ;STORE COUNT IN RH OF OVERHEAD WORD MOVSI T2,'LLM' ;MAKE A TEST THINGY HLLM T2,(T1) ;STORE IN LEFT HALF OF FIRST WORD AOJ T1, ;RETURN POINTER TO USER PART OF BLOCK RETSKP ;RETURN SUCCESS SUBTTL Core manager -- Get Some Zeroed Words ;DNGWDZ - Just like DNGWDS but the words are smeared to zero. ; Note that this is quite a lot more expensive than DNGWDS. ; ; Call: ; T1/ Count of words we want ; ; Return: ; RET ;ON ALLOCATION FAILURE ; RETSKP ;WITH T1 POINTING TO WORDS ; ; Uses: T1-T4 ; ;Note: The count of words allocated is stored in the word before the ;returned pointer. DNGWDZ: SAVEAC ;SAVE P1 HRRZ P1,T1 ;SAVE THE COUNT MOVEI T2,1(T1) ;T2 GETS NUMBER OF WORDS. MCALL (RG,MSEC1,GETEWZ##) ; Go allocate memory RET ; Tell caller we failed to get memory MOVEM P1,(T1) ;STORE COUNT IN RH OF OVERHEAD WORD MOVSI T2,'LLM' ;MAKE A TEST THINGY HLLM T2,(T1) ;STORE IN LEFT HALF OF FIRST WORD AOJ T1, ;RETURN POINTER TO USER PART OF BLOCK RETSKP ;RETURN SUCCESS SUBTTL Core manager -- Free Some Words ;DNFWDS - Free what DNGWDS took away ; ; Call: ; T1/ Pointer to words allocated by DNGWDS ; ; Return: ; RET ;ALWAYS ; ; Uses: T1,T2 DNFWDS: SOJ T1, ;POINT T1 TO HEADER WORD HRRZ T2,(T1) ;GET COUNT OF WORDS BEING RETURNED AOJ T2, ;ADD IN CHECK WORD EXCH T1,T2 ;CORE1 WANTS T1/COUNT, T2/ADDRESS MCALL (RG,MSEC1,GIVEWS##) ;LET GO OF OUR CORE. RET SUBTTL MSDs -- Initialize MS for input ;DNGMSI - Initialize an MSD for a raw (empty) buffer ; ; Call: ; T1/ MSD address ; T2/ Buffer Address ; T3/ Buffer Length in bytes ; ; Return: ; RET ;ALWAYS ; ; Uses: T1,MS ; DNGMSI: MOVE MS,T1 ;MAKE MS POINT TO MSD SETZRO MDNXT,(MS) ;INPUT MSD's CAN'T BE CHAINED MOVX T1,VGNPTR ;BUILD A VIRGIN BYTE POINTER STOR T1,MDAUX,(MS) ;STORE THE BYTE POINTER FOR LATER PEOPLE STOR T1,MDPTR,(MS) ; AND STORE THE DYNAMIC BYTE POINTER STOR T2,MDALA,(MS) ;STORE BUFFER ADDRESS SETZRO MDBYT,(MS) ;NOTHING RECEIVED YET STOR T3,MDALL,(MS) ;SET BUFFER LENGTH RET ; AND RETURN SUBTTL MSDs -- Set up MSD for input on received buffer ;DNGMSS - Set up an initialized MSD to point to received data ; ; Call: ; T1/ MSD address ; T2-T3/ 2 word global pointer to data in receive buffer ; T4/ Receive data length in bytes ; ; Return: ; RET ;ALWAYS ; ; Uses: T1,MS ; DNGMSS: MOVE MS,T1 ;MAKE MS POINT TO MSD STOR T4,MDBYT,(MS) ;SET RECEIVED BYTE COUNT LOAD T1,MDALA,(MS) ;GET RAW BUFFER ADDRESS SUB T3,T1 ;GET WORD OFFSET TO RECEIVE DATA IN BUFFER ADDI T2,(T3) ;ADD OFFSET IN E-field OF POINTER TXZ T2,1B12 ;CLEAR 2 word global bit TLO T2,T6 ;SET STANDARD INDEX FOR VGNPTR STOR T2,MDPTR,(MS) ;STORE POINTER RET ; AND RETURN SUBTTL MSDs -- Initialize MSD for output ;DNPINI - Initialize MSD ptr and count for output (DNPxxx routines) ; ; Call: ; T1/ Pointer to MSD to initialize ;It is assumed that the byte pointer wanted starts at the allocated ;address of the MSD (MDALA). ; ; Return: ; RET ;ALWAYS, LEAVING T1 ALONE ; ; Uses: T1,T2,MS ; ;The DNPxxx routines will use the byte pointers and byte count in the ;MSD. There are two byte pointers, one which is updated all the time ;and one which is left alone for future people to use. DNPINI: MOVE MS,T1 ;MAKE MS POINT TO MSD MOVX T2,VGNPTR ;BUILD A VIRGIN BYTE POINTER STOR T2,MDAUX,(MS) ;STORE THE BYTE POINTER FOR LATER PEOPLE STOR T2,MDPTR,(MS) ; AND STORE THE DYNAMIC BYTE POINTER SETZRO MDBYT,(MS) ;JUST IN CASE RET ;ONLY RETURN SUBTTL MSDs -- Byte routines -- Get a byte ;DNG1BY - Get one byte from message ; ; Call: ; MS/ Pointer to current MSD in use ; ; Return: ; RET ;RAN OUT OF BYTES ; RETSKP ;SUCCESS: T1 CONTAINING BYTE ; ; Uses: T1,MS DNG1BY: LOAD T6,MDALA,(MS) ;;SET UP INDEX FOR MDPTR OPSTRM ,MDBYT,(MS) ;;UPDATE THE COUNT JUMPL T1,RTN ;;RETURN IF WE RAN OUT OPSTRM ,MDPTR,(MS) ;;GET THE NEXT BYTE RETSKP ;TO SENDER SUBTTL MSDs -- Byte routines -- Get two bytes ;DNG2BY - Get two bytes from message ; ; Call: ; MS/ Pointer to current input MSD ; ; Return: ; RET ;WHEN WE'RE OUT OF BYTES ; RETSKP ;SUCCESS: WITH T1 CONTAINING THE 16 BIT BYTE ; ; Uses: T1,T2,MS DNG2BY: LOAD T6,MDALA,(MS) ;SET UP INDEX FOR MDPTR MOVX T1,-2 ;WE NEED TWO BYTES OPSTRM ,MDBYT,(MS) ;UPDATE STRING COUNT JUMPL T1,RTN ;IF THERE ISN'T ENOUGH ROOM, LEAVE OPSTRM ,MDPTR,(MS) ;GET THE LOW BYTE OPSTRM ,MDPTR,(MS) ;GET THE NEXT BYTE LSH T2,^D8 ;PLACE IT IN THE HIGH POSITION IOR T1,T2 ;MAKE UP 16-BIT VALUE RETSKP ; AND RETURN TO SENDER SUBTTL MSDs -- Byte routines -- Get six byte Ethernet Address ;DNGENA - Get six byte Ethernet address from message ; ; Call: ; MS/ Pointer to current input MSD ; ; Return: ; RET ;WHEN WE'RE OUT OF BYTES ; RETSKP ;SUCCESS: WITH ; T1/ Ethernet Address, bytes 0,1,2,3 left justified ; T2/ Ethernet Address, bytes 4,5 left justified ; ; Uses: T1,T2,T3,MS DNGENA: STKVAR SETZM STG1 ;MAKE FOR CLEAN RESULT SETZM STG2 MOVX T2, ;POINT TO 6 BYTE STRING LOAD T6,MDALA,(MS) ;SET UP INDEX FOR MDPTR HRLZI T3,<-6> ;SET UP LOOP COUNT DNGEN1: OPSTRM ,MDBYT,(MS) ;;UPDATE THE COUNT JUMPL T1,RTN ;;RETURN IF WE RAN OUT OPSTRM ,MDPTR,(MS) ;GET CURRENT BYTE IDPB T1,T2 ;OUTPUT CURRENT BYTE AOBJN T3,DNGEN1 ;DO ALL 6 BYTES DMOVE T1,STG2 ;MAKE 6 BYTE STRING ON STACK RETSKP ;AND GIVE HIM A GOOD RETURN ENDSV. SUBTTL MSDs -- Byte routines -- Put a byte into message ;DNP1BY - Place one byte into message ; ; Call: ; T1/ The byte ; MS/ Pointer to current output MSD ; ; Return: ; RET ;ALWAYS ; ; Uses: T1,MS DNP1BY: LOAD T6,MDALA,(MS) ;SET UP INDEX FOR MDPTR OPSTRM ,MDPTR,(MS) ;PUT BYTE IN MESSAGE INCR MDBYT,(MS) ;INCREMENT THE COUNT RET ;RETURN TO SENDER SUBTTL MSDs -- Byte routines -- Put two bytes in message ;DNP2BY - Place two bytes into message stream ; ; Call: ; T1/ 2 bytes (a PDP-11 word) ; MS/ Pointer to current output MSD ; ; Return: ; RET ;ALWAYS ; ; Uses: T1,MS DNP2BY: SAVEAC ;SAVE T6 LOAD T6,MDALA,(MS) ;SET UP INDEX FOR MDPTR OPSTRM ,MDPTR,(MS) ;OUTPUT FIRST PART OF WORD LSH T1,-^D8 ;SHIFT A BYTE OPSTRM ,MDPTR,(MS) ;OUTPUT NEXT PART MOVEI T1,2 ;WE DID TWO BYTES OPSTRM ,MDBYT,(MS) ;INCREMENT THE COUNT RET ;RETURN TO SENDER SUBTTL MSDs -- Byte routines -- Put two bytes to specified position ;DNP2BS - Put two bytes in message at a specified position ; ; Call: T1/ Beginning byte position ; T2/ 2 bytes (a PDP-11 word) ; MS/ Pointer to current input MSD ; ; Return: ; RET ;WHEN WE'RE OUT OF BYTES ; RETSKP ;SUCCESS: WITH T1 CONTAINING THE 16 BIT BYTE ; ; Uses: T1,T2,T3,MS DNP2BS: LOAD T6,MDALA,(MS) ;SET UP INDEX FOR MDPTR ; MOVEI T3,2(T1) ; OPSTRM ,MDALL,(MS) ; JUMPG T3,RTN ;IF THERE ISN'T ENOUGH ROOM, LEAVE OPSTRM ,MDAUX,(MS) ;ADJUST TO SPECIFIED BYTE POSITION IDPB T2,T1 ;PUT THE LOW BYTE LSH T2,-^D8 ;SHIFT TO HI BYTE IDPB T2,T1 ;PUT THE NEXT BYTE RET ; AND RETURN TO SENDER SUBTTL MSDs -- Byte routines -- Put four bytes in message ;DNP4BY - Place four byte value into message stream ; ; Call: ; T1/ 4 bytes (a PDP-11 double word) ; MS/ Pointer to current output MSD ; ; Return: ; RET ;ALWAYS ; ; Uses: T1,MS DNP4BY: LOAD T6,MDALA,(MS) ;SET UP INDEX FOR MDPTR HRLZI T2,<-4> ;SET UP LOOP COUNT DNP4B1: OPSTRM ,MDPTR,(MS) ;OUTPUT FIRST BYTE OF WORD LSH T1,-^D8 ;SHIFT TO NEXT BYTE OPSTRM ,MDBYT,(MS) ;INCREMENT THE COUNT AOBJN T2,DNP4B1 ;DO ALL BYTES IN WORD RET ;RETURN TO SENDER SUBTTL MSDs -- Byte routines -- Put HI-ORDER 4 bytes of Ethernet Addr ;DNPHIO - Put high order four bytes of Ethernet address in message ; ; Call: ; T1/ Ethernet Address, bytes 0,1,2,3 left justified ; MS/ Pointer to current output MSD ; ; Return: ; RET ;ALWAYS ; ; Uses: T1,T2,MS DNPHIO: STKVAR MOVEM T1,STG ;MAKE 4 BYTE STRING ON STACK MOVX T2, ;POINT TO 4 BYTE STRING LOAD T6,MDALA,(MS) ;SET UP INDEX FOR MDPTR HRLZI T3,<-4> ;SET UP LOOP COUNT DNPHI1: ILDB T1,T2 ;GET CURRENT BYTE OPSTRM ,MDPTR,(MS) ;OUTPUT CURRENT BYTE OPSTRM ,MDBYT,(MS) ;INCREMENT THE COUNT AOBJN T3,DNPHI1 ;DO ALL 4 BYTES RET ;AND GIVE HIM A GOOD RETURN ENDSV. SUBTTL MSDs -- Byte routines -- Put six byte Ethernet Address ;DNPENA - Put six byte Ethernet address in message ; ; Call: ; T1/ Ethernet Address, bytes 0,1,2,3 left justified ; T2/ Ethernet Address, bytes 4,5 left justified ; MS/ Pointer to current output MSD ; ; Return: ; RET ;ALWAYS ; ; Uses: T1,T2,MS DNPENA: STKVAR DMOVEM T1,STG2 ;MAKE 6 BYTE STRING ON STACK MOVX T2, ;POINT TO 6 BYTE STRING LOAD T6,MDALA,(MS) ;SET UP INDEX FOR MDPTR HRLZI T3,<-6> ;SET UP LOOP COUNT DNPEN1: ILDB T1,T2 ;GET CURRENT BYTE OPSTRM ,MDPTR,(MS) ;OUTPUT CURRENT BYTE OPSTRM ,MDBYT,(MS) ;INCREMENT THE COUNT AOBJN T3,DNPEN1 ;DO ALL 6 BYTES RET ;AND GIVE HIM A GOOD RETURN ENDSV. SUBTTL MSDs -- Byte routines -- Skip some bytes ;DNSKBY - Skip (T1) bytes in input message ; ; Call: ; MS/ Pointer to current input MSD ; T1/ Number of Bytes to Skip ; ; Return: ; RET ;WHEN WE RAN OUT OF BYTES ; RETSKP ;ON SUCCESS ; ; Uses: T1,T2,MS DNSKBY: JUMPE T1,RSKP ;Success return if no bytes to skip LOAD T6,MDALA,(MS) ;SET UP INDEX FOR MDPTR MOVN T2,T1 ;GET THE NEGATIVE COUNT OPSTRM ,MDBYT,(MS) ;NEGATE COUNT OPSTRM ,MDBYT,(MS) ;SUBTRACT THE NUMBER OF BACKSPACES JUMPL T2,RTN ;IF WE'RE OUT, GIVE ERROR RETURN OPSTR ,MDPTR,(MS) ;ADJUST THE BYTE POINTER STOR T1,MDPTR,(MS) ;STORE THE POINTER BACK RETSKP ;WE'RE OK SUBTTL MSDs -- Byte routines -- Go Backwards some number of bytes ;DNBKBY - Go backwards (T1) bytes in input message ; ; Call: ; T1/ Number of bytes to go backwards over ; MS/ Pointer to input MSD ; ; Return: ; RET ;ALWAYS ; ; Uses: T1,MS ; ;Note: It is your responsiblity to make sure that you do not go ;backwards over an MSD boundary. If you do the program will not work. DNBKBY: LOAD T6,MDALA,(MS) ;SET UP INDEX FOR MDPTR OPSTRM ,MDBYT,(MS) ;ADJUST THE BYTE COUNT MOVN T1,T1 ;GET NEGATIVE COUNT OPSTR ,MDPTR,(MS) ;ADJUST THE BYTE POINTER FIXADJ T1 ;COMPENSATE FOR BUG IN BP EA CALC STOR T1,MDPTR,(MS) ;STORE THE POINTER BACK RET ;TO SENDER SUBTTL MSDs -- Read and Goto Position ;DNRPOS - Read the current position in the input data ; ; Call: ; MS/ Pointer to input MSD ; ; Return: ; RET ;Always, T1 holds full-word of position ; ; which can be fed to DNGPOS ; ; Uses: T1 ; ;Note that DNRPOS is called far more frequently than DNGPOS, so ;DNRPOS is simple, where DNGPOS is complicated. DNRPOS: LOAD T1,MDBYT,(MS) ;LOAD UP 'BYTES TO GO' RET ;THAT WAS EASY SUBTTL Buffers -- Copy user buffer to a message segment ;DNCU2M - Copy user buffer to a message segment ; ; Call: ; T1/ User Byte Count ; T2/ User Byte Pointer ; T3/ Optional second word of byte pointer, not implemented yet ; for user mode ; MS/ Pointer to current message segment ; ; Return: ; RET ;ALWAYS, WITH T2 CONTAINING UPDATED BYTE PTR ; ; AND T1 CONTAINING UPDATED BYTE COUNT ; ; Uses: T1-T6 DNCU2M: IFN FTOPS10,< TXZ T2,1B12 ;DON'T ALLOW USER 2-WORD BPTs LOAD T4,MDBYT,(MS) ;GET COUNT OF BYTES ALREADY IN MSG BLK OPSTRM ,MDBYT,(MS) ;INCREMENT THE BYTE COUNT JUMPG T4,DNCUM0 ;CAN'T BLT IF SOME ALREADY THERE HLRZ T4,T2 ;GET P & S FIELDS OF USER BPT CAIE T4,441000 ;IS IT A STANDARD 8-BIT PTR? CAIN T4,341000 ;IN ANY OF THE 4 POSITIONS? JRST DNCUMB ;YES, WE CAN BLT CAIE T4,241000 ;TWO MORE CAIN T4,141000 ; NORMAL ONES TO CHECK JRST DNCUMB ;YES, WE CAN BLT CAIN T4,041000 ;NO, STANDARD 'NEXT-WORD' BPT? JRST [ TLO T2,400000 ;YES, MAKE IT 441000,,N+1 HRRI T2,1(T2) ; . . . JRST DNCUMB] ;AND BLT THE DATA DNCUM0: >;END OF IFN FTOPS10 ;Here if we must do a byte-wise copy IFN FTOPS20,,MDBYT,(MS)> ;INCREMENT THE BYTE COUNT LOAD T6,MDALA,(MS) ;SET UP INDEX FOR MDPTR LOAD T5,MDPTR,(MS) ; AND THE DESTINATION BYTE POINTER SKIPG T4,T1 ;SET UP THE DESTINATION BYTE COUNT RET ;IF NON-POSITIVE, WE'RE DONE DNCUM1: XCTBU [ILDB CX,T2] ;GET THE BYTE FROM USER BUFFER IDPB CX,T5 ;PUT IT IN THE MESSAGE BLOCK SOJG T1,DNCUM1 ;LOOP UNTIL DONE STOR T5,MDPTR,(MS) ;STORE THE UPDATED BYTE POINTER RET ;RETURN IFN FTOPS10,< ;Here if we can BLT the user data DNCUMB: HLLZ T4,T2 ;PICK UP ADJUSTED USER BPT'S P&S FIELDS TLO T4,T6 ;MDAUX IS INDEXED BY T6 STOR T4,MDAUX,(MS) ;STORE NEW BEG-OF-MSG BYTE POINTER MOVE T5,T1 ;GET BYTE LENGTH AGAIN ADJBP T5,T4 ;FIGURE BYTE PTR AT END OF NEW DATA STOR T5,MDPTR,(MS) ;STORE NEW END-OF-MSG BYTE POINTER LDB T4,[POINT 3,T2,2] ;PICK UP WORD ALIGNMENT FROM BYTE POINTER MOVNS T4 ;NEGATE ADDI T4,7(T1) ;CALCULATE MESSAGE WORD COUNT ASH T4,-2 ;... IFN FTXMON,< HRRZ T5,T2 ;SOURCE ADDR, USER ALWAYS IN SECTION 0 LOAD T6,MDALA,(MS) ;ALLOCATED ADDRESS OF MONITOR DATA BLK XCT 2,[EXTEND T4,[XBLT]] ;COPY FROM USER TO MONITOR >;END IFN FTXMON IFE FTXMON,< LOAD T5,MDALA,(MS) ;DESTINATION ADDR IN MONITOR SPACE HRL T5,T2 ;SOURCE ADDR IN USER SPACE ADDI T4,-1(T5) ;MAKE DEST END ADDRESS IN SECTION 0 XCT 1,[BLT T5,(T4)] ;COPY USER TO MONITOR >;END IFE FTXMON MOVE T4,T1 ;GET LENGTH (BYTES) AGAIN ADJBP T4,T2 ;MAKE NEW USER BPT MOVEM T4,T2 ;PUT BACK FOR CALLER SETZM T1 ;UPDATED BYTE COUNT FOR CALLER RET ;ONLY RETURN >;END OF IFN FTOPS10 SUBTTL Buffers -- Copy message data to a user buffer ;DNCM2U - Copy message data to a user buffer ; ; Call: ; T1/ Count of bytes ; T2/ Pointer to data ; T3/ Optional second word of byte pointer ; MS/ Pointer to current message segment ; ; Return: ; RET ;IF LENGTH IS NOT CORRECT ; RETSKP ;ON SUCCESSFUL COPY WITH T1 AND T2 CONTAINING ; ; BYTE COUNT AND POINTER ; ; Uses: T1-T6 DNCM2U: SAVEAC ;SAVE T5, T6 TXNE T2,1B12 ;2-WORD BYTE PTR? HRR T2,T3 ;YES, MAKE LOCAL FOR OLD MACHINES MOVE T4,T1 ;SET UP DESTINATION BYTE COUNT DMOVE T5,T2 ;AND DESTINATION BYTE POINTER OPSTR ,MDBYT,(MS) ;MESSAGE BIG ENOUGH? RET ;NO, LET CALLER DEAL WITH ERROR MOVN T2,T1 ;SET UP NEGATIVE COUNT OPSTRM ,MDBYT,(MS) ;UPDATE THE BYTE COUNT LOAD T2,MDPTR,(MS) ;SET UP THE SOURCE BYTE POINTER TLZE T2,17 ;IS MDPTR INDEXED? TLO T2,T3 ;YES, USE T3, NOT T6 LOAD T3,MDALA,(MS) ;SET UP INDEX FOR MDPTR JRST DNCMU2 ;START IN MIDDLE OF LOOP DNCMU1: ILDB CX,T2 ;GET THE BYTE FROM MESSAGE BLOCK XCTBU [IDPB CX,T5] ;PLACE BYTE IN USER BUFFER DNCMU2: SOJGE T4,DNCMU1 ;DO UNTIL DONE STOR T2,MDPTR,(MS) ;STOR THE UPDATED BP TO MESSAGE MOVE T1,T4 ;UPDATE COUNT FOR CALLER DMOVE T2,T5 ; ALSO POSSIBLY 2-WORD BYTE PTR RETSKP ;RETURN SUCCESS >; END IFN FTOPS10 SUBTTL End of Program IFN FTOPS20,TNXEND END