IMD 1.17: 11/11/2014 12:13:15 82VKXSVRDOS B* VERSADOS/RMS68K SRC/OBJ 4.4 (NOT BOOTABLE) SN=49367 29 OF 30  SR29q82VKXSVRDOS 0420§`-rrINET LOELrrLOADV2 LO’ rrNETV2B SY�€rr$INET†IDNTƒ3,0�Initialization�and�NTS***ˆCOPYRIGHTED�1982,�1983�BY�MOTOROLA,�INC.*E* 06/13/83 The appropriate CHIPTYPE module, either M68000.CHIPTYPE.SA=*„or�M68010.CHIPTYPE.SA�must�be�included�via�concatenation�on?*„the�'=ASM�'�command�line�to�set�the�assembler�mode�for�M68000@*„or�M68010�and�to�set�the�CHIPTYPE�equate�to�68000�or�68010�for#*„condition�assemblies�that�follow.A*„Two�versions�of�INET�may,�therefore,�exist,�one�for�the�MC68000=*„MPU,�and�the�other�for�the�MC68010.‚The�'.RO'�files�createdA*„should�be�named�M68000.INET.RO�and�M68010.INET.RO�respectively.*E*„This�addition�allows�conditional�code�sections�both�directly�withinC*„this�file,�and�also�within�macros�which�are�INCLUDEd,�to�generateC*„code�according�to�the�target�processor.‚Specifically,�the�MC68010F*„does�not�allow�the�"MOVE�SR,-(A7)"�instruction�in�user�mode.‚Rather,D*„the�"MOVE�CCR,-(A7)"�instruction�must�be�used.‚Unfortunately,�thisC*„latter�instruction�does�not�exist�on�the�68000,�and�so�the�formerA*„must�be�assembled.‚Choosing�"MOVE�SR,-(A7)"�or�"MOVE�CCR,-(A7)"C*„is�controlled�by�the�CHIPTYPE�symbol,�whose�value�is�either�68000 *„or�68010.*@*„The�NOPROC�macro�(from�0.INET.EQ)�uses�this�macro�to�determine=*„how�the�condition�code�values�are�to�be�saved�on�the�stack.*F*v******************************************************************** * INETEX Task*Ä*,*„Initialization�Task�for�Network�Services˜**Ä*F*�1.‚Get�Data�Segment�'DATA'�for�staging�parameters�prior�to�inserting$*‡in�SYSPAR.‚Clear�the�data�segment.B*‡If�the�network�is�already�up,�issue�a�message�and�then�go�to�15.**?*�2.‚Create�SSCT�(System�Service�Control�Task).‚It�will�consist8*‡of�the�segment�SSCT�and�contain�the�following�modules:)*ŠNTS.SSCT.ROˆSystem�service�control�task**ŠNTS.NWCT.ROˆNetwork�service�control�task!*Š0.&.EDT.RO‰Edit�Device/Filename0*Š0.&.COD.RO‰Character�classification�code�table%*ŠTEST.OUTTERMS.ROƒOutput�to�terminal;*ŠNTS.NTSSERV.RO…Subroutine�-�Interface�to�network�services,(D0?8D@>H>PGXA`<h *†Entry�point�=�SSCT.*@*�3.‚Create�NWCT�(Network�control�task).‚It�also�consists�of�the#*‡segment�SSCT.‚Entry�point�=�NWCT.**�4.‚Release�the�segment�'SSCT'*B*�5.‚Get�the�station�ID�via�GETSTA�subroutine�call�and�save�the�ID *‡in�XSTATION�of�'DATA'�segment.*G*�6.‚Calculate�Size�of�Network�Name�Table�and�Logical�Connection�Table.;*‡Save�calculated�size�in�data�segment�as�size�of�data�area *‡for�STRTSN.*C*�7.‚Allocate�and�clear�'.NTW'�segment�according�to�size�calculated *‡in�step�4.*A*�8.‚Build�Network�Name�Table�and�Logical�Connect�Table�in�'.NTW'4*‡segment�via�NTBLDTB�entry�point�in�NTBLDTB�module.*A*�9.‚Configure�TRAP�#1�(code�=�-1)�directive�to�do�the�following:*;*‡A.�Remove�'.NTW'�segment�and�'SDLC'�segment�from�INETEX's:*Œtask�segment�table.‚These�segments�will�not�be�reclaimed'*Œby�the�system�when�INETEX�terminates.*;*‡B.�Save�pointers�to�tables�in�SYSPAR�area.‚These�pointers6*Œare�in�the�former�'.NTW'�segment.‚The�pointers�saved*Œare:*�NNTBEG‚-�Network�Name�table *�NATBEG‚-�Network�Address�table#*�LCTBEG‚-�Logical�Connection�table&*�DBUFSZ‚-�Size�of�data�area�in�buffer*8*‡C.�Save�TCB�addresses�of�SSCT�and�NWCT�in�NAT�and�LCT.*-* 10. Configure TRAP #1 directives -2 and -3.*:* 11. Inovke the TRAP #1 directive configured (code = -1).*1* 12. Disable the TRAP #1 directive just invoked.*3* 13. Start the SSCT (System Service Control Task).*,* 14. Start the NWCT (Network Control Task).** 15. Terminate.F*^***********************************************************************‰INCLUDE�9995.&.TR1.EQ*‰INCLUDE�9995.&.TCB.EQ*‰INCLUDE�9995.NTS.NNT.EQ*‰INCLUDE�9995.NTS.NAT.EQ*‰INCLUDE�9995.NTS.LCT.EQ!*‰INCLUDE�9995.SDLCPRI.TEMPLTS.EQ*‰INCLUDE�9995.NTS.TR1X.EQ*‰LIST*‰INCLUDE�9995.INET.INET.EQŠNOLISTŠINCLUDE�9995.&.TR1.EQŠINCLUDE�9995.&.TCB.EQŠINCLUDE�9995.NTS.NNT.EQŠINCLUDE�9995.NTS.NAT.EQŠINCLUDE�9995.NTS.LCT.EQ ŠINCLUDE�9995.SDLCPRI.TEMPLTS.EQŠINCLUDE�9995.NTS.TR1X.EQŠLISTŠINCLUDE�9995.INET.INET.EQ ŠTTL„INET.SAŒNetwork�InitializerŠPAGE ŠSECTION�8B‰EQU„**ŠOPT„PCS)ŠXREFƒSYSTYPEŒSatisfied�in�IDLCP�seg�INET,ŠXREFƒGETSTA�Satisfied�in�GETSTA.RO�seg�INET,ŠXREFƒMAXLNAUŒSatisfied�in�INETP.RO�seg�INET,ŠXREFƒMAXNAMEŒSatisfied�in�INETP.RO�seg�INET,ŠXREFƒMAXCONNŒSatisfied�in�INETP.RO�seg�INET+ŠXREFƒSZDBUF�Satisfied�in�IBUFQ.RO�seg�INET.ŠXREFƒBEGSDLCŒSatisfied�in�BEGSDLC.RO�seg�SDLC*ŠXREFƒNWTESTAD‹Satisfied�in�INET.NWTEST.RO#ŠXREFƒNWPSEG�Satisfied�in�SYSPAR.RO#ŠXREFƒNWTSEG�Satisfied�in�SYSPAR.RO,ŠXREFƒOUTTERMS‹Satisfied�in�INET.OUTTERMS.RO(ŠXREFƒSSCT�Satisfied�in�SSCT.RO�seg�SSCT(ŠXREFƒNWCT�Satisfied�in�NWCT.RO�seg�SSCT.ŠXREFƒDLCBLDCB‹Satisfied�in�ISSDLC.RO�seg�INET/ŠXREFƒSBINFRBF‹Satisfied�in�IBUFMGT.RO�seg�INET.ŠXREFƒNTBLDTBŒSatisfied�in�NTBLDTB.RO�seg�INET-ŠXREFƒSTRTADRŒSatisfied�in�SRSNEX.RO�seg�INET-ŠXREFƒDLNKRQDŒSatisfied�in�SRSNV2.RO�seg�INET,ŠXREFƒNTSREQ�Satisfied�in�NTSREQ.RO�seg�SDLC/ŠXREFƒTRASCANŒSatisfied�in�TRANSSCN.RO�seg�SSCT+ŠXREFƒMAXSEC�Satisfied�in�IDLCP.RO�seg�INET+ŠXREFƒNUMBUF�Satisfied�in�IBUFQ.RO�seg�INET+ŠXREFƒFQULWM�Satisfied�in�IBUFQ.RO�seg�INET*SSCSESSN‚DC.LƒSSCSESSNWCSESSN‚DC.LƒNWCSESS*-* Dynamically stuff certain Parameter Blocks. ININET„EQU„*&ŠERQ.GTSEG�GETDPB(PC)†Get�data�segment#ŠBEQ.S‚ININ2ŽBranch�if�good�segmentŠERRMESG%GETDPB„DC.Lƒ0,0�Task,Session�(0=Self) ŠDC.Wƒ$2000,0ŒLogical�=�PhysicalŠDC.Lƒ'DATA',0‹Segment�nameŠDC.LƒDATAENDŒLength** Clear DATA Segment*CLEAR…CLR.L‚(A0)+ŽClear�4�bytesŠCMP.L‚A0,A1Žat�end�yet?ŠBGT„CLEARŽbranch�in�NOŠRTS*6ININ2…MOVE.L�A0,A6ŽStart�of�DATA�segment�(A6=base�reg)#ŠLEA„STACK(A6),A7‡Set�Stack�PointerŠMOVE.L�A7,A0ŽClear�above�stack'ŠLEA„DATAEND(A6),A1…End�of�DATA�segmentŠBSR„CLEARŽClear�entire�segmentŠPAGE*#* See if the network is already up..ŠMOVE.W�#NWTEST,CDIRPB(A6)�Directive�#�in�P.B.(ŠLEA„NWTESTAD(PC),A0„Start�of�directive.%ŠMOVE.L�A0,CDIRPBE(A6)…Put�it�in�P.B.)ŠERQ.CDIR�CDIRPB(A6)‡Configure�directive. ŠBEQ.S‚ININ2.5ŠERRMESG*+* Invoke directive that we just configured.ININ2.5ƒMOVE.L�#NWTEST,D0ŠTRAPƒ#1ŠIFEQƒCHIPTYPE-680006ŒMOVE.W�SR,-(A7)‹Save�status�register�for�later�check.ŠENDCŠIFEQƒCHIPTYPE-680107ŒMOVE.W�CCR,-(A7)ŠSave�status�register�for�later�check.ŠENDC-* Deconfigure directive that we just invoked.7ŠBSETƒ#5,CDIRPBO+1(A6)ƒSet�option�to�disable�directive.ŠERQ.CDIR�CDIRPB(A6)*<ŠMOVE.W�(A7)+,CCRŠReset�condition�codes�to�directive�results,ŠBEQ.S‚NETNOTUP‹Branch�if�network�is�not�up.*----v2ŠNOPROC.ININ2.7�LINKONLYƒDon't�process�if�'INETV2'5ŠMSGOUT� ŠBRA„DONE*----^ININ2.7ƒERRMESG*NETNOTUP‚EQU„*9ŠBCLRƒ#5,CDIRPBO+1(A6)ƒClear�option�to�disable�directive.ŠPAGE*----v0ŠNOPROC.ININ4�LINKONLY…Don't�process�if�'INETV2'*(* Create the System Service Control Task*8ŠERQ.RCVSA�RCVSAPB(PC)…Get�segment�addr�for�SSCT�segment"ŠBEQ.S‚ININ3ŽBranch�if�good�returnŠERRMESG8RCVSAPBƒDC.Lƒ0,0�RCVSA�param�block�-�task,�session(self)2ŠDC.Wƒ$2000,0Œoption-return�start�addr�in�A0,�attrŠDC.LƒSSCTASKŒSegment�name*-ININ3…MOVE.L�A0,A1ŽSave�segment�start�address1ŠERQ.DCLSHR�DCLSHPB(PC)„Declare�segment�shareable#ŠBEQ.S‚ININ3A�Branch�if�good�returnŠERRMESG*9ININ3A„MOVE.L�#SSCTASK,CRTCBPB(A6)�Task�name�of�SSCT�task3ŠMOVE.L�SSCSESSN,CRTCBPB+4(A6)�Session�of�SSCT�taskDŠMOVE.W�#$B800,CRTCBPBA(A6)�Attr-syst�task,mem�dump,position�indepdt)ŠMOVE.W�#$7F7F,CRTCBPBP(A6)�Task�priority%ŠMOVE.L�A1,CRTCBPBE(A6)„Entry�address0ŠERQ.CRTCB�CRTCBPB(A6)…Create�Task�Control�Block#ŠBEQ.S‚ININ3B�Branch�if�good�returnŠERRMESG*#* Share procedure segment with SSCT*8ININ3B„STACKPB�SHRSG1PB,16‡Move�'Share�seg'�P.B.�to�ROM'ŠMOVE.L�SSCSESSN(PC),A20ŠMOVE.L�A2,4(A0)‹Plug�in�correct�session�number.'ŠERQ.SHRSEG�,ŽGive�the�segment�to�SSCT.ŠUSTACKPB�16�Restore�the�stack#ŠBEQ.S‚ININ3C�Branch�if�good�returnŠERRMESG** Create Network Control Task**9ININ3C„MOVE.L�#NWCTASK,CRTCBPB(A6)�Task�name�of�NWCT�task3ŠMOVE.L�NWCSESSN,CRTCBPB+4(A6)�Session�of�NWCT�task#ŠADD.L‚#NWCT-SSCT,A1†Add�NWCT�entry%ŠMOVE.L�A1,CRTCBPBE(A6)„Entry�address0ŠERQ.CRTCB�CRTCBPB(A6)…Create�Task�Control�Block#ŠBEQ.S‚ININ3F�Branch�if�good�returnŠERRMESG*#* Share procedure segment with NWCT*7ININ3F„STACKPB�SHRSG2PB,16‡Move�'Share�seg'�P.B.�to�ROMŠMOVE.L�NWCSESSN(PC),A20ŠMOVE.L�A2,4(A0)‹Plug�in�correct�session�number.'ŠERQ.SHRSEG�,ŽGive�the�segment�to�NWCT.ŠUSTACKPB�16�Restore�stack.#ŠBEQ.S‚ININ3G�Branch�if�good�returnŠERRMESG*;ININ3G„ERQ.DESEG�DESEGPB(PC)…ININET�no�longer�needs�segment"ŠBEQ.S‚ININ4ŽBranch�if�good�returnŠERRMESG*#DCLSHPBƒDC.Lƒ0,0�DCLSHR�param�block%ŠDC.Wƒ$8000Žoption�(attributes�given)/ŠDC.Wƒ$6000Žattr�(read�only,�locally�shareable)ŠDC.LƒSSCTASKŒSegment�name*BSHRSG1PB‚DC.LƒSSCTASK,0ŠSHRSEG�param�block�-�task,�sess�is�dynamic)ŠDC.Wƒ$2000Žoption(logical�addr=physical)$ŠDC.Wƒ$2000Žattr�(locally�shareable)ŠDC.LƒSSCTASKŒSegment�name*BSHRSG2PB‚DC.LƒNWCTASK,0ŠSHRSEG�param�block�-�task,�sess�is�dynamic)ŠDC.Wƒ$2000Žoption(logical�addr=physical)$ŠDC.Wƒ$2000Žattr�(locally�shareable)ŠDC.LƒSSCTASKŒSegment�name*1DESEGPBƒDC.Lƒ0,0�DESEG�param�block�-�task�is�self ŠDC.Wƒ0,0�options�and�attributesŠDC.LƒSSCTASKŒSegment�nameŠPAGE*----^ ININ4…EQU„**7* Get station ID and save in XSTATION of 'DATA' segment ŠBSR„GETSTA2ŠBEQ.S‚ININ6ŽBranch�if�station�successfully�gottenŠERRMESGININ6…MOVE.B�D1,XSTATION(A6)*----v3ŠNOPROC.ININ6.5�LINKMAINƒDo�not�process�if�'INETEX'*@* Calculate Size of Primary and Secondary Station Control Blocks*7ŠMOVE.L�#SDPLNG+255,D0…Primary�Station�Control�Blk�sizeŠCLR.B‚D0‘Even�#�pages6ŠMOVE.L�D0,XSDPRSZ(A6)…Save�Primary�Control�Block�size5ŠMOVE.L�#SDSLNG,D1‰Secondary�Station�Control�Blk�size+ŠMULUƒMAXSEC(PC),D1†*�number�of�secondaries'ŠBEQ.S‚ININ6.5ŒBranch�if�NO�secondaries<ŠMOVE.L�D0,XSDSCBG(A6)…Offset�to�start�of�Sec�Control�Blocks/ŠADD.L‚#256,D1ŒMake�sure�end�is�on�page�boundryŠCLR.B‚D1‘Even�#�pages 8ŠMOVE.L�D1,XSDSCSZ(A6)…Save�Secondary�Control�Block�Size&ŠADD.L‚D1,D0ŽAdd�to�total�segment�size*----^ ININ6.5ƒEQU„**----v0ŠNOPROC.ININ8�LINKONLY…Don't�process�if�'INETV2'C* Calculate Size of Network Name Table and Logical Connection Table*,ŠMOVE.L�D0,XNNTBG(A6)†Offset�to�start�of�NNT*ŠMOVE.W�MAXNAME(PC),D1…Max�#�Network�Names1ŠMULUƒ#NNTESIZ,D1ˆ*�Network�Name�Table�entry�size0ŠADD.L‚#NNTENTRY+255,D1ƒ+�NNT�Header�size�+�pageŠCLR.B‚D1‘Even�#‚pages#ŠMOVE.L�D1,XNNTSZ(A6)†Save�NNT�size&ŠADD.L‚D1,D0ŽAdd�to�total�segment�size*,ŠMOVE.L�D0,XNATBG(A6)†Offset�to�start�of�NAT(ŠMOVE.W�MAXLNAU(PC),D1…Max�#�local�NAU's4ŠMULUƒ#NATESIZ,D1ˆ*�Network�Address�Table�entry�size0ŠADD.L‚#NATENTRY+255,D1ƒ+�NAT�Header�size�+�pageŠCLR.B‚D1‘Even�#‚pages#ŠMOVE.L�D1,XNATSZ(A6)†Save�NAT�size&ŠADD.L‚D1,D0ŽAdd�to�total�segment�size*,ŠMOVE.L�D0,XLCTBG(A6)†Offset�to�start�of�LCT0ŠMOVE.W�MAXCONN(PC),D1…Max�#�Logical�Connections"ŠMULUƒ#LCTESIZ,D1ˆ*�LCT�entry�size+ŠADD.L‚#LCTENTRY+255,D1ƒ+�LCT�Header�+�pageŠCLR.B‚D1‘Even�#�pages#ŠMOVE.L�D1,XLCTSZ(A6)†Save�LCT�size&ŠADD.L‚D1,D0ŽAdd�to�total�segment�size*----^ ININ8…EQU„*ŠPAGE*"* Calculate free buffer queue size**----v2ŠNOPROC.ININ10�LINKMAIN„Do�not�process�if�'INETEX'ŠMOVE.L�D0,XFBQBG(A6)*----^ ININ10„EQU„*1ŠMOVE.L�#1,D1ŽMake�sure�data�area�is�even�#�words5ŠADD.W‚SZDBUF(PC),D1†Size�of�data�area�in�each�bufferŠBCLRƒ#0,D1ŽEven�word�boundry8ŠMOVE.W�D1,XFBQDSZ(A6)…Save�size�of�data�area�for�STRTSN**----v2ŠNOPROC.ININ11�LINKMAIN„Do�not�process�if�'INETEX'8ŠADD.L‚#SDDLNG,D1‰Size�of�Header�attached�to�each�buffer'ŠMULUƒNUMBUF(PC),D1†*�Number�of�buffers3ŠADD.L‚#255,D1ŒMake�sure�total�size�is�even�#�pagesŠCLR.B‚D1‘Even�#�pages,ŠMOVE.L�D1,XFBQSZ(A6)†Save�Buffer�Queue�size&ŠADD.L‚D1,D0ŽAdd�to�total�segment�size0ŠMOVE.W�NUMBUF(PC),XFQBCNT(A6)�Number�of�buffers7ŠMOVE.W�FQULWM(PC),XFQLWM(A6)�Save�minimum�buffer�count*----^ ININ11„EQU„*** Allocate .NTW Segment*>ŠMOVE.W�#$2000,GETSPBO(A6)�Option�(Logical�addr=Physical�addr)(ŠMOVE.L�#'.NTW',GETSPBN(A6)�Segment�name%ŠMOVE.L�D0,GETSPBL(A6)…Segment�length&ŠERQ.GTSEG�GETSPB(A6)†Get�.NTW�segment$ŠBEQ.S‚ININ12�Branch�if�good�segmentŠERRMESG*1* Add Segment Address to each Begin Block address*,ININ12„MOVE.L�A0,A5ŽStarting�Address�of�.NTW&ŠMOVE.L�A0,D0ŽStarting�Address�of�.NTW*----v1ŠNOPROC.ININ12.3�LINKONLY‚Don't�process�if�INETV2'ŠADD.L‚D0,XNNTBG(A6)†Network�Name�Table*ŠADD.L‚D0,XNATBG(A6)†Network�Address�Table-ŠADD.L‚D0,XLCTBG(A6)†Logical�Connection�Table*----^ININ12.3‚EQU„**----v4ŠNOPROC.ININ12.5�LINKMAIN‚Do�not�process�if�'INETEX'3ŠADD.L‚D0,XSDPRBG(A6)…Primary�Station�Control�Block5ŠADD.L‚D0,XSDSCBG(A6)…Secondary�Station�Control�Block&ŠADD.L‚D0,XFBQBG(A6)†Free�Buffer�QueueININ12.5‚EQU„**----^** Clear .NTW Segment*#ŠMOVE.L�GETSPBL(A6),A1…Segment�sizeŠADD.L‚A0,A1Ž+�Start�=�endŠBSR„CLEARŽClear�segment8ŠERQ.RCVSA�RCVSSPB(PC)…Get�segment�addr�for�SDLC�segment#ŠBEQ.S‚ININ18�Branch�if�good�returnŠERRMESG8RCVSSPBƒDC.Lƒ0,0�RCVSA�param�block�-�task,�session(self)2ŠDC.Wƒ$2000,0Œoption-return�start�addr�in�A0,�attrŠDC.Lƒ'SDLC'�Segment�name*3ININ18„MOVE.L�A0,XBEGSDLC(A6)„Save�start�of�segment*----v4ŠNOPROC.ININ18.5�LINKMAIN‚Do�not�process�if�'INETEX'*,* Build Primary and Secondary Control Blocks*ŠBSR„DLCBLDCB‹Go�build�them** Build Free Buffer Queue*5ŠMOVE.L�XFBQBG(A6),A0†Address�of�Start�of�Buffer�PoolŠMOVE.L�A0,A1Ž*ŠADD.L‚XFBQSZ(A6),A1†**ŠSUB.L‚#1,A1ŽAddress�of�End�of�Buffer�PoolŠBSR.L‚SBINFRBF‹*ŠMOVE.W�D1,XFQBCNT(A6)…**----^ININ18.5‚EQU„**----v1ŠNOPROC.ININ19�LINKONLY„Don't�process�if�'INETV2'*4* Build Network Name Table and Logical Connect Table*ŠBSR„NTBLDTBŒGo�build�them*----^ ININ19„EQU„*ŠPAGE*'* Configure New TRAP #1 Exec Directives**ˆDirectiveƒFunction<*ˆ---------ƒ------------------------------------------------8*‰NWINET…Network�Startup�--�Will�save�pointers�to�tables 0*”and�buffer�queue,�delete�the�.NTW�segment�from1*”ININET's�segment�table,�and�call�SDLC's�Startup *”routine.**3ŠMOVE.L�#SSCTASK,XSSCTSK(A6)�Task�name�of�SSCT�task1ŠMOVE.L�SSCSESSN,XSSCSES(A6)�Session�of�SSCT�task3ŠMOVE.L�#NWCTASK,XNWCTSK(A6)�Task�name�of�NWCT�task1ŠMOVE.L�NWCSESSN,XNWCSES(A6)�Session�of�NWCT�task*9ŠMOVE.W�#NWINET,CDIRPB(A6)�Put�directive�#�in�param�block+ŠLEA„STRTADR(PC),A0…Directive�ENTRY�address,ŠMOVE.L�A0,CDIRPBE(A6)…Put�it�in�param�block(ŠERQ.CDIR�CDIRPB(A6)‡Configure�directive ŠBEQ.S‚ININ28ŠERRMESG ININ28„EQU„**----v=ŠNOPROC.ININ29�NOLINK,LINKALL,LINKMAIN�Process�only�if�INETV2*#* Execute Network Startup directive*ŠMOVE.L�#NWINET,D0‰Directive�#ŠTRAPƒ#1‘Go�do�the�startup%ŠBEQ.S‚ININ28.5‹Branch�if�good�returnŠERRMESG*6* Disable the Startup directive -- won't need it again*>ININ28.5‚BSETƒ#5,CDIRPBO+1(A6)ƒSet�option�to�disable�directive9ŠMOVE.W�#NWINET,CDIRPB(A6)�Put�directive�#�in�param�block&ŠERQ.CDIR�CDIRPB(A6)‡Disable�directiveŠPAGE?***************************************************************:* This directive calls a routine that runs in a continuous;* loop looking at V2RQHD (VM02 Request Queue). When an item=* appears in the queue, it pulls it off, examines the command** and calls the appropriate SCLC function.**‰Command“Function*‹NTWCACKR�($A1)ŒSBUSRACK*‹NTWFLUSH�($A2)ŒSBSDLCFL*‹QUSBRQƒ($01)ŒSDLCQUSB*5*****************************************************/DLKREQ„EQU„-1‘User�configured�directive�number.** Configure a directive.*7ŠMOVE.W�#DLKREQ,CDIRPB(A6)�Put�directive�number�in�P.B.,ŠLEA„DLNKRQD(PC),A0…Directive�entry�address.1ŠMOVE.L�A0,CDIRPBE(A6)…Put�it�in�parameter�block.2ŠCLR.W‚CDIRPBO(A6)ˆSet�option�to�disable�directive7ŠLEA„CDIRPB(A6),A0†Configure�directive�parameter�block.ŠMOVE.L�#CDIR,D0ŠTRAPƒ#1‘Configure�directive ŠBEQ.S‚OK1ŠERRMESG** Invoke the directive.OK1‡MOVE.L�#DLKREQ,D0ŠTRAPƒ#1*----^ ININ29„EQU„**----v/ŠNOPROC.DONE�LINKONLY†Don't�process�if�'INETV2'**ˆDirectiveƒFunction<*ˆ---------ƒ------------------------------------------------)*‰NWRQST…Network�Services�Request�Handler.*”Responds�to�TRAP�#1's�from�application�tasks**9ŠMOVE.W�#NWRQST,CDIRPB(A6)�Put�directive�#�in�param�block-ŠMOVE.L�XBEGSDLC(A6),A0„Start�of�SDLC�segment1ŠADD.L‚#NTSREQ-BEGSDLC,A0�Directive�ENTRY�address,ŠMOVE.L�A0,CDIRPBE(A6)…Put�it�in�param�block2ŠBSETƒ#4,CDIRPBO+1(A6)ƒSet�option�-�use�by�anybody(ŠERQ.CDIR�CDIRPB(A6)‡Configure�directive)ŠBEQ.S‚ININ32�Branch�if�successful�returnŠERRMESG**ˆDirectiveƒFunction<*ˆ---------ƒ------------------------------------------------=*‰NWTSCN…Scan�USER�queue�to�move�data�received�to�destination$*”Check�'wait-for-buffers'�Q�-�retry**?ININ32„MOVE.W�#NWTSCN,CDIRPB(A6)�Put�directive�#�in�param�block-ŠMOVE.L�XBEGSDLC(A6),A0„Start�of�SDLC�segment2ŠADD.L‚#TRASCAN-BEGSDLC,A0�Directive�entry�address,ŠMOVE.L�A0,CDIRPBE(A6)…Put�it�in�param�block9ŠBCLRƒ#4,CDIRPBO+1(A6)ƒSet�option�-�use�by�this�sess�only(ŠERQ.CDIR�CDIRPB(A6)‡Configure�directive)ŠBEQ.S‚ININ36�Branch�if�successful�returnŠERRMESG*#*ˆExecute�Network�Startup�directive*$ININ36„MOVE.L�#NWINET,D0‰Directive�#ŠTRAPƒ#1‘Go�do�the�startup#ŠBEQ.S‚ININ40�Branch�if�good�returnŠERRMESG*6* Disable the Startup directive -- won't need it again**�of�VM02�or�VMES10.‚The�different�assembles�are�controlled�byB* concatenating either VM02.STRSDLC.SA or VMES10.STRSDLC.SA to the)* assembly of this module (&.STRSDLC.SA).** Two variables areL*�used�to�control�conditionally�assembled�sections�herein.‚The�symbol�TYPEBDK*�determines�whether�the�target�system�is�a�VM02�or�a�VME/10.‚TYPEBD�may�beI*�either�02�(for�VM02),�or�10�(for�VME/10).‚Additionally,�since�on�eitherN* board, the specific vector number is still a function of hardware strapping,I* the second variable, VEC7201, designates (for the VM02) where in memoryJ* the vector number exists, or (for the VME/10) what the vector number is.8* This variable is XREF'ed and satisfied at sysgen time.*^*‰IFNE†TYPEBD-02‹IFNE†TYPEBD-10<�FAIL†1�Invalid�board�type,�must�be�02�(VM02)�or�10�(VME/10)‹ENDC‰ENDC ŠXDEFƒSTRSDLC*.ŠXREFƒBEGSDLCŒSatisfied�in�BEGSDLC.RO�seg�SDLCŠXREFƒPWRUP,PORTAIOŠXREFƒINT7201,INT7201AŠXREFƒTRACEBEG,TRACFLAGŠXREFƒSYSTYPE,VEC7201*'HDIOTSKƒEQU„'HDIO'�I/O�TASK'S�TASK�NAME HDIOSESƒEQU„1’I/O�TASK'S�SESSION,SEGNAM„EQU„'DATA'�SEGMENT�WHERE�CCB'S�RESIDE**ˆFind�HDIO�task* STRSDLCƒEQU„*;ŠMOVE.B�SYSTYPE(PC),D0…See�if�we�really�need�to�start�or�if&ŠAND.B‚#NOLINK,D0‰we�are�just�a�dummy.*ŠBEQ.S‚REALSTRT‹Branch�if�we�are�not�dummyŠRTS—Dummy�return*;REALSTRT‚MOVE.L�XSDPRBG(A4),A3…SDLC's�Primary�Control�Block-ŠLEA„IONAM(PC),A0‡Pointer�to�task�and�session ŠTR0$.GETTCB"ŠBRA.S‚STRS4ŽBranch�if�good�return"ŠBRA„STRS40�Branch�if�NO�TCB�found*IONAM…DC.LƒHDIOTSK,HDIOSES*"STRS4…MOVE.L�A0,A5ŽI/O�TCB�Address#ŠMOVE.W�#SEGMENTS-1,D0…LOOP�COUNTER"ŠMOVE.L�TCBTST(A5),A1†Start�of�TST/ŠLEA„TSTMMU(A1),A2†Start�of�segment�definitionsŠMOVE.L�#SEGNAM,D1‰Segment�name*STRS6…CMP.L‚TSTANAME(A2),D1„Look�for�matchŠBEQ.S‚STRS10�Branch�if�foundŠLEA„TSTCTL+2(A2),A2„Next�entryŠDBRAƒD0,STRS6‹Loop�back ŠBRA„STRS40*,*‡Initialize�Port�A�vector�to�go�to�I/O�task*STRS10„CLR.L‚D0"ŠMOVE.W�TSTLB(A2),D0‡Segment�start'ŠADD.W‚TSTPO(A2),D0‡Add�physical�offset$ŠLSL.L‚#8,D0ŽConvert�page�to�address'ŠMOVE.L�D0,A0ŽPut�address�in�A�Register3ŠCMP.L‚#'VM02',CCBTYPE(A0)�Is�this�the�CCB�address?ŠBNE„STRS40�Branch�if�NO)ŠLEA„CCBSDLC(A0),A1…Address�of�flag�byte.0ŠMOVE.B�#1,D1ŽValue�to�place�in�flag�byte�later.-ŠMOVE.B�#1,CCBSDLC(A0)…FLAG�-�SDLC�is�present1ŠLEA„CCBSREG(A0),A0…Where�to�save�status�register=STRS14„MOVE.L�A0,SDPCCBA(A3)…Save�it�in�Primary�Control�Block-ŠMOVE.L�XBEGSDLC(A4),A0„Start�of�SDLC�segment8ŠADD.L‚#PORTAIO-BEGSDLC,A0�Address�of�Port�A�I/O�routine**ˆSave�Port�A�interrupt�address*STRS20„MOVE.L�A0,SDPVCT5(A3)ŠMOVE.L�A0,SDPVCT6(A3)ŠMOVE.L�A0,SDPVCT7(A3)ŠMOVE.L�A0,SDPVCT8(A3)**ˆClaim�vector* ŠCLR.L‚D0ŠIFEQƒTYPEBD-02$ŒMOVE.W�VEC7201,D0ˆGet�vector�numberŒBNE.S‚STRS24�Branch�if�set4ŒMOVE.W�#VECTVM2,D0ˆVector�to�use�if�not�already�setŒMOVE.W�D0,VEC7201ˆTell�VM02ŠENDCŠIFEQƒTYPEBD-10%ŒMOVE.W�#VEC7201,D0‡Get�vector�numberŠENDC5STRS24„LSL.L‚#2,D0Žvector�number�*�4�=�vector�address(ŠMOVE.L�D0,A2ŽNeed�address�in�A�register-ŠMOVE.L�(A2),SDPVE CT(A3)ƒSave�current�address/ŠMOVE.L�XBEGSDLC(A4),A0„*�Start�of�SDLC�segment1ŠADD.L‚#INT7201-BEGSDLC,A0�SDLC�Interrupt�address"ŠMOVE.W�#$2700,SRŠMask�interrupts."ŠMOVE.B�D1,(A1)ŒFlag�SDLC�as�here.&ŠMOVE.L�A0,(A2)ŒSet�interrupt�address.$ŠMOVE.W�#$2700,SRŠUnmask�interrupts.%ŠMOVE.L�A0,(A2)ŒSet�interrupt�address*'*ˆModify�trace�table�if�trace�requested*(ŠBTSTƒ#0,TRACFLAG+1†Was�trace�requested?ŠBEQ.S‚STRS30�Branch�if�NO(ŠMOVE.L�TRACEBEG,A0ˆStart�of�trece�table ŠLEA„16(A0),A1Š1st�entry�address1ŠCLR.B‚TRACFLAG‹Be�sure�other�traces�won't�happen$ŠMOVE.L�A1,(A0)ŒSave�new�trace�start*!*ˆStart�Up�Initialization�of�SDLC*5STRS30„MOVE.L�XBEGSDLC(A4),A0„*�Start�of�SDLC�segmentŠADD.L‚#PWRUP-BEGSDLC,A0 ŠJSR„(A0)�**ŠRTS—SDLC�Started,�Return*(*ˆCheck�to�see�if�VERSAdos�Driver�exists*STRS40„CLR.L‚D0ŠIFEQƒTYPEBD-02$ŒMOVE.W�VEC7201,D0ˆGet�vector�numberŒBNE.S‚STRS44�Branch�if�set4ŒMOVE.W�#VECTVM2,D0ˆVector�to�use�if�not�already�setŒMOVE.W�D0,VEC7201ˆTell�VM02ŠENDCŠIFEQƒTYPEBD-10%ŒMOVE.W�#VEC7201,D0‡Get�vector�numberŠENDC5STRS44„LSL.L‚#2,D0Žvector�number�*�4�=�vector�address(ŠMOVE.L�D0,A2ŽNeed�address�in�A�register*ŠMOVE.L�(A2),D0ŒGet�current�vector�content<ŠMOVE.L�D0,SDPVECT(A3)…Save�current�content�in�Pri�Cntrl�BlkŠCLR.B‚D0‘May�be�start�of�CCB%ŠMOVE.L�D0,A0ŽAddress�of�CCB�in�A�reg ŠCMP.L‚#'!CCB',(A0)‡Is�it�a�CCB?ŠBNE.S‚STRS80�Branch�if�NO)ŠLEA„CCBVDLC(A0),A1…Address�of�flag�byte.4ŠMOVE.B�#2,D1ŽFlag�to�tell�driver�that�SDLC�is�here.1ŠLEA„CCBVREG(A0),A0…Where�to�save�status�register'ŠBRA„STRS14�Go�to�common�initialization**ˆI/O�Task�or�CCB�not�found*5STRS80„MOVE.L�XBEGSDLC(A4),A0„*�Start�of�SDLC�segment2ŠADD.L‚#INT7201A-BEGSDLC,A0�*�Default�return�point(ŠBRA„STRS20�Branch�to�save�Port�A�vectorŠENDé‚*******************‚*FILE�=�EMLINK.CD�*‚*******************.‚V2OFF…=�0ŒVM02�Memory�offset�(on�bus)�-�dummy/‚V2SYSP„=�0ŒVM02�SYSPAR.AG�area�address�-�dummy‚SUBSˆGEN.ILOADP.AG,‚ASM‰GEN.ILOADP.AG,GEN.ILOADP.RO,&.SYSGEN.TF ‚=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A‚MSG‰@‚MSG‰***********************************************************‚MSG‰*¹*&‚MSG‰*†SDLC‚Configuration�Parameters•*‚MSG‰*¹*@‚MSG‰***********************************************************‚MSG‰‚*;‚*‹The�parameter�MAXSEC�should�be�equal�to�twice�the�number'‚*‹of�HDS400s�that�you�want�configured.‚*+‚MAXSEC„=�8ŒMaximum�#�of�secondary�stations#‚DLBR†=�57600ˆData�Link's�Baud�Rate)‚FSSTN…=�1ŒFirst�Secondary�Station�Number&‚SSINC…=�1ŒSecondary�Station�INCrement!‚TXRTRY„=�20‹Transmit�Retry�Count ‚RCRTRY„=�12‹Receive�Retry�Count,‚MXOBF…=�7ŒMaximum�Number�of�Outbound�Frames,‚RCTOV…=�8ŒReceive�Timeout�Value�(1=50�Msec)$‚RTRDLY„=�15‹Retry�Delay�(1=50�Msec)%‚TXDLY…=�0ŒTransmit�Delay�(1=50�Msec)/‚PFDLY…=�200ŠPoll�Powered�Off�Delay�(1=50�Msec),‚PNDLY…=�1ŒPoll�Powered�On�Delay�(1=50�Msec)‚TXPDS…=�16‹#�of�Transmit�Pads‚SUBSˆGEN.IDLCP.AG*‚ASM‰GEN.IDLCP.AG,GEN.IDLCP.RO,&.SYSGEN.TF ‚=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A‚MSG‰@‚MSG‰***********************************************************‚MSG‰*¹*.‚MSG‰*†Buffer�Queue�Configuration�ParametersŽ*‚MSG‰*¹*@‚MSG‰***********************************************************‚MSG‰‚NUMBUF„=�50‹#�Buffers�in�queue4‚SZDBUF„=�256ŠSize�of�data�block�contained�in�buffer-‚FQULWM„=�25‹Free�Queue�User's�Low�Water�Mark‚SUBSˆGEN.IBUFQ.AG*‚ASM‰GEN.IBUFQ.AG,GEN.IBUFQ.RO,&.SYSGEN.TF ‚=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A‚MSG‰@‚MSG‰***********************************************************4‚MSG‰*�SYSTEM�GENERATION�(SYSGEN)�COMMAND�FILE �FOR�*'‚MSG‰*„VM02�BOARD�IN�EXORMACS�CHASSIS—*@‚MSG‰***********************************************************‚MSG‰@‚MSG‰***********************************************************!‚MSG‰*ŠRMS68K�SYSGEN�PARAMETERS—*‘8š@¢*@‚MSG‰***********************************************************‚MSG‰‚GST‡=�0ŒNO.�OF�PAGES�IN�GST‚UST‡=�0ŒNO.�OF�PAGES�IN�UST‚UDR‡=�1ŒNO.�OF�PAGES�IN�UDR'‚TRACE…=�10‹NO.�OF�PAGES�IN�TRACE�TABLE(‚IOV‡=�0ŒNO.�OF�PAGES�IN�IO�VECTOR�TABLE*‚PAT‡=�2ŒSIZE�OF�PERIODIC�ACTIVATION�TABLE‚TRCFLAGƒ=�$0000ˆTRACE�FLAGS‚BUGTRACƒ=�$F00F3A‚MMU‡=�0ŒMMU�ADDRESS‚TIMER…=�$F70000†TIMER�ADDR.‚CLOCKFRQ‚=�800ŠCLOCK�FREQUENCY ‚TIMSLICƒ=�2 ‚TIMINTVƒ=�10‚PANEL…=�0ŒFRONT�PANEL�ADDR.0‚MEMEND1ƒ=�$20000‡MAXIMUM�END�OF�ON-BOARD�MEMORY ‚MEMEND2ƒ=�0 ‚MEMEND3ƒ=�0‚WHERLOAD‚=�$0 ‚PCˆ=�\RMS0LO‚PROCESS…NETVM02.RMS.LO+‚=COPY‡9999.NETVM02.RMS.LO,NETVM02.RMS.LO;Y&‚=COPY‡9999.NETVM02.RMS.LL,SYSASM.LS;A‚END‰RMS ‚MEMBEG„=�*‚MSG‰@‚MSG‰***********************************************************‚MSG‰*¹*2‚MSG‰*†Link�Initialization�Task�---�VM02.INET.LOŠ*‚MSG‰*¹*@‚MSG‰***********************************************************‚MSG‰?‚V2G1IR1ƒ=�$1FFE2‡*�Group�2,�IRQ�1�Vector�Number�Address�(Word)?‚V2G1IR2ƒ=�$1FFE4‡*�Group�2,�IRQ�2�Vector�Number�Address�(Word)?‚V2G1IR3ƒ=�$1FFE6‡*�Group�2,�IRQ�3�Vector�Number�Address�(Word)?‚V2G1IR4ƒ=�$1FFE8‡*�Group�2,�IRQ�4�Vector�Number�Address�(Word)?‚V2G1IR5ƒ=�$1FFEA‡*�Group�2,�IRQ�5�Vector�Number�Address�(Word)?‚V2G1IR6ƒ=�$1FFEC‡*�Group�2,�IRQ�6�Vector�Number�Address�(Word)‚SUBSˆVM02.VEC7201.AG0‚ASM‰VM02.VEC7201.AG,VM02.VEC7201.RO,&.SYSGEN.TF ‚=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A‚TASKˆVM02.INET.LO,INET ‚SESSIONƒ=�10‚V2BSTR„=�*ŒINETV2�Load�Address‚SUBSˆGEN.INETV2.LG‚STATE…=�'READ'‚PRIORITY‚=�$C8‚LINKˆGEN.INETV2.LG ‚=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A ‚END‰INETV2‚MSG‰@‚MSG‰***********************************************************‚MSG‰*¹*$‚MSG‰*ŒSTART�OF�SYSTEM�INITIALIZER’*‚MSG‰*¹*@‚MSG‰***********************************************************‚MSG‰ ‚PROCESS…INIT ‚INTSTR„=�*1‚KILVECTƒ=�142ŠKiller�routine�-�unassigned�vector‚SERPTS„=�140ŠSerial�ports-BIOS‚PTMVECTƒ=�28‹PTM-timer‚BCLRV…=�142ŠBCLRV�IRQ�routine%‚FAIL†=�141ŠSYSFAIL-POWERFAIL�routine3‚DPRVAO„=�0ŒDual�ported�RAM�VERSAdos�address�offset‚SWABRT„=�31‹Software�abort2‚IOCVEC4ƒ=�146ŠIRQ�5-I/O�channel�interrupt�level�42‚IOCVEC3ƒ=�145ŠIRQ�4-I/O�channel�interrupt�level�32‚IOCVEC2ƒ=�144ŠIRQ�3-I/O�channel�interrupt�level�22‚IOCVEC1ƒ=�143ŠIRQ�2-I/O�channel�interrupt�level�18‚HOGMODEƒ=�0ŒDon't�keep�VERSAbus�in�block�transfer�mode.3‚PAGESIZE‚=�256ŠSize�in�bytes�of�one�page�of�memory!‚ASN‡=�0ŒNumber�of�address�spaces>‚SYSFAILƒ=�0ŒO/S�not�interrupted�when�SYSFAIL�asserted�on�bus. ‚CACHEF„=�0 ‚ROMSADDR‚=�0 ‚ROMEADDR‚=�0)‚LINKLS„=�"&.SYSGEN.TF"�Link�listing�file ‚SUBSˆ9998.VM02.INITIO1.AG2‚ASM‰VM02.INITIO1.AG,&.INITIO1.RO,SYSGEN.TF;RMZ=70‚=COPY‡SYSGEN.TF,SYSASM.LS;A ‚SUBSˆ&.INITIO1.LG‚LINKˆ&.INITIO1.LG ‚=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A ‚SUBSˆ9998.&.INITDAT.AG,‚ASM‰&.INITDAT.AG,&.INITDAT.RO,&.SYSGEN.TF;R ‚=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A ‚SUBSˆNETVM02.INT.LG‚LINKˆNETVM02.INT.LG ‚=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A ‚END‰INTV2 ‚MSG‰@‚MSG‰***********************************************************‚MSG‰*ŠE�N�DƒO�F‚S�Y�S�G�E�N—*@‚MSG‰***********************************************************‚MSG‰*¹*3‚MSG‰*„WE�NOW�HAVE�A�SYSTEM�FILE�CALLEDƒNETV2B.SY‰*‚MSG‰*¹*@‚MSG‰*********************************************************** éé‚*********************‚*FILE�=�LINKALL.CD‚*‚*********************‚SYSTYPE‚=�"LINKALL"‚*éééééé骂*********************‚*FILE�=�LINKMAIN.CD�*‚*********************‚SYSTYPE‚=�"LINKMAIN"‚*éééé éé鳂*********************‚*FILE�=�LINKONLY.CD�*‚*********************‚SYSTYPE‚=�"LINKONLY"‚*éééééé鼂******************‚*�FILE�NETEXG.CD�*‚******************,‚V2OFF…=�$FC0000†VM02�Memory�offset�(on�bus)+‚V2SYSP„=�$1500ˆVM02�SYSPAR.AG�area�address‚SUBSˆGEN.ILOADP.AG,‚ASM‰GEN.ILOADP.AG,GEN.ILOADP.RO,&.SYSGEN.TF ‚=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A‚*‚*‚MSG@‚MSG‰***********************************************************‚MSG‰*¹*:‚MSG‰*†Link�LOADV2�Task�---�LOADV2.LO‚(Boots�VM02�board)�*‚MSG‰*¹*@‚MSG‰***********************************************************‚MSG‚LINKˆGEN.LOADV2.LG ‚=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A‚MSG‰‚MSG‰@‚MSG‰***********************************************************‚MSG‰*¹*&‚MSG‰*†SDLC‚Configuration�Parameters•*‚MSG‰*¹*@‚MSG‰***********************************************************‚MSG‰‚* ;‚*‹The�parameter�MAXSEC�should�be�equal�to�twice�the�number'‚*‹of�HDS400s�that�you�want�configured.‚*+‚MAXSEC„=�8ŒMaximum�#�of�secondary�stations#‚DLBR†=�57600ˆData�Link's�Baud�Rate)‚FSSTN…=�1ŒFirst�Secondary�Station�Number&‚SSINC…=�1ŒSecondary�Station�INCrement!‚TXRTRY„=�20‹Transmit�Retry�Count‚RCRTRY„=�4ŒReceive�Retry�Count,‚MXOBF…=�7ŒMaximum�Number�of�Outbound�Frames,‚RCTOV…=�8ŒReceive�Timeout�Value�(1=50�Msec)$‚RTRDLY„=�15‹Retry�Delay�(1=50�Msec)%‚TXDLY…=�0ŒTransmit�Delay�(1=50�Msec)/‚PFDLY…=�200ŠPoll�Powered�Off�Delay�(1=50�Msec),‚PNDLY…=�1ŒPoll�Powered�On�Delay�(1=50�Msec)‚TXPDS…=�2Œ#�of�Transmit�Pads‚SUBSˆGEN.IDLCP.AG*‚ASM‰GEN.IDLCP.AG,GEN.IDLCP.RO,&.SYSGEN.TF ‚=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A‚MSG‰@‚MSG‰***********************************************************‚MSG‰*¹*2‚MSG‰*†Network�Services�Configuration�ParametersŠ*‚MSG‰*¹*@‚MSG‰***********************************************************‚MSG‰&‚MAXLNAUƒ=�10‹Maximum�#�of�local�NAU's=‚MAXNAMEƒ=�30‹Maximum�#�of�Network�Names�(if�primary�-�max�in ‚*˜network).‚MAXCONNƒ=�20‹Maximum�#�of�Logical�Connections‚SUBSˆGEN.INETP.AG*‚ASM‰GEN.INETP.AG,GEN.INETP.RO,&.SYSGEN.TF ‚=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A‚MSG‰Å>Î@‚MSG‰***********************************************************‚MSG‰*¹*.‚MSG‰*†Buffer�Queue�Configuration�ParametersŽ*‚MSG‰*¹*@‚MSG‰***********************************************************‚MSG‰‚NUMBUF„=�50‹#�Buffers�in�queue4‚SZDBUF„=�256ŠSize�of�data�block�contained�in�buffer,‚FQULWM„=�7ŒFree�Queue�User's�Low�Water�Mark‚SUBSˆGEN.IBUFQ.AG*‚ASM‰GEN.IBUFQ.AG,GEN.IBUFQ.RO,&.SYSGEN.TF ‚=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A‚MSG@‚MSG‰***********************************************************‚MSG‰*¹*-‚MSG‰*†Link�Initialization�Task�---�INET.LO�*‚MSG‰*¹*@‚MSG‰***********************************************************‚MSG‚LINKˆGEN.INET.LG ‚=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A‚END‰ééééé‚*********************‚*FILE�=�NOLINK.CDƒ*‚*********************‚SYSTYPE‚=�"NOLINK"‚*é ééééééÖ‚******************‚*FILE�=�NOLINK.CD*‚******************,‚V2OFF…=�$FC0000†VM02�Memory�offset�(on�bus)+‚V2SYSP„=�$1500ˆVM02�SYSPAR.AG�area�address‚SUBSˆGEN.ILOADP.AG,‚ASM‰GEN.ILOADP.AG,GEN.ILOADP.RO,&.SYSGEN.TF ‚=COPY‡&.SYSGEN.TF,&.SYSASM.LS;AB‚MSG‰*************************************************************‚MSG‰*»*&‚MSG‰*†SDLC‚Configuration�Parameters—*‚MSG‰*»*B‚MSG‰*************************************************************‚MSG‰+‚MAXSEC„=�3ŒMaximum�#�of�secondary�stations#‚DLBR†=�57600ˆData�Link's�Baud�Rate)‚FSSTN…=�1ŒFirst�Secondary�Station�Number&‚SSINC…=�1ŒSecondary�Station�INCrement ‚TXRTRY„=�8ŒTransmit�Retry�Count‚RCRTRY„=�4ŒReceive�Retry�Count,‚MXOBF…=�7ŒMaximum�Number�of�Outbound�Frames,‚RCTOV…=�4ŒReceive�Timeout�Value�(1=50�Msec)$‚RTRDLY„=�15‹Retry�Delay�(1=50�Msec)%‚TXDLY…=�0ŒTransmit�Delay�(1=50�Msec)/‚PFDLY…=�200ŠPoll�Powered�Off�Delay�(1=50�Msec),‚PNDLY…=�1ŒPoll�Powered�On�Delay�(1=50�Msec)‚TXPDS…=�2Œ#�of�Transmit�Pads‚SUBSˆGEN.IDLCP.AG*‚ASM‰GEN.IDLCP.AG,GEN.IDLCP.RO,&.SYSGEN.TF ‚=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A‚MSG‰B‚MSG‰*************************************************************‚MSG‰*»*2‚MSG‰*†Network�Services�Configuration�ParametersŒ*‚MSG‰*»*B‚MSG‰*************************************************************‚MSG‰&‚MAXLNAUƒ=�20‹Maximum�#�of�local�NAU's=‚MAXNAMEƒ=�30‹Maximum�#�of�Network�Names�(if�primary�-�max�in ‚*˜network).‚MAXCONNƒ=�20‹Maximum�#�of�Logical�Connections‚SUBSˆGEN.INETP.AG*‚ASM‰GEN.INETP.AG,GEN.INETP.RO,&.SYSGEN.TF ‚=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A‚MSG‰B‚MSG‰*************************************************************‚MSG‰*»*.‚MSG‰*†Buffer�Queue�Configuration�Parameters�*‚MSG‰*»*B‚MSG‰*************************************************************‚MSG‰‚NUMBUF„=�50‹#�Buffers�in�queue4‚SZDBUF„=�256ŠSize�of�data�block�contained�in�buffer,‚FQULWM„=�7ŒFree�Queue�User's�Low�Water�Mark‚SUBSˆGEN.IBUFQ.AG*‚ASM‰GEN.IBUFQ.AG,GEN.IBUFQ.RO,&.SYSGEN.TF ‚=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A‚MSG‰ß:è B‚MSG‰*************************************************************‚MSG‰*»*-‚MSG‰*†Link�Initialization�Task�---�INET.LO‘*‚MSG‰*»*B‚MSG‰*************************************************************‚MSG‰?‚V2G1IR1ƒ=�$1FFE2‡*�Group�2,�IRQ�1�Vector�Number�Address�(Word)?‚V2G1IR2ƒ=�$1FFE4‡*�Group�2,�IRQ�2�Vector�Number�Address�(Word)?‚V2G1IR3ƒ=�$1FFE6‡*�Group�2,�IRQ�3�Vector�Number�Address�(Word)?‚V2G1IR4ƒ=�$1FFE8‡*�Group�2,�IRQ�4�Vector�Number�Address�(Word)?‚V2G1IR5ƒ=�$1FFEA‡*�Group�2,�IRQ�5�Vector�Number�Address�(Word)?‚V2G1IR6ƒ=�$1FFEC‡*�Group�2,�IRQ�6�Vector�Number�Address�(Word)‚SUBSˆVM02.VEC7201.AG0‚ASM‰VM02.VEC7201.AG,VM02.VEC7201.RO,&.SYSGEN.TF ‚=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A‚LINKˆGEN.INETNOL.LG ‚=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A‚ENDéééé‚*********************‚*FILE�=�PRIMARY.CD‚*‚*********************‚STATION‚=�"PRIMARY"‚*ééééééé ð‚********************‚*FILE�=�SPAR1300.CD*‚********************‚*�Old�file�name�was�SYSPARSE‚*ƒRuns�on�a�VM02�system�with�NETBUG�(firmware�to�handle�downloading)@‚***************************************************************8‚*�SYSPAR�parameters�-�VM02�system�acting�as�SDLC�link‰*@‚***************************************************************3‚RMS0LO„=�$1700ˆRMS�boot�header�(Seg�0�low�address)‚STACK…=�$1500L‚STARTRMS‚=�\RMS0LO+$100‚Beginning�of�RMS�code�-�(One�sector�above�boot�hdr)‚=DELˆ&.SYSPAR.RO(‚=COPY‡9999.C13O15.SYSPAR.RO,&.SYSPAR.RO éééééù‚*******************‚*FILE�=�SPAR400.CD*‚*******************‚*�Old�file�name�was�SYSPAR#‚*ƒRuns�on�a�normal�EXORmacs�system@‚***************************************************************(‚*�SYSPAR�parameters�-�EXORmacs�system™*@‚***************************************************************‚=DELˆ&.SYSPAR.RO&‚=COPY‡9999.C4O9.SYSPAR.RO,&.SYSPAR.RO éééé éé ‚*******************‚*FILE�=�SPAR800.CD*‚*******************‚*�Old�file�name�was�SYSPARV4‚*ƒRuns�on�a�VM02�system�without�the�NETBUG�firmware@‚***************************************************************>‚*�SYSPAR�parameters�-�VM02�system�acting�as�phoney�EXORmacsƒ*@‚***************************************************************‚=DELˆ&.SYSPAR.RO&‚=COPY‡9999.C8OC.SYSPAR.RO,&.SYSPAR.RO éééééé  =OPT K,-N=/*********************=/*�SYSGEN.CF‰*ƒMnemonic�=�\1=/*********************=USE :.&=OPT N=OPT O$=/* Options used in this chain file:?=/*‡J�-�Inhibit�SBARG�echoing�of�commands�read�from�chain�file.3=/*‡K�-�Inhibit�translation�of�lower�to�upper�case.,=/*‡N�-�Inhibit�echo�of�chain�file�commands.A=/*‡O�-�Overrides�chain�file�abort�when�utility�error�terminates.=/*=/*==/*�Insure�two�arguments.‚Second�argument�defaults�to�'#NULL'=/*=/RX=\0 =/IF RX = 0 ƒ=ARG�NOARGƒ=/RX=\0=/ENDIF =/IF RX = 1ƒ=ARG�\1,#NULLƒ=/RX=\0=/ENDIF =/IF RX > 2ƒ=ARG‚NOARG,#NULL=/ENDIF=/*$=/* See if we have a valid mnemonic.2=/*ƒIf�not�a�valid�mnemonic,�put�out�help�message.=/RX=0=/IFEQ "HDS4PRI"\1ƒ=/RX=1=/ENDIF"=/IFEQ "EXOR/SINGLE/UTIL/NOLINK"\1ƒ=/RX=1=/ENDIF"=/IFEQ "VM02/SINGLE/UTIL/NOLINK"\1ƒ=/RX=1=/ENDIF=/IFEQ "EXOR/MULTI/UTIL/HDS"\1ƒ=/RX=1=/ENDIF=/IFEQ "EXOR/MULTI/LINK/HDS"\1ƒ=/RX=1=/ENDIF=/* =/IF RX=0ƒ=OPT�-Nƒ=/*‘*  **�HELP�MESSAGE�***ƒ=/*7ƒ=/*�No�argument�or�an�invalid�argument�was�specified�-=ƒ=/*ƒThis�chain�file�must�be�restarted�with�a�valid�argument.3ƒ=/*ƒA�description�of�the�calling�sequence�follows.<ƒ=/*ƒType��to�continue�after�a�frame�has�been�displayed.ƒ=/*ƒ=/*�Calling�sequence:ƒ=/*ƒ=SYSGEN.CF�arg1,arg2ƒ=/*ƒ=/*†arg1†=�Mnemonicƒ=/*†arg2†=�Output�file/deviceDƒ=/*ƒArg1�is�optional.‚If�not�specified,�a�help�message�will�appear.Aƒ=/*ƒArg2�will�typically�be�'#NULL'�or�'#PR'�-�defaults�to�#NULL.ƒ=/&ƒ=/*1ƒ=/*�SYSGEN.CF�will�perform�the�sysgen�associated!ƒ=/*„with�the�specified�mnemonic.ƒ=/*2ƒ=/*�The�mnemonic�(arg1)�is�of�the�following�form:4ƒ=/*„system/processor�mode/output�type/qualificationƒ=/*'ƒ=/*�Example:‚arg1=�EXOR/MULTI/UTIL/HDSƒ=/*5ƒ=/*�This�would�gen�just�the�utilities�(LOADV2.LO�and)ƒ=/*�INET.LO�to�run�on�an�EXORmacs�system/ƒ=/*�in�the�multi-processor�mode�(VM02�board�in5ƒ=/*�the�same�chassis�to�perform�link).‚The�qualifierN.%3->5C=6ƒ=/*�of�test�would�distinguish�it�as�a�particular�test6ƒ=/*�configuration.�The�system�would�be�for�an�HDS400.ƒ=/&ƒ=/*ƒ=/*�Legal�Mnemonics:ƒ=/*†"HDS4PRI"7ƒ=/*ŠPrepare�the�SDLC�HDS-400�primary�station�software.:ƒ=/*ŠFour�user-initiated�steps�are�required.‚One,�run�this;ƒ=/*Šchain�file�with�"HDS4PRI"�option.‚It�will�generate�the<ƒ=/*Šproper�SDLC�object�file�for�the�HDS-400�primary�station3ƒ=/*Šenvironment.‚Two,�run�the�SYSGEN.CF�chain�file/ƒ=/*Šwith�option�EXOR/MULTI/LINK/HDS�which�will;ƒ=/*Šcreate�the�VM02�load�image�file�NETV2B.SY.‚Three,�copy<ƒ=/*Šthis�load�image�file�to�user�0,�NO�CATALOG�NAME,�of�the=ƒ=/*ŠHDS-400�hosting�system.‚Four,�re-IPL�the�HDS-400�hosting=ƒ=/*Šsystem�(loads�the�new�NETV2B.SY�module�into�the�VM02�andƒ=/*Šbegins�execution).ƒ=/*�Station�typeˆ=�primaryƒ=/*�MPU�typeŒ=�68000ƒ=/*�Resident�board�type�=�VM02ƒ=/&ƒ=/*†"EXOR/SINGLE/UTIL/NOLINK"<ƒ=/*ŠRuns�in�an�EXORmacs�system�with�no�SDLC�link.�Tasks�can=ƒ=/*Šcommunicate�with�each�other�via�network�services�request;ƒ=/*Šhowever.‚This�option�will�produce�the�following�files:1ƒ=/*ŒINET.LO‡-�Initialization�utility�to�bring�upƒ=/*žnetwork�services.ƒ=/&ƒ=/*†"VM02/SINGLE/UTIL/NOLINK"8ƒ=/*ŠRuns�in�an�VM02�system�with�no�SDLC�link.�Tasks�can=ƒ=/*Šcommunicate�with�each�other�via�network�services�request;ƒ=/*Šhowever.‚This�option�will�produce�the�following�files:1ƒ=/*ŒINET.LO‡-�Initialization�utility�to�bring�upƒ=/*žnetwork�services.ƒ=/*ƒ=/&ƒ=/*†"EXOR/MULTI/UTIL/HDS"3ƒ=/*ŠRuns�on�an�EXORmacs�system�as�primary�station.;ƒ=/*ŠThe�system�is�assumed�to�have�a�VM02�board�in�the�same>ƒ=/*Šchassis�to�perform�the�SDLC�link.‚The�sysgen�would�be�for>ƒ=/*Šan�HDS400.‚This�option�would�produce�the�following�files:<ƒ=/*ŒLOADV2.LOƒ-�Loads�the�VM02�with�the�SDLC�link�software.;ƒ=/*ŒINET.LO…-�Initializes�network�services�on�the�EXORmacs ƒ=/*œboard.>ƒ=/*ŠNote�that�the�parameter�'MAXSEC'�that�appears�in�the�file9ƒ=/*ŠNETEXG.CD�should�be�set�equal�to�twice�the�number�of-ƒ=/*ŠHDS400�systems�that�you�want�configured.=ƒ=/*ŠThe�EXORmacs�sysgen�command�file�9998.EXORMACS.SYSCMD.CD=ƒ=/*Šshould�have�'NOTNT'�set�equal�to�5�in�order�to�configureƒ=/*Šfor�HDS400.ƒ=/&ƒ=/*†"EXOR/MULTI/LINK/HDS">ƒ=/*ŠRuns�on�an�EXORmacs�system�on�the�on-board�VM02.‚Contains?ƒ=/*Šthe‚SDLC�link�software.‚The�sysgen�would�be�for�an�HDS400.3ƒ=/*ŠThis�option�would�produce�the�following�files.5ƒ=/*ŒNETV2B.SY‚-�Boot�file�for�the�on-board�VM02�thatƒ=/*�handles�the�SDLC�link.>ƒ=/*ŠNote�that�the�parameter�'MAXSEC'�that�appears�in�the�file9ƒ=/*ŠEMLINK.CD�should�be�set�equal�to�twice�the�number�of-ƒ=/*ŠHDS400�systems�that�you�want�configured.=ƒ=/*ŠThe�EXORmacs�sysgen�command�file�9998.EXORMACS.SYSCMD.CD=ƒ=/*Šshould�have�'NOTNT'�set�equ  al�to�5�in�order�to�configureƒ=/*Šfor�HDS400.ƒ=/&ƒ=NOARGƒ=@END=/ENDIF=/*F=/* There are three possible flavors of SYSPAR depending on the systemC=/*ƒwe�are�running�on.‚An�appropriate�version�of�a�SPARxxxx.CD�fileC=/*ƒis�merged�into�the�sysgen�command�file�prior�to�the�sysgen.‚TheE=/*ƒfilename�depends�on�the�location�of�CRASHSAV�in�the�system�we�are1=/*ƒperforming�the�sysgen�for.‚The�filenames�are:=/*<=/*Œ&.SPAR400.CDƒ-�Runs�and�an�EXORmacs�board�in�an�EXORmacs=/*›chassis.‚CRASHSAV�at�$400.=/*8=/*Œ&.SPAR1300.CD‚-�Runs�on�a�VM02�board�with�the�NETbug+=/*›(download)�firmware.‚CRASHSAV�at�$1300.=/*:=/*Œ&.SPAR800.CDƒ-�Runs�on�a�VM02�board�without�the�NETbug*=/*›(download)�firmware.‚CRASHSAV�at�$800.=/*=/*=/*F=/*�There�are�two�possibilities�for�station�type.‚The�appropriate�fileC=/*ƒis�merged�in�to�the�SYSGEN�command�file�prior�to�performing�the=/*ƒsysgen.‚The�filenames�are:=/*,=/*Œ&.PRIMARY.CDƒ-�Runs�on�a�primary�system.=/*-=/*Œ&.SECOND.CD„-�Runs�on�a�secondary�system.=/*=/*I=/*�There�are�four�possible�link�options�as�explained�below.‚A�particularF=/*ƒoption�is�selected�by�merging�the�a�file�with�the�same�name�as�theF=/*ƒoption�and�extension�of�'CD'�into�the�sysgen�command�file�prior�to=/*ƒthe�sysgen.=/*:=/*ŒLINKMAIN�-‚Main�board�in�a�multi-processor�mode.‚Other#=/*šboard�in�chassis�performs�link.2=/*ŒLINKONLY�-‚Link�board�in�multi-processor�mode.<=/*ŒLINKALL‚-‚VM�board�and�VME/10�system�in�single�processor!=/*˜mode�handling�their�own�link.>=/*ŒNOLINKƒ-‚Network�services�with�no�link�to�another�station.=/*D=/* Cross reference with major '.CD' files and associated link files=/*%=/*„&.NETEXG.CD•"EXOR/MULTI/UTIL/HDS"=/*‡GEN.LOADV2.LG=/*Š&.LOADV2.LO=/*‡GEN.INET.LG =/*Š&.INET.LO=/*%=/*„&.EMLINK.CD•"EXOR/MULTI/LINK/HDS"=/*‡GEN.INETV2.LG=/*ŠVM02.INET.LO=/*‡NETVM02.INT.LG=/*ŠBoot�file�NETV2B.SY=/*B=/*„&.NOLNK.CDŠ"EXOR/SINGLE/UTIL/NOLINK"�"VM02/SINGLE/UTIL/NOLINK"=/*‡GEN.INETNOL.LG=/*Š&.INETNOL.LO=/*!=/*‚Load�module�file�explanation:=/*‡&.LOADV2.LO==/*‹Code�which�runs�on�an�EXORmacs�system�and�loads�NETV2B.SY1=/*‹into�a�VM02�which�is�in�the�EXORmacs�chassis.=/*‡xx.INET.LO;=/*‹Task�which�initialized�network�services.‚May�be�part�of>=/*‹a�boot�file�(NETV2B.SY)�which�is�downloaded�to�a�secondary!=/*‹system�or�a�stand�alone�task.=/*‡&.NETV2B.SY9=/*‹File�which�is�downloaded�to�a�remote�system.‚Includes4=/*‹RMS�and�network�initialization�task�(xx.INET.LO)=/* =/IF RX=1ƒ=DEL�&.S.LS/&.SYSASM.LS=/ENDIF=/RX=0F=/*-------------------------------------------------------------------F=/*------------------------------------------------------------------- =OPT -K,NE=/* Preliminary sysgens to configure SDLC secondary station software.<=/*ƒInstructions�for�use�appear�in�the�subroutine�chainfile.;=/*ƒLegal�nmenonics�are:‚"HDS4PRI"‚-�HDS400�primary�system.=/*=/IFEQ "HDS4PRI"\1ƒ=SYSGEN�SDLC.SYSCMD.CD,,&.S.LSƒ=/RX=1ƒ=/IF�RD<$C000†=/R?†=/*�Errors�in�SYSGEN†=@ENDƒ=/ENDIF(ƒ=COPY�SDLC.HDS4PRI.RO,SDLC.SDLCPRI.RO;YHƒ=/*�SDLC.HDS4PRI.RO�is�now�ready�for�use�as�the�HDS-400�primary�station1ƒ=/*�driver.‚SDLC.SDLCPRI.RO�is�a�duplicate�copy.=/ENDIFF=/*-------------------------------------------------------------------F=/*-------------------------------------------------------------------"=/IFEQ "EXOR/SINGLE/UTIL/NOLINK"\1ƒ=OPT�-NHƒ=SYSGEN�&.SPAR400.CD/&.PRIMARY.CD/&.NOLINK.CD/&.NOLNK.CD,/&.B.SY,&.S.LSƒ=/RX=1ƒ=/IF�RD<$C000†=/R?†=/*�Errors�in�SYSGEN†=@ENDƒ=/ENDIF$ƒ=/*�Created�files�are:�&.INETNOL.LO=/ENDIF=OPT NF=/*-------------------------------------------------------------------F=/*-------------------------------------------------------------------"=/IFEQ "VM02/SINGLE/UTIL/NOLINK"\1ƒ=OPT�-NFƒ=SYSGEN�&.SPAR800.CD/&.PRIMARY.CD/&.NOLINK.CD/&.NOLNK.CD,/B.SY,&.S.LSƒ=/RX=1ƒ=/IF�RD<$C000†=/R?†=/*�Errors�in�SYSGEN†=@ENDƒ=/ENDIF$ƒ=/*�Created�files�are:�&.INETNO  L.LOƒ=OPT�N=/ENDIF=OPT NF=/*-------------------------------------------------------------------F=/*-------------------------------------------------------------------=/IFEQ "EXOR/MULTI/UTIL/HDS"\1ƒ=OPT�-NKƒ=SYSGEN�&.SPAR400.CD/&.PRIMARY.CD/&.LINKMAIN.CD/&.NETEXG.CD,/&.B.SY,&.S.LSƒ=/RX=1ƒ=/IF�RD<$C000†=/R?†=/*�Errors�in�SYSGEN†=@ENDƒ=/ENDIF-ƒ=/*�Created�files�are:‚&.LOADV2.LO,&.INET.LO=/ENDIF=OPT NF=/*-------------------------------------------------------------------F=/*-------------------------------------------------------------------=/IFEQ "EXOR/MULTI/LINK/HDS"\1ƒ=OPT�-N@ƒ=/*�Need�to�have�M6840.M6840.EQ�for�assembly�of�VM02.INITIO1.AG,ƒ=COPY�9999.M6840.M6840.EQ,.M6840.M6840.EQ;Y$ƒ=COPY�9998.&.MTYPE.SI,.&.MTYPE.SI;Y(ƒ=COPY�9998.&.INITIO1.LG,.&.INITIO1.LG;Y,ƒ=COPY�9999.M68XXX.INIT.RO,.M68XXX.INIT.RO;Y(ƒ=COPY�SDLC.HDS4PRI.RO,SDLC.SDLCPRI.RO;YN=SYSGEN &.SPAR1300.CD/&.PRIMARY.CD/&.LINKONLY.CD/&.EMLINK.CD,/NETV2B.SY,&.S.LSƒ=/RX=1ƒ=/IF�RD<$C000†=/R?†=/*�Errors�in�SYSGEN†=@ENDƒ=/ENDIF#ƒ=/*�Created�files�are:�&.NETV2B.SY=/ENDIF=/*F=/*-------------------------------------------------------------------F=/*-------------------------------------------------------------------=OPT -N =/IF RX=1ƒ=/*,ƒ=/*�Copy�listing�file�to�output�file/deviceƒ=/IFEQ�"#NULL"\2ƒ=/ELSE‡=DEL�&.SGLIST.LS‡=LIST�&.S.LS,&.SGLIST.LS;H ‡SYSGEN:‚"\1" ‡=COPY�&.SYSASM.LS,&.SGLIST.LS;A‡=COPY�&.SGLIST.LS,\2;Y"‡=/*�Listing�has�been�routed�to�\2ƒ=/ENDIF=/ENDIFF=/*-------------------------------------------------------------------=OPT O=ENDééééééINET ˜?ÿÿÿÿÿÀSDLC!€SSCT!ÀINET? ÿÿÿÿ !>?Kÿÿ`þa@×Ns@ç/ |"x LJ¸ HfÿýFï|Jé kòfÿýSi n kF|B© p&i —ü€×ø HÓfÿý#S © gÿýFïB“B«B«B« "_FßNuRi fÿý© gÿýFïB/&|ÿÿÿÿ"_FßNua@×Ns@ç|/ "x LFï|Jé kòfÿý0) °i oPSi nk@B© p i ‘ü€Ñø HÐfÿý#P © gÿýFïB�B¨B¨B¨ "_FßNuRi fÿý© gÿýFïB/ |ÿÿÿÿ"_FßNua@×Ns@çB/BgB§JAoÿý`aÿNf| —.ˆRoQÉÿê| _2n |ÿÿÿÿFßNua@×Ns@ç/ ±ügÿý"x LB�Fï|Jé kòfÿý © �gÿý‘ø HÑü€#H J© pfJi fÿý‘ü€#H pRi oÿý© gÿýFï"_ |  ÿÿÿÿFßNua@×Ns  @J€g aÿt`ò |ÿÿÿÿNua@×Ns@ç±ügÿýJ¸ Hgaª|FßNuB€( "x $"iD ÿg°gÓüXJfò|FßNuBhB( B( B�i|$iJ©fEé#H$ˆBiF×a¢| |ÿÿÿÿFßNua@×Ns@ç gÿý"x LB�F×|Jé kôfÿý ) g@$@Õø H‘ø H$ˆ#H © gÿýF× 8 ,g @pÀü&Að hpN@ |ÿÿÿÿFßNu‘ø H#H Ñü€#H © gÿýF×`¼a@×Ns@ç|"x LF×|Jé kôfÿý ) €J€g, @Ñø HJ�fB© Ðfÿý#P © gÿýF×B�FßNu© gÿýF× |ÿÿÿÿB/FßNu.,<¡aüäg <ÿT—` 1GFa Nu.,<¢`Ú|a NuB‡,<£`Æ/ "y LB�‘ù HJé DkúCé D €J€g"@Óù H fô"ˆ"y L© D` /×"Ÿ‘"_NuNuJ¹ @kŽz, n6pN@` Nq=|HNs(FB,B,B€g$f ˜ gm op`".Tfp`&AAúLåˆÑðN�Jg,@ þgÿÿg ÿNqì=@H,g Na ªNsù @?|Ns(pÚ’²Ì"¨xÖ*y (B€-=@éHè c^ @ e@@00=@B€ y LJ( Cg<PìNu0,@}ÿgpNuì f J®TgpNu*y (aÄg fÖ* f"*gȲ®TgÖ`Àa, -fp Nu$@Bj %l5lm Bª&nT fVê "y , )fp Nu&@�‰€€ü& @ÿnè@ j |'J'NBkB«B«B«B«"k +gê * g2aBft3i&Hç0$HaÎLß %L)Kê * g6`"ê ëì%K-KTª g*y ,+S&­+K*y (+R$­+JB€Nu0,@À°lgpNu*,,, n6pN@`Nqp Nu ¬kò+ ftJ+ fë$ka’+g*+ fìAëa^f B¬!Lë B€Nu*y ($ka:fî3i&$HaÊ&nTëë `¶aúB€Nu0,@€°lgpNu|a €ìNu0,@À°lgpNu(,:,aúf*-f”- fpNu!m y 0*¨!M*y (a\g @fØ* fpNu<<ÿÿJ+ fp Nu<* y 0J¨fp Nu$ka`fô3F&$H?að<&nTaØí;F+L$B€Nu/ *y ($ka&g*_Nu$H W3h&)�aª&nT*_­í +@@RfR`ð@ìB€Nu0,@„°lgpNu faÄgNu(,:,aÒfð|!arJ«f/ IëaBB«"(_ìNu0,@€°lgpNu +g*@|!a0gìNu|!aÚföJ«gÉJIë|!aòB«IëaæB«"ÉJ$kB«B«"F«ë B«B®TafB€ìNu0,@‘°lgpNu Ng Aì pN@``*,,, h6pN@` Nqp NupNu, fFa¶fÀ- fp - g B†-a2 NuAí2a†f–B¬!Lí6a¬B€NuKë -g*@JmHgòAí2aTfÿdB¬!L`ÊAëa>fÿNB¬!LB€Nu0,@€°lgpNuJ,g4afò/ |Ií2a´­6­ 6­ 6B­8(_ìB€Nu/ |Iëa†B«"`â0,@é°lgpNu Ng Aì pN@``*,,, h6pN@`Nqp NuJ¬oöaŽfÆ- fp - g B†-a NuAía^fœB¬!Lía B€NupAì o, ~n&QÈÿð",4,Eí g$@²ªfô´jfîpNupNuB€Nuaõg <ÿNuCèB‘¼ ÑÑ||Bi|#B)BiB(1|(-G #|.NTS #Té3l#j3j3j j #l 3l$3l&B€NuAí< g @`øB’ Ší6* fgRmHB€Nu*y ,B€S€Àü&Gõ+gB€Nup NuKë M -g*@¾- fð¼-fêB€NupNuKë, -g *@²-fòB€NupNuKë -g M*@¸­ fðºmfêB€NupNu *g&"@*y ,Aí g°‰g @`ôBi ‘"­+I*y (2* Cí I fNu"@²i fðB© ‘"­+I`â- fV-fN y 0»Èeÿÿ Ш €J»Àbÿÿ y 0Aë (g °�g @`ò!m y 0*¨!MKøNuB€"(g A¹Èfôp`ðJ€Nu2* *y (Aí g @²h fôè `ìNu2* *y (Aí g @²h fô¨ `ìNu2* *y (Aí g @²h fôè ¨ ¨ `àNu y 0J¨gÿÿ*h»Èeÿÿ Ш €J»Àbÿÿ!U MCèJBX³Ènú*«;k +l ;lAë (g @`ö!MNu gÿÿ �!TCBfÿÿ(-f HçppN@LßNu-f - g BmBm4`Bmí F- g y 0Aèÿô (g°�g @`ò!mBm6Bm -<- f>ÑRmgú+l0í |B)Bi, g éí XˆY€XG3m\ˆ]€°­0mÑ -0­ Þ@"m,"ä‰$B` ÙQÉÿü`ÙQÊÿüÑ­,‘­0J’g/a¸$_-gÿ8`4- ga€`Bì­  Uaöˆ­+l gí- ga4`ìa\`þ6aT(_Nu- f4 fî+l,+l0X­,Y­0B€08 U@"Ò¬�ƒÀfr;A*aèÈg nþxí $H“m*- f|"li B- J-fi Bm( ) f 2)Aóÿ;A( -0Aê.‡ nB‡-(Á¾x b ÁA`þ¬í B‡>8  € A`þ�m AêB€08 B‡BjB* 2-(g0ÁT‡U€°­0mþ` -0èÿþB* `þNGíB¬ +g&@`ö'LNu&x 0B­Gëÿô +g&@`ö'MNu5G-f| BjB* m -gG ¾- f / av*_Nu JaèbfNup N@/ -6gÆ-6g¼(m8- 6g<$m8 ¾jg€`ÿÿaÐJ€oâ0< m@&-D(¶€l(�„™­DÙ¬,äŽD` ÙQÎÿü`ÙQÌÿüJ€g|fí 6+H@g,­ 6­ 6a¨ì Uaó­ 6ga `þ> Jaåð`þ4(_Nu/$m< JaýNu/ « g +f ë `ë AëaðúB¬!L(_$@"L'jg*ë `"/ « gÊ +gÄ$L"@'igë  kz,) h6pN@`Nqé|  k(Iañ€(J`° F*x , ª!j!j !j éê k(IañJpÀü&Aõ h(Jañ6(_Nu&nT + g=|HNs 9 - gÌNsHçôJjgfJjf^CêJk°B€)S€Àü&*x ,GõJ«g+f+ g0 Jaã `p)áH+ )áIKë$-g*B°mfð²mfê- fÄg )fžaí`-6f +"g+@8 @'h"B¨í6aúÞLß/NuHçôCêpÀü&*x ,Gõ*k *— gJjf¦* * Aí< g @²( fô´( fî`ÿ:B� Ší6* fgRmH`ÿj Jaâ"­ g,/ (m$ìì+l$gí  UaîòaöÊ(_`ÿT"<ÿ`"<ÿ`"<ÿ*x (Cêp1² QÈÿø3A B‘¼ ÑÑ||Bi|#B)BiBjBª5|4-G `þ2"$ & (Aú0<NAg.H瀀 |`6 DATAB˜³ÈnúNu,HOî€ OCîaêHîŠB®¢~Aî¦1|ÿÿCè"!IB¨Aè^QÏÿèaà~Aî1|ÿÿCè"!IB¨AèJQÏÿè~AîF1|ÿÿB¨Aè"QÏÿðpýNAIî„*L -g (@,gì+lB¬&lkJ,fž f|ÿÿ`Ä   gH瀀 |`H&l ÿÿgp Aú(Cú4°�gAè³ÈnôH瀀 |` (Nû.NTS2.SSCr)m+L`ÿZaô |d0<NA`ÿ>€ oH瀀 |`ÂAú åˆÑðüNФ¤¤šš¤€ oH瀀 |`‚Aú åˆÑðüNÐŠŠŠØØŠ&L€ oH瀀 |`@Aú åˆÑðüNÐ"""öÿÿþÐÿÿþÐ+°+gtadfÿ "úÿ0< I0ÛQÈÿü|ÿÿal`þVaºfþæ0< J4ÛQÈÿü|ÿÿ(HB,aNajgeô`”g |ÿÿ`þ ƒgðÔ&L`Œalfþ˜0< J"K4ÙQÈÿü!k !k!k !k|ÿÿ(HB,aæageô`,g |ÿÿ`ý°a€`ý¨ÔfýÔJ,gýÌ`ÿ LCîÎ$I$üSSCT$ü P.B$ü. ER4üR $:ÖÂraÜÂraÔÂraÌÂraÄÂra¼Âra´Âra¬`DCúbEú "<Ca$:†EîÎ$Â$Â$ Kra‚Âr azAèÂrapÂrajÂr adü ¼ CîÎ" ’‰R�aÐ|ÿÿ`üÔSSCT Error- Code STS BCT R E C # R TH RH Data èaaSAfîNu o^0ÀNu0<NA~Aî¦ (ÿÿf ¼B(1|Bh!|<aaTAè^QÏÿÒNuCî„ )g"@`öB¨#HNu~Eî *ÿÿf Bj"jB€NuEêJQÏÿæpÿNupJ.™f)@¼ Bª%|( JažaäNu/Jg ÿgDü`/ |è0<NA _DüLßNu~EîF *ÿÿfBjB€NuEê"QÏÿêpÿNuAú0<NAg.H瀀 |`è DATA2B˜³ÈnúNu,HOî@ OCî2aêHî~¾Aîž~B0pQÏÿúB®æ~Aîê1|ÿÿCè"!IB¨Aè2QÏÿèa œ~Aî|ÿÿCè"!IB¨AèJQÏÿèAî(¼Aîú¼Cî!I!|~AÖCè"!I!|B¨AèJQÏÿæ~CAîÚCú ÙQÏÿü`”@ ÿÿ NETLOAD SA`@ ÿÿ SY`A IîÈ*L -gJ(@,gî+lB¬ gT gâ g  g ,`¦)m+L`´a B`°a < |,0<NA`˜|ÿÿ`à |™0<NAJ,fÿÿ&l ,lî+ a þ0+@ðÿ @€f˜|ÿÿB++ a ægB€+ Aîž°`€B€+ Aîž0gÿÿ jhCì2 ,€Ѫx0ÙU€núCê| jh",�ÒˆÓüÿ²‰d ,€Ѫh`ÿ"Aê(0¼1|`I!I“üÿ!I NBgˆB�/(JCú(EúNa FAÔ0¼NC0¼NC a¦$La @`þÐUPLOAD ABORTED (DISK I/O ERROR) - STATION $UPLOAD ABORTED (RIM RECEIVED) - STATION $R¨Aê|"HÓü³Áb0Ù`ø%Hh+gþT/ (JCúEú$a œ$_`UPLOAD FINISHED - STATION $AÒ0¼NCB€a ‚`þ+ gH gžažfýì|ÿÿB©BiBi 3k + g0 Sg@ —g$ “gJ`ýÀ|ÿÿ+ a fý®B*g`ý¦|“ %|ab`ý�|S %|aL`ýz¼¡@ a@aPfö`ýd|ÿÿ+ a¦fJJ*ggS*gfýF+ Aîž0g (JCúþŽEúþ²a €AÔ0¼NC0¼NC$L`AÒ0¼NCava¨fýk ¼¢aÆaÖg |ÿÿ`üä+ aâfüØ(JatgB,f`üÈB©BiBi 3k | %|êal|g+ a’ga^$Lað`ü€Aî|PHç0ab)JlLß J€jJCúEúCa è$LaÀ`üPSYNTAX ERROR IN NETLOAD.SA FILE - DOWNLOAD ABORTED J¬lgä)|ÿÿÿÿp)|ÿÿÿÿtHç0$llað @gTfT Df&oB€+ Aîžðfð`Ì Lf ƒÿÿÿ)Cp`º Nfƒÿƒÿÿÿ)Ct`¢Lß `Lß `ÿ,B€+ Aîž0gL ¬ÿÿÿÿpg@ ¬ÿÿÿÿtg4ð°pJAîÚNA .Úa0a-@âCì "üULODB€+ aú.äa˜Cì2üDU.åaˆ .Þ€üê`€ÿÿ€ü<$€ÿajHB0ab8¼AÔNC ,t€ÿàˆ)@$9|8¼ÀB(NCga”B�+ Aîž°`|Aì|)HhB¬xB¬0Cì|B©Bi3k | |€|#lt#lpEìD%I%|a(CúEú!a¦`úJUPLOAD BEGUN - STATION $B€Aîž+ °ðCì|B©BiBi 3k | B€+ aøgaÄ$LaV`ùæAî/MÔ)| )| )| )| a Ö,_AÔNCga‚$La`ù¤$LaDg a\$La`ù�!|Cê||€|AêŒ#h8#h<#h3|'#h8EêD%I%|"a`ù>, .gJ4k`ÊÀ6<ÿþ` ƒ€g ƒ'cÀ` =C ` À`À4<aX6< Gî at4<aD n& f| 6< GîaR4<a" (g6<Gîa84<a (fœBBBC4kJ )gg> Pn8AéK†AB`Ø4Bÿg BnÀ BcÀ=C `HÀÀÀBÿ BcÀ`,Rˆ6<Gîa¬4<a|$< Gî &Â&Â&Â&Â6ÂBn $B|gÀ$fÀ fÀ fÀ fÀ fÀ4B|gÀg :f€J€Lß<NuJ€jÀX�`’QBgQBÀ`ÀBgÀNu4HB€€»Èg64k.f(f @À`< *fÀÁSCn΀€`$HB´CfÀ`< (*ÿþf<*`ÂSCnúNuNq/ &HIúòB€B�"@$@JFf <@@@(_Nua¬J€j €€`šR‹·Èf€@ ;g6  g0a°"H&HazJ€j€€`j ,f€`äR‹·Èf "|€@  g> ;g€  `6$H&HaVk nö€€€`  g ,gâ`êR‹·Èf $|€@(_Nua k0fö #gð€ NuSF4NuJFfò€ÀNu  gNuaê`ôNqHçB€B�Iúæ ,gø4k6 -fÀ`æg0ƒgÁ` =fRŠa`  f@` Lß NuBƒ:< &J $gN4gˆ`&4k&gã‹/å‹ÖŸ�Ö�SEnÞ‚4jø  f"+ÿþNu:<4käfgÌ_�郆�SEnÜ`ºNq€€€@@ P€@  €@ Aú0<NAg.H瀀 |`Ø DATAfB˜³ÈnúNu,HOî€ OCîfaê=|ÿÿ´Aú R-H¸Aî´0<:NAgH瀀 |`‚pÿNA@çî·Aî´0<:NADßgrHzb@ç/:mLßgNwDßX�`.Please kill network first - then initialize Hç`CúÿÌEúÿôa bLß`úH瀀 |`ö®·Hz @ç/:õLßgNwDßX�Aú0< NAgH瀀 |`º SSCT"HAú0<NAgH瀀 |`Ž-|SSCT˜-zþŠœ=|¸¬=|ª-I®Aî˜0< NAgH瀀 |`VŸüp O/ EúÊ0ÚQÈÿü$_ O$zþ@!J0<NAßügH瀀 |`-|NWCT˜-zþœÓüJ-I®Aî˜0< NAgH瀀 |`æŸüp O/ Eúj0ÚQÈÿü$_ O$zýÔ!J0<NAßügH瀀 | `¨AúH0<NAgNH瀀 | `Ž€`SSCTSSCT SSCTNWCT SSCTSSCTa LgH瀀 | `:AHz@@ç/:;LßgNwDßX� <_B-@ rXÂúg-@$�B  -A(Ð�Hzh@ç/:ùLßgNwDßX�-@,2:ØÂü�B-A0Ð�-@42:¼Âü&�B-A8Ð�-@<2:¦ÂüJ�B-A@Ð�Hz@ç/:�LßgNwDßX�-@DrÒzŽ�=ALHz>@ç/:aLßgNwDßX��Âú^�ÿB-AHÐ�=zLN=zJP=| ˆ-|.NTWŒ-@”Aî€0<NAgH瀀 | `ð*H Hz&@ç/:ñLßgNwDßX�Ñ®,Ñ®4Ñ®-|SSCTR-zû V-|NWCTZ-zû^=|ÿÿ´Aú4-H¸Aî´0<:NAgH瀀 |`ÌHzr@ç/:Ñ LßgNwDßX�pÿNAgH瀀 |`œî·=|ÿÿ´Aî´0<:NA=|ÿÿ´Aú -H¸Bn¶Aî´p:NAgH瀀 |`\pÿNAHzJ@ç/:]LßgNwDßX�=|ÿþ´ nbÑüP-H¸î·Aî´0<:NAgH瀀 |`=|ÿý´ nbÑü\-H¸®·Aî´0<:NAgH瀀 |`ÔpÿNAgH瀀 |`Àî·=|ÿÿ´Aî´0<:NA-|€ -|SSCT-zùž-|Aî NC-|SSCT¼-zù‚À=| ÄnÑ-|SSCTî-zùhúAî¼0< NA-|NWCT-zùT-|Aî NC-|NWCT¼-zù8À-|NWCTî-zù*ú-z*ÒAî¼0< NA‘È�€0<NA0<NA áÈ2(n,(¼!NNT)n0 nAìCì" Ò¬ � ‰ IC貉nô(n4(¼!NAT)n8 AìCì" Ò¬ � ‰ ICè&²‰nô(n<(¼!LCT)n@ AìCì" Ò¬ � ‰ ICèJ²‰nô*( ¡f a·(0a¹P`¬ ¢f a·2a¹b`š £f a·B�a¹d`ˆ fa·�`ÿ|a¶ê`ÿtB@09 4€y 6€y 8€y :=@HNs!MAILüMAILB�:û gJJ¹ Lf9÷�?²�`2/Aúÿ¬pNAf$ 9ü"€ÿÿÿ €RUNf�ÿAúÿžpNA _NuAÖ!I !J0¼1|1|B¨Bh B¨NBNuLOADôÿÿÿÿÿ€SEG0 ÿÿÿÿ ÿÿ@ ÿÿ NETLOAD SA`@ ÿÿ SA`A!VM02Waiting for VM board to become ready VM board now ready - proceeding OúýŠMúýAúþ^Cúþ©Hî¸Aúþ Cúÿ›HîAî„0¼@NCgazAî¬NBganAî„0¼NC/Múý¢AúþaÎ,_€ÿ€üg <aBAúý‚NCga6AúýžNBga*Kúþ2-m€"-<à‰á‰Ò­8-A<-|ü8pAúýŠNAgaú(|Ùüü ”WAITgCúþîEúÿAúýHè NBAøˆpNA`ÚAúüìJ¨ gCúþìEúÿHè NBAúý <üЭ8!@ :ý0кý0S€!@!|NBga~=|ÿÿ@Aú”-HDAúýp:NAgadpÿNAga\îC=|ÿÿ@Aúüîp:NA(|Ùüü)zü)|9|' (¼REDYAødp" �RUNgNA`ì‘È�€0<NAHîHpAúüžNDLúü–H瀀0<NA#üü H#üü L <€ ѹ LNs  Hç8 .gJ4k`ÊÀ6<ÿþ` ƒ€g ƒ'cÀ` =C ` À`À4<aX6< Gî at4<aD n& f| 6< GîaR4<a" (g6<Gîa84<a (fœBBBC4kJ )gg> Pn8AéK†AB`Ø4Bÿg BnÀ BcÀ=C `HÀÀÀBÿ BcÀ`,Rˆ6<Gîa¬4<a|$< Gî &Â&Â&Â&Â6ÂBn $B|gÀ$fÀ fÀ fÀ fÀ fÀ4B|gÀg :f€J€Lß<NuJ€jÀX�`’QBgQBÀ`ÀBgÀNu4HB€€»Èg64k.f(f @À`< *fÀÁSCn΀€`$HB´CfÀ`< (*ÿþf<*`ÂSCnúNuNq€€€@@ P€@  €@NETV�NET0€ÿÿÿÿ–ÿÿ�axa:t`,N¹%dDUMY"x,|$iµüfa 8`J#R|øÿB’Bª%|ÿÿÿBª GúÿÊ%KBj%|ÿÿÿþ5|øÿ|&i “gGÓ`ô&Š|øÿNs!VCTÖ¼¾À Ò Ê %d'€'² (f!(ü"P0�%´Ž%d��‘’“%d”cä•/ @ç|JèfB�"x "ˆ!È PøFß"_NuJøfDHçÿþAø@ç| g$"@ ‘f!È |øÿ$iQéN’Aø| fÜQøQøFßLßÿNuPøN�QøJ8f¤NuNuNu@ç*j-,g|$©#JF×`tª>*g4gRjÇ fX g­,fí-`­ ,g` B­X­,AÕa f|$©#JF×`$* |a ¢F×FßNuHçAp@ç|a –$8>&68@FßHC(HD4<  g 4<8***HB g2Hçz,* m6a"`NqLß8`Lßp&*HC6‚€4*AÕaðNqLß‚R�`ÿX?5|$* *g |a þ` |$©#J"*0<@ÂÄjFÂ&jNÓ84gaLî`*_a ¶ _N`Lßÿ\�|JxfNsj?_f aþJ8fNs?_'fö/,x Hî?ÿL× NiHî8`ö@ç8 4gaäî HçÿþNi/ /9d oF,hHV/(@À@ÿ?"h 0P*n6` & fÿr\�,_( „!TCBga ÎJ@gÿJ @f AÖa?`ÿ: @fÿ2J�f&HC4<HBAÖa°Nq`ÿHBHA(&64< ‚HB4`àâˆ&T�(,_" �!TCBga jCð=C^AÖa>¨J®@gþÖ$< ÿÿHCHD6`¤-@L× NiHî8AÖa È.x|øÿMø|"N ) gì,@.,fð#n ®-!Î /.D/.@Qø1øHFpàÀ.-fh|øÿ*n6a  n<€™AÖa®Ü‡(F9n@ÿú)nBÿü-'fLîÿHìÿÿ¾Lî0Hìÿî -/@-@B`ÿ*n6a n, ,"0<2 gB@2g<,*.,(>,°H@0,²H@"@J²f -@g4&@4+HC6+HCAòa*J²gHç@(AÕa Â`Lß ra¶,sf`žLß,sò Rrì ,NuÇ1G*è)!|EXEC°!| ´<(,Æ1F.½Èg$F-ÿ† g†1F,|ð& fa¾Nu1F,X�`5Fa aaaaaaaaaa a aaaaNq?/_'g/ g*8]…š�Nh,œ… n6aV`Nq`"(F CN`&8UC _8ß¿Ãfú/?,ÿú/<<`B† m n _-_¸-_¼/.)g".èg a nbJf\ nCø˜ 1pfÊaü8`rJFf:AÖaý6 HzýŽ�Ÿ`ú P�` €ž`ú ~$.èffffNLî?ÿ,_` z,.ð n6az`Nq`&~ F&(.ô·„f È®ìg-Cô`"R‡È®ìgg°Rnø .ø°nøb ~aN`˜.�/,x ½üg0/ f(.)g .è8gîè,_"¯PøNs,_"/86Nua‚$< 4.&.(.8áL<Aîàa¢`®)Lîÿt®-@&Nuî ,X�`ùJ .`p|Jxf Lî?þ,_Nsjùaö J8gè`ùB®L× NiHî8`ùp`Np`Jp`Fp`Bp`>p`:p`6p`2p `.p `*p `&p `"p `p`p`p`=@=|ç�G` H@0<.H@ xQˆYˆ.H|`ÿV@çHç0x "x,JAkj fah|&)fFïT¯`Ø`J$C#RFïBª€%@ %H%BBjgêáIAøÿ5A$|aœFï`Œa`†Hç8Eé&J|$S ªf"´ªf&’(R(,Ù¸NÙ¸J¸JFï0`:&J&g2$C ªf ´ªf&’(R¸üg(*Ù¬Fï0` `&J&`Ì`$©#JLßNuLß FßNu&i"’¸Nl!ÂNÓ¸J¸JD�'A$‹#J`&(S’¬m &L(S’¬`ô%lÓªD�)A$“&ŠNu/)µßfa`a&Nu#R$©#J$i *ѸNѸJ¸JNu&’$©#J *$SѪNu#R&i +ѸNѸJ¸JNuHøÿÿ@ø!×Ni!ÉH!øL"x:3|•3|µ3| 3|°|`ÞNuNsNu|ð%ax`ö„Høÿÿ1×!ï|LøÿÿNs@ç|JÐkü0ãHâ@S@0€kFßNua:U.ra�FßAÖa`ö6î ,B® (f!NNu*@ - fø+N NuHç .&|ð&î-HîÿtNl-L< 8Kï �� €Pn@rIî™ÀäHd8Ý`(ÝQÈÿüLß0Nuaþì@ç|JÐkü0ãHâ@R@o0€FßNu/ "h!i €0€B© © ,"_FßNu/ xBB�@ç| 0àIDAÒxXäIÒ¸J’¸N’¸RFß� _NupðÀ($@&`h$&@ç|è-f6Hç@ Eø(&"* g ʰ*&còÊ!A %H $x °*&cPøLßFßNuJ¸vf|Hçÿþ!ÏvFï<.xv|9÷0 À÷0.xvLßÿÿB¸vNsRx^ xd^k$/ "x:3|3|53|.3|>"_Bx^NsHçÀÀ x:| xB(( B�28V“¸Nn"x,AéCú1º& 4ùØùØ@ @@ (@ (@ ²@ :ÈùØùØùØùØ@'^! DÀxùØùØùØ@ ‚)f2ŒÀ @ÚùØÀ!èÀèÀ !ÌÀ %¢À "ÜÀ #hùØùØ@–@(Ì@"¼à84gašÿ.)g".èg~a÷öå@kN @,bDGúþž$3g2*HE…ÿ, n6a¬`Nq`øT(FgAÔaò``øD*HNó `ø2$x($ gôä@D@°jnêS@Àü EòJªgÚ4*‚f"²®fÈ-W8BnH?Hz @ç$jNÒ0.Hfø20g÷ž @fAÖaûš`÷¶"( Pa^` T—Nu �!TCBfô*H(m@ gê ᘀÿgÞ@ç|2,$0{Nû€0000>>>>00008Š8Ê8ª8ö8T8ZFßT¯NuFßaù€af``ê¬%FßaNu l` l 9A$Fßaà"HA fa²AÕaúÈNua``ž9A$Fßa€aÐNuaú``ÿ~9A$Fßa^a°Nu9A$Fß l aV"HA faDa„Nu9A$Fß l a*"HA faaXNug"2HA)A`6‚g "2HA)A`)l`‚gY@‚4&(*,. "JåHNûú`|NqNqNq ‚`~NqNq ‚/`hNqHÐ `lNqHÐ /`VHÐ`\NqHÐ/`FHÐ<`LNqHÐKøIøB§$I"xfFJQk$¶1@f&i OJ�g·Øg`öHSAëa÷ºa”Cé QÿÿfÎB„J—g| g4´¬o  g($,aœ‚)aØ®- K gT¯Lß88Nu g@î-|ð&Aí-H”@ç|0ãHâ@S@lü0€a÷p�FßAÖaø^a‚`í�R„R„`œ g*$@ g**º‚m´¬nº¬m` º¬o(J*K fÖNu•¬Õ¬ *,á�GôXf*, $T ,g"@Û© "Šg%INu*ŠgúBªNua÷ nw&Nu"_ g @Aèa÷H`ðNÑ g®JQk iµèlž`µél”µém˜fÿ@JQk’*iHUAíaöT gþâáŠ&J×ÂàŠ(@°ŠnþÒ ,áˆÐŒ°Šn fè`þ¾°‹gþzn gþ®�Šàˆ$`þf&”g"T#K(‹'L'l B¬ �‹àˆ'@‘¬`þHç $nLß0T—Nu$H"x ÿÿg *iµílµémÜJQkÞá‰Òв­bÎ` Cé QÿÿfÐ`ÀCøAíaõv&g C±Ál"H&fô g )áˆÐ‰µÀm¬%B f -��àˆ%@ $ƒ%If*Š`$"Š �‰àˆ�©#@ f *Ñ©#j "’$IJƒg$"C#JJª f )Ѫ%i $‘g"R#J- ð"x²f(i, g Aìaõn`îCé QÿÿfÜAíaõZLß0NuT—`îHçÀ@ç&x0|*S»ëfKëIí&ŒFß+@+H+N (o:”T¯;o+o Uïÿb+o aõ8+A2<ù’àHF@@ÀüúÒ@;ALß8NuBƒB€"x gbEé0)gP—ËJj f ·üf$&J` ±êf´’gB* g f4 f& ÕüS@fÄJƒf"0) K·üf J°i m‘ÈR€T—Nu JNu CNuB€*g B…:(0P$f `¾°P g Q… E læ*T—NuB‚BƒB�"x$( gd4)´i gRB(pJq fJƒf:& „g04)`*±üg±ñf$lµñf$lµñg"Jq k"€SDf²T—JƒfB€B‚Nu Nu qNu gJ�g` N".Nu gô"(g.(f".°®f²®gÖ x±üg°¨f²¨g* h`æJf @Hz?)gB,,Jm g.¼•f*­ Jm f0-@ fB�2- m aù&`aî|ÛüSGfÂNu>, fz,, n6aüx`Nq`ìH$F,g z,, m6aüX` ` JEgJ0Ðf`ì ., m6aúÖ``ìB€00P, f:ÐpPáˆ%@B€$°P 5pP$ª00Páˆ%@B€00Páˆÿ%@ `ë^áˆ-@ `ëT»Îg-,f `ë¤`ëŒ`ëŒ., m6aú\`îJ…gæ0, 2,A'ÿg� f  gÁÁÁ� B‡,,g�  gB† ff-)f ¸fÁ.8xΆެÞ¸xθ|à�"Ff�fAørfRˆ-(fTˆHG>G‡ÿ?HG Gaõ&`(T�S€g`êº`êº2f"AÓa÷f`aì¼`ê¬&H.*á�g, "F m6aú¾`Ê`ÈJ0PfÂ!¬ P 0, @Oÿ gÀ1€P$1¼Pg1¼P àˆ1€PЇS€1€P �‰àˆ1€P�P&ðP$R(-K gá�-G$½Íf *n6aì^*NT�`éª., 8,(M¹Îg ,,f `éðNh)H<*l6AÕaø¬``éÎJ¬@g ,<àˆ°uPe °uPb`éºa`éX05P$@0g@$,25P$ uP a÷ì`aë¨<(SFÜuP;†PSh B†<(  g†1F JFf.05P$@ f$B€05PÐuPáˆB�25P’uPR� @aõú`aëPBuPaëˆBµP BµP$BµPBuPS-Nu*Na*n6aëb`è²»Îgéa`è¦$-2, l a÷D``èä`èØ`èì`èÔ&H$m6.+AÒa÷ `êJ…gÞB…:+á�, gº¬d`èÌ*,…ÿB$,,B, g,+ AÒaø¾` `žJ…faê’J0Pf�%«P B2P' àŽ5†PàŠÜBSF5†PD€Ð« àˆ5€P5¼P+g5¼P5«P$òP$R*Rk -k  NuB‚,"xhJ1 oè"Bƒ,g Co`çüá‹à Hz@çåŠ B/?85gaõ¸îNs85gaõ¨Ý`çj&M*n6., AÕaö†``ç¨J®@gNh àˆ°uPe°uPcç–·Îgçx"E$L.* k6aöP`J…f`çf`çf* ,**fB†<5P* gÜuPáŽB€05P�uP$R@*á�a÷n` `J…faéB`ç2J0Pfö"( à‰ÔA1�P1‚P’u@DAÒu@1�P!µ@ P 1µ@&P&65@$*gƒ* gÃÃ1ƒP$1¼Pg1¼PBu@ÉEaéËDBµ@ Bµ@$Bµ@Bu@S-R(20PÒpPá‰-A  g$$.´«g pP "(KaôÈ`aè„&L$+ ‚`æ,,`&"-6g*,,, Aaö‚`` J…gJ0Pf`æD..)g , g @ �!TCBg` Aì aõ¤``æ N.(f ((g`åø"(6g*,,, Aaö`` J…gJ0Pf`åâHzÿ”?,--gGÿg­-g- ,gSs­-f­ ,Ss3g³ gAóaègl A g+l  g+l  g- ,fAÕaè\`äV g í,`äF gØí ,`ä6J­@fä~B‚,gfäŽB‡, g*,, m6aô�`Nq`ä`fädB†&, $‚0¶‚l&ƒÿà‹HC8pHC Caîz``ä ¼!ASQ!l!F Gè,!K!K!K 1G(áŠÔˆX‡”‡!BBƒ,481B&;01B$Bh*+H@`ãh $L(m@ gb.)g@"j B€ cPr fY fP@R@€°l(b0@ç|4,$6{ (Nû°$z,* n6aó�`Nq`ã`"F`ª`ã8`ãd0000<<<<00006‚6¨6Æ6ê6\6bFß`ã&Fßaå aÈa`Fß`âì¬%FßaÖ`â� l` l B9B$FßaàAÕaæp`âja‚a¼``¸9B$Fßa€ar`âD9B$Fß l a†aT`â&a>az``ÿv9B$Fßa`aã”Nu*N(n@ g@ç|4,$4{ Nû `áJ<fˆ�<fˆ�6666666600000000Fßaã �&\e�&\R€HÔ`ÖÂ&L- ,g×zJaÿœ(FCí0<"ÜQÈÿü+mt+m ”+\B0-è+\è-èø�-è@A--gÖj+lÿîô;lÿúø+lÿöú`ÖTAÖaÚD`Ör­ ,gÖ AÕaÚB`Ö6&L- ,gÖŠzaÿ(F--f­@`­ø+lð+lô+l ì+løBmø-è8�-èJgF--fí@`íø.-èg&z,-ð m6aæ>`Nq`Ö†(Ff+Tô­ ,0-,@ÿfAÕaÙ‚`Õ|@ç$, 6,|B„g (,nFß`ÕÔB… g *,fÆaÙCÀg*B†6, gƒg´�lJ„gÔ„`ô‚&\`6,$Ô„"x,Eé|&J$S gλêfð*fèJ†kºªfÞ&’ R±éf (ѸNѸJ¸J` *ѨF×J†f2%M„%D %lBj%EÃ5C”�|aÖBF×`‚RFCf* g0êªêB‚Hç~|aÖ FïLß~J†kÿF`@|$©#JF×J†kÿ0`*J†f| )g $@#RF×`ÿ`Fß`ÔXSFnFß`ÔVFß`Óü&Lz`aüà(FCí0<(ÙQÈÿü(íB8í@ -è€ÿÿÿ(À(í,0-è@ø8À(íð(íô(íì(íø--gÓ¨)môÿØ9møÿä)múÿà`Ó’*N"(n@ g<,'f8Nj~,'f‡<.)f&*, n6aãè`Nq><€™AÖaÏF`ÓŽ`Ó–&F`&J ‡oLÛ}Hî}LÛ|Hî| .‰0@ÿ/gÀ?@/[ÔÇNb@ç|4,$4{ Nû <d”d<|”|0606060600000000FßaÕ(Fß`Ò¬FßgÒ¢)l"lJ)j)iaô¸`Ò¶g B9B$Fß`Òlg B9B$Fß`ÒTFßgÒJ l aòÂaôn`Òl>,.(f‡J”gz, n6aâ°`Nq`Ò€J®@gÒX,‚Eø˜J2 fÒJ¼  Eø¨Äü%Ž %® 5¼ B² %” Br 5‡ 2` ò `Ѽ.(f -(fÒ,°-%cB® m%#`Ñò@$@&`цBG`><&,"x$0àH°i lF(¸±0f>Jq0 g8 10f ¾10g.‡0Jq0 j&10JGg Añ0aÔ`Ñ2Añ0aÔ°`Ñ&`Ñv`Ñz,*H"x0 g i‘É*$ n6aá�`Nq`Ñ`$F&äŠS‚$ÙQÊÿü$F(M"x0&Q—ÉÙË$ÌÛÃ$Í`ÐÒ.(f`Ñ"@ç2<€tÿaÑhNqLÜ.<&\¾„b˜‡Rƒ`ö|!Ã>&8J–¸N–¸R–„׸R¸RaFß`Ð|"8R’¸JÒ¸N�&\�"AB�tÿAúaÑ`aÒÂNu@ç|R¸>¸&\RaÀFßNs . €Kª{ûfÐfJnpg x:(fÐR xUˆ, z n6aà”`Nq`Ð8*FLîÿN•,x *n6aÒ’`Ïâî ,`ÐJ”f@",g.(f".*y»üg(²­f-(f ½Ígí-g:*m`ØAÔaßz`B® `ÏÈ*H½Íg-(g .(f`ÏÆí-fϰ0,gÀí);@*;m,.-m +n°+n´­ ,­-­ ,g2 m”@ç|JÐküCèÿâJ© g»é g"i `î#m RP�Fßm-ÿ,|ð&­ ,gí-@ç|­-g < @ ( g °�fô!m AÕaÒ°Fß`΢î)=H*fî*.(g. (gL× NiHî8aÐà.-g`$.)fÎ=H*=n,.î--n°-n´(N"x,Eé&J@ç| g$@¹êfaÐ*`&J `êFß,)gaàb ,Tg @B¨!x<!È<&,(,ì)"x)-f2¸©f¬),)g) ,g¶©àf¸©äf ><@AÑaɤ"i f¾,)gaòòNqaõŽ,)gaôÖ~Cø˜Eø¨"Âü 1pf2g/aÈ.., ,gaÐR‡ ‡oÄaëæaà²J¬gH4<HB4,&,8,HD8,°*,²<,¶HF<<.,*>,,)g<<$LAìaÕfNq(JCø )g¹Àg"@`ò#laÏ‚B¸ rAÔaÙÚ`L× NiHî8aÏ$`ÌÜ-mp =m("--gÌš`ÌöIëÿþ6<€a&NuT—Nu&LLìpHF>,6.(Ba ``Ìø`ÌfAÓaÜL``pT—NuB€8qH@0< @aÖø`pT—Nu*H4<B˜QÊÿü+S +fgJ€f `<.p .;Fp+@aÚ€fDÿ;D(+El+EB;|„FHD0àHgfJg¸.%c.%D%°c@$@&*¼!TCB|€,;|:;|0$MÕü`+J6$¼!TST|5|$5|D x -"-±üg"°¨f²¨g h`ærAÕaØ^NqpT—NuaÍî`pT—Nu+x!ÍNufg2 .".` ", , g.(g J�g` .".+@+ANu.(gË<*<,, n6aÛ^`Nq`Ë.,gË0&Fp&ÝQÈÿü`Ê®@ç, gzR` ,gz,. n6aÛ`NqFß`ÊÀJ”f6".*y»üg,²­f-(f-,g-.fB*m`ÔAÔaÚ,` B® Fß`Êx*H½Íg-(g.(fFß`Êt-,f Fß`ÊZ-m -.fX>,aþÌ+mlB<-(F€g@z,-B m6aÚf`NqFß`Ê4+FB:(0P$g00PÑpPÑpPBpPQ… E làBm., gGìLÛÿHíÿLÛHí |­,0-,@ßfF×AÕaÍfFß`É^@çJ”f8".*x»üg0²­f-(f½Íg--fí,gJ*m`ÐAÔaÙ` B® Fß`ÉR*H--fì½Íg-(g.(fFß`ÉFí,gFß`É,;m,.-m |­-gCø I"h ³üg ³Ífî!i Fß`È¢|®-fî,|øÿ`Ȱ|øÿAÖaÌ€0.^gÈvBn^`Èü-n Hî)`È^-n Lî)`ÈN Ma`ÈF@ç|¨,f è-FßNu (Xg"Hçp$@"x,GéµÓg&S`øaÊB¨XLßFß0(^g1|1@|ABh^aËèNu*N(n@ g(,'f$@ç|.-f 4,$4{ Nû Fß`Dz`Çö`ÇþN6z6N6z60606060600000000FßaÉäî , 9B$Fß`Ç„9B$Fß)l"lJ)j)iaé^`ÇX9B$Fß l aç”aé@`Ç:..)f,fz n6a׆`Nq`Ç. F$H"*f`ÇDAøŒAøŒaɰGø"SJ“g²©gØGé`ì f¾.)f, n6B…*ç�Ea×&`Nq` B€* e c @dpËa„r Âj A fp ar"xhJ1gj´*fª *ÿg Jª fpÇaH *b *dpÌa4GêB…*g0 opÎaS…ç�2*²sPdpÏa ²sPd pÏa``\Q…lâp Àjf" * @fRˆHy]6? *(SJ“fp a¦Gì°¬fì*,Ig°,(gp a† ¬g(l`ð"SJ“gGé`ô j p(R@ @Hç€8aÏö` LßpaÿJLß"HíˆB˜S€nú*g)I&‰"¼!CCB*giHLê?Hé?))àáˆ3@B@3@@GêIép)+g(Û(ÛS`öB€*åˆ#@D&j ×Ó#K )ÿf#|bæ*géI*géH`R*fbB€*&xhJ3g:(iD &TGëÿ¶*` &lJ¬g +*²n(K`ê¹Àg #K)I`#K&iD3|N¹J#|cšLIéJ&ŒB€* xh¼ÿ iÑè*I/N�,_`‚`jp aøp aôpað gFo opÁaÜ n6B€S&@B… f )e: )c )€e* )�b".)f;°g,aÔ ` Nq`š×ËGû°ÖÓNÓÿþ Ê Øî *aºf² © ©HfV")D(A&TGëÿ¶ `&lJ¬faŤ°‹g(K`ê¹Áf$J«g&(k9|N¹J)|cšLIìJ&kD&Œ` )k`B�)(&iDHzºÐ&Ÿ&xhB3Iø &TJ”faÅD°‹gIë`ì(«AøŒaÆD IraÏÊ`@aÅp�az&Iaø"Kfpal)Hgp‚a`)IgpƒaT)Ig .(gþ€)Igp a6 )c )c )€e )�c*g< * d pÆa¢`žj :#j `Á< )AîDJ�g"P°©gAé `îF€NuX�B�AøŒaÄ `Á AøŒaÃú`Àp,m4B€-9f NpN@`F|q|ptAíp!­< g ­€pX‚€ ­8 T‚´-:cm:pLí<pažNuHç`CípB€ m"-+g|00J)fFÄ)fCéS`â0))gJ0`(©0-&ЈfS€�ˆ$J0U@løB0 UBlø@À@FÀ-Hg Hç:aÿ Lß\øLß|NuLß|ÿþNuHç m4pN@`Lßx`LßxNu84g @ça͆îFßHç€Ä*oKíÿ°"m/ N‘*_e -g*@`êLß#X�|JxfNs`· 85gaÍ>îHç€Ä 8g*@ m ( g / @çN°Fß*_ -`àLß#|JxfNs`¶Ö`þa@×Ns@ç/ |"xLJ¸HfÿýFï|JékòfÿýSin kF|B©p&i—ü€×øHÓfÿý#S©gÿýFïB“B«B«B« "_FßNuRifÿý©gÿýFïB/&|ÿÿÿÿ"_FßNua@×Ns@ç|/ "xLFï|Jékòfÿý0)°ioPSink@B©p i‘ü€ÑøHÐfÿý#P©gÿýFïB�B¨B¨B¨ "_FßNuRifÿý©gÿýFïB/ |ÿÿÿÿ"_FßNua@×Ns@çB/BgB§JAoÿý`aÿNf| —.ˆRoQÉÿê| _2n |ÿÿÿÿFßNua@×Ns@ç/ ±ügÿý"xLB�Fï|Jékòfÿý ©�gÿý‘øHÑü€#HJ©pfJifÿý‘ü€#HpRioÿý©gÿýFï"_ |ÿÿÿÿFßNua@×Ns  @J€g aÿt`ò |ÿÿÿÿNua@×Ns@ç±ügÿýJ¸HgaR|FßNuB€( "x$"iD ÿg°gÓüXJfò|FßNuBhB( B( B�i|$iJ©fEé#H$ˆBiF×a| |ÿÿÿÿFßNua@×Ns@ç gÿý"xLB�F×|Jékôfÿý ) g@$@ÕøH‘øH$ˆ#H ©gÿýF× 8,g @pÀü&Að hpN@ |ÿÿÿÿFßNu‘øH#H Ñü€#H©gÿýF×`¼a@×Ns@ç|"xLF×|Jékôfÿý )€J€g, @ÑøHJ�fB© Ðfÿý#P©gÿýF×B�FßNu©gÿýF× |ÿÿÿÿB/FßNu9÷f )Ofp$qNÒ$o/iT"iX)ÿÿgäH€LßNu**SDLC**PRIMARY 68000 VM02 09/07/83ü÷ü÷ü÷ü÷ü÷ü÷ü ÷ü÷ü~÷ü÷üà÷Aú’"|22<@$Hzÿþ$Ÿ%HQi% Bj ±ügh h hh`Bª $_±ügB©aû\ I"y$ )OfR±é0fL )PfDü÷ü÷ü÷Hçàþ,y$Lî RlL$mHaDEø&J|ÿ` Š` /û/NsHç€`B@ü÷9÷"y$$qNÒ9÷g> @f ü(÷`& @f ü÷` @fJ9÷`ü0÷ü8÷B@ü÷9÷9÷g "y$$qNÒLßNs|ORlH|ü÷ü÷ü÷üë÷9÷fTAú+HAúè*ˆHí LßHç€``ÿ|9÷ü÷ü8÷f`ÿ\LßHçàþ,y$Lî ü÷ü÷Jlgb2lAú&*ˆAúT+HHí LßHç€`ü÷`ÿSi&mü÷ü8÷`þìü8÷LßHçàþ,y$Lî RlJ+  g`+ €,"f8ñ€,#T,#,#R,$,$J“g²,g S( fï` f|P@ Aú¦*ˆAú„+HEë+  g2k`2|Hí RlN°+ g ÿgJü/ a e6Hzÿþ$Ÿ%KTl% l$ k k k kB*$_ü€÷ë ÷üÀ÷LßHç€``ý¶9÷f†$i,ê ÷* fEú`Eú¾"ŠEúN#Jü8÷`ýt$i,ê÷Eú"Šü8÷`ýV$i,ê÷Eúz"Šü8÷`ý89÷fg`Bü÷$i0RjT$i,| ü÷ü8÷LßHçàþ*y$Lí8,`¨ü÷ü8÷`üÎSi&m$i(Ú÷#J(`Eú "ŠEú#Jü(÷ü8÷`ü–9÷ gÿ^Eú´#Jü÷ü8÷Eú"Š`üfLßHçàþ,y$Lî + fü8÷&S fýRlR`ºü÷Aú*ˆü8÷LßHç€``üü÷Eú"Šü8÷`ûöü8÷LßHçàþ,y$Lî RlP`”9÷ü÷ü8÷$i0RjVgÀ`ûª`ÿÿ|ORl(Aú¤+HAú@+HAú.+H &mHEë"|2mL7IlB+ Hí ;|ÿÿ\|ü÷Ô÷ü÷ü÷ü÷üý÷ü÷ü€÷ü ÷üP÷aXLßHç€``úö9÷ü÷ü8÷`úÜ9÷fgFü÷ü8÷`ú¶ü÷ü8÷LßHçàþ,y$Lî |€ Rl0`²ü÷ü8÷LßHçàþ,y$Lî |€ Rl2`n$i,y÷ ü8÷* $i0°g ÿfÿ†Eú#JEúÿD#J`ú$i,y÷ * fEú`EúJ#Jü8÷`ùèy÷\Eú#Jü8÷`ùÌy÷]Eú#Jü8÷`ù°Si&m$i(ù÷#J(`Eú#J9÷ü8÷`ù€$i,| 9÷$i0Rj4ü8÷`ù\9÷LßHçàþ,y$Lî ü÷9÷ü0÷ü`÷ü8÷/ ae6Hzÿþ$Ÿ%KTl% k k k k k @$_gg | Rl6g | Rl8 + gêJ+ g + f¸J,f°0 R@‘k kÿÿf| Rl:`¤+ fP0-\°kf -Pf | Rl<`+ éà°,"g|@ Rl>+ gH`r, ",à"+ g`Z Kað†gjN Kaò`D ‹lBkB+ RlB`RlDJ,gS,g$|ÕË"|2mL7IB+ Hí Aúý`+HAúü´+H;|ÿÿ\Rl@ü÷üý÷aÜLßHç€``÷zü8÷ü÷ü÷|ORlL&l$mHaEøB,`.`û˜ü÷ü÷|O+ fU,#,#S,$J¬g2J+g÷.S+f÷&|"K$Ka–&ICìµÑg"Q`ø"‹f÷&mH`ôæ|RlF` | Rl.ü÷ü÷ü÷üà÷Rl*a &l$mH|OFü%B, * f*` * f*` *S f** g @g g` B,|% -Pf|ÿ *— f*"Ja¶$IaÀ` B€* ï f"Ja–$I gÒ`ÿÂ@ f |%`Ø gÐ gÈgÈ g4 -Pf* + f *s f|%B,"B,#`„``d +“ f *s f|%B,"B,#`\``< +S f *s f |%`<`` +¿ g +ó f*+ °* f"Ka²)I"Ja´$Ia¾```â`äJjfÖB€B�B‚* ê,#â ,$g·üg+ f + â Ò²gSSk’`îB�* è A# gB€+ ï gBf˜J,$gø°°f(*  fF"Jaò$I fþ. -PfÈ`,"K+ gaÐ&IB,$`®` aÀ&IS,$`ˆ|ÿ g”B�+ ï f"K+ faŽ&I`Øa†&I`h"K,$·ügX+ fJgLSJ+g4S+f."K|+ g aRB,$`$+ fS,$a<&I`°B+ + f&S` &I)K g‚* g @g g|ÿJ*f6`L* ï g& *S g * g * g *— gf"J* faº$I`�a²$Ia¼`"Ka˜)Ia¬ ,f ¬f9l`9l `|% ¬f9l `9l L`ðvAúð B€0,gÀü22@2<$@ç/:WLßgNwDßX��ÂúT�ÿB-AHÐ�=zBN=z@P=| ˆ-|.NTWŒ-@”Aî€0<NAgH瀀 | `ð*H Hz&@ç/:çLßgNwDßX�Ñ®,Ñ®4Ñ®( ¡f aÞº0aáÈ`¬ ¢f aÞ¨2aãN`š £f aÞ–B�aá¬`ˆ faß"`ÿ|aÞ|`ÿtB@094€y6€y8€y:=@HNs:üÅgNu&lAú pN@` `ÔHDIO*H0<"m6Eé " ¼!UDRáŠ]‚„ü 1BB¸0$:Ìg2 BpN@`aê!È0aEè ŠáŠQ‚„üÄüÔŠ!B1úž4!ü˜aJ¸fœB¸GúÚCë <€pN@`ad4+;B,g +x !ÍEëpB�JjgR�EêQÈÿòGë(m6AIì p(ÛQÈÿü “!TCBg†aê.x2<ÀaD/:ÄNuHVMù,¯@î|MîHÖ?ÿ-_8-O<2<¢a`ø,áŽ,FÝÈB†-½ÈnúNu0<`0<�F虀2<é™"x:Cé2�A02�2€@02€Nua&a°‹fa†a†°�faÿ|Cí!ÉaÌazNuB€Aúb°Pgaÿ^B‡EЇ Eê Rÿÿfð‡#à�*(B(:亄c*„ÿBKúû‹" B*AMúO,Bœ�°º´f†` (<•B*DB†º„baþöNu hÿÿ g2a8 ÿfaX`"aúJga.`aF°ŠfCéÿö`aÂa`Æ3|ÿÿ Nu~Aè Cé ((„ÿB*(B*DB†º„baþŠNu•ÊB�B‚BƒIÕKõhHz"?$|x4YÕÀv5SƒfúS„fð$@Õüð#ÊP4¼ Ð#üTNu‹‹f ÷ ÿÿ' INET GETSTA AF**rrGETSTA SA33 brrIPSDLC AFDDrrIPSDLC SAMM6rrLOADV2 AFVVrrLOADV2 SA__'brrNTBLDTB AFˆˆrrNTBLDTB SA‘‘ ÿrrNWTEST AFººrrNWTEST SAÃÃrrOUTTERMSAFÌÌrrOUTTERMSSAÕÕrrSRSN SAÞÞ&9rrGETSTA ROrrIPSDLC ROrrLOADV2 ROrrNTBLDTB RO""rrNWTEST RO++rrOUTTERMSRO44rr=/*=/*†INET.GETSTA.AF=/*0=/* Chain file to assemble Get Station ID module=/*:=/* If no output argument is specified for the listing the-=/* chain file will default to INET.GETSTA.LS=/*=/IFC \1ƒ=ARG�INET.GETSTA.LS=/ENDIF=/*+=ASM INET.GETSTA.SA,INET.GETSTA.RO,\1;RZ=60=/*{ Included files are:=/*ƒ9995.&.TR1.EQ=/*}=/*=ENDéééé éé"GETSTA„IDNTƒ1,1�Get�station�IDH*v*********************************************************************** GETSTA module(*ƒReturns�station�ID�to�requestor�in�D1.*,*‹IF�'STATION'�parameter�in�IDLCP�module�=�0*‹THEN*Žstation�ID�=�0*‹ELSE-*ŽIF�'SYSPOFF'�parameter�in�SYSPAR�module�=�0:*ŽTHEN‚{This�must�be�a�VM02�board�performing�its�own�link}1*”Read�hardware�register�to�determine�station�ID.3*ŽELSE‚{This�must�be�a�VM02�board�that�is�depending6*•on�another�VM02�board�in�the�same�chassis�to�perform *•the�link.}/*”Read�the�mailbox�to�determine�the�station�ID.*I*^*********************************************************************** ŠSECTION�8 ŠXDEFƒGETSTA#ŠXREFƒSTATIONŒSatisfied�in�IDLCP.RO%ŠXREFƒSYSPOFFŒSatisfied�in�SYSPOFF.RO!ŠXREFƒV2OFFŽSatisfied�in�V2OFF.RO**‰NOLIST*‰INCLUDE�9995.&.TR1.EQ*‰LISTŠNOLISTŠINCLUDE�9995.&.TR1.EQŠLIST*-MAILBOXƒEQU„$800�VM02�relative�Mailbox�offsetRUN‡EQU„$52554E00** Get segment parameter blockGETSPB„DC.Lƒ0’Task�name�-�meŠDC.Lƒ0’Session�name�-�me7ŠDC.Wƒ1<<13!1<<8‰Options:�log=phys,�phys�addr�specified%ŠDC.Wƒ1<<11ŽAttributes:�memory�mappedŠDC.Bƒ'MAIL'�Segment�name)SEGADR„DC.LƒMAILBOX+V2OFF†Segment�addressSEGLGH„DC.Lƒ$100�Segment�length*"* Release segment parameter block.RELSPB„DC.Lƒ0’Task�name�-�meŠDC.Lƒ0’Session�N/AŠDC.Wƒ0’OptionsŠDC.Wƒ0’Segment�attributes�N/AŠDC.Bƒ'MAIL'�Segment�nameŠDC.Lƒ0’Logical�address�N/AŠDC.Lƒ0’Segment�length�N/AE*-------------------------------------------------------------------- GETSTA„EQU„*!ŠCLR.L‚D1‘Assume�primary�(ID�=�0)%ŠMOVE.B�STATION(PC),D1…Were�we�right?,ŠBEQ.S‚EXIT�Branch�if�yes�-�return�to�caller*#* We must be on a secondary station7ŠTST.L‚SYSPOFFŒDo�we�have�another�VM02�performing�link?ŠBNE.S‚GET100�Branch�if�yes*E*�We�are�on�a�VM02�performing�our�own�link.‚Read�hardware�register�to*ƒdetermine�station�ID.ŠMOVE.B�$F70018,D1'ŠAND.L‚#$3F,D1ŒMask�to�just�station�id.0ŠCMP.L‚D1,D1ŽSet�equal�condition�codes�for�exit.+B4! ŠBRA.S‚EXIT*D* We are on either an EXORmacs or a VM02 system and we are dependingE*ƒupon�another�VM02�system�to�perform�our�link.‚We�must�get�a�segmentC*ƒcontaining�the�mailbox,�read�the�mailbox�to�determine�the�station*ƒID,�and�free�the�segment. GET100„EQU„*ŠMOVE.L�A0,-(A7)*0* Get a segment which includes the VM02 mailbox.ŠLEA„GETSPB(PC),A0ŠMOVE.L�#GTSEG,D0ŠTRAPƒ#12ŠBNE.S‚EXITAŽTake�error�exit�if�can't�get�segment.*A* Insure that mailbox has 'RUN' in it - isolate station ID in D1.*ŠMOVE.L�MAILBOX+V2OFF,D0‚Read�the�mailbox. ŠMOVE.L�D0,D1=ŠAND.L‚#$FFFFFF00,D0†Insure�that�'RUN'�is�in�1st�three�chars.ŠCMP.L‚#RUN,D0+ŠBNE.S‚EXITAŽError�exit�if�'RUN'�not�there.1ŠAND.L‚#$000000FF,D1†Mask�off�to�just�station�ID.** Release the segment.ŠLEA„RELSPB(PC),A0ŠMOVE.L�#DESEG,D0ŠTRAPƒ#1*EXITA…MOVE.L�(A7)+,A0** Return to caller.EXIT†RTSŠEND éééé=/*=/*†INET.IPSDLC.AF=/*D=/* Chain file to assemble module to Initialize SDLC primary station=/*:=/* If no output argument is specified for the listing the-=/* chain file will default to INET.IPSDLC.LS=/*=/IFC \1ƒ=ARG�INET.IPSDLC.LS=/ENDIF=/*+=ASM INET.IPSDLC.SA,INET.IPSDLC.RO,\1;RZ=80=/*{ Included files are:=/*ƒ9995.INET.INET.EQ=/*ƒ9995.SDLCPRI.TEMPLTS.EQ=/*}=/*=ENDéééééé<.ISDLC„IDNT†1,0ƒInitialize�SDLC�primary�station‰INCLUDE�9995.INET.INET.EQ ‰INCLUDE�9995.SDLCPRI.TEMPLTS.EQ‰PAGE ‰SECTIONƒ8*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*+*„Initialize�Synchronous�Data�Link�Tables™**Ä*F***********************************************************************‰XDEF†DLCBLDCB*$‰XREF†MAXSEC,DLBR,FSSTN,SSINC,TXRTRY1‰XREF†RCRTRY,MXOBF,RCTOV,RTRDLY,TXDLY,PFDLY,PNDLY‰XREF†SZDBUF,TXPDS*DLCBLDCB�EQU‡**+*ˆInitialize�the�SDLC�Primary�Control�Block*7‰MOVE.L„XSDPRBG(A6),A5�Address�of�Primary�Control�Block7‰MOVE.L„XSDSCBG(A6),SDPFSEC(A5)�Address�of�1st�S.�C.�B.2‰MOVE.W„DLBR(PC),SDPBAUD(A5)�Data�Link's�Baud�Rate3‰MOVE.W„SZDB UF(PC),SDPRLG(A5)�Size�of�a�Data�Buffer*.*ˆInitialize�the�SDLC�Secondary�Control�Blocks*,‰MOVE.B„FSSTN(PC),D0ˆ1st�Secondary�Station�#2‰MOVE.W„MAXSEC(PC),D1‡Number�of�Secondary�Stations,‰MOVE.L„SDPFSEC(A5),A4†Address�of�1st�S.C.B.*0DLCBSEC‚MOVE.B„D0,SDSSEC(A4)‡Secondary�Station�#0‰MOVE.B„TXRTRY(PC),SDSSRT(A4)�#�Transmit�Retries/‰MOVE.B„RCRTRY(PC),SDSRRT(A4)�#�Receive�Retries9‰MOVE.B„MXOBF(PC),SDSMXF(A4)‚Maximum�#�of�Outbound�Frames-‰MOVE.W„RCTOV(PC),SDSTOC(A4)‚Receive�Time�Out)‰MOVE.W„RTRDLY(PC),SDSTRT(A4)�Retry�Delay+‰MOVE.W„TXDLY(PC),SDSTTX(A4)‚Transmit�Delay3‰MOVE.W„PFDLY(PC),SDSTPF(A4)‚Poll�Powered�Off�Delay2‰MOVE.W„PNDLY(PC),SDSTPN(A4)‚Poll�Powered�On�Delay6‰MOVE.B„TXPDS(PC),SDSTPD+1(A4)�Number�of�Transmit�Pads‰CLR.B…SDSTPD(A4)Œ*;‰MOVE.B„#SDSCRDM,SDSCST(A4)ƒCurrent�State�of�This�Secondary*/‰ADD.B…SSINC(PC),D0ˆIncrement�to�Next�Station�#‰ADD.L…#SDSLNG,A4Š**‰SUB.B…#1,D1�All�Secondaries'�Initialized?‰BGT.S…DLCBSEC�**‰RTS›All�Initialized,�Return‰ENDéE7=/*=/*†INET.LOADV2.AF=/*3=/* Chain file to assemble module to Load VM02 task=/*:=/* If no output argument is specified for the listing the-=/* chain file will default to INET.LOADV2.LS=/*=/IFC \1ƒ=ARG�INET.LOADV2.LS=/ENDIF=/*+=ASM INET.LOADV2.SA,INET.LOADV2.RO,\1;RZ=80=/*{ Included files are:=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.NTS.LIB.EQ=/*}=/*=ENDééééééNLOADV2„IDNTƒ1,0�Load�VM02�TaskŠTTL„LOADV2.SAŠLoad�VM02*$* COPYRIGHTED 1982 BY MOTOROLA, INC.*K*v************************************************************************** LOADV2 Task.>*„Boots�VM02�board.‚For�use�in�EXORMmacs�system�running� with�a**„VM02�board.‚Runs�on�the�EXORmacs�system.*A*„1.‚Assign�NETLOAD.SA�with�system�default�volume�and�user�number*Šand�catalog�of�blanks.*@*„2.‚Read�the�first�record�from�NETLOAD.SA.‚This�record�contains9*Šthe�file�name�of�a�'.SY'�file�to�load�into�VM02.‚Assign*Šthe�'.SY'�file.*C*„3.‚Read�the�loader�information�block�to�find�out�starting�address *Šand�length.*3*„4.‚Wait�for�"WAIT"�to�appear�in�the�VM02�mailbox.*D*„5.‚Read�in�the�'.SY'�file�into�location�specified�by�loader�infor-&*Šmation�block�plus�an�offset�(V2OFF).*.*„6.‚Initialize�some�of�the�SYSPAR�parameters:"*ŠMEMOFF‚-�Memory�offset�for�VM02.#*ŠSYSPOFF�-�SYSPAR�offset�for�VM02.*A*„7.‚Put�transfer�address�at�$804,�A7�value�at�$800,�and�SR�value *Šat�$80C.*!*„8.‚Put�"REDY"�at�location�$800.*1*„9.‚Delay�until�"RUN"�is�found�at�location�$800.**„10.�Terminate.H*^***********************************************************************)ŠXREFƒEDITFILE‹Satisfied�in�0.&.UTILIB.RO*"ŠXREFƒV2OFFŽSatisfied�in�ILOADP.RO ŠXREFƒV2SYSP*#ŠXREFƒSYSPAR�Satisfied�in�SYSPAR.RO ŠXREFƒMEMOFF ŠXREFƒSYSPOFF** Linked during SYSGEN**‰INCLUDE�9995.&.TR1.EQ*‰INCLUDE�9995.&.IOE.EQ*‰INCLUDE�9995.NTS.LIB.EQŠNOLISTŠINCLUDE�9995.&.TR1.EQŠINCLUDE�9995.&.IOE.EQŠINCLUDE�9995.NTS.LIB.EQŠLIST ŠSECTION�0*B‰EQU„*’Program�base�address. ŠDS.Lƒ$20 STACK…EQU„*** Misc equates,V2STACKƒEQU„$800�VM02�initial�stack�pointer.8V2STATUS‚EQU„$2700ŽVM02�status�=�supervisor,�interrupt�7 MAILBOXƒEQU„$800�Mailbox�addressSYSPARIƒEQU„-1*ŠOFFSET�0’Offsets�from�mailboxŠDS.Lƒ1’Mailbox�itself!V2GO†DS.Lƒ1’VM02�exection�addressV2A7†DS.Lƒ1’VM02�stack�address V2SR†DS.Wƒ1’VM02�status�register ŠSECTION�0*WM`FhMp?xD* Temporary holding areas&V2ENTRYƒDS.Lƒ1’VM02�execution�address.*$*ˆFHS�&�IOS�Blocks�Basic�Information*&NETLUN„SET„3’LUN�For�"NETLOAD.SA"�File'LOADLUNƒSET„4’LUN�For�"???????.SY"�File*NETSFHSƒDC.WƒFHASGN�Assign,ŠDC.WƒFOPPR+FOPISK‡Options=public�read,keyedŠDC.WƒNETLUN�Status/lunŠDC.Bƒ'„'�System�default�volume#ŠDC.Wƒ-1‘System�default�user�numberŠDC.Bƒ'ˆ'‰Blank�catalog�defaultŠDC.Bƒ'NETLOAD�'‰FilenameŠDC.Bƒ'SA'�ExtensionŠDC.Wƒ0’Reserved�-�must�be�0ŠDS.Bƒ8’Filler*!NETSIOSƒDC.WƒIOREAD�Read�function"ŠDC.WƒIOPRAN�Random�record�optionsŠDC.WƒNETLUN�Status/lunŠDC.Wƒ0’Reserved�-�must�be�0ŠDC.Lƒ0’Random�record�numberŠDS.Lƒ4’Fill�to�end�of�P.B.*MSGIOS„DC.WƒIOWRIT�WriteŠDC.WƒIOPIMG�Image�mode(ŠDC.WƒLDFLUN�Logging�logical�unit�numberŠDC.Wƒ0’Reserved�-�must�be�0ŠDS.Lƒ5’Fill�to�end�of�P.B.*LOADFHSƒDC.WƒFHASGN�assign1ŠDC.WƒFOPPR+FOPCON‡options=public�read,contiguousŠDC.WƒLOADLUNŒstatus/lunŠDC.Bƒ'„'�System�default�volume#ŠDC.Wƒ-1‘System�default�user�numberŠDC.Bƒ'ˆ'‰Blank�catalog�default'ŠDC.Bƒ'ˆ'‰Filename�-�dynamically�filledŠDC.Bƒ'SA'�Default�extensionŠDC.Wƒ0’Reserved�-�must�be�0ŠDS.Bƒ8’Filler*JIOPT†SET�IOPBIN+IOPWAT+IOPNOC+IOPBLK+IOPRAN�Binary,wait,no�compl�adr�block!LOADIOSƒDC.WƒIOREAD�Read�functionŠDC.WƒIOPT�OptionsŠDC.WƒLOADLUNŒStatus/lunŠDC.Wƒ0’Reserved�-�must�be�0ŠDC.Lƒ0’Random�record�numberŠDS.Lƒ4’Fill�to�end�of�P.B.** Get Segment parameter blockGTSEGPBƒDC.Lƒ0’Task�name�-�meŠDC.Lƒ0’Session�name�-�me8ŠDC.Wƒ1<<13!1<<8‰Options:�log=phys,�phys�addr�specified.&ŠDC.Wƒ1<<11ŽAttributes:�memory�mapped.ŠDC.Bƒ'VM02'�Segment�name.SEGADR„DC.Lƒ0’Segment�address.SEGLGH„DC.Lƒ0’Segment�length.*&* Configure Directive parameter block.0CDIRPB„DS.Wƒ1’CDIR�Parameter�Block�-�directive�#CDIRPBOƒDS.Wƒ1’OptionsCDIRPBEƒDS.Lƒ1’Entry�address.*'* Error message handler parameter blockERRPB…DS.Lƒ2’Contains�D0ŠDC.Bƒ0’Options'ŠDC.BƒLDFLUN�Screen�logical�unit�numberŠDC.Bƒ0’Query�return�character ŠDC.BƒCDFLUN�Keyboard�LUN*ŠDC.Lƒ0’Beginning�of�text�plug�pool�(none)"ŠDC.Lƒ0’End�of�user�text�plug�pool*0NETSBUFƒDS.Bƒ80‘Buffer�for�reading�NETLOAD�file.NETSBEND‚EQU„*-1*:LOADBUFƒDS.Bƒ256�Buffer�for�reading�blocks�from�'SY'�file.LOADBEND‚EQU„*-1*9MSG1S…DC.Bƒ'Waiting�for�VM�board�to�become�ready',$0D,$0A MSG1E…EQU„*-1ŠDS…0*4MSG2S…DC.Bƒ'VM�board�now�ready�-�proceeding',$0D,$0A MSG2E…EQU„*-1ŠDS…0ŠPAGE9*-------------------------------------------------------- LOADV2„EQU„*ŠLEA„STACK(PC),A7"ŠLEA„B(PC),A6‹Program�base�address*3* Initialize buffer pointers in I/O parameter blockŠLEA„NETSBUF(PC),A0ŠLEA„NETSBEND(PC),A1#ŠMOVEM.L�A0-A1,NETSIOS+IOSSAD-B(A6)*ŠLEA„LOADBUF(PC),A0ŠLEA„LOADBEND(PC),A1#ŠMOVEM.L�A0-A1,LOADIOS+IOSSAD-B(A6)*6* Assign NETLOAD.SA and read first record into NETSBUF0ŠLEA„NETSFHS-B(A6),A0ƒOpen�the�"NETLOAD.SA"�FileŠMOVE.W�#FHASGN,FHSCMD(A0)ŠFHSCALL ŠBEQ.S‚OK1�Branch�on�good�assign ŠBSR„ERROR OK1‡EQU„*4ŠLEA„NETSIOS-B(A6),A0ƒAddress�of�IOS�Parameter�BlockŠIOSCALL ŠBEQ.S‚OK1.5ŽBranch�on�good�read ŠBSR„ERROR OK1.5…EQU„*1ŠLEA„NETSFHS-B(A6),A0ƒClose�the�"NETLOAD.SA"�FileŠMOVE.W�#FHCLOS,FHSCMD(A0)ŠFHSCALL*D* Assign the file that was specified on the first record of NETSBUF.ŠMOVE.L�A6,-(A7)/ŠLEA„LOADFHS(PC),A6…FHS�parameter�block�address8ŠLEA„NETSBUF(PC),A0…Location�of�partially�qual�file�name ŠBSR„EDITFILEŠMOVE.L�(A7)+,A6ŠAND.L‚#$FF8008FC,D0ŠBEQ.S‚OK2�Branch�if�no�error.(ŠMOVE.L�#EM_NVE,D0‰Invalid�entry�message ŠBSR„ERROR OK2‡EQU„*ŠLEA„LOADFHS(PC),A0ŠTRAPƒ#3‘Assign�the�file. ŠBEQ.S‚OK2.5ŽBranch�if�no�error.ŠBSR„ERRORŽGo�to�error�hangup. OK2.5…EQU„**F* Read the loader information block for the newly assigned '.SY' file.ŠLEA„LOADIOS(PC),A0ŠTRAPƒ#2‘Read�the�LIBŠBEQ.S‚OK3�Branch�if�no�error ŠBSR„ERROR OK3‡EQU„**-* Save transfer address as it appears in LIB.ŠLEA„LOADBUF(PC),A5 ŠMOVE.L�LIBENT(A5),V2ENTRY-B(A6)*5* Calculate number of sectors to read for loading V2.ŠMOVE.L�LIBSLEN(A5),D1,ŠLSR.L‚#8,D1ŽD1�=�number�of�sectors�to�read.*B* Grab a segment in VM02 memory big enough to read boot file into..ŠLSL.L‚#8,D1ŽD1�=�number�bytes�in�load�module.>ŠADD.L‚LIBSLSA(A5),D1…Add�in�unbiased�VM02�relative�load�addr.9ŠMOVE.L�D1,SEGLGH-B(A6)„Save�as�length�of�segment�in�P.B.@ŠMOVE.L�#V2OFF,SEGADR-B(A6)�Save�as�base�addr�of�segment�in�P.B.ŠMOVE.L�#GTSEG,D0ŠLEA„GTSEGPB(PC),A0ŠTRAPƒ#1‘Get�the�segment.%ŠBEQ.S‚OK3.5ŽBranch�if�segment�got�ok ŠBSR„ERROR OK3.5…EQU„**+* Wait for "WAIT" to appear in VM02 mailboxŠMOVE.L�#MAILBOX,A4%ŠADD.L‚#V2OFF,A4ŠBias�by�VM02�offset.CHKWAITƒCMP.L‚#'WAIT',(A4))ŠBEQ.S‚MOVEIT�Branch�if�ok�to�move�in�now*8* Output message: 'Waiting for VM board to become ready'ŠLEA„MSG1S(PC),A1ŠLEA„MSG1E(PC),A2ŠLEA„MSGIOS(PC),A0ŠMOVEM.L�A1-A2,IOSSAD(A0)ŠTRAPƒ#2ŠLEA„5000,A0Œ5�sec�delay�to�A0ŠMOVE.L�#DELAY,D0ŠTRAPƒ#1‘Delay�and�go�try�againŠBRA.S‚CHKWAIT MOVEIT„EQU„**@* If we had to wait for the VM board to become ready then output,*ƒmessage:�'VM�board�now�ready�-�proceeding'ŠLEA„MSGIOS(PC),A0ŠTST.L‚IOSSAD(A0)(ŠBEQ.S‚MOVEIT2ŒBranch�if�we�never�waitedŠLEA„MSG2S(PC),A1ŠLEA„MSG2E(PC),A2ŠMOVEM.L�A1-A2,IOSSAD(A0)ŠTRAPƒ#2‘Output�the�message.*=* Initialize load address, and read sectors into VM02 memory.:MOVEIT2ƒLEA„LOADIOS(PC),A0…Address�of�read�parameter�blockŠMOVE.L�#V2OFF,D0ŠVM02�offset..ŠADD.L‚LIBSLSA(A5),D0…Add�load�offset�from�LIB*ŠMOVE.L�D0,IOSSAD(A0)†Set�starting�address.ŠMOVE.L�SEGADR(PC),D0†Base�address�of�segment.ŠADD.L‚SEGLGH(PC),D0ŠSUB.L‚#1,D0ŽEnding�addressŠMOVE.L�D0,IOSEAD(A0).ŠMOVE.L�#1,IOSRRN(A0)†Set�random�record�number(ŠTRAPƒ#2‘Read�the�file�into�VM02�memory.ŠBEQ.S‚OK4�Branch�if�no�error. ŠBSR.S‚ERROR OK4‡EQU„**4* Initialize some of the stuff in SYSPAR thru a user*ƒdefined�directive.:ŠMOVE.W�#SYSPARI,CDIRPB-B(A6)�Put�directive�number�in�P.B.,ŠLEA„STRTADR(PC),A0…Directive�entry�address.3ŠMOVE.L�A0,CDIRPBE-B(A6)ƒPut�it�in�parameter�block. ŠLEA„CDIRPB(PC),A0ŠMOVE.L�#CDIR,D0ŠTRAPƒ#1‘Configure�directive!ŠBEQ.S‚OK5�Branch�if�configure�ok ŠBSR.S‚ERROR OK5‡EQU„**0* Now invoke the directive that we just created.%ŠMOVE.L�#SYSPARI,D0ˆDirective�number.ŠTRAPƒ#1‘Go�stuff�SYSPAR.!ŠBEQ.S‚OK6�Branch�on�good�return. ŠBSR.S‚ERROR OK6‡EQU„*** Disable the directive.6ŠBSETƒ#5,CDIRPBO+1-B(A6)�Set�option�to�disable�in�P.B.<ŠMOVE.W�#SYSPARI,CDIRPB-B(A6)�Put�directive�number�into�P.B.%ŠLEA„CDIRPB(PC),A0†Disable�directive.ŠMOVE.L�#CDIR,D0ŠTRAPƒ#1*I* Put transfer address at $804, A7 value at $808, and SR value at $80C of*ƒVM02�memory.ŠMOVE.L�#MAILBOX,A4ŠADD.L‚#V2OFF,A43ŠMOVE.L�V2ENTRY(PC),V2GO(A4)�Plug�transfer�address.-ŠMOVE.L�#V2STACK,V2A7(A4)‚Plug�stack�address.6ŠMOVE.W�#V2STATUS,V2SR(A4)�Plug�status�register�value.*D* Put "REDY" into mailbox and delay until "RUN " appears in mailbox.ŠMOVE.L�#'REDY',(A4)*ŠLEA„100,A0�100�ms�delay�to�D00CHKWAIT2‚MOVE.L�#DELAY,D0ŠDelay�directive�number(ŠMOVE.L�(A4),D1ŒWait�till�it�says�'RUNx'*ŠAND.B‚#0,D1ŽNull�the�low�order�character.ŠCMP.L‚#'RUN',D1%ŠBEQ.S‚DUN�Branch�if�ok�to�terminate.ŠTRAPƒ#1ŠBRA.S‚CHKWAIT2 DUN‡EQU„** * Terminate ŠERQ.TERM** Error termination hangups.;ERROR…MOVEM.L�D0/A0,ERRPB-B(A6)�Save�regs�in�error�msg�P.B.)ŠMOVE.L�#2,D0ŽCode�for�error�message�callŠLEA„ERRPB(PC),A0ŠTRAPƒ#4*ŠMOVEM.L�ERRPB(PC),A0/D0ƒRestore�registers7ŠMOVEM.L�D0/A0,-(A7)‡Save�registers�on�stack�for�debug. ŠERQ.ABORTŠPAGE%*************************************%* Code for user configured directive.*ƒStuffs�things�into�SYSPAR.* STRTADRƒEQU„*1ŠMOVE.L�#V2OFF,MEMOFF†Memory�offset�for�V2�board.2ŠMOVE.L�#V2OFF,SYSPOFF…SYSPAR�offset�for�V2�board."ŠMOVE.L�#V2SYSP,D0‰SYSPAR�on�VM02.%ŠSUB.L‚#SYSPAR,D0‰SYSPAR�on�EXORmacs.'ŠADD.L‚D0,SYSPOFF‰Adjust�SYSPAR�offset.ŠRTE*PATCH…DS.Bƒ50‘Patch�area ŠEND„LOADV2=/*=/*†INET.NTBLDTB.AF=/*<=/* Chain file to assemble module to build NNT, NAT, and LCT=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to INET.NTBLDTB.LS=/*=/IFC \1ƒ=ARG�INET.NTBLDTB.LS=/ENDIF=/*-=ASM INET.NTBLDTB.SA,INET.NTBLDTB.RO,\1;RZ=60=/*{ Included files are:=/*ƒ9995.NTS.NNT.EQ=/*ƒ9995.NTS.NAT.EQ=/*ƒ9995.NTS.LCT.EQ=/*ƒ9995.INET.INET.EQ=/*ƒ9995.&.TR1.EQ=/*}=/*=ENDéééééé €'NTBLDTB‚IDNT†1,0…BUILD�NNT,�NAT�and�LCT*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*?*ˆSubroutine�to�build�Network�Name�Table,�Network�Address�Table*˜and�Logical�Connection�Table*Žfor�Network�Services**ˆEntry�Registers:*’A6�=�Pointer�to�DATA�segment'*’A5�=�Pointer�to�.NTW�segment‚(tables)*‰INCLUDEƒ9995.NTS.NNT.EQ‰INCLUDEƒ9995.NTS.NAT.EQ‰INCLUDEƒ9995.NTS.LCT.EQ‰INCLUDEƒ9995.INET.INET.EQ‰INCLUDEƒ9995.&.TR1.EQ*‰PAGE ‰SECTIONƒ8‰OPT‡PCS*‰XREF†MAXSEC,FSSTN,SSINC ‰XDEF†NTBLDTB**ˆBuild�Network�Name�Table*)NTBLDTB‚MOVE.L„XNNTBG(A6),A4‡Start�of�NNT"‰MOVE.L„#'!NNT',NNT(A4)…Eyecatcher)‰MOVE.L„XNNTSZ(A6),NNTTSIZ(A4)�table�size+‰MOVE.B„XSTATION(A6),NNTHSID(A4)�Station�ID*.*ˆPut�all�entries�in�NNTFHDR�(free�entry)�list'‰LEA‡NNTFHDR-NNTNEXT(A4),A0‚List�header ‰LEA‡NNTENTRY(A4),A1…First�entry‰MOVE.L„A4,D1�Start�of�table"‰ADD.L…NNTTSIZ(A4),D1†+�size�=�end7‰SUB.L…#NNTENTRY,D1ˆend�-�entry�size�=�last�entry�start=NTBNNT2‚MOVE.L„A1,NNTNEXT(A0)†Save�next�entry�addr�in�current.‰MOVE.L„A1,A0�next�entry�becomes�current�entry"‰LEA‡NNTESIZ(A0),A1†new�next�entry‰CMP.L…A1,D1�End�of�table?‰BGT‡NTBNNT2�Branch�if�NO**ˆBuild�Network�Address�Table*"‰MOVE.L„XNATBG(A6),A4‡Start�of�NAT"‰MOVE.L„#'!NAT',NAT(A4)…Eyecatcher)‰MOVE.L„XNATSZ(A6),NATTSIZ(A4)�table�size*.*ˆPut�all�entries�in�NATFHDR�(free�entry)�list'‰LEA‡NATFHDR-NATNEXT(A4),A0‚List�header ‰LEA‡NATENTRY(A4),A1…First�entry‰MOVE.L„A4,D1�Start�of�table"‰ADD.L…NATTSIZ(A4),D1†+�size�=�end7‰SUB.L…#NATENTRY,D1ˆend�-�entry�size�=�last�entry�start=NTBNAT2‚MOVE.L„A1,NATNEXT(A0)†Save�next�entry�addr�in�current.‰MOVE.L„A1,A0�next�entry�becomes�current�entry"‰LEA‡NATESIZ(A0),A1†new�next�entry‰CMP.L…A1,D1�End�of�table?‰BGT‡NTBNAT2�Branch�if�NO** *ˆBuild�Logical�Connection�Table*"‰MOVE.L„XLCTBG(A6),A4‡Start�of�LCT"‰MOVE.L„#'!LCT',LCT(A4)…Eyecatcher)‰MOVE.L„XLCTSZ(A6),LCTTSIZ(A4)�table�size*.*ˆPut�all�entries�in�LCTFHDR�(free�entry)�list‰F’;šA¢;ª'‰LEA‡LCTFHDR-LCTNEXT(A4),A0‚List�header ‰LEA‡LCTENTRY(A4),A1…First�entry‰MOVE.L„A4,D1�Start�of�table"‰ADD.L…LCTTSIZ(A4),D1†+�size�=�end7‰SUB.L…#LCTENTRY,D1ˆend�-�entry�size�=�last�entry�start=NTBLCT2‚MOVE.L„A1,LCTNEXT(A0)†Save�next�entry�addr�in�current.‰MOVE.L„A1,A0�next�entry�becomes�current�entry"‰LEA‡LCTESIZ(A0),A1†new�next�entry‰CMP.L…A1,D1�End�of�table?‰BGT‡NTBLCT2�Branch�if�NO‰PAGE*0*ˆBuild�table�entries�for�System�Service�Control*œand�Network�Control*-‰MOVE.L„#SSCTASK,D5‰Start�of�name�=�task�name7‰MOVE.B„XSTATION(A6),D7‡Station�ID�will�be�last�2�chars‰MOVE.B„#SSCNAU,D4ŠNAU�for�SSCT-‰BSR.S…NTBENNT�Build�Network�Name�Table�entry.‰BSR‡NTBENAT�Build�Network�Address�Table�entry**ˆBuild�LCT�entry�for�SSC‰CLR.L…D3’LCC=0�for�self‰BSR‡NTBELCT�Build�entry(‰BSET†#LCTCSSCT,LCTCSTA(A1)�Set�SCT�flag*,‰MOVE.L„A3,A5�Save�NAT�entry�address�of�SSCT‰MOVE.L„#NWCTASK,D5‰TASK�NAME‰MOVE.B„#NWCNAU,D4ŠNAU�for�NWCT-‰BSR.S…NTBENNT�Build�Network�Name�Table�entry.‰BSR‡NTBENAT�Build�Network�Address�Table�entry**ˆBuild�LCT�entry�for�NWC‰CLR.L…D3’LCC=0�for�self‰BSR‡NTBELCT�Build�entry(‰BSET†#LCTCSNWC,LCTCSTA(A1)�Set�NWC�flag**ˆTest�for�primary�or�secondary.‰MOVE.L„A5,A3�Restore�SSCT's�NAT�entry�address.‰MOVE.L„NATNNT(A3),A0‡SSCT's�NNT�entry�address!‰MOVE.L„#SSCNAU,D4ŠSSCT's�Address)‰MOVE.L„NNTNAM(A0),D5‡1st�4�chars�of�name‰TST.B…D7’Is�local�the�primary?‰BEQ.S…NTBPRIM�Branch�if�yes*4*ˆIf�local�is�secondary,�build�LCT�entry�for�primary/‰MOV E.W„#'00',D6Œlast�2�chars�of�primary's�name*‰MOVE.L„#1,D3�LCC=1�for�connect�to�primary(‰MOVE.L„#0,D7�Station�ID�=�0�for�primary‰BSR‡NTBELCT�Build�LCT�entry(‰BSET†#LCTCSSCT,LCTCSTA(A1)�Set�SCT�flagNTBRTNƒRTS›return�-�finished*A*ˆIf�local�is�primary,�build�LCT�and�NNT�entry�for�each�secondary5NTBPRIM‚MOVE.W„MAXSEC(PC),D2‡Max�#�secondary�stations.‰MOVE.B„FSSTN(PC),D7ˆFirst�secondary�station�# ‰BRA.S…NTBB4(NTBB2„MOVE.B„D7,D3�use�station�ID�as�LCC‰BSR.S…NTBENNT�build�NNT�entry‰BSR‡NTBELCT�build�LCT�entry(‰BSET†#LCTCSSCT,LCTCSTA(A1)�Set�SCT�flag1‰ADD.B…SSINC(PC),D7ˆnext�secondary�station�number&NTBB4„DBRA†D2,NTBB2Œloop�back�for�next‰RTS‰PAGE**ˆSubroutine�to�Build�NNT�entry*@*ˆon�entry:�D4=Network�Addr‚D5=1st�4�chars�of�name‚D7=station�ID*5*ˆon�exit:‚D6=stat�ID�in�ascii�(last�2�chars�of�name)*’A2=Pointer�to�new�NNT�entry*’A0,�A1�and�D0�used*8NTBENNT‚MOVE.L„XNNTBG(A6),A1‡Start�of�Network�Name�Table%‰MOVE.L„NNTFHDR(A1),D0†Get�free�entry,‰BEQ‡NTBCRASHŒERROR�if�no�more�entries�exist&‰MOVE.L„D0,A2�Pointer�to�new�NNT�entry9‰MOVE.L„NNTNEXT(A2),NNTFHDR(A1)�Update�'free'�list�header*)‰MOVE.L„D5,NNTNAM(A2)‡1st�4�chars�of�name,‰MOVE.B„D7,D0�Station�ID�used�as�last�2�chrs-‰LEA‡NNTNAM+4(A2),A0…Where�to�put�ascii�value%‰BSR‡CVHEX2Žconvert�to�ascii�for�name‰MOVE.W„NNTNAM+4(A2),D6…Save�it%‰MOVE.B„D4,NNTNAU(A2)‡Network�Address ‰MOVE.B„D7,NNTSID(A2)‡Station�ID-‰BSET†#NNTSACT,NNTSTAT(A2)�Status�is�'active'*&*ˆPut�new�entry�in�'active'�entry�list,‰MOVE.L„NNTAHDR(A1),NNTNEXT(A2)‚add�to�chain$‰MOVE.L„A2,NNTAHDR(A1)†Update�header‰RTS‰PAGE**ˆSubroutine�to�Build�NAT�entry*)*ˆon�entry:�D4=Network�Addr…D7=Station�ID*’A2=Pointer�to�NNT�entry*&*ˆon�exit:‚A3=Pointer�to�new�NAT�entry*’A0�and�D0�used*8NTBENAT‚MOVE.L„XNATBG(A6),A0‡Start�of�Network�Name�Table%‰MOVE.L„NATFHDR(A0),D0†Get�free�entry,‰BEQ‡NTBCRASHŒERROR�if�no�more�entries�exist&‰MOVE.L„D0,A3�Pointer�to�new�NAT�entry9‰MOVE.L„NATNEXT(A3),NATFHDR(A0)�Update�'free'�list�header*%‰MOVE.B„D4,NATNAU(A3)‡Network�Address ‰MOVE.B„D7,NATSID(A3)‡Station�ID*‰MOVE.B„#1,NATLCC(A3)‡Logical�Connect�Code-‰BSET†#NATSACT,NATSTAT(A3)�Status�is�'active'*&*ˆPut�new�entry�in�'active'�entry�list,‰MOVE.L„NATAHDR(A0),NATNEXT(A3)‚add�to�chain$‰MOVE.L„A3,NATAHDR(A0)†Update�header7‰MOVE.L„A3,NNTNAT(A2)‡Save�pointer�to�this�entry�in�NNT7‰MOVE.L„A2,NATNNT(A3)‡Save�pointer�to�NNT�in�this�entry‰RTS‰PAGE**ˆSubroutine�to�Build�LCT�entry*"*ˆon�entry:�D3=LCC’D4=Network�Addr0*’D5=1st�4�chars�of�name‚D6=last�2�chars�of�name*’D7=Station�ID*’A3=Pointer�to�NAT�entry*&*ˆon�exit:‚A1=Pointer�to�new�LCT�entry *’A0�used*1NTBELCT‚MOVE.L„XLCTBG(A6),A0‡Pointer�to�LCT�table/‰MOVE.L„LCTFHDR(A0),D0†Get�entry�from�free�list)‰BEQ.S…NTBCRASHŒERROR�if�no�entries�exist&‰MOVE.L„D0,A1�Pointer�to�new�LCT�entry0‰MOVE.L„LCTNEXT(A1),LCTFHDR(A0)�Update�free�list*%‰CLR.L…LCTLOTCB(A1)ˆClear�TCB�pointer1‰MOVE.B„D3,LCTLOLCC(A1)…Save�Logical�Connect�Code#‰CMP.B…NATLCC(A3),D3‡Is�LCC�<�next?‰BCS.S…NTBELCT2ŒBranch�if�YES'‰MOVE.B„D3,NATLCC(A3)‡Change�'next-LCC'1‰ADD.B…#1,NATLCC(A3)‡Must�be�larger�than�any�used;NTBELCT2�MOVE.B„NATNAU(A3),LCTLONAU(A1)�Save�local�Net�Addr5‰MOVE.B„NATSID(A3),LCTLOSID(A1)�Save�local�Station�ID,‰MOVE.B„D4,LCTRMNAU(A1)�Save�remote�Net�Addr.‰MOVE.B„D7,LCTRMSID(A1)�Save�remote�Station�ID0‰MOVE.L„D5,LCTRMNAM(A1)�Save�remote�Network�Name2‰MOVE.W„D6,LCTRMNAM+4(A1)�Save�remote�Network�Name4‰BSET†#LCTCSACT,LCTCSTA(A1)ƒSet�'conn�active'�status*&*ˆPut�new�entry�in�NAT's�LCT�link�list,‰LEA‡NATLCTLK-LCTLULNK(A3),A0ƒStart�of�chain�9�?‰BLE.S…CVHC2B„branch�if�NO‰ADD.B…#7,D0…change�to�alpha CVHC2BƒADD.B…#$30,D0ƒASCII�digit+‰MOVE.B„D0,(A0)+‚Save�char�in�output�string‰RTS‰ENDééééééé=/*=/*†INET.NWTEST.AF=/*)=/* Chain file to assemble INET.NWTEST.SA=/*:=/* If no output argument is specified for the listing the-=/* chain file will default to INET.NWTEST.LS=/*=/IFC \1ƒ=ARG�INET.NWTEST.LS=/ENDIF=/*'=ASM INET.NWTEST.SA,INET.NWTEST.RO,\1;R=/*{ Included files are:=/*ƒ9995.&.TCB.EQ=/*}=/*=ENDéééé éé²/NWTEST„IDNTƒ1,0�TRAP�#1�to�see�if�network�is�upŠXDEFƒNWTESTAD‹Entry�point*#ŠXREFƒNWPSEG�Satisfied�in�SYSPAR.RO#ŠXREFƒNWTSEG�Satisfied�in�SYSPAR.RO**‰NOLIST*‰INCLUDE�9995.&.TCB.EQ*‰LISTŠNOLISTŠINCLUDE�9995.&.TCB.EQŠLIST ŠSECTION�8*E* User configured directive to determine if the network is up or not.(*ƒRetrun�codes:‚=0‚If�network�is�not�up.*’<>0�If�network�is�up.*NWTESTAD‚CLR.W‚D05ŠMOVE.W�NWPSEG,D0ŠReturn�nonzero�if�any�segment�limit%ŠOR.WƒNWPSEG+2,D0ˆfields�are�nonzero.ŠOR.WƒNWTSEG,D0ŠOR.WƒNWTSEG+2,D01ŠMOVE.W�D0,TCBRTCD(A6)…Stuff�return�code�into�TCBŠRTE—Return�from�directiveŠEND ééééé»=/*=/*†INET.OUTTERMS.AF=/*C=/* Chain file to assemble module to output message to the terminal=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to INET.OUTTERMS.LS=/*=/IFC \1ƒ=ARG�INET.OUTTERMS.LS=/ENDIF=/*+=ASM INET.OUTTERMS.SA,INET.OUTTERMS.RO,\1;R=/*{ Included files are:=/*ƒ--�none�--=/*}=/*=ENDéé ééééÄ-OUTTERMS‚IDNTƒ1,0�Put�Message�out�to�terminal**ˆPUT�MESSAGE�OUT�TO�TERMINAL* ‰OFFSET„0OUTPB„DS.W†1ˆ2=�WRITE�COMMAND‰DS.W†1ˆ8=�IMAGE�MODE ‰DS.W†1ˆ6=�LU‰DS.W†3OUTPBSA‚DS.L†1‰START�ADDRESSOUTPBEA‚DS.L†1‰END�ADDRESS‰DS.L†2 ‰SECTIONƒ8**„ON�ENTRY:‚A1=START�ADDRESS*�A2=END�ADDRESS*‰XDEF†OUTTERMSOUTTERMS�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éééééÍ1SRSNALLƒIDNTƒ1,0�TRAP�#1�to�start�up�SDLC�and�NTSŠPAGE*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*5*„TRAP�#1�to�Start�Up�Synchronous�Data�Link�Control�** and�Network�Services�**Ä*F************************************************************************‰NOLIST*‰INCLUDE�9995.&.TCB.EQ*‰INCLUDE�9995.&.TST.EQ*‰INCLUDE�9995.NTS.NAT.EQ*‰INCLUDE�9995.NTS.LCT.EQ*‰INCLUDE�9995.NTS.SMSG.EQ*‰INCLUDE�9995.N TS.NTW.EQ*‰INCLUDE�9995.&.STR.EQ*‰INCLUDE�9995.&.TR1RTCD.EQ*‰LISTŠNOLISTŠINCLUDE�9995.&.TCB.EQŠINCLUDE�9995.&.TST.EQŠINCLUDE�9995.NTS.NAT.EQŠINCLUDE�9995.NTS.LCT.EQŠINCLUDE�9995.NTS.SMSG.EQŠINCLUDE�9995.NTS.NTW.EQŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.TR1RTCD.EQŠLISTŠPAGE3SEGNAM„EQU„'.NTW'�Name�of�segment�containing�tables)MAILBOXƒEQU„$800ˆVM02�to�EXORmacs�mailbox**‰INCLUDE�9995.INET.INET.EQŠINCLUDE�9995.INET.INET.EQŠPAGE*"*ˆTemporary�TRAP�#1�Exec�Directive**ˆDirectiveƒFunction<*ˆ---------ƒ------------------------------------------------9*‰SRSNALL„Network�Startup�--�Will�save�pointers�to�tables0*”and�buffer�queue,�delete�the�.NTW�segment�from1*”ININET's�segment�table,�and�call�SDLC's�Startup *”routine.*+*ˆON�ENTRY:�A6�=�Calling�task's�TCB�address*ŒTCBA6(A6)�=�INIT�DATA�segment**ˆRETURN�CODES:8*’RTCDPBLK�-�02ƒParameter�block�not�in�user's�addr�space5*’RTCDTASK�-�03ƒSystem�Service�Control�task�not�found3*’RTCDNFND�-�07ƒSegment�containing�tables�not�found* ŠSECTION�8ŠOPT„PCSŠXREF.S�SDLCPCBŠXREF.S�NNTBEGŠXREF.S�NATBEGŠXREF.S�LCTBEGŠXREF.S�FREEQHDŠXREF.S�DBUFSZŠXREF.S�FQBCNT ŠXREF.S�FQLWMŠXREF.S�NWTSEGŠXREF.S�NWPSEGŠXREF.S�FREEQND(ŠXREF.S�SBUSRACK‹Satisfied�in�SDLCPRI.ROŠXREF.S�SBSDLCFLŠXREF.S�SBSDLCKL$ŠXREFƒV2RQHD�Satisfied�in�SYSPARV.RO ŠXREFƒSTRSDLC ŠXREFƒSYSTYPE* ŠXDEFƒSTRTADR ŠXDEFƒDLNKRQD*:STRTADRƒMOVE.L�TCBA6(A6),D6‡Address�of�shared�DATA�segmentÖQß8çBïH÷'#ŠMOVE.L�#DATAEND,D5ˆsize�of�segment7ŠTR0$.LOGPHY��Convert�to�physical�address$ŠBRA.S‚STRTA2�Branch�if�good�segmentŠNOPAŠMOVE.W�#RTCDPBLK,TCBRTCD(A6)�ERROR�-�Bad�parameter�block�addressŠRTE0STRTA2„MOVE.L�D6,A4ŽPhysical�address�of�DATA�seg*2*ˆRemove�Segment�Containing�Tables�from�task's�TST*#ŠMOVE.W�#SEGMENTS-1,D0…Loop�Counter"ŠMOVE.L�TCBTST(A6),A1†Start�of�TST/ŠLEA„TSTMMU(A1),A2†Start�of�segment�definitionsŠMOVE.L�#SEGNAM,D1‰Segment�name+STRTA4„CMP.L‚TSTANAME(A2),D1„Look�for�matchŠBEQ.S‚STRTA5�Branch�if�foundŠLEA„TSTCTL+2(A2),A2„Next�entryŠDBRAƒD0,STRTA47ŠMOVE.W�#RTCDNFND,TCBRTCD(A6)�ERROR�-�Segment�not�foundŠRTE*2STRTA5„CLR.L‚TSTAATTR(A2)‡Clear�'in�use'�attribute$ŠCLR.W‚TSTCTL(A2)‰Clear�Control�byte5ŠMOVE.L�TSTLB(A2),NWTSEGƒSave�limits�of�table�segment$ŠMOVE.W�TSTPO(A2),D0‡Physical�offset.ŠADD.W‚D0,NWTSEGŠAdd�phys�offset�to�first�page/ŠADD.W‚D0,NWTSEG+2ˆAdd�phys�offset�to�last�page+ŠSUB.B‚#1,TSTCSEGS(A1)„Decrement�#�segments*0*ˆRemove�Segment�Containing�SDLC�from�task's�TST*#ŠMOVE.W�#SEGMENTS-1,D0…Loop�Counter"ŠMOVE.L�TCBTST(A6),A1†Start�of�TST/ŠLEA„TSTMMU(A1),A2†Start�of�segment�definitionsŠMOVE.L�#'SDLC',D1‰Segment�name+STRTA7„CMP.L‚TSTANAME(A2),D1„Look�for�matchŠBEQ.S‚STRTA7AŒBranch�if�foundŠLEA„TSTCTL+2(A2),A2„Next�entryŠDBRAƒD0,STRTA7)ŠBRA.S‚STRT7B�If�segment�no�there�-�go�on*3STRTA7AƒCLR.L‚TSTAATTR(A2)‡Clear�'in�use'�attribute$ŠCLR.W‚TSTCTL(A2)‰Clear�Control�byte9ŠMOVE.L�TSTLB(A2),NWPSEGƒSave�limits�of�procedure�segment$ŠMOVE.W�TSTPO(A2),D0‡Physical�offset.ŠADD.W‚D0,NWPSEGŠAdd�phys�offset�to�first�page/ŠADD.W‚D0,NWPSEG+2ˆAdd�phys�offset�to�last�page+ŠSUB.B‚#1,TSTCSEGS(A1)„Decrement�#�segments*(*ˆSave�Pointers�to�Tables�in�SYSPAR�Area* STRT7B„EQU„*2ŠNOPROC.STRT7.4�LINKONLYƒDon't�process�if�'INETV2',ŠMOVE.L�XNNTBG(A4),NNTBEG‚Network�Name�Table/ŠMOVE.L�XNATBG(A4),NATBEG‚Network�Address�Table2ŠMOVE.L�XLCTBG(A4),LCTBEG‚Logical�Connection�Table6ŠMOVE.W�XFBQDSZ(A4),DBUFSZ�Size�of�data�area�in�buffer*----^ STRT7.4ƒEQU„**----v2ŠNOPROC.STRT7.5�LINKMAINƒDon't�process�if�'INETEX'6ŠMOVE.L�XSDPRBG(A4),SDLCPCB�SDLC�Primary�Control�Block,ŠMOVE.L�XFBQBG(A4),FREEQHD�Free�Buffer�Queue,ŠMOVE.W�XFQB CNT(A4),FQBCNT�Number�of�buffers.ŠMOVE.W�XFQLWM(A4),FQLWMƒFree�Q�low�water�mark**„SAVE�END�OF�FREE�Q*"ŠMOVE.L�FREEQHD,A0‰Start�of�free�Q"STRTA7CƒMOVE.L�(A0),D0ŒNEXT�BUFFER%ŠBEQ.S‚STRTA7DŒBranch�if�end�of�chain ŠMOVE.L�D0,A0ŽNeed�addr�in�a�regŠBRA„STRTA7CŒLoop�backSTRTA7DƒMOVE.L�A0,FREEQND*----^ STRT7.5ƒEQU„*ŠPAGE*----v-ŠNOPROC.V2�LINKONLYˆDon't�process�if�'INETV2'*,*ˆSave�TCB's�of�SSCT�and�NWCT�in�NAT�and�LCT*2ŠLEA„XSSCTSK(A4),A0…Point�to�task�name�and�session ŠTR0$.GETTCB ŠBRA.S‚STRTA88ŠMOVE.L�#RTCDTASK,TCBRTCD(A6)�ERROR�-�SSC�task�not�found&ŠLEA„0,A0�Zero�address�means�NOT�found*.STRTA8„MOVE.L�A0,A3ŽSave�address�of�SSCT's�TCB*2ŠLEA„XNWCTSK(A4),A0…Point�to�task�name�and�session ŠTR0$.GETTCB ŠBRA.S‚STRTA98ŠMOVE.L�#RTCDTASK,TCBRTCD(A6)�ERROR�-�NWC�task�not�found&ŠLEA„0,A0�Zero�address�means�NOT�found*.STRTA9„MOVE.L�A0,A2ŽSave�address�of�NWCT's�TCB2ŠMOVE.L�NATBEG,A5ŠPointer�to�Network�Address�Table/ŠLEA„NATAHDR-NATNEXT(A5),A1�First�entry�pointer0STRTA10ƒMOVE.L�NATNEXT(A1),A1…Next�entry�pointerŠMOVE.L�A1,D0Ždoes�it�exist?,ŠBEQ.S‚STRTA20ŒBranch�if�all�entries�checked/ŠCMP.B‚#SSCNAU,NATNAU(A1)�Is�this�SSCT's�entry?ŠBNE.S‚STRTA12ŒBranch�if�NOŠMOVE.L�A3,A0ŽSSCT's�TCBŠBRA.S‚STRTA146STRTA12ƒCMP.B‚#NWCNAU,NATNAU(A1)�Is�this�NWCT's�entry?ŠBNE.S‚STRTA10ŒBranch�if�NOŠMOVE.L�A2,A0ŽNWCT's�TCB*-STRTA14ƒMOVE.L�A0,NATTCB(A1)†Save�TCB�addressŠBEQ.S‚STRTA10ŒBranch�if�no�TCB,ŠMOVE.L�A1,TCBNAU(A0)†Save�NAT�entry�address'ŠMOVE.L�NATLCTLK(A1),A5„First�LCT�entry&STRTA16ƒMOVE.L�A5,D0ŽDoes�entry�exist?ŠBEQ.S‚STRTA10ŒBranch�if�NO(ŠMOVE.L�A0,LCTLOTCB(A5)„Save�TCB�address&ŠMOVE.L�LCTLULNK(A5),A5„Next�LCT�entryŠBRA„STRTA16ŒGo�check�itŠPAGE*----v STRTA20ƒEQU„*2ŠNOPROC.STRTA25�LINKMAINƒDon't�process�if�'INETEX'*"*ˆCall�SDLC�Startup�--�then�return* ŠBSR„STRSDLC*----^ STRTA25ƒEQU„*ŠRTEV2ˆEQU„***ˆCall�SDLC�Startup* ‰XREF†STRSDLC ‰BSR‡STRSDLC*,*ˆStuff�'RUN�'�into�VM02�to�EXORmacs�mailbox.*ˆallowing�EXORmacs�LOADV2�to�continue�running*ˆ--�then�return*‰MOVE.L„#'RUN�',MAILBOX2‰MOVE.B„XSTATION(A4),MAILBOX+3‚Save�station�number‰RTEŠPAGE4* INETV2 code - Executed only if 'LINKONLY' (INETV2)5*****************************************************9*�Routine�runs�in�continuous�loop�looking�at�V2RQHD.‚When9*ƒan�item�appears�in�the�queue,�it�pulls�it�off,�examines6*ƒthe�command�and�calls�the�appropriate�SDLC�function.**‰Command“Function*‹NTWCACKR�($A1)ŒSBUSRACK*‹NTWFLUSH�($A2)ŒSBSDLCFL1*‹DLCQXMƒ($01)ŒSBPTXMQ�(Put�buffer�in�XMIT�Queue)*5******************************************************* Configured directive.* ŠXDEFƒDLNKRQD.DLNKRQDƒMOVE.L�V2RQHD,D0ŠPick�up�head�of�list.ŠBCLRƒ#31,D0�Clear�TAS�bit.*ŠTST.L‚D0‘Do�we�have�anything�on�the�list?ŠBEQ.S‚DLNKRQDŒBranch�if�no.**SPIN†TAS„V2RQHD�Block�the�other�processor. ŠBNE.S‚SPIN*ŠMOVE.L�V2RQHD,D0ŠHead�of�list.ŠBCLRƒ#31,D0�Clear�TAS�bit.ŠMOVE.L�D0,A0ŽBuffer�address. ŠMOVE.L�(A0),-(A7)‰*›2/2/83�SCB.ŠBSETƒ#31,(A7)‹*›2/2/83�SCB.;ŠMOVE.L�(A7)+,V2RQHD‡Pull�first�item�off�chain.‚2/2/83�SCB.-ŠBCLRƒ#31,V2RQHD‰Unlock�the�queueŒ2/2/83�SCB. ŠCLR.L‚D6 ŠCLR.L‚D7 ŠMOVE.B�V2CMD(A0),D6‡Get�command#ŠMOVE.W�V2STA(A0),D7‡Get�station�ID*(ŠCMP.B‚#NTWCACKR,D6‡Is�cmd=�ACKnowledge?ŠBNE.S‚DLNKRQ2ŒBranch�if�NO#ŠTR0.PTFRBF�Return�buffer�to�free�Q"ŠMOVE.W�D7,D0ŽPut�station�ID�in�D0$ŠBSR„SBUSRACK‹ACK�command�from�NWCT.ŠBRA„DLNKRQDŒReturn�to�loop*)DLNKRQ2ƒCMP.B‚#NTWFLUSH,D6‡Is�cmd=�FLUSH?ŠBNE.S‚DLNKRQ3ŒBranch�if�NO#ŠTR0.PTFRBF�Return�buffer�to�free�Q"ŠMOVE.W�D7,D1ŽPut�station�ID�in�D1&ŠBSR„SBSDLCFL‹FLUSH�command�from�NWCT.I* Ed Skinner, March 2, 1983 - SDLCFL passes back a return code indicatingH*�whether�or�not�the�buffer�was�properly�enqueued.‚If�the�buffer�was�notJ* handled (because the secondary station ID was incorrect), this routine'sB* absence of error checking will cause the system to lose buffers.L* Additionally, SDLCFL is messed up  right now, and doesn't return the properE*�indication�in�all�cases.‚Please�see�me�if�you�have�any�questions�in* this regard...M* This module (SRSN) and another (48.NTS.NWCFLSH.AI) are the only two callersI* of SDLCFL and are, therefore, the only modules requiring maintenance in* this regard as of this date. ŠBRA„DLNKRQDŒReturn�to�loop*'DLNKRQ3ƒCMP.B‚#DLCSTOP,D6ˆIs�cmd=�STOP?ŠBNE.S‚DLNKRQ4ŒBranch�if�NO#ŠTR0.PTFRBF�Return�buffer�to�free�QŠCLR.L‚D1‘D1�not�used"ŠBSR„SBSDLCKL‹KILL�command�to�SDLCŠBRA„DLNKRQDŒReturn�to�loop*(DLNKRQ4ƒCMP.B‚#DLCQXM,D6‰Is�it�'XMIT�'�?ŠBNE.S‚DLNKRQ6ŒBranch�if�NO'ŠTR0.PTXMQ‘Put�buffer�on�transmit�QueueH* Ed Skinner, March 2, 1983 - PTXMQ passes back a return code indicatingH*�whether�or�not�the�buffer�was�properly�enqueued.‚If�the�buffer�was�notI* queued (because the secondary station ID was incorrect), this routine'sB* absence of error checking will cause the system to lose buffers.K* Additionally, PTXMQ is messed up right now, and doesn't return the properE*�indication�in�all�cases.‚Please�see�me�if�you�have�any�questions�in* this regard...N* Apparently this module (SRSN) is the only one using PTXMQ and is, therefore,2* the only one needing correction as of this date.ŠBRA„DLNKRQDŒKeep�looping.*%*ƒNo�known�command�--�free�the�buffer*.DLNKRQ6ƒTR0.PTFRBF�Return�buffer�to�free�queueŠBRA„DLNKRQDŒKEEP�LOOPINGB*�This�routine�never�terminates.‚It�stays�in�DLNKRQD�loop�forever.ŠENDé:1GETSTA ASREL' INET GETSTA SA&6(…Get station ID62pSYSPOFF pV2OFF HGETSTA 0pSTATION („J3€H !MAIL*MAILB�:A ÌgJJ¹(f9÷F3 �?²�`2/Aúÿ¬pNAf$ 9*"€ÿÿÿ €RUNf�ÿAúÿžpNA _Nu4ééééééÿ K1ISDLC ASREL' INET IPSDLC SA&H(…Initialize SDLC primary station¯2pSSINC pMXOBF pFSSTN pMAXSEC pSZDBUF pPFDLY pPNDLY pRTRDLY pTXDLY HDLCBLDCB pRCRTRY pTXPDS pTXRTRY pRCTOV pDLBR (tX3JI *n+n$D;zA ôR;zA îL:A è2:A ä(mD€zA ÚzA ÔzA Î9zA È9zA ÂD3$� 9zA ¼ 9zA ¶ 9zA °zA ªB,|%Ð:A šÙüXSn°Nu4éééééé:1LOADV2 ASREL' INET LOADV2 SA'(…Load VM02 TaskH2pSYSPOFF pMEMOFF pSYSPAR pV2OFF pV2SYSP pEDITFILE G3À B€@ ÿÿ NETLOAD SA`@F3 ÿÿ SA`A!VM02G3PWaiting for VM board to become reaF3dy VM board now ready - proceeding OúýŠMúýAúþ^Cúþ©Hî¸Aúþ I3Cúÿ›HîAî„0¼@NCgazAî¬NBganAî„0¼NC/Múý¢AúþaBü¶,_F3€ÿ€üg <aBAúý‚NCga6AúýžNBga*Kúþ2-m€"-<à‰á‰Ò­8F3€-A<-|(8pAúýŠNAgaú(|Ùü( ”WAITgCúþîEúÿAúýHè NBAøF3ˆpNA`ÚAúüìJ¨ gCúþìEúÿHè NBAúý <(Э8!@ :ý0кý0S€!@F3!|NBga~=|ÿÿ@Aú”-HDAúýp:NAgadpÿNAga\îC=|ÿÿ@AúüîF3p:NA(|Ùü()zü)|9|' (¼REDYAødp" �RUNgNA`ìF3Õ‘È�€0<NAHîHpAúüžNDLúü–H瀀0<NA#ü((#ü(( <(€(ѹ( 3@Ns24ôééé éB1NTBLDTB ASREL' INET NTBLDTB SA(!(…BUILD NNT, NAT and LCT62pSSINC pFSSTN pMAXSEC HNTBLDTB (F3 (n,(¼!NNT)n0 nAìCì" Ò¬ � ‰ IC貉nô(n4(¼!NATF3 )n8 AìCì" Ò¬ � ‰ ICè&²‰nô(n<(¼!LCT)n@ AìCì" F3 Ò¬ � ‰ ICèJ²‰nô*@ç/:B üXLßgNwDßX��ÂúO3€H B ü>�ÿB-AHÐ�=zB ü,N=zB! ü&P=| ˆ-|.NTWŒ-@”Aî€0<NAgH瀀 |L3 `ð*H Hz&@ç/:B ûèLßgNwDßX�Ñ®,Ñ®4Ñ®NsaB# þ8!üRUN ìNs 9(€J€gòJù(fø 9(€ @/×#ß(U3 ‚A ¹(B†B‡(>( ¡f aB" ýÜ0aB ýÖ`¬ ¢f aB" ýÊ2aB ýÄ`š £f aB" ý¸-3 ˆ B�aB ý²`ˆ faB ý¦`ÿ|aB" ýž`ÿt4ééén' M68010 CHIPTYPEAIƒƒrrINET AFŒŒrrINET SA••rrSRSN AFžžrrINET RO§§ r rSRSN RO¸¸rr* Set chip type to M68010*CHIPTYPE‚EQU„68010 ŠOPT„P=68010 ééééééé{=/*=/*†M68010.INET.AF=/*==/* Chain file to assemble module for running on 68010 system=/*:=/* If no output argument is specified for the listing the-=/* chain file will default to M68010.INET.LS=/*=/IFC \1ƒ=ARG�M68010.INET.LS=/ENDIF=/*6=ASM M68010.INET.SA/&.INET.SA,M68010.INET.RO,\1;RZ=100=/*{ Included files are:=/*ƒM68010.CHIPTYPE.AI=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.NTS.NNT.EQ=/*ƒ9995.NTS.NAT.EQ=/*ƒ9995.NTS.LCT.EQ=/*ƒ9995.SDLCPRI.TEMPLTS.EQ=/*ƒ9995.NTS.TR1X.EQ=/*ƒ9995.INET.INET.EQ=/*}=/*=ENDé éééé„#************************************�File�M68010.INET.AI�*#************************************‰INCLUDE�M68010.CHIPTYPE.AIŠINCLUDE�M68010.CHIPTYPE.AIŠPAGEééééééé�=/*=/*†M68010.SRSN.AF=/*:=/* Chain file to assemble module to start up SDLC and NTS=/*:=/* If no output argument is specified for the listing the-=/* chain file will default to M68010.SRSN.LS=/*=/IFC \1ƒ=ARG�M68010.SRSN.LS=/ENDIF=/*8=ASM M68010.INET.SA/INET.SRSN.SA,M68010.SRSN.RO,\1;RZ=80=/*{ Included files are:=/*ƒM68010.CHIPTYPE.AI=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TST.EQ=/*ƒ9995.NTS.NAT.EQ=/*ƒ9995.NTS.LCT.EQ=/*ƒ9995.NTS.SMSG.EQ=/*ƒ9995.NTS.NTW.EQ=/*ƒ9995.&.STR .EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.INET.INET.EQ=/*}=/*=ENDééééé–B1INET ASREL' INET SA3 (…Initialization and NTSþ2pOUTTERMS pNWCT pNWTESTAD pSTRTADR pSSCT pMAXCONN pSYSTYPE pMAXLNAU pNWPSEG pNTSREQ pNWTSEG pMAXSEC pSZDBUF pGETSTA pBEGSDLC pNUMBUF pFQULWM pDLCBLDCB pNTBLDTB pSBINFRBF pTRASCAN pDLNKRQD pMAXNAME 2(þF3 Aú0<NAg.H瀀 |`Ø DATAfB˜³ÈnúH3 Nu,HOî€ OCîfaê=|ÿÿ´AúA ¨-H¸Aî´0<:NAgH瀀 |`‚pÿNABçîI3 ·Aî´0<:NADßgrHzbBç/:B ÿdLßgNwDßX�`.Please kill netwI3 ork first - then initialize Hç`CúÿÌEúÿôaB ÿLß`úH瀀 |I3 `ö®·Hz Bç/:B þìLßgNwDßX�Aú0< NAgH瀀 |`ºF3 SSCT"HAú0<NAgH瀀 |`Ž-|SSCT˜-zþŠœ=|¸¬F3 =|ª-I®Aî˜0< NAgH瀀 |`VŸüp O/ EúÊ0ÚQÈÿü$_ O$zG3@ þ@!J0<NAßügH瀀 |`-|NWCT˜-zþœÓüH-I®Aî˜0< F3 NAgH瀀 |`æŸüp O/ Eúj0ÚQÈÿü$_ O$zýÔ!J0<NAßüF3 gH瀀 | `¨AúH0<NAgNH瀀 | `Ž€`SSCTSSCTI3 SSCTNWCT SSCTSSCTaB ýRgH瀀 | `:AL3 Hz@Bç/:B ý2LßgNwDßX� <_B-@ rXÂúB ýg-@$�B-AL3 (Ð�HzhBç/:B üðLßgNwDßX�-@,2:B' üØÂü�B-A0Ð�-@42:O3€ B ü¾Âü&�B-A8Ð�-@<2:B ü¤ÂüJ�B-A@Ð�HzBç/:B ü†LßL3@ gNwDßX�-@DrÒzB ül�=ALHz>Bç/:B üXLßgNwDßX��ÂúO3€H B ü>�ÿB-AHÐ�=zB ü,N=zB! ü&P=| ˆ-|.NTWŒ-@”Aî€0<NAgH瀀 |L3 `ð*H Hz&Bç/:B ûèLßgNwDßX�Ñ®,Ñ®4Ñ®NsaB# þ8!üRUN ìNs 9(€J€gòJù(fø 9(€ @/×#ß(U3 ‚A ¹(B†B‡(>( ¡f aB" ýÜ0aB ýÖ`¬ ¢f aB" ýÊ2aB ýÄ`š £f aB" ý¸-3 ˆ B�aB ý²`ˆ faB ý¦`ÿ|aB" ýž`ÿt4ééé °9' NTS NTCCONC AIÅÅ LrrNTCCONN AIÖÖ¹rrNTCDISCPAI÷÷$rrNTCIDNTPAI;rrNTCLSTNPAI IrrNTCREQ AI""prrNTCREQP AF33 rrNTCREQP SA<<1rrNTSCONC AIEE KrrNTSCONN AIVV¨rrNTSDISC AIwwtrrNTSIDNT AI��ÄrrNTSLSTC AI±±.rrNTSLSTN AIººorrNTSRCVC AIÓÓ=rrNTSRECV AIääŽrrNTSREQ AFýý%rrNTSREQ SAôrrNTSSEND AI'' NrrNTSSERV AF88rrŠPAGEJ************************************************************************** *�INCLUDE�FILE:‚NTS.NTCCONC.AIª*J************************************************************************** 0‰TTL‡NTCCONC.SAƒConnect�Cancel�Request�from�.SSC*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*C*„NTCCNC8�handles�a�Connect�Cancel�request�issued�by�the�SSC�task�*:*Œon�behalf�of�another�NAU�that�wants�has�requested�that‚*'*Œan�active�connection�be�terminated.•**Ä*F***********************************************************************(*ˆon�entry:�A6�=�address�of�caller's�TCB.*’A4�=�physical�address�of�NTC�parameter�block**ˆon�exit�:�D0�=‡Return�code-*’D0�=�00„Successful�-�or�transaction�not�yet *�complete.5*’D0�=�xx„See�NTSRCOD�equates�for�list�of�error�codesF***********************************************************************+NTCCNC8‚MOVE.L„NNTBEG,A5‹Start�of�NNT�table0‰MOVE.L„NTCLNAM(A4),D1†1st�4�chars�of�local�name3‰MOVE.W„NTCLNAM+4(A4),D2„Last�2�chars�of�local�name%‰BSR‡NWTNAMC�Find�Network�Name�in�NNT#‰BNE.S…NTCCC04�Branch�if�name�found4NTCCC02‚MOVE.L„#NTSRTNAU,D0ˆERROR�-�target�not�found ‰RTS›RETURN*;NTCCC04‚BTST†#NNTSDISC,NNTSTAT(A2)‚Has�target�disconnected?‰BEQ.S…NTCCC06�Branch�if�NO0‰MOVE.L„#NTSRDISC,D0ˆERROR�-�target�disconnected ‰RTS›RETURNFNTCCC06‚BTST†#NNTSRMT,NNTSTAT(A2)‚Is�this�remote�entry?�(shouldn't�be)‰BNE‡NTCCC02�Branch�if�YES+‰MOVE.L„NNTNAT(A2),A3‡Get�NAT�entry�address?‰BTST†#NNTSIPB,NNTSTAT(A2)�Is�param�block�saved�instead�of�NAT?‰BEQ.S…NTCCC10�Branch�if�NO5‰MOVE.L„NTSNEXT(A3),A3†Get�NAT�entry�from�param�block*5*ˆSearch�LCT�entries�for�matching�Remote�Network�Name*-NTCCC10‚MOVE.L„NTCRNAM(A4),D4†Get�Remote�name(‰MOVE.W„NTCRNAM+4(A4),D5„Get�Remote�name+‰BSR‡NWFNLCN�Search�table�for�matching�name#‰BEQ.S…NTCCC12�Branch�if�Name�found/‰MOVE.L„#-NTSRINAM,D0‡ERROR�-�duplicate�request ‰RTS›RETURN*$*ˆSet�LCT�entry�to�DISCONNECT�status*½8ÆCNTCCC12‚MOVE.B„NTCXRCOD(A4),D6…Return�code�-�Disconnected�by�remote"‰BSR‡NWDCLCT�Disconnect�connection/‰BNE.S…NTCCC18�Branch�if�local�NAU�was�informed'‰TST.L…NATTCB(A3)ŠDoes�local�NAU�exist?1‰BNE.S…NTCCC20�Branch�if�yes�-�wait�till�informed**ˆFree�the�LCT�entry*"NTCCC18‚BSR‡NWFRLCT�Free�the�entry*+*ˆCancel�'Recv-from-any'�if�last�connection*)‰TST.L…NATLCTLK(A3)ˆAny�more�connections?‰BNE.S…NTCCC20�Branch�if�YES‰MOVE.L„A4,-(A7)ŒSave�A4=‰LEA‡NATANYLK-NTSNEXT(A3),A4�Pointer�to� 1st�'any'�param�block"‰BSR‡NWFREPB�Free�all�param�blocks!‰CLR.L…NATANYLK(A3)ˆClear�pointer‰MOVE.L„(A7)+,A4ŒRestore�A4,NTCCC20‚CLR.L…D0’Clear�for�successful�return ‰RTS›RETURNéééééŠPAGEJ************************************************************************** *�INCLUDE�FILE:‚NTS.NTCCONN.AIª*J************************************************************************** )ŠTTL„NTCCONN.SA‰Connect�Request�from�.SSC*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*?*„NTCCON8�handles�a�Connect�request�issued�by�the�SSC�task�on…*7*Œbehalf�of�another�NAU�that�wants�to�be�connected�to…*#*Œan�NAU�in�this�node�of�network.™**Ä*F***********************************************************************(*ˆon�entry:�A6�=�address�of�caller's�TCB.*’A4�=�physical�address�of�NTC�parameter�block**ˆon�exit�:�D0�=‡Return�code-*’D0�=�00„Successful�-�or�transaction�not�yet *�complete.5*’D0�=�xx„See�NTSRCOD�equates�for�list�of�error�codesF************************************************************************ˆValidity�checks*+NTCCON8ƒMOVE.L�NNTBEG,A5ŠStart�of�NNT�table0ŠMOVE.L�NTCLNAM(A4),D1…1st�4�chars�of�local�name3ŠMOVE.W�NTCLNAM+4(A4),D2ƒLast�2�chars�of�local�name%ŠBSR„NWTNAMCŒFind�Network�Name�in�NNT#ŠBNE.S‚NTCCN04ŒBranch�if�name�found4NTCCN02ƒMOVE.L�#NTSRTNAU,D0‡ERROR�-�target�not�found ŠRTS—RETURN*FNTCCN04ƒBTSTƒ#NNTSRMT,NNTSTAT(A2)�Is�this�remote�entry?�(shouldn't�be)ŠBNE„NTCCN02ŒBranch�if�YES+ŠMOVE.L�NNTNAT(A2),A3†Get�NAT�entry�address?ŠBTSTƒ#NNTSIPB,NNTSTAT(A2)�Is�param�block�saved�instead�of�NAT?ŠBEQ.S‚NTCCN06ŒBranch�if�NO5ŠMOVE.L�NTSNEXT(A3),A3…Get�NAT�entry�from�param�block*;NTCCN06ƒBTSTƒ#NNTSDISC,NNTSTAT(A2)�Has�target�disconnected?ŠBEQ.S‚NTCCN07ŒBranch�if�NO ŠCLR.L‚D05ŠMOVE.B�NATDCOD(A3),D0…ERROR�-�return�disconnect�codeŠRTS)NTCCN07ƒTST.L‚NATTCB(A3)‰Does�task�exist?ŠBNE.S‚NTCCN08ŒBranch�if�YES0ŠMOVE.L�#NTSRDCNT,D0‡ERROR�-�target�disconnected ŠRTS—RETURN*4NTCCN08ƒBTSTƒ#NATSLACT,NATSTAT(A3)�Is�Listen�Active?ŠBNE.S‚NTCCN10ŒBranch�if�YES1ŠMOVE.L�#NTSRILIS,D0‡ERROR�-�target�not�listening ŠRTS—RETURN*Î:×;ß7ç5*ˆSearch�LCT�entries�for�matching�Remote�Network�Name*-NTCCN10ƒMOVE.L�NTCRNAM(A4),D4…Get�Remote�name(ŠMOVE.W�NTCRNAM+4(A4),D5ƒGet�Remote�name+ŠBSR„NWFNLCNŒSearch�table�for�matching�name"ŠBNE.S‚NTCCN14ŒBranch�if�not�found6ŠBTSTƒ#LCTCSDSC,LCTCST A(A5)�Is�status�=�'DISCONNECT'�?ŠBNE.S‚NTCCN12ŒBranch�if�YES.ŠMOVE.L�#NTSRDPRQ,D0‡ERROR�-�duplicate�request ŠRTS—RETURN*2*ˆFree�the�DISCONNECTed�entry�-�will�build�new�one=NTCCN12ƒMOVE.L�LCTLULNK(A5),LCTLULNK(A0)�Remove�from�LU�chain$ŠMOVE.L�LCTBEG,A0ŠStart�of�LCT�table0ŠMOVE.L�LCTFHDR(A0),LCTNEXT(A5)�Add�to�free�list.ŠMOVE.L�A5,LCTFHDR(A0)…Update�free�list�header*(*ˆCONNECT�received�-�build�new�LCT�entry**+NTCCN14ƒMOVE.L�LCTBEG,A0ŠStart�of�LCT�table,ŠTST.L‚LCTFHDR(A0)ˆDoes�free�LCT�entry�existŠBNE.S‚NTCCN16ŒBranch�if�YES+ŠMOVE.L�#NTSRLCOV,D0‡ERROR�-�no�room�in�LCT ŠRTS—RETURN*+NTCCN16ƒBSR„NWBLDLCT‹Go�build�new�LCT�entry9ŠBSETƒ#LCTCSRCV,LCTCSTA(A5)�Set�'CONNECT�Received'�status8ŠMOVE.W�NTCRNAU(A4),LCTRMNAU(A5)�Save�remote�NAU�and�SID*:*ˆIf�LISTEN�not�waiting�-�put�CONNECTinto�Listen/Connect�Q*?ŠBTSTƒ#NATSLSTW,NATSTAT(A3)�Is�LISTEN�waiting�for�this�CONNECT?ŠBNE.S‚NTCCN30ŒBranch�if�YES*5ŠLEA„NATLCNLK-NTSNEXT(A3),A0�Listen/Connect�Q�pointerŠBSR„NWLNKPBŒFind�end�of�Q+ŠBEQ.S‚NTCCN20ŒBranch�if�no�duplicate�found&ŠCRASH.T�*+1�Crash�system�4/11/83�SCB.0ŠMOVE.L�#NTSRKILL,D0‡SSC�should't�use�duplicates ŠRTS—RETURN,NTCCN20ƒCLR.L‚NTSNEXT(A4)ˆClear�next�pointer'ŠMOVE.L�A4,NTSNEXT(A0)…Save�at�end�of�Q8ŠBSETƒ#NATSCONW,NATSTAT(A3)�Set�'connect�pb�in�Q'�status.ŠMOVE.L�#NTCRSVPB,D0‡Set�D0�for�Wait-till-done ŠRTS—RETURN*6*ƒA�Listen�is�waiting�for�this�Connect�-�match�them�up*8NTCCN30ƒBSR„TRACTOLC‹Ask�transport�level�to�do�the�match&ŠCLR.L‚D0‘Set�D0�for�successful�return ŠRTS—RETURNŠPAGE*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*<*„NTCCON9�handles�a�Connect�request�issued�by�the�SSC�taskˆ*;*Œwhen�a�response�has�been�received�to�a�CONNECT�request.�**Ä*F***********************************************************************(*ˆon�entry:�A6�=�address�of�caller's�TCB.*’A4�=�physical�address�of�NTC�parameter�block**ˆon�exit�:�D0�=‡Return�code-*’D0�=�00„Successful�-�or�transaction�not�yet *�complete.5*’D0�=�xx„See�NTCRCOD�equates�for�list�of�error�codesF************************************************************************ˆValidity�checks*:NTCCON9ƒMOVE.B�NTCLNAU(A4),D6…Network�Address�of�local�NAUŠBSR„NWFNAT�Go�find�NAT�entry$ŠBEQ.S‚NTCC902ŒBranch�if�entry�found2ŠMOVE.L�#-NTSRINAU,D0†ERROR�-�no�entry�at�this�end ŠRTS—RETURN*:NTCC902ƒMOVE.L�NTCRNAM(A4),D4…1st�4�characters�of�Net�Name6ŠMOVE.W�NTCRNAM+4(A4),D5ƒlast�4�characters�of�Net�NameŠBSR„NWFNLCNŒFind�LCT�entryŠBEQ.S‚NTCC904ŒBranch�if�found1ŠMOVE.L�#-NTSRTNAU,D0†ERROR�-�LCT�entry�not�found ŠRTS—RETURN*)NTCC904ƒTST.L‚NATTCB(A3)‰Does�task�exist?ŠBEQ.S‚NTCC918ŒBranch�if�NO3ŠBCLRƒ#LCTCSINT,LCTCSTA(A5)�Is�'CONN�Initiate'�set?ŠBNE.S‚NTCC908ŒBranch�if�YES.ŠBTSTƒ#LCTCSDSC,LCTCSTA(A5)�Did�it�discinnect?ŠBEQ.S‚NTCC906ŒBranch�if�NO*ŠMOVE.L�#-NTSRDISC,D0†ERROR�-�DisconnectedŠRTS(NTCC906ƒCRASH.T�*+1�4/11/83�Crash�system.ŠMOVE.L�#NTSRKILL,D0‡ERROR�-�don't�know�why???ŠRTS*-*„Found�the�right�entry�--�respond�to�CONNECT**„NTCIDN8�handles�an�Identify�Self�command�issued�by�.SSC�in†*7*Œprimary�on�behalf�of�an�NAU�in�a�secondary�station.…*)*ŒAn�NAU�is�identified�by�Network�Name.“**Ä*F***********************************************************************&*ˆon�entry:�A6�=�address�of�.SSC's�TCB.*’A4�=�physical�address�of�NTC�parameter�block**ˆon�exit�:�D0�=‡Return�code*’D0�=�00„Successful5*’D0�=�xx„See�NTSRCOD�equates�for�list�of�error�codesF***********************************************************************6NTCIDN8‚MOVE.L„NNTBEG,A5ˆPointer�to�Network�Name�Table‰BSR‡NWTNAM‹Check�Network�Name'‰BEQ.S…NTCID10ŠBranch�if�name�not�found*‰CMP.B…#NTSRDNAM,D0…Is�it�duplicate�entry?‰BNE.S…NTCID02ŠBranch�if�NO:‰BTST†#NNTSDISC,NNTSTAT(A2)�Is�entry�for�DISCONNected�NAU?‰BNE.S…NTCID08ŠBranch�if�YESNTCID02‚RTS˜RETURN*9NTCID08‚BSR‡NWFRNNTŠGo�free�NNT�entries�and�any�NAT�entry*4NTCID10‚MOVE.L„NNTFHDR(A5),D0ƒ1st�entry�in�free�list%‰BNE.S…NTCID12ŠBranch�if�entry�exists(‰MOVE.L„#NTSRNNOV,D0…ERROR�-�NNT�is�full ‰RTS˜RETURN*$*ˆBuild�new�Network�Name�Table�entry*0NTCID12‚MOVE.L„D0,A2ŒA2�is�new�NNT�entry�pointer‰CLR.W…NNTSTAT(A2)†Clear�status+‰MOVE.L„NTCLNAM(A4),NNTNAM(A2)�Network�Name/‰MOVE.W„NTCLNAM+4(A4),NNTNAM+4(A2)�Network�Name1‰MOVE.W„NTCLNAU(A4),NNTNAU(A2)�NAU�and�Station�ID)‰CLR.L…NNTNAT(A2)‡Clear�NAT�entry�pointer,‰BTST†#NNTSLACT,NTCOPT(A4)‚Is�Listen�active?‰BEQ.S…NTCID14�Branch�if�NO0‰BSET†#NNTSLACT,NNTSTAT(A2)�Set�it�in�Name�table5NTCID14‚BSET†#NNTSACT,NNTSTAT(A2)‚NNT�status�=�active4‰BSET†#NNTSRMT,NNTSTAT(A2)‚NNT�status�=�remote�entry*;‰MOVE.L„NNTNEXT(A2),NNTFHDR(A5)‚Remove�entry�from�free�listø85‰MOVE.L„NNTAHDR(A5),NNTNEXT(A2)‚Link�into�active�list(‰MOVE.L„A2,NNTAHDR(A5)‹New�active�header%‰CLR.L…D0�Clear�for�successful�return ‰RTS˜RETURNéééééé  éŠPAGEJ**************************************************************************!*�INCLUDE�FILE:‚NTS.NTCLSTNP.AI©*J************************************************************************** )‰TTL‡NTCLSTNP.SA‚Listen�Request�from�.SSC*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*6*„NTCLST8�handles�a�LISTEN�command�issued�by�.SSC�inŽ*7*Œprimary�on�behalf�of�an�NAU�in�a�secondary�station.…*)*ŒAn�NAU�is�identified�by�Network�Name.“**Ä*F***********************************************************************&*ˆon�entry:�A6�=�address�of�.SSC's�TCB.*’A4�=�physical�address�of�NTC�parameter�block**ˆon�exit�:�D0�=‡Return�code*’D0�=�00„Successful5*’D0�=�xx„See�NTSRCOD�equates�for�list�of�error�codesF***********************************************************************6NTCLSN8‚MOVE.L„NNTBEG,A5ˆPointer�to�Network�Name�Table&‰MOVE.L„NTCLNAM(A4),D1ƒListener's�name(‰MOVE.W„NTCLNAM+4(A4),D2ƒListener's�name‰BSR‡NWTNAMCŠFind�Network�Name'‰BEQ.S…NTCLS04ŠBranch�if�name�not�found:‰BTST†#NNTSDISC,NNTSTAT(A2)�Is�entry�for�DISCONNected�NAU?‰BNE.S…NTCLS08ŠBranch�if�YES3‰BSR‡NWSETLAŠSet�'Listen-active'�in�all�NNT�entries$‰CLR.L…D0�Code�for�successful�return ‰RTS˜RETURN*7NTCLS04‚MOVE.L„#NTSRINAU,D0…ERROR�-�NNT�entry�not�found ‰RTS˜RETURN*7NTCLS08‚MOVE.L„#NTSRDISC,D0…ERROR�-�NAU�is�disconnected ‰RTS˜RETURN0‰TTL‡NTCLSTNP.SA‚Listen�Cancel�Request�from�.SSC‰PAGE*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*=*„NTCLSC8�handles�a�LISTEN�CANCEL�command�issued�by�.SSC�in‡*7*Œprimary�on�behalf�of�an�NAU�in�a�secondary�station.…*)*ŒAn�NAU�is�identified�by�Network�Name.“**Ä*F***********************************************************************&*ˆon�entry:�A6�=�address�of�.SSC's�TCB.*’A4�=�physical�address�of�NTC�parameter�block**ˆon�exit�:�D0�=‡Return�code*’D0�=�00„Successful ;5*’D0�=�xx„See�NTSRCOD�equates�for�list�of�error�codesF***********************************************************************6NTCLSC8‚MOVE.L„NNTBEG,A5ˆPointer�to�Network�Name�Table&‰MOVE.L„NTCLNAM(A4),D1ƒListener's�name(‰MOVE.W„NTCLNAM+4(A4),D2ƒListener's�name‰BSR‡NWTNAMCŠFind�Network�Name'‰BEQ.S…NTCLC04ŠBranch�if�name�not�found5‰BSR‡NWCLRLAŠClear�'Listen-active'�in�all�NNT�entries$‰CLR.L…D0�Code�for�successful�return ‰RTS˜RETURN*8NTCLC04‚MOVE.L„#-NTSRINAU,D0„ERROR�-�NNT�entry�not�found ‰RTS˜RETURN ééé! ééŠPAGEJ***************************************************************************�INCLUDE�FILE:‚NTS.NTCREQ.AI«*J************************************************************************** -ŠTTL„NTCREQ.SAŠAll�Special�Commands�from�SSCT-NTCREQ„IDNTƒ1,0�HANDLE�NTC�REQUESTS�FROM�SSCT*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*0*„NTCREQ�responds�to�priviledged�requests�from”*#*�the�System�Service�Control�Task–**Ä*@*„NTCREQ�is�accessed�via�a�dynamically�configured�TRAP�#1�call„*(*‹(control�is�passed�here�from�NTSREQ)•**Ä*F***********************************************************************(*ˆon�entry:�A6�=�address�of�caller's�TCB.*’A4�=�physical�address�of�NTC�parameter�block+*’D0�=�request�command�from�parameter�block**ˆon�exit�:�D0�=‡Return�code-*’D0�=�00„Successful�-�or�transaction�not�yet *�complete.5*’D0�=�xx„See�NTSRCOD�equates�for�list�of�error�codesF***********************************************************************ŠPAGE ŠSECTION�10ŠOPT„PCS#ŠXREFƒNNTBEG,NATBEG,LCTBEG,NWSTATUS'ŠXREFƒTRABTOU,TRADTXQ,TRACTOLL,TRACTOLC ŠXREFƒNTSRRTN2ŠXREFƒNWTNAM,NWMGSSC,NWLNKBQ,NWFNAT,NWFLCT,NWFNLCC6ŠXREFƒNWTNAMC,NWFNLCN,NWFRNNT,NWLNKPB,NWSETLA,NWBLDLCT.ŠXREFƒNWDCLCT,NWFRLCT,NWCLRLA,NWSIGNAL,NWSETDCŠXREFƒNWCREQ,NWFREPB* ŠXDEFƒNTCREQ*8NTCREQ„MOVE.L�TCBNAU(A6),D1†Is�caller�an�identified�NAU?ŠBNE.S‚NTCR04�Branch�if�yes0ŠMOVE.L�#NTSRINAU,D0‡ERROR�-�Unidentified�callerŠBRA„NTSRRTNŒBranch�to�return*3NTCR04„MOVE.L�D1,A3ŽSave�pointer�to�NAT�table�entry.ŠBTSTƒ#5,D0ŽIs�this�an�NWC�command?�'Ax'�type?ŠBNE„NWCREQ�Branch�if�YES,ŠCMP.B‚#SSCNAU,NATNAU(A3)�Is�SSC�the�caller?ŠBEQ.S‚NTCR06�Branch�if�YES2NTCR05„MOVE.L�#NTSRICMD,D0‡ERROR�-�Illegal�commandŠBRA„NTSRRTNŒBranch�to�return*=NTCR06„LEA„NTCCTBL8(PC),A0„Start�of�$8x�command�routine�table"ŠBTSTƒ#4,D0ŽIs�this�a�$9x�command?ŠBEQ.S‚NTCR08�Branch�if�NO7ŠLEA„NTCCTBL9(PC),A0„Start�of�$9x�command�routine�table<#5)NTCR08„AND.B‚#$0F,D0ŒStrip�off�upper�bits+ŠBEQ.S‚NTCR05�Branch�if�0�-�illegal�command-ŠCMP.B‚#NTCCBIG,D0ˆIs�command�in�legal�range?ŠBGT„NTCR05�Branch�if�NO(ŠLSL.L‚#2,D0Žcommand*4�=�offset�in�table+ŠADD.L‚-4(A0,D0),A0‡Command�routine�address(ŠJSR„(A0)�Go�to�specific�command�routine*$*„Rules�for�return�from�NTC�routine:*8*ˆD0=0�or�error�codeˆSet�NTCXRCOD=D0,�set�'TC'�in�NTCSTA#*¢(The�error�is�in�the�transaction)*;*ˆD0=-1�(NTCRSVPB)ŠDo�NOT�set�'TC'�in�NTCSTA�-�not�complete*;*ˆD0=-n�(other�than�-1)…Set�NTCRCOD=-D0,�set�'TC'�in�NTCSTA*¢(The�error�is�for�SSCT)*"NTCRRTNƒTST.L‚D0‘Check�return�code)ŠBMI.S‚NTCRR04ŒBranch�if�minus�-�for�SSCT.ŠMOVE.B�D0,NTCXRCOD(A4)„Save�transaction�error'ŠCMP.B‚#NTSRKILL,D0‡Is�it�killer�error?5ŠCRASH.EQ�*+1ŽIf�yes�-�then�crash�system�4/11/83�SCB.+ŠBEQ„NTSRRTNŒBranch�if�YES-�go�crash�system7ŠBSETƒ#NTSSTC,NTCSTA(A4)�Set�status-�'transac�complete'NTCRR02ƒRTE—RETURN*9NTCRR04ƒCMP.L‚#NTCRSVPB,D0‡Does�transaction�have�to�wait?ŠBEQ„NTCRR02ŒBranch�if�YES#ŠNEG.L‚D0‘Change�form�of�error�code!ŠBRA„NTSRRTNŒGo�to�return�process*.*ˆNON-Existant�Commands�are�equated�to�NULLCMD*3NULLCMDƒMOVE.L�#NTSRICMD,D0‡ERROR�-�Illegal�command ŠRTS—Return*'*„Tables�of�Command�Processing�Rou! tines*8NTCCTBL8‚DC.LƒNTCIDN8-NTCCTBL8ƒIdentify�Self�routine‚$81)ŠDC.LƒNTCLSN8-NTCCTBL8ƒListen�routine‰$820ŠDC.LƒNTCLSC8-NTCCTBL8ƒCancel�Listen�routine‚$83*ŠDC.LƒNTCCON8-NTCCTBL8ƒConnect�routineˆ$841ŠDC.LƒNTCCNC8-NTCCTBL8ƒCancel�Connect�routine�$85-ŠDC.LƒNTCDSC8-NTCCTBL8ƒDisconnect�routine…$869NTCCBIGƒEQU„(*-NTCCTBL8)/4…Any�code�>=�NTCCBIG�is�illegal*8NTCCTBL9‚DC.LƒNTCIDN9-NTCCTBL9ƒIdentify�Self�routine‚$91)ŠDC.LƒNTCLSN9-NTCCTBL9ƒListen�routine‰$920ŠDC.LƒNTCLSC9-NTCCTBL9ƒCancel�Listen�routine‚$93*ŠDC.LƒNTCCON9-NTCCTBL9ƒConnect�routineˆ$941ŠDC.LƒNTCCNC9-NTCCTBL9ƒCancel�Connect�routine�$95-ŠDC.LƒNTCDSC9-NTCCTBL9ƒDisconnect�routine…$96=/*=/*†NTS.NTCREQP.AF=/*0=/* Chain file to assemble module NTS.NTCREQP.SA=/*:=/* If no output argument is specified for the listing the-=/* chain file will default to NTS.NTCREQP.LS=/*=/IFC \1ƒ=ARG�NTS.NTCREQP.LS=/ENDIF=/*+=ASM NTS.NTCREQP.SA,NTS.NTCREQP.RO,\1;RZ=80=/*{ Included files are:=/*ƒ9995.&.CRASH.MC=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.SDLCPRI.TEMPLTS.EQ=/*ƒ9995.NTS.NNT.EQ=/*ƒ9995.NTS.NAT.EQ=/*ƒ9995.NTS.LCT.EQ=/*ƒ9995.NTS.NTS.EQ=/*ƒ9995.NTS.NTC.EQ=/*ƒ9995.NTS.SMSG.EQ=/*ƒNTS.NTCREQ.AI=/*ƒNTS.NTCIDNTP.AI=/*ƒNTS.NTCLSTNP.AI=/*ƒNTS.NTCCONN.AI=/*ƒNTS.NTCCONC.AI=/*ƒNTS.NTCDISCP.AI=/*}=/*=ENDééééé+!‰NOLIST‰INCLUDE�9995.&.CRASH.MC‰INCLUDE�9995.&.STR.EQ‰NOLIST‰INCLUDE�9995.&.TCB.EQ ‰INCLUDE�9995.SDLCPRI.TEMPLTS.EQ‰LIST*ˆINCLUDE�9995.&.CRASH.MC*ˆINCLUDE�9995.&.STR.EQ*ˆINCLUDE�9995.&.TCB.EQ!*ˆINCLUDE�9995.SDLCPRI.TEMPLTS.EQ*ˆINCLUDE�9995.NTS.NNT.EQ*ˆINCLUDE�9995.NTS.NAT.EQ*ˆINCLUDE�9995.NTS.LCT.EQ*ˆINCLUDE�9995.NTS.NTS.EQ*ˆINCLUDE�9995.NTS.NTC.EQ*ˆINCLUDE�9995.NTS.SMSG.EQ‰INCLUDE�9995.NTS.NNT.EQ‰INCLUDE�9995.NTS.NAT.EQ‰INCLUDE�9995.NTS.LCT.EQ‰INCLUDE�9995.NTS.NTS.EQ‰INCLUDE�9995.NTS.NTC.EQ‰INCLUDE�9995.NTS.SMSG.EQ** Code file includes*ˆINCLUDE�NTS.NTCREQ.AI*ˆINCLUDE�NTS.NTCIDNTP.AI*ˆINCLUDE�NTS.NTCLSTNP.AI*ˆINCLUDE�NTS.NTCCONN.AI*ˆINCLUDE�NTS.NTCCONC.AI*ˆINCLUDE�NTS.NTCDISCP.AI ‰INCLUDE�NTS.NTCREQ.AI‰INCLUDE�NTS.NTCIDNTP.AI‰INCLUDE�NTS.NTCLSTNP.AI‰INCLUDE�NTS.NTCCONN.AI‰INCLUDE�NTS.NTCCONC.AI‰INCLUDE�NTS.NTCDISCP.AI&‰TTL…NTCREQP.SA:�List�of�INCLUDE�files‰PAGE*6*„the�following�are�equates�for�commands�not�n" eeded�in*‰a�primary�station*NTCIDN9‚EQU‡NULLCMDNTCLSN9‚EQU‡NULLCMDNTCLSC9‚EQU‡NULLCMDNTCCNC9‚EQU‡NULLCMDNTCDSC9‚EQU‡NULLCMD‰ENDééé42ŠPAGEJ************************************************************************** *�INCLUDE�FILE:‚NTS.NTSCONC.AIª*J************************************************************************** &‰TTL‡NTSCONC.SA‚Connect�Cancel�Request*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*,*„NTSCONC�handles�a�Connect�Cancel�Command˜**Ä*F***********************************************************************(*ˆon�entry:�A6�=�address�of�caller's�TCB.*’A4�=�physical�address�of�NTS�parameter�block*’A3�=�calling�NAU's�NAT�entry**ˆon�exit�:�D0�=‡Return�code-*’D0�=�00„Successful�-�or�transaction�not�yet *�complete.5*’D0�=�xx„See�NTSRCOD�equates�for�list�of�error�codesF********************************************************************** *v**********;*NTSCONC:ƒCheck�validity�-�return�error�if�invalid�options. *^************ˆValidity�checks*;NTSCONC‚MOVE.W„NTSOPT(A4),D0„Get�options�for�validity�check2‰AND.W…#1<FANTSCC05‚MOVE.B„#NTSRDCLU,LCTLOCCD(A5)‚Save�Reason�code�for�Cancel$‰BSR‡NWLODSC�Cancel�local�connection*+*ˆCancel�'Recv-from-any'�if�last�connection*)‰TST.L…NATLCTLK(A3)ˆAny�more�connections?‰BNE.S…NTSCC10�Branch�if�YES‰MOVE.L„A4,-(A7)ŒSave�A4=‰LEA‡NATANYLK-NTSNEXT(A3),A4�Pointer�to�1st�'any'�param�block"‰BSR‡NWFREPB�Free�all�param�blocks!‰CLR.L…NATANYLK(A3)ˆClear�pointer‰MOVE.L„(A7)+,A4ŒRestore�A48NTSCC10‚BSET†#NTSSTC,NTSSTA(A4)‚Set�Transaction�Complete ‰RTS›RETURN" ééééééŠPAGEJ************************************************************************** *�INCLUDE�FILE:‚NTS.NTSCONN.AIª*J************************************************************************** ‰TTL‡NTSCONN.SA‚Connect�Request*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*?*„NTSCONN�handles�a�Connect�command�from�an�NAU�that�wants�to…* *Œcommunicate�with�another�NAUœ**Ä*F***********************************************************************(*ˆon�entry:�A6�=�address�of�caller's�TCB.*’A4�=�physical�address�of�NTS�parameter�block*’A3�=�calling�NAU's�NAT�entry**ˆon�exit�:�D0�=‡Return�code-*’D0�=�00„Successful�-�or�transaction�not�yet *�complete.5*’D0�=�xx„See�NTSRCOD�equates�for�list�of�error�codesF********************************************************************** *v********<* NTSCONN: Check validity - return error for invalid options *^**********ˆValidity�checks*;NTSCONN‚MOVE.W„NTSOPT(A4),D0„Get�options�for�validity�check2‰AND.W…#1<NTSCN14‚MOVE.W„NNTNAU(A2),D6‡Target�NAU�and�SID�-�save�for�msg+NTSCN16‚MOVE.L„LCTBEG,A0‹Start�of�LCT�table,‰TST.L…LCTFHDR(A0)‰Does�free�LCT�entry�exist‰BNE.S…NTSCN18�Branch�if�YES+‰MOVE.L„#NTSRLCOV,D0ˆERROR�-�no�room�in�LCTNTSCN17‚RTS›RETURN*7NTSCN18‚MOVE.L„NATNNT(A3),A2‡Address�of�local�NNT�entry$‰BSR‡NWMGSSC�Prepare�message�for�SSC-‰BNE‡NTSCN17�If�not�0,�then�ERROR�-�no�buffer8‰MOVE.W„D6,MSGRNAU(A1)†Add�remote�NAU�and�SID�to�message(‰MOVE.L„A0,A2�Buffer�address�for�TRAMOVB‰MOVE.W„D6,-(A7)ŒSave�D63‰BSR‡TRAMOVB�Ask�transport�level�to�give�msg�to�SSC‰MOVE.W„(A7)+,D6ŒRestore�D6/‰MOVE.L„TCBNAU(A6),A3‡Restore�NAT�entry�address$‰BSR‡NWBLDLCTŒGo�build�new�LCT�entry:‰BSET†#LCTCSINT,LCTCSTA(A5)�Set�'CONNECT�Initiated'�status:‰MOVE.W„D6,LCTRMNAU(A5)…Save�remote�NAU�and�SID�(if�known)9‰MOVE.L„A4,LCTTWTRP(A5)…Save�parameter�block�for�response!‰CLR.L…D0’Return�code�-�ok�so�far ‰RTS›RETURN**ˆResponse�to�CONNECT�received*3NTSCN30‚MOVE.L„A5,-(A7)ŒSave�LCT�entry�to�use�later0‰MOVE.L„NNTBEG,A5‹Start�of�NNT�-�for�msg�builder3‰MOVE.L„NATNNT(A3),A2‡Set�NNT�entry�for�msg�builder$‰BSR‡NWMGSSC�Prepare�message�for�SSC$‰BEQ.S…NTSCN31�Branch�if�good�return1‰MOVE.L„(A7)+,A5ŒIf�not�0,�then�ERROR�-�no�buffer‰RTS/NTSCN31‚MOVE.L„A0,A2�Buffer�address�for�TRAMOVB+‰MOVE.L„(A7),A0�Want�to�reference�LCT�again7‰MOVE.W„LCTRMNAU(A0),MSGRNAU(A1)�Put�NAU�and�SID�in�msg1‰OR.B†#$90,MSGCMD(A1)…Modify�command�for�response3‰BSR‡TRAMOVB�Ask�transport�level�to�give�msg�to�SSC/‰MOVE.L„TCBNAU(A6),A3‡Restore�NAT�entry�address*‰MOVE.L„(A7)+,A5ŒRestore�LCT�entry�address2‰BCLR†#LCTCSRCV,LCTCSTA(A5)�Clear�'receive'�status7‰BSET†#LCTCSACT,LCTCSTA(A5)�Set�'CONNECT�Active'�status3‰MOVE.B„NATLCC(A3),D0‡Get�next�Logical�Connect�Code3NTSCN32‚MOVE.B„D0,LCTLOLCC(A5)…Save�it�in�LCT�entry)‰MOVE.B„D0,NTSLCC(A4)‡Return�it�to�caller*‰ADD.B…#1,D0�Increment�for�next�assignment%‰BNE.S…NTSCN34�Branch�if�not�all�used-‰ADD.B…#1,D0�Increment�again�to�restart�count!‰BRA‡NTSCN32�Branch�to�resave�LCC5NTSCN34‚MOVE.B„D0,NATLCC(A3)‡Save�for�next�assignment1‰BSET†#NTSSTC,NTSSTA(A4)‚Set�Transaction�Complete&‰CLR.L…D0’Set�D0�for�successful�return ‰RTS›RETURN# éééééééŠPAGEJ************************************************************************** *�INCLUDE�FILE:‚NTS.NTSDISC.AIª*J************************************************************************** !‰TTL‡NTSDISC.SA‚Disconnect�an�NAU*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*(*„NTSDISC�handles�a�Disconnect�Commandœ**Ä*F***********************************************************************(*ˆon�entry:�A6�=�address�of�caller's�TCB.*’A4�=�physical�address�of�NTS�parameter�block*’A3�=�calling�NAU's�NAT�entry**ˆon�exit�:�D0�=‡Return�code-*’D0�=�00„Successful�-�or�transaction�not�yet *�complete.5*’D0�=�xx„See�NTSRCOD�equates�for�list�of�error�codesF********************************************************************** *v*********‹{Handle�disconnect�command}<*NTSDISC:ƒCheck�validity�-�return�error�for�invalid�options.J*NTSDC02:ƒIF�there�is�an�LCT�entry�pointed�at�by�this�NAT�entry�(NATLCTLK)8*‹THEN‚cancel�connection�via�subroutine�NWLODSC.�{LCT�is+*‘unlinked�from�NAT.}‚Cancel�reason�code�is.*‘#NTSRDCLU�($21)�-�disconnected�by�local�NAU.*‘GOTO�NTSDC02:.B*NTSDC04:ƒELSE‚Cancel�listen�via�NWLSTC�subroutine.�Reason�code�is.*‘#NTSRDCLU�($21)�-�disconnected�by�local�NAU.2*‘Set�'transaction�complete'�and�return�error�code-*‘for�all�P.B.'s�linked�to�this�NAT�entry�via3*‘NATCNNLK�-�'connect-init'�link.‚This�is�performed*‘via�NWFREPB�subroutine.7*‘Perform�above�in�the�same�manner�for�all�P.B's�linked;*‘to�this�NAT�entry�via�NATANYLK�-�'recieve�from�any'�link.3*‘Clear�links�in�NAT�entry,�save�disconnect�code�in6*‘NAT�entry,�clear�'active'�and�set�'disconnect'�flags*‘in�NAT�status.>*NTSDC08:‰Set�'disconnect'�status,�clear�'active'�and�'listen'3*‘statuses�for�all�NNT's�associated�with�this�NAT's%*‘NAU�and�SID�via�NWSETDC�subroutine.5*‘Set�'transaction�complete'�and�return�successfully. *^**********ˆValidity�checks*;NTSDISC‚MOVE.W„NTSOPT(A4),D0„Get�options�for�validity�checko4x9€$ &‰AND.W…#1<,NTSSAD(A4),NTSLEN(A4)‚Convert�buff�addr%‰BRA.S…NTSLS06ŠBranch�if�good�address‰NOP6NTSLS05‚MOVE.L„#NTSRIBUF,D0…ERROR�-�bad�buffer�address ‰RTS˜RETURN*2NTSLS06‚CMP.L…#16,NTSLEN(A4)„Is�buffer�big�enough?‰BMI‡NTS& LS05ŠBranch�if�NO *v********/*‹IF�'connect�waiting'�bit�NOT�set�in�NNT�entry%*‹THEN‚IF�this�station�is�the�primary(*‘THEN‚Set�'listen�active'�in�NAT�entry.3*—Set�'listen�active'�in�all�NNT�entries�associated*—with�this�NAT�entry.-*NTSLS08:‰IF�'listen�active'�set�in�NAT�entry/*‘THEN‚IF�'listen�pending'�NOT�set�in�NAT�entry2*—THEN‚Set�user's�NTS�P.B.�status�to�acknowledged.8*NTSLS10:�Link�this�NTS�P.B.�onto�the�end�of�the�listen/*—connect�queue.‚(NATLCNLK)*—Return�with�succesful�code.²:»3ÃA*NTSLS14:‰ELSE‚{This�is�1st�listen�from�NAU�in�Secondary�station}4*—Prepare�message�for�SSC�to�inform�primary�station.1*—Set�'listen�active'�and�'listen�pending'�status*—in�NAT�entry.*—GOTO�NTSL10:,*‹ELSE‚{Ask�transport�level�to�do�the�match}*‘BSRƒTRACTOLL. *‘Return.* *^********;*ˆIf�CONNect�not�waiting�-�put�Listen�into�Listen/Connect�Q*?‰BTST†#NATSCONW,NATSTAT(A3)‚Is�CONNect�waiting�for�this�Listen?‰BNE.S…NTSLS20�Branch�if�YES*.‰TST.B…NATSID(A3)ŠIs�this�station�the�primary?‰BNE.S…NTSLS08�Branch�if�NO:‰BSET†#NATSLACT,NATSTAT(A3)�Set�'Listen�Active'�if�primary'‰MOVE.L„NATNNT(A3),A2‡NNT�entry�pointer3‰BSR‡NWSETLA�Set�'Listen�Active'�in�all�NNT�entries9NTSLS08‚BTST†#NATSLACT,NATSTAT(A3)�Is�'Listen�Actve'�set?‰BEQ.S…NTSLS14�Branch�if�NO4‰BTST†#NATSLPND,NATSTAT(A3)�Is�'Listen�Pending'�set?(‰BNE.S…NTSLS10�If�yes�-�branch�to�return9‰BSET†#NTSSACK,NTSSTA(A4)‚Set�pb�status�to�'acknowledged',NTSSAD(A4),NTSLEN(A4)‚Convert�buff�addr%‰BRA.S…NTSRV08ŠBranch�if�good�address‰NOP6NTSRV05‚MOVE.L„#NTSRIBUF,D0…ERROR�-�bad�buffer�address ‰RTS˜RETURN*9NTSRV07‚MOVE.L„#NTSRILCC,D0…ERROR�-�No�logical�connection ‰RTS˜RETURN *v********0*NTSRV08:ƒIF�'accept-from-any'�option�is�NOT�setÜ9å:í:*‹THEN‚IF�LCC�is�NOT�found�in�LCT�chain�with�same�value�as*‘that�in�NTS�parameter�block/*‘THEN‚return�with�error�code�#NTSRILCC�($08)�-*—LCT�entry�not�found.*‘ELSE‚{LCT�entry�found}"*NTSRV09:�IF�connection�not�active*—THEN‚IF�NOT�disconnected.*�THEN‚return�with�error�code�#NTSRDISC�($20)-*£connection�not�active.*�ELSE‚{disconnected}*£return�LCT�entry�to�free�list!*£return�reason�code�found�in�LCT*—ELSE‚{connection�active}+*�Link�NTS�P.B.�onto�end�of�'wait�for�recv'*�queue�(LCTRWTRV)./*NTSRV12:•Set�'wait�for�receive'�status�in�LCT.$*�Ask�transport�level�to�fill�buffer*�via�TRABTOU�subroutine.%*‹ELSE‚{'accept-from-any'�option�set}-*NTSRV16:‰Find�next�LCT�entry�in�active�list.*‘IF�such�an�entry�exists8*‘THEN‚IF�this' �LCT�entry�has�a�complete�msg�linked�to�it)*—THEN‚Link�this�NTS�P.B.�onto�the�end�of*�that�queue�(LCTRWTRV).*�GOTO�NTSRV12:.*—ELSE‚GOTO�NTSRV16:.$*‘ELSE‚{no�LCT�entry�in�active�list}8*NTSRV20:�Link�this�NTS�P.B.�onto�the�'receive-from-any'*—queue�of�the�NAT�(NATANYLK).*—Return�successfully.* *^********4*ˆIf�'Accept-from-any'�not�set�then�search�LCT�chain*:NTSRV08‚BTST†#NTSOANY,NTSOPT(A4)‚Is�'Accept-from�any'�set?‰BNE.S…NTSRV14ŽBranch�if�YES.‰BSR‡NWFNLCCŠSearch�LCT�chain�for�matching�LCC(‰BNE‡NTSRV01ŠBranch�if�ERROR�-�not�found1‰BTST†#LCTCSACT,LCTCSTA(A5)‚Is�connection�active?‰BNE.S…NTSRV10ŠBranch�if�YES9NTSRV09‚MOVE.L„#NTSRDISC,D0…ERROR�-�Connection�not�active)‰BTST†#LCTCSDSC,LCTCSTA(A5)ƒDisconnected?‰BEQ.S…NTSRV09A‰Branch�if�NO ‰CLR.L…D6'‰MOVE.B„LCTLOCCD(A5),D6‚Get�reason�code+‰BSR‡NWFRLCTŠFree�the�entry-�owner�informed ‰MOVE.L„D6,D0ŒReturn�reason�codeNTSRV09A�RTS˜RETURN*;NTSRV10‚LEA‡LCTRWTRV-NTSNEXT(A5),A0�Wait-for-recv�Q�pointer‰BSR‡NWLNKPBŠFind�end�of�Q+‰BNE‡NTSRV01ŠBranch�if�error�-�duplicate�pb%‰CLR.L…NTSNEXT(A4)†Clear�Next�pointer/‰MOVE.L„A4,NTSNEXT(A0)ƒLink�entry�onto�end�of�Q*2*ˆPass�request�on�to�transport�level�-�then�return* ‰XREF†TRABTOU=NTSRV12‚BSET†#LCTARWTR,LCTRSTA(A5)�Set�'wait-for-recv'�status/‰BSR‡TRABTOUŠAsk�transport�level�to�fill�buffer&‰CLR.L…D0�Set�D0�for�successful�return ‰RTS˜RETURN**ˆ'Accept�from�Any'�option�set=*ˆSearch�LCT�chain�for�'buffers-in-q'�and�'active'�connection*;NTSRV14‚LEA‡NATLCTLK-LCTLULNK(A3),A5‚1st�entry�in�LCT�chain8NTSRV16‚MOVE.L„LCTLULNK(A5),D0…Next�entry�in�active�list ‰BEQ.S…NTSRV20�Branch�if�no�more ‰MOVE.L„D0,A5�Next�entry�pointer<ŠTST.W‚LCTMCNT(A5)ˆComplete�message�linked�to�this�one?�SCB.0ŠBEQ.S‚NTSRV16ŒBranch�if�no�-�look�at�next.�SCB.4‰LEA‡LCTRWTRV-NTSNEXT(A5),A0�Wait-for-recv�Q�pointer‰BSR‡NWLNKPBŠFind�end�of�Q+‰BNE‡NTSRV01ŠBranch�if�error�-�duplicate�pb%‰CLR.L…NTSNEXT(A4)†Clear�Next�pointer/‰MOVE.L„A4,NTSNEXT(A0)ƒLink�entry�onto�end�of�Q‰BRA‡NTSRV12ŠGo�to�return*=NTSRV20‚LEA‡NATANYLK-NTSNEXT(A3),A0‚'Recv-from-any'�Q�pointer‰BSR‡NWLNKPBŠFind�end�of�Q+‰BNE‡NTSRV01ŠBranch�if�error�-�duplicate�pb%‰CLR.L…NTSNEXT(A4)†Clear�Next�pointer/‰MOVE.L„A4,NTSNEXT(A0)ƒLink�entry�onto�end�of�Q&‰CLR.L…D0�Set�D0�for�successful�return‰RTSééé=/*=/*†NTS.NTSREQ.AF=/*/=/* Chain file to assemble module NTS.NTSREQ.SA=/*:=/* If no output argument is specified for the listing the,=/* chain file will default to NTS.NTSREQ.LS=/*=/IFC \1ƒ=ARG�NTS.NTSREQ.LS=/ENDIF=/*)=ASM NTS.NTSREQ.SA,NTS.NTSREQ.RO,\1;RZ=95=/*{ Included files are:=/*ƒ9995.&.CRASH.MC=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.SDLCPRI.TEMPLTS.EQ=/*ƒ9995.NTS.NNT.EQ=/*ƒ9995.NTS.NAT.EQ=/*ƒ9995.NTS.LCT.EQ=/*ƒ9995.NTS.NTS.EQ=/*ƒ9995.NTS.NTC.EQ=/*ƒ9995.NTS.SMSG.EQ=/*ƒNTS.NTSSID.AI=/*ƒNTS.NTSIDNT.AI=/*ƒNTS.NTSLSTN.AI=/*ƒNTS.NTSLSTC.AI=/*ƒNTS.NTSCONN.AI=/*ƒNTS.NTSCONC.AI=/*ƒNTS.NTSDISC.AI=/*ƒNTS.NTSRECV.AI=/*ƒNTS.NTSRCVC.AI=/*ƒNTS.NTSSEND.AI=/*ƒNTS.NWSUBR.AI=/*}( =/*=ENDééééõ&%NTSREQ„IDNTƒ1,0�Handle�NTS�user�calls*$*‰COPYRIGHTED�1982�BY�MOTOROLA,�INC.*I**************************************************************************Ç*F*�NTSREQ�responds�to�user�requests�for�service.‚Priviledged�requestsƒ*A*„from�the�System�Service�Control�Task�are�passed�on�to�NTCREQ.†**Ç*A*�NTSREQ�is�accessed�via�a�dynamically�configured�TRAP�#1�call.‰**Ç*I**************************************************************************)*‰on�entry:‚A6�=�address�of�caller's�TCB..*”A0�=�logical�address�of�NTS�parameter�block.**‰on�exit:ƒD0�=‹Return�code-*”D0�=�00ˆSuccessful�-�or�transaction�not�yet *£complete./*”D0�=�xxˆSee�NTSRCOD�equates�for�list�of�error*£codes.*H**************************************************************************‰INCLUDE�9995.&.CRASH.MC*‰INCLUDE�9995.&.STR.EQ*‰INCLUDE�9995.&.TCB.EQ!*‰INCLUDE�9995.SDLCPRI.TEMPLTS.EQ*‰INCLUDE�9995.NTS.NNT.EQ*‰INCLUDE�9995.NTS.NAT.EQ*‰INCLUDE�9995.NTS.LCT.EQ*‰INCLUDE�9995.NTS.NTS.EQ*‰INCLUDE�9995.NTS.NTC.EQ*‰INCLUDE�9995.NTS.SMSG.EQ*ŠNOLISTŠINCLUDE�9995.&.CRASH.MCŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.TCB.EQ ŠINCLUDE�9995.SDLCPRI.TEMPLTS.EQŠLISTŠINCLUDE�9995.NTS.NNT.EQŠINCLUDE�9995.NTS.NAT.EQŠINCLUDE�9995.NTS.LCT.EQŠINCLUDE�9995.NTS.NTS.EQŠINCLUDE�9995.NTS.NTC.EQŠINCLUDE�9995.NTS.SMSG.EQŠPAGE ŠSECTION�10ŠOPT„PCS+ŠXREFƒNNTBEG,NATBEG,LCTBEG,NWSTATUS,SYSPOFF$ŠXREFƒNTCREQ,TRABTOU,TRADTXQ,TRAMOVBŠXREFƒTRACTOLL,TRACTOLC* ŠXDEFƒNTSREQ*vE*NTSREQ is a user configured directive invoked via TRAP #1, directive *ƒnumber�-2.**NTSREQ:„IF�network�is�dead*‹THEN4*NTSCRASH:ˆSet�return�to�not�put�task�on�ready�list.*‘Return�to�exec.*‹ELSE'*‘Clear�command�status�and�return�code.!*‘IF�command�NOT�'get�station�ID'*‘THEN*—IF�this�is�an�NTC�request*—THEN*�Branch�to�NTCREQ.�(external)*—ELSE'*�IF�this�is�an�'identify�self�command'*�THEN*£GOTO�NTSR12:*�ELSE*£IF�this�is�an�illegal�command*£THENþMS3"#*NTSR08:¢Stuff�error�code�#NTSRICMD*©($01)�into�D0.*©GOTO�NTSRRTN:.*£ELSE!*©IF�caller�NOT�an�identified�NAU*©THEN*¯Stuff�error�code�#NTSRINAU*¯($03)�into�D0.*¯GOTO�NTSRRTN:*©ELSE"*NTSR12:¨Save�pointer�to�NAT�entry*¯in�A3.*¯JSR�to( �the�appropriate*¯routine�-�one�of�these: *¯NTSSID�-*²Return�station�ID. *¯NTSIDNT�-*²Identify�self. *¯NTSLSTN�- *²Listen. *¯NTSLSTC�-*²Cancel�listen. *¯NTSCONN�- *²Connect. *¯NTSCONC�-*²Cancel�connect. *¯NTSDISC�- *²Disconnect. *¯NTSRECV�- *²Receive. *¯NTSRCVC�-*²Cancel�receive. *¯NTSSEND�-*²Send.*p$*‘ELSE�{command�is�'get�station�ID'}*—GOTO�NTSR12:.*^*v)* Return from command processing routine.*&*NTSRRTN:†IF�return�code�set�(D0�<>�0)*ŽTHEN(*”Plug�return�code�from�D0�into�NTS�P.B."*”IF�return�code�=�#NTSRKILK�($FE)*”THEN*šMark�network�as�dead.0*šChange�return�to�not�put�caller�on�ready�list.*šReturn�to�exec.*”ELSE'*šIF�return�code�is�NOT�for�'no�buffer'*šTHEN'* Set�'transaction�complete'�in�status.5*šPut�return�code�from�D0�into�caller's�D0�(TCBRTCD).*šIF�'transaction�complete'*šTHEN#* Wakeup�calling�task�via�NWSIGNAL.*šReturn�to�exec.%*ŽELSE�{Return�code�not�set�-�D0�=�0)*”Return�to�exec.*^/NTSREQ„TST.L‚NWSTATUS‹Is�NETWORK�dead�or�alive?ŠBMI„NTSCRASH‹Branch�if�deadDŠTR0$.LOGPHY�,A0,#NTSPBSZ�Convert�PB�addr�to�physical.$ŠBRA.S‚NTSR02�Branch�if�good�addressŠNOP>ŠMOVE.W�#NTSRPBLK,TCBRTCD(A6)�ERROR�-�bad�param�block�address.ŠRTE*6NTSR02„MOVE.L�D6,A4ŽSave�parameter�block�address�in�A4&ŠCLR.B‚NTSSTA(A4)‰Clear�command�status$ŠCLR.B‚NTSRCOD(A4)ˆClear�return�code* ŠCLR.L‚D0%ŠMOVE.B�NTSCMD(A4),D0†Get�NTS�command3ŠBEQ.S‚NTSR12�Branch�if�command�is�'get�Station�ID'#ŠBTSTƒ#7,D0ŽIs�this�an�NTC�command?&ŠBNE„NTCREQ�If�yes�-�branch�to�NTCREQ.**ŠCMP.B‚#NTSCIDNT,D0‡Identify�Self�command?ŠBEQ.S‚NTSR12�Branch�if�yes.(ŠBLT.S‚NTSR08�Branch�if�illegal�command.-ŠCMP.B‚#NTSCBIG,D0ˆIs�command�in�legal�range?&ŠBLE.S‚NTSR10�Branch�if�valid�command.3NTSR08„MOVE.L�#NTSRICMD,D0‡ERROR�-�illegal�command. ŠBRA.S‚NTSRRTNŒBranch�to�return.*8NTSR10„MOVE.L�TCBNAU(A6),D1†Is�caller�an�identified�NAU?ŠBNE.S‚NTSR12�Branch�if�yes.1ŠMOVE.L�#NTSRINAU,D0‡ERROR�-�unidentified�caller. ŠBRA.S‚NTSRRTNŒBranch�to�return.*4NTSR12„MOVE.L�D1,A3ŽSave�pointer�to�NAT�table�entry.4ŠLEA„NTSCTABL(PC),A0„Start�of�command�routine�table.)ŠLSL.L‚#2,D0ŽCommand*4�=�offset�in�table.*ŠADD.L‚(A0,D0),A0‰Command�routine�address.)ŠJSR„(A0)�Go�to�specific�command�routine.ŠPAGE*C* Return from Command Processing routine - set return code if error* ŠXDEFƒNTSRRTN$NTSRRTNƒTST.B‚D0‘Is�return�code�set?ŠBEQ.S‚NTSRRTN9‹Branch�if�NO2ŠMOVE.B�D0,NTSRCOD(A4)…Give�return�code�to�caller.)ŠCMP.B‚#NTSRKILL,D0‡Is�it�a�killer�error?.ŠCRASH.EQ�*+1ŽCrash�system�if�yes�4/11/83�SCB.ŠBEQ.S‚NTSCRASH‹Branch�if�yes.%ŠCMP.B‚#NTSRNOB,D0ˆIs�it�'no�buffer'?G*The�following�BEQ.S�was�replaced�by�NOP�on�4/4/83.‚The�idea�was�to�notI*‚allow�a�user�task�to�hang�up�when�it�issued�a�disconnect�and�there�wereE*‚no�buffers�to�satisfy�the�request.‚The�NOP�coupled�with�a�change�inE*‚NTSREQ�allows�the�error�code�(-1=#NTSRNOB)�'out�of�buffers'�code�toF*‚be�returned�to�the�caller.‚When�we�are�'out�of�buffers'�the�NTS�P.B.E*‚will�come�back�from�NTSREQ�with�the�'transaction�complete'�bit�set.ŠNOP9*‰BEQ.S‚NTSRRTN8‹Branch�if�yes�-�Transaction�NOT�complete0ŠBSETƒ#NTSSTC,NTSSTA(A4)�Is�transaction�coplete?=NTSRRTN8‚MOVE.W�D0,TCBRTCD(A6)…Put�return�code�in�caller's�D01ŠBTSTƒ#NTSSTC,NTSSTA(A4)�Is�transaction�complete?ŠBEQ.S‚NTSRRTN9‹Branch�if�NO"ŠMOVE.L�A6,A0ŽTCB�to�A0�for�SIGNAL ŠBSR„NWSIGNALNTSRRTN9‚RTE—RETURN*O* CRASH NETWORK SERVICES!! by setting NWDEAD flag and not letting task continue*0NTSCRASH‚BSETƒ#31,NWSTATUS‡Set�Network�Dead�flag?ŠMOVE.W�#1,6(A7)‡Change�exit�#,�do�not�put�caller�on�READY�listŠRTE*&* Table of Command Processing Routines*3NTSCTABL‚DC.LƒNTSSID-NTSCTABL„Return�station�ID�$000ŠDC.LƒNTSIDNT-NTSCTABLƒIdentify�Self�routine‰$01)ŠDC.LƒNTSLSTN-NTSCTABLƒListen�routine�$020ŠDC.LƒNTSLSTC-NTSCTABLƒCancel�Listen�routine‰$03*ŠDC.LƒNTSCONN-NTSCTABLƒConnect�routine�$041ŠDC.LƒNTSCONC-NTSCTABLƒCancel�connect�routineˆ$05-ŠDC.LƒNTSDISC-) NTSCTABLƒDisconnect�routineŒ$06*ŠDC.LƒNTSRECV-NTSCTABLƒReceive�routine�$071ŠDC.LƒNTSRCVC-NTSCTABLƒCancel�receive�routineˆ$08'ŠDC.LƒNTSSEND-NTSCTABLƒSend�routine’$099NTSCBIGƒEQU„(*-NTSCTABL)/4…Any�code�>=�NTSCBIG�is�illegal**‰INCLUDE�NTS.NTSSID.AI*‰INCLUDE�NTS.NTSIDNT.AI*‰INCLUDE�NTS.NTSLSTN.AI*‰INCLUDE�NTS.NTSLSTC.AI*‰INCLUDE�NTS.NTSCONN.AI*‰INCLUDE�NTS.NTSCONC.AI*‰INCLUDE�NTS.NTSDISC.AI*‰INCLUDE�NTS.NTSRECV.AI*‰INCLUDE�NTS.NTSRCVC.AI*‰INCLUDE�NTS.NTSSEND.AI*‰INCLUDE�NTS.NWSUBR.AIŠINCLUDE�NTS.NTSSID.AIŠINCLUDE�NTS.NTSIDNT.AIŠINCLUDE�NTS.NTSLSTN.AIŠINCLUDE�NTS.NTSLSTC.AIŠINCLUDE�NTS.NTSCONN.AIŠINCLUDE�NTS.NTSCONC.AIŠINCLUDE�NTS.NTSDISC.AIŠINCLUDE�NTS.NTSRECV.AIŠINCLUDE�NTS.NTSRCVC.AIŠINCLUDE�NTS.NTSSEND.AIŠINCLUDE�NTS.NWSUBR.AIŠENDéééŠPAGEJ************************************************************************** *�INCLUDE�FILE:‚NTS.NTSSEND.AIª*J************************************************************************** ŠTTL„NTSSEND.SA‰Send�Request*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*?*„NTSSEND�handles�a�Send�Message�command�-�used�to�transmit�a…*(*„message�to�the�NAU�identified�by�LCCœ**Ä*F***********************************************************************(*ˆon�entry:�A6�=�address�of�caller's�TCB.*’A4�=�physical�address�of�NTS�parameter�block*’A3�=�calling�NAU's�NAT�entry**ˆon�exit�:�D0�=‡Return�code-*’D0�=�00„Successful�-�or�transaction�not�yet *�complete.5*’D0�=�xx„See�NTSSDOD�equates�for�list�of�error�codesF************************************************************************ˆValidity�checks*;NTSSENDƒMOVE.W�NTSOPT(A4),D0†Get�options�for�validity�check@ŠAND.W‚#1<,NTSSAD(A4),NTSLEN(A4)�Convert�buff�addr%ŠBRA.S‚NTSSD06ŒBranch�if�good�addressŠNOP6NTSSD05ƒMOVE.L�#NTSRIBUF,D0‡ERROR�-�bad�buffer�address ŠRTS—RETURN*/NTSSD06ƒTST.L‚NTSLEN(A4)‰Is�buffer�length�>�0�?ŠBLE.S‚NTSSD05ŒBranch�if�NO*#*ˆSearch�LCT�chain�for�matching�LCC*.ŠBSR„NWFNLCCŒSearch�LCT�chain�for�matching�LCC(ŠBNE„NTSSD01ŒBranch�if�ERROR�-�not�found1ŠBTSTƒ#LCTCSACT,LCTCSTA(A5)�Is�connection�active?ŠBNE.S‚NTSSD10ŒBranch�if�YES9NTSSD09ƒMOVE.L�#NTSRDISC,D0‡ERROR�-�Connection�not�active:() )ŠBTSTƒ#LCTCSDSC,LCTCSTA(A5)�Disconnected?ŠBEQ.S‚NTSSD09A‹Branch�if�NO ŠCLR.L‚D6'ŠMOVE.B�LCTLOCCD(A5),D6„Get�reason�code+ŠBSR„NWFRLCTŒFree�the�entry-�owner�informed ŠMOVE.L�D6,D0ŽReturn�reason�codeNTSSD09A‚RTS—RETURN*;NTSSD10ƒLEA„LCTTWTXM-NTSNEXT(A5),A0�Wait-for-xmit�Q�pointerŠBSR„NWLNKPBŒFind�end�of�Q+ŠBNE„NTSSD01ŒBranch�if�error�-�duplicate�pb%ŠCLR.L‚NTSNEXT(A4)ˆLink�onto�end�of�Q(ŠMOVE.L�A4,NTSNEXT(A0)…Link�entry�into�Q*2*ˆPass�request�on�to�transport�level�-�then�return* ŠXREFƒTRABTOU6ŠBSETƒ#LCTATWTX,LCTTSTA(A5)�Set�'wait-for-xmit'�status0ŠBSR„TRADTXQŒAsk�transport�level�to�send�message&ŠCLR.L‚D0‘Set�D0�for�successful�return ŠRTS—RETURNééééé=/*=/*†NTS.NTSSERV.AF=/*0=/* Chain file to assemble module NTS.NTSSERV.SA=/*:=/* If no output argument is specified for the listing the-=/* chain file will default to NTS.NTSSERV.LS=/*=/IFC \1ƒ=ARG�NTS.NTSSERV.LS=/ENDIF=/*+=ASM NTS.NTSSERV.SA,NTS.NTSSERV.RO,\1;RZ=50=/*{ Included files are:=/*ƒ9995.&.TR1.EQ=/*ƒ9995.NTS.TR1X.EQ=/*ƒ9995.NTS.NTS.EQ=/*}=/*=ENDéééééé* 0Š' NTS NTSSERV SAEE srrNTSSID AIVV9rrNWCACKS AIgg rrNWCFLSH AIpp.rrNWCREQ AFyyrrNWCREQ SA‚‚ ]rrNWCSEND AI““0rrNWCTPRI AFœœrrNWCTPRI SA¥–7rrNWSUBR AI··„ÌrrSSCT AF@@rrSSCT SAIIh<rrTRABTOU AIºº-MrrTRACTOL AIëëlrrTRADTXQ AIüüArrTRAMOVB AIEE!ýrrTRANSSCNAFnnrrTRANSSCNSAwwrrTRANSSUBAF€€rrTRANSSUBSA‰‰rr;NTSSERVƒIDNTƒ1,0�Subroutine�-�Interface�to�Network�Services*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.**ŠNOLISTŠINCLUDE�9995.&.TR1.EQŠLISTŠINCLUDE�9995.NTS.TR1X.EQŠINCLUDE�9995.NTS.NTS.EQŠPAGEF*v*********************************************************************�NTSSERV�moduleµ**Ä*1*ˆSubroutine�to�interface�with�Network�Services�*8*ˆCalls�NTSRQST�directive�and�checks�return�conditionsˆ**Ä*2*ˆOn�entry:‚A0=Pointer�to�NTS�or�NTC�param�block�**Ä*;*ˆOn�exit:ƒD0�=�0�if�good�return�--�or�--�D0�=�error�codeƒ**Ä** Performs following:*<*NTSSERV:ƒPerform�TRAP�#1�with�-2�code.‚(Return�code�in�D0).***‹IF�D0�=�0�on�return�from�trap�(no�error)*‹THEN*ŽGOTO�NTSRV04:.*‹ELSE-*ŽIF�error�is�for�bad�parameter�block�address*ŽTHEN.*‘Return�to�caller�via�RTS�(error�code�in�D0.)*ŽELSE7*‘IF�we�need�to�wait�for�a�buffer�(D0�=�#NTSRNOB�-�$FF)*‘THEN*”Delay�one�second.*”GOTO�NTSSERV:.*‘ELSE*”GOTO�NTSRV04:. *----------C*NTSRV04:ƒIF�transaction�complete�(indicated�by�status�in�NTS�P.B.)*‹THEN*ŽGOTO�NTSRVRTN:*‹ELSE4*ŽIF�'wait�for�transaction�complete'�option�selected*ŽTHEN*‘GOTO�NTSRV12:.*ŽELSE.*‘IF�ack�set�(indicated�by�status�in�NTS�P.B.)*‘THEN*”GOTO�NTSRVRTN:*‘ELSE#*”IF�'wait�for�ack'�option�selected*”THEN*—GOTO�NTSRV12:*”ELSE6*—IF�buffer�free�set�(indicated�by�status�in�NTS�P.B.)*—THEN*šGOTO�NTSRVRTN:*—ELSE+*šIF�'wait�for�buffer�free'�option�selected*šTHEN*�GOTO�NTSRV12:*šELSE*�GOTO�NTSRVRTN: *p---------5*NTSRVRTN:‚Set�the�return‚code�from�NTS�P.B.�into�D0.!*‹Return�to�calling�task�via�RTS. *----------*NTSRV12:ƒWait�for�wakeup.*‹GOTO�NTSRV04:F*^********************************************************************ŠPAGE ŠSECTION�14ŠOPT„PCSGNTSRNOBƒEQU„255„Error�code�used�when�buffer�unavailable�for�SSC�message* ŠXDEFƒNTSSERV-NTSSERVƒMOVE.W�#NWRQST,D0‰NTSRQST�directive�#ŠTRAPƒ#1‘call�NTSRQST)ŠBEQ.S‚NTSRV04ŒBranch�if�not�error�return=QF#7ŠCMP.W‚#NTSRPBLK,D0‡Is�error�-�bad�param�block�address?ŠBLS.S‚NTSRVRT2‹Branch�if�YES+ŠCMP.W‚#NTSRNOB,D0ˆNeed�to�wait�for�buffer?I*The�following�BNE.S�was�replaced�by�BRA.S�on�4/4/83.‚The�idea�was�to�notI*‚allow�a�user�task�to�hank�up�when�it�issued�a�disconnect�and�there�wereG*‚no�buffers�to�satisfy�the�request.‚The�BRA.S�coupled�with�a�change�inE*‚NTSREQ�allows�the�error�code�(-1=#NTSRNOB)�'out�of�buffers'�code�toF*‚be�returned�to�the�caller.‚When�we�are�'out�of�buffers'�the�NTS�P.B.E*‚wi* ll�come�back�from�NTSREQ�with�the�'transaction�complete'�bit�set.ŠBRA.S‚NTSRV04*ˆBNE.S…NTSRV04ŠBranch�if�NO-ŠMOVE.L�A0,-(A7)‹Save�parameter�block�address#ŠMOVE.L�#1000,A0‹DELAY�for�1�second ŠERQ.DELAY0ŠMOVE.L�(A7)+,A0‹Restore�parameter�block�address%ŠBRA„NTSSERVŒBranch�back�to�try�again*9NTSRV04ƒBTSTƒ#NTSSTC,NTSSTA(A0)�Is�'tranaction�complete'?ŠBNE.S‚NTSRVRTN‹Branch�if�YES5ŠBTSTƒ#NTSOTC,NTSOPT(A0)�Wait�for�'transac�complete'?ŠBNE.S‚NTSRV12ŒBranch�if�YES%ŠBTSTƒ#NTSSACK,NTSSTA(A0)�Is�ACK�set?ŠBNE.S‚NTSRVRTN‹Branch�if�YES+ŠBTSTƒ#NTSOACK,NTSOPT(A0)�Wait�for�ACK�set?ŠBNE.S‚NTSRV12ŒBranch�if�YES/ŠBTSTƒ#NTSSBFF,NTSSTA(A0)�Is�'buffer�free'�set?ŠBNE.S‚NTSRVRTN‹Branch�if�YES5ŠBTSTƒ#NTSOBFF,NTSOPT(A0)�Wait�for�'buffer�free'�set?ŠBNE.S‚NTSRV12ŒBranch�if�YES.NTSRVRTN‚MOVE.B�NTSRCOD(A0),D0…Set�Return�CodeNTSRVRT2‚RTS—RETURN*NTSRV12ƒERQ.WAIT&ŠBRA„NTSRV04ŒGo�back�to�recheck�statusŠENDééŠPAGEJ***************************************************************************�INCLUDE�FILE:‚NTS.NTSSID.AI«*J************************************************************************** (ŠTTL„NTSSID.SAŠReturn�Station�ID�Request*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*1*„NTSSID‚handles�a�request�to�return�Station�ID’**Ä*F***********************************************************************(*ˆon�entry:�A6�=�address�of�caller's�TCB.*’A4�=�physical�address�of�NTS�parameter�block**ˆon�exit�:�D0�=‡Return�code-*’D0�=�00„Successful�-�or�transaction�not�yet *�complete.5*’D0�=�xx„See�NTSRCOD�equates�for�list�of�error�codes*8*’Note�that�NTSRCOD�is�also�used�to�return�the�status�of0*’whether�we�are�being�polled�or�not.‚A�value�of:*’#NTSRPOLL�($50)�is�returned�if�we�haven't�been�polled�in*’a�long�time.F********************************************************************** *v*******2*�NTSSID:ƒPull�station�ID�from�network�name�table.<*‹Place�binary�value�into�upper�half�of�user's�D1.�(TCBD0+4)8*‹Convert�to�ASCII�and�place�in�lower�half�of�user's�D1.@*‹If�NWSTATUS�(in�syspar)�indicates�that�we�have�not�been�polled *‹recently*‹THEN*Žreturn�#NTSRPOLL�($50)�in�D0. *^*******5NTSSID„MOVE.L�NNTBEG,A5ŠPointer�to�Network�Name�Table ŠCLR.L‚D0%ŠMOVE.B�NNTHSID(A5),D0…Get�Station�ID3ŠMOVE.W�D0,TCBD0+4(A6)…Save�binary�value�for�caller ŠLSL.W‚#4,D0%ŠLSR.B‚#4,D0ŽSeparate�ID�into�2�bytesŠCMP.B‚#9,D0ŽIs�LS�byte�>�9�?ŠBLS.S‚NTSSID4ŒBranch�if�NOŠADD.B‚#7,D0ŽChange�to�A-F'NTSSID4ƒCMP.W‚#$A00,D0‹Is�MS�byte�>�9�?ŠBCS.S‚NTSSID6ŒBranch�if�NOŠADD.W‚#$700,D0‹Change�to�A-F(NTSSID6ƒADD.W‚#$3030,D0ŠConvert�to�ascii2ŠMOVE.W�D0,TCBD0+6(A6)…Save�ascii�value�for�callerŠCLR.L‚D0‘Successful�return9ŠMOVE.L�SYSPOFF,A0‰Offset�to�use�in�accessing�VM02�syspar3ŠTST.B‚NWSTATUS+3(A0)…Have�we�been�polled�recently?-ŠBEQ.S‚NTSSID7ŒBranch�if�yes�-�everything�ok.N7W.ŠMOVE.B�#NTSRPOLL,D0‡Indicate�no�poll�to�user.4NTSSID7ƒBSETƒ#NTSSTC,NTSSTA(A4)�Transaction�complete ŠRTS—RETURN+ éééééééŠPAGEJ************************************************************************** *�INCLUDE�FILE:‚NTS.NWCACKS.AIª*J************************************************************************** 4‰TTL‡NWCACKS.SA‚Acknowledge�Receipt�of�SDLC�response*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*5*„NWCACKS�will�Acknowledge�receipt�of�SDLC�response�**Ä*F***********************************************************************(*ˆon�entry:�A6�=�address�of�caller's�TCB.*’A4�=�physical�address�of�NWC�parameter�block*’A3�=�calling�NAU's�NAT�entry**ˆon�exit�:�D0�=‡Return�code*’D0�=‚00ƒSuccessful!F***********************************************************************‰XREF†SBUSRACK%NWCACKS‚CLR.L…D0�Clear�for�short�load‰MOVE.B„NTWARSP(A4),D0†Response‰BSR‡SBUSRACKŒTell�SDLC$‰BRA.S…NWCAK02�Branch�if�good�return‰RTS›Return�to�wait�for�buffer*8NWCAK02‚BSET†#NTSSTC,NTWSTA(A4)‚Set�Transaction�complete&‰CLR.L…D0�Set�D0�for�successful�return ‰RTS˜RETURNééé_!+ ŠPAGEJ************************************************************************** *�INCLUDE�FILE:‚NTS.NWCFLSH.AIª*J************************************************************************** 3‰TTL‡NWCFLSH.SA‚Flush�XMIT�buffers�for�some�Station*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*@*„NWCFLSH�will�Flush�XMIT�buffers�for�some�station�about�to�be„**ˆdownloaded²**Ä*F***********************************************************************(*ˆon�entry:�A6�=�address�of�caller's�TCB.*’A4�=�physical�address�of�NWC�parameter�block*’A3�=�calling�NAU's�NAT�entry**ˆon�exit�:�D0�=‡Return�code*’D0�=‚00ƒSuccessful!F***********************************************************************‰XREF†SBSDLCFL,NWCNSD%NWCFLSH‚CLR.L…D1�Clear�for�short�load!‰MOVE.B„NTWARSP(A4),D1ƒStation�ID‰BSR‡SBSDLCFL‰Tell�SDLCI* Ed Skinner, March 2, 1983 - SDLCFL passes back a return code indicatingH*�whether�or�not�the�buffer�was�properly�enqueued.‚If�the�buffer�was�notJ* handled (because the secondary station ID was incorrect), this routine'sB* absence of error checking will cause the system to lose buffers.L* Additionally, SDLCFL is messed up right now, and doesn't return the properE*�indication�in�all�cases.‚Please�see�me�if�you�have�any�questions�in* this regard...N* This module (NWCFLSH) and another (48.INET.SRSN.SA) are the only two callersI* of SDLCFL and are, therefore, the only modules requiring maintenance in* this regard as of this date.$‰BRA.S…NWCFL02ŠBranch�if�good�return‰RTS˜Return�to�wait�for�buffer*NWCFL02‚CLR.L…D7!‰MOVE.B„NTWARSP(A4),D7‚Station�ID3‰BSR‡NWCNSDŠCancel�all�connections�for�this�station1‰BSET†#NTSSTC,NTWSTA(A4)‚Set�Transaction�complete&‰CLR.L…D0�Set�D0�for�successful�return ‰RTS˜RETURNh/=/*=/*†NTS.NWCREQ.AF=/*/=/* Chain file to assemble module NTS.NWCREQ.SA=/*:=/* If no output argument is specified for the listing the,=/* chain file will default to NTS.NWCREQ.LS=/*=/IFC \1ƒ=ARG�NTS.NWCREQ.LS=/ENDIF=/*)=ASM NTS.NWCREQ.SA,NTS.NWCREQ.RO,\1;RZ=70=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.SDLCPRI.TEMPLTS.EQ=/*ƒ9995.NTS.NNT.EQ=/*ƒ9995.NTS.NAT.EQ=/*ƒ9995.NTS.LCT.EQ=/*ƒ9995.NTS.NTS.EQ=/*ƒ9995.NTS.NTW.EQ=/*ƒ9995.NTS.SMSG.EQ=/*ƒNTS.NWCACKS.AI=/*ƒNTS.NWCFLSH.AI=/*ƒNTS.NWCSEND.AI=/*}=/*=ENDéééé, éq=�NWCCBIG�is�illegal‰INCLUDE�NTS.NWCACKS.AI‰INCLUDE�NTS.NWCFLSH.AI‰INCLUDE�NTS.NWCSEND.AI‰ENDé, éééŠPAGEJ************************************************************************** *�INCLUDE�FILE:‚NTS.NWCSEND.AIª*J************************************************************************** ,‰TTL‡NWCSEND.SA‚Network�Control�Send�Request*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*@*„NWCSEND�handles�a�Send�Message�command�-�used�to�transmit�an„*+*„entire�BIU�to�the�station�chosen�by�NWC™**Ä*F***********************************************************************(*ˆon�entry:�A6�=�address�of�caller's�TCB.*’A4�=�physical�address�of�NWC�parameter�block*’A3�=�calling�NAU's�NAT�entry**ˆon�exit�:�D0�=‡Return�code-*’D0�=�00„Successful�-�or�transaction�not�yet *�complete.5*’D0�=�xx„See�NTSRCOD�equates�for�list�of�error�codesF***********************************************************************JNWCSEND‚TR0$.LOGPHY�,NTSSAD(A4),NTSLEN(A4)‚Convert�buff�addr%‰BRA.S…NWCSD06ŠBranch�if�good�address‰NOP/‰MOVE.L„#NTSRIBUF,D0…ERROR�-�bad�buffer�addressNWCSD05‚RTS˜RETURN*2NWCSD06‚MOVE.L„D6,NTSSAD(A4)„Save�physical�address**ˆAlways�use�same�LCT�entry*)‰MOVE.L„NATLCTLK(A3),A5‚LCT�entry�address4‰LEA‡LCTTWTXM-NTSNEXT(A5),A0�Wait-for-recv�Q�pointer‰BSR‡NWLNKPBŠFind�end�of�Q1‰BNE‡NWCSD05ŠBranch�if�error�-�NO�parameter�block%‰CLR.L…NTSNEXT(A4)†Link�onto�end�of�Q(‰MOVE.L„A4,NTSNEXT(A0)ƒLink�entry�into�Q*2*ˆPass�request�on�to�transport�level�-�then�return*6‰BSET†#LCTATWTX,LCTTSTA(A5)�Set�'wait-for-xmit'�status0‰BSR‡TRADTXQŠAsk�transport�level�to�send�message&‰CLR.L…D0�Set�D0�for�successful�return ‰RTS˜RETURNé‹1=/*=/*†NTS.NWCTPRI.AF=/*0=/* Chain file to assemble module NTS.NWCTPRI.SA=/*:=/* If no output argument is specified for the listing the-=/* chain file will default to NTS.NWCTPRI.LS=/*=/IFC \1ƒ=ARG�NTS.NWCTPRI.LS=/ENDIF=/*,=ASM NTS.NWCTPRI.SA,NTS.NWCTPRI.RO,\1;RZ=126=/*{ Included files are:=/*ƒ9995.&.CRASH.MC=/*ƒ9995.&.EXE.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.TR1.EQ=/*ƒ9995.NTS.TR1X.EQ=/*ƒ9995.NTS.NTS.EQ=/*ƒ9995.NTS.NTW.EQ=/*ƒ9995.NTS.LIB.EQ=/*ƒ9995.SDLCPRI.TEMPLTS.EQ=/*ƒ9995.NTS.SMSG.EQ=/*ƒ9995.NTS.NWCTPRI.EQ=/*}=/*=ENDé- éééé”-NWCTPRIƒIDNTƒ1,0�Network�Service�Control�Task,ŠTTL„NWCTPRI.SA‰Network�Service�Control�Task:* Contains upload code to be used on GMAD project JAN '83.?*ƒWill�eventually�replace�NTS.NWCTPRI.SA�and�be�used�for�HDS400 *ƒas�well.*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*B*„Performs�System�Upload/Download�functions�for�Network�Services‚**Ä*F***********************************************************************)*ˆStarted�by�Network�Initializer‚-‚ININET* *ˆOn�Entry:*’D0�=�Station�ID*’A0�=�Task�Name*’A1�=�Operator�Device*’A3�=�Session**ˆINCLUDE�9995.&.CRASH.MC*ˆINCLUDE�9995.&.EXE.EQ*ˆINCLUDE�9995.&.IOE.EQ*ˆINCLUDE�9995.&.TR1.EQ‰NOLIST‰INCLUDE�9995.&.CRASH.MC‰INCLUDE�9995.&.EXE.EQ‰INCLUDE�9995.&.IOE.EQ‰INCLUDE�9995.&.TR1.EQ‰LIST**ˆINCLUDE�9995.NTS.TR1X.EQ*ˆINCLUDE�9995.NTS.NTS.EQ*ˆINCLUDE�9995.NTS.NTW.EQ*ˆINCLUDE�9995.NTS.LIB.EQ!*ˆINCLUDE�9995.SDLCPRI.TEMPLTS.EQ*ˆINCLUDE�9995.NTS.SMSG.EQ*ˆINCLUDE�9995.NTS.NWCTPRI.EQ‰INCLUDE�9995.NTS.TR1X.EQ‰INCLUDE�9995.NTS.NTS.EQ‰INCLUDE�9995.NTS.NTW.EQ‰INCLUDE�9995.NTS.LIB.EQ ‰INCLUDE�9995.SDLCPRI.TEMPLTS.EQ‰INCLUDE�9995.NTS.SMSG.EQ‰INCLUDE�9995.NTS.NWCTPRI.EQŠPAGE ŠSECTION�14ŠOPT„PCSŠXREFƒNTSSERV,EDITFILEŠXREFƒPARSE,OPTION* ŠXDEFƒNWCTC*v****************************************************************** NWCTPRI module*3*ˆNetwork�control�task�runs�on�primary�system�only.*2*NWCT:†Obtain�and�clear�out�a�data�segment�in�RAM.**^ŠDS…0’Force�even�byte�boundary. NWCT†EQU„*+NWCT1…ERQ.GTSEG�GETDPB(PC)†Get�data�segment#ŠBEQ.S‚NWCT2ŽBranch�if�good�segmentŠERRMESG%GETDPB„DC.Lƒ0,0�Task,Session�(0=Self) ŠDC.Wƒ$2000,0ŒLogical�=�PhysicalŠDC.Lƒ'DATA',0‹Segment�nameDTSIZE„DC.LƒNWCDEND1‹Length**ˆClear�DATA�Segment*CLEAR…CLR.L‚(A0)+ŽClear�4�bytesŠCMP.L‚A0,A1Žat�end�yet?ŠBGT.S‚CLEARŽbranch�in�NOŠRTS*6NWCT2…MOVE.L�A0,A6ŽStart�of�DATA�segment�(A6=base�reg)–�P¦?®;¶:¾IÆBÎ;Ö2ÞCæ>î<ö8þ0?A34&5.F64>CFAN:VR^:fBnEvD~@†C#ŠLEA„STACK(A6),A7‡Set�Stack�PointerŠMOVE.L�A7,A0ŽClear�above�stack2ŠLEA„NWCDEND1(A6),A1„End�of�DATA�segment�(Primary)&NWCT3…BSR.S‚CLEARŽClear�entire�segment8ŠMOVEM.L�D1-D6/A3,STAINFO(A6)�Save�entry�register�valuesŠPAGE*v!*NWCT30:„Clear�the�station�flags.*>*‹Initialize�receive�parameter�blocks�as�'free'�and�point�them"*‹to�an�associated�receive�buffer.*>*‹Initialize�send�parameter�blocks�as�'free'�and�point�them�to*‹an�associated�send�buffer.*%*‹Initialize�connect�parameter�blo- ck.?*‹Initialize�listen�parameter�block,�put�listen�parameter�block7*‹onto�wait�queue�and�issue�listen�request�via�NTSSERV.*A*‹Initialize�monitor�control�blocks�with�message�buffer�addresses6*‹clearing�links�in�monitor�control�block�linked�list.*>*‹Initialize�FHS�and�IOS�parameter�blocks�in�data�segment�from=*‹their�image�in�program�segment.‚These�parameter�blocks�will*‹be�used�to�access�NETLOAD.SA*^** Clear station flags*&ŠLEA„STAFLGB(A6),A0…Base�of�flag�area.;ŠMOVE.L�#STAFLGL-1,D7†Number�of�bytes�in�station�flag�area.NWCT30„CLR.B‚0(A0,D7)ŠDBF„D7,NWCT30 *"*ˆInitialize�Receive�Area�Pointers*'ŠCLR.L‚WAITQHD(A6)ˆClear�head�of�Wait�QŠMOVE.L�#NUMRCV-1,D7‡#�ENTRIES*ŠLEA„RCVBLK(A6),A0†Parameter�block�address0NWCT32„MOVE.W�#-1,NTWSTA(A0)…Status='pb�is�free')ŠLEA„RCVBUF(A0),A1†Message�buffer�address#ŠMOVE.L�A1,NTWSAD(A0)†Save�it�in�pbŠCLR.L‚RCVNEXT(A0)ˆClear�Q�link4ŠLEA„RCVBKSZ(A0),A0…Add�block�size�-�next�pb�address"ŠDBRAƒD7,NWCT32ŠLoop�back�for�next*!ŠBSR„SRTRCV�Issue�'recv'�commands**ˆInitialize�Send�Area*#ŠMOVE.L�#NUMSND-1,D7‡Pointer�offset*ŠLEA„SNDBLK(A6),A0†Parameter�block�address0NWCT34„MOVE.B�#-1,NTWSTA(A0)…Status='pb�is�free')ŠLEA„SNDBUF(A0),A1†Message�buffer�address#ŠMOVE.L�A1,NTWSAD(A0)†Save�it�in�pbŠCLR.L‚SNDNEXT(A0)ˆClear�Q�link4ŠLEA„SNDBKSZ(A0),A0…Add�block�size�-�next�pb�address"ŠDBRAƒD7,NWCT34ŠLoop�back�for�next*0*ˆInitialize�Listen�and�Connect�Parameter�Blocks*#ŠLEA„CONNPB(A6),A0†Start�of�Connect,ŠMOVE.B�#NTSCCONN,NTSCMD(A0)�Connect�command*"ŠLEA„LSTNPB(A6),A0†Start�of�Listen+ŠMOVE.B�#NTSCLSTN,NTSCMD(A0)�Listen�command ŠLEA„LSTNBF(A6),A1†Listen�buffer.ŠMOVE.L�A1,NTSLEN(A0)†Save�addr�in�param�block<ŠMOVE.L�#LSTNBFL,NTSSAD(A0)�Stuff�length�of�buffer�into�P.B.**‰BSR„LKWAITQŒPut�in�wait�queue"*‰BSR„NTSSERVŒissue�Listen�command*#*ˆInitialize�Monitor�Control�Blocks*#ŠMOVE.L�#MAXMON-1,D7‡Count�#�blocks*ŠLEA„MONRPB(A6),A0†Parameter�block�address/NWCT36„LEA„MONRBF(A0),A1†Message�buffer�address#ŠMOVE.L�A1,NTSSAD(A0)†Save�it�in�pb.ŠMOVE.L�#MONRBFSZ,NTSLEN(A0)�Save�length�in�pb ŠCLR.L‚MONRNEXT(A0)‡Clear�Q�link4ŠLEA„MONBKSZ(A0),A0…Add�block�size�-�next�pb�address"ŠDBRAƒD7,NWCT36ŠLoop�back�for�next*=*ˆInitialize�FHS�&�IOS�Parameter�Blocks�for�File�"NETLOAD.SA"**ŠMOVE.L�#FHSBLN+IOSBLN-1,D7�Length�to�Move+ŠLEA„FHSNETS(A6),A0…Pointer�to�Segment�Area+ŠLEA„NETSFHS(PC),A1…Pointer�to�Program�Area%NWCT38„MOVE.B�(A1)+,(A0)+ˆMove�a�ByteŠDBRAƒD7,NWCT38ŠAll�Moved? ŠBRA„NWCMAIN*$*ˆFHS�&�IOS�Blocks�Basic�Information*&NETLUN„SET„1’LUN�For�"NETLOAD.SA"�File'NETSFHSƒDC.WƒFHASGN,FOPPR+FOPISK,NETLUNŠDC.Lƒ'„'�Volume�IDŠDC.Wƒ-1‘User�numberŠDC.Lƒ'„','„'†CatalogŠDC.Bƒ'NETLOAD�SA'‡File�nameŠDC.Wƒ0 ŠDC.Lƒ0,0(ŠIOS.NETS�IOREAD,IOPRAN,NETLUN,0,0,0,0,0"LOADFHSƒDC.WƒFHASGN,FOPPR+FOPCON,0ŠDC.Lƒ'„'�Volume�IDŠDC.Wƒ-1‘User�numberŠDC.Lƒ'„','„'†CatalogŠDC.Bƒ'ˆSY'‡File�nameŠDC.Wƒ0 ŠDC.Lƒ0,0JIOPT†SET�IOPBIN+IOPWAT+IOPNOC+IOPBLK+IOPRAN�BINARY,WAIT,NO�COMPL�ADR�BLOCK!ŠIOS.LOAD�IOREAD,IOPT,0,0,0,0,0,0ŠPAGE*M* The following logical unit table indicates what logical units are availableI*ƒfor�downloading.‚Routine�GETLOAD�will�associate�the�logical�unit�numberH*ƒfrom�the�LUNTBL�with�the�corresponding�download�area.‚For�example,�theD*ƒ7th�download�area�would�get�logical�unit�9.‚Note�that�logical�unitG*ƒ1�is�not�available�since�it�is�used�to�read�the�NETLOAD�file.‚LogicalG*ƒunit�6�is�not�available�since�it�is�given�to�NWCT�through�INET�and�is6*ƒused�to�output�messages�to�the�terminal�via�OUTTERM.I* It should go without saying that the system should be sysgened to allowL*ƒenough�locical�units�to�handle�the�maximum�number�of�downloads�anticipated*ƒat�one�time.*"LUNTBL„DC.Bƒ12,11,10,9,8,7,5,4,3,2LUNTBLSZ‚EQU„*-LUNTBLŠPAGE*vH*NWCMAIN:ƒSet�up�to�check�all�of�the�parameter�blocks�on�the�wait�queue.@*NWCM04:„If�there�is�a�another�parameter�block�on�the�wait�queue*‹THEN6*ŽIF�transaction�for�this�parameter�block�is�complete.*ŽTH. EN2*‘Remove�this�parameter�block�from�the�wait�queue.*‘CASE�command�type*•Receive�:�GO�TO�NWCRECV*•Listen‚:�GO�TO�NWCLSTN*•Connect�:�GO�TO�NWCCONN*•Cancel*–connect:�GO�TO�NWCCONC*•Otherwise�:�GO�TO�NWCSEND *‘END�CASE*ŽELSE4*‘Set�up�to�check�next�parameter�block�on�the�queue.*‘GO�TO�NWCM04.*‹ELSE>*ŽPost�all�receives�via�BSR�SRTRCV�-�This�routine�will�examine;*�all�of�the�receive�parameter�blocks.‚If�it�finds�any�that<*�are�free,�it�will�set�option�to�receive�from�any,�link�the:*�parameter�block�on�the�receive�list�via�BSR�LNKWAITQ�and,*�issue�the�receive�request�via�BSR�NTSSERV.*ŽWait�300�ms.*ŽGO�TO�NWCMAIN.*^*&*ˆMain�Loop�-�Look�for�something�to�do*/*ˆCheck�all�transactions�in�'Wait-for-TC'�Queue*8NWCMAINƒLEA„WAITQHD-RCVNEXT(A6),A4�Start�of�'wait'�queue0NWCM04„MOVE.L�A4,A5ŽSet�'previous�entry'�pointer6NWCM06„MOVE.L�RCVNEXT(A5),D0…Any�param�blocks�waiting?"ŠBEQ.S‚NWCM80�Branch�if�all�tested(ŠMOVE.L�D0,A4ŽAddress�of�parameter�block1ŠBTSTƒ#NTSSTC,NTWSTA(A4)�Is�transaction�complete?ŠBEQ„NWCM04�Branch�if�NO4ŠMOVE.L�RCVNEXT(A4),RCVNEXT(A5)�Remove�from�'wait'�Q'ŠCLR.L‚RCVNEXT(A4)ˆClear�'next'�pointer#ŠMOVE.B�NTWCMD(A4),D0†Check�command+ŠCMP.B‚#NTSCRECV,D0‡Is�it�a�'RECV'�command?ŠBEQ.S‚NWCRECVŒBranch�if�YES+ŠCMP.B‚#NTSCLSTN,D0‡Is�it�a�'LSTN'�command?ŠBEQ„NWCLSTNŒBranch�if�YES+ŠCMP.B‚#NTSCCONN,D0‡Is�it�a�'CONN'�command?ŠBEQ„NWCCONNŒBranch�if�YES+ŠCMP.B‚#NTSCCONC,D0‡Is�it�a�'CONC'�command?ŠBEQ„NWCCONCŒBranch�if�YES)ŠBRA„NWCSENDŒIf�none�of�above�-�then�SEND*2*ˆReturn�here�if�SEND�message�buffer�not�available*CNWCM50„MOVE.L�RCVNEXT(A5),RCVNEXT(A4)�Link�back�just�before�current$ŠMOVE.L�A4,RCVNEXT(A5)…Complete�link#ŠBRA„NWCM04�Continue�with�main�loop***ˆRe-issue�the�receives�that�were�freed�up*NWCM60„BSR„SRTRCV�* ŠBRA„NWCM06�**$*ˆEnd�of�Main�Loop�-�Prepare�to�wait*1NWCM80„BSR„SRTRCV�Be�sure�all�receives�are�posted%ŠMOVE.L�#300,A0ŒWait�300�milliseconds ŠERQ.DELAYWŠBRA„NWCMAINŒRestart�main�loopŠPAGE*1*ˆCome�here�if�an�error�message�has�been�received**ˆWill�decide�what�to�do�with�errors�later*/ERRMSG„MOVE.B�#-1,NTWSTA(A4)…THROW�MESSAGE�AWAYŠBRA„NWCM60�RETURN�TO�MAIN�LOOP*/*ˆCome�here�to�abort�NWC�-�unrecoverable�error.*NWCASR„MOVE.L�#$99,A0QUIT†ERQ.ABORTŠPAGE*v* Message received*J*NWCRECV:ƒIF�error�indicated�in�parameter�return�status�of�parameter�block*‹THEN*ŽCrash�system.*‹IF�message�not�from�monitor*‹THEN,*ŽOutput�message�to�terminal�via�BSR�MSGOUT.*ŽIF�upload�record�received*ŽTHEN*‘Flag�receive�area�as�free.%*‘IF�no�download�area�for�this�2ndary*‘THEN(*”Flag�2ndary�for�no�upload�in�progress.1*”Flag�2ndary�for�no�upload�on�next�RIM�received.*”GOTO�NWCM60:.5*‘{Download�area�allocated�and�found�for�this�2ndary}<*‘IF�this�2ndary�is�NOT�flagged�as�having�upload�in�progress*‘THEN*”GOTO�NWCUL20:.!*‘Write�download�records�to�file.*‘Advance�record�pointer.#*‘IF�last�transmission�for�download*‘THEN*NWCUL20:ŒClose�download�file.1*”Flag�2ndary�for�no�upload�on�next�RIM�received.!*”Flag�upload�as�not�in�progress.&*”Free�download�area�via�BSR�FRELOAD:.*”GOTO�NWCM60:.*Ž{Upload�record�not�received}*ŽIF�NOT�'I'�frame�received*ŽTHEN3*‘IF�NOT�RIM�(Request�Initialization�Mode)�received*‘THEN'*”Attempt�to�get�buffer�via�BSR�GETSND.*”IF�buffer�not�available*”THEN4*NWCM50:�Link�this�P.B.�up�on�the�Wait�for�TC�queue.*—GOTO�main�loop�at�NWCM04:.*”{Buffer�is�available}!*”Flag�this�receive�area�as�free.*”CASE�(type�of�response)*—DM�(Disconnect�mode):'*šSend�SNRM�(Set�Normal�Response�Mode).*šGOTO�NWCM60:*—RD�(Request�disconnect):%*NWCRDISC:‘Send�'disconnect'�command.1*NWCM60:“Reissue�any�receives�that�were�freed�up."*šGOTO�NWCM06�(Back�to�main�loop).*—FRMR�(Frame�reject):'*šSend�SNRM�(Set�Normal�Response�Mode).*šGOTO�NWCM60:"*—SNRM�(Set�Normal�Response�Mode).*šSend�ACK�(Acknowledgement).*šGOTO�NWCM60: *”END�CASE*‘ELSE‚{RIM�received}(*”{R. IM�received�-�download�this�station}?*NWCRRIM:ŒIF�download�block�currently�reserved�for�this�station*”THEN*—IF�SIMWAIT�<>�0*—THEN*šDecrement�SIMWAIT.*šGOTO�NWCM60:.*—ELSE‚{SIMWAIT�=�0},*šClose�the�current�file�we�are�downloading.&*šFree�the�download�area�we�were�using*švia�BSR�FRELOAD.*šGOTO�NWCRIM4:.'*NWCRIM4:ŒGet�a�'send'�parameter�block.#*”IF�we�can't�get�a�parameter�block*”THEN*—GOTO�NWCM60:.4*”Send�'flush'�command�(this�command�will�cancel�all5*”connections�to�the�remote�station)�via�BSR�SNDMSGA.*”Get�download�block.#*”IF�no�download�block�is�available*”THEN*—GOTO�NWCM60:.*”Get�a�send�parameter�block.&*”IF�no�send�parameter�block�available*”THEN*—Free�up�the�download�block.*—GOTO�NWCM60:.<*NWCRIM10:‹Send�SIM�(Set�Initialization�Mode)�with�'wait�for *”transaction�complete'�bit�set..*”IF�we're�sysgened�to�NOT�perform�auto-upload*”THEN*—GOTO�NWCRIM50:9*”IF�flag�for�this�station�indicates�no�upload�attempt�on *”this�RIM*”THEN‚{Upload�this�2ndary})*—Open�receiving�file�for�download�image.$*—IF�error�in�opening�receiving�file*—THEN!*šFlag�upload�as�not�in�progress.%*šFlag�no�upload�attempt�on�next�RIM.*šGOTO�NWCRMERA:.&*—{No�error�in�opening�receiving�file}*—Flag�upload�as�in�progress.*—Prepare�upload�command.!*—Send�'initiate�upload'�command.*—GOTO�NWCM60:.*”ELSE‚{Download�this�2ndary};*NWCRIM50:ŽFlag�upload�not�in�progress/download�in�progress+*—Prepare�load�buffer�for�download�command.3*—Read�the�filename�to�download�from�the�NETLOAD.SA7*—file�using�the�remote�station�ID�as�the�record�number*—into�the�NETLOAD�file.6*—IF�there�was�an�error�in�reading�the�NETLOAD.SA�file*—THEN*šGOTO�NWCRMERA:.5*—Read�the�LIB�from�the�file�that�we�are�downloading.*—IF�error�on�read�of�LIB*—THEN*šGOTO�NWCRMERA2*—Set�up�'initiate�download'�command�with�starting5*—address,�byte�count,�transfer�address,�status�word,*—and�initial�stack�pointer.4*—Send�the�initiate�download�command�via�BSR�SNDMSG.*—GOTO�NWCM60:.*ŽELSE‚{'I'�frame�received}*‘Flag�receive�area�as�free.*‘Get�download�block. *‘IF�no�download�block�available*‘THEN*”GOTO�NWCM60:*‘Clear�SIMWAIT.*‘GOTO�NWCM60.*‹ELSE‚{message�from�monitor}*ŽGOTO�NWCRMON*^** Message received -- read it**NWCRECVƒTST.B‚NTSRCOD(A4)ˆTest�return�code#ŠCRASH.NE�*+1ŽCrash�system�if�error,ŠMOVE.L�NTWSAD(A4),A3†Message�buffer�address* *�A3‚points�to�received�message.-*�A4‚points�to�NTS�P.B.�of�completed�receive.-ŠCMP.B‚#1,NTSLCC(A4)†Is�message�from�monitor?ŠBGE„NWCRMONŒBranch�if�YESG*---Check�for�error�here.‚If�error�then�put�out�message�on�terminal�and*---‚free�up�receive�area.)ŠMOVE.B�SDDRSP(A3),D0†SDLC�Response�->�D0&ŠBSR„MSGOUT�Output�Message�to�Terminal** Determine if upload recordŠMOVE.W�DNSLTH1(A3),D02ŠAND.W‚#$F0FF,D0ŠDisregard�1st�and�last�seg�flags.AŠCMP.W‚#THB1NWC<<8!DNLDAT,D0�Is�this�an�upload/download�record...)*£...with�a�'DAT'�type�record�descriptor?2ŠBNE„NWCRECV8‹Branch�if�no�-�not�an�upload�record.*A*�We�have�an�upload�data�record.‚Flag�this�receive�block�as�free./*ƒGet�the�upload/download�block�associated�withA*ƒthis�secondary�station.�(It�should�already�be�allocated�to�this *ƒsecondary)3ŠMOVE.B�#-1,NTWSTA(A4)…Flag�receive�buffer�as�free.%ŠCLR.B‚DNSLTH2(A3)ˆClear�upload�code.+ŠMOVE.B�SDDSEC(A3),D0†Secondary�station�ID..ŠBSR„GETLUN�Get�download�block�address�into�A24ŠBEQ.S‚NWCUL10ŒBranch�if�found�upload/download�block*D*�Can't�find�upload/download�block.‚Flag�secondary�for�upload�not�in *ƒprogress.�Return�to�main�loop. ŠCLR.L‚D0/ŠMOVE.B�SDDSEC(A3),D0†Secondary�station�number.8ŠLEA„STAFLGB(A6),A0…Address�of�2ndary�station�flag�base.5ŠBCLRƒ#STAFUP,0(A0,D0)ƒClear�upload�in�progress�flag.ŠBRA„NWCM60�Back�to�main�loop.*H*�We�have�found�the�upload/download�block�for�this�secondary.‚Check�that1*ƒthis�station�is�flagged�for�upload�in�progress.NWCUL10ƒCLR.L‚D0/ŠMOVE.B�SDDSEC(A3),D0†Secondary�station�number.8/ ŠLEA„STAFLGB(A6),A0…Address�of�2ndary�station�flag�base.*ŠBTSTƒ#STAFUP,0(A0,D0)ƒUpload�in�progress?"ŠCRASH.EQ�*+1ŽCrash�system�if�not.*A* We have verified that this station is in the process of upload.8*ƒMove�the�data�we�have�just�read�into�the�staging�area.%ŠMOVE.L�BUFBOT(A2),A0†Move�to�address2ŠLEA„RCVBUF+SDDLNG+THNSIZ(A4),A1�Move�from�addressŠMOVE.L�NTSRCSZ(A4),D01ŠSUB.L‚#SDDLNG+THNSIZ,D0‚Number�of�bytes�to�move.>ŠADD.L‚D0,BYTECNT(A2)…Bump�the�number�of�bytes�received�count.MOVUL1„MOVE.W�(A1)+,(A0)+ ŠSUB.L‚#2,D0 ŠBGT.S‚MOVUL1*B*�We�have�moved�the�data�to�a�staging�area.‚If�we�have�accumulated5*ƒat�least�one�sector,�write�it�out�to�the�dump�file.ŠLEA„LOADBUF(A2),A18ŠMOVE.L�BUFBOT(A2),A0†Points�to�1st�byte�on�this�receiveŠMOVE.L�NTSRCSZ(A4),D1AŠSUB.L‚#SDDLNG+THNSIZ+1,D1�D1�=�number�of�bytes�last�received�-�1-ŠADD.L‚A0,D1ŽD1�points�to�last�byte�received.(ŠADD.L‚#255,A1ŒLast�byte�in�sector�image ŠCMP.L‚A1,D11ŠBHS.S‚WRITUP�Go�write�since�we�accumulate�sectorŠMOVE.L�NTSRCSZ(A4),D0<ŠSUB.L‚#SDDLNG+THNSIZ,D0‚D0�=�number�of�bytes�last�received.9ŠADD.L‚D0,BUFBOT(A2)†Bump�buffer�bottom�for�next�receive. ŠBRA„NWCM60*)* We have accumulated a sector - write it9WRITUP„LEA„IOSLOAD(A2),A0…Address�of�IOS�parameter�block.+ŠMOVE.W�#IOWRIT,IOSFCT(A0)�Command�=�write.BŠMOVE.W�#IOPRAN!IOPBIN!IOPBLK!IOPPOS!IOPIMG,IOSOPT(A0)�RRN,�image.,ŠMOVE.L�A1,IOSEAD(A0)†Buffer�ending�address.ŠSUB.L‚#255,A1.ŠMOVE.L�A1,IOSSAD(A0)†Buffer�starting�address.ŠTRAPƒ#2‘Write�out�the�buffer.ŠBEQ„NWCUL15ŒBranch�on�good�I/O*I*�Bad�I/O�trying�to�write�to�upload�file.‚Flag�upload�as�not�in�progress.(* Branch to I/O error reporting routine. ŠCLR.L‚D1*"* Display error for upload aborted!ŠMOVE.L�D0,-(A7)‹Save�error�code!'ŠMOVE.L�A2,A4ŽPoint�A4�to�download�area#ŠLEA„MSGUAS(PC),A1†Start�of�message!ŠLEA„MSGUAE(PC),A2†End�of�message-ŠBSR„ULODMSGŒGo�put�out�Uload�aborted�messageŠLEA„FHSLOAD(A4),A00ŠMOVE.W�#FHCLOS,FHSCMD(A0)�Close�the�upload�fileŠTRAPƒ#3<ŠMOVE.W�#FHDELT,FHSCMD(A0)�Delete�the�incomplete�upload�fileŠTRAPƒ#30ŠMOVE.L�(A7)+,D0‹Restore�error�code�for�NWCRMERWŠBSR„NWCRMERW‹Report�error.'ŠMOVE.L�A4,A2ŽPoint�A2�to�download�area&ŠBSR„FRELOADŒFree�download/upload�areaŠBRA„NWCM60�Back�to�main�loop*9MSGUAS„DC.Bƒ'UPLOAD�ABORTED�(DISK�I/O�ERROR)�-�STATION�$'MSGUAE„EQU„*-1ŠDS…0’Force�even�byte�boundary*8MSGUARSƒDC.Bƒ'UPLOAD�ABORTED�(RIM�RECEIVED)�-�STATION�$'MSGUAREƒEQU„*-1* * Good I/O writing to dump file.(*ƒSet�up�for�next�receive�and�next�write ,NWCUL15ƒADD.L‚#1,IOSRRN(A0)†Bump�RRN�number.;* Justify any residual bytes to the beginning of the block.$ŠLEA„LOADBUF(A2),A0…Move�to�address. ŠMOVE.L�A0,A1!ŠADD.L‚#256,A1ŒMove�from�address.MOVJ1…CMP.L‚D1,A1 ŠBHI.S‚MOVJ2ŠMOVE.W�(A1)+,(A0)+ ŠBRA.S‚MOVJ1*0MOVJ2…MOVE.L�A0,BUFBOT(A2)†Set�new�buffer�bottom*8* Determine if this is the last segment of the transfer.*ŠBTSTƒ#2,DNSLTH1(A3)ŠBEQ„NWCM60�Branch�if�no*** Last segment of upload - put out message2ŠMOVE.L�A2,-(A7)‹Save�download�address�for�FRELOAD,ŠMOVE.L�A2,A4ŽDownload�address�must�be�in�A4#ŠLEA„MSGUES(PC),A1†Start�of�message!ŠLEA„MSGUEE(PC),A2†End�of�message ŠBSR„ULODMSG5ŠMOVE.L�(A7)+,A2‹Restore�download�address�for�FRELOADŠBRA.S‚NWCUL20*)MSGUES„DC.Bƒ'UPLOAD�FINISHED�-�STATION�$'MSGUEE„EQU„*-1** Last segment received2*ƒClose�download�file,�flag�station�for�upload�not"*ƒin�progress,�free�download�area,!*ƒreturn�to�main�loop�at�NWCM60:..NWCUL20ƒLEA„FHSLOAD(A2),A0…Address�of�FHS�P.B.%ŠMOVE.W�#FHCLOS,FHSCMD(A0)�Close�codeŠTRAPƒ#3‘Close�the�file. ŠCLR.L‚D0$ŠBSR„FRELOADŒFree�the�download�area.ŠBRA„NWCM60�Back�to�main�loop.*9* IF not RIM received - then prepare SEND area for answer*1NWCRECV8‚MOVE.B�SDDRSP(A3),D0†SDLC�Response�->�D0ŠBTSTƒ#0,D0ŽI-frame�Received?ŠBEQ.S‚NWCRIFMŒBranch�if�YES$ŠCMP.B‚#SDDRRIM,D0ˆNo,�RIM�Response?ŠBEQ„NWCRRIMŒ*�Branch�if�Yes'ŠBSR„GETSND�Get�buffer�to�send�response,ŠBNE„NWCM50�Branch�if�no�send�buff�available*#*�A1‚points�to�send�/ message�buffer.$*�A2‚points�to�send�parameter�block.1ŠMOVE.B�#-1,NTWSTA(A4)…Flag�the�RECV�area�as�Free-ŠCLR.L‚SDDSTS(A1)‰Clear�Status�and�Byte�count.ŠCLR.W‚SDDRTC(A1)‰Clear�Retry�and�Error�fields&ŠCLR.W‚SDDRSP(A1)‰Clear�Response�field:ŠMOVE.W�SDDCMD(A3),SDDCMD(A1)�Move�Cmd,Station�from�recv'd*!*‡Check�type�of�Response�received*)ŠMOVE.B�SDDRSP(A3),D0†SDLC�Response�->�D0ŠCMP.B‚#SDDRDM,D0‰DM�Received?,ŠBEQ.S‚NWCRSNRM‹Branch�if�YES�-�respond�SNRMŠCMP.B‚#SDDRRD,D0‰RD�Received?,ŠBEQ.S‚NWCRDISC‹Branch�if�YES�-�respond�DISC"ŠCMP.B‚#SDDRFRMR,D0‡FRMR�Received?,ŠBEQ.S‚NWCRSNRM‹Branch�if�YES�-�respond�SNRM"ŠCMP.B‚#SDDCSNRM,D0‡SNRM�Received?*ŠBEQ.S‚NWCRACKŒBranch�if�YES�-�respond�ACK*/* If an ACK was received, we fall thru to here.ŠBRA„NWCM60�Return�to�main�loop*#*ˆI-frame�Received�--�Clear�SIMWAIT*8NWCRIFMƒMOVE.B�#-1,NTWSTA(A4)…Flag�the�RECV�area�as�Free(ŠMOVE.B�SDDSEC(A3),D0†Get�station�numberŠBSR„GETLUN�Get�DOWNLOAD�block(ŠBNE„NWCM60�Return�if�no�active�downloadŠCLR.B‚SIMWAIT(A2)ˆReset�waitŠBRA„NWCM60�Return�to�main�loop**ˆSend�an�SDLC�SNRM�Command*:NWCRSNRM‚MOVE.B�#SDDCSNRM,SDDCMD(A1)�Set�SNRM�SDLC�Command&ŠMOVE.L�#SDDLNG,NTWLEN(A2)�Buffer�size3ŠBSR„SNDMSG�Send�The�Message�-�queued�if�no�buffersŠBRA„NWCM60�Return�to�main�loop**ˆSend�an�SDLC�DISC�Command*:NWCRDISC‚MOVE.B�#SDDCDISC,SDDCMD(A1)�Set�DISC�SDLC�Command&ŠMOVE.L�#SDDLNG,NTWLEN(A2)�Buffer�size3ŠBSR„SNDMSG�Send�The�Message�-�queued�if�no�buffers ŠBRA„NWCM60�**6*ˆSend�an�SDLC�ACKnowledgement�to�a�SNRM,�SIM,�or�DISC*4NWCRACKƒMOVE.B�#NTWCACKR,NTWCMD(A2)�SDLC�ACK�Command/ŠMOVE.B�D0,NTWARSP(A2)…SDLC�Command�to�be�ACKed%NWCRACK1‚BSR„SNDMSGAŒSend�The�MessageŠBSR„STATCHKŒCheck�status'ŠBNE.S‚NWCRACK1‹Retry�if�out�of�buffers ŠBRA„NWCM60�*ŠPAGE*6*ˆReceived�an�SDLC�RIM�Response,�Download�This�Station*;NWCRRIMƒMOVE.B�#-1,NTWSTA(A4)…Flag�RCV�Param�Area�as�'free'$ŠMOVE.B�SDDSEC(A3),D0†Get�Station�ID.ŠBSR„GETLUN�Actively�Downloading�this�Station?ŠBNE.S‚NWCRIM4ŒBranch�if�NO/ŠTST.B‚SIMWAIT(A2)ˆYES,�Waiting�for�"SIM"�Sent?ŠBEQ.S‚NWCRIM2ŒBranch�if�NO>ŠSUB.B‚#1,SIMWAIT(A2)…Decrement�SIM�count�-�don't�wait�forever0ŠBNE„NWCM60�Return�to�main�loop�-�throw�SIM�away*-* Prepare to start over - Close DOWNLOAD File*NWCRIM2ƒMOVE.B�SDDSEC(A3),D0ŠLEA„STAFLGB(A6),A06ŠBTSTƒ#STAFUP,0(A0,D0)ƒWere�we�uploading�this�station?ŠBEQ.S‚NWCRIM3ŒBranch�if�no,ŠMOVE.L�A2,A4ŽSave�pointer�to�download�block2ŠLEA„MSGUARS(PC),A1†Report�that�upload�was�abortedŠLEA„MSGUARE(PC),A2 ŠBSR„ULODMSG%ŠLEA„FHSLOAD(A4),A0…Close�upload�fileŠMOVE.W�#FHCLOS,FHSCMD(A0)ŠTRAPƒ#3-ŠMOVE.W�#FHDELT,FHSCMD(A0)�Delete�upload�fileŠTRAPƒ#3/ŠMOVE.L�A4,A2ŽRestore�pointer�to�download�blockŠBRA.S‚NWCRM3.5.NWCRIM3ƒLEA„FHSLOAD(A2),A0…FHS�parameter�block2ŠMOVE.W�#FHCLOS,FHSCMD(A0)�Change�command�to�CLOSEŠFHSCALL/NWCRM3.5‚BSR„FRELOADŒFlag�DOWNLOAD�area�as�FREE*!*ˆSend�a�'TRANSMIT�FLUSH'�Command*-NWCRIM4ƒBSR„GETSND�Get�a�SEND�Parameter�Block'ŠBNE„NWCM60�Branch�if�we�Didn't�Get�One<ŠMOVE.B�SDDSEC(A3),NTWARSP(A2)�SDLC�secondary�station�number*ŠMOVE.B�#NTWFLUSH,NTWCMD(A2)�Flush�command#ŠBSR„SNDMSGAŒSend�the�Flush�CommandŠBSR„STATCHKŒCheck�the�status&ŠBEQ.S‚NWCRIM5ŒContinue�if�status�'ok'* Out of buffers8ŠMOVE.B�#-1,NTWSTA(A2)…Flag�send�parameter�block�as�freeŠBRA„NWCM60�Back�to�main�loop** Get DOWNLOAD area -- Send SIM*>NWCRIM5ƒMOVE.B�SDDSEC(A3),D0†Station�ID�-�Use�to�claim�DL�area ŠBSR„GETLOADŒGet�a�DOWNLOAD�area$ŠBNE„NWCM60�Branch�if�none�available+ŠMOVE.L�A2,A4ŽSave�pointer�to�DOWNLOAD�area&ŠBSR„GETSND�Get�a�SEND�Parameter�Block&ŠBEQ.S‚NWCRIM10‹Branch�if�PB�available5ŠCLR.B‚LOADSEC(A4)ˆGive�up�the�DOWNLOAD�area�if�no�PBŠBRA„NWCM60�Return�to�main�loop5NWCRIM10‚CLR.L‚SDDSTS(A1)‰Clear�Status�and�Byte�count.ŠCLR.W‚SDDRTC(A1)‰Clear�Retry�and�Error�fields&ŠCLR.W‚SDDRSP(A1)‰Clear�Response�field:ŠMOVE.W�SDDCMD(A3),SDDCMD(A1)�Move�Cmd,Station�from�recv'd0ŠMOVE.B�#SDDCSIM,SDDCMD(A1)�Set�SIM�SDLC�Command&ŠM0 OVE.L�#SDDLNG,NTWLEN(A2)�Buffer�size6ŠBSETƒ#NTSOTC,NTWOPT(A2)�Wait�for�transaction�complete/ŠBSR„SNDMSG�Send�the�SIM�-�queued�on�no�buffers3ŠMOVE.B�#20,SIMWAIT(A4)„Flag�Waiting�for�"SIM"�Sent*4* Prepare LOAD buffer for DOWNLOAD or UPLOAD command*A*�Read�NETLOAD.SA�file�to�see�if�we�are�to�perform�upload.‚Upload?*ƒonly�if�;D�option�set�on�record�read�from�file.‚If�;D�set�the@*ƒ;L=xxxx�specifies�the�beginning�address,�;N=xxxx�specifies�the*ƒnumber�of�bytes..ŠMOVE.B�SDDSEC(A3),D0†Secondary�station�numberŠBSR„REDNETSŒRead�netload�fileŠBEQ.S‚REDOKŽBranch�if�no�error* Error reading NETLOAD.SA file%ŠBSR„NWCRMERA‹Report�error�on�console2ŠMOVE.L�A4,A2ŽRestore�A2�to�point�to�download�area#ŠBSR„FRELOADŒFree�the�download�areaŠBRA„NWCM60�Back�to�main�loop*+REDOK…LEA„NETSBUF(A6),A0…Point�to�file�name*ŠMOVE.L�#$50,D6ŒMax�length�of�command�line-ŠMOVEM.L�A2/A3,-(A7)‡Save�since�parse�uses�it ŠBSR„PARSE.* A2 comes back with address of options field.2ŠMOVE.L�A2,OPTNS(A4)‡Save�address�of�options�fieldŠMOVEM.L�(A7)+,A2/A3ŠTST.L‚D0‘Error�from�parse? ŠBPL.S‚POKBSNTXERRƒLEA„MSGSNTXS(PC),A1„Complain�of�syntax�error�in�NETLOAD.SAŠLEA„MSGSNTXE(PC),A2 ŠBSR„OUTTERM'ŠMOVE.L�A4,A2ŽPoint�A2�to�download�areaŠBSR„FRELOADŒFree�download�areaŠBRA„NWCM60�Back�to�main�loop*BMSGSNTXS‚DC.Bƒ'SYNTAX�ERROR�IN�NETLOAD.SA�FILE�-�DOWNLOAD�ABORTED' ŠDC.Bƒ$0D ŠDC.Bƒ$0AMSGSNTXE‚EQU„*-1* POK‡EQU„*ŠTST.L‚OPTNS(A4))ŠBEQ„NWCRIM50‹Branch�if�no�options�field.*L* There was an options field on the file name read from the NETLOAD.SA file.*@*ƒThe�options�indicate�the�limits�of�the�upload�that�is�desired.*=*ƒIf�there�were�no�options�field�then�no�upload�is�performed.*K*ƒIf�there�was�an�option�field�and�'D'�was�contained�among�the�options�thenH*…we�always�perform�an�upload�prior�to�performing�a�download.‚The�limitsC*…of�the�upload�are�specified�by�the�'L'�and�'N'�options.‚'L=$xxxx'F*…indicates�the�starting�address�in�memory�that�we�should�upload.‚ThisG*…address�is�always�rounded�downward�to�the�nearest�$100�byte�boundary.?*…'N=$xxxx'�indicates�how�many�bytes�are�desired�in�the�upload.E*…This�number�is�always�rounded�up�to�the�nearest�$100�byte�boundary.G*…Note�that�if�either�'N'�or�'L'�is�missing�from�the�options,�no�upload*…is�performed.*J*ƒIf�there�was�not�'D'�among�the�options�then�the�upload�will�be�performedC*…only�after�the�first�initial�download�has�been�performed�for�this'*…particular�secondary�and�a�subsequentB*…'SIM'�is�received.‚This�is�so�that�on�initial�power�up,�we�don'tD*…have�to�get�an�upload�from�each�secondary�station�before�we�do�the *…download.*&*ƒThe�options�can�appear�in�any�order.*C*ƒThe�upload�image�is�saved�in�a�file�on�the�system�default�volume.**…Flag�STAFD�is�set�when%*‡1.�Download�successfully�completes.>*‡2.�'D'�option�is�selected�and�it's�the�first�time�through�on?*Šthis�station�(STAFF�clear�on�1st�time�thru,�set�on�subsequent *Špasses).*…Flag�STAFD�is�cleared�whenE*‡1.�Upload�is�initiated�(regardless�of�whether�it�completes�or�not).*/*„Uploads�are�only�performed�when�STAFD�is�set.*3ŠMOVE.L�#-1,ULBASE(A4)…Flag�ULBASE�as�uninitialized3ŠMOVE.L�#-1,ULSIZE(A4)…Flag�ULSIZE�as�uninitialized.ŠMOVEM.L�A2/A3,-(A7)‡Save�since�OPTION�uses�it*ŠMOVE.L�OPTNS(A4),A2‡Start�of�option�fieldNXTOPT„BSR„OPTION!ŠCMP.B‚#$40,D0ŒDone�with�options?ŠBEQ.S‚OPTDONEŒBranch�if�yesŠBTSTƒ#7,D0ŽOption�error?%ŠBNE.S‚OPTERR�Branch�if�option�error.*!ŠCMP.B‚#'D',D1ŒIs�'D'�option�set?2ŠBNE.S‚NXTOPT1ŒBranch�if�no�'D'�option�-�try�next.** 'D' option processing-ŠMOVE.L�4(A7),A3‹Pick�up�original�value�of�A3 ŠCLR.L‚D0'ŠMOVE.B�SDDSEC(A3),D0†2ndary�station�ID)ŠLEA„STAFLGB(A6),A0…Base�of�station�flags2ŠBSETƒ#STAFF,0(A0,D0)„Is�this�the�first�time�thru?/ŠBNE.S‚DDONEŽBranch�if�no�-�not�first�time�thru8ŠBSETƒ#STAFD,0(A0,D0)„'D'�option�means�upload�first�time*DDONE…BRA„NXTOPT�Go�for�next�option�if�any*6NXTOPT1ƒCMP.B‚#'L',D1Œ'L=starting�address'�option�set?ŠBNE.S‚NXTOPT2ŒBra0 nch�if�no** 'L' option processing6ŠAND.L‚#$FFFFFF00,D3†Round�to�lower�256�byte�boundary.'ŠMOVE.L�D3,ULBASE(A4)†Save�base�address%ŠBRA„NXTOPT�Go�for�next�option�if�any*5NXTOPT2ƒCMP.B‚#'N',D1Œ'N=number�of�bytes'�option�set?3ŠBNE.S‚OPTERR�Branch�if�error�-�not�'D','L',�or�'N'** 'N' option processingŠADD.L‚#$FF,D32ŠAND.L‚#$FFFFFF00,D3†Round�up�to�256�byte�boundaryŠMOVE.L�D3,ULSIZE(A4)%ŠBRA„NXTOPT�Go�for�next�option�if�any*,* Come here when we've exhausted the optionsBOPTDONEƒMOVEM.L�(A7)+,A2/A3‡Restore�registers�that�PARSE�clobbered%ŠBRA.S‚ULOADITŒGo�see�if�we�upload�it*OPTERR„MOVEM.L�(A7)+,A2/A3(ŠBRA„SNTXERRŒGo�complain�of�syntax�error*C* If secondary station is flagged not to perfrom upload on this RIM* THEN(*„GOTO�NWCRIM50�{avoid�automatic�upload}*ULOADITƒCLR.L‚D0+ŠMOVE.B�SDDSEC(A3),D0†Secondary�station�ID.*ŠLEA„STAFLGB(A6),A0…Base�of�station�flags.%ŠBTSTƒ#STAFD,0(A0,D0)„Perform�upload?ŠBEQ„NWCRIM50‹Branch�if�noŠCMP.L‚#-1,ULBASE(A4)…Upload?ŠBEQ„NWCRIM50‹Branch�if�noŠCMP.L‚#-1,ULSIZE(A4)…Upload?ŠBEQ„NWCRIM50‹Branch�if�no** Flag upload as in progress.1ŠBSETƒ#STAFUP,0(A0,D0)ƒFlag�upload�as�in�progress<ŠBCLRƒ#STAFD,0(A0,D0)„Flag�for�no�upload�attempt�on�next�RIM*/* Open receiving file for holding upload image.*ƒBuild�file�name�in�FHS�P.B.%*ƒFile�name�is�of�the�following�form:*ƒULODaamm.DUddhhnn.SY0*ƒWhere�aa�is�the�secondary�station�number�(hex)*‰mm�is�the�month*‰dd�is�the�day*‰hh�is�the�hour*‰nn�is�the�minute*'* Pick up time and convert to Gregorian$ŠMOVE.L�#GTDTIM,D0‰Get�date�and�timeŠLEA„TIMBLK(A6),A0ŠTRAPƒ#1ŠMOVE.L�TIMBLK(A6),D0ŠBSR„DATEOJ�Convert�to�Julian ŠBSR„DATEJG�Convert�to�GregorianŠMOVE.L�D0,TMPDATE(A6)** Catalog name portionŠLEA„FHSLOAD+FHSCLG(A4),A1ŠMOVE.L�#'ULOD',(A1)+ ŠCLR.L‚D0*ŠMOVE.B�SDDSEC(A3),D0†Secondary�station�ID$ŠBSR„CVHEX1�Convert�to�hex�and�stuff"ŠMOVE.B�TMPDATE+2(A6),D0ƒGet�month&ŠBSR„CVDEC1�Convert�to�ASCII�and�stuff** File name portionŠLEA„FHSLOAD+FHSFIL(A4),A1ŠMOVE.W�#'DU',(A1)+ ŠMOVE.B�TMPDATE+3(A6),D0ƒGet�day&ŠBSR„CVDEC1�Convert�to�ASCII�and�stuff,ŠMOVE.L�TIMBLK+4(A6),D0„Time�in�millisecondsŠDIVUƒ#1000*60,D0#ŠAND.L‚#$FFFF,D0ŠD0�=�total�minutesŠDIVUƒ#60,D0�minutes,�hours+ŠMOVE.L�D0,D2ŽSave�'cause�D0�gets�wiped�out!ŠAND.L‚#$FF,D0ŒMask�to�just�hours,ŠBSR„CVDEC1�Convert�hours�to�ASCII�and�stuffŠSWAPƒD2ŠMOVE.W�D2,D0ŽMinutes&ŠBSR„CVDEC1�Convert�to�ASCII�and�stuff**ƒDelete�any�existing�file�with�same�name.4ŠMOVE.W�#FHDELT,FHSLOAD+FHSCMD(A4)�Delete�file�firstŠLEA„FHSLOAD(A4),A0ŠTRAPƒ#3'*ƒSet�up,�allocate�and�assign�the�file.?*…Convert�byte�count�to�large�enough�sector�count�to�hold�imageŠMOVE.L�ULSIZE(A4),D0ŠADD.L‚#$FF,D0 ŠLSR.L‚#8,D09ŠMOVE.L�D0,FHSLOAD+FHSSIZ(A4)�Set�sector�size�in�FHS�P.B.@*…Set�up�for�allocate,assign�and�contiguous,exclusive�read/write*ŠMOVE.W�#FOPCON!FOPEREW,FHSLOAD+FHSOPT(A4))ŠMOVE.W�#FHALLO!FHASGN,FHSLOAD+FHSCMD(A4)ŠCLR.B‚FHSSTA(A0)‰Clear�statusŠTRAPƒ#3ŠBEQ.S‚NWCRIM11** Error assigning UPLOAD file%ŠBSR„NWCRMERA‹Report�error�on�console ŠCLR.L‚D1+ŠMOVE.B�SDDSEC(A3),D1†Secondary�station�ID.*ŠLEA„STAFLGB(A6),A0…Base�of�station�flags.:ŠBCLRƒ#STAFUP,0(A0,D1)ƒFlag�station�as�not�in�upload�mode.(ŠBRA.S‚NWCRIM50‹Go�try�the�download�now.*#* Initialize areas in download P.B.NWCRIM11‚LEA„LOADBUF(A4),A07ŠMOVE.L�A0,BUFBOT(A4)†Buffer�bottom�offset�for�receive.-ŠCLR.L‚BYTECNT(A4)ˆClear�byte�count�received.6ŠCLR.L‚IOSLOAD+IOSRRN(A4)�Clear�RRN�number�in�IOS�P.B.*&* Create an UPLOAD command and send it*ŠLEA„LOADBUF(A4),A1…Start�of�buffer�header.ŠCLR.L‚SDDSTS(A1)‰Clear�status�and�byte�count./ŠCLR.W‚SDDRTC(A1)‰Clear�retry�and�error�fields.:ŠMOVE.W�SDDCMD(A3),SDDCMD(A1)�Move�Cmd,Station�from�recv'd/ŠMOVE.B�#SDDCI,SDDCMD(A1)‚Command�in�'I�frame'.5ŠMOVE.B�#THB1NWC,DNSLTH1(A1)�Upload/Download�TH�field3ŠMOVE.B�#DNLIAU,DNSLTH2(A1)�Initiate�upload�command5ŠMOVE.L�ULSIZE(A4),DNDLBCT(A1)�Byte�count�to�transfer;ŠMOVE.L�ULBASE(A4),DNDLADR(A1)�Starting�address�to�t1 ransfer*0ŠLEA„NTSLOAD(A4),A2…Send�UPLOAD�parameter�block.:ŠMOVE.L�A1,NTWSAD(A2)†Put�data�address�in�parameter�block.9ŠMOVE.L�#DNULLNG,NTWLEN(A2)�Length�of�data�block�to�send.**ŠBSR„SNDMSG�Send�UPLOAD�information�block.*£queued�if�no�buffers.*/* Put out message that we've started the upload#ŠLEA„MSGUBS(PC),A1†Start�of�message!ŠLEA„MSGUBE(PC),A2†End�of�messageŠBSR„ULODMSGŒGo�put�it�out ŠBRA„NWCM60�Return�to�main�loop.*&MSGUBS„DC.Bƒ'UPLOAD�BEGUN�-�STATION�$'MSGUBE„EQU„*-1ŠPAGE6* Upload done or not required - proceed with download.4*‚Flag�upload�not�in�progress,�download�in�progress.NWCRIM50‚CLR.L‚D0*ŠLEA„STAFLGB(A6),A0…Base�of�station�flags./ŠMOVE.B�SDDSEC(A3),D0†Secondary�station�number.9ŠBCLRƒ#STAFUP,0(A0,D0)ƒClear�the�upload�in�progress�flag.9ŠBSETƒ#STAFDP,0(A0,D0)ƒSet�the�download�in�progress�flag.**ŠLEA„LOADBUF(A4),A1…Address�of�data�buffer-ŠCLR.L‚SDDSTS(A1)‰Clear�Status�and�Byte�count.ŠCLR.W‚SDDRTC(A1)‰Clear�Retry�and�Error�fields&ŠCLR.W‚SDDRSP(A1)‰Clear�Response�field:ŠMOVE.W�SDDCMD(A3),SDDCMD(A1)�Move�Cmd,Station�from�recv'd.ŠMOVE.B�#SDDCI,SDDCMD(A1)‚Command�is�'I�frame'*=*‡Read�NETLOAD.SA�to�get�name�of�DOWNLOAD�file�--�ASSIGN�file*0ŠCLR.L‚D0‘Fetch�Record�Key�for�"NETLOAD.SA"�File/ŠMOVE.B�SDDSEC(A3),D0†Fetch�SDLC�Station�Number/ŠBSR„REDNETSŒRead�Record�from�"NETLOAD.SA"�File*ŠBEQ.S‚NWCRIM52‹Branch�if�no�error�on�read*"* Error in reading NETLOAD.SA file%ŠBSR„NWCRMERA‹Report�error�on�console2ŠMOVE.L�A4,A2ŽRestore�A2�to�point�to�download�area#ŠBSR„FRELOADŒFree�the�download�areaŠBRA„NWCM60�Back�to�main�loop*7NWCRIM52‚LEA„NETSBUF(A6),A0…Move�File�Name�to�FHS�Block+ŠMOVE.L�A6,-(A7)‹Save�A6�-�EDITFILE�uses�it'ŠLEA„FHSLOAD(A4),A6…FHS�parameter�block.ŠMOVE.L�#'„',FHSCLG(A4)�Blank�out�catalog�nameŠMOVE.L�#'„',FHSCLG+4(A4)+ŠMOVE.L�#'„',FHSFIL(A4)�Blank�out�file�nameŠMOVE.L�#'„',FHSFIL+4(A4)/ŠBSR„EDITFILE‹Move�file�name�to�FHS�param�blockŠMOVE.L�(A7)+,A6‹Restore�A6*ŠFHSCALL�FHSLOAD(A4)‡Assign�??????.SY�file4ŠBEQ.S‚NWCRIM54‹Branch�if�no�error�in�assigning�file*#* Error in assigning ??????.SY file%ŠBSR„NWCRMERA‹Report�error�on�console2ŠMOVE.L�A4,A2ŽRestore�A2�to�point�to�download�area#ŠBSR„FRELOADŒFree�the�download�areaŠBRA„NWCM60�Back�to�main�loop*=NWCRIM54‚MOVE.L�A4,A2ŽDOWNLOAD�area�address�to�A2�for�REDLOAD2ŠBSR„REDLOADŒREAD�1st�Block�From�File�To�Be�Loaded*ŠBEQ.S‚NWCRIM56‹Branch�if�no�error�on�read** Error reading DOWNLOAD file'ŠBSR.S‚NWCRMERR‹Report�error�on�console2ŠMOVE.L�A4,A2ŽRestore�A2�to�point�to�download�area#ŠBSR„FRELOADŒFree�the�download�areaŠBRA„NWCM60�Back�to�main�loop*%*ˆCreate�a�DOWNLOAD�Command�&�SEND�It*6NWCRIM56‚MOVE.L�#1,IOSRRN(A0)†Set�Random�Record�#�to�1*ŠLEA„LOADBUF(A2),A1…Start�of�buffer�header0ŠMOVE.B�#THB1NWC,DNSLTH1(A1)�*�Download�TH�Field9ŠMOVE.B�#DNLIAD,DNSLTH2(A1)�*�Initiate�a�Download�Command5ŠLEA„LOADBUF+DNSLDAT(A2),A0�Start�of�buffer�data�area0ŠMOVE.L�LIBSLSA(A0),DNDLADR(A1)�Starting�Address*ŠMOVE.L�LIBSLEN(A0),DNDLBCT(A1)�Byte�Count/ŠMOVE.L�LIBENT(A0),DNDLXFR(A1)�Transfer�Address&ŠMOVE.W�#$2700,DNDLSTW(A1)�Status�Word5ŠMOVE.L�LIBSLSA(A0),DNDLISP(A1)�Initial�Stack�Pointer*1ŠLEA„NTSLOAD(A2),A2…Send�DOWNLOAD�parameter�block5ŠMOVE.L�A1,NTWSAD(A2)†Put�data�address�in�param�block8ŠMOVE.L�#DNDLLNG,NTWLEN(A2)�Length�of�data�block�to�send+ŠBSR„SNDMSG�Send�DOWNLOAD�information�block*£queued�if�no�buffersŠBRA„NWCM60�Return�to�main�loopŠPAGEG* This subroutine will print an error message on the console for errors0*ƒinvolving�assigning,�reading�or�writing�files.***‚ENTRY�POINTS:�NWCRMERR�-�for�read�errors*�NWCRMERW�-�for�write�errors"*�NWCRMERA�-�for�assignment�errors*5*‚ENTRY:�A0�-�Points�to�FHS�P.B.�containing�file�name*‰D0�-�Error�code**‚EXIT:‚A0,D6,D7�Destroyed*5NWCRMERR‚MOVE.L�#'READ',D6‰Will�put�'READ'�in�message,ŠBRA.S‚NWCRMERC‹Continue�with�common�routine6NWCRMERW‚MOVE.L�#'WRIT',D6‰Will�put�'WRIT'�in�messag1 e.-ŠBRA.S‚NWCRMERC‹Continue�with�common�routine.5NWCRMERA‚MOVE.L�#'ASGN',D6‰Will�put�'ASGN'�in�message*NWCRMERC‚MOVEM.L�A1-A3,-(A7)ŠMOVE.L�D0,D7ŽSave�error�code6ŠMOVE.W�#FHCLOS,FHSCMD(A0)�Change�FHS�command�to�closeŠFHSCALL* ŠLEA„MRDERR(PC),A1†ERROR�message'ŠLEA„ABUFFR(A6),A2†WRITE�message�buffer*ŠMOVE.L�A2,A3ŽSave�address�of�write�buffer"ŠMOVE.W�#MRDERSZ-1,D0†message�size8NWCRMERM‚MOVE.B�(A1)+,(A2)+ˆMove�message�to�write�bufferŠDBRAƒD0,NWCRMERM0ŠMOVE.L�D6,4(A3)‹Put�'READ'�or�'ASGN'�in�message3ŠLEA„MRDERTP-MRDERR(A3),A1�Where�to�save�error�code2ŠMOVE.W�D7,D0ŽRestore�error�code�to�D0�for�convert'ŠBSR„CVHEX1�Convert�error�code�to�ascii8ŠLEA„MRDERFL-MRDERR(A3),A2�Where�to�put�file�name�in�msg7ŠMOVE.L�FHSCLG(A0),(A2)„Move�first�half�of�catalog�name8ŠMOVE.L�FHSCLG+4(A0),4(A2)�Move�2nd�half�of�catalog�name5NWCREREƒCMP.B‚#'�',(A2)+‰Look�for�end�of�catalog�name ŠBNE„NWCRERE8ŠMOVE.B�#'.',-1(A2)ˆSeparate�catalog�name�from�extentionŠMOVEM.L�A0-A2,-(A7)(ŠLEA„FHSFIL(A0),A0†Point�A0�to�file�name*ŠMOVE.L�#7,D0ŽNumber�of�characters�to�move-MOVFNAMƒMOVE.B�(A0)+,(A2)+ˆMove�the�file�nameŠDBRAƒD0,MOVFNAMŠMOVEM.L�(A7)+,A0-A22NWCRERFƒCMP.B‚#'�',(A2)+‰Look�for�end�of�file�name&ŠBNE„NWCRERFŒBranch�to�continue�search0ŠMOVE.B�#'.',-1(A2)ˆSeparate�file�from�extention8ŠMOVE.B�FHSEXT(A0),(A2)+ƒMove�1st�character�of�extention9ŠMOVE.B�FHSEXT+1(A0),(A2)‚Move�2nd�character�of�extentionŠMOVE.L�A3,A1ŽStart�of�message ŠMOVE.L�A3,A2%ŠMOVE.L�#MRDERSZ-1,D0†Size�of�messageŠADD.L‚D0,A2ŽEnd�of�message$ŠBSR„OUTTERMŒSend�message�to�console&ŠMOVEM.L�(A7)+,A1-A3‡Restore�registersŠRTS*&MRDERR„DC.Bƒ'I/O�READ�ERROR�-�CODE�=�'MRDERTPƒDC.Bƒ'XX�FILE�=�' MRDERFLƒDC.Lƒ'„','„','„','„','„' ŠDC.Bƒ$0D,$0AMRDERSZƒEQU„*-MRDERRŠPAGE*v.*NWCSEND:ƒIF�error�returned�in�parameter�block*‹THEN*ŽCrash�system. *‹IF�message�was�sent�to�monitor*‹THEN*ŽGOTO�NWCSMON#*‹{Message�was�not�sent�to�monitor}*‹IF�command�was�NOT�to�send*‹THEN.*NWCSRTN:†Flag�send�parameter�block�as�'free'.*ŽGOTO�NWCM06:.*‹{Command�was�to�send}'*‹IF�command�was�'send�initiate�upload'*‹THEN*ŽGOTO�NWCM60:.6*‹Get�download�area�associated�with�this�secondary�via *‹BSR�GETLUN*‹IF�download�block�not�found*‹THEN*ŽGOTO�NWCSRTN:.*‹{Download�block�was�found}2*‹IF�command�was�'SNRM'�(set�normal�response�mode)*‹THEN/*ŽFree�reserved�download�area�via�BSR�FRELOAD:.*ŽGOTO�NWCSRTN:.*‹{Command�was�NOT�a�'SNRM'})*‹IF�command�was�NOT�a�'numbered�I�frame'*‹THEN*ŽGOTO�NWCSRTN:.$*‹{Command�was�a�'numbered�I�frame'})*‹Read�next�block�to�send�via�BSR�REDLOAD*‹IF�NOT�successful�read�status*‹THEN*ŽIF�end�of�file*ŽTHEN6*‘Flag�this�secondary�for�upload�on�next�RIM�received.*‘Close�the�download�file.+*‘Free�the�download�block�via�BSR�FRELOAD:.*ŽELSE�{real�error�in�read}=*NWCSERR:‰Send�'SNRM'�to�secondary�with�'wait�for�transaction*‘complete'�option�set.9*‘Flag�this�secondary�for�NO�upload�on�next�RIM�received.)*‘GOTO�NWCRMERR:�to�output�error�message.*‹ELSE�{successful�read�status}7*ŽSend�next�block�of�data�to�secondary�via�BSR�SNDMSG:.**^** NWCSENDƒTST.B‚NTSRCOD(A4)ˆError?ŠCRASH.NE�*+1ŽCrash�system�yes,ŠMOVE.L�NTWSAD(A4),A3†Message�buffer�address+ŠCMP.B‚#NTSCSEND,D0‡Was�message�to�monitor?ŠBEQ„NWCSMONŒBranch�if�YES'ŠCMP.B‚#NTWCSEND,D0‡Was�command�'SEND'?2ŠBNE.S‚NWCSRTNŒBranch�if�NO�-�ignore�spec�commandsŠMOVE.W�DNSLTH1(A3),D16ŠAND.W‚#$F0FF,D1ŠDisregard�1st�and�last�segment�flags.@ŠCMP.W‚#THB1NWC<<8!DNLIAU,D1�Was�this�an�initiate�upload�record?ŠBEQ„NWCM60�Branch�if�yes.;ŠMOVE.B�SDDSEC(A3),D0†Station�number�-�id�for�DOWNLOAD�area'ŠBSR„GETLUN�Fetch�DOWNLOAD�area�address"ŠBNE.S‚NWCSRTNŒBranch�if�not�found0ŠMOVE.B�SDDCMD(A3),D0†Get�command�that�completed,ŠCMP.B‚#SDDCSNRM,D0‡Was�it�a�'SNRM'�Command?ŠBEQ.S‚NWCSSNRM‹Branch�if�YES+ŠCMP.B‚#SDDCI,D0ŠWas�it�a‚Numbered�I�frame?ŠBEQ.S‚NWCSIFRŒBranch�if�YES*ŠBRA.S‚NWCSRTNŒAll�other�commands�-�return*4*‡Command�was�SNRM�--�Mu2 st�be�finished�with�download*/NWCSSNRM‚BSR„FRELOADŒFlag�DOWNLOAD�area�as�FREE*/*‡Free�SEND�param�block�and�return�to�main�loop*)�and�legal�secondary*‹station�number*‹THEN*ŽCASE�(code�value)*‘0001�(INIT):9*”Set�up�parameter�block�to�send�message�back�to�monitor.<*”Construct�return�message�consisting�of�number�of�stations,**”first�station�number,�station�increment.+*”Send�message�to�monitor�via�BSR�SNDMSGM:.*”GOTO�NWCM60:.$*‘0002�(Download�default�file�name):*”{Not�implemented�yet}"*”Send�error�code�to�calling�task.*”GOTO�NWCM60:.*‘0003�(Download�with�name):*”{Not�implemented�yet}"*”Send�error�code�to�calling�task.*”GOTO�NWCM60:.*‘0004�(Upload):*”{Not�implemented�yet}"*”Send�error�code�to�calling�task.*”GOTO�NWCM60:.*‘0005�(Upload�selective)*”{Not�implemented�yet}"*”Send�error�code�to�calling�task.*”GOTO�NWCM60:. *ŽEND�{CASE}!*‹ELSE�{Message�header�not�valid}@*NWCRM50:†Construct�error�return�message�to�monitor�and�send�it.*ŽGOTO�NWCM60:.**$* NETWORK SERVICES MONITOR INTERFACE*N*�The�network�services�monitor�interface�is�an�addition�to�the�NWCT‚task�whichI* provides a way for an application task running on the primary system to!* request the following services:*G*�1.„Request�information�on�the�identity�of�secondary�stations�sysgened*‰into�this�network.*@*�2.„Download�the�default�file�to�a�specified�secondary�station.*@*�3.„Download�a�specified�file�to�a�specified�secondary�station.*F*�4.„Upload�the�entire�memory�image�from�a�secondary�station�and�place0*‰into�a�sequential�file�on�the�primary�station.*F*�5.„Upload�a�portion�of�the�memory�image�from�a�secondary�station�and6*‰place�into�a�sequential�file�on�the�primary�station.**O* The application task that wishes to make any of the above requests must firstM*�establish�a�connection�to�NWCT.‚The�application�task�then�makes�the�requestH*�sending�specially�formatted�message�to�NWCT.‚NWCT�performs�the�requestH* (if possible) and responds via a message to the requesting application* task.*L* The data portions of the messages sent by the application task to the NWCTH*�task�always�begin�with�a�two-byte�field�containing�'**'.‚This�field�isJ*�followed�by�a�two-byte�field�contain�the�request�ID.‚The�following�bytesB* (if any) contain information specific to the individual request.*F* The format for the messages sent by the application task to the NWCT* task follow:*)*“2-bytes‚2-bytes‚2-bytes‚4-bytes‚8-bytes* * Request* 2ndary*�ID's.�'**'…0001* * Download * default*�file.�'**'…0002…00nn* * Download * specified&*�file.�'**'…0003…00nn…#3 bytesƒfilename** Upload* entire* memory*�image.Œ'**'…0004…00nn** Upload * portion*�of�memory¤start&*�image.Œ'**'…0005…00nn…address‚#bytes**J* In the above examples, 00nn stands for a secondary station ID, #bytes is"* the number of bytes to transfer.*F* In response to a request from an application task, NWCT will performF* the request (if possible) and respond to the application task with aJ*�message.‚The�response�message�will�contain�a�two-byte�status�field�whichD* will be zero if the request were successfully completed or nonzeroH*�if�an�error�occurred.‚The�format�of�the�response�messages�sent�by�NWCT"* to the application task follows:*!*“2-bytes‚2-bytes‚2-bytes‚2-bytes* *�Request¦1st*�2ndary§station‚#�of0*�ID's.�'**'…0001…statusƒID�#…stationsƒincrement* * Download * default*�file.�'**'…0002…status* * Download * specified*�file.�'**'…0003…status** Upload* entire* memory*�image.Œ'**'…0004…status** Upload * portion * of memory*�image.Œ'**'…0005…status*^* NWCRMONƒEQU„*** Flag receive area as free.&*‚Get�associated�monitor�control�block4ŠMOVE.B�#-1,NTWSTA(A4)…Flag�the�receive�area�as�free5ŠMOVE.B�NTSLCC(A4),D0†Logical�connect�code�of�monitor2ŠBSR„GETLCC�Get�the�monitor�control�block�for�this ŠBEQ.S‚NWCR104ŠBSR„NWCERRXŒSave�error�address�if�not�already�savedŠBRA„NWCM60�Go�to�main�loop.** A2 = Monitor block address * A3 = Received message address.,* A4 = NTS P.B. address of completed receive*ANWCR10„MOVE.L�NTSSAD(A2),A0†Address�of�monitor�send�message�area.%ŠMOVE.L�(A3),(A0)ŠMove�in�'**',�code./ŠCLR.W‚RSTAT(A0)ŠClear�status�in�return�message*/* Check for '**' in first two bytes of message.*ƒCheck�for�code�within�range.+*ƒCheck�for�legal�secondary�station�number.,*ƒIf�any�tests�fail,�then�branch�to�NWCRM50.7ŠCMP.W‚#'**',(A3)‰Does�this�have�the�correct�header�for&*£...�a�message�received�from�monitor?ŠBNE.S‚NWCERR1ŒBranch�if�no ŠCLR.L‚D02ŠMOVE.W�MCODE(A3),D0‡Code�field�of�monitor�message(ŠBLE.S‚NWCERR2ŒBranch�if�code�too�small.ŠCMP.W‚#MCODEMX,D0(ŠBGT.S‚NWCERR2ŒBranch�if�code�too�large.ŠMOVE.W�MSTN(A3),D1ˆStation�ID ŠCLR.W‚D2 ŠCLR.W‚D36ŠMOVE.B�STAINFO+2(A6),D2ƒ1st�secondary�station�number.5ŠMOVE.B�STAINFO+3(A6),D3ƒSecondary�station�increment.7ŠMOVE.W�STAINFO(A6),D4…Maximum�#�of�secondary�stations.NWCRM20ƒCMP.W‚D1,D22ŠBEQ.S‚NWCRM50ŒBranch�if�secondary�station�#�found4ŠADD.W‚D3,D2ŽCheck�next�possible�secondary�station�# ŠSUB.W‚#1,D42ŠBMI.S‚NWCERR3ŒBranch�if�secondary�station�illegalŠBRA.S‚NWCRM20*G* Branch to the appropriate processing routine based on the code in the$*ƒmessage�received�from�the�monitor.*NWCRM50ƒLEA„VTBL(PC),A0 ŠSUB.L‚#1,D0 ŠLSL.L‚#2,D0ŠADD.L‚0(A0,D0),A0 ŠJMP„(A0)** Vectoring table VTBL†EQU„*'ŠDC.LƒIDS-VTBL‹0001‚Request�2ndary�ID's-ŠDC.LƒNWCERR2-VTBL‡0002‚Download�default�file/ŠDC.LƒNWCERR2-VTBL‡0003‚Download�specified�file2ŠDC.LƒNWCERR2-VTBL‡0004‚Upload�entire�memory�image5ŠDC.LƒNWCERR2-VTBL‡0005‚Upload�specified�memory�image/MCODEMXƒEQU„(*-VTBL)/4‰Number�of�table�entries.ŠPAGE*"* Monitor requested secondary ID's*>* Set up parameter block to send message back to monitor task. IDS‡EQU„*+ŠCLR.L‚NTWOPT(A2)‰Clear�options�and�status.-ŠMOVE.L�#RLGTH2,NTSLEN(A2)�Length�of�message.-ŠMOVE.L�NTSSAD(A2),A0†Address�to�put�message.0ŠMOVE.B�STAINFO+2(A6),RFFSTN(A0)�1st�station�ID.<ŠMOVE.W�STAINFO(A6),RMAXSEC(A0)‚Max�#�of�secondary�stations.5ŠMOVE.B�STAINFO+3(A6),RSSINC(A0)�Station�#�increment.%ŠBSR„SNDMSGMŒSend�message�to�monitor.*£queued�if�no�buffers ŠBRA„NWCM60ŠPAGE*C* Error handler will return error status to monitor and then return*ƒto�main�loop.*NWCERR1ƒMOVE.W�#$71,D0 ŠBRA.S‚NWCERRNWCERR2ƒMOVE.W�#$72,D0 ŠBRA.S‚NWCERRNWCERR3ƒMOVE.W�#$73,D0*1NWCERR„CLR.L‚NTWOPT(A2)‰Clear�options�and�status.4ŠMOVE.L�#RLGTH1,NTSLEN(A2)�Length�of�return�message.-ŠMOVE.L�NTSSAD(A2),A0†Address�to�put�message.ŠMOVE.W�#'**',(A0)+ŠMOVE.W�D0,RSTAT(A0)‡Plug�in�return�status.%3 ŠBSR„SNDMSGMŒSend�message�to�monitor.*£queued�if�no�buffers ŠBRA„NWCM60*G* Internal error routine saves the address from whence it was called atE*ƒthe�first�location�in�data�segment.‚Only�the�first�error�address�is*ƒsaved.NWCERRXƒTST.L‚(A6)ŠBNE.S‚NWCERRXR:ŠMOVE.L�(A7),(A6)ŠSave�error�address�if�not�already�saved. NWCERRXR‚RTSŠPAGE**ˆMessage�Sent�to�Monitor�Task*6NWCSMONƒMOVE.B�#-1,NTSSTA(A4)…Flag�param�block�as�free!ŠMOVE.B�NTSRCOD(A4),D0…Any�error?'ŠBEQ„NWCM06�If�NO�-�return�to�main�loop3ŠCMP.B‚#NTSRILCC,D0‡ILCC�may�mean�connect�cancelled%ŠBEQ.S‚NWCSM04ŒBranch�if�code�is�ILCC)ŠCMP.B‚#NTSRDISC,D0‡Is�it�any�disconnect?ŠBCC.S‚NWCSM04ŒBranch�if�YESŠERRMESG*$NWCSM04ƒMOVE.B�NTSLCC(A4),D0†Get�LCC&ŠBSR„GETLCC�Find�Monitor�Control�blockŠBNE„NWCM06�Branch�if�not�found*ŠBSR„FREMON�Free�the�monitor�control�blockŠBRA„NWCM06�Return�to�main�loopŠPAGE*&*ˆSubroutine�to�issue�RECEIVE�Requests*=*ˆChecks�all�receive�parameter�blocks�to�see�if�any�are�ready*)SRTRCV„MOVE.L�#NUMRCV-1,D7‡Pointer�offset*ŠLEA„RCVBLK(A6),A0†Parameter�block�address1SRTRV02ƒCMP.B‚#-1,NTWSTA(A0)…Is�param�block�free?ŠBNE.S‚SRTRV10ŒBranch�if�NO.ŠMOVE.B�#NTSCRECV,NTWCMD(A0)�Put�command�in�pbŠCLR.B‚NTWLCC(A0)‰Any�LCC�is�ok=ŠMOVE.W�#1<�0�and�not�'out�of�buffer�status'* STATCHKƒEQU„* ŠTST.B‚D0$ŠBEQ.S‚STAT999ŒReturn�if�good�status"ŠCMP.B‚#NTSRNOB,D0ˆOut�of�buffers? ŠCRASH.NE�*+1ŽAbort�system�if�noŠMOVE.L�A0,-(A7) ŠMOVE.L�#1000,A0‹Delay�=�1000�ms ŠERQ.DELAYŠMOVE.L�(A7)+,A0"ŠTST.L‚(A7)�Set�unequal�conditions STAT999ƒRTSŠPAGE*)*ˆSubroutine�to�find�a�free�Download�Area*,*ˆOn�Entry�:�D0.B�=�Secondary�Station�Number*&*ˆOn�exit�:�A2�=�Download�Area�Address**’D0�=�0�SuccessfulƒD0�=�-1�none�available*+GETLOADƒMOVE.L�#NUMLOAD-1,D7†Pointer�offset+ŠLEA„LOADBLK(A6),A2…Parame4 ter�block�address1GETLO02ƒCMP.B‚#0,LOADSEC(A2)…Is�param�block�free?ŠBNE.S‚GETLO10ŒBranch�if�NO/ŠMOVE.B�D0,LOADSEC(A2)…Yes,�Set�it�as�allocatedAŠMOVE.L�#FHSBLN+IOSBLN-1,D0�Initialize�FHS�&�IOS�Parameter�BlocksŠLEA„FHSLOAD(A2),A0…*ŠLEA„LOADFHS,A1‰*GETLO04ƒMOVE.B�(A1)+,(A0)+ˆ*ŠDBRAƒD0,GETLO04‰*ŠCMP.L‚#LUNTBLSZ-1,D7.ŠCRASH.HI�*+1ŽAbort�if�LUN�index�out�of�range.1ŠLEA„LUNTBL(PC),A0†Point�to�LUN�table�to�plug�LUNŠMOVE.B�0(A0,D7),FHSLUN(A2)†*$ŠMOVE.B�0(A0,D7),IOSLUN+FHSBLN(A2)�*ŠCLR.L‚D0‘Successful ŠRTS—RETURN9GETLO10ƒLEA„LOADBKSZ(A2),A2„increment�param�block�address'ŠDBRAƒD7,GETLO02‰Loop�back�to�check�allŠMOVE.L�#-1,D0�NOT�Found ŠRTS—RETURNŠPAGE*-*ˆSubroutine�to�find�a�reserved�Download�Area*,*ˆOn�Entry�:�D0.B�=�Secondary�Station�Number*&*ˆOn�exit�:�A2�=�Download�Area�Address**’D0�=�0�SuccessfulƒD0�=�-1�none�available**GETLUN„MOVE.L�#NUMLOAD-1,D7†Pointer�offset+ŠLEA„LOADBLK(A6),A2…Parameter�block�address1GETLU02ƒCMP.B‚LOADSEC(A2),D0…Is�param�block�free?ŠBNE.S‚GETLU10ŒBranch�if�NOŠCLR.L‚D0‘Successful ŠRTS—RETURN9GETLU10ƒLEA„LOADBKSZ(A2),A2„increment�param�block�address'ŠDBRAƒD7,GETLU02‰Loop�back�to�check�allŠMOVE.L�#-1,D0�NOT�Found ŠRTS—RETURN*-*ˆSubroutine�to�free�a�reserved�Download�Area*'*ˆOn�Entry�:�A2�=�Download�area�Address*“A3�=�SDLC�message*,*ˆOn�exit�:�A2�=�D0,�D1,�A0�and�A2�destroyed*&FRELOADƒCLR.B‚LOADSEC(A2)ˆFlag�as�free(ŠCLR.B‚SIMWAIT(A2)ˆBe�sure�wait�is�clear.ŠMOVE.B�SDDSEC(A3),D0†Secondary�station�numberŠLEA„STAFLGB(A6),A0/ŠBCLRƒ#STAFUP,0(A0,D0)ƒClear�upload�in�progress1ŠBCLRƒ#STAFDP,0(A0,D0)ƒClear�download�in�progress/ŠLEA„WAITQHD-RCVNEXT(A6),A0�Start�of�wait�queue+ŠLEA„NTSLOAD(A2),A2…NTS�PB�in�DOWNLOAD�area/FRELD2„MOVE.L�RCVNEXT(A0),D0…Next�in�wait�queue'ŠBEQ.S‚FRELD8�Branch�if�search�complete ŠCMP.L‚D0,A2ŽIs�this�pb�on�list?ŠBEQ.S‚FRELD4�Branch�if�YES ŠMOVE.L�D0,A0(ŠBRA„FRELD2�Loop�back�to�test�next�entry*7FRELD4„MOVE.L�RCVNEXT(A2),RCVNEXT(A0)�Remove�from�queueFRELD8„RTS—ReturnŠPAGE2***************************************************>*‚SUBROUTINE:‚"REDLOAD"�READ�NEXT�BLOCK�FROM�FILE�TO�BE�LOADED*8*‚ENTER:ˆA0.L�=�Address�of�Download�Parameter�Block�Area*(*‚RETURN:‡D0�=�0�=>�Block�Correctly�Read**�D0�><0�=>�Block�Not�Correctly�Read�(EOF)**‚REGISTERS:„0�1�2�3�4�5�6�7 *ŽD�U�U�P‰U*ŽAƒU‰P*>**************************************************************9REDLOADƒLEA„IOSLOAD(A2),A0…Address�of�IOS�Parameter�Block;ŠLEA„LOADBUF+DNSLDAT(A2),A1�Address�of�Start�of�Data�BufferŠMOVE.L�A1,IOSSAD(A0)†*4ŠLEA„LOADBFSZ-1(A1),A1‚Address�of�End�of�Data�BufferŠMOVE.L�A1,IOSEAD(A0)†*ŠIOSCALLŠRTSŠPAGE*1*ˆSubroutine�to�find�a�Monitor�Control�Block�area*&*ˆOn�exit�:�A2�=�Monitor�Block�Address**’D0�=�0�SuccessfulƒD0�=�-1�none�available*,GETMONBK‚MOVE.L�#MAXMON-1,D7‡Count�of�blocks(ŠLEA„MONBLK(A6),A2†Monitor�block�address2GETMB02ƒCMP.B‚#0,MONLCC(A2)†Is�monitor�block�free?ŠBNE.S‚GETMB10ŒBranch�if�NOŠCLR.L‚D0‘Successful ŠRTS—RETURN:GETMB10ƒLEA„MONBKSZ(A2),A2…Increment�to�next�monitor�block'ŠDBRAƒD7,GETMB02‰Loop�back�to�check�allŠMOVE.L�#-1,D0�NOT�Found ŠRTS—RETURN*5*ˆSubroutine�to�find�a�reserved�Monitor�Control�Block*(*ˆOn�Entry�:�D0.B�=�Logical�Connect�Code*&*ˆOn�exit�:�A2�=�Monitor�Block�Address&*’D0�=�0�SuccessfulƒD0�=�-1�none�found*+GETLCC„MOVE.L�#NUMLOAD-1,D7†Count�of�blocks(ŠLEA„MONBLK(A6),A2†Monitor�block�address2GETLC02ƒCMP.B‚MONLCC(A2),D0†Is�monitor�block�free?ŠBNE.S‚GETLC10ŒBranch�if�NOŠCLR.L‚D0‘Successful ŠRTS—RETURN:GETLC10ƒLEA„MONBKSZ(A2),A2…Increment�monitor�block�address'ŠDBRAƒD7,GETLC02‰Loop�back�to�check�allŠMOVE.L�#-1,D0�NOT�Found ŠRTS—RETURN*5*ˆSubroutine�to�free�a�reserved�Monitor�Control�Block*'*ˆOn�Entry�:�A2�=�Monitor�Block�Address*,*ˆOn�exit�:�A2�=�D0,�D1,�A0�and�A2�destroyed*$FREMON„CLR.B‚MONLCC(A2)‰Flag�as�free+ŠLEA„WAITQHD-RCVNEXT,A0�Start�of�wait�queue ŠBRA„F4 RELD2ŠPAGE2***************************************************<*‚SUBROUTINE:‚"REDNETS"�READ�A�RECORD�FROM�"NETLOAD.SA"�FILE*(*‚ENTER:‡DO.L�=�Record�Number�to�be�Read*(*‚RETURN:‡D0�=�0�=>�Block�Correctly�Read**�D0�><0�=>�Block�Not�Correctly�Read�(EOF)**‚REGISTERS:„0�1�2�3�4�5�6�7 *ŽD�U�U�U‰U*ŽAƒU‰P*>**************************************************************'REDNETSƒMOVE.L�D0,D2ŽSave�Record�Number.ŠLEA„FHSNETS(A6),A0…Open�the�"NETLOAD.SA"�FileŠMOVE.W�#FHASGN,FHSCMD(A0)�*ŠFHSCALLŠBNE.S‚REDNER�Branch�if�Error2ŠLEA„IOSNETS(A6),A0…Address�of�IOS�Parameter�Block3ŠLEA„NETSBUF(A6),A1…Address�of�Start�of�Data�BufferŠMOVE.L�A1,IOSSAD(A0)†*2ŠLEA„NETSBEND(A6),A1„Address�of�End�of�Data�BufferŠMOVE.L�A1,IOSEAD(A0)†**ŠMOVE.L�D2,IOSRRN(A0)†Random�Record�NumberŠIOSCALL)ŠMOVE.L�D0,-(A7)‹Save�Possible�Error�Code'ŠMOVE.L�IOSSAD(A0),A1†Address�of�buffer ŠMOVE.L�A1,D14ŠADD.L‚IOSLEN(A0),D1†D1�points�to�last�character�+�1REDN04„CMP.L‚D1,A1 ŠBHS.S‚REDN06ŠCMP.B‚#'�',(A1)+ ŠBNE.S‚REDN04<ŠMOVE.B�#$0D,-1(A1)ˆForce�carriage�return�into�1st�blank�pos>REDN06„MOVE.B�#$0D,(A1)ŠForce�carriage�return�at�end�of�record/ŠLEA„FHSNETS(A6),A0…Close�the�"NETLOAD.SA"�FileŠMOVE.W�#FHCLOS,FHSCMD(A0)�*ŠFHSCALL,ŠMOVE.L�(A7)+,D0‹Restore�Possible�Error�Code REDNER„RTSŠPAGE7* Subroutine to output message followed by station ID -%*‚e.g.ƒ'UPLOAD�ABORTED�-�STATION�$02'*“-�or�-!*‰'UPLOAD�FINISHED�-�STATION�$03'*'*�ENTRY:„A1…points�to�beginning�of�text"*”ie.�'UPLOAD�ABORTED�-�STATION�$'*‹A2…points�to�end�of�text7*‹A4…points�to�upload/download�area.‚The�station�number3*”is�pulled�from�the�catalog�portion�of�the�FHSLOAD*”parameter�block.**�EXIT:…D0,A1,A2�Destroyed** ULODMSGƒEQU„*-ŠBSR„OUTTERMŒPut�out�first�portion�of�messageŠLEA„ABUFFR(A6),A1 ŠLEA„3(A1),A2;ŠMOVE.W�FHSLOAD+FHSCLG+4(A4),(A1)�Bracket�station�ID,�CR,LF"ŠMOVE.W�#$0D0A,2(A1)‡Plug�in�CR,LF ŠBSR„OUTTERMŠRTSŠPAGE*.* Convert 1 HEX byte in range 0-99 to decimal.<*‚No�check�is�made�to�insure�that�byte�is�within�this�range.+*‚Deposit�2�hex�bytes�where�A1�is�pointing.G*‚On�exit,�A1�will�point�to�byte�following�the�deposited�ASCII�decimal.*+CVDEC1„AND.L‚#$FF,D0ŒIsolate�low�order�byteŠDIVUƒ#10,D0�10's,�1's.%ŠADD.L‚#$00300030,D0†Convert�to�ASCII$ŠMOVE.B�D0,(A1)+‹Deposit�10's�digit.ŠSWAPƒD0‘Position�1's�digit.#ŠMOVE.B�D0,(A1)+‹Deposit�1's�digit.ŠRTS*****ˆNON-LEAP�DAYS�BEFORE�TABLE**‚ENTER:ˆD0.B�=�SDLC�Command/Response�Corresponding�to�Message'*�A3.L�=�Address�of�SDLC�Response�Field**‚REGISTERS:„0�1�2�3�4�5�6�7 *ŽD�U�U�U*ŽAƒU�U*>**************************************************************.MSGOUT„LEA„SDMSG(PC),A1‡Clean�up�SDLC�Response'ŠMOVE.L�SDDCMD(A3),D1†RESP�+�Station�IDŠBTSTƒ#0,D0ŽNumbered�I�field?ŠBNE.S‚MSGOU1�*�Branch�if�No"ŠMOVE.B�#SDDCI,D0ŠYes,�Clean�it�UpŠBRA.S‚MSGOU2BŒ*,MSGOU1„BTSTƒ#1,D0ŽNo,�RR,�RNR,�REJ�Response?ŠBEQ.S‚MSGOU2AŒ*�Branch�if�YES1ŠCMP.L‚PREVCMD(A6),D1…Same�as�last�one�displayed?.ŠBNE.S‚MSGOU2BŒBranch�if�NO‚-�display�this�one*ŠBRA.S‚MSGOUR�Branch�if�YES�-�skip�display&MSGOU2AƒAND.B‚#$07,D0ŒYes,�Clean�it�Up4MSGOU2BƒMOVE.L�D1,PREVCMD(A6)…Save�command�displayed$ŠCMP.B‚#SDDCI,D0ŠNumbered�'I'�frame?+ŠBEQ.S‚MSGOUR�Branch�if�yes�-�Don't�display,MSGOU2CƒMOVE.W�2(A1),D1‹Message�Length�->�D1&ŠCMP.B‚1(A1),D0‹Correct�SDLC�Response?ŠBEQ.S‚MSGOU3�*�Branch�if�yes&ŠCMP.B‚#$FF,1(A1)‰No,�End�of�Messages?ŠBEQ.S‚MSGOU3�*�Branch�if�Yes/ŠLEA„4(A1,D1.W),A1†No,�Fetch�Next�Message�EntryŠBRA.S‚MSGOU2CŒ*6MSGOU3„LEA„4(A1),A1‹Output�the�Message�To�The�TerminalŠLEA„-1(A1),A2Š* ŠCLR.L‚D0‘*ŠMOVE.W�D1,D0Ž*ŠADD.L‚D0,A2Ž* ŠXREFƒOUTTERMŠBSR„OUTTERMŒ**&*ˆTxLATE�25�BYTES�TO�ASCII�HEX�&�TxMIT*ŠLEA„ABUFFR(A6),A1ŠMOVE.W�#24,D2�Convert�25�bytes ŠLEA„(A3),A2$W2CONT„MOVE.B�#'�',(A1)+‰SET�A�BLANK ŠMOVE.B�(A2)+,D0‹FETCH�NEXT�BYTE%ŠBSR.S‚CVHEX1�Convert�1�byte�to�ASCII)ŠDBRAƒD2,W2CONTŠBranch�if�more�to�convert#ŠMOVE.B�#CR,(A1)+Š"CR/LF"�TO�BUFFERŠMOVE.B�#LF,(A1)6ŠLEA„ABUFFR(A6),A1†Output�the�25�Bytes�to�the�TerminalŠMOVE.L�A1,A2Ž*ŠMOVE.L�#77,D0�*ŠADD.L‚D0,A2Ž*ŠBSR„OUTTERMŒ*!MSGOUR„RTS—Return�From�Subroutine**ˆConvert�1�HEX�byte�to�ASCII*CVHEX1„MOVE.B�D0,D1Ž*.ŠASR.L‚#4,D0ŽCONVERT�UPPER�NIBBLE�TO�HEX�ASCIIŠAND.B‚#$0F,D0Œ*ŠADD.B‚#'0',D0Œ*ŠCMP.B‚#'9',D0Œ*ŠBLE.S‚CVHEXA�*ŠADD.B‚#$7,D0�*6CVHEXA„AND.B‚#$0F,D1ŒCONVERT�LOWER�NIBBLE�TO�HEX�ASCIIŠADD.B‚#'0',D1Œ*ŠCMP.B‚#'9',D1Œ*ŠBLE.S‚CVHEXB�*ŠADD.B‚#$7,D1�*3CVHEXB„MOVE.B�D0,(A1)+‹MOVE�2�ASCII�CHARS�TO�BUFFERŠMOVE.B�D1,(A1)+‹*ŠRTS**„MESSAGE�TABLE* CRˆEQU„$0D LFˆEQU„$0A*SDMSG…DC.WƒSDDCUIŠDC.WƒSDMS0E-SDMS0%SDMS0…DC.Bƒ'Unnumbered�I�Field',CR,LFSDMS0E„DC.WƒSDDCUI+$10ŠDC.WƒSDMS1E-SDMS1/SDMS1…DC.Bƒ'Unnumbered�I�Field�Poll�Bit�',CR,LFSDMS1E„DC.WƒSDDCSIMŠDC.WƒSDMS2E-SDMS2*SDMS2…DC.Bƒ'Set�Initialization�Mode',CR,LFSDMS2E„DC.WƒSDDCSNRMŠDC.WƒSDMS3E-SDMS3+SDMS3…DC.Bƒ'Set�Normal�Response�Mode',CR,LFSDMS3E„DC.WƒSDDCDISCŠDC.WƒSDMS4E-SDMS4'SDMS4…DC.Bƒ'Set�DISCconnect�Mode',CR,LFSDMS4E„DC.WƒSDDCXIDŠDC.WƒSDMS5E-SDMS5SDMS5…DC.Bƒ'eXchange�IDs',CR,LFSDMS5E„DC.WƒSDDCTESTŠDC.WƒSDMS6E-SDMS6SDMS6…DC.Bƒ'TEST�link',CR,LFSDMS6E„DC.WƒSDDCIŠDC.WƒSDMS7E-SDMS7#SDMS7…DC.Bƒ'Numbered�I�field',CR,LFSDMS7E„DC.WƒSDDRRIMŠDC.WƒSDMS8E-SDMS8.SDMS8…DC.Bƒ'Request�Initialization�Mode',CR,LFSDMS8E„DC.WƒSDDRDMŠDC.WƒSDMS9E-SDMS9"SDMS9…DC.Bƒ'Disconnect�Mode',CR,LFSDMS9E„DC.WƒSDDRUAŠDC.WƒSDMS10E-SDMS10*SDMS10„DC.Bƒ'Unnumbered�Acknowledge',CR,LFSDMS10EƒDC.WƒSDDRFRMRŠDC.WƒSDMS11E-SDMS11 SDMS11„DC.Bƒ'FRaMe�Reject',CR,LFSDMS11EƒDC.WƒSDDRRDŠDC.WƒSDMS12E-SDMS12&SDMS12„DC.Bƒ'Request�Disconnect',CR,LFSDMS12EƒDC.Wƒ$FFŠDC.WƒSDMS13E-SDMS13)SDMS13„DC.Bƒ'Unknown�SDLC�Response',CR,LFSDMS13EƒDC.Wƒ$FF*PATCH…DS.Bƒ50‘Patch�areaŠEND5 éééééééŠPAGEJ***************************************************************************�INCLUDE�FILE:‚NTS.NWSUBR.AI«*J************************************************************************** 7ŠTTL„NWSUBR.SAŠSubroutines�Used�by�NTS�and�NTC�Routines*A*ˆSubroutine�to�test�Network�Name�(called�by�NTSIDNT�and�NTCIDNT)C*ˆTests�for�legal�characters�in�name�and�looks�for�duplicate�in�NNT*B*ˆ1st�entry�-�NWTNAM…Checks�for�legal�name�and�looks�for�it�in�NNTC*ˆOn�entry:�A5�=�Pointer�to�NNT�tableƒA4=Pointer�to�NTS�param�block*0*ˆ2nd�entry�-�NWTNAMC„Looks�for�name�in�NNT�only*%*ˆOn�entry:�A5�=�Pointer�to�NNT�table&*’D1�and�D2�=�Network�name�to�look�for*!*ˆOn�exit:�A2,�D1�and�D2�are�used.*‘A2�=�Pointer�to�NNT�entry�if�duplicate�found7*‘D0�=�0�if�good�returnˆD0�=�error�code�if�illegal�name*¼or�duplicate�nameŠXDEFƒNWTNAM,NWTNAMC*,*ˆCheck�each�character�-�must�be�legal�ascii*5NWTNAM„MOVE.L�#5,D0ŽWant�to�test�6�characters�of�name#ŠLEA„NTSNAME(A4),A0…Pointer�to�name(NWTN02„MOVE.B�(A0)+,D1‹Get�one�character'ŠCMP.B‚#$1F,D1ŒIs�it�control�character?%ŠBLE.S‚NWTN06�Branch�if�yes�-�illegal.ŠCMP.B‚#$7E,D1ŒIs�it�beyond�high�end�of�range?%ŠBGT.S‚NWTN06�Branch�if�yes�-�illegal-ŠDBRAƒD0,NWTN02ŠLoop�back�for�more�characters***ˆLook�for�duplicate�in�Network�Name�Table*/ŠMOVE.L�NTSNAME(A4),D1…1st�4�characters�of�name2ŠMOVE.W�NTSNAME+4(A4),D2ƒLast�2�characters�of�name?NWTNAMCƒLEA„NNTAHDR-NNTNEXT(A5),A2�Initial�active�entry�pointer6NWTN04„MOVE.L�NNTNEXT(A2),D0…Does�another�entry�exist?ŠBEQ.S‚NWTN08�Branch�if�NOŠMOVE.L�D0,A2ŽEntry�pointer.ŠCMP.L‚NNTNAM(A2),D1†Are�1st�4�chars�the�same?ŠBNE.S‚NWTN04�Loop�back�if�NO1ŠCMP.W‚NNTNAM+4(A2),D2„Are�last�2�chars�the�same?ŠBNE.S‚NWTN04�Loop�back�if�NO+ŠMOVE.L�#NTSRDNAM,D0‡ERROR�-�duplicate�name ŠRTS—RETURN*/NWTN06„MOVE.L�#NTSRINAM,D0‡ERROR�-�illegal�name ŠRTS—RETURN*%NWTN08„CLR.L‚D0‘Clear�for�good�return ŠRTS—RETURNŠPAGE*E*ˆSubroutine�to�build�message�to�send�to�SSC�(System�Service�Control)* ¯;¸CÀ1È>Ð;Ø8à9è:ðCø8D;</ 8(;0"6 C*ˆOn�entry:�A5�=�Pointer�to�NNT�tableƒA4=Pointer�to�NTS�param�block*’A2�=�Pointer�to�NNT�entry*?*ˆOn�exit:‚A0�=�Pointer�to�buffer†A1�=�Ptr�to�message�in�buffer*’D7�=�Local�Station�ID7*’D0�=�0�if�good�return‡D0�=�error�code�no�buffer�avail** Message appears as follows:0*ƒ(Values�of�'xx'�represent�uninitialized�bytes)*#*‡Offset‚Mnemonic�Value‹Description**-------------*‹00‚SDDLINKŽxxxxxxxxˆLink *‹04‚SDDSTS�00xxŒReturned�status*‹06‚SDDBCT�0028ŒMessage�size*‚SDLC…08‚SDDRTC�xxŽRetry�count!*‚Headerƒ09‚SDDERR�xxŽSDLC�errors*‹0A‚SDDCMD�xxŽSDLC�command*‹0B‚SDDSEC�nnŽLocal�station�ID*‹0C‚SDDRSP�xxŽSDLC�response*‹0D‚------�xxŽFiller*-------------*‹0E‚THB1‘2CŽNormal�'I'�frame*‚NTS¯(first�and�last)'*‚Trans-ƒ0F‚THB2‘00ŽTransmission�header%*‚mission‚10‚THDAF�01ŽDestination�NAU*‚Headerƒ11‚THOAF�01ŽOrigin�NAU*‹12‚THSEQ�0000ŒSequence�number*-------------$*‹14‚RHCAT�23ŽCategory:�from�network*�REQ/RESP«control!*�fields„15‚RHB1‘00Žreq/resp�flag*‹16‚RHB2‘0000Œreq/resp�header*-------------'*‹18‚MSGID�'.NTS'ŠOriginator�of�message'*‹1C‚MSGCMD�nn+$80ŠCommand�from�NTS�PB.*‹1D‚MSGLCC�nnŽLCC�from�NTS�PB.*‹1E‚MSGOPT�nnŽNNT�status*‹1F‚MSGXRCOD�xxŽReturn�code"*‹20‚MSGSTA�nnŽStatus�from�NTS�PB.(*‹21‚MSGRCODŽnnŽRetrun�code�from�NTS�PB.*‹22‚MSGSESVŽxxxxxxxxˆReserved-*‹26‚MSGLNAMŽnnnnnnnnnnnn„Local�name�from�NNT"*‹2A‚MSGLNAUŽnnŽLocal�NAU�from�NNT"*‹2B‚MSGLSIDŽxxŽSta�ID�-�local�NAU2*‹2C‚MSGRNAMŽnnnnnnnnnnnn„Remote�name�from�NTS�PB.'*‹32‚MSGRNAUŽnnŽRemote�NAU�from�NTS�PB. *´(NTSNAM+4)'*‹33‚MSGRSIDŽnnŽRemote�SID�from�NTS�PB. *´(NTSNAM+5)*** ŠXDEFƒNWMGSSC-NWMGSSCƒTR0.GTFRBF�GetŒbuffer�from�free�queue'ŠBEQ.S‚NWMG04�Branch�if�buffer�returned/ŠMOVE.L�#NTSRNOB,D0ˆERROR�-�no�buffer�available ŠRTS—RETURN*3NWMG04„LEA„SDDDAT(A0),A1†Message�area�within�buffer**ˆBuild�TH�and�RH*)ŠCLR.L‚THB1(A1)‹Clear�Transmission�Header)ŠMOVE.B�#THB1FMT,THB1(A1)‚Set�format�code5ŠBSETƒ#THB1FS,THB1(A1)ƒThis�is�1st�segment�of�message6ŠBSETƒ#THB1LS,THB1(A1)ƒThis�is�last�segment�of�message%ŠMOVE.B�#SSCNAU,THDAF(A1)‚Destination ŠMOVE.B�#SSCNAU,THOAF(A1)‚Origin-ŠCLR.W‚THSEQ(A1)ŠNO�sequence�for�this�message=ŠMOVE.B�#RHCATNC,RHCAT(A1)�Catagory�is�'from�network�control'2ŠCLR.B‚RHB1(A1)‹Clear�Req/Resp�field�-�for�request$ŠCLR.W‚RHB2(A1)‹Clear�reserved�field*$*ˆSet�required�fields�in�SDLC�header*$ŠCLR.B‚SDDSTS(A0)‰Clear�error�status'ŠMOVE.W�#MSGSIZ,SDDBCT(A0)�Message�size'ŠMOVE.B�NNTHSID(A5),D7…Local�Station�ID-ŠMOVE.B�D7,SDDSEC(A0)†Use�Local�SID�in�header*/ŠMOVE.L�#'.NTS',MSGID(A1)‚Message�ID�-�from�NTS@ŠMOVE.L�NTSCMD(A4),MSGCMD(A1)�CMD,�LCC�and�opts�from�param�block/ŠBSETƒ#7,MSGCMD(A1)†Set�hi�bit�for�new�CMD�code>ŠMOVE.W�NTSSTA(A4),MSGSTA(A1)�Status�and�RCOD�from�param�block:ŠMOVE.L�NNTNAM(A2),MSGLNAM(A1)�Local�Network�Name�from�NNT>ŠMOVE.W�NNTNAM+4(A2),MSGLNAM+4(A1)�Local�Network�Name�from�NNT9ŠMOVE.W�NNTNAU(A2),MSGLNAU(A1)�Local�NAU�and�SID�from�NNT=ŠMOVE.B�NNTSTAT(A2),MSGOPT(A1)�Save�NNT�status�in�Msg�options<ŠMOVE.L�NTSNAME(A4),MSGRNAM(A1)�Remote�name�from�param�block@ŠMOVE.W�NTSNAME+4(A4),MSGRNAM+4(A1)�Remote�name�from�param�block?ŠMOVE.W�NTSNAME+6(A4),MSGRNAU(A1)�Remote�NAU�and�SID�(if�there)%ŠCLR.L‚D0‘Clear�for�successful�returnŠRTSŠPAGE*E*ˆSubroutine�to�link�data�buffer�into�LCT's�'Receive�buff�in�Q'�chain7*‹(also�get�here�as�continuation�of�NWMSGSC�subroutine)*?*ˆOn�entry:�A5�=�Pointer�to�LCT�entryƒA2=Pointer�to�data�buffer*%*ˆOn�exit:‚A0�is�used�in�chain�search*’D0�=�0�(always�good�return)* ŠXDEFƒNWLNKBQ8NWLNKBQƒLEA„LCTRWTBF-SDDLNK(A5),A0�Start�of�buffer�chain/NWBQ06„MOVE.L�SDDLNK(A0),D0†Next�buffer�address$ŠBEQ.S‚NWBQ08�Branch�if�end�of�chain#ŠMOVE.L�D0,A0ŽUpdate�buffer�address!ŠBRA„NWBQ06�Loop�back�to�find�end6NWBQ08„CLR.L‚SDDLNK(A2)‰Clear�link�field�in�new�buffer-ŠMOVE.L�A2,SDDLNK(A0)†Add�new�buffer�to�chain0ŠBSETƒ#LCTARBFQ,LCTRSTA(A5)�Set�'buff�in�Q'�flagŠBTSTƒ#0,SDDRSP(A2)†'I'�frame?ŠBNE.S‚NWBQ08.5‹Branch�if�no6 )ŠBTSTƒ#THB1LS,THB1(A1)ƒLast�segment?�SCB. ŠBEQ.S‚NWBQ09�Branch�if�no.�SCB.@NWBQ08.5‚ADD.W‚#1,LCTMCNT(A5)…Bump�complete�message�counter�SCB.%NWBQ09„CLR.L‚D0‘Clear�for�good�returnŠRTSŠPAGE*4*ˆSubroutine�to�find�NAT�entry�given�Network�Address*)*ˆOn�entry:�D6�bits�7-0�=‚Network�Address*$*ˆOn�exit:‚A3�=�Pointer�to�NAT�entry*’A5�=�Pointer�to�NAT�table7*’D0�=�0�if�good�return‡D0�=�error�code�entry�not�found* ŠXDEFƒNWFNAT6NWFNAT„MOVE.L�NATBEG,A5ŠStart�of�Network�Address�Table ŠCLR.L‚D0ŠMOVE.B�D6,D0ŽNetwork�Address"ŠSUB.L‚#1,D0ŽAddress�-�1�=�entry�#5ŠMULUƒ#NATESIZ,D0ˆentry�#�*�entry�size�=�entry�offset%ŠLEA„NATENTRY(A5,D0),A3�Entry�address+ŠBTSTƒ#NATSACT,NATSTAT(A3)�Is�entry�active?ŠBEQ.S‚NWFN08�Branch�if�NO+NWFN02„CLR.L‚D0‘Clear�for�successful�return ŠRTS—RETURN*6NWFN08„MOVE.L�#NTSRTNAU,D0‡ERROR�-�NAT�entry�not�found ŠRTS—RETURNŠPAGE*D*ˆSubroutine�to�find�LCT�entry�given�OAF�(remote�NAU)�and�remote�SID+*’have�pointer�to�DAF�(local�NAU)�NAT�entry*D*ˆOn�entry:�D7�bits�7-0�=�remote�SID,�D6�bits�7-0�=�OAF�(remote�NAU))*’A3�=�Pointer�to�NAT�entry�for�local�NAU*$*ˆOn�exit:‚A5�=�Pointer�to�LCT�entry$*’A0�=�Pointer�to�previous�LCT�entry7*’D0�=�0�if�good�return‡D0�=�error�code�entry�not�found* ŠXDEFƒNWFLCTANWFLCT„LEA„NATLCTLK-LCTLULNK(A3),A5�1st�entry�pointer�in�LU�chain/NWFL02„MOVE.L�A5,A0ŽSave�previous�entry�pointer1ŠMOVE.L�LCTLULNK(A5),D0„Next�entry�in�active�list%ŠBEQ.S‚NWFL08�Branch�if�no�more�existŠMOVE.L�D0,A5ŽLCT�entry�address3ŠCMP.B‚LCTRMSID(A5),D7„Look�for�matching�station�IDŠBNE„NWFL02�Branch�if�no�match8ŠCMP.B‚LCTRMNAU(A5),D6„Look�for�matching�network�address%ŠBNE„NWFL02�Branch�to�continue�search%ŠCLR.L‚D0‘Clear�for�successful�return ŠRTS—RETURN*6NWFL08„MOVE.L�#NTSRILCC,D0‡ERROR�-�LCT�entry�not�found ŠRTS—RETURNŠPAGE*?*ˆSubroutine�to�find�LCT�entry�given�LCC�(Logical�Connect�Code)'*’have�pointer�to�local�NAU's�NAT�entry*/*ˆOn�entry:�A4�=�Pointer�to�NTS�parameter�block)*’A3�=�Pointer�to�NAT�entry�for�local�NAU*-*ˆOn�exit:‚A5�=�Pointer�to�LCT�entry�if�found7*’D0�=�0�if�good�return‡D0�=�error�code�entry�not�found* ŠXDEFƒNWFNLCCBNWFNLCCƒLEA„NATLCTLK-LCTLULNK(A3),A5�1st�entry�pointer�in�LU�chain)ŠMOVE.B�NTSLCC(A4),D1†Get�LCC�for�compare7NWFC02„MOVE.L�LCTLULNK(A5),D0„Next�entry�in�active�list%ŠBEQ.S‚NWFC08�Branch�if�no�more�existŠMOVE.L�D0,A5ŽLCT�entry�address,ŠCMP.B‚LCTLOLCC(A5),D1„Look�for�matching�LCCŠBNE„NWFC02�Branch�if�no�match%ŠCLR.L‚D0‘Clear�for�successful�return ŠRTS—RETURN*6NWFC08„MOVE.L�#NTSRILCC,D0‡ERROR�-�LCT�entry�not�found ŠRTS—RETURN*@*ˆSubroutine�to�find�LCT�entry�given�Network�Name(of�remote�NAU)'*’have�pointer�to�local�NAU's�NAT�entry*G*ˆOn�entry:�D4�=�1st�4�characters�of�name‚D5�(bits�15-0)�=�last�2�chars)*’A3�=�Pointer�to�NAT�entry�for�local�NAU*-*ˆOn�exit:‚A5�=�Pointer�to�LCT�entry�if�found$*’A0�=�Pointer�to�previous�LCT�entry7*’D0�=�0�if�good�return‡D0�=�error�code�entry�not�found* ŠXDEFƒNWFNLCNBNWFNLCNƒLEA„NATLCTLK-LCTLULNK(A3),A5�1st�entry�pointer�in�LU�chain8NWFCN02ƒMOVE.L�LCTLULNK(A5),D0„Next�entry�in�active�list&ŠBEQ.S‚NWFCN08ŒBranch�if�no�more�exist!ŠMOVE.L�A5,A0ŽSave�previous�entryŠMOVE.L�D0,A5ŽLCT�entry�address-ŠCMP.L‚LCTRMNAM(A5),D4„Look�for�matching�nameŠBNE„NWFCN02ŒBranch�if�no�match/ŠCMP.W‚LCTRMNAM+4(A5),D5‚Look�for�matching�name ŠBNE„NWFCN02%ŠCLR.L‚D0‘Clear�for�successful�return ŠRTS—RETURN*/NWFCN08ƒMOVE.L�#NTSRINAM,D0‡LCT�entry�not�found ŠRTS—RETURNŠPAGE*<*ˆSubroutine�to�return�DISCONNECTed�NNT�entries�to�Free�list7*Š(also�returns�associated�NAT�entry�to�it's�Free�list)*G*ˆOn�entry:�A2�=�Pointer�to�one�NNT�entry�-�find�others�w.�same�NAU&SID*=*ˆOn�exit:‚A5�=�Pointer�to�NNT�table�(A4,A3�and�A2�unchanged)*’A1,�A0,�D1�and�D0�destroyed* ŠXDEFƒNWFRNNT.NWFRNNTƒMOVE.L�NNTNAT(A2),D0†NAT�entry�address%ŠBEQ.S‚NWFRN06ŒBranch�if�no�NAT�entry(ŠMOVE.L�D0,A1ŽSave�address�to�search�for$ŠMOVE.L�NATBEG,A5ŠStart�of�NAT�table7 2ŠLEA„NATAHDR-NATNEXT(A5),A0�Start�of�'active'�list5NWFRN02ƒMOVE.L�NATNEXT(A0),D0…Is�there�another�entry?$ŠBEQ.S‚NWFRN06ŒBranch�if�end-of-list'ŠCMP.L‚A1,D0ŽIs�'next'�the�one�we�want?ŠBEQ.S‚NWFRN04ŒBranch�if�YESŠMOVE.L�D0,A0ŽNext�entry(ŠBRA.S‚NWFRN02ŒBranch�to�continue�search*&NWFRN04ƒCLR.W‚NATSTAT(A1)ˆClear�status9ŠMOVE.L�NATNEXT(A1),NATNEXT(A0)�Remove�from�'active'�list2ŠMOVE.L�NATFHDR(A5),NATNEXT(A1)�Add�to�'free'�list0ŠMOVE.L�A1,NATFHDR(A5)…Update�'free'�list�header*+NWFRN06ƒMOVE.L�NNTBEG,A5ŠStart�of�NNT�table2ŠMOVE.W�NNTNAU(A2),D1†Network�Address�&�Station�ID1ŠLEA„NNTAHDR-NNTNEXT(A5),A1�Start�of�table�search4NWFRN08ƒMOVE.L�A1,A0ŽA0�is�address�of�previous�entry6NWFRN09ƒMOVE.L�NNTNEXT(A0),D0…does�'next'�entry�exist?ŠBNE.S‚NWFRN10ŒBranch�if�YES ŠRTS—RETURN0NWFRN10ƒMOVE.L�D0,A1ŽA1�is�current�entry�address$ŠCMP.W‚NNTNAU(A1),D1†Same�NAU�&�SID?ŠBNE„NWFRN08ŒBranch�if�NOŠCLR.L‚NNTSTAT(A1)ˆClear�status9ŠMOVE.L�NNTNEXT(A1),NNTNEXT(A0)�Remove�from�'active'�list2ŠMOVE.L�NNTFHDR(A5),NNTNEXT(A1)�Add�to�'free'�list0ŠMOVE.L�A1,NNTFHDR(A5)…Update�'free'�list�header&ŠBRA„NWFRN09ŒBranch�to�continue�searchŠPAGE*<*ˆSubroutine�to�return�DISCONNECTed�LCT�entries�to�Free�list*@*ˆOn�entry:�A3�=�Pointer�to�NAT�entry�containing�LCT�entry�chain'*’A5�=�Pointer�to�LCT�entry�to�be�freed**ˆOn�exit:‚A5�=�00*’D0�and�A0‚used‚-�all�other�registers�unchanged* ŠXDEFƒNWFRLCT0NWFRLCTƒBTSTƒ#LCTCSSCT,LCTCSTA(A5)�Is�this�SSCT?$ŠBNE.S‚NWFRL06ŒNever�free�SSCT�entry)ŠBTSTƒ#LCTCSNWC,LCTCSTA(A5)�Is�this�NWCT?$ŠBNE.S‚NWFRL06ŒNever�free�NWCT�entry*%*�Range�check�this�LCTŽ*�2/28/83�SCB.(ŠMOVE.L�LCTBEG,A0ŠPointer�to�LCT�header.8ŠCMP.L‚A0,A5ŽMake�sure�what�we�think�is�LCT�is�in�range.(ŠCRASH.LO�*+1ŽCrash�if�address�too�small ŠMOVE.L�A0,D0/ŠADD.L‚LCTTSIZ(A0),D0…Point�to�end�of�LCT�table9ŠSUB.L‚#LCTESIZ,D0ˆLast�entry�cannot�be�greater�than�this!ŠCMP.L‚D0,A5ŽAre�we�out�of�range.ŠCRASH.HI�*+1ŽCrash�if�yes#*�End�of�range�check�*�2/28/83�SCB.*ŠMOVE.L�LCTBEG,A07NWFRL01ƒLEA„NATLCTLK-LCTLULNK(A3),A0�Start�of�LCT�chain6NWFRL02ƒMOVE.L�LCTLULNK(A0),D0„Is�there�another�entry?$ŠBEQ.S‚NWFRL06ŒBranch�if�end-of-list'ŠCMP.L‚A5,D0ŽIs�'next'�the�one�we�want?ŠBEQ.S‚NWFRL04ŒBranch�if�YESŠMOVE.L�D0,A0ŽNext�entry(ŠBRA.S‚NWFRL02ŒBranch�to�continue�search*BNWFRL04ƒMOVE.L�LCTLULNK(A5),LCTLULNK(A0)�Remove�from�'active'�list$ŠMOVE.L�LCTBEG,A0ŠStart�of�LCT�table2ŠMOVE.L�LCTFHDR(A0),LCTNEXT(A5)�Add�to�'free'�list0ŠMOVE.L�A5,LCTFHDR(A0)…Update�'free'�list�headerŠLEA„0,A5�Clear�the�registerNWFRL06ƒRTS—RETURNŠPAGE*1*ˆSubroutine�to�find�end�of�parameter�block�chain9*‹(will�look�for�duplicate�parameter�block�along�the�way)*D*ˆOn�entry:�A0‚Points�to�head�of�chain�(LEA�chainhed-NTSNEXT(Ax),A0))*’A4‚Points�to�NTS�or�NTC�parameter�block*+*ˆOn�exit:‚A0‚Points�to�last�entry�in�chain6*’D2�=�Pointer�to�entry�preceeding�1st�'recv-from-any'3*—(needed�by�NTSRECV�to�link�in�non�'recv-from-any'4*’D0�=�0�if�good�return‡D0�=�error�code�if�duplicate*?*ˆBefore�calling�routine,�head�of�chain�pointer�set�as�follows:*’LEA‚Chainhd-NTSNEXT(Ax),A0:*ˆOn�return,�param�block�saved�on�end�of�chain�as�follows:*’CLR.L‚NTSNEXT(A4)*’MOVE.L�A4,NTSNEXT(A0)* ŠXDEFƒNWLNKPB"NWLNKPBƒCLR.L‚D0‘Clear�return�code5NWPB02„MOVE.L�NTSNEXT(A0),D1…Next�param�block�address$ŠBEQ.S‚NWPB08�Branch�if�end�of�chain(ŠMOVE.L�D1,A0ŽUpdate�param�block�address*ŠCMP.L‚A0,A4ŽCompare�param�block�addresses#ŠBNE„NWPB02�Loop�back�if�no�compare2ŠMOVE.L�#NTSRPBLK,D0‡ERROR�-�duplicate�param�block!ŠBRA„NWPB02�Loop�back�to�find�end!NWPB08„TST.L‚D0‘Set�CC�for�return ŠRTS—RETURNŠPAGE*=*ˆSubroutine�to�set�'Listen�Active'�status�in�all�NNT�entries=*Šfor�NAU�identified�by�Network�Address�and�SID�one�NNT�entry*F*ˆOn�entry:�A2�=�Pointer�to�one�NNT�entry�-�find�NNT's�w.�same�NAU&SID*$*ˆOn�exit:‚A5�=�Pointer�to�NNT�table*’A2�=�Pointer�to�one�NNT�entry*’A0,D1�and�D0�used* ŠXDEFƒNWSETLA8NWSETLAƒMOVE.W�NNTNAU(A2),D1†Get�NAU�and�SID�for�compare7 -ŠMOVE.L�NNTBEG,A5ŠStart�of�Network�Name�Table1ŠLEA„NNTAHDR-NNTNEXT(A5),A0�Start�of�table�search6NWSLA02ƒMOVE.L�NNTNEXT(A0),D0…does�'next'�entry�exist?ŠBEQ.S‚NWSLA06ŒBranch�if�NO)ŠMOVE.L�D0,A0ŽA2�is�current�entry�address$ŠCMP.W‚NNTNAU(A0),D1†Same�NAU�&�SID?ŠBNE„NWSLA02ŒBranch�if�NO/ŠBSETƒ#NNTSLACT,NNTSTAT(A0)�Set�'Listen�Active'&ŠBRA„NWSLA02ŒBranch�to�continue�search*NWSLA06ƒRTS—RETURNŠPAGE*?*ˆSubroutine�to�clear�'Listen�Active'�status�in�all�NNT�entries=*Šfor�NAU�identified�by�Network�Address�and�SID�one�NNT�entry*F*ˆOn�entry:�A2�=�Pointer�to�one�NNT�entry�-�find�NNT's�w.�same�NAU&SID*$*ˆOn�exit:‚A5�=�Pointer�to�NNT�table*’A2�=�Pointer�to�one�NNT�entry*’A0,D1�and�D0�used* ŠXDEFƒNWCLRLA8NWCLRLAƒMOVE.W�NNTNAU(A2),D1†Get�NAU�and�SID�for�compare-ŠMOVE.L�NNTBEG,A5ŠStart�of�Network�Name�Table1ŠLEA„NNTAHDR-NNTNEXT(A5),A0�Start�of�table�search6NWCLA02ƒMOVE.L�NNTNEXT(A0),D0…does�'next'�entry�exist?ŠBEQ.S‚NWCLA06ŒBranch�if�NO)ŠMOVE.L�D0,A0ŽA2�is�current�entry�address$ŠCMP.W‚NNTNAU(A0),D1†Same�NAU�&�SID?ŠBNE„NWCLA02ŒBranch�if�NO1ŠBCLRƒ#NNTSLACT,NNTSTAT(A0)�Clear�'Listen�Active'&ŠBRA„NWCLA02ŒBranch�to�continue�search*NWCLA06ƒRTS—RETURNŠPAGE*:*ˆSubroutine�to�set�'Disconnect'�status�in�all�NNT�entries=*Šfor�NAU�identified�by�Network�Address�and�SID�one�NNT�entry*F*ˆOn�entry:�A2�=�Pointer�to�one�NNT�entry�-�find�NNT's�w.�same�NAU&SID*$*ˆOn�exit:‚A5�=�Pointer�to�NNT�table*’A2�=�Pointer�to�one�NNT�entry*’A0,D1�and�D0�used* ŠXDEFƒNWSETDC8NWSETDCƒMOVE.W�NNTNAU(A2),D1†Get�NAU�and�SID�for�compare-ŠMOVE.L�NNTBEG,A5ŠStart�of�Network�Name�Table1ŠLEA„NNTAHDR-NNTNEXT(A5),A0�Start�of�table�search6NWSDC02ƒMOVE.L�NNTNEXT(A0),D0…does�'next'�entry�exist?ŠBEQ.S‚NWSDC06ŒBranch�if�NO)ŠMOVE.L�D0,A0ŽA2�is�current�entry�address$ŠCMP.W‚NNTNAU(A0),D1†Same�NAU�&�SID?ŠBNE„NWSDC02ŒBranch�if�NO,ŠBSETƒ#NNTSDISC,NNTSTAT(A0)�Set�'Disconnect')ŠBCLRƒ#NNTSACT,NNTSTAT(A0)�Clear�'Active'1ŠBCLRƒ#NNTSLACT,NNTSTAT(A0)�Clear�'Listen�Active'&ŠBRA„NWSDC02ŒBranch�to�continue�search*NWSDC06ƒRTS—RETURNŠPAGE*:*ˆSubroutine�to�build�new�LCT�entry�when�CONNECT�initiated*@*ˆOn�entry:�A4�=�Pointer�to�parameter�block�-�name�of�target�NAU2*’A3�=�Pointer�to�NAT�entry�-�info�about�local�NAU*(*ˆOn�exit:‚A5�=�Pointer�to�new�LCT�entry*’A2�=�Pointer�to�one�NNT�entry*’A0,�A1�and�D0�used*ŠXDEFƒNWBLDLCT;NWBLDLCT‚MOVE.L�LCTBEG,A0ŠStart�of�Logical�Connection�Table+ŠTST.L‚LCTFHDR(A0)ˆ*�2/28/83�SCB.�Test�link1ŠCRASH.EQ�*+1Ž*�2/28/83�SCB.�Crash�if�no�entries.%ŠMOVE.L�LCTFHDR(A0),A5…1st�free�entry*!* Range check on LCT 2/28/83 SCB. ŠCMP.L‚A0,A5,ŠCRASH.LO�*+1ŽCrach�if�this�LCT�out�of�range ŠMOVE.L�A0,D0ŠADD.L‚LCTTSIZ(A0),D0ŠSUB.L‚#LCTESIZ,D0 ŠCMP.L‚D0,A5,ŠCRASH.HI�*+1ŽCrash�if�this�LCT�out�of�range* End of range check*5ŠMOVE.L�LCTNEXT(A5),LCTFHDR(A0)�Remove�from�free�list!ŠMOVE.L�A5,A0ŽEntry�start�address%ŠLEA„LCTESIZ(A0),A1…Entry�end�address&NWBLL04ƒCLR.W‚(A0)+ŽClear�entire�entryŠCMP.L‚A0,A1ŽAt�end�yet?ŠBGT„NWBLL04ŒLoop�back�if�NO*0ŠMOVE.L�NATTCB(A3),LCTLOTCB(A5)�Save�TCB�address+ŠMOVE.W�NATNAU(A3),LCTLONAU(A5)�NAU�and�SID0ŠMOVE.L�NTSNAME(A4),LCTRMNAM(A5)�Remote�NAU�name4ŠMOVE.W�NTSNAME+4(A4),LCTRMNAM+4(A5)�Remote�NAU�name*0ŠLEA„NATLCTLK-LCTLULNK(A3),A0�Start�of�LCT�chain8NWBLL08ƒMOVE.L�LCTLULNK(A0),D0„Is�this�the�end�of�chain?ŠBEQ.S‚NWBLL10ŒBranch�if�YESŠMOVE.L�D0,A0ŽNext�entry&ŠBRA„NWBLL08ŒBranch�to�continue�searchNWLODSCƒBTSTƒ#LCTCSRCV,LCTCSTA(A5)�Is�status�=�'CONN�recv'd'�?ŠBNE.S‚NWLDS30ŒBranch�if�YES6ŠBTSTƒ#LCTCSDSC,LCTCSTA(A5)�Is�status�=�'DISCONNECT'�?ŠBNE„NWLDS40ŒBranch�if�YES*;*ˆFree�any�waiting�buffers�-�may�need�them�to�send�messages*,ŠMOVE.L�LCTRWTBF(A5),D0„Any�buffers�waiting?ŠBEQ.S‚NWLDS06ŒBranch�if�NO4ŠBCLRƒ#LCTARBFQ,LCTRSTA(A5)�Reset�'buff-in-q'�status*ŠMOVE.L�D0,A0ŽReturn�buffers�to�free�QueueŠCLR.L‚LCTRWTBF(A5)2ŠCLR.W‚LCTMCNT(A5)ˆClear�outstanding�message�count ŠTR0.PTFRML*'*ˆConnection�is�ACTIVE�--�Disconnect�it*7NWLDS06ƒMOVEM.L�A3/A5,-(A7)‡Save�LCT�entry�to�use�later0ŠMOVE.L�NNTBEG,A5ŠStart�of�NNT�-�for�msg�builder3ŠMOVE.L�NATNNT(A3),A2†Set�NNT�entry�for�msg�builder$ŠBSR„NWMGSSCŒPrepare�message�for�SSC$ŠBEQ.S‚NWLDS10ŒBranch�if�good�returnŠLEA„NATANYLK-NTSNEXT(A3),A4�Pointer�to�1st�'recv-from-any'�pb"ŠBSR„NWFREPBŒFree�all�param�blocks)ŠCLR.L‚NATANYLK(A3)‡Clear�initial�pointerŠMOVE.L�(A7)+,A4‹Restore�A4$ŠBRA„NWCN08�Go�check�remaining�LCT'sŠPAGE*-*ˆSubroutine�to�Cancel�an�NAU's�LISTEN�status&*ŠSend�message�to�primary�if�secondary*%*ˆOn�entry:�A3�=�Pointer�to‚NAT�entry%*’A4�=�Pointer�to‚NTS�parameter�block*’D6�=�Reason�code�for�cancel**ˆOn�exit:‚A3�and�A4�preserved*’D6,�D7�Destroyed*’A0,�A1,�A2,�A5�Destroyed7*’D0�=�0�if�good�return‡D0�=�error�code�no�buffer�avail* ŠXDEFƒNWLSTC *v********>*NWLSTC:„{Subroutine�to�cancel�an�NAU's�listen�status�and�send#*Œmessage�to�primary�if�secondary.}*2*‹IF�'connect�waiting'�set�in�NAT�entry�(NATSCONW)G*NWLSC08:ƒTHEN‚IF�something�linked�to�this�NAT's�listen/connect-receive*‘queue�(NATLCNLK).8*‘THEN‚Unlink�the�NTS�parameter�block�from�NAT's�listen/*—connect-receive�queue.0*—Set�'transaction�complete'�in�NTS�P.B.�status.)*—If�NAT�flags�indicate�'listen'�in�queue$*—THEN‚Set�return�code�into�NTS�P.B.&*�Wakeup�task�via�NWSIGNAL�subroutine.*�GOTO‚NWLSC08.8*NWLSC10:�ELSE‚{Called�from�System�Service�Control�Task})*�Set�error�'listen�not�active'�#NTSRILIS!*�($10)�into�NTC�parameter�block.,*�Remove�LCT�entry�(if�any)�from�LCT�queue�-$*�(LCTLULNK)�and�put�into�free�list.*�GOTO‚NWLSC08.9 C*NWLSC14:‰ELSE‚{Nothing�linked�to�this�NAT's�listen/connect-receive *—queue.}8*—IF�SSCT�waiting�(bit�#NATSCONW�set�in�NAT�entry�status*—THEN‚Wakeup�SSCT.*—GOTO‚NWLSC20.7*NWLSC20:ƒELSE‚{'connect�waiting'�NOT�set�in�NAT�entry}9*‘IF�'listen-waiting'�NOT�set�OR�no�task�attached�to�this*‘NAT9*‘THEN‚Clear�'listen�wait'�and�'listen�active'�bit�in�NAT*—entry.1*—Clear�'listen�active'�bit�in�all�associated�NNT *—entries.(*—Clear�listen/connect�pointer�NATLCNLK.*—IF�this�is�secondary�station4*—THEN‚Send�message�to�SSCT�so�it�can�inform�primary *�station.*NWLSC22:�Return�successfully.*‘ELSE‚GOTO�NWLSC08: *^*********(*ˆAre�any�LISTEN's�or�CONNECT's�waiting?*7NWLSTC„BTSTƒ#NATSCONW,NATSTAT(A3)�Is�'Connect'�waiting?ŠBNE.S‚NWLSC06ŒBranch�if�YES0ŠBTSTƒ#NATSLSTW,NATSTAT(A3)�Is�'Listen'�waiting?ŠBEQ„NWLSC20ŒBranch�if�NO(ŠTST.L‚NATTCB(A3)‰Does�task�still�exist?ŠBEQ.S‚NWLSC20ŒBranch�if�NO**ˆSend�Return�Codes�to�Waiters,*ˆFree�the�LCT�entry�associated�with�CONNECT*+NWLSC06ƒMOVE.L�LCTBEG,A2ŠStart�of�LCT�table0NWLSC08ƒMOVE.L�NATLCNLK(A3),D0„Does�entry�exist?ŠBEQ.S‚NWLSC14ŒBranch�if�NO%ŠMOVE.L�D0,A1ŽParameter�block�address1ŠMOVE.L�NTSNEXT(A1),NATLCNLK(A3)�Update�link�head3ŠBSETƒ#NTSSTC,NTSSTA(A1)�Set�'transaction-complete'/ŠBTSTƒ#NATSLSTW,NATSTAT(A3)�Is�this�a�'Listen'?ŠBEQ.S‚NWLSC10ŒBranch�if�NO&ŠMOVE.B�D6,NTSRCOD(A1)…Set�Return�code ŠEXG„A1,A4ŽSIGNAL�wants�pb�in�A4,ŠMOVE.L�NATTCB(A3),A0†SIGNAL�wants�TCB�in�A0 ŠBSR„NWSIGNALŠEXG„A1,A4ŽReturn�pb�to�A1#ŠBRA„NWLSC08ŒLoop�back�for�the�rest*8NWLSC10ƒMOVE.B�#NTSRILIS,NTCXRCOD(A4)�Return�code�to�SSC&ŠMOVE.B�NTCRNAU(A1),D6…Network�Address!ŠMOVE.B�NTCRSID(A1),D7…Station�IDŠBSR„NWFLCT�Go�find�LCT%ŠBNE„NWLSC08ŒBranch�back�if�not�found?ŠMOVE.L�LCTLULNK(A5),LCTLULNK(A0)�Remove�entry�from�active�list9ŠMOVE.L�LCTFHDR(A2),LCTLULNK(A5)�Put�entry�in�'free'�list+ŠMOVE.L�A5,LCTFHDR(A2)…Update�'free'�header#ŠBRA„NWLSC08ŒLoop�back�for�the�rest*"*ˆWakeup�SSCT�if�CONNECT�cancelled*3NWLSC14ƒBCLRƒ#NATSCONW,NATSTAT(A3)�Is�SSCT�waiting?ŠBEQ.S‚NWLSC20ŒBranch�if�NOŠMOVE.L�NATBEG,A5ŠStart�of�NNT*ŠMOVE.L�#SSCNAU-1,D0‡SSC's�Network�address.ŠMULUƒ#NATENTRY,D0‡*�entry�size�=�entry�offset'ŠLEA„NATENTRY(A5,D0),A0�SSC's�NAT�entryŠMOVE.L�NATTCB(A0),A0†SSC's�TCB ŠTR0$.WAKEUP*(*ˆClear�Listen�status�in�all�NNT�entries*:NWLSC20ƒBCLRƒ#NATSLSTW,NATSTAT(A3)�Clear�'listen-wait'�bit3ŠBCLRƒ#NATSLACT,NATSTAT(A3)�Clear�'listen-actv'�bit.ŠMOVE.L�NATNNT(A3),A2†Network�Name�Table�entry/ŠBSR„NWCLRLAŒClear�'listen-active'�in�all�NNT's*;*„Send�message�to�SSC�so�that�it�can�inform�Primary�station*0ŠCLR.L‚NATLCNLK(A3)‡Clear�Listen/Connect�pointer.ŠTST.B‚NATSID(A3)‰Is�this�the�primary�station?ŠBEQ.S‚NWLSC22ŒBranch�if�YES1ŠMOVE.L�NNTBEG,A5ŠSet�NNT�pointer�for�msg�routine;ŠMOVE.L�NATNNT(A3),A2†Set�NNT�entry�pointer�for�msg�routine$ŠBSR„NWMGSSCŒPrepare�message�for�SSC/ŠBNE.S‚NWLSC22ŒIf�not�0,�then�ERROR�-�no�buffer0ŠMOVE.L�MSGLNAU(A1),MSGRNAU(A1)�Set�Remote=Local(ŠMOVE.L�A0,A2ŽBuffer�address�for�TRAMOVB3ŠBSR„TRAMOVBŒAsk�transport�level�to�give�msg�to�SSCŠCLR.L‚D0‘Successful�return NWLSC22ƒRTS* * PATCH AREA ŠXDEFƒPATCH PATCH…DS.Bƒ50ééé: =/*=/*†NTS.SSCT.AF=/*-=/* Chain file to assemble module NTS.SSCT.SA=/*:=/* If no output argument is specified for the listing the*=/* chain file will default to NTS.SSCT.LS=/*=/IFC \1ƒ=ARG�NTS.SSCT.LS=/ENDIF=/*%=ASM NTS.SSCT.SA,NTS.SSCT.RO,\1;RZ=60=/*{ Included files are:=/*ƒ9995.&.TR1.EQ=/*ƒ9995.NTS.NTS.EQ=/*ƒ9995.NTS.TR1X.EQ=/*ƒ9995.NTS.NTC.EQ=/*ƒ9995.NTS.SMSG.EQ=/*ƒ9995.NTS.SSCT.EQ=/*}=/*=ENDéééééé8)SSCT†IDNTƒ1,0�System�Service�Control�Task(ŠTTL„SSCT.SAŒSystem�Service�Control�Task*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*B*„Performs�System�Service�Control�functions�for�Network�Services‚**Ä*F***********************************************************************)*ˆStarted�by�Network�Initializer‚-‚ININET* *ˆOn�Entry:*’D0�=�Station�ID*’A0�=�Task�Name*’A1�=�Operator�Device*’A3�=�Session**‰INCLUDE�9995.&.TR1.EQ*‰INCLUDE�9995.NTS.NTS.EQ*‰INCLUDE�9995.NTS.TR1X.EQ*‰INCLUDE�9995.NTS.NTC.EQ*‰INCLUDE�9995.NTS.SMSG.EQ*‰INCLUDE�9995.NTS.SSCT.EQŠINCLUDE�9995.&.TR1.EQŠINCLUDE�9995.NTS.NTS.EQŠINCLUDE�9995.NTS.TR1X.EQŠINCLUDE�9995.NTS.NTC.EQŠINCLUDE�9995.NTS.SMSG.EQŠINCLUDE�9995.NTS.SSCT.EQŠPAGE*v* SSCT documentation:*C* SSCT acts as a 'bus boy' passing network services system requestsJ*ƒ(e.g.�identify,�connect�etc.)�between�appropriate�modules�of�the�system.C*ƒAs�an�example�of�how�SSCT�works�in�conjunction�with�other�modulesK*ƒconsider�a�program�on�a�secondary�station�who�identifies�himself�(desiresE*ƒto�become�a�Network�Addressable�Unit�-�NAU).‚Before�the�transactionG*ƒcan�complete,�information�about�the�name�of�the�unit�must�pass�to�theH*ƒprimary�system,�get�entered�into�the�tables�there,�and�a�response�sent*ƒback�to�the�secondary.*A* Briefly stated, the passing of information would be as follows:*4*‚*�User�task�calls�NTSSERV�with�'identify'�request.**…*�NTSSERV�traps�to�NTSREQ.*>*ˆ*�NTSREQ�builds�preliminary�tables�sets�status�of�request�in7*Špending�state�and�sends�request�to�SSCT�on�secondary. *ŠNTSID02:B*Š-Set�'wait�for�transaction�to�complete'�bit�in�NTS�P.B.�of�user.!*Š-Build�N: NT�entry�and�NAT�entry.B*Š-Send�message�to�SSCT�on�secondary�(message�identifier�=�'.NTS',*‹send�code�=�$81).5*Š-Link�this�NTS�P.B.�onto�NNTNAT�(waiting�response).#*Š-Point�NTS�P.B.�to�new�NAT�entry.A;JER@Z@bGjEr;z8‚:Š6’JšB¢?ª2*Š-Set�#NNTSIPB�in�NNTSTAT�(parameter�block�here).*:*‚*�SSCT�reads�request�and�sends�it�on�to�SSCT�on�primary. *„NTSARTN:*„-Reads�message.8*„-Classifies�message�by�'.NTS'�identifier�and�$81�code.(*„-Moves�'.SSC'�into�message�identifier.7*„-Sends�message�as�special�command�to�SSCT�on�primary.*:*‚*�SSCT�on�primary�reads�request�and�sends�it�to�NTSSERV. *„SSCARTN:%*„-Reads�message�that�secondary�sent.8*„-Classifies�message�by�'.SSC'�identifier�and�$81�code.&*„-Issues�special�command�via�NTSSERV.**…*�NTSSERV�traps�to�NTSREQ.*$*ˆ*�NTSREQ�passes�request�to�NTCREQ. *ŠNTSR02:=*Š-Recognizes�that�this�is�an�NTCREQ�command�because�the�high-*‹order�bit�in�the�command�code�is�set�($81).*%*‹*�NTCREQ�updates�tables�on�primary. *�NTCIDN8:**�-Builds�new�entry�in�network�name�table.1*�-Sets�'transaction�complete'�in�SSCT's�NTS�P.B.*0*‚*�SSCT�on�primary�sends�response�to�secondary. *„SSCAR05:2*„-Returned�to�immediately�following�NTSSERV�call.%*„-Change�$81�command�to�$91�command.-*„-Move�P.B.�image�into�send�parameter�block.*„-Send�to�secondary.*>*‚*�SSCT�on�secondary�reads�response�and�sends�it�via�NTSSERV. *„SSCARTN:*„-Read�message.8*„-Classifies�message�by�'.SSC'�identifier�and�$91�code.6*„-Move�received�message�into�special�parameter�block.*„-Send�via�NTSSERV.**…*�NTSSERV�traps�to�NTSREQ.*$*ˆ*�NTSREQ�passes�request�to�NTCREQ. *ŠNTSR02:=*Š-Recognizes�that�this�is�an�NTCREQ�command�because�the�high-*‹order�bit�in�the�command�code�is�set�($91).*=*‹*�NTCREQ�finishes�updating�tables�on�secondary�and�notifies-*�user�task�that�his�transaction�is�complete. *�NTCIDN9:1*�-Put�return�code�into�original�callers�NTS�P.B.!*�-IF�return�code�indicates�error*ŽTHEN*‘Release�NNT�and�NAT�entries.*ŽELSE*‘Save�NAT�address�in�NNT.*‘Set�NNT�status�=�active.*‘Point�TCB�to�NAT.4*�-Set�'transaction�complete'�into�caller's�NTS�P.B.*�-Wakeup�caller.**^ŠPAGE ŠSECTION�14ŠOPT„PCSŠXREFƒNTSSERV,OUTTERM* ŠXDEFƒSSCT SSCT†MOVE.L�A0,D1ŽSave�task�nameŠMOVE.L�A3,D2ŽSave�session"ŠMOVE.L�A1,D3ŽSave�operator�deviceŠMOVE.L�D0,D4ŽSave�station�ID&ŠERQ.GTSEG�GETDPB(PC)†Get�data�segment#ŠBEQ.S‚SSCT2ŽBranch�if�good�segmentŠERRMESG%GETDPB„DC.Lƒ0,0�Task,Session�(0=Self) ŠDC.Wƒ$2000,0ŒLogical�=�PhysicalŠDC.Lƒ'DATA',0‹Segment�nameŠDC.LƒDATAENDŒLength**ˆClear�DATA�Segment*CLEAR…CLR.L‚(A0)+ŽClear�4�bytesŠCMP.L‚A0,A1Žat�end�yet?ŠBGT„CLEARŽbranch�in�NOŠRTS*6SSCT2…MOVE.L�A0,A6ŽStart�of�DATA�segment�(A6=base�reg)#ŠLEA„STACK(A6),A7‡Set�Stack�PointerŠMOVE.L�A7,A0ŽClear�above�stack'ŠLEA„DATAEND(A6),A1…End�of�DATA�segmentŠBSR„CLEARŽClear�entire�segment3ŠMOVEM.L�D1-D4,TASKN(A6)ƒSave�entry�register�valuesŠPAGE"*ˆInitialize�Receive�Area�Pointers*-SSCT30„CLR.L‚WAITQHD(A6)ˆClear�head�of�Wait�QŠMOVE.L�#NUMRCV-1,D7‡#�ENTRIES*ŠLEA„RCVBLK(A6),A0†Parameter�block�address0SSCT32„MOVE.W�#-1,NTSSTA(A0)…Status='pb�is�free')ŠLEA„RCVBUF(A0),A1†Message�buffer�address#ŠMOVE.L�A1,NTSSAD(A0)†Save�it�in�pbŠCLR.L‚RCVNEXT(A0)ˆClear�Q�link4ŠLEA„RCVBKSZ(A0),A0…Add�block�size�-�next�pb�address"ŠDBRAƒD7,SSCT32ŠLoop�back�for�next*!ŠBSR„SRTRCV�Issue�'recv'�commands**ˆInitialize�Send�Area*#ŠMOVE.L�#NUMSND-1,D7‡Pointer�offset*ŠLEA„SNDBLK(A6),A0†Parameter�block�address0SSCT34„MOVE.W�#-1,NTSSTA(A0)…Status='pb�is�free')ŠLEA„SNDBUF(A0),A1†Message�buffer�address#ŠMOVE.L�A1,NTSSAD(A0)†Save�it�in�pbŠCLR.L‚SNDNEXT(A0)ˆClear�Q�link4ŠLEA„SNDBKSZ(A0),A0…Add�block�size�-�next�pb�address"ŠDBR; AƒD7,SSCT34ŠLoop�back�for�next*5*ˆInitialize�Special�Command�Parameter�Block�Pointers*$ŠMOVE.L�#NUMSPEC-1,D7†Pointer�offset+ŠLEA„SPECBLK(A6),A0…Parameter�block�address0SSCT36„MOVE.W�#-1,NTSSTA(A0)…Status='pb�is�free' ŠCLR.L‚SPECNEXT(A0)‡Clear�Q�link5ŠLEA„SPECBKSZ(A0),A0„Add�block�size�-�next�pb�address"ŠDBRAƒD7,SSCT36ŠLoop�back�for�nextŠPAGE&*ˆMain�Loop�-�Look�for�something�to�do*v:*�SSCMAIN:‚Issue�TRAP�#1,�directive�-3�to�scan�user�queue. * SSCM04:?*�SSCM06:ƒIF�there�is�another�parameter�block�on�the�wait�queue*‹THEN5*ŽIF�transcation�for�this�parameter�block�is�complete*ŽTHEN2*‘Remove�this�parameter�block�from�the�wait�queue.**‘IF�this�was�a�special�command�(code�<�0)*‘THEN*”GO�TO�NTCSPEC*‘ELSE'*”IF�the�return�code�indicates�an�error*”THEN-*—GOTO�ERRORMG‚{Eventually�returns�to�SSCM06}*”ELSE*—IF�command�was�'send'*—THEN'*�SSCM10:’Flag�parameter�block�as�free.*šGOTO�SSCM06.*—ELSE'*šGOTO�SSCM12�{assume�it�was�a�receive}*ŽELSE6*‘Post�all�receives�via�BSR�SRTRCV�-�This�routine�will:*‘examine�all�of�the�receive�parameter�blocks.‚If�it�finds<*‘any�that�are�free,�it�will�set�option�to�receive�from�any,?*‘link�the�parameter�block�on�the�receive�list�via�BSR�LNKWAITQ0*‘and�issue�the�receive�request�via�BSR�NTSSERV.**‘Wait�100�ms.*‘GO�TO�SSCMAIN.*^*/SSCMAINƒMOVE.L�#NWTSCN,D0‰Scan�USER�Q�directiveŠTRAPƒ#1*/*ˆCheck�all�transactions�in�'Wait-for-TC'�Queue*1ŠLEA„WAITQHD-RCVNEXT(A6),A4�Start�of�'wait'�queue0SSCM04„MOVE.L�A4,A5ŽSet�'previous�entry'�pointer6SSCM06„MOVE.L�RCVNEXT(A5),D0…Any�param�blocks�waiting? ŠBEQ„SSCM80�Branch�if�all�tested(ŠMOVE.L�D0,A4ŽAddress�of�parameter�block1ŠBTSTƒ#NTSSTC,NTSSTA(A4)�Is�transaction�complete?ŠBEQ„SSCM04�Branch�if�NO4ŠMOVE.L�RCVNEXT(A4),RCVNEXT(A5)�Remove�from�'wait'�Q'ŠCLR.L‚RCVNEXT(A4)ˆClear�'next'�pointer3ŠMOVE.L�NTSSAD(A4),A3†Buffer�address‚*�1/25/83�SCB.#ŠMOVE.B�NTSCMD(A4),D0†Check�command(ŠBMI„NTCSPECŒBranch�if�'special'�command"ŠTST.B‚NTSRCOD(A4)ˆAny�error�code?ŠBNE„ERRORMGŒBranch�if�YES+ŠCMP.B‚#NTSCSEND,D0‡Is�it�a�'SEND'�command?)ŠBNE.S‚SSCM12�Branch�if�NO�-�must�be�recv*9*…Command�was�SEND�-�no�errors�-�free�the�parameter�block*;SSCM10„MOVE.B�#-1,NTSSTA(A4)…Flag�the�param�block�as�'free'#ŠBRA„SSCM06�Loop�back�for�next�in�QŠPAGE*ˆMessage�received�--�read�it**v+*�SSCM12:ƒIF�command�was�not�really�recieve*‹THEN,*ŽGOTO�ERRMSG�{Eventually�returns�to�SSCM06}*‹ELSE4*�SSCM14:†IF�first�byte�of�message�(message�ID)�=�-1*ŽTHEN*‘GOTO�ERRORMG*ŽELSE4*‘Advance�A3�to�point�to�relative�byte�4�of�message.'*�SSCM16:‰CASE�first�4�bytes�of�message*”'.NTS':‚GOTO�NTSMSG*”'.SSC':‚GOTO�SSCMSG$*”OTHERWISE:�Abort!�-�error�code�=�3 *‘END�CASE**^.SSCM12„CMP.B‚#NTSCRECV,D0‡double�check�commandŠBEQ.S‚SSCM14�Branch�if�RECVŠERRMESG2SSCM14„MOVE.L�NTSSAD(A4),A3†Message�buffer�address'ŠCMP.B‚#-1,(A3)‹Is�it�an�error�message?ŠBEQ„ERRORMGŒBranch�if�YESŠMOVE.L�(A3)+,D0‹Get�message�ID-ŠLEA„MSGIDTB(PC),A0…Start�of�message�ID�table+ŠLEA„MSGIDZZ(PC),A1…Endƒof�message�ID�table)SSCM16„CMP.L‚(A0),D0ŒDoes�ID�match�table?ŠBEQ.S‚SSCM20�Branch�if�YES%ŠLEA„8(A0),A0‹Increment�to�next�entryŠCMP.L‚A0,A1ŽEnd�of�table?ŠBGT„SSCM16�Branch�if�NOŠERRMESG4SSCM20„MOVE.L�4(A0),D0‹Get�offset�to�message�routine)ŠJMP„MSGIDTB(PC,D0)…Go�to�message�routine*"MSGIDTBƒDC.Lƒ'.NTS',NTSMSG-MSGIDTB SSCID…DC.Lƒ'.SSC',SSCMSG-MSGIDTB MSGIDZZƒEQU„*ŠPAGE2*ˆReturn�here�if�SEND�message�buffer�not�available*CSSCM50„MOVE.L�RCVNEXT(A5),RCVNEXT(A4)�Link�back�just�before�current$ŠMOVE.L�A4,RCVNEXT(A5)…Complete�link#ŠBRA„SSCM04�Continue�with�main�loop*$*ˆEnd�of�Main�Loop�-�Prepare�to�wait*1SSCM80„BSR„SRTRCV�Be�sure�all�receives�are�posted%ŠMOVE.L�#100,A0ŒWait�100�milliseconds ŠERQ.DELAYWŠBRA„SSCMAINŒRestart�main�loopŠPAGE+*ˆMessage�Received�from�NTS�Request�Handler**ˆA6�=�Data�segment�pointer2*ˆA5�=�Current�parameter�block�in�Main�Loop�search'*ˆA4�=�P; arameter�block�for�RECV�request*ˆA3�=�Message�address**v!*�NTSMSG:ƒIF�command�is�not�valid*‹THEN*ŽAbort!�-�Code�of�4*‹ELSE"*ŽIsolate�low�order�nibble�of�code*�NTSMG04:…CASE�nibble�of*‘1:�GOTO�NTSARTNƒ{Ident�self}*‘2:�GOTO�NTSARTNƒ{Listen}!*‘3:�GOTO�NTSARTNƒ{Cancel�listen}*‘4:�GOTO�NTSBRTNƒ{Connect}"*‘5:�GOTO�NTSBRTNƒ{Cancel�connect}*‘6:�GOTO�NTSARTNƒ{Disconnect} *ŽEND�CASE*^* Informed by NTSREQ of IDENT, LISTEN or Cancel LISTEN request*+*�NTSARTN:‚Get�a�free�buffer�via�BSR�GETSND@*‹{A1�comes�back�with�message�buffer�address,�A2�comes�back�with*Œsend�parameter�block�address}*‹IF�no�free�buffer�available*‹THENF*�SSCM50:†Link�this�receive�parameter�block�back�into�the�receive�list!*Žas�the�current�parameter�block.*ŽGOTO�SSCM04.*‹ELSE3*ŽMove�'.SSC'�into�first�4�bytes�of�message�buffer.E*�NTSAR03:…Move�the�next�26�(NTS�P.B.)�bytes�into�the�message�buffer.*ŽRelease�the�receive�buffer"*ŽSend�the�message�via�BSR�SNDMSG..*Ž{This�sends�the�message�to�the�remote�SSCT.}*ŽGOTO�SSCM06.*^3NTSARTNƒBSR„GETSND�Find�free�buffer�to�send�message$ŠBNE„SSCM50�Branch�if�none�available4ŠMOVE.L�SSCID(PC),(A1)+„Put�ID�in�message�to�be�sent'ŠMOVE.W�#NTCPBSZ/2-1,D0„#�words�to�move"ŠMOVE.L�A1,A0ŽStart�of�send�buffer6NTSAR03ƒMOVE.W�(A3)+,(A0)+ˆMove�message�to�SEND�buffer(ŠDBRAƒD0,NTSAR03‰Loop�till�message�moved/ŠMOVE.B�#-1,NTSSTA(A4)…Release�'receive'�buffer-ŠBSR„SNDMSG�Send�message�queued�on�no�buffersŠBRA„SSCM06�Return�to�main�loopŠPAGE*vC* Informed by Another SSC of IDENT, LISTEN or Cancel LISTEN request*;*�SSCARTN:‚Get�a�free�parameter�block�for�a�special�command;*‹via�BSR�GETSPEC�{A2�comes�back�with�special�P.B.�address}*‹IF�no�P.B.�available*‹THEN *ŽGOTO�SSCM50*‹ELSE>*�SSCAR03:…Move�the�26-byte�NTC�P.B.�from�the�received�message#*Žinto�the�special�parameter�block.*ŽRelease�the�receive�buffer.5*ŽClear�the�options�field�in�the�NTC�parameter�block.3*�SSCAR04:…Send�the�parameter�block�via�BSR�NTSSERV"*ŽCheck�the�status�via�BSR�STATCHK-*ŽIF�error�code�'out�of�buffers'�was�returned*ŽTHEN!*‘Wait�1�second�(Done�in�STATCHK)*‘GOTO�SSCAR04:.8*ŽIF�error�code�other�than�'out�of�buffers'�was�returned*ŽTHEN*‘GOTO�SSCPBERR.)*ŽIF�command�was�a�$9x�command�(response)*ŽTHEN,*�SSCAR06:ˆFree�the�special�paremeter�block.*‘GOTO�SSCM06.*�SSCAR08:…ELSE*‘{Assume�it�was�a�$8x�command})*‘Change�$8x�to�$9x�(request�to�response).*‘Set�up�A3�so�special�P.B.�looks�like�message*‘GOTO�NTSARTN.*^4SSCARTNƒBSR„GETSPECŒFind�free�param�blk�for�spec�cmd$ŠBNE„SSCM50�Branch�if�none�available'ŠMOVE.W�#NTCPBSZ/2-1,D0„#�words�to�move&ŠMOVE.L�A2,A0ŽStart�of�parameter�block6SSCAR03ƒMOVE.W�(A3)+,(A2)+ˆMove�message�to�param�block(ŠDBRAƒD0,SSCAR03‰Loop�till�message�moved/ŠMOVE.B�#-1,NTSSTA(A4)…Release�'receive'�buffer1ŠMOVE.L�A0,A4ŽSave�'spec�cmd'�param�block�addressŠCLR.B‚NTCOPT(A4)‰Clear�options)SSCAR04ƒBSR„NTSSERVŒISSUE�SPECIAL�COMMANDŠBSR„STATCHKŒGo�check�status#ŠBEQ.S‚SSCAR05ŒBranch�if�status�OK.'ŠBLO.S‚SSCAR04ŒRetry�if�out�of�buffers.$ŠBRA„SSCPBERR‹Branch�if�other�error.*;SSCAR05ƒBTSTƒ#4,NTCCMD(A4)†Was�it�a�$9x�command�(response)?ŠBEQ.S‚SSCAR08ŒBranch�if�NO:SSCAR06ƒMOVE.B�#-1,NTCSTA(A4)…Free�the�special�param�blockŠBRA„SSCM06�Return�to�main�loopBSSCAR08ƒCMP.B‚#NTCCLSTC,NTCCMD(A4)�Was�it�a�Cancel�LISTEN�command?ŠBEQ.S‚SSCAR06ŒBranch�if�YES*;ŠBSETƒ#4,NTCCMD(A4)†Change�$8X�to�$9x�(request�to�response)2ŠMOVE.L�A4,A3ŽWant�to�send�spec�param�block�as�msg#ŠBRA„NTSARTNŒGo�send�message�to�SSCŠPAGE*v6* Informed by Another SSC of CONNECT or Cancel CONNECT*;*�SSCBRTN:‚Get�a�free�parameter�block�for�a�special�command;*‹via�BSR�GETSPEC�{A2�comes�back�with�special�P.B.�address}*‹IF�no�P.B.�available*‹THEN *ŽGOTO�SSCM50*‹ELSEC*�SSCBR03:…Move�first�10�bytes�(thru�NTCRESV)�from�received�message*Žto�special�parameter�block.=*ŽMake�the�received�message�remote�name�the�local�name�in�the*Žspecial�parameter�block.=*ŽMake�the�received�message�local�name�the�remote�name�in�the*Žspecial�parameter�block.*ŽRelease�the�receive�buffer.9*ŽClear�the�options�field�in�the�special�parameter�block.5*�SSCBR04:…Issue�the�special�command�via�BSR�NTSSERV."*ŽCheck�the�status�via�BSR�STATCHK-*ŽIF�error�code�'out�of�buffers'�was�ret< urned*ŽTHEN!*‘Wait�1�second�(Done�in�STATCHK)*‘GOTO�SSCBR04:.8*ŽIF�error�code�other�than�'out�of�buffers'�was�returned*ŽTHEN*‘GOTO�SSCPBERR.&*ŽIF�this�was�a�$9x�command�(response)*ŽTHEN,*�SSCBR06:ˆFree�the�special�parameter�block.*‘GOTO�SSCM06.*ŽELSE?*�SSCBR08:ˆLink�this�special�P.B.�onto�the�wait�for�transaction*‘queue.*‘GOTO�SSCM06.*^4SSCBRTNƒBSR„GETSPECŒFind�free�param�blk�for�spec�cmd$ŠBNE„SSCM50�Branch�if�none�available'ŠMOVE.W�#NTCLNAM/2-1,D0„#�words�to�move&ŠMOVE.L�A2,A0ŽStart�of�parameter�block%ŠMOVE.L�A3,A1ŽStart�of�reveive�buffer6SSCBR03ƒMOVE.W�(A1)+,(A2)+ˆMove�message�to�param�block(ŠDBRAƒD0,SSCBR03‰Loop�till�message�moved>ŠMOVE.L�NTCRNAM(A3),NTCLNAM(A0)�reverse�Local�and�Remote�namesBŠMOVE.L�NTCRNAM+4(A3),NTCLNAM+4(A0)�reverse�Local�and�Remote�names>ŠMOVE.L�NTCLNAM(A3),NTCRNAM(A0)�reverse�Local�and�Remote�namesBŠMOVE.L�NTCLNAM+4(A3),NTCRNAM+4(A0)�reverse�Local�and�Remote�names/ŠMOVE.B�#-1,NTSSTA(A4)…Release�'receive'�buffer1ŠMOVE.L�A0,A4ŽSave�'spec�cmd'�param�block�addressŠCLR.B‚NTCOPT(A4)‰Clear�options)SSCBR04ƒBSR„NTSSERVŒISSUE�SPECIAL�COMMANDŠBSR„STATCHKŒGo�check�status#ŠBEQ.S‚SSCBR05ŒBranch�if�status�OK.0ŠBLO.S‚SSCBR04ŒRetry�on�'out�of�buffers'�status..ŠBRA.S‚SSCPBERR‹Branch�on�other�type�of�error.*;SSCBR05ƒBTSTƒ#4,NTCCMD(A4)†Was�it�a�$9x�command�(response)?ŠBEQ.S‚SSCBR08ŒBranch�if�NO:SSCBR06ƒMOVE.B�#-1,NTCSTA(A4)…Free�the�special�param�blockŠBRA„SSCM06�Return�to�main�loop*4SSCBR08ƒBSR„LKWAITQŒPut�param�block�in�Wait-for-TC�QŠBRA„SSCM06�Return�to�Main�LoopŠPAGE:*v‡Returned�from�Spec�Command�to�CONNECT�or�Cancel�CONNECT*=*�SPCBRTN:‚IF�bit�#4�set�in�the�command�{$9x�type�=�response}*‹THEN1*ŽGOTO�SSCM10„{Free�P.B.�and�return�to�main�loop}*‹ELSE2*ŽSet�bit�#4�in�P.B.�{change�to�$9x�response�type}4*ŽIF�there�was�an�error�indicated�in�the�return�code*ŽTHEN *‘GOTO�NTSBRTN�{Go�send�message}*ŽELSE1*‘GOTO�SSCM10„{Free�P.B.�and�return�to�main�loop}*^:SPCBRTNƒBSETƒ#4,NTCCMD(A4)†Was�the�return�from�a�response?/ŠBNE„SSCM10�YES�-�Return�to�Main�Loop�-�free�pb#ŠTST.B‚NTCXRCOD(A4)‡Error�returned?.ŠBEQ„SSCM10�NO�-�Return�to�Main�Loop�-�free�pb"ŠBRA„NTSBRTNŒYES�-�go�send�messageŠPAGE0* Come here to display parameter block on error.6*ƒPut�out�message�on�console�and�then�return�to�SSCM06*%*ƒENTRY:�A4�points�to�parameter�block *ƒEXIT:‚D0,D1,A0,A1,A2�destroyed* FIELD…MACRO$ŠMOVE.B�D2,(A2)+‹Space�to�next�field"ŠMOVE.L�#\1,D1�Pick�up�byte�count.&ŠBSR„CONVHEXŒConvert�to�hex�and�stuff.ŠENDM*/SSCPBERR‚MOVE.L�A4,A0ŽStart�of�parameter�block.$ŠLEA„ERRMCD(A6),A1†Start�of�message. ŠMOVE.L�A1,A2)ŠMOVE.L�#'SSCT',(A2)+†'SSCT�P.B.�ER�'�...ŠMOVE.L�#'�P.B',(A2)+ŠMOVE.L�#'.�ER',(A2)+ŠMOVE.W�#'R�',(A2)+$ŠMOVE.L�ERRSPC(PC),D2†For�space�fillŠFIELD‚4’Cmd,LCC,optns,responseŠFIELD‚2’Status,return�codeŠFIELD‚4’ReservedŠFIELD‚6’Name�-�local�NAU ŠFIELD‚2’Addr,Sta�ID�-�local�NAUŠFIELD‚6’Name�-�remote�NAU!ŠFIELD‚2’Addr,Sta�ID�-�remote�NAU ŠBRA.S‚MSGOUT**1*ˆCome�here�if�an�error�message�has�been�received*ˆPut�message�out�on�console*0ERRORMGƒLEA„ERRMSG(PC),A1†Start�of�error�message"ŠLEA„ERRMSGE(PC),A2…End�of�message$ŠMOVE.L�#ERRMSGSZ,D1‡Size�of�message%ŠBSR„OUTTERMŒWrite�message�on�consoleŠMOVE.L�ERRSPC(PC),D2†Blanks$ŠLEA„ERRMCD(A6),A2†Start�of�2nd�lineŠMOVE.L�D2,(A2)+‹*%ŠMOVE.L�D2,(A2)+‹*�Put�blanks�in�lineŠMOVE.L�D2,(A2)+‹*%ŠMOVE.L�A3,A0ŽStart�of�message�recv'dŠMOVE.L�#2,D1Žconvert�2�bytesŠBSR„CONVHEXŒto�ASCII-hexŠMOVE.B�D2,(A2)+‹spaceŠMOVE.L�#9,D1Žconvert�9�bytesŠBSR.S‚CONVHEXŒto�ASCII-hexŠLEA„1(A0),A0‹skip�1�byteŠMOVE.B�D2,(A2)+‹spaceŠMOVE.L�#6,D1Žconvert�6�bytesŠBSR.S‚CONVHEXŒto�ASCII-hexŠMOVE.B�D2,(A2)+‹spaceŠMOVE.L�#4,D1Žconvert�4�bytesŠBSR.S‚CONVHEXŒto�ASCII-hexŠMOVE.B�D2,(A2)+‹spaceŠMOVE.L�#10,D1�convert�10�bytesŠBSR.S‚CONVHEXŒto�ASCII-hex$MSGOUT„MOVE.B�#$0D,(A2)+‰Carr�returnŠMOVE.B�#$0A,(A2)ŠLine�feed#ŠLEA„ERRMCD(A6),A1†Start�of�messageŠMOVE.L�A2,D1ŽENDŠSUB.L‚A1,D1Ž-STARTŠADD.L‚#1,D1= Ž+1=Size ŠBSR„OUTTERM)ŠMOVE.B�#-1,NTCSTA(A4)…THROW�MESSAGE�AWAYŠBRA„SSCM06�RETURN�TO�MAIN�LOOP*7ERRMSG„DC.Bƒ'SSCT�Error-�Code‚STS�BCT�R�E�C�#�RƒTH‹RH�'ERRSPC„DC.Bƒ'‡Data' ŠDC.Bƒ$0D,$0AERRMSGEƒEQU„*-1ERRMSGSZ‚EQU„*-ERRMSG* CONVHEXƒMOVE.B�(A0),D0Œnext�byteŠLSR.B‚#4,D0ŽWant�bits�7-4ŠBSR.S‚CHEX�Convert�to�hexŠMOVE.B�(A0)+,D0‹same�byteŠAND.B‚#$0F,D0ŒWant�bits�3-0ŠBSR.S‚CHEX�Convert�to�hexŠSUB.W‚#1,D1ŽDone?ŠBNE„CONVHEXŒBranch�if�NO ŠRTS—RETURN*CHEX†CMP.B‚#9,D0ŽGreater�than�?ŠBLE.S‚CHEX2ŽBranch�if�NOŠADD.B‚#7,D0Žchange�to�A-F$CHEX2…ADD.B‚#$30,D0ŒConvert�to�ascii&ŠMOVE.B�D0,(A2)+‹Put�in�output�message ŠRTS—RETURNŠPAGE*/* Come here to abort SSCT - unrecoverable error*QUIT†ERQ.ABORT*&*ˆSubroutine�to�issue�RECEIVE�Requests*=*ˆChecks�all�receive�parameter�blocks�to�see�if�any�are�ready*)SRTRCV„MOVE.L�#NUMRCV-1,D7‡Pointer�offset*ŠLEA„RCVBLK(A6),A0†Parameter�block�address1SRTRV02ƒCMP.B‚#-1,NTSSTA(A0)…Is�param�block�free?ŠBNE.S‚SRTRV10ŒBranch�if�NO.ŠMOVE.B�#NTSCRECV,NTSCMD(A0)�Put�command�in�pbŠCLR.B‚NTSLCC(A0)‰Any�LCC�is�ok=ŠMOVE.W�#1<�0�and�not�'out�of�buffer�status'* STATCHKƒEQU„*ŠMOVE.L�D0,-(A7) ŠTST.B‚D0$ŠBEQ.S‚STAT999ŒReturn�if�good�status"ŠCMP.B‚#NTSRNOB,D0ˆOut�of�buffers?.ŠBEQ.S‚STATLO�Yes�-�return�LO�condition�codes.?* At this point we must have error other than 'out of buffers'.&ŠMOVEƒ#0,CCR�Set�condition�codes�'HI'.ŠBRA.S‚STAT999ŒGo�return.0* At this point we have 'out of buffers' status.STATLO„MOVE.L�A0,-(A7) ŠMOVE.L�#1000,A0‹Delay�=�1000�ms ŠERQ.DELAYŠMOVE.L�(A7)+,A0%ŠMOVEƒ#1,CCR�Set�'LO'�condition�codes*9STAT999ƒMOVEM.L�(A7)+,D0ŠDoes�not�affect�condition�codes.ŠRTSŠPAGE*8*ˆSubrouti= ne�to�find�a�free�Spec�Command�parameter�block*-*ˆOn�exit�:�A2�=�Spec�Command�parameter�block**’D0�=�0�SuccessfulƒD0�=�-1�none�available*+GETSPECƒMOVE.L�#NUMSPEC-1,D7†Pointer�offset+ŠLEA„SPECBLK(A6),A2…Parameter�block�address1GETSP02ƒCMP.B‚#-1,NTSSTA(A2)…Is�param�block�free?ŠBNE.S‚GETSP10ŒBranch�if�NOŠCLR.W‚NTSSTA(A2)‰Clear�statusŠCLR.L‚D0‘Successful ŠRTS—RETURN9GETSP10ƒLEA„SPECBKSZ(A2),A2„increment�param�block�address'ŠDBRAƒD7,GETSP02‰Loop�back�to�check�allŠMOVE.L�#-1,D0�NOT�Found ŠRTS—RETURNŠENDéééééééŠPAGEJ************************************************************************** *�INCLUDE�FILE:‚NTS.TRABTOU.AIª*J************************************************************************** -ŠTTL„TRABTOU.SA:ˆMOVE�BIU�DATA�TO�USER�BUFFER*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*A*„TRABTOU�Moves�from�BIU�receive�buffers�to�user�buffers.‚Sends‚*9*ˆResponse�if�needed.‚Sends�a�WAKEUP�to�the�user�when�a†*#*ˆwhole�Request�Unit�is�received.�**Ä*-*„TRABTOU�is�accessed�via�a�Subroutine�call—**Ä*F***********************************************************************Ä*'*ˆOn�Entry:�A5�=�Address�of�LCT�Entry™**Ä*'*ˆOn�Exit�:�A5�=�Address�of�LCT�Entry™**Ä**ˆREGISTERS:…0�1�2�3�4�5�6�7ž* *•D�U�U�U¨**•A�UƒU�U�P�PƒSž**�|ƒ|ƒ|�Stack˜**�|ƒ|____�Preserved”**�|________�Used™**Ä*F*********************************************************************** ŠSECTION�10ŠOPT„PCS* ŠXDEFƒTRABTOU*ŠXREF.S�LCTBEGŠXREFƒNWSIGNAL**TRABTOUƒMOVE.L�A4,-(A7)‹Save�A4�for�Caller8TRABTRPT‚BTSTƒ#LCTARWTR,LCTRSTA(A5)�"Wait-for�Recv"�set?ŠBEQ.L‚TRABRETŒ*�branch�if�no3ŠBTSTƒ#LCTARBFQ,LCTRSTA(A5)�"Buffers-in-Queue"�set?ŠBEQ.L‚TRABRETŒ*�branch�if�no8ŠMOVE.L�LCTRWTRV(A5),A4„Address�of�1st�param�block�->�A42ŠBTSTƒ#LCTARPAR,LCTRSTA(A5)�"Partial-Receive"�set?ŠBEQ.S‚TRAB03�*�branch�if�no**ˆWe're�in�a�"Partial-Receive"*,ŠMOVE.L�LCTRWTBF(A5),A2„Start�of�SDLC�bufferŠLEA„SDDDAT(A2),A1†Start> �of�BIU,ŠBTSTƒ#THB1FS,THB1(A1)ƒIs�BIU�a�1st�Segment?ŠBNE.S‚TRAB02�*�Branch�if�YesŠBSR„RMVBIU�No,�Unlink�this�BIU2ŠBTSTƒ#LCTARBOV,LCTRSTA(A5)�Is�Buffer-Overrun�set?ŠBNE.L‚TRAB12�*�Branch�if�Yes ŠBRA„TRAB08�No,�Process�this�BIU*Ó7Û2$ŠBRA.L‚TRAB12�Send�NTS�Block�to�User*"*ˆWe're�Not�in�a�"Partial-Receive" *ˆGet�Physical�Address�of�Buffer*4TRAB03„MOVE.L�LCTLOTCB(A5),A0„Put�caller's�TCB�in�A07ŠBTSTƒ#NTSOTSK,NTSOPT(A4)�Is�buffer�in�another's�space?ŠBEQ.S‚TRAB04�Branch�if�NO(ŠLEA„NTSTASK(A4),A0…Pointer�to�task�name ŠTR0$.GETTCBŠBRA.S‚TRAB04�Branch�if�found;TRAB03AƒMOVE.B�#NTSRIBUF,NTSRCOD(A4)�ERROR�-�Invalid�buffer1ŠBSETƒ#NTSSTC,NTSSTA(A4)�Set�transaction�complete"ŠBSR„ULKWRC�Unlink�NTS�param�block/ŠMOVE.L�LCTLOTCB(A5),A0„Need�TCB�to�signal�task!ŠBSR„NWSIGNAL‹Send�signal�to�task&ŠBRA„TRABTRPT‹Go�back�to�look�for�more*7TRAB04„TR0$.LOGPHY�,NTSSAD(A4),NTSLEN(A4)%ŠBRA.S‚TRAB04AŒBranch�if�good�addressŠNOPŠBRA„TRAB03AŒBranch�if�ERROR1TRAB04AƒMOVE.L�D6,LCTRCAD(A5)…Save�buffer�address*%ŠBSR„RMVBIU�Remove�buffer�from�user�Q)ŠBTSTƒ#THB1FS,D1‰Is�this�the�1st�segment?ŠBEQ„TRAB14�*�Branch�if�NO ŠTST.W‚D2‘Check�seq�#�in�message$ŠBEQ.S‚TRAB06�Branch�if�0�--�no�test>TRAB05AƒADD.W‚#1,LCTRSEQ(A5)…Increment�Receive�Sequence�Number+ŠBEQ„TRAB05AŒZero�is�not�a�legal�sequence�#?TRAB06„MOVE.B�LCTLOLCC(A5),NTSLCC(A4)�Move�Logical�Connect�Code1ŠMOVE.L�NTSLEN(A4),LCTRTSZ(A5)�Current�Byte�CountŠCLR.L‚NTSRCSZ(A4)ˆ*7ŠBSETƒ#LCTARPAR,LCTRSTA(A5)�Set�"RU-Partially-Received"0ŠTST.B‚D1‘Is�this�a�receive�for�Network�Control?*ŠBMI.S‚TRAB08�Branch�if�YES�-�No�RH�exists;ŠBTSTƒ#RHB1DFR,RHB1-RHCAT(A1)�"Definite-Response-Expected"?ŠBEQ.S‚TRAB06AŒ*�Branch�if�No+ŠBSETƒ#LCTARRSP,LCTRSTA(A5)�Yes,�Set�Status2TRAB06AƒADD.L‚#RHSIZ,A1ŠIncrement�to�Start-of-DataŠSUB.L‚#RHSIZ,D0Š**,TRAB08„TST.W‚D2‘Sequence�Number�test�needed?ŠBEQ.S‚TRAB08CŒBranch�if�NO-ŠCMP.W‚LCTRSEQ(A5),D2…Sequence�Numbers�equal?ŠBEQ.S‚TRAB08CŒ*�Branch�if�YesK***************************************************************************C*ƒIf�error�found�in�sequence�numbers�--�or�extra�frames�--�or�wrong *¦--�or�wrong�size�records�found*‰THEN�Kill�the�LinkK***************************************************************************ŠBLT.S‚TRAB08AŒNo,�Duplicated?3ŠMOVE.B�#NTSRSEQL,NTSRCOD(A4)�ERROR,�"Message-Lost"ŠBRA.S‚TRAB08BŒ*@TRAB08AƒMOVE.B�#NTSRSEQD,NTSRCOD(A4)�ERROR,�"Message-Duplicated"1ŠCMP.B‚#1,D2ŽIs�sequence�from�remote�=�1�(reset?)-ŠCRASH.NE�*+1ŽKill�link�if�not‚BSR.S�TRABKILL/ŠCLR.B‚NTSRCOD(A4)ˆYes�clear�bad�status�in�P.B.ŠBRA.S‚TRAB08BK***************************************************************************C*ƒIf�error�found�in�sequence�numbers�--�or�extra�frames�--�or�wrong *¦--�or�wrong�size�records�found*‰THEN�Kill�the�LinkK***************************************************************************ŠXREFƒSBSDLCKL1TRABKILL‚MOVEM.L�D0-D2/A0-A1,-(A7)�Save�registersTRABKIL1‚BSR„SBSDLCKL‹KILL�LINK)ŠBRA.S‚TRABKILX‹Branch�if�okŠ2/18/83�SCB.1ŠBRA.S‚TRABKIL1‹Branch�if�no�buffers‚2/18/83�SCB.4TRABKILX‚MOVEM.L�(A7)+,D0-D2/A0-A1�Restore�registersŠRTSJ**************************************************************************J**************************************************************************=TRAB08BƒMOVE.W�D2,LCTRSEQ(A5)…Use�Sequence�Number�from�Header**ˆCheck�size�of�message*-TRAB08CƒBTSTƒ#THB1LS,D1‰IS�THIS�LAST�SEGMENT?.ŠBNE.S‚TRAB08DŒBRANCH�IF�Y> ES�-�NO�TEST�OF�SIZE'ŠMOVE.W�DBUFSZ,D7ŠMax�size�of�data�buff&ŠCMP.W‚SDDBCT(A2),D7†WAS�MAX�RECEIVED?ŠBEQ.S‚TRAB08DŒBranch�if�YESŠBCLRƒ#0,D0ŽBE�SURE�#�IS�EVENŠCRASH.T�*+1�4/11/83�SCB.ŠBSR„TRABKILL‹KILL�THE�LINKŠTST.L‚D0‘Be�sure�#�in�>�0ŠBLE.S‚TRAB08CŒBranch�if�okŠMOVE.W�#2,D0ŽSet�#�to�2*%*ˆMove�Data�from�BIU�to�User's�Buffer*TRAB08DƒMOVE.L�LCTRCAD(A5),A0)ŠMOVE.L�LCTRTSZ(A5),D3…Current�Byte�Count*ŠMOVE.L�D0,D4ŽUse�#�in�buffer�as�#�to�moveŠCMP.L‚D0,D3ŽWhich�is�smaller?&ŠBGE.S‚TRAB10�Branch�if�buffer�smaller,ŠMOVE.L�D3,D4ŽUse�#�in�msg�area�as�#�to�move TRAB10„SUB.L‚D4,D0Ž#�LEFT�in�BIU,ŠSUB.L‚D4,LCTRTSZ(A5)…#�LEFT�in�message�area'ŠADD.L‚D4,NTSRCSZ(A4)…Add�to�#�receivedŠMOVE.L�D4,D6ŽWant�#�long�wordsŠLSR.L‚#2,D6Ž#�long�wordsŠAND.W‚#3,D4Ž#�bytes)ŠBRA.S‚TRAB10BŒEnter�'msg�area'�fill�loop+TRAB10AƒMOVE.L�(A1)+,(A0)+ˆMove�a�Long�word+TRAB10BƒDBRAƒD6,TRAB10A‰Loop�till�all�moved'ŠBRA.S‚TRAB10DŒEnter�'final�bytes'�loop+TRAB10CƒMOVE.B�(A1)+,(A0)+ˆMove�final�bytes+TRAB10DƒDBRAƒD4,TRAB10C‰Loop�till�all�movedŠTST.L‚D0‘Was�all�data�moved?ŠBEQ.S‚TRAB12�Branch�if�YES9ŠMOVE.B�#NTSRMBIG,NTSRCOD(A4)�Yes,�ERROR,�Message�Too�Big$ŠBTSTƒ#THB1LS,D1‰"Last-Segment"�Set?ŠBNE.S‚TRAB12�*�Branch�if�Yes4ŠBSETƒ#LCTARBOV,LCTRSTA(A5)�No,�Set�"Buffer-Overrun"*-*ˆBIU�is�all�Used�Up,�Is�NTS�Block�Satisfied?*3TRAB12„MOVE.L�A0,LCTRCAD(A5)…Current�User's�Address$ŠBTSTƒ#THB1LS,D1‰"Last-Segment"�Set?ŠBEQ.S‚TRAB14�*�Branch�if�No8ŠBCLRƒ#LCTARPAR,LCTRSTA(A5)�Yes,�Clear�"Partial-Receive"4ŠBCLRƒ#LCTARBOV,LCTRSTA(A5)�*�Clear�"Buffer-Overrun"=ŠBSR„ULKWRC‡Unlink�NTS�Param�Block�from�"Wait-for-Recv"�Chain:ŠBSETƒ#NTSSTC,NTSSTA(A4)�Set�"Transaction-Complete"�in�NTS+ŠMOVE.L�LCTLOTCB(A5),A0„Send�WAKEUP�To�User ŠBSR„NWSIGNAL<ŠBCLRƒ#LCTARRSP,LCTRSTA(A5)�Test�&�Clear�"Response-Expected"!ŠBEQ.S‚TRAB14�*�Branch�if�Not�Set)ŠBSR„TRARESPŒBuild�a�Response�and�Send�itŠBRA„TRABTRPT‹Return�to�start*'*ˆMove�the�BIU�Buffer�to�the�Free�Queue*TRAB14„MOVE.L�A2,A0Ž* ŠTR0.PTFRBFŠBRA„TRABTRPT‹Return�to�start-TRABRETƒMOVE.L�(A7)+,A4‹Restore�A4�for�Caller ŠRTS—ReturnŠPAGE ?****************************************************************½*0*ˆSUBROUTINE:‚"RMVBIU"�Unlink�one�BIU�from�theˆ**žBuffers-Here�Chain,�If‰**žlast�one,�RESET�**ž"Buffers-in-Queue"�Status†**½**ˆENTER:‚A5.L�=�LCT�address›**½*!*ˆRETURN:�A2.L�=�Address�of�BIU˜*'*�A1.L�=�Address�of�RH�or�Data�in�BIUŠ* *�D0.W�=�Amount�of�data�in�BIU‘*,*�D1.B�=�THB1�field�of�Transmission�Header…*-*�D2.W�=�THSEQ�field�of�Transmission�Header„**½**ˆREGISTERS:„0�1�2�3�4�5�6�7˜**”D�R¦* *”A‡RƒPƒS˜**œ|ƒ|ƒ|�Stack’**œ|ƒ|____�PreservedŽ**œ|________�Returned�**½*?****************************************************************RMVBIU„MOVE.L�D3,-(A7)‹Save�thru�call�SCB.0ŠMOVE.L�LCTRWTBF(A5),A2„Address�of�1st�BIU�->�A2ŠCLR.L‚D0‘Clear�for�short�load9ŠMOVE.L�SDDLNK(A2),LCTRWTBF(A5)�Next�BIU�->�Head�of�Queue$ŠBNE.S‚RMVBIU02‹*�Branch�if�Not�Last>ŠBCLRƒ#LCTARBFQ,LCTRSTA(A5)�Last�one,�Clear�"Buffers-in-Queue"0RMVBIU02‚MOVE.B�SDDRSP(A2),D3†SDLC�response�SCB.<ŠCMP.B‚#NWCNAU,LCTLONAU(A5)�Is�Network�Control�the�receiver?ŠBEQ.S‚RMVBIU06‹Branch�if�YES(ŠLEA„SDDDAT(A2),A1†RH/Data�Address�->�A1ŠMOVE.B�THB1(A1),D1ˆTHB1�->�D1 ŠMOVE.W�THSEQ(A1),D2‡THSEQ�->�D2%ŠADD.L‚#THSIZ,A1ŠStart�move�beyond�TH&ŠMOVE.W�SDDBCT(A2),D0†Byte�Count�->�D0%ŠSUB.W‚#THSIZ,D0ŠDecrement�byte�countŠBRA.S‚RMVRTN�SCB.*9RMVBIU06‚MOVE.L�A2,A1ŽStarting�address�is�start�of�buffer%ŠMOVE.B�#THB1NWC,D1ˆUse�NWC�TH�format*ŠBSETƒ#THB1FS,D1‰Set�1st�segment�indicator!ŠBTSTƒ#0,D3ŽIs�this�an�'I'�field?8ŠBNE.S‚RMVBIU08‹Branch�if�no�-�mesg�count�already�bumped1ŠBTSTƒ#THB1LS,SDDDAT+THB1(A2)�Is�it�last�segment?9ŠBNE.S‚RMVBIU08‹Branch�if�yes�-�mesg�count�already�bumped3ŠADD.W‚#1,LCTMCNT(A5)…Bump�complete�message�counter3RMVBIU08‚BSETƒ#THB1LS,D1‰Set�last�segment�indicatorŠCLR.L‚D2‘NO�sequence�#'s�used ŠMOVE.W�SDDBCT(A2),D0†Byte�count&ŠADD? .W‚#SDDDAT,D0‰Add�length�of�header*!RMVRTN„BTSTƒ#0,D3Ž'I'�frame?�SCB. ŠBNE.S‚RMVRTN5ŒBranch�if�no�SCB.#ŠBTSTƒ#THB1LS,D1‰Last�segment?‚SCB.!ŠBEQ.S‚RMVRTN6ŒBranch�if�no.�SCB.5RMVRTN5ƒSUB.W‚#1,LCTMCNT(A5)…Decrement�msg�count�SCB..ŠBEQ.S‚RMVRTN6ŒBranch�if�no�messages�left�SCB./ŠTST.L‚LCTRWTBF(A5)‡Our�link�better�be�nonzero!"ŠCRASH.EQ�*+1ŽCrash�system�if�not.RMVRTN6ƒMOVE.L�(A7)+,D3‹SCB. ŠRTS—ReturnŠPAGE?****************************************************************½*3*ˆSUBROUTINE:‚"ULKWRC"�Unlink�one�NTS�Param�Block…**žFrom�the�"Wait-for-Recv"‡* *žChain.‚Clear�"Wait-for-Recv"‚**žif�Last�NTS�BlockŽ**½**ˆENTER:‚A5.L�=�LCT�address›**�A4.L�=�NTS�address›**½**ˆREGISTERS:„0�1�2�3�4�5�6�7˜**”D¨* *”A‰P�PƒS˜* * |ƒ|�Stack’** |____�PreservedŽ**½*?***************************************************************&ULKWRC„MOVE.L�NTSNEXT(A4),LCTRWTRV(A5)$ŠBNE.S‚ULKWRETŒLast�NTS�Param�Block?6ŠBCLRƒ#LCTARWTR,LCTRSTA(A5)�yes,�Clear�"Wait-for-Recv"ULKWRETƒRTS—ReturnŠPAGE?****************************************************************½***ˆSUBROUTINE:‚"TRARESP"�Build�and�Send�aŽ**Ÿ"Definite-Response"�BIU‡**Ÿto�its�Proper�Destination…**½**ˆENTER:‚A5.L�=�LCT�address›**�A2.L�=�BIU�address›**½**ˆREGISTERS:„0�1�2�3�4�5�6�7˜**”D�U¦* *”A�U…UƒPƒS˜* * |ƒ|�Stack’** |____�PreservedŽ**½*?***************************************************************,TRARESPƒLEA„SDDDAT(A2),A1†Start�of�data�area*2*ˆBuild�new�TH�and�RH�to�SEND�buffer�to�originator*)ŠCLR.W‚THB1(A1)‹Clear�transmission�header)ŠMOVE.B�#THB1FMT,THB1(A1)‚Set�format�code9ŠBSETƒ#THB1FS,THB1(A1)ƒThis�is�the�1st�segment�of�message:ŠBSETƒ#THB1LS,THB1(A1)ƒThis�is�the�last�segment�of�message+ŠMOVE.W�THDAF(A1),D0‡Fip-Flop�the�DAF�&�OAFŠROL.W‚#8,D0Ž*ŠMOVE.W�D0,THDAF(A1)‡*,ŠMOVE.B�#RHCATNC,RHCAT(A1)�Network�InitiatedŠCLR.B‚RHB1(A1)ŠCLR.W‚RHB2(A1)-ŠBSETƒ#RHCATRR,RHCAT(A1)�Set�"Response"�field*$*ˆSet�required�fields�in�SDLC�header*$ŠCLR.W‚SDDSTS(A2)‰Clear�error�status3ŠCLR.L‚SDDRTC(A2)‰Clear�Retry/Error/Command/Station&ŠCLR.W‚SDDRSP(A2)‰Clear�Response�field$ŠMOVE.W�#THSIZ+RHSIZ,D7„Message�size)ŠMOVE.L�A2,A0ŽSend�BIU�to�its�DestinationŠBSR.L‚SNDBIU�* ŠRTS—ReturnééŠPAGEJ************************************************************************** *�INCLUDE�FILE:‚NTS.TRACTOL.AIª*J************************************************************************** 2‰TTL‡TRACTOL.SA:�Move�CONNECT�msg�to�LISTEN�buffer‰PAGE*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*G************************************************************************Å*D*„TRACTOLL�is�entered�when�LISTEN�is�issued�and�CONNECT�is�waiting.**Å*D*„TRACTOLC�is�entered�when�CONNECT�received�and�LISTEN�is�waiting.�**Å*B*„In�both�cases,�a�CONNECT�request�is�moved�to�the�LISTEN�bufferƒ**Å*G************************************************************************Ä*9*ˆOn�Entry:�A3�=�NAT�entry…A4�=�Parameter�block�addressƒ**Ä* *ˆOn�Exit�:³**Ä**ˆREGISTERS:…0�1�2�3�4�5�6�7ž* *•D�U�U‰U�Už**•A�U�U�U�R�R�U�R�Sž* *›|‰|�Stack˜**›|__________�Used™**Ä*F*********************************************************************** ‰SECTIONƒ10‰OPT‡PCS‰XDEF†TRACTOLL,TRACTOLC*‰XREF.S„NNTBEG,NATBEG,LCTBEG‰XREF†NWLNKPB,NWSIGNAL**ˆEntry�when�CONNECT�waiting*1TRACTOLL�MOVE.L„A4,-(A7)ŒSave�param�block�address3‰BCLR†#NATSCONW,NATSTAT(A3)�Be�sure�CONNECT�waiting‰BEQ.S…TRACL02�Branch�if�not4‰MOVE.L„NATLCNLK(A3),D0…Ge? t�1st�CONN�parameter�block#‰BNE.S…TRACL06�Branch�if�one�exists7TRACL02‚BSET†#NATSLSTW,NATSTAT(A3)�Set�'listen�waiting'‰BRA.S…TRACL048TRACL03‚BSET†#NATSCONW,NATSTAT(A3)�Set�'connect�waiting'2TRACL04‚LEA‡NATLCNLK-NTSNEXT(A3),A0�1st�pb�pointer‰BSR‡NWLNKPB�Find�end�of�chain'‰CLR.L…NTSNEXT(A4)‰Clear�'next'�pointer/‰MOVE.L„A4,NTSNEXT(A0)†Add�param�block�to�chain‰MOVE.L„(A7)+,A4ŒRestore�A4*1TRACL06‚MOVE.L„D0,A2�A2�=�CONNECT�parameter�block)‰MOVE.L„A4,A1�A1�=�LISTEN‚parameter�block ‰MOVE.L„NTSNEXT(A2),NATLCNLK(A3))‰BEQ.S…TRACL12�Branch�if�NO�more�in�chain+‰BSET†#NATSCONW,NATSTAT(A3)�Set�'wait'�flag$‰BRA.S…TRACL12�Branch�to�fill�buffer**ˆEntry�when�LISTEN�waiting*1TRACTOLC�MOVE.L„A4,-(A7)ŒSave�param�block�addressãAì,9TRACL08‚BCLR†#NATSLSTW,NATSTAT(A3)�Be�sure�LISTEN�waiting‰BEQ.S…TRACL03�Branch�if�not6‰MOVE.L„NATLCNLK(A3),D0…Get�1st�LISTEN�parameter�block"‰BEQ‡TRACL03�Branch�if�none�exists**‰MOVE.L„A4,A2�A2�=�CONNECT�parameter�block)‰MOVE.L„D0,A1�A1�=�LISTEN‚parameter�block ‰MOVE.L„NTSNEXT(A1),NATLCNLK(A3))‰BEQ.S…TRACL12�Branch�if�NO�more�in�chain+‰BSET†#NATSLSTW,NATSTAT(A3)�Set�'wait'�flag*$*ˆMove�CONNECT�info�to�LISTEN�buffer*+TRACL12‚MOVE.L„NATTCB(A3),A0‡Listener's�TCB*‰TR0$.LOGPHY�,NTSSAD(A1),#16$‰BRA.S…TRACL14�Branch�if�good�return‰NOP8‰BSET†#NTSSTC,NTSSTA(A1)‚Status�=�'transaction�complete'7‰MOVE.B„#NTSRIBUF,NTSRCOD(A1)�ERROR�-�Bad�listen�buffer$‰MOVE.L„NATTCB(A3),A0‡Listener's�TCB0‰MOVE.L„A1,A4�Put�Listener's�pb�in�A4�for�signal ‰BSR‡NWSIGNAL‰MOVE.L„A2,A4�Put�CONN�pb�in�A4&‰BRA‡TRACL08�Branch�back�to�start�over*#TRACL14‚MOVE.L„D6,A0“Buffer�address'‰MOVE.L„NATBEG,A5�Network�address�table/‰MOVE.L„NTCRNAM(A2),LBCNAM(A0)‚CONNECTER's�name3‰MOVE.L„NTCRNAM+4(A2),LBCNAM+4(A0)‚CONNECTER's�name.‰MOVE.L„NTCLNAM(A2),LBTNAM(A0)‚LISTENER's�name2‰MOVE.L„NTCLNAM+4(A2),LBTNAM+4(A0)‚LISTENER's�name4‰BSET†#NTSSTC,NTSSTA(A1)†transac�complete�for�LISTEN5‰BSET†#NTSSTC,NTSSTA(A2)†transac�complete�for�CONNECT$‰MOVE.L„NATTCB(A3),A0‡LISTENER's�TCB0‰MOVE.L„A1,A4�Put�Listener's�pb�in�A4�for�SIGNAL ‰BSR‡NWSIGNAL$‰MOVE.L„#SSCNAU-1,D0ˆSSC's�address-1-‰MULU†#NATESIZ,D0‰*�entry�size�=�entry�offset/‰LEA‡NATENTRY(A5,D0),A0‚SSC's�NAT�entry�address‰MOVE.L„NATTCB(A0),A0‡SSC's�TCB+‰MOVE.L„A2,A4�Put�SSC's�pb�in�A4�for�SIGNAL ‰BSR‡NWSIGNAL#‰MOVE.L„(A7)+,A4ŒRestor�original�A4‰RTSéŠPAGEJ************************************************************************** *�INCLUDE�FILE:‚NTS.TRADTXQ.AIª*J************************************************************************** ,‰TTL‡TRADTXQ.SA:�MOVE�DATA�TO�TRANSMIT�QUEUE*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*>*„TRADTXQ�Moves�from�user�buffer�to�BIU�txmit�buffers.‚Sends…*<*ˆWAKEUP�to�user�when�user�buffer�is�free.‚Sets�"Wait-for-ƒ**ˆResponse"�state�if�needed£**Ä*-*„TRADTXQ�is�accessed�via�a�Subroutine�call—**Ä*F***********************************************************************Ä*'*ˆOn�Entry:�A5�=�Address�of�LCT�Entry™**Ä*'*ˆOn�Exit�:�A5�=�Address�of�LCT�Entry™**Ä**ˆREGISTERS:…0�1�2�3�4�5�6�7ž* *•D�U�Uª**•A�U�U�U�U�P�PƒSž**�|ƒ|ƒ|�Stack˜**�|ƒ|____�Preserved”**�|________�Used™**Ä*F*********************************************************************** ‰SECTIONƒ10‰OPT‡PCS*‰XDEF†TRADTXQ,SNDBIU*@ ‰XREF†TRAMOVB,NWSIGNAL‰XREF.S„LCTBEG,DBUFSZ**v *TRADTXQ:K*TRADTRPT:‚IF�we�are�not�waiting�for�xmit�on�this�LCT�or�we�are�waiting�for*‹buffers�on�this�LCT*‹THEN"*ŽReturn�to�caller�via�BRA�TRADRET@*‹Pick�up�1st�NTS�P.B.�on�'wait�for�xmit�queue'�and�the�count�of*‹buffers�still�needed.*‹IF�this�LCT�is�for�NWC*‹THEN*ŽGOTO�TRADNWCT.*^*TRADTXQ‚MOVE.L„A4,-(A7)ŒSave�A4�for�Caller.TRADTRPT�MOVE.W„LCTTSTA(A5),D0†Transmit�status'‰BTST†#LCTATWTX,D0ˆ"Wait-for�Xmit"�set?‰BEQ.L…TRADRET�*�branch�if�no*‰BTST†#LCTATWTB,D0ˆ"Wait-for-Buffers"�set?‰BNE.L…TRADRET�*�branch�if�yes8‰MOVE.L„LCTTWTXM(A5),A4…Address�of�1st�param�block�->�A47‰MOVE.W„LCTTBCNT(A5),D1†#�of�buffers�still�needed�->�D1,‰BTST†#LCTCSNWC,LCTCSTA(A5)�Is�this�for�NWC?‰BNE‡TRADNWC�Branch�if�YES**v*‹{This�LCT�is�not�for�NWC1*‹IF�'partial�transmit'�is�indicated�for�this�LCT*‹THEN *ŽGOTO�TRAD04*‹ELSE.*ŽIF�'response�expected'�indicated�in�this�LCT*ŽTHEN#*‘Return�to�caller�via�BRA�TRADRET.ôHý@D E8:%D-@5 0*ŽELSE�{'response�expected'�not�set�in�this�LCT}*‘IF�invalid�buffer�address*‘THEN>*�TRAD02A:‹Set�'invalid�buffer�address'�(code=9)�into�NTS�P.B.(*”Set�'transaction�complete'�in�NTS�P.B.*”GOTO�TRAD24.*‘{Buffer�address�ok}(*‘Save�buffer�address�in�LCTTCAD�of�LCT.*3‰BTST†#LCTATPAR,LCTTSTA(A5)�"Partial-Transmit"�set?‰BNE.S…TRAD04Ž*�branch�if�YES+‰BTST†#LCTATRPE,D0ˆ"Response-expected"�set?‰BNE.L…TRADRET�*�branch�if�yes* *ˆGet�Physical�Address�of�Buffer*.‰MOVE.L„LCTLOTCB(A5),A0…Put�caller's�TCB�in�A07‰BTST†#NTSOTSK,NTSOPT(A4)‚Is�buffer�in�another's�space?‰BEQ.S…TRAD03ŽBranch�if�NO(‰LEA‡NTSTASK(A4),A0†Pointer�to�task�name ‰TR0$.GETTCB‰BRA.S…TRAD03ŽBranch�if�found;TRAD02A‚MOVE.B„#NTSRIBUF,NTSRCOD(A4)‚ERROR�-�Invalid�buffer1‰BSET†#NTSSTC,NTSSTA(A4)‚Set�transaction�complete‰BRA‡TRAD24ŽGo�to�signal�task*7TRAD03ƒTR0$.LOGPHY�,NTSSAD(A4),NTSLEN(A4)%‰BRA.S…TRAD03A�Branch�if�good�address‰NOP‰BRA‡TRAD02A�Branch�if�ERROR1TRAD03A‚MOVE.L„D6,LCTTCAD(A5)†Save�buffer�address**v<*‹Calculate�how�many�buffers�this�NTS�parameter�block�needs.@*�TRAD04:ƒRequest�this�number�of�buffers�from�buffer�management.!*‹IF�no�buffers�could�be�supplied*‹THEN(*�TRAD05:†Set�'wait�for�buffers'�in�LCT.@*ŽLink�this�LCT�into�the�'wait�for�buffers�queue'�via�BSR�LNKWBC*ŽRETURN�to�the�caller*‹ELSE8*ŽIF�some�of�the�buffers�(but�not�all)�could�be�supplied*ŽTHEN**�TRAD06:‰Set�'waiting�on�buffers'�in�LCT.,*Ž{some�or�all�of�the�buffers�were�supplied}=*ŽUpdate�the�count�of�buffers�still�needed�in�LCT�(LCTTBCNT).**^*‰CLR.L…D0’BIUsiz->�D0‰MOVE.W„DBUFSZ,D0‹*�$100‚(256)%‰SUB.W…#THSIZ,D0‹*�sub�$6�=�$FAƒ(250)‰MOVE.L„D0,D1�*�$FAƒ(250)%‰ADD.W…#RHSIZ,D1‹*�add�$4�=�$FE�(254),‰ADD.L…NTSLEN(A4),D1‡*�length�of�user�buffer‰SUB.L…#1,D1�* ‰DIVS†D0,D1�**(*ˆRequest�Buffers�from�Buffer�Management*?TRAD04ƒMOVE.W„D1,LCTTBCNT(A5)…Ask�Buffer�Management�for�Buffers ‰TR0.GTFRML#‰BEQ.S…TRAD08ŽAll�Buffers�Supplied?(‰BMI.S…TRAD06ŽNo,�Some�Buffers�Supplied?FTRAD05ƒBSET†#LCTATWTB,LCTTSTA(A5)�None�Supplied,�Set�"Wait-for-Buffer"3‰BSR‡LNKWBC‹Link�LCT�Entry�in�Wait-for-Buffer�Queue&‰MOVE.L„(A7)+,A4‚Restore�A4�for�Caller‰RTS‡Return�from�SubroutineGTRAD06ƒBSET†#LCTATWTB,LCTTSTA(A5)�Some�Supplied,�Set�"Wait-for-Buffers"DTRAD08ƒSUB.W…D1,LCTTBCNT(A5)…Calculate�How�Many�Buffers�Still�Needed**v:*�TRAD08A:‚Set�up�registers�to�build�this�transmit�buffer.E*‹Begin�building�transmission�header�for�buffer�-�transmission�header*‹consists�of�the�following:*Žoffset‰contents*Ž00.B‹$20�normal�'I'�frame *Ž01.B‹$00*Ž02.B‹$rr�remote�NAU*Ž03.B‹$ll�local�NAU*Ž04.W‹$0000�sequence�number*^*)‰MOVE.L„A0,A2�Save�address�of�SDLC�buffer'TRAD08A‚LEA‡SDDDAT(A2),A1‡BIUaddr�->�A1‰MOVE.L„A1,A0�BIUaddr�->@ �A0‰CLR.L…D0’BIUsiz�->�D0‰MOVE.W„DBUFSZ,D0‹**&*ˆBuild�Transmission�Header�for�Buffer*TRAD10ƒMOVE.B„#THB1FMT,THB1(A1)‰CLR.B…THB2(A1)‰MOVE.B„LCTRMNAU(A5),THDAF(A1)‰MOVE.B„LCTLONAU(A5),THOAF(A1)‰CLR.W…THSEQ(A1)*‰MOVE.W„#THSIZ,D7�*�#�of�Bytes�to�Transmit*6*ˆBuild�Request/Response�Header�if�1st�or�only�Segment*v**‹IF�'partial�transmit'�is�set�in�this�LCT*‹THEN-*ŽGOTO�TRAD14�-�complete�transmission�header.*‹ELSE**ŽSet�1st�segment�indicator�in�NWC�header.2*�TRAD11:†Update�next�send�sequence�number�in�LCT.B*ŽInitialize�the�LCT�with�the�size�of�this�transmission�(LCTTTSZ).+*ŽIndicate�'partial�transmit'�for�this�LCT.:*ŽSet�'application�initiated'�in�req/resp�header�category."*ŽClear�remaining�response�header.0*ŽIF�definite�response�was�requested�in�NTS�P.B.*ŽTHEN!*‘Set�'response�expected'�in�LCT..*ŽHeader�at�this�point�will�appear�as�follows:**Žoffset‰contents$*Ž00.B‹$28�normal�'I'�frame/1st�seg. *Ž01.B‹$00*Ž02.B‹$rr�remote�NAU*Ž03.B‹$ll�local�NAU**Ž04.W‹$0000�sequence�number *Ž06.B‹$03�application�task#*Ž07.B‹$00�$80�for�def-response-req *Ž08.W‹$0000**^*3‰BTST†#LCTATPAR,LCTTSTA(A5)‚"Partial-Transmit"�set?‰BNE.S…TRAD14Ž*�branch�if�set,‰BSET.B„#THB1FS,THB1(A1)„No,�Set�1st-Segment2TRAD11ƒADD.W…#1,LCTTSEQ(A5)†Update�Sequence�Number*‰BEQ‡TRAD11ŽZero�is�not�a�legal�sequence�#>‰MOVE.L„NTSLEN(A4),LCTTTSZ(A5)‚Initialize�Temp.�Size�&�Address2‰BSET†#LCTATPAR,LCTTSTA(A5)‚Set�"Partial-Transmit"*9‰MOVE.B„#RHCATAP,RHCAT(A1)‚Indicate�application�requested‰CLR.B…RHB1(A1)‰CLR.W…RHB2(A1):‰BTST†#NTSORSP,NTSOPT(A4)�"Response-Requested"�Option�set?‰BEQ.S…TRAD12„*�Branch�if�no@‰BSET†#RHB1DFR,RHB1(A1)ƒ*�Yes,�Set�"Definite-Response-Requested"7‰BSET†#LCTATRPE,LCTTSTA(A5)�*�*�Set�"Response-Expected"*TRAD12ƒADD.L…#RHSIZ,A0‹Account�for�RH�size‰SUB.L…#RHSIZ,D0‹*)‰ADD.W…#RHSIZ,D7‹*�#�of�Bytes�to�Transmit**ˆComplete�Transmission�Header*v+*�TRAD14:ƒPlug�sequence�number�into�header.,*‹IF�this�is�the�last�segment�of�the�message*‹THEN)*ŽSet�the�last�segment�bit�in�the�header..*ŽClear�the�'partial�transmit'�bit�in�the�LCT.*‹Header�appears�as�follows:**Žoffset‰contents$*Ž00.B‹$28�normal�'I'�frame/1st�seg.*¯$2C�for�last�seg. *Ž01.B‹$00*Ž02.B‹$rr�remote�NAU*Ž03.B‹$ll�local�NAU**Ž04.W‹$nnnn�sequence�number *Ž06.B‹$03�application�task#*Ž07.B‹$00�$80�for�def-response-req *Ž08.W‹$0000*^*.TRAD14ƒMOVE.W„LCTTSEQ(A5),THSEQ(A1)‚Sequence�#$‰ADD.L…#THSIZ,A0‹Account�for�Th�size‰SUB.L…#THSIZ,D0‹*/‰CMP.L…LCTTTSZ(A5),D0†Is�this�the�Last�Segment?‰BLT.S…TRAD15Ž*�Branch�if�No.‰BSET†#THB1LS,THB1(A1)„Yes,�set�"Last-Segment"4‰MOVE.L„LCTTTSZ(A5),D0†*�Actual�Segment�Length�->�D06‰BCLR†#LCTATPAR,LCTTSTA(A5)�*�Clear�"Partial-Transmit"*0*ˆMove�Data�from�Users�Buffer�to�Transmit�Buffer*vB*�TRAD15:ƒMove�data�from�the�user's�buffer�to�the�transmit�buffer.@*‹Update�the�'move�from'�buffer�address�and�remaining�byte�count *‹in�the�LCT.*‹IF�this�is�the�last�buffer*‹THEN*ŽGOTO�TRAD20.*‹ELSE"*ŽSend�this�buffer�via�BSR�SNDBIU.*ŽIF�this�LCT�is�for�NWC*ŽTHEN*‘GOTO�TRADN20*ŽELSE�{not�for�NWC}*‘GOTO�TRAD08A.**^*+TRAD15ƒADD.W…D0,D7�*�#�of�Bytes�to�TransmitTRAD16ƒMOVE.L„LCTTCAD(A5),A1†*‰MOVE.L„D0,D1�*!‰LSR.L…#2,D1�#�Long�words�to�move ‰MOVE.L„D0,D2‰AND.W…#3,D2�#�Bytes�to�move%‰BRA.S…TRAD18A�Enter�'data�move'�loop2TRAD18ƒMOVE.L„(A1)+,(A0)+‰*�Move�data�(long�words)TRAD18A‚DBRA†D1,TRAD18%‰BRA.S…TRAD19A�Enter�'data�move'�loop-TRAD19ƒMOVE.B„(A1)+,(A0)+‰*�Move�data�(bytes)TRAD19A‚DBRA†D2,TRAD19*=‰ADD.L…D0,LCTTCAD(A5)†Updata�Temp�Buffer�Address�&�Byte�Count‰SUB.L…D0,LCTTTSZ(A5)†*‰TST.L…(A2)�Last�buffer?‰BEQ.S…TRAD20ŽBranch�if�YES1‰MOVE.L„(A2),-(A7)ŠNext�Buffer's�Address�->�Stack*‰BSR.L…SNDBIUŽSend�this�BIU�to�Destination*‰MOVE.L„(A7)+,A2ŒNext�Buffer�Address�->�A2,‰BTST†#LCTCSNWC,LCTCSTA(A5)�Is�this�for�NWC?‰BEQ‡TRAD08A�Branch�if�NO#‰BRA‡TRADN20�Branch�to�NWC�continue*0*ˆNo�More�Buffers�to�Fill,�Let's�Clean�Up�&�ExitA *v6*�TRAD20:ƒIF�'wait�for�buffers'�indicated�for�this�LCT*‹THEN?*ŽLink�this�LCT�onto�the�'wait�for�buffer�queue'�via�BSR�LNKWBC=*�TRAD40:†Send�this�buffer�to�its�destination�via�BSR�SNDBIU.*‹ELSE'*�TRAD22:†Set�'data�queued'�in�NTS�P.B.**�TRAD24:†Clear�'partial�transmit'�in�LCT.3*ŽWakeup�application�task�associated�with�this�LCT.6*ŽUnlink�this�NTS�P.B.�from�the�'wait�for�xmit'�queue.)*ŽIF�this�was�the�last�P.B.�on�that�queue*ŽTHEN+*‘Clear�the�'wait�for�xmit'�bit�in�the�LCT.0*ŽIF�the�response�expected�bit�is�set�in�the�LCT*ŽTHEN<*‘Link�this�NTS�P.B.�into�the�'wait�response�queue'�for�LCT.*‘GOTO�TRAD40.*ŽELSE(*‘Set�'transaction�complete'�in�NTS�P.B.!*‘Send�the�buffer�via�BSR�SNDBIU.*‘GOTO�TRADTRPT.*^*9TRAD20ƒBTST†#LCTATWTB,LCTTSTA(A5)�"Wait-for-Buffers"�set?‰BEQ.S…TRAD22Ž*�Branch�if�No8‰BSR‡LNKWBC†Yes,�Link�LCT�Entry�in�Wait-for-Buffer�Queue‰BRA.S…TRAD40„Return1TRAD22ƒBSET†#NTSSBFF,NTSSTA(A4)‚Set�"Data-Queued":TRAD24ƒBCLR†#LCTATPAR,LCTTSTA(A5)�Clear�"Partial-Transmit"-‰MOVE.L„LCTLOTCB(A5),A0…Send�a�WAKEUP�To�Task ‰BSR‡NWSIGNAL5‰BCLR†#LCTATWTX,LCTTSTA(A5)�Clear�"Wait-for-Transmit":‰MOVE.L„NTSNEXT(A4),LCTTWTXM(A5)„Link�Next�NTS�Param�Block‰BEQ.S…TRAD26ŽLast�in�Chain?7‰BSET†#LCTATWTX,LCTTSTA(A5)�No,�Set�"Wait-for-Transmit":TRAD26ƒBTST†#LCTATRPE,LCTTSTA(A5)�"Response-Expected"�set?‰BEQ.S…TRAD28Ž*�Branch�if�No8‰BSR‡LNKWRC†Yes,�Save�NTS�Address�in�Wait-Response�Chain ‰BRA.S…TRAD40=TRAD28ƒBSET†#NTSSTC,NTSSTA(A4)‚No,�Set�"Transaction-Complete"‰BSR‡SNDBIUŽSend�last�buffer‰BRA.L…TRADTRPTŒ*"TRAD40ƒBSR‡SNDBIUŽSend�last�buffer-TRADRET‚MOVE.L„(A7)+,A4‚Restore�A4�for�Caller‰RTS‡Return�from�Subroutine‰PAGE*+*ˆHandle�Message�Moves�for�Network�Services*8TRADNWC‚BTST†#LCTATPAR,LCTTSTA(A5)‰Partial�transmit�set?‰BNE.S…TRADN04�Branch�if�YES+‰BTST†#LCTATRPE,D0ˆ"Response-expected"�set?‰BNE‡TRADRET�*�branch�if�yes-‰MOVE.L„NTSSAD(A4),LCTTCAD(A5)ˆBuffer�address#‰MOVE.L„NTSLEN(A4),LCTTTSZ(A5)ˆSize,‰ADD.L…#4,LCTTCAD(A5)�Skip�buff�link�address,‰SUB.L…#4,LCTTTSZ(A5)�Skip�buff�link�address*;*ˆCalculate�how�many�buffers�this�NWC�parameter�block�needs*&‰CLR.L…D0’Clear�for�buff�#�calculation ‰MOVE.W„DBUFSZ,D0‹Size�of�buffer"‰SUB.W…#THNSIZ,D0ŠSubtract�TH�Size‰MOVE.L„D0,D1�*‰ADD.L…NTSLEN(A4),D1‡+�length+‰SUB.L…#SDDDAT+THNSIZ+1,D1ƒ-�Size�of�header‰DIVS†D0,D1�#�BUFFERS‰BNE.S…TRADN04�Branch�if�not�0 ‰MOVE.L„#1,D1�Must�be�at�least�1*(*ˆRequest�buffers�from�buffer�management*8TRADN04‚MOVE.W„D1,LCTTBCNT(A5)…Ask�buff�mgmt�for�buffers ‰TR0.GTFRML,‰BEQ.S…TRADN08ƒBranch�-�all�buffers�supplied(‰BGT‡TRAD05„Branch�-�N0�buffers�supplied8‰BSET†#LCTATWTB,LCTTSTA(A5)‚Some�buffs�-�set�'wait'�flag*%TRADN08‚MOVE.L„A0,A2…Save�BIU�address-‰SUB.W…D1,LCTTBCNT(A5)…#�Buffers�still�needed**ˆSave�Control�Information*-‰BTST†#LCTATPAR,LCTTSTA(A5)‰Partial�xmit�set?‰BNE.S…TRADN20�Branch�if�YES*‰MOVE.L„NTSSAD(A4),A1‡NWC's�buffer�address,‰MOVE.B„SDDCMD(A1),LCTLOCCD(A5)�Save�command2‰CLR.B…LCTRMSID(A5)ˆClear�remote�sid�for�secondary0‰TST.B…LCTLOSID(A5)ˆIs�this�the�primary�station?‰BNE.S…TRADN09�Branch�if�NO5‰MOVE.B„SDDSEC(A1),LCTRMSID(A5)‚Set�secondary�station'TRADN09‚CLR.W…LCTTTH(A5)Šclear�TH�field,‰CMP.B…#SDDCI,SDDCMD(A1)ƒIs�this�an�I�frame?‰BNE.S…TRADN10�Branch�if�NO#‰MOVE.W„SDDDAT(A1),D1‡Get�TH�header1‰AND.W…#$F3FF,D1‹Clear�1st�and�last�segment�flags!‰MOVE.W„D1,LCTTTH(A5)‡Save�in�LCT**‡Determine�#�bytes�to�move*2TRADN10‚MOVE.L„LCTTTSZ(A5),D0†NWC's�requested�size*‰LEA‡4(A2),A0ŒIncrement�address�to�move�to‰MOVE.L„D0,D7�*#‰SUB.L…#SDDDAT-4,D7ˆ#�to�go�to�BCNT‰BGT.S…TRADN12�Branch�if�>�1‰CLR.L…D7’BCNT�may�be�zero)TRADN12‚MOVE.B„LCTTTH(A5),D1‡Get�TH�field$‰BSET†#THB1FS,D1ŠSet�1st�sement�flag&TRADN14‚CMP.W…DBUFSZ,D7‹Is�size�>�max?‰BHI.S…TRADN16�Branch�if�NO&‰BSET†#THB1LS,D1ŠSet�last�segment�flag)‰MOVE.B„D1,SDDDAT(A1)‡Save�TH�in�original‰BRA‡TRAD16ŽGo�to�move�data5TRADN16‚BSET†#LCTATPAR,LCTTSTA(A5)�Set�'partial�xmA it' ‰CLR.L…D7‰MOVE.W„DBUFSZ,D7‹Max�data�size ‰MOVE.L„D7,D0!‰ADD.L…#SDDDAT-4,D0ˆMax�move�size)‰MOVE.B„D1,SDDDAT(A1)‡Save�TH�in�original‰BRA‡TRAD16ŽGo�to�move�data*'*ˆContinuation�of�send�--�fill�next�BIU*2TRADN20‚MOVE.B„LCTLOCCD(A5),SDDCMD(A2)…Set�command'‰LEA‡SDDDAT(A2),A0‡Start�of�data�buffer ‰CLR.L…D0!‰MOVE.W„DBUFSZ,D0‹#�Bytes�to�move‰CLR.L…D7’#�Bytes�in�BCNT‰CLR.W…SDDSTS(A2)ŠClear�status ‰CLR.B…SDDRSP(A2)ŠClear�response**ˆAttach�TH�to�this�segment*‰MOVE.W„LCTTTH(A5),D1‡TH�field‰BEQ.S…TRADN22�Branch�if�none‰MOVE.W„D1,(A0)+ŒSave�in�buffer&‰ADD.L…#2,D7�Increment�#�bytes�in�BCNT&‰SUB.L…#2,D0�Decrement�#�bytes�to�move1TRADN22‚CMP.L…LCTTTSZ(A5),D0†Is�this�last�segment‰BLT‡TRAD15ŽBranch�if�NO!‰MOVE.L„LCTTTSZ(A5),D0†Reset�size,‰BSET†#THB1LS,-2(A0)†Set�'last�segment'�flag ‰CLR.B…SDDRSP(A2)ŠClear�response‰BRA‡TRAD15ŽGo�to�move�data‰PAGE?****************************************************************½**½*6*ˆSUBROUTINE:‚"LNKWRC"�Link�a�NTS�Param�Block�to�the‚**žWait-for-Response�Chainˆ**½**ˆENTER:‚A5.L�=�LCT�address›*&*�A4.L�=�NTS�Parameter�Block�Address‹**½**½**ˆREGISTERS:…0�1�2�3�4�5�6�7—**•D�U¥* *•A‡U�P�PƒS—**�|ƒ|ƒ|�Stack‘**�|ƒ|____�Preserved�**�|________�Used’**½*?***************************************************************0LNKWRCƒLEA‡LCTTWTRP-NTSNEXT(A5),A3ƒAddress�->�A30‰CLR.L…NTSNEXT(A4)…Clear�Link�in�NTS�Param�Block5LNKWRC02�MOVE.L„NTSNEXT(A3),D0�Next�NTS�ADDRESS�->�D0‰BEQ.S…LNKWRC04‚End�of�Chain?#‰MOVE.L„D0,A3…No,�Keep�Following�It‰BRA.S…LNKWRC02‚*JLNKWRC04�MOVE.L„A4,NTSNEXT(A3)�Yes,�Link�Current�NTS�Block�to�End�of�Chain ‰RTS‡Return‰PAGE?****************************************************************½**½*1*ˆSUBROUTINE:‚"LNKWBC"�Link�an�LCT�Entry�to�the‡**žWait-for-Buffer�QueueŠ**½**ˆENTER:‚A5.L�=�LCT�address›**½**½**ˆREGISTERS:…0�1�2�3�4�5�6�7—**•D�U¥* *•A‡UƒPƒS—**�|ƒ|ƒ|�Stack‘**�|ƒ|____�Preserved�**�|________�Used’**½*?***************************************************************6LNKWBCƒMOVE.L„LCTBEG,A3ˆLCT�Header�Block�Address�->�A3+‰CLR.L…LCTBFLNK(A5)…Clear�Link�in�LCT�Block:‰LEA‡LCTBHDR-LCTBFLNK(A3),A3�Head�of�Wait-for-Buffer�->�A36LNKWBC02�MOVE.L„LCTBFLNK(A3),D0�Next�LCT�Address�->�D0‰BEQ.S…LNKWBC04‚End�of�Chain?"‰MOVE.L„D0,A3…No,�Follow�the�Chain‰BRA.S…LNKWBC02‚*KLNKWBC04�MOVE.L„A5,LCTBFLNK(A3)�Yes,�Link�Current�LCT�Block�to�End�of�Chain ‰RTS‡Return‰PAGE?****************************************************************½*1*ˆSUBROUTINE:‚"SNDBIU"�Send�a�BIU�Buffer�to�its‡*!*žDestination�(Local�or�Remote)‚**½**ˆENTER:‚A5.L�=�LCT�Address›**�A2.L�=�BIU�Buffer�Address”**½**ˆREGISTERS:…0�1�2�3�4�5�6�7—**•D�U¥* *•A…U�UƒPƒS—**�|ƒ|ƒ|�Stack‘**�|ƒ|____�Preserved�**�|________�Used’**½*?***************************************************************(SNDBIUƒMOVE.W„D7,SDDBCT(A2)‡#�DATA�bytes4‰BTST†#LCTCSNWC,LCTCSTA(A5)�Is�this�Network�Control?‰BNE.S…SNDBIU1�Branch�if�YES0‰MOVE.B„#SDDCI,SDDCMD(A2)ƒ*�SDLC�I�Field�Command‰CLR.W…SDDSTS(A2)ŠClear�status ‰CLR.B…SDDRSP(A2)ŠClear�response7SNDBIU1‚MOVE.B„LCTRMSID(A5),SDDSEC(A2)�*�SDLC�Station�#0‰MOVE.B„LCTLOSID(A5),D7…Local�Station�=�Primary?‰BEQ.S…SNDBIU2�Branch�if�yes&‰MOVE.B„D7,SDDSEC(A2)‡*�SDLC�Station�#/SNDBIU2‚CMP.B…LCTRMSID(A5),D7…*�Local�=�Remote?‰BNE.S…SNDBIU4�*�Branch�if�No&‰MOVE.L„A5,-(A7)ŒSave�A5�-�LCT�address/‰BSR‡TRAMOVB�Yes,�Treat�BIU�as�if�just�received$‰MOVE.L„(A7)+,A5ŒRestore�LCT�address‰RTS›*3SNDBIU4‚MOVE.L„A2,A0�PTXMQ�wants�buff�address�in�A0,‰TR0.PTXMQ•Link�BIU�to�SDLC's�Transmit�Queue!‰BNE.S…SNDBIUX�Branch�if�rejected‰RTSSNDBIUX‚TR0$.KILLERéB éééééŠPAGEJ************************************************************************** *�INCLUDE�FILE:‚NTS.TRAMOVB.AIª*J************************************************************************** +ŠTTL„TRAMOVB.SA:ˆROUTE�BIU's�TO�DESTINATION*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*=*„TRAMOVB�Routes�BIU's�to�the�approriate�Logical�Connection‡**Ä*-*„TRAMOVB�is�accessed�via�a�Subroutine�Call—**Ä*F***********************************************************************Ä**ˆOn�Entry:�A2�=�BIU�address¢**’D7�=�Originator's�Station�ID*Ä* *ˆOn�Exit�:³**Ä**ˆREGISTERS:…0�1�2�3�4�5�6�7ž* *•D�U�U‹Už**•A�P�P�P�PƒPƒSž* *¥|�Stack˜**Ä**Ä*F*********************************************************************** ŠSECTION�10ŠOPT„PCS* ŠXDEFƒTRAMOVB*&ŠXREFƒTRABTOU,TRADTXQ,NWLNKBQ,NWSIGNALŠXREF.S�NNTBEG,NATBEG**ˆCheck�for�valid�buffer*:TRAMOVBƒMOVEM.L�A0-A3/A5,-(A7)„Save�registers‚2/10/83�SCB.%ŠTST.W‚SDDBCT(A2)‰Is�Byte�Count�Zero?ŠBEQ„TRASPEC1‹*�Branch�if�Yes#ŠTST.W‚SDDSTS(A2)‰Error�Field�Zero?ŠBNE„TRASPEC1‹*�Branch�if�NO**ˆCalculate�NAT�Table�Entry*;TRAMB02ƒLEA„SDDDAT(A2),A1†Transmission�Header�Address�->�A1,ŠTST.B‚THB1(A1)‹Check�TH�format�-�is�it�NWC?ŠBMI„TRAMBNW1‹Branch�if�YES ŠCLR.L‚D02ŠMOVE.B�THDAF(A1),D0‡Destination's�Network�AddressŠSUB.L‚#1,D0ŽEntry�#�=�NA-1"ŠMULUƒ#NATESIZ,D0ˆNAT�Entry�offset$ŠMOVE.L�NATBEG,A5ŠStart�of�NAT�table)ŠLEA„NATENTRY(A5,D0),A3�NAT�Entry�address%ŠTST.L‚NATTCB(A3)‰Has�NAU�terminated?ŠBEQ.S‚TRAMB03ŒBranch�if�YES0ŠBTSTƒ#NATSACT,NATSTAT(A3)�Is�this�entry�active?ŠBNE.S‚TRAMB04ŒBranch�if�YES1ŠBTSTƒ#NATSDISC,NATSTAT(A3)�Has�NAU�disconnected?-ŠBEQ„TRASPEC2‹Branch�if�NO�-�can't�deliver�it*&*ˆDiscard�BIU's�for�disconnected�NAU's*8TRAMB03ƒMOVE.L�A2,A0ŽPut�buffer�address�in�A0�for�PTFRBFŠTR0.PTFRBF�Free‹the�buffer"ŠBRA.S‚TRAMB14ŒRETURNƒ2/10/83�SCB.*=FF:N;V7^ ;*ˆFind�Matching�LCT�Entry�(DAF,�OAF,�Station�ID�must�match)*8TRAMB04ƒMOVE.B�THDAF(A1),D0‡Destination�=�Local�Net�Addr%ŠLSL.W‚#8,D0ŽMake�room�for�station�ID&ŠMOVE.B�NATSID(A3),D0†Local�Station�ID-ŠMOVE.B�THOAF(A1),D1‡Origin�=�Remote�Net�Addr%ŠLSL.W‚#8,D1ŽMake�room�for�station�ID.ŠMOVE.B�D7,D1ŽRemote�Station�ID�=�originator's/ŠLEA„NATLCTLK-LCTLULNK(A3),A5�LCT�Address�->�A50TRAMB09ƒMOVE.L�LCTLULNK(A5),D2„End�of�LCT�Chain?ŠBEQ„TRASPEC3‹*�Branch�if�YesŠMOVE.L�D2,A5ŽLCT�Entry�Address0ŠCMPB .W‚LCTLONAU(A5),D0„Compare�Local�NAU�and�SID"ŠBNE„TRAMB09Œ*�Branch�if�not�match1ŠCMP.W‚LCTRMNAU(A5),D1„Compare�Remote�NAU�and�SID"ŠBNE„TRAMB09Œ*�Branch�if�not�match**ˆMatching�LCT�Entry�Found*)ŠBTSTƒ#LCTCSDSC,LCTCSTA(A5)�Disconnected?,ŠBNE„TRAMB03ŒBranch�if�yes�--�discard�buffer&ŠBTSTƒ#THB1FS,THB1(A1)ƒ1st�In�Segment?ŠBEQ.S‚TRAMB10Œ*�Branch�if�No)ŠBTSTƒ#RHCATRR,RHCAT(A1)�Response�Header?ŠBNE„TRARESPR‹*�Branch�if�YES*-*ˆLink�This�Buffer�to�the�"Buffer-Here"�Queue*+TRAMB10ƒBSR.L‚NWLNKBQŒGo�Link�buffer�into�Q6TRAMB11ƒBTSTƒ#LCTARWTR,LCTRSTA(A5)�"Avail-to-Rcv"�Set?ŠBNE.S‚TRAMB12Œ*�Branch�if�Yes*4*ˆAny�"Receive-From-Any"�Param�Blocks�Laying�Around?*9ŠMOVE.L�NATANYLK(A3),D0„"Rcv-From-Any"�Link�Address�Zero?ŠBEQ.S‚TRAMB14Œ*�Branch�if�NO?ŠMOVE.L�D0,LCTRWTRV(A5)„Make�this�Param�Block�the�"Next-to-Rcv" ŠMOVE.L�D0,A0?ŠMOVE.L�NTSNEXT(A0),NATANYLK(A3)�New�"Rcv-From-Any"�Param�Block,ŠCLR.L‚NTSNEXT(A0)ˆClear�Link�in�Param�Block.ŠBSETƒ#LCTARWTR,LCTRSTA(A5)�Set�"Avail-to-Rcv"*'*ˆMove�BIU�Buffer�Data�to�User's�Buffer*TRAMB12ƒBSR„TRABTOU=TRAMB14ƒMOVEM.L�(A7)+,A0-A3/A5„Restore�registers�2/10/83�SCB.ŠRTS-ŠTTL„TRAMOVB.SA:ˆRoute�BIU�to�Network�ControlŠPAGE*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*,*„TRAMBNWC�Routes�BIU's�to�Network�Control˜**Ä*F***********************************************************************Ä*=TRAMBNWC‚MOVEM.L�A0-A3/A5,-(A7)„Entered�via�BSR�from�TRANSSCN-TRAMBNW1‚LEA„SDDDAT(A2),A1†Start�of�data�area ŠMOVE.L�#NWCNAU-1,D0‡NAT�entry�#-ŠMULUƒ#NATESIZ,D0ˆ*�entry�size�=�entry�offset$ŠMOVE.L�NATBEG,A5ŠStart�of�NAT�table)ŠLEA„NATENTRY(A5,D0),A3�NAT�entry�address)ŠMOVE.L�NATLCTLK(A3),A5„LCT�entry�address/ŠCMP.B‚#SDDRFRMR,SDDRSP(A2)�Is�it�frame�reject?ŠBEQ.S‚TRAMNW04‹Branch�if�yes#ŠTST.W‚SDDBCT(A2)‰Information�here?$ŠBNE„TRAMB10ŒIf�yes�-�Go�move�buffer4TRAMNW04‚MOVE.B�SDDSEC(A2),D1†Station�ID�from�buffer*ŠMOVE.B�SDDRSP(A2),D2†Responseƒfrom�buffer1ŠLEA„LCTRWTBF-SDDLNK(A5),A0�Start�of�buffer�chain1TRAMNW06‚MOVE.L�SDDLNK(A0),D0†Next�buffer�addressŠBEQ.S‚TRAMNW08‹Branch�if�noneŠMOVE.L�D0,A0ŽBuffer�address(ŠCMP.B‚SDDSEC(A0),D1†Is�it�same�station?ŠBNE„TRAMNW06‹Branch�if�NO)ŠCMP.B‚SDDRSP(A0),D2†Is�it�same�Response?ŠBNE„TRAMNW06‹Branch�if�NO%ŠBRA„TRAMB03ŒBranch�to�discard�buffer*8TRAMNW08‚CLR.L‚SDDLNK(A0)‰Clear�link�field�in�new�buffer-ŠMOVE.L�A2,SDDLNK(A0)†Add�new�buffer�to�chain0ŠBSETƒ#LCTARBFQ,LCTRSTA(A5)�Set�'buff�in�Q'�flag#ŠBTSTƒ#0,SDDRSP(A2)†'I'�field?…SCB.#ŠBNE.S‚TRAMNW0A‹Branch�if�not.�SCB.)ŠBTSTƒ#THB1LS,THB1(A1)ƒLast�segment?�SCB."ŠBEQ.S‚TRAMNW09‹Branch�if�no.�SCB.@TRAMNW0A‚ADD.W‚#1,LCTMCNT(A5)…Bump�complete�message�counter�SCB.)TRAMNW09‚BRA„TRAMB11ŒGo�look�for�receiverŠPAGE*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*6*„TRARESPR�Handles�Response�BIUs�from�Other�StationsŽ**Ä*F***********************************************************************Ä**ˆOn�Entry:�A5�=�LCT�Address¢**’A2�=�BIU�Address¢**Ä* *ˆOn�Exit�:³**Ä**ˆREGISTERS:…0�1�2�3�4�5�6�7ž* *•D�U�Uª**•A�U�U�U�U�P�PƒSž**�|ƒ|ƒ|�Stack˜**�|ƒ|____�Preserved”**�|________�Used™**Ä*F************************************************************************7TRARESPR‚MOVE.L�A2,A0ŽLink�the�Buffer�to�the�Free�Queue ŠTR0.PTFRBF<ŠBCLRƒ#LCTATRPE,LCTTSTA(A5)�Test�&�Clear�"Response-Expected"!ŠBEQ.S‚TRARET�*�Branch�if�NOT�set*&*ˆA�Response�Was�Expected�and�Received*ŠMOVE.L�A4,-(A7)‹Save�A4BŠMOVE.L�LCTTWTRP(A5),A4„1st�Param�Block�from�"Wait-for-Response"�QAŠBSETƒ#NTSSACK,NTSSTA(A4)�Set�"Response-RCV'd"�in�Parameter�Block3ŠBSETƒ#NTSSTC,NTSSTA(A4)�Set�"Transaction-Complete"7ŠMOVE.L�NTSNEXT(A4),LCTTWTRP(A5)�Unlink�parameter�block!ŠBEQ.S‚TRARE04ŒBranch�if�only�one2ŠBSETƒ#LCTATRPE,LCTTSTA(A5)�re-set�"Resp-Expected"*C *ˆIssue�a�WAKEUP�to�Task0TRARE04ƒMOVE.L�LCTLOTCB(A5),A0„NAU's�TCB�address ŠBSR„NWSIGNAL"ŠBSR.L‚TRADTXQŒAttempt�to�TransmitŠMOVE.L�(A7)+,A4‹Restore�A4&TRARET„BRA„TRAMB14ŒReturn�2/10/83�SCB.ŠPAGE*F***********************************************************************Ä*=*„TRASPEC‚Handles�Special�Response�BIUs�from�Other�Stations†**Ä*F***********************************************************************Ä*!*ˆOn�Entry:�A2‚=�Address�of�BIUž**Ä*F***********************************************************************4TRASPEC1‚MOVE.L�#SPCCSDLC,D1‡ERROR�Code�=�SDLC�errorŠBRA.S‚TRASPEC?TRASPEC2‚MOVE.L�#SPCCDNA,D1ˆERROR�Code�=�Network�Addr�not�foundŠBRA.S‚TRASPEC=TRASPEC3‚MOVE.L�#SPCCNLCT,D1‡ERROR�Code�=Connection�not�found4TRASPECƒMOVE.L�NNTBEG,A5ŠStart�of�Network�Name�Table*<*ˆLet's�"Fix"�up�the�Data�Portion�of�this�"Special"�Response*%ŠLEA„SDDDAT(A2),A1†Start�of�data�area$ŠMOVE.L�#SPCSIZ-3,D0‡#�bytes�to�moveDTRASP04ƒMOVE.B�SDDSTS(A2,D0.W),SPCSTS(A1,D0.W)�Move�original�content$ŠDBRAƒD0,TRASP04‰Loop�till�all�moved%ŠMOVE.W�D1,SPCCOD(A1)†Save�ERROR�code*,*ˆBuild�new�TH�and�RH�to�SEND�buffer�to�SSCT*)ŠCLR.L‚THB1(A1)‹Clear�transmission�header)ŠMOVE.B�#THB1FMT,THB1(A1)‚Set�format�code9ŠBSETƒ#THB1FS,THB1(A1)ƒThis�is�the�1st�segment�of�message:ŠBSETƒ#THB1LS,THB1(A1)ƒThis�is�the�last�segment�of�message%ŠMOVE.B�#SSCNAU,THDAF(A1)‚Destination ŠMOVE.B�#SSCNAU,THOAF(A1)‚Origin-ŠCLR.W‚THSEQ(A1)ŠNO�sequence�for�this�message=ŠMOVE.B�#RHCATNC,RHCAT(A1)�Catagory�is�'from�network�control'2ŠCLR.B‚RHB1(A1)‹Clear�Req/Resp�field�-�for�request$ŠCLR.W‚RHB2(A1)‹Clear�reserved�field*$*ˆSet�required�fields�in�SDLC�header*$ŠCLR.W‚SDDSTS(A2)‰Clear�error�status*ŠCLR.L‚SDDRTC(A2)‰Clear�RTC,�ERR,�CMD,�SEC'ŠMOVE.W�#SPCSIZ,SDDBCT(A2)�Message�size!ŠMOVE.B�NNTHSID(A5),D7…Station�ID ŠMOVE.B�D7,SDDSEC(A2)†Station�ID%ŠBRA„TRAMB02ŒGo�back�to�the�beginningéééééé=/*=/*†NTS.TRANSSCN.AF=/*1=/* Chain file to assemble module NTS.TRANSSCN.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to NTS.TRANSSCN.LS=/*=/IFC \1ƒ=ARG�NTS.TRANSSCN.LS=/ENDIF=/*-=ASM NTS.TRANSSCN.SA,NTS.TRANSSCN.RO,\1;RZ=72=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.SDLCPRI.TEMPLTS.EQ=/*ƒ9995.NTS.NNT.EQ=/*ƒ9995.NTS.NAT.EQ=/*ƒ9995.NTS.LCT.EQ=/*ƒ9995.NTS.NTS.EQ=/*ƒ9995.NTS.NTC.EQC =/*ƒ9995.NTS.SMSG.EQ=/*ƒNTS.TRASCAN.AI=/*ƒNTS.TRAMOVB.AI=/*}=/*=ENDéééééf3TRANSSCN�IDNT†1,0ƒTRANSPORT�LAYER�-�SCAN�USER�QUEUE*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*‰NOLIST‰INCLUDE�9995.&.STR.EQ‰NOLIST‰INCLUDE�9995.&.TCB.EQ ‰INCLUDE�9995.SDLCPRI.TEMPLTS.EQ‰INCLUDE�9995.NTS.NNT.EQ‰INCLUDE�9995.NTS.NAT.EQ‰INCLUDE�9995.NTS.LCT.EQ‰INCLUDE�9995.NTS.NTS.EQ‰INCLUDE�9995.NTS.NTC.EQ‰INCLUDE�9995.NTS.SMSG.EQ‰LIST‰INCLUDE�NTS.TRASCAN.AI‰INCLUDE�NTS.TRAMOVB.AI‰ENDééééééoD =/*=/*†NTS.TRANSSUB.AF=/*1=/* Chain file to assemble module NTS.TRANSSUB.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to NTS.TRANSSUB.LS=/*=/IFC \1ƒ=ARG�NTS.TRANSSUB.LS=/ENDIF=/*.=ASM NTS.TRANSSUB.SA,NTS.TRANSSUB.RO,\1;RZ=100=/*{ Included files are:=/*ƒ9995.&.CRASH.MC=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.SDLCPRI.TEMPLTS.EQ=/*ƒ9995.NTS.NNT.EQ=/*ƒ9995.NTS.NAT.EQ=/*ƒ9995.NTS.LCT.EQ=/*ƒ9995.NTS.NTS.EQ=/*ƒ9995.NTS.NTC.EQ=/*ƒ9995.NTS.SMSG.EQ=/*ƒNTS.TRADTXQ.AI=/*ƒNTS.TRABTOU.AI=/*ƒNTS.TRACTOL.AI=/*}=/*=ENDéééééx-TRANSSUB�IDNT†1,0ƒTRANSPORT�LAYER�-�MOVE�DATA*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*‰NOLIST‰INCLUDE�9995.&.CRASH.MC‰INCLUDE�9995.&.STR.EQ‰NOLIST‰INCLUDE�9995.&.TCB.EQ ‰INCLUDE�9995.SDLCPRI.TEMPLTS.EQ‰INCLUDE�9995.NTS.NNT.EQ‰INCLUDE�9995.NTS.NAT.EQ‰INCLUDE�9995.NTS.LCT.EQ‰INCLUDE�9995.NTS.NTS.EQ‰INCLUDE�9995.NTS.NTC.EQ‰INCLUDE�9995.NTS.SMSG.EQ‰LIST‰INCLUDE�NTS.TRADTXQ.AI‰INCLUDE�NTS.TRABTOU.AI‰INCLUDE�NTS.TRACTOL.AI‰ENDéééééD é�' NTS TRASCAN AI––—rrNTCREQP RO¯¯rrNTSREQ RO¸¸rrNTSSERV ROÑÑrrNWCREQ ROÚÚrrNWCTPRI ROããrrSSCT ROüürrTRANSSCNRO  rrTRANSSUBRO  rrŠPAGEJ************************************************************************** *�INCLUDE�FILE:‚NTS.TRASCAN.AIª*J************************************************************************** :ŠTTL„TRASCAN.SA:ˆSCAN�TERMINATE,�USER�BUFF�&�BUFF-WAIT�Q'S*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.**F***********************************************************************Ä*(*„TRASCAN�has�the�following�functions:œ*8*ˆA.�Handle�DISCONNECT�for�tasks�that�have�terminated.ˆ*7*ˆB.�Remove�Data�Buffers�From�the�User�Queue�and�Pass‰*#*‹them�on�to�the�Appropriate�NAU.š*:*ˆC.�Looks�for�any�LCTs�on�the�Wait-For�Buffer�Queue�and†*+*Œtries�to�get�buffers�and�send�the�BIUs.‘**Ä*/*„TRASCAN�is�accessed�via�a�TRAP�#1�Directive•**Ä*F***********************************************************************Ä* ŠSECTION�10ŠOPT„PCS* ŠXDEFƒTRASCAN ŠXREFƒTRADTXQŠXREF.S�LCTBEG#ŠXREFƒNWDQHD,NWLODSC,NWSETDC,NWLSTC*Ä*2TRASCANƒMOVE.L�TCBNAU(A6),A3†NAT�address�of�caller0ŠCMP.B‚#SSCNAU,NATNAU(A3)�Be�sure�caller�is�SSCTŠBEQ.S‚TRASCANA‹Branch�if�YES+ŠMOVE.W�#1,TCBRTCD(A6)…ERROR�-�ILLEGAL�TRAPŠRTEF***********************************************************************Ä*#*ˆDISCONNECT�any�terminated�tasks�**Ä*F***********************************************************************1TRASCANA‚MOVE.L�NWDQHD,D0ŠTerminated�task�pointerŠBEQ.S‚TRASCANB‹Branch�if�noneŠMOVE.L�D0,A3ŽNAT�entry�address1ŠLEA„TERMPB(PC),A4†Phoney�parameter�block�address*$*ˆDisconnect�all�Logical�Connections*6TRASCA02‚MOVE.L�NATLCTLK(A3),D0„Is�there�an�LCT�entry?ŠBEQ.S‚TRASCA04‹Branch�if�NO"ŠMOVE.L�D0,A5ŽAddress�of�LCT�entry/ŠMOVE.B�#NTSRDCNT,LCTLOCCD(A5)�Save�reason�codeŠBSR„NWLODSCŒCancel�connection1ŠBEQ„TRASCA02‹LOOP�till�all�connections�cancelled0ŠBRA.S‚TRASCANB‹No�buffers�-�try�again�next�time*?*ˆCancel�Listen�status�-�and�send�Disconnect�message�to�primary*;TRASCA04‚MOVE.L�#NTSRDCNT,D6‡Reason�code�--�task�terminated)ŠBSR„NWLSTC�Subroutine�will�cancel�listenŽ=—DŸ+ŠBNE.S‚TRASCANB‹Branch�if�error�-�no�buffer*%*ˆSet�'Disconnect'�in�all�NNT�entries*ŠMOVE.L�NATNNT(A3),A2†NNT�Entry0ŠCLR.L‚NATCNNLK(A3)‡Be�sure�'Conn-init'�is�clear4ŠCLR.L‚NATANYLK(A3)‡Be�sure�'Recv-from-any'�is�clear-ŠMOVE.B�D6,NATDCOD(A3)E …Save�'disconnect'�code)ŠBCLRƒ#NATSACT,NATSTAT(A3)�Clear�'Active',ŠBSETƒ#NATSDISC,NATSTAT(A3)�Set�'Disconnect'ŠCLR.L‚NATTCB(A3) ŠBSR„NWSETDCŒGo�set�'disconnect'=TRASCA06‚MOVE.L�NATNXDC(A3),NWDQHD�Update�'terminate'�pointer ŠBRA„TRASCANA*TERMPB„DC.BƒNTCCDISC,0ŠDC.Lƒ0ŠPAGEF***********************************************************************Ä*4*„Remove�Data�Buffers�From�the�User�Queue�and�Pass�*"*„them�on�to�the�Appropriate�NAU¢**Ä*F************************************************************************)*ˆFetch�a�Data�Buffer�From�the�User�Queue*TRASCANB‚TR0.GTUSQ>ŠBNE.S‚TRAWTBQˆNo�buffers�-�Try�LCTs�on�Wait-For-Buffers�Queue**ˆDetermine�originating�station*4TRASC01ƒMOVE.L�NNTBEG,A2ŠStart�of�Network�Name�Table ŠCLR.L‚D7/ŠTST.B‚NNTHSID(A2)ˆIs�this�the�primary�station?0ŠBNE.S‚TRASC02ŒBranch�if�NO�--�origin�is�primary)ŠMOVE.B�SDDSEC(A0),D7†Origin�is�secondary**ˆTest�for�Valid�SDLC�I�Frame*#TRASC02ƒMOVE.L�A0,A2ŽBuffer�address%ŠBTSTƒ#0,SDDRSP(A0)†I�Field�Response?ŠBEQ.S‚TRASC40Œ*�Branch�if�YES*%*ˆGive�this�buffer�to�Network�Control*ŠBSR„TRAMBNWC‹NWC�is�receiver!ŠBRA„TRASCANŒGo�back�for�next�BIU**ˆRoute�this�buffer�to�receiver*+TRASC40ƒBSR.S‚TRAMOVBŒFind�receiver�for�BIU!ŠBRA„TRASCANŒGo�back�for�next�BIU4ŠTTL„TRASCAN.SA:ˆCHECK�LCTs�ON�Wait-For-Buffer�QueueŠPAGE*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*?*„TRAWTBQ�Looks�for�any�LCTs�on�the�Wait-For�Buffer�Queue�and…*+*Œtries�to�get�buffers�and�send�the�BIUs.‘**Ä*F************************************************************************HTRAWTBQƒMOVE.L�LCTBEG,A3†1st�LCT�address�on�Wait-For�Buffers�Queue�->�D0ŠLEA„LCTBHDR-LCTBFLNK(A3),A3�*ŠMOVE.L�LCTBFLNK(A3),D0„*&ŠBEQ.S‚TRAWTRTŒ*�Branch�if�Queue�EmptyŠMOVE.L�D0,A5ŽQueue�Not�EmptyDŠMOVE.L�LCTBFLNK(A5),LCTBFLNK(A3)�New�Head�of�Wait-For�Buffers�Queue+ŠCLR.L‚LCTBFLNK(A5)‡Clear�Link�Field�in�LCT8*------------------------------------------ 3/13/83 SCB.J* If associated task has terminated then leave simply leave this entry off *ƒof�the�wait�for�buffers�queue.K*ƒNote�that�we�can�tell�if�the�task�associated�with�this�TCB�has�terminatedE*ƒbecause�the�pointer�to�the�TCB�has�been�NOTed�by�the�TERM�directiveG*ƒin�RMS68K.‚This�means�that�the�former�pointer�to�the�TCB�now�contains*ƒan�odd�value.(ŠBTSTƒ#0,LCTLOTCB+3(A5)‚Task�terminated?1ŠBNE.S‚TRAWTBQŒBranch�if�yes�-�go�look�at�new�LCT*+*------------------------------------------FTRAWTBQ4‚BCLRƒ#LCTATWTB,LCTTSTA(A5)�Clear�Wait-For-Buffers�Flag�in�LCT%ŠBSR.L‚TRADTXQŒGet�Buffers�&�Transmit<ŠBTSTƒ#LCTATWTB,LCTTSTA(A5)�Wait-For-Buffers�Flag�Still�Set?ŠBEQ.S‚TRAWTBQŒ*�Branch�if�NoTRAWTRTƒRTE—Yes,�Return�To�SSCT éééI1NTCREQ ASREL' NTS NTCREQP SA7(…HANDLE NTC REQUESTS FROM SSCT÷2pNWMGSSC pNWDCLCT pNWFRLCT pTRACTOLC pTRACTOLL pNWFRNNT pNWLNKBQ pNWSETLA pNWSTATUS pNWSETDC pTRADTXQ pTRABTOU pNTSRRTN pNWFNAT JNTCREQ pNWCREQ E pNWFLCT pNWTNAM pLCTBEG pNATBEG pNNTBEG pNWBLDLCT S2pNWFREPB pNWFNLCC pNWCLRLA pNWTNAMC pNWLNKPB pNWSIGNAL pNWFNLCN *nL3 @ ".Tfp`A ö&AfA ì + gp`A ÞAúNgAú\gæ nàåˆJ3 ÑðüN�J€k@ þgÿÿgA ¨ìNs €ÿÿÿÿgöD€`A ’pNu0 ÌI3 ì^Úÿÿÿäÿÿÿäÿÿÿä°ÿÿÿäÿÿÿä*y($aB! ÿTg f* fNuaI3€ B ÿ> -fp Nu$@Bj %l 5l5l Bª,gê ê ê L3 � +R$­+JB€Nu*y($", 4,aB) þÜg* f aB þÎB€NupNup Nu*y($O3‚ ", 4,aB) þ°gaB( þªB€NupýNu*y($", 4,aB) þ�fp Nu* fô&j* I3 g&k* gB€+NuJ«fp#Nu+fpNu(,:,aB, þ@f - I3‚ fpNu!m y("*¨!M y("J¨fp NuaB% þ í;l+ f(O3 AëaB* ýîg `ÿÿ <þNuB¬!Lë pÿNuaB ýÊB€Nu,aB ý¾gpýNu(,I3 :,aB, ý¬gpóNuJ«gf­f- gpàNu`ÿÿ <þNu"m$B­$lI3 f:;lí +@@RfR`ð@é kÉIaB+ ý<ÉIB€NuL3H aB ý2`ä*y($", 4,aB) ýfp Nu* gp Nu* fè&j* g&kR3 (,:,aB, üègpúNu,aB üÚfJ«faB üÎJ«f/ IëaB& ü¾B«"(_B€Nu*3A *y($", 4,aB) ü¢gaB üœB€NupýNu4éé§A1NTSREQ ASREL' NTS NTSREQ SA8((…Handle NTS user callsþ2JNWMGSSC HJNWDCLCT bJNWFRLCT êpTRACTOLC pTRACTOLL JNWFRNNT �JNWLNKBQ ÞJNWSETLA `pSBPTFRML pNWSTATUS JNWSETDC ¨pTRADTXQ pSYSPOFF pTRABTOU JNTSRRTN dJNWFNAT  pNTCREQ JNWFLCT .JNWTNAM û2JNWCNSD ØpLCTBEG JNTSREQ pNATBEG pNNTBEG JPATCH žJNWLSTC ÎJNWBLDLCT ØJNWFREPB úJNWLODSC pSBGTFRBF JNWFNLCC PJNWCLRLA „JNWTNAMC  &pTRAMOVB JNWLNKPB JJNWSIGNAL fÿNB¬!LF3 B€Nu0,@€°lgpNuJ,g4afò/ |Ií2a´­6­ 6­ 6F3 B­8(_ìB€Nu/ |Iëa†B«"`â0,@é°lgpNu Ng Aì F3 pN@``*,,, h6pN@`Nqp NuJ¬oöaŽfÆ- fp - g B†I3 -a NuAía^fœB¬!LíaB ùB€NupAì o, ~n&I3€ QÈÿð",4,Eí g$@²ªfô´jfîpNupNuB€NuaB ø¶g <ÿNuCèF3 B‘¼ ÑÑ||Bi|#B)BiB(1|(-G #|F3 .NTS #Té3l#j3j3j j #l 3l$3l&F3@ B€NuAí< g @`øB’ Ší6* fgRmHB€Nu*y(B€S€Àü&GõF3 +gB€Nup NuKë M -g*@¾- fð¼-fêB€NupNuKë, -F3 g *@²-fòB€NupNuKë -g M*@¸­ fðºmfêB€NupNu *g&"@*y(F3€ Aí g°‰g @`ôBi ‘"­+I*y(2* Cí I fNu"@²i fðB© ‘F3 "­+I`â- fV-fN y(»Èeÿÿ Ш €J»Àbÿÿ y(Aë (F3 g °�g @`ò!m y(*¨!MKøNuB€"(g A¹Èfôp`ðJ€Nu2* *yF3€@ (Aí g @²h fôè `ìNu2* *y(Aí g @²h fô¨ `ìNu2*F3  *y(Aí g @²h fôè ¨ ¨ `àNu y(J¨gÿÿ*h»ÈeF3 ÿÿ Ш €J»Àbÿÿ!U MCèJBX³Ènú*«;k +l ;lAë (F3 g @`ö!MNu gÿÿ �!TCBfÿÿ(-f HçppN@LßNu-f - F3 g BmBm4`Bmí F- g y(Aèÿô (g°�g @`ò!mI3 Bm6Bm -,3SRequest Disconnect ÿUnknown SDLC Response ÿ24ééééG1SSCT ASREL' NTS SSCT SAF%(…System Service Control Task+2pOUTTERM NSSCT pNTSSERV .JF3"$ & (Aú0<NAg.H瀀 |`6 DATAB˜³ÈnúF3Nu,HOî€ OCîaêHîŠB®¢~Aî¦1|ÿÿCè"!IB¨Aè^QÏÿèaà~F3Aî1|ÿÿCè"!IB¨AèJQÏÿè~AîF1|ÿÿB¨Aè"QÏÿðpýNAIî„*LF3 -g (@,gì+lB¬&lkJ,fž f|ÿÿ`Ä F3gH瀀 |`H&l ÿÿgp Aú(Cú4°�gAè³ÈnôH瀀 |`F3 (Nû.NTS2.SSCr)m+L`ÿZaô |d0<NA`ÿ>€F3 oH瀀 |`ÂAú åˆÑðüNФ¤¤šš¤€F3 oH瀀 |`‚Aú åˆÑðüNÐŠŠŠØØŠ&L€F3 oH瀀 |`@Aú åˆÑðüNÐ"""öÿÿþÐÿÿþÐ+F3°+gtadfÿ "úÿ0< I0ÛQÈÿü|ÿÿal`þVaºfþæ0< J4ÛQÈÿüI3|ÿÿ(HB,aBýrajgeô`”g |ÿÿ`þ ƒgðÔ&L`ŒalfI3þ˜0< J"K4ÙQÈÿü!k !k!k !k|ÿÿ(HB,aBý ageôF3`,g |ÿÿ`ý°a€`ý¨ÔfýÔJ,gýÌ`H ÿ LCîÎ$I$üSSCT$ü PF3.B$ü. ER4üR $:ÖÂraÜÂraÔÂraÌÂraÄÂra¼Âra´I3Âra¬`DCúbEú "<CaBüf$:†EîÎ$Â$Â$ Kra‚Âr azAèÂrI3@apÂrajÂr adü ¼ CîÎ" ’‰R�aBü|ÿÿ`üÔSSCT Error- Code F3STS BCT R E C # R TH RH Data èaaF3SAfîNu o^0ÀNu0<NA~Aî¦ (ÿÿf ¼B(1|Bh!|I3<aaBûxAè^QÏÿÒNuCî„ )g"@`öB¨#HNu~Eî *ÿÿf Bj"jI3B€NuEêJQÏÿæpÿNupJ.™f)@¼ Bª%|( JažaBûNu/JF3g ÿgDü`/ |è0<NA _DüLßNu~EîF *ÿÿfBjB€NuEê3"QÏÿêpÿNu4éôM1TRANSSCN ASREL' NTS TRANSSCNSAG2(…TRANSPORT LAYER - SCAN USER QUEUE³2pNWLNKBQ pNWSETDC pTRADTXQ pTRABTOU pSBGTUSQ pNWDQHD pLCTBEG pNATBEG pNNTBEG pNWLSTC pNWLODSC JTRAMOVB ÚJTRASCAN pNWSIGNAL pSBPTFRBF *¾J3„ &nT + g=|HNs 9(gX&@IúN +g*@|#aA Îgì`<|#aA Äf4$kJ3�H B«B«"F«ë B«aA ž#ë(`¦†aA Šf*$y(B‡J*F3€ f( $H( ga `ÿda:`ÿ^&x Gëÿô +g&*@'mB­-fÞI3 ­ aB ÿ2- gÌNsHçôJjgfJjf^CêJk°B€)S€Àü&*xI3€@ GõJ«g+f+ g0 JaB þØ`p)áH+ )áIKë$-I3 g*B°mfð²mfê- fÄg )fžaB þŽ-6f +"g+@8I3  @'h"B¨í6aB þfLß/NuHçôCêpÀü&*x Gõ*k *— gJjF3 f¦* * Aí< g @²( fô´( fî`ÿ:B� Ší6* fgRmO3 H`ÿj JaB ýð­ g,/ (m$ìì+l$gí  UaB ýÂaB ý¾(_F3 `ÿT"<ÿ`"<ÿ`"<ÿ*x Cêp1² QÈÿø3A B‘¼ ÑÑ>3 ||Bi|#B)BiBjBª5|4-G `þ24éééýG1TRANSSUB ASREL' NTS TRANSSUBSAHW(…TRANSPORT LAYER - MOVE DATAÊ2JTRACTOLC XJTRACTOLL JTRADTXQ pSBSDLCKL JTRABTOU lpSBPTXMQ JSNDBIU $pLCTBEG pNATBEG pNNTBEG pDBUFSZ pTRAMOVB pNWLNKPB pNWSIGNAL pSBPTFRBF pSBGTFRML *ôF3 / 0-gÆ f¾(m 2-*-f°- fZ fœ U,F3 gAì pN@`| ì`8*,,, h6pN@`Nq`Ú+F,B€08 ]@"I3€ XAÒ¬S�ƒÀ;A*aB ÿpgkí aj(_Nuí “m*$HCê IB€08 ¼ F3 B)mmH Bi><- f>ÑRmgú+l0í |B)F3 Bi, g éí XˆY€XG3m\ˆ]€°­0mÑ -0­ Þ@"mF3 ,"ä‰$B` ÙQÉÿü`ÙQÊÿüÑ­,‘­0J’g/a¸$_-gÿ8`4-I3 ga€`Bì­  UaB þd­+l gí- ga4`F3 ìa\`þ6aT(_Nu- f4 fî+l,+l0X­,Y­0B€08 U@I3 "Ò¬�ƒÀfr;A*aB ýèg nþxí $H“m*- f|"li B-F3 J-fi Bm( ) f 2)Aóÿ;A( -0Aê.‡ nB‡-(ÁF3  ¾x b ÁA`þ¬í B‡>8  € A`þ�m AêB€08 F3 B‡BjB* 2-(g0ÁT‡U€°­0mþ` -0èÿþB* `þNGíB¬ +g&@F3 `ö'LNu&x B­Gëÿô +g&@`ö'MNu5G-f| BjB* mL3@ -gG ¾- f / aB ü¨*_Nu JaB üžfNup N@/ -6gÆ-6gF3 ¼(m8- 6g<$m8 ¾jg€`ÿÿaÐJ€oâ0< m@&-D(¶€F3 l(�„™­DÙ¬,äŽD` ÙQÎÿü`ÙQÌÿüJ€g|fí 6+H@L3€ g,­ 6­ 6a¨ì UaB úà­ 6ga `þ> JaB úÊ`þ4(_NuF3 /$m< JaýNu/ « g +f   ë `ë AëaB ùÈB¬!LF3 (_$@"L'jg*ë `"/ « gÊ +gÄ$L"@'igë  kzI3! ,) h6pN@`Nqé|  k(IaB ù\(J`° F*x  ª!j!j @3 !j éê k(IaB ù&pÀü&Aõ h(JaB ù(_Nu4ééééééé' SDLC BEGSDLC AF # #rrBEGSDLC SA , ,rrBUFMGT AF 5 5rrBUFMGT SA > >IùrrBUFMGTX AF � �rI rUFMGTX SA ˜ ˜_brr=/*=/*†SDLC.BEGSDLC.AF=/*1=/* Chain file to assemble module SDLC.BEGSDLC.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to SDLC.BEGSDLC.LS=/*=/IFC \1ƒ=ARG�SDLC.BEGSDLC.LS=/ENDIF=/*)=ASM SDLC.BEGSDLC.SA,SDLC.BEGSDLC.RO,\1;R=/*{ Included files are:=/*ƒ--�none�--=/*}=/*=ENDéééééé *BEGSDLC IDNT 1,0 Beginning of SDLC segment* ‰SECTION�9>* Must be the first thing linked in segment 'SDLC' (section 9)* ŠXDEFƒBEGSDLC6BEGSDLCƒBRA.S‚*’Must�have�code�here�for�linker�to�workŠENDéééI éééé $=/*=/*†SDLC.BUFMGT.AF=/*0=/* Chain file to assemble module SDLC.BUFMGT.SA=/*:=/* If no output argument is specified for the listing the-=/* chain file will default to SDLC.BUFMGT.LG=/*=/IFC \1ƒ=ARG�SDLC.BUFMGT.LS=/ENDIF=/*+=ASM SDLC.BUFMGT.SA,SDLC.BUFMGT.RO,\1;RZ=60=/*{ Included files are:=/*ƒ9995.&.CRASH.MC=/*ƒ9995.NTS.NAT.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.SDLCPRI.TEMPLTS.EQ=/*}=/*=ENDéééééé --BUFMGTƒIDNT†2,0‡BUFFER�MANAGEMENT�SUBROUTINES>‰TTL‡BUFFER�MGT�SUBROUTINES�(Copyright�1982�by�Motorola,�Inc.)‰NOLIST‰INCLUDEƒ9995.&.CRASH.MC‰INCLUDEƒ9995.NTS.NAT.EQ‰INCLUDEƒ9995.&.STR.EQ ‰INCLUDEƒ9995.SDLCPRI.TEMPLTS.EQ‰LIST ‰SECTIONƒ9*‰XREF†NATBEG,SDLCQUSB,FREEQHD,FQLWM,FQBCNT‰XREF†USERQHD,USERQND,SDLCPCB   H*************************************************************************Æ**Æ**šBUFFER�MANAGEMENT›**Æ**Æ* *•NETWORK�SERVICES�/�SDLC�ONLY•**Æ**Æ*#*”J NON-SHARED�RAM/BUFFER�POOL�ONLY“**Æ**Æ*H************************************************************************   H*************************************************************************Æ**Æ**šW�A�R�N�I�N�GŸ**Æ**Æ*=*‡DO�NOT�USE�THIS�MODULE�WHERE�THE�BUFFERS�ARE�SHARED�AMONG†*=*‡MULTIPLE�PROCESSORS�VIA�A�SHARED�RAM�FACILITY.‚THE�PROPER…*=*‡MODULE�FOR�THAT�SITUATION�(AND�ALL�PROCESSORS�THEREIN)�IS†*>*‡THE�"BUFMGTX"�SET�OF�ROUTINES�WHICH�REGULATE�ACCESS�TO�THE…*=*‡POOL�VIA�A�"TEST�AND�SET"�RESOURCE�LOCK�ON�THE�POOL�HEAD.†*<*‡FAILURE�TO�COMPLY�WITH�THIS�WILL�RESULT�IN�UNPREDICTABLE‡*7*‡(AND�PROBABLY�CATASTROPHIC)�BEHAVIOR�OF�THE�SYSTEM.Œ**Æ**Æ*H************************************************************************‰PAGEH*************************************************************************Æ*C*„THESE�ROUTINES�IMPLEMENT�A�BUFFER�MANAGEMENT�SYSTEM�UTILIZING�Aƒ*F*�QUEUE�OF�"FREE�BUFFERS".‚A�"LOW�WATER�MARK"�LEVEL�IS�DEFINED�WHICH‚*H* PREVENTS APPLICATIONS (OR FUNCTIONS ON THEIR BEHALF) FROM COMPLETELY **�DRAINING�THE�BUFFER�POOL.¬**Æ*A*„"SBGTFRIR"�(AND�"GTFRIR")�IGNORE�THE�LOW�WATER�MARK,�AND�WILL…*E*�SUPPLY�ONE�BUFFER�FROM�THE�POOL.‚AN�INDICATION�IS�RETURNED�IF�THEƒ*E*�POOL�HAS�JUST�BECOME�EMPTY.‚THIS�MODULE�SHOULD�NOT�BE�USED�BY,�ORƒ*F*�ON�BEHALF�OF�APPLICATIONS.‚IT�IS�INTENDED�FOR�LOW�LEVEL,�HIGH�PER-‚*G*�FORMANCE�ROUTINES�ONLY�WHICH�MAY�USE�THE�LAST�BUFFER�FROM�THE�POOL.‚**Æ* 6< ?, G= O7 W5 _? g5 o1 w9  D*„"SBGTFRBF"�(AND�"GTFRBF")�RETURN�ONE�BUFFER�IF�THE�POOL�IS�ABOVE‚*H* THE LOW WATER MARK, OTHERWISE A "NOT AVAILABLE" INDICATION IS GIVEN. **Æ*E*„"SBGTFRML"�(AND�"GTFRML")�RETURN�MANY�BUFFERS�FROM�THE�POOL�UP�TO�*H* A REQUESTED NUMBER, OR UNTIL THE LOW WATER MARK IS REACHED, WHICHEVER*G*�OCCURS�FIRST.‚THE�RETURNED�BUFFERS�ARE�LINKED�TOGETHER�AND�THE�FIRST*F*�BUFFERS�ADDRESS,�THE�NUMBER�OF�BUFFERS�RETURNED,�AND�A�RETURN�CODEƒ*#*�OF�ALL,�SOME,�OR�NONE�IS�GIVEN.¦**Æ*B*„"SBPTFRBF"�(AND�"PTFRBF")�RETURN�A�SINGLE�BUFFER�BACK�INTO�THE„* *�POOL.À**Æ*A*„"SBPTFRML"�(AND�"PTFRML")�RETURN�"MANY"�BUFFERS�BACK�INTO�THE…* *�POOL.À**Æ*E*„"SBPTXMQ"�(AND�"PTXMQ")�PUT�A�SINGLE�BUFFER�ON�THE�TRANSMIT�QUEUE�*G*�OF�THE�APPROPRIATE�SECONDARY�STATION'S�CONTROL�BLOCK.‚IF�THE�PASSED�*D*�SECONDARY�STATION�NUMBER�IS�INVALID�(I.E.,�THE�SECONDARY�STATION…*F*�CONTROL�BLOCK�CANNOT�BE�FOUND),�AN�ERROR�INDICATION�IS�RETURNED�ASƒ*E*�WELL�AS�THE�BUFFER.‚IF�THE�STATION�NUMBER�IS�VALID,�THE�BUFFER�ISƒ*D*�ENQUEUED�TO�THE�APPROPRIATE�SECONDARY�STATION�CONTROL�BLOCK,�THE…*G*�SDLC�DRIVER�IS�NOTIFIED�OF�THE�TRAFFIC'S�ARRIVAL,�AND�A�GOOD�RETURN‚*4*�CODE�(AND�NO�BUFFER)�ARE�RETURNED�TO�THE�CALLER.•**Æ*D*„"SBPTUSQ"�(AND�"PTUSQ")�PUT�A�SINGLE�BUFFER�ON�THE�"USER�QUEUE".‚*F*�WHERE�THE�HOSTING�SYSTEM�CONTAINS�NETWORK�SERVICES,�IT�IS�NOTIFIEDƒ**�OF�THE�BUFFER'S�ARRIVAL.­**Æ*E*„"SBGTUSQ"�(AND�"GTUSQ")�GET�A�SINGLE�BUFFER�FROM�THE�"USER�QUEUE",*G*�RETURNING�AN�INDICATION�OF�WHETHER�OR�NOT�A�BUFFER�WAS�OBTAINED.‚IF�*H* NO BUFFER IS AVAILABLE, A "BAD" POINTER IS RETURNED FACILITATING THE **�FINDING�OF�BUGS.µ**Æ*H************************************************************************‰PAGEH*************************************************************************Æ*0*ˆSYMBOL�DEFINITIONS�USED�WITHIN�THESE�MODULES’**Æ*H************************************************************************ )* CONDITION CODE REGISTER BIT DEFINITIONS $N.SET„EQU‡%00001000�NEGATIVE�BIT�SET Z.SET„EQU‡%00000100�ZERO�BIT�SET$V.SET„EQU‡%00000010�OVERFLOW�BIT�SET!C.SET„EQU‡%00000001�CARRY�BIT�SET &N.CLR„EQU‡%00000000�NEGATIVE�BIT�CLEAR"Z.CLR„EQU‡%00000000�ZERO�BIT�CLEAR&V.CLR„EQU‡%00000000�OVERFLOW�BIT�CLEAR#C.CLR„EQU‡%00000000�CARRY�J BIT�CLEAR   (* INTERRUPT LEVEL WITHIN STATUS REGISTER 'LEVEL7ƒEQU‡$0700…LEVEL�7�INTERRUPT�MASK   )* AN ADDRESS VALUE WHICH HELPS CATCH BUGS AFLYPAPER�EQU‡$FFFFFFFF�(IT'S�AN�ODD�NUMBER,�MOVE.W/.L�WILL�FAIL!) ‰PAGEH*************************************************************************Æ*=*ˆSUBROUTINE:‚"SBGTFRIR"‚GET�ONE�BUFFER�FROM�THE�FREE�QUEUEƒ**ˆTRAP:ˆ"GTFRIR"©**ˆENTER:ƒNO�ARGUMENTS.¨*(*ˆRETURN:‚A3.L�=�POINTER�TO�THE�BUFFER™**’CCR±*/*‘Z�set‚BUFFER�WAS�SUPPLIED�(NOT�LAST�BUFFER)‰*"*‘N�set‚LAST�BUFFER�WAS�SUPPLIED–**‘neither‚NO�BUFFER�AVAILABLE™*:*ˆNOTE:‚THIS�ROUTINE�IS�TO�BE�USED�ONLY�BY�THE�DLC�LEVEL‡*/*�BECAUSE�IT�WILL�SUPPLY�THE�VERY�LAST�BUFFERŒ*#*ˆREGISTERS�USED:ƒ0�1�2�3�4�5�6�7�**˜D­* *˜A‡R‡S�** |‡|_�stack–** |_________�returned“**Æ*#*�REPLACED�ON�3/6/83,�ED�SKINNER.¦**Æ*H************************************************************************ ‰XDEF†GTFRIR,SBGTFRIR:GTFRIRƒBSR.S…SBGTFRIR‚TRAP�ENTRY�POINT,�DO�THE�SUBROUTINE,+‰MOVE.W„SR,0(A7)‚REPLACE�THE�CONDITION�CODE"‰RTE‘SO�WE�GIVE�PROPER�RETURN�CODE /SBGTFRIR�MOVE.W„SR,-(A7)‚SUBROUTINE�ENTRY�POINTA‰MOVE.B„#Z.SET+N.CLR,1(A7)�ASSUME�"BUFFER�WAS�SUPPLIED,�NOT�LAST""‰ORI.W…#LEVEL7,SR�MASK�INTERRUPTS!+‰SUB.W…#1,FQBCNT�DECREMENT�COUNT�OF�BUFFERS;‰BGT.S…GTFRIR1ƒOUT�IF�AT�LEAST�ONE�REMAINS�AFTER�WE�GET�ONE)‰BMI.S…GTFRIR0ƒOUT�IF�NOT�EVEN�ONE�FOR�US=* EXACTLY ONE LEFT, WE WILL NOW GET IT LEAVING THE POOL EMPTY<‰MOVE.B„#N.SET+Z.CLR,1(A7)�ASSERT�"LAST�BUFFER�WAS�SUPPLIED".GTFRIR1‚MOVE.L„FREEQHD,A3�BUFFER�ADDRESS�->�A3:‰MOVE.L„SDDLNK(A3),FREEQHD�A(NEXT�BUFFER)�->�HEAD�OF�QUEUE7‰MOVE.W„0(A7),SR‚RESTORE�PRIOR�INTERRUPT�LEVEL�A.S.A.P.%‰CLR.L…SDDLNK(A3)�CLEAR�BUFFER'S�LINK#‰MOVE.W„(A7)+,SR‚ASSERT�RETURN�CODE ‰RTS‘RETURN 1* NO BUFFERS LEFT AT ALL, NOT EVEN ONE FOR CALLER2GTFRIR0‚ADD.W…#1,FQBCNT�PUT�COUNT�BACK�LIKE�IT�WAS7‰MOVE.W„0(A7),SR‚RESTORE�PRIOR�INTERRUPT�LEVEL�A.S.A.P.)‰CLR.B…1(A7)…ASSERT�"NO�BUFFER�AVAILABLE"1‰MOVE.L„#FLYPAPER,A3�BUFFER�POINTER�=�"BAD"�VALUE#‰MOVE.W„(A7)+,SR‚ASSERT�RETURN�CODE ‰RTS‘RETURN‰PAGEH*************************************************************************Æ*=*ˆSUBROUTINE:‚"SBGTFRBF"‚GET�ONE�BUFFER�FROM�THE�FREE�QUEUEƒ**ˆTRAP:ˆ"GTFRBF"©**ˆENTER:ƒNO�ARGUMENTS.¨*-*ˆRETURN:‚A0.L�=�ADDRESS�OF�BUFFER�SUPPLIED”**’CCR±**“Z�set�BUFFER�WAS�SUPPLIEDš**’not�set‚NO�BUFFER�AVAILABLE˜*<*ˆNOTE:‚THIS�ROUTINE�WILL�NOT�DEPLETE�THE�QUEUE�COMPLETELY…*5*�IT�WILL�SUPPLY�BUFFERS�DOWN�TO�THE�LOW�WATER�MARK†*#*ˆREGISTERS�USED:ƒ0�1�2�3�4�5�6�7�**˜D�U«* *˜A�R�S�**š|�|_�stack–**š|_______________�returned“**Æ*#*�REPLACED�ON�3/6/83,�ED�SKINNER.¦**Æ*H************************************************************************ ‰XDEF†GTFRBF,SBGTFRBF:GTFRBFƒBSR.S…SBGTFRBF‚TRAP�ENTRY�POINT,�DO�THE�SUBROUTINE,+‰MOVE.W„SR,0(A7)‚REPLACE�THE�CONDITION�CODE"‰RTE‘SO�WE�GIVE�PROPER�RETURN�CODE /SBGTFRBF�MOVE.W„SR,-(A7)‚SUBROUTINE�ENTRY�POINT3‰MOVE.B„#Z.SET,1(A7)�ASSUME�BUFFER�WILL�BE�SUPPLIED!‰ORI.W…#LEVEL7,SR�MASK�INTERRUPTS0‰MOVE.W„FQBCNT,D0�ARE�THE�NUMBER�OF�BUFFERS�LEFT/‰CMP.W…FQLWM,D0‚AT�OR�BELOW�THE�LOW�WATER�MARK?+‰BLE.S…GTFRBFLW‚YES,�CAN'T�GET�A�BUFFER�NOW/‰SUB.W…#1,FQBCNT�NO,�DECREMENT�COUNT�OF�BUFFERS7‰BMI.S…GTFRBF0ƒOUT�IF�THERE�ARE�NONE�LEFT�(L.W.M.�<=�0)'‰MOVE.L„FREEQHD,A0�BUFFER�ADDRESS�->�A0:‰MOVE.L„SDDLNK(A0),FREEQHD�A(NEXT�BUFFER)�->�HEAD�OF�QUEUE6‰MOVE.W„(A7),SRƒRESTORE�PRIOR�INTERRUPT�LEVEL�A.S.A.P.%‰CLR.L…SDDLNK(A0)�CLEAR�BUFFER'S�LINK#‰MOVE.W„(A7)+,SR‚ASSERT�RETURN�CODE ‰RTS‘RETURN 2GTFRBF0‚ADD.W…#1,FQBCNT�PUT�COUNT�BACK�LIKE�IT�WAS>GTFRBFLW�MOVE.W„(A7),SRƒRESTORE�PRIOR�INTERRUPT�LEVEL�A.S.A.P.)‰CLR.B…1(A7)…ASSERT�"NO�BUFFER�AVAILABLE"1‰MOVE.L„#FLYPAPER,A0�BUFFER�POINTER�=�"BAD"�VALUE#‰MOVE.W„(A7)+,SR‚ASSERT�RETURN�CODE ‰RTS‘RETURN‰PAGEH*************************************************************************Æ*>*ˆSUBROUTINE:‚"SBGTFRML"‚GET�MANY�BUFFERS�FROM�THE�FREE�POOL‚*K *ˆTRAP:ˆ"GTFRML"©*-*ˆENTER:‚D1.W�=�NUMBER�OF�BUFFERS�REQUESTED”*?*ˆRETURN:‚A0.L�=�ADDR�OF�1ST�BUFFER�OF�BUFFER�STRING�SUPPLIED‚*%*‘D1.W�=�NUMBER�OF�BUFFERS�SUPPLIED”**’CCR±*#*“Z�set�ALL�BUFFERS�WERE�SUPPLIED”*$*“N�set�SOME�BUFFERS�WERE�SUPPLIED“* *’neither‚NO�BUFFERS�AVAILABLE—*#*ˆREGISTERS�USED:ƒ0�1�2�3�4�5�6�7�* *˜D�U�R©* *˜A�R�S�**œ|‹|_�stack–**œ|_____________�returned“**Æ*#*�REPLACED�ON�3/6/83,�ED�SKINNER.¦**Æ*H************************************************************************ ‰XDEF†GTFRML,SBGTFRML:GTFRMLƒBSR.S…SBGTFRML‚TRAP�ENTRY�POINT,�DO�THE�SUBROUTINE,+‰MOVE.W„SR,0(A7)‚REPLACE�THE�CONDITION�CODE"‰RTE‘SO�WE�GIVE�PROPER�RETURN�CODE /SBGTFRML�MOVE.W„SR,-(A7)‚SUBROUTINE�ENTRY�POINT$‰CLR.B…1(A7)…ASSUME�WE�WILL�GET�NONE0‰CLR.W…-(A7)…INIT�COUNT�OF�HOW�MANY�WE'VE�GOTTEN-‰CLR.L…-(A7)…INIT�A(LAST�BUFFER�WE'VE�GOTTEN).* STACK: 0(A7).L = A(LAST BUFFER WE'VE GOTTEN)**ˆ4(A7).W�=�COUNT�OF�HOW�MANY�WE'VE�GOTTEN!*ˆ6(A7).W�=�RETURN�CONDITION�CODE9‰TST.W…D1ˆCALLER�WANT�LESS�THAN�OR�EQUAL�TO�ZERO�BUFFERS?$‰CRASH.LE‚*-1‡YES,�COMMIT�HARI-KARI!'‰BRA.S…GTFRMLGB‚NO,�GO�TRY�AND�GET�THEM CGTFRMLGA�BSR.S…SBGTFRBF‚GET�ONE�BUFFER,�CHECKING�THE�LOW�WATER�MARK'‰BNE.S…GTFRMLGS‚OUT�IF�COULDN'T�GET�ONE1‰MOVE.B„#N.SET+Z.CLR,7(A7)�RETURN�CODE�=�GOT�SOME@‰MOVE.L„0(A7),SDDLNK(A0)�NEW�BFR�POINTS�TO�LAST�BFR�WE'VE�GOTTEN=‰MOVE.L„A0,0(A7)‚AND�NEW�BUFFER�BECOMES�THE�LAST�WE'VE�GOTTEN*‰ADDQ.W„#1,4(A7)‚AND�COUNT�HOW�MANY�WE�GET3GTFRMLGB�DBRA†D1,GTFRMLGA�LOOP�TILL�WE�GET�THEM�ALL KGTFRMLGD�MOVE.B„#Z.SET+N.CLR,7(A7)�GOT�ALL�THE�USER�WANTED,�SET�RETURN�CODE9GTFRMLGS�MOVE.L„(A7)+,A0‚A0�=�A(FIRST�BUFFER�IN�THE�LIST)%‰MOVE.W„(A7)+,D1‚D1�=�HOW�MANY�WE�GOT*‰BGT.S…GTFRMLEX‚OUT�IF�WE�GOT�AT�LEAST�ONE3‰MOVE.L„#FLYPAPER,A0�GOT�NONE,�SET�A0�=�BAD�POINTER+GTFRMLEX�MOVE.W„(A7)+,SR‚ASSERT�RETURN�CODE ‰RTS‘RETURN‰PAGEH*************************************************************************Æ*9*ˆSUBROUTINE:‚"SBPTFRBF"‚PUT�A�BUFFER�ON�THE�FREE�QUEUE‡**ˆTRAP:ˆ"PTFRBF"©*'*ˆENTER:‚A0.L�=�ADDRESS�OF�THE�BUFFERš**ˆRETURN:�NO�ARGUMENTS.©*#*ˆREGISTERS�USED:ƒ0�1�2�3�4�5�6�7�**˜D­* *˜A�U�S�**š|�|_�stack–**š|_______________�used—**Æ*#*�REPLACED�ON�3/6/83,�ED�SKINNER.¦**Æ*H************************************************************************ ‰XDEF†PTFRBF,SBPTFRBF:PTFRBFƒBSR.S…SBPTFRBF‚TRAP�ENTRY�POINT,�DO�THE�SUBROUTINE,+‰MOVE.W„SR,0(A7)‚REPLACE�THE�CONDITION�CODE"‰RTE‘SO�WE�GIVE�PROPER�RETURN�CODE /SBPTFRBF�MOVE.W„SR,-(A7)‚SUBROUTINE�ENTRY�POINT/‰CMPA.L„#0,A0…DID�CALLER�PASS�US�A�NIL�POINTER?$‰CRASH.EQ‚*-1‡YES,�COMMIT�HARI-KARI!‰ORI.W…#$700,SR‚MASK�INTERRUPTS9‰MOVE.L„FREEQHD,SDDLNK(A0)�LINK�FREE�QUEUE�TO�THIS�BUFFER?‰MOVE.L„A0,FREEQHD�RETURNED�BUFFER�IS�NOW�THE�HEAD�OF�FREE�POOL'‰ADD.W…#1,FQBCNT�INCREMENT�BUFFER�COUNT.‰MOVE.W„(A7)+,SR‚RESTORE�PRIOR�INTERRUPT�LEVEL)‰MOVE.L„#FLYPAPER,A0�SET�A0�=�BAD�POINTER ‰RTS‘RETURN‰PAGEH*************************************************************************Æ*8*ˆSUBROUTINE:‚"SBPTFRML"‚PUT�A�LINKED�CHAIN�OF�BUFFERSˆ**¡ON�THE�FREE�QUEUE”**ˆTRAP:ˆ"PTFRML"©*:*ˆENTER:‚A0.L�=�ADDRESS�OF�THE�FIRST�BUFFER�IN�THE�CHAIN‡**—OR�NIL�($00000000).œ**ˆRETURN:�NO�ARGUMENTS.©*#*ˆREGISTERS�USED:ƒ0�1�2�3�4�5�6�7�**˜D�U«* *˜A�U�S�**š|�|_�stack–**š|_______________�used—**Æ*#*�REPLACED�ON�3/6/83,�ED�SKINNER.¦**Æ*H************************************************************************ ‰XDEF†PTFRML,SBPTFRML:PTFRMLƒBSR.S…SBPTFRML‚TRAP�ENTRY�POINT,�DO�THE�SUBROUTINE,+‰MOVE.W„SR,0(A7)‚REPLACE�THE�CONDITION�CODE"‰RTE‘SO�WE�GIVE�PROPER�RETURN�CODE *SBPTFRML�MOVE.L„A0,D0…SAVE�A(FIRST�BUFFER) !* D0.L = A(NEXT BUFFER TO RETURN)5PTFRMLNX�MOVE.L„D0,A0…GET�ADDRESS�OF�BUFFER�TO�RETURN ‰TST.L…D05‰BEQ.S…PTFRMLEX‚OUT�IF�ALL�BUFFERS�HAVE�BEEN�RETURNED1‰MOVE.L„SDDLNK(A0),D0�SAVE�ADDRESS�OF�NEXT�BUFFER'‰BSR.S…SBPTFRBF‚RETURN�THE�BUFFER�IN�A04‰BRA.S…PTFRMLNX‚AND�LOOP�TILL�ALL�HAVE�BEEN�RETURNED 1PTFRMLEX�MOVE.L„#FLYPAPER,A0�SET�AK 0�=�BAD�POINTER ‰RTS‘RETURN‰PAGEH*************************************************************************Æ*:*ˆSUBROUTINE:‚"SBPTXMQ"‚PUT�A�BUFFER�ON�A�TRANSMIT�QUEUE†**ˆTRAP:ˆ"PTXMQ"ª*'*ˆENTER:‚A0.L�=�ADDRESS�OF�THE�BUFFERš**ˆRETURN:�CCR³*-*‘Z�set�BUFFER�WAS�LINKED�TO�TRANSMIT�QUEUEŒ*4*‘N�set�ILLEGAL�SDLC�STATION�NUMBER,�THE�BUFFER�IS…*(*šRETURNED�TO�THE�CALLER�IN�THIS�CASE!ˆ*#*ˆREGISTERS�USED:ƒ0�1�2�3�4�5�6�7�**˜D�U«* *˜A�U�U�U‰S�**ž|‰|_�stack–**ž|___________�used—**Æ*#*�REPLACED�ON�3/6/83,�ED�SKINNER.¦**Æ*H************************************************************************ ‰XDEF†PTXMQ,SBPTXMQ8PTXMQ„BSR.S…SBPTXMQƒTRAP�ENTRY�POINT,�DO�THE�SUBROUTINE,+‰MOVE.W„SR,0(A7)‚REPLACE�THE�CONDITION�CODE"‰RTE‘SO�WE�GIVE�PROPER�RETURN�CODE .SBPTXMQ‚MOVE.W„SR,-(A7)‚SUBROUTINE�ENTRY�POINT ‰CLR.L…D0+‰CMPA.L„#0,A0…CALLER�PASS�US�A�NIL�POINTER?)‰CRASH.EQ‚*-1‡COMMIT�HARI-KARI�IF�HE�DID!8‰MOVE.B„SDDSEC(A0),D0�GET�STATION�NUMBER�FROM�THE�BUFFER@‰MOVE.L„SDLCPCB,A1�GET�POINTER�TO�THE�PRIMARY�CONTROL�BLOCK,�AND?‰MOVE.L„SDPFSEC(A1),A1�THEREFROM�THE�1ST�SECONDARY�CB'S�ADDRESS,‰CMP.B…#$FF,D0ƒBUFFER�GOING�TO�ALL�STATIONS?;‰BEQ.S…PTXMQ04ƒYES,�PUT�THE�MESSAGE�ON�FIRST�SCB�REGARDLESS O* SCAN THRU THE SECONDARY CONTROL BLOCKS LOOKING FOR A MATCHING STATION ADDRESSBPTXMQ02‚CMP.B…SDSSEC(A1),D0�IS�THIS�THE�DESTINATION�STATION'S�SCB?;‰BEQ.S…PTXMQ04ƒYES,�WE'VE�FOUND�THE�CORRECT�SCB�(SEE�BELOW):‰ADD.L…#SDSLNG,A1�NO,�FETCH�NEXT�(CONSECUTIVE)�SCB�ADDRESS-‰TST.B…SDSSEC(A1)�IS�THERE�ANOTHER�ONE�THERE?@‰BNE.S…PTXMQ02ƒYES,�LOOP�TILL�WE�FIND�CORRECT�ONE�(OR�REACH�END)6‰MOVE.B„#N.SET+Z.CLR,1(A7)�NO,�ILLEGAL�STATION�NUMBER!0‰MOVE.W„(A7)+,SR‚ASSERT�RETURNING�CONDITION�CODE‰RTS‘AND�RETURN D* TARGET SCB FOUND, PREPARE THE BUFFER FOR TRANSMISSION AND QUEUE IT8PTXMQ04‚CLR.W…SDDSTS(A0)�YES,�ASSERT�NO�REPORTED�ERRORS,,‰CLR.B…SDDERR(A0)�AND�NO�ERRORS�OF�ANY�KIND,(‰CLR.B…SDDRSP(A0)�AND�NO�RESPONSE�(YET),0‰CLR.L…SDDLNK(A0)�AND�NO�BUFFERS�AFTER�THIS�ONE,?‰MOVE.B„SDSSRT(A1),SDDRTC(A0)�AND�FINALLY,�A�FRESH�RETRY�COUNT.!‰ORI.W…#LEVEL7,SR�MASK�INTERRUPTS4‰MOVE.L„SDSTND(A1),A2�LINK�BCB�TO�END�OF�TxMIT�QUEUE.‰TST.L…SDSTHD(A1)�IS�THE�TRANSMIT�QUEUE�EMPTY?0‰BNE.S…PTXMQ06ƒNO,�LINK�TO�TAIL�OF�CURRENT�QUEUE?‰LEA‡SDSTHD-SDDLNK(A1),A2�YES,�NEW�BUFFER�IS�HEAD�OF�QUEUE�ALSOCPTXMQ06‚MOVE.L„A0,SDSTND(A1)�TAIL�OF�QUEUE�POINTS�TO�THE�NEW�BUFFER7‰MOVE.L„A0,SDDLNK(A2)�WHICH�GLUES�ONTO�TAIL�OF�LAST�ONE;* ZERO THIS STATIONS TIMER SO WE WILL SEND TRAFFIC A.S.A.P.?‰CLR.W…SDSCTD(A1)�********�TEMPORARY�UNTIL�EXPEDITED�TXMIT�DONE6‰MOVE.W„(A7),SRƒRESTORE�PRIOR�INTERRUPT�LEVEL�A.S.A.P.(* TELL SDLC THERE IS NEW TRAFFIC TO SEND=‰BSR.L…SDLCQUSB‚********�TEMPORARY�UNTIL�EXPEDITED�TXMIT�DONE;‰MOVE.B„#Z.SET+N.CLR,1(A7)�RETURN�CC�=�BUFFER�WAS�LINKED�OK)‰MOVE.L„#FLYPAPER,A0�SET�A0�=�BAD�POINTER0‰MOVE.W„(A7)+,SR‚ASSERT�RETURNING�CONDITION�CODE‰RTS‘AND�RETURN‰PAGEH*************************************************************************Æ*8*ˆSUBROUTINE:‚"SBPTUSQ"‚PUT�A�BUFFER�ON�THE�USER�QUEUEˆ**ˆTRAP:ˆ"PTUSQ"ª*'*ˆENTER:‚A0.L�=�ADDRESS�OF�THE�BUFFERš**ˆRETURN:ƒNO�ARGUMENTS.§*#*ˆREGISTERS�USED:ƒ0�1�2�3�4�5�6�7�**˜D�U«* *˜A�U�U�U‰S�**ž|‰|_�stack–**ž|___________�used—**Æ*#*�REPLACED�ON�3/6/83,�ED�SKINNER.¦**Æ*H************************************************************************ ‰XDEF†PTUSQ,SBPTUSQ8PTUSQ„BSR.S…SBPTUSQƒTRAP�ENTRY�POINT,�DO�THE�SUBROUTINE,+‰MOVE.W„SR,0(A7)‚REPLACE�THE�CONDITION�CODE"‰RTE‘SO�WE�GIVE�PROPER�RETURN�CODE .SBPTUSQ‚MOVE.W„SR,-(A7)‚SUBROUTINE�ENTRY�POINT(‰MOVE.L„A0,D0…CALLER�PASS�A�NIL�POINTER?)‰CRASH.EQ‚*-1‡COMMIT�HARI-KARI�IF�HE�DID!0‰CLR.L…SDDLNK(A0)�CLEAR�BUFFER'S�FORWARD�POINTER"‰ORI.W…#LEVEL7,SR�MASK�INTERRUPTS!3‰MOVE.L„USERQND,A2�LINK�BUFFER�TO�END�OF�USER�QUEUE"‰MOVE.L„A2,D0…IS�USER�QUEUE�EMPTY?‰BNE.S…PTUSQ02:‰LEA‡USERQHD,A2�YES,�LINK�TO�HEAD�OF�QUEUE�AS�WELL�AS�TAILEPTUSQ02‚MOVE.L„A0,USERQND�TAIL�OF�USER�QUEUE�IS�ADDRESS�OF�NEW�BUFFER=‰MOVE.L„A0,SDDLNL K(A2)�AND�GLUE�US�TO�TAIL�BUFFER�(OR�TO�HEAD)7‰MOVE.W„(A7)+,SR‚RESTORE�PRIOR�INTERRUPT�LEVEL�A.S.A.P.+‰MOVE.L„NATBEG,D0�NETWORK�SERVICES�PRESENT?‰BEQ.S…PTUSQEXT‚NO,�JUST�EXIT 4* WAKE UP NETWORK SERVICES WHEN USER TRAFFIC ARRIVESC* (APPARENTLY THIS CODE WORKS, BUT I HAVEN'T "WALKED THRU" IT TO BE)* SURE OF THIS AS OF 3/6/83 - ED SKINNER)&‰MOVE.L„D0,A0…FETCH�TCB�OF�"SSCT"�TASK‰MOVE.L„#SSCNAU-1,D0‰MULU†#NATESIZ,D0‰LEA‡NATENTRY(A0,D0),A0‰MOVE.L„NATTCB(A0),A0 ‰TR0$.WAKEUP 1PTUSQEXT�MOVE.L„#FLYPAPER,A0�SET�A0�=�BAD�POINTER ‰RTS‘RETURN‰PAGEH*************************************************************************Æ*<*ˆSUBROUTINE:‚"SBGTUSQ"‚GET�ONE�BUFFER�FROM�THE�USER�QUEUE„**ˆTRAP:ˆ"GTUSQ"ª**ˆENTER:ƒNO�ARGUMENTS.¨*-*ˆRETURN:‚A0.L�=�ADDRESS�OF�BUFFER�SUPPLIED”**’CCR±**“Z�set�BUFFER�WAS�SUPPLIEDš**’not�set‚NO�BUFFER�AVAILABLE˜*#*ˆREGISTERS�USED:ƒ0�1�2�3�4�5�6�7�**˜D�U«* *˜A�R�S�**š|�|_�stack–**š|_______________�returned“**Æ*#*�REPLACED�ON�3/6/83,�ED�SKINNER.¦**Æ*H************************************************************************ ‰XDEF†GTUSQ,SBGTUSQ8GTUSQ„BSR.S…SBGTUSQƒTRAP�ENTRY�POINT,�DO�THE�SUBROUTINE,+‰MOVE.W„SR,0(A7)‚REPLACE�THE�CONDITION�CODE"‰RTE‘SO�WE�GIVE�PROPER�RETURN�CODE .SBGTUSQ‚MOVE.W„SR,-(A7)‚SUBROUTINE�ENTRY�POINT3‰MOVE.B„#Z.SET,1(A7)�ASSUME�BUFFER�WILL�BE�SUPPLIED"‰ORI.W…#LEVEL7,SR�MASK�INTERRUPTS!$‰MOVE.L„USERQHD,D0�USER�QUEUE�EMPTY?‰BEQ.S…GTUSQ02ƒYES,�OUT&‰MOVE.L„D0,A0…NO,�BUFFER�ADDRESS�->�A0<‰MOVE.L„SDDLNK(A0),USERQHD�ADDR�OF�NEXT�BUFFER�TO�QUEUE�HEAD4‰BNE.S…GTUSQ01ƒOUT�IF�QUEUE�DIDN'T�JUST�BECOME�EMPTY+‰CLR.L…USERQNDƒYES,�CLEAR�END�OF�QUEUE�ALSO=GTUSQ01‚MOVE.W„(A7),SRƒRESTORE�PRIOR�INTERRUPT�LEVEL�A.S.A.P./‰CLR.L…SDDLNK(A0)�CLEAR�RETURNING�BUFFER'S�LINK'‰MOVE.W„(A7)+,SR‚ASSERT�THE�RETURN�CODE‰RTS‘AND�RETURN %* NO BUFFERS IN THE USER QUEUE TO GET=GTUSQ02‚MOVE.W„(A7),SRƒRESTORE�PRIOR�INTERRUPT�LEVEL�A.S.A.P.(‰CLR.B…1(A7)…ASSERT�GOT�NONE�RETURN�CODE)‰MOVE.L„#FLYPAPER,A0�RETURN�A�BAD�POINTER'‰MOVE.W„(A7)+,SR‚ASSERT�THE�RETURN�CODE‰RTS‘AND�RETURN‰ENDéééééé=/*=/*†SDLC.BUFMGTX.AF=/*1=/* Chain file to assemble module SDLC.BUFMGTX.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to SDLC.BUFMGTX.LS=/*=/IFC \1ƒ=ARG�SDLC.BUFMGTX.LS=/ENDIF=/*L -=ASM SDLC.BUFMGTX.SA,SDLC.BUFMGTX.RO,\1;RZ=60=/*{ Included files are:=/*ƒ9995.&.CRASH.MC=/*ƒ9995.NTS.NAT.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.SDLCPRI.TEMPLTS.EQ=/*}=/*=ENDéééééé ‡.BUFMGTX‚IDNT†2,0‡BUFFER�MANAGEMENT�SUBROUTINES>‰TTL‡BUFFER�MGT�SUBROUTINES�(Copyright�1982�by�Motorola,�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*************************************************************************Æ**Æ**šBUFFER�MANAGEMENT›**Æ**Æ* *•NETWORK�SERVICES�/�SDLC�ONLY•**Æ**Æ**˜SHARED�RAM/BUFFER�POOL˜**Æ**Æ*H************************************************************************   H*************************************************************************Æ*E*�WARNING:�"PTXMQ"�CONTAINS�AN�IMPLEMENTATION�RESTRICTION�WHICH�HAS„*F*�NOT�BEEN�RESOLVED�YET.‚"PTXMQ"�ASSUMES�THAT�IF�MEMOFF�IS�ZERO�THEN‚*C*�THE�SDLC�DRIVER�IS�PRESENT�IN�THE�SAME�MPU.‚IN�EXISTING�USES�OF…*D*�THIS�MODULE,�THAT�IS�TRUE.‚HOWEVER�IT�MAY�NOT�ALWAYS�BE�TRUE.‚ATƒ*D*�SOME�FUTURE�TIME,�"PTXMQ"�SHOULD�BE�CHANGED�TO�DETERMINE�IF�SDLC…*E*�EXISTS�IN�THE�SAME�MPU�IN�A�MORE�DIRECT�FASHION,�AND�THEREBY�LIFT„*E*�THIS�RESTRICTION.‚A�WARNING�IS�GENERATED�WITHIN�"PTXMQ"�TO�ACT�ASƒ*#*�A�REMINDER�OF�THIS�RESTRICTION.¦**Æ*H************************************************************************ ‰PAGE H*************************************************************************Æ*E*ƒTHIS�MODULE�IS�USED�IN�ALL�PROCESSORS�WHICH�ACCESS�THE�SHARED�RAM‚*D*�AREA�CONTAINING�THE�SHARED�BUFFERS.‚TWO�SYSGEN�DEFINED�CONSTANTS„*D*�WHICH�ARE�UNIQUE�TO�THE�PROCESSOR�USING�THIS�CODE�ARE�IMPORTANT.…*A*„"SYSPOFF"�IS�A�LONG�WORD�CONTAINING�THE�OFFSET�THIS�PROCESSOR…*9*‡MUST�USE�IN�ACCESSING�THE�FREE�POOL�CONTROL�AREA,�ANDŠ*E*„"MEMOFF"�IS�A�LONG�WORD�CONTAINING�THE�OFFSET�THIS�PROCESSOR�MUST�*(*‡USE�IN�ACCESSING�INDIVIDUAL�BUFFERS.›**Æ**„-„-„-„-„-„-„-„-„-„-„-„-„-…**Æ*A*„<-------�MPU�A's�View�------->�<-------�MPU�B's�View�------->…**Æ*M  �< ™* ¡& ©? ±0 ¹9 Á/ É6 Ñ4 Ù< á* é0*’+-------------+¥*1*„$00000000�-->�!�!ƒ(MPU�B�Cannot�"see"�MPU�A's‡*)*’!ƒPrivateƒ!…private�RAM�area�at�all.)‡* *’!…RAM…!¥**„$00FBFFFF�-->�!�!¥**’+-------------+¥**š+-------------+�*5*„$00FC0000�---------->�!�!�<------------�$00000000…**š!ƒShared„!�* *š!…RAM…!�*5*„$00FFFFFF�---------->�!�!�<------------�$0003FFFF…**š+-------------+�**Æ*+*„SYSPOFF�=�$00FC0C00—SYSPOFF�=�$00000000…*)*„MEMOFF‚=�$00FC0000—MEMOFF‚=�$00000000…**Æ**„-„-„-„-„-„-„-„-„-„-„-„-„-…**Æ*D*„THIS�DIAGRAM�REPRESENTS�THE�EXORMACS/VM02�CONFIGURATION�USED�FOR‚*G*�NETWORK�SERVICES�QUITE�OFTEN.‚THE�VM02'S�ONBOARD�MEMORY�IS�"SHARED"�*G*�BETWEEN�THE�PROCESSORS.‚THE�VM02�"SEES"�THIS�AREA�BEGINNING�AT�ZERO,*8*�WHILE�THE�EXORMACS�"SEES"�IT�BEGINNING�AT�$00FC0000.‘*D*„MEMOFF�IS�THE�OFFSET�TO�THE�SHARED�RAM�AREA.‚IN�THE�VM02,�MEMOFF�*<*�WILL�BE�ZERO.‚IN�THE�EXORMACS,�MEMOFF�WILL�BE�$00FC0000.Œ*B*„SYSPOFF�IS�THE�OFFSET�TO�THE�SYSPAR�AREA.‚IN�THE�VM02,�SYSPOFFƒ*=*�WILL�BE�ZERO.‚IN�THE�EXORMACS,�SYSPOFF�WILL�BE�$00FC0C00.‹*B*„IN�BOTH�PROCESSORS�THEN,�THE�BUFFER�POOL�QUEUE�CONTROL�AREA�(A„*F*�VM02�SYSPAR�CONSTRUCT)�IS�ACCESSED�AT�"FREQHD+SYSPOFF".‚SIMILARLY,‚*E*�A�GIVEN�BUFFER�MAY�BE�ACCESSED�IN�EITHER�MPU�AS�"BUFADDR+MEMOFF",„*:*�AND�THE�USER�QUEUE�MAY�BE�FOUND�AT�"USERQUEUE+MEMOFF".�*E*„HOWEVER,�SINCE�BUFFERS�IN�THE�FREE�POOL�AND�USER�QUEUE�ARE�LINKED�*E*�AND�MANIPULATED�BY�EITHER�PROCESSOR,�WHO'S�"VIEW"�OF�ADDRESSES�IS„* *�USED?À*C*„BY�CONVENTION,�BUFFERS�IN�THESE�AREAS�ARE�LINKED�TOGETHER�USINGƒ*C*�NO�OFFSET�WHATSOEVER.‚ANY�PROCESSOR�ACCESSING�THEM�WILL�HAVE�TO…*G*�INCLUDE�ITS�OWN�MEMOFF�IN�ACCESSING�THE�BUFFERS,�OR�ITS�OWN�SYSPOFF‚*G*�IN�ACCESSING�THE�CONTROL�AREA.‚(BECAUSE�SYSPOFF�AND�MEMOFF�ARE�BOTH�*C*�ZERO�IN�THE�VM02,�IT�WOULD�APPEAR�THAT�THE�POOL�USES�THE�VM02'S†*D*�OFFSETS.‚THIS�WILL�NOT�BE�THE�CASE�HOWEVER�WHERE�BOTH�PROCESSORS„*B*�ARE,�FOR�EXAMPLE,�VM02'S.‚ONE�WILL�HAVE�ZERO�OFFSETS�WHILE�THE†* *�WILL�HAVE�NON-ZERO�OFFSETS.)©**Æ*H************************************************************************‰PAGEH*************************************************************************Æ*C*„THESE�ROUTINES�IMPLEMENT�A�BUFFER�MANAGEMENT�SYSTEM�UTILIZING�Aƒ*E*�QUEUE�OF�SHARED�"FREE�BUFFERS".‚THE�BUFFERS�EXIST�IN�A�SHARED�RAMƒ*E*�AREA�OF�MEMORY,�AND�A�"LOCK"�IS�USED�ON�THE�QUEUE�HEAD�POINTER�TO„*D*�INSURE�EXCLUSIVE�ACCESS�TO�THE�POOL�CONTROL�AREA�DURING�UPDATES.…*F*�THESE�ROUTINES�SHOULD�BE�USED�IN�***ALL***�PROCESSORS�WHICH�ACCESSƒ*F*�AND/OR�MANIPULATE�THE�QUEUE�CONTROL�AREA.‚A�"LOW�WATER�MARK"�LEVEL‚*H* IS DEFINED WHICH PREVENTS APPLICATIONS (OR FUNCTIONS ON THEIR BEHALF)*-*�FROM�COMPLETELY�DRAINING�THE�BUFFER�POOL.œ**Æ*A*„"SBGTFRIR"�(AND�"GTFRIR")�IGNORE�THE�LOW�WATER�MARK,�AND�WILL…*E*�SUPPLY�ONE�BUFFER�FROM�THE�POOL.‚AN�INDICATION�IS�RETURNED�IF�THEƒ*E*�POOL�HAS�JUST�BECOME�EMPTY.‚THIS�MODULE�SHOULD�NOT�BE�USED�BY,�ORƒ*F*�ON�BEHALF�OF�APPLICATIONS.‚IT�IS�INTENDED�FOR�LOW�LEVEL,�HIGH�PER-‚*G*�FORMANCE�ROUTINES�ONLY�WHICH�MAY�USE�THE�LAST�BUFFER�FROM�THE�POOL.‚**Æ*D*„"SBGTFRBF"�(AND�"GTFRBF")�RETURN�ONE�BUFFER�IF�THE�POOL�IS�ABOVE‚*H* THE LOW WATER MARK, OTHERWISE A "NOT AVAILABLE" INDICATION IS GIVEN. **Æ*E*„"SBGTFRML"�(AND�"GTFRML")�RETURN�MANY�BUFFERS�FROM�THE�POOL�UP�TO�*H* A REQUESTED NUMBER, OR UNTIL THE LOW WATER MARK IS REACHED, WHICHEVER*G*�OCCURS�FIRST.‚THE�RETURNED�BUFFERS�ARE�LINKED�TOGETHER�AND�THE�FIRST*F*�BUFFERS�ADDRESS,�THE�NUMBER�OF�BUFFERS�RETURNED,�AND�A�RETURN�CODEƒ*#*�OF�ALL,�SOME,�OR�NONE�IS�GIVEN.¦**Æ*B*„"SBPTFRBF"�(AND�"PTFRBF")�RETURN�A�SINGLE�BUFFER�BACK�INTO�THE„* *�POOL.À**Æ*A*„"SBPTFRML"�(AND�"PTFRML")�RETURN�"MANY"�BUFFERS�BACK�INTO�THE…* *�POOL.À**Æ*E*„"SBPTXMQ"�(AND�"PTXMQ")�PUT�A�SINGLE�BUFFER�ON�TM HE�TRANSMIT�QUEUE�*G*�OF�THE�APPROPRIATE�SECONDARY�STATION'S�CONTROL�BLOCK.‚IF�THE�PASSED�*D*�SECONDARY�STATION�NUMBER�IS�INVALID�(I.E.,�THE�SECONDARY�STATION…*F*�CONTROL�BLOCK�CANNOT�BE�FOUND),�AN�ERROR�INDICATION�IS�RETURNED�ASƒ*E*�WELL�AS�THE�BUFFER.‚IF�THE�STATION�NUMBER�IS�VALID,�THE�BUFFER�ISƒ*D*�ENQUEUED�TO�THE�APPROPRIATE�SECONDARY�STATION�CONTROL�BLOCK,�THE…*G*�SDLC�DRIVER�IS�NOTIFIED�OF�THE�TRAFFIC'S�ARRIVAL,�AND�A�GOOD�RETURN‚*4*�CODE�(AND�NO�BUFFER)�ARE�RETURNED�TO�THE�CALLER.•**Æ*D*„"SBPTUSQ"�(AND�"PTUSQ")�PUT�A�SINGLE�BUFFER�ON�THE�"USER�QUEUE".‚*F*�WHERE�THE�HOSTING�SYSTEM�CONTAINS�NETWORK�SERVICES,�IT�IS�NOTIFIEDƒ**�OF�THE�BUFFER'S�ARRIVAL.­**Æ*E*„"SBGTUSQ"�(AND�"GTUSQ")�GET�A�SINGLE�BUFFER�FROM�THE�"USER�QUEUE",*G*�RETURNING�AN�INDICATION�OF�WHETHER�OR�NOT�A�BUFFER�WAS�OBTAINED.‚IF�*H* NO BUFFER IS AVAILABLE, A "BAD" POINTER IS RETURNED FACILITATING THE **�FINDING�OF�BUGS.µ**Æ*H************************************************************************‰PAGEH*************************************************************************Æ*0*ˆSYMBOL�DEFINITIONS�USED�WITHIN�THESE�MODULES’**Æ*H************************************************************************ )* CONDITION CODE REGISTER BIT DEFINITIONS $N.SET„EQU‡%00001000�NEGATIVE�BIT�SET Z.SET„EQU‡%00000100�ZERO�BIT�SET$V.SET„EQU‡%00000010�OVERFLOW�BIT�SET!C.SET„EQU‡%00000001�CARRY�BIT�SET &N.CLR„EQU‡%00000000�NEGATIVE�BIT�CLEAR"Z.CLR„EQU‡%00000000�ZERO�BIT�CLEAR&V.CLR„EQU‡%00000000�OVERFLOW�BIT�CLEAR#C.CLR„EQU‡%00000000�CARRY�BIT�CLEAR   (* INTERRUPT LEVEL WITHIN STATUS REGISTER 'LEVEL7ƒEQU‡$0700…LEVEL�7�INTERRUPT�MASK   * LOCK BIT WITHIN AN ADDRESS *LOCKBIT‚EQU‡$80000000�MOST�SIGNIFICANT�BIT   )* AN ADDRESS VALUE WHICH HELPS CATCH BUGS AFLYPAPER�EQU‡$FFFFFFFF�(IT'S�AN�ODD�NUMBER,�MOVE.W/.L�WILL�FAIL!) ‰PAGEH*************************************************************************Æ*=*ˆSUBROUTINE:‚"SBGTFRIR"‚GET�ONE�BUFFER�FROM�THE�FREE�QUEUEƒ**ˆTRAP:ˆ"GTFRIR"©**ˆENTER:�NO�ARGUMENTS.ª*(*ˆRETURN:‚A3.L�=�POINTER�TO�THE�BUFFER™**’CCR±*/*‘Z�set‚BUFFER�WAS�SUPPLIED�(NOT�LAST�BUFFER)‰*"*‘N�set‚LAST�BUFFER�WAS�SUPPLIED–**‘neither‚NO�BUFFER�AVAILABLE™*:*ˆNOTE:‚THIS�ROUTINE�IS�TO�BE�USED�ONLY�BY�THE�DLC�LEVEL‡*/*�BECAUSE�IT�WILL�SUPPLY�THE�VERY�LAST�BUFFERŒ*#*ˆREGISTERS�USED:ƒ0�1�2�3�4�5�6�7�**˜D­* *˜A‡R‡S�** |‡|_�stack–** |_________�returned“**Æ*#*�REPLACED�ON�3/8/83,�ED�SKINNER.¦**Æ*H************************************************************************ ‰XDEF†GTFRIR,SBGTFRIR9GTFRIRƒBSR.S…SBGTFRIR‚TRAP�ENTRY�POINT,�DO�THE�SUBROUTINE+‰MOVE.W„SR,0(A7)‚REPLACE�THE�CONDITION�CODE"‰RTE‘SO�WE�GIVE�PROPER�RETURN�CODE /SBGTFRIR�MOVE.W„SR,-(A7)‚SUBROUTINE�ENTRY�POINT‰MOVE.L„A1,-(A7)A‰MOVE.B„#Z.SET+N.CLR,5(A7)�ASSUME�"BUFFER�WAS�SUPPLIED,�NOT�LAST";‰MOVE.L„SYSPOFF,A1�GET�THE�LOCAL�OFFSET�TO�THE�CONTROL�AREA H* THE FOLLOWING TST OF MEMOFF AND BNE INSTRUCTIONS ARE FOR TEMPORARY USEH*�ONLY.‚I�WANT�TO�SEE�IF�ANYONE�IS�USING�THIS�SUBROUTINE�IN�THE�EXORMACSA*�MPU�-�WHICH�SHOULD�NOT�BE�HAPPENING.†ED�SKINNER,�MARCH�9,�1983. ‰TST.L…MEMOFF6‰CRASH.NE‚*-1‡DIE�IF�NOT�RUNNING�IN�THE�VM02�WITH�SDLC 7* OBTAIN EXCLUSIVE ACCESS TO THE FREE POOL CONTROL AREA6GTFRIRLK�MOVE.W„4(A7),SR‚RESTORE�PRIOR�INTERRUPT�LEVEL!‰ORI.W…#LEVEL7,SR�MASK�INTERRUPTS(‰TAS‡FREEQHD(A1)�ATTEMPT�TO�SET�THE�LOCK3‰BMI.S…GTFRIRLK‚LOOP�IF�FAILED�(ANOTHER�MPU�HAS�IT),‰CRASH.NE‚*-1‡CRASH�IF�LOCK�BYTE�IS�CORRUPT! .* FREEQHD IS LOCKED AND INTERRUPTS ARE MASKED!/‰SUB.W…#1,FQBCNT(A1)�DECREMENT�COUNT�OF�BUFFERS;‰BGT.S…GTFRIR1ƒOUT�IF�AT�LEAST�ONE�REMAINS�AFTER�WE�GET�ONE)‰BMI.S…GTFRIR0ƒOUT�IF�NOT�EVEN�ONE�FOR�US=* EXACTLY ONE LEFT, WE WILL NOW GET IT LEAVING THE POOL EMPTY<‰MOVE.B„#N.SET+Z.CLR,5(A7)�ASSERT�"LAST�BUFFER�WAS�SUPPLIED"0‰CLR.L…FREEQND(A1)�AND�CLEAR�POOL'S�TAIL�POINTEREGTFRIR1‚MOVE.L„FREEQHD(A1),A3�HEAD�BUFFER�ADDR�->�A3�(NO�OFFSET�YET!))‰SUBA.L„#LOCKBIT,A3�TURN�OFF�THE�LOCK�BIN T8‰ADD.L…MEMOFF,A3�COMPUTE�WHERE�WE�"SEE"�THE�BUFFER�TO�BE9‰BSET†#7,SDDLNK(A3)‚SET�LOCK�BIT�IN�NEXT�BUFFER'S�ADDRESS3‰CRASH.NE‚*-1‡COMMIT�HARI-KARI�IF�IT'S�ALREADY�SET!B‰MOVE.L„SDDLNK(A3),FREEQHD(A1)�STORE�NEW�HEAD�PTR,�ALREADY�LOCKED!)‰BCLR†#7,FREEQHD(A1)�AND�RELEASE�THE�LOCK7‰CRASH.EQ‚*-1‡COMMIT�HARI-KARI�IF�IT�WAS�ALREADY�CLEAR!7‰MOVE.W„4(A7),SR‚RESTORE�PRIOR�INTERRUPT�LEVEL�A.S.A.P.,‰CLR.L…0(A3)…CLEAR�THE�BUFFER'S�FORWARD�LINK‰CLR.L…4(A3)…CLEAR‰CLR.L…8(A3)ŠOTHER�PARTS#‰CLR.L…12(A3)”OF�THE�BUFFER�AS�WELL‰MOVE.L„(A7)+,A1#‰MOVE.W„(A7)+,SR‚ASSERT�RETURN�CODE ‰RTS‘RETURN 1* NO BUFFERS LEFT AT ALL, NOT EVEN ONE FOR CALLER6GTFRIR0‚ADD.W…#1,FQBCNT(A1)�PUT�COUNT�BACK�LIKE�IT�WAS4‰CRASH.NE‚*-1‡SHOULD�BECOME�ZERO!�DIE�IF�IT�DOESN'T!)‰BCLR†#7,FREEQHD(A1)�AND�RELEASE�THE�LOCK7‰CRASH.EQ‚*-1‡COMMIT�HARI-KARI�IF�IT�WAS�ALREADY�CLEAR!7‰MOVE.W„4(A7),SR‚RESTORE�PRIOR�INTERRUPT�LEVEL�A.S.A.P.)‰CLR.B…5(A7)…ASSERT�"NO�BUFFER�AVAILABLE"1‰MOVE.L„#FLYPAPER,A3�BUFFER�POINTER�=�"BAD"�VALUE‰MOVE.L„(A7)+,A1#‰MOVE.W„(A7)+,SR‚ASSERT�RETURN�CODE ‰RTS‘RETURN‰PAGEH*************************************************************************Æ*=*ˆSUBROUTINE:‚"SBGTFRBF"‚GET�ONE�BUFFER�FROM�THE�FREE�QUEUEƒ**ˆTRAP:ˆ"GTFRBF"©**ˆENTER:�NO�ARGUMENTS.ª*-*ˆRETURN:‚A0.L�=�ADDRESS�OF�BUFFER�SUPPLIED”**’CCR±**“Z�set�BUFFER�WAS�SUPPLIEDš**’not�set‚NO�BUFFER�AVAILABLE˜*A*ˆNOTE:‚THIS�ROUTINE�WILL�NOT�DEPLETE�THE�FREE�QUEUE�COMPLETELY�*5*�IT�WILL�SUPPLY�BUFFERS�DOWN�TO�THE�LOW�WATER�MARK†*#*ˆREGISTERS�USED:ƒ0�1�2�3�4�5�6�7�**˜D�U«* *˜A�R�S�**š|�|_�stack–**š|_______________�returned“**Æ*#*�REPLACED�ON�3/8/83,�ED�SKINNER.¦**Æ*H************************************************************************ ‰XDEF†GTFRBF,SBGTFRBF9GTFRBFƒBSR.S…SBGTFRBF�TRAP�ENTRY�POINT,�DO�THE�SUBROUTINE+‰MOVE.W„SR,0(A7)‚REPLACE�THE�CONDITION�CODE"‰RTE‘SO�WE�GIVE�PROPER�RETURN�CODE /SBGTFRBF�MOVE.W„SR,-(A7)‚SUBROUTINE�ENTRY�POINT3‰MOVE.B„#Z.SET,1(A7)�ASSUME�BUFFER�WééééééééN ééééééééééééééééO ééééééééééééééééO éééééééééééééééé