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

2372 lines
85 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.
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,<IFN <CODE-<.-ETHDSP>>,<PRINTX ?Table ETHDSP entry CODE is out of order>>
IFIW ADDR ;CODE
>; END DEFINE DISP
ETHDSP: FNC ;GENERATE FUNCTION DISPATCH TABLE
IF1,<IFN <NU.MAX-<.-ETHDSP-1>>,<PRINTX ?Table ETHDSP is missing entries>>
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,<PRINTX ? UN and MSD values for EXEC mapping disagree>
IFN VMC.US-UNA.UV,<PRINTX ? UN and MSD values for USER mapping disagree>
IFN VMC.NO-UNA.PH,<PRINTX ? UN and MSD values for PHYSICAL mapping disagree>
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,<BYTE (8) 1,0,0,0> ;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,<PRINTX ? UN and MSD values for EXEC mapping disagree>
IFN VMC.US-UNA.UV,<PRINTX ? UN and MSD values for USER mapping disagree>
IFN VMC.NO-UNA.PH,<PRINTX ? UN and MSD values for PHYSICAL mapping disagree>
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,<IFN <CODE-<.-RCITAB>>,<PRINTX ?Table RCITAB entry CODE is out of order>>
EXP INST ;;INSTRUCTION TO FETCH VALUE
>; END DEFINE INF
RCITAB: INF <CI.CNM>, <MOVE T1,ECBCID(Q1)> ;CHANNEL NUMBER
INF <CI.EAD+0>,<MOVE T1,ECBEAD+0(Q1)> ;CURRENT ETHERNET ADDRESS
INF <CI.EAD+1>,<MOVE T1,ECBEAD+1(Q1)> ;...
RCITLN==.-RCITAB ;LENGTH OF CHANNEL INFORMATION TABLE
IF1,<IFN <CI.LEN-<.-RCITAB>>,<PRINTX ?Table RCITAB is missing entries>>
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,<BYTE (8) 1,0,0,0> ;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,<IFN <CODE-<.-RPITAB>>,<PRINTX ?Table RPITAB entry CODE is out of order>>
EXP INST ;;INSTRUCTION TO FETCH VALUE
>; END DEFINE INF
RPITAB: INF <PI.JCH>,<MOVE T1,EPBJCH(Q2)> ;JCH OF PORTAL OWNER
INF <PI.PIW>,<PUSHJ P,RPIPIW> ;PROTOCOL IDENTIFICATION WORD
INF <PI.CSW>,<PUSHJ P,GENCSW> ;CHANNEL STATUS WORD
INF <PI.KSW>,<PUSHJ P,GENKSW> ;KONTROLLER STATUS WORD
RPITLN==.-RPITAB ;LENGTH OF PORTAL INFORMATION TABLE
IF1,<IFN <PI.LEN-<.-RPITAB>>,<PRINTX ?Table RPITAB is missing entries>>
;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,<IFN <CODE-<.-RKITAB>>,<PRINTX ?Table RKITAB entry CODE is out of order>>
EXP INST ;;INSTRUCTION TO FETCH VALUE
>; END DEFINE INF
RKITAB: INF <KI.CSW>, <PUSHJ P,GENCSW> ;CHANNEL STATUS WORD
INF <KI.CPU>, <LDB T1,EKPCPU> ;CPU NUMBER OF KONTROLLER
INF <KI.TYP>, <LDB T1,EKPKTY> ;KONTROLLER TYPE
INF <KI.KNO>, <LDB T1,EKPKNO> ;KONTROLLER NUMBER
INF <KI.HEA+0>,<MOVE T1,EKBHEA+0(Q3)> ;HARDWARE ETHERNET ADDRESS
INF <KI.HEA+1>,<MOVE T1,EKBHEA+1(Q3)> ;HARDWARE ETHERNET ADDRESS
RKITLN==.-RKITAB ;LENGTH OF KONTROLLER INFORMATION TABLE
IF1,<IFN <KI.LEN-<.-RKITAB>>,<PRINTX ?Table RKITAB is missing entries>>
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<KC.XFM>!1B<KC.RFM> ;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