1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-02-19 05:46:57 +00:00
Files
PDP-10.stacken/files/stacken-tape-backup/dskb:10_7/mon/llmop.mac
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

5176 lines
160 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;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,<RETBAD (JSE)>
IFN FTOPS10,<RETBAD (UUE)>
>; 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 <SE1ENT>
DEFINE MCENT <> ;DON'T NEED THESE IN TOPS10
DEFINE NOSKED <>
DEFINE OKSKED <>
DEFINE SAVEPQ <SAVEAC <P1,P2,P3,P4,Q1,Q2,Q3>>
DEFINE RETBAD(COD),<
IFNB <COD>,<RETBD1 \COD>
IFB <COD>,<POPJ P,>
>; END DEFINE RETBAD
DEFINE RETBD1(COD),<
IFLE <COD+1-ECDMAX>,<JRST ECDX'COD##>
IFG <COD+1-ECDMAX>,<JRST [MOVEI T1,COD
MOVS M,.USMUO
JRST STOTAC##]>
>; 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,<PRINTX ?Missing $EOB after a $BUILD>
..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,<PRINTX ?$SET without previous $BUILD>
IFNB <STR>,<
IFB <OFFSET>,<..STR0 (..SET,<VALUE>,STR)>
IFNB <OFFSET>,<..STR0 (..SET,<VALUE>,STR,OFFSET)>>
IFB <STR>,<
IFB <OFFSET>,<..STR0 (..SET,<VALUE>,FWMASK)>
IFNB <OFFSET>,<..STR0 (..SET,<VALUE>,FWMASK,OFFSET)>>
> ; END OF $SET DEFINITION
DEFINE ..SET (VALUE,LOC,MSK) <
IFGE <<<LOC>&777777>-..BSIZ>,<
PRINTX ?WORD offset greater than $BUILD size parameter>
SET0. (\<LOC>,MSK,<VALUE>)
> ;END ..SET DEFINITION
; After all values are declared, the block must be closed to do its actual
; creation.
DEFINE $EOB,<
IFNDEF ..BSIZ,<PRINTX ?$EOB without previous $BUILD>
IFN <.-..BLOC>,<PRINTX ?Address change between $BUILD and $EOB>
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,<EXP ..T'N
PURGE ..T'N>
> ;END OF BLD0. DEFINITION
DEFINE SET0.(LOC,MSK,VALUE),<
IFN <<..T'LOC>&MSK>,<PRINTX ?Initial field not zero in $SET>
..TVAL==<VALUE>
..TMSK==<MSK>
..T'LOC==..T'LOC!<FLD(..TVAL,..TMSK)>
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><FOO>,<.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,,<STR>,<Y>)>
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 (<LOC>,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 (<LOC>),MSK)]
JRST (.SAC)]>>>
DEFINE DECRF (STR,Y),<
..STR1 (..DEC1,,<STR>,<Y>)>
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 (<LOC>,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 (<LOC>),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 first value in list
STOPI>
IRP LIST,<IFL <LIST-..X>,<..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 first value in list
STOPI>
IRP LIST,<IFG <LIST-..X>,<..X==LIST>> ;;Assign highest in list
SYM==:..X> ;;Generate value
DEFINE MAKENT (TABLE,CODE,ROUTINE) <
.ORG <TABLE+CODE>
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,<<LHH.LN+3>/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,<<RCH.LN+3>/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,<LD.LST,CD.LST>) ;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==<<BUFLEN+3>/4> ;Ethernet Buffer Size in Words
LPSIBN==^D20 ;Initial Number of Buffers for LPS
IFN FTOPS20,<
LLPILM==<1B<POS(PICHNM)-WID(PICHNM)+DLSCHN>> ;PI Level mask for KLNI
>; END IFN FTOPS20
NKLNI==1 ;Number of KLNI's supported by LLMOP
IFN FTOPS10,<
VGNPTR==<POINT 8,0(T6)>
>; 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,<LM%BDV!LM%BSV!LM%PRO>
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,<<SID.SZ+3>/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,<LLMOP LPSCBR called with invalid function code>,<<T1,FUNCODE>>,<
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,<LLMOP Received Invalid Loopback Message>,<<T1,MSGLEN>,<T2,HIORD>,<T3,LOORD>>,<
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,<LLMOP Invalid Loopback Function Code>,<<T1,FUNCOD>,<T2,HIORD>,<T3,LOORD>>,<
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,<LLMOP Invalid Xmit Complete>
,<<T1,RBSTT>,<T3,STATUS>>,<
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,<LLMOP Data Link State Change - CHAN,PID,STS>,<<T1,CHANNEL>,<T2,PRTLID>,<T3,STATUS>>,<
Cause: LLMOP was called by NIDDL on change of state. This is for
information only. No corrective action required.
>)
BUG. (INF,LLMSCA,LLMOP,SOFT,<LLMOP Ethernet Channel Address Change - CHAN,ADDR1,ADDR2>,<<T1,CHANNEL>,<T2,ADDR1>,<T3,ADDR2>>,<
Cause: LLMOP was called by NIDDL on change of state.
>)
BUG. (INF,LLMLXF,LLMOP,SOFT,<LLMOP Loopback Transmit Failed>
,<<T1,DLLERC>,<T2,STATUS>,<T3,CHANNEL>>,<
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,<LLMOP RCSCBR called with invalid function code>,<<T1,FUNCODE>>,<
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,<LLMOP Received Invalid Remote Console Message>,<<T1,MSGLEN>>,<
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,<LLMOP Received an invalid MOP message>,<<T1,FUNCODE>>,<
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,<LLMOP Response Transmit Failed>,<<T1,DLLERC>,<T2,CHANNEL>>,<
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,<LLMOP Transmit Failed>,<<T1,DLLERC>,<T2,CHANNEL>>,<
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,<LLMOP Ethernet Periodic Identify-Self>,,<
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,<LLMOP Loop Request Transmit Failed>,<<T1,DLLERC>,<T2,STATUS>,<T3,CHANNEL>>,<
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,<LLMOP Open Portal Failed>,<<T1,DLLERC>>,<
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,<LLMOP Declare Multicast Address Failed>,<<T1,DLLERC>>,<
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,<LLMOP RB Queue Corrupted>,<<T1,RBADDRESS>>,<
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 <NKLNI>,<
$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,<BYTE (8)317,0,0,0>) ;Loopback Multicast
$SET (SVMCA,<BYTE (8)0,0,0,0>,<+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,<BYTE (4)0(8)0,0,220,0>,SV.IXB) ;Protocol Type 90-00
IFN FTOPS20,<
$SET (UNPMS,<LLPILM>,SV.IXB) ;PI level at which we call NI Data Link
>; END IFN FTOPS20
$SET (UNUID,<LPSSVB+..CH>,SV.IXB) ;Address of SVB is our UID
$SET (UNCBA,<IFIW LPSCBR>,SV.IXB) ;Call Back Vector Address
$EOB
..LRQH==<LPSSVB+<<1+..CH>*SV.RQH>>
..CH==..CH+1>
;Server Variable Blocks for Remote Console Server, one per channel
..CH==0 ;Initialize at Channel 0
RCSSVB: REPEAT <NKLNI>,<
$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,<BYTE (8)253,0,0,02>) ;Remote Console Multicast
$SET (SVMCA,<BYTE (8)0,0,0,0>,<+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,<BYTE (4)0(8)0,0,140,02>,SV.IXB) ;Protocol Type 60-02
IFN FTOPS20,<
$SET (UNPMS,<LLPILM>,SV.IXB) ;PI level at which we call NI Data Link
>; END IFN FTOPS20
$SET (UNUID,<RCSSVB+..CH>,SV.IXB) ;Address of SVB is our UID
$SET (UNCBA,<IFIW RCSCBR>,SV.IXB) ;Call Back Vector Address
$EOB
..CRQH==<RCSSVB+<<1+..CH>*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,<VMC.XC>,<IM.MSD>)
$SET (MDALA,<RCSSIM+IM.DAT>,<IM.MSD>)
$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,<PIDSUN>) ;Address of PIDSUN is our UID
$SET (UNDAD,<BYTE (8)253,0,0,02>) ;Remote Console Multicast
$SET (UNDAD,<BYTE (8)0,0,0,0>,<+1>) ;Address AB-00-00-02-00-00
$SET (UNCBA,<IFIW RCSCBR>) ;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 <CN> ;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 <CN> ;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 <CN,SB> ;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,<NU.CLO,NU.RCV,NU.XMT,NU.EMA,NU.DMA,NU.RPC,NU.RCI,NU.SCA,NU.RCC>)
MAX. (MAXLPF,<NU.CLO,NU.RCV,NU.XMT,NU.EMA,NU.DMA,NU.RPC,NU.RCI,NU.SCA,NU.RCC>)
LPFSIZ==<MAXLPF-MINLPF+1> ;Size of Dispatch Table
RESCD
LPSCBR: SAVEPQ ;Save all AC's to be safe
TRVAR <SKPCNT> ;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 <LPFSIZ> ;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 <SKIPN>,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 <SKIPN>,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,-<RBL.LN+LB.LEN+1>(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,-<WID(777)> ;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,<SKIPA> ;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,<SKIPA> ;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 <SKIPN >,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,<NU.CLO,NU.RCV,NU.XMT,NU.EMA,NU.DMA,NU.RPC,NU.RCI,NU.SCA,NU.RCC>)
MAX. (MAXRCF,<NU.CLO,NU.RCV,NU.XMT,NU.EMA,NU.DMA,NU.RPC,NU.RCI,NU.SCA,NU.RCC>)
RCFSIZ==<MAXRCF-MINRCF+1> ;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 <RCFSIZ> ;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,-<RBL.LN+1>(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,-<WID(777)> ;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,<FCBOOT,FCRQID,FCSSID,FCRQCT,FCCNTR,FCRSVC,FCRELC,FCCCAP,FCCRAK>)
MAX. (MAXFCD,<FCBOOT,FCRQID,FCSSID,FCRQCT,FCCNTR,FCRSVC,FCRELC,FCCCAP,FCCRAK>)
FCDSIZ==<MAXFCD-MINFCD+1> ;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 <FCDSIZ> ;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 <AOS >,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 <SKIPN>,SVCFN,(SB) ;Is there a Configurator Fork?
>; END IFN FTOPS20
IFN FTOPS10,<
OPSTR <SKIPN>,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 <SKIPN >,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 <RCPTNO>
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 <SKIPN >,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 <SKIPN >,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 <UN,SB>
TRVAR <MSGLEN,BP,MP>
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 <P1> ;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,<MFLOOP!MFDLCT> ;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 <P1> ;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 <P1,P2> ;Preserve some ACs
DMOVE P1,T1 ;Save RECEIPT NUMBER and COUNTER BLOCK address
SAVEAC <CC>
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 <UN> ;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,<RB%FRC!RB%FRF> ;Receive done?
ANSKP. ;And...
TXNN T1,<RB%FTC!RB%FTF> ;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 <SB,RB,LM,UN> ;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 <WHELX1> ;Not good enough
CAIGE T1,.LLMIN ;Function code within range?
ITERR <ARGX02> ;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 <LLMX05> ;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 <ARGX02> ;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 <LLMX02> ;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 <SB,RB,LM,UN> ;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,+<SV.IXB+1>(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,+<SV.IXB+1>(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 <P1,P2> ;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,<RB%FRC!RB%FRF> ;Receive done?
IFSKP. ;And...
TXNN T1,<RB%FTC!RB%FTF> ;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 <WK> ;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 <LDB T1,>,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 <LDB T1,>,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 <CAME T1,>,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,<RB%FRC!RB%FRF> ;Receive done?
IFSKP. ;And...
TXNN T1,<RB%FTC!RB%FTF> ;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 <SKIPE>,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 <SB> ;Make SB safe
TRVAR <XID,TSTOWN> ;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 <RB> ;Make RB safe
OPSTR <XMOVEI T1,>,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 <SB,UN> ;Allocate named AC variables for block pointers
STKVAR <LOOPCT>
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 <SB,UN> ;Allocate named AC variables for block pointers
SAVEAC <MS> ;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 <CAML T1,>,SVIBN,(SB) ;Need to post receive buffers?
RETSKP ;NO, just return
MOVEI T1,<MD.LEN+UN.LEN+BUFSIZ> ;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 <AOS>,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 <AOS>,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 <SB> ;Allocate named AC variables for block pointers
ETHLOK ;Interlock the queue structure
MOVE SB,T3 ;Point to SVB
OPSTR <CAMN T2,>,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 <SB> ;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 <SB> ;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,<XMOVEI 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 <P1,P2,J> ;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 <T1> ;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 <P1> ;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 <J> ;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 <J> ;Save J
OPSTR <SKIPN>,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 <P1> ;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 <P1> ;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 <SOS T1,>,MDBYT,(MS) ;;UPDATE THE COUNT
JUMPL T1,RTN ;;RETURN IF WE RAN OUT
OPSTRM <ILDB T1,>,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 <ADDB T1,>,MDBYT,(MS) ;UPDATE STRING COUNT
JUMPL T1,RTN ;IF THERE ISN'T ENOUGH ROOM, LEAVE
OPSTRM <ILDB T1,>,MDPTR,(MS) ;GET THE LOW BYTE
OPSTRM <ILDB T2,>,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 <STG1,STG2>
SETZM STG1 ;MAKE FOR CLEAN RESULT
SETZM STG2
MOVX T2,<POINT 8,STG2> ;POINT TO 6 BYTE STRING
LOAD T6,MDALA,(MS) ;SET UP INDEX FOR MDPTR
HRLZI T3,<-6> ;SET UP LOOP COUNT
DNGEN1: OPSTRM <SOS T1,>,MDBYT,(MS) ;;UPDATE THE COUNT
JUMPL T1,RTN ;;RETURN IF WE RAN OUT
OPSTRM <ILDB T1,>,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 <IDPB T1,>,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 <T6> ;SAVE T6
LOAD T6,MDALA,(MS) ;SET UP INDEX FOR MDPTR
OPSTRM <IDPB T1,>,MDPTR,(MS) ;OUTPUT FIRST PART OF WORD
LSH T1,-^D8 ;SHIFT A BYTE
OPSTRM <IDPB T1,>,MDPTR,(MS) ;OUTPUT NEXT PART
MOVEI T1,2 ;WE DID TWO BYTES
OPSTRM <ADDM T1,>,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 <SUB T3,>,MDALL,(MS)
; JUMPG T3,RTN ;IF THERE ISN'T ENOUGH ROOM, LEAVE
OPSTRM <ADJBP T1,>,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 <IDPB T1,>,MDPTR,(MS) ;OUTPUT FIRST BYTE OF WORD
LSH T1,-^D8 ;SHIFT TO NEXT BYTE
OPSTRM <AOS>,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 <STG>
MOVEM T1,STG ;MAKE 4 BYTE STRING ON STACK
MOVX T2,<POINT 8,STG> ;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 <IDPB T1,>,MDPTR,(MS) ;OUTPUT CURRENT BYTE
OPSTRM <AOS>,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 <STG1,STG2>
DMOVEM T1,STG2 ;MAKE 6 BYTE STRING ON STACK
MOVX T2,<POINT 8,STG2> ;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 <IDPB T1,>,MDPTR,(MS) ;OUTPUT CURRENT BYTE
OPSTRM <AOS>,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 <MOVNS>,MDBYT,(MS) ;NEGATE COUNT
OPSTRM <SUBB T2,>,MDBYT,(MS) ;SUBTRACT THE NUMBER OF BACKSPACES
JUMPL T2,RTN ;IF WE'RE OUT, GIVE ERROR RETURN
OPSTR <ADJBP T1,>,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 <ADDM T1,>,MDBYT,(MS) ;ADJUST THE BYTE COUNT
MOVN T1,T1 ;GET NEGATIVE COUNT
OPSTR <ADJBP T1,>,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 <ADDM T1,>,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,<OPSTRM <ADDM T1,>,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 <T5,T6> ;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 <CAMLE T1,>,MDBYT,(MS) ;MESSAGE BIG ENOUGH?
RET ;NO, LET CALLER DEAL WITH ERROR
MOVN T2,T1 ;SET UP NEGATIVE COUNT
OPSTRM <ADDM T2,>,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