IMD 1.17: 11/11/2014 13:00:43 82VKXBVERDOS B* VERSADOS/RMS68K OBJECT 4.3 SN=39358 9 OF 11  BT0982VKXBVERDOS 0420p-*g>*g Rja* f@* g,f-` ,g` BX,Aa Vffa|``HAP$8>&68@HC(HD4<  g 4<8***HB* g2Hz,* m6a``NqL8`Lp&*HC64*AaNqL R`|@|$%|#JFNuI L g(@l%B$ Nu"x,A ?F'"HJfNs Qmhl/(?(Bh (RhШ l!@B0("((f""x, #H!|FNu94ga`*_a _N`L\?_f,JgafJ9[g|aAa `tNs@9 4ga& HNi/ /9b oF,hHV/(@@?"h 0P*n6`2 f\,_( !TCBgaJ@gZ @f Aa7@`J @fBJf&HC4<HBAa Nq`(HBHA(&64< HB4`&T(,_" !TCBga`C=C^Aa6J@g$< HCHD6`.xF aM"NJ g|,i 0.,@f#n -! K.r?%2 fB8[|1TR-fd.-fh-fhJg*n6a n`JngAavHz`>Hz`Aa`Hzr`JnfB@A-o|rNuHV,x H?-_8Ni-I<"x=iNuEs,)g`"E(NGs*rg$<42&26,(gK,$( *,,,p<,.,>, ,"0<2 gB@2g<,*.,(>,H@0,H@"@Jf -@g4&@4+HC6+HCAa@JgH@(Aa `0L ra,sf-|OGB.A.NuL,s Rr  ,Nu1G*Bh\)!|EXEC!| <(,1F.g$F- g1F,|& faNu1F,X <1W!o`a aaaaaaaaaa a aaaaNq?/_g/ gaa8 4g @a TK`vLaaaaaaa a aNqNqa Nq`"`6`>?/_gL/ fXNs?/_g0/ gNa"/ f?/ _g/ g&aar8 4g @a TK` H. n2-4.(g^2-,6"m܁z n6a`Nq`<"FJg6*8,.< n6a`Nq`(F-C<&88߿f/?,<<`B m n-_-_.)g".Hg a@ n|Jfv n,C 1pfHzf`=@=|GB.`DJFf>Aa Hz`j P` `X~$.HffdfLL`z,.P n6a `Nq`&~ F&(.Tf ȮLg-CT`"RȮLggRnX .XnXb~Hz`X oBEgaFNu./,x g*/ f".)g.H8gH,_"Ns,_"/86Nua$< 4.&.(.8L<A@a`)Lt-@&Nu ,`v@Hp "x,G F'$K&g&&Cf$JAj.&#K'|LTNuJAk&)fT`&C#SFB'@ '@'H'BBBkgIAA 7AaӫF'& #K LTNuH@!Ni!H!L"x:3|3|3|3||`@|84ga FNu|84ga NsNu|%a|`LH1!|LNs@|Jk0H@S@0kFNua>T.raF.xAa` ,B (f!NNu*@ - f+N Nu.&|&-HtH 8K Poa. IpGr8U@nL0Nu@|Jk0H@R@o0FNu/ "h!i 0B  ,"_FNu/ xNBB8Z 0IDAxXIҸBJ8Zf _Nup($@&`h$&@-f,H@ E|(&"* g Ê*&cÊ!A %H LFNuJtf|H!tF<.xt|90 0.xtLBtNsRx\ xd\k$/ "x:3|3|53|.3|>"_Bx\Nsp jnL $: 0H(@* &&%z %n ,,(f#R +,$,8* <," #L #D   <"XBT $n, t !>  Z XT>#H x:| xNPZ(( B28VӸB 8B&\k:R>!B <&\"x,@| i "g P`F i"g P`"x,J g0/@'@ "8BaL8 4gaJxTg SxRnP[`rfNsT %bЀ0;"N %cTNu/ҁ2; A"Nu"@&|P,`B~ "B+vx ~&n.?_f\a=n\84ga6.)g".Hg~a=@|BnJ@kZ (nE%4*?g0B, n6a`NqTn`d(FgAan`Vn`N*HHy(N$x($ gND@jnFS EJg6*f"f&?*$jHy(@N0AbN=|`j=|Ns*I"H Q")a`TNu"M !TCBf*H(m@ !ASQf`T`n !TCBf*H(m@ gP[,fT`B"a ``H<ta4gH`ta$Jg/a:`T(fNuNuA6طe&lUBgUfNuUANuH&B4fx`HC2xf6px ga>KIB$I"xfFJQk$1@f&i OJgg`HSAaaC QfB g| g4o  g($,a)a- K gTL88Nu g@-|&A-H|0H@S@l0aJF Aa$a`,RR` g*$@ g**mnm` o(J*K fNuլ *,GXf*, $T ,g"@۩ "g%INu*gBNuanw&Nu"_ g @Aa`N g ilmfNJQk*iHUAa6 g&J(@n ,Ќn f`̰gn g$`t&g"T#K('L'l B '@`JC QfPg&JB`LaH $nL0TNu$H"x g *ilmJQkҊb` C Qf`CAaT&g Cl"H&f g )Љm%B f -%@ $%If*`$" #@ f *ѩ#j "$IJg$"C#JJ f )Ѫ%i $g"R#J- "xf(i,g AaH`C QfAa4L0NuT`H@&x0|*SfKI&F+@+H+N (o:T;o+o Ub+o a+A2<HF@@@;AL8NuBB"x gbE0)gPJj f f$&J` fgB* g f4 f& S@fJf"0) Kf Ji mRTNu JNu CNuB*g B:(0P$f `P g Q E l*TNuBBB"x$( gd4)i gRB(pJq fJf:& g04)`*gf$lf$lg"Jq k"SDfTJfBBNu Nu q Nu gJg` NNu g"(g.(f".fg"xgfg"i`T INu`B&(o8؃SB:(J0PgpPepPbpPbpPNu Q E l*TT,Nu$x( gTB0lTD@jnLS E4,f^Jf8g .(fz,, n6a\`$Nqn NuXnNuZnNu\nNun Nu%FB5B$NuJg .g.(gBNu"xf$xjBB, JlfJ1 g\nNu~GpmZnNuJg`6NA&z,, m6a` Nqn Nu6'M'l 'l   )G B Nu1 g"SPGp k (g.(f=|NuG,fx,f=|Nua0Nu"xf$xj~Gplf GB4a `NuAf& B B1 BNu*n6., Aa`^n`<5P$0@0f22, A0g A g& f.(fn `n`\n`,g, g"$. uP a`f Zn`R\n`LuP$!uP  1A1| B65PuP!C 65PuPRC1C3@1| , g NuJ6g*l6B:-5P$gabQ E l,)gP"x K>)gB,,Jm g.f* Jm f0-@ fB2- m af`anSGfNuB,)g `>, fz,, n6aF` Nqn Nu$F,g"z,, m6a"`"` JEgJ0f^nNu., m6a``B00P, f8pP%@B$P 5pP$00P%@B00P%@ Nu-@ Nug -,fn NuZn`r\n`jBb., m6ax`Jg0, 2,A'g f  g B,,g  gB.8vΆެ޸vθz"FffApfR-(fTHG>G?HG Gan`.Sg^n`Pn`n /f"Aa`a&H.*g, "F m6a``J0Pf! P 0, @O g1P$1Pg1P 1PЇS1P 1PP&P$R(-K g-G$TNu., 8,(Mg,,f n NuBb*l6Aa`^n`J@g ,,--gGg-g- ,gSs-f ,Ss3g gAagl  g+l  g+l  g- ,fAaVNu g,Nu g ,NuJ@g\n`h&, HC8nHC Ca`Pn`F&H&!ASQll 'l'l A('H'H'H"ԋ'BBk&+K@Nu&L(m@ fXn`,fn`z,+ n6a` Nqn `"FB,+ ܁pPb c6B,B fY+gX fPPPB,cn`X($Ka`Zn`H(m@ J(gtUa0(g tEaYJg $EaQ$I$gaaNu6ڷe&lUBnNu(N-J@g l@B@"(a`aNu(n@ fXnNuJl&f~`*lB-gY*, n6a` Nqn Nu&F GfBSNuTgXen`6ݻe*lUGn. Re.,@|)GSl&F&F f$k'jJ+g+g7|NuB00PR@pPB+l.o|G*,+g7|Nu j6a`"``pP>0PRᏞ|GB+*FG6UnNu(n@ fXn`$ . ?,_@Jl&gKaNu--f, g", l(gTe l2HAe l2JkL"Az, m6a`Nq`8)I,- 8> &\e&\RHNu&F- ,fm NuzNa(FC0<"S@f+mt+m +\0-H+\H-H-H@NuAaNu ,fn NuaNu&L- ,fm Nuza(F+lP+lT+l L+lXBmX-H8-HJg:.-Hg*z,-P m6a` NqnNs(Ff+TT ,0-,@fAaFNu$, 6,|Bg(,n=|NuB g *,faCg*B6, gglJgԄ`&\`6,$Ԅ"x,E&J$S gJf&a`f*fJkf&Jf$%M%D %lBj%E5CaNuRFCf* gaҜJk~NuatJkrNuJf @| )g $@#RF`=|FNuSFn=|Nu&Fz`aL(FC0<(S@f(8 -H((,0-H@8(P(T(L(XNu*H(n@zB, gz.,.< n6a` Nq>,.(fJgz, n6an` Nqn NuJ@fXnNu,EJ2 g\n`: E% % 5 B % Br 5 2`  Nu.(f((gn Nu,(%cB h%#n Nu@$@&NuBG`><&,"x$0Hi lB(0f:Jq0 g4 10f 10g,0Jq0 j&10JGg A0aNuA0aژNu^nNun Nu,*H"y0 g i*$ n6a8` Nqn Nu$F&$Sf$F(M"y0&Q$$Nu.(fn NuL.<&\eR`&(@|B>!>!B׸FٸJFB"x,E&J$S g@*g2&$.*f * g޲n gmѪn`ת`.g$G$*.aNJfNu=| . K{fDJnpg x:(f2 x, z n6a```*FBLNBb,x Nu ,NuJf@",g.(f".*yg(f-(f g-gD*m`Aaf` B VnNu*Hg-(g.(fn Nu-g\nNu0,g);@*;m,.-m +n+n ,- ,g2 m@|JkCJ g g"i `#m RPFm-,|& ,g-@|-g < @ ( g f!m AafFNu)=H*f*.(g . (gaֆ.-g`$.)f=H*=n,.--n-n(N"x,E&J g$@f&a`,)ga ,Tg @B!x:!:&,(,)"x)-f2f),)g) ,g@fDf ><@Aaт"i f,)gaNqa,)ga~CE" 1pf2g/a., ,gaR oaVaJgH4<HB4,&,8,HD8,*,<,HF<<.,*>,\,)g<<$LAaNq(JC )gg"@`#la`B rAaNua(-gn -hp =h("NuI6<`&LLpHF>,6.(BAah``0<`,B8oH@0< @a `0<`*H4<BQ+S +fgJf `<.p . ;Fp+@aBfD;D(+El+EHD0HgfJg.%c.%D%c@$@&*!TCB|,;|:|r;|0$M`+J6$!TST|5|$5|D x -"-g fg h`rAa|0<`a`0<` +x!Nuf=@NuTNufg2 .".` ", , g.(g Jg` .".+@+ANu.(fn Nu*<,, n6a` Nqn Nu,fnNu&Fp&QNu@, gzR` ,gz,. n6a޼` NqTnFNuJf6".*yg,f-(f-,g-.fD*m`Aa(` B Vn`*Hg-(g.(fn `-,f \n`-m -.f`>,a+ml|r- (gDz,- m6a` Nqn `@+F:(0P$g00PpPpPBpPQ E lBm., gGLHLH |,0-,@fFAa,`@ FJf8".*xg.f-(fg--f,gL*m`a` B VnFNu*H--fg-(g.(fn `,g\n`;m,.-m |-gC I"h g f!i `,-fNu,=n^Bn^AaFNu-n H)Nu-n L)Nu`[,g( (Xg "@BBX1h^g 1|Bh^aNu-Nu(n@ fXn`4 ,.-g ,AaѾ` Jl&gKaNu,fz. n6a`NqpaX$F"*fp aJAAaRG"SJggG` f, n6B*Eaے`Nq`B* e c @dpar j A fp ar"xfJ1gj*f *g J fpaH *b *dpa4GB*g0 opaS2*sPdpa sPd paR`NQlp jf$ * @fR/<T? *(SJfp aGf*,Ig,(gp a g(l`"SJgG` j p(R@ @H8a` LpaHL"HBSn*g)I&"!CCB*giHL?H?))3@B@3@@GIp)+g((S`B*#@D&j #K )f#|ZH*gI*gH`R*fbB*&xfJ3g:(iD &TG*` &lJg +*n(K`g #K)I`#K&iD3|NJ#|ZLIJ&B* xf i*I/N,_`t`Zp ap apa g@o opa n6BS&@B f )e2 )c )e" )b;g,aؒ` Nq`GN  *af HfX")D(A&TG `&lJfa(g(K`f&Jg((k)|NJ)|ZLIJ&kD&` )k`B)(&iD&&xfB3I &TJfaưgI`(Aa IraԚ`8aˠpaz&Ia"Kfpal)Hgpa`)IgpaT)Ig .(g)Igp a6 )c )c )e )c*g< * d pa`j :#j +HPAa m/N,_J@g>a, )ADJg"PgA `FNuBAaʾ X=@`AaʬBBNu,m4B-9f NpN@`F|q|ptAp!< g pX 8 T-:cm:pL<paNuH`CpB m"-+g|00J)fF)fCS`0))gJ0`(0-&ЈfS$J0U@lB0 UBl@@F-Hg H:a L\L|NuL|NuH m4pN@`Lx`LxNu84g @aZFH*oK"m/ N*_e -g*@`L#X`85gaH 8g*@ m ( g / @NF*_ -`L#``a@Ns@/ |"xJJFfF|JkfSin kF|Bn&iFf#SgFBBBB "_FNuRifgFB/&|"_FNua@Ns@|/ "xJF|Jkf0)ioPSink@Bn iFf#PgFBBBB "_FNuRifgFB/ |"_FNua@Ns@B/BgBJAo`aNf| .RoQ| _2n |FNua@Ns@/ g"xJBF|Jkf gF#HJnfJif#HnRiogF"_ |FNua@Ns  @Jg at` |Nua@Ns@gJFgaR|FNuB( "x""iD ggXJf|FNuBhB( B( Bi|$iJfE#H$BiFa| |FNua@Ns@ g"xJBF|Jkf )g@$@FF$#Hg F 8*g @p&A hpN@ |FNuF#H#HgF`a@Ns@|"xJF|Jkf )Jg, @FJfBf#PgFBFNugF |B/FNu9f )Ofp$qN$o/iT"iX)gHLNu**SDLC**PRIMARY 68000 VM02 09/07/83 ~A"|22<@$Hz$%HQi% Bj gh h hh`B $_gBa\ I"y" )OfR0fL )PfDH,y"L RlL$mHaDE&J|` ` //NsH`B@9"y"$qN9g> @f (`& @f ` @fJ9`08B@99g "y"$qNLNs|ORlH|9fTA+HA*H LH``|98f`\LH,y"L Jlgb2lA&*AT+HH LH``Si&m8`8LH,y"L RlJ+  g`+ ,"f8,#T,#,#R,$,$Jg,g S( f` f|P@ A*A+HE+  g2k`2|H RlN+ g gJ/ a e6Hz$%KTl% l$ k k k kB*$_ LH``9f$i, * fE`E"EN#J8`t$i,E"8`V$i,Ez"8`89fg`B$i0RjT$i,| 8LH*y"L8,`8`Si&m$i(#J(`E "E#J(8`9g^E#J8E"`fLH,y"L + f8&S fRlR`A*8LH``E"8`8LH,y"L RlP`98$i0RjVg``|ORl(A+HA@+HA.+H &mHE"|2mL7IlB+ H ;|\| PaXLH``98`9fgF8`8LH,y"L | Rl0`8LH,y"L | Rl2`n$i,y 8* $i0g fE#JED#J`$i,y * fE`EJ#J8`y\E#J8`y]E#J8`Si&m$i(#J(`E#J98`$i,| 9$i0Rj48`\9LH,y"L 90`8/ ae6Hz$%KTl% k k k k k @$_gg | Rl6g | Rl8 + gJ+ g + fJ,f0 R@k kf| Rl:`+ fP0-\kf -Pf | Rl<`+ ,"g|@ Rl>+ gH`r, ","+ g`Z KagjN Ka`D lBkB+ RlB`RlDJ,gS,g$|"|2mL7IB+ H A`+HA+H;|\Rl@aLH``z8|ORlL&l$mHaEB,`.`|O+ fU,#,#S,$Jg2J+g.S+f&|"K$Ka&ICg"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 gg g4 -Pf* + f *s f|%B,"B,#```d + f *s f|%B,"B,#`\``< +S f *s f |%`<`` + g + f*+ * f"Ka)I"Ja$Ia````JjfBBB* ,# ,$gg+ f + gSSk`B* A# gB +  gBfJ,$gf(*  fF"Ja$I f. -Pf`,"K+ ga&IB,$`` a&IS,$`| gB+  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 B0,g22@2<$@/:WLgNwDXTB-AHЁ=zBN=z@P=| -|.NTW-@A0<NAgH瀀 | `*H Hz&@/:LgNwDXѮ,Ѯ4Ѯ( f aߺ0a` f aߨ2aN` f aߖBa` fa"`|a|`tB@092y4y6y8=@Ns:gNu&lA pN@` `HDIO*H0<"m6E " !UDR] 1BB0$:g2 BpN@`a!0aE QԊ!B14!aJfBGC <pN@`ad4+;B,g +x !EpBJjgREQG(m6AI p(Q !TCBga.x2<aD/:NuHVM,@F'MH?-_8-O<2<a`,,FB-nNu0<`0<F虀2<"x:C2A022@02Nua&afaa|fa|C!aazNuBAHPga^BE E Rf#*(B(:ƺc*BK" B*AM5,Bf` (<B*DBbaNu h g,a2 faN`aJga$`a@gaa`3| Nu~A C ((B*(B*DBbaNuBBBIKhHz ?NsaB# 8!RUN Ns 9(JgJ(f 9( @/#(U3 A (BB(>( f aB" 0aB ` f aB" 2aB ` f aB" -3 BaB ` faB `|aB" `t4 B1INET ASREL' INET SA'9 Initialization and NTS2pOUTTERMS pNWCT pNWTESTAD pSTRTADR pSSCT pMAXCONN pSYSTYPE pMAXLNAU pNWPSEG pNTSREQ pNWTSEG pMAXSEC pSZDBUF pGETSTA pBEGSDLC pNUMBUF pFQULWM pDLCBLDCB pNTBLDTB pSBINFRBF pTRASCAN pDLNKRQD pMAXNAME 2(F3 A0<NAg.H瀀 |` DATAfBnH3 Nu,HO OCfa=|AA -HA0<:NAgH瀀 |`pNA@I3 A0<:NADgrHzb@/:B dLgNwDX`.Please kill netwI3 ork first - then initialize H`CEaB L`H瀀 |I3 `Hz@/:B LgNwDXA0< NAgH瀀 |`F3 SSCT"HA0<NAgH瀀 |`-|SSCT-z=|F3 =|-IA0< NAgH瀀 |`Vp O/ E0Q$_ O$zG3@ @!J0<NAgH瀀 |`-|NWCT-zH-IA0< F3 NAgH瀀 |`p O/ Ej0Q$_ O$z!J0<NAF3 gH瀀 | `AH0<NAgNH瀀 | ``SSCTSSCTI3 SSCTNWCT SSCTSSCTaB RgH瀀 | `:AL3 Hz@@/:B 2LgNwDX <_B-@ rXB g-@$B-AL3 (ЁHzh@/:B LgNwDX-@,2:B' B-A0Ё-@42:O3 B &B-A8Ё-@<2:B JB-A@ЁHz@/:B LL3@ gNwDX-@DrzB l=ALHz>@/:B XLgNwDXO3H B >B-AHЁ=zB ,N=zB! &P=| -|.NTW-@A0<NAgH瀀 |L3 `*H Hz&@/:B LgNwDXѮ,Ѯ4ѮB/:B XLgNwDXO3H B >B-AHЁ=zB ,N=zB! &P=| -|.NTW-@A0<NAgH瀀 |L3 `*H Hz&B/:B LgNwDXѮ,Ѯ4ѮNsaB# 8!RUN Ns 9(JgJ(f 9( @/#(U3 A (BB(>( f aB" 0aB ` f aB" 2aB ` f aB" -3 BaB ` faB `|aB" `t4 ' NTS NTCREQP RONTSREQ RO  NTSSERV RO99NWCREQ ROBBNWCTPRI ROKKSSCT ROddTRANSSCNROmmTRANSSUBROvvI1NTCREQ ASREL' NTS NTCREQP SA5 HANDLE NTC REQUESTS FROM SSCT2pNWMGSSC pNWDCLCT pNWFRLCT pTRACTOLC pTRACTOLL pNWFRNNT pNWLNKBQ pNWSETLA pNWSTATUS pNWSETDC pTRADTXQ pTRABTOU pNTSRRTN pNWFNAT JNTCREQ pNWCREQ pNWFLCT pNWTNAM pLCTBEG pNATBEG pNNTBEG pNWBLDLCT S2pNWFREPB pNWFNLCC pNWCLRLA pNWTNAMC pNWLNKPB pNWSIGNAL pNWFNLCN *nL3 @ ".Tfp`A &AfA + gp`A ANgA\g nJ3 NJk@ ggA Ns gD`A pNu0I3 ^*y($aB! Tg f* fNuaI3 B > -fp Nu$@Bj %l 5l5l B,g   L3  +R$+JBNu*y($", 4,aB) g* f aB BNupNup Nu*y($O3 ", 4,aB) gaB( BNupNu*y($", 4,aB) fp Nu* f&j* I3 g&k* gB+NuJfp#Nu+fpNu(,:,aB, @f - I3 fpNu!m y("*!M y("Jfp NuaB% ;l+ f(O3 AaB* g ` <NuB!L pNuaB BNu,aB gpNu(,I3 :,aB, gpNuJgff- gpNu` <Nu"m$B$lI3 f:;l +@@RfR`@ kIaB+ B"(_Nu0,@lgpNuF3 +g*@|!a,gNu|!afJgJI|!aBIaB"F3 J$kBB"F!) BBTafBNu0,@lF3 gpNu Ng A pN@``*,,, h6pN@` Nqp NupNu, fFaI3 f- fp - g B-a2 NuA2afB!L6aB (F3 BNuK -g*@JmHgA2aTfdB!L`Aa>fNB!LF3 BNu0,@lgpNuJ,g4af/ |I2a6 6 6F3 B8(_BNu/ |IaB"`0,@lgpNu Ng A F3 pN@``*,,, h6pN@`Nqp NuJoaf- fp - g BI3 -a NuAa^fB!LaB BNupA o, ~n&I3 Q",4,E g$@fjfpNupNuBNuaB g <NuCF3 B ||Bi|#B)BiB(1|(-G #|F3 .NTS #T3l#j3j3j j #l 3l$3l&F3@ BNuA< g @`B 6* fgRmHBNu*y(BS&GF3 +gBNup NuK M -g*@- f-fBNupNuK, -F3 g *@-fBNupNuK -g M*@ fmfBNupNu *g&"@*y(F3 A gg @`Bi "+I*y(2* C I fNu"@i fB F3 "+I`- fV-fN y(e Ш Jb y(A (F3 g g @`!m y(*!MKNuB"(g Afp`JNu2* *yF3@ (A g @h f `Nu2* *y(A g @h f `Nu2*F3  *y(A g @h f   `Nu y(Jg*heF3 Ш Jb!U MCJBXn*;k +l ;lA (F3 g @`!MNu g !TCBf(-f/ pN@"_Nu-f - g F3@ BmBm4`Bm F- g y(A (gg @`!mBm6I3 Bm -,3SRequest Disconnect Unknown SDLC Response 24  G1SSCT ASREL' NTS SSCT SADE System Service Control Task+2pOUTTERM NSSCT pNTSSERV .JF3"$ & (A0<NAg.H瀀 |`6 DATABnF3Nu,HO OCaHB~A1|C"!IBA^Qa~F3A1|C"!IBAJQ~AF1|BA"QpNAI*LF3 -g(@,g+lB&lkJ,f f|` F3gH瀀 |`H&l gp A(C4gAnH瀀 |`F3 (N.NTS2.SSCr)m+L`Za |d0<NA`>F3 oH瀀 |`A NF3 oH瀀 |`A N&LF3 oH瀀 |`@A N"""+F3+gtadf "0< I0Q|al`Vaf0< J4QI3|(HB,aBrajge`g |` g&L`alfI30< J"K4Q!k !k!k !k|(HB,aB ageF3`,g |`a`fJ,g` LC$I$SSCT$ PF3.B$. ER4R $:rarararararaI3ra`DCbE"<CaBf$:E$$$ Krar azArI3@aprajr ad  C" RaB|`SSCT Error- Code F3STS BCT R E C # R TH RH Data aaF3SAfNu o^0Nu0<NA~A (f B(1|Bh!|I3<aaBxA^QNuC )g"@`B#HNu~E *f Bj"jI3BNuEJQpNupJ.f)@ B%|( JaaBNu/JF3g gD`/ |0<NA _DLNu~EF *fBjBNuE3"QpNu4\M1TRANSSCN ASREL' NTS TRANSSCNSAEU TRANSPORT LAYER - SCAN USER QUEUE2pNWLNKBQ pNWSETDC pTRADTXQ pTRABTOU pSBGTUSQ pNWDQHD pLCTBEG pNATBEG pNNTBEG pNWLSTC pNWLODSC JTRAMOVB JTRASCAN pNWSIGNAL pSBPTFRBF *J3 &nT + g=|Ns 9(gX&@IN +g*@|#aA g`<|#aA f4$kJ3H BB"F BaA #(`aA f*$y(BJ*F3 f( $H( ga `da:`^&x G +g&*@'mB-fI3  aB 2- gNsHJjgfJjf^CJkB)S&*xI3@ GJg+f+ g0 JaB `p)H+ )IK$-I3 g*Bmfmf- fg )faB -6f +"g+@8I3  @'h"B6aB fL/NuHCp&*x G*k *   gJjF3 f* * A< g @( f( f`:B 6* fgRmO3 H`j JaB  g,/ (m$+l$g  UaB aB (_F3 `T"<`"<`"<*x Cp1 Q3A B >3 ||Bi|#B)BiBjB5|4-G `24eG1TRANSSUB ASREL' NTS TRANSSUBSAG TRANSPORT LAYER - MOVE DATA2JTRACTOLC 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,B08 ]@"I3 XAҬS;A*aB pgk aj(_Nu m*$HC IB08  F3 B)mmBi><- f>Rmg+l0 |B)F3 Bi, g  XYXG3m\]0m -0 @"mF3 ,"$B` Q`Qѭ,0Jg/a$_-g8`4-I3 ga`B  UaB d+l g- ga4`F3 a\`6aT(_Nu- f4 f+l,+l0X,Y0B08 U@I3 "Ҭfr;A*aB g nx $Hm*- f|"li B-F3 J-fi Bm( ) f 2)A;A( -0A. nB-(F3  x b A` B>8   A`m AB08 F3 BBjB* 2-(g0TU0m` -0B* `NGB +g&@F3 `'LNu&x BG +g&@`'MNu5G-f| BjB* mL3@ -gG - f / aB *_Nu JaB fNup N@/ -6g-6gF3 (m8- 6g<$m8 jg`aJo0< m@&-D(F3 l(D٬,D` Q`QJg|f 6+H@L3 g, 6 6a UaB  6ga`> JaB `4(_NuF3 /$m< JaNu/  g +fnw  ` AaB 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 MACROS SIBEGSDLC ROBUFMGTX ROBUFMGT RODLTRACE ROEXORDLC ROIBFMGT ROPORTAIO ROPORTAV4 ROOVERVIEWSIUROOT AG55SYSCMD CDFF \******************************** BEGINNING OF SDLC.MACROS.AI ******************************** RTS2RTEMACROIFEQCHIPTYPE-680101MOVE.W(A7),-(A7)CREATE:0(A7)=PC(HighWord)1MOVE.W4(A7),2(A7).......2(A7)=PC(LowWord).CLR.W4(A7).......4(A7)=VOR(ShortStack)ENDC6MOVE.WSR,-(A7)PushSRsowecanRTEratherthanRTSENDM ************************** END OF SDLC.MACROS.AI **************************  E1BEGSDLC ASREL' SDLC BEGSDLC SAI4 Beginning of SDLC segment2IBEGSDLC )3 `4I1BUFMGTX ASREL' SDLC BUFMGTX SAP1 BUFFER MANAGEMENT SUBROUTINES2pUSERQHD pUSERQND pSDLCPCB ISBPTFRML  pSYSPOFF pSDLCQXMT ISBGTUSQ LpSDLCQUSB ISBPTUSQ ISBPTXMQ *IGTFRBF pFQBCNT IGTFRIR IPTFRBF IGTFRML @pFQLWM pMEMOFF IPTFRML pNATBEG 2IGTUSQ FIPTUSQ IPTXMQ $pFREEQHD pFREEQND ISBGTFRBF ISBGTFRIR ISBPTFRBF ISBGTFRML F)F3P a@Ns@/ |"x J fF|J kfSi n kF|B F3B  &i  f#S  gFBBBB "_FNuRi F3 f gFB/&|"_FNua@Ns@|/ "x F|JF3" kf0) i oPSi nk@B  i  f#P  gF3 FBBBB "_  FNuRi f gFB/ |"_FNuF3 a@Ns@B/BgBJAo`aNf| .RoQ| _2n |F3 FNua@Ns@/ g"x BF|J kf gF3 P #H J fJi f#H Ri o gF"_ |I3 FNua@Ns  @Jg at` |Nua@Ns@gJ gaB F3@ |FNuB( "x "iD ggXJf|FNuBhB( B(I3 Bi|$iJfE#H$BiFaB V| |FNua@F3E$ Ns@ g"x BF|J kf ) g@$@  $#H  gF3  F 8 g @p&A hpN@ |FNu #H #H  gF3 F`a@Ns@|"x F|J kf ) Jg, @ JfB@3@ f#P  gFBFNu gF |B/FNu4I1BUFMGT ASREL' SDLC BUFMGT SAI9 BUFFER MANAGEMENT SUBROUTINES2pUSERQHD pUSERQND pSDLCPCB ISBPTFRML ISBGTUSQ pSDLCQUSB ISBPTUSQ ISBPTXMQ 6IGTFRBF LpFQBCNT IGTFRIR IPTFRBF IGTFRML pFQLWM IPTFRML pNATBEG IGTUSQ IPTUSQ \2IPTXMQ 0pFREEQHD ISBGTFRBF RISBGTFRIR ISBPTFRBF ISBGTFRML )JF3 P@ a@Ns@||Sy(nk|&y(#(FBFNuRy(FB/&|F3 J FNua@Ns@||09(y(o"Sy(k y(#(FBFNuRy(FB/F3 |FNua@Ns@B/BgBJAo`af| .RoQ| _F3 2n |FNua@Ns@g| (#(Ry(F |Nua@NsF3  @Jg a` |Nua@Ns@Bg( "y("iD ggF3 XJf|FNuBhB( B( Bi|$iJfE#H$I3 BiFaB \| |FNua@Ns@ gB|$y( fE(#($F3  F 9(g @p&A hpN@ |Nua@Ns@|| 9(g @#&3 (fB(FBFNuFB/ |FNu4I1DLTRACE ASREL' SDLC DLTRACE SAQB TRACE INTERRUPTS ON DATA LINKA2pSDLCPCB pNECCTL_A pNECCTL_B IDLTRACE pTRACEBEG )@<3@@@ $y($R4$4$((E"y(mE""y(Nu4  ,1EXORDLC ASREL' SDLC EXORDLC SAQV }2JSBSDLCFL $pSYSPOFF JSBSDLCKL 8JSBUSRACK JSDLCQXMT .JSDLCQUSB pMEMOFF pV2RQHD pSBGTFRBF *H3 .,<aA g <T` 1GFa Nu.,<`|a NuB,<F3 `/ "y(B(J kC  Jg"@( f""y( ` /3 ""_NuNu4 M1IBUFMGT ASREL' SDLC IBFMGT SAR8 BUFFER MANAGEMENT INIT SUBROUTINE 2pSZDBUF HSBINFRBF ( (3 BB0:A @$Hm$RA`BNu4D1PORTAIO ASREL' SDLC PORTAIO SARU PASS INERRUPT ON TO HDIO 2IPORTAIO pNECCTL_A ):>3 9(f )Ofp$qN$o/iT"iX)gHLNu4 N1PORTAV4 ASREL' SDLC PORTAV4 SAS MVME400, PASS INTERRUPT ON TO HDIO 2IPORTAIO pNECCTL_A )$(3 $iX$iTBgHz@N9(fLNs46* ****************************************************6* * BEGINNING OF FILE 'FIX:48.SDLC.OVERVIEW.AI' *1**DateRevised:September7,1983,EdSkinner****2**Note:Thisisa"generated"file.Updatesto*3**theseintroductorynotesshouldbeappliedto*2**SDLC.OVERVIEW.PR-Seeadescriptionofthis***containedherein.****6* ******************************************************** 1 Introduction*C*TheMotorolaSynchronousDataLinkControl(referredtosimplyasG*SDLC)isacomponentoftheNetworkServicesfacilityavailableunder * VERSAdos.B*TheSDLCimplementationprovidesacommunicationscircuitdriverI*usingtheNEC7201deviceinthebit-orientedprotocolmode.FramelevelI*commandsarehighlysimilartothoseinIBM'sSDLC.SupportisprovidedG*fortheremoteloadinganddumpingofstations,multi-dropaswellasJ* point to point configurations, with circuit speeds of up to 57,600 baud.  &  !%) E*BecauseofthemanyconfigurationswithinwhichthisimplementationI*mustfunction,operationislimitedtohalf-duplexonly(atthepresent* time).***"* 2 Overview of System Preparation*D*TheSDLCimplementationexistsasapermanentlyresidentextensionF*ofthesystem'sexecutive(RMS68K).Assuch,itis"link"edwiththeE*executivesuchthatasingleloadmoduleexistscontainingboththeE*executiveandtheSDLCdriver.Additionally,inthosesystemswhereD*NetworkServices(NTS)executesonthesameprocessor,it(NetworkE* Services) will be similarly "link"ed and loaded with the executive.D*Generallyspeaking,aversionoftheSDLCdriverisfirstproducedH*whichis"customized"forthetargetsystem.TheparameterswhichmakeG*agivenimplementationuniqueincludethetypeofprocessor(68000orH*68010),theresidenceofNetworkServices(on-boardoroff-board),theD*typeofboarduponwhichthecommunicationsdevice(anNEC7201)isG*located,andtheaddressofthevariousregistersofthatdevice,andC* whether the implementation is for a primary or secondary station.C*GenerationoftheSDLCdriverisfacilitatedbychainfileswhich?*"customize"thegenericdriverforoneofthespecifictargetB*environments.This"customized"version(anobjectfile)isthenA*combinedwithothermodules(suchastheRMS68Kkernel,NetworkA*Services,andsoon)tocreateasingleloadmodule.Thisfinal4* preparation is outside the scope of this document.B*FortheGMADsystem,theprimarystationsoftwarerunsonaVM02J* board, with Network Services executing on a tightly coupled Exormacs MPUH*board.Asharedmemoryfacilityisusedforthecommunicationsbetween* Network Services and SDLC.D*Similarly,thesecondaryGMADstationsoftwarealsorunsonaVM02I*board,exceptthatitsNetworkServicesison-board,andaconsiderably=* simpler shared memory area is used for inter-communication.>*PreparationoftheHDS-400PrimaryandSecondarystationsis* similar to the GMAD stations.C*TheVME/10PrimarystationforanHDS-400runsonaVME/10systemD*usinganMC68010MPUandMVME400board(whichcontainstheNEC7201 * device).**** 3 SDLC Driver Preparation*@*Thefirststep,istoprepareacopyoftheinformationalfileJ* (what you are currently reading) for inclusion into the assembly stream.F*NotethatthispreparationneedbedoneonlyiftheSDLC.OVERVIEW.PRH*inputfilehasbeenupdated.WhenseveralversionsofSDLCdriversareB*tobegenerated,theOVERVIEW.CF(SDLC.OVERVIEW.CF)needonlybeH*executedbeforegeneratingthefirstversion.Oncethishasbeendone,J* several different versions of the SDLC driver may be generated, re-using* the overview file./*Anexampleofcreatingthisoverviewfileis;*=USE48.SDLC*=OVERVIEW.CF)*=/*CREATEOVERVIEW.AIFROMOVERVIEW.PR1*=101.USERLIB.PROSEOVERVIEW.PR,OVERVIEW.LS;Z=64*Version:dd-mmmm-yy*Noerrorsdetected.*=DELOVERVIEW.AI#*DELETEDFIX:0048.SDLC.OVERVIEW.AI*=EOVERVIEW.LS,OVERVIEW.AI;L*VERSAdosEDITORRELEASEx.y*COPYRIGHTBYMOTOROLA19zz&*(Exampleoutputdeletedforbrevity) *EDITDONE*=ENDE*Thenextoneormorestepsconsistofgeneratingversion(s)ofSDLCG*asrequiredforthetargetsystem.SDLCmaybegeneratedasaprimaryE*orsecondarystation,andfortheMC68000orMC68010processor.TheE*chainfilewhichperformsthisis&.CONFIG.CF.ItisalwaysinvokedI*withtwoarguments.Thefirstargumentspecifiestheconfiguration,theI*secondargumentspecifiestheoveralllistingfileordevice.ThefirstE*argumentnamesforvariousSDLCconfigurationsare:HDS-400 PrimaryF*Station("HDS4PRI"),HDS-400SecondaryStation("HDS4SEC"),GMADDMSJ* (Primary) Station ("GMADPRI"), GMAD PMS (Secondary) Station ("GMADSEC"),/* and VME/10 HDS-400 Primary Station ("VME10").B*Thechainfileproducesobjectandlistingfilesappropriatefor"* the specified system as follows;*0* +--------------+--------------+--------------+!*!Argument!Object!Listing!0* +--------------+--------------+--------------+)*!"HDS4PRI"!HDS4PRI.RO!HDS4PRI.LS!)*!"HDS4SEC"!HDS4SEC.RO!HDS4SEC.LS!)*!"GMADPRI"!GMADPRI.RO!GMADPRI.LS!)*!"GMADSEC"!GMADSEC.RO!GMADSEC.LS!&*!"VME10PRI"!VME10.RO!VME10.LS!0* +--------------+--------------+--------------+** 4 Required Files*B*Thefollowingfilesaretheminimumsetrequiredtogenerateall* versions of the SDLC driver;F*&.SYSGEN.CF-TheuserinvokedchainfileproducingSDLCfortheall*SDLCimplementations.G*SDLC.SYSCMD.CD-TheSYSGENcommandfileusedinthepreparationofa*versionoftheSDLCdriver,F*SDLC.ROOT.AG-Thefile"assembled"toproduceaversionoftheSDLCE*driver,asdirectedbyparametersspecifiedbytheuser,andbythe*SYSCMD.CDcommandfile,G*SDLC.OVERVIEW.CF-ThechainfilewhichcausesSDLC.OVERVIEW.AItobe7*createdfromSDLC.OVERVIEW.PRviathePROSEfacility,9*SDLC.OVERVIEW.PR-The"prose"inputfile,processedby3*SDLC.OVERVIEW.CF,whichcreatesSDLC.OVERVIEW.AI,G*SDLC.OVERVIEW.AI-CreatedfromSDLC.OVERVIEW.PRbySDLC.OVERVIEW.CF,B*thisfilepresentsagrossoverviewoftheimplementation,anda'*listofknownproblemsand/orerrors,0* 9995.&.NEC7201.EQ - Defines NEC7201 Symbolics,2* 9995.&.STR.EQ - Defines RMS68K Kernel Symbolics,3* SDLCPRI.TEMPLTS.EQ - Defines SDLC Control Blocks,;* MVME400.EQUATES.AI - Defines the MVME400 board Symbolics,A* SDLC.MACROS.AI - Defines miscellaneous macros required by SDLC,F*SDLCPRI.POLLQ.AI-PrimaryStation,External(User)Interfaces,SDLC(*StartUpLogic,andPollingAlgorithm,D*SDLCPRI.INT7201.AI-PrimaryStation,TransmitterFlushLogic,and*NEC7201InterruptDispatcher,;* SDLCPRI.TRANSMIT.AI - Primary Station Transmitter Driver,7* SDLCPRI.RECEIVE.AI - Primary Station Receiver Driver,4* SDLCPRI.FRMCNT.AI - Primary Station Frame Handler,)* SDLCPRI.SUBRTN.AI - Common Subroutines,H*SDLCSEC.PWRUP.AI-SecondaryStation,External(User)Interfaces,SDLC5*StartUpLogic,andPollingResponseAlgorithm,andD*SDLCSEC.FRMCNT.AI-SecondaryStationFrameHandler,andLinkMode*FiniteStateMachine.**** 5 Primary Station Files*@*Thefollowingfilescomprisetheprimarystation'sgeneration;* SLDC.ROOT.AG,* SDLC.OVERVIEW.AI,* 9995.&.NEC7201.EQ,* 9995.&.STR.EQ,* SDLCPRI.TEMPLTS.EQ,* SDLC.MACROS.AI,* MVME400.EQUATES.AI,* SDLCPRI.POLLQ.AI,* SDLCPRI.INT7201.AI,* SDLCPRI.TRANSMIT.AI,* SDLCPRI.RECEIVE.AI,* SDLCPRI.FRMCNT.AI, and* SDLCPRI.SUBRTN.AI.**** 6 Secondary Station Files*B*Thefollowingfilescomprisethesecondarystation'sgeneration;* SLDC.ROOT.AG* SDLC.OVERVIEW.AI,* 9995.&.NEC7201.EQ,* 9995.&.STR.EQ,* SDLCPRI.TEMPLTS.EQ,* SDLC.MACROS.AI,* MVME400.EQUATES.AI,* SDLCSEC.PWRUP.AI,* SDLCPRI.INT7201.AI,* SDLCPRI.RECEIVE.AI,* SDLCSEC.FRMCNT.AI,* SDLCPRI.TRANSMIT.AI, and* SDLCPRI.SUBRTN.AI.**** 7 ROM-based Version Files*9*ThefileswhichcompriseSDLCROMarecurrentlyunknown.**** 8 Primary Data Flows*>*TheprimarydataflowintoSDLCisviatheSBPTXMQandPTXMQI*functionswhicharelocatedinthebuffermanagementmodule(BUFMGTandH*BUFMGTX).ThesefunctionsenqueueatransmitbuffertotheappropriateI*SecondaryControlBlock(SCB)wheretheSDLCdriverwillfinditattheF*propertime.Intheprimarystation,theSBPTXMQandPTXMQfunctionsH*"awaken"SDLCeachtimeabufferisenqueuedbycallingtheSDLCentryF*pointSDLCQUSBo rSDLCQUfunction.Inthesecondarystation,SDLCis?*not"awakened"whenabufferisenqueued.InanEXORMACS/VM02J* configuration, buffers are passed from the EXORMACS to the VM02 thru the* VM02 request queue.>*TheprimarydataflowfromSDLCisviatheSBPTUSQandPTUSQI*functionswhicharelocatedinthebuffermanagementmodule(BUFMGTandG*BUFMGTX).WhenSDLChasreceivedanerrorfreetransmission(whichisB*notaninternallyusedSDLCcontrolframe),theSBPTUSQorPTUSQD*functioniscalledandthereceivedbufferisenqueuedtotheuserI*queue.InanEXORMACS/VM02configuration,theuserqueuepassesbuffers * from the VM02 to the EXORMACS.C*Ingeneral,allinformationframes(I_frames)containapplicationH*programdata,supervisoryframes(S_frames)areusedinternallybytheI*variousSDLCstationsonalink,andun-numbered(U_frames)areusedto* control the mode of the link.C*ItisveryimportanttonotethatU_framesarenever"created"orI*"consumed"bytheSDLCmodule:TheyarealwaysinitiatedandterminatedE*outsideofSDLC."Hand-shake"proceduresexistbetweenSDLCandtheH*U_framecreatorandconsumertoassistinthesynchronizationofthese* two processes.**** 9 Entry Points*C*ExternalentrypointsareprovidedwithintheSDLCimplementation* for the following conditions;*@* +----------+------+------------------------+-----+-----+-----+8*!Entry!Type!InputDescription!Pri!Sec!ROM!@* +----------+------+------------------------+-----+-----+-----+;*!PWRUP!Subr!StartSDLCOperation!Yes!Yes!Yes!2*!PWR!Intr!NEC7201A-SideIntr!?!?!?!<*!INT7201!Intr!NEC7201B-SideIntr!Yes!Yes!Yes!=*!INT7201A!Intr!NEC7201A-SideIntr!Yes!Yes!Yes!+*!SDLCQXMT!Subr!Unknown!?!?!?!>*!SDLCQUSB!Subr!SendTrafficEnqueued!Yes!No!Yes!<*!SDLCQU!Trap!SendTrafficEnqueued!Yes!No!Yes!?*!SBUSRACK!Subr!AckSIM,DISC,orSNRM!No!Yes!Yes!=*!USRACK!Trap!AckSIM,DISC,orSNRM!No!Yes!Yes!>*!SDLCTMOU!Subr!ReceiveTimerExpired!Yes!Yes!No!>*!SDLCTTMO!Trap!ReceiveTimerExpired!Yes!Yes!No!:*!SDLCKL!Trap!TerminateOperation!Yes!Yes!No!<*!SBSDLCKL!Subr!TerminateOperation!Yes!Yes!No!9*!SDLCPRSB!Subr!50mSecondTick!Yes!Yes!***!7*!SDLCPR!Trap!50mSecondTick!Yes!Yes!***!=*!SDLCFL!Trap!FlushAllSendTraffic!Yes!Yes!No!?*!SBSDLCFL!Subr!FlushAllSendTraffic!Yes!Yes!No!<*!SDLCRCST!Trap!Buffer(s)NowExist!No!Yes!Yes!<*!SBSDLCRC!Subr!Buffer(s)NowExist!No!Yes!Yes!@* +----------+------+------------------------+-----+-----+-----+*F****SDLCROMexecuteswithouttheaidof"timers",andsotheseentry,* points are never used in actual operation.***'* 10 Support Functions and/or Variables*C*Externallydefinedroutineswhichareusedbythisimplementation* are;I*SBGTFRIR-FOREGROUND(interrupthandler)USEONLY,getonebufferfromE*thefreepoolregardlessofthelowwatermarkandhowmanybuffers *remain,1* DLTRACE - add an entry to the SDLC trace table,.* SBPTFRBF - return a buffer to the free pool,2* SBPTFRML - return many buffers to the free pool,1* SBPTUSQ - put a buffer into the user queue, andF*SBRQPA-(RMS68Kkernelentrypoint)requestaperiodicactivation-B*Notethattheuseofthisfunctionisbeingphasedout.ExistingD*versions(basedontheMC68000MPU)continuetousethisfunction,;*andthereforerequireLINK'ingwiththeassociatedRMS68KC*functions.Newerversions(basedontheMC68010MPU)willusetheE*TRAP#0instructiontoaccessthesamefunction,andsodonotneed'*tobeLINK'edwiththeRMS68KKernel.:* Additionally, various RMS68K functions are used by SDLC.*C*Externallydefinedsymbolicvariablesus edbythisimplementation* are;D* NECCTL_A - address of the NEC7201 device control register, Port A,D* NTCCTL_B - address of the NEC7201 device control register, Port B,A* NECDAT_A - address of the NEC7201 device data register, Port A,A* NECDAT_B - address of the NEC7201 device data register, Port B,5* SDLCPCB - pointer to the Primary Control Block, and2* TRACFLAG - trace wanted (least significant bit).**** 11 Known Problems*@*Thefollowingparagraphsdetailthe"known"problemswhichareD*eitherthoughttobewithinthisSDLCimplementation,orthathaveI*significantbearingonSDLC'sperformance.Theorderofpresentationof'* these problems is of no significance.*G*ThruputImprovement-TheoverallsystemthruputcouldbeimprovedbyE*addingatransmissiontoasecondarysystemafterreceivingtraffic@*fromit.Presently,whenasecondarystationtransmitsinboundC*traffic,itmustwaitforthenextpollbeforeit"findsout"howA*manyframestheprimarystationreceived.Duringthisperiodof6*time,severalbuffersmaybetiedupwaitingfortheC*acknowledgement.IftheprimarystationweretotransmitanRRorA*RNR(withoutthepollbit)afterreceivingthefinalbitfroma<*secondary(assumingthatinformationframeswerereceived,E*otherwisetheextratransmissionisextraneous),thenthesecondary<*stationwouldimmediatelyknowhowmanyofitsframeswereA*successfullyreceivedbytheprimarystation.Thischangewould?*haveasignificantimpactduringtheuploadprocesswherethe7*secondarystationonlyhasfourbufferstoplaywith.A*Unfortunately,NetworkServicesappearstobeunabletokeepup>*withthecurrentuploadrate,andthisproposedchangewould?*significantlyacceleratetheuploadthruputtherebycausinga+*resourceshortageintheprimarystation.J* Architectural Problem - Use of the Low Water Mark facility of the buffer?*poolisincorrect.Generallyspeaking,routineswhichconsumeE*systembuffersshouldbesubjecttotheLowWaterMark,whilethose@*whichreturnbufferstothepool,orthatinitiatesomeactionC*whichwillcausebufferstobereturnedtothepoolshouldnotbeA*subjecttotheLowWaterMark.Presently,thereareacoupleof@*exceptionstotheseguidelines.Specifically,theSDLCtraffic>*receiveroutinesarenotsubjecttotheLowWaterMark:They;*shouldbe.TheNTSfunctionswhichperformtheconnectionE*tear-down(disconnect,etc)aresubjecttotheLowWaterMark:They>*shouldnotbe.Becauseofthese"mis-architected"functions,C*dead-locksituationsoccurwhenanodereceivestoatrafficloadB*whichexceedsitsthruput.Allbuffersareconsumedwithreceive@*traffic,andnobuffersarelefttosendapplication-level,orE*definiteresponsetrafficwhichwoulduncommitsomeofthereceived *buffers.C*PerformanceProblem-Theprimarystationisnotre-enablingit'sE*receiversoonenoughbetweensuccessivereceptionswhenthesendingC*secondarystationisrunninginitsROMversionandissendingan>*upload.Theprimaryreceivesthefirstandthirdinformation>*frames,butmissesthesecondone.Thisresultsinexcessive*uploaddurations.G*UnknownCause-A"Receivebufferoverrun"erroroccursapproximatelyE*everyfourframeswhenreceivinganuploadfromasecondarystationB*runninginit'sROMversion.ThisproblemismostlikelyrelatedA*tothepreceedingproblem.However,thesequenceofeventsthat=*leadtothereceivebufferoverrunerrorareamystery:TheC*secondarystationshouldnotbesendingover-lengthmessages,and@*errorrecoveryintheprimaryshouldpreventothererrorsfrom*"turninginto"thiserror.F*UnknownCause-Asecondarystationisapparentlygettingstuckina@*FrameRejectstatetherebypreventingthatstation(only)from*completingarestart.I*UnknownCause-Cessationofdown-loadduringstressperiodsrequi resa?*rebootoftheentiresystem.Thissituationisrare,andonlyE*occurswhenoneormoreuploadsareinprogressatthesametimeas@*downloads.A"dead-lock"situationoccurswhereallthesystemA*buffersareinuse,andanotherbufferisneededtofreeupanyB*buffers.TheremaybeotherproblemswhichappeartobethesameA*asthedead-locksituation.ThismaybeanoverallbufferusageB*problem,oranNTSproblemratherthanaspecificprobleminthe*SDLCimplementation.E*ArchitecturalProblem-Ifasecondaryfails(orismanuallyreset)A*whileadownloadisinprogresstothatsecondary,thestateofC*thatstationasrecordedintheprimaryoccasionallypreventstheC*flushingoftraffic.Thiscausesalargenumberofsystembuffers>*tobetiedupforanextendedperiod(conceivably,forever).H*ArchitecturalProblem-Thedownload(andupload)processescontainnoE*datarateregulatingmechanismsandtend,therefore,todriveotherA*partsofthesystemintoerrorrecoverysituationsbyplacingaB*severeloadonthesystemunnecessarily.DuetothedifficultiesD*incorrectingthisproblem,nopracticalsolutionappearstoexistA*atthistime.(These"difficulties"includetheneedtototallyD*revamphowuploadsanddownloadsareperformedacrossallproducts-*currentlyusingNetworkServicesandSDLC.)D*UnknownCause-Anexcessiveretransmissionerrorisoccuringona8*downloadinformationblock.Theblockshouldhavebeen>*acknowledgedbytheloadedsecondary,oritshouldhavebeen@*flushedupondownloadcompletion.Eitheroftheseeventswould?*preventtheexcessiveretransmissionerrorwhichisoccuring.?*Thereis,ostensibly,noproblemwiththis.Butthesystemis'*indicatingsomeerror,nonetheless.F*UnknownCause-Apparentlyamessageisoccasionallybeingdiscarded>*erroneouslyduringthedownloadand/orrestartprocess.ThisD*causestheaffectedsecondarystationtobeunabletocompleteitsA*restartandrequiresthemanualresettingofthatstation.This<*problemmayberelatedtotheaforementionedarchitectural%*difficultiesconcerninglinkreset.@*ArchitecturalProblem-The"cooperation"betweenSDLCandNTSC*concerninglinkresetand/orrestartisfaultyduetoanumberofC*problemsinthearchitectureofthisarea.The"problems"leadto1*dead-lockand/orpoorperformancefairlyoften.D*ArchitectualDifficulty-RMS68Khandlingofsetdateandtimemay>*resultinseveralsecondsofcomputationwithallinterruptsC*masked.NTS/SDLC"feels"thisbymissingtransmission(s)fromtheC*primarystation,andloosingcontactforseveralseconds.AsthisE*onlyoccurswhenasecondarystationisre-starting,theproblemisD*minortheproblemisconsideredtobean"annoyance"ratherthana=*"problem".CorrectionofthisproblemmaybeimplementedbyE*changingthealgorithmwithinRMS68Kand/orbyrevampingthe"powerD*on"/"poweroff"decisioncriteriawithinSDLC.RegardlessoftheC*RMS68Kchanges,theSDLC'sup/downcriteriashouldberevampedas@*thepresentimplementationiscrudeand"over-reacts"tominor*transgressions.G*HardwareProblem-Ifasecondary(ortheprimary)stationfailssuchC*thatitisunabletoperformaresetofthecommunicationsdeviceD*(NEC7201),andthefailureoccursatatimewhenthatstationhasA*itstransmitterenabled,thecommunicationscircuitwillbe"in?*use"foranindefinateperiodandnostationswillbeableto=*communicate.ThissituationwillcontinueuntilthefailingC*stationisidentifiedanddisconnectedfromthecircuit.ThemostD*expeditiousmethodforresolvingthisproblemisto1)verifythatE*itisoccuring-alinemonitorwilldisplayacontinuousstreamofC*dataonthecircuit-normallythesamebyteoverandoveragain,E*andthento2)begindisconnectingsecondarystati onsoneatatimeC*untilthelinemonitorindicatesacessationofthispattern.TheB*continuoustransmissionwillceasewhentheoffendingstationisD*disconnected.Alternatively,secondarystationsmaybepoweredoff@*ratherthanbeingdisconnected.Thiscondition(ofasecondaryE*"hogging"thecircuit)isverydifficulttoidentifyintheprimaryD*station'ssoftware,anditisuncertainifanyautomaticprocedureC*canbeinitiatedbytheprimarytoresolvethissituationevenif%*itcoulddeterminethatitexisted.*0* **********************************************0* * END OF FILE 'FIX:48.SDLC.OVERVIEW.AI' *0* **********************************************!TTLSDLCDRIVER,GENERICSECTION'* Arguments substituted via SYSGEN are;**VERSION-Versionnumber*REVISIO-Revisionnumber#*REVDATE-Dateoflatestrevision%*CHIPTYP-MPUtype-68000or680107*STATION-Stationtype-1(Primary)or2(Secondary)<*IFRMBCT-I_framebytecountsincluded-1(Yes)or0(No)E*RES7201-BoardcontainingtheNEC7201-02(VM02)or400(MVME400)* OPTMEX,CRE VEREQU\VERSIONVERSIONNUMBER/REVEQU\REVISIOREVISIONNUMBERWITHINVERSION /CHIPTYPEEQU\CHIPTYPMPUTYPE(68000OR68010) 8STATIONEQU\STATIONSTATIONTYPE(PRIMARYORSECONDARY)#PRIMARYEQU1PRIMARYSTATIONVALUE&SECONDAREQU2SECONDARYSTATIONVALUE 4IFRMBCTEQU\IFRMBCTSEND/RCVBYTECOUNTONI_FRAMES YESEQU1NOEQU0 0RES7201EQU\RES7201NEC7201RESIDENTBOARDTYPE* 02 = VM02, or 400 = MVME400 IFEQCHIPTYPE-68000 OPTP=68000IFEQSTATION-PRIMARY/SDLCPRIIDNTVER,REV68000SDLCPRIMARYSTATION:TTL68000PRIMARYSTATION(Copyright1982/3MotorolaInc)ENDCIFEQSTATION-SECONDAR1SDLCSECIDNTVER,REV68000SDLCSECONDARYSTATIONXDEFSDLCRCST,USRACK,SDLCQU,SDLCTTMOUT,SDLCPR,SBSDLCFL,SDLCFL*XDEFINT7201,INT7201A,PWR,SDLCKL,SBSDLCKL*0XREFSBGTFRIR,SBPTFRBF,SBPTFRML,SBPTUSQ,SDLCPCBIFEQCHIPTYPE-68000 XREFSBRQPAENDCXREFTRACFLAG,DLTRACE*IFEQSTATION-PRIMARYINCLUDESDLCPRI.POLLQ.SIENDCIFEQSTATION-SECONDARYINCLUDESDLCSEC.PWRUP.SIENDCINCLUDESDLCPRI.INT7201.SIINCLUDESDLCPRI.TRANSMIT.SIINCLUDESDLCPRI.RECEIVE.SIIFEQSTATION-PRIMARYINCLUDESDLCPRI.FRMCNT.SIENDCIFEQSTATION-SECONDARYINCLUDESDLCSEC.FRMCNT.SIENDCINCLUDESDLCPRI.SUBRTN.SIENDC*******************************************************************SDLC.SYSCMD.CD1*SYSGENCommandFileforSDLCdrivergeneration*4*CreateanSDLCdriverforaspecificenvironment.**Argumentsare:**Arg1=Mnemonic-legalmnemonicsare:* *"GMADPRI"-GMprimarysystem"*"GMADSEC"-GMsecondarysystem$*"HDS4PRI"-HDS400primarysystem&*"HDS4SEC"-HDS400secondarysystem$*"VME10PRI"-VME/10primarysystem*:*Arg2=Overalllistingfile/device.Listingishandled*bydriverchainfile.*K*Eachtimemaintenanceisperformed,thefollowingthreeargumentsshould1*beupdated:REVDATE-Dateoflatestrevision, *VERSION-Versionnumber,and*REVISIO-Revisionnumber.*/REVDATE="09/07/83"*DateoflatestrevisionVERSION=3*VersionnumberREVISIO=7*Revisionnumber *&LF=0Legalmnemonicflag IFEQ"\1","GMADPRI"&LF=1STATION=1PrimarystationCHIPTYP="68000"RES7201=02VM02SUBSSDLC.ROOT.AG3ASMSDLC.ROOT.AG,SDLC.GMADPRI.RO,&.SYSGEN.TF;Z=100 =COPY&.SYSGEN.TF,&.SYSASM.LS;A$=COPY&.SYSGEN.TF,SDLC.GMADPRI.LS;YENDCIFEQ"\1","GMADSEC"&LF=1STATION=2SecondarystationCHIPTYP="68000"RES7201=02VM02SUBSSDLC.ROOT.AG3ASMSDLC.ROOT.AG,SDLC.GMADSEC.RO,&.SYSGEN.TF;Z=100 =COPY&.SYSGEN.TF,&.SYSASM.LS;A$=COPY&.SYSGEN.TF,SDLC.GMADSEC.LS;YENDCIFEQ"\1","HDS4PRI"&LF=1STATION=1PrimarystationCHIPTYP="68000"RES7201=02VM02SUBSSDLC.ROOT.AG3ASMSDLC.ROOT.AG,SDLC.HDS4PRI.RO,&.SYSGEN.TF;Z=100 =COPY&.SYSGEN.TF,&.SYSASM.LS;A$=COPY&.SYSGEN.TF,SDLC.HDS4PRI.LS;YENDCIFEQ"\1","HDS4SEC"&LF=1STATION=2SecondarystationCHIPTYP="68000"RES7201=02VM02SUBSSDLC.ROOT.AG3ASMSDLC.ROOT.AG,SDLC.HDS4SEC.RO,&.SYSGEN.TF;Z=100 =COPY&.SYSGEN.TF,&.SYSASM.LS;A$=COPY&.SYSGEN.TF,SDLC.HDS4SEC.LS;YENDCIFEQ"\1","VME10PRI"&LF=1STATION=1PrimarystationCHIPTYP="68010">JGRES7201=400MVME400SUBSSDLC.ROOT.AG1ASMSDLC.ROOT.AG,SDLC.VME10.RO,&.SYSGEN.TF;Z=100 =COPY&.SYSGEN.TF,&.SYSASM.LS;A"=COPY&.SYSGEN.TF,SDLC.VME10.LS;YENDC IFEQ\&LF6MSG"\1"isaninvalidmnemonic.Legalmnemonicsare:;MSG"GM ADPRI","GMADSEC","HDS4PRI","HDS4SEC",or"VME10PRI".MSGPleasererunsysgenwithpropermnemonic.ABORTENDC 3IFRMBCT=1*SendandReceiveI_FrameByteCounts *ENDOFSDLC.SYSCMD.CDC******************************************************************END' TEST OUTTERM RO[[G1OUTTERM ASREL' TEST OUTTERM SASD Put Message out to terminal2NOUTTERM .*03A!I !J01|1|BBh BNBNu4 S' VM02 STRSDLC ROhhVEC7201 AGqq91STRSDLC ASREL' STRSDLC SASP Start up SDLCx2pPORTAIO pSYSTYPE pVEC7201 pINT7201 pINT7201A pBEGSDLC pPWRUP pTRACFLAG pTRACEBEG HSTRSDLC (8H3@ :A gNu&lA pN@` `HDIO*H0<"m6E "0forsecondary STAFLGSET2ENDC IFEQSTAFLG5FAIL100STATIONmustequal'PRIMARY'or'SECONDARY'ENDC IFNESTAFLG*STAFLGSETS TAFLG-10=PRIMARY,1=SECONDARYENDC* XDEFSYSTYPE7SYSTYPEDC.B\SYSTYPESystemtype(NOLINK,LINKMAIN,...)* XDEFMAXSEC IFEQSTAFLGBMAXSECDC.W\MAXSECMax#secondarystations(iflocalisprimary) XDEFFSSTN0FSSTNDC.B\FSSTNFirstSecondaryStationNumber XDEFSSINC-SSINCDC.B\SSINCSecondaryStationINCrementENDC IFNESTAFLG5MAXSECDC.W1Iflocalstationissecondary,MAXSEC=1 XDEFFSSTN FSSTNDC.B0 XDEFSSINC SSINCDC.B0ENDC XDEFDLBR%DLBRDC.W\DLBRDataLink'sBaudRate XDEFTXRTRY(TXRTRYDC.B\TXRTRYTransmitRetryCount XDEFRCRTRY'RCRTRYDC.B\RCRTRYReceiveRetryCount XDEFMXOBF3MXOBFDC.B\MXOBFMaximumNumberofOutboundFrames XDEFRCTOV3RCTOVDC.W\RCTOVReceiveTimeoutValue(1=50Msec) XDEFRTRDLY+RTRDLYDC.W\RTRDLYRetryDelay(1=50Msec) XDEFTXDLY,TXDLYDC.W\TXDLYTransmitDelay(1=50Msec) XDEFPFDLY4PFDLYDC.W\PFDLYPollPoweredOffDelay(1=50Msec) XDEFPNDLY3PNDLYDC.W\PNDLYPollPoweredOnDelay(1=50Msec) XDEFTXPDS$TXPDSDC.B\TXPDS#ofTransmitPadsENDJ(ILOADPIDNT1,0Init.equatesforLOADV2 SECTION8*$* COPYRIGHTED 1982 BY MOTOROLA, INC.*#* Initialization equates for LOADV2* XDEFV2OFF'V2OFFEQU\V2OFFOffsetforVM02memory XDEFV2SYSP0V2SYSPEQU\V2SYSPAddressforVM02SYSPARarea.END "=LINK ,&.INET.LO,&.SYSGEN.TF;HMIXS TASK INET,$AATTR SDPSEG SDLC(R):9,10,2 $0000 SEG SSCT:14,0 SEG INET(R):8DEFDLCBLDCB,$0000DEFSBINFRBF,$0000DEFSTRSDLC,$0000INPUTSDLC.BEGSDLC.ROINPUTSDLC.BUFMGTX.ROINPUTSDLC.EXORDLC.ROINPU TNTS.NTSREQ.ROINPUTNTS.NTCREQP.ROINPUTNTS.NWCREQ.ROINPUTNTS.TRANSSUB.ROINPUTNTS.TRANSSCN.ROINPUTNTS.SSCT.ROINPUTNTS.NWCTPRI.ROINPUTTEST.OUTTERM.ROINPUTNTS.NTSSERV.ROINPUT &.SYSPAR.ROINPUT M68000.INET.ROINPUT GEN.INETP.ROINPUT GEN.IDLCP.ROINPUT GEN.IBUFQ.ROINPUT GEN.ILOADP.ROINPUT INET.NTBLDTB.ROINPUT M68000.SRSN.ROINPUT INET.NWTEST.ROINPUT INET.GETSTA.ROINPUT INET.OUTTERMS.ROLIB 0.&.UTILIBEND=END#$=LINK ,&.INETNOL.LO,&.SYSGEN.TF;HMIX TASK INET,$AATTR SDPSEG SDLC:9,10,2 SEG SSCT:14,0 SEG &INT:8DEFPORTAIO,$0000DEFNECDAT_A,$F70011DEFNECDAT_B,$F70013DEFNECCTL_A,$F70015DEFNECCTL_B,$F70017INPUTSDLC.BEGSDLC.ROINPUTSDLC.BUFMGTX.ROINPUTSDLC.SDLCPRI.ROINPUTSDLC.DLTRACE.ROINPUT9999.M68XXX.EXRQPA.ROINPUT9999.M6840.RDTIMER.ROINPUTNTS.NTSREQ.ROINPUTNTS.NTCREQP.ROINPUTNTS.NWCREQ.ROINPUTNTS.TRANSSUB.ROINPUTNTS.TRANSSCN.ROINPUTNTS.SSCT.ROINPUTNTS.NWCTPRI.ROINPUTTEST.OUTTERM.ROINPUTNTS.NTSSERV.ROINPUT &.SYSPAR.ROINPUT M68000.INET.ROINPUT GEN.IDLCP.ROINPUT GEN.INETP.ROINPUT GEN.IBUFQ.ROINPUT GEN.ILOADP.ROINPUT INET.IPSDLC.ROINPUT INET.GETSTA.ROINPUT SDLC.IBFMGT.ROINPUT INET.NTBLDTB.ROINPUT M68000.SRSN.ROINPUT INET.NWTEST.ROINPUT VM02.STRSDLC.ROINPUT VM02.VEC7201.ROINPUT INET.OUTTERMS.ROLIB 0.&.UTILIB.ROEND=END ,/INETPIDNT1,0INITPARAMSFORNETWORKSERVICES SECTION8*$*COPYRIGHTED1982BYMOTOROLA,INC.*F************************************************************************0*InitializationParametersforNetworkServices**F*********************************************************************** XDEFMAXLNAUFMAXLNAUDC.W\MAXLNAUMax#NetworkAddressableUnitsatlocalstation XDEFMAXNAMEGMAXNAMEDC.W\MAXNAMEMax#NetworkNames(ifprimary-maxinnetwork) XDEFMAXCONN/MAXCONNDC.W\MAXCONNMax#LogicalConnections XDEFOPERDEVOPERDEVDC.L0END%=LINK ,VM02.INET.LO,&.SYSGEN.TF;SHMIX TASK INET,$AATTR SDPSEG SDLC:9,10,2 \V2BSTR SEG SSCT:14,0 SEG &INT:8DEFNECDAT_A,$F70011DEFNECDAT_B,$F70013DEFNECCTL_A,$F70015DEFNECCTL_B,$F70017DEFMAXCONN,$0000DEFMAXLNAU,$0000DEFMAXNAME,$0000DEFNTBLDTB,$0000DEFNTSREQ,$0000DEFNWCT,$0000DEFOUTTERMS,$0000DEFSSCT,$0000DEFTRASCAN,$0000INPUT9999.M68XXX.EXRQPA.ROINPUT9999.M6840.RDTIMER.ROINPUTSDLC.BEGSDLC.ROINPUTSDLC.BUFMGTX.ROINPUTSDLC.PORTAIO.ROINPUTSDLC.SDLCPRI.ROINPUTSDLC.DLTRACE.ROINPUT&.SYSPAR.ROINPUTM68000.INET.ROINPUTGEN.IDLCP.ROINPUTGEN.IBUFQ.ROINPUTGEN.ILOADP.ROINPUTINET.IPSDLC.ROINPUTSDLC.IBFMGT.ROINPUTM68000.SRSN.ROINPUTINET.NWTEST.ROINPUTVM02.STRSDLC.ROINPUTVM02.VEC7201.ROINPUTINET.GETSTA.ROLIB 0.&.UTILIBEND=END )'=LINK ,VMES10.INET.LO,&.SYSGEN.TF;HMIXS TASK INET,$AATTR SDPSEG SDLC(R):9,10,2 $0000 SEG SSCT:14,0 SEG INET(R):8DEFMVME400,$F1C1C1DEFNECDAT_A,$F1C1C9DEFNECDAT_B,$F1C1CBDEFNECCTL_A,$F1C1CDDEFNECCTL_B,$F1C1CFDEFV2OFF,$FFFFFFFFINPUTSDLC.BEGSDLC.ROINPUTSDLC.IBFMGT.ROINPUTSDLC.BUFMGT.ROINPUTSDLC.PORTAV4.ROINPUTSDLC.VME10.ROINPUTSDLC.DLTRACE.ROINPUT9999.CAOE.SYSPAR.ROINPUTNTS.NTSREQ.ROINPUTNTS.NTCREQP.ROINPUTNTS.NWCREQ.ROINPUTNTS.TRANSSUB.ROINPUTNTS.TRANSSCN.ROINPUTNTS.SSCT.ROINPUTNTS.NWCTPRI.ROINPUTTEST.OUTTERM.ROINPUTNTS.NTSSERV.ROINPUT M68010.INET.ROINPUT GEN.INETP.ROINPUT GEN.IDLCP.ROINPUT GEN.IBUFQ.ROINPUT INET.IPSDLC.ROINPUT INET.NTBLDTB.ROINPUT M68010.SRSN.ROINPUT INET.NWTEST.ROINPUT INET.GETSTA.ROINPUT VMES10.STRSDLC.ROINPUT VMES10.VEC7201.ROINPUT INET.OUTTERMS.ROLIB 0.&.UTILIBEND=END+%=LINK ,&.LOADV2.LO,&.SYSGEN.TF;HAMIXSSEG SEG0:0,8,14INPUT &.SYSPAR.ROINPUT INET.LOADV2.ROINPUT GEN.ILOADP.ROLIB 0.&.UTILIB.ROEND ' SDLCPRI FRMCNT SI5INT7201 SI""+POLLQ SISS.cRECEIVE SI5SUBRTN SI TRANSMITSILPAGE4****************************************************5* BEGINNING OF FILE 'FIX:48.SDLCPRI.FRMCNT.AI' *4**************************************************** 9TRANSEQEQU*EndofXmtQueuereached,P/FbitNOTsent!MOVE.B#NCW0EOI,NECCTL_A8MOVE.B#NCW0RG1,NECCTL_BDisableTransmitterInterrupts!MOVE.B#NCW1IRD+NCW1STV,NECCTL_B9MOVE.B#SDPBFC,SDPBSY(A5)SETSDLCBUSYINFRAMECONTROLADD.W#1,SDSHCTOF(A4)3/2/83MOVE.LSDSTHD(A4),A3MOVE.LSDPRCV(A5),A2 BSR.LSOMEFREEFREERCVBUFFERS LEA0,A2*-CLR.BSDSPWR(A4)ASSUMEDEVICEISPOWEREDUP0BRA.LDSPUIDISPOSEOFANYTxMITTED"UI"FRAMES .TRANSPBBRA.LRECEIVETRANSMIT(POLLBIT)EXIT PAGE %TRANSUFEQU*TRANSMITUNDERFLOWEXIT8MOVE.B#NCW0RG1,NECCTL_BDisableTransmitterInterrupts!MOVE.B#NCW1IRD+NCW1STV,NECCTL_B9MOVE.B#SDPBFC,SDPBSY(A5)SETSDLCBUSYINFRAMECONTROL'BTST.B#0,SDDCMD(A3)IFIELDTxMITTED?IFTHEN.S*SUB.B#2,SDSVSC(A4)YES,FIXUPVsCOUNTSAND.B#$0E,SDSVSC(A4)SUB.B#1,SDSUKT(A4)ENDI)TST.LSDSTHD(A4)Didaflushjustoccur?(BEQ.STRANSUF3Yes,gosendan"RR"now&TST.BSDDRTC(A3)No,anyretrycount?2BEQ.LTRANSMTNo,retrysendingforeverandever!>SUB.B#1,SDDRTC(A3)Yes,countoneattempttosendthebuffer7BNE.LTRANSMTandgore-senditifcountnotexhausted4* The retry count has expired for a transmit buffer.=* Return it to the originator after marking it as unsendable.F* Then, fix up the transmit queue by linking the buffer just after the.*unsendableonetothebufferjustbeforeit.?* For example, if the transmit queue currently looks like this;'*A-->B-->C,whereBisunsendable.:* Then we fix up the transmit queue so it looks like this;*A-------->C.K*  The fix-up is accomplished by looking for a buffer that points to the oneO* we just got rid of, and then storing the "next" buffer's address (as returned3* to us by SOMESEND) into its forward link pointer.1@@NO J33MOVE.B#SDDSSTE,SDDSTS+1(A3)Markitasunsendable6MOVE.LA3,A1A1=A(Unsendablebuffer-forSOMESEND)>MOVE.LA3,A2A2=A(Unsendablebuffer-forWHILEclauseuse)6BSR.LSOMESENDPasstheUnsendablebuffertotheuser7MOVE.LA1,A3A3=A(Nextbufferinthetransmitqueue)?LEASDSTHD-SDDLNK(A4),A1Findbufferbeforetheunsendableone?WHILE.LSDDLNK(A1)A2DO.SPointingtounsendablebuffer?/MOVE.LSDDLNK(A1),A1No,ontothenextbufferENDW@MOVE.LA3,SDDLNK(A1)yes,store"next"into"beforeunsendable"8BNE.LTRANSMTGosendthenextoneifsomething'sthereETRANSUF3MOVE.LSDPRCV(A5),A3Otherwise,sendan"RR"commandinsteadBRA.LSDLCPR5B PAGE /RECEIEEEQU*RECEIVEEXCESSIVEERRORSOCCURREDMOVE.B#SDDSSRE,SDDSTS+1(A3)ADD.W#1,SDSHCREX(A4) BRA.SHSKP2 PAGE 'RECEITOEQU*RECEIVETIMEOUTOCCURREDMOVE.B#SDDERTO,SDDERR(A3)ADD.W#1,SDSHCRTP(A4) +RECEIFBEQU*RECEIVEDAFINALBITRESPONSE *RECEILBEQU*RECEIVEDEPLETEDBUFFERPOOL ***ENDOFARCVSEQUENCE,SHUTRECEIVEROFF*HSKP2MOVE.B#NCW0RG1,NECCTL_B!MOVE.B#NCW1IRD+NCW1STV,NECCTL_BMOVE.B#NCW0RG3,NECCTL_B!MOVE.B#NCW3BT8+NCW3AUE,NECCTL_BADD.W#1,SDSHCROF(A4)3/2/83&BSR.LSOMETOCLRCLEARRECEIVETIMEOUTMOVE.LSDSTHD(A4),A3MOVE.LSDPRCV(A5),A2&* A5 = PRIMARY CONTROL BLOCK'S ADDRESS(* A4 = SECONDARY CONTROL BLOCK'S ADDRESS%* A3 = CURRENT TXMIT BUFFER'S ADDRESS#* A2 = CURRENT RCV BUFFER'S ADDRESS * Fall-thru to the next pagePAGE3* NOTE: WE FALL-THRU TO HERE FROM THE PREVIOUS PAGE **SDLCFRAMECONTROLPROCEDURES*9MOVE.B#SDPBFC,SDPBSY(A5)SETSDLCBUSYINFRAMECONTROL,MOVE.W#$2500,SRLOWER68000INTERRUPTMASK@CLR.BSDSTXF(A4)ASSUMENOT(RNRSENT&GOODRSPRCV'D)2/24/83 %IF.BSDDRSP(A2)#SDDRRIMTHEN.S5OR.B#SDDSRIM,SDDSTS(A2)IFRIM,THENSETRIMSTATUSELSE.S$IF.BSDDRSP(A2)#SDDRDMTHEN.S5OR.B#SDDSRDM,SDDSTS(A2)IFRDM,THENSETRDMSTATUSELSE.S$IF.BSDDRSP(A2)#SDDRRDTHEN.S3OR.B#SDDSRRD,SDDSTS(A2)IFRD,THENSETRDSTATUSENDIENDIENDI.MOVE.BSDDERR(A2),D0Verybaderrorreceived?IFTHEN.S4IF.BD0#SDDENNRAND.BD0#SDDEIFUTHEN.S-BRA.LINVRSPYes,can'ttellwhatitis,outENDIENDI7CLR.BSDSPWR(A4)No,It'seitherOK,orjustsortabadMOVE.B#SDSCNRM,SDSCST(A4)$IF.BSDPTXF(A5)#SDPTRNTHEN.S#SDDRFRMRTHEN.SA*SecondariessendFrameRejectforanyofthefollowingreasons;*1-Invalidcommand,?*InDISCorNRMstate,andRcvXIDbutdon'thaveonetosend,/*InNRMstateandRcvan"unknown"command,or6*InFRMRstateandRcvotherthanSIM,DISC,orSNRM,*2-ProhibitedI_field,7*RcvanI_fieldonaSIM,SNRM,DISC,RR,RNR,orREJ,*3-BufferOverrun,<*Rcvanotherwisegoodframewhichislongerthanabuffer,*4-InvalidNrCount,>*RcvanNrcountwhichacknowledgesanframehe'sneversent.2OR.B#SDDSFRM,SDDSTS(A2)SETFRMROCCURREDSTATUS.MOVE.LA2,A1SENDFRMRTOAPPLICATIONPROGRAMBSR.LSOMESEND MOVE.LA1,A2$BSR.LSOMEFREEFREEALLRCVBUFFERS)BRA.LDCRTXDECREMENTTxMITRETRYCOUNTSENDICLR.LD0NO,ISRESPONSEUI?MOVE.BSDDRSP(A2),D0AND.B#$EF,D0IF.BD0#SDDCUITHEN.S8MOVE.LA2,A1SENDRECEIVEBUFFERTOAPPLICATIONPROGRAMBSR.LSOMESEND%MOVE.LA1,A2ENDOFRECEIVEBUFFERS? MOVE.LA1,D 0 BEQ.LDSPUI'BRA.LHSKP9NO,TESTBUFFER'SRESPONSEENDI!AND#$0F,D0NO,ISRESPONSERNR?IF.BD0#SDDRRNRTHEN.S6MOVE.B#SDSCBSY,SDSCST(A4)YES,SETREMOTEBUSYSTATE BRA.LDSPNRENDI!CMP.B#SDDRRR,D0ISRESPONSERR?BEQ.LDSPNR* 'CMP.B#SDDRREJ,D0NO,ISRESPONSEREJ?BEQ.LDSPNR* $BTST.L#$0,D0NO,ISITANIFIELD?!BEQ.LDSPNR1YES,CHECKNrCOUNT *MOVE.LA3,D0NO,ANYTHINGINTxMITQUEUE?BEQ.LDSPRC1*#SDDCSIMTHEN.S$IF.BSDDRSP(A2)#SDDRUATHEN.S)MOVE.B#SDSCRDM,SDSCST(A4)RDM-->STATECLR.BSDSVRC(A4)0-->VrCLR.BSDSVSC(A4)0-->Vs BRA.LOKRSPELSE.S BRA.LINVRSPENDIENDI&IF.BSDDCMD(A3)#SDDCSNRMTHEN.S$IF.BSDDRSP(A2)#SDDRUATHEN.S)MOVE.B#SDSCNRM,SDSCST(A4)NRM-->STATECLR.BSDSVRC(A4)0-->VrCLR.BSDSVSC(A4)0-->Vs BRA.LOKRSPELSE.S BRA.LINVRSPENDIENDI&IF.BSDDCMD(A3)#SDDCDISCTHEN.S$IF.BSDDRSP(A2)#SDDRUATHEN.S)MOVE.B#SDSCRDM,SDSCST(A4)RDM-->STATE BRA.LOKRSPELSE.S BRA.LINVRSPENDIENDI#IF.BSDDCMD(A3)#SDDCXIDOR.B!SDDCMD(A3)#SDDCTESTTHEN.SMOVE.BSDDCMD(A3),D0IF.BD0SDDRSP(A2)THEN.S9MOVE.LA3,A1Ifresponse=command,discardxmitbuffer,BSR.LSOMEDISPOSEMOVE.LA1,SDSTHD(A4).MOVE.LA2,A1PasstheresponsetoapplicationBSR.LSOMESEND MOVE.LA1,A2BSR.LSOMEFREE2BRA.LSDLCRQandselectnextstationtotalkwithELSE.S BRA.LINVRSPENDIENDI0BRA.LDSPUIAllothersgotoDSPUIforhandlingPAGE /* May fall-thru to here from the previous page! ADSPNRTST.WSDDBCT(A2)DATAFIELDON"RR""RNR"OR"REJ"COMMAND?(BNE.LINVRSP*IFYES,INVALIDRESPONSE**TESTFORAVALIDNrCOUNT*DSPNR1CLR.LD0 CLR.LD1 CLR.LD2$MOVE.BSDDRSP(A2),D0FETCHNrCOUNTLSR.B#5,D0*$MOVE.BSDSVSC(A4),D1FETCHVsCOUNTLSR.B#1,D1*-MOVE.BSDSUKT(A4),D2FETCH#TxMITTEDFRAMES BEQ.SDSPNR2*FRAMESTxMITTED?9CMP.L#0,A3XMITI_FRMSGONEJUSTAFTERAPURGE?3/21/836BEQ.SDSPNR2YES,SAMEASIFNOI_FRAMESSENT3/21/833BTST.B#0,SDDCMD(A3)NO,"I"FRAMEONTxMITQUEUE? BNE.SDSPNR2/MOVE.BSDDCMD(A3),D1YES,GETNsCOUNTFROMIT LSR.B#1,D1 ADD.BD2,D1 AND.B#7,D1DSPNR2WHILE.BD0D1DO.SSUB.B#1,D1NEXTVsCOUNT AND.B#7,D1#SUB.B#1,D2ALLVsCOUNTSCHECKED?#BMI.LINVRSPYES,INVALIDNrCOUNTENDW* Fall-thru to the next pagePAGE3* NOTE: WE FALL-THRU TO HERE FROM THE PREVIOUS PAGE *"*DISPOSEOFTXMITBUFFERSTONR-1*&CLR.LD1FETCHNrCOUNTFROMRESPONSEMOVE.BSDDRSP(A2),D1 LSR.B#4,D1AND.B#$0E,D1MOVE.BD1,SDSVSC(A4)Vs=Nr&MOVE.LA3,D0ANYTHINGINTxMITQUEUE? BEQ.LDSPRC1'DSPNR3ACLR.LD0TXMITTEDAUICOMMAND?MOVE.BSDDCMD(A3),D0AND.B#$EF,D0IF.BD0#SDDCUITHEN.SBTST.L#0,D0IFIELD? BNE.LDCRTX8TST.BSDSUKT(A4)YES,UNACKNOWLEDGEDIFRAMESTxMITTED? BEQ.LDSPRC1AND.B#$0E,D0YES,Nr=Ns? CMP.BD1,D0IF.BD1D0THEN.S8MOVE.BSDDRSP(A2),D0Nr=Ns,ISRESPONSERR,RNR,REJ?AND.B#$03,D0 CMP.B#1,D0 BNE.SDSPUI,MOVE.LA2,A1YES,DISPOSEOFRECEIVEBUFFERBSR.LSOMEDISPOSE%MOVE.LA1,A2ENDOFRECEIVEBUFFERS? MOVE.LA1,D0,BNE.LHSKP9No,goseewhatthenextoneis>CMP.B#SDPTXQ,SDPTXF(A5)Yes,didwesendfromthexmtqueue?'BNE.LDSPRC1No,gofinishcleaningup6BRA.SDSPUIYes,discardanytransmitted"UI"buffersENDIENDI/MOVE.LA3,A1Nr<>Ns,DISPOSEOFTxMITBUFFERBTST.B#4,SDDCMD(A3)IFTHEN.S.BSR.LSOMEDISPOSEYES,DISPOSEOFRCVBUFFERS MOVE.LA1,A34CLR.BSDSUKT(A4)CLEARUNACKNOWLEDGEDIFRAMECOUNT BRA.LDSPRC1ELSE.SBSR.LSOMEDISPOSE MOVE.LA1,A3SUB.B#1,SDSUKT(A4)BRA.SDSPNR3AENDI PAGE*"*ANINVALIDRESPONSEWASRECEIVED*DINVRSPMOVE. B#$FF,SDSPWR(A4)LET'SASSUMETHEDEVICEISPOWEREDOFF**DISPOSEOFUITXMITBUFFERS*&DSPUIMOVE.LA3,D0ENDOFTxMITQUEUE?BEQ.LDSPRC1Yes,out CLR.LD1No,MOVE.BSDDCMD(A3),D1AND.B#$EF,D1+CMP.B#SDDCUI,D1DidwesendaUIcommand? BNE.SDCRTX*MOVE.LA3,A1YES,DISPOSEOFTXMITBUFFER)BTST.B#4,SDDCMD(A3)Poll/finalbitset?IFTHEN.SBSR.LSOMEDISPOSENo MOVE.LA1,A3 BRA.SDSPUIENDI7BSR.LSOMEDISPOSEYes,alsodisposeofreceivebuffers MOVE.LA1,A3 BRA.SDSPRC1 PAGE**DECREMENTTxMITRETRYCOUNTS*DCRTXMOVE.LA3,A1*MOVE.BSDSUKT(A4),D1**DCRTX2CMP.L#0,A3ALLTxMITBUFFERSGONE? BEQ.SDCRTX5"BTST.B#0,SDDCMD(A3)NO,IFIELD?IFTHEN.S*TST.BD1YES,UNACKNOWLEDGEDCOUNTCLEAR? BEQ.SDCRTX5SUB.B#1,D1YES,DECREMENTITENDI7TST.BSDDRTC(A3)NO,DECREMENTRETRYCOUNTIFNON-ZERO BEQ.SDCRTX4*SUB.B#1,SDDRTC(A3)DECREMENTRETRYCOUNTBNE.SDCRTX4EXPIRED??MOVE.LA3,A1YES,SENDTHISTxMITBUFFERTOAPPLPGMASUNSENT>MOVE.B#SDDSSTE,SDDSTS+1(A3)SETRETRYCOUNTEREXPIREDSTATUS$BTST.B#$4,SDDCMD(A3)POLLBITSET?IFTHEN.S&BSR.LSOMESENDYES,LASTTXMITBUFFER4CLR.BSDSUKT(A4)CLEARUNACKNOWLEDGEDIFRAMECOUNT BRA.SDCRTX5ENDI"BTST.B#0,SDDCMD(A3)NO,IFIELD?IFTHEN.S2SUB.B#1,SDSUKT(A4)YES,FIXUNACKNOWLEDGEDCOUNTENDIBSR.LSOMESEND%MOVE.LA1,A3FETCHNEXTTxMITBUFFER BRA.SDCRTX2 )DCRTX4CLR.BSDDERR(A3)CLEARERRORFIELD$BTST.B#$4,SDDCMD(A3)POLLBITSET? BNE.SDCRTX5-MOVE.LSDDLNK(A3),A3FETCHNEXTTxMITBUFFER BRA.SDCRTX2 +DCRTX5MOVE.LA1,A3NEWHEADOFTxMITQUEUE*BRA.SDSPRC1FALL-THRU PAGE:* WARNING: WE MAY FALL-THRU TO HERE FROM THE PREVIOUS PAGE**DISPOSEOFRCVBUFFERS*3DSPRC1MOVE.LA3,SDSTHD(A4)NEWHEADOFTxMITQUEUE.MOVE.LA2,D0ALLRECEIVEBUFFERSDISPOSEDOF?BEQ.LSDLCRQ*MOVE.BSDDERR(A2),D0IFTHEN.S4IF.BD0#SDDENNRAND.BD0#SDDEIFUTHEN.S?MOVE.B#$FF,SDSPWR(A4)Baderror,assumestationisturnedoffENDI)TST.BSDDSTS+1(A2)REPORTERRORTOUSER?BNE.SDSPRC3Yes,gotellhim+BRA.SDSPRC5NO,JUSTFREETHERCVBUFFERSENDICMOVE.BSDDRSP(A2),D0ISRESPONSEFRMR,RD,DM,RIM,UIORIFIELD?AND.B#$EF,D0*CMP.B#SDDCUI,D0*BEQ.SDSPRC3*CMP.B#SDDRRD,SDDRSP(A2)*BEQ.SDSPRC3*CMP.B#SDDRDM,SDDRSP(A2)*BEQ.SDSPRC3*CMP.B#SDDRRIM,SDDRSP(A2) BEQ.SDSPRC3CMP.B#SDDRFRMR,SDDRSP(A2) BEQ.SDSPRC3 BTST.L#0,D0 BNE.SDSPRC5CDSPRC3MOVE.LA2,A1YES,SENDRECEIVEBUFFERTOAPPLICATIONPROGRAM$BTST.B#4,SDDRSP(A2)Finalbitset?IFTHEN.SBSR.LSOMESENDNO MOVE.LA1,A2 BRA.SDSPRC1ENDI3BSR.LSOMESENDYES,ALSOFREEALLRCVBUFFERSLEFT MOVE.LA1,A2*DSPRC5BSR.LSOMEFREEFREEALLRCVBUFFERS0BRA.SSDLCRQSELECTNEXTSDLCSECONDARYSTATION PAGE*(*THERESPONSEWASVALIDFORTHECOMMAND**OKRSPMOVE.LA3,A1DISPOSEOFTXMITBUFFERBSR.LSOMEDISPOSE*MOVE.LA1,SDSTHD(A4)*BSR.LSOMEFREE*=*BRA.SSDLCRQFallthruandselectnextstationtotalkwith PAGE8* Warning: May fall-thru to here from the previous page!*#*SETTHESTATION'SPOLLDELAYTIME*%SDLCRQIF.BSDSPWR(A4)#0THEN.SIF.LSDSTHD(A4)#0THEN.S#0THEN.S?MOVE.WSDSTPF(A4),SDSCTD(A4)Down,notfc,usePowerOffDelayELSE.S:MOVE.WSDSTRT(A4),SDSCTD(A4)Down,tfc,useRe-XmitDelayENDIENDI+MOVE.LA4,A0SELECTNEXTSECONDARYSTATIONBRA.LSDLCSN1 .**********************************************/* END OF FILE 'FIX:48.SDLCPRI.FRMCNT.AI' *.********************************************** PAGE6******************************************************6* BEGINNING OF FILE 'FIX:48.SDLCPRI.INT7201.AI' *6****************************************************** INTRSRGMACRODMOVEM.L(A7)+,A1-A2/D0RestoreRegistersUsedbyInterruptHandlersENDM INTSVRGMACROAMOVEM.LA1-A2/D0,-(A7)SaveRegistersUsedbyInterruptHandlersENDM H**************************************************************************9*SUBROUTINE:"SBSDLCFL"FLUSH(PURGE)ATRANSMITQUEUE**TRAP:"SDLCFL"*.*ENTER:D1.B=SDLCSTATIONNUMBERTOFLUSH**RETURN:CCR**ZsetBUFFERSWEREFLUSHED*%*NsetILLEGALSDLCSTATIONNUMBER*#*REGISTERSUSED:01234567**DP* *AUUS**||_stack**|_____________used***H************************************************************************ SBSDLCFL RTS2RTE5SDLCFLBSR.LFINDSCBFindtheSecondaryControlBlockIFTHEN.L?ANDI.B#$F7,1(A7)ReturnNegativeClear(Legalstationnumber)0ORI.B#$04,1(A7)AndZeroSet(BuffersFlushed)+ORI.W#$700,SRSCBFound,MASKINTERRUPTS!(ADD.W#1,SDSHCFLS(A1)Counttheflushes/MOVE.LSDSTHD(A1),A0Findhistransmitbuffers)MOVE.LA2,-(A7)ProtectA2whiletracingBSR.LGETRACEGetatracerowIFTHEN.SE**********************************************************************TraceEntryFormat*E***********************************************************************#*+0+4+8+9+10+12+13+14+15*E* +---------------+---------------+---+---+-------+---+---+---+---+ *6*!PC!A(1stBuffer)!#!S!0!C!R!D0!D1!*E* +---------------+---------------+---+---+-------+---+---+---+---+ ****PC=ProgramCounter,*A*A(1stBuffer)=Addressofthefirstbufferbeingflushed,or*1*Zerowhennobuffer(s)is(are)beingflushed,**#=Station'sNumber,* *S=Station'sCurrentState,**0=Unused,*7*C=WhenA(1stBuffer)<>0,Buffer'sCommandByte,*7#8+ 30;1C8*R=WhenA(1stBuffer)<>0,Buffer'sResponseByte,*9*D0=WhenA(1stBuffer)<>0,Buffer's1stDataByte,*9*D1=WhenA(1stBuffer)<>0,Buffer's2ndDataByte.***E*********************************************************************PEA*(PC)Ifwegetone,then)MOVE.L(A7)+,0(A2)traceourPCaddress,MOVE.LA0,4(A2)A(1stBuffer),)MOVE.BSDSSEC(A1),8(A2)Stationaddress,9MOVE.BSDSCST(A1),9(A2)Hiscurrentstate(asinIOWA?),&CLR.W10(A2)(Zerofillunusedbytes)IF.L#0A0THEN.S/MOVE.BSDDCMD(A0),12(A2)1stBuffer'sCommand,#MOVE.BSDDRSP(A0),13(A2)Response,#MOVE.BSDDDAT+0(A0),14(A2)andtwo.MOVE.BSDDDAT+1(A0),15(A2)......databytesELSE.S-CLR.L12(A2)Butifnobuffers,storezeroesENDIENDI)MOVE.L(A7)+,A2RecoverA2aftertracingIF.L#0A0THEN.S-CLR.LSDSTHD(A1)Makeallbuffersdisappear,.BSR.LSBPTFRML(returnthemtothefreepool)ENDI'MOVE.LA1,A0A0=A(SCBbeingflushed)MOVE.LSDLCPCB,A1A1=A(PCB)?IF.B#SDPBTXSDPBSY(A1)AND.LA0SDPRRTA4(A1)THEN.S$IF.B#SDPTXQSDPTXF(A1)THEN.S;MOVE.B#NCW0SAB,NECCTL_BXmt'goneoftheflushedbuffers,'MOVE.B#NCW0RG1,NECCTL_BAbortit,and6MOVE.B#NCW1IRD+NCW1STV,NECCTL_Bturn offeverything!MOVEM.LA0-A6/D0-D2,-(A7)MOVE.LSDLCPCB,A64MOVEM.LSDPRRTA0(A6),A0-A6Restoredriver'scontextADD.W#1,SDSHCTOF(A4)MOVE.LSDPRCV(A5),A2,BSR.LSOMEFREEReleaseRcvBfrtofreepoolLEA0,A2NoRcv"MOVE.LA2,A3......orXmtBuffer0MOVE.B#$FF,SDSPWR(A4)andmarkstationasDOWN$BRA.LSDLCRQNowgoresetitstimerENDIENDIELSE.S?ANDI.B#$FB,1(A7)ReturnZeroClear(Bufferswerenotflushed);ORI.B#$08,1(A7)AndNegativeSet(Illegalstationnumber)ENDIRTE(UN-MASKSINTERRUPTS) PAGE!* OVERVIEW OF INTERRUPT VECTORING -* SIGNIFICANT CONTROL BLOCK AND AREA SETTINGS M* 1) The low-memory (0..3FF) interrupt vector which the NEC7201 uses contains)*theaddressoftheINT7201routine,andO* 2) The SDLC Primary Control Block (PCB) contains eight vectors, four for eachI*sideoftheNEC7201.B-sidevectors(0..3)inthePCBaremaintainedbyI*theSDLCdriver.A-sidevectors(4..7)areallthesamehowever,eitherE*pointingtoINT7201AortoPORTAIO.INT7201AisusedwhennoA-sideB*driverexists,PORTAIOisusedwhenanA-sidedriverispresent. * NEC7201 INTERRUPT VECTOR NOTES J* When no interrupt is pending in the NEC7201, the interrupt vector numberM*register(2B)"rests"atvector7.Notethatvector7isforA-sideSpecialM*ReceiveConditionInterrupts.Thedifferencebetweena"resting"and"real"L* interrupt vector in register 2B is indicated in the A-side register 0, bitJ*number1:Wherethisbitisset(1),aninterruptispending.WherethisO* bit is clear (0), no interrupt was pending, and the interrupt vector "rests".H* (Note that register 2B must be read before the pending bit is tested.) * INTERRUPT PROCESSING SEQUENCE L* When something interrupts using the low-memory interrupt vector designatedL*astheNEC7201svector,theMPUvectorstotheINT7201routine.There,theO* 7201's internal interrupt vector number is read from register 2B, and controlM* is passed via the corresponding vector in the SDLC PCB (note that vector #7@* will be used when the 7201 does not have a pending interrupt).O* Where a B-side interrupt was present (vector 0..3), we go to an SDLC routine.K* Where an A-side vector (4..7) was presented, we go to INT7201 or PORTAIO.J* For A-side interrupts, if no A-side driver has overwritten vectors 4..7,G* we go to INT7201A and acknowledge the interrupt, making it "go away".L* If an A-side driver exists, we go to PORTAIO which checks the pending flagL* in the 7201's A-side register 0, and thereby determines whether or not the* 7201 has a pending interrupt.N* Where a pending interrupt exists (must be an A-side interrupt), PORTAIO usesM* two SDLC PCB pointers to store the interrupt vector number as read from theN* 7201 (PORTAIO will right justify the vector in some cases), and then to jumpL*tosomeotheraddress.(TheA-sidedriverhasstoredthesetwoaddresses.)O* Where no pending interrupt exists (i.e., the interrupt vector number read wasO* 4..7 [should have been #7, by the way], and the interrupt pending flag in theN* 7201's register 0 on the A-side was clear), the PORTAIO routine "assumes" anO* External Status change interrupt for the B-side (SDLC), and forces processing?* to the current SDLC External Status interrupt handling state.L*This"assumed"ExternalStatusinterruptisquestionable.Aswedon'tknowM* who interrupted (it is not the NEC7201), it is unclear what to do about it.PAGEH**************************************************************************9*I.S.R.:"INT7201"NEC7201InterruptServiceRoutine***#*REGISTERSUSED:01234567**D**AS* *|__stack***<*VectorsthroughPrimaryControlBlock'sIndirectVectors*6*OffsetbyNEC7201'sStatusAffectsVectorRegister***3*SavesRegistersD0.L,A1.L,&A2.LontheStack*+*A1.L=AddressofPrimaryControlBlock***H**************************** ******************************************** "INT7201INTSVRGSAVEREGSONSTACK,CLR.WD0ReadtheNEC7201'sVectorRegisterMOVE.B#NCW0RG2,NECCTL_BMOVE.BNECCTL_B,D01MOVE.LSDLCPCB,A1(A1=A(PrimaryControlBlock)0*BTST#0,TRACFLAG+1Shouldinterruptbetraced?*IFTHEN.S!*BSRDLTRACETracetheinterrupt*ENDIBMOVE.LSDPVCT(A1,D0.W),A2FindoutWhereToGoforthisInterruptJMP(A2)AndGoThere! PAGE I***************************************************************************'*INT7201A-A-SideInterruptHandler***H*AnA-SideInterrupthasoccurred,orsomethingotherthananNEC7201*I* interrupt has brought us here (in which case the NEC7201 has given us *F*vector#7).Eitherway,wedon'twantthenastylittlesucker.So,*H*iftheNEC7201reallydidcausetheinterrupt,weacknowledgeitand*H*therebymaketheinterruptgoaway.Otherwise,wesimplyexitinthe*G*hopethatwhateverbroughtusherewon'tdoitagain(aswehaveno*F*ideawhatweshoulddoaboutitsincewedon'tknowwhat"it"is)!***I************************************************************************* @INT7201ABTST.B#1,NECCTL_AIsaninterruptpendinginthe7201?1IFTHEN.SYes,seewhatflavorofinterrupt9IF.WD0#16THEN.SOnTransmitterEmptyInterrupts,;MOVE.B#NCW0RTI,NECCTL_AResetTransmitterEmptyInterruptELSE.S7IF.WD0#20THEN.SOnExternalStatusInterrupts,9MOVE.B#NCW0REX,NECCTL_AResetExternalStatusInterruptELSE.S8IF.WD0#24THEN.SOnReceiveCharacterInterrupts/TST.BNECDAT_AReadtheChar(ClearstheIntr)ELSE.S5*Otherwise,onSpecialReceiveConditionInterrupts,7MOVE.B#NCW0ERR,NECCTL_AResetError(ClearstheIntr)ENDIENDIENDI?MOVE.B#NCW0EOI,NECCTL_AWhatever,maketheinterruptgoaway!ENDI4*BRA.SINTEXITAndgoexitfromhandlinginterrupts)* Fall-thru to the Interrupt Exit Routine APWREQUINT7201AOnPowerUp,ResetAnyPendingA-SideInterrupts PAGE H**************************************************************************.*"INTEXIT"-NEC7201InterruptExitRoutine***:*NOTE:Allinterrupthandlingproceduresmustcomehere**uponcompletion.***:*Checksfor"another"pendinginterruptintheNEC7201.*:*Ifpresent,wevectorthruthePrimaryControlBlock's*?*IndirectVectorasindicatedbythe7201'sVectorRegister.*>*Ifno"other"interruptispending,registersarerestored*?*fromthestack,andanRTEisexecutedtherebyreturningto**theinterruptedprocess.***;*AssumesRegistersD0.L,A1.L,&A2.LstillontheStack***H************************************************************************ ?* Warning: We may "fall-thru" to here from the preceeding page. INTEXITCLR.WD0MOVE.B#NCW0RG2,NECCTL_B9MOVE.BNECCTL_B,D0Readthe7201'sVectorRegister,then9BTST.B#1,NECCTL_AIfInterruptPendingFlagIsNowSet,4IFTHEN.SThen"another"InterruptisPresent.8MOVE.LSDLCPCB,A1So,SetA1=A(PrimaryControlBlock)0*BTST#0,TRACFLAG+1Shouldinterruptbetraced?*IFTHEN.S!*BSRDLTRACETracetheinterrupt*ENDI:MOVE.LSDPVCT(A1,D0.W),A2Regardless,Fetch"WhereToGo")JMP(A2)AndGoHandlethenewInterrupt-ENDIButifno"other"Interruptispresent,#INTRSRGThenRestoretheRegisters'RTEAndResumetheInterruptedProcess 0************************************************0* END OF FILE 'FIX:48.SDLCPRI.INT7201.AI' *0************************************************ 4****************************************************4* BEGINNING OF FILE 'FIX:48.SDLCPRI.POLLQ.AI' *4**************************************************** SDLRSRGMACRO2MOVEM.L(A7)+,A0-A6/D0-D2RESTORESAVEDREGISTERSENDM SDLSVRGMACROMOVEM.LA0-A6/D0-D2,-(A7)*ENDM SECTION9PAGEH**************************************************************************D*SUBROUTINE:"PWRUP"INITIALIZETHENEC7201CHIPATPOWERUPTIME***+*ENTER:A4.L=ADDRESSOFSDLC'SSEGMENT***#*REGISTERSUSED:01234567* *DUU**AUUUPS* *|__stack***H************************************************************************ NEXTWB,PWRUPMOVE.B#NCW0RCN,NECCTL_BCHANNELRESETMOVE.B#NCW0RG2,NECCTL_A)MOVE.B#NCW2RTS+NCW2PRI+NCW2BIN,NECCTL_A*MOVE.B#NCW0RG2,NECCTL_BINTERRUPTVECTORMOVE.B#0,NECCTL_BMOVE.B#NCW0RG4,NECCTL_BMODE)MOVE.B#NCW4C01+NCW4SDL+NCW4SME,NECCTL_B#MOVE.B#NCW0RG7,NECCTL_BSDLCFLAGMOVE.B#SDLCFLAG,NECCTL_B3MOVE.B#NCW0RG3,NECCTL_BENABLEAUTOENABLEOFCTS!MOVE.B#NCW3BT8+NCW3AUE,NECCTL_BIFEQRES7201-400MOVE.WSR,-(A7)!ORI.W#$0700,SRMaskInterrupts!5MOVE.L#MVME400,A0A0=AddressoftheMVME400board'BCLR.B#REGSELEC,CTLPIA_A(A0)SetDDRAAMOVE.B#WRT_LED+WRT_SEL,DATPIA_A(A0)tooutputmid-twobitsonly:BSET.B#REGSELEC,CTLPIA_A(A0)SwitchnowtoDataRegonA=BSET.B#WRT_SEL,DATPIA_A(A0)SelectbaudratejumpersPort2(MOVE.BDATPIA_A(A0),D0andreadthemin6ANDI.W#$07,D0AND'ingoffallbutthebaudratebitsBMOVE.BV400BAUD(PC,D0.W),D0andgetthe4-bitcorrespondingvalue3MOVE.BD0,-(A7)savingitonthestacktemporarily,BCLR.B#REGSELEC,CTLPIA_B(A0)Now,setDDRB2MOVE.B#%11111111,DATPIA_B(A0)toallbitsoutput:BSET.B#REGSELEC,CTLPIA_B(A0)SwitchnowtoDataRegonB;MOVE.BDATPIA_B(A0),D0andreadthecurrent4-bitsettings.ANDI.B#RATE1MSK,D0dropoutPort2'ssetting;OR.B(A7)+,D0andORinthenewvaluewefiguredoutaboveK8TK\Id0l;t-BMOVE.BD0,DATPIA_B(A0)andoutputthenewrate(Port1unchanged)#MOVE.W(A7)+,SRUnmaskInterrupts!ENDC,LEASDLCPR(PC),A0FETCHADDRESSOF"SDLCPR"MOVE.L#TIMCNST,A1'MOVE.W#$4005,D1INTERRUPTLEVEL->D1MOVE.L#DLC1,D2I.D.#->D2IFEQCHIPTYPE-68000 TR0.RQPAENDCIFNECHIPTYPE-68000 TR0$.RQPAENDC3RTSRETURN(MUSTBEA2BYTEINSTRUCTION!)2/24/831ILLEGALDIEIFSBRQPARETURNSANYERROR!2/24/83 IFEQRES7201-400"V400BAUDDC.B15,14,13,12,10,7,5,2ENDC *3*ThisisadummyroutinetosatisfyXREFinBUFMGT*XDEFSDLCQXMT SDLCQXMT RTSPAGEH**************************************************************************9*TRAP:"SDLCRCST"THISROUTINEISA"DUMMY"TOPROVIDE*'*COMPATABILITYFORBUFFERMANAGEMENT**SUBROUTINE:"SBSDLCRCST"***#*REGISTERSUSED:01234567**D**AS* *|__stack***H************************************************************************ =SDLCRCSTBSR.SSBSDLCRCSTTRAP ENTRYPOINT,DOTHESUBROUTINE+MOVE.WSR,0(A7)REPLACETHECONDITIONCODE"RTESOWEGIVEPROPERRETURNCODE +SBSDLCRCSTILLEGALDie,shouldnotbeused!PAGEH**************************************************************************0*TRAP:"USRACK"TRAPSERVICEROUTINEFORSDLC**SUBROUTINE:"SBUSRACK"***#*REGISTERSUSED:01234567**D**AS* *|__stack***H************************************************************************ 9USRACKBSR.SSBUSRACKTRAPENTRYPOINT,DOTHESUBROUTINE+MOVE.WSR,0(A7)REPLACETHECONDITIONCODE"RTESOWEGIVEPROPERRETURNCODE )SBUSRACKILLEGALDie,shouldnotbeused!PAGEH**************************************************************************0*TRAP:"SDLCKL"TRAPSERVICEROUTINEFORSDLC*&*THISROUTINEEFFECTIVELYKILLSTHE*.*SDLCLINKANDCANCELSPERIODICACTIVATIONS**SUBROUTINE:"SBSDLCKL"***#*REGISTERSUSED:01234567* *DUU**AS* *|__stack***H************************************************************************ 9SDLCKLBSR.SSBSDLCKLTRAPENTRYPOINT,DOTHESUBROUTINE+MOVE.WSR,0(A7)REPLACETHECONDITIONCODE&RTESOWEGIVETHEPROPERRETURNCODE @SBSDLCKLMOVE.B#NCW0RCN,NECCTL_BCHANNELRESETTHENEC7201CHIP2MOVE.W#$8005,D1DISCONTINUEPERIODICACTIVATIONSMOVE.L#DLC1,D2*IFEQCHIPTYPE-68000 TR0.RQPAENDCIFNECHIPTYPE-68000 TR0$.RQPAENDC.RTSOK,RETURN(MUSTBEA2BYTEINSTRUCTION)1ILLEGALDIEIFSBRQPARETURNSANYERROR!2/24/83PAGEH**************************************************************************0*TRAP:"SDLCQU"TRAPSERVICEROUTINEFORSDLC*+*THISROUTINECHECKSTRANSMITQUEUESFOR*0*DATATOTRANSMITBETWEENPERIODICACTIVATIONS**SUBROUTINE:"SDLCQUSB"*****#*REGISTERSUSED:01234567**D**AS* *|__stack***H************************************************************************ SDLCQUSB RTS2RTESDLCQUSDLSVRGMOVE.LSDLCPCB,A5ADD.W#1,SDPHCQUS(A5) MOVE.WSR,D0%AND.W#$0700,D0ATLEASTATLEVEL5?IF.WD0#$0500THEN.S MOVE.WSR,D0AND.W#$F8FF,D0No,-OR.W#$0500,D0assertwearenowatlevel5!.MOVE.WD0,SR(oldSRandintrlevelonstack)ENDIBRA.SSDLCPR3PAGEH**************************************************************************4*TRAP:"SDLCTTMOUT"TRAPSERVICEROUTINEFORSDLC*,*THISROUTINEISENTEREDWHENTHERECEIVE**TIMEOUTEXPIRES**SUBROUTINE:"SDLCTMOUT"*****#*REGISTERSUSED:01234567**D**AS* *|__stack***H************************************************************************ SDLCTMOUTRTS2RTE%SDLCTTMOUTSDLSVRGSAVEALLUSERREGS+MOVE.LSDLCPCB,A6RESTOREREGSFROMP.C.B.MOVEM.LSDPRRTA0(A6),A0-A6ADD.W#1,SDSHCRTO(A4)3/2/83BRA.LRECEITORECEIVETIMEOUT PAGE H**************************************************************************>*TRAP:"SDLCPR"TRAPROUTINEWHICHISENTEREDWHENPERIODIC**TIMERRUNSDOWN**SUBROUTINE:"SDLCPRSB"***0*ENTER:D0.L=#INTERVALSWHICHHAVEELAPSED**D1.L=ACTIVATIONI.D.***C*WARNING:THISSECTIONOFCODERUNSATINTERRUPTLEVELFIVE(5).*C*HOWEVER,WHENWEENTERHEREAFTERCOMPLETINGATRANSACTIONWITH*F*ASECONDARYSTATION,WEAREAT"FUNNYLEVEL5"-I.E.,WESUFFERED*E*ALEVELSIX(6)INTERRUPT,HANDLEDIT,ANDTHENLOWEREDTHELEVEL*E*TOFIVE.ASARESULT,WEMAYHAVEINTERRUPTEDOURSELVES.FORTHIS*G*REASON,THEVARIABLE"SDPBSY"ISUSEDTOALLOWACCESSTOTHE"START*D*NEWWORK"PORTIONSOFTHISIMPLEMENTATION.WHENTHISVARIABLEIS*E*SETTO"NOTBUSY",THENANDONLYTHENCANWELOOKFORNEWWORKTO*G*BEINITIATED.WHENWEARENOT"NOTBUSY"(I.E.,WEAREBUSYSENDING*E*ORRECEIVING,ORWHATEVER)WECANONLYDECREMENTTHETIMERVALUES*F*INTHESECONDARYCONTROLBLOCKS,ANDNOMORE.LASTLY,BECAUSEEVEN*D*THISCOULDBE"INTERRUPTED "BYOURSELVES,WEMUSTHANDLEATIMER*G*VALUEWHICHGOESTOLESSTHANZERO(I.E.,WECOMMITTEDTODECREMENT*H* A TIMER, WERE INTERRUPTED AND ZEROED THAT COUNTER, AND THEN RETURNED *2*TOSUBTRACTONE,LEAVINGTHATCOUNTNEGATIVE).****EDSKINNER,MARCH2,1983***H************************************************************************ SDLCPRSB RTS2RTESDLCPRSDLSVRGMOVE.L#0,A1SETUPREGISTERSMOVE.LSDLCPCB,A5*MOVE.LSDPFSEC(A5),A0**<*DECREMENTTHECURRENTTIMEDELAYOFALLSECONDARYSTATIONS$*ANDSELECTTHE1STONETHAT'SZERO* WHILE.BSDSSEC(A0)#0DO.SIF.WSDSCTD(A0)#0THEN.S2SUB.WD0,SDSCTD(A0)Timer:=Timer-Elapsed_TimeENDI#SDPBNBTHEN.SSDLRSRGYes,exitRTEENDIPAGE*1*SELECTTHE1STSCBWHOSETIMEDELAYISNOWZERO*?SDLCSLWHILE.BSDSSEC(A0)#0AND.WSDSCTD(A0)#0DO.S,SDLCSN1ADD.L#SDSLNG,A0AdvancetonextSCBENDWIF.BSDSSEC(A0)#0THEN.STHEN.S6MOVE.B#SDPBNB,SDPBSY(A5)Didn'tgetone,goNOTBUSYSDLRSRGAndexitRTEENDI!* GOT ONE, BUT IT'S THE VERY LASTASDLCPR5AMOVE.B#SDDRRNR+$10,SDDCMD(A3)YES,SETAN"RNR"COMMANDBRA.SSDLCPR5C #*A3=BUFFERCONTROLBLOCKADDRESS;SDLCPR5BMOVE.B#SDDRRR+$10,SDDCMD(A3)SENDAN"RR"COMMAND?SDLCPR5CMOVE.LA3,SDPRCV(A5)*(TxMITFROMTHERECEIVEBUFFER)MOVE.B#SDPTRQ,SDPTXF(A5)***MOVE.WSDPRLG(A5),SDDBCT(A3)*BYTECOUNTCLR.WSDDSTS(A3)*STATUSCLR.BSDDERR(A3)*SDLCERROR$CLR.BSDDRTC(A3)*SDLCRETRYCOUNT.MOVE.BSDSSEC(A4),SDDSEC(A3)*STATIONNUMBERBRA.LTRANSMT**PAGEH* NOTE: ED SKINNER, 2/24/83 - WHEN WE HAVE A "SNRM" TO SEND, WE ACTUALLYI*PERFORMTHEFOLLOWING:1)TRANSMITA"RNR"COMMANDANDRECEIVEA"GOOD"H*RESPONSE.THISISDONESOTHEREMOTESTATIONWILLKNOWHOWMANYOFHISH* INFORMATION FRAMES THAT WE HAVE RECEIVED, THEREBY AVOIDING DUPLICATIONH*OFFRAMES.WEMUSTGETA"GOOD"RESPONSETOTHERNRBEFORESENDINGTHEH* SNRM SO THAT WE KNOW HE GOT THE RNR OK, AND THEREFORE NOW KNOWS OUR NrI*VALUE.(BYA"GOOD"RESPONSE,IMEANARECEIVEDREPLYOFANYKINDWHICHJ* WAS RECEIVED WITHOUT ANY ERRORS - DOES AN Ns ERROR COUNT? I DON'T KNOW!)D* ONCE WE'VE RECEIVED A "GOOD" REPLY, WE CAN THEN TRANSMIT THE SNRM. 6SDLCPR6MOVE.LSDSTHD(A4),A3WEHAVESOMETHINGTOTXMT3CMP.B#SDDCSNRM,SDDCMD(A3)"SNRM"COMMAND?9/14/82&BNE.SSDLCPR6C*BRANCHIFNO9/14/829CMP.B#SDSTRN,SDSTXF(A4)YES,TXMITTEDAN"RNR"?2/23/83'BEQ.SSDLCPR6C*BRANCHIFYES9/14/82?BSR.LSBGTFRIRNO,FETCHARCVBUFFER&TXMITAN"RNR"9/14/825BEQ.SSDLCPR5AGOTONEANDIT'SNOTTHELAST9/14/82IFTHEN.S6MOVE.B#SDPBNB,SDPBSY(A5)Didn'tgetone,goNOTBUSYSDLRSRGAndexitRTEENDI"* WE JUST GOT THE VERY LAST BUFFER)BRA.SSDLCPR5ATRANSMITAN"RNR"9/14/82 "SDLCPR6CMOVE.B#SDPTXQ,SDPTXF(A5)MOVE.LA3,-(A7),BSR.LSBGTFRIRGetabuffer toreceiveintoIFTHEN.S:MOVE.WSDPRLG(A5),SDDBCT(A3)Ok,PrepareitforlateruseCLR.WSDDSTS(A3)STATUSCLR.BSDDERR(A3)SDLCERRORMOVE.LA3,SDPRCV(A5)MOVE.L(A7)+,A3)BTST.B#0,SDDCMD(A3)IFrametobesent?IFTHEN.S4CLR.BSDSUKT(A4)Yes,zerothenumberofframesoutENDIELSE.S.MOVE.L(A7)+,A0Absolutelynobuffersatall,-MOVE.B#SDPBNB,SDPBSY(A5)SetSDLCnotbusy,SDLRSRGAndexitRTEENDI$BRA.LTRANSMTGostarttransmitting .**********************************************.* END OF FILE 'FIX:48.SDLCPRI.POLLQ.AI' *.**********************************************PAGE6******************************************************6* BEGINNING OF FILE 'FIX:48.SDLCPRI.RECEIVE.AI' *6****************************************************** H*************************************************************************'*MODULE:"RECEIVE"RECEIVESDLCFRAMES*-*ENTER:A5.L=PRIMARYCONTROLBLOCKADDRESS(*A4.L=SECONDARYCONTROLBLOCKADDRESS*9*ENTRYASSUMESA0-A6/D0-D7HAVEBEENPUSHEDONTHESTACK5*ANDENTRYWASTHROUGHEXCEPTION(TRAPORINTERRUPT)*>*EXIT:"RECEIFB"SDLCRESPONSEWITHFINALBITSETCAUSEDEXIT'*"RECEITO"RECEIVETIMEOUTCAUSEDEXIT3*"RECEILB"THEFREEQUEUEHASONLYONEBUFFERLEFT9*"RECEIEE"ANEXCESSIVENUMBEROFRCVERRORSCAUSEDEXIT*!*REGISTERSUSED:01234567*DU*AUUUUPPS*|||__stack*||______preserved*|__________used*#*EXITSTOEXTERNALLYDEFINEDLABEL&*WITHA0-A6/D0-D7PUSHEDONTHESTACK&*ANDASSUMESFINALEXITWILLBE"RTE"*H************************************************************************ ?RECEIVEMOVE.B#SDPBRC,SDPBSY(A5)Markusasbusyreceivingnow ADD.W#1,SDSHCRCV(A4)3/2/83 THEN.S0MOVE.LSDPRRTA2(A1),A2MoremaybereceivedOK,5MOVE.BNECDAT_B,(A2)+Storereceivedbyteintobuffe2MOVE.LA2,SDPRRTA2(A1)Saveupdateddataaddress.ELSE.S9LEARCVST4(PC),A2Bufferisfull,betterby1stFCSbyteTHEN.SE**********************************************************************TraceEntryFormat*E***********************************************************************'*+0+4+8+9+10+11+12+13+14+15*E* +---------------+---------------+---+---+---+---+---+---+---+---+ *:*!PC!A(RcvBuffer)!#!S!C!R!D0!D1!E!R1!*E* +---------------+---------------+---+---+---+---+---+---+---+---+ ****PC=ProgramCounter,*8*A(RcvBuffer)=Addressofthebufferjustreceived,**#=Station'sNumber,* *S=Station'sCurrentState,**C=Buffer'sCommandByte,**R=Buffer'sResponseByte,* *D0=Buffer's1stDataByte,* *D1=Buffer's2ndDataByte,*!*E=Buffer'sErrorCodeByte,*(*R1=NEC7201ReadRegisterOneByte.***E*********************************************************************,PEA*(PC)Ifwegetatracerow,thentrace#MOVE.L(A7)+,0(A2)ourPCaddress,MOVE.LA3,4(A2)A(RcvBuffer),)MOVE.BSDSSEC(A4),8(A2)Stationaddress,+MOVE.BSDSCST(A4),9(A2)Hiscurrentstate,0MOVE.BSDDCMD(A3),10(A2)CommandByte(ifany),(MOVE.BSDDRSP(A3),11(A2)ResponseByte,%MOVE.BSDDDAT+0(A3),12(A2)Firstand.MOVE.BSDDDAT+1(A3),13(A2)Seconddatabytes,.MOVE.BSDDERR(A3),14(A2)Errorcodebyte,and-MOVE.BD0,15(A2)Register1fromtheNEC7201ENDI)MOVE.L(A7)+,A2RecoverA2aftertracing $BTST.L#7,D0EndofFramedetected?BEQ.SRCVSTSABTST.L#6,D0Yes,FCSerror?IFTHEN.S=MOVE.B#SDDECRC,SDDERR(A3)Yes,posttheerrorinthebufferADD.W#1,SDSHCRCR(A4)3/2/83ENDI&RCVSTSABTST.L#5,D0receiveroverrun?IFTHEN.S6MOVE.B#SDDERCU,SDDERR(A3)Yes,postitinthebufferADD.W#1,SDSHCROR(A4)3/2/83ENDI,CMP.B#SDDERTO,SDDERR(A3)Receivetime-out?0BEQ.LRECEITOYes,departfromherecompletely!,TST.BSDDERR(A3)Anyerrordetectedsofar?IFTHEN.S/CMP.B#SDDERBO,SDDERR(A3)Yes,frametoolong?1BNE.LRCVSTSENo,justignorethereceivedframe(TST.BSDSCSE(A4)Yes,anyretriesleft?-BNE.LRCVSTSEYes,ignorethereceivedframe7* When a Buffer Overrun occurs and no retries are left,J* the overlength frame is passed to the application with the error posted.L* This allows someone to complain about these "big" frames we are receiving.ENDI9MOVE.WA1,D0Calculatehowmanybytesareinthebuffer,5ADD.W#1,D0Addingonefor1stFCScharacteroverrunSUB.WD0,SDDBCT(A3)CCMP.W#-1,SDDBCT(A3)Istheframetooshort?(LT32bits?)8/27/82IFTHEN.S8MOVE.B#SDDEIFU,SDDERR(A3)Yes,posttheerror10/13/82ADD.W#1,SDSHCR32(A4)3/2/83BRA.LRCVSTSF10/13/82ENDI,BTST.B#0,SDDRSP(A3)No,wasitanIframe?$BNE.SRCVSTSDOutifnotanIframeIFEQIFRMBCT-YES3MOVE.WSDPRBCT(A5),D0IFrame'sLengthasClaimed?CMP.WSDDBCT(A3),D0BNE.SRCVSTSB6No,branchENDC=CMP.B#SDPTRN,SDPTXF(A5)Yes,didwejustsendanRNRframe?0BNE.SRCVSTSB3No,it'sOKtorcvIframesthenHRCVSTSB6MOVE.B#SDDEIFU,SDDERR(A3)Yes,stationshouldn'thavesentit!ADD.W#1,SD SHCRLN(A4)3/2/83BRA.SRCVSTSB4 ARCVSTSB3MOVE.BSDDRSP(A3),D0NO,DOESVr=Nsinreceivedframe? ASL.B#4,D0AND.B#$E0,D0CMP.BSDSVRC(A4),D0BEQ.SRCVSTSC:RCVSTSB5MOVE.B#SDDENNR,SDDERR(A3)NO,SETVr<>NsERRORADD.W#1,SDSHCRNR(A4)3/2/83ARCVSTSB4BTST.B#4,SDDRSP(A3)Isthereceivedpoll/finalbitset?BEQ.SRCVSTSE-BRA.LRECEIFBYES,EXIT(RECEIVEDFINALBIT) 5RCVSTSCADD.B#$20,SDSVRC(A4)Vr=Ns,soVr=Vr+1AND.B#$E0,SDSVRC(A4)@RCVSTSDBTST.B#4,SDDRSP(A3)Isthereceivedpoll/finalbitset?BEQ.SRCVSTSD1-BRA.LRECEIFBYES,EXIT(RECEIVEDFINALBIT) A2 ADD.LA3,A2#MOVE.L#0,A1BUFFER'SLENGTH->A1MOVE.WSDPRLG(A5),A1 MOVE.WA1,SDDBCT(A3)BYTECOUNT"CLR.BSDDERR(A3)CLEARSDLCERROR%MOVEM.LA0-A6,SDPRRTA0(A5)SAVEREGS2LEARCVST1(PC),A0VECTOREDSTATEFOR1STRCVCHARMOVE.LA0,SDPVCT3(A5)*LEARCVSTSEI(PC),A0ANDIGNOREEXTSTATUSMOVE.LA0,SDPVCT2(A5)7MOVE.W#-1,SDPRBCT(A5)MAKECOUNTFIELDINVALID3/8/83ADD.W#1,SDSHCRRS(A4)3/2/835MOVE.B#NCW0RG3,NECCTL_BRe-enablehuntmode2/10/83H MOVE.B #NCW3BT8+NCW3AUE+NCW3EHU+NCW3CRC+NCW3ADS+NCW3RXE,NECCTL_B 2/10/8'BSR.LSOMETOUTTRIGGERRECEIVETIMEOUT$SDLRSRGRestoreallregisters,then'INTSVRGSaveonlythe"interrupt"onesBRA.LINTEXIT 0************************************************0* END OF FILE 'FIX:48.SDLCPRI.RECEIVE.AI' *0************************************************PAGE5*****************************************************5* BEGINNING OF FILE 'FIX:48.SDLCPRI.SUBRTN.AI' *5*****************************************************   J****************************************************************************6*SUBROUTINE:"SOMETOUT"TRIGGERTHERECEIVETIMEOUT***1*ENTER:A4.L=SECONDARYCONTROLBLOCKADDRESS*****#*REGISTERSUSED:01234567* *DUUU* *AUUPS**|||_stack**||_______preserved**|_______________used***J************************************************************************** 7SOMETOUTLEASDLCTTMOUT(PC),A0ACTIVATIONADDRESS->A0'CLR.LD0TIMEINTERVAL(INMSEC)->A1MOVE.WSDSTOC(A4),D0*BEQ.SSOMETOU1* MULU.W#TIMCNST,D0*MOVE.WD0,A1*'MOVE.W#$0006,D1INTERRUPTLEVEL->D1MOVE.L#DLC2,D2I.D.#->D2IFEQCHIPTYPE-68000 TR0.RQPAENDCIFNECHIPTYPE-68000 TR0$.RQPAENDC3SOMETOU1RTS(MUSTBEA2BYTEINSTRUCTION)2/24/831ILLEGALDIEIFSBRQPARETURNSANYERROR!2/24/83 PAGE J****************************************************************************5*SUBROUTINE:"SOMETOCLR"CLEARTHERECEIVETIMEOUT*******#*REGISTERSUSED:01234567* *DUUU* *AUUS**||_stack**|_______________used***J************************************************************************** 8SOMETOCLRLEASDLCTTMOUT(PC),A0ACTIVATIONADDRESS->A0'CLR.LD0TIMEINTERVAL(INMSEC)->D1MOVE.WSDSTOC(A4),D0*BEQ.SSOMECLR1*MULU.W#TIMCNST,D0*MOVE.WD0,A1*'MOVE.W#$8006,D1INTERRUPTLEVEL->D1MOVE.L#DLC2,D2I.D.#->D2IFEQCHIPTYPE-68000 TR0.RQPAENDCIFNECHIPTYPE-68000 TR0$.RQPAENDC3SOMECLR1RTS(MUSTBEA2BYTEINSTRUCTION)2/24/831ILLEGALDIEIFSBRQPARETURNSANYERROR!2/24/83 PAGE J****************************************************************************1*SUBROUTINE:"SOMEDISPOSE"DISPOSEOFABUFFER*NQA+**.*ENTER:A1.L=ADDRESSOFBUFFERTODISPOSE*(*A5.L=PRIMARYCONTROLBLOCKADDRESS***;*RETURN:A1.L=ADDRESSOFLINKFIELDOFDISPOSEDBUFFER***#*REGISTERSUSED:01234567**D* *AURPS**||||_stack**|||_____preserved**||_____________returned**|_______________used***J************************************************************************** #SOMEDISPOSE MOVE.L SDDLNK(A1),-(A7) MOVE.LA1,A0BSR.LSBPTFRBFMOVE.L(A7)+,A1RTS PAGE J****************************************************************************?*SUBROUTINE:"SOMESEND"SENDABUFFERTOAPPLICATIONPROGRAM***+*ENTER:A1.L=ADDRESSOFBUFFERTOSEND*(*A5.L=PRIMARYCONTROLBLOCKADDRESS***7*RETURN:A1.L=ADDRESSOFLINKFIELDOFSENTBUFFER***#*REGISTERSUSED:01234567**DU* *AURPS* *|||**|||_stack**||_____preserved**|_____________returned***J************************************************************************** SOMESENDMOVE.LSDDLNK(A1),-(A7) MOVE.LA1,A0MOVE.LA2,-(A7)BSR.LSBPTUSQMOVE.L(A7)+,A2MOVE.L(A7)+,A1RTS PAGE J****************************************************************************F*SUBROUTINE:"SOMEFREE"FREETHELINKOFRCVBUFFERSTOBUFFERPOOL***5*ENTER:A2.L=ADDRESSOFFIRSTRCVBUFFERTOFREE*(*A5.L=PRIMARYCONTROLBLOCKADDRESS***#*REGISTERSUSED:01234567**DU* *AUPPS**|||_stack**||_____preserved**|_______________used***J************************************************************************** SOMEFREEMOVE.LA2,A0BSR.LSBPTFRMLRTS PAGE J****************************************************************************8*SUBROUTINE:"FINDSCB"FindaSecondaryControlBlock***D*ENTER:D1.B=SecondaryStationAddress,or$FF(GlobalAddress)*7*Note:WheretheGlobalAddressisused,theaddress*3*ofthe1stSecondaryControlBlockisreturned.***4*RETURN:Negative=0(Plus)-SCBFound,seeA1,***A1=A(SCB-SecondaryControlBlock),*>*Negative=1(Minus)-SCBNotFound,A1isindeterminite.***#*REGISTERSUSED:01234567**DP* *A|RS**|||_stack**||_____________returned**|_______________preserved***J************************************************************************** XDEFFINDSCB >FLYPAPEREQU$FFFFFFFFFly-Paper ,causesAddressErrorifused 8FINDSCBMOVE.LSDLCPCB,A1ViathePrimaryControlBlock,8MOVE.LSDPFSEC(A1),A1FindtheaddressofthefirstSCBIF.BD1#$FFTHEN.S9WHILE.BSDSSEC(A1)#0AND.BSDSSEC(A1)D1DO.S&ADDA.L#SDSLNG,A1AdvancetonextSCBENDWENDIIF.BSDSSEC(A1)#0THEN.S0MOVE.L#FLYPAPER,A1NotFound,A1=BugCatcher ORI.B#$08,CCRAndNegative=1ELSE.S1ANDI.B#$F7,CCRFound,Negative=0,A1=A(SCB)ENDIRTS PAGE J****************************************************************************1*SUBROUTINE:"GETRACE"GetaTraceRowAddress****ENTER:NoArguments***A*RETURN:Carry=0(CarryClear)-TraceRowAddressReturned,**A2=A(TraceRow),*%*(Thetraceflagisonandatrace**areaexists),*3*Carry=1(CarrySet)-NoTraceRowAvailable,**A2=#$FFFFFFFF,*%*(Eitherthetraceflagisoff,or**notraceareaexists).***H*Note:Thesixteenbytesfrom0(A2)thru15(A2)areavailableforany*B*traceinformation(whenthe"NotEqual"returnoccurs).Common*B*usageistostorethecurrentPCvalueat0(A2).L,identifying*B*theprocedurewhichistracing,followedbyprocedurespecific**traceinformation.****ExampleUsage:*+*MOVE.LA2,-(A7)ProtectA2ifnecessary*!*BSR.LGETRACEGetatracerow*)*IFTHEN.SIfarowisavailable,* *PEA*(PC)***MOVE.L(A7)+,0(A2)StoremyPCaddress**MOVE.Bx,4(A2)**MOVE.By,5(A2)*)*MOVE.Lz,6(A2)Storesomeinformation**MOVE.La,10(A2)*.*MOVE.Wb,14(A2)-DoNotExceed15(A2).B-**ENDI*0*MOVE.L(A7)+,A2andrecoverA2(if"pushed")***J************************************************************************** XREFTRACEBEG GETRACEMOVE.LTRACEBEG,A2BTST.B#0,TRACFLAG+1 IFAND.LA2#0THEN.SMOVEM.LA3-A4,-(A7)0MOVE.LA2,A3A3=A(Tracecontrol&tracearea)MOVE.WSR,-(A7) ORI.W#$0700,SRMASKINTERRUPTS MOVE.L0(A3),A2GetA(NextRow)%LEA16(A2),A4FigureA(NewNextRow)IF.LA44(A3)THEN.S.LEA8(A3),A4Resettobeginningwhenpastend MOVE.LA4,A2LEA16(A2),A4ENDI4MOVE.LA4,0(A3)StorenewA(NextRow)fornexttime"MOVE.W(A7)+,SRUNMASKINTERRUPTS)LEA15(A2),A4Seeifa"FullRow"existsIF.LA44(A3)THEN.S,ANDI.B#$FE,CCRandassertRowExistsifOKELSE.S3MOVE.L#FLYPAPER,A2otherwise,A2=#$FFFFFFFFandORI.B#$01,CCRNoRowExistsENDIMOVEM.L(A7)+,A3-A4ELSE.S.MOVE.L#FLYPAPER,A2else,A2=#$FFFFFFFFandORI.B#$01,CCRNoRowExistsENDIRTS /***********************************************/* END OF FILE 'FIX:48.SDLCPRI.SUBRTN.AI' */***********************************************PAGE7*******************************************************7* BEGINNING OF FILE 'FIX:48.SDLCPRI.TRANSMIT.AI' *7******************************************************* H*************************************************************************(*MODULE:"TRANSMT"TRANSMITSDLCFRAMES*-*ENTER:A5.L=PRIMARYCONTROLBLOCKADDRESS(*A4.L=SECONDARYCONTROLBLOCKADDRESS%*A3.L=BUFFERCONTROLBLOCKADDRESS9*ENTRYASSUMESA0-A6/D0-D7HAVEBEENPUSHEDONTHESTACK5*ANDENTR YWASTHROUGHEXCEPTION(TRAPORINTERRUPT)2*EXIT:"TRANSUF"ATRANSMITUNDERFLOWCAUSEDEXIT-*"TRANSEQ"ENDOFTRANSMITQUEUECAUSEDEXIT6*"TRANSPB"SDLCCOMMANDWITHPOLLBITSETCAUSEDEXIT!*REGISTERSUSED:01234567*DU*AUUUUPPS*|||_stack*||_____preserved*|_________used#*EXITSTOEXTERNALLYDEFINEDLABEL&*WITHA0-A6/D0-D7PUSHEDONTHESTACK&*ANDASSUMESFINALEXITWILLBE"RTE"*H************************************************************************E* NOTE: ALL INFORMATION FRAMES HAVE THEIR LENGTHS TRANSMITTED AS WELLA*ASTHEIRDATA.THELENGTHISSENTASTHEFIRSTTWOBYTESOFTHE* INFORMATION FIELD AS FOLLOWS;N*
H*THERECEIVINGSTATIONMUST,OFCOURSE,EXPECTTHIS.THELENGTHISSENTM* AS THE NEC7201 HAS THE NASTY TENDENCY TO SEND THE FRAME CHECK SEQUENCE WHENN*ATRANSMITTERUNDERRUNOCCURS.IFWEDOTHISBYACCIDENT,THENWEMUSTBEGINL* SENDING AN ABORT WITHIN THREE CHARACTER TIMES (TWO FCS CHARACTERS PLUS THEL*ENDINGFLAG)FORTHERECEIVINGSTATIONTOKNOWTHATWEGOOFED.IFFORSOMEH* REASON WE DON'T INITIATE THE ABORT IN TIME, WITHOUT THE DATA COUNT THEK* RECEIVING STATION WOULD HAVE NO WAY OF KNOWING THAT THE FRAME HE HAS JUSTM*RECEIVEDISNOGOOD.THERECEIVERHANDLESTHIS"BADLENGTH"FRAMEJUSTLIKE>* ANY OTHER ERRONEOUS FRAME - HE IGNORES THE FRAME COMPLETELY. :TRANSMTMOVE.B#SDPBTX,SDPBSY(A5)Setusbusytransmitting+98>6JE>ADD.W#1,SDSHCTXM(A4)3/2/83OR.W#$700,SRMaskInterrupts!THEN.S)LEATXMSTCTS(PC),A0No,Mustwaitforit7MOVE.LA0,SDPVCT2(A5)ExtStatustoTXMSTCTS(CTSWait)LEATXMSTOFF(PC),A0;MOVE.LA0,SDPVCT1(A5)andXmtrEmptytoTXMSTOFF(XmtrOff)MOVEM.LA0-A6,SDPRRTA0(A5)SDLRSRGINTSVRG'BRA.LINTEXITExittillCTScomestrue *#* External Status Interrupt Handler*0TXMSTCTSMOVE.BNECCTL_B,D0ExtStatusInterrupt,MOVE.B#NCW0REX,NECCTL_B+MOVE.B#NCW0EOI,NECCTL_AAcktheinterrupt*BTST.L#5,D0IsCleartoSendnowactive?IFTHEN.S!BRA.LINTEXITNo,waitsomemoreENDIINTRSRGSDLSVRG)MOVE.LSDLCPCB,A6Yes,Nowwecanbegin!0MOVEM.LSDPRRTA0(A6),A0-A6RestoreBGRegistersENDI * Fall-thru to the next pagePAGE7* NOTE: WE MAY FALL-THRU TO HERE FROM THE PREVIOUS PAGE MOVE.B#NCW0RG1,NECCTL_B@MOVE.B#NCW1TXI+NCW1EXI+NCW1STV,NECCTL_BEnableXmtrInterrupts )* Pre-frame transmission delay algorithm.+* Replaced on August 23, 1983 by Ed Skinner*D*Whereapre-frametransmissiondelayisrequired,wesenda"null"L*frameconsistingofthespecifiednumberofbytes.ThisframeisaddressedH* to station $00 (there ain't no such station), and is not sent with anyJ*FCS.Thesetwoconditions(station$00andnoFCS)shouldguaranteethat3* no station receives this as a valid transmission.E*Apre-frametransmissiondelayisneededforeitheroftworeasons.J* First, where Mancester encoding is used (such as in the Exormacs/HDS-400G* and GMAD Weld Monitor configurations), the Mancester chip will supplyM* Transmit Clock to the NEC7201 sometime after RTS is output (from the 7201).K* The single leading flag sent by the NEC7201 is not always received intactL*bythetargetstation.ThismaybeduetosomedifficultyintheMancesterJ*receiverand/or NEC7201.Regardless,itremainsthatthefirstcharacterM* transmitted by the NEC7201 (an SDLC Flag) is not always received correctly.C*Secondly,apre-frametransmissiondelaymaybeusedtoallowtheM* receiving software (in the target node) additional time in which to prepare* for receiving a frame.D*Toeffectthepre-frametransmissiondelay,aframecontaining$00I*bytesinallfieldsistransmitted.Asthestationaddress$00isnotaI* valid station address according to the SDLC protocol, no station should.* begin active reception of this "null" frame.F*Oncethespecifiednumberof"null"byteshavebeentransmitted,theI* transmitter is allowed to revert to the "flagging" condition (no FCS isG*sent).SinceanyreceiverofthisframewillthinkthelasttwobytesH* are the FCS, and as these bytes do not contain the computed FCS, it isI* unlikely (1 chance in 65535) that it will appear to be the correct FCS.I* Additionally, since the odds of a transmission error which would changeG* the address field to some "real" station address are much more remoteF* (although no information is available in this regard, the error rateF* should be similar to that of a satellite link (1 in 10**9) or betterJ* considering the "protected" environment and circuit length), the overallF* probability of some station receiving this leading transmission as aE*validframearecomfortablyremote.(Besidesthat,thereasonwe'reE* sending this little sucker is because the first frame usually isn'tJ*receivedastheleadingflagismissed.ThismakesitevenmoreunlikelyB* that this leading pad frame might be received as a valid frame.)D*Notethatwhenaframetransmissioncompletes,wedonotsendthisK* "leading pad" frame when more than one frame is sent in quick succession. 2TXMSTPADTST.WSDSTPD(A4)Anyleadingframedelay?IFTHEN.S1MOVE.WSDSTPD(A4),A1Yes,A1.W=CharacterCountLEATXMSTPNX(PC),A08MOVE.LA0,SDPVCT1(A5)XmtrIntr-->TXMSTPNX(NextPad)LEATXMSTEI(PC),A07MOVE.LA0,SDPVCT2(A5)ExtStaIntr-->TXMSTEI(Ignore)MOVEM.LA0-A6,SDPRRTA0(A5)SDLRSRGINTSVRG9MOVE.B#$00,NECDAT_BSendStationAddress=$00(Nobody)#BRA.LINTEXITExittillXmtrEmpty PAGE*%* Transmitter Empty Interrupt Handler*B* Enter here upon Transmitter Empty interrupts where the last byteE*outputisnowbeingtransmittedbytheNEC7201.BecausetheNEC7201J* gives us the Transmitter Empty interrupt up to one character time beforeF* the character is actually needed, there is a one character "latency"E*betweenwhatweoutput,andwhattheNEC7201issending.Therefore,H* we actually output one more than the specified number of leading pads,H* and terminate this operation when we get the interrupt indicating thatG* the last byte output (the "extra" byte) is now being transmitted, andI* therefore, that the specified number of leading pads have, in fact, now* all been transmitted. 5TXMSTPNXSUB.W#1,SDPRRTA1+2(A1)Sentonedelaybyte,IFTHEN.S7MOVE.B#$00,NECDAT_BSendanothertillcountexhausted*MOVE.B#NCW0EOI,NECCTL_AEndofInterrupt.BRA.LINTEXITAndexittillanotherXmtrIntrENDI1MOVE.B#NCW0EOI,NECCTL_AEndofInterrupt(Xmtr)INTRSRGSDLSVRGMOVE.LSDLCPCB,A60MOVEM.LSDPRRTA0(A6),A0-A6RestoreBGRegistersENDI%* And begin sending the "real" frame. %TXMSTNXTADD.W#1,SDSHCTXS(A4)3/2/83* Fall-thru to the next pagePAGE8* NOTE: WE WILL FALL-THRU TO HERE FROM THE PREVIOUS PAGE 7* "EMBELLISH" SDLC COMMAND WITH Nr/Ns COUNTS & POLL BIT MOVE.BSDDCMD(A3),D0AND.B#$03,D0IF.BD0#3THEN.S#MOVE.BSDDCMD(A3),D0SorIframe,AND.B#$1F,D0/OR.BSDSVRC(A4),D0ORinthecurrentVrcount. BTST.L#0,D0IFTHEN.SAND.B#$F1,D0Iframe,4OR.BSDSVSC(A4),D0ORinthecurrentVscountalso,(OR.B#$10,D0assertthepoll/finalbit,/ADD.B#2,SDSVSC(A4)(AdvanceVsfornexttime)  :AND.B#$0E,SDSVSC(A4)(makingsureit'sonly3bitswide)3ADD.B#1,SDSUKT(A4)bumpthenumberofframesout,MOVE.BSDSUKT(A4),D11TST.LSDDLNK(A3)anymoreframesafterthisone?(IFAND.BD1SDSMXF(A4)THEN.S9MOVE.LSDDLNK(A3),A0yes,andhaven'treachedmaxlimit,BTST.B#0,SDDCMD(A0)IFTHEN.S2AND.B#$EF,D0don'tpoll/finalifnextisIframeENDIENDIELSE.SMOVE.BD0,D1Ifwearesending*AND.B#$1F,D1aReceiverNotReadyframe,!IF.BD1#SDDRRNR+$10THEN.S/MOVE.B#SDPTRN,SDPTXF(A5)ThenassertRNRSentENDIENDI7MOVE.BD0,SDDCMD(A3)StorethecommandbytetobesentENDI* Fall-thru to the next pagePAGE8* NOTE: WE WILL FALL-THRU TO HERE FROM THE PREVIOUS PAGE 8LEATXMST0(PC),A0PrepareinterruptvectorsforsendingMOVE.LA0,SDPVCT1(A5)#$01THEN.SSDDSEC(A3)AND.BD0#$FFTHEN.S$ILLEGALDieifbadstationaddress!ENDI* Fall-thru to the next pagePAGE8* NOTE: WE WILL FALL-THRU TO HERE FROM THE PREVIOUS PAGE )MOVE.LA2,-(A7)ProtectA2whiletracingBSR.LGETRACEGetatracerowIFTHEN.SE**********************************************************************TraceEntryFormat*E***********************************************************************'*+0+4+8+9+10+11+12+13+14+15*E* +---------------+---------------+---+---+---+---+---+---+---+---+ *:*!PC!A(XmtBuffer)!#!S!U!C!RC!D0!D1!0!*E* +---------------+---------------+---+---+---+---+---+---+---+---+ ****PC=ProgramCounter,*<*A(XmtBuffer)=Addressofthebuffertobetransmitted,**#=Station'sNumber,* *S=Station'sCurrentState,*/*U=Station'sCurrentUnacknowledgedCount,**C=Buffer'sCommandByte,**RC=Buffer'sRetryCount,* *D0=Buffer's1stDataByte,* *D0=Buffer's2ndDataByte,**0=Unused.***E*********************************************************************,PEA*(PC)Ifwegetatracerow,thentrace#MOVE.L(A7)+,0(A2)ourPCaddress, MOVE.LA3,4(A2)A(Xmitbuffer),)MOVE.BSDSSEC(A4),8(A2)StationAddress,+MOVE.BSDSCST(A4),9(A2)Hiscurrentstate,7MOVE.BSDSUKT(A4),10(A2)Currentunacknowledgedcount,'MOVE.BSDDCMD(A3),11(A2)Commandbyte,&MOVE.BSDDRTC(A3),12(A2)RetryCount,%MOVE.BSDDDAT+0(A3),13(A2)andfirst4MOVE.BSDDDAT+1(A3),14(A2)........twodatabytes$CLR.B15(A2)(Zerotheunusedbyte)ENDI)MOVE.L(A7)+,A2RecoverA2aftertracing ?MOVE.B#NCW0RTG,NECCTL_BResetthetransmitter'sFCSgeneratorBMOVE.BSDDSEC(A3),NECDAT_BOutputthesecondarystation'saddress=MOVE.B#NCW0RTU,NECCTL_BEnableFCStransmissiononUnderrun SDLRSRGRecoverallregisters,,INTSVRGMakestacklooklikeinterruptregs4BRA.LINTEXITAndgoseeifaninterruptispendingPAGE *%* Transmitter Empty Interrupt Handler*,*VECTOREDSTATETOTxMITSDLCCOMMANDFIELD*ATXMST0MOVE.BNECCTL_B,D0Sincewe'vebeenignoringExtStaIntrs,2BTST.L#6,D0Wenowcheckforanearlierunderrun,BNE.LTXMSTE1Iftrue,gosendanAbortnow"MOVE.LSDPRRTA3(A1),A2Otherwise,2MOVE.BSDDCMD(A2),NECDAT_BSendthecommandfield  IFEQIFRMBCT-YES6BTST.B#0,SDDCMD(A2)WherewearesendinganIframe,BNE.STXMST012LEATXMSTL1(PC),A2WeSenda"Length"FieldfirstBRA.STXMST02ENDCATXMST01LEATXMST1(PC),A2SetUptheNextXmtrEmptyIntrHandlerTXMST02MOVE.LA2,SDPVCT1(A1)1LEATXMSTE(PC),A2Andfromnowon,wecareabout1MOVE.LA2,SDPVCT2(A1)ExternalStatusInterruptsMOVE.B#NCW0EOI,NECCTL_ABRA.LINTEXIT PAGE IFEQIFRMBCT-YES*%* Transmitter Empty Interrupt Handler**/*VECTOREDSTATETOTxMITSDLCLENGTHFIELD#1*7TXMSTL1MOVE.LSDPRRTA3(A1),A2OUTPUTSDLCLENGTHFIELDMOVE.BSDDBCT(A2),NECDAT_B*+LEATXMSTL2(PC),A2SETNEXTVECTOREDSTATEMOVE.LA2,SDPVCT1(A1)*MOVE.B#NCW0EOI,NECCTL_ABRA.LINTEXIT PAGE *%* Transmitter Empty Interrupt Handler**/*VECTOREDSTATETOTxMITSDLCLENGTHFIELD#2*7TXMSTL2MOVE.LSDPRRTA3(A1),A2OUTPUTSDLCLENGTHFIELD"MOVE.BSDDBCT+1(A2),NECDAT_B*10*LEATXMST1(PC),A2SETNEXTVECTOREDSTATEMOVE.LA2,SDPVCT1(A1)*MOVE.B#NCW0EOI,NECCTL_A*10BRA.LINTEXIT*ENDC PAGE *#* External Status Interrupt Handler**4*VECTOREDSTATETOPROCESSSTATUSCHANGEINTERRUPTS*!TXMSTEMOVE.BNECCTL_B,D0GETRR0BTST.L#6,D0UNDERRUN?(BNE.STXMSTE1YES,HURRYANDSENDABORTTXMSTE0BTST.L#5,D0CTSDROP?%BEQ.STXMSTE1YES,XMTRDYING,ABORT'BRA.STXMSTE2NO,IGNORETHEINTERRUPT 3TXMSTE1MOVE.B#NCW0SAB,NECCTL_BSENDANSDLCABORTMOVE.LSDPRRTA4(A1),A2ADD.W#1,SDSHCTUN(A2)4MOVE.LSDPRRTA3(A1),A2RESTOREBUFFERCONTROLBLOCK0MOVE.B#SDDETXU,SDDERR(A2)TxMITUNDERRUNERROR*MOVE.B#NCW0REX,NECCTL_BRESETINTERRUPTSMOVE.B#NCW0EOI,NECCTL_AINTRSRGSAVEALLUSER'SREGSSDLSVRGMOVE.LSDLCPCB,A5RESTOREREGSMOVEM.LSDPRRTA3(A5),A3-A5(BRA.LTRANSUFEXIT(TRANSMITUNDERFLOW) ETXMSTE2MOVE.B#NCW0REX,NECCTL_BIgnoretheExternalStatusInterruptMOVE.B#NCW0EOI,NECCTL_ABRA.LINTEXIT PAGE *%* Transmitter Empty Interrupt Handler**0*VECTOREDSTATETOTxMITSDLCINFORMATIONFIELD*>TXMST1SUB.W#1,SDPRRTA1+2(A1)DecrementnumberofbytestogoIFTHEN.S/MOVE.LSDPRRTA2(A1),A2If"more"bytesremain,5MOVE.B(A2)+,NECDAT_BOutputthenextdatabyte,and7MOVE.LA2,SDPRRTA2(A1)SavedatapointerfornexttimeELSE.S9LEATXMSTOFF(PC),A2Whendone,preparetosendFCSbytes/MOVE.LA2,SDPVCT1(A1)(XmtrIntrnotexpected)0LEATXMST2(PC),A2andExpectanExternalStatus&MOVE.LA2,SDPVCT2(A1)interruptnext,9MOVE.B#NCW0RTI,NECCTL_BAndmaketheXmtrEmptygoawayENDI6MOVE.B#NCW0EOI,NECCTL_AEitherway,EndofInterruptBRA.LINTEXIT PAGE *#* External Status Interrupt Handler* *VECTOREDSTATETOTRANSMITCRC*0TXMST2MOVE.BNECCTL_B,D0GettheChip'sStatus,(BTST.L#6,D0IsitsendingtheFCSnow?$BEQ.LTXMSTE0No,gocheckCTSfall5LEATXMSTEI(PC),A2Yes,ChipisnowsendingtheFCS.3MOVE.LA2,SDPVCT2(A1)IgnoreUnderrunsfromnowonMOVE.B#NCW0REX,NECCTL_BMOVE.B#NCW0EOI,NECCTL_AAnd2LEATXMST3(PC),A2SetupforXmtrEmptyInterrupt,MOVE.LA2,SDPVCT1(A1)TotakeustoTXMST3.4BRA.LINTEXIT(OccurswhenFCSsendingiscomplete) PAGE *%* Transmitter Empty Interrupt Handler*(*VECTOREDSTATEAFTERCRCHASBEENSENT* TXMST3INTRSRGSAVEALLREGSNOWSDLSVRGMOVE.LSDLCPCB,A6RESTOREREGSMOVEM.LSDPRRTA0(A6),A0-A6.BTST.B#4,SDDCMD(A3)POLLBITSETINCOMMAND?BNE.STXMST3AYes,SeebelowMOVE.B#NCW0EOI,NECCTL_ANo,6MOVE.LSDDLNK(A3),A3Istheresomethingelsetosend? MOVE.LA3,D04BNE.LTXMSTPADYup,gosendit(withleadingdelay)'ADD.W#1,SDSHCTNP(A4)No,donesending+BRA.LTRANSEQGofigureoutwhattodonow PAGE J* WHEN WE ARE READY TO SHUT DOWN THE TRANSMITTER, WE MUST DELAY FOR 11 BITJ* TIMES TO ALLOW THE ENDING FLAG TO LEAVE THE SHIFT REGISTER (8 BIT TIMES)L* AND TO PASS THRU OTHER HARDWARE (SUCH AS THE MANCESTER ENCODER WHICH NEEDSJ*3MOREBIT! TIMES).SINCEWECANNOTMEASUREINDIVIDUALBITTIMES,WEWAITL* A TOTAL OF 16 BIT TIMES BY SENDING TWO "PAD" CHARACTERS CONSISTING OF $00.M* THIS VALUE IS USED AS NO SECONDARIES HAVE THIS ADDRESS AND, THEREFORE, NONEK*OFTHEMWILLSTARTTORECEIVETHISINFORMATION.ADDITIONALLY,WETURNTHEM* TRANSMITTER OFF AFTER THE LAST ONE IS OUT WITHOUT SENDING ANY FCS SEQUENCE.K* TURNING THE TRANSMITTER OFF, IF SOMEONE IS RECEIVING AT THAT TIME, CAUSESI* THE LINE TO GO TO A MARKING STATE WHICH WILL CAUSE THEM TO DETECT FIRSTI*ARECEIVEABORT,ANDTHENAMARKING(IDLE)LINE.FROMTHESEINDICATIONSF* WE ARE ASSURED THAT NO STATION WILL RECEIVE THESE TRAILING PADS AS A+*VALIDFRAME.EDSKINNER,MARCH2,1983... /TXMST3AMOVE.B#$00,NECDAT_BOUTPUTANULLCHAR*LEATXMST4(PC),A0SETNEXTVECTOREDSTATEMOVE.LA0,SDPVCT1(A5)MOVE.B#NCW0EOI,NECCTL_A&SDLRSRGRestorefullsetofregisters$INTSVRGAndstacktheinterruptset4BRA.LINTEXITAndgoseeifanotherinterruptpends PAGE *%* Transmitter Empty Interrupt Handler***OUTPUT2NDNULLCHAR*-TXMST4MOVE.B#$00,NECDAT_BOUTPUTAPADNULL*LEATXMST5(PC),A2SETNEXTVECTOREDSTATEMOVE.LA2,SDPVCT1(A1)MOVE.B#NCW0EOI,NECCTL_ABRA.LINTEXIT PAGE *%* Transmitter Empty Interrupt Handler**E*TxMITSHUTDOWNWITHPOLLBITSETINCOMMAND(NOTNECESSARILY!E.S.)*=TXMST5MOVE.B#NCW0EOI,NECCTL_ALETSSAVEALLTHEUSER'SREGSTXMENDINTRSRGSDLSVRGMOVE.LSDLCPCB,A6RESTOREREGSMOVEM.LSDPRRTA0(A6),A0-A6ADD.W#1,SDSHCTEN(A4)3/2/83"BRA.LTRANSPBEXIT(POLLBITSET) PAGE *#* External Status Interrupt Handler**8*EXTERNALSTATUSINTERRUPTHANDLERWHICHISUSEDDURING*1)LEADINGPADTRANSMISSION,+*2)TRANSMISSIONOFTHEADDRESSFIELD,AND*3)TRAILINGPADTRANSMISSION.@*INALLTHREECASES,"UNDERRUN"INDICATIONSAREIGNOREDASWELL=*ASALLOTHERCONDITIONSEXCEPTFORAFALLOFCLEARTOSEND.*0TXMSTEIMOVE.BNECCTL_B,D0GETTHECHIP'SSTATUS/MOVE.B#NCW0REX,NECCTL_BRESETEXTERNALSTATUS.MOVE.B#NCW0EOI,NECCTL_AANDENDOFINTERRUPTMOVE.LSDPRRTA4(A1),A23/2/83ADD.W#1,SDSHCEXA(A2)3/2/83?BTST.L#5,D0CTSfall?Ifyes,thenmustassumeframesentOK,=BEQ.STXMENDWe"assume"pollbitsent,andgointorcvnow.I* CTS did not drop, so we ignore the External Status Interrupt completelyBRA.LINTEXIT PAGE *%* Transmitter Empty Interrupt Handler*F* This state is to be used when transmitter interrupts are supposed toE*beoff,orareotherwisenotexpected.Ifonehappenswhileinthis-* state, the system is intentionally crashed.* 2TXMSTOFFCRASH.T*+1FailwithanAddressingError 1*************************************************1* END OF FILE 'FIX:48.SDLCPRI.TRANSMIT.AI' *1*************************************************' SDLCSEC FRMCNT SI33PPWRUP SI!! PAGE5*****************************************************5* BEGINNING OF FILE 'FIX:48.SDLCSEC.FRMCNT.AI' *5***************************************************** I* NOTE: I THINK THIS PROCEDURE (TRANSEQ) IS ALWAYS THE WRONG THING TO DO!@*WEWILLRE-USETHEFIRSTBUFFERINTHERECEIVEQUEUE.ISTHEREE*ALWAYSONETHERE?ISITOKTORE-INITIALIZEITSBYTECOUNT,STATUS,3*ERROR,RETRYCOUNT,ANDSECONDARYSTATIONNUMBER?L* This situation (reaching the end of the transmit queue without sending the;*finalbitshouldoccuronlyasaresultofaFLUSHorder.* ED SKINNER, MARCH 3, 1983 &FAIL501TRANSEQISVERY,VERYWRONG! *TRANSEQEQU*TRANSMIT(ENDOFQUEUE)EXIT/MOVE.LSDPRCV(A5),A2TRANSMITAN"RR"RESPONSE CMPA.L#0,A2CRASH.EQ*+1DIEIFNOBUFFER! MOVE.B#SDDRRR+$10,SDDCMD(A2)*BRA.LVCTINIT6* &TRANSPBEQU*TRANSMIT(POLLBIT)EXIT@MOVE.LSDPRCV(A5),A3TxMITTEDAPOLLBIT,GETINTORECEIVEMODEBRA.LSDLCRC02* PAGE%TRANSUFEQU*TRANSMITUNDERFLOWEXITMOVE.B#NCW0RG1,NECCTL_B*#MOVE.B#NCW1IRD+NCW1STV,NECCTL_B*9MOVE.B#SDPBFC,SDPBSY(A5)SETSDLCBUSYINFRAMECONTROLADD.W#1,SDSHCTOF(A4)3/2/83'BTST.B#0,SDDCMD(A3)IFIELDTxMITTED?IFTHEN.S)SUB.B#2,SDSVSC(A4)YES,FIXUPVsCOUNTAND.B#$0E,SDSVSC(A4)6SUB.B#1,SDSUKT(A4)Andnumberofun-ack'dframesoutENDI/TST.LSDSTHD(A4)DIDANSDLCFLUSHJUSTOCCUR?IFTHEN.S/MOVE.LSDPRCV(A5),A2Yes,sendan"RR"commandMOVE.B#SDDRRR+$10,SDDCMD(A2)3MOVE.B#SDPTRQ,SDPTXF(A5)(sendingfromrcvqueue)BRA.LVCTINIT6ENDI1TST.BSDDRTC(A3)No,shallwetrysendingagain?B-->C,whereBisunsendable.:* Then we fix up the transmit queue so it looks like this;*A-------->C.K* The fix-up is accomplished by looking for a buffer that points to the oneO* we just got rid of, and then storing the "next" buffer's address (as returned3* to us by SOMESEND) into its forward link pointer.3MOVE.B#SDDSSTE,SDDSTS+1(A3)Markitasunsendable6MOVE.LA3,A1A1=A(Unsendablebuffer-forSOMESEND)>MOVE.LA3,A2A2=A(Unsendablebuffer-forWHILEclauseuse)6BSR.LSOMESENDPasstheUnsendablebuffertotheuser7MOVE.LA1,A3A3=A(Nextbufferinthetransmitqueue)?LEASDSTHD-SDDLNK(A4),A1Findbufferbeforetheunsendableone?WHILE.LSDDLNK(A1)A2DO" .SPointingtounsendablebuffer?/MOVE.LSDDLNK(A1),A1No,ontothenextbufferENDW@MOVE.LA3,SDDLNK(A1)yes,store"next"into"beforeunsendable"#0THEN.SCLR.LD0NoRCVerrors,MOVE.BSDSCST(A4),D0 SUB.B#1,D0 ASL.L#2,D08JMP.SRCVVCT(PC,D0.W)TocurrentstateifnoRCVerrors,RCVVCTBRA.LVCTINITToINITIALIZATIONSTATE+BRA.LVCTINIBToINITIALIZATIONBUSYSTATE$BRA.LVCTDISCToDISCONNECTEDSTATE&BRA.LVCTNRMToNORMALRESPONSESTATEBRA.LVCTBSYToBUSYSTATE$BRA.LVCTFRMRToFRAMEREJECTSTATEENDIMOVE.LA2,A1RcvErrors,5BSR.LSOMESENDTelltheApplicationProgramaboutit MOVE.LA1,A20BSR.LSOMEFREE*FREEANYOTHERRECEIVEBUFFERS+BRA.LSDLCRC01*GOBACKINTORECEIVEMODEPAGE *$*INITIALIZATIONSTATEFRAMECONTROL*2VCTINITMOVE.B#SDSCIBSY,SDSCST(A4)"SIM"COMMAND?CMP.B#SDDCSIM,SDDRSP(A2)BEQ.SVCTINIT3,MOVE.B#SDSCIM,SDSCST(A4)NO,POLLBITSET?BTST.B#$4,SDDRSP(A2)IFTHEN.S5MOVE.B#SDSCIM,SDSCST(A4)Yes,Senda"RIM"ResponseMOVE.B#SDDRRIM,SDDCMD(A2))VCTINIT6CLR.WSDDBCT(A2)INITBYTECOUNT%VCTINIT7CLR.WSDDSTS(A2)INITSTATUS"CLR.BSDDRTC(A2)INITRETRYCOUNT!CLR.BSDDERR(A2)INITSDLCERROR,MOVE.BSDSSEC(A4),SDDSEC(A2)INITSTATION#4MOVE.LA2,SDPRCV(A5)SAVENEWHEADOFRECEIVEQUEUE MOVE.LA2,A3$BRA.LTRANSMTTRANSMITTHERESPONSEENDIFREEQUEUEBSR.LSOMEDISPOSE MOVE.LA1,A26MOVE.LA1,D0Anymorereceivebuffersafterthatone?;BNE.LHSKP1Yes,loopbackupandseewhatthenextoneis;BRA.LSDLCRC01No,justgoturnthereceiverbackonagain :VCTINIT2MOVE.B#SDSCRDM,SDSCST(A4)SETDISCONNECTEDSTATEGVCTINIT3TST.WSDDBCT(A2)DATAFIELDON"SIM""SNRM"OR"DISC"COMMAND?=BNE.LFRMRPIYes,heshouldn'thavedonethat!(GoFRMRhim)THEN.S2BSR.LSOMEFREENOBUFFERS,Sodon'tsendanything@BRA.LSDLCRC01(Makelikewedidn'treceivehiscommandatall)ENDI6CLR.BSDSVRC(A4)Nodatafield,it'savalidcommand,-CLR.BSDSVSC(A4)resetourVrandVscounts,1MOVE.LA2,A1andtelltheuserwhathashappenedBSR.LSOMESEND'MOVE.LA3,A2thensenda"UA"responseMOVE.B#SDDRUA,SDDCMD(A2)*@MOVE.B#SDPTRN,SDPTXF(A5)*SETTxMITFLAGASIF"RNR"TxMITTEDJ* NOTE: THIS WILL CAUSE RECEIVED I-FRAMES TO BE IGNORED UNTIL AN "RNR" CAN?* BE TRANSMITTED BECAUSE WE ARE IN THE BUSY OR INIT BUSY STATE.M* WE HAVE PASSED A RECEIVED SNRM ON TO THE "USER" IN OUR MACHINE, AND HE MUST(* ACKNOWLEDGE IT BEFORE WE CAN CONTINUE.BRA.SVCTINIT6* PAGE *)*INITIALIZATIONBUSYSTATEFRAMECONTROL*+VCTINIBBTST.B#$4,SDDRSP(A2)POLLBITSET?2BEQ.SVCTINIT1*NO,FREEBUFFER,GOINTO" RECEIVEFMOVE.B#SDDRRNR+$10,SDDCMD(A2)YES,BUILD&TRANSMITA"RNR"RESPONSEBRA.SVCTINIT6* PAGE **BUSYSTATEFRAMECONTROL**VCTBSYBTST.B#$4,SDDRSP(A2)POLLBITSET?2BEQ.LVCTINIT1*NO,FREEBUFFER,GOINTORECEIVEFMOVE.B#SDDRRNR+$10,SDDCMD(A2)YES,BUILD&TRANSMITA"RNR"RESPONSEBRA.LVCTINIT6* PAGE *"*FRAMEREJECTSTATEFRAMECONTROL*+VCTFRMRBTST.B#$4,SDDRSP(A2)POLLBITSET?2BEQ.LVCTINIT1*NO,FREEBUFFER,GOINTORECEIVECMOVE.B#SDSCIBSY,SDSCST(A4)YES,"SIM","DISC",OR"SNRM"COMMAND?CMP.B#SDDCSIM,SDDRSP(A2)*BEQ.LVCTINIT3*CMP.B#SDDCDISC,SDDRSP(A2)*BEQ.LVCTINIT2*MOVE.B#SDSCBSY,SDSCST(A4)*CMP.B#SDDCSNRM,SDDRSP(A2)*BEQ.LVCTINIT3*4BRA.SFRMRSPNO,BUILD&TRANSMITA"FRMR"RESPONSE PAGE E* FRAME REJECTS WILL BE TRANSMITTED BY A SECONDARY STATION FOR ANY OF* THE FOLLOWING REASONS;K* 1) INVALID COMMAND - IN DISC OR NRM STATE, RECEIVE AN XID, AND HAVE NEVER*TRANSMITTEDANXID,OR2*INNRMANDRECEIVEAN"UNKNOWN"SDLCCOMMAND,OR2*INFRAMEREJECTSTATEANDRECEIVEANYOTHERTHAN*ASIM,DISC,ORSNRMCOMMAND.J* 2) PROHIBITED I-FIELD - RECEIVED AN I-FIELD ON A COMMAND WHICH IS A SIM,*SNRM,DISC,RR,RNR,ORREJ.G* 3) BUFFER OVERRUN - RECEIVE AN OTHERWISE "GOOD" FRAME WHICH IS LONGER*THANABUFFER.H* 4) INVALID Nr COUNT - RECEIVED AN Nr VALUE (IN EITHER A SUPERVISORY OR2*ANINFORMATIONFRAME)WHICHACKNOWLEDGESAFRAME*WEHAVENOTTRANSMITTED. **CREATE"FRaMeReject"DATA*4FRMRICMOVE.B#$01,SDPFRB+2(A5)INVALIDCOMMANDFRMR)CMP.B#SDSCRDM,SDSCST(A4)INDISCSTATE?,BEQ.LVCTDISC1*IFYES,SEND"DM"RESPONSEBRA.SFRMRGNNO,SEND"FRMR" 7FRMRPIMOVE.B#$03,SDPFRB+2(A5)PROHIBITEDIFIELDFRMRBRA.SFRMRGN* 3FRMRBOMOVE.B#$04,SDPFRB+2(A5)BUFFEROVERRUNFRMRBRA.SFRMRGN* 5FRMRNRMOVE.B#$08,SDPFRB+2(A5)INVALIDNRCOUNTFRMR*BFRMRGNMOVE.BSDDRSP(A2),SDPFRB(A5)OFFENDINGCOMMAND->FRMRDATA=MOVE.BSDSVSC(A4),D0CURRENT"NR"&"NS"COUNTS->FRMRDATAOR.BSDSVRC(A4),D0*AND.B#$EE,D0*MOVE.BD0,SDPFRB+1(A5)(BSR.LSOMEFREEFREEALLRECEIVEBUFFERS"BSR.LSBGTFRIRFETCHANEWBUFFER6BGT.LSDLCRC01OUTIFTHEREAREABSOLUTELYNOBUFFERS2* GOT ONE, DON'T CARE IF IT'S THE LAST ONE OR NOT.MOVE.LA3,A2*DFRMRSPMOVE.B#SDSCRFR,SDSCST(A4)BUILD&TRANSMITA"FRMR"RESPONSEMOVE.B#SDDRFRMR,SDDCMD(A2)*'MOVE.W#3,SDDBCT(A2)*INITBYTECOUNT)MOVE.LSDPFRB(A5),SDDDAT(A2)*INITDATABRA.LVCTINIT7* PAGE * *DISCONNECTSTATEFRAMECONTROL*+VCTDISCBTST.B#$4,SDDRSP(A2)POLLBITSET?2BEQ.LVCTINIT1*NO,FREEBUFFER,GOINTORECEIVECMOVE.B#SDSCIBSY,SDSCST(A4)YES,"SIM","DISC",OR"SNRM"COMMAND?CMP.B#SDDCSIM,SDDRSP(A2)*BEQ.LVCTINIT3*CMP.B#SDDCDISC,SDDRSP(A2)*BEQ.LVCTINIT2*MOVE.B#SDSCBSY,SDSCST(A4)*CMP.B#SDDCSNRM,SDDRSP(A2)*BEQ.LVCTINIT3*.MOVE.B#SDSCRDM,SDSCST(A4)NO,"XID"COMMAND?CMP.B#SDDCXID,SDDRSP(A2)*BEQ.SXIDRSP*/CMP.B#SDDCTEST,SDDRSP(A2)NO,"TEST"COMMAND?BEQ.STESTRSP*GVCTDISC1MOVE.B#SDDRDM,SDDCMD(A2)NO,BUILD&TRANSMITA"DM"RESPONSEBRA.LVCTINIT6* PAGE **TRANSMITA"TEST"RESPONSE*%TESTRSPMOVE.B#SDDCTEST,SDDCMD(A2)*BRA.LVCTINIT7* PAGE J***************************************************************************<*SUBROUTINE:"SBXIDQ"CHECKFORAN"XID"ONTHETxMITQUEUE*2*ENTER:A4.L=ADDRESSOFSECONDARYCONTROLBLOCK)*A5.L=ADDRESSOFPRIMARYCONTROLBLOCK*!*REGISTERSUSED:01234567*DU*AUUUPPS *|_stack*K*************************************************************************** 9SBXIDQMOVE.LSDSTHD(A4),A3"XID"REPONSEONTxMITQUEUE?6IF.LA3#0AND.BSDDCMD(A3)#SDDCXIDTHEN.S8MOVE.LSDDLNK(A3),SDSTHD(A4)TAKE"XID"OFFTxMITQUEUEIF.LSDPXID(A5)#0THEN.S5MOVE.LSDPXID(A5),A1DISPOSEOFTHEOLD"XID"BUFFERBSR.LSOMED# ISPOSEENDI/MOVE.LA3,SDPXID(A5)NEW"XID"RESPONSEBUFFERENDIRTS PAGE *&*TRANSMITAN"XID"OR"FRMR"RESPONSE*2XIDRSPBSR.SSBXIDQCHECKFOR"XID"ONTxMITQUEUE,MOVE.LSDPXID(A5),D0"XID"RESPONSEBUFFER?&BEQ.LFRMRIC*IFNO,INVALIDCOMMAND,BSR.LSBGTFRIRFETCHARCVBUFFERFORLATERIFTHEN.S1BSR.LSOMEFREENOBUFFERS,JUSTSTAYINRCVMODEBRA.LSDLCRC01ENDIMOVE.LA3,SDPRCV(A5)*0MOVE.LA2,A1SENDTHE"XID"COMMANDTOTHEUSERBSR.LSOMESEND*,MOVE.LSDPXID(A5),A3PREPARE"XID"RESPONSECLR.WSDDSTS(A3)*STATUS!CLR.BSDDRTC(A3)*RETRYCOUNTERCLR.BSDDERR(A3)*ERROR)MOVE.BSDSSEC(A4),SDDSEC(A3)*STATION#%MOVE.B#SDDCXID,SDDCMD(A3)*COMMAND1BRA.LTRANSMTTRANSMITTHE"XID"&GOTORECEIVE PAGE *%*NORMALRESPONSESTATEFRAMECONTROL*/VCTNRMMOVE.LSDSTHD(A4),A3HEADOFTxMITQUEUE*VCTNRM02CLR.LD0ISCOMMANDAN"I"FIELD?MOVE.BSDDRSP(A2),D0 BTST.L#0,D0#BEQ.LDSPNR1YES,OUTIF"I"FRAME0BTST.L#1,D0NO,"RR","RNR",OR"REJ"COMMAND?0BEQ.SDSPNRYES,OUTIFRR,RNR,ORREJCOMMANDBTST.L#4,D0NO,POLLBITSET?BEQ.SVCTNRM06CMOVE.B#SDSCIBSY,SDSCST(A4)YES,"SIM","DISC",OR"SNRM"COMMAND?CMP.B#SDDCSIM,D0BEQ.LVCTINIT3CMP.B#SDDCDISC,D0IF.BD0#SDDCDISCTHEN.SCMP.L#0,A3ALLXMITFRAMESGONE(RESULTOFAFLUSH)?3/21/831BEQ.SDSPNR2YES,SAMEASIFNOI_FRAMES3/21/833BTST.B#0,SDDCMD(A3)NO,"I"FRAMEONTxMITQUEUE?BNE.SDSPNR2**1MOVE.BSDDCMD(A3),D1*YES,GETNsCOUNTFROMITLSR.B#1,D1**ADD.BD2,D1**AND.B#7,D1**DSPNR2WHILE.BD0D1DO.SSUB.B#1,D1NEXTVsCOUNT AND.B#7,D1#SUB.B#1,D2ALLVsCOUNTSCHECKED?#BMI.LFRMRNRYES,INVALIDNrCOUNTENDW* Fall-thru to the next pagePAGE3* NOTE: WE FALL-THRU TO HERE FROM THE PREVIOUS PAGE *"*DISPOSEOFTXMITBUFFERSTONR-1*%CLR.LD1FETCHNrCOUNTFROMCOMMANDMOVE.BSDDRSP(A2),D1*LSR.B#4,D1*AND.B#$0E,D1*MOVE.BD1,SDSVSC(A4)*Vs=Nr MOVE.LA3,D0TxMITQUEUEEMPTY?BEQ.LDSPRC1YES,OUT>DSPNR4CMP.B#SDPTXQ,SDPTXF(A5)NO,TxMITTEDFROMTxMITQUEUE?BNE.LDSPRC1*&CLR.LD0YES,TXMITTEDAUIRESPONSE?MOVE.BSDDCMD(A3),D0*AND.B#$EF,D0*IF.BD0#SDDCUITHEN.SBTST.L#0,D0IFIELD? BNE.LDCRTX8TST.BSDSUKT(A4)YES,UNACKNOWLEDGEDIFRAMESTxMITTED? BEQ.LDSPRC1AND.B#$0E,D0YES,Nr=Ns?IF.BD1D0THEN.S4MOVE.BSDDRSP(A2),D0YES,isresponseRR,RNR,REJ?AND.B#$03,D0*CMP.B#1,D0*BNE.SDSPUI*-BTST.B#4,SDDRSP(A2)andpoll/finalbitset?BNE.SDSPUI*+MOVE.LA2,A1NO,DISPOSEOFRECEIVEBUFFERBSR.LSOMEDISPOSE*%MOVE.LA1,A2ENDOFRECEIVEBUFFERS?MOVE.LA1,D0*BEQ.SDSPUI**BRA.LVCTNRM02NO,TESTBUFFER'SRESPONSEENDIE# NDI)MOVE.LA3,A1NO,DISPOSEOFTxMITBUFFER!BTST.B#4,SDDCMD(A3)POLL/FINAL?IFTHEN.SBSR.LSOMEDISPOSENO MOVE.LA1,A3SUB.B#1,SDSUKT(A4) BRA.SDSPNR4ELSE.S7BSR.LSOMEDISPOSEYES,ALSODISPOSEOFRECEIVEBUFFERS MOVE.LA1,A34CLR.BSDSUKT(A4)CLEARUNACKNOWLEDGEDIFRAMECOUNT BRA.LDSPRC1ENDI PAGE *,*AUI(UNNUMBEREDIFIELD)COMMANDOCCURRED*=RSPUIMOVE.LA2,A1SENDRECEIVEBUFFERTOAPPLICATIONPROGRAMBSR.LSOMESEND%MOVE.LA1,A2ENDOFRECEIVEBUFFERS? MOVE.LA1,D0 BEQ.SDSPUI*BRA.LVCTNRM02NO,TESTBUFFER'SRESPONSE PAGE **DISPOSEOFUITXMITBUFFERS*9DSPUICMP.B#SDPTXQ,SDPTXF(A5)TxMITTEDFROMTxMITQUEUE?BNE.LDSPRC1*&MOVE.LA3,D0YES,ENDOFTxMITQUEUE?BEQ.LDSPRC1*%CLR.LD1NO,TXMITTEDAUIRESPONSE?MOVE.BSDDCMD(A3),D1*AND.B#$EF,D1*CMP.B#SDDCUI,D1*BNE.SDCRTX**MOVE.LA3,A1YES,DISPOSEOFTXMITBUFFERBTST.B#4,SDDCMD(A3)*IFTHEN.S>BSR.LSOMEDISPOSEPOLL/FINALSET,ALSODISPOSEOFRCVBUFFERS MOVE.LA1,A3 BRA.SDSPRC1ENDI#BSR.LSOMEDISPOSEPOLL/FINALCLEAR MOVE.LA1,A3 BRA.SDSPUI PAGE **DECREMENTTxMITRETRYCOUNTS*DCRTXMOVE.LA3,A1*MOVE.BSDSUKT(A4),D1+DCRTX2MOVE.LA3,D0ALLTxMITBUFFERSGONE?BEQ.SDCRTX5*"BTST.B#0,SDDCMD(A3)NO,IFIELD?IFTHEN.S*TST.BD1YES,UNACKNOWLEDGEDCOUNTCLEAR?BEQ.SDCRTX5YES,OUT SUB.B#1,D1ENDI7TST.BSDDRTC(A3)NO,DECREMENTRETRYCOUNTIFNON-ZERO BEQ.SDCRTX4*SUB.B#1,SDDRTC(A3)DECREMENTRETRYCOUNTBNE.SDCRTX4EXPIRED??MOVE.LA3,A1YES,SENDTHISTxMITBUFFERTOAPPLPGMASUNSENT>MOVE.B#SDDSSTE,SDDSTS+1(A3)SETRETRYCOUNTEREXPIREDSTATUS$BTST.B#$4,SDDCMD(A3)POLLBITSET?IFTHEN.S&BSR.LSOMESENDYES,LASTTXMITBUFFER4CLR.BSDSUKT(A4)CLEARUNACKNOWLEDGEDIFRAMECOUNT BRA.SDCRTX5ENDI"BTST.B#0,SDDCMD(A3)NO,IFIELD?IFTHEN.S#SUB.B#1,SDSUKT(A4)YES,FIXCOUNTENDIBSR.LSOMESEND%MOVE.LA1,A3FETCHNEXTTxMITBUFFER BRA.SDCRTX2 .DCRTX4CLR.BSDDERR(A3)CLEARSDLCERRORFIELD$BTST.B#$4,SDDCMD(A3)POLLBITSET?IFTHEN.S1MOVE.LSDDLNK(A3),A3No,FETCHNEXTTxMITBUFFER BRA.SDCRTX2ENDI!* Fall-Thru if poll/final bit set PAGE +DCRTX5MOVE.LA1,A3NEWHEADOFTxMITQUEUE**DISPOSEOFRCVBUFFERS*3DSPRC1MOVE.LA3,SDSTHD(A4)NEWHEADOFTxMITQUEUE.MOVE.LA2,D0ALLRECEIVEBUFFERSDISPOSEDOF? BEQ.SSELTX4CMP.B#SDDERBO,SDDERR(A2)NO,BUFFEROVERRUNERROR? BEQ.LFRMRBO0TST.BSDDERR(A2)NO,SOMEOTHERSDLCRCVERROR? BNE.SSELTX2/MOVE.BSDDRSP(A2),D0ISCOMMANDUIORIFIELD?AND.B#$EF,D0IF.BD0#SDDCUITHEN.S BTST.L#0,D0 BNE.SSELTX2OUTIFNOTI-FRAMEENDI;MOVE.LA2,A1UIORI-FRAME,SENDITTOAPPLICATIONPROGRAMBTST.B#4,SDDRSP(A2)IFTHEN.S!BSR.LSOMESENDFINALBITNOTSET MOVE.LA1,A2 BRA.SDSPRC1ELSE.S5BSR.LSOMESEND*YES,ALSOFREEALLRCVBUFFERSLEFT$MOVE.LA1,A2FALL-THRUTONEXTPAGEENDI PAGE :* WARNING: WE MAY FALL-THRU TO HERE FROM THE PREVIOUS PAGE*%*FETCHABUFFER&TRANSMITSOMETHING*)SELTXBSR.LSOMEFREEFREEANYOLDBUFFERS"BSR.LSBGTFRIRFETCHANEWBUFFER3BGT.LSDLCRC01OUTIFABSOLUTELYNOBUFFERSATALLIFTHEN.S* GOT THE VERY LAST BUFFER/MOVE.LA3,SDPRCV(A5)NEWHEADOFRECEIVEQUEUE MOVE.LA3,A21MOVE.B#SDDRRNR+$10,SDDCMD(A2)TRANSMITAN"RNR"3MOVE.B#SDPTRQ,SDPTXF(A5)TxMITTINGFROMRCVQUEUEBRA.LVCTINIT6ENDI3MOVE.LA3,SDPRCV(A5)NO,NEWHEADOFRECEIVEQUEUE-MOVE.LA3,A2USENEWBUFFERTOTRANSMITFROMMOVE.B#$10,SDDRSP(A2)**SELECTARESPONSETOTRANSMIT*+SELTX2BTST.B#$4,SDDRSP(A2)FINALBITSET?IFTHEN.S(MOVE.LA2,A1NO,DISPOSEOFTHISBUFFERBSR.LSOMEDISPOSE MOVE.LA1,A2 BRA.LDSPRC1ENDI5MOVE.LA2,SDPRCV(A5)ONLY1BUFFERLEFTINRCVQUEUEMOVE.BSDDRSP(A2),D0?A$ ND.B#$1F,D0WerewesentanRNRcommand?orhavenotraffic?9IF.BD0#SDDRRNR+$10OR.LSDSTHD(A4)#0THEN.S9MOVE.B#SDDRRR+$10,SDDCMD(A2)Yes,sendan"RR"response3MOVE.B#SDPTRQ,SDPTXF(A5)(sendingfromrcvqueue)BRA.LVCTINIT6ENDIMOVE.LSDSTHD(A4),A3MOVE.B#SDPTXQ,SDPTXF(A5)#BTST.B#0,SDDCMD(A0)YES,IFIELD?IFTHEN.S:CLR.BSDSUKT(A4)YES,CLEARUNACKNOWLEDGEDTRANSMITCOUNTENDIBRA.LTRANSMT PAGEG* When a "flush" occurs, after all transmit frames have been discarded,H* and when, at the moment of the flush, we are transmitting one of theseH* frames, an abort is transmitted and the transmitter turned off (by theE*flushprocedure).Immediatelyafterdoingthat,webranchtoSDLCRQ* to decide what to do next.I* In a secondary station, we simply exit because we will wait to see whatK* the primary wants us to do next (presumably he will poll us fairly soon). SDLCRQSDLRSRGRTE /***********************************************/* END OF FILE 'FIX:48.SDLCSEC.FRMCNT.AI' */***********************************************4****************************************************4* BEGINNING OF FILE 'FIX:48.SDLCSEC.PWRUP.AI' *4**************************************************** M*NOTE:ATSTARTUP,OURCURRENTSTATEIS"DISCONNECTMODE".THESTARTER-UPPERE*(WHO?)STORES#SDSCRDMINTOSDSCSTTHEREBYASSERTINGTHISSTATE.WEE*AREINTHISSTATEWHENTHEPWRUPSUBROUTINEISCALLED,WHICHISTHE&*FIRSTCALLTOTHESDLCDRIVERLOGIC. SDLRSRGMACRO2MOVEM.L(A7)+,A0-A6/D0-D2RESTORESAVEDREGISTERSENDM SDLSVRGMACROMOVEM.LA0-A6/D0-D2,-(A7)ENDMPAGE H**************************************************************************D*SUBROUTINE:"PWRUP"INITIALIZETHENEC7201CHIPATPOWERUPTIME*#*REGISTERSUSED:01234567* *DUUU**AUUUPS***H************************************************************************ NEXTWB,PWRUPMOVE.B#NCW0RCN,NECCTL_BCHANNELRESETMOVE.B#NCW0RG2,NECCTL_A)MOVE.B#NCW2RTS+NCW2PRI+NCW2BIN,NECCTL_A*MOVE.B#NCW0RG2$ ,NECCTL_BINTERRUPTVECTORMOVE.B#0,NECCTL_BMOVE.B#NCW0RG4,NECCTL_BMODE)MOVE.B#NCW4C01+NCW4SDL+NCW4SME,NECCTL_B#MOVE.B#NCW0RG7,NECCTL_BSDLCFLAGMOVE.B#SDLCFLAG,NECCTL_B3MOVE.B#NCW0RG3,NECCTL_BENABLEAUTOENABLEOFCTS!MOVE.B#NCW3BT8+NCW3AUE,NECCTL_BIFEQRES7201-400MOVE.WSR,-(A7)!ORI.W#$0700,SRMaskInterrupts!5MOVE.L#MVME400,A0A0=AddressoftheMVME400board'BCLR.B#REGSELEC,CTLPIA_A(A0)SetDDRAAMOVE.B#WRT_LED+WRT_SEL,DATPIA_A(A0)tooutputmid-twobitsonly:BSET.B#REGSELEC,CTLPIA_A(A0)SwitchnowtoDataRegonA=BSET.B#WRT_SEL,DATPIA_A(A0)SelectbaudratejumpersPort2(MOVE.BDATPIA_A(A0),D0andreadthemin6ANDI.W#$07,D0AND'ingoffallbutthebaudratebitsBMOVE.BV400BAUD(PC,D0.W),D0andgetthe4-bitcorrespondingvalue3MOVE.BD0,-(A7)savingitonthestacktemporarily,BCLR.B#REGSELEC,CTLPIA_B(A0)Now,setDDRB2MOVE.B#%11111111,DATPIA_B(A0)toallbitsoutput:BSET.B#REGSELEC,CTLPIA_B(A0)SwitchnowtoDataRegonB5LKI;MOVE.BDATPIA_B(A0),D0andreadthecurrent4-bitsettings.ANDI.B#RATE1MSK,D0dropoutPort2'ssetting;OR.B(A7)+,D0andORinthenewvaluewefiguredoutaboveBMOVE.BD0,DATPIA_B(A0)andoutputthenewrate(Port1unchanged)#MOVE.W(A7)+,SRUnmaskInterrupts!ENDC,LEASDLCPR(PC),A0Addressof"SDLCPR"->A0MOVE.L#TIMCNST,A1MOVE.W#$4005,D19MOVE.L#DLC1,D2RequestaPeriodic,RecurringActivationIFEQCHIPTYPE-68000 TR0.RQPAENDCIFNECHIPTYPE-68000 TR0$.RQPAENDC3BRA.SHOPOVER(MUSTBE2BYTEINSTRUCTION)2/24/831ILLEGALDIEIFSBRQPARETURNSANYERROR!2/24/83 5HOPOVERBRA.LSBSDLCRCSTGoturnonthereceivernow! IFEQRES7201-400"V400BAUDDC.B15,14,13,12,10,7,5,2ENDC *3*ThisisadummyroutinetosatisfyXREFinBUFMGT*XDEFSDLCQXMT )SDLCQXMTILLEGALDie,shouldnotbeused! PAGE SECTION9H**************************************************************************0*TRAP:"SDLCQU"TRAPSERVICEROUTINEFORSDLC*0*ABUFFERHASBEENENQUEUEDFORTRANSMISSION.*,*INTHESECONDARYSTATION,WEDON'TCARE.**SUBROUTINE:"SDLCQUSB"*****#*REGISTERSUSED:01234567**D**AS* *|__stack***H************************************************************************ 'SDLCQUBSR.SSDLCQUSBDOTHESUBROUTINE=MOVE.WSR,0(A7)REPLACESRONSTACKTOGIVEPROPERCCRETURNRTEANDRETURN 2SDLCQUSBRTSJustReturn,Wedon'tcareaboutthis PAGE H**************************************************************************4*TRAP:"SDLCTTMOUT"TRAPSERVICEROUTINEFORSDLC*,*THISROUTINEISENTEREDWHENTHERECEIVE**TIMEOUTEXPIRES**SUBROUTINE:"SDLCTMOUT"*****#*REGISTERSUSED:01234567**D**AS* *|__stack***H************************************************************************ SDLCTMOUTRTS2RTE%SDLCTTMOUTSDLSVRGSAVEALLUSERREGSMOVE.LSDLCPCB,A6RESTOREREGSMOVEM.LSDPRRTA0(A6),A0-A6ADD.W#1,SDSHCRTO(A4)3/2/83BRA.LRECEITORECEIVETIMEOUT PAGE H**************************************************************************8*TRAP:"SDLCPR"TRAPSERVICEROUTINEWHICHISENTERED*%*WHENTHEPERIODICTIMERRUNSDOWN**SUBROUTINE:"SDLCPRSB"*****#*REGISTERSUSED:01234567**D**AS*H************************************************************************ SDLCPRSB RTS2RTE!SDLCPRSDLSVRGSAVEALLREGISTERS2MOVE.LSDLCPCB,A5AREWEBUSYWAITINGFORBUFERS?$IF.BSDPBSY(A5)#SDPBWBTHEN.SSDLRSRGNO,RETURNRTEENDI8BRA.SSDLCRC01YES,GOGETONEANDTURNONTHERECEIVERPAGE H**************************************************************************0*TR% AP:"SDLCKL"TRAPSERVICEROUTINEFORSDLC*&*THISROUTINEEFFECTIVELYKILLSTHE*.*SDLCLINKANDCANCELSPERIODICACTIVATIONS**SUBROUTINE:"SBSDLCKL"***#*REGISTERSUSED:01234567* *DUU**AS* *|__stack***H************************************************************************ 9SDLCKLBSR.SSBSDLCKLTRAPENTRYPOINT,DOTHESUBROUTINE9MOVE.WSR,0(A7)REPLACESRONSTACKSOWEGIVEPROPERCCRTEANDRETURN /SBSDLCKLMOVE.WSR,-(A7)SUBROUTINEENTRYPOINT!ORI.W#$0700,SRMASKTOLEVEL7!1MOVE.B#NCW0RCN,NECCTL_BCHANNELRESET7201CHIP'BSR.LSOMETOCLRTURNOFFRECEIVETIMERMOVE.W#$8005,D1;MOVE.L#DLC1,D2DiscontinueRecurringPeriodicActivationsIFEQCHIPTYPE-68000 TR0.RQPAENDCIFNECHIPTYPE-68000 TR0$.RQPAENDCBRA.SSDLCKLEX)ILLEGALDIEIFSBRQPARETURNSANYERROR! 6SDLCKLEXMOVE.W(A7)+,SRRESTOREPRIORINTERRUPTLEVELRTSANDRETURN PAGE H**************************************************************************<*SUBROUTINE:"SBUSRACK"USERACKNOWLEDGESRECEIPTOFSDLC*!*"SIM""DISC"OR"SNRM"FRAMES**TRAP:"USRACK"***&*ENTER:D0.B="SDDCSIM"=>ACKSIM**="SDDCDISC"=>ACKDISC**="SDDCSNRM"=>ACKSNRM*****#*REGISTERSUSED:01234567**DP* *AUS**|||_stack**||____________preserved**|_______________used*****H************************************************************************ 9USRACKBSR.SSBUSRACKTRAPENTRYPOINT,DOTHESUBROUTINE5MOVE.WSR,0(A7)REPLACESRONSTACKGIVINGPROPERCCRTEANDRETURN @SBUSRACKMOVE.LSDLCPCB,A0FETCHSECONDARYCONTROLBLOCKADDRESSMOVE.LSDPFSEC(A0),A0IF.BD0#SDDCSIMTHEN.S2MOVE.B#SDSCRDM,SDSCST(A0)IFSIM,SETDISCSTATEELSE.SIF.BD0#SDDCDISCTHEN.S3MOVE.B#SDSCRDM,SDSCST(A0)IFDISC,SETDISCSTATEELSE.SIF.BD0#SDDCSNRMTHEN.S2MOVE.B#SDSCNRM,SDSCST(A0)IFSNRM,SETNRMSTATEELSE.S%ILLEGALOTHERWISE,ILLEGALACK,DIE!ENDIENDIENDIRTS PAGE H**************************************************************************2*TRAP:"SDLCRCST"TRAPSERVICEROUTINEFORSDLC*)*THISROUTINEFETCHESARECEIVEBUFFER**ANDSTARTSUPTHERECEIVER**SUBROUTINE:"SBSDLCRCST"*****#*REGISTERSUSED:01234567**D**AS* *|__stack***H************************************************************************ SBSDLCRCST RTS2RTE#SDLCRCSTSDLSVRGSAVEALLUSERREGS>SDLCRC01MOVE.LSDLCPCB,A5PRIMARYCONTROLBLOCKADDRESS->A5A4)CLR.LSDPRCV(A5)CLEARHEADOFRCVQUEUE MOVE.WSR,D0AND.W#$0700,D0%CMP.W#$0500,D0ATLEASTLEVELFIVE?IF.W#$0500D0THEN.SMOVE.WSR,D0NO,AND.W#$F8FF,D0.OR.W#$0500,D0RAISETOINTERRUPTLEVELFIVE!-MOVE.WD0,SR(OLDSRANDLEVELAREONSTACK)ENDI-MOVE.B#SDPBNB,SDPBSY(A5)SETSSDLCNOTBUSY$BSR.LSBGTFRIRGETARECEIVEBUFFERIFTHEN.S8MOVE.B#SDPBWB,SDPBSY(A5)NONEAVAILABLE,SLEEPAWHILESDLRSRGRTEENDIBSDLCRC02MOVE.LA3,SDPRCV(A5)LINKRCVBUFFERTOHEADOFRCVQUEUE-MOVE.WSDPRLG(A5),SDDBCT(A3)INITBYTECOUNTCLR.WSDDSTS(A3)INITSTATUS!CLR.BSDDERR(A3)INITSDLCERROR,MOVE.BSDSSEC(A4),SDDSEC(A3)STATIONNUMBER#BRA.LRECEIVEGOINTORECEIVEMODE .**********************************************.* END OF FILE 'FIX:48.SDLCSEC.PWRUP.AI' *.**********************************************% ' DLOAD SADLOAD LFDLOAD PFDLOAD PC+ TRANSFERSA TRANSFERAF33TRANSFERLF<<ULOAD SAAAULOAD LF^^ULOAD PFggULOAD PCll' TRANSFERRODLOAD RO ULOAD RO %PROGRAM DOWNLOAD(INPUT,OUTPUT,INFIL); J(************************************************************************)D(*THISPROGRAMREADSRECORDSFROMASOURCEFILE,PACKSTHEMINTO*)D(*BLOCKSANDWRITESTHEMTOTHETERMINAL.THEPROGRAMRUNSONAN*)(*EXORMACSSYSTEM.*)J(************************************************************************) 6CONSTCMAX=132;(*MAXNO.OFCHARSINONEBLOCK*)-RMAX=132;(*MAXIMUMSINGLERECORDSIZE*)5BLKCNT=1;(*NUMBEROFBLOCKSUNDERONECHECKSUM*)3BMAX=268;(*BUFFERSIZE=BLKCNT*CMAX+RMAX+2*)/OPTION='AA';(*COM/CHARPROTOCOLOPTIONS*),CHRMAX=127;(*MAXIMUMCHARACTERVALUE*) TYPEBKINDEX=1..CMAX;BFINDEX=INTEGER;*BFTYPE=PACKEDARRAY(.1..BMAX.)OFCHAR;(RSPTYPE=PACKEDARRAY(.1..2.)OFCHAR;+RECTYPE=PACKEDARRAY(.1..RMAX.)OFCHAR; VARQ:BOOLEAN; INFIL:TEXT;(*SOURCEFILE*)>ASCII:ARRAY(.CHAR.)OFINTEGER;(*ASCIICHARACTERCODES*)!%/$?ASHEX:PACKEDARRAY(.1..36.)OFCHAR;(*FORHEXCONVERSION*)&REC:RECTYPE;(*HOLDSRAWRECORD*)/RECSIZ:INTEGER;(*HOLDSLENGTHOFRAWREC*)-BUFF:BFTYPE;(*BUFFHOLDSPACKEDBLOCK*))BUFFP:BFINDEX;(*INDEXINTOBUFFER*)*RESPONSE:RSPTYPE;(*ACKNAKRESPONSE*) PROCEDUREINITIALIZE;0TYPECHRARRAY=PACKEDARRAY(.1..16.)OFCHAR;VARI:INTEGER; 2PROCEDUREASGCODE(CODE:INTEGER;CHRSET:CHRARRAY);VARI:INTEGER;BEGIN(*ASGCODE*)FORI:=1TO16DO%& ASCII(.CHRSET(.I.).):=CODE+I-1END;(*ASGCODE*) BEGIN(*INITIALIZE*)FORI:=0TOCHRMAXDO0ASCII(.CHR(I).):=32;(*FORCEASCIIBLANKS*) RESET(INFIL);1ASHEX:='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';!ASGCODE(112,'pqrstuvwxyz{|}~');!ASGCODE(32,'!"#$%&''()*+,-./'); ASGCODE(48,'0123456789:;<=>?'); ASGCODE(64,'@ABCDEFGHIJKLMNO'); ASGCODE(80,'PQRSTUVWXYZ[\]^_'); ASGCODE(96,'`abcdefghijklmno'); -BUFFP:=4;(*STARTPACKINGRECORDSHERE*)REPEAT/WRITE(OUTPUT,'PREAMBLED');(*SENDPREAMBLE*)(WRITE(OUTPUT,OPTION);(*SENDOPTION*),WRITE(OUTPUT,CMAX:3);(*SENDBLOCKSIZE*)1WRITELN(OUTPUT,BLKCNT:1);(*SENDBLOCKCOUNT*)READLN(INPUT,RESPONSE);6UNTIL(RESPONSE(.1.)='N')OR(RESPONSE(.1.)='T');IFRESPONSE(.1.)='T'(THENQ:=TRUE;(*EARLYTERMINATION*)END;(*INITIALIZE*) IPROCEDURECOMPRESS(VARREC:RECTYPE;VARRECSIZ:INTEGER;VARBUFF:BFTYPE;"VARP:BFINDEX;VARCCNT:INTEGER); VARI,J:INTEGER;RECPTR:INTEGER; PROCEDURECOUT(C:CHAR);BEGIN(*COUT*)BUFF(.P.):=C; P:=P+1;CCNT:=CCNT+1END;(*COUT*) BEGIN(*COMPRESS*) RECPTR:=1;WHILERECPTR<=RECSIZDOBEGIN I:=RECPTR;FWHILE(I<=RECSIZ)AND(REC(.RECPTR.)=REC(.I.))AND(I-RECPTR<35)DO I:=I+1;5I:=I-RECPTR;(*NUMBEROFMATCHINGCHARACTERS*)/IF(I<=3)AND(I>0)AND(REC(.RECPTR.)<>'|')THENBEGINFORJ:=1TOIDOCOUT(REC(.RECPTR.));RECPTR:=RECPTR+IENDELSE IFI>0THENBEGIN COUT('|');COUT(REC(.RECPTR.));COUT(ASHEX(.I+1.));RECPTR:=RECPTR+I END(*THEN*)END(*WHILE*)END;(*COMPRESS*) 2PROCEDUREGETREC(VARP:BFINDEX;VARBUFF:BFTYPE);?VARCPOS:BFINDEX;(*POSITIONINBUFFFORCHARACTERCOUNT*)5CCNT:INTEGER;(*NUMBEROFCHARACTERSINRECORD*) Q:BOOLEAN; BEGIN(*GETREC*)#IFEOLN(INFIL)THENREADLN(INFIL);IFNOTEOF(INFIL)THENBEGIN CPOS:=P; CCNT:=0;,P:=P+2;(*LEAVEROOMFORRECORDCOUNT*) RECSIZ:=0;WHILENOTEOLN(INFIL)DOBEGINREAD(INFIL,REC(.RECSIZ+1.));RECSIZ:=RECSIZ+1;END;(*WHILE*)IFRESPONSE(.2.)='B'THENBEGIN Q:=FALSE;"WHILE(NOTQ)AND(RECSIZ>0)DOIFREC(.RECSIZ.)=''THENRECSIZ:=RECSIZ-1ELSE Q:=TRUEEND;"COMPRESS(REC,RECSIZ,BUFF,P,CCNT);FBUFF(.CPOS.):=ASHEX(.CCNTDIV16+1.);(*CONSTRUCTHEXCHARCOUNT*)*BUFF(.CPOS+1.):=ASHEX(.CCNTMOD16+1.); END(*THEN*)END;(*GETREC*) @PROCEDUREPUTREC(VARQ:BOOLEAN;VARP:BFINDEX;VARBUFF:BFTYPE;VARRESPONSE:RSPTYPE); VARI:BFINDEX; PROCEDUREOUTBLOCK(RTYPE:CHAR);VARI:INTEGER; J:INTEGER;C:INTEGER;(*CHECKSUM*) BEGIN(*OUTBLOCK*)*BUFF(.3.):=RTYPE;(*MARKBLOCKTYPE*)C:=0;4FORI:=3TOCMAX*BLKCNTDO(*COMPUTECHECKSUM*)C:=C+ASCII(.BUFF(.I.).);2C:=CMOD255+1;(*0CHECKSUMISWILDCARD*)BBUFF(.1.):=ASHEX(.CDIV16+1.);(*PLACECHECKSUMINTOBLOCK*)"BUFF(.2.):=ASHEX(.CMOD16+1.);REPEATFORJ:=0TOBLKCNT-1DOBEGINBLKCNT*CMAX+1DO/OUTBLOCK('A');(*OUTPUTINTERMEDIATEBLOCK*)IFEOF(INFIL)THENBEGINFORI:=PTOBLKCNT*CMAXDO5BUFF(.I.):='';(*FORCEBLANKSTOENDOFBLOCK*)'OUTBLOCK('Z');(*OUTPUTLASTBLOCK*) Q:=TRUE;ENDELSEFIFP>BLKCNT*CMAXTHENOUTBLOCK('A')(*OUTPUTINTERMEDIATEBLOCK*)END;(*PUTREC*) BEGIN(*MAIN*) Q:=FALSE; INI& TIALIZE;WHILENOTQDOBEGINGETREC(BUFFP,BUFF);PUTREC(Q,BUFFP,BUFF,RESPONSE);ENDEND.(*MAIN*)=/*=/*FILE:DLOAD.LF=/*F=/*LinkfileforDLOADwhichisanassociatedsupportprogramforthe=/*TRANSFERutility.=/*=/*=/*0=/*PARAMETER01\1=Listingoutputfile/device=/*=/*DEFAULTPARAMETERSARE=/*!=/*DEFAULTPARAMETER01DLOAD.LL=/*=/*=/IFC \1 =ARG DLOAD.LL=/ENDIF=/*=/*DEFAULTPARAMETER01=/*=LINK ,DLOAD.LO,\1;HAMIX INPUT DLOADLIB 0.&.PASVMDOS.ROLIB 0.&.PASCALIB.ROEND=END=/*=/*FILE:DLOAD.PF=/*C=/*CompilationchainfileforDLOADwhichisanassociatedsupport%=/*programfortheTRANSFERutility.=/*@=/*NOTE:thischainfilerequiresthepascalcompilerresideon9=/*thesystemdefault.Thecompilerisnotprovidedwith7=/*thisproduct,thereforethischainfilewillabort.=/*#=/*DefaultoutputfileisDLOAD.LS=/*=/IFC \1 =ARG DLOAD.PL=/ENDIF=/*-=/*PARAMETER1\1=Listingoutputfile/device=/*#=/*Defaultvalueswillbeusedfor =/*Volume=/*Usernumber =/*Catalog=/*Unlessspecified=/*=PASCAL DLOAD,,\1=PASCAL2 DLOAD;-L=END'  2.30 ???????? & (5'7?6AC@' E 5Motorola Pascal 2.30 DLOAD .SA 03/21/83 10:23:54E E E E E E E E E DOWNLOADXQXIE E E E E E E E E E E E E E E E E E E E E E E E !E "E #E $E %E &E ' ASGCODE B)BE (E )?= A5= AFFF4F?(,FF?lE *E +E , INITIALIB)B E -?= AFB 4 F? (,FFE .E /? pQAE 0 $B $0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZE 1QBpB pqrstuvwxyz{|}~ E 2QB B  !"#$%&'()*+,-./E 3QB0B 0123456789:;<=>?E 4QB@B @ABCDEFGHIJKLMNOE 5QBPB PQRSTUVWXYZ[\]^_E 6QB`B `abcdefghijklmnoE 7E 8*BE 9E :k?  QAB  PREAMBLEDBE ;QAB AABE <QABBE =QABBE >mgQAA(BE ? $F(BN( $F(BT? E @E A( $F(BTBE B? lE CE DE EE FE GE HE IE JE KE L COUT = F5FFE MF35FE NE OF35FlE PE QE R COMPRESSBE S?(CF5F E TE UFE V?(CF5F ($5= FF5= FF(DrFFB#E W3FE X?rFFE YE Z(CFB(,FB(S5= FFB|E [E \B)FE ]?Q5= FF4F?(,FFE ^E _?FFE `E aE b?(,FBE cE dQB|E eQ5= FFE fQ5= A3FE gE hFFE iE j???lE kE lE mE nE oE pE qE r GETREC (#QAmQAE sE t?"QAE uE v5FE wBE xF35FE y:BE z? !#QAE {E |`QA= A=3( F:E }:3F:E ~ E E ?!("$F)BBE E BE ?#$F($,F:BE E (%$5= A=F:B E E :F:&E E ?%B?&#E ?$?"QA>A:FFAE = FF5= A3FBE = F3F5= A3LFBE E ?lE E E E E E E E E E E E E 'OUTBLOCK3FFE BE B)B*E ?)F5= A5= FF4+F?*(),FFE ?+3LFBE F5= A3FBE 3F5= A3LFBE E k?,B)B.E E ?-3OFB)O3FB1E ?0QA5= FFB42F?1(0,FFE ?2QAE 4/F?.(-,FFE E ?/mgQAFB3$5FBN(,$5FBT?3E F $5FBTE BE ?4(5DF5FE E = FF5= FFE E 3F4E ?5F5FE lE E E 6PUTREC ?8(9,5FBE QBA8E E ?9(:"QAE E 5F)B<E ?;= FFB 4=F?<(;,FFE ?=QBZE F BE E >E ?:(?,5FBE QBA???>lE E E @DOWNLOAD0QABBB0QABBBqQA0QABBBpQABE QE ?BCFE E QA*A.E QAA*A.A(E E B?C QA QA QA)B<E ?;= FFB 4=F?<(;,FFE ?=QBZE F BE E >E ?:(?,5FBE QBA???>lE E E @DOWNLOAD0QABB( B0QABBBqQA0QABBBpQABE QE  TTLASCIIfiletransferutility-TRANSFERIDNT4,0ASCIIfiletransferutility<*************************************************************TRANSFERPROGRAM-***3*THISPROGRAMHANDLESASCIIFILETRANSFERONTHE**EXORMACS(NONHOST)SYSTEM***<************************************************************ SECTION0XREFPARSE,EDITFILE,OPTIONAEQU*BASEOFSEGMENTDEFPORTEQU'CN20'DEFAULTPORT8BLKLGHEQU200SIZEOFHOSTBUFFER(NOTNEC.BLOCKSIZE)#RMAXEQU130MAXIMUMSIZEOFRECORD** DIRECTIVE EQUATESABORTEQU14ABORTSELFTERMEQU15TERMINATESELFDELAYEQU21DELAYRELINQEQU22RELINQUISH)RQSTPAEQU29REQUESTPERIODICACTIVATIONGTASQEQU31ALLOCATEANASQRDEVNTEQU34READEVENTWTEVNTEQU36WAITONEVENT**!BUSYEQU$E2IOSBUSYSTATUSCODE"CNTL.AEQU$01CONTROL-ACHARACTERDS.L40 STACKEQU*2SAVSTACKDS.L1SAVEFORSTACKPOINTERRESTORATION)INITREGSEQU*SAVEFORINITIALREGISTERS DS.L1D0DS.L1D1=SESSIONNUMBERVOLNAMDS.L1D2=VOLUMENAMEUSERNUMDS.L1D3=USERNUMBERCATNAMDS.L1D4=CATALOGUENAME DS.L1D5 DS.L1D6 DS.L1D7** VERSION MESSAGE/VMSGSDC.B'ASCIIFILETRANSFER-VERSION2.02' VMSGEEQU*-1DS0** COMMAND LINE RECEIVING AREACLINECOMLINE$A0** RETURN REGISTERS FROM PARSE1PARSAREGDS.L1A1-ADDRESSOFOUTPUTFIELDOR0*DS.L1A2-ADDRESSOFOPTIONSFIELDOR0** PREAMBLE VARIABLES#COMOPTDS.B1COMMUNICATIONSOPTION)CHROPTDS.B1CHARACTERCONVERSIONOPTION,CHRBLKDC.L0NUMBEROFCHARACTERSPERBLOCK+BLKSUMDC.L0NUMBEROFBLOCKSPERCHECKSUM*+BLKREDDC.L0RUNNINGNUMBEROFBLOCKSREAD%WBUFDS.L1ADDRESSOFWORKINGBUFFER,WLGHDC.L0LENGTHOFDATAINWORKINGBUFFER,CHRNUMDC.L0NUMBEROFCHARACTERSPERFRAME%BLKCMAXDS.L1LIMITADDRESSOFFRAME0DPSAVDS.L14SAVERGISTERSFORDOWNLOADPROCESS,RESPONSEDC.B''RESPONSE(ACK/NAK)TOHOST DC.B$0DDS0DLTEMPDS.L1TEMPORARY*BBOUNDSDS.L2BUFFERBOUNDARIESONUPLOAD GKR"T*I2O:?B9J>RUZCbCjKrCz:<Q8C>ACHAAEFBB73UREC1DS.L1ADDRESSOF1STRECINFRAMEFORUPLOAD)BCHRDS.W1SAVEFORCOMPRESSEDCHARACTER** OPTIONS EQUATES AND FLAG WORD"BEQU01=TRUNCATETRAILINGBLANKSCEQU11=USECHECKSUMS*DEQU21=DISPLAYDATAASITISTRANSFEREDHEQU31=HALFDUPLEXMODE* OPTFLGDC.B(1<*CHECKSUMMATCHISFORCED.THEDEFAULTVALUE(INTHISCASE3)=*ISUSEDUNLESSTHETRANSFERPROGRAMISSTARTEDWITHANOTHER8*VALUESPECIFIEDONTHE'C'OPTION.IE'C=10'WOULDSET*REP1ANDREP2TO10.*'REP1DC.L3COUNTDOWNFORBADCHECKSUMS#REP2DC.L3RESETFORBADCHECKSUMS*)* FHS PARAMETER BLOCK TO ASSIGN HOST PORT FHS1EQU*DC.W$40ASSIGN(OPEN)DC.W4PUBLICREAD/WRITEDC.B0STATUS DC.B1PORTLOGICALUNITNUMBERDC.LDEFPORTVOLUMEDC.B''USERNUMBERDC.B''CATALOGUENAMEDC.B''FILENAMEDC.B''EXTENSIONDC.W0RESERVED DC.B0WCODE DC.B0RCODEDC.W0RECORDLENGTHDC.L0SIZE/POINTER*0* PARAMETER BLOCK TO ASSIGN UPLOAD/DOWNLOAD FILE FHS4EQU*DC.W0FUNCTIONDC.W4PUBLICREAD/WRITEDC.B0STATUS DC.B4PORTLOGICALUNITNUMBERDC.L0VOLUMEDC.B''USERNUMBERDC.B''CATALOGUENAMEDC.B''FILENAMEDC.B''EXTENSIONDC.W0RESERVED DC.B0WCODE DC.B0RCOD) EDC.W0RECORDLENGTHDC.L0SIZE/POINTER*G* FHS PARAMETER BLOCK TO CHANGE ACCESS PERMISSION ON LU 5 TO READ/WRITE FHS5EQU*$DC.W$0020CHANGEACCESSPERMISSIONDC.W4PUBLICREADWRITEDC.B0STATUSDC.B5LOGICALUNITNUMBERDC.L''VOLUMEDC.B''USERNUMBERDC.B''CATALOGUENAMEDC.B''FILENAMEDC.B''EXTENSIONDC.W0RESERVED DC.B0WCODE DC.B0RCODEDC.W0RECORDLENGTHDC.L0SIZE/POINTER*=* IOS PARAMETER BLOCK TO READ/WRITE WITH PROCEED TO HOST PORTIOS1DC.W0FUNCTION(DYNAMIC)DC.W0OPTIONS(DYNAMIC)DC.B0STATUS DC.B1LUNDC.W0RESERVEDDC.L0RANDOMRECORDNUMBERDC.L0BUFFERSTARTDC.L0BUUFFERENDDC.L0LENGTHOFTRANSFERDC.L0COMPLETIONADDRESS*1* PARAMETER BLOCK TO HALT I/O ON LU 1 (HOST PORT)$IOS1HDC.W$0110FUNCTION(HALTI/O)DC.W0OPTIONSDC.B$FFSTATUS DC.B1LUNDC.W0RESERVEDDC.L0RANDOMRECORDNUMBERDC.L0BUFFERSTARTDC.L0BUUFFERENDDC.L0LENGTHOFTRANSFERDC.L0COMPLETIONADDRESS*DC.W0HALTSYNCCOUNTER*&* IOS PARAMETER BLOCK TO WRITE TO FILEIOS4DC.W0FUNCTION(DYNAMIC)DC.W0OPTIONS(DYNAMIC)DC.B0STATUS DC.B4LUNDC.W0RESERVEDDC.L0RANDOMRECORDNUMBERDC.L0BUFFERSTARTDC.L0BUUFFERENDDC.L0LENGTHOFTRANSFERDC.L0COMPLETIONADDRESS*<* IOS PARAMETER BLOCK TO READ/WRITE WITH PROCEED TO TERMINALIOS5DC.W0FUNCTION(DYNAMIC)DC.W0OPTIONS(DYNAMIC)DC.B0STATUS DC.B5LUNDC.W0RESERVEDDC.L0RANDOMRECORDNUMBERDC.L0BUFFERSTARTDC.L0BUUFFERENDDC.L0LENGTHOFTRANSFERDC.L0COMPLETIONADDRESS*F* IOS PARAMETER BLOCK TO PERFORM READ/WRITE WITH WAIT TO TERMINAL PORTIOS5WDC.W0FUNCTION(DYNAMIC)DC.W0OPTIONS(DYNAMIC)DC.B0STATUS DC.B5LUNDC.W0RESERVEDDC.L0RANDOMRECORDNUMBERDC.L0BUFFERSTARTDC.L0BUUFFERENDDC.L0LENGTHOFTRANSFERDC.L0COMPLETIONADDRESS*5* PARAMETER BLOCK TO HALT I/O ON LU 5 (HOME TERMINAL)$IOS5HDC.W$0110FUNCTION(HALTI/O)DC.W0OPTIONSDC.B$FFSTATUS DC.B5LUNDC.W0RESERVEDDC.L0RANDOMRECORDNUMBERDC.L0BUFFERSTARTDC.L0BUUFFERENDDC.L0LENGTHOFTRANSFERDC.L0COMPLETIONADDRESS*DC.W0HALTSYNCCOUNTER*:* IOS PARAMETER BLOCK TO DISPLAY ERROR/TRANSPARENT MESSAGEIOS6DC.W0FUNCTION(DYNAMIC)DC.W0OPTIONS(DYNAMIC)DC.B0STATUS DC.B6LUNDC.W0RESERVEDDC.L0RANDOMRECORDNUMBERDC.L0BUFFERSTARTDC.L0BUUFFERENDDC.L0LENGTHOFTRANSFERDC.L0COMPLETIONADDRESS*0* PARAMETER BLOCK TO GIVE EVENT AFTER TIME DELAYTIM1DC.L'TRAN'TASKNAME#DC.L0SESSION(N/AFORUSERTASK)(DC.W1<<13EVENTTODEFAULTASRADDRESSDC.L01DC.L2*1000TIMEINTERVAL(DYNAMICALLYMODIFIED)TSVCDC.L0SERVICEADDRESS*!* PARAMETER BLOCK TO ALLOCATE ASQASQ1DC.L'TRAN'TASKNAME(DC.L0SESSIONCODE(N/AFORUSERTASK)$DC.B8DISABLEREGSTACKING,ASR,ASQ#DC.B20LONGESTMESSAGEACCEPTABLE DC.L$100QUEUELENGTHIFBYTES,DC.L0ALTERNATESERVICEADDRESS(NOTUSED)$DC.L0ASRRECEIVINGAREA(DYNAMIC)** ASR RECEIVING AREAASQBUFFDS.B20** FLAGSTRANFLGDC.W0TBSYEQU0TERMINALBUFFERBUSYTPNDEQU1TERMINALI/OPENDING)TINEQU2TERMINALINPUTINPROGRESSFLAG%LBLKEQU3LASTBLOCKFLAGFORUPLOADTFLGEQU4'T'KEYEDINFLAGCTLAEQU5CONTROL-AMODE** WORKING BUFFER5TERMLGHDC.L0LENGTHOFSTRINGINTERMOUTPUTBUFFER(TPTRDC.L0POINTERINTOTERMINALBUFFER TBUFEQU*DS.BBLKLGH*10** RECORD BUFFER FOR DOWNLOAD$RLGHDS.L1LENGTHOFRECORDINRBUFRPTRDS.L1POINTERINTORBUFRBUFDS.BRMAX*F* RECORD BUFFER FOR UPLOAD STAGING TO DISPLAY RECORDS ON HOME TERMINAL'USTAGELDC.L0LENGTHOFDATAINBUFFERUSTAGEDS.BRMAXBUFFER** INPUT BUFFERS$BUFF1SDS.BBLKLGHHOSTINPUTBUFFERBUFF1EEQU*-1*%BUFF5SDS.B$80TERMINALINPUTBUFFERBUFF5EEQU*-1* * MESSAG) ES CLERRSDC.B'COMMANDLINEERROR'CLERREEQU*-1DS0*!OPTERRSDC.B'OPTIONFIELDERROR'OPTERREEQU*-1DS0*"FHSERRSDC.B'XXFHSERROR,LUN='FHSERLUNDC.B'X'FHSERREEQU*-1DS0*"IOSERRSDC.B'XXIOSERROR,LUN='IOSERLUNDC.B'X'IOSERREEQU*-1DS0*PAGE%************************************** DRIVING ROUTINE* XFREQU*#LEASTACK(PC),A7SETSTACKPOINTERBSR.SINITINITIALIZE'XFR2BSRTRANSPINVOKETRANSPARENTMODE#BSRUPDNGOHANDLEUPLOAD/DOWNLOADBRAXFR2GOHANDLENEXTFILE*!XFRTERMMOVE.L#TERM,D0TERMINATETRAP#1PAGE%*************************************** INITIALIZATION* INITEQU*-LEAA(PC),A6USEA6ASBASEADDRESSREGISTER1MOVEM.LD0-D7,INITREGS-A(A6)SAVEINITIALD-REGS%MOVE.LA0,TIM1-A(A6)PLUGINTASKID%MOVE.LA0,ASQ1-A(A6)PLUGINTASKID*:* CHANGE ACCESS PERMISSION FOR UNIT 5 TO PUBLIC READ/WRITELEAFHS5-A(A6),A0TRAP#3 BEQ.SINIT05 BSRFHSERR BSRXABORT** PARSE THE COMMAND LINEINIT05LEACLINE-A(A6),A0 BSRPARSE TST.LD0.BPL.SINIT20BRANCHIFCOMMANDLINEOKSOFAR9INIT10LEACLERRS-A(A6),A1COMPLAINOFCOMMANDLINEERRORLEACLERRE-A(A6),A2INIT15BSRMSGOUTBRA.SXFRTERMGOTERMINATE*F* FILL DEVICE MNEMONIC INTO ASSIGN P.B. (IF INPUT FIELD WAS SPECIFIED) INIT20EQU*9MOVEM.LA1-A2,PARSAREG-A(A6)SAVERETURNREGSFROMPARSESWAPD0'CMP.B#$40,D0WASTHEREANINPUTFIELD0BEQ.SINIT25BRANCHIFNO-MNEMONICALREADYIN+LEACLINE-A(A6),A0ADDRESSOFCOMMANDLINELEAFHS1-A(A6),A6'BSREDITFILEPLACEMNEMONICINTOFIELD0BPL.SINIT25BRANCHIFNOERRORINCOMMANDLINE#LEAA(PC),A6RESTOREBASEREGISTER+BRAINIT10GOCOMPLAINOFBADCOMMANDLINE** ASSIGN THE HOST PORT-INIT25LEAA(PC),A6REESTABLISHBASEREGISTER6MOVE.WUSERNUM+2-A(A6),FHS1+$C-A(A6)PLUGUSERNUMBER1MOVE.LCATNAM-A(A6),FHS1+$C-A(A6)CATALOGUENAME&MOVE.LCATNAM+4-A(A6),FHS1+$C+4-A(A6)LEAFHS1-A(A6),A0TRAP#3ASSIGNDEVICE#BEQ.SINIT28BRANCHONGOODASSIGN BSRFHSERR BRAINIT15*%* ALLOCATE ASYNCHRONOUS SERVICE QUEUEINIT28LEAASQ1-A(A6),A0LEAASQBUFF-A(A6),A1%MOVE.LA1,18(A0)PLUGINASQADDRESSMOVE.L#GTASQ,D0TRAP#1$BSRXFRABORTABORTIFCAN'TGETASQ* * CLAIM BREAK SERVICE FOR DEVICE&LEAIOS5-A(A6),A0ADDRESSOFIOSP.B.+MOVE.L#$01200200,(A0)CLAIMBREAKSERVICELEABREAKSV-A(A6),A1MOVE.LA1,24(A0)TRAP#2 BSRXFRABORT*#* SET FLAG BITS FOR OPTIONS PRESENT*LEGALOPTIONSARE:9*BTRUNCATETRAILINGBLANKSFROMALLTRANSFERREDRECORDS*CUSECHECKSUMS"*DECHODATAASITISTRANSFERRED*HHALFDUPLEXMODE** DEFAULTS ARE B,-D,C,H*4MOVE.LPARSAREG+4-A(A6),A2ADDRESSOFOPTIONSFIELDLEAOPTIONS-A(A6),A5INIT42MOVE.LA2,D0,BEQ.SINIT50BRANCHIFNOOPTIONSSPECIFIED BSROPTION1CMP.B#$40,D0HAVEWEFINISHEDSCANNINGOPTIONS?BEQ.SINIT50BRANCHIFYES MOVE.L#7,D0INIT44CMP.B#'',0(A5,D0) BNE.SINIT480LEAOPTERRS-A(A6),A1COMPLAINOFILLEGALOPTIONLEAOPTERRE-A(A6),A2 BSRMSGOUT BRAXFRTERMINIT48CMP.B0(A5,D0),D1DBEQD0,INIT44 SUB.L#7,D0-NEG.LD0D0CONTAINSNUMBEROFFLAGPOSITION%BSETD0,OPTFLG-A(A6)SETOPTIONFLAG)CMP.B#'C',D1WASTHISACHECKSUMOPTIONBNE.SINIT49BRANCHIFNOCMP.LREP1-A(A6),D3 BLS.SINIT49;MOVE.LD3,REP1-A(A6)MAKEREPETITIONFACTORMATCHTHAT...2MOVE.LD3,REP2-A(A6)...SPECIFIEDON'C='OPTIONINIT49TST.LD1 BPLINIT425BCLRD0,OPTFLG-A(A6)OPTIONSPECIFIEDWITHMINUS'-' BRAINIT42** PUT OUT VERSION MESSAGE INIT50EQU*BSRLF6LEAVMSGS-A(A6),A1LEAVMSGE-A(A6),A2 BSRMSGOUTBSRLF6*RTSPAGE%************************************** ESTABLISH TRANSPARENT MODE* PREAMDC.L8DC.B'PREAMBLE'KEYINTORTSDS0*KTRANMS DC.B '** TRANSPARENT MODE - TYPE CONTROL-A TO TERMINATE PROGRAM'TRANMEEQU*-1DS0* TRANSPEQU**6* SET UP SERVICE ADDRESSES I* N VARIOUS PARAMETER BLOCKSLEAHOSTIO-A(A6),A0MOVE.LA0,IOS1+24-A(A6)LEATERMIO-A(A6),A0MOVE.LA0,IOS5+24-A(A6)LEATIMEV-A(A6),A0MOVE.LA0,TSVC-A(A6)*LEATRANMS-A(A6),A1LEATRANME-A(A6),A2)BSRMSGOUTTELLTHEMOFTRANSPARENTMODE*>* PERFORM INPUT I/O AND PROCEED ON TERMINAL PORT AND HOST PORT1BTST#H,OPTFLG-A(A6)AREWEINHALFDUPLEXMODE?BNE.STRANS04BRANCHIFYES-BSRINPP5CINPUTONECHARACTERFROMTERMINALBRA.STRANS05.TRANS04BSRINPP5INPUTONELINEFROMTERMINALTRANS05BSRINPP1HOSTPORT** ENABLE ASQ AND WAIT FOR EVENTTRANSRTNEQU*4MOVE.LA7,SAVSTACK-A(A6)SAVECURRENTSTACKPOINTER!MOVE.L#WTEVNT,D0ENABLEASQ,ASRTRAP#1*J* IN CASE OF TIMEOUT EVENT, PERFORM INPUT I/O AND PROCEED ON TERMINAL PORT)*ANDGOBACKANDWAITFORANOTHEREVENT.* TIMEVEQU*/MOVE.LSAVSTACK-A(A6),A7RESTORESTACKPOINTER BSRASQREAD%LEATIM1-A(A6),A0ADDROFTIMERP.B.&CLR.W8(A0)CLEARPERIODICACTIVATIONMOVE.L#RQSTPA,D0TRAP#12BTST#TBSY,TRANFLG-A(A6)ISTERMINALBUFFERBUSY?5BNETRANS48BRANCHIFYES-QUEUEANOTHERTIMEEVENT.BTST#H,OPTFLG-A(A6)NO-ISHALFDUPLEXSET?BNE.STRANS07BRANCHIFYES-BSRINPP5CONPUTONECHARACTERFROMTERMINALBRA.STRANS09.TRANS07BSRINPP5INPUTONELINEFROMTERMINALTRANS09BRATRANSRTN*'* IN CASE OF BREAK EVENT, TERMINATE !!! BREAKSVEQU*/MOVE.LSAVSTACK-A(A6),A7RESTORESTACKPOINTER(BREAKSV2BSRHALT1HALTI/OONHOSTPORTBEQ.SBREAKSV2BREAKSV4BSRHALT5BEQ.SBREAKSV4BRAXFRTERMGOTERMINATE*'* EVENT WAS I/O COMPLETION ON HOST PORT HOSTIOEQU*7MOVE.LSAVSTACK-A(A6),A7RESTORECURRENTSTACKPOINTERBSRASQREADREADTHEEVENTLEAIOS1H-A(A6),A0BSRHLTCHKCHECKFORHALTI/OBEQTRANSRTNBRANCHIFYES*LEAIOS1-A(A6),A0CMP.B#$EA,4(A0)(BEQ.STRANS12DON'TCOMPLAINONOVERRUN BSRIOERCHKCHECKFORI/OERROR3TRANS12CMP.W#$0002,(A0)SEEIFFROMWRITEREQUESTBEQ.STRANS55BRANCHIFYES*3* EVENT WAS FROM INPUT OR OUTPUT WITH INPUT REQUEST/BTST#2,IOS1+1-A(A6)WASITOUTPUTWITHINPUT?BEQ.STRANS16BRANCHIFNO;MOVE.LIOS1+8-A(A6),IOS1+12-A(A6)CORRECTSTARTINGADDRESS9TRANS16BTST#TBSY,TRANFLG-A(A6)ISTERMINALBUFFERFREE?BEQ.STRANS20BRANCHIFYES7BSET#TPND,TRANFLG-A(A6)SETTERMINALI/OPENDINGFLAGBRATRANSRTNRETURNFROMEVENT*1TRANS20LEATBUF-A(A6),A3ADDRESSTOMOVEDATATO0BSREDITMOV1MOVEDATATOWORKINGOUTPUTBUFFERBSRPREACHKSEEIF'PREAMBLE'BEQTRANNXTBRANCHIFYES)BSRINPP1INPUTANDPROCEEDONHOSTPORT6TST.LTERMLGH-A(A6)LENGTHOFDATAINTERMINALBUFFER*BEQ.STRANS52BRANCHIFNODATATOOUTPUTBSRHALT5HALTI/OONTERMINAL7BSET#TBSY,TRANFLG-A(A6)MARKTERMINALBUFFERNOTFREE7BTST#TIN,TRANFLG-A(A6)AREWEINTERMINALINPUTMODE?BNE.STRANS50BRANCHIFYES*BSROUTP5FOUTPUTANDPROCEEDTOTERMINAL*=* SET TIMER TO ACTIVATE US A LITTLE LATER ONLY IF NOT ECHOING/TRANS48LEATIM1-A(A6),A0TIMERPARAMETERBLOCK;MOVE.W#$7000,8(A0)INTERVALACTIVATIONATSPC.SVC.ADDR.MOVE.L#RQSTPA,D0TRAP#1 BSRXFRABORT+BRA.STRANS52GORETURNFROMEVENTSERVICE** OUTPUT TO TERMINAL (IMAGE)/TRANS50BSROUTW5IOUTPUTCHARACTERTOTERMINAL2BCLR#TBSY,TRANFLG-A(A6)CLEARTERMINALBUSYFLAGMOVEM.LD0-D7/A0-A5,DPSAV-A(A6)SAVEPROCESSINGINPUTADDRESS*2CMP.B#'B',COMOPT-A(A6)'B'COMMUNICATIONOPTION?BNE.SDL02BRANCHIFNO BSRWAITDC1*DL02MOVE.B#'N',D0.BSRRESPOND1RESPONDTOPREAMBLEWITH'NEXT?')BSRINPP5CINPUTANDPROCEEDONTERMINAL** WAIT FOR EVENT DLWAITEQU*,MOVE.LA7,SAVSTACK-A(A6)SAVESTACKPOINTERMOVE.L#WTEVNT,D0(TRAP#1WAITFORHOSTORTERMINALINPUT*)* EVENT WAS I/O COMPLETION FROM HOST PORT DHIOEQU*/MOVE.LSAVSTACK-A(A6),A7RESTORESTACKPOINTERBSRASQREADREADTHEEVENTLEAIOS1H-A(A6),A0%BSRHLTCHKWASTHISFROMAHALTI/O?BEQDLWAITBRANCHIFYES*LEAIOS1-A(A6),A0+CMP.B#$EA,4(A0)DON'TCOMPLAINONOVERRUN BEQ.SDL10 BSRIOERCHKCHECKFORI/OERROR0DL10CMP.W#$0002,(A0)SEEIFFROMWRITEREQUESTBEQDL500BRANCHIFYES*)* EVENT WAS INPUT COMPLETION ON HOST PORT/BTST#2,IOS1+1-A(A6)WASITOUTPUTWITHINPUT?BEQ.SDL40BRANCHIFNO;MOVE.LIOS1+8-A(A6),IOS1+12-A(A6)CORRECTSTARTINGADDRESS/BTST#H,OPTFLG-A(A6)ISTHISJUSTANACKECHO?,BEQ.SDL45BRANCHIFYES,PUTUPREADAGAIN*DL40LEATBUF-A(A6),A3,ADD.LWLGH-A(A6),A3ADDRESSTOMOVEDATATO)BSREDITMOV1MOVEDATATOWORKINGBUFFER5ADD.L#1,BLKRED-A(A6)BUMP#BLOCKSREADFORCHECKSUMMOVE.LTERMLGH-A(A6),D0LEATBUF-A(A6),A2?ADD.LWLGH-A(A6),A2POINTA2TOFIRSTBYTEOFLASTMOVEDBLOCK6DL42CMP.LCHRBLK-A(A6),D0DIDWEFILLTHEFULLBLOCK?BHS.SDL43BRANCHIFYES0MOVE.B#'',0(A2,D0)FORCEBLANKSTOFULLBLOCK ADD.L#1,D0 BRADL42DL43ADD.LWLGH-A(A6),A27ADD.LD0,WLGH-A(A6)BUMPDATALENGTHINWORKINGBUFFERMOVE.LBLKRED-A(A6),D0CMP.LBLKSUM-A(A6),D0'BHS.SDL60BRANCHIFENTIREFRAMEREAD!DL45BSRINPP1READANOTHERBLOCKBRADLWAITGOWAITFOREVENT*J* ENTIRE FRAME HAS BEEN RECEIVED - IF TERMINATE HAS BEEN KEYED IN, GET OUT9DL60BTST#TFLG,TRANFLG-A(A6)HASTERMINATEBEENKEYEDINBEQ.SDL90BRANCHIFNO*2CMP.B#'B',COMOPT-A(A6)'B'COMMUNICATIONOPTION?BNE.SDL62BRANCHIFNO BSRWAITDC1*DL62MOVE.B#'T',D0-BSRRESPOND2RESPONDWITHOUTPUTANDPROCEED BRADLWAIT*A*NOTERMINATIONYET-VALIDATECHECKSUM.IFBADCHECKSUMASKFOR*RETRANSMISSION?DL90MOVE.LCHRNUM-A(A6),D0NUMBEROFCHARACTERSWESHOULDHAVECMP.LWLGH-A(A6),D0)BEQ.SDL100BRANCHIFCHARACTERCOUNTOK-MOVE.L#4,D1COMPLAINONBADCHARACTERCOUNTLEABADCCT-A(A6),A0-BSRBINDASCCONVERTEXPECTEDCHARACTERCOUNTMOVE.LWLGH-A(A6),D0LEABADCCR-A(A6),A0-BSRBINDASCCONVERTRECEIVEDCHARACTERCOUNTBSRLF6LEABADCCS-A(A6),A1LEABADCCE-A(A6),A2*BSRMOUTTELLTHEMOFBADCHARACTERCOUNT DL95EQU**2CMP.B#'B',COMOPT-A(A6)'B'COMMUNICATIONOPTION?BNE.SDL97BRANCHIFNO BSRWAITDC1*#DL97MOVE.L#DELAY,D0WAITASECONDMOVE.L#1000,A0TRAP#1MOVE.B#'R',D0)BSRRESPOND1RESPOND/OUTPUTWITHINPUT'BSRDLINITFINITIALIZEFRAMEVARIABLES BRADLWAIT*2DL100BTST#C,OPTFLG-A(A6)ISCHECKSUMOPTIONSET?BEQ.SDL130BRANCHIFNO'LEATBUF-A(A6),A1POINTA1+ TOCHECKSUM.MOVE.L#2,D1NUMBEROFCHARACTERSINCHECKSUMBSRASCHBINCONVERTTOASCIITST.WD0ISCHECKSUMWILD?'BEQ.SDL130BRANCHIFYES(0CHECKSUM)3MOVE.WD0,-(A7)SAVECHECKSUMFORLATERCOMPARISON6LEATBUF+2-A(A6),A1WHERETOBEGINCOMPUTINGCHECKSUM MOVE.LA1,A2ADD.LWLGH-A(A6),A2!SUB.L#2,A2ENDOFDATA+1BYTE CLR.LD0 CLR.LD16DL110MOVE.B(A1)+,D1ACCUMULATECHECKSUMINTHISLOOP ADD.LD1,D0 CMP.LA1,A2-BNE.SDL110BRANCHIFMORECHARACTERSTOSUM DIVU#255,D0 CLR.WD0SWAPD0SUMMOD255IND0.W$ADD.W#1,D0INSURENONZEROCHECKSUM CLR.LD20MOVE.W(A7)+,D2CHECKSUMSENTFROMOTHERSYSTEMCMP.WD0,D2SEEIFITMATCHESBEQ.SDL130BRANCHONMATCH+BSRNAKRPTSEEIFRETRYCOUNTISEXHAUSTEDBNE.SDL115BRANCHIFNO-LEAFORCMS-A(A6),A1TELLOFFORCINGCHECKSUMLEAFORCME-A(A6),A2 BSRMOUT BRA.SDL1300DL115MOVE.L#4,D1COMPLAINONCHECKSUMMISMATCHLEABADCST-A(A6),A0 BSRBINDASC MOVE.LD2,D0LEABADCSR-A(A6),A0 BSRBINDASCBSRLF6LEABADCSS-A(A6),A1LEABADCSE-A(A6),A2%BSRMOUTPUTUPBADCHECKSUMMESSAGE$BRADL95GOTELLTHEMTORETRANSMIT*(* CHECKSUM MATCHES - GO PROCESS THE DATA?DL130MOVE.LREP2-A(A6),REP1-A(A6)RESETCHECKSUMRETRYCOUNTERLEATBUF-A(A6),A0%ADD.L#3,A0BYPASSCHARANDCHECKSUM,MOVE.LA0,TPTR-A(A6)SAVEPOINTERINTOTBUFBSRDPROCESSPROCESSTHEDATABEQ.SDL140BRANCHIFDONE*,* COME HERE FOR FRAME PROCESSED SUCCESSFULLY6CMP.B#'Z',TBUF+2-A(A6)HASTHELASTFRAMEBEENREAD?BEQ.SDL140BRANCHIFYES*2CMP.B#'B',COMOPT-A(A6)'B'COMMUNICATIONOPTION?BNE.SDL138BRANCHIFNO BSRWAITDC1*DL138MOVE.B#'N',D0)BSRRESPOND1RESPOND/OUTPUTWITHINPUT&BSRDLINITFINITIALIZEFORNEXTFRAMEBRADLWAITGOWAITFORNEXT* DL140EQU**2CMP.B#'B',COMOPT-A(A6)'B'COMMUNICATIONOPTION?BNE.SDL148BRANCHIFNO BSRWAITDC1*DL148MOVE.B#'T',D0-BSRRESPOND2RESPONDWITHOUTPUTANDPROCEED BRADLWAIT*(* EVENT WAS OUTPUT COMPLETE ON HOST PORT DL500EQU*BTST#TFLG,TRANFLG-A(A6)+BNE.SDL550BRANCHIF''T''KEYINFLAGSET** NORMAL TERMINATION)MOVE.LIOS4+8-A(A6),D0NUMBERTOCONVERT-MOVE.L#6,D1NUMBEROFCHARACTERSTOCONVERTLEADDONEN-A(A6),A0)BSRBINDASCCONVERTTOASCIIFORDISPLAYBSRLF6)LEADDONES-A(A6),A1'DOWNLOADCOMPLETED'LEADDONEE-A(A6),A2 BSRMOUT BRAQUITUPDN** TERMINATED BT 'T' KEYIN.DL550MOVE.LIOS4+8-A(A6),D0NUMBERTOCONVERT-MOVE.L#6,D1NUMBEROFCHARACTERSTOCONVERTLEADTERMN-A(A6),A0)BSRBINDASCCONVERTTOASCIIFORDISPLAYBSRLF6:LEADTERMS-A(A6),A1'DOWNLOADTERMINATEDWITH'T'KEY-IN'LEADTERME-A(A6),A2 BSRMOUT BRAQUITUPDN*&* EVENT WAS I/O COMPLETION ON TERMINAL DTIOEQU*/MOVE.LSAVSTACK-A(A6),A7RESTORESTACKPOINTERBSRASQREADREADTHEEVENTLEAIOS5H-A(A6),A0%BSRHLTCHKWASTHISFROMAHALTI/O?BEQTRANSRTNBRANCHIFYES*MOVE.BBUFF5S-A(A6),D0CMP.B#'T',D0'BNE.SDL700BRANCHIFNOTA'T'KEYIN-BSET#TFLG,TRANFLG-A(A6)YES-FLAGTHEFACT BRA.SDL800*.DL700CMP.B#'D',D0WASKEYINA'D'(DISPLAY)? BNE.SDL800)BCHG#D,OPTFLG-A(A6)CHANGEDISPLAYFLAG1BEQ.SDL750BRANCHIFDISPLAYWASPREVIOUSLYOFFBSRLF61LEARDOFS-A(A6),A1PUTOUT'DISPLAYOFFMESSAGE'LEARDOFE-A(A6),A2 BSRMSGOUTBSRLF6 BRA.SDL800 DL750BSRLF60LEARDONS-A(A6),A1PUTOUT'DISPLAYONMESSAGE'LEARDONE-A(A6),A2 BSRMSGOUTBSRLF6**DL800BSRINPP5CTAKEANOTHERCHARACTERIN BRADLWAIT%*************************************.* DLINITF INITIALIZES VARIABLES IN PREPARATION*FORREADINGNEXTFRAME*6DLINITFCLR.LBLKRED-A(A6)CLEARNUMBEROFBLOCKSREAD,LEATBUF-A(A6),A0ADDRESSOFWORKINGBUFFER/MOVE.LA0,WBUF-A(A6)ADDRESSINWORKINGBUFFER'CLR.LWLGH-A(A6)CLEARLENGTHOFFRAMERTS%*************************************)* DPROCESS PROCESSES THE FRAME JUST READ.*EXITCONDITIONCODESARE:5*EQUAL-FRAMEPROCESSINGOK(L, ASTRECORDPROCESSED).*PLUS-FRAMEPROCESSINGOK(NOTLASTRECORD)*DPROCESSEQU*=MOVEM.LDPSAV-A(A6),D0-D7/A0-A5PICKUPRESUMEREGISTERS...JMP(A0)...ANDGOTHERE&DPINBSRGETCHRGET1STCHAROFLENGTH)BEQ.SDL910BRANCHONCHARACTEROBTAINED%LEADPIN-A(A6),A0NEEDANOTHERBLOCK6MOVEM.LD0-D7/A0-A5,DPSAV-A(A6)SAVERESUMEREGISTERSBRADPEXOKTAKEOKEXIT**DL910CMP.B#'',D0SEEIFNOMORERECORDS&BEQDPEXENDBRANCHIFNOMORERECORDS/MOVE.BD0,DLTEMP-A(A6)SAVECHARACTEROBTAINED'DL915BSRGETCHRGET2NDCHAROFLENGTH)BEQ.SDL920BRANCHONCHARACTEROBTAINED&LEADL915-A(A6),A0NEEDANOTHERBLOCK6MOVEM.LD0-D7/A0-A5,DPSAV-A(A6)SAVERESUMEREGISTERS BRADPEXOK*DL920MOVE.BD0,DLTEMP+1-A(A6)0LEADLTEMP-A(A6),A1CONVERTASCIIHEXTOBINARY-MOVE.L#2,D1NUMBEROFCHARACTERSTOCONVERT BSRASCHBIN(MOVE.LD0,RLGH-A(A6)SAVERECORDLENGTH*4* MOVE RECORD FROM TBUF TO RBUF - EXPANDING AS WE GO+LEARBUF-A(A6),A3ADDRESSOFRECORDBUFFER CLR.LD3'GET'RELATIVECOUNTER4MOVE.LRPTR-A(A6),D2D2=POINTERINTO'PUT'BUFFER SUB.LA3,D2*6DL951CMP.LRLGH-A(A6),D3SEEIFWE'VEMOVEDALLCHARSBHS.SDL1000BRANCHIFYES*#DL960BSRGETCHRGETNEXTCHARACTER*BEQ.SDL962BRANCHIFCHARACTERAVAILABLE"LEADL960-A(A6),A0RESUMEADDRESS6MOVEM.LD0-D7/A0-A5,DPSAV-A(A6)SAVERESUMEREGISTERS!BRADPEXOKGOEXITFORNEWFRAME*$DL962ADD.L#1,D3BUMP'GET'COUNTER.CMP.B#'|',D0ISITTHECOMPRESSIONSENTINEL?BNE.SDL980BRANCHIFNO*)DL964BSRGETCHRGETCOMPRESSEDCHARACTER*BEQ.SDL965BRANCHIFCHARACTERAVAILABLE&LEADL964-A(A6),A0GETRESUMEADDRESS6MOVEM.LD0-D7/A0-A5,DPSAV-A(A6)SAVERESUMEREGISTERS)BRADPEXOKBRANCHFORNEWFRAMEREQUIRED*$DL965ADD.L#1,D3BUMP'GET'COUNTER/MOVE.BD0,BCHR-A(A6)SAVECOMPRESSEDCHARACTER$DL966BSRGETCHRGETCOUNTCHARACTER*BEQ.SDL968BRANCHIFCHARACTERAVAILABLE&LEADL966-A(A6),A0GETRESUMEADDRESS6MOVEM.LD0-D7/A0-A5,DPSAV-A(A6)SAVERESUMEREGISTERS+BRA.SDPEXOKBRANCHFORNEWFRAMEREQUIRED*$DL968ADD.L#1,D3BUMP'GET'COUNTER2SUB.B#'0',D0CONVERTCODETOBINARYREPEATVALUE CMP.L#9,D0 BLS.SDL970BRANCHIFRANGE0-9SUB.B#7,D0RANGE10-35*DL970TST.BD0AREWESTILLUNCOMPRESSING?BEQ.SDL951BRANCHIFNO0SUB.L#1,D0DECREMENTREMAINGCOMPRESSIONCOUNT*MOVE.BBCHR-A(A6),0(A3,D2.L)MOVETOBUFF"ADD.L#1,D2ADVANCE'PUT'POINTER BRA.SDL970*9DL980MOVE.BD0,0(A3,D2.L)MOVE'RAW'DATABYTETOBUFFER"ADD.L#1,D2ADVANCE'PUT'POINTER BRADL951*'* OUTPUT RECORD TO DISK AND/OR TERMINAL(DL1000TST.LD2TESTUNCOMPRESSEDLENGTH"BHI.SDL1005BRANCHIFLENGTH>0-MOVE.L#1,D2IFNOTTHENFORCELENGTHOFONE$MOVE.B#'',(A3)FORABLANKRECORD4DL1005MOVE.LA3,RPTR-A(A6)SETPOINTERBACKTORBUF2LEAIOS4-A(A6),A0ADDRESSOFDISKPARAMETERBLOCK MOVE.LA3,12(A0)BUFFERADDRESS$ADD.LD2,A3ADDUNCOMPRESSEDLENGTH'SUB.L#1,A3POINTA3TOLASTCHARACTER'MOVE.LA3,16(A0)ENDINGBUFFERADDRESSMOVE.L#$00026028,(A0)TRAP#2OUTPUTTODISK BEQ.SDL1010BRANCHONGOODI/O MOVE.LD0,-(A7)SAVEERRORCODEBSRHALT5HALTTHEI/OMOVE.L(A7)+,D0$BSRIOSERRCOMPLAINOFBADDISKI/O$BRAXABORTERRORONBADDISKOUTPUT6DL1010ADD.L#1,IOS4+8-A(A6)BUMPRANDOMRECORDNUMBER4BTST#D,OPTFLG-A(A6)AREWETODISPLAYTOTERMINAL?BEQ.SDL1020BRANCHIFNOMOVEM.L$C(A0),A1/A2BSRHALT5HALTI/OONTERMINAL"BSRMSGOUTPUTDATAONTOTERMINAL"DL1020BRADPINGOFORNEXTRECORD*1DPEXOKMOVE.L#1,D0INDICATEPLUSCONDITIONCODES BRA.SDPIO/DPEXENDCLR.LD0INDICATEEQUALCONDITIONCODES+DPIOMOVED0,-(A7)SAVEFORCONDITIONCODES,CMP.B#$FF,IOS5+4-A(A6)ISI/OINPROGRESS?BEQ.SDPRTSBRANCHIFYESBSRINPP5CNOSOREISSUEINPUT+DPRTSMOVE(A7)+,D0RESTORECONDITIONCODESRTS%*************************************%* GETCHR GETS ONE CHARACTER FROM TBUF'*POINTEDATBYTPTR.IFALLCHARACTERS, &*HAVEBEENFETCHED,UNEQUALCONDITION&*CODESARERETURNED.OTHERWISE,EQUAL&*CONDITIONCODESARERETURNEDANDTHE*CHARACTERISRETURNEDIND0.GETCHRMOVE.LTPTR-A(A6),A0MOVE.B(A0),D0LEATBUF-A(A6),A1 SUB.LA1,A0CMP.LCHRNUM-A(A6),A0.BHS.SGETCNOBRANCHIFNOCHARACTERTORETURN+ADD.L#1,TPTR-A(A6)ADVANCDBUFFERPOINTER&CMP.LD0,D0SETEQUALCONDITIONCODESRTS/GETCNOMOVE.L#1,D0SETUNEQUALCONDITIONCODESRTSPAGE%*************************************.* IMSG DISPLAYS MESSAGE EXPLAINING INTERACTIVE *OPTIONS.*JIM1S DC.B 'KEY IN ''T'' TO TERMINATE TRANSFER AND RESUME TRANSPARENT MODE' IM1EEQU*-1DS0/IM2SDC.B'''D''TOTOGGLETHERECORDDISPLAY' IM2EEQU*-1DS0* IMSGEQU*BSRLF6TWOLINEFEEDSLEAIM1S-A(A6),A1LEAIM1E-A(A6),A2 BSRMSGOUTLEAIM2S-A(A6),A1LEAIM2E-A(A6),A2 BSRMSGOUTBSRLF6TWOLINEFEEDSRTS%************************************** UPLOAD SEQUENCE*ULOADMSDC.B'UPLOADINITIATED'ULOADMEEQU*-1DS0*HSEVMS DC.B 'ENTER SENDING FILE NAME OR ''Q'' TO RESUME TRANSPARENT MODE' SEVMEEQU*-1DS0**NAKMSDC.B'NAKRECEIVED-RETRANSMITTING' NAKMEEQU*-1DS0*2UTERMSDC.B'UPLOADTERMINATEDWITH''T''KEY-IN'(UTERMNDC.B'XXXXXXRECORDSTRANSFERRED'UTERMEEQU*-1DS0*UDONESDC.B'UPLOADCOMPLETED'(UDONENDC.B'XXXXXXRECORDSTRANSFERRED'UDONEEEQU*-1DS0*3UPLOADLEASEVMS-A(A6),A1ASKFORSENDINGFILENAMELEASEVME-A(A6),A2 BSRMSGOUT2BSRINPW5TAKESENDINGFILENAME(INPUTANDWAIT)*BSRASGFLUASSIGNTHEFILE&BEQ.SUL00BRANCHIF'Q'NOTKEYEDIN*MOVE.B#'T',D0TERMINATIONACKNOWLEDGMENT!BSRRESPOND2SENDITTOTHEHOST BRAQUITUPDN* UL00BSRLF63LEAULOADMS-A(A6),A1TELLTHEMUPLOADISINITIATEDLEAULOADME-A(A6),A2 BSRMSGOUT* BSRIMSG1CLR.BBUFF5S-A(A6)CLEARBYTEFOROPERATORINPUT0BSRINPP5CINPUTANDPROCEEDFROMHOMETERMINAL**2* PLACE COMPLETION ADDRESSES INTO PARAMETER BLOCKSLEAUHIO-A(A6),A0MOVE.LA0,IOS1+24-A(A6)LEAUTIO-A(A6),A0MOVE.LA0,IOS5+24-A(A6)** INITIALIZE FOR RECORD READS/LEAIOS4-A(A6),A0ADDROFFILEPARAMETERBLOCK$CLR.L8(A0)CLEARRRNFORDISKREAD#LEARBUF-A(A6),A1STARTINGADDRESS(LEARBUF+RMAX-1-A(A6),A2ENDINGADDRESS/MOVEM.LA1/A2,12(A0)PLUGINBUFFERBOUNDARIES-MOVE.L#$00016020,(A0)PLUGINREADFUNCTION!LEATBUF-A(A6),A0PACKINGBUFFER.ADD.L#3,A0BYPASSCHECKSUMANDEOFCHARACTER6MOVE.LA0,TPTR-A(A6)SAVEPOINTERFORPACKINGRECORDS/MOVE.B#'A',-1(A0)INDICATEINTERMEDIATEFRAME:MOVE.LA0,UREC1-A(A6)SAVEADDRESSOF1STRECORDINFRAME6CLR.LUSTAGEL-A(A6)INDICATENOSTAGEDDISPLAYRECORD*=* READ ANOTHER RECORD ONLY IF WE STILL HAVE ROOM IN THE FRAME5UL10MOVE.LTPTR-A(A6),D0POINTERINTOPACKINGBUFFER1LEATBUF-A(A6),A0BASEADDRESSOFPACKINGBUFFER-SUB.LA0,D0D0=NUMBEROFCHARACTERSPACKED(CMP.LCHRNUM-A(A6),D0SEEIFFULLFRAME!BHS.SUL100BRANCHIFFRAMEFULLLEAIOS4-A(A6),A0TRAP#2READTHERECORDBNE.SUL15BRANCHONBADREAD*E*READWASGOOD,TRANSFERRECORDTOTBUFUNDERANEDITINGMOVE.PLACED*THEACTUALNUMBEROFCHARACTERSMOVEDINTOTHELENGTHFIELDOFTHE*FRAME.*ADD.L#1,8(A0)BUMPRANDOMRECORDPOINTER+MOVE.LTPTR-A(A6),A3POINTTOLENGTHFIELD"ADD.L#2,A3WHERETOMOVEDATATOBSREDITMOV2MOVEDATATOTBUF3MOVE.LTERMLGH-A(A6),D0NUMBEROFCHARACTERSMOVED MOVE.LD0,D2#BSRBINHASCCONVERTTOASCIIIND1MOVE.LTPTR-A(A6),A0$MOVE.BD1,1(A0)2NDDIGITOFLENGTHROR.L#8,D1POSITION1STDIGITMOVE.BD1,(A0)PLACE1STDIGIT$ADD.L#2,A0POSITIONTODESTINATIONADD.LTERMLGH-A(A6),A0!MOVE.LA0,TPTR-A(A6)UPDATETPTR"BRA.SUL10CONTINUEFILLINGFRAME*&UL15CMP.B#$C2,D0WASITENDOFFILE?!BEQ.SUL20BRANCHONENDOFFILE"MOVE.LD0,-(A7)SAVEERRORSTATUSBSRHALT5HALTTHEI/O%MOVE.L(A7)+,D0RECOVERERRORSTATUSBSRIOSERRCOMPLAINONERROR"BRAXABORTABORTONBADDIS- KREAD** BLANK FILL THE FRAME1UL20MOVE.LTPTR-A(A6),A0WHERETOMOVEBLANKSTOLEATBUF-A(A6),A1$ADD.LCHRNUM-A(A6),A1LASTADDR+1'UL25MOVE.B#'',(A0)+STUFFBLANKS...CMP.LA0,A1...TOTHEEND...BNE.SUL25...OFTHEFRAME2MOVE.LA0,TPTR-A(A6)SETTPTRTOENDOFFRAME+1-MOVE.B#'Z',TBUF+2-A(A6)INDICATELASTFRAME*)* COMPUTE CHECKSUM FOR THIS FRAME OF DATA UL100EQU*-BTST#C,OPTFLG-A(A6)ISCHECKSUMOPTIONSET?BNE.SUL102BRANCHIFYES>MOVE.W#'00',TBUF-A(A6)NOSOINSERTZERO(WILDCARD)CHECKSUM BRA.SUL1500UL102LEATBUF+2-A(A6),A1WHERETOSTARTSUMMING MOVE.LA1,A2ADD.LCHRNUM-A(A6),A2SUB.L#2,A2ENDINGADDRESS+1CLR.LD0ACCUMULATORCLR.LD1HOLDSBYTE6UL110MOVE.B(A1)+,D1ACCUMULATECHECKSUMINTHISLOOP ADD.LD1,D0 CMP.LA1,A2 BNE.SUL110 DIVU#255,D0SWAPD0SUMMOD255IND0.W$ADD.W#1,D0INSURENONZEROCHECKSUM'BSRBINHASCCONVERTTOHEXASCIIIND1&MOVE.WD1,TBUF-A(A6)PLUGINCHECKSUM*'* LOOP FOR SENDING FRAME BLOCK BY BLOCK5UL150LEATBUF-A(A6),A2BASEOFFRAMEANDFIRSTBLOCK MOVE.LA2,A1ADD.LCHRBLK-A(A6),A2+SUB.L#1,A2BRACKETFIRSTBLOCKWITHA1/A2 BRA.SUL182* UL180EQU*MOVEM.LBBOUNDS-A(A6),A1/A20ADD.LCHRBLK-A(A6),A1ADVANCEBUFFERBOUNDARIESADD.LCHRBLK-A(A6),A2!UL182MOVEM.LA1/A2,BBOUNDS-A(A6)LEATBUF-A(A6),A0ADD.LCHRNUM-A(A6),A0 SUB.L#1,A0 CMP.LA2,A0*BEQ.SUL185BRANCHIFLASTBLOCKOFFRAME** NOT LAST BLOCK OF FRAME/BTST#H,OPTFLG-A(A6)ISHALFDUPLEXINEFFECT?BEQ.SUL187BRANCHIFNO#BSROUTP1YES-OUTPUTANDPROCEEDSUB.L#1,A2READJUSTA2BRAULWAITGOWAITFOREVENT*#* LAST BLOCK OF FRAME IS BEING SENT2UL185BSET#LBLK,TRANFLG-A(A6)SETLASTBLOCKFLAG1UL187BSROIP1OUTPUTDATAWITHINPUTANDPROCEEDSUB.L#1,A2READJUSTA2BRAULWAITGOWAITFOREVENT*'* EVENT WAS I/O COMPLETION ON HOST PORT UHIOEQU*/MOVE.LSAVSTACK-A(A6),A7RESTORESTACKPOINTERBSRASQREADREADTHEEVENTLEAIOS1H-A(A6),A0%BSRHLTCHKWASTHISFROMAHALTI/O?BEQULWAITBRANCHIFYES*2LEAIOS1-A(A6),A0ADDRESSOFHOSTPARAMETERBLOCK1CMP.B#$EA,4(A0)DON'TCOMPLAINONOVERRUNERROR BEQ.SUL200 BSRIOERCHKCHECKFORI/OERROR/UL200CMP.W#$2,(A0)WASITOUTPUTANDPROCEED?-BEQUL180BRANCHIFYESTOOUTPUTNEXTBLOCK)CMP.W#$1,(A0)WASITINPUTANDPROCEED?BEQ.SUL680BRANCHIFYES*1* IT MUST HAVE BEEN OUTPUT WITH INPUT AND PROCEED;*IFWEARENOTINHALFDUPLEXMODE,THENWEHAVEJUSTREAD8*THEECHOOFOURLASTTRANSMISSION.IFTHISISTHECASE=*ANDWEAREONTHELASTBLOCKOFTRANSMISSIONTHENPUTUPAN@*INPUTANDPROCEEDFORRESPONSEFROMHOSTSYSTEM.IFWEARENOT?*ONTHELASTBLOCKOFTRANSMISSIONANDNOTINHALFDUPLEXMODE'*THENSIMPLYGOOUTPUTTHENEXTBLOCK.2MOVE.L8(A0),12(A0)CORRECTINPUTADDRESSFROMOI*BTST#H,OPTFLG-A(A6)WASHALFDUPLEXSET?BNE.SUL680BRANCHIFYES0BCLR#LBLK,TRANFLG-A(A6)WASITTHELASTBLOCK?BEQUL180BRANCHIFNOBSRINPP1READRESPONSE%BRAULWAITGOWAITFORANOTHEREVENT* UL680EQU*LEATBUF-A(A6),A0ADD.LCHRNUM-A(A6),A0,LEARESPONSE-A(A6),A3WHERETOMOVEDATATOBSREDITMOV1MOVEDATATORBUF*2CMP.B#'B',COMOPT-A(A6)'B'COMMUNICATIONOPTION?BNE.SUL682BRANCHIFNO BSRWAITDC1*6UL682CMP.B#'N',RESPONSE-A(A6)WASITANACKNOWLEDGE?BEQ.SUL700BRANCHIFYES,CMP.B#'T',RESPONSE-A(A6)WASITTERMINATE? BEQ.SUL700(BSRNAKRPTSEEIFRETRYCOUNTEXHAUSTEDBNE.SUL695BRANCHIFNO,MOVE.W#'00',TBUF-A(A6)FORCEGOODCHECKSUM6LEAFORCMS-A(A6),A1TELLTHEMTHATCHECKSUMMATCH...#LEAFORCME-A(A6),A2...WASFORCED BSRMOUT BRAUL150* UL695BSRLF62LEANAKMS-A(A6),A1TELLTHEMWE'RERETRANSMITTINGLEANAKME-A(A6),A2 BSRMOUTMOVE.L#DELAY,D0WAITASECONDMOVE.L#1000,A0TRAP#1BRAUL150GORETRANSMIT*$* THE DATA WAS SENT AND ACKNOWLEDGED>*IFDOPTIONSETTHENDISPLAYRECORDSJUSTSENTONT- OTERMINAL"UL700MOVE.LREP2-A(A6),REP1-A(A6)BTST#D,OPTFLG-A(A6)#BEQUL800BRANCHIFOPTIONNOTSET5MOVE.LUREC1-A(A6),D0SEEIFUSTAGEREADYTODISPLAYLEATBUF-A(A6),A0 SUB.LA0,D0CMP.LCHRNUM-A(A6),D0.BHIUL800BRANCHIFUSTAGESTILLACCUMULATINGBSRHALT5HALTI/OONTERMINAL8TST.LUSTAGEL-A(A6)DOWEHAVEASTAGEDDISPLAYRECORD?BEQ.SUL710BRANCHIFNO*A* DISPLAY THE STAGING BUFFER (LEFT OVER FROM LAST FRAME OVERFLOW)LEAUSTAGE-A(A6),A1 MOVE.LA1,A2ADD.LUSTAGEL-A(A6),A2 SUB.L#1,A2 BSRMSGOUTCLR.LUSTAGEL-A(A6)*M* NOW SET UP TO DISPLAY THE REST OF THE RECORDS FROM TBUF THAT HAVE JUST BEEN*SENTINTHISFRAME.UL710LEATBUF-A(A6),A35ADD.LCHRNUM-A(A6),A3A3=LASTADDRESS+1OFFRAMEBMOVE.LUREC1-A(A6),DLTEMP-A(A6)POINTERTONEXTRECORDTODISPLAY*>UL720MOVE.LDLTEMP-A(A6),A1ADDRESSOFLENGTHFIELDOFRECORD8CMP.B#'',(A1)ISTHISTHELASTRECORDOFENTIREFILE?BEQ.SUL790BRANCHIFYES* CLR.LD0LEATBUF-A(A6),A0ADD.LCHRNUM-A(A6),A0,CMP.LA0,A1AREWEATTHEENDOFTHEFRAME?BHS.SUL790BRANCHIFYES*=* NOT THE LAST RECORD IN TBUF SO MOVE IT TO USTAGE TO DISPLAY-MOVE.L#2,D1NUMBEROFCHARACTERSTOCONVERT-BSRASCHBINCONVERTFROMASCIIHEXTOBINARY,MOVE.LA1,A2ADDRESSOFBEGINNINGOFRECORD)ADD.LD0,A2ADDRESS+1OFENDOFRECORD4MOVE.LD0,USTAGEL-A(A6)LENGTHOFCOMPRESSEDRECORD+LEAUSTAGE-A(A6),A4BASEOFDISPLAYBUFFER** MOVE AND UNCOMPRESS RECORD*A1-'FROM'ADDRESS*A4-'TO'ADDRESS*3UL740MOVE.B(A1)+,D0CHARACTERUNDERCONSIDERATIONCMP.B#'|',D0/BNE.SUL760BRANCHIFNOTCOMPRESSIONSENTINEL%MOVE.B(A1)+,D0COMPRESSEDCHARACTER MOVE.B(A1)+,D1REPETITIONCODE SUB.B#'0',D1CONVERTTOBINARY CMP.B#9,D1%BLS.SUL750BRANCHIFINRANGE0-9%SUB.B#7,D1CONVERTINRANGE10-35UL750TST.BD1 BEQ.SUL761*MOVE.BD0,(A4)+MOVECOMPRESSEDCHARACTER SUB.B#1,D1 BRA.SUL750*3UL760MOVE.BD0,(A4)+MOVENONCOMPRESSEDCHARACTER%UL761CMP.LA2,A1AREWEDONEMOVING?BLO.SUL740BRANCHIFNO*1CMP.LA3,A2SEEIFTHISRECORDFLOWSOFFTHEENDBHI.SUL780BRANCHIFYES6MOVE.LA1,DLTEMP-A(A6)ADDRESSOFNEXTRECORDINTBUF*$* NOW DISPLAY THE RECORD FROM USTAGE MOVE.LA4,A2$SUB.L#1,A2LASTADDRESSTODISPLAYLEAUSTAGE-A(A6),A1BSRMSGOUTDISPLAYTHERECORD)CLR.LUSTAGEL-A(A6)CLEARSTAGINGLENGTHBRAUL720CONTINUEDISPLAYING*>UL780LEAUSTAGE-A(A6),A1CALCULATEUNCOMPRESSEDRECORDLENGTH SUB.LA1,A4MOVE.LA4,USTAGEL-A(A6)*/UL790BSRINPP5CTAKEINPUTFROMTERMINALAGAIN*#* ENTIRE FRAME HAS BEEN TRANSMITTED8*IFLASTFRAME,ISSUETERMINATIONORCOMPLETIONMESSAGE**6UL800CMP.B#'Z',TBUF+2-A(A6)WASTHISTHELASTFRAME?%BNE.SUL840BRANCHIFNOTLASTFRAME0BTST#TFLG,TRANFLG-A(A6)HAS'T'BEENKEYEDIN?BEQ.SUL830BRANCHIFNO*)MOVE.LIOS4+8-A(A6),D0NUMBERTOCONVERT-MOVE.L#6,D1NUMBEROFCHARACTERSTOCONVERTLEAUTERMN-A(A6),A0)BSRBINDASCCONVERTTOASCIIFORDISPLAYBSRLF6LEAUTERMS-A(A6),A1LEAUTERME-A(A6),A2(BSRMOUTTELLTHEMUPLOADISTERMINATED BRAQUITUPDN*.UL830MOVE.LIOS4+8-A(A6),D0NUMBERTOCONVERT-MOVE.L#6,D1NUMBEROFCHARACTERSTOCONVERTLEAUDONEN-A(A6),A0)BSRBINDASCCONVERTTOASCIIFORDISPLAYBSRLF6LEAUDONES-A(A6),A1LEAUDONEE-A(A6),A2'BSRMOUTTELLTHEMUPLOADISCOMPLETED BRAQUITUPDN*5UL840BTST#TFLG,TRANFLG-A(A6)HAS'T'BEENKEYEDIN?BEQ.SUL850BRANCHIFNO4LEATBUF-A(A6),A0SETUPTBUFPOINTERTOBLANKFILL)ADD.L#3,A0BYPASSCHECKSUMANDSEQUENCEMOVE.LA0,TPTR-A(A6)/BRAUL20GOCONSTRUCTENDINGFRAMEANDSENDIT*>* JUSTIFY ANY FRAME OVERFLOW AND CONTINUE SENDING DATA TO HOST3UL850MOVE.LTPTR-A(A6),A2LASTADDRESS+1TOMOVELEATBUF-A(A6),A0,ADD.LCHRNUM-A(A6),A0FIRSTADDRESSTOMOVE$LEATBUF+3-A(A6),A1WERETOMOVETOUL855CMP.LA2,A0"BHS.SUL900BRANCHIFDONEMOVINGMOVE.B(A0)+,(A1)+ BRA.SUL855:UL900MOVE.LA1,TPTR-A(A6)U. PDATETEMPORARYBUFFERPOINTER,MOVE.LA1,UREC1-A(A6)FIRSTRECORDOFFRAME5MOVE.B#'A',TBUF+2-A(A6)INDICATEINTERMEDIATEFRAMEBRAUL10GOCONTINUEFILLING*&* EVENT WAS I/O COMPLETION ON TERMINAL UTIOEQU*/MOVE.LSAVSTACK-A(A6),A7RESTORESTACKPOINTERBSRASQREADREADTHEEVENTLEAIOS5H-A(A6),A0%BSRHLTCHKWASTHISFROMAHALTI/O?BEQ.SULWAITBRANCHIFYES*MOVE.BBUFF5S-A(A6),D0(CMP.B#'D',D0WASKEYINA'D'(DISPLAY) BNE.SUTIO10BCHG#D,OPTFLG-A(A6)2BEQ.SUTIO08BRANCHIFDISPLAYWASPREVIOUSLYOFF*CLR.LUSTAGEL-A(A6)CLEARHANGINGDISPLAYBSRLF61LEARDOFS-A(A6),A1PUTOUT'DISPLAYOFFMESSAGE'LEARDOFE-A(A6),A2 BSRMSGOUTBSRLF6 BRA.SUTIO99UTIO08BSRLF60LEARDONS-A(A6),A1PUTOUT'DISPLAYONMESSAGE'LEARDONE-A(A6),A2 BSRMSGOUTBSRLF6 BRA.SUTIO99*(UTIO10CMP.B#'T',D0WASA'T'KEYEDIN?BNE.SUTIO99BRANCHIFNO5BSET#TFLG,TRANFLG-A(A6)YESSOSETTERMINATIONFLAG*UTIO99BSRINPP5C**7* RESET STACK POINTER AND POINTER AND GO WAIT FOR EVENT ULWAITEQU*,MOVE.LA7,SAVSTACK-A(A6)SAVESTACKPOINTER!MOVE.L#WTEVNT,D0WAITFOREVENTTRAP#1%*************************************"* QUITUPDN HALTS ANY ACTIVE I/O ON#*TERMINALORHOSTPORT,DELAYSFOR,*2SECONDS.READSALLTHEEVENTSINTHEASQ*ANDPERFORMSRTS.QUITUPDNBRATRANNXT%*************************************** ASGFLD ASSIGNS THE FILE KEYED IN IN TBUF6*TOLOGICALUNIT#4FORUPLOAD.EQUALCONDITIONCODES.*RETURNEDFORGOODASSIGN,NECONDITIONCODES#*RETURNEDIFOPERATORKEYSIN'Q'.*0RENTRSDC.B'REENTERFILENAMEOR''Q''TOQUIT'RENTREEQU*-1DS03OVRMSGSDC.B'FILEEXISTS-OKTOOVERWRITE(Y/N)?'OVRMSGEEQU*-1DS0 ASGFLDEQU*!BSREDFILSETUPPARAMETERBLOCK&BNE.SASGFLD40BRANCHIF'Q'KEYEDIN*LEAFHS4-A(A6),A0#MOVE.L#$00400000,(A0)ASSIGNCODETRAP#38BEQ.SASGOVRWBRANCHIFGOODASSIGN(OVERWRITEREQUEST)*>* ASSIGN FAILED - SEE IF NONEXISTENT FILE AND IF NOT, COMPLAINCMP.B#$17,D0#BEQ.SASALLOBRANCHIFNONEXISTENT!BSRFHSERRCOMPLAINOFFHSERROR;ASGFLD20LEARENTRS-A(A6),A1TELLTHEMTOREENTERFILENAMELEARENTRE-A(A6),A2 BSRMOUTBSRINPW5GETINPUTBRAASGFLDGOFORANOTHERTRY*8*THEFILEALREADYEXISTS.ASKIFTHEYWISHTOOVERWRITEASGOVRWLEAOVRMSGS-A(A6),A1LEAOVRMSGE-A(A6),A2 BSRMOUTBSRINPW5WAITFORTHEINPUTCMP.B#'Y',BUFF5S-A(A6) BNEASGFLD20*;*THEYWANTTOOVERWRITE.FREETHEFILEANDDELETEIT,THEN*REALLOCATEITANDASSIGNIT.LEAFHS4-A(A6),A0MOVE.L#$00040000,(A0)TRAP#3FREETHEFILEMOVE.L#$00020000,(A0)TRAP#3DELETETHEFILEASALLOMOVE.L#$00C00304,(A0)%TRAP#3ALLOCATEANDASSIGNTHEFILEBEQ.SASGFLD40$BSRFHSERRPUTUPFHSERRORMESSAGE/BRAASGFLD20GOTELLTHEMTOREENTERFILENAME* ASGFLD40RTS%*************************************** ASGFLU ASSIGNS THE FILE KEYED IN IN TBUF6*TOLOGICALUNIT#4FORUPLOAD.EQUALCONDITIONCODES.*RETURNEDFORGOODASSIGN,NECONDITIONCODES$*RETURNEDIFOPERATORKEYSINQUIT.* ASGFLUEQU*#BSR.SEDFILSETUPPARAMETERBLOCK&BNE.SASGFLU50BRANCHIF'Q'KEYEDIN*LEAFHS4-A(A6),A0#MOVE.L#$00400000,(A0)ASSIGNCODETRAP#3%BEQ.SASGFLU50BRANCHONGOODASSIGN*2* ASSIGN FAILED - COMPLAIN AND LET THEM TRY AGAIN.!BSRFHSERRCOMPLAINOFFHSERROR3LEARENTRS-A(A6),A1TELLTHEMTOREENTERFILENAMELEARENTRE-A(A6),A2 BSRMOUTBSRINPW5GETINPUTBRAASGFLUGOFORANOTHERTRY*5*THEFILEISASSIGNED.RETURNEQUALCONDITIONCODES. ASGFLU50RTS%*************************************3* EDFIL FREES ANY FILE ATTACHED TO LOGICAL UNIT #3,1*ANDATTEMPTSTOASSIGNTHEFILEKEYEDININTHE,*BUFFERPOINTEDATBYIOS5PARAMETERBLOCK.4*IFTHEASSIGNMENTWASGOOD,EQCONDITIONCODESARE-*RETURNED.IF'Q'WASKEYED-IN,NECONTITION4*CODESARERETURNED.EDFILWILLINTERACTIVELYQUERY2*THEOPERATORIFAERRORWASMA. DEINENTERINGTHE *FILENAME.*DBADFILSDC.B'BADFILENAMEENTERED-REENTERNAMEOR''Q''TOQUIT'BADFILEEQU*-1DS0*4* FIRST FREE IF ANY FILE ATTACHED TO LOGICAL UNIT #3EDFILLEAFHS4-A(A6),A0MOVE.L#$00040000,(A0)TRAP#3*8* SEE IF 'Q' WAS KEYED IN - IF SO BRANCH TO QUIT ROUTINEEDFIL4BSRQUITCHK%BEQ.SEDFIL8BRANCHIFQUITKEYEDIN*/* NOW SET UP PARAMETER BLOCK TO ASSIGN THE FILELEAFHS4-A(A6),A0BSR.SDEFAULTS6MOVE.LIOS5+12-A(A6),A0ADDRESSOFKEYEDINFILENAME MOVE.LA0,A2ADD.LIOS5+20-A(A6),A24MOVE.B#',',1(A2)TERMINATEWITHCOMMAFOREDITFILELEAFHS4-A(A6),A6 BSREDITFILE LEAA(PC),A6 TST.LD0#BPL.SEDFIL6BRANCHIFEDITFILEOKLEABADFILS-A(A6),A1LEABADFILE-A(A6),A2 BSRMOUTBSRINPW5WAITFORTHEINPUT BRA.SEDFIL4,EDFIL6CMP.LD0,D0SETEQUALFORGOODASSIGNBRA.SEDFILRTS3EDFIL8MOVE.L#1,D0SETNECONDITIONCODESFORQUIT EDFILRTSRTS%*************************************3* RESPOND1 RESPONDS TO HOST WITH OUTPUT WITH INPUT.)*RESPONSEVALUEPASSEDINLOWORDERBYTE(*OFDO.INPUTISDONEINTOBUFF1S.THIS*ROUTINECALLSOIP1.*/RESPOND1MOVE.BD0,RESPONSE-A(A6)SAVERESPONSE3LEARESPONSE-A(A6),A1SETUPBUFFERBOUNDARIES...MOVE.LA1,A2...FOROIP1 ADD.L#2,A2 BSROIP1RTS%*************************************3* RESPOND2 RESPONDS TO HOST WITH OUTPUT AND PROCEED5*WITHRESPONSEVALUEPASSEDINLOWORDERBYTEOFD0.*RESPOND2EQU*)MOVE.BD0,RESPONSE-A(A6)SETUPRESPONSE*LEARESPONSE-A(A6),A1ADDRESSOFRESPONSE&MOVE.LA1,A2SETUPBUFFERBOUNDARIES ADD.L#2,A2LEAIOS1-A(A6),A0MOVEM.LA1/A2,12(A0)6MOVE.L#$0002020A,(A0)IMAGEWRITE,SVCADDR,PROCEED"MOVE.B#$FF,4(A0)MARKACTIVEI/OTRAP#2 BSRXFRABORTRTS%*************************************(* DEFAULTS SETS UP DEFAULT VALUES IN FHS,*PARAMETERBLOCK.A0CONTAINSFHSPARAMETER*BLOCKADDRESS.*:DEFAULTSMOVE.WUSERNUM+2-A(A6),$A(A0)DEFAULTUSERNUMBER'MOVE.LVOLNAM-A(A6),$6(A0)VOLUMENAME(MOVE.LCATNAM-A(A6),$C(A0)CATALOGNAME7MOVE.LCATNAM+4-A(A6),$10(A0)2NDPARTOFCATALOGNAMERTS%*************************************(* NAKRPT COUNTS DOWN THE REP1 COUNTER TO+*SEEIFTHEREPETITIONCOUNTISEXHAUSTED..*IFREP1ISZERO,COUNTISEXHAUSTEDANDREP1.*ISRESETWITHREP2VALUEANDEQUALCONDITION*CODESARERETURNED.+*OTHERWISEREP1ISDECREMENTEDANDUNEQUAL*CONDITIONCODESARERETURNED.*NAKRPTTST.LREP1-A(A6),BGT.SNAKRPT2BRANCHIFCOUNTNOTEXHAUSTED5MOVE.LREP2-A(A6),REP1-A(A6)EXHAUSTED-RESETCOUNT CMP.LD0,D0BRA.SNAKRRTSNAKRPT2SUB.L#1,REP1-A(A6)'TST.L(A7)SETNONZEROCONDITIONCODES NAKRRTSRTS%*************************************.* PREACHK CHECKS THE TERMINAL BUFFER TO SEE IF)*ITCONTAINS'PREAMBLE'.EQUALCONDITION.*CODESARERETURNEDIFSO,UNEQUALOTHERWISE.*2PREACHKLEAPREAM-A(A6),A1STRINGTOCHECKAGAINST"LEATBUF-A(A6),A2BUFFERTOCHECK BSR.SSCHKRTS&**************************************-* QUITCHK CHECKS THE IOS5 BUFFER TO SEE IF IT2*CONTAINS'Q'.EQUALCONDITIONCODESARERETURNED*IFSO,UNEQUALOTHERWISE.*QUITCHKMOVE.LIOS5+12-A(A6),A2CMP.B#'Q',(A2)RTS%*************************************:* SCHK CHECKS THE TERMINAL BUFFER POINTED AT BY A2 FOR THE(*CHARACTERSTRINGSPECIFIEDBYA1.UPON,*ENTRY,A1POINTSTOALONGWORDSPECIFYING+*THENUMBEROFCHARACTERSINTHESTRINGTO+*MATCH,FOLLOWEDIMMEDIATELYBYTHESTRING *ITSELF.* SCHKEQU*MOVE.L(A1)+,D0 SUB.L#1,D0TCHK2CMP.B(A1)+,(A2)+DBNED0,TCHK2RTS%*************************************&* MOUT HALTS ANY I/O ON LU 5 AND CALLS**MSGOUTTOOUTPUTDATATOLU6.IFAREAL+*I/OFUNCTIONWASACTUALLYHALTEDONLU5,)*MOUTWILLREISSUETHEI/OREQUESTAFTER*CALLINGMOUT.*#MOUTBSRHALT5HALTI/OONTERMINAL(BEQ.SMOUT4BRANCHIFI/OREALLYHALTED BSRMSGOUTBRA.SMOUTRTS*MOUT4BSRMSGOUTMOVE.LA0/ ,-(A7)LEAIOS5-A(A6),A0"MOVE.B#$FF,4(A0)MARKACTIVEI/O!TRAP#2REISSUETHEPREVIOUSI/OMOVE.L(A7)+,A0 MOUTRTSRTS%*************************************)* FHSERR PUTS UP A MESSAGE COMPLAINING OF+*FHSERRORNUMBERANDLOGICALUNITNUMBER.'*ENTEREDWITHERRORCODEIND0ANDFHS *PARAMETERBLOCKADDRESSINA0.*A0,A1,A2,D0DESTROYEDFHSERRBSRBINHASCMOVE.WD1,FHSERRS-A(A6)MOVE.B5(A0),FHSERLUN-A(A6)ADD.B#$30,FHSERLUN-A(A6)LEAFHSERRS-A(A6),A1LEAFHSERRE-A(A6),A2 BSRMOUTRTS%*************************************)* IOSERR PUTS UP A MESSAGE COMPLAINING OF+*IOSERRORNUMBERANDLOGICALUNITNUMBER.'*ENTEREDWITHERRORCODEIND0ANDIOS*PARAMETERBLOCKADDRESSINA0*A0,A1,A2,D0DESTROYED.IOSERRBSRBINHASCMOVE.WD1,IOSERRS-A(A6)MOVE.B5(A0),IOSERLUN-A(A6)ADD.B#$30,IOSERLUN-A(A6)LEAIOSERRS-A(A6),A1LEAIOSERRE-A(A6),A2 BSRMOUTRTS%*************************************.* IOP PERFORMS I/O REQUEST FOR I/O AND PROCEED(*A0CONTAINSADDRESSOFPARAMETERBLOCK"*A1CONTAINSBUFFERSTARTADDRESS *A2CONTAINSBUFFERENDADDRESS)*STATUSBYTEOFP.B.ISFLAGGEDWITH$FF(*TOSHOWACTIVEI/O.REQUESTISIGNORED*IFI/OISALREADYACTIVE.* IOPEQU*(CMP.B#$FF,4(A0)ISI/OALREADYACTIVE?BEQ.SIOPRTSBRANCHIFYES.MOVEM.LA1/A2,12(A0)PLUGINBUFFERADDRESSES"MOVE.B#$FF,4(A0)MARKACTIVEI/OTRAP#2,BSRXFRABORTABORTONPARAMETERBLOCKERROR IOPRTSRTS%*************************************&* INPP5C PERFORMS INPUT AND PROCEED ON**LOGICALUNIT5(TERMINAL).ONECHARACTER*ISINPUTATBUFF5S.*INPUTISIMAGEMODE,NOECHOINPP5CLEABUFF5S-A(A6),A1 MOVE.LA1,A2LEAIOS5-A(A6),A03MOVE.L#$0001022A,(A0)READ,IMAGE,SVCADDR,PROCEEDBSRIOPRTS%*************************************%* INPP5 PERFORMS INPUT AND PROCEED ON.*LOGICALUNIT5(TERMINAL).BUFFERBOUNDARIES*AREBUFF5SANDBUFF5E*INPUTISFORMATTEDWITHECHOINPP5LEABUFF5S-A(A6),A1LEABUFF5E-A(A6),A2LEAIOS5-A(A6),A0-MOVE.L#$00010202,(A0)READ,SVCADDR,PROCEEDBSRIOPRTS%*************************************** INPW5 PERFORMS INPUT AND WAIT ON LOGICAL&*UNIT5(TERMINAL).BUFFERBOUNDARIES*AREBUFF5SANDBUFF5E.INPW5LEABUFF5S-A(A6),A1LEABUFF5E-A(A6),A2LEAIOS5-A(A6),A0MOVEM.LA1/A2,12(A0)MOVE.L#$00010000,(A0)"MOVE.B#$FF,4(A0)MARKACTIVEI/OTRAP#2 BSRXFRABORTRTS%*************************************%* INPP1 PERFORMS INPUT AND PROCEED ON$*LOGICALUNIT1(HOSTPORT).BUFFER"*BOUNDARIESAREBUFF1SANDBUFF1EINPP1LEABUFF1S-A(A6),A1LEABUFF1E-A(A6),A2LEAIOS1-A(A6),A0;MOVE.L#$0001022A,(A0)READ,SVCADDR,NOECHO,IMAGE,PROCEEDBSRIOPRTS%*************************************&* OUTP1 PERFROMS OUTPUT AND PROCEED ON$*LOGICALUNIT1(HOSTPORT).BUFFER**AREDEFINEDINA1/A2.THISROUTINECALLS*IOP.*OUTP1LEAIOS1-A(A6),A04MOVE.L#$0002020A,(A0)IMAGEWRITE,SVCADDR,PROCEEDBSRIOP BSRXFRABORTRTS%*************************************1* OUTW5I PERFORMS OUTPUT AND WAIT (IMAGE MODE) ON,*LOGICALUNIT5(TERMINALPORT).BOUNDARIES#*ARETBUFFORALENGTHOFTERMLGH.**OUTPUTISATTEMPTEDUNTILNOBUSYSTATUS*ISRETURNED.OUTW5ILEAIOS5W-A(A6),A0LEATBUF-A(A6),A1 MOVE.LA1,A2ADD.LTERMLGH-A(A6),A2 SUB.L#1,A2/MOVEM.LA1/A2,12(A0)MOVEINBUFFERBOUNDARIES(MOVE.L#$00020008,(A0)IMAGEWRITE,WAIT)OUTW5IAMOVE.B#$FF,4(A0)MARKACTIVEI/OTRAP#2"CMP.B#BUSY,D0SEEIFDEVICEBUSYBNE.SOUTW5IX!BSRTINYWAITWAITALITTLEWHILEBRA.SOUTW5IA OUTW5IXRTS%*************************************3* OUTP5F PERFORMS OUTPUT AND PROCEED (FORMATTED) ON,*LOGICALUNIT5(TERMINALPORT).BOUNDARIES#*ARETBUFFORALENGTHOFTERMLGH.**OUTPUTISATTEMPTEDUNTILNOBUSYSTATUS*ISRETURNED.OUTP5FLEAIOS5-A(A6),A0LEATBUF-A(A6),A1 MOVE.LA1,A2ADD.LTERMLGH-A(A6),A2 SUB.L#1,A2/MOVEM.LA1/A2,12(A0)MOVEINBUFFERBOUND/ ARIES5MOVE.L#$00020202,(A0)FORMATWRITE,SVCADDR,PROCEED)OUTP5FAMOVE.B#$FF,4(A0)MARKACTIVEI/OTRAP#2"CMP.B#BUSY,D0SEEIFDEVICEBUSYBNE.SOUTP5FX!BSRTINYWAITWAITALITTLEWHILEBRA.SOUTP5FA OUTP5FXRTS%*************************************%* OIP15 PERFORMS OUTPUT WITH INPUT ON/*LOGICALUNIT1(HOSTPORT).OUTPUTBOUNDARIES&*AREDEFINEDINIOS5PARAMETERBLOCK.(*INPUTBOUNDARIESAREBUFF1SANDBUFF1E**I/OISATTEMPTEDUNTILNOBUSYSTATUSIS$*RETURNED.THISROUTINECALLSOIP1.*;OIP15MOVE.LIOS5+12-A(A6),A1CONSTRUCTBOUNDARIESINA1/A2 MOVE.LA1,A2 BSR.SOIP1RTS%*************************************$* OIP1 PERFORMS OUTPUT WITH INPUT ON/*LOGICALUNIT1(HOSTPORT).OUTPUTBOUNDARIES*AREDEFINEDINA1/A2.(*INPUTBOUNDARIESAREBUFF1SANDBUFF1E**I/OISATTEMPTEDUNTILNOBUSYSTATUSIS *RETURNED.OIP1LEAIOS1-A(A6),A02MOVEM.LA1/A2,12(A0)SETOUTPUTBUFFERBOUNDARIESLEABUFF1S-A(A6),A1#MOVE.LA1,8(A0)INPUTBUFFERSTARTLEABUFF1E-A(A6),A2 SUB.LA1,A2 ADD.L#1,A2!MOVE.LA2,20(A0)LENGTHOFINPUT>MOVE.L#$0004062A,(A0)OUT/IN,IMAGE,SVCADDR,NOECHO,PROCEED'OIP1AMOVE.B#$FF,4(A0)MARKACTIVEI/OTRAP#2"CMP.B#BUSY,D0SEEIFDEVICEBUSY BNE.SOIP1X#BSR.STINYWAITWAITALITTLEWHILE BRA.SOIP1A OIP1XRTS%*************************************%* OIP1C PERFORMS OUTPUT WITH INPUT ON+*LOGICALUNIT1(HOSTPORT).OUTUPTISONE'*CHARACTERFROMBUFFERDEFINEDINIOS5*PARAMETERBLOCK.%*INPUTISONECHARACTERINTOBUFF1S.**I/OISATTEMPTEDUNTILNOBUSYSTATUSIS *RETURNED.OIP1CLEAIOS1-A(A6),A0MOVE.LIOS5+12-A(A6),A1 MOVE.LA1,A2ADD.LIOS5+20-A(A6),A2 SUB.L#1,A22MOVEM.LA1/A2,12(A0)SETOUTPUTBUFFERBOUNDARIESLEABUFF1S-A(A6),A1#MOVE.LA1,8(A0)INPUTBUFFERSTART!MOVE.L#1,20(A0)LENGTHOFINPUT>MOVE.L#$0004062A,(A0)OUT/IN,IMAGE,SVCADDR,NOECHO,PROCEED(OIP1CAMOVE.B#$FF,4(A0)MARKACTIVEI/OTRAP#2"CMP.B#BUSY,D0SEEIFDEVICEBUSY BNE.SOIP1CX#BSR.STINYWAITWAITALITTLEWHILE BRA.SOIP1CA OIP1CXRTS%*************************************(* TINYWAIT DOES A RELINQUISH AND RETURNSTINYWAITMOVE.L#RELINQ,D0TRAP#1RTS%*************************************)* HALT1 HALTS THE I/O IN PROGRESS ON LU 1)*EQUALCONDITIONCODESRETURNEDFORHALT+*ACTUALLYSCHEDULED,NECONDTIONCODESFOR'*HALTNOTSCHEDULED.ROUTINEWAITSFOR)*HALTSTATUSTOAPPEARINIOS1PARAMETER&*BLOCKBEFORERETURNING.IFAHALTIS**ACTUALLYEFFECTED,THEHALTSYNCCOUNTER.*WORDIMMEDITELYFOLLOWINGTHEHALTPARAMETER*BLOCKISINCREMENTED.*HALT1LEAIOS1H-A(A6),A0TRAP#2HALTTHEI/O(BNE.SHALT1RTSBRANCHIFI/ONOTHALTEDHALT1ACMP.B#$E6,IOS1+4-A(A6)+BEQ.SHALT1BBRANCHIFHALTSTATUSINP.B."BSRTINYWAITWAITFORHALTSTATUS BRA.SHALT1A5HALT1BADD.W#1,IOS1H+28-A(A6)BUMPHALTSYNCCOUNTER&CMP.LD0,D0SETEQUALCONDITIONCODES HALT1RTSRTS%*************************************)* HALT5 HALTS THE I/O IN PROGRESS ON LU 5)*EQUALCONDITIONCODESRETURNEDFORHALT+*ACTUALLYSCHEDULED,NECONDTIONCODESFOR'*HALTNOTSCHEDULED.ROUTINEWAITSFOR)*HALTSTATUSTOAPPEARINIOS5PARAMETER&*BLOCKBEFORERETURNING.IFAHALTIS**ACTUALLYEFFECTED,THEHALTSYNCCOUNTER)*WORDFOLLOWINTTHEHALTPARAMETERBLOCK*ISINCREMENTED.*HALT5LEAIOS5H-A(A6),A0TRAP#2HALTTHEI/O(BNE.SHALT5RTSBRANCHIFI/ONOTHALTEDHALT5ACMP.B#$E6,IOS5+4-A(A6)+BEQ.SHALT5BBRANCHIFHALTSTATUSINP.B."BSRTINYWAITWAITFORHALTSTATUS BRA.SHALT5A5HALT5BADD.W#1,IOS5H+28-A(A6)BUMPHALTSYNCCOUNTER&CMP.LD0,D0SETEQUALCONDITIONCODES HALT5RTSRTS%*************************************&*HLTCHKCHECKSFORAHALTEDI/O.ZERO%*CONDITIONCODESARERETURNEDIFTHE$*I/OHASHALTED,NONZEROOTHERWISE.'*THEADDRESSOFTHEHALTI/OPARAMETER$*BLOCKISPASSEDINA0.THEROUTINE+*CHECKSTHESYSCCOUNTER(WORDIMMEDIATELY(*FOLLOWINGTHEHALTPARAMETERBLOCKFOR**ZERO.IF0 ZERO,NOHALTHASBEENEFFECTED**IFNONZERO,AHALTHASBEENEFFECTEDAND.*THEROUTINEWILLDECREMENTTHESYNCCOUNTER.+HLTCHKTST.W28(A0)HASHALTBEENEFFECTED?BEQ.SHLTCHKBBRANCHIFNO$SUB.W#1,28(A0)CHECKOFFTHISHALT/CMP.LD0,D0SETEQUALCONDITIONCODESFORHALTBRA.SHLTCRTSGORETURN:HLTCHKBTST.L(A7)SETNONZEROCONDITIONCODESFORNOHALT HLTCRTSRTS%*************************************(* IOERCHK CHECKS PARAMETER BLOCK POINTED,*ATBYA0FORERROR.IFERRORTHENCOMPLAIN*WITHMESSAGE.*IOERCHKMOVE.B4(A0),D0"BEQ.SIOERRTSBRANCHFORNOERROR$MOVEM.LD0/A0,-(A7)SAVEERRORCODE!BSRIOSERRCOMPLAINOFI/OERROR'MOVEM.L(A7)+,D0/A0RESTOREERRORCODE IOERRTSRTS%*************************************** WAITDC1 WILL PUT UP A TWO CHARACTER READ$*TOTHEHOSTPORT.WHENTHEREADIS+*SATISFIEDTHEROUTINEPERFORMSANRTS.IF-*THEREADISNOTSATISFIED,THEROUTINEWILL0*RTSAFTERTWOSECONDS.THEPURPOSEISTODELAY4*UNTILRECEIPTOFADC1INDICATINGLINETURNAROUND.5*THETWOCHARACTERSREADSHOULDBEALINEFEED($0A) *FOLLOWEDBYACARRIAGERETURN.* WAITDC1EQU*MOVE.L#10,D1LOOPCOUNT+LEAWAITDRTN-A(A6),A0EVENTRETURNADDRESSMOVE.LIOS1+24-A(A6),-(A7)5MOVE.LA0,IOS1+24-A(A6)SETNEWEVENTRETURNADDRESSLEABUFF1S-A(A6),A1 MOVE.LA1,A2*ADD.L#1,A2SETUPFORTWOCHARACTERREADLEAIOS1-A(A6),A0;MOVE.L#$0001022A,(A0)READ,SVCADDR,NOECHO,IMAGE,PROCEEDBSRIOPMOVE.L(A7)+,IOS1+24-A(A6)0WAITD05CMP.B#$FF,IOS1+4-A(A6)ISTHEI/ODONE?BNE.SWAITDRTSBRANCHIFYES(SUB.L#1,D1NO-DECREMENTWAITCOUNTER1BMI.SWAITD08BRANCHIFWE'VEWAITEDLONGENOUGH&MOVE.L#DELAY,D0WAITFOR2/10SECONDMOVE.L#200,A0TRAP#1-BRA.SWAITD05GOBACKANDCHECKFORI/ODONE*WAITD08BSRHALT1HALTTHEI/O'BNE.SWAITDRTSBRANCHIFNOI/OHALTED,SUB.W#1,IOS1H+28-A(A6)ADJUSTSYNCCOUNTER* WAITDRTSRTS*!WAITDRTNBSRASQREADDUMMYRETURN+MOVE.L#WTEVNT,D0JUSTREADEVENTANDWAITTRAP#1%*************************************-* EDITMOV1 MOVES DATA THAT HAS JUST BEEN READ0*FROMTHEHOSTINTOAWORKINGBUFFERPOINTEDAT)*BYA3.PARITYBIT(BIT7)ISMASKEDOFF*THENUMBEROFCHARACTERS%*ACTUALLYMOVEDISSAVEDINTERMLGH.4*ONLYDATAINTHERANGE$20-$7EINCLUSIVEISMOVED.0*IFACARRIAGERETURNISENCOUNTEREDBEFOREANY7*OTHERDATA,ABLANKISMOVEDINPLACEOFTHECARRIAGE:8 EN?#>4*RETURN.IFALINEFEEDISENCOUNTEREDINTHEDATA,3*ALLMOVEMENTUPTOANDINCLUDINGTHELINEFEEDIS5*SCRUBBEDANDONLYTHEPORTIONOFTHELINEFOLLOWING2*ISMOVED.THEBUFFERBOUNDARIESFOREDITMOV1ARE(*IMPLIEDFROMTHEIOS1PARAMETERBLOCK.*EDITMOV1EQU*MOVEM.LA1-A4/D0,-(A7)0MOVE.LIOS1+12-A(A6),A1STARTADDRESSFROMHOST MOVE.LA1,A2ADD.LIOS1+20-A(A6),A2SUB.L#1,A2ENDADDRESSINA2 MOVE.LA3,A4EDMV2CMP.LA2,A1"BHI.SEDMV4BRANCHIFDONEMOVING%MOVE.B(A1)+,D0CHARACTERTOEXAMINE"AND.B#$7F,D0MASKOFFPARITYBIT CMP.LA3,A4.BNE.SEDMV3BRANCHIFATLEASTONECHARMOVED)CMP.B#$0D,D0ISTHISACARRIAGERETURN?BNE.SEDMV3BRANCHIFNO4MOVE.B#$20,D0SUBSTITUTEBLANKFORCARRIAGERETURN$BRA.SEDMV5FORCEMOVEMENTOFBLANK&EDMV3CMP.B#$0A,D0ISITALINEFEED?+BNE.SEDMV8BRANCHIFNO-NORMALMOVEMENT'MOVE.LA4,A3RESETDESTINATIONPOINTER(BRAEDMV2CONTINUEWITHNORMALMOVEMENTEDMV8CMP.B#$20,D0 BLO.SEDMV2BRANCHONNON-ASCIICMP.B#$7F,D0BHS.SEDMV2BRANCHNONASCII-EDMV5MOVE.BD0,(A3)+MOVEINASCIICHARACTER BRA.SEDMV2*EDMV4SUB.LA4,A38MOVE.LA3,TERMLGH-A(A6)SAVENUMBEROFCHARACTERSMOVEDMOVEM.L(A7)+,A1-A4/D0RTS%**************************0 ***********-* EDITMOV2 MOVES DATA THAT HAS JUST BEEN READ0*VIAIOS4PARAMETERBLOCKTOALOCATIONPOINTED/*TOBYA3.NUMBEROFCHARACTERSACTUALLYMOVED2*ISRETURNEDINTERMLGH.THEDATAISEDITEDASIT/*ISMOVEDINTHEFOLLOWINGWAY:ALLCHARACTERS/*THATDONOTFALLINTHECODERANGEOF$20-$7E0*INCLUSIVE(NONPRINTABLEASCIICHARACTERS)ARE,*CONVERTEDTOBLANK(CODE$20).INADDITION3*IFCOMOPTCONTAINSA'B'(OBTAINEDFROMPREAMBLE)5*ANYLOWERCASELETTERSARECONVERTEDTOUPPERCASE.3*CHARACTERCOMPRESSIONPACKETISMOVEDINPLACEOF0*ANYREPETITIONOF4ORMORELIKECHARACTERSIS#*REPLACEDBYACOMPRESSIONPACKET.*EDITMOV2MOVEM.LA1-A4,-(A7)*MOVE.LIOS4+12-A(A6),A1MOVEFROMADDRESS MOVE.LA1,A2ADD.LIOS4+20-A(A6),A2SUB.L#1,A2ENDADDRESSINA2 MOVE.LA3,A4EDMV222CMP.LA2,A1$BHI.SEDMV299BRANCHIFDONEMOVING*BSR.SGETCGETNEXTCHARACTER+MOVE.BD0,D2SAVECHARACTERFORCOMPARISON*MOVE.L#1,D3COUNTOFMATCHINGCHARACTERS*-EDMV250CMP.LA2,A1HAVEWEFETCHEDTHELAST?BHI.SEDMV262BRANCHIFYES CMP.L#35,D34BEQ.SEDMV262BRANCHONMAXSIZECOMPRESSIONPACKET BSR.SGETC CMP.BD0,D2+BNE.SEDMV260BRANCHONNOCHARACTERMATCH.ADD.L#1,D3BUMPCOUNTOFMATCHINGCHARACTERSBRA.SEDMV250*7EDMV260SUB.L#1,A1POINTA1TONEXTCHARACTERTOFETCH4EDMV262CMP.L#3,D3DOWENEEDACOMPRESSIONPACKET?BHI.SEDMV268BRANCHIFYESCMP.B#'|',D25BEQ.SEDMV268'|'ALWAYSREQUIRESCOMPRESSIONPACKET*?EDMV264MOVE.BD2,(A3)+NOCOMPRESSIONSOPLUGINRAWCHARACTER SUB.L#1,D3BNE.SEDMV264KEEPPLUGGINGBRA.SEDMV222*6EDMV268MOVE.B#'|',(A3)+PLUGINCOMPRESSIONSENTINEL-MOVE.BD2,(A3)+PLUGINCOMPRESSEDCHARACTER.ADD.B#'0',D3CONVERTD3TOASCIILENGTHCODECMP.B#'9',D3'BLS.SEDMV272BRANCHIFINRANGE0-9-ADD.B#7,D3CONVERTINRANGE10-35(A-Z)+EDMV272MOVE.BD3,(A3)+PLUGINLENGTHCODEBRA.SEDMV222*EDMV299SUB.LA4,A38MOVE.LA3,TERMLGH-A(A6)SAVENUMBEROFCHARACTERSMOVEDMOVEM.L(A7)+,A1-A4RTS**GETCMOVE.B(A1)+,D0CHARACTERINQUESTIONCMP.B#'',D0+BLO.SGETC23BRANCHIFNOTPRINTABLEASCIICMP.B#$7F,D0'BLO.SGETC24BRANCHIFPRINTABLEASCII3GETC23MOVE.B#'',D0CHANGENONPRINTABLETOBLANK#BRA.SGETCRTSGOPLUGINCHARACTER5GETC24CMP.B#'B',COMOPT-A(A6)ISTHE'B'COMOPTSET?BNE.SGETCRTSBRANCHIFNOCMP.B#'a',D0'BLO.SGETCRTSBRANCHIFNOTLOWERCASECMP.B#'z',D0'BHI.SGETCRTSBRANCHIFNOTLOWERCASE#AND.B#$DF,D0CHANGETOUPPERCASE GETCRTSRTS%************************************** READ EVENT INTO ASQBUFF* ASQREADEQU*LEAASQBUFF-A(A6),A0MOVE.L#RDEVNT,D0TRAP#1(BSRXFRABORTABORTONBADREADOFEVENTRTS%*************************************** MESSAGE OUTPUT ROUTINE TO LOGICAL UNIT 6)*OUTPUTISFORMATTED.MESSAGEBOUNDARIES*AREPOINTEDTOBYA1ANDA2.* MSGOUTEQU*LEAIOS6-A(A6),A0/MOVEM.LA1/A2,12(A0)PLUGINBUFFERBOUNDARIES0MOVE.L#$00020000,(A0)PLUGINFUNCTION/OPTIONS)MSGOUT2MOVE.B#$FF,4(A0)MARKACTIVEI/OTRAP#2CMP.B#BUSY,D0BNE.SMSGOUTX BSRTINYWAITBRA.SMSGOUT2 MSGOUTXRTS%*************************************'* LF6 HALTS ANY I/O ON LU 5 AND OUTPUTS$*TWOLINEFEEDSTOLU6(TERMINAL).*ANYHALTEDI/OISREISSUED.*LF6BSRHALT5HALTI/OON5'BEQ.SLF6DBRANCHIFI/OREALLYHALTED!BSR.SLFITI/ONOTREALLYHALTED BRA.SLF6RTS*LF6DBSR.SLFITLEAIOS5-A(A6),A0%MOVE.B#$FF,4(A0)MARKASACTIVEI/OTRAP#2REISSUEPREVIOUSI/O LF6RTSRTS* LFSDC.B'' LFEEQU*-1*LFITLEALFS-A(A6),A1LEALFE-A(A6),A2!BSRMSGOUTOUTPUTTWOLINEFEEDS BSRMSGOUTRTS%*************************************H* BINARY TO ASCII ROUTINE TAKES LOW ORDER BYTE OF DO, CONVERTS IT TO HEX *ASCIIINLOWORDERWORDOFD1.*BINHASCCLR.LD1 MOVE.BD0,D1 ROR.L#4,D1ADD.B#'0',D1CMP.B#'9',D1 BLE.SBIN2ADD.B#'A'-'9'-1,D1BIN2LSL.W#4,D1 ROL.L#4,D1ADD1 .B#'0',D1CMP.B#'9',D1 BLE.SBIN4ADD.B#'A'-'9'-1,D1BIN4RTS%*************************************<* ASCDBIN CONVERTS ASCII DECIMAL TO BINARY. INPUT POINTED AT/*BYA1,NUMBEROFCHARSIND1.RESULTRETURNED1*IND0.LEADINGBLANKSTREATEDASLEADINGZEROS./*SCANTERMINATESATENDOFFIELDORUPONFIRST.*NONNUMERICCHARACTERENCOUNTEREDAFTERFIRST*NUMERICCHARACTER. ASCDBINEQU*CLR.LD0RETURNVALUEASCDB2BSR.SASCDB200BRA.SASCDB12BRANCHONNON-NUMERIC&NON-BLANKBRA.SASCDB2BRANCHONBLANKASCDB4MOVE.LD0,-(A7) LSL.L#3,D0ADD.L(A7),D0ADD.L(A7)+,D0*10ADD.LD2,D0ADDINNEWDIGITBSR.SASCDB200BRA.SASCDB12BRANCHONNON-NUMERIC&NON-BLANKBRA.SASCDB12BRANCHONBLANKBRA.SASCDB4BRANCHONNUMERICASCDB12RTSMAINRETURNASCDB20SUB.L#1,D1,BPL.SASCDB22BRANCHIFNOTDONEWITHFIELD6LEA4(A7),A7BYPASSRETURNADDRESSONDONEWITHFIELD(BRA.SASCDB12DONEWITHFIELDSORETURNASCDB22CLR.LD2#CMP.B#'',(A1)CLASSIFYCHARACTERBEQ.SASCDB24BRANCHONBLANKCMP.B#'0',(A1)$BLO.SASCDB30BRANCHONNON-NUMERICCMP.B#'9',(A1)$BHI.SASCDB30BRANCHONNON-NUMERICADD.L#2,(A7)ASCDB24ADD.L#2,(A7)"ASCDB30MOVE.B(A1)+,D2ADVANCEA1SUB.B#'0',D2BINARYTOD2RTS%*************************************8*ASCHBINCONVERTSASCIIHEXTOBINARY.INPUTPOINTEDAT/*BYA1,NUMBEROFCHARSIND1.RESULTRETURNED1*IND0.LEADINGBLANKSTREATEDASLEADINGZEROS./*SCANTERMINATESATENDOFFIELDORUPONFIRST3*NONHEXNUMERICCHARACTERENCOUNTEREDAFTERFIRST*HEXNUMERICCHARACTER ASCHBINEQU*CLR.LD0RETURNVALUEASCHB2BSR.SASCHB200BRA.SASCHB12BRANCHONNON-NUMERIC&NON-BLANKBRA.SASCHB2BRANCHONBLANKASCHB4LSL.L#4,D0*16ADD.BD2,D0ADDINNEWDIGITBSR.SASCHB200BRA.SASCHB12BRANCHONNON-NUMERIC&NON-BLANKBRA.SASCHB12BRANCHONBLANKBRA.SASCHB4BRANCHONNUMERICASCHB12RTSMAINRETURNASCHB20SUB.L#1,D1,BPL.SASCHB22BRANCHIFNOTDONEWITHFIELD6LEA4(A7),A7BYPASSRETURNADDRESSONDONEWITHFIELD(BRA.SASCHB12DONEWITHFIELDSORETURNASCHB22CLR.LD2#CMP.B#'',(A1)CLASSIFYCHARACTERBEQ.SASCHB24BRANCHONBLANKCMP.B#'0',(A1)$BLO.SASCHB30BRANCHONNON-NUMERICCMP.B#'9',(A1) BLS.SASCHB23BRANCHIFNUMERICCMP.B#'A',(A1) BLO.SASCHB30BRANCHIFNOTHEXCMP.B#'F',(A1) BHI.SASCHB30BRANCHIFNOTHEXSUB.B#7,D2CORRECTIONFORA-FASCHB23ADD.L#2,(A7)ASCHB24ADD.L#2,(A7)!ASCHB30ADD.B(A1)+,D2ADVANCEA1SUB.B#'0',D2BINARYTOD2RTS$************************************+*32BITBINARYTODECIMALASCIISUBROUTINE*,*CONVERTSBINARYIND0ANDPUTSASCIIDIGIT(*CHARACTERSATADDRESSSPECIFIEDINA0.(*LEADINGZEROSARECONVERTEDTOSPACES.+*THEFIELDLENGTH(NO.CHARS)ISSPECIFIED *IND1INTHECALLINGSEQUENCE.**CALLINGSEQUENCE:!*MOVE.L,D0*MOVE.L,D11*MOVE.L,A0 *BSRBINDASC* *RETURNS:*D0=0=>GOODCONVERSION**REGSUSED:01234567 *D*PP*APP*****!BINDASCMOVEM.LD1/D2/A0/A1,-(A7)MOVE.L#8,D2MAXNO.DIGITSSUB.LD1,D2NO.DIGITSTOSKIP!BMI.SBINDASC5BRANCHERROREXITLSL.L#2,D2DOUBLEWORDLENGTH!LEATENS-A(A6),A1STARTOFTABLE"ADD.LD2,A1ADJUSTFORDIFFERENCE&MOVE.W#'',D2INITIALIZEACCUMULATOR%BINDASC1SUB.L(A1),D0SUBTRACT10**NBCS.SBINDASC2BRANCHTOOBIG*ADD.W#1,D2INCREMENTCURRENTDIGITCOUNTBRABINDASC1CONTINUE)BINDASC2ADD.L(A1)+,D0RESTORE,ADVPNTRTST.L(A1)TESTDONEBEQ.SBINDASC4BRANCHDONE CMP.W#'',D2LEADINGZEROTEST!BEQ.SBINDASC3BRANCHSTILLZERO#ADD.B#$10,D2BRINGTOASCIIDIGIT%BINDASC3MOVE.BD2,(A0)+DEPOSITCHARLSL#8,D2SAVECHARDEPOSITED#MOVE.B#$20,D2RESTORELSTOSPACEBRABINDASC1CONTINUE4BINDASC4ADD.B#$10,D2LASTONEBECOMESDIGITALWAYS"MOVE.BD2,(A0)+DEPOSITLASTCHAR'TST.LD0SETCONDITIONCODE,01 IFGOOD"BINDASC5MOVEM.L(A7)+,D1/D2/A0/A1RTS*7TENSDC.L10000000,1000000,100000,10000,1000,100,10,1,0%*************************************$*XFRABORTTESTSCONDITIONCODES.IF"*EQUAL,RTSISMADE.IFNOTEQUAL"*BSRADDRESSFROMSTACKISPLACED&*INTOA0ANDSELFABORTISPERFORMED.,* XABORT ENTRY POINT UNCONDITIONALLY ABORTS.*XFRABORTBEQ.SABORTS)XABORTMOVE.LD0,-(A7)SAVED0FORALOOKMOVE.L#ABORT,D0TRAP#1 ABORTSRTS*PATCHDS.B50PATCHAREAENDXFR=/*=/*FILE:TRANSFER.AF=/*-=/*AssemblychainfileforTRANSFERutility.?=/*Theassociatedsupportprogramslistedbelowhavetheirown=/*assembly/compilationfiles=/*=/*DLOAD(Pascal)DLOAD.PF=/*ULOAD(Pascal)ULOAD.PF=/*BREAK(Assembly)BREAK.AF=/*.=/*DefaultlistingoutputfileisTRANSFER.LS=/*=/IFC\1=ARG TRANSFER.LS=/ENDIF=/*-=/*PARAMETER1\1=Listingoutputfile/device=/*#=/*Defaultvalueswillbeusedfor =/*Volume=/*Usernumber =/*Catalog=/*Unlessspecified=/*=ASM TRANSFER,,\1;RZ=106=/*{ Included files are:=/*--none--=/*}=END+=/*=/*FILE:TRANSFER.LF=/*-=/*LinkchainfilefortheTRANSFERutility.?=/*Theassociatedsupportprogramslistedbelowhavetheirown=/*chainlinkfiles=/*=/*DLOAD(Pascal)DLOAD.LF=/*ULOAD(Pascal)ULOAD.LF=/*BREAK(Assembly)BREAK.LF=/*.=/*DefaultlistingoutputfileisTRANSFER.LL=/*=/IFC\1=ARG TRANSFER.LL=/ENDIF=/*.=/*PARAMETER01\1=Listingoutputfile/device=/*=LINK ,TRANSFER,\1;HAMIX ATTRIBUTES PSEG SEG0:0,14 $0INPUT TRANSFERLIB 0..UTILIB.ROEND=END2 4$PROGRAM UPLOAD(INPUT,OUTPUT,OUTFIL); E(*******************************************************************)C(*THISPROGRAMREADSPACKEDBLOCKSFROMTHETERMINAL,SEPARATES*)?(*INDIVUDUALRECORDSANDWRITESTHEMTOANOUTPUTFILE.THE*))(*PROGRAMRUNSONANEXORMACSSYSTEM.*)E(*******************************************************************) "CONSTCMAX=132;(*BLOCKSIZE*)&RMAX=132;(*MAXIMUMRECORDSIZE*)5BLKCNT=1;(*NUMBEROFBLOCKSUNDERONECHECKSUM*),BMAX=132;(*BUFFERSIZE=BLKCNT*CMAX*)/OPTION='AA';(*COM/CHARPROTOCOLOPTIONS*),CHRMAX=127;(*MAXIMUMCHARACTERVALUE*) TYPECINDEX=0..255;$RECTYPE=ARRAY(.1..RMAX.)OFCHAR;*BFTYPE=PACKEDARRAY(.1..BMAX.)OFCHAR;BFINDEX=INTEGER;*BKTYPE=PACKEDARRAY(.1..CMAX.)OFCHAR; VARQ:BOOLEAN; OUTFIL:TEXT;(*OUTPUTFILE*)DASCII:PACKEDARRAY(.CHAR.)OFCINDEX;(*ASCIICHARACTERCODES*)@ASHEX:PACKEDARRAY(.1..36.)OFCHAR;(*FORHEXCONVERSION*)=BF+J7N.RENUM:PACKEDARRAY(.CHAR.)OFCINDEX;(*ACCII-DECIMALCONVERSION*))REC:RECTYPE;(*HOLDSOUTPUTRECORD*)1BUFFP:BFINDEX;(*INDEXINTOHOLDINGBUFFER*)$BUFF:BFTYPE;(*HOLDINGBUFFER*)3COUNT:INTEGER;(*HOLDSCHARCOUNTFORRECORD*)/RESPONSE:CHAR;(*HOLDSRESPONSECHARACTER*)4BCNT:INTEGER;(*NUMBEROFREPEATEDCHARACTERS*)&BCHR:CHAR;(*REPEATEDCHARACTER*) PROCEDUREINITIALIZE;0TYPECHRARRAY=PACKEDARRAY(.1..16.)OFCHAR;VARI:INTEGER; C:CHAR; 2PROCEDUREASGCODE(CODE:INTEGER;CHRSET:CHRARRAY);VARI:INTEGER;BEGIN(*ASGCODE*)FORI:=1TO16DO%ASCII(.CHRSET(.I.).):=CODE+I-1END;(*ASGCODE*) BEGIN(*INITIALIZE*)FORI:=0TOCHRMAXDOBEGIN9ASCII(.CHR(I).):=0;(*INDICATENON-ASCIICHARCTERS*)NUM(.CHR(I).):=0END;REWRITE(OUTFIL);1ASHEX:='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';!ASGCODE(112,'pqrstuvwxyz{|}~');!ASGCODE(32,'!"#$%&''()*+,-./'); ASGCODE(48,'0123456789:;<=>?'); ASGCODE(64,'@ABCDEFGHIJKLMNO'); ASGCODE(80,'PQRSTUVWXYZ[\]^_'); ASGCODE(96,'`abcdefghijklmno');FORI:=1TO36DONUM(.ASHEX(.I.).):=I-1;BUFFP:=BLKCNT*CMAX+1;BUFF(.3.):='A';/WRITE(OUTPUT,'PREAMBLEU');(*SENDPREAMBLE*)(WRITE(OUTPUT,OPTION);(*SENDOPTION*),WRITE(OUTPUT,CMAX:3);(*SENDBLOCKSIZE*)1WRITELN(OUTPUT,BLKCNT:1);(*SENDBLOCKCOUNT*)RESPONSE:='';END;(*INITIALIZE*)  .PROCEDURE GETREC(VAR Q:BOOLEAN; VA2 R P:BFINDEX;6VARBUFF:BFTYPE;VARREC:RECTYPE;VARRESPONSE:CHAR); VARI,J:INTEGER;C1,C2:CHAR; GPROCEDUREGETFRAME(VARBUFF:BFTYPE;VARQ:BOOLEAN;VARRESPONSE:CHAR);  VARI:INTEGER; J:INTEGER; K:INTEGER;CKSUM1:INTEGER;CKSUM2:INTEGER;TBLOCK:BKTYPE; BEGIN(*GETFRAME*) IFBUFF(.3.)='Z'THEN Q:=TRUE; IFNOTQTHENREPEATI:=1;J:=1;IFRESPONSE<>'';THENWRITELN(OUTPUT,RESPONSE);(*RESPONDTOLASTFRAME*)WHILEJ<=BLKCNTDOBEGINREADLN(INPUT,TBLOCK); J:=J+1;FORK:=1TOCMAXDOBEGINBUFF(.I.):=TBLOCK(.K.); I:=I+1;END;IFBUFF(.1.)='T'THEN*J:=BLKCNT+1;(*FORCEDTERMINATION*)END;Q:=BUFF(.1.)='T'; IFNOTQTHENBEGINRESPONSE:='N';2CKSUM1:=16*NUM(.BUFF(.1.).)+NUM(.BUFF(.2.).);IFCKSUM1<>0THENBEGIN CKSUM2:=0;FORI:=3TOBLKCNT*CMAXDO%CKSUM2:=CKSUM2+ASCII(.BUFF(.I.).); CKSUM2:=(CKSUM2MOD255)+1;IFCKSUM1<>CKSUM2THENRESPONSE:='R'(*NAK*)END;(*THEN*) END(*THEN*)UNTIL(RESPONSE='N')OR(Q)END;(*GETFRAME*)  ;PROCEDUREGETC(VARC:CHAR;VARBUFF:BFTYPE;VARP:BFINDEX;VARQ:BOOLEAN); BEGIN(*GETC*)IFP<=BLKCNT*CMAXTHENBEGINC:=BUFF(.P.); P:=P+1ENDELSEBEGINGETFRAME(BUFF,Q,RESPONSE);C:=BUFF(.4.);P:=5ENDEND;(*GETC*)  BEGIN(*GETREC*)2GETC(C1,BUFF,P,Q);(*DIGIT#1OFLENGTHFIELD*)2GETC(C2,BUFF,P,Q);(*DIGIT#2OFLENGTHFIELD*)IFC1=''THENQ:=TRUE; IFNOTQTHENBEGIN#COUNT:=NUM(.C1.)*16+NUM(.C2.);J:=1;I:=1;WHILEI<=COUNTDOBEGINGETC(REC(.J.),BUFF,P,Q);IFREC(.J.)='|'THENBEGIN4GETC(BCHR,BUFF,P,Q);(*GETCOMPRESSEDCHARACTER*)(GETC(C1,BUFF,P,Q);(*GETCOUNTCODE*)8BCNT:=NUM(.C1.);(*COUNTOFCOMPRESSEDCHARACTERS*)WHILEBCNT>0DOBEGIN5REC(.J.):=BCHR;(*EXPANDCOMPRESSEDCHARACTERS*)BCNT:=BCNT-1; J:=J+1END;%I:=I+3(*ADVANCEGETCOUNTER*) END(*THEN*)ELSEBEGIN&I:=I+1;(*ADVANCEGETCOUNTER*)&J:=J+1;(*ADVANCEPUTPOINTER*) END(*ELSE*)END;(*WHILE*)COUNT:=J-1;END(*THEN*)END;(*GETREC*)  5PROCEDURE PUTREC(VAR COUNT:INTEGER; VAR REC:RECTYPE); VARI:INTEGER; BEGIN(*PUTREC*)I:=1;WHILEI<=COUNTDOBEGINWRITE(OUTFIL,REC(.I.)); I:=I+1END;WRITELN(OUTFIL);END;(*PUTREC*) BEGIN(*MAIN*) INITIALIZE; Q := FALSE;"GETREC(Q,BUFFP,BUFF,REC,RESPONSE);WHILE NOT Q DOBEGINPUTREC(COUNT,REC);#GETREC(Q,BUFFP,BUFF,REC,RESPONSE);END;,WRITELN(OUTPUT,'T')(*TERMINATEWITH'T'*)END.(*MAIN*)=/*=/*FILE:ULOAD.LF=/*F=/*LinkfileforULOADwhichisanassociatedsupportprogramforthe=/*TRANSFERutility.=/*=/*=/*0=/*PARAMETER01\1=Listingoutputfile/device=/*=/*DEFAULTPARAMETERSARE=/*!=/*DEFAULTPARAMETER01ULOAD.LL=/*=/*=/IFC \1 =ARG ULOAD.LL=/ENDIF=/*=/*DEFAULTPARAMETER01=/*=LINK ,ULOAD.LO,\1;HAMIX INPUT ULOADLIB 0.&.PASVMDOS.ROLIB 0.&.PASCALIB.ROEND=END3 V=/*=/*FILE:ULOAD.PF=/*C=/*CompilationchainfileforULOADwhichisanassociatedsupport%=/*programfortheTRANSFERutility.=/*@=/*NOTE:thischainfilerequiresthepascalcompilerresideon9=/*thesystemdefault.Thecompilerisnotprovidedwith7=/*thisproduct,thereforethischainfilewillabort.=/*#=/*DefaultoutputfileisULOAD.LS=/*=/IFC \1 =ARG ULOAD.PL=/ENDIF=/*-=/*PARAMETER1\1=Listingoutputfile/device=/*#=/*Defaultvalueswillbeusedfor =/*Volume=/*Usernumber =/*Catalog=/*Unlessspecified=/*=PASCAL ULOAD,,\1=PASCAL2 ULOAD;-L=END_3  2.30 hmquy}????????   "$!&.% 02/463VE 5Motorola Pascal 2.30 ULOAD .SA 03/21/83 10:24:25E E E E E E E E E UPLOAD XQXIE E E E E E E E E E E E E E E E E E E E E E E E !E "E #E $E %E &E 'E (E )E *E + ASGCODE B)BE ,E -?= A5= AFFF4F?(,FF?lE .E /E 0 INITIALIB)B E 1E 24 ?= AFBE 3E 4= AFB4 F? (,FFE 5? qQAE 6 $B $0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZE 7QBpB pqrstuvwxyz{|}~ E 8QB B  !"#$%&'()*+,-./E 9QB0B 0123456789:;<=>?E :QB@B @ABCDEFGHIJKLMNOE ;QBPB PQRSTUVWXYZ[\]^_E <QB`B `abcdefghijklmnoE =B)B$ E >? = A5= AFF4 F? ( ,FFE ?? :BE @BAE A QAB  PREAMBLEUBE BQAB AABE CQABBE DQABBE EB E FlE GE HE IE JE KE LE ME NE OE PE QE RE SE TE UE VE WE XE YE ZE [E \ GETFRAME($5FBZE ]FBE ^E _?5FE `E ak?BE bBE cE d(S5FB QA5FBE e??(CFBE fE gmgQAAhBE h3FE iB)dBE jE k?= FF5= AgFE l3FE m4F?(,FFdE nE o?($5FBTE pBE q?E r?F$5FBTE sE t5FE uE vFBNE wO5= A5FB5= A5FE xE y(SFBE zE {BE |B)dBE }?F5= A5= FF4F?(,FFdE ~?3LFBE E (SFFE E FBRE E E ??? $5FBN(5F? ?l E E E E E E E E !GETC (#C5FBE E F 5= F5FE E F35FE $E E ?#QFFFE F 5FE E FBE ?$lE E E E %GETREC QAFF FE QAFF FE ('$FB FBE E ?'(5FE E O5= AFB5= AFE BE BE ?)(*CFF4 E E Q= FFFF FE E (+$5= FFB|E E QAFF FE QAFF FE 5= AFE ?,(-,FBE E = FFFE FE E 3F,E E ?-3FE .E E ?+3FE 3FE E ?.)E ?*FE E ?(lE E E E E E E E /PUTREC BE ?1(2CF5FE E QA5= FFBE E 3F1E ?2QAE lE E E 3UPLOAD 0QABBB0QABBBqQA0QABBBpQAQE BE QAA:AA>AE ?56FE E QAA>E QAA:AA>AE 5E E ?6QABTB QA QA QAPQA5= FFBE E 3F1E ?2QAE lE E E G1TRANSFER AMSTR' TRANSFERSA TASCII file transfer utility-2pPARSE pOPTION pEDITFILE $H3ASCII FILE TRANSFER - VERSION 2.02ASF338  HDCB@CN20F3  F3  F3F3F3TRAN K3ATRANF3COMMAND LINE ERROROPTION FIELD ERRORXX FHS ERROR, LUN =X XX IOF3S ERROR, LUN =X Oaaxa`pNAMH-HL-HbA\NCgaL3>aAaBJjC E a`HH@ @gAM aBjMF3`M~=n-n-nA NCga`AbCx!IpNAaA I3 C!INBa$nK gRaB" @gHp 5 fC E a`F3 5W_D Cfc-C-CJj`aCEaF3aNuPREAMBLE** TRANSPARENT MODE - TYPE CONTROL-A TO TEF3RMINATE PROGRAMA-HA-HA-H^CPEa:.faF3`a*ab-Op$NA.naALBhpNA.f.fa`aF3`.na6gaLg` .naAaRgA (gaR Pg|F3.g-n.g `lGaagaJg>aF3.faAL1|ppNAa`aJn.ga$`alF3`.naAagAa Pg\.f . >f` F3a:.f . >g.faa`Dfa`F3P.f`Gaa gaa `ZagagpF3 |NAaTJ.xf5 BnBn.NunnCra=@CraF3=@-@AЈS-@A4 NCaBn.g|B .UF3g^ .DgaNDOWNLOAD INITIATEDENTER RECEIVING FILE NAME ORF3 'Q' TO RESUME TRANSPARENT MODERECORD DISPLAY ONRECORD DISPLAYF3 OFFBAD CHARACTER COUNT RECEIVED EXPECTED - RETRANSMIF3TTINGBAD CHECKSUM RECEIVED EXPECTED - RETRANSMITTIF3NGDOWNLOAD TERMINATED WITH 'T' KEY-IN XXXXXX RECORDS TRANSFERREDF3DOWNLOAD COMPLETED XXXXXX RECORDS TRANSFERRED************** FORF3CING CHECKSUM MATCH **************C"E\a@a Ta g <Ta F3` aLCE!aaBA-HA4-HA n-H jAH? .F3Bfa <Na a -Op$NA.naAa LgA (ga LF3 Pg.g-n.g>Ga R .Ed F3 R`Ѯ .da `t.g .Bfa <Ta F3`T .gLrAa .Aaa,CEa j .Bfa F3p |NA<Ra a`.gvCra|J@gh?C$IUBF3BЁfB@H@R@B4@gEka N`T .rA$a a CE=a ,`2.na AF3a 4g. > Tf`8 Df2nga CpEa ta `F3a C^Ena ^a a D`|BA-HBNuL?Na4gAF3H?` g@agAH?`@Cra -@ fG nF3B$. j fdpagA H?`R |fLagA(H?`RF3@ag ABH?`~R0 c_JgS(R`(R`JF3bt -K jA!K S!K `(NBg/a a` R.F3gL a a `p`B? .ga0Nu nCɱdRF3NupNuKEY IN 'T' TO TERMINATE TRANSFER AND RESUME TRANSPARENF3T MODE 'D' TO TOGGLE THE RECORD DISPLAYa CECa pCF3DEja da NuUPLOAD INITIATEDENTER SENDING FILE NAME OR 'Q' TF3O RESUME TRANSPARENT MODENAK RECEIVED - RETRANSMITTINGUPLOAD TF3ERMINATED WITH 'T' KEY-IN XXXXXX RECORDS TRANSFERREDUPLOAD COMPLF3ETED XXXXXX RECORDS TRANSFERREDCEa aag <Tab`F3a CEa \aB. >a>A-HA-HABC nE HF3 ` AV-H|A-HB .AdlANBf0R&nF3Ta> .$a , nAT-H` g/a( ad` "F3 nC f-H|Z.f=|00`(C$IUBBF3ЁfH@R@a=AE"JS`LHAF3Sg.gapS`aS`x.naAagdAF3 (ga Pg Pg !h .fgva`(AF3Ga .BfaL .NgB .Tg:af=|00ClEa`F3aCEap |NA`-n.g .AbF3aJ gC $I SaB G-n"n  glBAF3d^ra$I-@ I  |f0  c_JgS`eصF3b-I$LSC aB `C -L av .ZfL.g" .rAF3araCE1a` .rADaPajC2E]a`.F3gAV-H`r$nACd`-I-I|A`.naF3AapgR. > Df8ngB aCpEaa`"aC^F3Enaa` Tfa~-Op$NA` REENTER FILE NAME OR 'F3Q' TO QUITFILE EXISTS - OK TO OVERWRITE(Y/N) ?affA4 @NCF3g gBaChEaa*`CEata .Y >fA4 F3NC NC NCgah`Nua\f$A4 @NCgaNChEa aF3`NuBAD FILE NAME ENTERED - REENTER NAME OR 'Q' TO QUITA4 I3NCag$IA *aNuC >E A F3aNuC >E AH |NBa8NuC vE =A *aNuF3A  araNuAC$ISH |NB faF3`NuAC$ISH |NB fa`Nu"n$IaF3NuAH C v!IE =R!J *|NB faD`NuA"nF3$ISH C v!I!| *|NB fa`NupNANuF3ANBf .ga`RnNuANBf .ga`Rn.NuJhgShF3`JNu(g H瀀aLNur A!/.-HC v$IRA *aF3-_ .fSk p |NA`a`fSnNuap$NAHx"n$IF3S(Kb0f f< ` f&L` e d`̗-KLF3NuHx"n$IS(KbJaTvb #g aBfR`S bF3 |gSf`|0 9c^`-KLNu  e e?a/<@N@@ABCDEFGHIJKLMH3 NOa/<PN@PQRSTUVWXYZ[\]^_a/<`N@`abcdefghijklmI3  noa|+|*HmN@ PREAMBLEDBgN@Hm/<AABgN@r <K3E N@rpN@N@pC(AN@N@ -N(g -T(f -T(f|F3 N^+_ NuNV m "h0)S@$h R"(h R(N^ _TN/- F3 NV+N -| n m-n n m00.S@"n2.SAF3 11f . #lR` .6  nPJoJS n 0F3 |g<-|-n`0.S@ n0a"Ri .l .ѮF3 `:Jo4<|a0.S@ n0a .RA0a .Ѯ`K3 N^+_ _NNVAN@JgAN@AN@Jf n H3@ -PB T B:AN@Jf -:RA=CAN@R:` -B)F3 f.B.J.f$J:o0-Hm:/./. H3 Hna<0.S@ nt".N@RC .RS".N@RH3( 6N^ _PNNV m "hnB-|-|`(0.S@G3 m "h1HAE 2ѮRi .l"< .N@R-@H3@ rN@RA"m $i .N@RpBB`d"< .I3  N@ R-@$.R&N@ -B`"0.S@ m "hr1AN@!RI3  i .찮lAN@Ri .lp m "h AN@N@ m F3 "h Ng Tf^ m "h TWD$h-| m "h o"F3 .S$h2.SAR` m "h "N^$_TN/- G3 NV+N n o <Aa8`AN@JgD n-P-|`0.F3 S@ n Ri .l<Za n` n o<AaI3 D N^+_ _NtrpAN@"trpAN@"AN@#trH3 pAN@"AN@B-aJ-f"Hm*Hm.arHmHm*Hm.Hm(a)3 `AN@$AN@$AN@$BgNN4]1UPLOAD PSYST' ULOAD PC$9!M68000 Pascal object from 2.30 resident compiler2h.PLJSR IINITIALI Rh.PRWT h.PSTCV h.PLDCV h.PLDCS h.PWRS h.PWRJ h.PWLN h.PWRC h.PRDV h.PRLN h.PMPJ h.PMODJ IGETREC *IPUTREC zI.PMAIN h.PIFD h.PRST h.PCLO O.PZSTART 2O.PZMAIN N)z/PܟF3 NV-|-|`&0.S@6HAA .ЮS1Ri .F3 lN^ _N/- NV+N B-|`&.H@ABp.H3D H@CBqRi .lAN@AN@$0123456789ABCDEFGHH3 IJKLMNOPQRSTUVWXYZ/<pN@pqrstuvwxyz{|}~ a/< N@ !H3 "#$%&'()*+,-./a/<0N@0123456789:;<=>?a/<@N@@AH3 BCDEFGHIJKLMNOa/<PN@PQRSTUVWXYZ[\]^_a/<`N@`aF3 bcdefghijklmnoap-|-|$`$0.A0HAC .S3H3 Ri .l+|:|AHmN@ PREAMBLEUBgN@Hm/Hma J-f&HmI3D Hm>aJHmHm:HmHm>Hma`rpTAN@N@AN@ A3D N@ AN@ BgNN4' TSO DLOAD CFDLOAD SAULOAD CFULOAD SA PROC 1 FILEALLOC DDNAME(OUTPUT) DSNAME(*)ALLOCDDNAME(INPUT)DSNAME(*)"ALLOCDDNAME(INFIL)DSNAME(&FILE.) CALL DLOADFREEALL%PROGRAM DOWNLOAD(INPUT,OUTPUT,INFIL); J(************************************************************************)D(*THISPROGRAMREADSRECORDSFROMASOURCEFILE,PACKSTHEMINTO*)D(*BLOCKSANDWRITESTHEMTOTHETERMINAL.THEPROGRAMRUNSONAN*)(*IBM370UNDERTSO.*)J(************************************************************************) 5CONSTCMAX=80;(*MAXNO.OFCHARSINONEBLOCK*),RMAX=80;(*MAXIMUMSINGLERECORDSIZE*)5BLKCNT=1;(*NUMBEROFBLOCKSUNDERONECHECKSUM*)3BMAX=162;(*BUFFERSIZE=BLKCNT*CMAX+RMAX+2*)/OPTION='BB';(*COM/CHARPROTOCOLOPTIONS*),CHRMAX=255;(*MAXIMUMCHARACTERVALUE*) TYPEBKINDEX=1..CMAX;BFINDEX=INTEGER;*BFTYPE=PACKEDARRAY(.1..BMAX.)OFCHA7 R;(RSPTYPE=PACKEDARRAY(.1..2.)OFCHAR;+RECTYPE=PACKEDARRAY(.1..RMAX.)OFCHAR; VARQ:BOOLEAN; INFIL:TEXT;(*SOURCEFILE*)>ASCII:ARRAY(.CHAR.)OFINTEGER;(*ASCIICHARACTERCODES*) %0%$?ASHEX:PACKEDARRAY(.1..36.)OFCHAR;(*FORHEXCONVERSION*)&REC:RECTYPE;(*HOLDSRAWRECORD*)/RECSIZ:INTEGER;(*HOLDSLENGTHOFRAWREC*)-BUFF:BFTYPE;(*BUFFHOLDSPACKEDBLOCK*))BUFFP:BFINDEX;(*INDEXINTOBUFFER*)*RESPONSE:RSPTYPE;(*ACKNAKRESPONSE*) PROCEDUREINITIALIZE;0TYPECHRARRAY=PACKEDARRAY(.1..16.)OFCHAR;VARI:INTEGER; 2PROCEDUREASGCODE(CODE:INTEGER;CHRSET:CHRARRAY);VARI:INTEGER;BEGIN(*ASGCODE*)FORI:=1TO16DO%ASCII(.CHRSET(.I.).):=CODE+I-1END;(*ASGCODE*) BEGIN(*INITIALIZE*)FORI:=0TOCHRMAXDO0ASCII(.CHR(I).):=32;(*FORCEASCIIBLANKS*) INTERACTIVE(INPUT);RESET(INFIL);1ASHEX:='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';!ASGCODE(112,'pqrstuvwxyz{|}~');!ASGCODE(32,'!"#$%&''()*+,-./'); ASGCODE(48,'0123456789:;<=>?'); ASGCODE(64,'@ABCDEFGHIJKLMNO'); ASGCODE(80,'PQRSTUVWXYZ[\]^_'); ASGCODE(96,'`abcdefghijklmno'); >(*#THEFOLLOWINGSTATEMENTWASREQUIREDTOALLOWDOWNLOADINGOF'~'FROMIBM*) ASCII(.CHR(95).):=126; -BUFFP:=4;(*STARTPACKINGRECORDSHERE*)REPEAT/WRITE(OUTPUT,'PREAMBLED');(*SENDPREAMBLE*)(WRITE(OUTPUT,OPTION);(*SENDOPTION*),WRITE(OUTPUT,CMAX:3);(*SENDBLOCKSIZE*)1WRITELN(OUTPUT,BLKCNT:1);(*SENDBLOCKCOUNT*)READLN(INPUT,RESPONSE);6UNTIL(RESPONSE(.1.)='N')OR(RESPONSE(.1.)='T');IFRESPONSE(.1.)='T'(THENQ:=TRUE;(*EARLYTERMINATION*)END;(*INITIALIZE*) IPROCEDURECOMPRESS(VARREC:RECTYPE;VARRECSIZ:INTEGER;VARBUFF:BFTYPE;"VARP:BFINDEX;VARCCNT:INTEGER); VARI,J:INTEGER;RECPTR:INTEGER; PROCEDURECOUT(C:CHAR);BEGIN(*COUT*)BUFF(.P.):=C; P:=P+1;CCNT:=CCNT+1END;(*COUT*) BEGIN(*COMPRESS*) RECPTR:=1;WHILERECPTR<=RECSIZDOBEGIN I:=RECPTR;FWHILE(I<=RECSIZ)AND(REC(.RECPTR.)=REC(.I.))AND(I-RECPTR<35)DO I:=I+1;5I:=I-RECPTR;(*NUMBEROFMATCHINGCHARACTERS*)/IF(I<=3)AND(I>0)AND(REC(.RECPTR.)<>'|')THENBEGINFORJ:=1TOIDOCOUT(REC(.RECPTR.));RECPTR:=RECPTR+IENDELSE IFI>0THENBEGIN COUT('|');COUT(REC(.RECPTR.));COUT(ASHEX(.I+1.));RECPTR:=RECPTR+I END(*THEN*)END(*WHILE*)END;(*COMPRESS*) 2PROCEDUREGETREC(VARP:BFINDEX;VARBUFF:BFTYPE);?VARCPOS:BFINDEX;(*POSITIONINBUFFFORCHARACTERCOUNT*)5CCNT:INTEGER;(*NUMBEROFCHARACTERSINRECORD*) Q:BOOLEAN; BEGIN(*GETREC*)#IFEOLN(INFIL)THENREADLN(INFIL);IFNOTEOF(INFIL)THENBEGIN CPOS:=P; CCNT:=0;,P:=P+2;(*LEAVEROOMFORRECORDCOUNT*) RECSIZ:=0;WHILENOTEOLN(INFIL)DOBEGINREAD(INFIL,REC(.RECSIZ+1.));RECSIZ:=RECSIZ+1;END;(*WHILE*)IFRESPONSE(.2.)='B'THENBEGIN Q:=FALSE;"WHILE(NOTQ)AND(RECSIZ>0)DOIFREC(.RECSIZ.)=''THENRECSIZ:=RECSIZ-1ELSE Q:=TRUEEND;"COMPRESS(REC,RECSIZ,BUFF,P,CCNT);FBUFF(.CPOS.):=ASHEX(.CCNTDIV16+1.);(*CONSTRUCTHEXCHARCOUNT*)*BUFF(.CPOS+1.):=ASHEX(.CCNTMOD16+1.); END(*THEN*)END;(*GETREC*) @PROCEDUREPUTREC(VARQ:BOOLEAN;VARP:BFINDEX;VARBUFF:BFTYPE;VARRESPONSE:RSPTYPE); VARI:BFINDEX; PROCEDUREOUTBLOCK(RTYPE:CHAR);VARI:INTEGER; J:INTEGER;C:INTEGER;(*CHECKSUM*) BEGIN(*OUTBLOCK*)*BUFF(.3.):=RTYPE;(*MARKBLOCKTYPE*)C:=7 0;4FORI:=3TOCMAX*BLKCNTDO(*COMPUTECHECKSUM*)BEGINIFBUFF(.I.)='^',THENBUFF(.I.):='~';(*#UNIQUETOIBM*)C:=C+ASCII(.BUFF(.I.).)END;2C:=CMOD255+1;(*0CHECKSUMISWILDCARD*)BBUFF(.1.):=ASHEX(.CDIV16+1.);(*PLACECHECKSUMINTOBLOCK*)"BUFF(.2.):=ASHEX(.CMOD16+1.);REPEATFORJ:=0TOBLKCNT-1DOBEGINBLKCNT*CMAX+1DO/OUTBLOCK('A');(*OUTPUTINTERMEDIATEBLOCK*)IFEOF(INFIL)THENBEGINFORI:=PTOBLKCNT*CMAXDO5BUFF(.I.):='';(*FORCEBLANKSTOENDOFBLOCK*)'OUTBLOCK('Z');(*OUTPUTLASTBLOCK*) Q:=TRUE;ENDELSEFIFP>BLKCNT*CMAXTHENOUTBLOCK('A')(*OUTPUTINTERMEDIATEBLOCK*)END;(*PUTREC*) BEGIN(*MAIN*) Q:=FALSE; INITIALIZE;WHILENOTQDOBEGINGETREC(BUFFP,BUFF);PUTREC(Q,BUFFP,BUFF,RESPONSE);ENDEND.(*MAIN*) PROC 1 FILE'ATTR FIL LRECL(80) BLKSIZE(80) RECFM(F)ALLOC DDNAME(OUTPUT) DSNAME(*)ALLOCDDNAME(INPUT)DSNAME(*).ALLOCDDNAME(OUTFIL)DSNAME(&FILE.)USING(FIL) CALL ULOADFREEALL$PROGRAM UPLOAD(INPUT,OUTPUT,OUTFIL); E(*******************************************************************)C(*THISPROGRAMREADSPACKEDBLOCKSFROMTHETERMINAL,SEPARATES*)?(*INDIVUDUALRECORDSANDWRITESTHEMTOANOUTPUTFILE.THE*)+(*PROGRAMRUNSONANIBM370UNDERTSO.*)E(*******************************************************************) !CONSTCMAX=80;(*BLOCKSIZE*)%RMAX=80;(*MAXIMUMRECORDSIZE*)5BLKCNT=1;(*NUMBEROFBLOCKSUNDERONECHECKSUM*)+BMAX=80;(*BUFFERSIZE=BLKCNT*CMAX*)/OPTION='BB';(*COM/CHARPROTOCOLOPTIONS*),CHRMAX=255;(*MAXIMUMCHARACTERVALUE*) TYPECINDEX=0..255;$RECTYPE=ARRAY(.1..RMAX.)OFCHAR;*BFTYPE=PACKEDARRAY(.1..BMAX.)OFCHAR;BFINDEX=INTEGER;*BKTYPE=PACKEDARRAY(.1..CMAX.)OFCHAR; VARQ:BOOLEAN; OUTFIL:TEXT;(*OUTPUTFILE*)DASCII:PACKEDARRAY(.CHAR.)OFCINDEX;(*ASCIICHARACTERCODES*)@ASHEX:PACKEDARRAY(.1..36.)OFCHAR;(*FORHEXCONVERSION*))708 ENUM:PACKEDARRAY(.CHAR.)OFCINDEX;(*ACCII-DECIMALCONVERSION*))REC:RECTYPE;(*HOLDSOUTPUTRECORD*)1BUFFP:BFINDEX;(*INDEXINTOHOLDINGBUFFER*)$BUFF:BFTYPE;(*HOLDINGBUFFER*)3COUNT:INTEGER;(*HOLDSCHARCOUNTFORRECORD*)/RESPONSE:CHAR;(*HOLDSRESPONSECHARACTER*)4BCNT:INTEGER;(*NUMBEROFREPEATEDCHARACTERS*)&BCHR:CHAR;(*REPEATEDCHARACTER*) PROCEDUREINITIALIZE;0TYPECHRARRAY=PACKEDARRAY(.1..16.)OFCHAR;VARI:INTEGER; C:CHAR; 2PROCEDUREASGCODE(CODE:INTEGER;CHRSET:CHRARRAY);VARI:INTEGER;BEGIN(*ASGCODE*)FORI:=1TO16DO%ASCII(.CHRSET(.I.).):=CODE+I-1END;(*ASGCODE*) BEGIN(*INITIALIZE*)FORI:=0TOCHRMAXDOBEGIN9ASCII(.CHR(I).):=0;(*INDICATENON-ASCIICHARCTERS*)NUM(.CHR(I).):=0END;)INTERACTIVE(INPUT);(*#UNIQUETOIBM*)REWRITE(OUTFIL);1ASHEX:='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';!ASGCODE(112,'pqrstuvwxyz{|}~');!ASGCODE(32,'!"#$%&''()*+,-./'); ASGCODE(48,'0123456789:;<=>?'); ASGCODE(64,'@ABCDEFGHIJKLMNO'); ASGCODE(80,'PQRSTUVWXYZ[\]^_'); ASGCODE(96,'`abcdefghijklmno'); <(*#THEFOLLOWINGSTATEMENTWASREQUIREDTOALLOWUPLOADINGOF'~'TOIBM*) ASCII(.CHR(95).):=126; FORI:=1TO36DONUM(.ASHEX(.I.).):=I-1;NUM(.''.):=0;BUFFP:=BLKCNT*CMAX+1;BUFF(.3.):='A';/WRITE(OUTPUT,'PREAMBLEU');(*SENDPREAMBLE*)(WRITE(OUTPUT,OPTION);(*SENDOPTION*),WRITE(OUTPUT,CMAX:3);(*SENDBLOCKSIZE*)1WRITELN(OUTPUT,BLKCNT:1);(*SENDBLOCKCOUNT*)RESPONSE:='';END;(*INITIALIZE*)  .PROCEDURE GETREC(VAR Q:BOOLEAN; VAR P:BFINDEX;6VARBUFF:BFTYPE;VARREC:RECTYPE;VARRESPONSE:CHAR); VARI,J:INTEGER;C1,C2:CHAR; GPROCEDUREGETFRAME(VARBUFF:BFTYPE;VARQ:BOOLEAN;VARRESPONSE:CHAR);  VARI:INTEGER; J:INTEGER; K:INTEGER;CKSUM1:INTEGER;CKSUM2:INTEGER;TBLOCK:BKTYPE; BEGIN(*GETFRAME*) IFBUFF(.3.)='Z'THEN Q:=TRUE; IFNOTQTHENREPEATI:=1;J:=1;IFRESPONSE<>'';THENWRITELN(OUTPUT,RESPONSE);(*RESPONDTOLASTFRAME*)WHILEJ<=BLKCNTDOBEGINREADLN(INPUT,TBLOCK); J:=J+1;FORK:=1TOCMAXDOBEGINBUFF(.I.):=TBLOCK(.K.); I:=I+1;END;IFBUFF(.1.)='T'THEN*J:=BLKCNT+1;(*FORCEDTERMINATION*)END;Q:=BUFF(.1.)='T'; IFNOTQTHENBEGINRESPONSE:='N';2CKSUM1:=16*NUM(.BUFF(.1.).)+NUM(.BUFF(.2.).);IFCKSUM1<>0THENBEGIN CKSUM2:=0;FORI:=3TOBLKCNT*CMAXDO%CKSUM2:=CKSUM2+ASCII(.BUFF(.I.).); CKSUM2:=(CKSUM2MOD255)+1;IFCKSUM1<>CKSUM2THENRESPONSE:='R'(*NAK*)END;(*THEN*) END(*THEN*)UNTIL(RESPONSE='N')OR(Q)END;(*GETFRAME*)  ;PROCEDUREGETC(VARC:CHAR;VARBUFF:BFTYPE;VARP:BFINDEX;VARQ:BOOLEAN); BEGIN(*GETC*)IFP<=BLKCNT*CMAXTHENBEGINC:=BUFF(.P.); P:=P+1ENDELSEBEGINGETFRAME(BUFF,Q,RESPONSE);C:=BUFF(.4.);P:=5ENDEND;(*GETC*)  BEGIN(*GETREC*)2GETC(C1,BUFF,P,Q);(*DIGIT#1OFLENGTHFIELD*)2GETC(C2,BUFF,P,Q);(*DIGIT#2OFLENGTHFIELD*)IFC1=''THENQ:=TRUE; IFNOTQTHENBEGIN#COUNT:=NUM(.C1.)*16+NUM(.C2.);J:=1;I:=1;WHILEI<=COUNTDOBEGINGETC(REC(.J.),BUFF,P,Q);IFREC(.J.)='|'THENBEGIN4GETC(BCHR,BUFF,P,Q);(*GETCOMPRESSEDCHARACTER*)(GETC(C1,BUFF,P,Q);(*GETCOUNTCODE*)8BCNT:=NUM(.C1.);(*COUNTOFCOMPRESSEDCHARACTERS*)WHILEBCNT>0DOBEGIN5REC(.J.):=BCHR;(*EXPANDCOMPRESSEDCHARACTERS*)BCNT:=BCNT-1; J:=J+1END;%I:=I+3(*ADVANCEGETCOUNTER*) END(*THEN*)ELSEBEGIN&I:=I+1;(*ADVANCEGETCOUNTER*)&J:=J+1;(*ADVANCEPUTPOINTER*) END(*ELSE*)END;(*WHILE*)COUNT:=J-1;END(*THEN*)END;(*GETREC*)  8 5PROCEDURE PUTREC(VAR COUNT:INTEGER; VAR REC:RECTYPE); VARI:INTEGER; BEGIN(*PUTREC*)I:=1;WHILEI<=COUNTDOBEGINWRITE(OUTFIL,REC(.I.)); I:=I+1END;WRITELN(OUTFIL);END;(*PUTREC*) BEGIN(*MAIN*) INITIALIZE; Q := FALSE;"GETREC(Q,BUFFP,BUFF,REC,RESPONSE);WHILE NOT Q DOBEGINPUTREC(COUNT,REC);#GETREC(Q,BUFFP,BUFF,REC,RESPONSE);END;,WRITELN(OUTPUT,'T')(*TERMINATEWITH'T'*)END.(*MAIN*)'  'BIOS ' BIOS SA BIOS AF  BIOS LG RMSGEN CF  SYSPAR AG / /BIOS RO P PBIOS LO YBIOS LL f fDREPL SA s s/REPL LG REPL RO INIT LO REPL LO &TTLBIOS-BASICINPUT/OUTPUTSERVICE0BIOSIDNT5,0BASICINPUT/OUTPUTSERVICE5/26/82OPTPCS,FRS,MEX*.*BIOSISABASICINPUT/OUTPUTSERVICEPROGRAM4*THISVERSIONOFBIOSMAYBERUNUSINGANEXORmacs,1*AVERSAmodule-01,AVERSAmodule-02ORAVME110.*7*BIOSUSESCONDITIONALASSEMBLYSTATEMENTSTOSEPARATE@*THEEXORmacs,VERSA-ANDVMEmoduleFUNCTIONS.THISPROGRAMMAY?*ALSOBEUSEDEITHERWITHORWITHOUTANMMU.THESEDIFFERENCES8*AREALSOSET-UPUSINGCONDITIONALASSEMBLYSTATEMENTS.5*THEREISNOMMUASSOCIATEDWITHAVERSAmodule-01,A*VERSAmodule-02ORAVME110.*5*ANYOFTHEVECTORSANDDEVICECONFIGURATIONSMAYBEB*ALTEREDORDELETED.NEWCONFIGURATIONSMAYBEADDEDATANYTIME.!*THECURRENTCONFIGURATIONSARE:*%*EXORmacsDEVICESKNOWNTOBIOSARE:*2ACIA'SFOR2CONSOLES*1PIAFORTHEPRINTER+*THESETHREEDEVICESUSEVECTOR#139($8B)*+*VERSAmodule-01DEVICESKNOWNTOBIOSARE:*2SERIALPORTSFOR2CONSOLES(*THESETWODEVICESUSEVECTOR#29($1D)!*1PARALLELPORTFORTHEPRINTER#*THISDEVICEUSESVECTOR#30($1E)*+*VERSAmodule-02DEVICESKNOWNTOBIOSARE:*2SERIALPORTSFOR2CONSOLES'*THESE2DEVICESUSEVECTOR#140($8C)*#*VME110DEVICESKNOWNTOBIOSARE:"*1ACIASERIALPORTFORCONSOLE1#*THISDEVICEUSESVECTOR#29($1D)*/*EXTERNALBOARDVME400CONNECTEDTOTHEVME110-*VIATHEI/OCHANNELHASTHESEDEVICESKNOWN *TOBIOS:*2SERIALPORTSFOR2CONSOLES&*THESE2DEVICESUSEVECTOR#26($1A)*/*EXTERNALBOARDVME410CONNECTEDTOTHEVME110-*VIATHEI/OCHANNELHASTHESEDEVICESKNOWN *TOBIOS:*2PIA'SFOR2PRINTERS&*THESE2DEVICESUSEVECTOR#25($19)*:*EACHOFTHESEDEVICESHAVEACHANNELCONTROLBLOCK(CCB)7*9 ASSOCIATEDWITHTHEMWHICHCONTAINSTHEMEMORYMAPPED8*I/OADDRESSFOREACHDEVICE,THELOGICALUNITNUMBER(S)4*ASSOCIATEDWITHEACHDEVICE,THEREAD/WRITEROUTINE5*ADDRESSES,ANDOTHERPERTINENTINFORMATION.SEETHE*CCBLAYOUTFORSPECIFICS. 8$"<*B2G:JBCJFR<Z>bQjRr6z<A<<:.<62804>635*BIOSCONTAINSANINTERRUPTSERVICEROUTINEFOREACH6*VECTORITISAWAREOF.THEACTUALI/OISDONEWITHIN!*THEINTERRUPTSERVICEROUTINES.*@*BIOSMAYBEPLACEDINAROM.ADATASEGMENTISACQUIREDATTHE<*STARTOFBIOSANDINITIALIZEDFORUSE.THEBASEADDRESSOF9*THEDATASEGMENTISKEPTINREGISTERA6DURINGALLBIOS8*PROCESSING.INTHEINTERRUPTSERVICEROUTINES,THEBASE3*ADDRESSISPASSEDINREGISTERA1ANDMOVEDTOA6. PAGE8*ANYOFTHECCB'SMAYBECHANGEDORDELETEDTOUSEBIOS8*ASACUSTOMDRIVER.THEACIAANDPIACCB'SMAYBEUSED7*WITHVERSAmodule-01WITHAVAMBOARDINSTEADOFUSING;*THEVERSAmodule-01SERIALANDPARALLELPORTS.BIOSISRUNA*COMPLETELYINANINTERRUPTDRIVENMODE.EACHDRIVERISACTUALLY8*ASUBROUTINE,CALLEDFROMTHETRAP2HANDLERROUTINEOR:*FROMTHEI/OCOMLETIONROUTINE.THEINDIVIDUALDEVICEISB*SETTOINTERRUPTMODEANDTHEDRIVERTHENRETURNSTOTHECALLER.>*THEACTUALI/OISDONEWITHINTHEINTERRUPTSERVICEROUTINES:*FORTHEDEVICES.ONEBYTEISHANDLEDATATIME.WHENTHE<*INTERRUPTSERVICEROUTINEISDONEWITHTHEI/O(I/OBUFFER=*ISEMPTYORANERRORWASDETECTED)THEISREXITSBYISSUINGA*ANEVENTTOBIOS.THISEVENTISPROCESSEDINTHEMODULEISREVT.<*COMPLETIONFLAGSARESETINTHISROUTINEANDARETURNFROM>*EVENTISISSUED.BIOSRETURNSTOTHELINEFOLLOWINGTHEWAIT<*FOREVENTDIRECTIVEAFTERANYEVENTHANDLINGISCOMPLETED.8*THISMODULEDETERMINESWHICHCCB'SHAVECOMPLETEDI/O.:*IFACOMPLETIONISFOUND,THECALLERISNOTIFIEDANDTHE=*NEXTREQUESTFORI/OISINITIATED.IFTHEREARENOREQUESTS4*QUEUEDFORTHISCCB,BIOSWAITSFORTHENEXTEVENT.**BIOSUSESTHEFOLLOWINGINTERNALTABLES:2*TRAP1PB:ACOMMONAREAFORANYTRAP1DIRECTIVESF*RTBL:REQUESTTABLE-SEETHEREQUESTTABLELAYOUTFORDOCUMENTATION8*MENU:I/OMENU-DRIVESTHEINTERRUPTSERVICEROUTINES0*RECBUF:CALLERI/OBUFFERS(USEDWITHMMUONLY)6*THESETABLESAREDOCUMENTEDINBIOSWITHTHELAYOUTS*OFTHETABLEENTRIES. PAGE*/*CONDITIONALASSEMBLYFLAGSUSEDTODIRECTTHE5*ENVIRONMENTBIOSRUNSIN.THESEFLAGSARETOBESET)*FOREACHCONFIGURATIONBIOSCANRUNIN.*D********************************************************************* *MMUFLAG*0=RUNNINGWITHNOMMU*1=RUNNINGWITHANMMU8*IFRUNNINGWITHANMMU,BIOSMUSTGETTHEMEMORYMAPPED=*I/OSPACEASASEGMENT.BIOSMUSTALSOUSEINTERNALBUFFERS4*FORTHEI/ORECORDS.WHENTHEREISNOMMU,BIOSMAY"*USETHEREQUESTOR'SI/OBUFFERS.* MMUEQU1*F***********************************************************************$*VERSAmodule-01PARALLELPORTSFLAG1*0=NOTUSINGAPARALLELPORTINAVERSAmodule-01-*1=USINGAPARALLELPORTINAVERSAmodule-017*WHENRUNNINGINAVERSAmodule-01,BIOSISAWAREOFTHE7*PARALLELPORTSASSOCIATEDWITHTHELEVEL6INTERRRUPT *AUTOVECTOR.* VMPPEQU0*H*************************************************************************"*VERSAmodule-01SERIALPORTSFLAG/*0=NOTUSINGASERIALPORTINAVERSAmodule-01)*1=USINGSERIALPORTINAVERSAmodule-017*WHENRUNNINGINAVERSAmodule-01,BIOSISAWAREOFTHE5*SERIALPORTSASSOCIATEDWITHTHELEVEL5INTERRRUPT *AUTOVECTOR.* VMSEQU0*K****************************************************************************"*VERSAmodule-02SERIALPORTSFLAG2*0=NOTUSINGTHESERIALPORTSINAVERSAmodule-02.*1=USINGTHESERIALPORTSINAVERSAmodule-027*WHENRUNNINGINAVERSAmodul9 e-02,BIOSISAWAREOFTHE;*SERIALPORTSASSOCIATEDWITHLEVEL6INTERRRUPTS&VECTOR>*#140($8C).THESEPORTSARECONFIGUREDFORASYNCHRONOUSMODE.* VM2EQU0*O******************************************************************************* PAGED**********************************************************************EXORmacsACIA-PIAFLAG*0=NOTRUNNINGINANEXORmacs*1=RUNNINGINANEXORmacs6*WHENRUNNINGINANEXORmacsTHESTANDARDI/ODEVICES6*USEDARE2ACIASFORTHETERMINALSAND1PIAFORTHE%*PRINTER,ALLUSINGVECTOR#139($8B).* EXOREQU1*D*********************************************************************'*ACIAFLAGFORTHEREAD/WRITEROUTINES'*0=NOTUSINGANACIAFORTHETERMINALS#*1=USINGANACIAFORTHETERMINALS* ACIAEQU0*A******************************************************************&*PIAFLAGFORTHEREAD/WRITEROUTINES#*0=NOTUSINGAPIAFORTHEPRINTER*1=USINGAPIAFORTHEPRINTER* PIAEQU1*B*******************************************************************6*VERSAmodule-01SERIALPORT-ASYNCHRONOUSFLAGFORTHE*READ/WRITEROUTINES<*0=NOTUSINGAVERSAmodule-01SERIALPORT-ASYNCHRONOUSMODE9*1=USINGAVERSAmodule-01SERIALPORT-ASYNCHRONOUSMODE* VMSAEQU0*D*********************************************************************5*VERSAmodule-01SERIALPORT-SYNCHRONOUSFLAGFORTHE=*READ/WRITEROUTINES.THISVERSIONOFBIOSISNOTCONFIGURED6*TOSUPPORTTHESERIALPORTSINTHESYNCHRONOUSMODE.;*0=NOTUSINGAVERSAmodule-01SERIALPORT-SYNCHRONOUSMODE8*1=USINGAVERSAmodule-01SERIALPORT-SYNCHRONOUSMODE* VMSSEQU0*G*********************************************************************** PAGEG*************************************************************************VMEmodule-VME110*0=NOTRUNNINGINAVME110*1=RUNNINGINAVME110(*WHENRUNNINGINASTANDARDVME110ONLY$*ONEACIAISUSEDFORTERMINALI/O.**IFUSINGOFF-BOARDI/ODEVICESSETFLAGS*BELOW* VME110EQU0*F***********************************************************************@*VMEmodule-VME410PIAFLAG(VME410USEDTOGETHERWITHVME110)*0=NOTUSINGOFF-BOARDPIA'S*1=USINGOFF-BOARDPIA'S* VMEPIAEQU0*F***********************************************************************;*VMEmodule-VME400SERIALPORTFLAG(VME400USEDTOGETHER,*WITHVME110).NOTICEBAUDRATEFLAGBELOW.$*0=NOTUSINGOFF-BOARDSERIALPORTS *1=USINGOFF-BOARDSERIALPORTS*VME400SPEQU0*F**********************************************************************#*VMEmodule-VME400BAUDRATEFLAG:*USINGBIOSYOUMAYCHOOSEBETWEEN16SOFTWARESELECTABLE;*BAUDRATES.BIOSDOESN'TTAKEANYNOTICEOFTHEHARDWARE,*JUMPERSELECTEDBAUDRATE.*MENU:*)*HEXVALUEBAUDRATEHEXVALUEBAUDRATE *05081800 *17592000*2110A2400*3134.5B3600*4150C4800*5300D7200*6600E9600*71200F19200* VMEBPSP2EQU$EPORT29600BAUD VMEBPSP3EQU$EPORT39600BAUD*F********************************************************************** PAGE**COMMONEQUATESUSEDBYBIOS*1TASKEQU0TASKNAMEFORTRAP#1PARAMETERBLOCKS7SESSNEQU0SESSIONNUMBERFORTRAP#1PARAMETERBLOCKS'TRAP2EQU2TRAP#USEDFORI/OSERVICE7TRAP3EQU3TRAP#USEDFORSERVICE-NOACTUALPROCESSING,ENTRYEQU10NUMBEROFREQUESTTABLEENTRIES1RECSIZEQU200MAXIMUMRECORDSIZEIFHAVEANMMUCREQU$0DCARRIAGERETURNLFEQU$0ALINEFEED4FIVEEQU5MAX#OFNORMALI/OENTRIESINMENUTABLEDELEQU$7FDELETECHARACTERBSEQU$08BACKSPACECHARACTER!CNTLSEQU$13CONTROL-SCHARACTER!CNTLXEQU$18CONTROL-XCHARACTER**EXECDIRECTIVEEQUATES*GTSEGEQU1ALLOCATEASEGMENTMOVELLEQU6MOVELOGICALABORTEQU14ABORTGTASQEQU31ALLOCATEANASQSETASQEQU33SETASQSTATUSRDEVNTEQU34READEVENTWTEVNTEQU36WAITFORANEVENTSERVEREQU: 51CLAIMINGSERVER'DERQSTEQU53SETSERVERREQUESTSTATUS!AKRQSTEQU54ACKNOWLEDGEREQUEST/CISREQU61CONFIGUREINTERRUPTSERVICEROUTINE**INTERRUPTVECTORSNUMBERS* IFEQVME1102VECTSPEQU29LEVEL5AUTOVECTOR-SERIALPORTS-VM014VECTPPEQU30LEVEL6AUTOVECTOR-PARALLELPORTS-VM01ENDC IFNEEXOR9VECTEXOREQU139ACIA-PIAVECTOR-COMPATABLEWITHEXORmacsENDC IFNEVM2(VECTVM2EQU140VECTOR-SERIALPORTS-VM02ENDC IFNEVMEPIA0V110PIAEQU25AUTOVECTOR1OFF-BOARDPIAVME110ENDCIFNEVME400SP/VECTVM2EQU26AUTOVECTOR2OFF-BOARDSPVME110ENDC IFNEVME1102VECTEXOREQU29ACIAVECTOR-COMPATIBLEWITHVME110ENDC*)*ERRORCODESRETURNEDTOTHETARGETTASK*ISTAIFEQU$82INVALIDFUNCTIONISTAILUEQU$83INVALIDLUN2ISTADDEQU$84INVALIDDATABUFFERADDRESSORSIZE/ISTATMEQU$C5INVALIDTRANSFERFORTHISDEVICEISTAFEEQU$C6FRAMINGERRORISTAIEEQU$C7INTERNALERROR ISTADNREQU$E1DEVICENOTREADYISTADOEQU$EADATAOVERRUN PAGE**SERVEREVENTCODE$07LAYOUT* OFFSET0EVLNGDS.B1EVENTLENGTHEVCODEDS.B1EVENTCODEEVTINDS.B1TRAP#!EVPRIDS.B1REQUESTOR'SPRIORITY"EVTSKDS.L1REQUESTOR'STASKNAME'EVSESDS.L1REQUESTOR'SSESSIONNUMBER%EVUNUMDS.W1REQUESTOR'SUSERNUMBER#EVD0DS.L1REQUESTOR'SREGISTERD0#EVA0DS.L1REQUESTOR'SREGISTERA0#EVSTADS.B1PARAMETERBLOCKSTATUS"EVPSIZDS.B1PARAMETERBLOCKSIZE"EVPBEQU*PARAMETERBLOCKFOLLOWSPBCODEDS.B1CODEPBFNCDS.B1FUNCTIONPBOPTSDS.W1OPTIONSPBSTADS.B1STATUSPBLUNDS.B1LUNDS.W1RESERVED!PBRRNDS.L1RANDOMRECORDNUMBER!PBSADDS.L1BUFFERSTARTADDRESSPBEADDS.L1BUFFERENDADDRESS!PBLNGDS.L1DATATRANSFERLENGTHPBCADDS.L1COMPLETIONADDRESS.IOSPBLNGEQU*-EVPBIOSPARAMETERBLOCKLENGTH EVPBLNGEQU*-EVLNGTOTALLENGTH PAGE**REQUESTTABLELAYOUT* OFFSET0BIOS05MOVE.LA0,A6SAVEANDUSEPHYSICALADDRESSOFDATAAREA*6*INITIALIZESOMEDATAA6=BASEADDRESSOFDATASEGMENT*3MOVE.L#STACK/2,D0NUMBEROFWORDSINDATASEGMENT.BIOSCLRCLR.W(A0)+CLEAROUTTHEDATASEGMENTSUB.L#1,D0DECREMENTCOUNTER(BNE.SBIOSCLRBRANCHIFNOTALLCLEARED1MOVE.W#$0A0D,LFCR(A6)LINEFEEDCARRIAGERETURN MOVE.W#'\',BKSL(A6)BACKSLASH9MOVE.L#ENTRY,ENTRIES(A6)MAXNUMBEROFSTACKEDREQUESTS(LEASTACK(A6),A7LOADTHESTACKPOINTER!IFNEMMUASSEMBLEIFHAVEANMMU*#*ATTACHTOMEMORYMAPPEDI/OSPACE*7LEATRAP1PB(A6),A0GETSEGMENTPARAMETERBLOCKADDRESS1MOVE.LA0,A1USEA1TOBUILDTHEPARAMETERBLOCKCLR.L(A1)+TASKNAME=MECLR.L(A1)+SESSION=ME6MOVE.W#SEGOPTS,(A1)+OPTIONS=MEMORYMAPPEDI/OSPACE0MOVE.W#SEGATR,(A1)+ATTRIBUTES=PHYSICALMEMORY"MOVE.L#'SHRS',(A1)+SEGMENTNAME%MOVE.L#SEGADR,(A1)+SEGMENTADDRESS#MOVE.L#SEGLNG,(A1)SEGMENTLENGTH'MOVE.L#GTSEG,D0GETSEGMENTDIRECTIVE%TRAP#1CALLEXECTODOTHEALLOCATE(BNEGTSEGERRGOABORTIFANERROR-FATALENDC***ALLOCATEANASYNCHRONOUSSERVICEROUTINE,*TOBEUSEDFORTRAP#2ANDTRAP#3SERVICE*8LEATRAP1PB(A6),A0ALLOCATEASQPARAMETERBLOCKADDRESS1MOVE.LA0,A1USEA1TOBUILDTHEPARAMETERBLOCKCLR.L(A1)+TASK=MECLR.L(A1)+SESSION=MEMOVE.B#ASQSTAT,(A1)+STATUS-MOVE.B#EVPBLNG,(A1)+MAXIMUNMESSAGELENGTH MOVE.L#ASQLNG,(A1)+ASQLENGTH0MOVE.L#ISREVT,(A1)+ASRADDRESS-FORISRRETURNCLR.L(A1)NOTUSED(MOVE.L#GTASQ,D0ALLOCATEASQDIRECTIVE%TRAP#1CALLEXECTODOTHEALLOCATE(BNEGTASQERRGOABORTIFANERROR-FATAL**CLAIMTRAP#2FORSERVICE(*USERI/OCALLSUSETRAP#2FORSERVICE*MOVE.W#V110PIA,(A1)+VECTORNUMBERUSEDFORTHEPIA'SVME1109MOVE.L#EXORISR,(A1)+INTERRRUPTSERVICEROUTINEADDRESS-MOVE.LA6,(A1)PASSTHEDATASEGMENTADDRESSMOVE.L#CISR,D0CISRDIRECTIVE#TRAP#1CALLEXECTODOTHESET-UP(BNECISREXERGOABORTIFANERRORFATALENDC IFNE(PIA+VMEPIA) **BUILDTHEPIACCB*%MOVE.LA5,A0USEA0TOBUILDTHECCB&MOVE.L#PIACNT,D0NUMBEROFPIACCB'S%MOVE.L#'PIA',(A0)+I/ODEVICENAME.MOVE.L#PIAP1,(A0)+MEMORYMAPPEDI/OADDRESSMOVE.B#PIARL,(A0)+READLUNMOVE.B#PIAWL1,(A0)+WRITELUN.BIOS25CLR.L(A0)+REQUESTTABLEENTRYADDRESS1MOVE.L#ISTATM,(A0)+READROUTINEADDRESS-INVAID,MOVE.L#PIAWRIT,(A0)+WRITEROUTINEADDRESS;MOVE.L#ISTATM,(A0)+OUTPUTWITHINPUTROUTINEADR-INVALIDCLR.L(A0)+MENUADDRESSCLR.L(A0)+SAVEAREA)MOVE.B#-1,(A0)+NOINTERRUPTBITNUMBERCLR.B(A0)+FLAGSCLR.W(A0)+FLAGS)MOVE.LA0,A5SAVETHEADRESSTONEXTCCB IFNEVMEPIAIFVMEPIATHENSUB.L#1,D0DECREMENTCOUNTER+BLE.SBIOS30BRANCHIFDONEWITHPIACCB'S%MOVE.L#'PIA',(A0)+I/ODEVICETYPE.MOVE.L#PIAP2,(A0)+MEMORYMAPPEDI/OADDRESSMOVE.B#PIARL,(A0)+READLUNMOVE.B#PIAWL2,(A0)+WRITELUNBRA.SBIOS25CONTINUEBUILDINGBIOS30EQU*JUNCTIONAHEADENDC IFNEVMEPIA*3*INITIALIZETHEFIRSTPIAONEXTERNALBOARDVME410*MOVE.L#PIAP1,A3PIA1ADDRESSCLR.BD0CLEARFORUSE&MOVE.BD0,2(A3)SELECTDDRFORA-SIDE&MOVE.BD0,6(A3)SELECTDDRFORB-SIDEMOVE.B#$FF,(A3)A-SIDE=OUTPUT'MOVE.B#$80,4(A3)B-SIDE=INPUT(STATUS)MOVE.B#$04,D0SET-UPFORUSE2MOVE.BD0,2(A3)SELECTPERIPHERALDATAREGA-SIDE MOVE.B(A3),D1STROBETOSETIT2MOVE.BD0,6(A3)< SELECTPERIPHERALDATAREGB-SIDE!MOVE.B4(A3),D1STROBETOSETIT3MOVE.B#$2E,2(A3)SETA-SIDEFORNOINTERRUPTSNOW3MOVE.B#$3C,6(A3)SETB-SIDEFORNOINTERRUPTSNOW!BCLR.B#7,4(A3)CLEARFAILLIGHTMOVE.L#PIAP2,A3PIAP2ADDRESS)BRA.SBIOS31BRANCHANDINITIALIZEPIA2ENDC*5*INITIALIZETHEEXORmacsPIAORSECONDPIAONVME410*MOVE.L#PIAP1,A3PIA1ADDRESSBIOS31CLR.BD0CLEARFORUSE&MOVE.BD0,2(A3)SELECTDDRFORA-SIDE&MOVE.BD0,6(A3)SELECTDDRFORB-SIDEMOVE.B#$FF,(A3)A-SIDE=OUTPUT%MOVE.BD0,4(A3)B-SIDE=INPUT(STATUS)MOVE.B#$04,D0SET-UPFORUSE7MOVE.BD0,2(A3)SELECTPERIPHERALDATAREGISTERA-SIDE MOVE.B(A3),D1STROBETOSETIT7MOVE.BD0,6(A3)SELECTPERIPHERALDATAREGISTERB-SIDE!MOVE.B4(A3),D1STROBETOSETIT3MOVE.B#$2E,2(A3)SETA-SIDEFORNOINTERRUPTSNOW3MOVE.B#$3C,6(A3)SETB-SIDEFORNOINTERRUPTSNOWENDC IFEQEXOR3CLR.LD7SAVETHEBIT#'SFORVM01STATUSREGISTERENDC1IFNEVMSASSEMBLEIFVERSAmodule-01-SERIALPORTS*7*CONFIGUREINTERRUPTSERVICEROUTINEANDCLAIMCONTROL4*OFTHEINTERRUPTSERVICEVECTORFORVERSAmodule-01*SERIALPORTDEVICES.*+LEATRAP1PB(A6),A0PARAMETERBLOCKADDRESS-MOVE.LA0,A1USEA1TOBUILDPARAMETERBLOCKCLR.L(A1)+TASK=MECLR.L(A1)+SESSION=MECLR.W(A1)+ALLOCATEVECTOR/MOVE.W#VECTSP,(A1)+VECTORNUMBERFORSERVICE6MOVE.L#SPISR,(A1)+INTERRUPTSERVICEROUTINEADDRESS-MOVE.LA6,(A1)PASSTHEDATASEGMENTADDRESSMOVE.L#CISR,D0CISRDIRECTIVE#TRAP#1CALLEXECTODOTHESET-UP(BNECISRSPERGOABORTIFANERROR-FATALENDC IFEQVMSA+VME110/MOVE.L#-1,A5SETTONOVM01SERIALPORTCCB'SENDC IFNEVMSA*,*BUILDTHEVERSAmodule-01SERIALPORTCCB'S**MOVE.L#SPCNT,D0NUMBEROFCCB'STOBUILD5MOVE.B#VMSAP1BN,D1INTERRUPTBITNUMBERFOR1STCCB$LEACCBBEG(A6),A0CCBSTARTADDRESS%MOVE.L#'VMSA',(A0)+I/ODEVICETYPE/MOVE.L#VMSAP1,(A0)+MEMORYMAPPEDI/OADDRESSMOVE.B#VMSARL1,(A0)+READLUN MOVE.B#VMSAWL1,(A0)+WRITELUN.BIOS30CLR.L(A0)+REQUESTTABLEENTRYADDRESS)MOVE.L#SREAD,(A0)+READROUTINEADDRESS*MOVE.L#SWRIT,(A0)+WRITEROUTINEADDRESS5MOVE.L#SOWI,(A0)+OUTPUTWITHINPUTROUTINEADDRESSCLR.L(A0)+MENUADDRESSCLR.L(A0)+SAVEAREA%MOVE.BD1,(A0)+INTERRUPTBITNUMBERCLR.B(A0)+FLAGSCLR.W(A0)+FLAGS!SUB.L#1,D0MORECCB'STOBUILD?BLE.SBIOS40BRANCHIFNO%MOVE.L#'VMSA',(A0)+I/ODEVICETYPE/MOVE.L#VMSAP2,(A0)+MEMORYMAPPEDI/OADDRESSMOVE.B#VMSARL2,(A0)+READLUN MOVE.B#VMSAWL2,(A0)+WRITELUN)MOVE.B#VMSAP2BN,D1INTERRUPTBITNUMBER BRABIOS30GOBUILDRESTOFCCB)BIOS40MOVE.LA0,A5SAVENEXTCCBADDRESSENDC IFNEVMSA*5*INITIALIZEVERSAmodule-01SERIALPORTS-ASYNCHRONOUS*(MOVE.L#CCBCNT,D1TOTALNUMBEROFCCB'S(MOVE.L#SPCNT,D0NUMBEROFSERIALPORTS)LEACCBBEG(A6),A2STARTADDRESSOFCCB'S E.B#$05,CREG(A4)POINTTOCONTROLREGISTER5PORT28MOVE.B#$E2,CREG(A3)8BITS,TRANSMITTERDISABLED,PORT18MOVE.B#$E2,CREG(A4)8BITS,TRANSMITTERDISABLED,PORT28MOVE.B#$11,CREG(A3)POINTTOCONTROLREGISTER1PORT18MOVE.B#$11,CREG(A4)POINTTOCONTROLREGISTER1PORT29MOVE.B#$1C,CREG(A3)EXT.INTERRUPT&TxDISABLED,PORT19MOVE.B#$1C,CREG(A4)EXT.INTERRUPT&TxDISABLED,PORT2ENDC**-*MAKEALLENTRIESINTHEREQUESTTABLEEMPTY*&LEARTBL(A6),A1REQUESTTABLEADDRESS#MOVE.L#ENTRY,D0NUMBEROFENTRIES5BIOS10BSET#EMTY,RTSTAT(A1)SETALLENTRIESTOEMPTY(ADD.L#RTELNG,A1BUMPTOTHENEXTENTRY-SUB.L#1,D0DECREMENTNUMBEROFENTRIESLEFT#BNE.SBIOS10BRANCHIFMORETOSET*-*WAITFORATRAP#2ORTRAP#3SERVICEEVENT*WAITEVNTEQU*+MOVE.L#WTEVNT,D0WAITFOREVENTDIRECTIVETRAP#1CALLEXECPAGE***SEEIFANENTRYINTHEREQUESTTABLEHAS.*COMPLETEDI/O.IFNONEFOUND,WAITFOREVENT.4*IFANENTRYISFOUND,GODOTHECOMPLETIONPROCESS.!*A6=BASEADDRESSOFDATASEGMENT*!MOVE.L#SETASQ,D0SETASQSTATUSMOVE.L#9,A0DISABLETHEASRTRAP#1CALLEXECTODISABLE(BNESETASQERGOABORTIFANERROR,FATAL-MOVE.L#ENTRY,D0GETNUMBEROFTABLEENTRIES&LEARTBL(A6),A1REQUESTTABLEADDRESS-CKIOC10BTST#ACT,RTSTAT(A1)ANACTIVEENTRY?#BEQ.SCKIOC20BRANCHIFNOTACTIVE)MOVE.LRTCCBA(A1),A2GETTHECCBADDRESSTST.BCCBIOC(A2)I/OCOMPLETE?(BEQ.SIOCBRANCHIFTHEI/OISCOMPLETE,CKIOC20ADD.L#RTELNG,A1POINTTONEXTENTRY(SUB.L#1,D0DECREMENTNUMBEROFENTRIES'BNE.SCKIOC10BRANCHIFMORETOSEARCH4BRAWAITEVNTNOTHINGREADYNOW-GOWAITFORANEVENTPAGE**IOCI/OCOMPLETED&*ENTRY:A1=REQUESTTABLEENTRYADDRESS*A2=CCBADDRESS*A3=MEMORYMAPPEDI/OADDRESS!*A6=BASEADDRESSOFDATASEGMENT*CALLS:MOVEPBACKSRQ* IOCEQU*!IFNEMMUASSEMBLEIFHAVEANMMU**MOVEINPUTBUFFERTOUSER*)BTST#INP,RTFLAG(A1)ANINPUTOPERATION?BEQ.SIOC20BRANCHIFNO8LEATRAP1PB(A6),A0MOVELOGICALPARAMETERBLOCKADDRESS1MOVE.LPBSAD(A1),MOVDADR(A0)DESTINATIONADDRESS0IOC10MOVE.LPBLNG(A1),MOVLNG(A0)LENGTHOFMOVE&BEQ.SIOC20BRANCHIFNOTHINGTOMOVE&MOVE.L#TASK,MOVSTSK(A0)MYTASKNAME%MOVE.L#SESSN,MOVSSES(A0)MYSESSION-MOVE.LRTBUFA(A1),MOVSADR(A0)SOURCEADDRESS3MOVE.LEVTSK(A1),MOVDTSK(A0)DESTINATIONTASKNAME1MOVE.LEVSES(A1),MOVDSES(A0)DESTINATIONSESSION)MOVE.L#MOVELL,D0MOVELOGICALDIRECTIVE!TRAP#1CALLEXECTODOTHEMOVE$BEQ.SIOC30BRANCHIFAGOODRETURN=MOVE.B#ISTADD,PBSTA(A1)ERROR-SETTOINVALIDBUFFERADDRESS1BRA.SIOC30GOSENDPARAMETERBLOCKBACKTOUSER8IOC20BTST#OWIR,RTFLAG(A1)OUTPUTWITHINPUTOPERATION?BEQ.SIOC30BRANCHIFNO+BCLR#OWIR,RTFLAG(A1)CLEARTHEINPUTFLAG 1),A2QUEUEDFORTHISCCB?BEQ.SIOC90BRANCHIFYES-IOC80ADD.L#RTELNG,A1BUMPTOTHENEXTENTRY2SUB.L#1,D0DECREMENTNUMBEROFENTRIESTOSEARCH#BNEIOC70BRANCHIFMORETOSEARCH*'*NOQUEUEDENTRYTOSTARTFORTHISCCB*%CLR.BCCBBSY(A2)SETCCBTONOTBUSY*CLR.BCCBNQ(A2)NOREQUESTSQUEUEDFORIT(BRAIOC50GOENABLEREQUESTSANDRETURN*&*FOUNDANENTRYTOSTARTFORTHISCCB*'IOC90MOVE.B#1,CCBBSY(A2)SETCCBBUSY*MOVE.B#1,CCBIOC(A2)SETI/ONOTCOMPLETE,BCLR#QUE,RTSTAT(A1)TURNOFFQUEUEDSTATUS,BSET#ACT,RTSTAT(A1)SETTOANACTIVEENTRYCLR.LD0CLEARFORUSE*MOVE.BPBFNC(A1),D0GETTHEFUNCTIONCODE%CMP.B#4,D0SEEIFOUTPUTWITHINPUTBNE.SIOC100BRANCHIFNOT-SUB.L#1,D0ISOUTPUTWITHINPUT,ADJUSTCODE9IOC100SUB.L#1,D0USEFUNCTIONCODEASOFFSETTOROUTINE'LSL.L#2,D0CONVERTTOLONGWORDOFFSET)MOVE.LRTCCBA(A1),A2GETTHECCBADDRESS4MOVE.LCCBREAD(A2,D0),A4ROUTINEADDRESSTOPROCESS:MOVE.LA1,CCBBUF(A2)SAVETHEREQUESTTABLEENTRYADDRESS8MOVE.LCCBMEMA(A2),A3GETTHEMEMORYMAPPEDI/OADDRESS)CLR.BRTFLAG(A1)STARTWITHNOFLAGSSETJSR(A4)GOSTARTTHEI/O3BEQWAITEVNTGOWAITFORANEVENTONAGOODRETURN-MOVE.BD0,PBSTA(A1)ERROR-GETTHEERRORCODE&CLR.BCCBIOC(A2)SETTOI/OCOMPLETED*CLR.LPBLNG(A1)SETTONOTRANSFERLENGTH!BRAIOCGOHANDLETHECOMPLETION PAGE**SERVTRAPSERVICETRAPS*HANDLESTRAP#2ANDTRAP#3/*TRAP#3:SETSSTATUSTONOERRORSANDRETURNS8*TRAP#2:RESERVESAREQUESTTABLEENTRYFORTHEEVENT.$*DETERMINESCCBTOUSEFORTHEI/O.4*EITHERQUEUESTHEEVENTIFTHECCBISBUSYORSETS4*THEEVENTSTATUSTOREADYTOINITIATEI/O.THEI/O:*ISSTARTEDEITHERAT'CKSTRT'(AFTERTHEWAITFOREVENT)7*OR'IOC'-AFTERTHECURRENTLYRUNNINGI/OISCOMPLETE.7*BEFORERETURNFROMTHISEVENT,STATUSISSETTOENABLE6*EVENTREQUESTSIFTHEREAREANYAVAILABLEENTRIESIN9*THEREQUESTTABLE.STATUSISSETTODISABLEREQUESTSIF4*THEREQUESTTABLEISFULL.UPONI/OCOMPLETIONTHE**STATUSISALWAYSSETTOENABLEREQUESTS.!*A6=BASEADDRESSOFDATASEGMENT**SERVTRAPEQU**5*DETERMINEREQUESTTABLEENTRYTOUSEFORTHISEVENT*&LEARTBL(A6),A1REQUESTTABLEADDRESSMOVE.L#ENTRY,D0#OFENTRIES-SERVT10BTST#EMTY,RTSTAT(A1)ANEMPTYENTRY?%BNE.SSERVT20BRANCHIFEMPTY,USEIT$ADD.L#RTELNG,A1BUMPTONEXTENTRY2SUB.L#1,D0DECREMENTNUMBEROFENTRIESTOSEARCH'BNE.SSERVT10BRANCHIFMORETOSEARCH4BRANOENTRYGOABORTIFNOENTRIESLEFT,FATALERROR**READTHEEVENT*8SERVT20MOVE.LA1,A0ENTRYADDRESSTORECEIVETHISEVENT'MOVE.L#RDEVNT,D0READEVENTDIRECTIVE!TRAP#1CALLEXECTODOTHEREAD"BNERDEVNTERGOABORTIFANERROR;SUB.L#1,ENTRIES(A6)DECREMENTNUMBEROFENTRIESAVAILABLE*%*DETERMINETRAPNUMBEROFTHISEVENT*7MOVE.BEVTIN(A1),D0GETTHETRAPNUMBERFROMTHEEVENT'AND.L#$0F,D0MASKOFFUNECESSARYBITSCMP.B#TRAP2,D0TRAP#2? BEQ.SSERVT30BRANCHIFTRAP#2*,*TRAP#3EVENT-SETUSER'SPARAMETERBLOCK*STATUSBYTETOZERO*IFNEMMUASSEMBLEIFMMU5MOVE.LEVA0(A1),A2GETUSERSPARAMETERBLOCKADDRESSCLR.LEVD0(A1)CLEARUSER'SD08LEATRAP1PB(A6),A0MOVELOGICALPARAMETERBLOCKADDRESS#MOVE.L#MOVELL,D0DIRECTIVENUMBER*MOVE.L#TASK,MOVSTSK(A0)SOURCETASKNAME0MOVE.L#SESSN,MOVSSES(A0)SOURCESESSIONNUMBER+MOVE.LA1,MOVSADR(A0)SET-UPSORCEADDRESS'ADD.L#EVD0,MOVSADR(A0)SOURCEADDRESS.MOVE.LEVTSK(A1),MOVDTSK(A0)TARGETTASKNAME3MOVE.LEVSES(A1),MOVDSES(A0)TARGETSESSIONNUMBER1MOVE.LA2,MOVDADR(A0)SET-UPDESTINATIONADDRESSAADD.L#4,MOVDADR(A0)DESTINATIONADDRESS=PARA.BLOCKSTATUSBYTE+MOVE.L#1,MOVLNG(A0)LENGTHOFMOVE=1BYTE*TRAP#1CALLEXECTOMOVETHESTATUSBYTE&BNEMOVELERRBRANCHIFANERROR-FATALENDCIFEQMMUASSEMBLEIFNOMMU;MOVE.LEVA0(A1),A2GETPHYSICALADDRESSOFPARAMETERBLOCK)CLR.B4(A2)CLEARTHEUSER'SSTATUSBYTEENDC%CLR.BRTFLAG(A1)CLEARANYFLAG? SSET&CLR.BRTSTAT(A1)CLEARANYSTATUSSET.BSET#EMTY,RTSTAT(A1)SETTHISENTRYTOEMPTY6ADD.L#1,ENTRIES(A6)BUMPNUMBEROFAVAILABLEENTRIES"CLR.LD0SET-UPFORAGOODRETURN'BSRACKSRQGOACKNOWLEDGETHISREQUEST!MOVE.L#SETASQ,D0SETASQSTATUSMOVE.L#$D,A0ENABLETHEASR#TRAP#1CALLEXECTODOTHEENABLE(BNESETASQERGOABORTIFANERROR,FATALRTRRETURNFROMTHISEVENT*'*TRAP#2EVENT-DETERMINECCBADDRESS*CCBADDRESS->A2*%SERVT30EQU*SEEIFAVALIDFUNCTION*MOVE.BPBFNC(A1),D0GETTHEFUNCTIONCODECMP.B#1,D01=READ BEQ.SSERVT50BRANCHIFREAD,OKCMP.B#2,D02=WRITE!BEQ.SSERVT50BRANCHIFWRITE,OK CMP.B#4,D04=OUTPUTWITHINPUT-BEQ.SSERVT40BRANCHIFOUTPUTWITHINPUT,OK5MOVE.L#ISTAIF,D0SETERRORCODETOINVALIDFUNCTION*BRATRAPERRGORETURNWITHERRORCODESET4SERVT40SUB.L#1,D0ISOUTPUTWITHINPUT,ADJUSTCODE4SERVT50MOVE.BPBLUN(A1),D1GETUSER'SSPECIFIEDLUN0MOVE.L#CCBCNT,D3GETNUMBEROFCCB'STOSEARCH)LEACCBBEG(A6),A2STARTADDRESSOFCCB'S.SERVT60CMP.BCCBRLUN(A2),D1CCBFORTHISLUN?$BEQ.SSERVT70BRANCHIFCORRECTCCB'CMP.BCCBWLUN(A2),D1CCBFORTHISLUN?$BEQ.SSERVT70BRANCHIFCORRECTCCB)ADD.L#CCBLNG,A2GETADDRESSOFNEXTCCB0SUB.L#1,D3DECREMENT#OFCCB'SLEFTTOSEARCH%BNESERVT60BRANCHIFMORETOSEARCH)MOVE.L#ISTAILU,D0INVALIDLUNSPECIFIED%BRATRAPERRGORETURNWITHERRORSET2SERVT70MOVE.LA2,RTCCBA(A1)SAVETHISCCBADDRESS8SUB.L#1,D0USEFUNCTIONCODEASOFFSETFORR/WROUTINE'LSL.L#2,D0CONVERTTOLONGWORDOFFSET4MOVE.LCCBREAD(A2,D0),A4ROUTINEADDRESSTOPROCESSMOVE.LA4,D0GETTHEADDRESS3CMP.L#ISTATM,D0INVALIDFUNCTIONFORTHISDEVICE?BNE.SSERVT80BRANCHIFOK,BRA.STRAPERRGORETURNWITHERRORCODESET*+*VALIDEVENT-SEEIFPROCESSINGCANSTART*1SERVT80ADD.B#1,CCBNQ(A2)BUMPTHENUMBERQUEUED!CLR.BRTFLAG(A1)CLEARANYFLAGS(CLR.BRTSTAT(A1)CLEARTHEENTRYSTATUS'TST.BCCBBSY(A2)ISTHISLUNBUSYNOW?!BEQ.SSERVT85BRANCHIFNOTBUSY+BSET#QUE,RTSTAT(A1)SETTOREQUESTQUEUED%BRA.SSERVT90GOCONTINUEPROCESSING4SERVT85MOVE.B#1,CCBIOC(A2)SETTOI/ONOTCOMPLETE6BSET#ACT,RTSTAT(A1)SETTOREADYTOINITIATETHEI/O*MOVE.B#1,CCBBSY(A2)SETTHISCCBTOBUSY8MOVE.LCCBMEMA(A2),A3GETTHEMEMORYMAPPEDI/OADDRESS:MOVE.LA1,CCBBUF(A2)SAVETHEREQUESTTABLEENTRYADDRESSJSR(A4)GOINITIATETHEI/O(BEQ.SSERVT90BRANCHIFNOERRORSFOUND(MOVE.BD0,PBSTA(A1)SAVETHEERRORCODE*CLR.LPBLNG(A1)SETTONOTRANSFERLENGTH%CLR.BCCBIOC(A2)SETTOI/OCOMPLETE*9*SEEIFANYEMPTYSLOTSAVAILABLEFORMORETRAPREQUESTS*%SERVT90TST.LENTRIES(A6)0=NONELEFT#BLE.SSERVT100BRANCHIFNONELEFT!MOVE.L#SETASQ,D0SETASQSTATUSMOVE.L#$D,A0ENABLETHEASR#TRAP#1CALLEXECTODOTHEENABLE(BNESETASQERGOABORTIFANERROR,FATAL7MOVE.L#DERQST,D0SETSERVERSTATUSTOENABLEREQUESTSMOVE.L#$82,A0ENABLECODE*TRAP#1CALLEXECTOENABLETRAPREQUESTS&BNEDERQSTERBRANCHIFANERROR,FATAL#SERVT100RTRRETURNFROMTHISEVENT*'*ERRORHANDLINGDURINGTRAPPROCESSING*?TRAPERRMOVE.BD0,PBSTA(A1)SETERRORSTATUSINPARAMETERBLOCK#CLR.LPBLNG(A1)NOTRANSFERLENGTH+MOVE.LD0,EVD0(A1)SETERRORCODEINEVENT7BSRMOVEPBGOMOVETHEPARAMETERBLOCKBACKTOTHEUSE,MOVE.LEVD0(A1),D0GETTHEERRORCODEAGAIN'BSRACKSRQGOACKNOWLEDGETHISREQUEST&BRASERVT90GORETURNFROMTHISEVENTPAGE*0*EVENTHANDLINGROUTINEFORI/OCOMPLETIONFROM<*THEINTERRUPTHANDLINGROUTINES.THERETURNFROMTHEISR'S9*ONI/OCOMPLETIONORFAULTCOMEHERE.THEEVENTMESSAGE6*CONTAINSTHEADDRESSOFTHEREQUESTTABLEENTRYTHAT6*WASBEINGPROCESSED.THEROUTINESETSANYERRORCODE6*ANDSETSTHEI/OCOMPLETIONFLAG.THEPROCESSINGFOR1*THEI/OCOMPLETIONISDONEAT'CKIOC'AFTERTHE*WAITFOREVENT.**A6CONTAINSBASEADDRESSOFDATASEGMENT* ISREVT EQU *9LEATRAP1PB(A6),A0EVENTMESSAG? EPARAMETERBLOCKADDRESS'MOVE.L#RDEVNT,D0READEVENTDIRECTIVE$TRAP#1CALLEXECTOREADTHEEVENT%BNERDEVNTERABORTIFANERROR,FATAL;MOVE.LISREVTMG(A0),A1GETTHEREQUESTTABLEENTRYADDRESS)MOVE.LRTCCBA(A1),A2GETTHECCBADDRESS.CLR.BPBSTA(A1)HOPEFORAGOODRETURNSTATUS.BTST#FLT,RTFLAG(A1)ANERRORDURINGTHEI/O?"BEQ.SISREVT10BRANCHIFNOERROR/MOVE.BCCBBSY(A2),PBSTA(A1)SETTHEERRORCODE)MOVE.B#1,CCBBSY(A2)RESETCCBBUSYFLAGISREVT10 EQU *"BTST#INP,RTFLAG(A1)DOINGINPUT?BNE.SISREVT20BRANCHIFYES#BTST#OWIR,RTFLAG(A1)DOINGINPUT?BNE.SISREVT20BRANCHIFYES.BTST#FORM,RTFLAG(A1)DOINGFORMATTEDOUTPUT?"BEQ.SISREVT20BRANCHIFNO,IMAGE8SUB.L#2,RTRNLNG(A1)FORMATTEDOUTPUT-DON'TCOUNTCR-LF&BPL.SISREVT20BRANCHIFAGOODVALUE+CLR.LRTRNLNG(A1)MUSTHAVEBEENNOLENGTH=ISREVT20MOVE.LRTRNLNG(A1),PBLNG(A1)SETTHETRANSFERLENGTH%CLR.BCCBIOC(A2)SETTOI/OCOMPLETERTRRETURNFROMTHISEVENT PAGE IFNEACIA*4*ACIAREADREADROUTINEFOREXORmacsANDVME110ACIA*SETINPUTFLAG.$*USESACIAWRITROUTINEFORTHEREAD&*ENTRY:A1=REQUESTTABLEENTRYADDRESS*A2=CCBADDRESS*A3=MEMORYMAPPEDI/OADDRESS!*A6=BASEADDRESSOFDATASEGMENT*ACIAREAD EQU *'BSET#INP,RTFLAG(A1)SETTOINPUTMODEPAGE*5*ACIAWRITWRITEROUTINEFOREXORmacsANDVME110ACIA*(USEDBYACIAREADALSO))*DETERMINEBUFFERADDRESSESFORTHEI/O.2*DETERMINEMENUENTRIESFORTHEISRTODOTHEI/O*DETERMINEUSER'SI/OOPTIONS.*ARMTHEACIAFORINTERRUPTS.,*ALLI/ODONEININTERRUPTSERVICEROUTINE.0*WHENTHEI/OISCOMPLETETHEINTERRUPTSERVICE**ROUTINEEXITSANDCAUSESANEVENTTOTHE.*ASR,WHICHHANDLESSETTINGALLTHECOMPLETION#*FLAGSANDDETECTSANYI/OERRORS.&*ENTRY:A1=REQUESTTABLEENTRYADDRESS*A2=CCBADDRESS*A3=MEMORYMAPPEDI/OADDRESS!*A6=BASEADDRESSOFDATASEGMENT%*EXIT:D0=0=GOODRETURN,I/OINITIATED3*D0.BNOT0=ERRORFOUND,D0CONTIANSTHEERRORCODE*I/ONOTINITIATED.*USES:01234567*D**A*PPP**P*CALLS:GETBUFGETMENUA**ACIAWRIT EQU *,CLR.LRTRNLNG(A1)CLEARI/OTRANSFERLENGTH$BSRGETBUFGETI/OBUFFERADDRESSESBNEACIAW50BRANCHIFANERROR3MOVE.LA4,RTBUFA(A1)SAVETHEBUFFERSTARTADDRESS!BSRGETMENUAGOGETMENUADDRESS!BNE.SACIAW50BRANCHIFANERROR0MOVE.WPBOPTS(A1),D0GETTHEUSER'SI/OOPTIONSBTST#5,D0TOECHOTHEI/O?BNE.SACIAW10BRANCHIFNO'BSET#ECHO,RTFLAG(A1)SETTOECHOMODE!ACIAW10BTST#3,D0FORMATTEDI/O?!BNE.SACIAW20BRANCHIFNO,IMAGE,BSET#FORM,RTFLAG(A1)SETTOFORMATTEDMODE)ACIAW20BTST#INP,RTFLAG(A1)DOINGINPUT?(BNE.SACIAW30BRANCHIFYES,DOINGINPUT*!*DOINGOUTPUT-BUILDMENUENTRIES*MOVE.W#OUT,(A0)+OUTPUTFLAG,MOVE.LA4,(A0)+OUTPUTBUFFERSTARTADDRESS*MOVE.LA5,(A0)+OUTPUTBUFFERENDADDRESS(BTST#FORM,RTFLAG(A1)FORMATTEDOUTPUT?!BEQ.SACIAW25BRANCHIFNO,IMAGE4MOVE.W#OUT,(A0)+FORMATTEDOUTPUT-SETUPFORLF-CR8LEALFCR(A6),A4LINEFEEDCARRIAGERETURNSTARTADDRESS2MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNADDRESS2ADD.L#1,A4LINE-FEEDCARRIAGERETURNENDADDRESS6MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNENDADDRESS&ACIAW25CLR.W(A0)ENDOFMENUENTRIES0MOVE.B#ARMOUT,D0DOINGOUTPUT,ARMFORTRANSMITBRA.SACIAW40GOCONTINUE* *DOINGINPUT-BUILDMENUENTRIES*&ACIAW30MOVE.W#IN,(A0)+SETFORINPUT+MOVE.LA4,(A0)+INPUTBUFFERSTARTADDRESS)MOVE.LA5,(A0)+INPUTBUFFERENDADDRESS'BTST#FORM,RTFLAG(A1)FORMATEEDINPUT?!BEQ.SACIAW35BRANCHIFNO,IMAGE6MOVE.W#OUT,(A0)+FORMATTEDINPUT,MUSTOUTPUTALF-CR8LEALFCR(A6),A4LINEFEEDCARRIAGERETURNSTARTADDRESS2MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNADDRESS2ADD.L#1,A4LINE-FEEDCARRIAGERETURNENDADDRESS6MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNENDADDRESS&ACIAW35CLR.W(A0)ENDOFMENUENTRIES!MOVE.B#ARMIN,D0ARMFORRECEIVE'ACIAW40MOVE.B#$03,(A3)RESETTHEACIA&MOVE.BD0,(A3)SETTHEINTERRUPTMODECLR.LD0SET@ FORGOODRETURNACIAW50RTSRETURNTOCALLERENDC IFNEACIAPAGE*@*ACIAOWIOUTPUTWITHINPUTROUTINEFOREXORmacsANDVME110ACIA.*DETERMINEOUTPUTANDINPUTBUFFERADDRESSES.*BUILDTHEISRMENUENTRIES.*DETERMINEOUTPUTI/OOPTIONS.*SETFORDOINGOUTPUT.*ARMFORINTERRUPT.,*ALLI/ODONEININTERRUPTSERVICEROUTINE.0*WHENTHEI/OISCOMPLETETHEINTERRUPTSERVICE**ROUTINEEXITSANDCAUSESANEVENTTOTHE.*ASR,WHICHHANDLESSETTINGALLTHECOMPLETION#*FLAGSANDDETECTSANYI/OERRORS.&*ENTRY:A1=REQUESTTABLEENTRYADDRESS*A2=CCBADDRESS*A3=MEMORYMAPPEDI/OADDRESS!*A6=BASEADDRESSOFDATASEGMENT%*EXIT:D0=0=GOODRETURN,I/OINITIATED3*D0.BNOT0=ERRORFOUND,D0CONTIANSTHEERRORCODE*I/ONOTINITIATED.*USES:01234567 *D*****A*PPP**P*CALLS:GETBUFGETMENUA* ACIAOWI EQU *%BSET#OWIW,RTFLAG(A1)SETFOROUTPUT,CLR.LRTRNLNG(A1)CLEARTHETRANSFERLENGTH'BSRGETBUFGETOUTPUTBUFFERADDRESSESBNEACIAO40BRANCHIFANERROR"BSRGETMENUAGETTHEMENUADDRESS(BNEACIAO40BRANCHIFANERRORRETURNED*2*BUILDTHEMENUENTRIESFORTHEOUTPUTWITHINPUT*'MOVE.W#OUT,(A0)+SETFOROUTPUTFIRST,MOVE.LA4,(A0)+OUTPUTBUFFERSTARTADDRESS*MOVE.LA5,(A0)+OUTPUTBUFFERENDADDRESS0MOVE.WPBOPTS(A1),D3GETTHEUSER'SI/OOPTIONSBTST#3,D3FORMATTED?BNE.SACIAO10BRANCHIFNO7MOVE.W#OUT,(A0)+FORMATTEDOUTPUT,MUSTOUTPUTALF-CR8LEALFCR(A6),A4LINEFEEDCARRIAGERETURNSTARTADDRESS2MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNADDRESS2ADD.L#1,A4LINE-FEEDCARRIAGERETURNENDADDRESS6MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNENDADDRESS7ACIAO10BSET#INP,RTFLAG(A1)FAKEINPUTFORGETBUFCALL4>A5D?94=;0MOVE.WPBOPTS(A1),D0GETTHEUSER'SI/OOPTIONSBTST#3,D0FORMATTEDOUTPUT? BNE.SPIAW10BRANCHIFNO,IMAGE'BSET#FORM,RTFLAG(A1)SETTOFORMATTED7MOVE.W#OUT,(A0)+FORMATTEDOUTPUT,MUSTOUTPUTALF-CR8LEALFCR(A6),A4LINEFEEDCARRIAGERETURNSTARTADDRESS2MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNADDRESS2ADD.L#1,A4LINE-FEEDCARRIAGERETURNENDADDRESS6MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNENDADDRESS%PIAW10CLR.W(A0)ENDOFMENUENTRIES7MOVE.B#$2F,2(A3)A-SIDE,ARMFORINTERRUPTONNOTBUSY7MOVE.B#$3D,6(A3)B-SIDE,ARMFORINTERRUPTONNOTBUSY8MOVE.B#$0,(A3)OUTPUTABYTETOGETINTERRUPTSSTARTED'MOVE.B(A3),D0STROBETOSENDTHEBYTECLR.LD0SETFORAGOODRETURNPIAW20RTSRETURNTOCALLERENDC IFNEVMSAPAGE*A*SREADREADROUTINEFORVERSAmodule-01ASYNCHRONOUSSERIALPORTS*SETINPUTFLAG.!*USESSWRITROUTINEFORTHEREAD&*ENTRY:A1=REQUESTTABLEENTRYADDRESS*A2=CCBADDRESS*A3=MEMORYMAPPEDI/OADDRESS!*A6=BASEADDRESSOFDATASEGMENT* SREADEQU*'BSET#INP,RTFLAG(A1)SETTOINPUTMODEPAGE*B*SWRITWRITEROUTINEFORVERSAmodule-01ASYNCHRONOUSSERIALPORTS*(USEDBYSREADALSO))*DETERMINEBUFFERADDRESSESFORTHEI/O.*DETERMINEUSER'SI/OOPTIONS.3*BUILDTHEMENUENTRIESFORTHEISRTODOTHEI/O.,*ALLI/ODONEININTERRUPTSERVICEROUTINE.0*WHENTHEI/OISCOMPLETETHEINTERRUPTSERVICE**ROUTINEEXITSANDCAUSESANEVENTTOTHE.*ASR,WHICHHANDLESSETTINGALLTHECOMPLETION#*FLAGSANDDETECTSANYI/OERRORS.&*ENTRY:A1=REQUESTTABLEENTRYADDRESS*A2=CCBADDRESS*A3=MEMORYMAPPEDI/OADDRESS!*A6=BASEADDRESSOFDATASEGMENT%*EXIT:D0=0=GOODRETURN,I/OINITIATED3*D0.BNOT0=ERRORFOUND,D0CONTIANSTHEERRORCODE*I/ONOTINITIATED..*CONDITIONCODESSETACCORDINGTODOCONTENTS*USES:01234567*D**A*PPP**P*CALLS:GETBUFGETMENA** SWRITEQU*,CLR.LRTRNLNG(A1)CLEARI/OTRANSFERLENGTH$BSRGETBUFGETI/OBUFFERADDRESSESBNESWRIT50BRANCHIFANERROR3MOVE.LA4,RTBUFA(A1)SAVETHEBUFFERSTARTADDRESS'BSRGETMENUAGOGETMENUTABLEADDRESS!BNE.SSWRIT50BRANCHIFANERROR0MOVE.WPBOPTS(A1),D0GETTHEUSER'SI/OOPTIONSBTST#5,D0TOECHOTHEI/O?BNE.SSWRIT10BRANCHIFNO'BSET#ECHO,RTFLAG(A1)SETTOECHOMODE!SWRIT10BTST#3,D0FORMATTEDI/O?!BNE.SSWRIT20BRANCHIFNO,IMAGE,BSET#FORM,RTFLAG(A1)SETTOFORMATTEDMODE)SWRIT20BTST#INP,RTFLAG(A1)DOINGINPUT?(BNE.SSWRIT30BRANCHIFYES,DOINGINPUT*4*DOINGSERIALPORTOUTPUT-SETUPFORINTERRUPTMODE*ANDBUILDTHEMENUENTRIES*MOVE.W#OUT,(A0)+OUTPUTFLAG,MOVE.LA4,(A0)+OUTPUTBUFFERSTARTADDRESS*MOVE.LA5,(A0)+OUTPUTBUFFERENDADDRESS(BTST#FORM,RTFLAG(A1)FORMATTEDOUTPUT?!BEQ.SSWRIT25BRANCHIFNO,IMAGE+MOVE.W#OUT,(A0)+FORMATTED,DOMOREOUTPUT8LEALFCR(A6),A4LINEFEEDCARRIAGERETURNSTARTADDRESS2MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNADDRESS2ADD.L#1,A4LINE-FEEDCARRIAGERETURNENDADDRESS6MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNENDADDRESS'SWRIT25CLR.W(A0)ZEROFORENDOFMENU2MOVE.B#$33,CREG(A3)DOINGOUTPUT,ENABLETRANSMITBRA.SSWRIT40GOCONTINUE*3*DOINGSERIALPORTINPUT-SETUPFORINTERRUPTMODE*#SWRIT30MOVE.W#A IN,(A0)+INPUTFLAG+MOVE.LA4,(A0)+INPUTBUFFERSTARTADDRESS)MOVE.LA5,(A0)+INPUTBUFFERENDADDRESS'BTST#FORM,RTFLAG(A1)FORMATTEDINPUT?!BEQ.SSWRIT35BRANCHIFNO,IMAGE7MOVE.W#OUT,(A0)+FORMATTED-MUSTOUTPUTALINE-FEED,CR8LEALFCR(A6),A4LINEFEEDCARRIAGERETURNSTARTADDRESS2MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNADDRESS2ADD.L#1,A4LINE-FEEDCARRIAGERETURNENDADDRESS6MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNENDADDRESS(SWRIT35CLR.W(A0)ZEROSFORENDOFMENU%MOVE.B#$36,CREG(A3)ENABLERECEIVER SWRIT40EQU*CLR.LD0SETFORGOODRETURNSWRIT50RTSRETURNTOCALLERENDC IFNEVMSAPAGE*3*SOWIOUTPUTWITHINPUTROUTINEFORVERSAmodule-01*ASYNCHRONOUSSERIALPORTS.*DETERMINEOUTPUTANDINPUTBUFFERADDRESSES.*DETERMINEI/OOPTIONS.*BUILDTHEISRMENUENTRIES.*SETFORDOINGOUTPUT.*ARMFORINTERRUPT.,*ALLI/ODONEININTERRUPTSERVICEROUTINE.0*WHENTHEI/OISCOMPLETETHEINTERRUPTSERVICE**ROUTINEEXITSANDCAUSESANEVENTTOTHE.*ASR,WHICHHANDLESSETTINGALLTHECOMPLETION#*FLAGSANDDETECTSANYI/OERRORS.&*ENTRY:A1=REQUESTTABLEENTRYADDRESS*A2=CCBADDRESS*A3=MEMORYMAPPEDI/OADDRESS!*A6=BASEADDRESSOFDATASEGMENT%*EXIT:D0=0=GOODRETURN,I/OINITIATED4*D0.BNOT0=ERRORFOUND,D0CONTAINSTHEERRORCODE,*I/ONOTINITIATED./*CONDITIONCODESSETACCORDINGTOD0CONTENTS.*USES:01234567 *D*****A*PPP**P*CALLS:GETBUFGETMENUA* SOWIEQU*5BSET#OWIR,RTFLAG(A1)SETFOROUTPUTWITHINPUTFLAG,CLR.LRTRNLNG(A1)CLEARTHETRANSFERLENGTH'BSRGETBUFGETOUTPUTBUFFERADDRESSESBNESOWI40BRANCHIFANERROR$BSRGETMENUAGETMENUENTRYADDRESS'BNESOWI40BRANCHIFANERRORRETURNED*2*BUILDTHEMENUENTRIESFORTHEOUTPUTWITHINPUT*'MOVE.W#OUT,(A0)+SETFOROUTPUTFIRST,MOVE.LA4,(A0)+OUTPUTBUFFERSTARTADDRESS*MOVE.LA5,(A0)+OUTPUTBUFFERENDADDRESS0MOVE.WPBOPTS(A1),D3GETTHEUSER'SI/OOPTIONSBTST#3,D3FORMATTEDOUTPUT? BNE.SSOWI10BRANCHIFNO,IMAGE+MOVE.W#OUT,(A0)+FORMATTED,SETFOROUTPUT8LEALFCR(A6),A4LINEFEEDCARRIAGERETURNSTARTADDRESS2MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNADDRESS2ADD.L#1,A4LINE-FEEDCARRIAGERETURNENDADDRESS6MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNENDADDRESS6SOWI10BSET#INP,RTFLAG(A1)FAKEINPUTFLAGFORGETBUF?MOVE.LPBSAD(A1),-(A7)SAVEUSER'SOUTPUTBUFFERSTARTADDRESS=MOVE.LPBEAD(A1),-(A7)SAVEUSER'SOUTPUTBUFFERENDADDRESS&MOVE.LA0,-(A7)SAVETHEMENUADDRESS:MOVE.LPBRRN(A1),PBSAD(A1)GETINPUTBUFFERSTARTADDRESS.MOVE.LPBRRN(A1),PBEAD(A1)SETUPENDADDRESS,MOVE.LPBLNG(A1),D2GETINPUTBUFFERLENGTH%ADD.LD2,PBEAD(A1)ADDINTHELENGTH&SUB.L#1,PBEAD(A1)ACTUALENDADDRESS&BSRGETBUFGETINPUTBUFFERADDRESSES)MOVE.LA0,(A7)+RESTORETHEMENUADDRESS2MOVE.L(A7)+,PBEAD(A1)RESTOREUSER'SENDADDRESS4MOVE.L(A7)+,PBSAD(A1)RESTOREUSER'SSTARTADDRESS*BCLR#INP,RTFLAG(A1)CLEARTHEINPUTFLAG"TSTD0CHECKGETBUFRETURNSTATUS)BNE.SSOWI40BRANCHIFANERRORRETURNED:MOVE.LA4,RTBUFA(A1)SAVETHEINPUTBUFFERADDRESSINCCB6MOVE.W#OUTIN,(A0)+SETOUTPUTWITHINPUTSWITCHFLAG+MOVE.LA4,(A0)+INPUTBUFFERSTARTADDRESS)MOVE.LA5,(A0)+INPUTBUFFERENDADDRESSBTST#10,D3FORMATTEDINPUT? BNE.SSOWI20BRANCHIFNO,IMAGE.BSET#FORM,RTFLAG(A1)SETFORFORMATTEDINPUT&MOVE.W#OUT,(A0)+SETMENUFOROUTPUT8LEALFCR(A6),A4LINEFEEDCARRIAGERETURNSTARTADDRESS2MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNADDRESS2ADD.L#1,A4LINE-FEEDCARRIAGERETURNENDADDRESS6MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNENDADDRESSSOWI20CLR.W(A0)SETFORENDBTST#5,D3TOECHO?BNE.SSOWI30BRANCHIFNO'BSET#ECHO,RTFLAG(A1)SETTOECHOMODE2SOWI30MOVE.B#$33,CREG(A3)ENABLETHETRANSMITTERCLR.LD0SETFORGOODRETURNSOWI40RTSRETURNTOCALLERENDC IFNEVMPPPAGE*?*PPWRITWRITEROUTINEFORVERSAmodule-01PARALLELPORT-PRINTER,*DETERMINA EBUFFERADDRESSESFORTHEOUTPUT.*DETERMINEI/OOPTIONS.#*BUILDTHEMENUENTRYFORTHEI/O.*ARMFORINTERRUPT.,*OUTPUTANULLBYTETOACTIVATETHEPRINTER,*ALLI/ODONEININTERRUPTSERVICEROUTINE.0*WHENTHEI/OISCOMPLETETHEINTERRUPTSERVICE**ROUTINEEXITSANDCAUSESANEVENTTOTHE.*ASR,WHICHHANDLESSETTINGALLTHECOMPLETION#*FLAGSANDDETECTSANYI/OERRORS.&*ENTRY:A1=REQUESTTABLEENTRYADDRESS*A2=CCBADDRESS*A3=MEMORYMAPPEDI/OADDRESS!*A6=BASEADDRESSOFDATASEGMENT%*EXIT:D0=0=GOODRETURN,I/OINITIATED3*D0.BNOT0=ERRORFOUND,D0CONTIANSTHEERRORCODE*I/ONOTINITIATED..*CONDITIONCODESSETACCORDINGTOD0CONTENTS*USES:01234567*D**A*PPP**P*CALLS:GETBUF* PPWRITEQU*0CLR.LRTRNLNG(A1)CLEARTHEI/OTRANSFERLENGTH+BSRGETBUFGETTHEOUTPUTBUFFERADDRESSES"BNE.SPPWRIT20BRANCHIFANERROR5MOVE.LA4,RTBUFA(A1)SAVETHERETURNEDSTARTADDRESS'BSRGETMENUAGOGETMENUENTRYADDRESS+BNE.SPPWRIT20BRANCHIFANERRORRETURNED!MOVE.W#OUT,(A0)+SETFOROUTPUT.MOVE.LA4,(A0)+SAVETHEBUFFERSTARTADDRESS.MOVE.LA5,(A0)+SAVETHERETURNEDENDADDRESS0MOVE.WPBOPTS(A1),D0GETTHEUSER'SI/OOPTIONSBTST#3,D0FORMATTEDOUTPUT?"BNE.SPPWRIT10BRANCHIFNO,IMAGE'BSET#FORM,RTFLAG(A1)SETTOFORMATTED7MOVE.W#OUT,(A0)+FORMATTED,MUSTOUTPUTALINEFEED-CR8LEALFCR(A6),A4LINEFEEDCARRIAGERETURNSTARTADDRESS2MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNADDRESS2ADD.L#1,A4LINE-FEEDCARRIAGERETURNENDADDRESS6MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNENDADDRESS(PPWRIT10CLR.W(A0)ZEROFORENDOFMENU'MOVE.B#0,PDATA(A3)OUTPUTANULLBYTE&TST.BPDATA(A3)CLEARTHEACKNOWLEDGE%MOVE.B#$34,PCREG(A3)STROBETOSEND.MOVE.B#$3C,PCREG(A3)STROBETOSENDTHEBYTECLR.LD0SETFORAGOODRETURNPPWRIT20RTSRETURNTOCALLERENDCIFNE(VM2+VME400SP)PAGE*A*VM2READREADROUTINEFORVERSAmodule-02ANDVME400ASYNCHRONOUS*SERIALPORTS*SETINPUTFLAG."*USESVM2WRTROUTINEFORTHEREAD&*ENTRY:A1=REQUESTTABLEENTRYADDRESS*A2=CCBADDRESS*A3=MEMORYMAPPEDI/OADDRESS!*A6=BASEADDRESSOFDATASEGMENT* VM2READEQU*'BSET#INP,RTFLAG(A1)SETTOINPUTMODEPAGE*A*VM2WRTWRITEROUTINEFORVERSAmodule-02ANDVME400ASYNCHRONOUS%*SERIALPORTS(USEDBYVM2READALSO))*DETERMINEBUFFERADDRESSESFORTHEI/O.*DETERMINEUSER'SI/OOPTIONS.3*BUILDTHEMENUENTRIESFORTHEISRTODOTHEI/O.,*ALLI/ODONEININTERRUPTSERVICEROUTINE.0*WHENTHEI/OISCOMPLETETHEINTERRUPTSERVICE**ROUTINEEXITSANDCAUSESANEVENTTOTHE.*ASR,WHICHHANDLESSETTINGALLTHECOMPLETION#*FLAGSANDDETECTSANYI/OERRORS.&*ENTRY:A1=REQUESTTABLEENTRYADDRESS*A2=CCBADDRESS*A3=MEMORYMAPPEDI/OADDRESS!*A6=BASEADDRESSOFDATASEGMENT%*EXIT:D0=0=GOODRETURN,I/OINITIATED3*D0.BNOT0=ERRORFOUND,D0CONTIANSTHEERRORCODE*I/ONOTINITIATED..*CONDITIONCODESSETACCORDINGTODOCONTENTS*USES:01234567*D**A*PPP**P*CALLS:GETBUFGETMENA** VM2WRTEQU*,CLR.LRTRNLNG(A1)CLEARI/OTRANSFERLENGTH$BSRGETBUFGETI/OBUFFERADDRESSES BNEVM2WRT50BRANCHIFANERROR3MOVE.LA4,RTBUFA(A1)SAVETHEBUFFERSTARTADDRESS'BSRGETMENUAGOGETMENUTABLEADDRESS BNEVM2WRT50BRANCHIFANERROR0MOVE.WPBOPTS(A1),D0GETTHEUSER'SI/OOPTIONSBTST#5,D0TOECHOTHEI/O?BNE.SVM2WRT10BRANCHIFNO'BSET#ECHO,RTFLAG(A1)SETTOECHOMODE"VM2WRT10BTST#3,D0FORMATTEDI/O?"BNE.SVM2WRT20BRANCHIFNO,IMAGE,BSET#FORM,RTFLAG(A1)SETTOFORMATTEDMODE*VM2WRT20BTST#INP,RTFLAG(A1)DOINGINPUT?)BNE.SVM2WRT30BRANCHIFYES,DOINGINPUT*4*DOINGSERIALPORTOUTPUT-SETUPFORINTERRUPTMODE*ANDBUILDTHEMENUENTRIES*MOVE.W#OUT,(A0)+OUTPUTFLAG,MOVE.LA4,(A0)+OUTPUTBUFFERSTARTADDRESS*MOVE.LA5,(A0)+OUTPUTBUFFERENDADDRESS(BTST#FORM,RTFLAG(A1)FORMATTEDOUTPUT?"BEQ.SVM2WRT25BRANCHIFNO,IMAGE+MOVE.W#OUT,(A0)+FORMATTED,DOMOREOUTPUT8LEAB LFCR(A6),A4LINEFEEDCARRIAGERETURNSTARTADDRESS2MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNADDRESS2ADD.L#1,A4LINE-FEEDCARRIAGERETURNENDADDRESS6MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNENDADDRESS(VM2WRT25CLR.W(A0)ZEROFORENDOFMENU1MOVE.B#$11,CREG(A3)POINTTOCONTROLREGISTER13MOVE.B#$1E,CREG(A3)ENABLETRANSMITTERINTERRUPTS1MOVE.B#$05,CREG(A3)POINTTOCONTROLREGISTER5(MOVE.B#$EA,CREG(A3)ENABLETRANSMITTER5MOVE.B#0,(A3)TRANSMITANULLTOGETTHINGSSTARTEDBRA.SVM2WRT40GOCONTINUE*3*DOINGSERIALPORTINPUT-SETUPFORINTERRUPTMODE*$VM2WRT30MOVE.W#IN,(A0)+INPUTFLAG+MOVE.LA4,(A0)+INPUTBUFFERSTARTADDRESS)MOVE.LA5,(A0)+INPUTBUFFERENDADDRESS'BTST#FORM,RTFLAG(A1)FORMATTEDINPUT?"BEQ.SVM2WRT35BRANCHIFNO,IMAGE7MOVE.W#OUT,(A0)+FORMATTED-MUSTOUTPUTALINE-FEED,CR8LEALFCR(A6),A4LINEFEEDCARRIAGERETURNSTARTADDRESS2MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNADDRESS2ADD.L#1,A4LINE-FEEDCARRIAGERETURNENDADDRESS6MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNENDADDRESS)VM2WRT35CLR.W(A0)ZEROSFORENDOFMENU1MOVE.B#$13,CREG(A3)POINTTOCONTROLREGISTER3%MOVE.B#$E1,CREG(A3)ENABLERECEIVERVM2WRT40 EQU *CLR.LD0SETFORGOODRETURNVM2WRT50RTSRETURNTOCALLERPAGE*5*VM2OWIOUTPUTWITHINPUTROUTINEFORVERSAmodule-02&*ANDVME400ASYNCHRONOUSSERIALPORTS.*DETERMINEOUTPUTANDINPUTBUFFERADDRESSES.*DETERMINEI/OOPTIONS.*BUILDTHEISRMENUENTRIES.*SETFORDOINGOUTPUT.*ARMFORINTERRUPT.,*ALLI/ODONEININTERRUPTSERVICEROUTINE.0*WHENTHEI/OISCOMPLETETHEINTERRUPTSERVICE**ROUTINEEXITSANDCAUSESANEVENTTOTHE.*ASR,WHICHHANDLESSETTINGALLTHECOMPLETION#*FLAGSANDDETECTSANYI/OERRORS.&*ENTRY:A1=REQUESTTABLEENTRYADDRESS*A2=CCBADDRESS*A3=MEMORYMAPPEDI/OADDRESS!*A6=BASEADDRESSOFDATASEGMENT%*EXIT:D0=0=GOODRETURN,I/OINITIATED4*D0.BNOT0=ERRORFOUND,D0CONTAINSTHEERRORCODE,*I/ONOTINITIATED./*CONDITIONCODESSETACCORDINGTOD0CONTENTS.*USES:01234567 *D*****A*PPP**P*CALLS:GETBUFGETMENUA* VM2OWIEQU*5BSET#OWIR,RTFLAG(A1)SETFOROUTPUTWITHINPUTFLAG,CLR.LRTRNLNG(A1)CLEARTHETRANSFERLENGTH'BSRGETBUFGETOUTPUTBUFFERADDRESSES BNEVM2OWI40BRANCHIFANERROR$BSRGETMENUAGETMENUENTRYADDRESS)BNEVM2OWI40BRANCHIFANERRORRETURNED*2*BUILDTHEMENUENTRIESFORTHEOUTPUTWITHINPUT*'MOVE.W#OUT,(A0)+SETFOROUTPUTFIRST,MOVE.LA4,(A0)+OUTPUTBUFFERSTARTADDRESS*MOVE.LA5,(A0)+OUTPUTBUFFERENDADDRESS0MOVE.WPBOPTS(A1),D3GETTHEUSER'SI/OOPTIONSBTST#3,D3FORMATTEDOUTPUT?"BNE.SVM2OWI10BRANCHIFNO,IMAGE+MOVE.W#OUT,(A0)+FORMATTED,SETFOROUTPUT8LEALFCR(A6),A4LINEFEEDCARRIAGERETURNSTARTADDRESS2MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNADDRESS2ADD.L#1,A4LINE-FEEDCARRIAGERETURNENDADDRESS6MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNENDADDRESS8VM2OWI10BSET#INP,RTFLAG(A1)FAKEINPUTFLAGFORGETBUF?MOVE.LPBSAD(A1),-(A7)SAVEUSER'SOUTPUTBUFFERSTARTADDRESS=MOVE.LPBEAD(A1),-(A7)SAVEUSER'SOUTPUTBUFFERENDADDRESS&MOVE.LA0,-(A7)SAVETHEMENUADDRESS:MOVE.LPBRRN(A1),PBSAD(A1)GETINPUTBUFFERSTARTADDRESS.MOVE.LPBRRN(A1),PBEAD(A1)SETUPENDADDRESS,MOVE.LPBLNG(A1),D2GETINPUTBUFFERLENGTH%ADD.LD2,PBEAD(A1)ADDINTHELENGTH&SUB.L#1,PBEAD(A1)ACTUALENDADDRESS(BSR.SGETBUFGETINPUTBUFFERADDRESSES)MOVE.LA0,(A7)+RESTORETHEMENUADDRESS2MOVE.L(A7)+,PBEAD(A1)RESTOREUSER'SENDADDRESS4MOVE.L(A7)+,PBSAD(A1)RESTOREUSER'SSTARTADDRESS*BCLR#INP,RTFLAG(A1)CLEARTHEINPUTFLAG"TSTD0CHECKGETBUFRETURNSTATUS+BNE.SVM2OWI40BRANCHIFANERRORRETURNED:MOVE.LA4,RTBUFA(A1)SAVETHEINPUTBUFFERADDRESSINCCB6MOVE.W#OUTIN,(A0)+SETOUTPUTWITHINPUTSWITCHFLAG+MOVE.LA4,(A0)+INPUTBUFFERSTARTADDRESS)MOVE.LA5,(A0)+INPUTBUFFERENDADDRESSBTST#10,D3FORMATTEDINPUTB ?"BNE.SVM2OWI20BRANCHIFNO,IMAGE.BSET#FORM,RTFLAG(A1)SETFORFORMATTEDINPUT&MOVE.W#OUT,(A0)+SETMENUFOROUTPUT8LEALFCR(A6),A4LINEFEEDCARRIAGERETURNSTARTADDRESS2MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNADDRESS2ADD.L#1,A4LINE-FEEDCARRIAGERETURNENDADDRESS6MOVE.LA4,(A0)+LINE-FEEDCARRIAGERETURNENDADDRESSVM2OWI20CLR.W(A0)SETFORENDBTST#5,D3TOECHO?BNE.SVM2OWI30BRANCHIFNO'BSET#ECHO,RTFLAG(A1)SETTOECHOMODE9VM2OWI30MOVE.B#$11,CREG(A3)POINTTOCONTROLREGISTER13MOVE.B#$1E,CREG(A3)ENABLETRANSMITTERINTERRUPTS1MOVE.B#$05,CREG(A3)POINTTOCONTROLREGISTER5,MOVE.B#$EA,CREG(A3)ENABLETHETRANSMITTER3MOVE.B#0,(A3)OUTPUTANULLTOGETTHINGSSTARTEDCLR.LD0SETFORGOODRETURNVM2OWI40RTSRETURNTOCALLERENDCPAGE*/*GETBUFGETTHESTARTANDENDBUFFERADDRESSES-*TOUSEFORTHEINPUTANDOUTPUT.IFNOMMU,/*USETHEUSER'SADDRESSSPACE.IFHAVEANMMU,#*USEINTERNALBUFFERSFORTHEI/O..*ONAWRITEANDANMMU,MOVETHEUSER'SOUTPUT *BUFFERTOTHEINTERNALBUFFER..*WHENUSINGTHEUSER'SADDRESSSPACE,ANYSIZE/*BUFFERISOK.WHENUSINGINTERNALBUFFERSTHE#*MAXIMUMBUFFERSIZEIS200BYTES.&*ENTRY:A1=REQUESTTABLEENTRYADDRESS!*A6=BASEADDRESSOFDATASEGMENT*EXIT:A1=UNCHANGED*A4=BUFFERSTARTADDRESS*A5=BUFFERENDADDRESS*D0=0=NOERRORSENCOUNTERED**D0.B=ERRORCODE,ANERRORWASENCOUNTERED,*CONDITIONCODESSETACCORDINGTOD0VALUE.*USES:01234567*DR**A*PPPRRP* GETBUF EQU * IFEQMMU*/*NOMMU-USEUSER'SADDRESSSPACEFORTHEI/O*)MOVE.LPBSAD(A1),A4BUFFERSTARTADDRESS'MOVE.LPBEAD(A1),A5BUFFERENDADDRESS#MOVE.LA4,D0GETTHESTARTADDRESS!MOVE.LA5,D1GETTHEENDADDRESS%SUB.LD0,D1CHECKFORAGOODADDRESS%BLT.SGETBUF10BRANCHIFENDGETBUF10MOVE.L#ISTADD,D0SETFORINVALIDDATABUFFERADDRESSRTSRETURNTOCALLERENDC IFNEMMU*#*HAVEANMMU-USEINTERNALBUFFER*-MOVE.LA1,A0GETREQUESTTABLEENTRYADDRESS!SUB.LA6,A0STRIPOFFTHEOFFSET+SUB.L#RTBL,A0STRIPOFFTHESTARTADDRESS%MOVE.LA0,D0NEEDINADATAREGISTER+BEQ.SGETBUF20BRANCHIFUSINGFIRSTENTRY%DIVU#RTELNG,D0GETTHEENTRYNUMBER=GETBUF20MULU#RECSIZ,D0GETOFFSETINTOINTERNALBUFFERAREAADD.LA6,D0ADDINTHEOFFSET&ADD.L#RECBUF,D0BUFFERSTARTADDRESS$MOVE.LD0,A4SAVETHESTARTADDRESS$MOVE.LA4,A5SET-UPFORENDADDRESS+MOVE.LPBEAD(A1),A0GETUSER'SENDADDRESSSUBA.LPBSAD(A1),A0GETLENGTH"ADDA.LA0,A5INTERNALENDADDRESS(MOVE.LA5,D1NEEDITINADATAREGISTERSUB.LD0,D1CHECKLENGTH&BLT.SGETBUF30BRANCHIFMOVE.LRTBUFA(A1),MPTR(A4)RESTOREINPUTBUFFERSTARTADDRESS7EXISR130SUB.L#MENUNTRY,A4POINTTOPREVIOUSMENUSLOT#MOVE.W#OUT,MOP(A4)SETFOROUTPUT8LEALFCR(A6),A5LINEFEEDCARRIAGERETURNSTARTADDRESS6MOVE.LA5,MPTR(A4)OUTPUTALINE-FEEDCARRIAGERETURN2ADD.L#1,A5LINEFEEDCARRIAGERETURNENDADDRESS%MOVE.LA5,MEND(A4)LF-CRENDADDRESS/SUB.L#MENUNTRY,A4POINTTOPREVIOUSMENUSLOT(BRAEXISRNXTGOPROCESSNEXTMENUENTRY**DELETEORBACKSPACECHARACTER*0EXISR140CMP.LRTBUFA(A1),A0ATSTARTOFBUFFER?"BEQ.SEXISR150BRANCHIFATSTART.SUB.L#1,MPTR(A4)BACKUPTODELETEDCHARACTER$SUB.L#1,RTRNLNG(A1)DON'TCOUNTIT,EXISR150CMP.B#BS,D7ABACKSPACECHARACTER?"BEQEXISRNWKBRANCHIFYES,RETURN/SUB.L#MENUNTRY,A4POINTTOPREVIOUSMENUSLOT#MOVE.W#OUT,MOP(A4)SETFOROUTPUT(LEABKSL(A6),A5BACKSLASHSTARTADDRESS+MOVE.LA5,MPTR(A4)MUSTOUTPUTABACKSLASH,MOVE.LA5,MEND(A4)ENDADDRESSOFBACKSLASH/SUB.L#MENUNTRY,A4POINTTOPREVIOUSMENUSLOT(BRAEXISRNXTGOPROCESSNEXTMENUENTRYENDCIFNE(PIA+VMEPIA)PAGE*PIAINTERRUPT-OUTPUTONLY*ONENTRY:A2=CCBADDRESS*A3=MEMORYMAPPEDI/OADDRESS*USES:A0=CHARACTERADDRESS *A1=REQUESTTABLEENTRYADDRESS*A4=MENUADDRESS*=EXISR170MOVE.LCCBBUF(A2),A1GETREQUESTTABLEENTRYADDRESS'MOVE.LCCBSADR(A2),A4GETMENUADDRESS)MOVE.LMPTR(A4),A0GETCHARACTERADDRESS.MOVE.B#$04,2(A3)SELECTDATAREGISTER,A-SIDE*MOVE.B(A3),D0STROBETOCLEARINTERRUPTS.MOVE.B#$04,6(A3)SELECTDATAREGISTER,B-SIDE+MOVE.B4(A3),D0STROBETOCLEARINTERRUPTS+MOVE.B#$2F,2(A3)SELECTINTERRUPTS,A-SIDE+MOVE.B#$3D,6(A3)SELECTINTERRUPTS,B-SIDE&MOVE.B4(A3),D7GETFAULTINFORMATION-AND.B#$07,D7MASKTOBUSY,FAULT,SELECTBITS#CMP.B#$01,D7SELECTED&NOFAULT?+BEQ.SEXISR190BRANCHIFYES,EVERYTHINGOK$BSET#FLT,RTFLAG(A1)SETFAULTFLAG3MOVE.B#ISTADNR,CCBBSY(A2)SETTODEVICENOTREADY**CLEARTHEPIA*6EXISR180MOVE.B#$04,2(A3)SELECTDATAREGISTER,A-SIDEMOVE.B(A3),D0READTOCLEAR.MOVE.B#$04,6(A3)SELECTDATAREGISTER,B-SIDEMOVE.B4(A3),D0READTOCLEAR'MOVE.B#$3C,6(A3)NOINTERRUPTS,B-SIDE'MOVE.B#$2E,2(A3)NOINTERRUPTS,A-SIDE.BRAEXISRWK1GORETURNFROMINTERRUPTSERVICE**SEEIFCANOUTPUTNEXTBYTE*/EXISR190CMPA.LMEND(A4),A0PASTENDOFD BUFFER?0BGT.SEXISR210BRANCHIFYES,GETNEXTMENUITEM0EXISR200MOVE.B(A0)+,D0GETNEXTBYTETOOUTPUT"MOVE.LA0,MPTR(A4)UPDATEPOINTERADD.L#1,RTRNLNG(A1)COUNTIT**OUTPUTNEXTBYTE**MOVE.BD0,(A3)PLACEINTHEDATAREGISTER!MOVE.B(A3),D0STROBETOSENDITBSREXISRNW1GORETURN**GETNEXTMENUITEM-PIA*/EXISR210ADD.L#MENUNTRY,A4POINTTONEXTENTRYMOVE.LA4,CCBSADR(A2)SAVEIT'MOVE.WMOP(A4),D0GETTHEOPTIONTODO.BEQ.SEXISR180BRANCHIFEND,GOCLEARTHEPIACMP.B#OUT,D0FOROUTPUT?BEQ.SEXISR220BRANCHIFYES:MOVE.B#ISTAIE,CCBBSY(A2)ERROR-SETTOINVALIDMENUENTRY(BSET#FLT,RTFLAG(A1)SETTHEERRORFLAG)BRAEXISR180GOCLEARTHEPIAANDRETURN**STARTNEXTPIAOUTPUT*1EXISR220MOVE.LMPTR(A4),A0GETCHARACTERADDRESSBRAEXISR200GOOUTPUTITENDC1ENDC(ENDOFEXORmacsINTERRUPTSERVICEROUTINE)0IFNEVMSAASSEMBLEISRUNNINGINVERSAmodule-01PAGE*%*SPISRINTERRUPTSERVICEROUTINEFOR**VERSAmodule-01ASYNCHRONOUSSERIALPORTS6*POLLTHECCB'SASSOCIATEDWITHTHISINTERRUPTVECTOR,*TOFINDWHICHDEVICECAUSEDTHEINTERRUPT.2*THEMENUENTRYPOINTEDTOWITHINTHECCBISUSED4*TODIRECTTHEI/O.RETURNAFTEREACHBYTETRANSFER"*WITHNOWAKE-UP,NOEVENTQUEUED.0*WHENTHEI/OISCOMPLETE(BUFFERSAREEXHAUSTED.*ANDMENUENTRY=0)ORANERRORISENCOUNTERED4*THEISRRETURNSBYQUEUINGANEVENTTOTHEDEFAULT5*ASR(ISREVT).THEEVENTMESSAGEISTHEREQUESTTABLE%*ENTRYADDRESSOFTHECOMPLETEDI/O.2*REGISTERUSAGE:A0=INPUT/OUTPUTCHARACTERADDRESS *A1=REQUESTTABLEENTRYADDRESS*A2=CCBADDRESS*A3=MEMORYMAPPEDI/OADDRESS*A4=CURRENTMENUENTRYADDRESS!*A6=BASEADDRESSOFDATASEGMENT* SPISREQU*+MOVE.LA1,A6GETDATASEGMENTBASEADDRESS**POLLTHECCB'S*-MOVE.L#SPCNT,D2NUMBEROFSERIALPORTCCB'S(MOVE.L#CCBCNT,D1TOTALNUMBEROFCCB'S)LEACCBBEG(A6),A2STARTADDRESSOFCCB'S6SPISR10CMP.L#'VMSA',CCBTYPE(A2)ANASY.SERIALPORT?+BNE.SSPISR30BRANCHIFNO,SEARCHNEXTCCB+SUB.L#1,D2ANASY.PORT,DECREMENTCOUNTER4MOVE.LCCBMEMA(A2),A3GETMEMORYMAPPEDI/OADDRESS-MOVE.BCREG(A3),D0READTHECONTROLREGISTERBTST#CR0,D0SETFORTRANSMIT?/BEQ.SSPISR20BRANCHIFNO,SEEIFFORRECEIVER,MOVE.BSREG(A3),D3READTHESTATUSREGISTER$BTST#SR0,D3TRANSMITTERINTERRUPT?BNE.SSPISRTRNBRANCHIFYES$BTST#SR2,D3TRANSMITTERINTERRUPT?BNE.SSPISRTRNBRANCHIFYES&CMP.B#$C0,D3ANYTRANSMITTERERRORS?+BEQ.SSPISR30BRANCHIFNO,SEARCHNEXTCCB-BRA.SSPISR40ANERROR-GOFINDOUTWHATKIND&SPISR20BTST#CR2,D0SETFORRECEIVER?+BEQ.SSPISR30BRANCHIFNO,SEARCHNEXTCCB,MOVE.BSREG(A3),D3READTHESTATUSREGISTER!BTST#SR1,D3RECEIVERINTERRUPT?BNESPISRECBRANCHIFYESCMP.B#$C0,D3ANYERRORS?5BNE.SSPISR40BRANCHIFERRORS,GOFINDOUTWHATKIND*SPISR30TST.LD2ANYMOREPORTSTOSEARCH?/BEQSPREC10BRANCHIFNO,IGNORETHISINTERRUPT"SUB.L#1,D1DECREMENTTOTALCOUNT BEQSPREC10IGNOREIFNONELEFT"ADD.L#CCBLNG,A2NEXTCCBADDRESSBRASPISR10GOPOLLITPAGE*(*ERRORFOUNDDURINGTRANSMITORRECEIVE*8SPISR40MOVE.LCCBBUF(A2),A1REQUESTTABLEENTRYADDRESSBTST#SR4,D3DATAOVERRUN?BEQ.SSPISR60BRANCHIFNO.MOVE.B#ISTADO,CCBBSY(A2)SETTODATAOVERRUN,SPISR50BRASPNXTERGORETURNWITHERRORSET#SPISR60BTST#SR5,D3FRAMINGERROR?BEQ.SSPISR70BRANCHIFNO/MOVE.B#ISTAFE,CCBBSY(A2)SETTOFRAMINGERRORBRASPISR50GORETURN;SPISR70MOVE.B#ISTADNR,CCBBSY(A2)MUSTBEDEVICENOTREADYBRASPISR50GORETURNPAGE*0*ASYNCHRONOUSSERIALPORTINTERRUPT-TRANSMITTER*SPISRTRNEQU*#TST.BCCBBSY(A2)ATRUEINTERRUPT?%BEQ.SSPREC10BRANCHIFNO-GORETURN5MOVE.LCCBBUF(A2),A1GETREQUESTTABLEENTRYADDRESS-MOVE.LCCBSADR(A2),A4GETMENUENTRYADDRESS)MOVE.LMPTR(A4),A0GETCHARACTERADDRESS#BCLR#DOECHO,MOP(A4)INECHOMODE?BEQ.SSPTRN10BRANCHIFNO*<*ININPUTECHOMODE-GETTHEBYTEANDCONTINUEWITHRECEIVERE *CLR.LD7CLEARFORUSE)MOVE.BCCBEADR(A2),D7GETTHEINPUTBYTE&MOVE.B#$36,CREG(A3)ARMTHERECEIVER'BRASPRECAFTGOCONTINUEWITHRECEIVER**SEEIFBUFFERISFULL*&SPTRN10CMP.LMEND(A4),A0BUFFERFULL?!BLE.SSPTRN20BRANCHIFNOTFULL*,*OUTPUTBUFFEREXHAUSTED-DISARMTRANSMITTER*5MOVE.B#$22,CREG(A3)DISARMTRANSMITTERANDRECEIVER!BRASPNEXTGOGETNEXTMENUITEM**OUTPUTTHENEXTBYTE*3SPTRN20BTST#INP,RTFLAG(A1)HEREBECAUSEOFINPUT?BNE.SSPTRN30BRANCHIFYES-BTST#OWIR,RTFLAG(A1)HEREBECAUSEOFINPUT?BNE.SSPTRN30BRANCHIFYES%ADD.L#1,RTRNLNG(A1)COUNTTHISBYTE/SPTRN30MOVE.B(A0)+,D0GETNEXTBYTETOOUTPUT&MOVE.LA0,MPTR(A4)UPDATETHEPOINTER"MOVE.BD0,THR(A3)OUTPUTTHEBYTECLR.LD0RETURNFROMINTERRUPTTRAP#1RTEDIRECTIVEPAGE**RECEIVERINTERRUPTFOUND* SPISRECEQU*#TST.BCCBBSY(A2)ATRUEINTERRUPT?2BEQ.SSPREC10BRACNHIFNO-GOCLEARITANDRETURN5MOVE.LCCBBUF(A2),A1GETREQUESTTABLEENTRYADDRESS*BTST#INP,RTFLAG(A1)ENTRYSETFORINPUT?BNE.SSPREC20BRANCHIFYES+BTST#OWIR,RTFLAG(A1)ENTRYSETFORINPUT?BNE.SSPREC20BRANCHIFYES>SPREC10MOVE.B#$22,CREG(A3)TURNOFFRECEIVERANDTRANSMITTER%BRA.SSPRECRTNRETURNFROMINTERRUPT4SPREC20MOVE.LCCBSADR(A2),A4GETMENUENTRYADDRESS)MOVE.LMPTR(A4),A0GETCHARACTERADDRESS!MOVE.BRHR(A3),D7READTHEINPUTAND.B#$7F,D7MASKTO7BITS*BTST#ECHO,RTFLAG(A1)TOECHOTHISINPUT?BEQ.SSPRECAFTBRANCHIFNO**ECHOTHEINPUT*)MOVE.BD7,CCBEADR(A2)SAVETHECHARACTER*BSET#DOECHO,MOP(A4)SETTHEDOECHOFLAG9MOVE.B#$33,CREG(A3)DISABLERECEIVER,ENABLETRANSMITTER"MOVE.BD7,THR(A3)OUTPUTTHEBYTE*2*RETURNFROMINTERRUPT-NOWAKEUP,NOEVENTQUEUED*(SPRECRTNCMP.B#CR,D7ACARRIAGERETURN?*BEQ.SSPREC40BRANCHIFACARRIAGERETURNCLR.LD0NORTEOPTIONSTRAP#1RTEDIRECTIVE*"*DETERMINEIFASPECIALCHARACTER*/SPRECAFTBTST#FORM,RTFLAG(A1)FORMATTEDINPUT?!BEQ.SSPREC30BRANCHIFNO,IMAGE0CMP.B#CNTLX,D7CONTROL-XFORCANCELTHISLINE?"BEQ.SSPREC60BRANCHIFCONTROL-X0CMP.B#CNTLS,D7CONTROL-SFORRE-DISPLAYINPUT?"BEQ.SSPREC50BRANCHIFCONTROL-S CMP.B#DEL,D7DELETECHARACTER?)BEQ.SSPREC80BRANCHIFDELETECHARACTER!CMP.B#BS,D7BACKSPACECHARACTER$BEQ.SSPREC80BRANCHIFABACKSPACE0SPREC30MOVE.BD7,(A0)+SAVETHEINPUTCHARACTER-MOVE.LA0,MPTR(A4)UPDATETHEBUFFERPOINTERADD.L#1,RTRNLNG(A1)COUNTITCMP.LMEND(A4),A0BUFFERFULL?0BLESPRECRTNBRANCHIFNO,RETURNFROMINTERRUPT*+*CARRIAGERETURNINPUTORATENDOFBUFFER***MOVEPBMOVETHE'TRAP'PARAMETERBLOCKBACKTOTHEREQUESTOR*&*ENTRY:A1=REQUESTTABLEENTRYADDRESS!*A6=BASEADDRESSOFDATASEGMENT*EXIT:GOODRETURN-TOCALLER *ERRORRETURN-FATAL,BIOSABORTS**USES:01234567*D* *A*P*P* MOVEPBEQU* IFNEMMU8LEATRAP1PB(A6),A0MOVELOGICALPARAMETERBLOCKADDRESS)MOVE.L#MOVELL,D0MOVELOGICALDIRECTIVE&MOVE.L#TASK,MOVSTSK(A0)MYTASKNAME,MOVE.L#SESSN,MOVSSES(A0)MYSESSIONNUMBER(LEAEVPB(A1),A5PARAMETERBLOCKADDRESS%MOVE.LA5,MOVSADR(A0)SOURCEADDRESS3MOVE.LEVTSK(A1),MOVDTSK(A0)DESTINATIONTASKNAME1MOVE.LEVSES(A1),MOVDSES(A0)DESTINATIONSESSION0MOVE.LEVA0(A1),MOVDADR(A0)DESTINATIONADDRESS+MOVE.L#IOSPBLNG,MOVLNG(A0)LENGTHOFMOVE!TRAP#1CALLEXECTODOTHEMOVE(BNE.SMOVELERRBRANCHIFANERROR,FATALRTSRETURNTOCALLERENDC IFEQMMU6MOVE.LEVA0(A1),A0GETUSER'SPARAMETERBLOCKADDRESS'MOVE.BPBSTA(A1),4(A0)SETSTATUSBYTE-MOVE.LPBLNG(A1),$14(A0)SETTRANSFERLENGTHRTSENDCPAGE*(*ACKSRQACKNOWLEDGETHESERVICEREQUEST*&*ENTRY:A1=REQUESTTABLEENTRYADDRESS!*A6=BASEADDRESSOFDATASEGMENT"*D0=CONTENTSOFD0TOBERETURNED*EXIT:GOODRETURN-TOCALLER *ERRORRETURN-FATAL,BIOSABORTS*USES:01234567*D** *A*PP* ACKSRQEQU*+LEATRAP1PB(A6),A0PARAMETERBLOCKADDRESS-MOVE.LEVTSK(A1),AKRTSK(A0)TARGETTASKNAME+MOVE.LEVSES(A1),AKRSES(A0)TARGETSESSION(MOVE.BEVTIN(A1),D1GETTHETRAPNUMBER'AND.L#$0F,D1STRIPOFFANYEXTRABITS MOVE.BD1,AKRTN(A0)TRAPNUMBER!TST.LD0SETTHECONDITIONCODES%MOVE.WSR,D1GETTHECONDITIONCODES7MOVE.BD1,AKRCC(A0)CONDITIONCODESTOTHEPARA.BLOCK&MOVE.LD0,AKRD0(A0)SETD0FORRETURN;MOVE.W#AKROPT,AKROP(A0)OPTIONS=SETCC,D0,REACTIVATETASK(MOVE.L#AKRQST,D0ACKNOWLEDGEDIRECTIVE(TRAP#1CALLEXECTODOTHEACKNOWLEDGE(BNE.SAKRQSTERBRANCHIFANERROR,FATALRTSRETURNTOCALLERPAGE**FATALERRORS-BIOSABORTS%*D3=ERRORCODE-ONTHEABORTOUTPUT(*D4=ERRORADDRESS-ONTHEABORTOUTPUT*5GTSEGERRBSR.SABRTGETMEMORYMAPPEDI/OSPACEERROR>ASQERRBSR.SABRTALLOCATEASQERROR)SERVERR2BSR.SABRTTRAP#2SERVICEERROR)SERVERR3BSR.SABRTTRAP#3SERVICEERROR5CISREXERBSR.SABRTCISRFOREXORmacsORVME110ERROR@CISRPPERBSR.SABRTCISRFORVERSAmodule-01-PARALLELPORTSERROR>CISRSPERBSR.SABRTCISRFORVERSAmodule-01-SERIALPORTSERRORDEXORISRRBSR.SABRTISREXORmacsORVME110ERROR-NOINTERRUPTSFOUND7MOVELERRBSR.SABRTCAN'TMOVEPARA.BLOCKBACKTOUSER-AKRQSTERBSR.SABRTACKNOWLEDGEREQUESTERROR3NOENTRYBSR.SABRTNOENTRIESAVAILABLEFORRDEVENT$RDEVNTERBSR.SABRTREADEVENTERROR+DERQSTERBSR.SABRTSETSERVERSTATUSERROR(SETASQERBSR.SABRTSETASQSTATUSERROR;CISRVM2RBSR.SABRTCISRFORVERSAmodule-02ORVME110ERROR>VM02ERRBSR.SABRTCCB'SFORVERSAmodule-2ORVME110NOTFOUNDNOP9ABRTMOVE.L(A7),D4SAVETHEERRORADDRESSFORVISABILITY6ABRT10MOVE.LD0,D3SAVETHEERRORCODEFORVISABILITY!MOVE.L#ABORT,D0ABORTDIRECTIVE TRAP#1CALLEXECTOABORTBIOS ENDBIOSINITH   =/*BIOS.AF=/*=/*=/*@=/*IFNOOUTPUTARGUMENTFORTHELISTINGISSPECIFIEDTHECHAIN =/*FILEWILLDEFAULTTOBIOS.LS=/*=/IFC \1 =ARG BIOS.LS=/ENDIF=/*=ASM BIOS,BIOS,\1;MRZ=66=/*{ Included files are:=/*--none--=/*}=/*=END=/*=/*1=/*ThislinkfilewaspreviouslycalledLBIOS.CF?=/*Thenamewaschangedtomorecorrectlyreflectitsidentity=/*=/*=LINK ,BIOS,BIOS;IXHMSEGMENT SEG0:8 \BIOSSTRTIN BIOSEND=ENDH   I=/*********************************************************************** =/* RMSGEN.CF'=/*SYSGENcommandfiletosysgenRMS*I=/***********************************************************************=OPT N,O=/*==/*Insuretwoarguments.Secondargumentdefaultsto'#NULL'=/*=/RX=\0 =/IF RX = 0 =ARGNOARG=/RX=\0=/ENDIF =/IF RX = 1=ARG\1,#NULL=/RX=\0=/ENDIF=/*$=/* See if we have a valid mnemonic.2=/*Ifnotavalidmnemonic,putouthelpmessage.=/RX=0=/IFEQ "EXORMACS"\1=/RX=1=/ENDIF=/IFEQ "VM01"\1=/RX=1=/ENDIF=/IFEQ "VM02"\1=/RX=1=/ENDIF=/IFEQ "VM03"\1=/RX=1=/ENDIF=/IFEQ "VME101"\1=/RX=1=/ENDIF=/IFEQ "VME110"\1=/RX=1=/ENDIF=/IFEQ "VMES10"\1=/RX=1=/ENDIF=/IFEQ "NETVM02"\1=/RX=1=/ENDIF =/IF RX=0 =OPT-NO=/***HELPMESSAGE**=/*7=/*Noargumentoraninvalidargumentwasspecified-==/*Thischainfilemustberestartedwithavalidargument.3=/*Adescriptionofthecallingsequencefollows.A=/*Typetocontinuehelpmessageafterreadingonescreen.=/*=/*Callingsequence:=/*=RMSGEN.CFarg1,arg2=/*=/*arg1=Mnemonic=/*arg2=Outputfile/device=/*D=/*Arg1isoptional.Ifnotspecified,ahelpmessagewillappear.A=/*Arg2willtypicallybe'#NULL'or'#PR'-defaultsto#NULL.=/*=/*=/&>=/*RMSGEN.CFwillperformtheRMSsysgenassociatedwiththe=/*specifiedmnemonic.=/*1=/*Themnemonic(arg1)isoneofthefollowing:=/*=/*"EXORMACS" =/*"VM01" =/*"VM02" =/*"VM03" =/*"VME101" =/*"VME110" =/*"VMES10"=/*"NETVM02"=/&=NOARG=@END=/ENDIF =/IF RX=1=DEL&.S.LS/&.SYSASM.LS=/ENDIF=/RX=0F=/*-------------------------------------------------------------------F=/*-------------------------------------------------------------------=/IFEQ "EXORMACS"\1 =OPT-NO =SYSGENEXORMACS.RMS.CD,,&.S.LS=/RX=1=/IFRD<$C000=/R?=/*ErrorsinSYSGEN _ W %=@END=/ENDIF=COPYEXORMACS.RMS.LL,&.S.LS;A$=/*CreatedfileisEXORMACS.RMS.LO=/*and&.S.LS=/ENDIF=OPT NOF=/*-------------------------------------------------------------------F=/*---------------------------------------------------I ----------------=/IFEQ "VM01"\1 =OPT-NO=SYSGENVM01.RMS.CD,,&.S.LS=/RX=1=/IFRD<$C000=/R?=/*ErrorsinSYSGEN=@END=/ENDIF=COPYVM01.RMS.LL,&.S.LS;A =/*CreatedfileisVM01.RMS.LO=/*and&.S.LS=/ENDIF=OPT NOF=/*-------------------------------------------------------------------F=/*-------------------------------------------------------------------=/IFEQ "VM02"\1 =OPT-NO=SYSGENVM02.RMS.CD,,&.S.LS=/RX=1=/IFRD<$C000=/R?=/*ErrorsinSYSGEN=@END=/ENDIF=COPYVM02.RMS.LL,&.S.LS;A =/*CreatedfileisVM02.RMS.LO=/*and&.S.LS=/ENDIF=OPT NOF=/*-------------------------------------------------------------------F=/*-------------------------------------------------------------------=/IFEQ "VM03"\1 =OPT-NO=SYSGENVM03.RMS.CD,,&.S.LS=/RX=1=/IFRD<$C000=/R?=/*ErrorsinSYSGEN=@END=/ENDIF=COPYVM03.RMS.LL,&.S.LS;A =/*CreatedfileisVM03.RMS.LO=/*and&.S.LS=/ENDIF=OPT NOF=/*-------------------------------------------------------------------F=/*-------------------------------------------------------------------=/IFEQ "VME101"\1 =OPT-NO=SYSGENVME101.RMS.CD,,&.S.LS=/RX=1=/IFRD<$C000=/R?=/*ErrorsinSYSGEN=@END=/ENDIF=COPYVME101.RMS.LL,&.S.LS;A"=/*CreatedfileisVME101.RMS.LO =/*&.S.LS=/ENDIF=OPT NOF=/*-------------------------------------------------------------------F=/*-------------------------------------------------------------------=/IFEQ "VME110"\1 =OPT-NO=SYSGENVME110.RMS.CD,,&.S.LS=/RX=1=/IFRD<$C000=/R?=/*ErrorsinSYSGEN=@END=/ENDIF=COPYVME110.RMS.LL,&.S.LS;A"=/*CreatedfileisVME110.RMS.LO =/*&.S.LS=/ENDIF=OPT NOF=/*-------------------------------------------------------------------F=/*-------------------------------------------------------------------=/IFEQ "VMES10"\1 =OPT-NO=SYSGENVMES10.RMS.CD,,&.S.LS=/RX=1=/IFRD<$C000=/R?=/*ErrorsinSYSGEN=@END=/ENDIF=COPYVMES10.RMS.LL,&.S.LS;A"=/*CreatedfileisVMES10.RMS.LO=/*and&.S.LS=/ENDIFF=/*-------------------------------------------------------------------F=/*-------------------------------------------------------------------=/IFEQ "NETVM02"\1 =OPT-NO=SYSGENNETVM02.RMS.CD,,&.S.LS=/RX=1=/IFRD<$C000=/R?=/*ErrorsinSYSGEN=@END=/ENDIF=COPYNETVM02.RMS.LL,&.S.LS;A#=/*CreatedfileisNETVM02.RMS.LO=/*and&.S.LS=/ENDIF=OPT NOF=/*-------------------------------------------------------------------F=/*-------------------------------------------------------------------=OPT -NO=COPY &.S.LS,\2;Y!=/* Output listing directed to \2=ENDFSYSPARIDNT5,1Systemparametersat\SYSPAR;Crashsaveat\CRASHSAV.O*v*****************************************************************************O*******************************************************************************O******************I *******************************************************************>***ROUTINE:SYSPAR--SYSTEMPARAMETERSTABLEFORRMS68K.*********J***ENVIRONMENT:PartoftheRMS68KexecfortheMotorola68000family.***(***Copyright1983byMotorola,Inc.*********H***FUNCTION:ThistablegetsSUBSedandASMedduringanRMSGEN,and***F***isthenlinkedinwithRMS68K.Thedatadefinedinthismodule***D***areprimarilythevariablesandparametersneededbyRMS68K.*********O*******************************************************************************O*******************************************************************************O*^***************************************************************************** *,*Revisionhistory(addnewchangestotop).*DateAuthorChanges@*------------------------------------------------------------*10/4/83SJFFormatrevision.*  **Includedfiles:**9995.&.TIOT.EQ*NOLISTINCLUDE9995.&.TIOT.EQLISTPAGE*E*Firstdefinethelocationofthe'crashsavearea,'theplacewhereD*theKILLERmodulewillsavetheprocessor'sregisters,etc.inthe*eventofasystemcrash.*XDEFCRASHSAVCRASHSAVEQU\CRASHSAV  *E*Nowdefinethestructureofthe'systemparametersarea'toalltheD*variousRMS68Kmodules.NotethatwearenotactuallydefininganyE*storagehere--thisisjustabigoffsetblockwhichwilldefinetheB*locationsoftheparameters.Initializationoftheparametersis1*handledbytheRMS68Kinitializeratboottime.*OFFSET\SYSPARXDEFSYSPAR,ENDSYSP SYSPAREQU* XDEFMAPBEG"MAPBEGDS.L1POINTSTOMEMORYMAPDS.L1XDEFEXCSTACK%EXCSTACKDS.L1ADDRESSOFEXECSTACK '< 0H 8L @3 XDEFRUNNER$RUNNERDS.L1ADDRESSOFRUNNINGTCB XDEFTCBHD0TCBHDDS.L1POINTSTOFIRSTTCBINALL-TCBLIST XDEFREADYHD0READYHDDS.L1POINTSTOFIRSTTCBINREADYLIST XDEFCCBHD2CCBHDDS.L1POINTSTOFIRSTCHANNELCONTROLBLOCK XDEFMMUHERE:MMUHEREDS.L1HOLDSADDRESSOFMMUHARDWAREINMEMORYMAP XDEFGSTBEG+GSTBEGDS.L1STARTOFGLOBALSEGMENTTABLE XDEFUSTBEG+USTBEGDS.L1STARTOFUSERSEMAPHORETABLE XDEFUDRBEG5UDRBEGDS.L1PointertoUserDefinedDirectiveTable XDEFPATBEG0PATBEGDS.L1STARTOFPERIODICACTIVATIONTABLEXDEFTRACEBEG+TRACEBEGDS.L1STARTOFSYSTEMTRACETABLEXDEFTRACFLAG"TRACFLAGDS.W1SYSTEMTRACEFLAGS XDEFMACSTRC,MACSTRCDS.L1MACSBUGTRACEROUTINEADDRESS XDEFPANEL PANELDS.L1FRONTPANELADDRESS**TIMERPARAMETERS** XDEFDATEDATEDS.L1ORDINALDATE XDEFTIMEOD(TIMEODDS.L1TIMEOFDAY(INSECS*1000) XDEFTIMBASETIMBASEDS.L1BASETIME XDEFDATBASEDATBASEDS.L1BASEDATE XDEFPTMADDR8PTMADDRDS.L1ADDRESSUSEDTOACCESSPROGRAMMABLETIMER XDEFTIMEOUT&TIMEOUTDS.W1TIMERINTERRUPTCOUNTERXDEFTIMESLICBTIMESLICDS.W1NUMBEROFTIMERINTERRUPTSBEFORETASKINTERRUPTED XDEFTIMINTV3TIMINTVDS.W1#MILLISECSBETWEENTIMERINTERRUPTSXDEFTIMINTV4TIMINTV4DS.W1TIMINTV*4-1XDEFTINTFLAG$TINTFLAGDS.B1TIMERINTERRUPTFLAGXDEFTMSGFLAG7TMSGFLAGDS.B1FLAG-MESSAGESENTDURINGI/OHANDLING* XDEFSPURCNT+SPURCNTDS.W1COUNTOFSPURIOUSINTERRUPTSXDEFSPURTIME9SPURTIMEDS.L1TIMETHAT1STSPURIOUSINTERRUPTOCCURRED* XDEFMMULOAD+MMULOADDS.L1MMULOADEDFROMTHISADDRESS XDEFVCTUBGN(VCTUBGNDS.L1STARTOFVECTORUSETABLEXDEFIOVCTBGN0IOVCTBGNDS.L1STARTOFVECTORASSIGNMENTTABLE* XDEFADEFTYP,ADEFTYPDS.B1DEFAULTMEMORYTYPEFORASQ'S XDEFTDEFTYP,TDEFTYPDS.B1DEFAULTMEMORYTYPEFORTCB'S XDEFSDEFTYP>SDEFTYPDS.B2DEFAULTMEMORYTYPEFORSYSTEMTASKS(ROANDRW) XDEFUDEFTYPJ LEAEXECPB(A6),A0ATTACHTOMEMORYMAPPEDI/OSPACE,IFNEEDED'MOVE.LA0,A1USEA1TOBUILDTHEBLOCKCLR.L(A1)+TASK=MECLR.L(A1)+SESSION=MEMOVE.W#SEGOPTS,(A1)+OPTIONS MOVE.W#SEGATR,(A1)+ATTRIBUTES"MOVE.L#'SHRS',(A1)+SEGMENTNAME MOVE.L#ADR,(A1)+STARTADDRESSMOVE.L#LNG,(A1)LENGTH'MOVE.L#GTSEG,D0GETSEGMENTDIRECTIVETRAP#1CALLEXEC!BNEDIEBRANCHIFITDIDN'TWORKENDCIFNEBIOSASSEMBLEFORBIOS*-*RELINQUISHTOGIVEBIOSTIMETOGETSTARTED**MOVE.L#RELINQ,D0RELINQDIRECTIVENUMBERTRAP#1CALLRMSENDCENDBIOS**DECLAREMYSELFSHAREABLE**MOVE.L#DCLSHR,D0DCLSHRDIRECTIVENUMBER-LEAEXECPB(A6),A0ADDRESSOFPARAMETERBLOCK1MOVE.LA0,A1USEA1TOBUILDTHEPARAMETERBLOCKCLR.L(A1)+MYTASKCLR.L(A1)+MYSESSIONCLR.W(A1)+OPTIONSMOVE.W#BIT13,(A1)+SHARABLEMOVE.LA1,A2SAVETHISADDRESSMOVE.LA1,A3ANDAGAIN"MOVE.L#'REP0',(A1)+SEGMENTNAME"MOVE.L#ENTRY,(A1)+STARTADDRESSCLR.L(L A1)NATRAP#1CALLRMS!BNEDIEBRANCHIFITDIDN'TWORK8MOVE.L#'DATA',(A2)+DECLAREDATASEGMENTSHARABLEALSOMOVE.LA6,(A2)STARTADDRESS-MOVE.L#DCLSHR,D0DECLARESHARABLEDIRECTIVETRAP#1CALLEXEC!BNEDIEBRANCHIFITDIDN'TWORK IFNEMMU=MOVE.L#'SHRS',(A3)+DECLAREMEMORYMAPPEDIOSPACESHARABLECLR.L(A3)NA-MOVE.L#DCLSHR,D0DECLARESHARABLEDIRECTIVETRAP#1CALLEXEC!BNEDIEBRANCHIFITDIDN'TWORKENDC**INITIALIZETASKNUMBER*AMOVE.L#1,TASKNO(A6)THISTASKISNUMBER1,BUTISCALLED'REPL'+IFEQVERSADOS+BIOSASSEMBLEFORINTERRUPTS*$*IFNOIOSERVER,THENDIFFERENTIO*!IFNEINTASSEMBLEFORINTERRUPTS&MOVE.L#CISR,D0CISRDIRECTIVENUMBER-LEACISRPB(A6),A0ADDRESSOFPARAMETERBLOCK1MOVE.LA0,A1USEA1TOBUILDTHEPARAMETERBLOCKCLR.L(A1)+TASK=MECLR.L(A1)+SESSION=MECLR.W(A1)+OPTIONSCLR.B(A1)+NA#MOVE.B#VECTNO,(A1)+VECTORNUMBERMOVE.L#ISR,(A1)+ISRADDRESS$MOVE.LA6,(A1)DATASEGMENTADDRESSTRAP#1CALLRMS#BEQ.SCISRDONEBRANCHIFITWORKEDBRADIEDIEIFITDIDN'TWORK*)*HERE'SWHEREWERESPONDTOANINTERRUPT* ISREQU*)LEASAYPB(A1),A6PARAMETERBLOCKADDRESS,MOVE.LSAYS(A6),A0POINTSTONEXTCHARACTER0CMP.LSAYE(A6),A0HASLASTCHARACTERBEENSENT?BGT.SISRDONEBRANCHIFYES,MOVE.B(A0)+,DATAPUTBYTEINDATAREGISTER#MOVE.LA0,SAYS(A6)REPLACEPOINTERCLR.LD0NOWAKEUPTRAP#1RTEDIRECTIVE)ISRDONEMOVE.B#$11,CNTLDISARMINTERRUPTMOVE.L#1,D0REQUESTWAKEUPTRAP#1RTEDIRECTIVE***SETCISRPARAMETERBLOCKUPFORNEXTUSE*CISRDONEEQU*3LEACISRPB(A6),A3GETCISRPARAMETERBLOCKADDRESS9MOVE.W#BIT14,CISROPT(A3)PREPAREFORSWITCHESTOFOLLOWENDCENDINTERRUPTSENDCENDNOIOSERVER**BUILDTHEOUTPUTBUFFERS*&LEASTRT(A6),A1STARTMESSAGEADDRESSMOVE.L#'TASK',(A1)+MOVE.L#'NUM',(A1)+MOVE.L#'BER',(A1)+MOVE.L#'S',(A1)+MOVE.L#'TART',(A1)+MOVE.W#$0A0D,(A1)+!MOVE.L#'TASK',(A1)+ENDMESSAGEMOVE.L#'NUM',(A1)+MOVE.L#'BER',(A1)+MOVE.L#'T',(A1)+MOVE.L#'ERMI',(A1)+MOVE.L#'NATE',(A1)+MOVE.W#$0A0D,(A1)*MOVE.W#10,NTASKS(A6)MAXNUMBEROFTASKSPAGE**REPLICATEDTASKSBEGINHERE* ENTRY2EQU*LEASTACK(A6),A7GETASTACK(MOVE.LTASKNO(A6),D7GETMYTASKNUMBER-IFEQVERSADOS+BIOSASSEMBLEFORNOIOSERVER!IFNEINTASSEMBLEFORINTERRUPTS**SWITCHVECTORTOME*&MOVE.L#CISR,D0CISRDIRECTIVENUMBER-LEACISRPB(A6),A0ADDRESSOFPARAMETERBLOCKTRAP#1CALLRMS#BEQ.SSWITCHEDBRANCHIFITWORKEDBSRDIEDIEIFITDIDN'TWORKSWITCHEDEQU*CONTINUEENDCENDINTERRUPTSENDCENDNOSERVER***(BSRASCIICONVERTTASKNOTOASCIIIND6)LEASTRT(A6),A1ADDRESSOFSTARTMESSAGE&LEASTRTE(A6),A2ENDOFSTARTMESSAGEBSRSAYSAYSTARTMESSAGE-CMP.WNTASKS(A6),D7DOWENEEDANOTHERTASK?-BGESAYDONEBRANCHIFI'MTHEHIGHESTNUMBER**REPLICATEMYSELF**ADD.L#1,TASKNO(A6)INCREMENTTASKNUMBER-MOVE.L#CRTCB,D0CREATETCBDIRECTIVENUMBER-LEATASKNO(A6),A0ADDRESSOFPARAMETERBLOCK'MOVE.LA0,A1USEA1TOBUILDTHEBLOCK ADD.L#4,A1BUMPPASTTASKNAMECLR.L(A1)+SESSIONCLR.W(A1)+OPTIONSCLR.L(A1)+NOMONITORCLR.L(A1)+NOMONITOR!MOVE.B#100,(A1)+PRIORITYLIMIT!MOVE.B#100,(A1)+PRIORITYLIMIT CLR.W(A1)+!MOVE.L#ENTRY2,(A1)+ENTRYPOINT CLR.W(A1)TRAP#1CALLRMS BEQ.SREPLDBRANCHIFITWORKED*:*CANNOTSTARTNEXTTASK,SETFORTHISISNOWTHELASTTASK*.SUB.L#1,TASKNO(A6)DECREMENTTHETASKNUMBER1MOVE.LTASKNO(A6),D7GETCURRENTNUMBEROFTASKS)MOVE.WD7,NTASKS(A6)SETNUMBEROFTASKSBRASAYDONEGOCOMPLETEREPLDEQU*CONTINUE* *GIVEADDRESSSPACETONEWTASK*1MOVE.L#SHRSEG,D0SHARESEGMENTDIRECTIVENUMBER-LEAEXECPB(A6),A0ADDRESSOFPARAMETERBLOCK1MOVE.LA0,A1USEA1TOBUILDTHEPARAMETERBLOCK"MOVE.LTASKNO(A6),(A1)+TASKNAMECLR.L(A1)+SESSIONIFEQVEL RSADOS5MOVE.W#BIT13,(A1)+LOGICALADDRESS=PHYSICALADDRESSENDCIFNEVERSADOS CLR.W(A1)+USELOGICALADDRESSENDCMOVE.W#BIT13,(A1)+ATTRIBUTESMOVE.L#'REP0',(A1)+NAMEIFEQVERSADOS!CLR.L(A1)+USEPHYSICALADDRESSENDCIFNEVERSADOS$MOVE.L#ENTRY,(A1)+LOGICALADDRESSENDC CLR.L(A1)+TRAP#1CALLRMS#BEQ.SHASSPACEBRANCHIFITWORKEDBSRDIEDIEIFITDIDN'TWORKHASSPACEEQU*CONTINUE$LEAEXECPB(A6),A0PARAMETERADDRESS'MOVE.LA0,A1USEA1TOBUILDTHEBLCOK,ADD.L#8,A1BUMPPASTTASKNAMEANDSESSION5MOVE.W#BIT13,(A1)+LOGICALADDRESS=PHYSICALADDRESSTST.W(A1)+SAMEATTRIBUTES"MOVE.L#'DATA',(A1)+SEGMENTNAME CLR.L(A1)USEPHYSICALADDRESS MOVE.L#SHRSEG,D0RMSDIRECTIVETRAP#1CALLRMS#BEQ.SHASPACE1BRANCHIFITWORKEDBSRDIEDIEIFITDIDN'THASPACE1EQU* IFNEMMU$LEAEXECPB(A6),A0PARAMETERADDRESS1MOVE.LA0,A1USEA1TOBUILDTHEPARAMETERBLOCK !UDR] 1BB 0$:g2 BpN@`a! 0aE QԊ!B1` 4! aJ fB GC <pN@`ad4+;B,g +x  ! EpBJjgREQG(m6AI p(Q !TCBga.x 2<aD/:NuHVM,@F'MH?-_8-O<2<a`,,FB-nNu0<`0<F虀2<"x :C2A022@02Nua&afaa|fa|C! aazNuBA$Pga^BE E Rf#*(B(:c*BK" B*AM,Brf` (< B*DBbaNu h g,a2 faN`aJga$`a@gaa`3| Nu~A C ((B*(B*DBbaNuBBBIKhHz ?B9 >9 6ONuNuSS P @ N REPLPREP0PPRAPpNAg` DATA,HpnUBXSf-ApA"HBBBY2 $I&I"REP0"PBNAf$DATA$pNAf-|nC<"TASK" NUM"BER " S"TART2 "TASK" NUM"BER " T"ERMI"NATE2 =| lO..na:C