TITLE ETHSER - ETHERNET SERVICE ROUTINES V36 SUBTTL WILLIAM C. DAVENPORT/WXD 14-JUNE-88 SEARCH F,S,MACSYM,ETHPRM T20SYM $RELOC $HIGH ;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. .CPYRT<1985,1988> XP VETHSR,36 ;ETHSER VERSION NUMBER ENTRY ETHSER ;LOAD IF LIBRARY SEARCH ; ; H H H H ; | | | | ; H -- C -- C -- O -- C -- C -- H ; | | | | ; H H H H ; ; ETHER, THE CODE THAT PUTS YOU TO SLEEP. ;THIS MODULE IMPLEMENTS A DEVICE INDEPENDENT INTERFACE TO ETHERNET ;LOOSE ENDS: ; MULTI-CHANNEL ETHERNET SUPPORT ; DYNAMIC KONTROLLER CONFIGURATION SUBTTL TABLE OF CONTENTS ; TABLE OF CONTENTS FOR ETHSER ; ; ; SECTION PAGE ; 1. TABLE OF CONTENTS......................................... 2 ; 2. ETHERNET SERVICE ; 2.1 INITIALIZATION.................................... 3 ; 2.2 ONCE A SECOND CODE................................ 4 ; 2.3 ETHERNET CHANNEL ONCE A SECOND CODE............... 5 ; 2.4 ETHERNET PORTAL ONCE A SECOND CODE................ 6 ; 2.5 ETHERNET KONTROLLER ONCE A SECOND CODE............ 7 ; 3. ETHERNET USER SERVICE ; 3.1 FUNCTION DISPATCH................................. 8 ; 3.2 OPEN PORTAL FUNCTION.............................. 13 ; 3.3 CLOSE PORTAL FUNCTION............................. 15 ; 3.4 RECEIVE DATAGRAM FUNCTION......................... 16 ; 3.5 TRANSMIT DATAGRAM FUNCTION........................ 18 ; 3.6 ENABLE MULTI-CAST ADDRESS FUNCTION................ 20 ; 3.7 DISABLE MULTI-CAST ADDRESS FUNCTION............... 21 ; 3.8 READ CHANNEL LIST FUNCTION........................ 22 ; 3.9 READ CHANNEL INFORMATION FUNCTION................. 23 ; 3.10 READ CHANNEL COUNTERS FUNCTION.................... 24 ; 3.11 SET CHANNEL ADDRESS FUNCTION...................... 27 ; 3.12 READ PORTAL LIST FUNCTION......................... 29 ; 3.13 READ PORTAL INFORMATION FUNCTION.................. 30 ; 3.14 READ PORTAL COUNTERS FUNCTION..................... 31 ; 3.15 READ KONTROLLER LIST.............................. 33 ; 3.16 READ KONTROLLER INFORMATION....................... 34 ; 3.17 READ KONTROLLER COUNTERS.......................... 35 ; 3.18 READ ETHERNET LIST................................ 38 ; 3.19 READ ETHERNET INFORMATION......................... 39 ; 3.20 REPORT PORTAL STATUS CHANGE....................... 40 ; 3.21 CALL PORTAL USER.................................. 41 ; 3.22 GENERATE AN EA BLOCK.............................. 42 ; 3.23 RELEASE EA BLOCK.................................. 43 ; 3.24 CALL ETHERNET KONTROLLER.......................... 44 ; 4. ETHERNET CHANNEL SUPPORT ; 4.1 CREATE ETHERNET CHANNEL BLOCK..................... 45 ; 4.2 GENERATE CHANNEL STATUS WORD...................... 46 ; 4.3 FIND ETHERNET CHANNEL BLOCK....................... 47 ; 5. ETHERNET PORTAL SUPPORT ; 5.1 GENERATE ETHERNET PORTAL ID....................... 48 ; 5.2 GENERATE PORTAL STATUS WORD....................... 49 ; 5.3 FIND ETHERNET PORTAL BLOCK........................ 50 ; 5.4 ADD ETHERNET PORTAL BLOCK......................... 51 ; 5.5 DELETE ETHERNET PORTAL BLOCK...................... 52 ; 5.6 FIND MULTI-CAST ADDRESS........................... 53 ; 5.7 ADD MULTI-CAST ADDRESS............................ 54 ; 5.8 DELETE MULTI-CAST ADDRESS......................... 55 ; 5.9 ENABLE PROTOCOL................................... 56 ; 5.10 DISABLE PROTOCOL.................................. 59 ; 5.11 PROTOCOL STATE TRANSTITION........................ 62 ; 6. ETHERNET KONTROLLER SUPPORT ; 6.1 CREATE KONTROLLER BLOCK........................... 63 ; 6.2 GENERATE KONTROLLER STATUS WORD................... 64 ; 6.3 SELECT AN ETHERNET KONTROLLER..................... 65 ; 6.4 FIND ETHERNET KONTROLLER BLOCK.................... 66 ; 6.5 ADD ETHERNET KONTROLLER BLOCK..................... 67 ; 7. ETHERNET INTERRUPT SERVICE ; 7.1 KONTROLLER INITIALIZATION......................... 68 ; 7.2 KONTROLLER OFFLINE................................ 69 ; 7.3 KONTROLLER ONLINE................................. 70 ; 7.4 KONTROLLER FUNCTION DONE.......................... 71 ; 8. ETHERNET SUPPORT ; 8.1 UPDATE ETHERNET COUNTERS.......................... 72 ; 8.2 GENERATE TWO WORD GLOBAL BYTE POINTER............. 73 ; 9. BYTE POINTERS............................................. 74 ; 10. ETHERNET INFORMATION GETTAB TABLE......................... 75 ; 11. THE END................................................... 76 SUBTTL ETHERNET SERVICE -- INITIALIZATION ;ROUTINE CALLED TO INITIALIZE ETHERNET SERVICE ;LINKAGE: (CALLED FROM SYSINI) ; PUSHJ P,ETHINI ;RETURNS: ; CPOPJ ALWAYS ETHINI::SKIPE %EICHN ;SYSTEM RESTART? POPJ P, ;YES, RETURN PUSHJ P,SAVQ1## ;SAVE Q1 SE1ENT ;RUN IN SECTION 1 IFE FTXMON,< MOVEI T1,ETHSIZ## ;SIZE OF ETHERNET FREECORE NEEDED PUSHJ P,INICOR## ;ALLOCATE CORE MOVEM T2,ETHLOC## ;SAVE STARTING ADDRESS > ;END IFE FTXMON IFN FTXMON,< MOVEI T2,ETHSIZ## ;SIZE OF FREECORE MOVEI T1,(MS.DCN) ;SECTION NUMBER PUSHJ P,GFWNZN## ;ASK ONCMOD FOR NON-ZERO SECTION CORE HALT . ;*** FOR NOW MOVEM T1,ETHLOC## ;SAVE AS LOWEST ADDRESS IN FREECORE > ;END IFN FTXMON PUSHJ P,GENECB ;CREATE AN ETHERNET CHANNEL BLOCK POPJ P, ;ERROR, RETURN MOVX T1,ECSONL ;MARK CHANNEL AS ONLINE IORM T1,ECBSTS(Q1) ;... IFN FTDECNET,< ;IF DECNET SUPPORT SKIPN [M.DECN##] ;IS DECNET LOADED? JRST ETHIN1 ;NO, DON'T PRESET ETHERNET ADDRESS MOVE T1,RTRHIO## ;GET HIGH ORDER DECNET ETHERNET ADDRESS SETZ T2, ;CLEAR LOW ORDER ETHERNET ADDRESS MOVE T3,DCNHOM## ;GET OUR DECNET AREA NUMBER LSH T3,^D10 ;POSITION CORRECTLY IOR T3,DCNNUM## ;COMBINE WITH OUR DECNET NODE ADDRESS ROTC T2,-^D8 ;GET LOW ORDER BYTE OF DECNET ADDRESS DPB T3,[POINT 8,T2,15] ;AND INCLUDE HIGH ORDER BYTE OF ADDRESS DMOVEM T1,ECBEAD(Q1) ;SAVE AS CHANNEL'S ETHERNET ADDRESS ETHIN1: >; END IFN FTDECNET POPJ P, ;AND RETURN SUBTTL ETHERNET SERVICE -- ONCE A SECOND CODE ;ROUTINE CALLED ONCE A SECOND BY CLOCK1 ;LINKAGE: ; PUSHJ P,ETHSEC ;RETURNS: ; CPOPJ ALWAYS ETHSEC:: IFN FTMP,< SKPCPU (0) ;ARE WE ON POLICY CPU? POPJ P, ;NO, RETURN >; END IFN FTMP PUSHJ P,SAVQ1## ;SAVE Q1 SE1ENT ;RUN IN SECTION 1 SKIPA Q1,%EICHN ;GET ADDRESS OF FIRST CHANNEL BLOCK ETHSE1: MOVE Q1,ECBSYS(Q1) ;GET ADDRESS OF NEXT CHANNEL BLOCK PJUMPE Q1,CPOPJ## ;IF END OF LIST, RETURN PUSHJ P,ECBSEC ;DO CHANNEL ONCE A SECOND PROCESSING JRST ETHSE1 ;LOOP BACK FOR ALL CHANNELS SUBTTL ETHERNET SERVICE -- ETHERNET CHANNEL ONCE A SECOND CODE ;ROUTINE CALLED ONCE A SECOND FOR EACH ETHERNET CHANNEL ;LINKAGE: ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; PUSHJ P,ECBSEC ;RETURNS: ; CPOPJ ALWAYS ECBSEC: PUSHJ P,SAVQ## ;SAVE Q1-Q3 AOS ECBCTR+CC.SLZ(Q1) ;UPDATE SECONDS SINCE COUNTERS LAST ZEROED SKIPA Q2,ECBEPB(Q1) ;GET ADDRESS OF FIRST PORTAL BLOCK ECBSE1: MOVE Q2,EPBNXT(Q2) ;GET ADDRESS OF NEXT PORTAL BLOCK JUMPE Q2,ECBSE2 ;IF END OF LIST, GO DO KONTROLLERS MOVE Q3,EPBEKB(Q2) ;GET ADDRESS OF ASSIGNED KONTROLLER BLOCK PUSHJ P,EPBSEC ;DO PORTAL ONCE A SECOND PROCESSING JRST ECBSE1 ;LOOP BACK FOR ALL PORTALS ECBSE2: SKIPA Q3,ECBEKB(Q1) ;GET ADDRESS OF FIRST KONTROLLER BLOCK ECBSE3: MOVE Q3,EKBNXT(Q3) ;GET ADDRESS OF NEXT KONTROLLER BLOCK PJUMPE Q3,CPOPJ## ;RETURN AT END OF LIST PUSHJ P,EKBSEC ;DO KONTROLLER ONCE A SECOND PROCESSING JRST ECBSE3 ;LOOP BACK FOR ALL KONTROLLERS SUBTTL ETHERNET SERVICE -- ETHERNET PORTAL ONCE A SECOND CODE ;ROUTINE CALLED ONCE A SECOND FOR EACH ETHERNET PORTAL ON A CHANNEL ;LINKAGE: ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; PUSHJ P,EPBSEC ;RETURNS: ; CPOPJ ALWAYS EPBSEC: AOS EPBCTR+PC.SLZ(Q2) ;UPDATE SECONDS SINCE COUNTERS LAST ZEROED LDB T1,EPPSTS ;GET CURRENT PROTOCOL STATE MOVE T1,EPBTBL(T1) ;GET ADDRESS OF DISPATCH ROUTINE PJRST (T1) ;DISPATCH BASED ON PROTOCOL STATE ;ONCE A SECOND DISPATCH TABLE BASED ON PROTOCOL STATE EPBTBL: IFIW CPOPJ## ;(0) DISABLED IFIW ETHEPT ;(1) DISABLED, WANT TO ENABLE IFIW CPOPJ## ;(2) ENABLE IN PROGRESS IFIW CPOPJ## ;(3) ENABLE IN PROGRESS, WANT TO DISABLE IFIW CPOPJ## ;(4) ENABLED IFIW ETHDPT ;(5) ENABLED, WANT TO DISABLE IFIW CPOPJ## ;(6) DISABLE IN PROGRESS SUBTTL ETHERNET SERVICE -- ETHERNET KONTROLLER ONCE A SECOND CODE ;ROUTINE CALLED ONCE A SECOND FOR EACH ETHERNET KONTROLLER ON A CHANNEL ;LINKAGE: ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; PUSHJ P,EKBSEC ;RETURNS: ; CPOPJ ALWAYS EKBSEC: AOS EKBCTR+KC.SLZ(Q3) ;UPDATE SECONDS SINCE COUNTERS LAST ZEROED MOVX T1,EKSSEA ;NEED TO SET ETHERNET ADDRESS? TDNN T1,EKBSTS(Q3) ;... POPJ P, ;NO, RETURN ANDCAM T1,EKBSTS(Q3) ;YES, CLEAR FLAG, WILL GET RESET IF NEEDED PUSHJ P,SAVP3## ;SAVE P3 MOVEI T1,EK.SEA ;FUNCTION SET ETHERNET ADDRESS PUSHJ P,GENEAB ;GENERATE AN EA BLOCK PJRST EKBSCX ;GO RESET CLOCK LEVEL FLAGS AND RETURN DMOVE T1,ECBEAD(Q1) ;GET CHANNEL'S ETHERNET ADDRESS DMOVEM T1,.EAEAD(P3) ;STORE IN EA BLOCK XMOVEI T1,ETCSCA ;GET ADDRESS OF COMPLETION ROUTINE PUSHJ P,CALKON ;CALL KONTROLLER JRST [PUSHJ P,GIVEAB ;ERROR, RELEASE EA BLOCK PJRST EKBSCX] ;GO RESET CLOCK LEVEL FLAGS AND RETURN POPJ P, ;RETURN EKBSCX: MOVX T1,EKSSEA ;FLAG SET ETHERNET ADDRESS FUNCTION IORM T1,EKBSTS(Q3) ;... POPJ P, ;RETURN SUBTTL ETHERNET USER SERVICE -- FUNCTION DISPATCH ;ROUTINE CALLED TO INTERFACE TO ETHERNET ;LINKAGE: ; T1/ FUNCTION CODE (NU.XXX) ; T2/ ADDRESS OF UN BLOCK ; PUSHJ P,ETHSER ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS DLLUNI::! ;TOPS-20 NAME FOR THIS ETHSER::SKIPLE T1 ;RANGE CHECK FUNCTION CODE CAILE T1,NU.MAX ;... STOPCD [ERRRET (UNIFC%)],DEBUG,ETHIFC ;++INVALID FUNCTION CODE PUSHJ P,SAVE4## ;SAVE P1-P4 PUSHJ P,SAVQ## ;AND Q1-Q3 SE1ENT ;RUN IN SECTION 1 MOVE P1,T1 ;SAVE FUNCTION CODE MOVE P4,T2 ;AND ADDRESS OF UN BLOCK MOVE P2,ETHDSF(P1) ;GET FUNCTION SPECIFIC FLAGS TXNN P2,DF.PID ;VALID PORTAL ID REQUIRED? JRST ETHSR1 ;NO, SKIP CHECK LOAD T1,UNPID,(P4) ;GET PORTAL ID FROM UN BLOCK PUSHJ P,FNDEPB ;FIND ETHERNET PORTAL BLOCK POPJ P, ;ERROR, ERROR CODE IN T1 MOVX T1,EPSOPN ;GET PORTAL OPEN FLAG TXNE P2,DF.OPN ;IS PORTAL REQUIRED TO BE OPEN? TDNE T1,EPBSTS(Q2) ;YES, IS PORTAL CURRENTLY OPEN? SKIPA ;YES, CONTINUE ERRRET (UNPWS%) ;NO, PORTAL IS IN WRONG STATE MOVE T1,EPBPTY(Q2) ;GET PROTOCOL TYPE CODE CAXN T1,PT%INF ;IS THIS AN INFORMATION ONLY PORTAL? TXNN P2,DF.NIP ;YES, VALID FUNCTION FOR INFORMATION PORTALS? SKIPA ;YES, CONTINUE ERRRET (UNIFC%) ;NO, INVALID FUNCTION FOR PORTAL LDB T1,EPPSTS ;GET CURRENT PROTOCOL STATE CAIE T1,.PSENA ;IS PROTOCOL ENABLED? TXNN P2,DF.ENA ;NO, IS IT REQUIRED TO BE ENABLED? SKIPA ;EITHER ENABLED, OR NOT REQUIRED TO BE ERRRET (UNPWS%) ;YES, PORTAL IS IN WRONG STATE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ETHSR1: MOVE T1,ETHDSP(P1) ;GET ADDRESS OF FUNCTION SPECIFIC ROUTINE PUSHJ P,(T1) ;CALL FUNCTION SPECIFIC ROUTINE POPJ P, ;ERROR, ERROR CODE IN T1 CAIE P1,NU.OPN ;AN OPEN PORTAL FUNCTION? TXNE P2,DF.PID ;NO, DID FUNCTION REQUIRE A PORTAL BLOCK? SKIPA ;YES, UPDATE PORTAL RUN FLAG PJRST CPOPJ1## ;NO, JUST RETURN CAIN P1,NU.CLO ;CLOSE PORTAL FUNCTION? SKIPA T1,[.PSDIS] ;YES, GET DISABLED PROTOCOL STATE LDB T1,EPPSTS ;GET CURRENT PROTOCOL STATE CAIE T1,.PSENA ;IS PROTOCOL ENABLED? TDZA T1,T1 ;NO, CLEAR RUN FLAG MOVEI T1,1 ;YES, SET RUN FLAG STOR T1,UNRUN,(P4) ;STORE RUN FLAG PJRST CPOPJ1## ;AND RETURN ;GENERIC ERROR RETURN WHICH RELEASES EA BLOCKS ETHSRX: PUSH P,T1 ;SAVE ERROR CODE PUSHJ P,GIVEAB ;RELEASE EA BLOCK PJRST TPOPJ## ;RESTORE ERROR CODE AND RETURN ;ETHERNET FUNCTION DISPATCH TABLES DEFINE FNC,< XALL ;;LIST GENERATED TABLE DISP 0, 0, ETHIFC ;;PLACE HOLDER DISP 0, NU.OPN, ETHOPN ;;OPEN PORTAL DISP DF.PID!DF.OPN, NU.CLO, ETHCLO ;;CLOSE PORTAL DISP DF.PID!DF.OPN!DF.ENA!DF.NIP, NU.RCV, ETHRDG ;;RECEIVE DATAGRAM DISP DF.PID!DF.OPN!DF.ENA!DF.NIP, NU.XMT, ETHXDG ;;TRANSMIT DATAGRAM DISP DF.PID!DF.OPN!DF.NIP, NU.EMA, ETHEMA ;;ENABLE MULTI-CAST DISP DF.PID!DF.OPN!DF.NIP, NU.DMA, ETHDMA ;;DISABLE MULTI-CAST DISP 0, NU.RCL, ETHRCL ;;READ CHANNEL LIST DISP 0, NU.RCI, ETHRCI ;;READ CHANNEL INFO DISP DF.PID, NU.RCC, ETHRCC ;;READ CHANNEL COUNTERS DISP 0, NU.SCA, ETHSCA ;;SET CHANNEL ADDRESS DISP 0, NU.RPL, ETHRPL ;;READ PORTAL LIST DISP 0, NU.RPI, ETHRPI ;;READ PORTAL INFO DISP DF.PID, NU.RPC, ETHRPC ;;READ PORTAL COUNTERS DISP 0, NU.RKL, ETHRKL ;;READ KONTROLLER LIST DISP 0, NU.RKI, ETHRKI ;;READ KONTROLLER INFO DISP DF.PID, NU.RKC, ETHRKC ;;READ KONTROLLER COUNTERS SALL ;;TURN LISTING BACK OFF >; END DEFINE FNC ;GENERATE FUNCTION FLAGS TABLE DF.CID==400000,,000000 ;REQUIRE VALID CHANNEL ID DF.PID==200000,,000000 ;REQUIRE VALID PORTAL ID DF.KID==100000,,000000 ;REQUIRE VALID KONTROLLER ID DF.OPN==040000,,000000 ;REQUIRE PORTAL TO BE OPEN DF.ENA==020000,,000000 ;REQUIRE PORTAL TO BE ENABLED DF.NIP==010000,,000000 ;NOT VALID FOR INFORMATION ONLY PORTALS DEFINE DISP(FLAG,CODE,ADDR),< FLAG ;CODE >; END DEFINE DISP ETHDSF: FNC ;GENERATE FUNCTION FLAGS TABLE ;GENERATE FUNCTION DISPATCH TABLE DEFINE DISP(FLAG,CODE,ADDR),< IF1,>,> IFIW ADDR ;CODE >; END DEFINE DISP ETHDSP: FNC ;GENERATE FUNCTION DISPATCH TABLE IF1,>,> SUBTTL ETHERNET USER SERVICE -- OPEN PORTAL FUNCTION ;HERE TO PROCESS AN OPEN PORTAL CALL TO ETHSER ;LINKAGE: ; P4/ ADDRESS OF UN BLOCK ; PUSHJ P,ETHOPN ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS ETHOPN: MOVEI T2,EPBLEN ;GET LENGTH OF PORTAL BLOCK PUSHJ P,GETEWZ## ;ALLOCATE ZEROED CORE FOR PORTAL BLOCK STOPCD [ERRRET (UNRES%)],DEBUG,ETHCCP ;++CAN'T CREATE PORTAL BLOCK MOVE Q2,T1 ;SAVE ADDRESS IN Q2 LOAD T1,UNJCH,(P4) ;GET JCH OF PORTAL OWNER MOVEM T1,EPBJCH(Q2) ;SAVE IN PORTAL BLOCK LOAD T1,UNUID,(P4) ;GET CALLBACK ID MOVEM T1,EPBCBI(Q2) ;SAVE IN PORTAL BLOCK LOAD T1,UNCBA,(P4) ;GET CALLBACK ADDRESS MOVEM T1,EPBCBA(Q2) ;SAVE IN PORTAL BLOCK LOADE T1,UNPRO,(P4) ;GET REQUESTED PROTOCOL TYPE CODE MOVEM T1,EPBPTY(Q2) ;STORE IN PORTAL BLOCK JUMPL T1,ETHOPP ;JUMP IF PSEUDO-PROTOCOL TYPE LOAD T1,UNPAD,(P4) ;GET PROTOCOL PADDING FLAG DPB T1,EPPPAD ;STORE IN PORTAL BLOCK SETZM T1,EPBCTR+PC.SLZ(Q2) ;CLEAR SECONDS SINCE COUNTERS LAST ZEROED MOVX T1,EPSOPN ;MARK PORTAL AS CURRENTLY OPEN IORM T1,EPBSTS(Q2) ;... MOVEI T1,.PSDIS ;AND PROTOCOL AS DISABLED DPB T1,EPPSTS ;... LOAD T1,UNCHN,(P4) ;GET CHANNEL ID PUSHJ P,FNDECB ;FIND ETHERNET CHANNEL BLOCK JRST ETHOPX ;ERROR, ERROR CODE IN T1 PUSHJ P,GENPID ;GENERATE PORTAL ID MOVEM T1,EPBPID(Q2) ;STORE IN PORTAL BLOCK STOR T1,UNPID,(P4) ;ALSO STORE INTO UN BLOCK PUSHJ P,ADDEPB ;ADD PORTAL TO ETHERNET CHANNEL JRST ETHOPX ;ERROR, ERROR CODE IN T1 PUSHJ P,ETHEPT ;INITIATE ENABLE OF PROTOCOL PJRST CPOPJ1## ;AND RETURN ETHOPX: PUSH P,T1 ;SAVE ERROR CODE MOVEI T1,EPBLEN ;GET LENGTH OF PORTAL BLOCK MOVE T2,Q2 ;AND ADDRESS OF PORTAL BLOCK PUSHJ P,GIVEWS## ;RELEASE CORE PJRST TPOPJ## ;RESTORE ERROR CODE AND RETURN ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ETHOPP: CAXE T1,PT%INF ;INFORMATION PROTOCOL TYPE? ERRRET (UNIVP%,ETHOPX) ;NO, INVALID PROTOCOL TYPE MOVX T1,EPSOPN ;MARK PORTAL AS CURRENTLY OPEN IORM T1,EPBSTS(Q2) ;... MOVEI T1,.PSENA ;AND PROTOCOL AS ENABLED DPB T1,EPPSTS ;... SETZ T1, ;USE CHANNEL 0 ID PUSHJ P,FNDECB ;FIND ETHERNET CHANNEL BLOCK JRST ETHOPX ;ERROR, ERROR CODE IN T1 PUSHJ P,GENPID ;GENERATE PORTAL ID MOVEM T1,EPBPID(Q2) ;STORE IN PORTAL BLOCK STOR T1,UNPID,(P4) ;ALSO STORE INTO UN BLOCK PUSHJ P,ADDEPB ;ADD PORTAL TO INFORMATION CHANNEL JRST ETHOPX ;ERROR, ERROR CODE IN T1 PJRST CPOPJ1## ;RETURN SUBTTL ETHERNET USER SERVICE -- CLOSE PORTAL FUNCTION ;HERE TO PROCESS A CLOSE PORTAL CALL TO ETHSER ;LINKAGE: ; P4/ ADDRESS OF UN BLOCK ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; PUSHJ P,ETHCLO ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS ETHCLO: MOVX T1,EPSOPN ;MARK PORTAL AS CLOSED ANDCAM T1,EPBSTS(Q2) ;... MOVE T1,EPBPTY(Q2) ;GET PROTOCOL TYPE CODE JUMPL T1,ETHCLP ;JUMP IF PSEUDO-PROTOCOL TYPE PUSHJ P,ETHDPT ;INITIATE DISABLE OF PROTOCOL PJRST CPOPJ1## ;AND RETURN ETHCLP: PUSHJ P,DELEPB ;DELETE PORTAL BLOCK FROM ETHERNET CHANNEL JFCL ;SHOULDN'T FAIL MOVEI T1,EPBLEN ;GET LENGTH OF PORTAL BLOCK MOVE T2,Q2 ;AND ADDRESS OF PORTAL BLOCK PUSHJ P,GIVEWS## ;RELEASE PORTAL BLOCK PJRST CPOPJ1## ;AND RETURN SUBTTL ETHERNET USER SERVICE -- RECEIVE DATAGRAM FUNCTION ;HERE TO PROCESS A POST RECEIVE DATAGRAM BUFFER CALL TO ETHSER ;LINKAGE: ; P4/ ADDRESS OF UN BLOCK ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; PUSHJ P,ETHRDG ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS IFN VMC.XC-UNA.EV, IFN VMC.US-UNA.UV, IFN VMC.NO-UNA.PH, ETHRDG: PUSHJ P,SAVP3## ;SAVE P3 MOVEI T1,EK.RDG ;FUNCTION RECEIVE DATAGRAM PUSHJ P,GENEAB ;GENERATE AN EA BLOCK POPJ P, ;ERROR, ERROR CODE IN T1 LOAD T1,UNBSZ,(P4) ;GET DATAGRAM SIZE IN BYTES JUMPE T1,ETHRD1 ;JUMP IF MSD STYLE RECEIVE MOVEM T1,MD.BYT+.EAMSD(P3) ;SAVE IN MSD IN EA BLOCK LOAD T1,UNADS,(P4) ;GET ADDRESS SPACE OF DATAGRAM STOR T1,MDVMC,+.EAMSD(P3) ;STORE IN MSD DMOVE T1,UN.BFA(P4) ;GET BYTE POINTER TO DATA PUSHJ P,GTWGBP ;GENERATE A TWO WORD GLOBAL BYTE POINTER MOVEM T1,MD.AUX+.EAMSD(P3) ;SAVE P&S PORTION OF BYTE POINTER MOVEM T2,MD.ALA+.EAMSD(P3) ;AND ADDRESS PORTION OF BYTE POINTER JRST ETHRD2 ;CONTINUE ETHRD1: MOVE T1,UN.BFA(P4) ;GET ADDRESS OF FIRST MSD MOVEM T1,MD.NXT+.EAMSD(P3) ;SAVE IN MSD OF EA BLOCK ETHRD2: LOAD T2,UNRID,(P4) ;GET COMPLETION DATA DMOVE T3,UN.BFA(P4) ;... XMOVEI T1,ETCRDG ;GET ADDRESS OF COMPLETION ROUTINE PUSHJ P,CALKON ;CALL KONTROLLER PJRST ETHSRX ;ERROR, ERROR CODE IN T1 AOS EPBRBC(Q2) ;INCREMENT COUNT OF CURRENT RECEIVE BUFFERS PJRST CPOPJ1## ;RETURN ;HERE TO PROCESS RECEIVE DATAGRAM COMPLETION INTERRUPT ;LINKAGE: (CALLED AT INTERRUPT LEVEL) ; T2/ USER'S REQUEST ID ; T3-T4/ USER'S ORIGINAL BUFFER POINTER ; P3/ ADDRESS OF EA BLOCK ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; PUSHJ P,ETCRDG ;RETURNS: ; CPOPJ ALWAYS ETCRDG: PUSHJ P,SAVP4## ;SAVE P4 XMOVEI P4,EPBCBU(Q2) ;GET ADDRESS OF CALLBACK UN BLOCK STOR T2,UNRID,(P4) ;STORE USER'S REQUEST ID DMOVEM T3,UN.BFA(P4) ;AND USER'S ORIGINAL BUFFER POINTER SOS EPBRBC(Q2) ;DECREMENT COUNT OF CURRENT RECEIVE BUFFERS MOVE T1,.EADPT(P3) ;GET PROTOCOL TYPE STOR T1,UNPRO,(P4) ;STORE IN UN BLOCK MOVE T1,.EADSZ(P3) ;GET SIZE OF RECEIVED DATAGRAM STOR T1,UNBSZ,(P4) ;STORE IN UN BLOCK DMOVE T1,.EADSA(P3) ;GET SOURCE ADDRESS OF DATAGRAM DMOVEM T1,UN.SAD(P4) ;STORE IN UN BLOCK DMOVE T1,.EADDA(P3) ;GET DESTINATION ADDRESS OF DATAGRAM DMOVEM T1,UN.DAD(P4) ;STORE IN UN BLOCK TXNN T1, ;IS DESTINATION A MULTI-CAST ADDRESS? JRST ETCRD1 ;NO, ACCEPT DATAGRAM MOVE T3,EPBPTY(Q2) ;GET PROTOCOL TYPE CAXN T3,PT%PRM ;PORTAL RUNNING IN PROMISCUOUS MODE? JRST ETCRD1 ;YES, ACCEPT DATAGRAM PUSHJ P,FNDMCA ;FIND MULTI-CAST ADDRESS BLOCK SKIPA ;NONE, PORTAL NOT ENABLED FOR THIS ADDRESS JRST ETCRD1 ;FOUND IT, CONTINUE MOVEI T1,UNIMA% ;GET INVALID MULTICAST ADDRESS ERROR MOVEM T1,.EADST(P3) ;STORE IN EA BLOCK ETCRD1: MOVE T1,.EADSZ(P3) ;GET SIZE OF DATAGRAM IN BYTES ADDM T1,EPBCTR+PC.BYR(Q2) ;UPDATE TOTAL BYTES RECEIVED ADDM T1,%EIBYR ;... AOS EPBCTR+PC.DGR(Q2) ;AND TOTAL DATAGRAMS RECEIVED AOS %EIDGR ;... MOVEI T1,NU.RCV ;GIVE USER RECEIVE DONE CALLBACK MOVE T3,.EADST(P3) ;GET DATAGRAM STATUS PUSHJ P,CALUSR ;GIVE CALLBACK PJRST GIVEAB ;RELEASE EA BLOCK AND RETURN SUBTTL ETHERNET USER SERVICE -- TRANSMIT DATAGRAM FUNCTION ;HERE TO PROCESS A TRANSMIT DATAGRAM CALL TO ETHSER ;LINKAGE: ; P4/ ADDRESS OF UN BLOCK ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; PUSHJ P,ETHXDG ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS IFN VMC.XC-UNA.EV, IFN VMC.US-UNA.UV, IFN VMC.NO-UNA.PH, ETHXDG: PUSHJ P,SAVP3## ;SAVE P3 MOVEI T1,EK.XDG ;FUNCTION TRANSMIT DATAGRAM PUSHJ P,GENEAB ;GENERATE AN EA BLOCK POPJ P, ;ERROR, ERROR CODE IN T1 DMOVE T1,ECBEAD(Q1) ;GET SOURCE ETHERNET ADDRESS DMOVEM T1,.EADSA(P3) ;STORE IN EA BLOCK DMOVE T1,UN.DAD(P4) ;GET DESTINATION ETHERNET ADDRESS DMOVEM T1,.EADDA(P3) ;STORE IN EA BLOCK LOAD T1,UNBSZ,(P4) ;GET DATAGRAM SIZE IN BYTES JUMPE T1,ETHXD1 ;JUMP IF MSD STYLE TRANSMIT MOVEM T1,MD.BYT+.EAMSD(P3) ;SAVE IN MSD IN EA BLOCK LOAD T1,UNADS,(P4) ;GET ADDRESS SPACE OF DATAGRAM STOR T1,MDVMC,+.EAMSD(P3) ;STORE IN MSD DMOVE T1,UN.BFA(P4) ;GET BYTE POINTER TO DATA PUSHJ P,GTWGBP ;GENERATE A TWO WORD GLOBAL BYTE POINTER MOVEM T1,MD.AUX+.EAMSD(P3) ;SAVE P&S PORTION OF BYTE POINTER MOVEM T2,MD.ALA+.EAMSD(P3) ;AND ADDRESS PORTION OF BYTE POINTER JRST ETHXD2 ;CONTINUE ETHXD1: MOVE T1,UN.BFA(P4) ;GET ADDRESS OF FIRST MSD MOVEM T1,MD.NXT+.EAMSD(P3) ;SAVE IN MSD OF EA BLOCK ETHXD2: LOAD T2,UNRID,(P4) ;GET COMPLETION DATA DMOVE T3,UN.BFA(P4) ;... XMOVEI T1,ETCXDG ;GET ADDRESS OF COMPLETION ROUTINE PUSHJ P,CALKON ;CALL KONTROLLER PJRST ETHSRX ;ERROR, ERROR CODE IN T1 AOS EPBXBC(Q2) ;INCREMENT COUNT OF CURRENT TRANSMIT BUFFERS PJRST CPOPJ1## ;RETURN ;HERE TO PROCESS TRANSMIT DATAGRAM COMPLETION INTERRUPT ;LINKAGE: (CALLED AT INTERRUPT LEVEL) ; T2/ USER'S REQUEST ID ; T3-T4/ USER'S ORIGINAL BUFFER POINTER ; P3/ ADDRESS OF EA BLOCK ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; PUSHJ P,ETCXDG ;RETURNS: ; CPOPJ ALWAYS ETCXDG: PUSHJ P,SAVP4## ;SAVE P4 XMOVEI P4,EPBCBU(Q2) ;GET ADDRESS OF CALLBACK UN BLOCK STOR T2,UNRID,(P4) ;STORE USER'S REQUEST ID DMOVEM T3,UN.BFA(P4) ;AND ORIGINAL BUFFER POINTER SOS EPBXBC(Q2) ;DECREMENT COUNT OF CURRENT TRANSMIT BUFFERS MOVE T1,.EADPT(P3) ;GET PROTOCOL TYPE STOR T1,UNPRO,(P4) ;STORE IN UN BLOCK MOVE T1,.EADSZ(P3) ;GET SIZE OF TRANSMITTED DATAGRAM STOR T1,UNBSZ,(P4) ;STORE IN UN BLOCK DMOVE T1,.EADDA(P3) ;GET DESTINATION ADDRESS OF DATAGRAM DMOVEM T1,UN.DAD(P4) ;STORE IN UN BLOCK DMOVE T1,.EADSA(P3) ;GET SOURCE ADDRESS OF DATAGRAM DMOVEM T1,UN.SAD(P4) ;STORE IN UN BLOCK MOVE T1,.EADSZ(P3) ;GET DATAGRAM SIZE IN BYTES ADDM T1,EPBCTR+PC.BYX(Q2) ;UPDATE TOTAL BYTES TRANSMITTED ADDM T1,%EIBYX ;... AOS EPBCTR+PC.DGX(Q2) ;AND TOTAL DATAGRAMS TRANSMITTED AOS %EIDGX ;... MOVEI T1,NU.XMT ;GIVE USER TRANSMIT DONE CALLBACK MOVE T3,.EADST(P3) ;GET DATAGRAM STATUS PUSHJ P,CALUSR ;GIVE CALLBACK PJRST GIVEAB ;RELEASE EA BLOCK AND RETURN SUBTTL ETHERNET USER SERVICE -- ENABLE MULTI-CAST ADDRESS FUNCTION ;HERE TO PROCESS AN ENABLE MULTI-CAST ADDRESS CALL TO ETHSER ;LINKAGE: ; P4/ ADDRESS OF UN BLOCK ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; PUSHJ P,ETHEMA ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS ETHEMA: DMOVE T1,UN.DAD(P4) ;GET MULTI-CAST ADDRESS FROM UN BLOCK PJRST ADDMCA ;ADD MULTI-CAST ADDRESS TO PORTAL AND RETURN SUBTTL ETHERNET USER SERVICE -- DISABLE MULTI-CAST ADDRESS FUNCTION ;HERE TO PROCESS A DISABLE MULTI-CAST ADDRESS CALL TO ETHSER ;LINKAGE: ; P4/ ADDRESS OF UN BLOCK ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; PUSHJ P,ETHDMA ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS ETHDMA: DMOVE T1,UN.DAD(P4) ;GET MULTI-CAST ADDRESS FROM UN BLOCK PJRST DELMCA ;DELETE MULTI-CAST ADDRESS BLOCK AND RETURN SUBTTL ETHERNET USER SERVICE -- READ CHANNEL LIST FUNCTION ;HERE TO PROCESS A READ CHANNEL LIST CALL TO ETHSER ;LINKAGE: ; P4/ ADDRESS OF UN BLOCK ; PUSHJ P,ETHRCL ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS ETHRCL: XMOVEI Q1,%EICHN-ECBSYS ;GET FIRST-1 CHANNEL BLOCK ADDRESS XMOVEI T1,ETXRCL ;AND ADDRESS OF READ CHANNEL LIST ROUTINE PJRST ETHRXL ;READ CHANNEL LIST AND RETURN ;ROUTINE CALLED BY ETHRXL TO READ NEXT CHANNEL'S STATUS WORD ETXRCL: MOVE Q1,ECBSYS(Q1) ;GET ADDRESS OF NEXT CHANNEL BLOCK PJUMPE Q1,CPOPJ## ;RETURN IF AT END OF LIST AOS (P) ;PRESET SKIP RETURN PJRST GENCSW ;GENERATE CHANNEL STATUS WORD AND RETURN SUBTTL ETHERNET USER SERVICE -- READ CHANNEL INFORMATION FUNCTION ;HERE TO PROCESS A READ CHANNEL INFORMATION CALL TO ETHSER ;LINKAGE: ; P4/ ADDRESS OF UN BLOCK ; PUSHJ P,ETHRCI ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS ETHRCI: LOAD T1,UNSID,(P4) ;GET CHANNEL ID PUSHJ P,FNDECB ;FIND ETHERNET CHANNEL BLOCK POPJ P, ;ERROR, ERROR CODE IN T1 PUSHJ P,GENCSW ;GENERATE CHANNEL STATUS WORD STOR T1,UNSID,(P4) ;STORE FOR CALLER DMOVE T1,ECBEAD(Q1) ;GET CURRENT CHANNEL ETHERNET ADDRESS DMOVEM T1,UN.CAR(P4) ;STORE IN UN BLOCK SETZB T1,T2 ;ZERO PRIMARY HARDWARE ETHERNET ADDRESS SKIPE Q3,ECBEKB(Q1) ;GET ADDRESS OF PRIMARY ETHERNET KONTROLLER DMOVE T1,EKBHEA(Q3) ;GET PRIMARY HARDWARE KONTROLLER ADDRESS DMOVEM T1,UN.HAD(P4) ;STORE IN UN BLOCK MOVEI T1,RCITLN ;GET LENGTH OF CHANNEL INFORMATION TABLE XMOVEI T2,RCITAB ;AND ADDRESS OF CHANNEL INFORMATION TABLE PJRST ETHRXI ;STORE CHANNEL INFORMATION AND RETURN ;TABLE OF INSTRUCTIONS FOR FETCHING CHANNEL INFORMATION DEFINE INF(CODE,INST),< IF1,>,> EXP INST ;;INSTRUCTION TO FETCH VALUE >; END DEFINE INF RCITAB: INF , ;CHANNEL NUMBER INF , ;CURRENT ETHERNET ADDRESS INF , ;... RCITLN==.-RCITAB ;LENGTH OF CHANNEL INFORMATION TABLE IF1,>,> SUBTTL ETHERNET USER SERVICE -- READ CHANNEL COUNTERS FUNCTION ;HERE TO PROCESS A READ CHANNEL COUNTERS CALL TO ETHSER ;LINKAGE: ; P4/ ADDRESS OF UN BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; PUSHJ P,ETHRCC ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS ETHRCC: PUSHJ P,SAVP3## ;SAVE P3 PUSHJ P,SAVQ## ;SAVE Q1-Q3 LOAD T1,UNSID,(P4) ;GET CHANNEL ID PUSHJ P,FNDECB ;FIND ETHERNET CHANNEL BLOCK POPJ P, ;ERROR, ERROR CODE IN T1 PUSHJ P,GENCSW ;GENERATE CHANNEL STATUS WORD STOR T1,UNSID,(P4) ;STORE FOR CALLER MOVEI T1,EK.RKC ;FUNCTION READ AND CLEAR KONTROLLER COUNTERS PUSHJ P,GENEAB ;GENERATE AN EA BLOCK POPJ P, ;ERROR, ERROR CODE IN T1 MOVEI T2,KC.LEN ;GET LENGTH OF COUNTERS AREA MOVEM T2,.EACBS(P3) ;SAVE IN EA BLOCK PUSHJ P,GETEWZ## ;GET BUFFER TO READ COUNTERS INTO ERRRET (UNRES%,ETHSRX) ;RESOURCE ERROR, RETURN MOVEM T1,.EACBA(P3) ;SAVE BUFFER ADDRESS IN EA BLOCK LOAD T2,UNRID,(P4) ;GET COMPLETION DATA LOAD T3,UNBSZ,(P4) ;... LOAD T4,UNZRO,(P4) ;... DPB T4,[POINT 1,T3,0] ;... MOVE T4,UN.BFA(P4) ;... PUSHJ P,ETXRCC ;INITIATE READING OF CHANNEL COUNTERS PJRST CPOPJ1## ;AND RETURN ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;HERE TO READ EACH KONTROLLER'S COUNTERS ETXRCC: SKIPA Q3,ECBEKB(Q1) ;GET ADDRESS OF FIRST ETHERNET KONTROLLER ETXRC1: MOVE Q3,EKBNXT(Q3) ;GET ADDRESS OF NEXT ETHERNET KONTROLLER JUMPE Q3,ETCRCC ;IF NO MORE KONTROLLERS, RETURN COUNTERS XMOVEI T1,ETXRC2 ;GET ADDRESS OF COMPLETION ROUTINE PUSHJ P,CALKON ;CALL KONTROLLER JRST ETXRC1 ;ERROR, LOOP BACK FOR NEXT KONTROLLER POPJ P, ;RETURN ;HERE TO PROCESS READ AND CLEAR KONTROLLER COUNTERS COMPLETION INTERRUPT ETXRC2: PUSH P,T2 ;SAVE CALLBACK INFORMATION PUSH P,T3 ;... PUSH P,T4 ;... MOVEI T1,KC.LEN ;GET LENGTH OF COUNTERS AREA MOVE T2,UKCUAP ;GET POINTER TO COUNTERS UPDATE ACTION TABLE MOVE T3,.EACBA(P3) ;GET ADDRESS OF COUNTERS BUFFER XMOVEI T4,EKBCTR(Q3) ;AND ADDRESS OF KONTROLLER COUNTERS BLOCK PUSHJ P,UPDCTR ;UPDATE KONTROLLER'S COUNTERS MOVEI T1,KC.LEN ;GET LENGTH OF COUNTERS AREA MOVE T2,UKCUAP ;GET POINTER TO COUNTERS UPDATE ACTION TABLE MOVE T3,.EACBA(P3) ;GET ADDRESS OF COUNTERS BUFFER XMOVEI T4,ECBCTR(Q1) ;AND ADDRESS OF CHANNEL COUNTERS BLOCK PUSHJ P,UPDCTR ;UPDATE CHANNEL'S COUNTERS POP P,T4 ;RESTORE CALLBACK INFORMATION POP P,T3 ;... POP P,T2 ;... JRST ETXRC1 ;LOOP BACK FOR ALL KONTROLLERS ;HERE TO PROCESS READ CHANNEL COUNTERS COMPLETION INTERRUPT ;LINKAGE: (CALLED AT INTERRUPT LEVEL) ; T2/ USER'S REQUEST ID ; T3/ LENGTH OF USER'S COUNTERS BUFFER (BIT 0 IS ZERO FLAG) ; T4/ ADDRESS OF USER'S COUNTERS BUFFER ; P3/ ADDRESS OF EA BLOCK ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; PUSHJ P,ETCRCC ;RETURNS: ; CPOPJ ALWAYS ETCRCC: PUSHJ P,SAVP4## ;SAVE P4 XMOVEI P4,EPBCBU(Q2) ;GET ADDRESS OF CALLBACK UN BLOCK STOR T2,UNRID,(P4) ;STORE USER'S REQUEST ID MOVEM T4,UN.BFA(P4) ;STORE ADDRESS OF USER'S COUNTERS BUFFER LDB T4,[POINT 1,T3,0] ;GET ZERO FLAG STOR T4,UNZRO,(P4) ;STORE IN UN BLOCK TLZ T3,(1B0) ;CLEAR ZERO FLAG CAILE T3,CC.LEN ;BUFFER LARGER THAN COUNTERS AREA? MOVEI T3,CC.LEN ;YES, USE LENGTH OF COUNTERS AREA STOR T3,UNBSZ,(P4) ;STORE NUMBER OF COUNTERS RETURNED MOVE T1,T3 ;GET LENGTH OF USER BUFFER AREA XMOVEI T2,ECBCTR(Q1) ;GET ADDRESS OF COUNTERS AREA MOVE T3,UN.BFA(P4) ;AND ADDRESS OF USER BUFFER AREA EXTEND T1,[XBLT] ;COPY COUNTERS TO USER BUFFER LOAD T1,UNZRO,(P4) ;GET ZERO COUNTERS FLAG JUMPE T1,ETCRC2 ;JUMP IF JUST READING COUNTERS MOVEI T1,CC.LEN-1 ;ZERO CHANNEL COUNTERS BLOCK XMOVEI T2,ECBCTR(Q1) ;... XMOVEI T3,ECBCTR+1(Q1) ;... SETZM ECBCTR(Q1) ;ZERO FIRST WORD OF BLOCK EXTEND T1,[XBLT] ;ZERO REMAINDER ETCRC2: MOVEI T1,NU.RCC ;GET READ CHANNEL COUNTERS CALLBACK SETZ T3, ;AND VALID DATA STATUS RETURN CODE PUSHJ P,CALUSR ;... MOVEI T1,KC.LEN ;GET LENGTH OF COUNTERS BUFFER MOVE T2,.EACBA(P3) ;AND ADDRESS OF BUFFER PUSHJ P,GIVEWS## ;RELEASE COUNTERS BUFFER PJRST GIVEAB ;RELEASE EA BLOCK AND RETURN SUBTTL ETHERNET USER SERVICE -- SET CHANNEL ADDRESS FUNCTION ;HERE TO PROCESS A SET CHANNEL ADDRESS CALL TO ETHSER ;LINKAGE: ; P4/ ADDRESS OF UN BLOCK ; PUSHJ P,ETHSCA ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS ETHSCA: PUSHJ P,SAVP3## ;SAVE P3 LOAD T1,UNSID,(P4) ;GET CHANNEL ID PUSHJ P,FNDECB ;FIND ETHERNET CHANNEL BLOCK POPJ P, ;ERROR, ERROR CODE IN T1 PUSHJ P,GENCSW ;GENERATE CHANNEL STATUS WORD STOR T1,UNSID,(P4) ;STORE FOR CALLER DMOVE T1,UN.DAD(P4) ;GET NEW ETHERNET ADDRESS TXNE T1, ;IS THIS A MULTI-CAST ADDRESS? ERRRET (UNICA%) ;YES, ILLEGAL CHANNEL ADDRESS DMOVEM T1,ECBEAD(Q1) ;STORE NEW ETHERNET ADDRESS ETHLOK ;INTERLOCK AGAINST SMP RACES SKIPA Q3,ECBEKB(Q1) ;GET ADDRESS OF FIRST KONTROLLER BLOCK ETHSA1: MOVE Q3,EKBNXT(Q3) ;GET ADDRESS OF NEXT KONTROLLER BLOCK JUMPE Q3,ETHSA2 ;EXIT LOOP AT END OF LIST MOVX T1,EKSSEA ;SET FLAG FOR CLOCK LEVEL TO SET ADDRESS IORM T1,EKBSTS(Q3) ;... JRST ETHSA1 ;LOOP BACK FOR ALL KONTROLLERS ETHSA2: ETHULK ;RELEASE SMP INTERLOCK PJRST CPOPJ1## ;AND RETURN ;HERE TO PROCESS SET ETHERNET ADDRESS COMPLETION INTERRUPT ;LINKAGE: (CALLED AT INTERRUPT LEVEL) ; P3/ ADDRESS OF EA BLOCK ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; PUSHJ P,ETCSCA ;RETURNS: ; CPOPJ ALWAYS ETCSCA: PUSHJ P,SAVP4## ;SAVE P4 ETHLOK ;INTERLOCK AGAINST SMP RACES SKIPA Q2,ECBEPB(Q1) ;GET ADDRESS OF FIRST PORTAL BLOCK ETCSA1: MOVE Q2,EPBNXT(Q2) ;GET ADDRESS OF NEXT PORTAL BLOCK PJUMPE Q2,UNLETH## ;RETURN AT END OF LIST CAME Q3,EPBEKB(Q2) ;THIS PORTAL USING THIS KONTROLLER? JRST ETCSA2 ;NO, SKIP THIS PORTAL XMOVEI P4,EPBCBU(Q2) ;GET ADDRESS OF CALLBACK UN BLOCK SETZ T1, ;STORE REQUEST ID OF ZERO STOR T1,UNRID,(P4) ;... DMOVE T1,ECBEAD(Q1) ;GET NEW CHANNEL ADDRESS DMOVEM T1,UN.DAD(P4) ;STORE IN UN BLOCK MOVEI T1,NU.SCA ;GIVE USER SET CHANNEL ADDRESS CALLBACK PUSHJ P,CALUSR ;GIVE CALLBACK ETCSA2: JRST ETCSA1 ;LOOP BACK FOR ALL PORTALS SUBTTL ETHERNET USER SERVICE -- READ PORTAL LIST FUNCTION ;HERE TO PROCESS A READ PORTAL LIST CALL TO ETHSER ;LINKAGE: ; P4/ ADDRESS OF UN BLOCK ; PUSHJ P,ETHRPL ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS ETHRPL: LOAD T1,UNSID,(P4) ;GET CHANNEL ID PUSHJ P,FNDECB ;FIND ETHERNET CHANNEL BLOCK POPJ P, ;ERROR, ERROR CODE IN T1 PUSHJ P,GENCSW ;GENERATE CHANNEL STATUS WORD STOR T1,UNSID,(P4) ;STORE FOR CALLER XMOVEI Q2,ECBEPB-EPBNXT(Q1) ;GET FIRST-1 PORTAL BLOCK ADDRESS XMOVEI T1,ETXRPL ;AND ADDRESS OF READ PORTAL LIST ROUTINE PJRST ETHRXL ;READ PORTAL LIST AND RETURN ;ROUTINE CALLED BY ETHRXL TO READ NEXT PORTAL'S STATUS WORD ETXRPL: MOVE Q2,EPBNXT(Q2) ;GET ADDRESS OF NEXT PORTAL BLOCK PJUMPE Q2,CPOPJ## ;RETURN IF AT END OF LIST AOS (P) ;PRESET SKIP RETURN PJRST GENPSW ;GENERATE PORTAL STATUS WORD AND RETURN SUBTTL ETHERNET USER SERVICE -- READ PORTAL INFORMATION FUNCTION ;HERE TO PROCESS A READ PORTAL INFORMATION CALL TO ETHSER ;LINKAGE: ; P4/ ADDRESS OF UN BLOCK ; PUSHJ P,ETHRPI ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS ETHRPI: LOAD T1,UNSID,(P4) ;GET PORTAL ID PUSHJ P,FNDEPB ;FIND ETHERNET PORTAL BLOCK POPJ P, ;ERROR, ERROR CODE IN T1 PUSHJ P,GENPSW ;GENERATE PORTAL STATUS WORD STOR T1,UNSID,(P4) ;STORE FOR CALLER MOVX T1,EPSOPN ;IS PORTAL CURRENTLY OPEN? TDNN T1,EPBSTS(Q2) ;... ERRRET (UNPWS%) ;NO, PORTAL IS IN WRONG STATE MOVEI T1,RPITLN ;GET LENGTH OF PORTAL INFORMATION TABLE XMOVEI T2,RPITAB ;AND ADDRESS OF PORTAL INFORMATION TABLE PJRST ETHRXI ;STORE PORTAL INFORMATION AND RETURN ;TABLE OF INSTRUCTIONS FOR FETCHING PORTAL INFORMATION DEFINE INF(CODE,INST),< IF1,>,> EXP INST ;;INSTRUCTION TO FETCH VALUE >; END DEFINE INF RPITAB: INF , ;JCH OF PORTAL OWNER INF , ;PROTOCOL IDENTIFICATION WORD INF , ;CHANNEL STATUS WORD INF , ;KONTROLLER STATUS WORD RPITLN==.-RPITAB ;LENGTH OF PORTAL INFORMATION TABLE IF1,>,> ;ROUTINE TO COMPUTE PROTOCOL IDENTIFICATION WORD RPIPIW: LDB T1,EPPPAD ;GET PADDING FLAG ROT T1,-1 ;POSITION INTO SIGN BIT ADD T1,EPBPTY(Q2) ;ADD IN PROTOCOL TYPE POPJ P, ;AND RETURN SUBTTL ETHERNET USER SERVICE -- READ PORTAL COUNTERS FUNCTION ;HERE TO PROCESS A READ PORTAL COUNTERS CALL TO ETHSER ;LINKAGE: ; P4/ ADDRESS OF UN BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; PUSHJ P,ETHRPC ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS ETHRPC: PUSHJ P,SAVP3## ;SAVE P3 PUSHJ P,SAVQ## ;SAVE Q1-Q3 MOVEI T1,EK.RPC ;FUNCTION READ AND CLEAR PORTAL COUNTERS PUSHJ P,GENEAB ;GENERATE AN EA BLOCK POPJ P, ;ERROR, ERROR CODE IN T1 LOAD T1,UNSID,(P4) ;GET PORTAL ID PUSHJ P,FNDEPB ;FIND ETHERNET PORTAL BLOCK PJRST ETHSRX ;ERROR, ERROR CODE IN T1 PUSHJ P,GENPSW ;GENERATE PORTAL STATUS WORD STOR T1,UNSID,(P4) ;STORE FOR CALLER MOVX T1,EPSOPN ;IS PORTAL CURRENTLY OPEN? TDNN T1,EPBSTS(Q2) ;... ERRRET (UNPWS%,ETHSRX) ;NO, PORTAL IS IN WRONG STATE MOVEI T1,PC.LEN ;GET LENGTH OF COUNTERS AREA MOVEM T1,.EACBS(P3) ;SAVE IN EA BLOCK XMOVEI T1,EPBCTR(Q2) ;GET ADDRESS OF COUNTERS AREA MOVEM T1,.EACBA(P3) ;SAVE IN EA BLOCK LOAD T2,UNRID,(P4) ;GET COMPLETION DATA LOAD T3,UNBSZ,(P4) ;... LOAD T4,UNZRO,(P4) ;... DPB T4,[POINT 1,T3,0] ;... MOVE T4,UN.BFA(P4) ;... XMOVEI T1,ETCRPC ;GET ADDRESS OF COMPLETION ROUTINE PUSHJ P,CALKON ;CALL KONTROLLER PUSHJ P,ETCRPC ;ERROR, GO RETURN COUNTERS PJRST CPOPJ1## ;AND RETURN ;HERE TO PROCESS READ PORTAL COUNTERS COMPLETION INTERRUPT ;LINKAGE: (CALLED AT INTERRUPT LEVEL) ; T2/ USER'S REQUEST ID ; T3/ LENGTH OF USER'S COUNTERS BUFFER (BIT 0 IS ZERO FLAG) ; T4/ ADDRESS OF USER'S COUNTERS BUFFER ; P3/ ADDRESS OF EA BLOCK ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; PUSHJ P,ETCRPC ;RETURNS: ; CPOPJ ALWAYS ETCRPC: PUSHJ P,SAVP4## ;SAVE P4 XMOVEI P4,EPBCBU(Q2) ;GET ADDRESS OF CALLBACK UN BLOCK STOR T2,UNRID,(P4) ;STORE USER'S REQUEST ID MOVEM T4,UN.BFA(P4) ;STORE ADDRESS OF USER'S COUNTERS BUFFER LDB T4,[POINT 1,T3,0] ;GET ZERO FLAG STOR T4,UNZRO,(P4) ;STORE IN UN BLOCK TLZ T3,(1B0) ;CLEAR ZERO FLAG CAILE T3,PC.LEN ;BUFFER LARGER THAN COUNTERS AREA? MOVEI T3,PC.LEN ;YES, USE LENGTH OF COUNTERS AREA STOR T3,UNBSZ,(P4) ;STORE NUMBER OF COUNTERS RETURNED MOVE T1,T3 ;GET LENGTH OF USER BUFFER AREA MOVE T2,.EACBA(P3) ;GET ADDRESS OF COUNTERS AREA MOVE T3,UN.BFA(P4) ;AND ADDRESS OF USER BUFFER AREA EXTEND T1,[XBLT] ;COPY COUNTERS TO USER BUFFER LOAD T1,UNZRO,(P4) ;GET ZERO COUNTERS FLAG JUMPE T1,ETCRP2 ;JUMP IF JUST READING COUNTERS MOVEI T1,PC.LEN-1 ;ZERO PORTAL COUNTERS BLOCK MOVE T2,.EACBA(P3) ;... XMOVEI T3,1(T2) ;... SETZM (T2) ;ZERO FIRST WORD OF BLOCK EXTEND T1,[XBLT] ;ZERO REMAINDER ETCRP2: MOVEI T1,NU.RPC ;GET READ PORTAL COUNTERS CALLBACK SETZ T3, ;AND VALID DATA STATUS RETURN CODE PUSHJ P,CALUSR ;... PJRST GIVEAB ;RELEASE EA BLOCK AND RETURN SUBTTL ETHERNET USER SERVICE -- READ KONTROLLER LIST ;HERE TO PROCESS A READ KONTROLLER LIST CALL TO ETHSER ;LINKAGE: ; P4/ ADDRESS OF UN BLOCK ; PUSHJ P,ETHRKL ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS ETHRKL: LOAD T1,UNSID,(P4) ;GET CHANNEL ID PUSHJ P,FNDECB ;FIND ETHERNET CHANNEL BLOCK POPJ P, ;ERROR, ERROR CODE IN T1 PUSHJ P,GENCSW ;GENERATE CHANNEL STATUS WORD STOR T1,UNSID,(P4) ;STORE FOR CALLER XMOVEI Q3,ECBEKB-EKBNXT(Q1) ;GET FIRST-1 KONTROLLER BLOCK ADDRESS XMOVEI T1,ETXRKL ;AND ADDRESS OF READ KONTROLLER LIST ROUTINE PJRST ETHRXL ;READ KONTROLLER LIST AND RETURN ;ROUTINE CALLED BY ETHRXL TO READ NEXT KONTROLLER'S STATUS WORD ETXRKL: MOVE Q3,EKBNXT(Q3) ;GET ADDRESS OF NEXT KONTROLLER BLOCK PJUMPE Q3,CPOPJ## ;RETURN IF AT END OF LIST AOS (P) ;PRESET SKIP RETURN PJRST GENKSW ;GENERATE KONTROLLER STATUS WORD AND RETURN SUBTTL ETHERNET USER SERVICE -- READ KONTROLLER INFORMATION ;HERE TO PROCESS A READ KONTROLLER INFORMATION CALL TO ETHSER ;LINKAGE: ; P4/ ADDRESS OF UN BLOCK ; PUSHJ P,ETHRKI ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS ETHRKI: LOAD T1,UNSID,(P4) ;GET KONTROLLER ID PUSHJ P,FNDEKB ;FIND ETHERNET KONTROLLER BLOCK POPJ P, ;ERROR, ERROR CODE IN T1 PUSHJ P,GENKSW ;GENERATE KONTROLLER STATUS WORD STOR T1,UNSID,(P4) ;STORE FOR CALLER MOVEI T1,RKITLN ;GET LENGTH OF KONTROLLER INFORMATION TABLE XMOVEI T2,RKITAB ;AND ADDRESS OF KONTROLLER INFORMATION TABLE PJRST ETHRXI ;STORE KONTROLLER INFORMATION AND RETURN ;TABLE OF INSTRUCTIONS FOR FETCHING KONTROLLER INFORMATION DEFINE INF(CODE,INST),< IF1,>,> EXP INST ;;INSTRUCTION TO FETCH VALUE >; END DEFINE INF RKITAB: INF , ;CHANNEL STATUS WORD INF , ;CPU NUMBER OF KONTROLLER INF , ;KONTROLLER TYPE INF , ;KONTROLLER NUMBER INF , ;HARDWARE ETHERNET ADDRESS INF , ;HARDWARE ETHERNET ADDRESS RKITLN==.-RKITAB ;LENGTH OF KONTROLLER INFORMATION TABLE IF1,>,> SUBTTL ETHERNET USER SERVICE -- READ KONTROLLER COUNTERS ;HERE TO PROCESS A READ KONTROLLER COUNTERS CALL TO ETHSER ;LINKAGE: ; P4/ ADDRESS OF UN BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; PUSHJ P,ETHRKC ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS ETHRKC: PUSHJ P,SAVP3## ;SAVE P3 LOAD T1,UNSID,(P4) ;GET KONTROLLER ID PUSHJ P,FNDEKB ;FIND ETHERNET KONTROLLER BLOCK POPJ P, ;ERROR, ERROR CODE IN T1 PUSHJ P,GENKSW ;GENERATE KONTROLLER STATUS WORD STOR T1,UNSID,(P4) ;STORE FOR CALLER MOVEI T1,EK.RKC ;FUNCTION READ AND CLEAR KONTROLLER COUNTERS PUSHJ P,GENEAB ;GENERATE AN EA BLOCK POPJ P, ;ERROR, ERROR CODE IN T1 MOVEI T2,KC.LEN ;GET LENGTH OF COUNTERS AREA MOVEM T2,.EACBS(P3) ;SAVE IN EA BLOCK PUSHJ P,GETEWZ## ;GET BUFFER TO READ COUNTERS INTO ERRRET (UNRES%,ETHSRX) ;RESOURCE ERROR, RETURN MOVEM T1,.EACBA(P3) ;SAVE BUFFER ADDRESS IN EA BLOCK LOAD T2,UNRID,(P4) ;GET COMPLETION DATA LOAD T3,UNBSZ,(P4) ;... LOAD T4,UNZRO,(P4) ;... DPB T4,[POINT 1,T3,0] ;... MOVE T4,UN.BFA(P4) ;... PUSHJ P,ETXRKC ;INITIATE READING OF KONTROLLER COUNTERS PJRST CPOPJ1## ;AND RETURN ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;HERE TO READ KONTROLLER'S COUNTERS ETXRKC: XMOVEI T1,ETXRK1 ;GET ADDRESS OF COMPLETION ROUTINE PUSHJ P,CALKON ;CALL KONTROLLER PJRST ETCRKC ;ERROR, GO RETURN COUNTERS POPJ P, ;RETURN ;HERE TO PROCESS READ AND CLEAR KONTROLLER COUNTERS COMPLETION INTERRUPT ETXRK1: PUSH P,T2 ;SAVE CALLBACK INFORMATION PUSH P,T3 ;... PUSH P,T4 ;... MOVEI T1,KC.LEN ;GET LENGTH OF COUNTERS AREA MOVE T2,UKCUAP ;GET POINTER TO COUNTERS UPDATE ACTION TABLE MOVE T3,.EACBA(P3) ;GET ADDRESS OF COUNTERS BUFFER XMOVEI T4,EKBCTR(Q3) ;AND ADDRESS OF KONTROLLER COUNTERS BLOCK PUSHJ P,UPDCTR ;UPDATE KONTROLLER'S COUNTERS MOVEI T1,KC.LEN ;GET LENGTH OF COUNTERS AREA MOVE T2,UKCUAP ;GET POINTER TO COUNTERS UPDATE ACTION TABLE MOVE T3,.EACBA(P3) ;GET ADDRESS OF COUNTERS BUFFER XMOVEI T4,ECBCTR(Q1) ;AND ADDRESS OF CHANNEL COUNTERS BLOCK PUSHJ P,UPDCTR ;UPDATE CHANNEL'S COUNTERS POP P,T4 ;RESTORE CALLBACK INFORMATION POP P,T3 ;... POP P,T2 ;... PJRST ETCRKC ;GO RETURN KONTROLLER COUNTERS ;HERE TO PROCESS READ KONTROLLER COUNTERS COMPLETION INTERRUPT ;LINKAGE: (CALLED AT INTERRUPT LEVEL) ; T2/ USER'S REQUEST ID ; T3/ LENGTH OF USER'S COUNTERS BUFFER (BIT 0 IS ZERO FLAG) ; T4/ ADDRESS OF USER'S COUNTERS BUFFER ; P3/ ADDRESS OF EA BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; PUSHJ P,ETCRKC ;RETURNS: ; CPOPJ ALWAYS ETCRKC: PUSHJ P,SAVP4## ;SAVE P4 XMOVEI P4,EPBCBU(Q2) ;GET ADDRESS OF CALLBACK UN BLOCK STOR T2,UNRID,(P4) ;STORE USER'S REQUEST ID MOVEM T4,UN.BFA(P4) ;STORE ADDRESS OF USER'S COUNTERS BUFFER LDB T4,[POINT 1,T3,0] ;GET ZERO FLAG STOR T4,UNZRO,(P4) ;STORE IN UN BLOCK TLZ T3,(1B0) ;CLEAR ZERO FLAG CAILE T3,KC.LEN ;BUFFER LARGER THAN COUNTERS AREA? MOVEI T3,KC.LEN ;YES, USE LENGTH OF COUNTERS AREA STOR T3,UNBSZ,(P4) ;STORE NUMBER OF COUNTERS RETURNED MOVE T1,T3 ;GET LENGTH OF USER BUFFER AREA XMOVEI T2,EKBCTR(Q3) ;GET ADDRESS OF COUNTERS AREA MOVE T3,UN.BFA(P4) ;AND ADDRESS OF USER BUFFER AREA EXTEND T1,[XBLT] ;COPY COUNTERS TO USER BUFFER LOAD T1,UNZRO,(P4) ;GET ZERO COUNTERS FLAG JUMPE T1,ETCRK2 ;JUMP IF JUST READING COUNTERS MOVEI T1,KC.LEN-1 ;ZERO KONTROLLER COUNTERS XMOVEI T2,EKBCTR(Q3) ;... XMOVEI T3,EKBCTR+1(Q3) ;... SETZM EKBCTR(Q3) ;ZERO FIRST WORD OF BLOCK EXTEND T1,[XBLT] ;ZERO REMAINDER ETCRK2: MOVEI T1,NU.RKC ;GET READ KONTROLLER COUNTERS CALLBACK SETZ T3, ;AND VALID DATA STATUS RETURN CODE PUSHJ P,CALUSR ;GIVE COMPLETION CALLBACK MOVEI T1,KC.LEN ;GET LENGTH OF COUNTERS BUFFER MOVE T2,.EACBA(P3) ;AND ADDRESS OF BUFFER PUSHJ P,GIVEWS## ;RELEASE COUNTERS BUFFER PJRST GIVEAB ;RELEASE EA BLOCK AND RETURN SUBTTL ETHERNET USER SERVICE -- READ ETHERNET LIST ;HERE TO PROCESS A READ ETHERNET LIST CALL ;LINKAGE: ; T1/ ADDRESS OF ROUTINE TO RETURN NEXT STATUS WORD ; P4/ ADDRESS OF UN BLOCK ; PUSHJ P,ETHRXL ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS ETHRXL: PUSHJ P,SAVE3## ;SAVE P1-P3 MOVE P3,T1 ;SAVE ADDRESS OF STATUS ROUTINE LOAD P1,UNBSZ,(P4) ;GET SIZE OF USER BUFFER JUMPLE P1,[ERRRET (UNIBS%)] ;ERROR, INVALID BUFFER SIZE LOAD P2,UNBFA,(P4) ;GET ADDRESS OF USER BUFFER JUMPLE P2,[ERRRET (UNIFB%)] ;ERROR, ILLEGALLY FORMATTED BUFFER ETHLOK ;INTERLOCK AGAINST SMP RACES ETHRL1: PUSHJ P,(P3) ;GET NEXT STATUS WORD JRST ETHRL2 ;EXIT LOOP AT END OF LIST JUMPLE P1,ETHRL2 ;EXIT LOOP IF NO MORE ROOM IN BUFFER MOVEM T1,(P2) ;STORE STATUS WORD INTO USER BUFFER XMOVEI P2,1(P2) ;INCREMENT USER BUFFER POINTER SOJA P1,ETHRL1 ;LOOP THROUGH ALL STATUS WORDS ETHRL2: ETHULK ;RELEASE SMP INTERLOCK LOAD T1,UNBSZ,(P4) ;GET ORIGINAL SIZE OF USER BUFFER SUB T1,P1 ;CALCULATE NUMBER OF ENTRIES STORED STOR T1,UNBSZ,(P4) ;STORE INTO UN BLOCK PJRST CPOPJ1## ;RETURN SUBTTL ETHERNET USER SERVICE -- READ ETHERNET INFORMATION ;HERE TO PROCESS A READ ETHERNET INFORMATION CALL ;LINKAGE: ; T1/ LENGTH OF INFORMATION TABLE ; T2/ ADDRESS OF INFORMATION TABLE ; P4/ ADDRESS OF UN BLOCK ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; PUSHJ P,ETHRXI ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS ETHRXI: PUSHJ P,SAVE2## ;SAVE P1-P2 DMOVE P1,T1 ;SAVE SIZE AND ADDRESS OF INFORMATION TABLE LOAD T3,UNBSZ,(P4) ;GET SIZE OF USER BUFFER JUMPL T3,[ERRRET (UNIBS%)] ;ERROR, INVALID BUFFER SIZE JUMPE T3,ETHRI2 ;JUMP IF NO BUFFER LOAD T4,UNBFA,(P4) ;GET ADDRESS OF USER BUFFER JUMPLE T4,[ERRRET (UNIFB%)] ;ERROR, ILLEGALLY FORMATTED BUFFER ETHRI1: JUMPLE P1,ETHRI2 ;EXIT LOOP IF NO MORE TABLE ENTRIES JUMPLE T3,ETHRI2 ;EXIT LOOP IF NO MORE ROOM IN BUFFER XCT (P2) ;FETCH NEXT INFORMATION WORD MOVEM T1,(T4) ;STORE INTO USER BUFFER XMOVEI T4,1(T4) ;INCREMENT USER BUFFER POINTER SOJ T3, ;DECREMENT USER COUNT XMOVEI P2,1(P2) ;INCREMENT TABLE ADDRESS SOJA P1,ETHRI1 ;LOOP BACK TO PROCESS ENTIRE TABLE ETHRI2: LOAD T1,UNBSZ,(P4) ;GET ORIGINAL SIZE OF USER BUFFER SUB T1,T3 ;CALCULATE NUMBER OF ENTRIES STORED STOR T1,UNBSZ,(P4) ;STORE INTO UN BLOCK PJRST CPOPJ1## ;RETURN SUBTTL ETHERNET USER SERVICE -- REPORT PORTAL STATUS CHANGE ;ROUTINE TO REPORT CURRENT PORTAL STATUS BACK TO PORTAL USER ;LINKAGE: (MAY BE CALLED AT INTERRUPT LEVEL) ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; PUSHJ P,CALSTS ;RETURNS: ; CPOPJ ALWAYS CALSTS: PUSHJ P,SAVP4## ;SAVE P4 XMOVEI P4,EPBCBU(Q2) ;GET ADDRESS OF CALLBACK UN BLOCK SETZ T1, ;ZERO REQUEST ID FOR UNSOLICITED CALLBACK STOR T1,UNRID,(P4) ;... STOR T1,UNBSZ,(P4) ;ALSO CLEAR SIZE OF DATA BUFFER DMOVE T1,ECBEAD(Q1) ;GET CURRENT CHANNEL ETHERNET ADDRESS DMOVEM T1,UN.CAR(P4) ;STORE IN UN BLOCK SETZB T1,T2 ;ZERO PRIMARY HARDWARE ETHERNET ADDRESS SKIPE Q3 ;PROTOCOL HAVE AN ETHERNET KONTROLLER ASSIGNED? DMOVE T1,EKBHEA(Q3) ;YES, GET ITS HARDWARE ADDRESS DMOVEM T1,UN.HAD(P4) ;STORE IN UN BLOCK MOVEI T1,NU.RCI ;GIVE READ CHANNEL INFORMATION CALLBACK PJRST CALUSR ;CALL USER AND RETURN SUBTTL ETHERNET USER SERVICE -- CALL PORTAL USER ;ROUTINE TO CALLBACK TO PORTAL USER ;LINKAGE: ; T1/ FUNCTION CODE (UN.XXX) ; T3/ FUNCTION SPECIFIC STATUS ; P4/ ADDRESS OF UN BLOCK ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; PUSHJ P,CALUSR ;RETURNS: ; CPOPJ ALWAYS CALUSR: MOVE T2,ECBCID(Q1) ;GET ETHERNET CHANNEL ID STOR T2,UNCHN,(P4) ;STORE IN UN BLOCK MOVE T2,EPBPID(Q2) ;GET PORTAL ID STOR T2,UNPID,(P4) ;STORE INTO UN BLOCK MOVE T2,EPBCBI(Q2) ;GET USER'S CALLBACK ID STOR T2,UNUID,(P4) ;STORE INTO UN BLOCK LDB T2,EPPSTS ;GET CURRENT PROTOCOL STATE CAIE T2,.PSENA ;IS PROTOCOL ENABLED? TDZA T2,T2 ;NO, CLEAR RUN FLAG MOVEI T2,1 ;YES, SET RUN FLAG STOR T2,UNRUN,(P4) ;STORE RUN FLAG MOVE T2,P4 ;GET UN BLOCK ADDRESS MOVE T4,EPBCBA(Q2) ;GET USER'S CALLBACK ADDRESS PUSHJ P,(T4) ;CALLBACK USER JFCL ;IGNORE NON-SKIP RETURN POPJ P, ;RETURN SUBTTL ETHERNET USER SERVICE -- GENERATE AN EA BLOCK ;ROUTINE CALLED TO GENERATE AN EA BLOCK FOR A PROTOCOL ;LINKAGE: ; T1/ KONTROLLER FUNCTION CODE (EK.XXX) ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; PUSHJ P,GENEAB ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS WITH: ; P3/ ADDRESS OF EA BLOCK GENEAB: PUSH P,T1 ;SAVE FUNCTION CODE MOVEI T2,.EALEN ;GET LENGTH OF EA BLOCK PUSHJ P,GETEWZ## ;ALLOCATE ZEROED CORE FOR EA BLOCK PJRST [POP P,(P) ;ERROR, CLEAR STACK ERRRET (UNRES%)] ;AND GIVE ERROR RETURN MOVE P3,T1 ;GET ADDRESS OF EA BLOCK POP P,.EAFCN(P3) ;SAVE FUNCTION CODE IN EA BLOCK MOVEM Q2,.EAFCP(P3) ;SAVE ADDRESS OF PORTAL BLOCK IN EA BLOCK PJRST CPOPJ1## ;AND RETURN SUBTTL ETHERNET USER SERVICE -- RELEASE EA BLOCK ;ROUTINE CALLED TO RELEASE AN EA BLOCK ;LINKAGE: ; P3/ ADDRESS OF EA BLOCK ; PUSHJ P,GIVEAB ;RETURNS: ; CPOPJ ALWAYS GIVEAB: MOVEI T1,.EALEN ;GET LENGTH OF EA BLOCK MOVE T2,P3 ;AND ADDRESS OF EA BLOCK PJRST GIVEWS## ;RELEASE EA BLOCK AND RETURN SUBTTL ETHERNET USER SERVICE -- CALL ETHERNET KONTROLLER ;ROUTINE TO CALL AN ETHERNET KONTROLLER ;LINKAGE: ; T1/ ADDRESS OF COMPLETION ROUTINE ; T2-T4/ FUNCTION COMPLETION DATA ; P3/ ADDRESS OF EA BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK (OR ZERO) ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; PUSHJ P,CALKON ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; T2-T4/ FUNCTION COMPLETION DATA ; CPOPJ1 ON SUCCESS CALKON: JUMPE Q3,CALKOX ;JUMP IF NO KONTROLLER BLOCK MOVEM T1,.EAFCA(P3) ;STORE FUNCTION COMPLETION ROUTINE ADDRESS DMOVEM T2,.EAFCD(P3) ;STORE FUNCTION COMPLETION DATA MOVEM T4,.EAFCD+2(P3) ;STORE FUNCTION COMPLETION DATA MOVE T1,P3 ;GET ADDRESS OF EA BLOCK MOVE T2,EKBKKB(Q3) ;AND ADDRESS OF KONTROLLER'S KONTROLLER BLOCK SKIPE T3,Q2 ;HAVE AN ETHERNET PORTAL BLOCK? MOVE T3,EPBKPB(Q2) ;YES, GET KONTROLLER'S PROTOCOL BLOCK MOVE T4,EKBKDA(Q3) ;GET ADDRESS OF KONTROLLER'S DISPATCH ROUTINE PUSHJ P,(T4) ;DISPATCH TO KONTROLLER SKIPA ;ERROR, RESTORE FUNCTION COMPLETION DATA PJRST CPOPJ1## ;SUCCESS, RETURN DMOVE T2,.EAFCD(P3) ;RESTORE FUNCTION COMPLETION DATA MOVE T4,.EAFCD+2(P3) ;... POPJ P, ;AND RETURN CALKOX: MOVE Q2,.EAFCP(P3) ;GET ADDRESS OF ETHERNET PORTAL BLOCK PUSHJ P,(T1) ;CALL COMPLETION ROUTINE PJRST CPOPJ1## ;AND RETURN SUBTTL ETHERNET CHANNEL SUPPORT -- CREATE ETHERNET CHANNEL BLOCK ;ROUTINE TO CREATE AN ETHERNET CHANNEL BLOCK ;LINKAGE: ; PUSHJ P,GENECB ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS WITH: ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK GENECB: MOVEI T2,ECBLEN ;GET SIZE OF ETHERNET CHANNEL BLOCK PUSHJ P,GETEWZ## ;ALLOCATE ZEROED CORE FOR CHANNEL BLOCK STOPCD [ERRRET (UNRES%)],DEBUG,ETHCCC ;++CAN'T CREATE CHANNEL BLOCK MOVE Q1,T1 ;SAVE ADDRESS IN Q1 AOS T1,%EINEC ;INCREMENT NUMBER OF CHANNELS SUBI T1,1 ;CONVERT COUNT INTO CHANNEL ID MOVEM T1,ECBCID(Q1) ;SET CHANNEL ID ETHLOK ;INTERLOCK AGAINST SMP RACES XMOVEI T4,%EICHN-ECBSYS ;SET UP POINTER TO FIRST-1 CHANNEL BLOCK GENEC1: MOVE T3,ECBSYS(T4) ;GET ADDRESS OF NEXT CHANNEL BLOCK JUMPE T3,GENEC2 ;JUMP AT END OF CHANNEL LIST MOVE T4,T3 ;SAVE POINTER TO PREVIOUS CHANNEL BLOCK JRST GENEC1 ;LOOP BACK TO FIND END OF LIST GENEC2: MOVEM Q1,ECBSYS(T4) ;LINK THIS CHANNEL AT END OF LIST SETZM ECBSYS(Q1) ;... ETHULK ;RELEASE SMP INTERLOCK PJRST CPOPJ1## ;AND RETURN SUBTTL ETHERNET CHANNEL SUPPORT -- GENERATE CHANNEL STATUS WORD ;ROUTINE TO GENERATE CHANNEL STATUS WORD ;LINKAGE: ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; PUSHJ P,GENCSW ;RETURNS: ; CPOPJ ALWAYS WITH: ; T1/ CHANNEL STATUS WORD ;MUST PRESERVE T3-T4 GENCSW: SETZ T1, ;START WITH ZERO MOVE T2,ECBSTS(Q1) ;GET CHANNEL STATUS TXNE T2,ECSONL ;IS CHANNEL ONLINE? TXO T1,ET.CON ;YES, SET ONLINE FLAG MOVE T2,ECBCID(Q1) ;GET CHANNEL ID DPB T2,[POINTR (T1,ET.CID)] ;STORE IN CHANNEL STATUS WORD POPJ P, ;AND RETURN SUBTTL ETHERNET CHANNEL SUPPORT -- FIND ETHERNET CHANNEL BLOCK ;ROUTINE TO FIND AN ETHERNET CHANNEL BLOCK GIVEN CHANNEL ID ;LINKAGE: ; T1/ CHANNEL ID ; PUSHJ P,FNDECB ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE ; CPOPJ1 ON SUCCESS WITH: ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK FNDECB: ANDX T1,ET.CID ;MASK TO JUST CHANNEL ID ETHLOK ;INTERLOCK AGAINST SMP RACES SKIPA Q1,%EICHN ;GET ADDRESS OF FIRST ETHERNET CHANNEL BLOCK FNDEC1: MOVE Q1,ECBSYS(Q1) ;GET ADDRESS OF NEXT ETHERNET CHANNEL BLOCK JUMPE Q1,[ERRRET (UNNSC%,UNLETH##)] ;ERROR, NO SUCH CHANNEL CAME T1,ECBCID(Q1) ;FOUND CORRECT CHANNEL BLOCK? JRST FNDEC1 ;NO, LOOP THROUGH ALL CHANNELS ETHULK ;RELEASE SMP INTERLOCK PJRST CPOPJ1## ;RETURN SUBTTL ETHERNET PORTAL SUPPORT -- GENERATE ETHERNET PORTAL ID ;ROUTINE TO GENERATE AN ETHERNET PORTAL ID ;LINKAGE: ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; PUSHJ P,GENPID ;RETURNS: ; CPOPJ ALWAYS WITH: ; T1/ PORTAL ID GENPID: SETZ T1, ;START WITH ZERO MOVE T2,ECBCID(Q1) ;GET ETHERNET CHANNEL ID DPB T2,PIPECN ;STORE IN PORTAL ID DPB Q2,PIPEPB ;INCLUDE ETHERNET PORTAL BLOCK ADDRESS POPJ P, ;AND RETURN SUBTTL ETHERNET PORTAL SUPPORT -- GENERATE PORTAL STATUS WORD ;ROUTINE TO GENERATE PORTAL STATUS WORD ;LINKAGE: ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; PUSHJ P,GENPSW ;RETURNS: ; CPOPJ ALWAYS WITH: ; T1/ PORTAL STATUS WORD ;MUST PRESERVE T3-T4 GENPSW: SETZ T1, ;START WITH ZERO LDB T2,EPPSTS ;GET CURRENT PROTOCOL STATUS CAIN T2,.PSENA ;IS PROTOCOL ENABLED? TXO T1,ET.PON ;YES, MARK PROTOCOL AS ONLINE MOVE T2,EPBPID(Q2) ;GET PORTAL ID DPB T2,[POINTR (T1,ET.PID)] ;STORE IN PORTAL STATUS WORD POPJ P, ;AND RETURN SUBTTL ETHERNET PORTAL SUPPORT -- FIND ETHERNET PORTAL BLOCK ;ROUTINE TO FIND AN ETHERNET PORTAL BLOCK GIVEN PORTAL ID ;LINKAGE: ; T1/ PORTAL ID ; PUSHJ P,FNDEPB ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS WITH: ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK FNDEPB: ANDX T1,ET.PID ;MASK TO JUST PORTAL ID LDB Q2,PIPEPB ;GET ETHERNET PORTAL BLOCK ADDRESS LDB T1,PIPECN ;GET ETHERNET CHANNEL ID PUSHJ P,FNDECB ;FIND THE ETHERNET CHANNEL BLOCK POPJ P, ;ERROR, ERROR CODE ALREADY IN T1 ETHLOK ;INTERLOCK AGAINST SMP RACES SKIPA T1,ECBEPB(Q1) ;GET ADDRESS OF FIRST ETHERNET PORTAL BLOCK FNDEP1: MOVE T1,EPBNXT(T1) ;GET ADDRESS OF NEXT ETHERNET PORTAL BLOCK JUMPE T1,[ERRRET (UNNSP%,UNLETH##)] ;ERROR, NO SUCH PORTAL CAME T1,Q2 ;FOUND CORRECT PORTAL BLOCK? JRST FNDEP1 ;NO, LOOP THROUGH ALL PORTALS MOVE Q3,EPBEKB(Q2) ;GET ADDRESS OF ETHERNET KONTROLLER BLOCK ETHULK ;RELEASE SMP INTERLOCK PJRST CPOPJ1## ;YES, RETURN SUBTTL ETHERNET PORTAL SUPPORT -- ADD ETHERNET PORTAL BLOCK ;ROUTINE TO ADD AN ETHERNET PORTAL TO AN ETHERNET CHANNEL ;LINKAGE: ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; PUSHJ P,ADDEPB ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS ADDEPB: ETHLOK ;INTERLOCK AGAINST SMP RACES XMOVEI T4,ECBEPB-EPBNXT(Q1) ;SETUP POINTER TO FIRST PORTAL BLOCK ADDEP1: MOVE T3,EPBNXT(T4) ;GET POINTER TO NEXT PORTAL BLOCK JUMPE T3,ADDEP2 ;JUMP AT END OF PORTAL LIST MOVE T1,EPBPTY(T3) ;GET THIS PORTAL'S PROTOCOL TYPE CAMN T1,EPBPTY(Q2) ;CONFLICT WITH NEW PORTAL'S PROTOCOL TYPE? AOJN T1,[ERRRET (UNPIU%,UNLETH##)] ;YES, ERROR IF NOT INFO PORTAL MOVE T4,T3 ;SAVE POINTER TO PREVIOUS PORTAL BLOCK JRST ADDEP1 ;LOOP BACK TO CHECK ALL PORTALS ADDEP2: MOVEM Q2,EPBNXT(T4) ;POINT PREVIOUS PORTAL TO NEW PORTAL BLOCK SETZM EPBNXT(Q2) ;TERMINATE LIST WITH THIS PORTAL BLOCK ETHULK ;RELEASE SMP INTERLOCK PJRST CPOPJ1## ;AND RETURN SUBTTL ETHERNET PORTAL SUPPORT -- DELETE ETHERNET PORTAL BLOCK ;ROUTINE TO DELETE AN ETHERNET PORTAL FROM AN ETHERNET CHANNEL ;LINKAGE: ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; PUSHJ P,DELEPB ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS DELEPB: ETHLOK ;INTERLOCK AGAINST SMP RACES XMOVEI T4,ECBEPB-EPBNXT(Q1) ;SETUP POINTER TO FIRST PORTAL BLOCK DELEP1: MOVE T3,EPBNXT(T4) ;GET POINTER TO NEXT PORTAL BLOCK JUMPE T3,[ERRRET (UNNSP%,UNLETH##)] ;ERROR IF NO MORE PORTAL BLOCKS CAMN T3,Q2 ;FOUND SUBJECT PORTAL BLOCK? JRST DELEP2 ;YES, EXIT LOOP MOVE T4,T3 ;SAVE POINTER TO PREVIOUS PORTAL BLOCK JRST DELEP1 ;LOOP BACK TO CHECK ALL PORTALS DELEP2: MOVE T3,EPBNXT(T3) ;GET POINTER TO NEXT PORTAL BLOCK MOVEM T3,EPBNXT(T4) ;POINT PREVIOUS PORTAL TO NEXT PORTAL BLOCK ETHULK ;RELEASE SMP INTERLOCK PJRST CPOPJ1## ;AND RETURN SUBTTL ETHERNET PORTAL SUPPORT -- FIND MULTI-CAST ADDRESS ;ROUTINE TO FIND A MULTI-CAST ADDRESS BELONGING TO A PORTAL ;LINKAGE: ; T1-T2/ MULTI-CAST ADDRESS ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; PUSHJ P,FNDMCA ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS WITH: ; T1/ ADDRESS OF MULTI-CAST ADDRESS BLOCK FNDMCA: PUSHJ P,SAVE4## ;SAVE P1-P4 DMOVE P1,T1 ;SAVE MULTI-CAST ADDRESS ETHLOK ;INTERLOCK AGAINST RACES XMOVEI P4,EPBEMB-EMBNXT(Q2) ;SETUP POINTER TO FIRST MULTI-CAST BLOCK FNDMC1: MOVE P3,EMBNXT(P4) ;GET POINTER TO NEXT MULTI-CAST BLOCK JUMPE P3,[ERRRET (UNIMA%,UNLETH##)] ;ERROR IF END OF MULTI-CAST LIST CAMN P1,EMBMCA(P3) ;MATCH SUBJECT MULTI-CAST ADDRESS? CAME P2,EMBMCA+1(P3) ;... SKIPA ;NO, CONTINUE SEARCHING JRST FNDMC2 ;YES, EXIT LOOP MOVE P4,P3 ;SAVE POINTER TO PREVIOUS MULTI-CAST BLOCK JRST FNDMC1 ;LOOP BACK TO CHECK ALL MULTI-CAST BLOCKS FNDMC2: MOVE T1,P3 ;GET ADDRESS OF MULTI-CAST ADDRESS BLOCK ETHULK ;RELEASE SMP INTERLOCK PJRST CPOPJ1## ;AND RETURN SUBTTL ETHERNET PORTAL SUPPORT -- ADD MULTI-CAST ADDRESS ;ROUTINE TO ADD A MULTI-CAST ADDRESS TO A PORTAL ;LINKAGE: ; T1-T2/ MULTI-CAST ADDRESS ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; PUSHJ P,ADDMCA ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS WITH: ; T1/ ADDRESS OF MULTI-CAST ADDRESS BLOCK ADDMCA: PUSHJ P,SAVE3## ;SAVE P1-P3 DMOVE P1,T1 ;SAVE MULTI-CAST ADDRESS MOVEI T2,EMBLEN ;GET LENGTH OF MULTI-CAST ADDRESS BLOCK PUSHJ P,GETEWZ## ;ALLOCATE ZEROED CORE FOR BLOCK STOPCD [ERRRET (UNRES%)],DEBUG,ETHCCM ;++CAN'T CREATE MULTI-CAST BLOCK MOVE P3,T1 ;SAVE ADDRESS OF MULTI-CAST BLOCK DMOVEM P1,EMBMCA(P3) ;STORE MULTI-CAST ADDRESS ETHLOK ;INTERLOCK AGAINST RACES XMOVEI P2,EPBEMB-EMBNXT(Q2) ;SETUP POINTER TO FIRST MULTI-CAST BLOCK ADDMC1: MOVE P1,EMBNXT(P2) ;GET POINTER TO NEXT MULTI-CAST BLOCK JUMPE P1,ADDMC2 ;JUMP AT END OF MULTI-CAST LIST DMOVE T1,EMBMCA(P1) ;GET MULTI-CAST ADDRESS CAMN T1,EMBMCA(P3) ;MATCH SUBJECT MULTI-CAST ADDRESS? CAME T2,EMBMCA+1(P3) ;... SKIPA ;NO, CONTINUE SEARCHING JRST ADDMC3 ;YES, EXIT LOOP MOVE P2,P1 ;SAVE POINTER TO PREVIOUS MULTI-CAST BLOCK JRST ADDMC1 ;LOOP BACK TO CHECK ALL MULTI-CAST BLOCKS ADDMC2: MOVEM P3,EMBNXT(P2) ;LINK NEW BLOCK TO PREVIOUS MULTI-CAST BLOCK JRST ADDMC4 ;AND CONTINUE ADDMC3: MOVEI T1,EMBLEN ;GET LENGTH OF MULTI-CAST BLOCK MOVE T2,P3 ;AND ADDRESS OF BLOCK PUSHJ P,GIVEWS## ;RELEASE DUPLICATE MULTI-CAST BLOCK MOVE P3,P1 ;GET ADDRESS OF MULTI-CAST BLOCK ADDMC4: DMOVE P1,EMBMCA(P3) ;GET MULTI-CAST ADDRESS SKIPE Q3,EPBEKB(Q2) ;GET ADDRESS OF ASSIGNED KONTROLLER BLOCK PUSHJ P,SETMCA ;SET IN NI, IF IT EXISTS MOVE T1,P3 ;GET ADDRESS OF MCA BLOCK ETHULK ;RELEASE SMP INTERLOCK PJRST CPOPJ1## ;AND RETURN SUBTTL ETHERNET PORTAL SUPPORT -- DELETE MULTI-CAST ADDRESS ;ROUTINE TO DELETE A MULTI-CAST ADDRESS FROM A PORTAL ;LINKAGE: ; T1-T2/ MULTI-CAST ADDRESS ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; PUSHJ P,DELMCA ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS DELMCA: PUSHJ P,SAVE4## ;SAVE P1-P4 DMOVE P1,T1 ;SAVE MULTI-CAST ADDRESS ETHLOK ;INTERLOCK AGAINST RACES XMOVEI P4,EPBEMB-EMBNXT(Q2) ;SETUP POINTER TO FIRST MULTI-CAST BLOCK DELMC1: MOVE P3,EMBNXT(P4) ;GET POINTER TO NEXT MULTI-CAST BLOCK JUMPE P3,[ERRRET (UNIMA%,UNLETH##)] ;ERROR IF END OF MULTI-CAST LIST CAMN P1,EMBMCA(P3) ;MATCH SUBJECT MULTI-CAST ADDRESS? CAME P2,EMBMCA+1(P3) ;... SKIPA ;NO, CONTINUE SEARCHING JRST DELMC2 ;YES, EXIT LOOP MOVE P4,P3 ;SAVE POINTER TO PREVIOUS MULTI-CAST BLOCK JRST DELMC1 ;LOOP BACK TO CHECK ALL MULTI-CAST BLOCKS DELMC2: MOVE T1,EMBNXT(P3) ;GET LINK TO NEXT BLOCK MOVEM T1,EMBNXT(P4) ;UNLINK THIS MULTI-CAST ADDRESS BLOCK MOVEI T1,EMBLEN ;GET LENGTH OF MULTI-CAST ADDRESS BLOCK MOVE T2,P3 ;AND ADDRESS OF BLOCK PUSHJ P,GIVEWS## ;DEALLOCATE MULTI-CAST ADDRESS BLOCK SKIPE Q3,EPBEKB(P3) ;GET ADDRESS OF ASSIGNED KONTROLLER BLOCK SKIPN Q1,EKBECB(Q3) ;GET ADDRESS OF CHANNEL BLOCK SKIPA ;NONE, CANNOT CLEAR MULTI-CAST ADDRESS PUSHJ P,CLRMCA ;CLEAR MULTI-CAST ADDRESS FROM MCAT ETHULK ;RELEASE SMP INTERLOCK PJRST CPOPJ1## ;AND RETURN SUBTTL ETHERNET PORTAL SUPPORT -- ENABLE PROTOCOL ;ROUTINE CALLED TO ENABLE A PROTOCOL ;LINKAGE: ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; PUSHJ P,ETHEPT ;RETURNS: ; CPOPJ ALWAYS ETHEPT: XMOVEI T1,EPTTB1 ;GET ADDRESS OF STATE TRANSITION TABLE PJRST PSTDSP ;DISPATCH BASED ON PROTOCOL STATE ;ENABLE PROTOCOL STATE TRANSITION TABLE EPTTB1: XWD .PSEIP, ETHEP1 ;(0) DISABLED XWD .PSEIP, ETHEP1 ;(1) DISABLED, WANT TO ENABLE XWD -1, CPOPJ## ;(2) ENABLE IN PROGRESS XWD -1, CPOPJ## ;(3) ENABLE IN PROGRESS, WANT TO DISABLE XWD -1, CPOPJ## ;(4) ENABLED XWD -1, CPOPJ## ;(5) ENABLED, WANT TO DISABLE XWD -1, CPOPJ## ;(6) DISABLE IN PROGRESS ;HERE TO START THE ENABLE OF A PROTOCOL ;LINKAGE: ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; PUSHJ P,ETHEP1 ;RETURNS: ; CPOPJ ALWAYS ETHEP1: PUSHJ P,SAVP3## ;SAVE P3 PUSHJ P,SELEKB ;SELECT A KONTROLLER FOR THIS PROTOCOL JRST ETHEP2 ;IF NONE, GO SET DISABLED, WANT TO ENABLE STATE MOVEI T1,EK.EPT ;FUNCTION ENABLE PROTOCOL TYPE PUSHJ P,GENEAB ;GENERATE AN EA BLOCK PJRST ETHEP2 ;ERROR, GO SET DISABLED, WANT TO ENABLE STATE MOVE T1,EPBPTY(Q2) ;GET PROTOCOL TYPE MOVEM T1,.EAPTY(P3) ;STORE IN EA BLOCK LDB T1,EPPPAD ;GET PROTOCOL PADDING FLAG MOVEM T1,.EAPAD(P3) ;STORE IN EA BLOCK MOVEM Q2,.EAPPB(P3) ;STORE ADDRESS OF PORTAL BLOCK XMOVEI T1,ETCEPT ;GET ADDRESS OF COMPLETION ROUTINE PUSHJ P,CALKON ;CALL KONTROLLER JRST [PUSHJ P,GIVEAB ;ERROR, RELEASE EA BLOCK PJRST ETHEP2] ;GO SET DISABLED, WANT TO ENABLE STATE POPJ P, ;RETURN ETHEP2: SETZB Q3,EPBEKB(Q2) ;ZERO KONTROLLER BLOCK ADDRESS XMOVEI T1,EPTTB2 ;GET ADDRESS OF STATE TRANSITION TABLE PJRST PSTDSP ;DISPATCH BASED ON PROTOCOL STATE ;ENABLE PROTOCOL PENDING STATE TRANSITION TABLE EPTTB2: XWD -1, CPOPJ## ;(0) DISABLED XWD -1, CPOPJ## ;(1) DISABLED, WANT TO ENABLE XWD .PSDWE, CPOPJ## ;(2) ENABLE IN PROGRESS XWD .PSDIS, ETCDP1 ;(3) ENABLE IN PROGRESS, WANT TO DISABLE XWD -1, CPOPJ## ;(4) ENABLED XWD -1, CPOPJ## ;(5) ENABLED, WANT TO DISABLE XWD -1, CPOPJ## ;(6) DISABLE IN PROGRESS ;ROUTINE CALLED ON ENABLE PROTOCOL COMPLETION INTERRUPT ;LINKAGE: (CALLED AT INTERRUPT LEVEL) ; P3/ ADDRESS OF EA BLOCK ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; PUSHJ P,ETCEPT ;RETURNS: ; CPOPJ ALWAYS ETCEPT: XMOVEI T1,EPTTB3 ;GET ADDRESS OF STATE TRANSITION TABLE PUSHJ P,PSTDSP ;DISPATCH BASED ON PROTOCOL STATE PJRST GIVEAB ;RELEASE EA BLOCK AND RETURN ;ENABLE PROTOCOL DONE STATE TRANSITION TABLE EPTTB3: XWD -1, ETHEPX ;(0) DISABLED XWD -1, ETHEPX ;(1) DISABLED, WANT TO ENABLE XWD .PSENA, ETCEP1 ;(2) ENABLE IN PROGRESS XWD .PSEWD, ETCEP1 ;(3) ENABLE IN PROGRESS, WANT TO DISABLE XWD -1, ETHEPX ;(4) ENABLED XWD -1, ETHEPX ;(5) ENABLED, WANT TO DISABLE XWD -1, ETHEPX ;(6) DISABLE IN PROGRESS ETCEP1: MOVE T1,.EAPPB(P3) ;GET ADDRESS OF KONTROLLER'S PROTOCOL BLOCK MOVEM T1,EPBKPB(Q2) ;SAVE IN PORTAL BLOCK PUSHJ P,CALSTS ;GIVE USER STATUS CHANGE CALLBACK LDB T1,EPPSTS ;GET CURRENT PORTAL STATUS CAIN T1,.PSEWD ;ENABLED, WANT TO DISABLE? PJRST ETHDPT ;YES, INITIATE DISABLE OF PROTOCOL MOVE P4,EPBEMB(Q2) ;GET ADDRESS OF FIRST MCA BLOCK JUMPE P4,CPOPJ## ;NONE, RETURN NOW ETCEP2: DMOVE P1,EMBMCA(P4) ;GET MULTI-CAST ADDRESS PUSHJ P,SETMCA ;SET IN MCAT MOVE P4,EPBNXT(P4) ;GET ADDRESS OF NEXT MCA BLOCK JUMPN P4,ETCEP2 ;SET THEM ALL POPJ P, ;RETURN ;HERE ON AN UNEXPECTED PROTOCOL STATE TRANSITION ETHEPX: STOPCD CPOPJ##,DEBUG,ETHUES ;++UNEXPECTED ENABLE PROTOCOL STATE SUBTTL ETHERNET PORTAL SUPPORT -- DISABLE PROTOCOL ;ROUTINE CALLED TO DISABLE A PROTOCOL ;LINKAGE: ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; PUSHJ P,ETHDPT ;RETURNS: ; CPOPJ ALWAYS ETHDPT: XMOVEI T1,DPTTB1 ;GET ADDRESS OF STATE TRANSITION TABLE PJRST PSTDSP ;DISPATCH BASED ON PROTOCOL STATE ;DISABLE PROTOCOL STATE TRANSITION TABLE DPTTB1: XWD -1, CPOPJ## ;(0) DISABLED XWD .PSDIS, ETCDP1 ;(1) DISABLED, WANT TO ENABLE XWD .PSEPD, CPOPJ## ;(2) ENABLE IN PROGRESS XWD -1, CPOPJ## ;(3) ENABLE IN PROGRESS, WANT TO DISABLE XWD .PSDIP, ETHDP1 ;(4) ENABLED XWD .PSDIP, ETHDP1 ;(5) ENABLED, WANT TO DISABLE XWD -1, CPOPJ## ;(6) DISABLE IN PROGRESS ;HERE TO START THE DISABLE OF A PROTOCOL ;LINKAGE: ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; PUSHJ P,ETHDP1 ;RETURNS: ; CPOPJ ALWAYS ETHDP1: PUSHJ P,SAVP3## ;SAVE P3 PUSHJ P,CALSTS ;GIVE USER STATUS CHANGE CALLBACK MOVEI T1,EK.DPT ;FUNCTION DISABLE PROTOCOL TYPE PUSHJ P,GENEAB ;GENERATE AN EA BLOCK PJRST ETHDP2 ;ERROR, GO SET ENABLED, WANT TO DISABLE STATE MOVE T1,EPBPTY(Q2) ;GET PROTOCOL TYPE MOVEM T1,.EAPTY(P3) ;STORE IN EA BLOCK LDB T1,EPPPAD ;GET PROTOCOL PADDING FLAG MOVEM T1,.EAPAD(P3) ;STORE IN EA BLOCK MOVEM Q2,.EAPPB(P3) ;STORE ADDRESS OF PORTAL BLOCK XMOVEI T1,ETCDPT ;GET ADDRESS OF COMPLETION ROUTINE PUSHJ P,CALKON ;CALL KONTROLLER JRST [PUSHJ P,GIVEAB ;ERROR, RELEASE EA BLOCK PJRST ETHDP2] ;GO SET ENABLED, WANT TO DISABLE STATE POPJ P, ;RETURN ETHDP2: XMOVEI T1,DPTTB2 ;GET ADDRESS OF STATE TRANSITION TABLE PJRST PSTDSP ;DISPATCH BASED ON PROTOCOL STATE ;DISABLE PROTOCOL PENDING STATE TRANSITION TABLE DPTTB2: XWD -1, CPOPJ## ;(0) DISABLED XWD -1, CPOPJ## ;(1) DISABLED, WANT TO ENABLE XWD -1, CPOPJ## ;(2) ENABLE IN PROGRESS XWD -1, CPOPJ## ;(3) ENABLE IN PROGRESS, WANT TO DISABLE XWD -1, CPOPJ## ;(4) ENABLED XWD -1, CPOPJ## ;(5) ENABLED, WANT TO DISABLE XWD .PSEWD, CPOPJ## ;(6) DISABLE IN PROGRESS ;ROUTINE CALLED ON DISABLE PROTOCOL COMPLETION INTERRUPT ;LINKAGE: (CALLED AT INTERRUPT LEVEL) ; P3/ ADDRESS OF EA BLOCK ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; PUSHJ P,ETCDPT ;RETURNS: ; CPOPJ ALWAYS ETCDPT: XMOVEI T1,DPTTB3 ;GET ADDRESS OF STATE TRANSITION TABLE PUSHJ P,PSTDSP ;DISPATCH BASED ON PROTOCOL STATE PJRST GIVEAB ;RELEASE EA BLOCK AND RETURN ;DISABLE PROTOCOL DONE STATE TRANSITION TABLE DPTTB3: XWD -1, ETHDPX ;(0) DISABLED XWD -1, ETHDPX ;(1) DISABLED, WANT TO ENABLE XWD -1, ETHDPX ;(2) ENABLE IN PROGRESS XWD -1, ETHDPX ;(3) ENABLE IN PROGRESS, WANT TO DISABLE XWD -1, ETHDPX ;(4) ENABLED XWD -1, ETHDPX ;(5) ENABLED, WANT TO DISABLE XWD .PSDIS, ETCDP1 ;(6) DISABLE IN PROGRESS ETCDP1: SETZM EPBEKB(Q2) ;ZERO POINTER TO KONTROLLER BLOCK MOVE P4,EPBEMB(Q2) ;GET ADDRESS OF FIRST MCA BLOCK JUMPE P4,ETCDP3 ;NONE, FINISH UP ETCDP2: DMOVE P1,EMBMCA(P4) ;GET MULTI-CAST ADDRESS PUSHJ P,CLRMCA ;CLEAR MULTI-CAST ADDRESS FROM MCAT MOVE P4,EMBNXT(P4) ;GET ADDRESS OF NEXT MCA BLOCK JUMPN P4,ETCDP2 ;CLEAR THEM ALL ETCDP3: SETZ Q3, ;CLEAR KONTROLLER BLOCK ADDRESS MOVX T1,EPSOPN ;IS PORTAL OPEN? TDNE T1,EPBSTS(Q2) ;... PJRST ETHEPT ;YES, GO TRY TO ENABLE PROTOCOL XMOVEI P4,EPBCBU(Q2) ;GET ADDRESS OF CALLBACK UN BLOCK MOVE T1,EPBPTY(Q2) ;GET PROTOCOL TYPE CODE STOR T1,UNPRO,(P4) ;STORE IN UN BLOCK MOVEI T1,NU.CLO ;GIVE USER CLOSE PORTAL CALLBACK PUSHJ P,CALUSR ;... PUSHJ P,DELEPB ;DELETE PORTAL BLOCK FROM ETHERNET CHANNEL JFCL ;DON'T CARE IF ERROR MOVEI T1,EPBLEN ;GET LENGTH OF PORTAL BLOCK MOVE T2,Q2 ;AND ADDRESS OF PORTAL BLOCK PJRST GIVEWS## ;RELEASE PORTAL BLOCK AND RETURN ;HERE ON AN UNEXPECTED PROTOCOL STATE TRANSITION ETHDPX: STOPCD CPOPJ##,DEBUG,ETHUDS ;++UNEXPECTED DISABLE PROTOCOL STATE SUBTTL ETHERNET PORTAL SUPPORT -- PROTOCOL STATE TRANSTITION ;ROUTINE CALLED FOR PROTOCOL STATE TRANSITIONS ;LINKAGE: ; T1/ ADDRESS OF STATE TRANSITION TABLE ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; PUSHJ P,PSTDSP ;RETURNS: ; CPOPJ OR CPOPJ1 BASED ON TRANSITION ROUTINE PSTDSP: ETHLOK ;INTERLOCK AGAINST SMP RACES LDB T2,EPPSTS ;GET CURRENT PROTOCOL STATUS CAILE T2,.PSMAX ;RANGE CHECK PROTOCOL STATUS STOPCD UNLETH##,DEBUG,ETHIPS ;++INVALID PROTOCOL STATE ADD T1,T2 ;COMPUTE DISPATCH TABLE OFFSET HLRE T3,(T1) ;GET NEW PROTOCOL STATE JUMPL T3,PSTDS1 ;JUMP IF NO CHANGE OF STATE DPB T2,EPPPST ;SAVE PREVIOUS STATE DPB T3,EPPSTS ;STORE UPDATED PROTOCOL STATUS PSTDS1: ETHULK ;RELEASE SMP INTERLOCK HRRZ T3,(T1) ;GET LOCAL ADDRESS OF ROUTINE PJRST (T3) ;DISPATCH TO TRANSITION ROUTINE AND RETURN SUBTTL ETHERNET KONTROLLER SUPPORT -- SET/CLEAR MULTI-CAST ;ROUTINE TO SET A MULTI-CAST ADDRESS IN THE MCAT ;LINKAGE: ; P1-P2/ MULTI-CAST ADDRESS ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; PUSHJ P,SETMCA ;RETURNS: ; CPOPJ ALWAYS SETMCA: POPJ P, ;DO NOT USE THIS CODE (YET) PUSHJ P,SAVP3## ;SAVE P3 MOVEI T1,EK.EMA ;ENABLE MULTI-CAST ADDRESS PJRST CLRMC5 ;GO CALL KONTROLLER ;ROUTINE TO CLEAR A MULTI-CAST ADDRESS IN THE MCAT ;LINKAGE: ; P1-P2/ MULTI-CAST ADDRESS ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; PUSHJ P,CLRMCA ;RETURNS: ; CPOPJ ALWAYS CLRMCA: POPJ P, ;DO NOT USE THIS CODE (YET) PUSHJ P,SAVE4## ;SAVE P1-P4 MOVE P3,ECBEPB(Q1) ;GET ADDRESS OF FIRST PORTAL BLOCK JUMPE P3,CLRMC4 ;NONE: CLEAR THIS MULTI-CAST ADDRESS CLRMC1: CAME Q3,EPBEKB(P3) ;IS IT THE SAME KONTROLLER BLOCK? JRST CLRMC3 ;NO, TRY THE NEXT PORTAL BLOCK MOVE P4,EPBEMB(P3) ;GET ADDRESS OF FIRST MCA BLOCK JUMPE P4,CLRMC3 ;NONE, NEXT PORTAL CLRMC2: CAMN P1,EMBMCA+0(P4) ; CAME P2,EMBMCA+1(P4) ;IS THIS THE SAME MULTI-CAST ADDRESS? SKIPA ;NO, CHECK ALL MCA BLOCKS POPJ P, ;YES, CAN'T REMOVE IT MOVE P4,EMBNXT(P4) ;GET ADDRESS OF NEXT MCA BLOCK JUMPN P4,CLRMC2 ;CHECK THEM ALL CLRMC3: MOVE P3,EPBNXT(P3) ;GET ADDRESS OF NEXT PORTAL BLOCK JUMPN P3,CLRMC1 ;GOT ONE: CHECK ITS MCA BLOCKS CLRMC4: MOVEI T1,EK.DMA ;DISABLE THIS MULTI-CAST ADDRESS CLRMC5: PUSHJ P,GENEAB ;GET AN EA BLOCK POPJ P, ;ERROR: RETURN DMOVEM P1,.EAMCA(P3) ;SAVE THE MULTI-CAST ADDRESS XMOVEI T1,CPOPJ## ;DO NOTHING ON CALL BACK PUSHJ P,CALKON ;CALL THE KONTROLLER TRN ;ERROR: RETURN THE EA BLOCK PJRST GIVEAB ;RETURN THE EA BLOCK SUBTTL ETHERNET KONTROLLER SUPPORT -- CREATE KONTROLLER BLOCK ;ROUTINE TO CREATE AN ETHERNET KONTROLLER BLOCK ;LINKAGE: ; PUSHJ P,GENEKB ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS WITH: ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK GENEKB: MOVEI T2,EKBLEN ;GET LENGTH OF ETHERNET KONTROLLER BLOCK PUSHJ P,GETWDS## ;ALLOCATE CORE FOR KONTROLLER BLOCK ERRRET (UNRES%) ;ERROR, NO RESOURCES MOVE Q3,T1 ;SAVE ADDRESS OF ETHERNET KONTROLLER BLOCK MOVSI T3,(T1) ;STARTING ADDRESS HRRI T3,1(T1) ;MAKE A BLT POINTER SETZM (T1) ;CLEAR FIRST WORD BLT T3,EKBLEN-1(T1) ;CLEAR ENTIRE BLOCK AOS T1,%EINEK ;INCREMENT NUMBER OF KONTROLLERS MOVEM T1,EKBKID(Q3) ;SET KONTROLLER ID ETHLOK ;INTERLOCK AGAINST SMP RACES XMOVEI T4,%EIKON-EKBSYS ;SET UP POINTER TO FIRST-1 KONTROLLER BLOCK GENEK1: MOVE T3,EKBSYS(T4) ;GET ADDRESS OF NEXT KONTROLLER BLOCK JUMPE T3,GENEK2 ;JUMP AT END OF KONTROLLER LIST MOVE T4,T3 ;SAVE POINTER TO PREVIOUS KONTROLLER BLOCK JRST GENEK1 ;LOOP BACK TO FIND END OF LIST GENEK2: MOVEM Q3,EKBSYS(T4) ;LINK THIS KONTROLLER AT END OF LIST SETZM EKBSYS(Q3) ;... ETHULK ;RELEASE SMP INTERLOCK PJRST CPOPJ1## ;AND RETURN SUBTTL ETHERNET KONTROLLER SUPPORT -- GENERATE KONTROLLER STATUS WORD ;ROUTINE TO GENERATE KONTROLLER STATUS WORD ;LINKAGE: ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; PUSHJ P,GENKSW ;RETURNS: ; CPOPJ ALWAYS WITH: ; T1/ KONTROLLER STATUS WORD ;MUST PRESERVE T3-T4 GENKSW: SETZ T1, ;START WITH ZERO MOVE T2,EKBSTS(Q3) ;GET KONTROLLER STATUS TXNE T2,EKSONL ;IS KONTROLLER ONLINE? TXO T1,ET.KON ;YES, MARK KONTROLLER AS ONLINE MOVE T2,EKBKID(Q3) ;GET KONTROLLER ID DPB T2,[POINTR (T1,ET.KID)] ;STORE IN KONTROLLER STATUS WORD POPJ P, ;AND RETURN SUBTTL ETHERNET KONTROLLER SUPPORT -- SELECT AN ETHERNET KONTROLLER ;ROUTINE TO SELECT AN ETHERNET KONTROLLER FOR AN ETHERNET PORTAL ;LINKAGE: ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q2/ ADDRESS OF ETHERNET PORTAL BLOCK ; PUSHJ P,SELEKB ;RETURNS: ; CPOPJ ON ERROR ; CPOPJ1 ON SUCCESS WITH: ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK SELEKB: ETHLOK ;INTERLOCK AGAINST SMP RACES SETZ T2, ;USED TO REMEMBER FIRST USABLE KONTROLLER SKIPA Q3,ECBEKB(Q1) ;GET ADDRESS OF FIRST KONTROLLER SELEK1: MOVE Q3,EKBNXT(Q3) ;GET ADDRESS OF NEXT KONTROLLER JUMPE Q3,[MOVE Q3,T2 ;IF NONE, GET REMEMBERED KONTROLLER'S ADDRESS JRST SELEK2] ;AND EXIT LOOP MOVX T1,EKSONL ;IS KONTROLLER ONLINE? TDNN T1,EKBSTS(Q3) ;... JRST SELEK1 ;NO, LOOP BACK TO CHECK NEXT KONTROLLER SKIPN T2 ;ALREADY REMEMBERED FIRST USABLE KONTROLLER? MOVE T2,Q3 ;NO, REMEMBER THIS KONTROLLER LDB T1,EKPCPU ;GET CPU NUMBER OF ETHERNET KONTROLLER CAME T1,.CPCPN## ;ACCESSIBLE BY THIS CPU? JRST SELEK1 ;NO, LOOP BACK TO CHECK NEXT KONTROLLER SELEK2: MOVEM Q3,EPBEKB(Q2) ;STORE KONTROLLER BLOCK ADDRESS IN PORTAL BLOCK ETHULK ;RELEASE SMP INTERLOCK PJUMPN Q3,CPOPJ1## ;AND RETURN POPJ P, ;... SUBTTL ETHERNET KONTROLLER SUPPORT -- FIND ETHERNET KONTROLLER BLOCK ;ROUTINE TO FIND AN ETHERNET KONTROLLER BLOCK GIVEN KONTROLLER ID ;LINKAGE: ; T1/ KONTROLLER ID ; PUSHJ P,FNDEKB ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS WITH: ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK FNDEKB: ANDX T1,ET.KID ;MASK TO JUST KONTROLLER ID ETHLOK ;INTERLOCK AGAINST SMP RACES SKIPA Q1,%EICHN ;GET ADDRESS OF FIRST ETHERNET CHANNEL BLOCK FNDEK1: MOVE Q1,ECBSYS(Q1) ;GET ADDRESS OF NEXT ETHERNET CHANNEL BLOCK JUMPE Q1,[ERRRET (UNNSK%,UNLETH##)] ;ERROR, NO SUCH KONTROLLER SKIPA Q3,ECBEKB(Q1) ;GET ADDRESS OF FIRST ETHERNET KONTROLLER BLOCK FNDEK2: MOVE Q3,EKBNXT(Q3) ;GET ADDRESS OF NEXT ETHERNET KONTROLLER BLOCK JUMPE Q3,FNDEK1 ;END OF KONTROLLER LIST, TRY NEXT CHANNEL CAME T1,EKBKID(Q3) ;FOUND CORRECT KONTROLLER BLOCK? JRST FNDEK2 ;NO, LOOP THROUGH ALL KONTROLLERS ETHULK ;RELEASE SMP INTERLOCK PJRST CPOPJ1## ;RETURN SUBTTL ETHERNET KONTROLLER SUPPORT -- ADD ETHERNET KONTROLLER BLOCK ;ROUTINE TO ADD AN ETHERNET KONTROLLER TO AN ETHERNET CHANNEL ;LINKAGE: ; Q1/ ADDRESS OF ETHERNET CHANNEL BLOCK ; Q3/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; PUSHJ P,ADDEKB ;RETURNS: ; CPOPJ ALWAYS ADDEKB: ETHLOK ;INTERLOCK AGAINST SMP RACES XMOVEI T4,ECBEKB-EKBNXT(Q1) ;SETUP POINTER TO FIRST KONTROLLER BLOCK ADDEK1: MOVE T3,EKBNXT(T4) ;GET POINTER TO NEXT KONTROLLER BLOCK JUMPE T3,ADDEK2 ;JUMP AT END OF KONTROLLER LIST CAMN T3,Q3 ;KONTROLLER ALREADY IN LIST? PJRST UNLETH## ;YES, RELEASE SMP INTERLOCK AND RETURN MOVE T4,T3 ;SAVE POINTER TO PREVIOUS KONTROLLER BLOCK JRST ADDEK1 ;LOOP BACK TO FIND END OF LIST ADDEK2: MOVEM Q3,EKBNXT(T4) ;POINT PREVIOUS KONTROLLER TO NEW KONTROLLER SETZM EKBNXT(Q3) ;TERMINATE LIST WITH THIS KONTROLLER BLOCK MOVEM Q1,EKBECB(Q3) ;SAVE ADDRESS OF ETHERNET CHANNEL BLOCK PJRST UNLETH## ;RELEASE SMP INTERLOCK AND RETURN SUBTTL ETHERNET INTERRUPT SERVICE -- KONTROLLER INITIALIZATION ;ROUTINE CALLED BY DEVICE DRIVER WHEN A KONTROLLER IS INITIALIZED ;LINKAGE: (CALLED AT ONCE TIME) ; T1/ ADDRESS OF KONTROLLER'S KONTROLLER BLOCK ; T2/ ADDRESS OF KONTROLLER'S DISPATCH ROUTINE ; T3/ KONTROLLER TYPE,,KONTROLLER NUMBER ; PUSHJ P,ETKINI ;RETURNS: ; CPOPJ ON ERROR WITH: ; T1/ ERROR CODE (UNXXX%) ; CPOPJ1 ON SUCCESS WITH: ; T1/ ADDRESS OF ETHERNET KONTROLLER BLOCK ETKINI::PUSHJ P,SAVE3## ;SAVE P1-P3 PUSHJ P,SAVQ## ;AND Q1-Q3 DMOVE P1,T1 ;SAVE KONTROLLER'S BLOCK AND ROUTINE ADDRESSES MOVE P3,T3 ;SAVE KONTROLLER TYPE CODE PUSHJ P,GENEKB ;CREATE AN ETHERNET KONTROLLER BLOCK POPJ P, ;ERROR, ERROR CODE IN T1 MOVEM P1,EKBKKB(Q3) ;SAVE ADDRESS OF KONTROLLER'S KONTROLLER BLOCK MOVEM P2,EKBKDA(Q3) ;AND ADDRESS OF KONTROLLER'S DISPATCH ROUTINE MOVE T1,.CPCPN## ;GET OUR CPU NUMBER DPB T1,EKPCPU ;SAVE IN KONTROLLER BLOCK HLRZ T1,P3 ;GET KONTROLLER TYPE CODE DPB T1,EKPKTY ;SAVE IN KONTROLLER BLOCK HRRZ T1,P3 ;GET KONTROLLER NUMBER DPB T1,EKPKNO ;SAVE IN KONTROLLER BLOCK MOVE T1,Q3 ;GET ADDRESS OF ETHERNET KONTROLLER BLOCK PJRST CPOPJ1## ;AND RETURN SUBTTL ETHERNET INTERRUPT SERVICE -- KONTROLLER OFFLINE ;ROUTINE CALLED BY DEVICE DRIVER ON KONTROLLER OFFLINE ;LINKAGE: ; T1/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; PUSHJ P,ETKOFL ;RETURNS: ; CPOPJ ALWAYS ETKOFL::PUSHJ P,SAVQ## ;SAVE Q1-Q3 MOVE Q3,T1 ;GET ADDRESS OF ETHERNET KONTROLLER BLOCK MOVX T1,EKSONL ;MARK KONTROLLER AS OFFLINE ANDCAM T1,EKBSTS(Q3) ;... SKIPN Q1,EKBECB(Q3) ;GET ADDRESS OF ETHERNET CHANNEL BLOCK POPJ P, ;NONE, JUST RETURN NOW ETHLOK ;INTERLOCK AGAINST SMP RACES SKIPA Q2,ECBEPB(Q1) ;GET ADDRESS OF FIRST ETHERNET PORTAL BLOCK ETKOF1: MOVE Q2,EPBNXT(Q2) ;GET ADDRESS OF NEXT ETHERNET PORTAL BLOCK JUMPE Q2,UNLETH## ;RETURN AT END OF PORTAL LIST MOVE T1,EPBEKB(Q2) ;GET ADDRESS OF ASSIGNED KONTROLLER BLOCK CAMN T1,Q3 ;MATCH OFFLINE KONTROLLER? PUSHJ P,ETHDPT ;YES, INITIATE DISABLE OF PROTOCOL JRST ETKOF1 ;LOOP BACK TO CHECK ALL PORTALS SUBTTL ETHERNET INTERRUPT SERVICE -- KONTROLLER ONLINE ;ROUTINE CALLED BY DEVICE DRIVER ON KONTROLLER ONLINE ;LINKAGE: ; T1/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; T2-T3/ HARDWARE ETHERNET ADDRESS ; PUSHJ P,ETKONL ;RETURNS: ; CPOPJ ALWAYS ETKONL::PUSHJ P,SAVQ## ;SAVE Q1-Q3 MOVE Q3,T1 ;GET ADDRESS OF ETHERNET KONTROLLER BLOCK DMOVEM T2,EKBHEA(Q3) ;STORE HARDWARE ETHERNET ADDRESS MOVX T1,EKSONL ;MARK KONTROLLER AS ONLINE IORM T1,EKBSTS(Q3) ;... SKIPE Q1,EKBECB(Q3) ;ALREADY ASSIGNED TO A CHANNEL? JRST ETKON1 ;YES, DON'T NEED TO ADD KONTROLLER THEN MOVE Q1,%EICHN ;GET ADDRESS OF ETHERNET CHANNEL BLOCK PUSHJ P,ADDEKB ;ADD KONTROLLER TO CHANNEL ETKON1: SKIPE ECBEAD(Q1) ;DOES CHANNEL HAVE AN ETHERNET ADDRESS? JRST ETKON2 ;YES, SET KONTROLLER TO THAT ADDRESS DMOVE T1,EKBHEA(Q3) ;NO, GET HARDWARE ADDRESS OF KONTROLLER DMOVEM T1,ECBEAD(Q1) ;AND SET THAT UP AS CHANNEL'S ADDRESS POPJ P, ;RETURN ETKON2: MOVX T1,EKSSEA ;FLAG SET ETHERNET ADDRESS FUNCTION IORM T1,EKBSTS(Q3) ;... POPJ P, ;AND RETURN SUBTTL ETHERNET INTERRUPT SERVICE -- KONTROLLER FUNCTION DONE ;ROUTINE CALLED BY DEVICE DRIVER ON KONTROLLER FUNCTION DONE ;LINKAGE: ; T1/ ADDRESS OF EA BLOCK ; T2/ ADDRESS OF ETHERNET KONTROLLER BLOCK ; T3/ ADDRESS OF ETHERNET PORTAL BLOCK ; PUSHJ P,ETKINT ;RETURNS: ; CPOPJ ALWAYS ETKINT::PUSHJ P,SAVP3## ;SAVE P3 PUSHJ P,SAVQ## ;AND Q1-Q3 MOVE P3,T1 ;GET ADDRESS OF EA BLOCK MOVE Q3,T2 ;AND ADDRESS OF ETHERNET KONTROLLER BLOCK MOVE Q2,.EAFCP(P3) ;AND ADDRESS OF ETHERNET PORTAL BLOCK MOVE Q1,EKBECB(Q3) ;GET ADDRESS OF ETHERNET CHANNEL BLOCK DMOVE T2,.EAFCD(P3) ;GET COMPLETION DATA MOVE T4,.EAFCD+2(P3) ;... PJRST @.EAFCA(P3) ;DISPATCH TO COMPLETION ROUTINE AND RETURN SUBTTL ETHERNET SUPPORT -- UPDATE ETHERNET COUNTERS ;ROUTINE CALLED TO UPDATE ETHERNET COUNTERS ;LINKAGE: ; T1/ LENGTH OF COUNTERS AREA ; T2/ ILDB BYTE POINTER TO UPDATE ACTION TABLE ; T3/ ADDRESS OF SOURCE COUNTERS AREA ; T4/ ADDRESS OF DESTINATION COUNTERS AREA ;RETURNS: ; CPOPJ ALWAYS UPDCTR: PUSHJ P,SAVE2## ;SAVE P1-P2 DMOVE P1,T1 ;SAVE LENGTH AND BYTE POINTER TO ACTION TABLE UPDCT1: ILDB T2,P2 ;GET UPDATE ACTION CODE MOVE T1,(T3) ;GET VALUE OF NEXT COUNTER XCT UPDCOD(T2) ;UPDATE COUNTER APPROPRIATELY XMOVEI T3,1(T3) ;UPDATE SOURCE COUNTERS ADDRESS XMOVEI T4,1(T4) ;AND DESTINATION COUNTERS ADDRESS SOJG P1,UPDCT1 ;LOOP BACK FOR ALL COUNTERS POPJ P, ;AND RETURN ;TABLE OF UPDATE ACTIONS UPDCOD: ADDM T1,(T4) ;ADDITIVE COUNTER IORM T1,(T4) ;ADDITIVE BITMAP SUBTTL ETHERNET SUPPORT -- GENERATE TWO WORD GLOBAL BYTE POINTER ;ROUTINE TO GENERATE A TWO WORD GLOBAL BYTE POINTER FROM ;ANY VALID ONE OR TWO WORD BYTE POINTER ;LINKAGE: ; T1-T2/ BYTE POINTER ; PUSHJ P,GTWGBP ;RETURNS: ; CPOPJ ALWAYS WITH: ; T1-T2/ TWO WORD GLOBAL BYTE POINTER GTWGBP::LDB T3,[POINT 6,T1,5] ;GET "P" FIELD OF BYTE POINTER CAILE T3,44 ;IS THIS A ONE WORD GLOBAL BYTE POINTER? JRST GTWGB2 ;YES, PROCESS SEPERATELY TLNE T1,(1B12) ;IS IT A ONE WORD LOCAL BYTE POINTER? JRST GTWGB1 ;NO, CONTINUE LDB T2,[POINT 23,T1,35] ;YES, CONVERT INTO TWO WORD LOCAL TLO T2,(1B0) ;... TLO T1,(1B12) ;... TDZ T1,[37,,777777] ;... GTWGB1: TLNN T2,(1B0) ;IS IT ALREADY A TWO WORD GLOBAL BYTE POINTER? POPJ P, ;YES, RETURN HLRZ T3,T2 ;GET INDIRECT AND INDEX FIELDS HRRZS T2 ;ISOLATE ADDRESS WITH ZERO SECTION NUMBER DPB T3,[POINT 5,T2,5] ;STORE BACK INDIRECT AND INDEX FIELDS POPJ P, ;AND RETURN GTWGB2: MOVE T2,T1 ;SET UP ADDRESS PORTION OF BYTE POINTER TLZ T2,(77B5) ;... ROT T3,-1 ;COMPUTE TABLE OFFSET AND LH/RH FLAG TLZN T3,(1B0) ;SELECT EITHER LEFT OR RIGHT HALF WORD SKIPA T1,OWBTWB-22(T3) ;FETCH FIRST WORD OF BYTE POINTER MOVS T1,OWBTWB-22(T3) ;... HLLZS T1 ;KEEP JUST "P" AND "S" FIELDS POPJ P, ;AND RETURN ;TABLE FOR CONVERTING FROM ONE WORD GLOBAL "P&S" VALUE TO NORMAL ;BYTE POINTER "P" AND "S" FIELDS OWBTWB: 000000,,440600 ;44,,45 360600,,300600 ;46,,47 220600,,140600 ;50,,51 060600,,000600 ;52,,53 441000,,341000 ;54,,55 241000,,141000 ;56,,57 041000,,440700 ;60,,61 350700,,260700 ;62,,63 170700,,100700 ;64,,65 010700,,441100 ;66,,67 331100,,221100 ;70,,71 111100,,001100 ;72,,73 442200,,222200 ;74,,75 002200,,444400 ;76,,77 SUBTTL BYTE POINTERS ;BYTE POINTERS FOR PORTAL ID IN T1 PIPECN: POINTR (T1,PI.ECI) ;ETHERNET CHANNEL ID PIPEPB: POINTR (T1,PI.EPB) ;ETHERNET PORTAL BLOCK ADDRESS ;BYTE POINTERS FOR ETHERNET PORTAL BLOCK EPPPST: POINTR (EPBSTS(Q2),EPSPST) ;PREVIOUS PROTOCOL STATUS EPPSTS: POINTR (EPBSTS(Q2),EPSSTS) ;CURRENT PROTOCOL STATUS EPPPAD: POINTR (EPBSTS(Q2),EPSPAD) ;PROTOCOL PADDING BIT ;BYTE POINTERS FOR ETHERNET KONTROLLER BLOCK EKPCPU: POINTR (EKBKTY(Q3),EKYCPU) ;CPU NUMBER OF KONTROLLER EKPKTY: POINTR (EKBKTY(Q3),EKYKTY) ;KONTROLLER TYPE CODE EKPKNO: POINTR (EKBKTY(Q3),EKYKNO) ;KONTROLLER NUMBER ;BYTE POINTERS TO COUNTERS UPDATE ACTION TABLES UKCUAP: POINT 1,UKCUAT ;POINTER TO KONTROLLER ACTION TABLE ;UPDATE ACTION TABLES UKCUAT: EXP 1B!1B ;TRANSMIT AND RECEIVE FAILURE MASKS SUBTTL ETHERNET INFORMATION GETTAB TABLE ;GETTAB TABLE .GTETH(202) - ETHERNET INFORMATION $LOW ;PUT INTO LOW SEGMENT ETHGTB:: ;ETHERNET INFORMATION GETTAB TABLE %EINEC: BLOCK 1 ;NUMBER OF ETHERNET CHANNELS ON SYSTEM %EICHN: BLOCK 1 ;ADDRESS OF FIRST ETHERNET CHANNEL BLOCK %EINEK: BLOCK 1 ;NUMBER OF ETHERNET KONTROLLERS ON SYSTEM %EIKON: BLOCK 1 ;ADDRESS OF FIRST ETHERNET KONTROLLER BLOCK %EISYS: ECBSYS,,EKBSYS ;OFFSETS TO SYSTEM WIDE LINK WORDS %EISTS: ECBSTS,,EKBSTS ;OFFSETS TO STATUS WORDS %EIBYR: BLOCK 1 ;TOTAL BYTES RECEIVED %EIBYX: BLOCK 1 ;TOTAL BYTES TRANSMITTED %EIDGR: BLOCK 1 ;TOTAL DATAGRAMS RECEIVED %EIDGX: BLOCK 1 ;TOTAL DATAGRAMS TRANSMITTED ETHMXL==:<.-ETHGTB-1>B26 ;MAXIMUM ENTRY IN TABLE FOR GETTAB UUO $HIGH ;BACK TO HIGH SEGMENT SUBTTL THE END ETHLIT:!XLIST ;LITERALS LIT LIST ETHEND:!END