IMD 1.17: 11/11/2014 12:16:05 82VKXSVRDOS B* VERSADOS/RMS68K SRC/OBJ 4.4 (NOT BOOTABLE) SN=49367 30 OF 30  SR30q82VKXSVRDOS 0420¦i-‰TTL‡BUFFERMGTSUBROUTINES(Copyright1982byMotorola,Inc.)‰NOLIST‰INCLUDEƒ9995.&.CRASH.MC‰INCLUDEƒ9995.NTS.NAT.EQ‰INCLUDEƒ9995.&.STR.EQ ‰INCLUDEƒ9995.SDLCPRI.TEMPLTS.EQ‰LIST ‰SECTIONƒ94‰XREF.S„NATBEG,SYSPOFF,MEMOFF,FREEQHD,FREEQND,MEMOFF5‰XREF.S„FQLWM,FQBCNT,USERQHD,USERQND,SDLCPCB,SDLCQUSB‰XREF†SDLCQXMT   H*************************************************************************Æ**Æ**šBUFFERMANAGEMENT›**Æ**Æ* *•NETWORKSERVICES/SDLCONLY•**Æ**Æ**˜SHAREDRAM/BUFFERPOOL˜**Æ**Æ*H************************************************************************   H*************************************************************************Æ*E*WARNING:"PTXMQ"CONTAINSANIMPLEMENTATIONRESTRICTIONWHICHHAS„*F*NOTBEENRESOLVEDYET.‚"PTXMQ"ASSUMESTHATIFMEMOFFISZEROTHEN‚*C*THESDLCDRIVERISPRESENTINTHESAMEMPU.‚INEXISTINGUSESOF…*D*THISMODULE,THATISTRUE.‚HOWEVERITMAYNOTALWAYSBETRUE.‚ATƒ*D*SOMEFUTURETIME,"PTXMQ"SHOULDBECHANGEDTODETERMINEIFSDLC…*E*EXISTSINTHESAMEMPUINAMOREDIRECTFASHION,ANDTHEREBYLIFT„*E*THISRESTRICTION.‚AWARNINGISGENERATEDWITHIN"PTXMQ"TOACTASƒ*#*AREMINDEROFTHISRESTRICTION.¦**Æ*H************************************************************************ ‰PAGE H*************************************************************************Æ*E*ƒTHISMODULEISUSEDINALLPROCESSORSWHICHACCESSTHESHAREDRAM‚*D*AREACONTAININGTHESHAREDBUFFERS.‚TWOSYSGENDEFINEDCONSTANTS„*D*WHICHAREUNIQUETOTHEPROCESSORUSINGTHISCODEAREIMPORTANT.…*A*„"SYSPOFF"ISALONGWORDCONTAININGTHEOFFSETTHISPROCESSOR…*9*‡MUSTUSEINACCESSINGTHEFREEPOOLCONTROLAREA,ANDŠ*E*„"MEMOFF"ISALONGWORDCONTAININGTHEOFFSETTHISPROCESSORMUST*(*‡USEINACCESSINGINDIVIDUALBUFFERS.›**Æ**„-„-„-„-„-„-„-„-„-„-„-„-„-…**Æ*A*„<-------MPUA'sView-------><-------MPUB'sView------->…**Æ* <(*0&8?@0H9P/X6`4h<p*x0€1ˆ7  *’+-------------+¥*1*„$00000000-->!!ƒ(MPUBCannot"see"MPUA's‡*)*’!ƒPrivateƒ!…privateRAMareaatall.)‡* *’!…RAM…!¥**„$00FBFFFF-->!!¥**’+-------------+¥**š+-------------+*5*„$00FC0000---------->!!<------------$00000000…**š!ƒShared„!* *š!…RAM…!*5*„$00FFFFFF---------->!!<------------$0003FFFF…**š+-------------+**Æ*+*„SYSPOFF=$00FC0C00—SYSPOFF=$00000000…*)*„MEMOFF‚=$00FC0000—MEMOFF‚=$00000000…**Æ**„-„-„-„-„-„-„-„-„-„-„-„-„-…**Æ*D*„THISDIAGRAMREPRESENTSTHEEXORMACS/VM02CONFIGURATIONUSEDFOR‚*G*NETWORKSERVICESQUITEOFTEN.‚THEVM02'SONBOARDMEMORYIS"SHARED"*G*BETWEENTHEPROCESSORS.‚THEVM02"SEES"THISAREABEGINNINGATZERO,*8*WHILETHEEXORMACS"SEES"ITBEGINNINGAT$00FC0000.‘*D*„MEMOFFISTHEOFFSETTOTHESHAREDRAMAREA.‚INTHEVM02,MEMOFF*<*WILLBEZERO.‚INTHEEXORMACS,MEMOFFWILLBE$00FC0000.Œ*B*„SYSPOFFISTHEOFFSETTOTHESYSPARAREA.‚INTHEVM02,SYSPOFFƒ*=*WILLBEZERO.‚INTHEEXORMACS,SYSPOFFWILLBE$00FC0C00.‹*B*„INBOTHPROCESSORSTHEN,THEBUFFERPOOLQUEUECONTROLAREA(A„*F*VM02SYSPARCONSTRUCT)ISACCESSEDAT"FREQHD+SYSPOFF".‚SIMILARLY,‚*E*AGIVENBUFFERMAYBEACCESSEDINEITHERMPUAS"BUFADDR+MEMOFF",„*:*ANDTHEUSERQUEUEMAYBEFOUNDAT"USERQUEUE+MEMOFF".*E*„HOWEVER,SINCEBUFFERSINTHEFREEPOOLANDUSERQUEUEARELINKED*E*ANDMANIPULATEDBYEITHERPROCESSOR,WHO'S"VIEW"OFADDRESSESIS„* *USED?À*C*„BYCONVENTION,BUFFERSINTHESEAREASARELINKEDTOGETHERUSINGƒ*C*NOOFFSETWHATSOEVER.‚ANYPROCESSORACCESSINGTHEMWILLHAVETO…*G*INCLUDEITSOWNMEMOFFINACCESSINGTHEBUFFERS,ORITSOWNSYSPOFF‚*G*INACCESSINGTHECONTROLAREA.‚(BECAUSESYSPOFFANDMEMOFFAREBOTH*C*ZEROINTHEVM02,ITWOULDAPPEARTHATTHEPOOLUSESTHEVM02'S†*D*OFFSETS.‚THISWILLNOTBETHECASEHOWEVERWHEREBOTHPROCESSORS„*B*ARE,FOREXAMPLE,VM02'S.‚ONEWILLHAVEZEROOFFSETSWHILETHE†* *WILLHAVENON-ZEROOFFSETS.)©**Æ*H************************************************************************‰PAGEH*************************************************************************Æ*C*„THESEROUTINESIMPLEMENTABUFFERMANAGEMENTSYSTEMUTILIZINGAƒ*E*QUEUEOFSHARED"FREEBUFFERS".‚THEBUFFERSEXISTINASHAREDRAMƒ*E*AREAOFMEMORY,ANDA"LOCK"ISUSEDONTHEQUEUEHEADPOINTERTO„*D*INSUREEXCLUSIVEACCESSTOTHEPOOLCONTROLAREADURINGUPDATES.…*F*THESEROUTINESSHOULDBEUSEDIN***ALL***PROCESSORSWHICHACCESSƒ*F*AND/ORMANIPULATETHEQUEUECONTROLAREA.‚A"LOWWATERMARK"LEVEL‚*H* IS DEFINED WHICH PREVENTS APPLICATIONS (OR FUNCTIONS ON THEIR BEHALF)*-*FROMCOMPLETELYDRAININGTHEBUFFERPOOL.œ**Æ*A*„"SBGTFRIR"(AND"GTFRIR")IGNORETHELOWWATERMARK,ANDWILL…*E*SUPPLYONEBUFFERFROMTHEPOOL.‚ANINDICATIONISRETURNEDIFTHEƒ*E*POOLHASJUSTBECOMEEMPTY.‚THISMODULESHOULDNOTBEUSEDBY,ORƒ*F*ONBEHALFOFAPPLICATIONS.‚ITISINTENDEDFORLOWLEVEL,HIGHPER-‚*G*FORMANCEROUTINESONLYWHICHMAYUSETHELASTBUFFERFROMTHEPOOL.‚**Æ*D*„"SBGTFRBF"(AND"GTFRBF")RETURNONEBUFFERIFTHEPOOLISABOVE‚*H* THE LOW WATER MARK, OTHERWISE A "NOT AVAILABLE" INDICATION IS GIVEN. **Æ*E*„"SBGTFRML"(AND"GTFRML")RETURNMANYBUFFERSFROMTHEPOOLUPTO*H* A REQUESTED NUMBER, OR UNTIL THE LOW WATER MARK IS REACHED, WHICHEVER*G*OCCURSFIRST.‚THERETURNEDBUFFERSARELINKEDTOGETHERANDTHEFIRST*F*BUFFERSADDRESS,THENUMBEROFBUFFERSRETURNED,ANDARETURNCODEƒ*#*OFALL,SOME,ORNONEISGIVEN.¦**Æ*B*„"SBPTFRBF"(AND"PTFRBF")RETURNASINGLEBUFFERBACKINTOTHE„* *POOL.À**Æ*A*„"SBPTFRML"(AND"PTFRML")RETURN"MANY"BUFFERSBACKINTOTHE…* *POOL.À**Æ*E*„"SBPTXMQ"(AND"PTXMQ")PUTASINGLEBUFFERONTHETRANSMITQUEUE*G*OFTHEAPPROPRIATESECONDARYSTATION'SCONTROLBLOCK.‚IFTHEPASSED*D*SECONDARYSTATIONNUMBERISINVALID(I.E.,THESECONDARYSTATION…*F*CONTROLBLOCKCANNOTBEFOUND),ANERRORINDICATIONISRETURNEDASƒ* E*WELLASTHEBUFFER.‚IFTHESTATIONNUMBERISVALID,THEBUFFERISƒ*D*ENQUEUEDTOTHEAPPROPRIATESECONDARYSTATIONCONTROLBLOCK,THE…*G*SDLCDRIVERISNOTIFIEDOFTHETRAFFIC'SARRIVAL,ANDAGOODRETURN‚*4*CODE(ANDNOBUFFER)ARERETURNEDTOTHECALLER.•**Æ*D*„"SBPTUSQ"(AND"PTUSQ")PUTASINGLEBUFFERONTHE"USERQUEUE".‚*F*WHERETHEHOSTINGSYSTEMCONTAINSNETWORKSERVICES,ITISNOTIFIEDƒ**OFTHEBUFFER'SARRIVAL.­**Æ*E*„"SBGTUSQ"(AND"GTUSQ")GETASINGLEBUFFERFROMTHE"USERQUEUE",*G*RETURNINGANINDICATIONOFWHETHERORNOTABUFFERWASOBTAINED.‚IF*H* NO BUFFER IS AVAILABLE, A "BAD" POINTER IS RETURNED FACILITATING THE **FINDINGOFBUGS.µ**Æ*H************************************************************************‰PAGEH*************************************************************************Æ*0*ˆSYMBOLDEFINITIONSUSEDWITHINTHESEMODULES’**Æ*H************************************************************************ )* CONDITION CODE REGISTER BIT DEFINITIONS $N.SET„EQU‡%00001000NEGATIVEBITSET Z.SET„EQU‡%00000100ZEROBITSET$V.SET„EQU‡%00000010OVERFLOWBITSET!C.SET„EQU‡%00000001CARRYBITSET &N.CLR„EQU‡%00000000NEGATIVEBITCLEAR"Z.CLR„EQU‡%00000000ZEROBITCLEAR&V.CLR„EQU‡%00000000OVERFLOWBITCLEAR#C.CLR„EQU‡%00000000CARRYBITCLEAR   (* INTERRUPT LEVEL WITHIN STATUS REGISTER 'LEVEL7ƒEQU‡$0700…LEVEL7INTERRUPTMASK   * LOCK BIT WITHIN AN ADDRESS *LOCKBIT‚EQU‡$80000000MOSTSIGNIFICANTBIT   )* AN ADDRESS VALUE WHICH HELPS CATCH BUGS AFLYPAPEREQU‡$FFFFFFFF(IT'SANODDNUMBER,MOVE.W/.LWILLFAIL!) ‰PAGEH*************************************************************************Æ*=*ˆSUBROUTINE:‚"SBGTFRIR"‚GETONEBUFFERFROMTHEFREEQUEUEƒ**ˆTRAP:ˆ"GTFRIR"©**ˆENTER:NOARGUMENTS.ª*(*ˆRETURN:‚A3.L=POINTERTOTHEBUFFER™**’CCR±*/*‘Zset‚BUFFERWASSUPPLIED(NOTLASTBUFFER)‰*"*‘Nset‚LASTBUFFERWASSUPPLIED–**‘neither‚NOBUFFERAVAILABLE™*:*ˆNOTE:‚THISROUTINEISTOBEUSEDONLYBYTHEDLCLEVEL‡*/*BECAUSEITWILLSUPPLYTHEVERYLASTBUFFERŒ*#*ˆREGISTERSUSED:ƒ01234567**˜D­* *˜A‡R‡S** |‡|_stack–** |_________returned“**Æ*#*REPLACEDON3/8/83,EDSKINNER.¦**Æ*H************************************************************************ ‰XDEF†GTFRIR,SBGTFRIR9GTFRIRƒBSR.S…SBGTFRIR‚TRAPENTRYPOINT,DOTHESUBROUTINE+‰MOVE.W„SR,0(A7)‚REPLACETHECONDITIONCODE"‰RTE‘SOWEGIVEPROPERRETURNCODE /SBGTFRIRMOVE.W„SR,-(A7)‚SUBROUTINEENTRYPOINT‰MOVE.L„A1,-(A7)A‰MOVE.B„#Z.SET+N.CLR,5(A7)ASSUME"BUFFERWASSUPPLIED,NOTLAST";‰MOVE.L„SYSPOFF,A1GETTHELOCALOFFSETTOTHECONTROLAREA H* THE FOLLOWING TST OF MEMOFF AND BNE INSTRUCTIONS ARE FOR TEMPORARY USEH*ONLY.‚IWANTTOSEEIFANYONEISUSINGTHISSUBROUTINEINTHEEXORMACSA*MPU-WHICHSHOULDNOTBEHAPPENING.†EDSKINNER,MARCH9,1983. ‰TST.L…MEMOFF6‰CRASH.NE‚*-1‡DIEIFNOTRUNNINGINTHEVM02WITHSDLC 7* OBTAIN EXCLUSIVE ACCESS TO THE FREE POOL CONTROL AREA6GTFRIRLKMOVE.W„4(A7),SR‚RESTOREPRIORINTERRUPTLEVEL!‰ORI.W…#LEVEL7,SRMASKINTERRUPTS(‰TAS‡FREEQHD(A1)ATTEMPTTOSETTHELOCK3‰BMI.S…GTFRIRLK‚LOOPIFFAILED(ANOTHERMPUHASIT),‰CRASH.NE‚*-1‡CRASHIFLOCKBYTEISCORRUPT! .* FREEQHD IS LOCKED AND INTERRUPTS ARE MASKED!/‰SUB.W…#1,FQBCNT(A1)DECREMENTCOUNTOFBUFFERS;‰BGT.S…GTFRIR1ƒOUTIFATLEASTONEREMAINSAFTERWEGETONE)‰BMI.S…GTFRIR0ƒOUTIFNOTEVENONEFORUS=* EXACTLY ONE LEFT, WE WILL NOW GET IT LEAVING THE POOL EMPTY<‰MOVE.B„#N.SET+Z.CLR,5(A7)ASSERT"LASTBUFFERWASSUPPLIED"0‰CLR.L…FREEQND(A1)ANDCLEARPOOL'STAILPOINTEREGTFRIR1‚MOVE.L„FREEQHD(A1),A3HEADBUFFERADDR->A3(NOOFFSETYET!))‰SUBA.L„#LOCKBIT,A3TURNOFFTHELOCKBIT8‰ADD.L…MEMOFF,A3COMPUTEWHEREWE"SEE"THEBUFFERTOBE9‰BSET†#7,SDDLNK(A3)‚SETLOCKBITINNEXTBUFFER'SADDRESS3‰CRASH.NE‚*-1‡COMMITHARI-KARIIFIT'SALREADYSET!B‰MOVE.L„SDDLNK(A3),FREEQHD(A1)STORENEWHEADPTR,ALREADYLOCKED! )‰BCLR†#7,FREEQHD(A1)ANDRELEASETHELOCK7‰CRASH.EQ‚*-1‡COMMITHARI-KARIIFITWASALREADYCLEAR!7‰MOVE.W„4(A7),SR‚RESTOREPRIORINTERRUPTLEVELA.S.A.P.,‰CLR.L…0(A3)…CLEARTHEBUFFER'SFORWARDLINK‰CLR.L…4(A3)…CLEAR‰CLR.L…8(A3)ŠOTHERPARTS#‰CLR.L…12(A3)”OFTHEBUFFERASWELL‰MOVE.L„(A7)+,A1#‰MOVE.W„(A7)+,SR‚ASSERTRETURNCODE ‰RTS‘RETURN 1* NO BUFFERS LEFT AT ALL, NOT EVEN ONE FOR CALLER6GTFRIR0‚ADD.W…#1,FQBCNT(A1)PUTCOUNTBACKLIKEITWAS4‰CRASH.NE‚*-1‡SHOULDBECOMEZERO!DIEIFITDOESN'T!)‰BCLR†#7,FREEQHD(A1)ANDRELEASETHELOCK7‰CRASH.EQ‚*-1‡COMMITHARI-KARIIFITWASALREADYCLEAR!7‰MOVE.W„4(A7),SR‚RESTOREPRIORINTERRUPTLEVELA.S.A.P.)‰CLR.B…5(A7)…ASSERT"NOBUFFERAVAILABLE"1‰MOVE.L„#FLYPAPER,A3BUFFERPOINTER="BAD"VALUE‰MOVE.L„(A7)+,A1#‰MOVE.W„(A7)+,SR‚ASSERTRETURNCODE ‰RTS‘RETURN‰PAGEH*************************************************************************Æ*=*ˆSUBROUTINE:‚"SBGTFRBF"‚GETONEBUFFERFROMTHEFREEQUEUEƒ**ˆTRAP:ˆ"GTFRBF"©**ˆENTER:NOARGUMENTS.ª*-*ˆRETURN:‚A0.L=ADDRESSOFBUFFERSUPPLIED”**’CCR±**“ZsetBUFFERWASSUPPLIEDš**’notset‚NOBUFFERAVAILABLE˜*A*ˆNOTE:‚THISROUTINEWILLNOTDEPLETETHEFREEQUEUECOMPLETELY*5*ITWILLSUPPLYBUFFERSDOWNTOTHELOWWATERMARK†*#*ˆREGISTERSUSED:ƒ01234567**˜DU«* *˜ARS**š||_stack–**š|_______________returned“**Æ*#*REPLACEDON3/8/83,EDSKINNER.¦**Æ*H************************************************************************ ‰XDEF†GTFRBF,SBGTFRBF9GTFRBFƒBSR.S…SBGTFRBFTRAPENTRYPOINT,DOTHESUBROUTINE+‰MOVE.W„SR,0(A7)‚REPLACETHECONDITIONCODE"‰RTE‘SOWEGIVEPROPERRETURNCODE /SBGTFRBFMOVE.W„SR,-(A7)‚SUBROUTINEENTRYPOINT3‰MOVE.B„#Z.SET,1(A7)ASSUMEBUFFERWILLBESUPPLIED‰MOVE.L„A1,-(A7);‰MOVE.L„SYSPOFF,A1GETTHELOCALOFFSETTOTHECONTROLAREA 7* OBTAIN EXCLUSIVE ACCESS TO THE FREE POOL CONTROL AREA6GTFRBFLKMOVE.W„4(A7),SR‚RESTOREPRIORINTERRUPTLEVEL!‰ORI.W…#LEVEL7,SRMASKINTERRUPTS(‰TAS‡FREEQHD(A1)ATTEMPTTOSETTHELOCK3‰BMI.S…GTFRBFLK‚LOOPIFFAILED(ANOTHERMPUHASIT),‰CRASH.NE‚*-1‡CRASHIFLOCKBYTEISCORRUPT! .* FREEQHD IS LOCKED AND INTERRUPTS ARE MASKED!‰MOVE.W„FQBCNT(A1),D0-‰CMP.W…FQLWM(A1),D0ABOVETHELOWWATERMARK?+‰BLE.S…GTFRBFLW‚NO,CAN'TGETABUFFER,OUT*‰SUB.W…#1,FQBCNT(A1)YES,WEWILLTAKEONE;‰BGT.S…GTFRBF1ƒOUTIFATLEASTONEREMAINSAFTERWEGETONE7‰BMI.S…GTFRBF0ƒOUTIFNOTEVENONEFORUS(L.W.M.<=0)=* EXACTLY ONE LEFT, WE WILL NOW GET IT LEAVING THE POOL EMPTY,‰CLR.L…FREEQND(A1)CLEARPOOL'STAILPOINTEREGTFRBF1‚MOVE.L„FREEQHD(A1),A0HEADBUFFERADDR->A0(NOOFFSETYET!)%‰SUBA.L„#LOCKBIT,A0TURNOFFLOCKBIT8‰ADD.L…MEMOFF,A0COMPUTEWHEREWE"SEE"THEBUFFERTOBE9‰BSET†#7,SDDLNK(A0)SETLOCKBITINNEXTBUFFER'SADDRESS3‰CRASH.NE‚*-1‡COMMITHARI-KARIIFIT'SALREADYSET!B‰MOVE.L„SDDLNK(A0),FREEQHD(A1)STORENEWHEADPTR,ALREADYLOCKED!)‰BCLR†#7,FREEQHD(A1)ANDRELEASETHELOCK7‰CRASH.EQ‚*-1‡COMMITHARI-KARIIFITWASALREADYCLEAR!7‰MOVE.W„4(A7),SR‚RESTOREPRIORINTERRUPTLEVELA.S.A.P.,‰CLR.L…0(A0)…CLEARTHEBUFFER'SFORWARDLINK‰CLR.L…4(A0)…CLEAR‰CLR.L…8(A0)ŠOTHERPARTS#‰CLR.L…12(A0)”OFTHEBUFFERASWELL‰MOVE.L„(A7)+,A1#‰MOVE.W„(A7)+,SR‚ASSERTRETURNCODE ‰RTS‘RETURN 1* NO BUFFERS LEFT AT ALL, NOT EVEN ONE FOR CALLER6GTFRBF0‚ADD.W…#1,FQBCNT(A1)PUTCOUNTBACKLIKEITWAS4‰CRASH.NE‚*-1‡SHOULDBECOMEZERO!DIEIFITDOESN'T!1GTFRBFLWBCLR†#7,FREEQHD(A1)ANDRELEASETHELOCK7‰CRASH.EQ‚*-1‡COMMITHARI-KARIIFITWASALREADYCLEAR!7‰MOVE.W„4(A7),SR‚RESTOREPRIORINTERRUPTLEVELA.S.A.P.)‰CLR.B…5(A7)…ASSERT"NOBUFFERAVAILABLE"1‰MOVE.L„#FLYPAPER,A0BUFFERPOINTER="BAD"VALUE‰MOVE.L„(A7)+,A1#‰MOVE.W„(A7)+,SR‚ASSERTRETURNCODE ‰RTS‘RETURN‰PAGEH*************************************************************************Æ*>*ˆSUBROUTINE:‚"SBGTFRML"‚GETMANYBUFFERSFROMTHEFREEPOOL‚**ˆTRAP:ˆ"GTFRML"©*-*ˆENTER:‚D1.W=NUMBEROFBUFFERSREQUESTED”* /*ˆRETURN:‚A0.L=ADDROF1STBUFFERINSTRING’*%*‘D1.W=NUMBEROFBUFFERSSUPPLIED”**’CCR±*#*“ZsetALLBUFFERSWERESUPPLIED”*$*“NsetSOMEBUFFERSWERESUPPLIED“* *’neither‚NOBUFFERSAVAILABLE—*#*ˆREGISTERSUSED:ƒ01234567* *˜DUR©* *˜ARS**œ|‹|_stack–**œ|_____________returned“**Æ*#*REPLACEDON3/8/83,EDSKINNER.¦**Æ*H************************************************************************ ‰XDEF†GTFRML,SBGTFRML9GTFRMLƒBSR.S…SBGTFRML‚TRAPENTRYPOINT,DOTHESUBROUTINE+‰MOVE.W„SR,0(A7)‚REPLACETHECONDITIONCODE"‰RTE‘SOWEGIVEPROPERRETURNCODE /SBGTFRMLMOVE.W„SR,-(A7)‚SUBROUTINEENTRYPOINT$‰CLR.B…1(A7)…ASSUMEWEWILLGETNONE0‰CLR.W…-(A7)…INITCOUNTOFHOWMANYWE'VEGOTTEN-‰CLR.L…-(A7)…INITA(LASTBUFFERWE'VEGOTTEN).* STACK: 0(A7).L = A(LAST BUFFER WE'VE GOTTEN)**ˆ4(A7).W=COUNTOFHOWMANYWE'VEGOTTEN!*ˆ6(A7).W=RETURNCONDITIONCODE9‰TST.W…D1ˆCALLERWANTLESSTHANOREQUALTOZEROBUFFERS?$‰CRASH.LE‚*-1‡YES,COMMITHARI-KARI!'‰BRA.S…GTFRMLGB‚NO,GOTRYANDGETTHEM CGTFRMLGABSR.L…SBGTFRBF‚GETONEBUFFER,CHECKINGTHELOWWATERMARK'‰BNE.S…GTFRMLGS‚OUTIFCOULDN'TGETONE1‰MOVE.B„#N.SET+Z.CLR,7(A7)RETURNCODE=GOTSOME@‰MOVE.L„0(A7),SDDLNK(A0)NEWBFRPOINTSTOLASTBFRWE'VEGOTTEN=‰MOVE.L„A0,0(A7)‚ANDNEWBUFFERBECOMESTHELASTWE'VEGOTTEN*‰ADDQ.W„#1,4(A7)‚ANDCOUNTHOWMANYWEGET3GTFRMLGBDBRA†D1,GTFRMLGALOOPTILLWEGETTHEMALL KGTFRMLGDMOVE.B„#Z.SET+N.CLR,7(A7)GOTALLTHEUSERWANTED,SETRETURNCODE9GTFRMLGSMOVE.L„(A7)+,A0‚A0=A(FIRSTBUFFERINTHELIST)%‰MOVE.W„(A7)+,D1‚D1=HOWMANYWEGOT*‰BGT.S…GTFRMLEX‚OUTIFWEGOTATLEASTONE3‰MOVE.L„#FLYPAPER,A0GOTNONE,SETA0=BADPOINTER+GTFRMLEXMOVE.W„(A7)+,SR‚ASSERTRETURNCODE ‰RTS‘RETURN‰PAGEH*************************************************************************Æ*9*ˆSUBROUTINE:‚"SBPTFRBF"‚PUTABUFFERONTHEFREEQUEUE‡**ˆTRAP:ˆ"PTFRBF"©*'*ˆENTER:‚A0.L=ADDRESSOFTHEBUFFERš**ˆRETURN:NOARGUMENTS.©*#*ˆREGISTERSUSED:ƒ01234567**˜D­* *˜APS**š||_stack–**š|_______________preserved’**Æ*#*REPLACEDON3/8/83,EDSKINNER.¦**Æ*H************************************************************************ ‰XDEF†PTFRBF,SBPTFRBF9PTFRBFƒBSR.S…SBPTFRBF‚TRAPENTRYPOINT,DOTHESUBROUTINE+‰MOVE.W„SR,0(A7)‚REPLACETHECONDITIONCODE"‰RTE‘SOWEGIVEPROPERRETURNCODE /SBPTFRBFMOVE.W„SR,-(A7)‚SUBROUTINEENTRYPOINT‰MOVE.L„A1,-(A7)/‰CMPA.L„#0,A0…DIDCALLERPASSUSANILPOINTER?$‰CRASH.EQ‚*-1‡YES,COMMITHARI-KARI!‰MOVE.L„SYSPOFF,A16‰CLR.L…SDDLNK(A0)CLEARRETURNINGBUFFERSFORWARDLINK 7* OBTAIN EXCLUSIVE ACCESS TO THE FREE POOL CONTROL AREA6PTFRBFLKMOVE.W„4(A7),SR‚RESTOREPRIORINTERRUPTLEVEL!‰ORI.W…#LEVEL7,SRMASKINTERRUPTS(‰TAS‡FREEQHD(A1)ATTEMPTTOSETTHELOCK3‰BMI.S…PTFRBFLK‚LOOPIFFAILED(ANOTHERMPUHASIT),‰CRASH.NE‚*-1‡CRASHIFLOCKBYTEISCORRUPT! .* FREEQHD IS LOCKED AND INTERRUPTS ARE MASKED!?‰MOVE.L„FREEQHD(A1),SDDLNK(A0)LINKFREEQUEUEAFTERRETURNBFRA‰BCLR†#7,SDDLNK(A0)CLEAREXTRANEOUSLOCKBITINOURFORWARDLINK7‰CRASH.EQ‚*-1‡COMMITHARI-KARIIFBITWASALREADYCLEAR?‰SUBA.L„MEMOFF,A0REMOVEOURLOCALOFFSETFROMBUFFER'SADDRESS/‰ADDA.L„#LOCKBIT,A0(ASSERTPOOLSTILLLOCKED!)A‰MOVE.L„A0,FREEQHD(A1)STORENEWHEADPOINTER,LOCKBITSTILLSET'‰TST.L…FREEQND(A1)WASTHEQUEUEEMPTY?1‰BNE.S…PTFRBFNE‚NO,TAILPOINTERISVALIDALREADY7‰TST.W…FQBCNT(A1)YES,COUNTOUGHTTOBEZERORIGHTNOW‰CRASH.NE‚*-1‡DIEIFITISN'T@‰SUBA.L„#LOCKBIT,A0(LOCKBITDOESN'TAPPLYTOTHETAILPOINTER);‰MOVE.L„A0,FREEQND(A1)RETURNINGBUFFERISTAILBUFFERALSO4PTFRBFNEADDQ.W„#1,FQBCNT(A1)INCREMENTBUFFERCOUNT3‰CRASH.LE‚*-1‡DIEIFTHECOUNTISZEROORNEGATIVE!)‰BCLR†#7,FREEQHD(A1)ANDRELEASETHEPOOL-‰CRASH.EQ‚*-1‡DIEIFITWASALREADYUNLOCKED!7‰MOVE.W„4(A7),SR‚RESTOREPRIORINTERRUPTLEVELA.S.A.P.‰MOVE.L„(A7)+,A1)‰MOVE.L„#FLYPAPER,A0SETA0=BADPOINTER‰MOVE.W„(A7)+,SR ‰RTS‘RETURN‰PAGE H*************************************************************************Æ*8*ˆSUBROUTINE:‚"SBPTFRML"‚PUTALINKEDCHAINOFBUFFERSˆ**¡ONTHEFREEQUEUE”**ˆTRAP:ˆ"PTFRML"©*:*ˆENTER:‚A0.L=ADDRESSOFTHEFIRSTBUFFERINTHECHAIN‡**—ORNIL($00000000)**ˆRETURN:NOARGUMENTS.©*#*ˆREGISTERSUSED:ƒ01234567**˜DU«* *˜AUS**š||_stack–**š|_______________used—**Æ*#*REPLACEDON3/8/83,EDSKINNER.¦**Æ*H************************************************************************ ‰XDEF†PTFRML,SBPTFRML9PTFRMLƒBSR.S…SBPTFRML‚TRAPENTRYPOINT,DOTHESUBROUTINE+‰MOVE.W„SR,0(A7)‚REPLACETHECONDITIONCODE"‰RTE‘SOWEGIVEPROPERRETURNCODE *SBPTFRMLMOVE.L„A0,D0…SAVEA(FIRSTBUFFER) !* D0.L = A(NEXT BUFFER TO RETURN)5PTFRMLNXMOVE.L„D0,A0…GETADDRESSOFBUFFERTORETURN ‰TST.L…D05‰BEQ.S…PTFRMLEX‚OUTIFALLBUFFERSHAVEBEENRETURNED1‰MOVE.L„SDDLNK(A0),D0SAVEADDRESSOFNEXTBUFFER'‰BSR.L…SBPTFRBF‚RETURNTHEBUFFERINA04‰BRA.S…PTFRMLNX‚ANDLOOPTILLALLHAVEBEENRETURNED 1PTFRMLEXMOVE.L„#FLYPAPER,A0SETA0=BADPOINTER‰RTS‰PAGEH*************************************************************************Æ*:*ˆSUBROUTINE:‚"SBPTXMQ"‚PUTABUFFERONATRANSMITQUEUE†**ˆTRAP:ˆ"PTXMQ"ª*'*ˆENTER:‚A0.L=ADDRESSOFTHEBUFFERš**ˆRETURN:CCR³*-*‘ZsetBUFFERWASLINKEDTOTRANSMITQUEUEŒ*%*‘NsetILLEGALSDLCSTATIONNUMBER”*#*ˆREGISTERSUSED:ƒ01234567**˜DU«* *˜AUUU‰S**ž|‰|_stack–**ž|___________used—**Æ*#*REPLACEDON3/8/83,EDSKINNER.¦**Æ*H************************************************************************ H*************************************************************************Æ*E*WARNING:"PTXMQ"CONTAINSANIMPLEMENTATIONRESTRICTIONWHICHHAS„*F*NOTBEENRESOLVEDYET.‚"PTXMQ"ASSUMESTHATIFMEMOFFISZEROTHEN‚*C*THESDLCDRIVERISPRESENTINTHESAMEMPU.‚INEXISTINGUSESOF…*D*THISMODULE,THATISTRUE.‚HOWEVERITMAYNOTALWAYSBETRUE.‚ATƒ*D*SOMEFUTURETIME,"PTXMQ"SHOULDBECHANGEDTODETERMINEIFSDLC…*E*EXISTSINTHESAMEMPUINAMOREDIRECTFASHION,ANDTHEREBYLIFT„*E*THISRESTRICTION.‚AWARNINGISGENERATEDWITHIN"PTXMQ"TOACTASƒ*#*AREMINDEROFTHISRESTRICTION.¦**Æ*H************************************************************************ ‰XDEF†PTXMQ,SBPTXMQ7PTXMQ„BSR.S…SBPTXMQƒTRAPENTRYPOINT,DOTHESUBROUTINE+‰MOVE.W„SR,0(A7)‚REPLACETHECONDITIONCODE"‰RTE‘SOWEGIVEPROPERRETURNCODE .SBPTXMQ‚MOVE.W„SR,-(A7)‚SUBROUTINEENTRYPOINT ‰CMPA.L„#0,A0=‰CRASH.EQ‚*-1‡COMMITHARI-KARIIFCALLERPASSEDANILPOINTER ‰FAIL†501‡SEETHEABOVEWARNINGC*TESTMEMOFFFORZERO.‚INANEXORMACS/VM02CONFIGURATION,THESDLCH*DRIVEREXECUTESINTHEVM02.‚MEMOFFISZEROFORTHEVM02,ANDNON-ZEROI*FORTHEEXORMACS.‚BYTESTINGMEMOFFWEDETERMINETHAT(INTHISONETYPEI* OF SYSTEM CONFIGURATION) WE ARE RUNNING IN THE PROCESSOR WHICH CONTAINS* THE SDLC DRIVER.‰TST.L…MEMOFF„ISMEMOFFZERO?3‰BEQ.S…PTXMQSDL‚YES,ENQUEUETOSCBANDAWAKENSDLC<‰BSR‡SDLCQXMT‚NO,PASSTHEBUFFERTOPROPERMPUFORQUEUEING7‰MOVE.B„#Z.SET,1(A7)RETURNCODE=BUFFERWASPASSEDOK#‰MOVE.W„(A7)+,SR‚ASSERTRETURNCODE ‰RTS‘RETURN G* FOR THE REMAINDER OF THIS ROUTINE WE KNOW THAT WE ARE IN THE SAME MPUJ* AS THE SDLC DRIVER, AND THEREFORE THAT OUR "MEMOFF" AND "SYSPOFF" AS THEH*SAMEASHIS.‚FORTHISREASONWEDISPENSEWITHCORRECTIONFACTORSUSING3* THESE VARIABLES IN THE REMAINDER OF THIS ROUTINE.?PTXMQSDLCLR.L…D0ˆHEREONLYWHENINSAMEMPUASTHESDLCDRIVER8‰MOVE.B„SDDSEC(A0),D0GETSTATIONNUMBERFROMTHEBUFFER<‰MOVE.L„SDLCPCB,A1GETPOINTERTOPRIMARYCONTROLBLOCK,AND?‰MOVE.L„SDPFSEC(A1),A1THEREFROMTHE1STSECONDARYCB'SADDRESS,‰CMP.B…#$FF,D0ƒBUFFERGOINGTOALLSTATIONS?;‰BEQ.S…PTXMQFDƒYES,PUTTHEMESSAGEONFIRSTSCBREGARDLESS O* SCAN THRU THE SECONDARY CONTROL BLOCKS LOOKING FOR A MATCHING STATION ADDRESSBPTXMQSC‚CMP.B…SDSSEC(A1),D0ISTHISTHEDESTINATIONSTATION'SSCB? ;‰BEQ.S…PTXMQFDƒYES,WE'VEFOUNDTHECORRECTSCB(SEEBELOW):‰ADD.L…#SDSLNG,A1NO,FETCHNEXT(CONSECUTIVE)SCBADDRESS-‰TST.B…SDSSEC(A1)ISTHEREANOTHERONETHERE?@‰BNE.S…PTXMQSCƒYES,LOOPTILLWEFINDCORRECTONE(ORREACHEND)6‰MOVE.B„#N.SET+Z.CLR,1(A7)NO,ILLEGALSTATIONNUMBER!0‰MOVE.W„(A7)+,SR‚ASSERTRETURNINGCONDITIONCODE‰RTS‘ANDRETURN D* TARGET SCB FOUND, PREPARE THE BUFFER FOR TRANSMISSION AND QUEUE IT3PTXMQFD‚CLR.W…SDDSTS(A0)ASSERTNOREPORTEDERRORS,,‰CLR.B…SDDERR(A0)ANDNOERRORSOFANYKIND,(‰CLR.B…SDDRSP(A0)ANDNORESPONSE(YET),0‰CLR.L…SDDLNK(A0)ANDNOBUFFERSAFTERTHISONE,?‰MOVE.B„SDSSRT(A1),SDDRTC(A0)ANDFINALLY,AFRESHRETRYCOUNT."‰ORI.W…#LEVEL7,SRMASKINTERRUPTS!4‰MOVE.L„SDSTND(A1),A2LINKBCBTOENDOFTXMITQUEUE*‰TST.L…SDSTHD(A1)ISTRANSMITQUEUEEMPTY?1‰BNE.S…PTXMQTAL‚NO,LINKTOTAILOFCURRENTQUEUE<‰LEA‡SDSTHD-SDDLNK(A1),A2YES,NEWBUFFERISQUEUEHEADALSODPTXMQTALMOVE.L„A0,SDSTND(A1)TAILOFQUEUEPOINTSTOTHENEWBUFFER7‰MOVE.L„A0,SDDLNK(A2)WHICHGLUESONTOTAILOFLASTONE;* ZERO THIS STATIONS TIMER SO WE WILL SEND TRAFFIC A.S.A.P.?‰CLR.W…SDSCTD(A1)********TEMPORARYUNTILEXPEDITEDTXMITDONE6‰MOVE.W„(A7),SRƒRESTOREPRIORINTERRUPTLEVELA.S.A.P.(* TELL SDLC THERE IS NEW TRAFFIC TO SEND=‰BSR.L…SDLCQUSB‚********TEMPORARYUNTILEXPEDITEDTXMITDONE5‰MOVE.B„#Z.SET,1(A7)RETURNCC=BUFFERWASLINKEDOK)‰MOVE.L„#FLYPAPER,A0SETA0=BADPOINTER0‰MOVE.W„(A7)+,SR‚ASSERTRETURNINGCONDITIONCODE‰RTS‘ANDRETURN‰PAGEH*************************************************************************Æ*8*ˆSUBROUTINE:‚"SBPTUSQ"‚PUTABUFFERONTHEUSERQUEUEˆ**ˆTRAP:ˆ"PTUSQ"ª*'*ˆENTER:‚A0.L=ADDRESSOFTHEBUFFERš**ˆRETURN:NOARGUMENTS.©*#*ˆREGISTERSUSED:ƒ01234567**˜DU«* *˜AUUU‰S**ž|‰|_stack–**ž|___________used—**Æ*#*REPLACEDON3/8/83,EDSKINNER.¦**Æ*H************************************************************************ ‰XDEF†PTUSQ,SBPTUSQ7PTUSQ„BSR.S…SBPTUSQƒTRAPENTRYPOINT,DOTHESUBROUTINE+‰MOVE.W„SR,0(A7)‚REPLACETHECONDITIONCODE"‰RTE‘SOWEGIVEPROPERRETURNCODE .SBPTUSQ‚MOVE.W„SR,-(A7)‚SUBROUTINEENTRYPOINT(‰MOVE.L„A0,D0…CALLERPASSANILPOINTER?)‰CRASH.EQ‚*-1‡COMMITHARI-KARIIFHEDID!‰MOVE.L„SYSPOFF,A10‰CLR.L…SDDLNK(A0)CLEARBUFFER'SFORWARDPOINTER 8* OBTAIN EXCLUSIVE ACCESS TO THE USER QUEUE CONTROL AREA5PTUSQLK‚MOVE.W„0(A7),SR‚RESTOREPRIORINTERRUPTLEVEL!‰ORI.W…#LEVEL7,SRMASKINTERRUPTS(‰TAS‡USERQHD(A1)ATTEMPTTOSETTHELOCK2‰BMI.S…PTUSQLKƒLOOPIFFAILED(ANOTHERMPUHASIT),‰CRASH.NE‚*-1‡CRASHIFLOCKBYTEISCORRUPT! .* USERQHD IS LOCKED AND INTERRUPTS ARE MASKED!<‰MOVE.L„USERQND(A1),D0GETADDROFLASTBUFFERINUSERQUEUE>‰BEQ.S…PTUSQHED‚NEWBUFFERTOHEADANDTAILIFCURRENTLYEMPTY*‰MOVE.L„D0,A2…OTHERWISE,LINKTOTAILONLY>‰ADDA.L„MEMOFF,A2DEVELOPPERCEIVEDADDRESSOFTHETAILBUFFER2‰SUBA.L„MEMOFF,A0ANDACTUALADDRESSOFNEWBUFFER=‰MOVE.L„A0,SDDLNK(A2)TIENEWBUFFERONTOCURRENTTAILBUFFER;‰MOVE.L„A0,USERQND(A1)ANDMAKENEWBUFFERTHECURRENTTAIL)‰BCLR†#7,USERQHD(A1)RELEASETHELOCKBIT)‰CRASH.EQ‚*-1‡DIEIFITWASALREADYCLEAR7‰MOVE.W„0(A7),SR‚RESTOREPRIORINTERRUPTLEVELA.S.A.P. APTUSQWKUMOVE.L„NATBEG,D0NETWORKSERVICESRUNINTHISPROCESSOR?-‰BEQ.S…PTUSQEXT‚NO,JUSTRETURNTOCALLERNOW‰MOVE.L„D0,A0…YES,‰MOVE.L„#SSCNAU-1,D0‚DEVELOP‰MULU†#NATESIZ,D0SSCTTASK'S#‰LEA‡NATENTRY(A0,D0),A0TCBADDRESS%‰MOVE.L„NATTCB(A0),A0ANDWAKEHIMUP ‰TR0$.WAKEUP 1PTUSQEXTMOVE.L„#FLYPAPER,A0SETA0=BADPOINTER‰MOVE.W„(A7)+,SR ‰RTS‘RETURN K* USER QUEUE IS CURRENTLY EMPTY, STORE NEW BUFFER TO HEAD AND TAIL POINTERS>PTUSQHEDSUBA.L„MEMOFF,A0DEVELOPACTUALADDRESSOFNEWBUFFERC‰MOVE.L„A0,USERQND(A1)STOREASENDBUFFER(LOCKBITDOESN'TAPPLY)‰ADDA.L„#LOCKBIT,A0>‰MOVE.L„A0,USERQHD(A1)ANDASHEADBUFFER(LOCKBITSTILLON!))‰BCLR†#7,USERQHD(A1)RELEASETHELOCKBIT)‰CRASH.EQ‚*-1‡DIEIFITWASALREADYCLEAR 7‰MOVE.W„0(A7),SR‚RESTOREPRIORINTERRUPTLEVELA.S.A.P.-‰BRA.S…PTUSQWKU‚GOSEEABOUTNETWORKSERVICES‰PAGEH*************************************************************************Æ*<*ˆSUBROUTINE:‚"SBGTUSQ"‚GETONEBUFFERFROMTHEUSERQUEUE„**ˆTRAP:ˆ"GTUSQ"ª**ˆENTER:NOARGUMENTS.ª*-*ˆRETURN:‚A0.L=ADDRESSOFBUFFERSUPPLIED”**’CCR±**“ZsetBUFFERWASSUPPLIEDš**’notset‚NOBUFFERAVAILABLE˜*#*ˆREGISTERSUSED:ƒ01234567**˜DU«* *˜ARS**š||_stack–**š|_______________returned“**Æ*#*REPLACEDON3/8/83,EDSKINNER.¦**Æ*H************************************************************************ ‰XDEF†GTUSQ,SBGTUSQ7GTUSQ„BSR.S…SBGTUSQƒTRAPENTRYPOINT,DOTHESUBROUTINE+‰MOVE.W„SR,0(A7)‚REPLACETHECONDITIONCODE"‰RTE‘SOWEGIVEPROPERRETURNCODE .SBGTUSQ‚MOVE.W„SR,-(A7)‚SUBROUTINEENTRYPOINTB‰MOVE.B„#Z.SET,1(A7)ASSUMEWE'LLUSETHE"BUFFERSUPPLIED"RETURN‰MOVE.L„SYSPOFF,A1 8* OBTAIN EXCLUSIVE ACCESS TO THE USER QUEUE CONTROL AREA5GTUSQLK‚MOVE.W„0(A7),SR‚RESTOREPRIORINTERRUPTLEVEL!‰ORI.W…#LEVEL7,SRMASKINTERRUPTS(‰TAS‡USERQHD(A1)ATTEMPTTOSETTHELOCK2‰BMI.S…GTUSQLKƒLOOPIFFAILED(ANOTHERMPUHASIT),‰CRASH.NE‚*-1‡CRASHIFLOCKBYTEISCORRUPT! .* USERQHD IS LOCKED AND INTERRUPTS ARE MASKED!4‰MOVE.L„USERQHD(A1),D0GETFIRSTBUFFERINTHEQUEUE ‰BCLR†#31,D0‰TST.L…D0ˆISTHEQUEUEEMPTY?‰BEQ.S…GTUSQEMP‚YES,OUT‰MOVE.L„D0,A0…NO,:‰ADDA.L„MEMOFF,A0DEVELOPPERCEIVEDADDRESSOFHEADBUFFER/‰TST.L…SDDLNK(A0)ANYBUFFERAFTERHEADBUFFER?‰BNE.S…GTUSQMOR-‰CLR.L…USERQND(A1)NO,CLEARTHETAILPOINTERCGTUSQMORBSET†#7,SDDLNK(A0)ASSERTLOCKBITINNEXTBUFFERSADDRESS(‰CRASH.NE‚*-1‡DIEIFITWASALREADYSET!D‰MOVE.L„SDDLNK(A0),USERQHD(A1)ANDSTORENEWHEADPTR(LOCKBITON!))‰BCLR†#7,USERQHD(A1)ANDRELEASETHELOCK*‰CRASH.EQ‚*-1‡DIEIFITWASALREADYCLEAR!7‰MOVE.W„0(A7),SR‚RESTOREPRIORINTERRUPTLEVELA.S.A.P.4‰CLR.L…SDDLNK(A0)CLEARGOTTENBUFFER'SFORWARDLINK#‰MOVE.W„(A7)+,SR‚ASSERTRETURNCODE‰RTS‘ANDRETURN -GTUSQEMPBCLR†#7,USERQHD(A1)RELEASETHELOCK*‰CRASH.EQ‚*-1‡DIEIFITWASALREADYCLEAR!7‰MOVE.W„0(A7),SR‚RESTOREPRIORINTERRUPTLEVELA.S.A.P.)‰MOVE.L„#FLYPAPER,A0SETA0=BADPOINTER0‰CLR.B…1(A7)…ASSERT"NOBUFFERAVAILABLE"RETURN‰MOVE.W„(A7)+,SR‰RTS‘ANDRETURN‰ENDéééééé =/*=/*†SDLC.DLTRACE.AF=/*1=/* Chain file to assemble module SDLC.DLTRACE.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to SDLC.DLTRACE.LS=/*=/IFC \1ƒ=ARGSDLC.DLTRACE.LS=/ENDIF=/*-=ASM SDLC.DLTRACE.SA,SDLC.DLTRACE.RO,\1;RZ=40=/*{ Included files are:=/*ƒ9995.&.NEC7201.EQ=/*}=/*=ENDéééééé˜.DLTRACE‚IDNT†1,0ƒTRACEINTERRUPTSONDATALINK‰INCLUDEƒ9995.&.NEC7201.EQ‰PAGE*$*ˆCOPYRIGHTED1982BYMOTOROLA,INC.*F***********************************************************************Ä*&*†TraceeveryinterruptfromNEC7201œ**Ä*F*************************************************************************1*ˆONENTRY:A1,A2andD0havebeensavedonstack'*’A1=PointertoPrimaryControlBlock*’D0=INTERRUPTNUMBER* *ˆONRETURN:*’A1andA2destroyed* ‰SECTIONƒ9‰OPT‡PCS‰XREF†SDLCPCB,TRACEBEG‰XREF†NECCTL_A,NECCTL_B* ‰XDEF†DLTRACE**/DLTRACE‚MOVE.L„TRACEBEG,A2‰Startoftracetable%‰MOVE.L„(A2),A2ADDRESSofnextentry4‰MOVE.W„16(A7),(A2)+ˆSaveSRwheninterruptoccurred4‰MOVE.L„18(A7),(A2)+ˆSavePCwheninterruptoccurred'‰MOVE.W„D0,(A2)+ŒSavetypeofinterrupt/‰MOVE.L„0(A1,D0),(A2)+†SaveSDLCvectoraddress)‰MOVE.B„NECCTL_A,(A2)+‡SavePortAstatus)‰MOVE.B„NECCTL_B,(A2)+‡SavePortBstatus#‰LEA‡2(A2),A2ŒIncrementto16bytes(‰MOVE.L„TRACEBEG,A1‰Startoftracetable)‰CMP.L…4(A1),A2ŒIsthistheendoftable?‰BLT.S…DLTRAC4BranchifNO+‰LEA‡16(A1),A2‹Restartwith1sttraceentry1DLTRAC4‚MOVE.L„A2,(A1)SaveaddressofNextentry)‰MOVE.L„SDLCPCB,A1ŠRestoreaddressofPCB ‰RTS›Return‰END é é¡/=/*=/*†SDLC.EXORDLC.AF=/*1=/* Chain file to assemble module SDLC.EXORDLC.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to SDLC.EXORDLC.LS=/*=/IFC \1ƒ=ARGSDLC.EXORDLC.LS=/ENDIF=/*-=ASM SDLC.EXORDLC.SA,SDLC.EXORDLC.RO,\1;RZ=60=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.SDLCPRI.TEMPLTS.EQ=/*ƒ9995.NTS.SMSG.EQ=/*ƒ9995.NTS.NTW.EQ=/*}=/*=ENDééééééª-‰TTL‡EXORDLC.SAŠDLCroutinescalledbyNWCREQ9* Modified 4/6/83 by Ed Skinner for MC68010 compatability**ˆSubroutinescalledbyNWCREQ*:*ˆThesearesubstitutesfortherealSDLCroutinesrunning *ˆonaVM02inEXORmacschassis.*/*ˆMustsendamessagetoV2REQhandlerinVM02.5*ˆTheV2REQhandlerwillcalltherealSDLCroutines.***ˆINCLUDEƒ9995.&.STR.EQ!*ˆINCLUDEƒ9995.SDLCPRI.TEMPLTS.EQ*ˆINCLUDEƒ9995.NTS.SMSG.EQ*ˆINCLUDEƒ9995.NTS.NTW.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ ‰INCLUDEƒ9995.SDLCPRI.TEMPLTS.EQ‰INCLUDEƒ9995.NTS.SMSG.EQ‰INCLUDEƒ9995.NTS.NTW.EQ‰LIST‰PAGE ‰SECTIONƒ10‰XDEF†SBUSRACK* SBUSRACKMOVE.L„D0,D7STATIONID‰MOVE.L„#NTWCACKR,D6ˆCommandUSRCMDƒTR0.GTFRBF‰IFˆTHEN.S,‹MOVE.L„#NTSRNOB,D0‰ERRORCODEfornobuffer.‹ADD.L…#2,0(A7)ŒChangePCfornobufferreturn‰ELSE.S/‹MOVE.W„D7,V2STA(A0)ˆSaveStationIDinmessage,‹MOVE.B„D6,V2CMD(A0)ˆSaveCOMMANDinmessage+‹BSR.S…SBPTV2RQŒPutbufferinrequestQUEUE‰ENDI‰RTS**‰XDEF†SBSDLCFL* SBSDLCFLMOVE.L„D1,D7STATIONID‰MOVE.L„#NTWFLUSH,D6ˆCommand&‰BRA‡USRCMDŽContinuewithprevroutine*:*…GetherefromcalltoSBPTXMQ„(PutbufferonXmitQueue)*‰XDEF†SDLCQXMT*9SDLCQXMTMOVE.B„#DLCQXM,V2CMD(A0)ƒSaveCOM MANDinmessage+‰BSR.S…SBPTV2RQŒPutbufferinrequestQUEUE‰RTS**‰XDEF†SBSDLCKL*SBSDLCKLCLR.L…D7’STATIONID‰MOVE.L„#DLCSTOP,D6‰Command&‰BRA‡USRCMDŽContinuewithprevroutine‰PAGE*0*ƒSubroutinetoputmessageinV2Requestbuffer*‰XREF†SYSPOFF,MEMOFF,V2RQHD*.SBPTV2RQMOVE.L„A1,-(A7)ŒSaveA1-willuseit&‰MOVE.L„SYSPOFF,A1ŠSYSPARoffsetinV2+‰CLR.L…(A0)Besurelinkinbufferisclear&‰SUB.L…MEMOFF,A0‹Adjustbufferaddress‰REPEAT%‹TAS‡V2RQHD(A1)ŠBlockotherprocessor ‰UNTIL…(‰LEA‡V2RQHD(A1),A1‡Startofbufferchain$‰MOVE.L„(A1),D0Firstbufferaddress‰BCLR†#31,D0ŽClearTASbit‰TST.L…D0’Doesbufferexist?‰IFˆTHEN.S‹REPEAT!MOVE.L„D0,A1NextbufferaddressADD.L…MEMOFF,A1‹Addoffset³R¼*MOVE.L„(A1),D0Findlastbuffer'saddress ‹UNTIL…$‹MOVE.L„A0,(A1)Putnewoneinchain ‹MOVE.L„SYSPOFF,A1ŠSYSPARoffset!‹BCLR†#7,V2RQHD(A1)‡ClearTASbit‰ELSE.S‹MOVE.L„A0,-(A7)¡*1/25/83SCB.)‹BSET†#31,(A7)ŒSetTASbit‹*1/25/83SCB.7‹MOVE.L„(A7)+,(A1)ŠPutthisoneinchain*1/25/83SCB.+‹BCLR†#31,(A1)ŒClearTASbit‰*1/25/83SCB.‰ENDI‰MOVE.L„(A7)+,A1ŒRestoreA1‰RTS*:*„ThefollowingentryisheretosatisfyanXREFinBUFMGT*‰XDEF†SDLCQUSB SDLCQUSB RTS‰ENDéééééé=/*=/*†SDLC.IBFMGT.AF=/*0=/* Chain file to assemble module SDLC.IBFMGT.SA=/*:=/* If no output argument is specified for the listing the-=/* chain file will default to SDLC.IBFMGT.LS=/*=/IFC \1ƒ=ARGSDLC.IBFMGT.LS=/ENDIF=/*'=ASM SDLC.IBFMGT.SA,SDLC.IBFMGT.RO,\1;R=/*{ Included files are:=/*ƒ9995.SDLCPRI.TEMPLTS.EQ=/*}=/*=ENDéé ééééÄ2IBUFMGT‚IDNT†1,0‡BUFFERMANAGEMENTINITSUBROUTINE7‰TTL‡BUFFERMGTINITˆ(Copyright1982byMotorola,Inc.)‰PAGE‰NOLIST ‰INCLUDEƒ9995.SDLCPRI.TEMPLTS.EQ‰LIST ‰SECTIONƒ8 ‰XREF†SZDBUF‰XDEF†SBINFRBFH*************************************************************************Æ*5*ˆSUBROUTINE:‚"SBINFRBF"‚INITIALIZETHEBUFFERPOOL‹**Æ*4*ˆENTER:‚A0.L=ADDRESSOFSTARTOFMEMORYSEGMENT*+*A1.L=ADDRESSOFENDOFMEMORYSEGMENT**Æ*0*ˆRETURN:‚D1.W=NUMBEROFBUFFERSINITIALIZED‘**Æ*#*ˆREGISTERSUSED:ƒ01234567* *˜DUR©* *˜AUUU‰S**ž|‰|_stack–**ž|___________used—**Æ*H************************************************************************+SBINFRBFCLR.L…D1’INITIALIZENUMOFBUFFERS‰CLR.L…D0’FETCHBUFFERLENGTH‰MOVE.W„SZDBUF(PC),D0‡*‰ADD.W…#SDDLNG,D0Š*4INFRBF1‚MOVE.L„A0,A2…CALCULATENEXTBUFFER'SADDRESS‰ADD.L…D0,A0…*!‰CMP.L…A0,A1…PASTENDOFSEGMENT?‰BLT.S…INFRBF2ƒ*,‰MOVE.L„A0,(A2)ƒNO,PUTLINKINTO1STBUFFER%‰ADD.W…#1,D1…INCREMENTNUMOFBUFFERS‰BRA.S…INFRBF1ƒ*#INFRBF2‚SUB.L…D0,A2…CLEARLASTLINK ‰CLR.L…(A2)†* ‰RTS‡RETURN‰ENDéééÍ(=/*=/*†SDLC.PORTAIO.AF=/**=/* Chain file to assemble SDLC.PORTAIO.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to SDLC.PORTAIO.LS=/*=/IFC \1ƒ=ARGSDLC.PORTAIO.LS=/ENDIF=/*-=ASM SDLC.PORTAIO.SA,SDLC.PORTAIO.RO,\1;RZ=46=/*{ Included files are:=/*ƒ9995.&.NEC7201.EQ=/*ƒ9995.SDLCPRI.TEMPLTS.EQ=/*}=/*=END ééééééÖ)PORTAIO‚IDNT†1,0ƒPASSINERRUPTONTOHDIO*ˆINCLUDEƒ9995.&.NEC7201.EQ!*ˆINCLUDEƒ9995.SDLCPRI.TEMPLTS.EQ‰NOLIST‰INCLUDEƒ9995.&.NEC7201.EQ ‰INCLUDEƒ9995.SDLCPRI.TEMPLTS.EQ‰LIST‰PAGE ‰SECTIONƒ9*$*ˆCOPYRIGHTED1982BYMOTOROLA,INC.*F***********************************************************************Ä*>*„PORTAIOwillsavethecontentsofthe7201statusregister†***„forHDIOandthengivecontroltoHDIOš**Ä*.*ˆOnentry:D0=CONTENTSOFSTATUSREGISTER’*.*’A1=ADDRESSOFSDLCPRIMARYCONTROLBLOCKˆ**Ä*'*’D0,A1andA2aresavedonthestack*F***********************************************************************‰XREF†NECCTL_A ‰XDEF†PORTAIO*.PORTAIO‚BTST†#1,NECCTL_AŠIsinterruptpending?‰BNE.S…PORTAI1BranchifYES/‰CMP.B…#SDPBTX,SDPBSY(A1)‚IsSDLCtransmitting?‰BNE.S…PORTAI1BranchifNO2‰MOVE.L„#4,D0Setinterrupttoexternalstatuschg5‰MOVE.L„SDPVCT(A1,D0.W),A2‚SETA2tovectoredroutine‰JMP‡(A2)Gothere+PORTAI1‚MOVE.L„8(A7),A2ŒRestoreoriginalA2:‰MOVE.L„SDPVECT(A1),8(A7)ƒOriginalvectorcontenttostack:‰MOVE.L„SDPCCBA(A1),A1†Addressofwheretosavestatusreg!‰BTST†#0,-1(A1)‹IsthisforHDIO?‰BEQ.S…PORTAI2BranchifNO,‰LSR.W…#2,D0AdjuststatusregisterforHDIO+PORTAI2‚MOVE.B„D0,(A1)Savestatusregister&‰MOVEM.Lƒ(A7)+,D0/A1‰Restoreregisters‰RTS›GotoHDIO‰ENDééß+ =/*=/*†SDLC.PORTAV4.AF=/*1=/* Chain file to assemble module SDLC.PORTAV4.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to SDLC.PORTAV4.LS=/*=/IFC \1ƒ=ARGSDLC.PORTAV4.LS=/ENDIF=/*.=ASM SDLC.PORTAV4.SA,SDLC.PORTAV4.RO,\1;RZ=120=/*{ Included files are:=/*ƒ9995.&.NEC7201.EQ=/*ƒ9995.SDLCPRI.TEMPLTS.EQ=/*}=/*=ENDééééééè3PORTAV4‚IDNT†1,0ƒMVME400,PASSINTERRUPTONTOHDIO*ˆINCLUDEƒ9995.&.NEC7201.EQ!*ˆINCLUDEƒ9995.SDLCPRI.TEMPLTS.EQ‰NOLIST‰INCLUDEƒ9995.&.NEC7201.EQ ‰INCLUDEƒ9995.SDLCPRI.TEMPLTS.EQ‰LIST‰PAGE ‰SECTIONƒ9*$*ˆCOPYRIGHTED1983BYMOTOROLA,INC.*F***********************************************************************Ä*>*„PORTAV4willsavethecontentsofthe7201statusregister†*+*„forHDIOandthengivecontroltoHDIO.™**Ä*C*„NOTE:ThisversionofPORTAIOisspecificfortheVME/10system*?*„usinganMVME400I/Oboard(containingtheNEC7201device).…**Ä*.*ˆOnentry:D0=CONTENTSOFSTATUSREGISTER’*.*’A1=ADDRESSOFSDLCPRIMARYCONTROLBLOCKˆ**Ä*'*’D0,A1andA2aresavedonthestack*F***********************************************************************J* We come here from INT7201 via the vector table found in the SDLC primaryK*controlblock.‚ThishappenswhentheNEC7201presentsaninterruptvectorF*of4,5,6,or7(allofwhichareA-sideinterrupts).‚IntheVME/10L* system (where an MVME400 board contains the 7201 device of interest), whenH* an interrupt occurs which uses the 7201's vector, we go to the INT7201J*routine(intheSDLCcode).‚There,theinterruptvectorisreadfromtheI*NEC7201whichmayormaynotbethecauseoftheinterrupt.‚ThisvectorL* will be from 0 to 7 (it is shifted left two places actually, but that factK*isonly"noise"asfarasthisdiscussionisconcerned).‚Vectors0..3areJ*forB-sideinterrupts,andvectors4..7areforA-sideinterrupts.‚Also,.* vector 7 is used for "no interrupt" as well.*K* INT7201 uses the vector number to compute which vector to use in its PCB.L* In practice, vectors 0..3 (B-side interrupts) will take us to some routine L* within the SDLC implementation, and vectors 4..7 will either bring us hereI* (when an A-side handler exists), or to INT7201A (when an A-side handler* does not exist).*I* When we come here, the 7201's vector is stored in "somebody's" CCB, andñ-ú"9* we vector off to an address that was placed in our PCB.*I* The MVME400 board contains two PIA devices (6821s) as well as the 7201.L* Because the handler we go to processes interrupts from these other devicesM* as well as the 7201, 1) we can't be sure that a given interrupt is actuallyK* from the 7201, and 2) we can't know if more than one device is in need ofI* service at this time (both PIAs and the 7201 could be interrupting - or%* needing to interrupt at this time).*K* So, when the routine we jumped to (via the vector in the PCB) is done, weL*checktheinterruptpendingflagintheNEC7201.‚Iftheflagistrue,thenL* the routine which just finished did not service the interrupt in the 7201.L* If the flag is clear, then either the routine did service the 7201, or the)* 7201 did not have an interrupt pending.*@* The rule for checking the interrupt pending bit is as follows;*G*„1)ReadtheInterruptVectorRegister(theinterruptpendingbitwill?*‡notbevaliduntilthisisdone)fromthe7201(register2B),E*„Then,checktheInterruptPendingBit(register2A).‚Ifset(1),anA*Šinterruptispending,andthevectorreadinsteponeisvalid.@*ŠIfclear(0),aninterruptisnotpending,andthevectorread*Šinstep1ismeaningless.E*„Note,untilapendinginterruptisservicedandanEndOfInterrupt=*Šcommandisissued(0A),thependingbitwillremainset(1).G*„Note,whennointerruptwaspending,thependingflagwillnotbecomeA*ŠsetuntiltheInterruptVectorisread.‚IfaninterruptwasnotB*Špendingwhenthevectorwasread,thenthependingflagwillnotE*Šbecomesetuntilthevectorisreadagain,nomatterhowmanytimes-*Šthependingflagischeckedintheinterim.*I* What we do here is to read the interrupt vector register (see INT7201),D* vector to here when interrupt vectors 4, 5, 6, or 7 are presented,L* jump to the indicated address (he has to figure out if the 7201 is in needN* of service or not), and upon his completion, look to see if the 7201 pendingM*flagisstillset.‚Ifitis,thentheroutinedidnotservicethe7201yet,H*andweneedtogivehimanotherchance.‚Ifthependingbitisnotset,M* then either he did service the 7201 thereby clearing the pending condition,L* or there was no 7201 interrupt pending in the first place, and he probably* serviced one of the PIAs.*L* Note that we could have checked the pending flag immediately after readingJ*outthevectorregister.‚However,knowingwhetherornotthe7201istheJ* cause of the interrupt is of no use to us once we get to PORTAIO anyway,K*sothecheckisnotperformedatfirst.‚Onlyafterthe"somebody"routineN* has run do we look to see if the interrupt is still pending, and then vector* to "somebody" again if it is. ‰XREF†NECCTL_A ‰XDEF†PORTAIO*6PORTAIO‚MOVE.L„SDPCCBA(A1),A2†A2=A("somebody's"CCB)6‰MOVE.B„D0,(A2)Store7201'svector(%000xxx00)toCCB<‰MOVE.L„SDPVECT(A1),A2†A2=A("who"we'resupposedtogoto)‰REPEAT0‹CLR.W…-(A7)(VOR)Buildaninterrupt-likestack0‹PEA‡TSTINTP(PC)‰(PC)whichwillcomebacktous.‹MOVE.W„SR,-(A7)Œ(SR)when"they"arealldone‹JMP‡(A2)Goto"them"8TSTINTP„BTST.B„#1,NECCTL_A‰7201Interruptstillpending?4‰UNTIL…ifso,repeataboveuntilit'ssatisfied9‰MOVEM.Lƒ(A7)+,D0/A1-A2†RecoverregswhichINT7201pushed‰RTE›andexittheinterrupt ‰END éé**ˆSDLC.ROOT.AG*!‰TTL‡SDLCDRIVER,GENERICSECTION'* Arguments substituted via SYSGEN are;**„VERSION-Versionnumber*„REVISIO-Revisionnumber#*„REVDATE-Dateoflatestrevision%*„CHIPTYP-MPUtype-68000or680107*„STATION-Stationtype-1(Primary)or2(Secondary)<*„IFRMBCT-I_framebytecountsincluded-1(Yes)or0(No)E*„RES7201-BoardcontainingtheNEC7201-02(VM02)or400(MVME400)* ‰OPT‡MEX,CRE VER†EQU‡\VERSIONŒVERSIONNUMBER/REV†EQU‡\REVISIOŒREVISIONNUMBERWITHINVERSION /CHIPTYPEEQU‡\CHIPTYPŒMPUTYPE(68000OR68010) 8STATION‚EQU‡\STATIONŒSTATIONTYPE(PRIMARYORSECONDARY)#PRIMARY‚EQU‡1“PRIMARYSTATIONVALUE&SECONDAREQU‡2“SECONDARYSTATIONVALUE 4IFRMBCT‚EQU‡\IFRMBCTŒSEND/RCVBYTECOUNTONI_FRAMES YES†EQU‡1NO‡EQU‡0 0RES7201‚EQU‡\RES7201ŒNEC7201RESIDENTBOARDTYPE* 02 = VM02, or 400 = MVME400 ‰IFEQ†CHIPTYPE-68000 ‹OPT‡P=68000‹IFEQ†STATION-PRIMARY/SDLCPRI†IDNT†VER,REVƒ68000SDLCPRIMARYSTATION:TTL‡68000PRIMARYSTATION(Copyright1982/3MotorolaInc)‹ENDC‹IFEQ†STATION-SECONDAR1SDLCSEC†IDNT†VER,REVƒ68000SDLCSECONDARYSTATION‰XDEF†SDLCRCST,USRACK,SDLCQU,SDLCTTMOUT,SDLCPR,SBSDLCFL,SDLCFL*‰XDEF†INT7201,INT7201A,PWR,SDLCKL,SBSDLCKL*0‰XREF†SBGTFRIR,SBPTFRBF,SBPTFRML,SBPTUSQ,SDLCPCB‰IFEQ†CHIPTYPE-6  8000 ‹XREF†SBRQPA‰ENDC‰XREF†TRACFLAG,DLTRACE*‰IFEQ†STATION-PRIMARY‹INCLUDEƒSDLCPRI.POLLQ.SI‰ENDC‰IFEQ†STATION-SECONDARY‹INCLUDEƒSDLCSEC.PWRUP.SI‰ENDC‰INCLUDEƒSDLCPRI.INT7201.SI‰INCLUDEƒSDLCPRI.TRANSMIT.SI‰INCLUDEƒSDLCPRI.RECEIVE.SI‰IFEQ†STATION-PRIMARY‹INCLUDEƒSDLCPRI.FRMCNT.SI‰ENDC‰IFEQ†STATION-SECONDARY‹INCLUDEƒSDLCSEC.FRMCNT.SI‰ENDC‰INCLUDEƒSDLCPRI.SUBRTN.SI‰ENDéC‚******************************************************************‚*SDLC.SYSCMD.CD1‚*„SYSGENCommandFileforSDLCdrivergeneration‚*4‚*„CreateanSDLCdriverforaspecificenvironment.‚*‚*„Argumentsare:*‚*‡Arg1=Mnemonic-legalmnemonicsare:‚* ‚*‘"GMADPRI"-GMprimarysystem"‚*‘"GMADSEC"-GMsecondarysystem$‚*‘"HDS4PRI"-HDS400primarysystem&‚*‘"HDS4SEC"-HDS400secondarysystem$‚*‘"VME10PRI"-VME/10primarysystem‚*:‚*‡Arg2=Overalllistingfile/device.‚Listingishandled‚*‘bydriverchainfile.‚*K‚*Eachtimemaintenanceisperformed,thefollowingthreeargumentsshould1‚*beupdated:REVDATE-Dateoflatestrevision, ‚*VERSION-Versionnumber,and‚*REVISIO-Revisionnumber.‚*/‚REVDATEƒ="09/07/83"ƒ*Dateoflatestrevision‚VERSIONƒ=3Œ*Versionnumber‚REVISIOƒ=7Œ*Revisionnumber ‚*‚&LF‡=0ŒLegalmnemonicflag ‚IFEQˆ"\1"‰,"GMADPRI"…&LF‡=1…STATIONƒ=1‰Primarystation…CHIPTYPƒ="68000"…RES7201ƒ=02ˆVM02…SUBSˆSDLC.ROOT.AG3…ASM‰SDLC.ROOT.AG,SDLC.GMADPRI.RO,&.SYSGEN.TF;Z=100 …=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A$…=COPY‡&.SYSGEN.TF,SDLC.GMADPRI.LS;Y‚ENDC‚IFEQˆ"\1"‰,"GMADSEC"…&LF‡=1…STATIONƒ=2‰Secondarystation…CHIPTYPƒ="68000"…RES7201ƒ=02ˆVM02…SUBSˆSDLC.ROOT.AG3…ASM‰SDLC.ROOT.AG,SDLC.GMADSEC.RO,&.SYSGEN.TF;Z=100 …=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A$…=COPY‡&.SYSGEN.TF,SDLC.GMADSEC.LS;Y‚ENDC‚IFEQˆ"\1"‰,"HDS4PRI"…&LF‡=1…STATIONƒ=1‰Primarystation…CHIPTYPƒ="68000"…RES7201ƒ=02ˆVM02…SUBSˆSDLC.ROOT.AG3…ASM‰SDLC.ROOT.AG,SDLC.HDS4PRI.RO,&.SYSGEN.TF;Z=100 …=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A$…=COPY‡&.SYSGEN.TF,SDLC.HDS4PRI.LS;Y‚ENDC‚IFEQˆ"\1"‰,"HDS4SEC"…&LF‡=1…STATIONƒ=2‰Secondarystation…CHIPTYPƒ="68000"…RES7201ƒ=02ˆVM02…SUBSˆSDLC.ROOT.AG3…ASM‰SDLC.ROOT.AG,SDLC.HDS4SEC.RO,&.SYSGEN.TF;Z=100 …=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A$…=COPY‡&.SYSGEN.TF,SDLC.HDS4SEC.LS;Y‚ENDC‚IFEQˆ"\1"‰,"VME10PRI"…&LF‡=1…STATIONƒ=1‰Primarystation…CHIPTYPƒ="68010"J$…RES7201ƒ=400‡MVME400…SUBSˆSDLC.ROOT.AG1…ASM‰SDLC.ROOT.AG,SDLC.VME10.RO,&.SYSGEN.TF;Z=100 …=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A"…=COPY‡&.SYSGEN.TF,SDLC.VME10.LS;Y‚ENDC ‚IFEQˆ\&LF6…MSG‰"\1"isaninvalidmnemonic.Legalmnemonicsare:;…MSG‰"GMADPRI","GMADSEC","HDS4PRI","HDS4SEC",or"VME10PRI".…MSG‰Pleasererunsysgenwithpropermnemonic.…ABORT‡‚ENDC 3‚IFRMBCTƒ=1Œ*SendandReceiveI_FrameByteCounts ‚*ENDOFSDLC.SYSCMD.CDC‚******************************************************************‚END‰é  éééé******************************** BEGINNING OF SDLC.MACROS.AI ******************************** RTS2RTE‚MACRO‰IFEQ†CHIPTYPE-680101‹MOVE.W„(A7),-(A7)ˆCREATE:0(A7)=PC(HighWord)1‹MOVE.W„4(A7),2(A7)‡.......2(A7)=PC(LowWord).‹CLR.W…4(A7).......4(A7)=VOR(ShortStack)‰ENDC6‰MOVE.W„SR,-(A7)ŒPushSRsowecanRTEratherthanRTS‰ENDM ************************** END OF SDLC.MACROS.AI **************************éééééé,6* ****************************************************6* * BEGINNING OF FILE 'FIX:48.SDLC.OVERVIEW.AI' *1**DateRevised:September7,1983,EdSkinner†***²*2**Note:Thisisa"generated"file.‚Updatesto„*3**theseintroductorynotesshouldbeappliedto„*2**SDLC.OVERVIEW.PR-Seeadescriptionofthis…***containedherein. ***²*6* ******************************************************** 1 Introduction*C*†TheMotorolaSynchronousDataLinkControl(referredto‚simply‚asG*SDLC)‚is‚a‚componentoftheNetworkServicesfacilityavailableunder * VERSAdos.B*†TheSDLCimplementationprovidesa‚communications‚circuit‚driverI*usingtheNEC7201deviceinthebit-orientedprotocolmode.‚FramelevelI*commands  arehighlysimilartothoseinIBM'sSDLC.‚SupportisprovidedG*for‚the‚remote‚loadinganddumpingofstations,multi-dropaswellasJ* point to point configurations, with circuit speeds of up to 57,600 baud. 5:>BFJNR&VZ^bfjnrvz~‚†Š E*†BecauseofthemanyconfigurationswithinwhichthisimplementationI*mustfunction,operationislimitedtohalf-duplexonly(atthe‚present* time).***"* 2 Overview of System Preparation*D*†The‚SDLCimplementationexistsasapermanentlyresidentextensionF*ofthesystem'sexecutive(RMS68K).‚Assuch,itis‚"link"ed‚with‚theE*executive‚such‚that‚a‚single‚loadmoduleexistscontainingboththeE*executiveandtheSDLCdriver.‚Additionally,‚in‚those‚systems‚whereD*Network‚Services‚(NTS)‚executes‚on‚the‚sameprocessor,it(NetworkE* Services) will be similarly "link"ed and loaded with the executive.D*†Generallyspeaking,aversionoftheSDLCdriverisfirst‚producedH*which‚is"customized"forthetargetsystem.‚TheparameterswhichmakeG*agivenimplementationuniqueincludethetypeof‚processor‚(68000‚orH*68010),‚the‚residenceofNetworkServices(on-boardoroff-board),theD*typeofboarduponwhich‚the‚communications‚device‚(an‚NEC7201)‚isG*located,‚and‚the‚addressofthevariousregistersofthatdevice,andC* whether the implementation is for a primary or secondary station.C*†GenerationoftheSDLCdriverisfacilitatedbychain‚files‚which?*"customize"ƒtheƒgeneric‚driver‚for‚one‚of‚the‚specific‚targetB*environments.‚This‚"customized"‚version‚(an‚object‚file)‚is‚thenA*combined‚with‚other‚modules‚(such‚as‚the‚RMS68K‚kernel,‚NetworkA*Services,andsoon)‚to‚create‚a‚single‚load‚module.ƒThis‚final4* preparation is outside the scope of this document.B*†For‚the‚GMAD‚system,theprimarystationsoftwarerunsonaVM02J* board, with Network Services executing on a tightly coupled Exormacs MPUH*board.ƒAsharedmemoryfacilityisusedforthecommunicationsbetween* Network Services and SDLC.D*†Similarly,thesecondaryGMADstationsoftwarealsorunsona‚VM02I*board,‚exceptthatitsNetworkServicesison-board,andaconsiderably=* simpler shared memory area is used for inter-communication.>*†Preparationof‚the‚HDS-400‚Primary‚and‚Secondary‚stations‚is* similar to the GMAD stations.C*†The‚VME/10‚PrimarystationforanHDS-400runsonaVME/10systemD*usinganMC68010MPUand‚MVME400‚board‚(which‚contains‚the‚NEC7201 * device).**** 3 SDLC Driver Preparation*@*†The‚first‚step,‚is‚to‚prepareacopyoftheinformationalfileJ* (what you are currently reading) for inclusion into the assembly stream.F*Note‚that‚this‚preparation‚needbedoneonlyiftheSDLC.OVERVIEW.PRH*inputfilehasbeenupdated.‚WhenseveralversionsofSDLCdrivers‚areB*to‚be‚generated,‚the‚OVERVIEW.CF‚(SDLC.OVERVIEW.CF)‚need‚only‚beH*executedbeforegeneratingthefirstversion.‚Oncethishasbeen‚done,J* several different versions of the SDLC driver may be generated, re-using* the overview file./*†Anexampleofcreatingthisoverviewfileis;*†=USE48.SDLC*†=OVERVIEW.CF)*‹=/*CREATEOVERVIEW.AIFROMOVERVIEW.PR1*‹=101.USERLIB.PROSEOVERVIEW.PR,OVERVIEW.LS;Z=64*‹Version:dd-mmmm-yy*‹Noerrorsdetected.*‹=DELOVERVIEW.AI#*‹DELETEDFIX:0048.SDLC.OVERVIEW.AI*‹=EOVERVIEW.LS,OVERVIEW.AI;L*‹VERSAdosEDITOR‚RELEASE‚x.y*‹COPYRIGHTBYMOTOROLA19zz&*Ž(Exampleoutputdeletedforbrevity) *‹EDITDONE*‹=ENDE*†Thenextoneormorestepsconsistofgeneratingversion(s)ofSDLCG*as‚required‚forthetargetsystem.‚SDLCmaybegeneratedasaprimaryE*orsecondarystation,andfortheMC68000‚or‚MC68010‚processor.ƒTheE*chain‚file‚which‚performs‚th  isis&.CONFIG.CF.‚ItisalwaysinvokedI*withtwoarguments.‚Thefirstargumentspecifiestheconfiguration,theI*secondargumentspecifiestheoveralllistingfileordevice.‚ThefirstE*argumentnamesforvarious‚SDLC‚configurations‚are:‚HDS-400‚PrimaryF*Station‚("HDS4PRI"),‚HDS-400‚Secondary‚Station("HDS4SEC"),GMADDMSJ* (Primary) Station ("GMADPRI"), GMAD PMS (Secondary) Station ("GMADSEC"),/* and VME/10 HDS-400 Primary Station ("VME10").B*†The‚chain‚file‚producesobjectandlistingfilesappropriatefor"* the specified system as follows;*0* +--------------+--------------+--------------+!*!‚Argument„!„Object„!ƒListing„!0* +--------------+--------------+--------------+)*!‚"HDS4PRI"ƒ!‚HDS4PRI.RO‚!‚HDS4PRI.LS‚!)*!‚"HDS4SEC"ƒ!‚HDS4SEC.RO‚!‚HDS4SEC.LS‚!)*!‚"GMADPRI"ƒ!‚GMADPRI.RO‚!‚GMADPRI.LS‚!)*!‚"GMADSEC"ƒ!‚GMADSEC.RO‚!‚GMADSEC.LS‚!&*!‚"VME10PRI"‚!‚VME10.RO„!‚VME10.LS„!0* +--------------+--------------+--------------+** 4 Required Files*B*†Thefollowingfilesaretheminimumsetrequired‚to‚generate‚all* versions of the SDLC driver;F*&.SYSGEN.CF‚-‚The‚user‚invokedchainfileproducingSDLCfortheall*†SDLCimplementations.G*SDLC.SYSCMD.CD-TheSYSGENcommandfileusedinthe‚preparation‚of‚a*†versionoftheSDLCdriver,F*SDLC.ROOT.AG‚-‚The‚file‚"assembled"toproduceaversionoftheSDLCE*†driver,asdirectedbyparametersspecifiedbytheuser,andbythe*†SYSCMD.CDcommandfile,G*SDLC.OVERVIEW.CF‚-‚The‚chainfilewhichcausesSDLC.OVERVIEW.AItobe7*†createdfromSDLC.OVERVIEW.PRviathePROSEfacility,9*SDLC.OVERVIEW.PRƒ-ƒTheƒ"prose"ƒinput„file,„processed„by3*†SDLC.OVERVIEW.CF,whichcreatesSDLC.OVERVIEW.AI,G*SDLC.OVERVIEW.AI‚-‚Created‚fromSDLC.OVERVIEW.PRbySDLC.OVERVIEW.CF,B*†thisfilepresentsagrossoverviewofthe‚implementation,‚and‚a'*†listofknownproblemsand/orerrors,0* 9995.&.NEC7201.EQ - Defines NEC7201 Symbolics,2* 9995.&.STR.EQ - Defines RMS68K Kernel Symbolics,3* SDLCPRI.TEMPLTS.EQ - Defines SDLC Control Blocks,;* MVME400.EQUATES.AI - Defines the MVME400 board Symbolics,A* SDLC.MACROS.AI - Defines miscellaneous macros required by SDLC,F*SDLCPRI.POLLQ.AI‚-‚Primary‚Station,‚External(User)Interfaces,SDLC(*†StartUpLogic,andPollingAlgorithm,D*SDLCPRI.INT7201.AI-‚Primary‚Station,‚Transmitter‚Flush‚Logic,‚and*†NEC7201InterruptDispatcher,;* SDLCPRI.TRANSMIT.AI - Primary Station Transmitter Driver,7* SDLCPRI.RECEIVE.AI - Primary Station Receiver Driver,4* SDLCPRI.FRMCNT.AI - Primary Station Frame Handler,)* SDLCPRI.SUBRTN.AI - Common Subroutines,H*SDLCSEC.PWRUP.AI‚-‚SecondaryStation,External(User)Interfaces,SDLC5*†StartUpLogic,andPollingResponseAlgorithm,andD*SDLCSEC.FRMCNT.AI-Secondary‚Station‚Frame‚Handler,‚and‚Link‚Mode*†FiniteStateMachine.**** 5 Primary Station Files*@*†Thefollowingfilescomprisetheprimarystation'sgeneration;* SLDC.ROOT.AG,* SDLC.OVERVIEW.AI,* 9995.&.NEC7201.EQ,* 9995.&.STR.EQ,* SDLCPRI.TEMPLTS.EQ,* SDLC.MACROS.AI,* MVME400.EQUATES.AI,* SDLCPRI.POLLQ.AI,* SDLCPRI.INT7201.AI,* SDLCPRI.TRANSMIT.AI,* SDLCPRI.RECEIVE.AI,* SDLCPRI.FRMCNT.AI, and* SDLCPRI.SUBRTN.AI.**** 6 Secondary Station Files*B*†Thefollowingfilescomprisethesecondarystation'sgeneration;* SLDC.ROOT.AG* SDLC.OVERVIEW.AI,* 9995.&.NEC7201.EQ,* 9995.&.STR.EQ,* SDLCPRI.TEMPLTS.EQ,* SDLC.MACROS.AI,* MVME400.EQUATES.AI,* SDLCSEC.PWRUP.AI,* SDLCPRI.INT7201.AI,* SDLCPRI.RECEIVE.AI,* SDLCSEC.FRMCNT.AI,* SDLCPRI.TRANSMIT.AI, and* SDLCPRI.SUBRTN.AI.**** 7 ROM-based Version Files*9*†ThefileswhichcompriseSDLCROMarecurrentlyunknown.**** 8 Primary Data Flows*>*†The‚primary‚data‚flow‚into‚SDLC‚is‚viatheSBPTXMQandPTXMQI*functionswhicharelocatedinthebuffermanagementmodule(BUFMGT‚andH*BUFMGTX).ƒThesefunctionsenqueueatransmitbuffertot  heappropriateI*SecondaryControlBlock(SCB)wheretheSDLCdriverwillfinditat‚theF*proper‚time.ƒIn‚theprimarystation,theSBPTXMQandPTXMQfunctionsH*"awaken"SDLCeachtimeabufferisenqueuedbycallingthe‚SDLC‚entryF*point‚SDLCQUSB‚or‚SDLCQUfunction.‚Inthesecondarystation,SDLCis?*not‚"awakened"‚when‚a‚buffer‚is‚enqueued.ƒIn‚anƒEXORMACS/VM02J* configuration, buffers are passed from the EXORMACS to the VM02 thru the* VM02 request queue.>*†Theprimarydataflowfrom‚SDLC‚is‚via‚the‚SBPTUSQ‚and‚PTUSQI*functions‚whicharelocatedinthebuffermanagementmodule(BUFMGTandG*BUFMGTX).‚WhenSDLChasreceivedanerrorfreetransmission‚(which‚isB*not‚an‚internally‚used‚SDLC‚control‚frame),‚the‚SBPTUSQorPTUSQD*functioniscalledandthereceived‚buffer‚is‚enqueued‚to‚the‚userI*queue.‚InanEXORMACS/VM02configuration,theuserqueuepassesbuffers * from the VM02 to the EXORMACS.C*†Ingeneral,allinformationframes(I_frames)‚contain‚applicationH*program‚data,‚supervisoryframes(S_frames)areusedinternallybytheI*variousSDLCstationsonalink,andun-numbered(U_frames)areused‚to* control the mode of the link.C*†It‚is‚veryimportanttonotethatU_framesarenever"created"orI*"consumed"bytheSDLCmodule:‚TheyarealwaysinitiatedandterminatedE*outside‚of‚SDLC.ƒ"Hand-shake"‚proceduresexistbetweenSDLCandtheH*U_framecreatorandconsumertoassistinthesynchronization‚of‚these* two processes.**** 9 Entry Points*C*†External‚entry‚pointsareprovidedwithintheSDLCimplementation* for the following conditions;*@* +----------+------+------------------------+-----+-----+-----+8*!Entry„!Type!InputDescription†!Pri!Sec!ROM!@* +----------+------+------------------------+-----+-----+-----+;*!PWRUP„!Subr!StartSDLCOperationƒ!Yes!Yes!Yes!2*!PWR†!Intr!NEC7201A-SideIntr„!‚?‚!‚?‚!‚?‚!<*!INT7201‚!Intr!NEC7201B-SideIntr„!Yes!Yes!Yes!=*!INT7201A!Intr!NEC7201A-SideIntr„!Yes!Yes!Yes!+*!SDLCQXMT!Subr!Unknown!‚?‚!‚?‚!‚?‚!>*!SDLCQUSB!Subr!SendTrafficEnqueued‚!Yes!No‚!Yes!<*!SDLCQUƒ!Trap!SendTrafficEnqueued‚!Yes!No‚!Yes!?*!SBUSRACK!Subr!AckSIM,DISC,orSNRM!No‚!Yes!Yes!=*!USRACKƒ!Trap!AckSIM,DISC,orSNRM!No‚!Yes!Yes!>*!SDLCTMOU!Subr!ReceiveTimerExpired‚!Yes!Yes!No‚!>*!SDLCTTMO!Trap!ReceiveTimerExpired‚!Yes!Yes!No‚!:*!SDLCKLƒ!Trap!TerminateOperation„!Yes!Yes!No‚!<*!SBSDLCKL!Subr!TerminateOperation„!Yes!Yes!No‚!9*!SDLCPRSB!Subr!50mSecondTickˆ!Yes!Yes!***!7*!SDLCPRƒ!Trap!50mSecondTickˆ!Yes!Yes!***!=*!SDLCFLƒ!Trap!FlushAllSendTraffic!Yes!Yes!No‚!?*!SBSDLCFL!Subr!FlushAllSendTraffic!Yes!Yes!No‚!<*!SDLCRCST!Trap!Buffer(s)NowExist„!No‚!Yes!Yes!<*!SBSDLCRC!Subr!Buffer(s)NowExist„!No‚!Yes!Yes!@* +----------+------+------------------------+-----+-----+-----+*F****SDLCROMexecuteswithouttheaidof"timers",‚and‚so‚these‚entry,* points are never used in actual operation.***'* 10 Support Functions and/or Variables*C*†Externally‚defined‚routineswhichareusedbythisimplementation* are;I*SBGTFRIR-FOREGROUND(interrupthandler)USEONLY,getonebuffer‚fromE*†thefreepoolregardlessofthelowwatermarkandhowmanybuffers *†remain,1* DLTRACE - add an entry to the SDLC trace table,.* SBPTFRBF - return a buffer to the free pool,2* SBPTFRML - return many buffers to the free pool,1* SBPTUSQ - put a buffer into the user queue, andF*SBRQPA-(RMS68Kkernelentrypoint)request‚a‚periodic‚activation‚-B*†Note‚that‚theuseofthisfunctionisbeingphasedout.‚ExistingD*†versions(basedontheMC68000MPU)continuetousethis‚function,;*†andƒthereforeƒrequireƒLINK'ing‚with‚the‚associated‚RMS68KC*†functions.‚Newerversions(based  ontheMC68010MPU)willuse‚theE*†TRAP#0instructiontoaccessthesamefunction,andsodonotneed'*†tobeLINK'edwiththeRMS68KKernel.:* Additionally, various RMS68K functions are used by SDLC.*C*†Externallydefinedsymbolicvariablesusedby‚this‚implementation* are;D* NECCTL_A - address of the NEC7201 device control register, Port A,D* NTCCTL_B - address of the NEC7201 device control register, Port B,A* NECDAT_A - address of the NEC7201 device data register, Port A,A* NECDAT_B - address of the NEC7201 device data register, Port B,5* SDLCPCB - pointer to the Primary Control Block, and2* TRACFLAG - trace wanted (least significant bit).**** 11 Known Problems*@*†The‚following‚paragraphs‚detail‚the‚"known"problemswhichareD*eitherthoughttobewithin‚this‚SDLC‚implementation,‚or‚that‚haveI*significantbearingonSDLC'sperformance.‚Theorderofpresentationof'* these problems is of no significance.*G*ThruputImprovement-Theoverallsystemthruputcould‚be‚improved‚byE*†addingatransmissiontoasecondarysystemafterreceivingtraffic@*†fromit.‚Presently,whena‚secondary‚station‚transmits‚inboundC*†traffic,‚it‚mustwaitforthenextpollbeforeit"findsout"howA*†manyframestheprimarystationreceived.‚During‚this‚period‚of6*†time,ƒseveralƒbuffersƒmayƒbeƒtiedƒup‚waiting‚for‚theC*†acknowledgement.‚IftheprimarystationweretotransmitanRR‚orA*†RNR‚(without‚the‚poll‚bit)afterreceivingthefinalbitfroma<*†secondary‚(assuming‚that‚informationƒframesƒwereƒreceived,E*†otherwisetheextratransmissionisextraneous),thenthesecondary<*†station‚would‚immediately‚know‚how‚many‚of‚its‚frames‚wereA*†successfully‚received‚by‚theprimarystation.‚Thischangewould?*†haveasignificantimpact‚during‚the‚upload‚process‚where‚the7*†secondaryƒstationƒonlyƒhasƒfourƒbuffersƒto‚play‚with.A*†Unfortunately,NetworkServicesappearstobe‚unable‚to‚keep‚up>*†with‚the‚current‚upload‚rate,‚and‚this‚proposedchangewould?*†significantlyaccelerate‚the‚upload‚thruput‚thereby‚causing‚a+*†resourceshortageintheprimarystation.J* Architectural Problem - Use of the Low Water Mark facility of the buffer?*†poolisincorrect.ƒGenerally‚speaking,‚routines‚which‚consumeE*†systembuffersshouldbesubjecttotheLowWaterMark,whilethose@*†whichreturnbufferstothepool,‚or‚that‚initiate‚some‚actionC*†which‚will‚causebufferstobereturnedtothepoolshouldnotbeA*†subjecttotheLowWaterMark.‚Presently,thereare‚a‚couple‚of@*†exceptions‚to‚these‚guidelines.ƒSpecifically,theSDLCtraffic>*†receiveroutinesarenotsubject‚to‚the‚Low‚Water‚Mark:ƒThey;*†shouldƒbe.ƒThe‚NTS‚functions‚which‚perform‚the‚connectionE*†tear-down(disconnect,etc)aresubjecttotheLowWaterMark:They>*†should‚not‚be.ƒBecause‚of‚these‚"mis-architected"functions,C*†dead-locksituationsoccurwhenanodereceivestoa‚traffic‚loadB*†which‚exceeds‚itsthruput.‚Allbuffersareconsumedwithreceive@*†traffic,andnobuffersare‚left‚to‚send‚application-level,‚orE*†definiteresponsetrafficwhichwoulduncommitsomeofthereceived *†buffers.C*PerformanceProblem-‚The‚primary‚station‚is‚not‚re-enabling‚it'sE*†receiversoonenoughbetweensuccessivereceptionswhenthesendingC*†secondarystationisrunninginitsROMversionandis‚sending‚an>*†upload.ƒThe‚primary‚receives‚the‚first‚andthirdinformation>*†frames,butmissesthe‚second‚one.ƒThis‚results‚in‚excessive*†uploaddurations.G*Unknown‚Cause‚-‚A"Receivebufferoverrun"erroroccursapproximatelyE*†everyfourframeswhenreceivinganuploadfromasecondarystationB*†running‚in‚it'sROMversion.‚ThisproblemismostlikelyrelatedA*†tothepreceedingproblem.‚However,thesequence‚of‚events‚that=*†lead‚to‚the‚receive‚buffer‚overrun‚error‚areamystery:‚TheC*†secondarystationshouldnotbesendingover-length‚messages,‚and@*†error‚recovery‚in‚the‚primary‚shouldpreventothererrorsfrom*†"tur  ninginto"thiserror.F*UnknownCause-Asecondarystationisapparently‚getting‚stuck‚in‚a@*†Frame‚Reject‚state‚thereby‚preventing‚thatstation(only)from*†completingarestart.I*UnknownCause-Cessationofdown-loadduringstressperiodsrequires‚a?*†reboot‚of‚the‚entire‚system.ƒThissituationisrare,andonlyE*†occurswhenoneormoreuploadsareinprogressatthesametimeas@*†downloads.ƒA‚"dead-lock"‚situation‚occurswhereallthesystemA*†buffersareinuse,andanotherbufferisneeded‚to‚free‚up‚anyB*†buffers.ƒThere‚maybeotherproblemswhichappeartobethesameA*†asthedead-locksituation.‚Thismaybean‚overall‚buffer‚usageB*†problem,‚or‚an‚NTSproblemratherthanaspecificprobleminthe*†SDLCimplementation.E*ArchitecturalProblem-Ifasecondary‚fails‚(or‚is‚manually‚reset)A*†while‚a‚download‚is‚inprogresstothatsecondary,thestateofC*†thatstationasrecordedintheprimaryoccasionally‚prevents‚theC*†flushing‚oftraffic.‚Thiscausesalargenumberofsystembuffers>*†tobetiedupforanextendedperiod(conceivably,forever).H*ArchitecturalProblem-Thedownload(andupload)processes‚contain‚noE*†datarateregulatingmechanismsandtend,therefore,todriveotherA*†partsofthesystemintoerrorrecovery‚situations‚by‚placing‚aB*†severe‚load‚onthesystemunnecessarily.‚DuetothedifficultiesD*†incorrectingthisproblem,nopracticalsolutionappearsto‚existA*†at‚this‚time.ƒ(These"difficulties"includetheneedtototallyD*†revamphowuploadsanddownloadsareperformedacrossall‚products-*†currentlyusingNetworkServicesandSDLC.)D*Unknown‚Cause‚-‚An‚excessive‚retransmission‚errorisoccuringona8*†download‚information‚block.„Theƒblockƒshouldƒhaveƒbeen>*†acknowledged‚by‚the‚loaded‚secondary,‚or‚it‚shouldhavebeen@*†flushedupondownloadcompletion.‚Either‚of‚these‚events‚would?*†prevent‚the‚excessive‚retransmission‚error‚which‚isoccuring.?*†Thereis,ostensibly,noproblemwith‚this.ƒBut‚the‚system‚is'*†indicatingsomeerror,nonetheless.F*Unknown‚Cause‚-‚Apparently‚amessageisoccasionallybeingdiscarded>*†erroneouslyduring‚the‚download‚and/or‚restart‚process.ƒThisD*†causes‚theaffectedsecondarystationtobeunabletocompleteitsA*†restartandrequiresthemanualresettingof‚that‚station.ƒThis<*†problemƒmayƒbe‚related‚to‚the‚aforementioned‚architectural%*†difficultiesconcerninglinkreset.@*Architectural‚Problem‚-‚The‚"cooperation"‚between‚SDLCƒandƒNTSC*†concerning‚link‚resetand/orrestartisfaultyduetoanumberofC*†problemsinthearchitectureofthisarea.‚The"problems"lead‚to1*†dead-lockand/orpoorperformancefairlyoften.D*Architectual‚Difficulty‚-‚RMS68K‚handling‚of‚setdateandtimemay>*†resultin‚several‚seconds‚of‚computation‚with‚all‚interruptsC*†masked.ƒNTS/SDLC"feels"thisbymissingtransmission(s)fromtheC*†primarystation,andloosingcontactforseveralseconds.‚As‚thisE*†onlyoccurswhenasecondarystationisre-starting,theproblemisD*†minortheproblemisconsideredtobean"annoyance"ratherthan‚a=*†"problem".ƒCorrection‚of‚this‚problem‚may‚be‚implementedbyE*†changingthealgorithmwithinRMS68Kand/orbyrevampingthe"powerD*†on"/"poweroff"decisioncriteriawithinSDLC.‚RegardlessoftheC*†RMS68Kchanges,theSDLC'sup/downcriteriashouldbe‚revamped‚as@*†the‚present‚implementation‚is‚crude‚and"over-reacts"tominor*†transgressions.G*HardwareProblem-Ifasecondary(ortheprimary)‚station‚fails‚suchC*†that‚it‚isunabletoperformaresetofthecommunicationsdeviceD*†(NEC7201),andthefailureoccursatatimewhenthatstation‚hasA*†its‚transmitter‚enabled,‚the‚communicationscircuitwillbe"in?*†use"foranindefinateperiodand‚no‚stations‚will‚be‚able‚to=*†communicate.ƒThis‚situation‚will‚continue‚until‚the‚failingC*†stationisidentifiedanddisconnectedfromthecircuit.‚The‚mostD*†expedi  tious‚methodforresolvingthisproblemisto1)verifythatE*†itisoccuring-alinemonitorwilldisplayacontinuousstreamofC*†data‚on‚thecircuit-normallythesamebyteoverandoveragain,E*†andthento2)begindisconnectingsecondarystationsoneatatimeC*†until‚thelinemonitorindicatesacessationofthispattern.‚TheB*†continuoustransmissionwillceasewhenthe‚offending‚station‚isD*†disconnected.‚Alternatively,secondarystationsmaybepoweredoff@*†ratherthanbeingdisconnected.‚This‚condition‚(of‚a‚secondaryE*†"hogging"thecircuit)isverydifficulttoidentifyintheprimaryD*†station'ssoftware,anditisuncertainifanyautomatic‚procedureC*†can‚be‚initiatedbytheprimarytoresolvethissituationevenif%*†itcoulddeterminethatitexisted.*0* **********************************************0* * END OF FILE 'FIX:48.SDLC.OVERVIEW.AI' *0* **********************************************ééE1BEGSDLC ASREL' SDLC BEGSDLC SAQ(…Beginning of SDLC segment2IBEGSDLC )3 `þ4éééééééŽI1BUFMGT ASREL' SDLC BUFMGT SAQ(…BUFFER MANAGEMENT SUBROUTINESó2pUSERQHD pUSERQND pSDLCPCB ISBPTFRML ISBGTUSQ pSDLCQUSB ISBPTUSQ ¼ISBPTXMQ 6IGTFRBF LpFQBCNT IGTFRIR IPTFRBF âIGTFRML žpFQLW  M IPTFRML pNATBEG IGTUSQ IPTUSQ ¶\2IPTXMQ 0pFREEQHD ISBGTFRBF RISBGTFRIR ISBPTFRBF èISBGTFRML ¤)JF3 P@ a@×Ns@ç||Sy(nk|&y(#Ó(F×B“FßNuRy(F×B/&|ÿÿÿÿF3 J FßNua@×Ns@ç||09(°y(o"Sy(k y(#Ð(F×BFßNuRy(F×B/F3 |ÿÿÿÿFßNua@×Ns@çB/BgB§JAoÿý`ašf| —.ˆRoQÉÿì| _F3 2n |ÿÿÿÿFßNua@×Ns@ç±ügÿý| ¹(#È(Ry(Fß |ÿÿÿÿNua@×NsF3€  @J€g aÂ`ô |ÿÿÿÿNua@×Ns@çB€±ügÿý( "y("iD ÿg°gF3 ÓüXJfò|FßNuBhB( B( Bi|$iJ©fEé#H$ˆI3Š BiF×aB þ\| |ÿÿÿÿFßNua@×Ns@ç gÿýB|$y( fEù(#È($ˆF3  Fß 9(g @pÀü&Að hpN@ |ÿÿÿÿNua@×Ns@ç|| 9(g @#Ð&3 (fB¹(F×BFßNuF×B/ |ÿÿÿÿFßNu4ééé—I1BUFMGTX ASREL' SDLC BUFMGTX SAR (…BUFFER MANAGEMENT SUBROUTINESö2pUSERQHD pUSERQND pSDLCPCB ISBPTFRML  pSYSPOFF pSDLCQXMT ISBGTUSQ LpSDLCQUSB ISBPTUSQ ÂISBPTXMQ *IGTFRBF ¢pFQBCNT IGTFRIR IPTFRBF †IGTFRML @pFQLWM pMEMOFF IPTFRML pNATBEG …2IGTUSQ FIPTUSQ ¼IPTXMQ $pFREEQHD pFREEQND ISBGTFRBF ¨ISBGTFRIR ISBPTFRBF ŒISBGTFRML F)ºF3P a@×Ns@ç/ |"x J¸ fÿýFï|Jé kòfÿýSi n kF|B© F3B  &i —ü€×ø Ófÿý#S © gÿýFïB“B«B«B« "_FßNuRi F3 fÿý© gÿýFïB/&|ÿÿÿÿ"_FßNua@×Ns@ç|/ "x Fï|JéF3…"„ kòfÿý0) °i oPSi nk@B©  i ‘ü€Ñø Ðfÿý#P © gF3 ÿýFïBB¨B¨B¨ "_FßNuRi fÿý© gÿýFïB/ |ÿÿÿÿ"_FßNuF3 a@×Ns@çB/BgB§JAoÿý`aÿNf| —.ˆRoQÉÿê| _2n |ÿÿF3 ÿÿFßNua@×Ns@ç/ ±ügÿý"x BFï|Jé kòfÿý © gÿý‘øF3… P€ Ñü€#H J© fJi fÿý‘ü€#H Ri oÿý© gÿýFï"_ |ÿÿI3 ÿÿFßNua@×Ns  @J€g aÿt`ò |ÿÿÿÿNua@×Ns@ç±ügÿýJ¸ gaB ýÂF3@ |FßNuB€( "x "iD ÿg°gÓüXJfò|FßNuBhB( B(I3 Bi|$iJ©fEé#H$ˆBiF×aB ýV| |ÿÿÿÿFßNua@×F3E$ Ns@ç gÿý"x BF×|Jé kôfÿý ) g@$@Õø ‘ø $ˆ#H © gÿýF3  F× 8 g @pÀü&Að hpN@ |ÿÿÿÿFßNu‘ø #H Ñü€#H © gF3„ ÿýF×`¼a@×Ns@ç|"x F×|Jé kôfÿý ) €J€g, @Ñø JfB©@3‚@ Ðfÿý#P © gÿýF×BFßNu© gÿýF× |ÿÿÿÿB/FßNu4éé   I1DLTRACE ASREL' SDLC DLTRACE SAS#(…TRACE INTERRUPTS ON DATA LINKA2pSDLCPCB pNECCTL_A pNECCTL_B IDLTRACE pTRACEBEG )@<3@@@ $y($R4ï$ï4À$ñù(ù(Eê"y(µémEé"Š"y(Nu4ééééééé©,1EXORDLC ASREL' SDLC EXORDLC SAS5(…}2JSBSDLCFL $pSYSPOFF JSBSDLCKL 8JSBUSRACK JSDLCQXMT .JSDLCQUSB ’pMEMOFF pV2RQHD pSBGTFRBF *”H3 .,<¡aA ög <ÿT—` 1GFa Nu.,<¢`Ú|a NuB‡,<£F3 `Æ/ "y(B‘ù(Jé kúCé  €J€g"@Óù( fô"ˆ"y(© ` /×3 "Ÿ‘"_NuNu4éééé éé²' SDLC IBFMGT ROÇÇrrPORTAIO ROÐÐrrPORTAV4 ROÙÙrrM1IBUFMGT ASREL' SDLC IBFMGT SAT(…BUFFER MANAGEMENT INIT SUBROUTINE 2pSZDBUF HSBINFRBF ( (3 BB€0:A ú@$HÑÀ³Èm$ˆRA`ò•ÀB’Nu4ééééééé¿ D1PORTAIO ASREL' SDLC PORTAIO SAT4(…PASS INERRUPT ON TO HDIO 2IPORTAIO pNECCTL_A ):>3 9(f )Ofp$qNÒ$o/iT"iX)ÿÿgäH€LßNu4éééééééÈN1PORTAV4 ASREL' SDLC PORTAV4 SATW(…MVME400, PASS INTERRUPT ON TO HDIO 2IPORTAIO pNECCTL_A )$(3 $iX€$iTBgHz@çNÒ9(fìLßNs4éééééé éÑ' TEST OUTTERM AFæærrOUTTERM SAïïrrOUTTERM ROøørr=/*=/*†TEST.OUTTERM.AF=/*1=/* Chain file to assemble module TEST.OUTTERM.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to TEST.OUTTERM.LS=/*=/IFC \1ƒ=ARGTEST.OUTTERM.LS=/ENDIF=/*)=ASM TEST.OUTTERM.SA,TEST.OUTTERM.RO,\1;R=/*{ Included files are:=/*ƒ--none--=/*}=/*=ENDééééééÞ,OUTTERMƒIDNTƒ1,0PutMessageouttoterminal**ˆPUTMESSAGEOUTTOTERMINAL* ‰OFFSET„0OUTPB„DS.W†1ˆ2=WRITECOMMAND‰DS.W†1ˆ8=IMAGEMODE ‰DS.W†1ˆ6=LU‰DS.W†3OUTPBSA‚DS.L†1‰STARTADDRESSOUTPBEA‚DS.L†1‰ENDADDRESS‰DS.L†2 ‰SECTI ONƒ14**„ONENTRY:‚A1=STARTADDRESS*A2=ENDADDRESS* ‰XDEF†OUTTERMOUTTERM‚LEA‡OUTPB(A6),A0‰MOVE.L„A1,OUTPBSA(A0)‰MOVE.L„A2,OUTPBEA(A0)‰MOVE.W„#2,(A0)…COMMAND‰MOVE.W„#8,2(A0)„OPTIONS‰MOVE.W„#6,4(A0)„LU ‰CLR.L…6(A0) ‰CLR.W…10(A0) ‰CLR.L…20(A0)‰TRAP†#2‰RTS‰ENDéééééçG1OUTTERM ASREL' TEST OUTTERM SAU!(…Put Message out to terminal2NOUTTERM .*03AÖ!I !J0¼1|1|B¨Bh B¨NBNu4ééééééé ð' VM02 STRSDLC AFrrSTRSDLC SArrVEC7201 AGrrSTRSDLC RO  rr=/*=/*†VM02.STRSDLC.AF=/**=/* Chain file to assemble VM02.STRSDLC.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to VM02.STRSDLC.LS=/*=/IFC \1ƒ=ARGVM02.STRSDLC.LS=/ENDIF=/*;=ASM VM02.STRSDLC.SA/&.STRSDLC.SA,VM02.STRSDLC.RO,\1;RZ=100=/*{ Included files are:=/*ƒ9995.SDLCPRI.TEMPLTS.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TST.EQ=/*ƒ9995.HDIO.HDIO.EQ=/*ƒ9995.INET.INET.EQ=/*}=/*=ENDééééééý#************************************FileVM02.STRSDLC.SAŒ*#************************************TYPEBD„EQU„02‡*VM02BoardŠPAGEé éééééé**ˆVM02.VEC7201.AG* ŠSECTION8 ŠXDEFƒVEC7201=VEC7201ƒEQU„\V2G1IR6‹*NEC7201usestheGroup1,IRQ6vector%ŠNOP—MusthavecodetosatisfylinkerŠENDééééééé 91STRSDLC ASREL' STRSDLC SAU%(…Start up SDLCx2pPORTAIO pSYSTYPE pVEC7201 pINT7201 pINT7201A pBEGSDLC pPWRUP pTRACFLAG pTRACEBEG HSTRSDLC (8H3@ :A þgNu&lAú pN@` `ÔHDIO*H0<"m6Eé "FIX:48.SDLCSEC.FRMCNT.AI' *5***************************************************** I* NOTE: I THINK THIS PROCEDURE (TRANSEQ) IS ALWAYS THE WRONG THING TO DO!@*‡WEWILLRE-USETHEFIRSTBUFFERINTHERECEIVEQUEUE.‚ISTHEREE*‡ALWAYSONETHERE?‚ISITOKTORE-INITIALIZEITSBYTECOUNT,STATUS,3*‡ERROR,RETRYCOUNT,ANDSECONDARYSTATIONNUMBER?L* This situation (reaching the end of the transmit queue without sending the;*‡finalbitshouldoccuronlyasaresultofaFLUSHorder.* ED SKINNER, MARCH 3, 1983 &‰FAIL†501‡TRANSEQISVERY,VERYWRONG! *TRANSEQ‚EQU‡*‰TRANSMIT(ENDOFQUEUE)EXIT/‰MOVE.L„SDPRCV(A5),A2TRANSMITAN"RR"RESPONSE ‰CMPA.L„#0,A2‰CRASH.EQ‚*+1‡DIEIFNOBUFFER! ‰MOVE.B„#SDDRRR+$10,SDDCMD(A2)*‰BRA.L…VCTINIT6‚* &TRANSPB‚EQU‡*‰TRANSMIT(POLLBIT)EXIT@‰MOVE.L„SDPRCV(A5),A3TxMITTEDAPOLLBIT,GETINTORECEIVEMODE‰BRA.L…SDLCRC02‚* ‰PAGE%TRANSUF‚EQU‡*‰TRANSMITUNDERFLOWEXIT‰MOVE.B„#NCW0RG1,NECCTL_B„*#‰MOVE.B„#NCW1IRD+NCW1STV,NECCTL_B*9‰MOVE.B„#SDPBFC,SDPBSY(A5)SETSDLCBUSYINFRAMECONTROL‰ADD.W…#1,SDSHCTOF(A4)…3/2/83'‰BTST.B„#0,SDDCMD(A3)IFIELDTxMITTED?‰IFˆTHEN.S)‹SUB.B…#2,SDSVSC(A4)YES,FIXUPVsCOUNT‹AND.B…#$0E,SDSVSC(A4)6‹SUB.B…#1,SDSUKT(A4)Andnumberofun-ack'dframesout‰ENDI/‰TST.L…SDSTHD(A4)DIDANSDLCFLUSHJUSTOCCUR?‰IFˆTHEN.S/‹MOVE.L„SDPRCV(A5),A2Yes,sendan"RR"command‹MOVE.B„#SDDRRR+$10,SDDCMD(A2)3‹MOVE.B„#SDPTRQ,SDPTXF(A5)(sendingfromrcvqueue)‹BRA.L…VCTINIT6‰ENDI1‰TST.B…SDDRTC(A3)No,shallwetrysendingagain?<‰BEQ.S…TRANSPBƒCountiszero,sowe'lltryagainwhenpolled@‰SUB.B…#1,SDDRTC(A3)Countisn'tzeroyet,decrementoneattempt=‰BNE.S…TRANSPBƒandresend(whenpolled)ifcountnotzeroyet?* Fall-thru to next page when the retransmission count expires.‰PAGE4* Note: We fall-thru to here from the previous page. M5V3^<f=n<vK~B†QŽM–?ž4* The retry count has expired for a transmit buffer.=* Return it to the originator after marking it as unsendable.F* Then, fix up the transmit queue by linking the buffer just after the.*‡unsendableonetothebufferjustbeforeit.?* For example, if the transmit queue currently looks like this;'*†A-->B-->C,whereBisunsendable.:* Then we fix up the transmit queue so it looks like this;*†A-------->C.K* The fix-up is accomplished by looking for a buffer that points to the oneO* we jus t got rid of, and then storing the "next" buffer's address (as returned3* to us by SOMESEND) into its forward link pointer.3‰MOVE.B„#SDDSSTE,SDDSTS+1(A3)Markitasunsendable6‰MOVE.L„A3,A1…A1=A(Unsendablebuffer-forSOMESEND)>‰MOVE.L„A3,A2…A2=A(Unsendablebuffer-forWHILEclauseuse)6‰BSR.L…SOMESEND‚PasstheUnsendablebuffertotheuser7‰MOVE.L„A1,A3…A3=A(Nextbufferinthetransmitqueue)?‰LEA‡SDSTHD-SDDLNK(A4),A1Findbufferbeforetheunsendableone?‰WHILE.LƒSDDLNK(A1)A2DO.SPointingtounsendablebuffer?/‹MOVE.L„SDDLNK(A1),A1‡No,ontothenextbuffer‰ENDW@‰MOVE.L„A3,SDDLNK(A1)yes,store"next"into"beforeunsendable"<‰BRA.S…TRANSPBƒAlldonewithclean-up,goseewhattodonow ‰PAGE'RECEITO‚EQU‡*‰RECEIVETIMEOUTOCCURRED‰MOVE.B„#SDDSSRT,SDDSTS+1(A3)‰ADD.W…#1,SDSHCRTP(A4)…3/2/83 ‰BRA.S…HSKP0 /RECEIEE‚EQU‡*‰RECEIVEEXCESSIVEERRORSOCCURRED‰MOVE.B„#SDDSSRE,SDDSTS+1(A3)‰ADD.W…#1,SDSHCREX(A4)…3/2/83 *ˆBRA.S…HSKP0 &RECEILB‚EQU‡*‰RECEIVE,NOBUFFERSLEFT +RECEIFB‚EQU‡*‰RECEIVEDAFINALBITRESPONSE ***ˆENDOFARCVSEQUENCE,SHUTRECEIVEROFF* HSKP0„MOVE.B„#NCW0RG1,NECCTL_B„*#‰MOVE.B„#NCW1IRD+NCW1STV,NECCTL_B*‰MOVE.B„#NCW0RG3,NECCTL_B„*#‰MOVE.B„#NCW3BT8+NCW3AUE,NECCTL_B„*‰ADD.W…#1,SDSHCROF(A4)…3/2/83&‰BSR.L…SOMETOCLRCLEARRECEIVETIMEOUT&* A5 = PRIMARY CONTROL BLOCK'S ADDRESS(* A4 = SECONDARY CONTROL BLOCK'S ADDRESS‰MOVE.L„SDPRCV(A5),A2#* A2 = CURRENT RCV BUFFER'S ADDRESS9‰MOVE.B„#SDPBFC,SDPBSY(A5)SETSDLCBUSYINFRAMECONTROL,‰MOVE.W„#$2500,SRLOWER68000INTERRUPTMASK,‰BSR.L…SBXIDQ„CHECKFOR"XID"ONTxMITQUEUE* Fall-thru to the next page‰PAGE7* NOTE: WE MAY FALL-THRU TO HERE FROM THE PREVIOUS PAGE **ˆSDLCFRAMECONTROLPROCEDURES*9HSKP1„MOVE.L„A2,SDPRCV(A5)SAVENEWHEADOFRECEIVEQUEUE!‰IF.B†SDDSTS+1(A2)#0THEN.S‹CLR.L…D0ˆNoRCVerrors,‹MOVE.B„SDSCST(A4),D0 ‹SUB.B…#1,D0 ‹ASL.L…#2,D08‹JMP.S…RCVVCT(PC,D0.W)TocurrentstateifnoRCVerrors,RCVVCT…BRA.L…VCTINITƒToINITIALIZATIONSTATE+‹BRA.L…VCTINIBƒToINITIALIZATIONBUSYSTATE$‹BRA.L…VCTDISCƒToDISCONNECTEDSTATE&‹BRA.L…VCTNRM„ToNORMALRESPONSESTATE‹BRA.L…VCTBSY„ToBUSYSTATE$‹BRA.L…VCTFRMRƒToFRAMEREJECTSTATE‰ENDI‰MOVE.L„A2,A1…RcvErrors,5‰BSR.L…SOMESEND‚TelltheApplicationProgramaboutit ‰MOVE.L„A1,A20‰BSR.L…SOMEFREE‚*FREEANYOTHERRECEIVEBUFFERS+‰BRA.L…SDLCRC01‚*GOBACKINTORECEIVEMODE‰PAGE *$*ˆINITIALIZATIONSTATEFRAMECONTROL*2VCTINIT‚MOVE.B„#SDSCIBSY,SDSCST(A4)"SIM"COMMAND?‰CMP.B…#SDDCSIM,SDDRSP(A2)‰BEQ.S…VCTINIT3,‰MOVE.B„#SDSCIM,SDSCST(A4)NO,POLLBITSET?‰BTST.B„#$4,SDDRSP(A2)‰IFˆTHEN.S5‹MOVE.B„#SDSCIM,SDSCST(A4)Yes,Senda"RIM"Response‹MOVE.B„#SDDRRIM,SDDCMD(A2))VCTINIT6ƒCLR.W…SDDBCT(A2)INITBYTECOUNT%VCTINIT7ƒCLR.W…SDDSTS(A2)INITSTATUS"‹CLR.B…SDDRTC(A2)INITRETRYCOUNT!‹CLR.B…SDDERR(A2)INITSDLCERROR,‹MOVE.B„SDSSEC(A4),SDDSEC(A2)INITSTATION#4‹MOVE.L„A2,SDPRCV(A5)SAVENEWHEADOFRECEIVEQUEUE ‹MOVE.L„A2,A3$‹BRA.L…TRANSMTƒTRANSMITTHERESPONSE‰ENDIFREEQUEUE‰BSR.L…SOMEDISPOSE ‰MOVE.L„A1,A26‰MOVE.L„A1,D0…Anymorereceivebuffersafterthatone?;‰BNE.L…HSKP1…Yes,loopbackupandseewhatthenextoneis;‰BRA.L…SDLCRC01‚No,justgoturnthereceiverbackonagain :VCTINIT2MOVE.B„#SDSCRDM,SDSCST(A4)SETDISCONNECTEDSTATEGVCTINIT3TST.W…SDDBCT(A2)DATAFIELDON"SIM""SNRM"OR"DISC"COMMAND?=‰BNE.L…FRMRPI„Yes,heshouldn'thavedonethat!(GoFRMRhim)<‰BSR.L…SBGTFRIR‚NO,Getabufferforsendinga"UA"response‰IFˆTHEN.S2‹BSR.L…SOMEFREE‚NOBUFFERS,Sodon'tsendanything@‹BRA.L…SDLCRC01‚(Makelikewedidn'treceivehiscommandatall)‰ENDI6‰CLR.B…SDSVRC(A4)Nodatafield,it'savalidcommand,-‰CLR.B…SDSVSC(A4)resetourVrandVscounts,1‰MOVE.L„A2,A1…andtelltheuserwhathashappened‰BSR.L…SOMESEND'‰MOVE.L„A3,A2…thensenda"UA"response‰MOVE.B„#SDDRUA,SDDCMD(A 2)*@‰MOVE.B„#SDPTRN,SDPTXF(A5)*SETTxMITFLAGASIF"RNR"TxMITTEDJ* NOTE: THIS WILL CAUSE RECEIVED I-FRAMES TO BE IGNORED UNTIL AN "RNR" CAN?* BE TRANSMITTED BECAUSE WE ARE IN THE BUSY OR INIT BUSY STATE.M* WE HAVE PASSED A RECEIVED SNRM ON TO THE "USER" IN OUR MACHINE, AND HE MUST(* ACKNOWLEDGE IT BEFORE WE CAN CONTINUE.‰BRA.S…VCTINIT6‚* ‰PAGE *)*ˆINITIALIZATIONBUSYSTATEFRAMECONTROL*+VCTINIB‚BTST.B„#$4,SDDRSP(A2)POLLBITSET?2‰BEQ.S…VCTINIT1‚*NO,FREEBUFFER,GOINTORECEIVEF‰MOVE.B‚#SDDRRNR+$10,SDDCMD(A2)YES,BUILD&TRANSMITA"RNR"RESPONSE‰BRA.S…VCTINIT6‚* ‰PAGE **ˆBUSYSTATEFRAMECONTROL**VCTBSYƒBTST.B„#$4,SDDRSP(A2)POLLBITSET?2‰BEQ.L…VCTINIT1‚*NO,FREEBUFFER,GOINTORECEIVEF‰MOVE.B‚#SDDRRNR+$10,SDDCMD(A2)YES,BUILD&TRANSMITA"RNR"RESPONSE‰BRA.L…VCTINIT6ƒ* ‰PAGE *"*ˆFRAMEREJECTSTATEFRAMECONTROL*+VCTFRMR‚BTST.B„#$4,SDDRSP(A2)POLLBITSET?2‰BEQ.L…VCTINIT1‚*NO,FREEBUFFER,GOINTORECEIVEC‰MOVE.B„#SDSCIBSY,SDSCST(A4)YES,"SIM","DISC",OR"SNRM"COMMAND?‰CMP.B…#SDDCSIM,SDDRSP(A2)*‰BEQ.L…VCTINIT3‚*‰CMP.B…#SDDCDISC,SDDRSP(A2)*‰BEQ.L…VCTINIT2‚*‰MOVE.B„#SDSCBSY,SDSCST(A4)*‰CMP.B…#SDDCSNRM,SDDRSP(A2)*‰BEQ.L…VCTINIT3‚*4‰BRA.S…FRMRSP„NO,BUILD&TRANSMITA"FRMR"RESPONSE ‰PAGE E* FRAME REJECTS WILL BE TRANSMITTED BY A SECONDARY STATION FOR ANY OF* THE FOLLOWING REASONS;K* 1) INVALID COMMAND - IN DISC OR NRM STATE, RECEIVE AN XID, AND HAVE NEVER*–TRANSMITTEDANXID,OR2*–INNRMANDRECEIVEAN"UNKNOWN"SDLCCOMMAND,OR2*–INFRAMEREJECTSTATEANDRECEIVEANYOTHERTHAN*–ASIM,DISC,ORSNRMCOMMAND.J* 2) PROHIBITED I-FIELD - RECEIVED AN I-FIELD ON A COMMAND WHICH IS A SIM,*–SNRM,DISC,RR,RNR,ORREJ.G* 3) BUFFER OVERRUN - RECEIVE AN OTHERWISE "GOOD" FRAME WHICH IS LONGER*–THANABUFFER.H* 4) INVALID Nr COUNT - RECEIVED AN Nr VALUE (IN EITHER A SUPERVISORY OR2*–ANINFORMATIONFRAME)WHICHACKNOWLEDGESAFRAME*–WEHAVENOTTRANSMITTED. **ˆCREATE"FRaMeReject"DATA*4FRMRICƒMOVE.B„#$01,SDPFRB+2(A5)‚INVALIDCOMMANDFRMR)‰CMP.B…#SDSCRDM,SDSCST(A4)INDISCSTATE?,‰BEQ.L…VCTDISC1‚*IFYES,SEND"DM"RESPONSE‰BRA.S…FRMRGN„NO,SEND"FRMR" 7FRMRPIƒMOVE.B„#$03,SDPFRB+2(A5)ƒPROHIBITEDIFIELDFRMR‰BRA.S…FRMRGN„* 3FRMRBOƒMOVE.B„#$04,SDPFRB+2(A5)ƒBUFFEROVERRUNFRMR‰BRA.S…FRMRGN„* 5FRMRNRƒMOVE.B„#$08,SDPFRB+2(A5)ƒINVALIDNRCOUNTFRMR*BFRMRGNƒMOVE.B„SDDRSP(A2),SDPFRB(A5)OFFENDINGCOMMAND->FRMRDATA=‰MOVE.B„SDSVSC(A4),D0CURRENT"NR"&"NS"COUNTS->FRMRDATA‰OR.B†SDSVRC(A4),D0‡*‰AND.B…#$EE,D0ƒ*‰MOVE.B„D0,SDPFRB+1(A5)(‰BSR.L…SOMEFREE‚FREEALLRECEIVEBUFFERS"‰BSR.L…SBGTFRIR‚FETCHANEWBUFFER6‰BGT.L…SDLCRC01‚OUTIFTHEREAREABSOLUTELYNOBUFFERS2* GOT ONE, DON'T CARE IF IT'S THE LAST ONE OR NOT.‰MOVE.L„A3,A2…*DFRMRSPƒMOVE.B„#SDSCRFR,SDSCST(A4)BUILD&TRANSMITA"FRMR"RESPONSE‰MOVE.B„#SDDRFRMR,SDDCMD(A2)*'‰MOVE.W„#3,SDDBCT(A2)*INITBYTECOUNT)‰MOVE.L„SDPFRB(A5),SDDDAT(A2)*INITDATA‰BRA.L…VCTINIT7‚* ‰PAGE * *ˆDISCONNECTSTATEFRAMECONTROL*+VCTDISC‚BTST.B„#$4,SDDRSP(A2)POLLBITSET?2‰BEQ.L…VCTINIT1‚*NO,FREEBUFFER,GOINTORECEIVEC‰MOVE.B„#SDSCIBSY,SDSCST(A4)YES,"SIM","DISC",OR"SNRM"COMMAND?‰CMP.B…#SDDCSIM,SDDRSP(A2)*‰BEQ.L…VCTINIT3‚*‰CMP.B…#SDDCDISC,SDDRSP(A2)*‰BEQ.L…VCTINIT2‚*‰MOVE.B„#SDSCBSY,SDSCST(A4)*‰CMP.B…#SDDCSNRM,SDDRSP(A2)*‰BEQ.L…VCTINIT3‚*.‰MOVE.B„#SDSCRDM,SDSCST(A4)NO,"XID"COMMAND?‰CMP.B…#SDDCXID,SDDRSP(A2)*‰BEQ.S…XIDRSP„*/‰CMP.B…#SDDCTEST,SDDRSP(A2)NO,"TEST"COMMAND?‰BEQ.S…TESTRSP‚*GVCTDISC1MOVE.B„#SDDRDM,SDDCMD(A2)‚NO,BUILD&TRANSMITA"DM"RESPONSE‰BRA.L…VCTINIT6‚* ‰PAGE **ˆTRANSMITA"TEST"RESPONSE*%TESTRSP‚MOVE.B„#SDDCTEST,SDDCMD(A2)*‰BRA.L…VCTINIT7‚* ‰PAGE J***************************************************************************<*‚SUBROUTINE:‚"SBXIDQ"CHECKFORAN"XID"ONTHETxMITQUEUE*2*‚ENTER:ŠA4.L=ADDRESS OFSECONDARYCONTROLBLOCK)*’A5.L=ADDRESSOFPRIMARYCONTROLBLOCK*!*‚REGISTERSUSED:ƒ01234567*’DU*’AUUƒUPPƒS *¢|_stack*K*************************************************************************** 9SBXIDQƒMOVE.L„SDSTHD(A4),A3"XID"REPONSEONTxMITQUEUE?6‰IF.L†A3#0AND.BSDDCMD(A3)#SDDCXIDTHEN.S8‹MOVE.L„SDDLNK(A3),SDSTHD(A4)TAKE"XID"OFFTxMITQUEUE‹IF.L†SDPXID(A5)#0THEN.S5MOVE.L„SDPXID(A5),A1…DISPOSEOFTHEOLD"XID"BUFFERBSR.L…SOMEDISPOSE‹ENDI/‹MOVE.L„A3,SDPXID(A5)NEW"XID"RESPONSEBUFFER‰ENDI‰RTS ‰PAGE *&*ˆTRANSMITAN"XID"OR"FRMR"RESPONSE*2XIDRSPƒBSR.S…SBXIDQ„CHECKFOR"XID"ONTxMITQUEUE,‰MOVE.L„SDPXID(A5),D0"XID"RESPONSEBUFFER?&‰BEQ.L…FRMRIC„*IFNO,INVALIDCOMMAND,‰BSR.L…SBGTFRIR‚FETCHARCVBUFFERFORLATER‰IFˆTHEN.S1‹BSR.L…SOMEFREE‚NOBUFFERS,JUSTSTAYINRCVMODE‹BRA.L…SDLCRC01‰ENDI‰MOVE.L„A3,SDPRCV(A5)*0‰MOVE.L„A2,A1…SENDTHE"XID"COMMANDTOTHEUSER‰BSR.L…SOMESEND‚*,‰MOVE.L„SDPXID(A5),A3PREPARE"XID"RESPONSE‰CLR.W…SDDSTS(A3)*STATUS!‰CLR.B…SDDRTC(A3)*RETRYCOUNTER‰CLR.B…SDDERR(A3)*ERROR)‰MOVE.B„SDSSEC(A4),SDDSEC(A3)*STATION#%‰MOVE.B„#SDDCXID,SDDCMD(A3)*COMMAND1‰BRA.L…TRANSMTƒTRANSMITTHE"XID"&GOTORECEIVE ‰PAGE *%*ˆNORMALRESPONSE‚STATEFRAMECONTROL*/VCTNRMƒMOVE.L„SDSTHD(A4),A3‡HEADOFTxMITQUEUE*VCTNRM02CLR.L…D0ˆISCOMMANDAN"I"FIELD?‰MOVE.B„SDDRSP(A2),D0 ‰BTST.L„#0,D0#‰BEQ.L…DSPNR1„YES,OUTIF"I"FRAME0‰BTST.L„#1,D0…NO,"RR","RNR",OR"REJ"COMMAND?0‰BEQ.S…DSPNR…YES,OUTIFRR,RNR,ORREJCOMMAND‰BTST.L„#4,D0…NO,POLLBITSET?‰BEQ.S…VCTNRM06C‰MOVE.B„#SDSCIBSY,SDSCST(A4)YES,"SIM","DISC",OR"SNRM"COMMAND?‰CMP.B…#SDDCSIM,D0‰BEQ.L…VCTINIT3‰CMP.B…#SDDCDISC,D0‰IF.B†D0#SDDCDISCTHEN.S<‹CMP.B…#SDPTXQ,SDPTXF(A5)"DISC",TxMITTEDFROMTxMITQUEUE?‹BNE.L…VCTINIT26‹CMP.B…#SDDRRD,SDDCMD(A3)YES,WAS"RD"LASTRESPONSE?‹BNE.L…VCTINIT2K* NOTE: THE "RD" RESPONSE WILL BE LEFT ON THE TRANSMIT QUEUE UNTIL A "DISC"F*COMMANDISRECEIVED.‚THE"RD"CAMEFROMA"USER"WITHINOURMACHINE.&‹MOVE.L„A3,A1…YES,DISPOSEOFTHE"RD"‹BSR.L…SOMEDISPOSE-‹MOVE.L„A1,SDSTHD(A4)NEWHEADOFTxMITQUEUE‹BRA.L…VCTINIT2‰ENDI‰MOVE.B„#SDSCBSY,SDSCST(A4)*‰CMP.B…#SDDCSNRM,D0*‰BEQ.L…VCTINIT3‚*.‰MOVE.B„#SDSCNRM,SDSCST(A4)NO,"XID"COMMAND?‰CMP.B…#SDDCXID,D0*‰BEQ.L…XIDRSP„*'‰CMP.B…#SDDCTEST,D0NO,"TEST"COMMAND?‰BEQ.L…TESTRSP‚*!‰AND.B…#$EF,D0‚NO,CLEARPOLLBIT)VCTNRM06CMP.B…#SDDCUI,D0ISCOMMAND"UI"‰BEQ.L…RSPUI…*%‰BRA.L…FRMRIC„*IGIVEUPIFITISN'T ‰PAGE ADSPNR„TST.W…SDDBCT(A2)DATAFIELDON"RR""RNR"OR"REJ"COMMAND?$‰BNE.L…FRMRPI„*IFYES,FRAMEREJECT**ˆTESTFORAVALIDNrCOUNT*DSPNR1ƒCLR.L…D0 ‰CLR.L…D1 ‰CLR.L…D2$‰MOVE.B„SDDRSP(A2),D0FETCHNrCOUNT‰LSR.B…#5,D0…*$‰MOVE.B„SDSVSC(A4),D1FETCHVsCOUNT‰LSR.B…#1,D1…*-‰MOVE.B„SDSUKT(A4),D2FETCH#TxMITTEDFRAMES ‰BEQ.S…DSPNR2„*FRAMESTxMITTED?>‰CMP.L…#0,A3…ALLXMITFRAMESGONE(RESULTOFAFLUSH)?3/21/831‰BEQ.S…DSPNR2„YES,SAMEASIFNOI_FRAMES3/21/833‰BTST.B„#0,SDDCMD(A3)NO,"I"FRAMEONTxMITQUEUE?‰BNE.S…DSPNR2„**1‰MOVE.B„SDDCMD(A3),D1*YES,GETNsCOUNTFROMIT‰LSR.B…#1,D1…**‰ADD.B…D2,D1…**‰AND.B…#7,D1…**DSPNR2ƒWHILE.BƒD0D1DO.S‹SUB.B…#1,D1…NEXTVsCOUNT ‹AND.B…#7,D1#‹SUB.B…#1,D2…ALLVsCOUNTSCHECKED?#‹BMI.L…FRMRNR„YES,INVALIDNrCOUNT‰ENDW* Fall-thru to the next page‰PAGE3* NOTE: WE FALL-THRU TO HERE FROM THE PREVIOUS PAGE *"*ˆDISPOSEOFTXMITBUFFERSTONR-1*%‰CLR.L…D1ˆFETCHNrCOUNTFROMCOMMAND‰MOVE.B„SDDRSP(A2),D1*‰LSR.B„#4,D1…*‰AND.B…#$0E,D1ƒ*‰MOVE.B„D1,SDSVSC(A4)*Vs=Nr ‰MOVE.L„A3,D0…TxMITQUEUEEMPTY?‰BEQ.L…DSPRC1„YES,OUT>DSPNR4ƒCMP.B…#SDPTXQ,SDPTXF(A5)NO,TxMITTEDFROMTxMITQUEUE?‰BNE.L…DSPRC1„*&‰CLR.L…D0ˆYES,TXMITTEDAUIRESPONSE?‰MOVE.B„SDDCMD(A3),D0*‰AND.B…#$EF,D0ƒ*‰IF.B†D0#SDDCUITHEN.S‹BTST.L„#0,D0…IFIEL D? ‹BNE.L…DCRTX8‹TST.B…SDSUKT(A4)YES,UNACKNOWLEDGEDIFRAMESTxMITTED? ‹BEQ.L…DSPRC1‹AND.B…#$0E,D0ƒYES,Nr=Ns?‹IF.B†D1D0THEN.S4MOVE.B„SDDRSP(A2),D0YES,isresponseRR,RNR,REJ?AND.B…#$03,D0ƒ*CMP.B…#1,D0…*BNE.S…DSPUI…*-BTST.B„#4,SDDRSP(A2)andpoll/finalbitset?BNE.S…DSPUI…*+MOVE.L„A2,A1…NO,DISPOSEOFRECEIVEBUFFERBSR.L…SOMEDISPOSE*%MOVE.L„A1,A2…ENDOFRECEIVEBUFFERS?MOVE.L„A1,D0…*BEQ.S…DSPUI…**BRA.L…VCTNRM02‚NO,TESTBUFFER'SRESPONSE‹ENDI‰ENDI)‰MOVE.L„A3,A1…NO,DISPOSEOFTxMITBUFFER!‰BTST.B„#4,SDDCMD(A3)POLL/FINAL?‰IFˆTHEN.S‹BSR.L…SOMEDISPOSENO ‹MOVE.L„A1,A3‹SUB.B…#1,SDSUKT(A4) ‹BRA.S…DSPNR4‰ELSE.S7‹BSR.L…SOMEDISPOSEYES,ALSODISPOSEOFRECEIVEBUFFERS ‹MOVE.L„A1,A34‹CLR.B…SDSUKT(A4)CLEARUNACKNOWLEDGEDIFRAMECOUNT ‹BRA.L…DSPRC1‰ENDI ‰PAGE *,*ˆAUI(UNNUMBEREDIFIELD)COMMANDOCCURRED*=RSPUI„MOVE.L„A2,A1…SENDRECEIVEBUFFERTOAPPLICATIONPROGRAM‰BSR.L…SOMESEND%‰MOVE.L„A1,A2…ENDOFRECEIVEBUFFERS? ‰MOVE.L„A1,D0 ‰BEQ.S…DSPUI*‰BRA.L…VCTNRM02‚NO,TESTBUFFER'SRESPONSE ‰PAGE **ˆDISPOSEOFUITXMITBUFFERS*9DSPUI„CMP.B…#SDPTXQ,SDPTXF(A5)TxMITTEDFROMTxMITQUEUE?‰BNE.L…DSPRC1„*&‰MOVE.L„A3,D0…YES,ENDOFTxMITQUEUE?‰BEQ.L…DSPRC1„*%‰CLR.L…D1ˆNO,TXMITTEDAUIRESPONSE?‰MOVE.B„SDDCMD(A3),D1*‰AND.B…#$EF,D1ƒ*‰CMP.B…#SDDCUI,D1*‰BNE.S…DCRTX…**‰MOVE.L„A3,A1…YES,DISPOSEOFTXMITBUFFER‰BTST.B„#4,SDDCMD(A3)*‰IFˆTHEN.S>‹BSR.L…SOMEDISPOSEPOLL/FINALSET,ALSODISPOSEOFRCVBUFFERS ‹MOVE.L„A1,A3 ‹BRA.S…DSPRC1‰ENDI#‰BSR.L…SOMEDISPOSEPOLL/FINALCLEAR ‰MOVE.L„A1,A3 ‰BRA.S…DSPUI ‰PAGE **ˆDECREMENTTxMITRETRYCOUNTS*DCRTX„MOVE.L„A3,A1…*‰MOVE.B„SDSUKT(A4),D1+DCRTX2ƒMOVE.L„A3,D0…ALLTxMITBUFFERSGONE?‰BEQ.S…DCRTX5„*"‰BTST.B„#0,SDDCMD(A3)NO,IFIELD?‰IFˆTHEN.S*‹TST.B…D1ˆYES,UNACKNOWLEDGEDCOUNTCLEAR?‹BEQ.S…DCRTX5„YES,OUT ‹SUB.B…#1,D1‰ENDI7‰TST.B…SDDRTC(A3)NO,DECREMENTRETRYCOUNTIFNON-ZERO ‰BEQ.S…DCRTX4*‰SUB.B…#1,SDDRTC(A3)DECREMENTRETRYCOUNT‰BNE.S…DCRTX4„EXPIRED??‰MOVE.L„A3,A1…YES,SENDTHISTxMITBUFFERTOAPPLPGMASUNSENT>‰MOVE.B„#SDDSSTE,SDDSTS+1(A3)SETRETRYCOUNTEREXPIREDSTATUS$‰BTST.B„#$4,SDDCMD(A3)POLLBITSET?‰IFˆTHEN.S&‹BSR.L…SOMESEND‚YES,LASTTXMITBUFFER4‹CLR.B…SDSUKT(A4)CLEARUNACKNOWLEDGEDIFRAMECOUNT ‹BRA.S…DCRTX5‰ENDI"‰BTST.B„#0,SDDCMD(A3)NO,IFIELD?‰IFˆTHEN.S#‹SUB.B…#1,SDSUKT(A4)YES,FIXCOUNT‰ENDI‰BSR.L…SOMESEND%‰MOVE.L„A1,A3…FETCHNEXTTxMITBUFFER ‰BRA.S…DCRTX2 .DCRTX4ƒCLR.B…SDDERR(A3)CLEARSDLCERRORFIELD$‰BTST.B„#$4,SDDCMD(A3)POLLBITSET?‰IFˆTHEN.S1‹MOVE.L„SDDLNK(A3),A3No,FETCHNEXTTxMITBUFFER ‹BRA.S…DCRTX2‰ENDI!* Fall-Thru if poll/final bit set ‰PAGE +DCRTX5ƒMOVE.L„A1,A3ƒNEWHEADOFTxMITQUEUE**ˆDISPOSEOFRCVBUFFERS*3DSPRC1ƒMOVE.L„A3,SDSTHD(A4)NEWHEADOFTxMITQUEUE.‰MOVE.L„A2,D0…ALLRECEIVEBUFFERSDISPOSEDOF? ‰BEQ.S…SELTX4‰CMP.B…#SDDERBO,SDDERR(A2)NO,BUFFEROVERRUNERROR? ‰BEQ.L…FRMRBO0‰TST.B…SDDERR(A2)NO,SOMEOTHERSDLCRCVERROR? ‰BNE.S…SELTX2/‰MOVE.B„SDDRSP(A2),D0ISCOMMAND‚UIORIFIELD?‰AND.B…#$EF,D0‰IF.B†D0#SDDCUITHEN.S ‹BTST.L„#0,D0 ‹BNE.S…SELTX2„OUTIFNOTI-FRAME‰ENDI;‰MOVE.L„A2,A1…UIORI-FRAME,SENDITTOAPPLICATIONPROGRAM‰BTST.B„#4,SDDRSP(A2)‰IFˆTHEN.S!‹BSR.L…SOMESEND‚FINALBITNOTSET ‹MOVE.L„A1,A2 ‹BRA.S…DSPRC1‰ELSE.S5‹BSR.L…SOMESEND‚*YES,ALSOFREEALLRCVBUFFERSLEFT$‹MOVE.L„A1,A2…FALL-THRUTONEXTPAGE‰ENDI ‰PAGE :* WARNING: WE MAY FALL-THRU TO HERE FROM THE PREVIOUS PAGE*%*ˆFETCHABUFFER&TRANSMITSOMETHING*)SELTX„BSR.L…SOMEFREE‚FREEANYOLDBUFFERS"‰BSR.L…SBGTFRIR‚FETCHANEWBUFFER3‰BGT.L…SDLCRC01‚OUTIFABSOLUTELYNOBUFFERSATALL‰IFˆTHEN.S* GOT THE VERY LAST BUFFER/‹MOVE.L„A3,SDPRCV(A5)NEWHEADOFRECEIVEQUEUE ‹MOVE.L„A3,A21‹MOVE.B„#SDDRRNR+$10,SDDCMD(A2)TRANSM ITAN"RNR"3‹MOVE.B„#SDPTRQ,SDPTXF(A5)TxMITTINGFROMRCVQUEUE‹BRA.L…VCTINIT6‰ENDI3‰MOVE.L„A3,SDPRCV(A5)NO,NEWHEADOFRECEIVEQUEUE-‰MOVE.L„A3,A2…USENEWBUFFERTOTRANSMITFROM‰MOVE.B„#$10,SDDRSP(A2)**ˆSELECTARESPONSETOTRANSMIT*+SELTX2ƒBTST.B„#$4,SDDRSP(A2)FINALBITSET?‰IFˆTHEN.S(‹MOVE.L„A2,A1…NO,DISPOSEOFTHISBUFFER‹BSR.L…SOMEDISPOSE ‹MOVE.L„A1,A2 ‹BRA.L…DSPRC1‰ENDI5‰MOVE.L„A2,SDPRCV(A5)ONLY1BUFFERLEFTINRCVQUEUE‰MOVE.B„SDDRSP(A2),D0?‰AND.B…#$1F,D0ƒWerewesentanRNRcommand?orhavenotraffic?9‰IF.B†D0#SDDRRNR+$10OR.LSDSTHD(A4)#0THEN.S9‹MOVE.B„#SDDRRR+$10,SDDCMD(A2)Yes,sendan"RR"response3‹MOVE.B„#SDPTRQ,SDPTXF(A5)(sendingfromrcvqueue)‹BRA.L…VCTINIT6‰ENDI‰MOVE.L„SDSTHD(A4),A3‰MOVE.B„#SDPTXQ,SDPTXF(A5)#‰BTST.B„#0,SDDCMD(A0)YES,IFIELD?‰IFˆTHEN.S:‹CLR.B…SDSUKT(A4)YES,CLEARUNACKNOWLEDGEDTRANSMITCOUNT‰ENDI‰BRA.L…TRANSMT ‰PAGEG* When a "flush" occurs, after all transmit frames have been discarded,H* and when, at the moment of the flush, we are transmitting one of theseH* frames, an abort is transmitted and the transmitter turned off (by theE*flushprocedure).‚Immediatelyafterdoingthat,webranchtoSDLCRQ* to decide what to do next.I* In a secondary station, we simply exit because we will wait to see whatK* the primary wants us to do next (presumably he will poll us fairly soon). SDLCRQƒSDLRSRG‰RTE /***********************************************/* END OF FILE 'FIX:48.SDLCSEC.FRMCNT.AI' */***********************************************ééééééé4****************************************************4* BEGINNING OF FILE 'FIX:48.SDLCSEC.PWRUP.AI' *4**************************************************** M*NOTE:ATSTARTUP,OURCURRENTSTATEIS"DISCONNECTMODE".‚THESTARTER-UPPERE*‡(WHO?)STORES#SDSCRDMINTOSDSCSTTHEREBYASSERTINGTHISSTATE.‚WEE*‡AREINTHISSTATEWHENTHEPWRUPSUBROUTINEISCALLED,WHICHISTHE&*‡FIRSTCALLTOTHESDLCDRIVERLOGIC. SDLRSRG‚MACRO2‰MOVEM.Lƒ(A7)+,A0-A6/D0-D2RESTORESAVEDREGISTERS‰ENDM  SDLSVRG‚MACRO‰MOVEM.LƒA0-A6/D0-D2,-(A7)‰ENDM‰PAGE H*************************************************************************Æ*D*SUBROUTINE:‚"PWRUP"INITIALIZETHENEC7201CHIPATPOWERUPTIME„*#*REGISTERSUSED:ƒ01234567¤* *‘DUUU®**‘AUUUƒP…S¤**Æ*H************************************************************************ ‰NEXTWB,PWRUP„MOVE.B„#NCW0RCN,NECCTL_B„CHANNELRESET‰MOVE.B„#NCW0RG2,NECCTL_A)‰MOVE.B„#NCW2RTS+NCW2PRI+NCW2BIN,NECCTL_A*‰MOVE.B„#NCW0RG2,NECCTL_B„INTERRUPTVECTOR‰MOVE.B„#0,NECCTL_B‰MOVE.B„#NCW0RG4,NECCTL_B„MODE)‰MOVE.B„#NCW4C01+NCW4SDL+NCW4SME,NECCTL_B#‰MOVE.B„#NCW0RG7,NECCTL_B„SDLCFLAG‰MOVE.B„#SDLCFLAG,NECCTL_B3‰MOVE.B„#NCW0RG3,NECCTL_B„ENABLEAUTOENABLEOFCTS!‰MOVE.B„#NCW3BT8+NCW3AUE,NECCTL_B‰IFEQ†RES7201-400‹MOVE.W„SR,-(A7)!‹ORI.W…#$0700,SRŠMaskInterrupts!5‹MOVE.L„#MVME400,A0ˆA0=AddressoftheMVME400board'‹BCLR.B„#REGSELEC,CTLPIA_A(A0)SetDDRAA‹MOVE.B„#WRT_LED+WRT_SEL,DATPIA_A(A0)tooutputmid-twobitsonly:‹BSET.B„#REGSELEC,CTLPIA_A(A0)SwitchnowtoDataRegonA=‹BSET.B„#WRT_SEL,DATPIA_A(A0)SelectbaudratejumpersPort2(‹MOVE.B„DATPIA_A(A0),D0andreadthemin6‹ANDI.W„#$07,D0‹AND'ingoffallbutthebaudratebitsB‹MOVE.B„V400BAUD(PC,D0.W),D0andgetthe4-bitcorrespondingvalue3‹MOVE.B„D0,-(A7)Šsavingitonthestacktemporarily,‹BCLR.B„#REGSELEC,CTLPIA_B(A0)Now,setDDRB2‹MOVE.B„#%11111111,DATPIA_B(A0)toallbitsoutput:‹BSET.B„#REGSELEC,CTLPIA_B(A0)SwitchnowtoDataRegonB¦5¯L·K¿IÇ;‹MOVE.B„DATPIA_B(A0),D0andreadthecurrent4-bitsettings.‹ANDI.B„#RATE1MSK,D0dropoutPort2'ssetting;‹OR.B†(A7)+,D0andORinthenewvaluewefiguredoutaboveB‹MOVE.B„D0,DATPIA_B(A0)andoutputthenewrate(Port1unchanged)#‹MOVE.W„(A7)+,SRŠUnmaskInterrupts!‰ENDC,‰LEA‡SDLCPR(PC),A0‡Addressof"SDLCPR"->A0‰MOVE.L„#TIMCNST,A1‰MOVE.W„#$4005,D19‰MOVE.L„#DLC1,D2ŒRequestaPeriodic,RecurringActivation‰IFEQ†CHIPTYPE-68000 ‹TR0.RQPA‰ENDC‰IFNE†CHIPTYPE-68000 ‹TR0$.RQPA‰ENDC3‰BRA.S…HOPOVER(MUSTBE2BYTEINSTRUCTION)‚2/24/831‰ILLEGALDIEIFSBRQPARETURNSANYERROR!ˆ2/24/83 5HOPOVER‚BRA.L…SBSDLCRCSTŠGoturnonthereceivernow! ‰IFEQ†RES7201-400"V400BAUDƒDC.B†15,14,13,12,10,7,5,2‰ENDC *3*„ThisisadummyroutinetosatisfyXREFinBUFMGT*‰XDEF†SDLCQXMT )SDLCQXMTILLEGALDie,shouldnotbeused! ‰PAGE ‰SECTIONƒ9H*************************************************************************Æ*0*ˆTRAP:‚"SDLCQU"‚TRAPSERVICEROUTINEFORSDLC*0*™ABUFFERHASBEENENQUEUEDFORTRANSMISSION.*,*™INTHESECONDARYSTATION,WEDON'TCARE.…**ˆSUBROUTINE:‚"SDLCQUSB"§**Æ**Æ*#*REGISTERSUSED:ƒ01234567¤**‘D´**‘AS¤* *¡|__stackœ**Æ*H************************************************************************ 'SDLCQUƒBSR.S…SDLCQUSB‚DOTHESUBROUTINE=‰MOVE.W„SR,0(A7)‚REPLACESRONSTACKTOGIVEPROPERCCRETURN‰RTE‘ANDRETURN 2SDLCQUSBRTS‘JustReturn,Wedon'tcareaboutthis ‰PAGE H*************************************************************************Æ*4*ˆTRAP:‚"SDLCTTMOUT"‚TRAPSERVICEROUTINEFORSDLCŒ*,*THISROUTINEISENTEREDWHENTHERECEIVE**TIMEOUTEXPIRESš**ˆSUBROUTINE:‚"SDLCTMOUT"¦**Æ**Æ*#*REGISTERSUSED:ƒ01234567¤**‘D´**‘AS¤* *¡|__stackœ**Æ*H************************************************************************ SDLCTMOUT‚RTS2RTE%SDLCTTMOUTSDLSVRGSAVEALLUSERREGS‰MOVE.L„SDLCPCB,A6RESTOREREGS‰MOVEM.LƒSDPRRTA0(A6),A0-A6‰ADD.W…#1,SDSHCRTO(A4)…3/2/83‰BRA.L…RECEITOƒRECEIVETIMEOUT ‰PAGE H*************************************************************************Æ*8*ˆTRAP:‚"SDLCPR"‚TRAPSERVICEROUTINEWHICHISENTEREDˆ*%*™WHENTHEPERIODICTIMERRUNSDOWNŒ **ˆSUBROUTINE:‚"SDLCPRSB"§**Æ**Æ*#*REGISTERSUSED:ƒ01234567¤**‘D´**‘AS¤*H************************************************************************ SDLCPRSB RTS2RTE!SDLCPRƒSDLSVRGŽSAVEALLREGISTERS2‰MOVE.L„SDLCPCB,A5AREWEBUSYWAITINGFORBUFERS?$‰IF.B†SDPBSY(A5)#SDPBWBTHEN.S‹SDLRSRGŽNO,RETURN‹RTE‰ENDI8‰BRA.S…SDLCRC01‚YES,GOGETONEANDTURNONTHERECEIVER‰PAGE H*************************************************************************Æ*0*ˆTRAP:‚"SDLCKL"ƒTRAPSERVICEROUTINEFORSDLC*&*šTHISROUTINEEFFECTIVELYKILLSTHEŠ*.*šSDLCLINKANDCANCELSPERIODICACTIVATIONS‚**ˆSUBROUTINE:‚"SBSDLCKL"§**Æ*#*REGISTERSUSED:ƒ01234567¤* *‘DƒUU®**‘AS¤* *¡|__stackœ**Æ*H************************************************************************ 9SDLCKLƒBSR.S…SBSDLCKL‚TRAPENTRYPOINT,DOTHESUBROUTINE9‰MOVE.W„SR,0(A7)‚REPLACESRONSTACKSOWEGIVEPROPERCC‰RTE‘ANDRETURN /SBSDLCKLMOVE.W„SR,-(A7)‚SUBROUTINEENTRYPOINT!‰ORI.W…#$0700,SRMASKTOLEVEL7!1‰MOVE.B„#NCW0RCN,NECCTL_BCHANNELRESET7201CHIP'‰BSR.L…SOMETOCLRTURNOFFRECEIVETIMER‰MOVE.W„#$8005,D1;‰MOVE.L„#DLC1,D2‚DiscontinueRecurringPeriodicActivations‰IFEQ†CHIPTYPE-68000 ‹TR0.RQPA‰ENDC‰IFNE†CHIPTYPE-68000 ‹TR0$.RQPA‰ENDC‰BRA.S…SDLCKLEX)‰ILLEGALDIEIFSBRQPARETURNSANYERROR! 6SDLCKLEXMOVE.W„(A7)+,SR‚RESTOREPRIORINTERRUPTLEVEL‰RTS‘ANDRETURN ‰PAGE H*************************************************************************Æ*<*ˆSUBROUTINE:‚"SBUSRACK"‚USERACKNOWLEDGESRECEIPTOFSDLC„*!*¡"SIM""DISC"OR"SNRM"FRAMESˆ**ˆTRAP:ˆ"USRACK"©**Æ*&*ˆENTER:‚D0.B="SDDCSIM"=>ACKSIM›**•="SDDCDISC"=>ACKDISC™**•="SDDCSNRM"=>ACKSNRM™**Æ**Æ*#*ˆREGISTERSUSED:ƒ01234567**˜DP«* *˜AUS**š|‚|Š|_stack–**š|‚|____________preserved’**š|_______________used—**Æ**Æ*H************************************************************************ 9USRACKƒBSR.S…SBUSRACK‚TRAPENTRYPOINT,DOTHESUBROUTINE5‰MOVE.W„SR,0(A7)‚REPLACESRONSTACKGIVINGPROPERCC‰RTE‘ANDRETURN @SBUSRACKMOVE.L„SDLCPCB,A0FETCHSECONDARYCONTROLBLOCKADDRESS‰MOVE.L„SDPFSEC(A0),A0‰IF.B†D0#SDDCSIMTHEN.S2‹MOVE.B„#SDSCRDM,SDSCST(A0)IFSIM,SETDISCSTATE‰ELSE.S‹IF.B†D0#SDDCDISCTHEN.S3MOVE.B„#SDSCRDM,SDSCST(A0)IFDISC,SETDISCSTATE‹ELSE.SIF.B†D0#SDDCSNRMTHEN.S2MOVE.B„#SDSCNRM,SDSCST(A0)IFSNRM,SETNRMSTATEELSE.S%‘ILLEGALOTHERWISE,ILLEGALACK,DIE!ENDI‹ENDI‰ENDI‰RTS ‰PAGE H*************************************************************************Æ*2*ˆTRAP:‚"SDLCRCST"‚TRAPSERVICEROUTINEFORSDLCŽ*)*™THISROUTINEFETCHESARECEIVEBUFFERˆ**™ANDSTARTSUPTHERECEIVER“**ˆSUBROUTINE:‚"SBSDLCRCST"¥**Æ**Æ*#*REGISTERSUSED:ƒ01234567¤**‘D´**‘AS¤* *¡|__stackœ**Æ*H************************************************************************ SBSDLCRCST RTS2RTE#SDLCRCSTSDLSVRGSAVEALLUSERREGS>SDLCRC01MOVE.L„SDLCPCB,A5PRIMARYCONTROLBLOCKADDRESS->A5<‰MOVE.L„SDPFSEC(A5),A4SECONDARYCONTROLBLOCKADDRESS->A4)‰CLR.L…SDPRCV(A5)CLEARHEADOFRCVQUEUE ‰MOVE.W„SR,D0‰AND.W…#$0700,D0%‰CMP.W…#$0500,D0ATLEASTLEVELFIVE?‰IF.W†#$0500D0THEN.S‹MOVE.W„SR,D0…NO,‹AND.W…#$F8FF,D0.‹OR.W†#$0500,D0RAISETOINTERRUPTLEVELFIVE!-‹MOVE.W„D0,SR…(OLDSRANDLEVELAREONSTACK)‰ENDI-‰MOVE.B„#SDPBNB,SDPBSY(A5)SETSSDLCNOTBUSY$‰BSR.L…SBGTFRIR‚GETARECEIVEBUFFER‰IFˆTHEN.S8‹MOVE.B„#SDPBWB,SDPBSY(A5)NONEAVAILABLE,SLEEPAWHILE‹SDLRSRG‹RTE‰ENDIBSDLCRC02MOVE.L„A3,SDPRCV(A5)LINKRCVBUFFERTOHEADOFRCVQUEUE-‰MOVE.W„SDPRLG(A5),SDDBCT(A3)INITBYTECOUNT‰CLR.W…SDDSTS(A3)INITSTATUS!‰CLR.B…SDDERR(A3)INITSDLCERROR,‰MOVE.B„SDSSEC(A4),SDDSEC(A3)STATIONNUMBER#‰BRA.L…RECEIVEƒGOINTORECEIVEMODE .**********************************************.* END OF FILE 'FIX:48.SDLCSEC.PWRUP.AI' *.********************************** ************éééééé' GEN IBUFQ AGÛÛrrIDLCP AGääLrrILOADP AGíírrINETP AGöörrINET LGÿÿ+rrINETNOL LG4rrINETV2 LG1rrLOADV2 LGrr**ˆGEN.IBUFQ.AG*0IBUFQ„IDNT†1,0ƒINITPARAMSFORBUFFERMANAGEMENT ‰SECTIONƒ8*$*ˆCOPYRIGHTED1982BYMOTOROLA,INC.*F***********************************************************************Ä*3*„InitializationParametersforBufferManagement‘**Ä*F*********************************************************************** ‰XDEF†NUMBUF5NUMBUFƒDC.W†\NUMBUFƒNunberofbuffersinBufferQueue ‰XDEF†SZDBUF4SZDBUFƒDC.W†\SZDBUFƒSizeofdataareaineachbuffer ‰XDEF†FQULWM4FQULWMƒDC.W†\FQULWMƒFreeQueueUser'sLowWaterMark‰ENDéé éééÓ**ˆGEN.IDLCP.AG*1IDLCP…IDNTƒ1,0InitializationparametersforSDLC*‰NOLIST*‰INCLUDE9995.INET.INET.EQ*‰LISTŠNOLISTŠINCLUDE9995.INET.INET.EQŠLIST ŠSECTION8*$*ˆCOPYRIGHTED1982BYMOTOROLA,INC.*F***********************************************************************Ä*?*„InitializationParametersforSynchronousDataLinkControl…**Ä*F*********************************************************************** STAFLG„SET„0 ŠXDEFƒSTATION STATIONƒEQU„*ŠIFC„'\STATION','PRIMARY'&DC.B‚0StationIDflag,0forprimary STAFLG‡SETƒ1ŠENDCŠIFC„'\STATION','SECONDARY'*DC.B‚1StationIDflag,<>0forsecondary STAFLG‡SETƒ2ŠENDC ŠIFEQƒSTAFLG5FAIL‚100ƒSTATIONmustequal'PRIMARY'or'SECONDARY'ŠENDC ŠIFNEƒSTAFLG*STAFLG‡SET‚STAFLG-1…0=PRIMARY,1=SECONDARYŠENDC* ŠXDEFƒSYSTYPE7SYSTYPEƒDC.Bƒ\SYSTYPE‹Systemtype(NOLINK,LINKMAIN,...)* ŠXDEFƒMAXSEC ŠIFEQƒSTAFLGBMAXSEC‡DC.Wƒ\MAXSEC…Max#secondarystations(iflocalisprimary) XDEFƒFSSTN0FSSTNˆDC.Bƒ\FSSTNFirstSecondaryStationNumber XDEFƒSSINC-SSINCˆDC.Bƒ\SSINCSecondaryStationINCrementŠENDC ŠIFNEƒSTAFLG5MAXSEC‡DC.Wƒ1’Iflocalstationissecondary,MAXSEC=1 XDEFƒFSSTN FSSTNˆDC.Bƒ0 XDEFƒSSINC SSINCˆDC.Bƒ0ŠENDC ŠXDEFƒDLBR%DLBR†DC.Wƒ\DLBRŽDataLink'sBaudRate ŠXDEFƒTXRTRY(TXRTRY„DC.Bƒ\TXRTRYŒTransmitRetryCount ŠXDEFƒRCRTRY'RCRTRY„DC.Bƒ\RCRTRYŒReceiveRetryCount ŠXDEFƒMXOBF3MXOBF…DC.Bƒ\MXOBFMaximumNumberofOutboundFrames ŠXDEFƒRCTOV3RCTOV…DC.Wƒ\RCTOVReceiveTimeoutValue(1=50Msec) ŠXDEFƒRTRDLY+RTRDLY„DC.Wƒ\RTRDLYŒRetryDelay(1=50Msec) ŠXDEFƒTXDLY,TXDLY…DC.Wƒ\TXDLYTransmitDelay(1=50Msec) ŠXDEFƒPFDLY4PFDLY…DC.Wƒ\PFDLYPollPoweredOffDelay(1=50Msec) ŠXDEFƒPNDLY3PNDLY…DC.Wƒ\PNDLYPollPoweredOnDelay(1=50Msec) ŠXDEFƒTXPDS$TXPDS…DC.Bƒ\TXPDS#ofTransmitPadsŠENDÜM**ˆGEN.ILOADP.AG*(ILOADP„IDNTƒ1,0Init.equatesforLOADV2 ŠSECTION8*$* COPYRIGHTED 1982 BY MOTOROLA, INC.*#* Initialization equates for LOADV2* ŠXDEFƒV2OFF'V2OFF…EQU„\V2OFFOffsetforVM02memory ŠXDEFƒV2SYSP0V2SYSP„EQU„\V2SYSPŒAddressforVM02SYSPARarea.ŠENDé éééééå**ˆGEN.INETP.AG*/INETP„IDNT†1,0ƒINITPARAMSFORNETWORKSERVICES ‰SECTIONƒ8*$*ˆCOPYRIGHTED1982BYMOTOROLA,INC.*F***********************************************************************Ä*0*„InitializationParametersforNetworkServices*Ä*F*********************************************************************** ‰XDEF†MAXLNAUFMAXLNAU‚DC.W†\MAXLNAU‚Max#NetworkAddressableUnitsatlocalstation ‰XDEF†MAXNAMEGMAXNAME‚DC.W†\MAXNAME‚Max#NetworkNames(ifprimary-maxinnetwork) ‰XDEF†MAXCONN/MAXCONN‚DC.W†\MAXCONN‚Max#LogicalConnections ‰XDEF†OPERDEVOPERDEV‚DC.L†0‰ENDéééééî=/*=/*†GEN.INET.LG=/*.=/* Link chain file run at sysgen time to link=/*D=/* Sysgen parameter LINKLS = \LINKLS = file/device to which to send=/* the linker listing=/*"=LINK ,&.INET.LO,&.SYSGEN.TF;HMIXS TASK INET,$AATTR SDPSEG SDLC(R ):9,10,2 $0000 SEG SSCT:14,0 SEG INET(R):8DEF DLCBLDCB,$0000DEF SBINFRBF,$0000DEF STRSDLC,$0000INPUT…SDLC.BEGSDLC.ROINˆSDLC.BUFMGTX.ROINˆSDLC.EXORDLC.ROINˆNTS.NTSREQ.ROINˆNTS.NTCREQP.ROINˆNTS.NWCREQ.ROINˆNTS.TRANSSUB.ROINˆNTS.TRANSSCN.ROINˆNTS.SSCT.ROINˆNTS.NWCTPRI.ROIN‡TEST.OUTTERM.ROINˆNTS.NTSSERV.ROINŠ&.SYSPAR.ROIN…M68000.INET.ROINˆGEN.INETP.ROINˆGEN.IDLCP.ROINˆGEN.IBUFQ.ROINˆGEN.ILOADP.ROIN‡INET.NTBLDTB.ROIN…M68000.SRSN.ROIN‡INET.NWTEST.ROIN‡INET.GETSTA.ROINPUT„INET.OUTTERMS.ROLIB 0.&.UTILIB.ROEND=/*=ENDéééé÷,=/*=/*†GEN.INETNOL.LG=/*.=/* Link chain file run at sysgen time to link=/*D=/* Sysgen parameter LINKLS = \LINKLS = file/device to which to send=/* the linker listing=/*$=LINK ,&.INETNOL.LO,&.SYSGEN.TF;HMIX TASK INET,$AATTR SDPSEG SDLC:9,10,2 SEG SSCT:14,0 SEG &INT:8DEF PORTAIO,$0000DEF NECDAT_A,$F70011DEF NECDAT_B,$F70013DEF NECCTL_A,$F70015DEF NECCTL_B,$F70017INPUT…SDLC.BEGSDLC.ROINˆSDLC.BUFMGTX.ROINˆSDLC.SDLCPRI.ROINˆSDLC.DLTRACE.ROIN 9999.M68XXX.EXRQPA.ROIN‚9999.M6840.RDTIMER.ROIN‰NTS.NTSREQ.ROIN‰NTS.NTCREQP.ROIN‰NTS.NWCREQ.ROIN‰NTS.TRANSSUB.ROIN‰NTS.TRANSSCN.ROIN‰NTS.SSCT.ROIN‰NTS.NWCTPRI.ROINˆTEST.OUTTERM.ROIN‰NTS.NTSSERV.ROIN‹&.SYSPAR.ROIN†M68000.INET.ROIN‰GEN.IDLCP.ROIN‰GEN.INETP.ROIN‰GEN.IBUFQ.ROIN‰GEN.ILOADP.ROINˆINET.IPSDLC.ROINˆINET.GETSTA.ROINˆSDLC.IBFMGT.ROINˆINET.NTBLDTB.ROIN†M68000.SRSN.ROINˆINET.NWTEST.ROINˆVM02.STRSDLC.ROINˆVM02.VEC7201.ROINPUT…INET.OUTTERMS.ROLIB 0.&.UTILIB.ROEND=/*=ENDééé 5=/*=/*†GEN.INETV2.LG=/*.=/* Link chain file run at sysgen time to link=/*D=/* Sysgen parameter LINKLS = \LINKLS = file/device to which to send=/* the linker listing=/*%=LINK ,VM02.INET.LO,&.SYSGEN.TF;SHMIX TASK INET,$AATTR SDPSEG SDLC:9,10,2 \V2BSTR SEG SSCT:14,0 SEG &INT:8DEFƒNECDAT_A,$F70011DEFƒNECDAT_B,$F70013DEFƒNECCTL_A,$F70015DEFƒNECCTL_B,$F70017DEFƒMAXCONN,$8000DEFƒMAXLNAU,$8000DEFƒMAXNAME,$8000DEFƒNTBLDTB,$8000DEFƒNTSREQ,$0000DEFƒNWCT,$0000DEFƒOUTTERMS,$0000DEFƒSSCT,$0000DEFƒTRASCAN,$0000INPUT‡9999.M68XXX.EXRQPA.ROINPUT‡9999.M6840.RDTIMER.ROINPUT‡SDLC.BEGSDLC.ROINPUT‡SDLC.BUFMGTX.ROINPUT‡SDLC.PORTAIO.ROINPUT‡SDLC.SDLCPRI.ROINPUT‡SDLC.DLTRACE.ROINPUT„&.SYSPAR.ROINPUT„M68000.INET.ROINPUT„GEN.IDLCP.ROINPUT„GEN.IBUFQ.ROINPUT„GEN.ILOADP.ROINPUT„INET.IPSDLC.ROINPUT„SDLC.IBFMGT.ROINPUT„M68000.SRSN.ROINPUT„INET.NWTEST.ROINPUT„VM02.STRSDLC.ROINPUT„VM02.VEC7201.ROINPUT„INET.GETSTA.ROLIB 0.&.UTILIB.ROEND=/*=ENDééé 2=/*=/*†GEN.LOADV2.LG=/*.=/* Link chain file run at sysgen time to link=/*D=/* Sysgen parameter LINKLS = \LINKLS = file/device to which to send=/* the linker listing=/*%=LINK ,&.LOADV2.LO,&.SYSGEN.TF;HAMIXSSEG SEG0:0,8,14INPUT &.SYSPAR.ROINPUT INET.LOADV2.ROINPUT GEN.ILOADP.ROLIB 0.&.UTILIB.ROEND=/*=ENDéééé éé' NETVM02 INT LG'' rr=/*=/*†&..SYSINIT.LG=/*=/*=LINK ,INIT.LO,SYSGEN.TF;HAMIXSSEG .INT:8 \PCINPUT ROGEN.ROINPUT &.INITDAT.ROINPUT 9999.C13O15.SYSPAR.ROEND=/*=ENDééééééé  ' SDLCPRI FRMCNT SI445ÊrrINT7201 SImm+rrPOLLQ SIžž.crrRECEIVE SIÏÏ5žrrSUBRTN SI rrTRANSMITSI))Lrr‰PAGE4****************************************************5* BEGINNING OF FILE 'FIX:48.SDLCPRI.FRMCNT.AI' *4**************************************************** 9TRANSEQ‚EQU‡*‰EndofXmtQueuereached,P/FbitNOTsent!‰MOVE.B„#NCW0EOI,NECCTL_A8‰MOVE.B„#NCW0RG1,NECCTL_B„DisableTransmitterInterrupts!‰MOVE.B„#NCW1IRD+NCW1STV,NECCTL_B9‰MOVE.B„#SDPBFC,SDPBSY(A5)SETSDLCBUSYINFRAMECONTROL‰ADD.W…#1,SDSHCTOF(A4)…3/2/83‰MOVE.L„SDSTHD(A4),A3‰MOVE.L„SDPRCV(A5),A2 ‰BSR.L…SOMEFREEFREERCVBUFFERS ‰LEA‡0,A2*-‰CLR.B…SDSPWR(A4)ASSUMEDEVICEISPOWEREDUP0‰BRA.L…DSPUI…DISPOSEOFANYTxMITTED"UI"FRAMES .TRANSPB‚BRA.L…RECEIVEƒTRANSMIT(POLLBIT)EXIT ‰PAGE %TRANSUF‚EQU‡*‰TRANSMITUNDERFLOWEXIT8‰MOVE.B„#NCW0RG1,NECCTL_B„DisableTransmitterInterrupts!‰MOVE.B„#NCW1IRD+NCW1STV,NECCTL_B9‰MOVE.B„#SDPBFC,SDPBSY(A5)SETSDLCBUSYINFRAMECONTROL'‰BTST.B„#0,SDDCMD(A3)IFIELDTxMITTED?‰IFˆTHEN.S*‹SUB.B…#2,SDSVSC(A4)YES,FIXUPVsCOUNTS‹AND.B…#$0E,SDSVSC(A4)‹SUB.B…#1,SDSUKT(A4)‰ENDI)‰TST.L…SDSTHD(A4)Didaflushjustoccur?(‰BEQ.S…TRANSUF3‚Yes,gosendan"RR"now&‰TST.B…SDDRTC(A3)No,anyretrycount?2‰BEQ.L…TRANSMTƒNo,retrysendingforeverandever!>‰SUB.B…#1,SDDRTC(A3)Yes,countoneattempttosendthebuffer7‰BNE.L…TRANSMTƒandgore-senditifcountnotexhausted4* The retry count has expired for a transmit buffer.=* Return it to the originator after marking it as unsendable.F* Then, fix up the transmit queue by linking the buffer just after the.*‡unsendableonetothebufferjustbeforeit.?* For example, if the transmit queue currently looks like this;'*†A-->B-->C,whereBisunsendable.:* Then we fix up the transmit queue so it looks like this;*†A-------->C.K* The fix-up is accomplished by looking for a buffer that points to the oneO* we just got rid of, and then storing the "next" buffer's address (as returned3* to us by SOMESEND) into its forward link pointer.,15@=@ENMOUJ]33‰MOVE.B„#SDDSSTE,SDDSTS+1(A3)Markitasunsendable6‰MOVE.L„A3,A1…A1=A(Unsendablebuffer-forSOMESEND)>‰MOVE.L„A3,A2…A2=A(Unsendablebuffer-forWHILEclauseuse)6‰BSR.L…SOMESEND‚PasstheUnsendablebuffertotheuser7‰MOVE.L„A1,A3…A3=A(Nextbufferinthetransmitqueue)?‰LEA‡SDSTHD-SDDLNK(A4),A1Findbufferbeforetheunsendableone?‰WHILE.LƒSDDLNK(A1)A2DO.SPointingtounsendablebuffer?/‹MOVE.L„SDDLNK(A1),A1‡No,ontothenextbuffer‰ENDW@‰MOVE.L„A3,SDDLNK(A1)yes,store"next"into"beforeunsendable"8‰BNE.L…TRANSMTƒGosendthenextoneifsomething'sthereETRANSUF3MOVE.L„SDPRCV(A5),A3Otherwise,sendan"RR"commandinstead‰BRA.L…SDLCPR5B ‰PAGE /RECEIEE‚EQU‡*‰RECEIVEEXCESSIVEERRORSOCCURRED‰MOVE.B„ #SDDSSRE,SDDSTS+1(A3)‰ADD.W…#1,SDSHCREX(A4) ‰BRA.S…HSKP2 ‰PAGE 'RECEITO‚EQU‡*‰RECEIVETIMEOUTOCCURRED‰MOVE.B„#SDDERTO,SDDERR(A3)‰ADD.W…#1,SDSHCRTP(A4) +RECEIFB‚EQU‡*‰RECEIVEDAFINALBITRESPONSE *RECEILB‚EQU‡*‰RECEIVEDEPLETEDBUFFERPOOL ***ˆENDOFARCVSEQUENCE,SHUTRECEIVEROFF*HSKP2„MOVE.B„#NCW0RG1,NECCTL_B!‰MOVE.B„#NCW1IRD+NCW1STV,NECCTL_B‰MOVE.B„#NCW0RG3,NECCTL_B!‰MOVE.B„#NCW3BT8+NCW3AUE,NECCTL_B‰ADD.W…#1,SDSHCROF(A4)…3/2/83&‰BSR.L…SOMETOCLRCLEARRECEIVETIMEOUT‰MOVE.L„SDSTHD(A4),A3‰MOVE.L„SDPRCV(A5),A2&* A5 = PRIMARY CONTROL BLOCK'S ADDRESS(* A4 = SECONDARY CONTROL BLOCK'S ADDRESS%* A3 = CURRENT TXMIT BUFFER'S ADDRESS#* A2 = CURRENT RCV BUFFER'S ADDRESS * Fall-thru to the next page‰PAGE3* NOTE: WE FALL-THRU TO HERE FROM THE PREVIOUS PAGE **ˆSDLCFRAMECONTROLPROCEDURES*9‰MOVE.B„#SDPBFC,SDPBSY(A5)SETSDLCBUSYINFRAMECONTROL,‰MOVE.W„#$2500,SRLOWER68000INTERRUPTMASK@‰CLR.B…SDSTXF(A4)ASSUMENOT(RNRSENT&GOODRSPRCV'D)2/24/83 %‰IF.B†SDDRSP(A2)#SDDRRIMTHEN.S5‹OR.B†#SDDSRIM,SDDSTS(A2)IFRIM,THENSETRIMSTATUS‰ELSE.S$‹IF.B…SDDRSP(A2)#SDDRDMTHEN.S5OR.B†#SDDSRDM,SDDSTS(A2)IFRDM,THENSETRDMSTATUS‹ELSE.S$IF.B†SDDRSP(A2)#SDDRRDTHEN.S3OR.B†#SDDSRRD,SDDSTS(A2)IFRD,THENSETRDSTATUSENDI‹ENDI‰ENDI.‰MOVE.B„SDDERR(A2),D0Verybaderrorreceived?‰IFˆTHEN.S4‹IF.B†D0#SDDENNRAND.BD0#SDDEIFUTHEN.S-BRA.L…INVRSP„Yes,can'ttellwhatitis,out‹ENDI‰ENDI7‰CLR.B…SDSPWR(A4)No,It'seitherOK,orjustsortabad‰MOVE.B„#SDSCNRM,SDSCST(A4)$‰IF.B†SDPTXF(A5)#SDPTRNTHEN.S<‹MOVE.B„#SDSTRN,SDSTXF(A4)SentRNRorRR,assertgoodreply‰ENDI ‰PAGE+HSKP9„IF.B†SDDRSP(A2)#SDDRFRMRTHEN.SA*ŠSecondariessendFrameRejectforanyofthefollowingreasons;*Œ1-Invalidcommand,?*InDISCorNRMstate,andRcvXIDbutdon'thaveonetosend,/*InNRMstateandRcvan"unknown"command,or6*InFRMRstateandRcvotherthanSIM,DISC,orSNRM,*Œ2-ProhibitedI_field,7*RcvanI_fieldonaSIM,SNRM,DISC,RR,RNR,orREJ,*Œ3-BufferOverrun,<*Rcvanotherwisegoodframewhichislongerthanabuffer,*Œ4-InvalidNrCount,>*RcvanNrcountwhichacknowledgesanframehe'sneversent.2‹OR.B†#SDDSFRM,SDDSTS(A2)SETFRMROCCURREDSTATUS.‹MOVE.L„A2,A1SENDFRMRTOAPPLICATIONPROGRAM‹BSR.L…SOMESEND ‹MOVE.L„A1,A2$‹BSR.L…SOMEFREEFREEALLRCVBUFFERS)‹BRA.L…DCRTXDECREMENTTxMITRETRYCOUNTS‰ENDI‰CLR.L…D0ˆNO,ISRESPONSEUI?‰MOVE.B„SDDRSP(A2),D0‰AND.B…#$EF,D0‰IF.B†D0#SDDCUITHEN.S8‹MOVE.L„A2,A1…SENDRECEIVEBUFFERTOAPPLICATIONPROGRAM‹BSR.L…SOMESEND%‹MOVE.L„A1,A2…ENDOFRECEIVEBUFFERS? ‹MOVE.L„A1,D0 ‹BEQ.L…DSPUI'‹BRA.L…HSKP9…NO,TESTBUFFER'SRESPONSE‰ENDI!‰AND‡#$0F,D0ƒNO,ISRESPONSERNR?‰IF.B†D0#SDDRRNRTHEN.S6‹MOVE.B„#SDSCBSY,SDSCST(A4)YES,SETREMOTEBUSYSTATE ‹BRA.L…DSPNR‰ENDI!‰CMP.B…#SDDRRR,D0ISRESPONSERR?‰BEQ.L…DSPNR…* '‰CMP.B…#SDDRREJ,D0NO,ISRESPONSEREJ?‰BEQ.L…DSPNR…* $‰BTST.L„#$0,D0„NO,ISITANIFIELD?!‰BEQ.L…DSPNR1„YES,CHECKNrCOUNT *‰MOVE.L„A3,D0…NO,ANYTHINGINTxMITQUEUE?‰BEQ.L…DSPRC1„*<‰CMP.B…#SDPTXQ,SDPTXF(A5)DIDWETxMITFROMTHETxMITQUEUE?‰BNE.L…DSPRC1„* ‰PAGE%‰IF.B†SDDCMD(A3)#SDDCSIMTHEN.S$‹IF.B†SDDRSP(A2)#SDDRUATHEN.S)MOVE.B„#SDSCRDM,SDSCST(A4)RDM-->STATECLR.B…SDSVRC(A4)0-->VrCLR.B…SDSVSC(A4)0-->Vs BRA.L…OKRSP‹ELSE.S BRA.L…INVRSP‹ENDI‰ENDI&‰IF.B†SDDCMD(A3)#SDDCSNRMTHEN.S$‹IF.B†SDDRSP(A2)#SDDRUATHEN.S)MOVE.B„#SDSCNRM,SDSCST(A4)NRM-->STATECLR.B…SDSVRC(A4)0-->VrCLR.B…SDSVSC(A4)0-->Vs BRA.L…OKRSP‹ELSE.S BRA.L…INVRSP‹ENDI‰ENDI&‰IF.B†SDDCMD(A3)#SDDCDISCTHEN.S$‹IF.B†SDDRSP(A2)#SDDRUATHEN.S)MOVE.B„#SDSCRDM,SDSCST(A4)RDM-->STATE BRA.L…OKRSP‹ELSE.S BRA.L…INVRSP‹ENDI‰ENDI#‰IF.B†SDDCMD(A3)#SDDCX IDOR.B!“SDDCMD(A3)#SDDCTESTTHEN.S‹MOVE.B„SDDCMD(A3),D0‹IF.B†D0SDDRSP(A2)THEN.S9MOVE.L„A3,A1…Ifresponse=command,discardxmitbuffer,BSR.L…SOMEDISPOSEMOVE.L„A1,SDSTHD(A4).MOVE.L„A2,A1…PasstheresponsetoapplicationBSR.L…SOMESEND MOVE.L„A1,A2BSR.L…SOMEFREE2BRA.L…SDLCRQ„andselectnextstationtotalkwith‹ELSE.S BRA.L…INVRSP‹ENDI‰ENDI0‰BRA.L…DSPUI…AllothersgotoDSPUIforhandling‰PAGE /* May fall-thru to here from the previous page! ADSPNR„TST.W…SDDBCT(A2)DATAFIELDON"RR""RNR"OR"REJ"COMMAND?(‰BNE.L…INVRSP„*IFYES,INVALIDRESPONSE**ˆTESTFORAVALIDNrCOUNT*DSPNR1ƒCLR.L…D0 ‰CLR.L…D1 ‰CLR.L…D2$‰MOVE.B„SDDRSP(A2),D0FETCHNrCOUNT‰LSR.B…#5,D0…*$‰MOVE.B„SDSVSC(A4),D1FETCHVsCOUNT‰LSR.B…#1,D1…*-‰MOVE.B„SDSUKT(A4),D2FETCH#TxMITTEDFRAMES ‰BEQ.S…DSPNR2„*FRAMESTxMITTED?9‰CMP.L…#0,A3…XMITI_FRMSGONEJUSTAFTERAPURGE?3/21/836‰BEQ.S…DSPNR2„YES,SAMEASIFNOI_FRAMESSENT3/21/833‰BTST.B„#0,SDDCMD(A3)NO,"I"FRAMEONTxMITQUEUE? ‰BNE.S…DSPNR2/‰MOVE.B„SDDCMD(A3),D1YES,GETNsCOUNTFROMIT ‰LSR.B…#1,D1 ‰ADD.B…D2,D1 ‰AND.B…#7,D1DSPNR2ƒWHILE.BƒD0D1DO.S‹SUB.B…#1,D1…NEXTVsCOUNT ‹AND.B…#7,D1#‹SUB.B…#1,D2…ALLVsCOUNTSCHECKED?#‹BMI.L…INVRSP„YES,INVALIDNrCOUNT‰ENDW* Fall-thru to the next page‰PAGE3* NOTE: WE FALL-THRU TO HERE FROM THE PREVIOUS PAGE *"*ˆDISPOSEOFTXMITBUFFERSTONR-1*&‰CLR.L…D1‰FETCHNrCOUNTFROMRESPONSE‰MOVE.B„SDDRSP(A2),D1 ‰LSR.B…#4,D1‰AND.B…#$0E,D1‰MOVE.B„D1,SDSVSC(A4)Vs=Nr&‰MOVE.L„A3,D0…ANYTHINGINTxMITQUEUE? ‰BEQ.L…DSPRC1'DSPNR3A‚CLR.L…D0ˆTXMITTEDAUICOMMAND?‰MOVE.B„SDDCMD(A3),D0‰AND.B…#$EF,D0‰IF.B†D0#SDDCUITHEN.S‹BTST.L„#0,D0…IFIELD? ‹BNE.L…DCRTX8‹TST.B…SDSUKT(A4)YES,UNACKNOWLEDGEDIFRAMESTxMITTED? ‹BEQ.L…DSPRC1‹AND.B…#$0E,D0ƒYES,Nr=Ns? ‹CMP.B…D1,D0‹IF.B†D1D0THEN.S8MOVE.B„SDDRSP(A2),D0Nr=Ns,ISRESPONSERR,RNR,REJ?AND.B…#$03,D0 CMP.B…#1,D0 BNE.S…DSPUI,MOVE.L„A2,A1…YES,DISPOSEOFRECEIVEBUFFERBSR.L…SOMEDISPOSE%MOVE.L„A1,A2…ENDOFRECEIVEBUFFERS? MOVE.L„A1,D0,BNE.L…HSKP9…No,goseewhatthenextoneis>CMP.B…#SDPTXQ,SDPTXF(A5)Yes,didwesendfromthexmtqueue?'BNE.L…DSPRC1„No,gofinishcleaningup6BRA.S…DSPUI…Yes,discardanytransmitted"UI"buffers‹ENDI‰ENDI/‰MOVE.L„A3,A1…Nr<>Ns,DISPOSEOFTxMITBUFFER‰BTST.B„#4,SDDCMD(A3)‰IFˆTHEN.S.‹BSR.L…SOMEDISPOSEYES,DISPOSEOFRCVBUFFERS ‹MOVE.L„A1,A34‹CLR.B…SDSUKT(A4)CLEARUNACKNOWLEDGEDIFRAMECOUNT ‹BRA.L…DSPRC1‰ELSE.S‹BSR.L…SOMEDISPOSE ‹MOVE.L„A1,A3‹SUB.B…#1,SDSUKT(A4)‹BRA.S…DSPNR3A‰ENDI ‰PAGE*"*ˆANINVALIDRESPONSEWASRECEIVED*DINVRSPƒMOVE.B„#$FF,SDSPWR(A4)„LET'SASSUMETHEDEVICEISPOWEREDOFF**ˆDISPOSEOFUITXMITBUFFERS*&DSPUI„MOVE.L„A3,D0…ENDOFTxMITQUEUE?‰BEQ.L…DSPRC1„Yes,out ‰CLR.L…D1ˆNo,‰MOVE.B„SDDCMD(A3),D1‰AND.B…#$EF,D1+‰CMP.B…#SDDCUI,D1DidwesendaUIcommand? ‰BNE.S…DCRTX*‰MOVE.L„A3,A1…YES,DISPOSEOFTXMITBUFFER)‰BTST.B„#4,SDDCMD(A3)Poll/finalbitset?‰IFˆTHEN.S‹BSR.L…SOMEDISPOSENo ‹MOVE.L„A1,A3 ‹BRA.S…DSPUI‰ENDI7‰BSR.L…SOMEDISPOSEYes,alsodisposeofreceivebuffers ‰MOVE.L„A1,A3 ‰BRA.S…DSPRC1 ‰PAGE**ˆDECREMENTTxMITRETRYCOUNTS*DCRTX„MOVE.L„A3,A1…*‰MOVE.B„SDSUKT(A4),D1**DCRTX2ƒCMP.L…#0,A3…ALLTxMITBUFFERSGONE? ‰BEQ.S…DCRTX5"‰BTST.B„#0,SDDCMD(A3)NO,IFIELD?‰IFˆTHEN.S*‹TST.B…D1ˆYES,UNACKNOWLEDGEDCOUNTCLEAR? ‹BEQ.S…DCRTX5‹SUB.B…#1,D1…YES,DECREMENTIT‰ENDI7‰TST.B…SDDRTC(A3)NO,DECREMENTRETRYCOUNTIFNON-ZERO ‰BEQ.S…DCRTX4*‰SUB.B…#1,SDDRTC(A3)DECREMENTRETRYCOUNT‰BNE.S…DCRTX4„EXPIRED??‰MOVE.L„A3,A1…YES,SENDTHISTxMITBUFFERTOAPPLPGMASUNSENT>‰MOVE.B„#SDDSSTE,SDDSTS+1(A3)‚SETRETRYCOUNTEREXPIREDSTATUS$‰BTST.B„#$4,SDDCMD(A3)‚POLLBITSET?‰IFˆTHEN.S&‹BSR.L…SOMESENDYES,LASTTXMITBUFFER4‹CLR.B…SDSUKT(A4)CLEARUNACKNOWLEDGEDIFRAMECOUNT  ‹BRA.S…DCRTX5‰ENDI"‰BTST.B„#0,SDDCMD(A3)NO,IFIELD?‰IFˆTHEN.S2‹SUB.B…#1,SDSUKT(A4)YES,FIXUNACKNOWLEDGEDCOUNT‰ENDI‰BSR.L…SOMESEND%‰MOVE.L„A1,A3FETCHNEXTTxMITBUFFER ‰BRA.S…DCRTX2 )DCRTX4ƒCLR.B…SDDERR(A3)CLEARERRORFIELD$‰BTST.B„#$4,SDDCMD(A3)POLLBITSET? ‰BNE.S…DCRTX5-‰MOVE.L„SDDLNK(A3),A3FETCHNEXTTxMITBUFFER ‰BRA.S…DCRTX2 +DCRTX5ƒMOVE.L„A1,A3ƒNEWHEADOFTxMITQUEUE*ˆBRA.S…DSPRC1„FALL-THRU ‰PAGE:* WARNING: WE MAY FALL-THRU TO HERE FROM THE PREVIOUS PAGE**ˆDISPOSEOFRCVBUFFERS*3DSPRC1ƒMOVE.L„A3,SDSTHD(A4)NEWHEADOFTxMITQUEUE.‰MOVE.L„A2,D0…ALLRECEIVEBUFFERSDISPOSEDOF?‰BEQ.L…SDLCRQ„*‰MOVE.B„SDDERR(A2),D0‰IFˆTHEN.S4‹IF.B†D0#SDDENNRAND.BD0#SDDEIFUTHEN.S?MOVE.B„#$FF,SDSPWR(A4)Baderror,assumestationisturnedoff‹ENDI)‹TST.B…SDDSTS+1(A2)REPORTERRORTOUSER?‹BNE.S…DSPRC3„Yes,gotellhim+‹BRA.S…DSPRC5„NO,JUSTFREETHERCVBUFFERS‰ENDIC‰MOVE.B„SDDRSP(A2),D0ISRESPONSEFRMR,RD,DM,RIM,UIORIFIELD?‰AND.B…#$EF,D0ƒ*‰CMP.B…#SDDCUI,D0*‰BEQ.S…DSPRC3„*‰CMP.B…#SDDRRD,SDDRSP(A2)*‰BEQ.S…DSPRC3„*‰CMP.B…#SDDRDM,SDDRSP(A2)*‰BEQ.S…DSPRC3„*‰CMP.B…#SDDRRIM,SDDRSP(A2) ‰BEQ.S…DSPRC3‰CMP.B…#SDDRFRMR,SDDRSP(A2) ‰BEQ.S…DSPRC3 ‰BTST.L„#0,D0 ‰BNE.S…DSPRC5CDSPRC3ƒMOVE.L„A2,A1…YES,SENDRECEIVEBUFFERTOAPPLICATIONPROGRAM$‰BTST.B„#4,SDDRSP(A2)‚Finalbitset?‰IFˆTHEN.S‹BSR.L…SOMESEND‚NO ‹MOVE.L„A1,A2 ‹BRA.S…DSPRC1‰ENDI3‰BSR.L…SOMESEND‚YES,ALSOFREEALLRCVBUFFERSLEFT ‰MOVE.L„A1,A2*DSPRC5ƒBSR.L…SOMEFREE‚FREEALLRCVBUFFERS0‰BRA.S…SDLCRQ„SELECTNEXTSDLCSECONDARYSTATION ‰PAGE*(*ˆTHERESPONSEWASVALIDFORTHECOMMAND**OKRSP„MOVE.L„A3,A1…DISPOSEOFTXMITBUFFER‰BSR.L…SOMEDISPOSE*‰MOVE.L„A1,SDSTHD(A4)*‰BSR.L…SOMEFREE*=*ˆBRA.S…SDLCRQ„Fallthruandselectnextstationtotalkwith ‰PAGE8* Warning: May fall-thru to here from the previous page!*#*ˆSETTHESTATION'SPOLLDELAYTIME*%SDLCRQƒIF.B†SDSPWR(A4)#0THEN.S‹IF.L‡SDSTHD(A4)#0THEN.S#0THEN.S?MOVE.W„SDSTPF(A4),SDSCTD(A4)Down,notfc,usePowerOffDelay‹ELSE.S:MOVE.W„SDSTRT(A4),SDSCTD(A4)Down,tfc,useRe-XmitDelay‹ENDI‰ENDI+‰MOVE.L„A4,A0…SELECTNEXTSECONDARYSTATION‰BRA.L…SDLCSN1 .**********************************************/* END OF FILE 'FIX:48.SDLCPRI.FRMCNT.AI' *.**********************************************éé‰PAGE6******************************************************6* BEGINNING OF FILE 'FIX:48.SDLCPRI.INT7201.AI' *6****************************************************** INTRSRG‚MACROD‰MOVEM.Lƒ(A7)+,A1-A2/D0RestoreRegistersUsedbyInterruptHandlers‰ENDM INTSVRG‚MACROA‰MOVEM.LƒA1-A2/D0,-(A7)SaveRegistersUsedbyInterruptHandlers‰ENDM H*************************************************************************Æ*9*ˆSUBROUTINE:‚"SBSDLCFL"‚FLUSH(PURGE)ATRANSMITQUEUE‡**ˆTRAP:ˆ"SDLCFL"©*.*ˆENTER:‚D1.B=SDLCSTATIONNUMBERTOFLUSH“**ˆRETURN:CCR³**‘ZsetBUFFERSWEREFLUSHED›*%*‘NsetILLEGALSDLCSTATIONNUMBER”*#*ˆREGISTERSUSED:ƒ01234567**˜DƒP©* *˜AUU‹S**œ|‹|_stack–**œ|_____________use d—**Æ*H************************************************************************ SBSDLCFL RTS2RTE5SDLCFLƒBSR.L…FINDSCBƒFindtheSecondaryControlBlock‰IFˆTHEN.L?‹ANDI.B„#$F7,1(A7)ReturnNegativeClear(Legalstationnumber)0‹ORI.B…#$04,1(A7)AndZeroSet(BuffersFlushed)+‹ORI.W…#$700,SRSCBFound,MASKINTERRUPTS!(‹ADD.W…#1,SDSHCFLS(A1)Counttheflushes/‹MOVE.L„SDSTHD(A1),A0Findhistransmitbuffers)‹MOVE.L„A2,-(A7)ProtectA2whiletracing‹BSR.L…GETRACEGetatracerow‹IFˆTHEN.SE**********************************************************************TraceEntryFormat°*E**********************************************************************Ã*#*‚+0Ž+4Ž+8‚+9‚+10…+12+13+14+15‚*E* +---------------+---------------+---+---+-------+---+---+---+---+ *6*!†PC‡!A(1stBuffer)!#!S!ƒ0ƒ!C!R!D0!D1!*E* +---------------+---------------+---+---+-------+---+---+---+---+ **Ã**PC=ProgramCounter,­*A*A(1stBuffer)=Addressofthefirstbufferbeingflushed,or…*1*‘Zerowhennobuffer(s)is(are)beingflushed,…**#=Station'sNumber,­* *S=Station'sCurrentState,¦**0=Unused,·*7*C=WhenA(1stBuffer)<>0,Buffer'sCommandByte,*e7n8v ~0†1Ž8*R=WhenA(1stBuffer)<>0,Buffer'sResponseByte,Ž*9*D0=WhenA(1stBuffer)<>0,Buffer's1stDataByte,*9*D1=WhenA(1stBuffer)<>0,Buffer's2ndDataByte.**Ã*E*********************************************************************PEA‡*(PC)Ifwegetone,then)MOVE.L„(A7)+,0(A2)traceourPCaddress,MOVE.L„A0,4(A2)A(1stBuffer),)MOVE.B„SDSSEC(A1),8(A2)Stationaddress,9MOVE.B„SDSCST(A1),9(A2)Hiscurrentstate(asinIOWA?),&CLR.W…10(A2)(Zerofillunusedbytes)IF.L†#0A0THEN.S/MOVE.B„SDDCMD(A0),12(A2)1stBuffer'sCommand,#MOVE.B„SDDRSP(A0),13(A2)Response,#MOVE.B„SDDDAT+0(A0),14(A2)andtwo.MOVE.B„SDDDAT+1(A0),15(A2)......databytesELSE.S-CLR.L…12(A2)Butifnobuffers,storezeroesENDI‹ENDI)‹MOVE.L„(A7)+,A2RecoverA2aftertracing‹IF.L†#0A0THEN.S-CLR.L…SDSTHD(A1)Makeallbuffersdisappear,.BSR.L…SBPTFRML‚(returnthemtothefreepool)‹ENDI'‹MOVE.L„A1,A0…A0=A(SCBbeingflushed)‹MOVE.L„SDLCPCB,A1A1=A(PCB)?‹IF.B†#SDPBTXSDPBSY(A1)AND.LA0SDPRRTA4(A1)THEN.S$IF.B†#SDPTXQSDPTXF(A1)THEN.S;MOVE.B„#NCW0SAB,NECCTL_BXmt'goneoftheflushedbuffers,'MOVE.B„#NCW0RG1,NECCTL_BAbortit,and6MOVE.B„#NCW1IRD+NCW1STV,NECCTL_Bturnoffeverything!MOVEM.LƒA0-A6/D0-D2,-(A7)MOVE.L„SDLCPCB,A64MOVEM.LƒSDPRRTA0(A6),A0-A6Restoredriver'scontextADD.W…#1,SDSHCTOF(A4)MOVE.L„SDPRCV(A5),A2,BSR.L…SOMEFREE†ReleaseRcvBfrtofreepoolLEA‡0,A2ŠNoRcv"MOVE.L„A2,A3‰......orXmtBuffer0MOVE.B„#$FF,SDSPWR(A4)andmarkstationasDOWN$BRA.L…SDLCRQˆNowgoresetitstimerENDI‹ENDI‰ELSE.S?‹ANDI.B„#$FB,1(A7)ReturnZeroClear(Bufferswerenotflushed);‹ORI.B…#$08,1(A7)AndNegativeSet(Illegalstationnumber)‰ENDI‰RTE‘(UN-MASKSINTERRUPTS) ‰PAGE!* OVERVIEW OF INTERRUPT VECTORING -* SIGNIFICANT CONTROL BLOCK AND AREA SETTINGS M* 1) The low-memory (0..3FF) interrupt vector which the NEC7201 uses contains)*„theaddressoftheINT7201routine,andO* 2) The SDLC Primary Control Block (PCB) contains eight vectors, four for eachI*„sideoftheNEC7201.‚B-sidevectors(0..3)inthePCBaremaintainedbyI*„theSDLCdriver.‚A-sidevectors(4..7)areallthesamehowever,eitherE*„pointingtoINT7201AortoPORTAIO.‚INT7201AisusedwhennoA-sideB*„driverexists,PORTAIOisusedwhenanA-sidedriverispresent. * NEC7201 INTERRUPT VECTOR NOTES J* When no interrupt is pending in the NEC7201, the  interrupt vector numberM*register(2B)"rests"atvector7.‚Notethatvector7isforA-sideSpecialM*ReceiveConditionInterrupts.‚Thedifferencebetweena"resting"and"real"L* interrupt vector in register 2B is indicated in the A-side register 0, bitJ*number1:‚Wherethisbitisset(1),aninterruptispending.‚WherethisO* bit is clear (0), no interrupt was pending, and the interrupt vector "rests".H* (Note that register 2B must be read before the pending bit is tested.) * INTERRUPT PROCESSING SEQUENCE L* When something interrupts using the low-memory interrupt vector designatedL*astheNEC7201svector,theMPUvectorstotheINT7201routine.‚There,theO* 7201's internal interrupt vector number is read from register 2B, and controlM* is passed via the corresponding vector in the SDLC PCB (note that vector #7@* will be used when the 7201 does not have a pending interrupt).O* Where a B-side interrupt was present (vector 0..3), we go to an SDLC routine.K* Where an A-side vector (4..7) was presented, we go to INT7201 or PORTAIO.J* For A-side interrupts, if no A-side driver has overwritten vectors 4..7,G* we go to INT7201A and acknowledge the interrupt, making it "go away".L* If an A-side driver exists, we go to PORTAIO which checks the pending flagL* in the 7201's A-side register 0, and thereby determines whether or not the* 7201 has a pending interrupt.N* Where a pending interrupt exists (must be an A-side interrupt), PORTAIO usesM* two SDLC PCB pointers to store the interrupt vector number as read from theN* 7201 (PORTAIO will right justify the vector in some cases), and then to jumpL*tosomeotheraddress.‚(TheA-sidedriverhasstoredthesetwoaddresses.)O* Where no pending interrupt exists (i.e., the interrupt vector number read wasO* 4..7 [should have been #7, by the way], and the interrupt pending flag in theN* 7201's register 0 on the A-side was clear), the PORTAIO routine "assumes" anO* External Status change interrupt for the B-side (SDLC), and forces processing?* to the current SDLC External Status interrupt handling state.L*This"assumed"ExternalStatusinterruptisquestionable.‚Aswedon'tknowM* who interrupted (it is not the NEC7201), it is unclear what to do about it.‰PAGEH*************************************************************************Æ*9*ˆI.S.R.:‚"INT7201"‚NEC7201InterruptServiceRoutine‡**Æ*#*REGISTERSUSED:ƒ01234567¤**‘D´**‘AS¤* *¡|__stackœ**Æ*<*ˆVectorsthroughPrimaryControlBlock'sIndirectVectors†*6*ˆOffsetbyNEC7201'sStatusAffectsVectorRegisterŒ**Æ*3*ˆSavesRegistersD0.L,A1.L,&A2.LontheStack*+*˜A1.L=AddressofPrimaryControlBlock‡**Æ*H************************************************************************ "INT7201‚INTSVRG—SAVEREGSONSTACK,‰CLR.W…D0’ReadtheNEC7201'sVectorRegister‰MOVE.B„#NCW0RG2,NECCTL_B‰MOVE.B„NECCTL_B,D01‰MOVE.L„SDLCPCB,A1Š(A1=A(PrimaryControlBlock)0*ˆBTST†#0,TRACFLAG+1‡Shouldinterruptbetraced?*ˆIFˆTHEN.S!*ŠBSR‡DLTRACETracetheinterrupt*ˆENDIB‰MOVE.L„SDPVCT(A1,D0.W),A2‚FindoutWhereToGoforthisInterrupt‰JMP‡(A2)AndGoThere! ‰PAGE I**************************************************************************Ç*'*ˆINT7201A-A-SideInterruptHandlerœ**Ç*H*AnA-SideInterrupthasoccurred,orsomethingotherthananNEC7201‚*I* interrupt has brought us here (in which case the NEC7201 has given us *F*vector#7).‚Eitherway,wedon'twantthenastylittlesucker.‚So,‚*H*iftheNEC7201reallydidcausetheinterrupt,weacknowledgeitand‚*H*therebymaketheinterruptgoaway.‚Otherwise,wesimplyexitinthe*G*hopethatwhateverbroughtusherewon'tdoitagain(aswehavenoƒ*F*ideawhatweshoulddoaboutitsincewedon'tknowwhat"it"is)!„**Ç*I************************************************************************* @INT7201ABTST.B„#1,NECCTL_A‰Isaninterruptpendinginthe 7201?1‰IFˆTHEN.S‰Yes,seewhatflavorofinterrupt9‹IF.W†D0#16THEN.SOnTransmitterEmptyInterrupts,;MOVE.B„#NCW0RTI,NECCTL_AƒResetTransmitterEmptyInterrupt‹ELSE.S7IF.W†D0#20THEN.SOnExternalStatusInterrupts,9MOVE.B„#NCW0REX,NECCTL_AƒResetExternalStatusInterruptELSE.S8IF.W†D0#24THEN.SOnReceiveCharacterInterrupts/‘TST.B…NECDAT_AŒReadtheChar(ClearstheIntr)ELSE.S5*Otherwise,onSpecialReceiveConditionInterrupts,7‘MOVE.B„#NCW0ERR,NECCTL_AƒResetError(ClearstheIntr)ENDIENDI‹ENDI?‹MOVE.B„#NCW0EOI,NECCTL_AƒWhatever,maketheinterruptgoaway!‰ENDI4*ˆBRA.S…INTEXITAndgoexitfromhandlinginterrupts)* Fall-thru to the Interrupt Exit Routine APWR†EQU‡INT7201A‚OnPowerUp,ResetAnyPendingA-SideInterrupts ‰PAGE H*************************************************************************Æ*.*ˆ"INTEXIT"-NEC7201InterruptExitRoutine”**Æ*:*ˆNOTE:Allinterrupthandlingproceduresmustcomehereˆ**ˆuponcompletion.®**Æ*:*ˆChecksfor"another"pendinginterruptintheNEC7201.ˆ*:*ˆIfpresent,wevectorthruthePrimaryControlBlock'sˆ*?*ˆIndirectVectorasindicatedbythe7201'sVectorRegister.ƒ*>*ˆIfno"other"interruptispending,registersarerestored„*?*ˆfromthestack,andanRTEisexecutedtherebyreturningtoƒ**ˆtheinterruptedprocess.¦**Æ*;*ˆAssumesRegistersD0.L,A1.L,&A2.LstillontheStack‡**Æ*H************************************************************************ ?* Warning: We may "fall-thru" to here from the preceeding page. INTEXIT‚CLR.W…D0‰MOVE.B„#NCW0RG2,NECCTL_B9‰MOVE.B„NECCTL_B,D0‰Readthe7201'sVectorRegister,then9‰BTST.B„#1,NECCTL_A‰IfInterruptPendingFlagIsNowSet,4‰IFˆTHEN.S‰Then"another"InterruptisPresent.8‹MOVE.L„SDLCPCB,A1ŠSo,SetA1=A(PrimaryControlBlock)0*ŠBTST†#0,TRACFLAG+1‡Shouldinterruptbetraced?*ŠIFˆTHEN.S!*ŒBSR‡DLTRACETracetheinterrupt*ŠENDI:‹MOVE.L„SDPVCT(A1,D0.W),A2‚Regardless,Fetch"WhereToGo")‹JMP‡(A2)AndGoHandlethenewInterrupt-‰ENDIšButifno"other"Interruptispresent,#‰INTRSRG—ThenRestoretheRegisters'‰RTE›AndResumetheInterruptedProcess 0************************************************0* END OF FILE 'FIX:48.SDLCPRI.INT7201.AI' *0************************************************éééé4****************************************************4* BEGINNING OF FILE 'FIX:48.SDLCPRI.POLLQ.AI' *4**************************************************** SDLRSRG‚MACRO2‰MOVEM.Lƒ(A7)+,A0-A6/D0-D2RESTORESAVEDREGISTERS‰ENDM SDLSVRG‚MACRO‰MOVEM.LƒA0-A6/D0-D2,-(A7)*‰ENDM ‰SECTIONƒ9‰PAGEH*************************************************************************Æ*D*SUBROUTINE:‚"PWRUP"INITIALIZETHENEC7201CHIPATPOWERUPTIME„**Æ*+*ENTER:‚A4.L=ADDRESSOFSDLC'S SEGMENT**Æ*#*REGISTERSUSED:ƒ01234567¤* *‘DUU°**‘AUUUƒP…S¤* *¡|__stackœ**Æ*H************************************************************************ ‰NEXTWB,PWRUP„MOVE.B„#NCW0RCN,NECCTL_BƒCHANNELRESET‰MOVE.B„#NCW0RG2,NECCTL_A)‰MOVE.B„#NCW2RTS+NCW2PRI+NCW2BIN,NECCTL_A*‰MOVE.B„#NCW0RG2,NECCTL_BƒINTERRUPTVECTOR‰MOVE.B„#0,NECCTL_B‰MOVE.B„#NCW0RG4,NECCTL_BƒMODE)‰MOVE.B„#NCW4C01+NCW4SDL+NCW4SME,NECCTL_B#‰MOVE.B„#NCW0RG7,NECCTL_BƒSDLCFLAG‰MOVE.B„#SDLCFLAG,NECCTL_B3‰MOVE.B„#NCW0RG3,NECCTL_BƒENABLEAUTOENABLEOFCTS!‰MOVE.B„#NCW3BT8+NCW3AUE,NECCTL_B‰IFEQ†RES7201-400‹MOVE.W„SR,-(A7)!‹ORI.W…#$0700,SRŠMaskInterrupts!5‹MOVE.L„#MVME400,A0ˆA0=AddressoftheMVME400board'‹BCLR.B„#REGSELEC,CTLPIA_A(A0)SetDDRAA‹MOVE.B„#WRT_LED+WRT_SEL,DATPIA_A(A0)tooutputmid-twobitsonly:‹BSET.B„#REGSELEC,CTLPIA_A(A0)SwitchnowtoDataRegonA=‹BSET.B„#WRT_SEL,DATPIA_A(A0)SelectbaudratejumpersPort2(‹MOVE.B„DATPIA_A(A0),D0andreadthemin6‹ANDI.W„#$07,D0‹AND'ingoffallbutthebaudratebitsB‹MOVE.B„V400BAUD(PC,D0.W),D0andgetthe4-bitcorrespondingvalue3‹MOVE.B„D0,-(A7)Šsavingitonthestacktemporarily,‹BCLR.B„#REGSELEC,CTLPIA_B(A0)Now,setDDRB2‹MOVE.B„#%11111111,DATPIA_B(A0)toallbitsoutput:‹BSET.B„#REGSELEC,CTLPIA_B(A0)SwitchnowtoDataRegonB;‹MOVE.B„DATPIA_B(A0),D0andreadthecurrent4-bitsettings.‹ANDI.B„#RATE1MSK,D0dropoutPort2'ssetting;‹OR.B†(A7)+,D0andORinthenewvaluewefiguredoutabove–8ŸK§I¯0·;¿-B‹MOVE.B„D0,DATPIA_B(A0)andoutputthenewrate(Port1unchanged)#‹MOVE.W„(A7)+,SRŠUnmaskInterrupts!‰ENDC,‰LEA‡SDLCPR(PC),A0†FETCHADDRESSOF"SDLCPR"‰MOVE.L„#TIMCNST,A1'‰MOVE.W„#$4005,D1INTERRUPTLEVEL->D1‰MOVE.L„#DLC1,D2ŒI.D.#->D2‰IFEQ†CHIPTYPE-68000 ‹TR0.RQPA‰ENDC‰IFNE†CHIPTYPE-68000 ‹TR0$.RQPA‰ENDC3‰RTS‘RETURN(MUSTBEA2BYTEINSTRUCTION!)‚2/24/831‰ILLEGALDIEIFSBRQPARETURNSANYERROR!ˆ2/24/83 ‰IFEQ†RES7201-400"V400BAUDƒDC.B†15,14,13,12,10,7,5,2‰ENDC *3*„ThisisadummyroutinetosatisfyXREFinBUFMGT*‰XDEF†SDLCQXMT SDLCQXMT RTS‰PAGEH*************************************************************************Æ*9*ˆTRAP:‚"SDLCRCST"THISROUTINEISA"DUMMY"TOPROVIDEˆ*'*šCOMPATABILITYFORBUFFERMANAGEMENT‰**ˆSUBROUTINE:‚"SBSDLCRCST"¥**Æ*#*REGISTERSUSED:ƒ01234567¤**‘D´**‘AS¤* *¡|__stackœ**Æ*H************************************************************************ =SDLCRCSTBSR.S…SBSDLCRCSTTRAPENTRYPOINT,DOTHESUBROUTINE+‰MOVE.W„SR,0(A7)‚REPLACETHECONDITIONCODE"‰RTE‘SOWEGIVEPROPERRETURNCODE +SBSDLCRCSTILLEGAL‹Die,shouldnotbeused!‰PAGEH*************************************************************************Æ*0*ˆTRAP:‚"USRACK"ƒTRAPSERVICEROUTINEFORSDLC**ˆSUBROUTINE:‚"SBUSRACK"§**Æ*#*REGISTERSUSED:ƒ01234567¤**‘D´**‘AS¤* *¡|__stackœ**Æ*H************************************************************************ 9USRACKƒBSR.S…SBUSRACK‚TRAPENTRYPOINT,DOTHESUBROUTINE+‰MOVE.W„SR,0(A7)‚REPLACETHECONDITIONCODE"‰RTE‘SOWEGIVEPROPERRETURNCODE )SBUSRACKILLEGALDie,shouldnotbeused!‰PAGEH*************************************************************************Æ*0*ˆTRAP:‚"SDLCKL"ƒTRAPSERVICEROUTINEFORSDLC*&*šTHISROUTINEEFFECTIVELYKILLSTHEŠ*.*šSDLCLINKANDCANCELSPERIODICACTIVATIONS‚**ˆSUBROUTINE:‚"SBSDLCKL"§**Æ*#*REGISTERSUSED:ƒ01234567¤* *‘DƒUU®**‘AS¤* *¡|__stackœ**Æ*H************************************************************************ 9SDLCKLƒBSR.S…SBSDLCKL‚TRAPENTRYPOINT,DOTHESUBROUTINE+‰MOVE.W„SR,0(A7)‚REPLACETHECONDITIONCODE&‰RTE‘SOWEGIVETHEPROPERRETURNCODE @SBSDLCKLMOVE.B„#NCW0RCN,N ECCTL_BCHANNELRESETTHENEC7201CHIP2‰MOVE.W„#$8005,D1DISCONTINUEPERIODICACTIVATIONS‰MOVE.L„#DLC1,D2‚*‰IFEQ†CHIPTYPE-68000 ‹TR0.RQPA‰ENDC‰IFNE†CHIPTYPE-68000 ‹TR0$.RQPA‰ENDC.‰RTS‘OK,RETURN(MUSTBEA2BYTEINSTRUCTION)1‰ILLEGALDIEIFSBRQPARETURNSANYERROR!ˆ2/24/83‰PAGEH*************************************************************************Æ*0*ˆTRAP:‚"SDLCQU"‚TRAPSERVICEROUTINEFORSDLC*+*™THISROUTINECHECKSTRANSMITQUEUESFOR†*0*™DATATOTRANSMITBETWEENPERIODICACTIVATIONS**ˆSUBROUTINE:‚"SDLCQUSB"§**Æ**Æ*#*REGISTERSUSED:ƒ01234567¤**‘D´**‘AS¤* *¡|__stackœ**Æ*H************************************************************************ SDLCQUSB RTS2RTESDLCQUƒSDLSVRG‰MOVE.L„SDLCPCB,A5‰ADD.W…#1,SDPHCQUS(A5) ‰MOVE.W„SR,D0%‰AND.W…#$0700,D0‹ATLEASTATLEVEL5?‰IF.W†D0#$0500THEN.S ‹MOVE.W„SR,D0‹AND.W…#$F8FF,D0‹No,-‹OR.W†#$0500,D0‹assertwearenowatlevel5!.‹MOVE.W„D0,SR(oldSRandintrlevelonstack)‰ENDI‰BRA.S…SDLCPR3‰PAGEH*************************************************************************Æ*4*ˆTRAP:‚"SDLCTTMOUT"‚TRAPSERVICEROUTINEFORSDLCŒ*,*THISROUTINEISENTEREDWHENTHERECEIVE**TIMEOUTEXPIRESš**ˆSUBROUTINE:‚"SDLCTMOUT"¦**Æ**Æ*#*REGISTERSUSED:ƒ01234567¤**‘D´**‘AS¤* *¡|__stackœ**Æ*H************************************************************************ SDLCTMOUT‚RTS2RTE%SDLCTTMOUTSDLSVRGSAVEALLUSERREGS+‰MOVE.L„SDLCPCB,A6RESTOREREGSFROMP.C.B.‰MOVEM.LƒSDPRRTA0(A6),A0-A6‰ADD.W…#1,SDSHCRTO(A4)…3/2/83‰BRA.L…RECEITOƒRECEIVETIMEOUT ‰PAGE H*************************************************************************Æ*>*ˆTRAP:‚"SDLCPR"‚TRAPROUTINEWHICHISENTEREDWHENPERIODIC‚**™TIMERRUNSDOWNž**ˆSUBROUTINE:‚"SDLCPRSB"§**Æ*0*ˆENTER:‚D0.L=#INTERVALSWHICHHAVEELAPSED‘**D1.L=ACTIVATIONI.D. **Æ*C*WARNING:‚THISSECTIONOFCODERUNSATINTERRUPTLEVELFIVE(5).…*C*HOWEVER,WHENWEENTERHEREAFTERCOMPLETINGATRANSACTIONWITH†*F*ASECONDARYSTATION,WEAREAT"FUNNYLEVEL5"-I.E.,WESUFFEREDƒ*E*ALEVELSIX(6)INTERRUPT,HANDLEDIT,ANDTHENLOWEREDTHELEVEL„*E*TOFIVE.‚ASARESULT,WEMAYHAVEINTERRUPTEDOURSELVES.‚FORTHIS‚*G*REASON,THEVARIABLE"SDPBSY"ISUSEDTOALLOWACCESSTOTHE"START‚*D*NEWWORK"PORTIONSOFTHISIMPLEMENTATION.‚WHENTHISVARIABLEIS„*E*SETTO"NOTBUSY",THENANDONLYTHENCANWELOOKFORNEWWORKTO„*G*BEINITIATED.‚WHENWEARENOT"NOTBUSY"(I.E.,WEAREBUSYSENDING*E*ORRECEIVING,ORWHATEVER)WECANONLYDECREMENTTHETIMERVALUES„*F*INTHESECONDARYCONTROLBLOCKS,ANDNOMORE.‚LASTLY,BECAUSEEVEN‚*D*THISCOULDBE"INTERRUPTED"BYOURSELVES,WEMUSTHANDLEATIMER…*G*VALUEWHICHGOESTOLESSTHANZERO(I.E.,WECOMMITTEDTODECREMENT‚*H* A TIMER, WERE INTERRUPTED AND ZEROED THAT COUNTER, AND THEN RETURNED *2*TOSUBTRACTONE,LEAVINGTHATCOUNTNEGATIVE).—**Æ**EDSKINNER,MARCH2,1983¬**Æ*H************************************************************************ SDLCPRSB RTS2RTESDLCPRƒSDLSVRG‰MOVE.L„#0,A1…SETUPREGISTERS‰MOVE.L„SDLCPCB,A5*‰MOVE.L„SDPFSEC(A5),A0†**<*ˆDECREMENTTHECURRENTTIMEDELAYOFALLSECONDARYSTATIONS$*‰ANDSELECTTHE1STONETHAT'SZERO* ‰WHILE.BƒSDSSEC(A0)#0DO.S‹IF.W†SDSCTD(A0)#0THEN.S2SUB.W…D0,SDSCTD(A0)Timer:=Timer-Elapsed_Time‹ENDI<‹ADD.L…#SDSLNG,A0ThuslyupdateALLSecondaryControlBlocks‰ENDW* Fall-thru to the next page‰PAGE:* NOTE: MAY BE FALLING-THRU TO HERE FROM THE PREVIOUS PAGE F* NOTE: ENTER HERE FROM SDLCQUSB - SOMEONE HAS ENQUEUED AN XMIT BUFFER FSDLCPR3‚MOVE.L„SDPFSEC(A5),A0AreweNOT"NOTBUSY"(ie,arewebusy?)$‰IF.B†SDPBSY(A5)#SDPBNBTHEN.S‹SDLRSRGYes,exit‹RTE‰ENDI‰PAGE*1*ˆSELECTTHE1STSCBWHOSETIMEDELAYISNOWZERO*?SDLCSLƒWHILE.BƒSDSSEC(A0)#0AND.WSD SCTD(A0)#0DO.S,SDLCSN1„ADD.L…#SDSLNG,A0AdvancetonextSCB‰ENDW‰IF.B†SDSSEC(A0)#0THEN.S<‹MOVE.B„#SDPBNB,SDPBSY(A5)Endoflist,setSDLCtoNOTBUSY‹SDLRSRGAndexit‹RTE‰ENDI‰MOVE.L„A0,A4…A4=A(SCB)(‰MOVE.B„#SDPBFC,SDPBSY(A5)setSDLCBUSY* Fall-Thru to next page‰PAGE7* WARNING: MAY FALL-THRU TO HERE FROM THE PREVIOUS PAGE*0* A4 = CURRENT SECONDARY'S CONTROL BLOCK ADDRESS.* A5 = CURRENT PRIMARY'S CONTROL BLOCK ADDRESS*.*ˆASECONDARYCONTROLBLOCKHASBEENSELECTED,*ˆDeterminewhattosend.*3‰CMP.B…#SDSCBSY,SDSCST(A4)SECONDARYINBUSYSTATE?‰BEQ.S…SDLCPR5ƒ*)‰TST.L…SDSTHD(A4)NO,SOMETHINGTOTXMIT?‰BNE.S…SDLCPR6ƒ*=SDLCPR5‚BSR.L…SBGTFRIR‚NO,FETCHARCVBUFFER&TXMITAN"RR"-‰BEQ.S…SDLCPR5B‚GOTONEANDIT'SNOTTHELAST‰IFˆTHEN.S6‹MOVE.B„#SDPBNB,SDPBSY(A5)Didn'tgetone,goNOTBUSY‹SDLRSRGAndexit‹RTE‰ENDI!* GOT ONE, BUT IT'S THE VERY LASTASDLCPR5AMOVE.B„#SDDRRNR+$10,SDDCMD(A3)YES,SETAN"RNR"COMMAND‰BRA.S…SDLCPR5C #*ˆA3=BUFFERCONTROLBLOCKADDRESS;SDLCPR5BMOVE.B„#SDDRRR+$10,SDDCMD(A3)SENDAN"RR"COMMAND?SDLCPR5CMOVE.L„A3,SDPRCV(A5)‚*(TxMITFROMTHERECEIVEBUFFER)‰MOVE.B„#SDPTRQ,SDPTXF(A5)***‰MOVE.W„SDPRLG(A5),SDDBCT(A3)*BYTECOUNT‰CLR.W…SDDSTS(A3)*STATUS‰CLR.B…SDDERR(A3)*SDLCERROR$‰CLR.B…SDDRTC(A3)*SDLCRETRYCOUNT.‰MOVE.B„SDSSEC(A4),SDDSEC(A3)*STATIONNUMBER‰BRA.L…TRANSMTƒ**‰PAGEH* NOTE: ED SKINNER, 2/24/83 - WHEN WE HAVE A "SNRM" TO SEND, WE ACTUALLYI*PERFORMTHEFOLLOWING:‚1)TRANSMITA"RNR"COMMANDANDRECEIVEA"GOOD"H*RESPONSE.‚THISISDONESOTHEREMOTESTATIONWILLKNOWHOWMANYOFHISH* INFORMATION FRAMES THAT WE HAVE RECEIVED, THEREBY AVOIDING DUPLICATIONH*OFFRAMES.‚WEMUSTGETA"GOOD"RESPONSETOTHERNRBEFORESENDINGTHEH* SNRM SO THAT WE KNOW HE GOT THE RNR OK, AND THEREFORE NOW KNOWS OUR NrI*VALUE.‚(BYA"GOOD"RESPONSE,IMEANARECEIVEDREPLYOFANYKINDWHICHJ* WAS RECEIVED WITHOUT ANY ERRORS - DOES AN Ns ERROR COUNT? I DON'T KNOW!)D* ONCE WE'VE RECEIVED A "GOOD" REPLY, WE CAN THEN TRANSMIT THE SNRM. 6SDLCPR6‚MOVE.L„SDSTHD(A4),A3WEHAVESOMETHINGTOTXMT3‰CMP.B…#SDDCSNRM,SDDCMD(A3)"SNRM"COMMAND?Ž9/14/82&‰BNE.S…SDLCPR6C‚*BRANCHIFNOš9/14/829‰CMP.B…#SDSTRN,SDSTXF(A4)YES,TXMITTEDAN"RNR"?ˆ2/23/83'‰BEQ.S…SDLCPR6C‚*BRANCHIFYES™9/14/82?‰BSR.L…SBGTFRIR‚NO,FETCHARCVBUFFER&TXMITAN"RNR"9/14/825‰BEQ.S…SDLCPR5A‚GOTONEANDIT'SNOTTHELAST‹9/14/82‰IFˆTHEN.S6‹MOVE.B„#SDPBNB,SDPBSY(A5)Didn'tgetone,goNOTBUSY‹SDLRSRGAndexit‹RTE‰ENDI"* WE JUST GOT THE VERY LAST BUFFER)‰BRA.S…SDLCPR5A‚TRANSMITAN"RNR"—9/14/82 "SDLCPR6CMOVE.B„#SDPTXQ,SDPTXF(A5)‰MOVE.L„A3,-(A7),‰BSR.L…SBGTFRIR‚Getabuffertoreceiveinto‰IFˆTHEN.S:‹MOVE.W„SDPRLG(A5),SDDBCT(A3)Ok,Prepareitforlateruse‹CLR.W…SDDSTS(A3)STATUS‹CLR.B…SDDERR(A3)SDLCERROR‹MOVE.L„A3,SDPRCV(A5)‹MOVE.L„(A7)+,A3)‹BTST.B„#0,SDDCMD(A3)IFrametobesent?‹IFˆTHEN.S4CLR.B…SDSUKT(A4)Yes,zerothenumberofframesout‹ENDI‰ELSE.S.‹MOVE.L„(A7)+,A0Absolutelynobuffersatall,-‹MOVE.B„#SDPBNB,SDPBSY(A5)SetSDLCnotbusy,‹SDLRSRGAndexit‹RTE‰ENDI$‰BRA.L…TRANSMTƒGostarttransmitting .**********************************************.* END OF FILE 'FIX:48.SDLCPRI.POLLQ.AI' *.**********************************************é‰PAGE6******************************************************6* BEGINNING OF FILE 'FIX:48.SDLCPRI.RECEIVE.AI' *6****************************************************** H************************************************************************ *'*ˆMODULE:‚"RECEIVE"RECEIVESDLCFRAMES*-*ˆENTER:‚A5.L=PRIMARYCONTROLBLOCKADDRESS(*A4.L=SECONDARYCONTROLBLOCKADDRESS*9*ˆENTRYASSUMESA0-A6/D0-D7HAVEBEENPUSHEDONTHESTACK5*–ANDENTRYWASTHROUGHEXCEPTION(TRAPORINTERRUPT)*>*ˆEXIT:‚"RECEIFB"‚SDLCRESPONSEWITHFINALBITSETCAUSEDEXIT'*"RECEITO"‚RECEIVETIMEOUTCAUSEDEXIT3*"RECEILB"‚THEFREEQUEUEHASONLYONEBUFFERLEFT9*"RECEIEE"‚ANEXCESSIVENUMBEROFRCVERRORSCAUSEDEXIT*!*ˆREGISTERSUSED:ƒ01234567*˜DU*˜AUUUUPPƒS* |ƒ|ƒ|__stack* |ƒ|______preserved* |__________used*#*ˆEXITSTOEXTERNALLYDEFINEDLABEL&*ŽWITHA0-A6/D0-D7PUSHEDONTHESTACK&*ŽANDASSUMESFINALEXITWILLBE"RTE"*H************************************************************************ ?RECEIVE‚MOVE.B„#SDPBRC,SDPBSY(A5)‚Markusasbusyreceivingnow ‰ADD.W…#1,SDSHCRCV(A4)…3/2/83 <‰LEA‡RCVSTSEI(PC),A0…andsetinterruptvectorsforreceiving‰MOVE.L„A0,SDPVCT2(A5)‰LEA‡RCVST1(PC),A0‰MOVE.L„A0,SDPVCT3(A5)‰LEA‡RCVSTS(PC),A0‰MOVE.L„A0,SDPVCT4(A5) 5‰MOVE.L„SDPRCV(A5),A3‡Findthebuffertoreceiveinto6‰LEA‡SDDDAT(A3),A2‡A2=A(dataareawithinthebuffer)(‰MOVE.L„#0,A1(ZerothehighwordofA1)‰MOVE.W„SDPRLG(A5),A1‡and6‰MOVE.W„A1,SDDBCT(A3)‹storemaximumbytecount‚2/24/83:‰MOVE.B„SDSRRT(A4),SDSCSE(A4)Initializetheerrorcounter.‰CLR.B…SDDERR(A3)ŠCleartheerrorflagŠ2/24/83B‰MOVEM.LƒA0-A6,SDPRRTA0(A5)‚Saveregsforinterrupthandlersusage9‰MOVE.W„#-1,SDPRBCT(A5)…makethecountfield"bad"„3/8/83 ‰OR.W†#$700,SRŒMaskinterrupts2‰MOVE.B„#NCW0RG6,NECCTL_B„Loadthestationaddress0‰MOVE.B„SDSSEC(A4),NECCTL_B‚Weareinterestedin;‰MOVE.B„#NCW0REX+NCW0RG1,NECCTL_BEXT&RCVCHARINTENABLEÇ:ÐBØKàGè4ð:ø#)‰MOVE.B„#NCW1IRX+NCW1EXI+NCW1STV,NECCTL_B$‰MOVE.B„#NCW0RG3,NECCTL_B„RCVENABLE;W3TOTAL‚EQU‡NCW3BT8+NCW3AUE+NCW3EHU+NCW3CRC+NCW3ADS+NCW3RXE‰MOVE.B„#W3TOTAL,NECCTL_B!‰MOVE.B„#NCW0RG5,NECCTL_B„SETDTR‰MOVE.B„#NCW5DTR,NECCTL_B5‰MOVE.B„#NCW0RTX,NECCTL_B„ENABLEINTONNEXTRCVCHAR!‰MOVE.B„#NCW0RTC+NCW0REX,NECCTL_B '‰BSR.L…SOMETOUT‚TRIGGERRECEIVETIMEOUT ‰SDLRSRG—Restoreallregisters,‰INTSVRG—Thensaveonlythe"interrupt"ones‰BRA.L…INTEXIT ‰PAGE*#* External Status Interrupt Handler*I*NOTE:‚THISSTATEISUSEDWHENANEXTERNALSTATUSINTERRUPTOCCURSPRIORB*ˆTORECEIVINGTHEFIRSTCHARACTEROFARECEIVEFRAME.‚DURINGTHISF*ˆPERIOD(BEFOREWEBEGINRECEIVINGAFRAME)WEIGNOREEXTERNALSTATUSE*ˆINTERRUPTS.‚WEDON'TCAREABOUTRECEIVEABORTSAND/ORCLEARTOSENDC*ˆAND/ORDATACARRIERDETECTSTATECHANGESWHENWEARENOTACTUALLY*ˆRECEIVINGAFRAME. 1RCVSTSEIMOVE.B„NECCTL_B,D0ŠGETTHECHIP'SSTATUS*œIGNORERECEIVEABORT,*œHUNTMODECHANGES,*œCLEARTOSENDCHANGES,AND*œDATACARRIERDETECTCHANGES./‰MOVE.B„#NCW0REX,NECCTL_BRESETEXTERNALSTATUS.‰MOVE.B„#NCW0EOI,NECCTL_AANDENDOFINTERRUPT‰BRA.L…INTEXIT‰PAGE*#* External Status Interrupt Handler**1*ˆVECTOREDSTATETOPROCESSEXT/STATUSINTERRUPTS*%RCVSTEƒMOVE.B„NECCTL_B,D0SDLCABORT?‰BTST.L„#7,D0…*‰BNE.S…RCVSTE1ƒ*,‰BTST.L„#3,D0…NO,DataCarrierDetectDROPPED?‰BEQ.S…RCVSTE2ƒ*4‰MOVE.B„#NCW0REX,NECCTL_BNO,RESETINTERRUPT&EXIT‰MOVE.B„#NCW0EOI,NECCTL_A*‰BRA.L…INTEXIT‡* 7RCVSTE1‚MOVE.B„#NCW0REX,NECCTL_B„RESETINTERRUPT&EXIT‰MOVE.B„#NCW0EOI,NECCTL_A*3RCVSTE1AINTRSRG“LET'SSAVEALLTHEUSERS'REGSNOW ‰SDLSVRG“*‰MOVE.L„SDLCPCB,A6RESTOREREGS‰MOVEM.LƒSDPRRTA0(A6),A0-A6*3‰MOVE.B„#SDDEABT,SDDERR(A3)„SETSDLCABORTOCCURRED‰ADD.W…#1,SDSHCRAB(A4)…3/2/83‰BRA.L…RCVSTSF*   7RCVSTE2‚MOVE.B„#NCW0REX,NECCTL_B„RESETINTERRUPT&EXIT‰MOVE.B„#NCW0EOI,NECCTL_A*+‰INTRSRG“LET'SSAVEALLTHEUSERS'REGSNOW ‰SDLSVRG“* ‰MOVE.L„SDLCPCB,A6RESTOREREGS‰MOVEM.LƒSDPRRTA0(A6),A0-A6*<‰MOVE.B„#SDDEABT,SDDERR(A3)„ASSUMEANABORTOCCURREDƒ2/24/83‰ADD.W…#1,SDSHCRDD(A4)…3/2/83‰BRA.L…RCVSTSE* ‰PAGE *%* Receive Character Interrupt Handler**2*ˆVECTOREDSTATETOPROCESS1STRCVCHARAVAILABLE*THEN.S0‹MOVE.L„SDPRRTA2(A1),A2…MoremaybereceivedOK,5‹MOVE.B„NECDAT_B,(A2)+‡Storereceivedbyteintobuffe2‹MOVE.L„A2,SDPRRTA2(A1)…Saveupdateddataaddress.‰ELSE.S9‹LEA‡RCVST4(PC),A2‡Bufferisfull,betterby1stFCSbyte<‹MOVE.L„A2,SDPVCT3(A1)†UseBUFFEROVERRUNvectorifrcvmore2‹MOVE.B„NECDAT_B,D0Šanddiscard1stFCSbyte(hope‰ENDI‰MOVE.B„#NCW0EOI,NECCTL_A‰BRA.L…INTEXIT ‰PAGE *%* Receive Character Interrupt Handler**+*ˆVECTOREDSTATETOPROCESSOVERRUNBUFFERS*2RCVST4ƒMOVE.L„SDPRRTA3(A1),A2BUFFEROVERRUNERROR‰MOVE.B„#SDDERBO,SDDERR(A2)1‰MOVE.B„NECDAT_B,D0REMOVECHARACTERFROMNEC7201‰MOVE.L„SDPRRTA4(A1),A2…3/2/83‰ADD.W…#1,SDSHCROB(A2)…3/2/83‰MOVE.B„#NCW0EOI,NECCTL_A‰BRA.L…INTEXIT ‰PAGE *-* Special Receive Condition Interrupt Handler**2*ˆVECTOREDSTATETOPROCESSSPECIALRCVCONDITIONS*?RCVSTSƒMOVE.B„NECDAT_B,D0‚REMOVE2NDCRCCHARACTERFROMNEC7201+‰INTRSRG“LET'SSAVEALLTHEUSERS'REGSNOW‰SDLSVRG‰MOVE.L„SDLCPCB,A6RESTOREREGS‰MOVEM.LƒSDPRRTA0(A6),A0-A64‰MOVE.B„#NCW0RG1,NECCTL_BGetRegister1Information‰MOVE.B„NECCTL_B,D03‰MOVE.B„#NCW0ERR,NECCTL_B(resetspecialinterrupt)!‰MOVE.B„#NCW0RTC+NCW0RTX,NECCTL_B‰MOVE.B„#NCW0EOI,NECCTL_A )‰MOVE.L„A2,-(A7)ŒProtectA2whiletracing‰BSR.L…GETRACEGetatracerow‰IFˆTHEN.SE**********************************************************************TraceEntryFormat°*E**********************************************************************Ã*'*‚+0Ž+4Ž+8‚+9‚+10+11+12+13+14+15‚*E* +---------------+---------------+---+---+---+---+---+---+---+---+ *:*!†PC‡!A(RcvBuffer)!#!S!C!R!D0!D1!E!R1!* E* +---------------+---------------+---+---+---+---+---+---+---+---+ **Ã**PC=ProgramCounter,­*8*A(RcvBuffer)=Addressofthebufferjustreceived,Ž**#=Station'sNumber,­* *S=Station'sCurrentState,¦**C=Buffer'sCommandByte,¨**R=Buffer'sResponseByte,§* *D0=Buffer's1stDataByte,¦* *D1=Buffer's2ndDataByte,¦*!*E=Buffer'sErrorCodeByte,¥*(*R1=NEC7201ReadRegisterOneByte.ž**Ã*E*********************************************************************,‹PEA‡*(PC)Ifwegetatracerow,thentrace#‹MOVE.L„(A7)+,0(A2)‰ourPCaddress,‹MOVE.L„A3,4(A2)ŒA(RcvBuffer),)‹MOVE.B„SDSSEC(A4),8(A2)„Stationaddress,+‹MOVE.B„SDSCST(A4),9(A2)„Hiscurrentstate,0‹MOVE.B„SDDCMD(A3),10(A2)ƒCommandByte(ifany),(‹MOVE.B„SDDRSP(A3),11(A2)ƒResponseByte,%‹MOVE.B„SDDDAT+0(A3),12(A2)Firstand.‹MOVE.B„SDDDAT+1(A3),13(A2)Seconddatabytes,.‹MOVE.B„SDDERR(A3),14(A2)ƒErrorcodebyte,and-‹MOVE.B„D0,15(A2)‹Register1fromtheNEC7201‰ENDI)‰MOVE.L„(A7)+,A2ŒRecoverA2aftertracing $‰BTST.L„#7,D0…EndofFramedetected?‰BEQ.S…RCVSTSA‰BTST.L„#6,D0…Yes,FCSerror?‰IFˆTHEN.S=‹MOVE.B„#SDDECRC,SDDERR(A3)Yes,posttheerrorinthebuffer‹ADD.W…#1,SDSHCRCR(A4)…3/2/83‰ENDI&RCVSTSA‚BTST.L„#5,D0…receiveroverrun?‰IFˆTHEN.S6‹MOVE.B„#SDDERCU,SDDERR(A3)Yes,postitinthebuffer‹ADD.W…#1,SDSHCROR(A4)…3/2/83‰ENDI,‰CMP.B…#SDDERTO,SDDERR(A3)Receivetime-out?0‰BEQ.L…RECEITOYes,departfromherecompletely!,‰TST.B…SDDERR(A3)ŠAnyerrordetectedsofar?‰IFˆTHEN.S/‹CMP.B…#SDDERBO,SDDERR(A3)Yes,frametoolong?1‹BNE.L…RCVSTSENo,justignorethereceivedframe(‹TST.B…SDSCSE(A4)ŠYes,anyretriesleft?-‹BNE.L…RCVSTSE’Yes,ignorethereceivedframe7* When a Buffer Overrun occurs and no retries are left,J* the overlength frame is passed to the application with the error posted.L* This allows someone to complain about these "big" frames we are receiving.‰ENDI9‰MOVE.W„A1,D0…Calculatehowmanybytesareinthebuffer,5‰ADD.W…#1,D0…Addingonefor1stFCScharacteroverrun‰SUB.W…D0,SDDBCT(A3)C‰CMP.W…#-1,SDDBCT(A3)Istheframetooshort?(LT32bits?)8/27/82‰IFˆTHEN.S8‹MOVE.B„#SDDEIFU,SDDERR(A3)Yes,posttheerror‰10/13/82‹ADD.W…#1,SDSHCR32(A4)…3/2/83‹BRA.L…RCVSTSF©10/13/82‰ENDI,‰BTST.B„#0,SDDRSP(A3)‚No,wasitanIframe?$‰BNE.S…RCVSTSDƒOutifnotanIframe‰IFEQ†IFRMBCT-YES3‹MOVE.W„SDPRBCT(A5),D0‚IFrame'sLengthasClaimed?‹CMP.W…SDDBCT(A3),D0‹BNE.S…RCVSTSB6ˆNo,branch‰ENDC=‰CMP.B…#SDPTRN,SDPTXF(A5)‚Yes,didwejustsendanRNRframe?0‰BNE.S…RCVSTSB3ŒNo,it'sOKtorcvIframesthenHRCVSTSB6MOVE.B„#SDDEIFU,SDDERR(A3)Yes,stationshouldn'thavesentit!‰ADD.W…#1,SDSHCRLN(A4)…3/2/83‰BRA.S…RCVSTSB4 ARCVSTSB3MOVE.B„SDDRSP(A3),D0‡NO,DOESVr=Nsinreceivedframe? ‰ASL.B…#4,D0‰AND.B…#$E0,D0‰CMP.B…SDSVRC(A4),D0‰BEQ.S…RCVSTSC:RCVSTSB5MOVE.B„#SDDENNR,SDDERR(A3)NO,SETVr<>NsERROR‰ADD.W…#1,SDSHCRNR(A4)…3/2/83ARCVSTSB4BTST.B„#4,SDDRSP(A3)‡Isthereceivedpoll/finalbitset?‰BEQ.S…RCVSTSE-‰BRA.L…RECEIFBYES,EXIT(RECEIVEDFINALBIT) 5RCVSTSC‚ADD.B…#$20,SDSVRC(A4)…Vr=Ns,soVr=Vr+1‰AND.B…#$E0,SDSVRC(A4)@RCVSTSD‚BTST.B„#4,SDDRSP(A3)‡Isthereceivedpoll/finalbitset?‰BEQ.S…RCVSTSD1-‰BRA.L…RECEIFBYES,EXIT(RECEIVEDFINALBIT) A2 ‰ADD.L…A3,A2#‰MOVE.L„#0,A1…BUFFER'SLENGTH->A1‰MOVE.W„SDPRLG(A5),A1 ‰MOVE.W„A1,SDDBCT(A3)BYTECOUNT"‰CLR.B…SDDERR(A3)„CLEARSDLCERROR%‰MOVEM.LƒA0-A6,SDPRRTA0(A5)SAVEREGS2‰LEA‡RCVST1(PC),A0‡VECTOREDSTATEFOR1STRCVCHAR‰MOVE.L„A0,SDPVCT3(A5)*‰LEA‡RCVSTSEI(PC),A0…ANDIGNOREEXTSTATUS‰MOVE.L„A0,SDPVCT2(A5)7‰MOVE.W„#-1,SDPRBCT(A5)…MAKECOUNTFIELDINVALID†3/8/83‰ADD.W…#1,SDSHCRRS(A4)…3/2/835‰MOVE.B„#NCW0RG3,NECCTL_BƒRe-enablehuntmode2/10/83H MOVE.B #NCW3BT8+NCW3AUE+NCW3EHU+NCW3CRC+NCW3ADS+NCW3RXE,NECCTL_B 2/10/8'‰BSR.L…SOMETOUT‚TRIGGERRECEIVETIMEOUT$‰SDLRSRG—Restoreallregisters,then'‰INTSVRG—Saveonlythe"interrupt"ones‰BRA.L…INTEXIT 0************************************************0* END OF FILE 'FIX:48.SDLCPRI.RECEIVE.AI' *0************************************************éé‰PAGE5*****************************************************5* BEGINNING OF FILE 'FIX:48.SDLCPRI.SUBRTN.AI' *5*****************************************************   J***************************************************************************È*6*‚SUBROUTINE:‚"SOMETOUT"‚TRIGGERTHERECEIVETIMEOUT’**È*1*‚ENTER:A4.L=SECONDARYCONTROLBLOCKADDRESS™**È**È*#*‚REGISTERSUSED:ƒ01234567¥* *’DUUU¯* *’AUU…P…S¥**”|‡|…|_stackž**”|‡|_______preservedš**”|_______________usedŸ**È*J************************************************************************** 7SOMETOUTLEA‡SDLCTTMOUT(PC),A0ƒACTIVATIONADDRESS->A0'‰CLR.L…D0’TIMEINTERVAL(INMSEC)->A1‰MOVE.W„SDSTOC(A4),D0‡*‰BEQ.S…SOMETOU1Œ*‰MULU.W„#TIMCNST,D0‰*‰MOVE.W„D0,A1*'‰MOVE.W„#$0006,D1‹INTERRUPTLEVEL->D1‰MOVE.L„#DLC2,D2ŒI.D.#->D2‰IFEQ†CHIPTYPE-68000 ‹TR0.RQPA‰ENDC‰IFNE†CHIPTYPE-68000 ‹TR0$.RQPA‰ENDC3SOMETOU1RTS›(MUSTBEA2BYTEINSTRUCTION)2/24/831‰ILLEGALDIEIFSBRQPARETURNSANYERROR!ˆ2/24/83 ‰PAGE J***************************************************************************È*5*‚SUBROUTINE:‚"SOMETOCLR"‚CLEARTHERECEIVETIMEOUT“**È**È**È*#*‚REGISTERSUSED:ƒ01234567¥* *’DUUU¯* *’AUU‹S¥**”||_stackž**”|_______________usedŸ**È*J************************************************************************** 8SOMETOCLRLEA†SDLCTTMOUT(PC),A0ƒACTIVATIONADDRESS->A0'‰CLR.L…D0’TIMEINTERVAL(INMSEC)->D1‰MOVE.W„SDSTOC(A4),D0‡*‰BEQ.S…SOMECLR1Œ*‰MULU.W„#TIMCNST,D0‰*‰MOVE.W„D0,A1*'‰MOVE.W„#$8006,D1‹INTERRUPTLEVEL->D1‰MOVE.L„#DLC2,D2‹I.D.#->D2‰IFEQ†CHIPTYPE-68000 ‹TR0.RQPA‰ENDC‰IFNE†CHIPTYPE-68000 ‹TR0$.RQPA‰ENDC3SOMECLR1RTS›(MUSTBEA2BYTEINSTRUCTION)2/24/831‰ILLEGALDIEIFSBRQPARETURNSANYERROR!ˆ2/24/83 ‰PAGE J***************************************************************************È*1*‚SUBROUTINE:‚"SOMEDISPOSE"DISPOSEOFABUFFER˜*  N QA+*È*.*‚ENTER:A1.L=ADDRESSOFBUFFERTODISPOSEœ*(*‰A5.L=PRIMARYCONTROLBLOCKADDRESS›**È*;*‚RETURN:A1.L=ADDRESSOFLINKFIELDOFDISPOSEDBUFFER**È*#*‚REGISTERSUSED:ƒ01234567¥**’Dµ* *’AUR‡PƒS¥**”||‡|ƒ|_stackž**”||‡|_____preservedš**”||_____________returned›**”|_______________usedŸ**È*J************************************************************************** #SOMEDISPOSE MOVE.L SDDLNK(A1),-(A7) ‰MOVE.L„A1,A0‰BSR.L…SBPTFRBF‰MOVE.L„(A7)+,A1‰RTS ‰PAGE J***************************************************************************È*?*‚SUBROUTINE:‚"SOMESEND"‚SENDABUFFERTOAPPLICATIONPROGRAM‰**È*+*‚ENTER:A1.L=ADDRESSOFBUFFERTOSENDŸ*(*‰A5.L=PRIMARYCONTROLBLOCKADDRESS›**È*7*‚RETURN:A1.L=ADDRESSOFLINKFIELDOFSENTBUFFER“**È*#*‚REGISTERSUSED:ƒ01234567¥**’DU³* *’AUR‡PƒS¥* *–|‡|ƒ|¥**–|‡|ƒ|_stackž**–|‡|_____preservedš**–|_____________returned›**È*J************************************************************************** SOMESENDMOVE.L„SDDLNK(A1),-(A7) ‰MOVE.L„A1,A0‰MOVE.L„A2,-(A7)‰BSR.L…SBPTUSQ‰MOVE.L„(A7)+,A2‰MOVE.L„(A7)+,A1‰RTS ‰PAGE J***************************************************************************È*F*‚SUBROUTINE:‚"SOMEFREE"FREETHELINKOFRCVBUFFERSTOBUFFERPOOLƒ**È*5*‚ENTER:A2.L=ADDRESSOFFIRSTRCVBUFFERTOFREE•*(*‰A5.L=PRIMARYCONTROLBLOCKADDRESS›**È*#*‚REGISTERSUSED:ƒ01234567¥**’DU³* *’AUƒP…PƒS¥**”|‰|ƒ|_stackž**”|‰|_____preservedš**”|_______________usedŸ**È*J************************************************************************** SOMEFREEMOVE.L„A2,A0‰BSR.L…SBPTFRML‰RTS ‰PAGE J***************************************************************************È*8*‚SUBROUTINE:‚"FINDSCB"FindaSecondaryControlBlock‘**È*D*‚ENTER:D1.B=SecondaryStationAddress,or$FF(GlobalAddress)†*7*Note:WheretheGlobalAddressisused,theaddress…*3*–ofthe1stSecondaryControlBlockisreturned.ƒ**È*4*‚RETURN:Negative=0(Plus)-SCBFound,seeA1,–*** A1=A(SCB-SecondaryControlBlock),‚*>*ŠNegative=1(Minus)-SCBNotFound,A1isindeterminite.„**È*#*‚REGISTERSUSED:ƒ01234567¥**’DP³* *’A|R‹S¥**”||‹|_stackž**”||_____________returned›**”|_______________preservedš**È*J************************************************************************** ‰XDEF†FINDSCB >FLYPAPEREQU‡$FFFFFFFF‹Fly-Paper,causesAddressErrorifused 8FINDSCB‚MOVE.L„SDLCPCB,A1ŠViathePrimaryControlBlock,8‰MOVE.L„SDPFSEC(A1),A1†FindtheaddressofthefirstSCB‰IF.B†D1#$FFTHEN.S9‹WHILE.BƒSDSSEC(A1)#0AND.BSDSSEC(A1)D1DO.S&ADDA.L„#SDSLNG,A1ŠAdvancetonextSCB‹ENDW‰ENDI‰IF.B†SDSSEC(A1)#0THEN.S0‹MOVE.L„#FLYPAPER,A1ˆNotFound,A1=BugCatcher ‹ORI.B…#$08,CCRŒAndNegative=1‰ELSE.S1‹ANDI.B„#$F7,CCRŒFound,Negative=0,A1=A(SCB)‰ENDI‰RTS ‰PAGE J***************************************************************************È*1*‚SUBROUTINE:‚"GETRACE"GetaTraceRowAddress˜**È**‚ENTER:NoArguments³**È*A*‚RETURN:Carry=0(CarryClear)-TraceRowAddressReturned,‰**¤A2=A(TraceRow),’*%*¤(Thetraceflagisonandatraceƒ**¥areaexists),–*3*ŠCarry=1(CarrySet)-ƒNoTraceRowAvailable,**¤A2=#$FFFFFFFF,”*%*¤(Eitherthetraceflagisoff,orƒ**¥notraceareaexists).**È*H*‚Note:Thesixteenbytesfrom0(A2)thru15(A2)areavailableforany‚*B*ˆtraceinformation(whenthe"NotEqual"returnoccurs).‚Common*B*ˆusageistostorethecurrentPCvalueat0(A2).L,identifying‚*B*ˆtheprocedurewhichistracing,followedbyprocedurespecific‚**ˆtraceinformation.®*! *È**‚ExampleUsage:¸*+*ŠMOVE.L„A2,-(A7)ŒProtectA2ifnecessary‰*!*ŠBSR.L…GETRACEGetatracerow‘*)*ŠIFˆTHEN.S‰Ifarowisavailable,Š* *ŒPEA‡*(PC)­***ŒMOVE.L„(A7)+,0(A2)‰StoremyPCaddress‹**ŒMOVE.B„x,4(A2)«**ŒMOVE.B„y,5(A2)«*)*ŒMOVE.L„z,6(A2)Storesomeinformationˆ**ŒMOVE.L„a,10(A2)ª*.*ŒMOVE.W„b,14(A2)Œ-DoNotExceed15(A2).B-„**ŠENDIº*0*ŠMOVE.L„(A7)+,A2ŒandrecoverA2(if"pushed")„**È*J************************************************************************** ‰XREF†TRACEBEG GETRACE‚MOVE.L„TRACEBEG,A2‰BTST.B„#0,TRACFLAG+1 ‰IFˆAND.LA2#0THEN.S‹MOVEM.LƒA3-A4,-(A7)0‹MOVE.L„A2,A3A3=A(Tracecontrol&tracearea)‹MOVE.W„SR,-(A7) ‹ORI.W…#$0700,SR‹MASKINTERRUPTS ‹MOVE.L„0(A3),A2ŒGetA(NextRow)%‹LEA‡16(A2),A4‹FigureA(NewNextRow)‹IF.L†A44(A3)THEN.S.LEA‡8(A3),A4ŠResettobeginningwhenpastend MOVE.L„A4,A2LEA‡16(A2),A4‹ENDI4‹MOVE.L„A4,0(A3)ŒStorenewA(NextRow)fornexttime"‹MOVE.W„(A7)+,SRŒUNMASKINTERRUPTS)‹LEA‡15(A2),A4‹Seeifa"FullRow"exists‹IF.L†A44(A3)THEN.S,ANDI.Bƒ#$FE,CCRandassertRowExistsifOK‹ELSE.S3MOVE.Lƒ#FLYPAPER,A2‰otherwise,A2=#$FFFFFFFFandORI.B„#$01,CCR˜NoRowExists‹ENDI‹MOVEM.Lƒ(A7)+,A3-A4‰ELSE.S.‹MOVE.L„#FLYPAPER,A2ˆelse,A2=#$FFFFFFFFand‹ORI.B…#$01,CCR’NoRowExists‰ENDI‰RTS /***********************************************/* END OF FILE 'FIX:48.SDLCPRI.SUBRTN.AI' */***********************************************ééé‰PAGE7*******************************************************7* BEGINNING OF FILE 'FIX:48.SDLCPRI.TRANSMIT.AI' *7******************************************************* H*************************************************************************(*ˆMODULE:‚"TRANSMT"TRANSMITSDLCFRAMES*-*ˆENTER:‚A5.L=PRIMARYCONTROLBLOCKADDRESS(*A4.L=SECONDARYCONTROLBLOCKADDRESS%*A3.L=BUFFERCONTROLBLOCKADDRESS9*ˆENTRYASSUMESA0-A6/D0-D7HAVEBEENPUSHEDONTHESTACK5*–ANDENTRYWASTHROUGHEXCEPTION(TRAPORINTERRUPT)2*ˆEXIT:‚"TRANSUF"‚ATRANSMITUNDERFLOWCAUSEDEXIT-*"TRANSEQ"‚ENDOFTRANSMITQUEUECAUSEDEXIT6*"TRANSPB"‚SDLCCOMMANDWITHPOLLBITSETCAUSEDEXIT!*ˆREGISTERSUSED:ƒ01234567*˜DU*˜AUUUUPPƒS* |ƒ|ƒ|_stack* |ƒ|_____preserved* |_________used#*ˆEXITSTOEXTERNALLYDEFINEDLABEL&*ŽWITHA0-A6/D0-D7PUSHEDONTHESTACK&*ŽANDASSUMESFINALEXITWILLBE"RTE"*H************************************************************************E* NOTE: ALL INFORMATION FRAMES HAVE THEIR LENGTHS TRANSMITTED AS WELLA*ASTHEIRDATA.‚THELENGTHISSENTASTHEFIRSTTWOBYTESOFTHE* INFORMATION FIELD AS FOLLOWS;N*
H*THERECEIVINGSTATIONMUST,OFCOURSE,EXPECTTHIS.‚THELENGTHISSENTM* AS THE NEC7201 HAS THE NASTY TENDENCY TO SEND THE FRAME CHECK SEQUENCE WHENN*ATRANSMITTERUNDERRUNOCCURS.‚IFWEDOTHISBYACCIDENT,THENWEMUSTBEGINL* SENDING AN ABORT WITHIN THREE CHARACTER TIMES (TWO FCS CHARACTERS PLUS THEL*ENDINGFLAG)FORTHERECEIVINGSTATIONTOKNOWTHATWEGOOFED.‚IFFORSOMEH* REASON WE DON'T INITIATE THE ABORT IN TIME, WITHOUT THE DATA COUNT THEK* RECEIVING STATION WOULD HAVE NO WAY OF K! NOWING THAT THE FRAME HE HAS JUSTM*RECEIVEDISNOGOOD.‚THERECEIVERHANDLESTHIS"BADLENGTH"FRAMEJUSTLIKE>* ANY OTHER ERRONEOUS FRAME - HE IGNORES THE FRAME COMPLETELY. :TRANSMT‚MOVE.B„#SDPBTX,SDPBSY(A5)‚Setusbusytransmitting!+*92:8B>J6RJZEb>j‰ADD.W…#1,SDSHCTXM(A4)…3/2/83‰OR.W†#$700,SRŒMaskInterrupts!<‰MOVE.B„#NCW0REX+NCW0RG1,NECCTL_BResetanypendingExternalB‰MOVE.B„#NCW1EXI+NCW1STV,NECCTL_BEnableonlyExtStatus(notXmtr)‰MOVE.B„#NCW0RG5,NECCTL_B9‰MOVE.B„#NCW5DTR+NCW5TX8+NCW5TXE+NCW5RTS+NCW5TCE,NECCTL_B ‰PAGE C* DTR and RTS are now active, wait for CTS to become active as well ‰MOVE.B„NECCTL_B,D0.‰BTST.L„#5,D0IsCleartoSendalreadyactive?‰IFˆTHEN.S)‹LEA‡TXMSTCTS(PC),A0…No,Mustwaitforit7‹MOVE.L„A0,SDPVCT2(A5)†ExtStatustoTXMSTCTS(CTSWait)‹LEA‡TXMSTOFF(PC),A0;‹MOVE.L„A0,SDPVCT1(A5)†andXmtrEmptytoTXMSTOFF(XmtrOff)‹MOVEM.LƒA0-A6,SDPRRTA0(A5)‹SDLRSRG‹INTSVRG'‹BRA.L…INTEXITExittillCTScomestrue *#* External Status Interrupt Handler*0TXMSTCTSƒMOVE.B„NECCTL_B,D0‰ExtStatusInterrupt,‹MOVE.B„#NCW0REX,NECCTL_B+‹MOVE.B„#NCW0EOI,NECCTL_AƒAcktheinterrupt*‹BTST.L„#5,D0IsCleartoSendnowactive?‹IFˆTHEN.S!BRA.L…INTEXIT‹No,waitsomemore‹ENDI‹INTRSRG‹SDLSVRG)‹MOVE.L„SDLCPCB,A6ŠYes,Nowwecanbegin!0‹MOVEM.LƒSDPRRTA0(A6),A0-A6‚RestoreBGRegisters‰ENDI * Fall-thru to the next page‰PAGE7* NOTE: WE MAY FALL-THRU TO HERE FROM THE PREVIOUS PAGE ‰MOVE.B„#NCW0RG1,NECCTL_B@‰MOVE.B„#NCW1TXI+NCW1EXI+NCW1STV,NECCTL_BEnableXmtrInterrupts )* Pre-frame transmission delay algorithm.+* Replaced on August 23, 1983 by Ed Skinner*D*†Whereapre-frametransmissiondelayisrequired,wesenda"null"L*frameconsistingofthespecifiednumberofbytes.‚ThisframeisaddressedH* to station $00 (there ain't no such station), and is not sent with anyJ*FCS.‚Thesetwoconditions(station$00andnoFCS)shouldguaranteethat3* no station receives this as a valid transmission.E*†Apre-frametransmissiondelayisneededforeitheroftworeasons.J* First, where Mancester encoding is used (such as in the Exormacs/HDS-400G* and GMAD Weld Monitor configurations), the Mancester chip will supplyM* Transmit Clock to the NEC7201 sometime after RTS is output (from the 7201).K* The single leading flag sent by the NEC7201 is not always received intactL*bythetargetstation.‚ThismaybeduetosomedifficultyintheMancesterJ*receiverand/orNEC7201.‚Regardless,itremainsthatthefirstcharacterM* transmitted by the NEC7201 (an SDLC Flag) is not always received correctly.C*†Secondly,apre-frametransmissiondelaymaybeusedtoallowtheM* receiving software (in the target node) additional time in which to prepare* for receiving a frame.D*†Toeffectthepre-frametransmissiondelay,aframecontaining$00I*bytesinallfieldsistransmitted.‚Asthestationaddress$00isnotaI* valid station address according to the SDLC protocol, no station should.* begin active reception of this "null" frame.F*†Oncethespecifiednumberof"null"byteshavebeentransmitted,theI* transmitter is allowed to revert to the "flagging" condition (no FCS isG*sent).‚SinceanyreceiverofthisframewillthinkthelasttwobytesH* are the FCS, and as these bytes do not contain the computed FCS, it isI* unlikely (1 chance in 65535) that it will appear to be the correct FCS.I* Additionally, since the odds of a transmission error which would changeG* the address field to some "real" station address are much more remoteF* (although no information is available in this regard, the error rateF* should be similar to that of a satellite link (1 in 10**9) or betterJ* considering the "protected" " environment and circuit length), the overallF* probability of some station receiving this leading transmission as aE*validframearecomfortablyremote.‚(Besidesthat,thereasonwe'reE* sending this little sucker is because the first frame usually isn'tJ*receivedastheleadingflagismissed.‚ThismakesitevenmoreunlikelyB* that this leading pad frame might be received as a valid frame.)D*†Notethatwhenaframetransmissioncompletes,wedonotsendthisK* "leading pad" frame when more than one frame is sent in quick succession. 2TXMSTPADTST.W…SDSTPD(A4)ŠAnyleadingframedelay?‰IFˆTHEN.S1‹MOVE.W„SDSTPD(A4),A1‡Yes,A1.W=CharacterCount‹LEA‡TXMSTPNX(PC),A08‹MOVE.L„A0,SDPVCT1(A5)†XmtrIntr-->TXMSTPNX(NextPad)‹LEA‡TXMSTEI(PC),A07‹MOVE.L„A0,SDPVCT2(A5)†ExtStaIntr-->TXMSTEI(Ignore)‹MOVEM.LƒA0-A6,SDPRRTA0(A5)‹SDLRSRG‹INTSVRG9‹MOVE.B„#$00,NECDAT_B‡SendStationAddress=$00(Nobody)#‹BRA.L…INTEXITExittillXmtrEmpty ‰PAGE*%* Transmitter Empty Interrupt Handler*B* Enter here upon Transmitter Empty interrupts where the last byteE*outputisnowbeingtransmittedbytheNEC7201.‚BecausetheNEC7201J* gives us the Transmitter Empty interrupt up to one character time beforeF* the character is actually needed, there is a one character "latency"E*betweenwhatweoutput,andwhattheNEC7201issending.‚Therefore,H* we actually output one more than the specified number of leading pads,H* and terminate this operation when we get the interrupt indicating thatG* the last byte output (the "extra" byte) is now being transmitted, andI* therefore, that the specified number of leading pads have, in fact, now* all been transmitted. 5TXMSTPNXƒSUB.W…#1,SDPRRTA1+2(A1)ƒSentonedelaybyte,‹IFˆTHEN.S7MOVE.B„#$00,NECDAT_B‡Sendanothertillcountexhausted*MOVE.B„#NCW0EOI,NECCTL_AƒEndofInterrupt.BRA.L…INTEXITAndexittillanotherXmtrIntr‹ENDI1‹MOVE.B„#NCW0EOI,NECCTL_AƒEndofInterrupt(Xmtr)‹INTRSRG‹SDLSVRG‹MOVE.L„SDLCPCB,A60‹MOVEM.LƒSDPRRTA0(A6),A0-A6‚RestoreBGRegisters‰ENDI%* And begin sending the "real" frame. %TXMSTNXTADD.W…#1,SDSHCTXS(A4)‡3/2/83* Fall-thru to the next page‰PAGE8* NOTE: WE WILL FALL-THRU TO HERE FROM THE PREVIOUS PAGE 7* "EMBELLISH" SDLC COMMAND WITH Nr/Ns COUNTS & POLL BIT ‰MOVE.B„SDDCMD(A3),D0‰AND.B…#$03,D0‰IF.B†D0#3THEN.S#‹MOVE.B„SDDCMD(A3),D0ƒSorIframe,‹AND.B…#$1F,D0/‹OR.B†SDSVRC(A4),D0ƒORinthecurrentVrcount. ‹BTST.L„#0,D0‹IFˆTHEN.SAND.B…#$F1,D0‰Iframe,4OR.B†SDSVSC(A4),D0ƒORinthecurrentVscountalso,(OR.B†#$10,D0‰assertthepoll/finalbit,/ADD.B…#2,SDSVSC(A4)ƒ(AdvanceVsfornexttime):AND.B…#$0E,SDSVSC(A4)ƒ(makingsureit'sonly3bitswide)3ADD.B…#1,SDSUKT(A4)ƒbumpthenumberofframesout,MOVE.B„SDSUKT(A4),D11TST.L…SDDLNK(A3)†anymoreframesafterthisone?(IFˆAND.BD1SDSMXF(A4)THEN.S9MOVE.L„SDDLNK(A3),A0ƒyes,andhaven'treachedmaxlimit,BTST.B„#0,SDDCMD(A0)IFˆTHEN.S2‘AND.B…#$EF,D0‰don'tpoll/finalifnextisIframeENDIENDI‹ELSE.SMOVE.B„D0,D1ŽIfwearesending*AND.B…#$1F,D1ŒaReceiverNotReadyframe,!IF.B†D1#SDDRRNR+$10THEN.S/MOVE.B„#SDPTRN,SDPTXF(A5)ThenassertRNRSentENDI‹ENDI7‹MOVE.B„D0,SDDCMD(A3)‡Storethecommandbytetobesent‰ENDI* Fall-thru to the next page‰PAGE8* NOTE: WE WILL FALL-THRU TO HERE FROM THE PREVIOUS PAGE 8‰LEA‡TXMST0(PC),A0‡Prepareinterruptvectorsforsending‰MOVE.L„A0,SDPVCT1(A5)<‰LEA‡TXMSTEI(PC),A0†For1stCharOut,weignoreExtStaIntrs‰MOVE.L„A0,SDPVCT2(A5) .‰LEA‡SDDDAT(A3),A2‡A2=A(dataareaofbuffer) +‰MOVE.B„SDDCMD(A3),D0‡FigureIfieldlength)‰AND.B…#$03,D0accordingtotypeofframe‰IF.B†D0#$01THEN.S<‹MOVE.W„SDDBCT(A3),A1‡IandUframesspecifyIfieldlengths‰ELSE.S2‹MOVE.W„#0,A1WhileSframesneverhaveanIfield‰ENDI C‰MOVEM.LƒA0-A6,SDPRRTA0(A5)‚Saveregsfor" interrupthandlerstouse* A5 = SDPRRTA5 = A(PCB)* A4 = SDPRRTA4 = A(SCB)* A3 = SDPRRTA3 = A(Buffer)(* A2 = SDPRRTA2 = A(Data within I field)#* A1 = SDPRRTA1 = Length of I fieldG* A0 = SDPRRTA0 = Not used for anything special - just leftover garbage ‰ADD.W…#1,SDSHCTXA(A4)…3/2/83 ‰MOVE.B„SDSSEC(A4),D0‡3/3/832‰IF.B†D0SDDSEC(A3)AND.BD0#$FFTHEN.S$‹ILLEGAL—Dieifbadstationaddress!‰ENDI* Fall-thru to the next page‰PAGE8* NOTE: WE WILL FALL-THRU TO HERE FROM THE PREVIOUS PAGE )‰MOVE.L„A2,-(A7)ŒProtectA2whiletracing‰BSR.L…GETRACEGetatracerow‰IFˆTHEN.SE**********************************************************************TraceEntryFormat°*E**********************************************************************Ã*'*‚+0Ž+4Ž+8‚+9‚+10+11+12+13+14+15‚*E* +---------------+---------------+---+---+---+---+---+---+---+---+ *:*!†PC‡!A(XmtBuffer)!#!S!U!C!RC!D0!D1!0!*E* +---------------+---------------+---+---+---+---+---+---+---+---+ **Ã**PC=ProgramCounter,­*<*A(XmtBuffer)=Addressofthebuffertobetransmitted,Š**#=Station'sNumber,­* *S=Station'sCurrentState,¦*/*U=Station'sCurrentUnacknowledgedCount,—**C=Buffer'sCommandByte,¨**RC=Buffer'sRetryCount,¨* *D0=Buffer's1stDataByte,¦* *D0=Buffer's2ndDataByte,¦**0=Unused.·**Ã*E*********************************************************************,‹PEA‡*(PC)Ifwegetatracerow,thentrace#‹MOVE.L„(A7)+,0(A2)‰ourPCaddress, ‹MOVE.L„A3,4(A2)ŒA(Xmitbuffer),)‹MOVE.B„SDSSEC(A4),8(A2)„StationAddress,+‹MOVE.B„SDSCST(A4),9(A2)„Hiscurrentstate,7‹MOVE.B„SDSUKT(A4),10(A2)ƒCurrentunacknowledgedcount,'‹MOVE.B„SDDCMD(A3),11(A2)ƒCommandbyte,&‹MOVE.B„SDDRTC(A3),12(A2)ƒRetryCount,%‹MOVE.B„SDDDAT+0(A3),13(A2)andfirst4‹MOVE.B„SDDDAT+1(A3),14(A2)........twodatabytes$‹CLR.B…15(A2)Ž(Zerotheunusedbyte)‰ENDI)‰MOVE.L„(A7)+,A2ŒRecoverA2aftertracing ?‰MOVE.B„#NCW0RTG,NECCTL_B„Resetthetransmitter'sFCSgeneratorB‰MOVE.B„SDDSEC(A3),NECDAT_B‚Outputthesecondarystation'saddress=‰MOVE.B„#NCW0RTU,NECCTL_B„EnableFCStransmissiononUnderrun ‰SDLRSRG—Recoverallregisters,,‰INTSVRG—Makestacklooklikeinterruptregs4‰BRA.L…INTEXITAndgoseeifaninterruptispending‰PAGE *%* Transmitter Empty Interrupt Handler*,*ˆVECTOREDSTATETOTxMITSDLCCOMMANDFIELD*ATXMST0ƒMOVE.B„NECCTL_B,D0‰Sincewe'vebeenignoringExtStaIntrs,2‰BTST.L„#6,D0Wenowcheckforanearlierunderrun,‰BNE.L…TXMSTE1Iftrue,gosendanAbortnow"‰MOVE.L„SDPRRTA3(A1),A2…Otherwise,2‰MOVE.B„SDDCMD(A2),NECDAT_BSendthecommandfield‰IFEQ†IFRMBCT-YES6‹BTST.B„#0,SDDCMD(A2)‡WherewearesendinganIframe,‹BNE.S…TXMST012‹LEA‡TXMSTL1(PC),A2†WeSenda"Length"Fieldfirst‹BRA.S…TXMST02‰ENDCATXMST01‚LEA‡TXMST1(PC),A2‡SetUptheNextXmtrEmptyIntrHandlerTXMST02‚MOVE.L„A2,SDPVCT1(A1)1‰LEA‡TXMSTE(PC),A2‡Andfromnowon,wecareabout1‰MOVE.L„A2,SDPVCT2(A1)†ExternalStatusInterrupts‰MOVE.B„#NCW0EOI,NECCTL_A‰BRA.L…INTEXIT ‰PAGE ‰IFEQ†IFRMBCT-YES*%* Transmitter Empty Interrupt Handler**/*ˆVECTOREDSTATETOTxMITSDLCLENGTHFIELD#1*7TXMSTL1‚MOVE.L„SDPRRTA3(A1),A2OUTPUTSDLCLENGTHFIELD‰MOVE.B„SDDBCT(A2),NECDAT_B‚*+‰LEA‡TXMSTL2(PC),A2†SETNEXTVECTOREDSTATE‰MOVE.L„A2,SDPVCT1(A1)†*‰MOVE.B„#NCW0EOI,NECCTL_A‰BRA.L…INTEXIT ‰PAGE *%* Transmitter Empty Interrupt Handler**/*ˆVECTOREDSTATETOTxMITSDLCLENGTHFIELD#2*7TXMSTL2‚MOVE.L„SDPRRTA3(A1),A2OUTPUTSDLCLENGTHFIELD"‰MOVE.B„SDDBCT+1(A2),NECDAT_B*œ10*‰LEA‡TXMST1(PC),A2‡SETNEXTVECTOREDSTATE‰MOVE.L„A2,SDPVCT1(A1)†*‰MOVE.B„#NCW0EOI,NECCTL_A„*10‰BRA.L…INTEXIT‡*‚ENDC ‰PAGE *#* External Status Interrupt Handler**4*ˆVECTOREDSTATETOPROCESSSTATUSCHANGEINTERRUPTS*!TXMSTEƒMOVE.B„NECCTL_B,D0‰GETRR0‰BTST.L„#6,D# 0UNDERRUN?(‰BNE.S…TXMSTE1YES,HURRYANDSENDABORTTXMSTE0‚BTST.L„#5,D0CTSDROP?%‰BEQ.S…TXMSTE1YES,XMTRDYING,ABORT'‰BRA.S…TXMSTE2NO,IGNORETHEINTERRUPT 3TXMSTE1‚MOVE.B„#NCW0SAB,NECCTL_BƒSENDANSDLCABORT‰MOVE.L„SDPRRTA4(A1),A2‰ADD.W…#1,SDSHCTUN(A2)4‰MOVE.L„SDPRRTA3(A1),A2…RESTOREBUFFERCONTROLBLOCK0‰MOVE.B„#SDDETXU,SDDERR(A2)TxMITUNDERRUNERROR*‰MOVE.B„#NCW0REX,NECCTL_BƒRESETINTERRUPTS‰MOVE.B„#NCW0EOI,NECCTL_A‰INTRSRG—SAVEALLUSER'SREGS‰SDLSVRG‰MOVE.L„SDLCPCB,A5ŠRESTOREREGS‰MOVEM.LƒSDPRRTA3(A5),A3-A5(‰BRA.L…TRANSUFEXIT(TRANSMITUNDERFLOW) ETXMSTE2‚MOVE.B„#NCW0REX,NECCTL_BƒIgnoretheExternalStatusInterrupt‰MOVE.B„#NCW0EOI,NECCTL_A‰BRA.L…INTEXIT ‰PAGE *%* Transmitter Empty Interrupt Handler**0*ˆVECTOREDSTATETOTxMITSDLCINFORMATIONFIELD*>TXMST1ƒSUB.W…#1,SDPRRTA1+2(A1)ƒDecrementnumberofbytestogo‰IFˆTHEN.S/‹MOVE.L„SDPRRTA2(A1),A2…If"more"bytesremain,5‹MOVE.B„(A2)+,NECDAT_B‡Outputthenextdatabyte,and7‹MOVE.L„A2,SDPRRTA2(A1)…Savedatapointerfornexttime‰ELSE.S9‹LEA‡TXMSTOFF(PC),A2…Whendone,preparetosendFCSbytes/‹MOVE.L„A2,SDPVCT1(A1)†(XmtrIntrnotexpected)0‹LEA‡TXMST2(PC),A2‡andExpectanExternalStatus&‹MOVE.L„A2,SDPVCT2(A1)†interruptnext,9‹MOVE.B„#NCW0RTI,NECCTL_BƒAndmaketheXmtrEmptygoaway‰ENDI6‰MOVE.B„#NCW0EOI,NECCTL_AƒEitherway,EndofInterrupt‰BRA.L…INTEXIT ‰PAGE *#* External Status Interrupt Handler* *ˆVECTOREDSTATETOTRANSMITCRC*0TXMST2ƒMOVE.B„NECCTL_B,D0‰GettheChip'sStatus,(‰BTST.L„#6,D0IsitsendingtheFCSnow?$‰BEQ.L…TXMSTE0No,gocheckCTSfall5‰LEA‡TXMSTEI(PC),A2†Yes,ChipisnowsendingtheFCS.3‰MOVE.L„A2,SDPVCT2(A1)†IgnoreUnderrunsfromnowon‰MOVE.B„#NCW0REX,NECCTL_B‰MOVE.B„#NCW0EOI,NECCTL_AƒAnd2‰LEA‡TXMST3(PC),A2‡SetupforXmtrEmptyInterrupt,‰MOVE.L„A2,SDPVCT1(A1)†TotakeustoTXMST3.4‰BRA.L…INTEXIT(OccurswhenFCSsendingiscomplete) ‰PAGE *%* Transmitter Empty Interrupt Handler*(*ˆVECTOREDSTATEAFTERCRCHASBEENSENT* TXMST3ƒINTRSRG—SAVEALLREGSNOW‰SDLSVRG‰MOVE.L„SDLCPCB,A6RESTOREREGS‰MOVEM.LƒSDPRRTA0(A6),A0-A6.‰BTST.B„#4,SDDCMD(A3)‡POLLBITSETINCOMMAND?‰BNE.S…TXMST3AYes,Seebelow‰MOVE.B„#NCW0EOI,NECCTL_AƒNo,6‰MOVE.L„SDDLNK(A3),A3‡Istheresomethingelsetosend? ‰MOVE.L„A3,D04‰BNE.L…TXMSTPADŽYup,gosendit(withleadingdelay)'‰ADD.W…#1,SDSHCTNP(A4)…No,donesending+‰BRA.L…TRANSEQGofigureoutwhattodonow ‰PAGE J* WHEN WE ARE READY TO SHUT DOWN THE TRANSMITTER, WE MUST DELAY FOR 11 BITJ* TIMES TO ALLOW THE ENDING FLAG TO LEAVE THE SHIFT REGISTER (8 BIT TIMES)L* AND TO PASS THRU OTHER HARDWARE (SUCH AS THE MANCESTER ENCODER WHICH NEEDSJ*3MOREBITTIMES).‚SINCEWECANNOTMEASUREINDIVIDUALBITTIMES,WEWAITL* A TOTAL OF 16 BIT TIMES BY SENDING TWO "PAD" CHARACTERS CONSISTING OF $00.M* THIS VALUE IS USED AS NO SECONDARIES HAVE THIS ADDRESS AND, THEREFORE, NONEK*OFTHEMWILLSTARTTORECEIVETHISINFORMATION.‚ADDITIONALLY,WETURNTHEM* TRANSMITTER OFF AFTER THE LAST ONE IS OUT WITHOUT SENDING ANY FCS SEQUENCE.K* TURNING THE TRANSMITTER OFF, IF SOMEONE IS RECEIVING AT THAT TIME, CAUSESI* THE LINE TO GO TO A MARKING STATE WHICH WILL CAUSE THEM TO DETECT FIRSTI*ARECEIVEABORT,ANDTHENAMARKING(IDLE)LINE.‚FROMTHESEINDICATIONSF* WE ARE ASSURED THAT NO STATION WILL RECEIVE THESE TRAILING PADS AS A+*VALIDFRAME.ƒEDSKINNER,MARCH2,1983... /TXMST3A‚MOVE.B„#$00,NECDAT_BOUTPUTANULLCHAR*‰LEA‡TXMST4(PC),A0‡SETNEXTVECTOREDSTATE‰MOVE.L„A0,SDPVCT1(A5)‰MOVE.B„#NCW0EOI,NECCTL_A&‰SDLRSRG—Restorefullsetofregisters$‰INTSVRG—Andstacktheinterruptset4‰BRA.L…INTEXITAndgoseeifanotherinterruptpends ‰PAGE *%* Transmitter Empty Interrupt Handler***ˆOUTPUT2NDNULLCHAR*-TXMST4ƒMOVE.B„#$00,NECDAT_BOUTPUTAPADNULL*‰LEA‡TXMST5(PC),A2‡SETNEXTVECTOREDSTATE‰MOVE.L„A2,SDPVCT1(A1)‰MOVE.B„#NCW0EOI,NECCTL_A‰BRA.L…INTEXIT ‰PAGE # *%* Transmitter Empty Interrupt Handler**E*ˆTxMITSHUTDOWNWITHPOLLBITSETINCOMMAND(NOTNECESSARILY!E.S.)*=TXMST5ƒMOVE.B„#NCW0EOI,NECCTL_ALETSSAVEALLTHEUSER'SREGSTXMENDƒINTRSRG‰SDLSVRG‰MOVE.L„SDLCPCB,A6RESTOREREGS‰MOVEM.LƒSDPRRTA0(A6),A0-A6‰ADD.W…#1,SDSHCTEN(A4)…3/2/83"‰BRA.L…TRANSPBƒEXIT(POLLBITSET) ‰PAGE *#* External Status Interrupt Handler**8*ˆEXTERNALSTATUSINTERRUPTHANDLERWHICHISUSEDDURING*’1)LEADINGPADTRANSMISSION,+*’2)TRANSMISSIONOFTHEADDRESSFIELD,AND*’3)TRAILINGPADTRANSMISSION.@*ˆINALLTHREECASES,"UNDERRUN"INDICATIONSAREIGNOREDASWELL=*ˆASALLOTHERCONDITIONSEXCEPTFORAFALLOFCLEARTOSEND.*0TXMSTEI‚MOVE.B„NECCTL_B,D0‰GETTHECHIP'SSTATUS/‰MOVE.B„#NCW0REX,NECCTL_BƒRESETEXTERNALSTATUS.‰MOVE.B„#NCW0EOI,NECCTL_AƒANDENDOFINTERRUPT‰MOVE.L„SDPRRTA4(A1),A2…3/2/83‰ADD.W…#1,SDSHCEXA(A2)…3/2/83?‰BTST.L„#5,D0…CTSfall?‚Ifyes,thenmustassumeframesentOK,=‰BEQ.S…TXMEND„We"assume"pollbitsent,andgointorcvnow.I* CTS did not drop, so we ignore the External Status Interrupt completely‰BRA.L…INTEXIT ‰PAGE *%* Transmitter Empty Interrupt Handler*F* This state is to be used when transmitter interrupts are supposed toE*beoff,orareotherwisenotexpected.‚Ifonehappenswhileinthis-* state, the system is intentionally crashed.* 2TXMSTOFFCRASH.Tƒ*+1‘FailwithanAddressingError 1*************************************************1* END OF FILE 'FIX:48.SDLCPRI.TRANSMIT.AI' *1*************************************************ééééééééé$ éééééééééééééééé$ éééééééééééééééé% éééééééééééééééé% éééééééééééééééé& éééééééééééééééé& éééééééééééééééé' éééééééééééééééé' éééééééééééééééé( éééééééééééééééé( éééééééééééééééé) éééééééééééééééé) éééééééééééééééé* éééééééééééééééé* éééééééééééééééé+ éééééééééééééééé+ éééééééééééééééé, éééééééééééééééé, éééééééééééééééé- éééééééééééééééé- éééééééééééééééé. éééééééééééééééé. éééééééééééééééé/ éééééééééééééééé/ éééééééééééééééé0 éééééééééééééééé0 éééééééééééééééé1 éééééééééééééééé1 éééééééééééééééé2 éééééééééééééééé2 éééééééééééééééé3 éééééééééééééééé3 éééééééééééééééé4 éééééééééééééééé4 éééééééééééééééé5 éééééééééééééééé5 éééééééééééééééé6 éééééééééééééééé6 éééééééééééééééé7 éééééééééééééééé7 éééééééééééééééé8 éééééééééééééééé8 éééééééééééééééé9 éééééééééééééééé9 éééééééééééééééé: éééééééééééééééé: éééééééééééééééé; éééééééééééééééé; éééééééééééééééé< éééééééééééééééé< éééééééééééééééé= éééééééééééééééé= éééééééééééééééé> éééééééééééééééé> éééééééééééééééé? éééééééééééééééé? éééééééééééééééé@ éééééééééééééééé@ ééééééééééééééééA ééééééééééééééééA ééééééééééééééééB ééééééééééééééééB ééééééééééééééééC ééééééééééééééééC ééééééééééééééééD ééééééééééééééééD ééééééééééééééééE ééééééééééééééééE ééééééééééééééééF ééééééééééééééééF ééééééééééééééééG ééééééééééééééééG ééééééééééééééééH ééééééééééééééééH ééééééééééééééééI ééééééééééééééééI ééééééééééééééééJ ééééééééééééééééJ ééééééééééééééééK ééééééééééééééééK ééééééééééééééééL ééééééééééééééééL ééééééééééééééééM ééééééééééééééééM ééééééééééééééééN ééééééééééééééééN ééééééééééééééééO ééééééééééééééééO éééééééééééééééé