IMD 1.17: 11/11/2014 13:00:43 82VKXBVERDOS B* VERSADOS/RMS68K OBJECT 4.3 SN=39358 9 OF 11  BT0982VKXBVERDOS 0420¿p-*g>*g RjÇaÞ* f@* g­,fí-`­ ,g` B­X­,AÕa Vfÿfa|`ÿ`HçAP$8>&68@HC(HD4<  g 4<8***HB* g2Hçz,* m6a``NqLß8`Lßp&*HC6‚€4*AÕaNqLß ‚R�`ÿ|@ç|$©%|ÿÿÿÿ#JFßNuIé L g(@´¬lò%B$€ ŠNu"x,Aé ?Fü'"HJ‘fNs Q²¨mð°hlê/(?(Bh (RhШ ²€lô!@B€0("((f"�"x, ©#H!|ÿÿÿÿFßNu94ga€î`*_aœ _N`Lßÿ\�?_f,J¹gaýžfJ9[g|øÿa¢AÖa Ö`tNs@ç9 4ga&î HçÿþNi/ /9b oF,hHV/(@À@ÿ?"h 0P*n6`2 f€\�,_( „!TCBgaÄJ@gÿZ @f AÖa7@`ÿJ @fÿBJ�f&HC4<HBAÖa  Nq`ÿ(HBHA(&64< ‚HB4`àâˆ&T�(,_" �!TCBga`Cð=C^AÖa6àJ®@gþæ$< ÿÿHCHD6`¤.xFü aüæMø"NJ© gì|,i 0.,@ÿfæ#n ®-!Î Kî.r?%2 °føB8[|øÿ1øTR®-fd.-fh®-fhJ¸g*n6aú n®ú`þðJngAÖavHzþˆ`>®úHzþÖ`AÖa`Hzþr`JnfB®@ÁAû-oü|úrNuHV,x Hî?ÿ-_8Ni-I<"x=iÿúúNuEø¦Çìs,)gÇ`"ÂüEø¦(NGs*r»Îg°$<‡42&26,(gÃáK,$( *,,,p<,.,>, ,"0<2 gB@2g<,*.,(>,°H@0,²H@"@J²f -@g4&@4+HC6+HCAòa@J²gHç@(AÕa „`0Lß raÈ,sf-|çOGB.ûAúþ¶.ˆNuLß,sò Rrì  ,NuÇ1G*Bh\è)!|EXEC°!| ´<(,Æ1F.½Èg$F-ÿ† g†1F,|ð& fa¬Nu1F,X� <1Wú!oü`äa aaaaaaaaaa a aaaaNq?/_g/ gºa aþ8 4g @ça ¤ªT�Kú`ªvLaaaaaaa a aNqNqa Nq`"`6`>?/_gL/ fX�—Ns?/_g0/ gNa"/ fÈ?/ _g/ g&aaýr8 4g @ça ªT�Kú` ¸H.ž•â� n2-4.(g^2-,6"’må‰Ü�z n6a²`Nq`<"FJ‘g6*8š�,.<œ… n6a’`Nq`(F-C<&88ß¿Ãfú/?,ÿú<<`B† m n-_¸-_¼.)g".Hg a@ nü|Jfüv n,Cø– 1pfHzüf`üÄ=@=|ç�GB.û`üDJFfü>AÖaý¤ Hzþ�Ÿ`új P�` €¸`úX~$.HffdfLLîÿ`®z,.P n6a ¬`Nq`&~ F&(.T·„f È®Lg-CT`"R‡È®Lggû¶RnX .X°nXbû¦~Hzû `X oBEgaFßüNu.�/,x ½üg*/ f".)g.H8gîH,_"—Ns,_"/86Nuaè$< 4.&.(.8áL<Aî@aª`®)Lîÿt®-@&Nuî ,`ùv@çHçp "x,Gé Fü'$K&g&&C´«fò$“JAj.&©#K'|ÿÿÿÿLßT�NuJAkô&)fT¯`è&C#SFïB«'@ '@'H'BB«BkgëáIAA 7Aa–Ó«Fü'&© #K LßT�NuHøÿÿ@ø!×Ni!ÉH!øL"x:3|•3|µ3| 3|°|`Þ@ç|84ga ÈÝFßNu|84ga °ÝNsNu|ð%a|`øLHøÿÿ1×!ï|LøÿÿNs@ç|JÐkü0ãHâ@S@0€kFßNua>T.ra�Fß.xAÖaî`÷úî ,B® (f!NNu*@ - fø+N Nu.&|ð&î-HîÿtHç 8Kï�� €Poaþà. ‡ÿIöpGr8ÝU@núLß0€Nu@ç|JÐkü0ãHâ@R@o0€FßNu/ "h!i €0€B© © ,"_FßNu/ xNB�B8Z 0àIDAÒxXäIÒ¸BJ8Zfà _NupðÀ($@&`h$&@çè-f,Hç@ Eø|(&"* g ʰ*&còÊ!A %H LßFßNuJ¸tf|Hçÿþ!ÏtFï<.xt|9÷0 À÷0.xtLßÿÿB¸tNsRx\ xd\k$/ "x:3|3|53|.3|>"_Bx\Nsp þÀˆÀÚÀj€nÀLÀ À€$: 0ÀH(¼€@*ž ‚&À&ì%z ‚%n Â,œ,ܼø(fÀ#R Â+È€,¨$€,²8€*À œÀ” ÂŒ<Â,Þ"ØÔР€#L €#D € €¬ €<´°¬¨"X€BˆTÀ”�Œ €$n, ¶ÀŒ€tìÁÀÊ À!> Àê ÀZ ÀXT>€#†€´€HçÀÀ x:| xNPøZ(( B�28VÓ¸B 8B€&\k:R¸>!ÀB <&\"x,@ç| i "g‘¨ P`ôFß i"g‘¨ P`ô"x,J© g0/@'ÿ@ "8BaóLß8 4gaòÿJxTg SxRnPø[`órfNsT� €%bû°Ð€0;"Nû �%cT—Nu/Ò�2; Aû"Nuûˆü"üÈý@&|P”˜,`ÀBûøˆÞ~ ®ö"ä÷B+v˜èœxý ~ò†&ÆûˆònúÜÿäðÆñ.?_fó\aõ¨=n\84ga6ÿ.)g".Hg~aú=@|Bn€ÿÿJ@kZåˆ €(n¦Eù%ªÕÀ4*?g0B…, n6aÎ`NqTn`d(FgAÔan`Vn`N*HÔÒHy(üNÒ$x($ gND@°jnFS€Àü EòJªg6*f"²®f&?*$jHy(ü@çNÒ0€ãˆAùbNð=|`ôj=|Ns*I"H Q")aÖ`T—Nu"M �!TCBfò*H(m@ ”!ASQfì`T—`n �!TCBf*H(m@ gÆPø[,fT—`B"á™�ÿa ``êHç<ta4gßüHç`ta$ßüJ€g/a:`T¯(¬fNuNuAï6Ø·ìe&lUBgU�fìNuUANuHç&B‚4fx`–HC2xƒf6ƒpx ga>KøIøB§$I"xfFJQk$¶1@f&i OJ�g·Øg`öHSAëaùŽa”Cé QÿÿfÎB„ g| g4´¬o  g($,aœ‚)aØ®- K gT¯Lß88Nu g@î-|ð&Aí-H”|0ãHâ@S@lü0€aùJ�Fü AÖaú$a‚`ñ,R„R„`œ g*$@ g**º‚m´¬nº¬m` º¬o(J*K fÖNu•¬Õ¬ *,á�GôXf*, $T ,g"@Û© "Šg%INu*ŠgúBªNuaøänw&Nu"_ g @Aèaù`ðNÑ g  iµèl”µém˜fÿNJQk’*iHUAíaø6 gþðáŠ&J×ÂàŠ(@°Šnþà ,áˆÐŒ°Šn fè`þ̰‹gþˆn gþ¼�Šàˆ$`þt&”g"T#K(‹'L'l B¬ �‹àˆ'@‘¬`þJCé QÿÿfÿPgþ¸&JB„`þLa÷Hç $nLß0T—Nu$H"x ÿÿg *iµílµémÜJQkÞá‰Òв­bÎ` Cé QÿÿfÐ`ÀCøAía÷T&g C±Ál"H&fô g )áˆÐ‰µÀm¬%B f -��àˆ%@ $ƒ%If*Š`$"Š �‰àˆ�©#@ f *Ñ©#j "’$IJƒg$"C#JJª f )Ѫ%i $‘g"R#J- ð"x²f(i,g Aìa÷H`îCé QÿÿfÜAía÷4Lß0NuT—`îHçÀ@ç&x0|*S»ëfKëIí&ŒFß+@+H+N (o:”T¯;o+o Uïÿb+o a÷+A2<ù’àHF@@ÀüúÒ@;ALß8NuBƒB€"x gbEé0)gP—ËJj f ·üf$&J` ±êf´’gB* g f4 f& ÕüS@fÄJƒf"0) K·üf J°i m‘ÈR€T—Nu JNu CNuB€*g B…:(0P$f `¾°P g Q… E læ*T—NuB‚BƒB�"x$( gd4)´i gRB(pJq fJƒf:& „g04)`*±üg±ñf$lµñf$lµñg"Jq k"€SDf²T—JƒfB€B‚Nu Nu q Nu gJ�g` NNu gø"(g.(f".°®f²®gÚ"x³üg°©f²©g"i`æT— INu`††ÿÿÿB€&àŽ(o8؃S„àŒB…:(J0Pg¼pPe¼pPb¸pPbÜpPáŽÜNu Q… E lÔ*T—T—,Nu$x( gTB€0lTD@°jnLS€Àü Eò4,f^Jªf8g .(f‚z,, n6aÿ\`$Nqn NuXnNuZnNu\nNun Nu%FBó5B$®NuJªgÚ .°’g.(gÐBªNu"xf$xjB‡B‚, Jlf„J1 g\nNu~Gòp·êmZnNuJ«g‡`â6üN¹Aúê�&Èz,, m6aþ¬` Nqn Nu6‚'M'l 'l ‡ Žü‡ í)GëÿúåŠ B ‹Nu1 g"S‡ÎüP‡Gòp k (°®g.(f=|NuGë,fÿx,f=|Nua0Nu"xf$xj~Gòp·êl¹ëf GëB‚4a ‡`ÞNuAúéf&åŠ B ƒäŠB1 B«Nu*n6., AÕaüÄ`^n`Ò<5P$0@0f22, A0g ŒA g& f.(fn `œn`¾\n`¸,g†, gÆ"�$. uP aûÎ`±üf Zn`R\n`L�uP$!uP  ‚1A1| Bƒ65PÖuPá‹!C 65P–uPRC1C3@1| , gè NuJ¬6g*l6B…:-5P$gabQ… E lî,)gP"x Ké>)gB,,Jm g.¼•f*­ Jm f0-@ fB�2- m aùf`aðnÛüSGfÂNuB„,)gÄ `–>, fz,, n6aüF` Nqn Nu$F,g"z,, m6aü"`"` JEgJ0Ðf^nNu., m6aúþ``êB€00P, f8ÐpPáˆ%@B€$°P 5pP$ª00Páˆ%@B€00Páˆÿ%@ Nuáˆ-@ Nu»Îg -,fn NuZn`r\n`jB¸b., m6aúx`æJ…gÚ0, 2,A'ÿg� f  gÁÁÁ� B‡,,g�  gB†.8vΆެÞ¸vθzà�"Ff�fAøpfRˆ-(fTˆHG>G‡ÿ?HG Gaõn`.S€g^n`®Pn`ön /fè"AÓa÷š`Þaî¢&H.*á�g, "F m6aú–`È`ÆJ0PfÀ!¬ P 0, @Oÿ gÀ1€P$1¼Pg1¼P àˆ1€PЇS€1€P �‰àˆ1€P�P&ðP$R(-K gá�-G$T�Nu., 8,(M¹Îg,,f n NuB¸b*l6AÕaøò`^n`´J¬@g ,<àˆ°uPe°uPb n `’05P$@0g@$,25P$ uP aø.`aíœ<(SFÜuP;†PSh B†<(  g†1F JFf.05P$@ f$B€05PÐuPáˆB�25P’uPR� @aö<`aíDaí¬BµP BuP$B5P'BuPS-Nu*NB¸b` »Îfn Nu$-2, l a÷’`^n`ÜZn`Ôn `ô\n`î&H$m6.+AÒa÷à`èJ…gÔB…:+á�, gº¬d n`�*,…ÿB$,,B, g,+ AÒaø˜`”`’J…faì~J0Pf„%«P B2P' àŽ5†PàŠÜBSF5†PD€Ð« àˆ5€P5¼P+g5¼P5«P$òP$R*Rk -k  NuB‚,"xfJ1 n=|NuBƒ,g Co=| Nuá‹à Hz@çåŠ B/?85gaõèîNs85gaõØÝNu&MB¸b*n6., AÕaö´`^n`ZJ®@g .<àH°uPe°uPbn `ÜVn`Ö·Îgö"E$F.* k6aöp` J…fZn`\n`ö* ,**fB†<5P* gÜuPáŽB€05P�uP$R@*á�a÷(` `J…f aën `ªJ0Pfò"( à‰ÔA1�P1‚P’u@DAÒu@1�P!µ@ P 1µ@&P&65@$*gƒ* gÃÃ1ƒP$1¼Pg1¼PBµ@ Bµ@$Bµ@Bµ@S-R(20PÒpPá‰-A ÉEaêàËD g$$.´«g pP "(Kaôâ`aêP&L$+ ‚Nu,,`*"-6g*,,, Aaö8`` J…gJ0Pfn Nu.Aì aõÒ`^nNu.(f((gn Nu"(6g*,,, Aaõä`` J…gJ0Pfn NuHzÿ¢?,--gGÿg­-g- ,gSs­-f­ ,Ss3g³ gAóaêgl û g+l  g+l  g- ,fAÕaêVNu gí,Nu gÜí ,NuJ­@g\n`h&, ƒÿà‹HC8nHC Caîþ`Pn`F&H&¼!ASQl«l 'l'l Aë('H'H'H"áŠÔ‹'BBk&+K@Nu&L(m@ fXn`Þ,fn`ìz,+ n6aóð` Nqn `Ò"FB�,+ Ü�àŽ¼pPbä �c6B…,B‡ fY‡+gX� ‡fP†P�P…B€,¼€cn`X($KaÐ`Zn`H(m@ JÄ(gÇÇtU„a0(g tEèaY„J…g $EîaQ„$I$gaaÆNu6Ú·ìe&lUBnðNu(N¬-J¬@g l@B¬@"(’ˆ�ÿà�aïÚ`aæâNu(n@ fXnNuJl&f~`*lB‡-gY‡*, n6aò¶` Nqn Nu&F GfBSNuT�‚gX�»ìe›ìÛìÇÂn`6Ý»ìe*lUGnð. R‡‡¾¬e.,@ç|)GSl&Fß&F f$k'jJ+g+g7|NuB€00PR@ÐpPሀ�‹B‡+°‡l.oÔ|G*,+g7|Nu j6añÚ`"``êàŽÜpPáŽÜ>0PR‡á�žƒ|GB‡+*FGë6ÝU‡núNu(n@ fXn`$ . ?,ø€_@Jl&gKÖaNu--f°, g˜", l(gTˆ±ìe l2HA±ìe l2J�kL"Az, m6añ`Nq`8)I,- 8> �&\e�&\R€HÔNu&F- ,fm NuzNaÿŒ(FCí0<"ÜS@fú+mt+m ”+\ü0-H+\H-Hø�-H@ûNuAÖaÞòNu¨ ,fn NuaÞîNu&L- ,fm Nuzaÿ(F­ú+lP+lT+l L+lXBmX-H8�-HJg:íú.-Hg*z,-P m6aèÖ` NqnNs†(Ff+TT­ ,0-,@ÿfAÕaÞFNu$, 6,|B„g(,n=|NuB… g *,fÆaÝØCÀg*B†6, gƒg´�lJ„gÔ„`ô‚&\`6,$Ô„"x,Eé&J$S gŒJªf&’aÒê`ê»êfâ*fÚJ†kºªfÐ&’J†f$%M%D %lBj%EÃ5CaÒÄNuRFCf* gêªêaÒœJ†kÿ~NuaÒtJ†kÿrNuJ†f @ç| )g $@#RFß`ˆ=|FßNuSFn=|Nu&Fz`aýL(FCí0<(ÙS@fú(íü8íú -H€ÿÿÿ(À(í,0-H@ø8À(íP(íT(íL(íXNu*H(n@zB, gz.,.< n6aæü` Nq><€™AÖa֘߮<&F, fLÛÿHîÿLÛHî 2Aÿ/gÁ=Aú/[(n@ g gì Jl&gKÖaõ$Nu>,.(f‡J”gz, n6aæn` Nqn NuJ®@fXnNu,‚Eø–J2 g\n`:¼ Eø¦Äü%Ž %® 5¼ B² %” Br 5‡ 2` ò Nu.(f((gn Nu,°(%cB® h%#n Nu@$@&NuBG`><&,"x$0àH°i lB(¸±0f:Jq0 g4 10f ¾10g,‡0Jq0 j&10JGg Añ0aÙüNuAñ0aÚ˜Nu^nNun Nu,*H"y0 g i‘É*$ n6aå8` Nqn Nu$F&äŠ$ÙS‚fú$F(M"y0&Q—ÉÙË$ÌÛÃ$ÍNu.(fn NuLÜ.<&\²‡e’‡R€`ö&(@ç|–¸B˜¸>!À>!ÁB׸FÙ¸JFßB§"x,Eé&J$S g@*g2&’$—.Š*fä * gÞ²ªn ‘ª²ªgÎmôѪ²ªnö`Àת`¸.g$G$*.aÏNJ‡fðNu=| . €Kª{ûfDJnpg x:(f2 x‘ü, z n6aä```*FB®LîÿN•B¸b,x Nuî ,NuJ”f@",g.(f".*y»üg(²­f-(f ½Ígí-gD*m`ØAÔaãf` B® VnNu*H½Íg-(g.(fn Nuí-g\nNu0,gÀí);@*;m,.-m +n°+n´­ ,­-­ ,g2 m”@ç|JÐküCèÿâJ© g»é g"i `î#m RP�Fßm-ÿ,|ð&­ ,gí-@ç|­-g < @ ( g °�fô!m AÕaØfFßNuî)=H*fî*.(g . (gaÖ†.-g`$.)fÚ=H*=n,.î--n°-n´(N"x,Eé&J g$@¹êfò&’aÍ`ì,)gaä ,Tg @B¨!x:!È:&,(,ì)"x)-f2¸©f¬),)g) ,g¶©@f¸©Df ><@AÑaÑ‚"i f¾,)gaôNqaö®,)gaõø~Cø–Eø¦"Âü 1pf2g/aÐ., ,gaÕÞR‡ ‡oÄaîVaä‚J¬gH4<HB4,&,8,HD8,°*,²<,¶HF<<.,*>,\,)g<<$LAìaÚêNq(JCø )g¹Àg"@`ò#laÕ`B¸ rAÔaÝÚNuaÔâ(-gn -hp =h("NuIëÿþ6<€`&LLìpHF>,6.(BAÓaàh``0<`,B€8oH@0< @aÛ `0<`*H4<B˜QÊÿü+S +fgJ€f `<.p . ;Fp+@aæBfDÿ;D(+El+EüHD0àHgfJg¸.%c.%D%°c@$@&*¼!TCB|€,;|:|úr;|0$MÕü`+J6$¼!TST|5|$5|D x -"-±üg °¨f²¨g h`ærAÕaÜ|0<`aÓì`0<` +x!ÍNuf=@NuT—Nufg2 .".` ", , g.(g J�g` .".+@+ANu.(fn Nu*<,, n6aß` Nqn Nu,fnNu&Fp&ÝQÈÿüNu@ç, gzR` ,gz,. n6aÞ¼` NqTnFßNuJ”f6".*y»üg,²­f-(f-,g-.fD*m`ÔAÔaÞ(` B® Vn`°*H½Íg-(g.(fn `’-,f \n`„-m -.f`>,aþº+mlü|úr- (gDz,-ü m6aÞ` Nqn `ÿ@+Fü:(0P$g00PÑpPÑpPBpPQ… E làBm., gGìLÛÿHíÿLÛHí |­,0-,@ßfF×AÕaÓ,`þÔ@ç FJ�f8".*x»üg.²­f-(f½Íg--fí,gL*m`ÐaÜú` B® VnFßNu*H--fê½Íg-(g.(fn `Öí,g\n`È;m,.-m |­-gCø I"h ³üg ³Ífî!i `’î,®-fNu®,=n^Bn^AÖaÒFNu-n Hî)Nu-n Lî)Nu»Î`ø[¨,g( (Xg "@B©B¨X1h^g 1|Bh^aÑðNuè-Nu(n@ fXn`4î ,.-g® ,AÖaѾ`ìì Jl&gKÖaê–Nu,fz. n6aÛì`NqpaX$F"*fp aJAøŠAøŠaÐRGø"SJ“g²©gÒGé`ì f¸, n6B…*ç�EaÛ’`Nq`¢B€* e c @dpËa„r Âj A fp ar"xfJ1gj°*f¦ *ÿg Jª fpÇaH *b *dpÌa4GêB…*g0 opÎaS…ç�2*²sPdpÏa ²sPd pÏaR`NQ…lâp Àjf$ * @fRˆ/<T¢? *(SJ“fp a¤Gì°¬fì*,Ig°,(gp a„ ¬g(l`ð"SJ“gGé`ô j p(R@ @Hç€8aÔÊ` LßpaÿHLß"HíˆB˜S€nú*g)I&‰"¼!CCB*giHLê?Hé?))àáˆ3@B@3@@GêIép)+g(Û(ÛS`öB€*åˆ#@D&j ×Ó#K )ÿf#|ZH*géI*géH`R*fbB€*&xfJ3g:(iD &TGëÿ¶*` &lJ¬g +*²n(K`ê¹Àg #K)I`#K&iD3|N¹J#|ZüLIéJ&ŒB€* xf¼ÿ iÑè*I/N�,_`t`Zp aøp aôpað g@o opÁaÜ n6B€S&@B… f )e2 )c )€e" )�b;°g,aØ’` Nq`¢×ËGû°ÖÓNÓÿþ Ì¢Úð *a²f´ © ©HfX")D(A&TGëÿ¶ `&lJ¬faÌ(°‹g(K`ê¹Áf&J«g((k)|N¹J)|ZüLIìJ&kD&Œ` )k`B�)(&iD&¼Ö&xfB3Iø &TJ”faËÆ°‹gIë`ì(«AøŠaÌî IraÔš`8aË p�az&Iaî"Kfpal)Hgp‚a`)IgpƒaT)Ig .(gþ†)Igp a6 )c )c )€e )�c*g< * d pÆa˜`”j :#j +HPAøŠaÊü mÑè/N�,_J@g>a, )AîDJ�g"P°©gAé `îF€NuB�AøŠaʾ X�=@`AøŠaʬB€B®Nu,m4B€-9f NpN@`F|q|ptAíp!­< g ­€pX‚€ ­8 T‚´-:cm:pLí<pažNuHç`CípB€ m"-+g|00J)fFÄ)fCéS`â0))gJ0`(©0-&ЈfS€�ˆ$J0U@løB0 UBlø@À@FÀ-Hg Hç:aÿ Lß\øLß|NuLß|ÿþNuHç m4pN@`Lßx`LßxNu84g @çaÒZîFßHç€Ä*oKíÿ°"m/ N‘*_e -g*@`êLß#X�`¿À85gaÒîHç€Ä 8g*@ m ( g / @çN°Fß*_ -`àLß#`¿‚`þa@×Ns@ç/ |"xJJ¸FfÿýFï|JékòfÿýSin kF|B©n&i—ü€×øFÓfÿý#S©gÿýFïB“B«B«B« "_FßNuRifÿý©gÿýFïB/&|ÿÿÿÿ"_FßNua@×Ns@ç|/ "xJFï|Jékòfÿý0)°ioPSink@B©n i‘ü€ÑøFÐfÿý#P©gÿýFïB�B¨B¨B¨ "_FßNuRifÿý©gÿýFïB/ |ÿÿÿÿ"_FßNua@×Ns@çB/BgB§JAoÿý`aÿNf| —.ˆRoQÉÿê| _2n |ÿÿÿÿFßNua@×Ns@ç/ ±ügÿý"xJB�Fï|Jékòfÿý ©�gÿý‘øFÑü€#HJ©nfJifÿý‘ü€#HnRioÿý©gÿýFï"_ |ÿÿÿÿFßNua@×Ns  @J€g aÿt`ò |ÿÿÿÿNua@×Ns@ç±ügÿýJ¸FgaR|FßNuB€( "x""iD ÿg°gÓüXJfò|FßNuBhB( B( B�i|$iJ©fEé#H$ˆBiF×a| |ÿÿÿÿFßNua@×Ns@ç gÿý"xJB�F×|Jékôfÿý )g@$@ÕøF‘øF$ˆ#H©g ÿýF× 8*g @pÀü&Að hpN@ |ÿÿÿÿFßNu‘øF#HÑü€#H©gÿýF×`¼a@×Ns@ç|"xJF×|Jékôfÿý )€J€g, @ÑøFJ�fB©Ðfÿý#P©gÿýF×B�FßNu©gÿýF× |ÿÿÿÿB/FßNu9÷f )Ofp$qNÒ$o/iT"iX)ÿÿgäH€LßNu**SDLC**PRIMARY 68000 VM02 09/07/83ü÷ü÷ü÷ü÷ü÷ü÷ü ÷ü÷ü~÷ü÷üà÷Aú’"|22<@$Hzÿþ$Ÿ%HQi% Bj ±ügh h hh`Bª $_±ügB©aû\ I"y" )OfR±é0fL )PfDü÷ü÷ü÷Hçàþ,y"Lî RlL$mHaDEø&J|ÿ` Š` /û/NsHç€`B@ü÷9÷"y"$qNÒ9÷g> @f ü(÷`& @f ü÷` @fJ9÷`ü0÷ü8÷B@ü÷9÷9÷g "y"$qNÒLßNs|ORlH|ü÷ü÷ü÷üë÷9÷fTAú+HAúè*ˆHí LßHç€``ÿ|9÷ü÷ü8÷f`ÿ\LßHçàþ,y"Lî ü÷ü÷Jlgb2lAú&*ˆAúT+HHí LßHç€`ü÷`ÿSi&mü÷ü8÷`þìü8÷LßHçàþ,y"Lî RlJ+  g`+ €,"f8ñ€,#T,#,#R,$,$J“g²,g S( fï` f|P@ Aú¦*ˆAú„+HEë+  g2k`2|Hí RlN°+ g ÿgJü/ a e6Hzÿþ$Ÿ%KTl% l$ k k k kB*$_ü€÷ë ÷üÀ÷LßHç€``ý¶9÷f†$i,ê ÷* fEú`Eú¾"ŠEúN#Jü8÷`ýt$i,ê÷Eú"Šü8÷`ýV$i,ê÷Eúz"Šü8÷`ý89÷fg`Bü÷$i0RjT$i,| ü÷ü8÷LßHçàþ*y"Lí8,`¨ü÷ü8÷`üÎSi&m$i(Ú÷#J(`Eú "ŠEú#Jü(÷ü8÷`ü–9÷gÿ^Eú´#Jü÷ü8÷Eú"Š`üfLßHçàþ,y"Lî + fü8÷&S fýRlR`ºü÷Aú*ˆü8÷LßHç€``üü÷Eú"Šü8÷`ûöü8÷LßHçàþ,y"Lî RlP`”9÷ü÷ü8÷$i0RjVgÀ`ûª`ÿÿ|ORl(Aú¤+HAú@+HAú.+H &mHEë"|2mL7IlB+ Hí ;|ÿÿ\|ü÷Ô÷ü÷ü÷ü÷üý÷ü÷ü€÷ü ÷üP÷aXLßHç€``úö9÷ü÷ü8÷`úÜ9÷fgFü÷ü8÷`ú¶ü÷ü8÷LßHçàþ,y"Lî |€ Rl0`²ü÷ü8÷LßHçàþ,y"Lî |€ Rl2`n$i,y÷ ü8÷* $i0°g ÿfÿ†Eú#JEúÿD#J`ú$i,y÷ * fEú`EúJ#Jü8÷`ùèy÷\Eú#Jü8÷`ùÌy÷]Eú#Jü8÷`ù°Si&m$i(ù÷#J(`Eú#J9÷ü8÷`ù€$i,| 9÷$i0Rj4ü8÷`ù\9÷LßHçàþ,y"Lî ü÷9÷ü0÷ü`÷ü8÷/ ae6Hzÿþ$Ÿ%KTl% k k k k k @$_gg | Rl6g | Rl8 + gêJ+ g + f¸J,f°0 R@‘k kÿÿf| Rl:`¤+ fP0-\°kf -Pf | Rl<`+ éà°,"g|@ Rl>+ gH`r, ",à"+ g`Z Kað†gjN Kaò`D ‹lBkB+ RlB`RlDJ,gS,g$|ÕË"|2mL7IB+ Hí Aúý`+HAúü´+H;|ÿÿ\Rl@ü÷üý÷aÜLßHç€``÷zü8÷ü÷ü÷|ORlL&l$mHaEøB,`.`û˜ü÷ü÷|O+ fU,#,#S,$J¬g2J+g÷.S+f÷&|"K$Ka–&ICìµÑg"Q`ø"‹f÷&mH`ôæ|RlF` | Rl.ü÷ü÷ü÷üà÷Rl*a &l$mH|OFü%B, * f*` * f*` *S f** g @g g` B,|% -Pf|ÿ *— f*"Ja¶$IaÀ` B€* ï f"Ja–$I gÒ`ÿÂ@ f |%`Ø gÐ gÈgÈ g4 -Pf* + f *s f|%B,"B,#`„``d +“ f *s f|%B,"B,#`\``< +S f *s f |%`<`` +¿ g +ó f*+ °* f"Ka²)I"Ja´$Ia¾```â`äJjfÖB€B�B‚* ê,#â ,$g·üg+ f + â Ò²gSSk’`îB�* è A# gB€ + ï gBf˜J,$gø°°f(*  fF"Jaò$I fþ. -PfÈ`,"K+ gaÐ&IB,$`®` aÀ&IS,$`ˆ|ÿ g”B�+ ï f"K+ faŽ&I`Øa†&I`h"K,$·ügX+ fJgLSJ+g4S+f."K|+ g aRB,$`$+ fS,$a<&I`°B+ + f&S` &I)K g‚* g @g g|ÿJ*f6`L* ï g& *S g * g * g *— gf"J* faº$I`�a²$Ia¼`"Ka˜)Ia¬ ,f ¬f9l`9l `|% ¬f9l `9l L`ðvAúð B€0,gÀü22@2<$@ç/:WLßgNwDßX��ÂúT�ÿB-AHÐ�=zBN=z@P=| ˆ-|.NTWŒ-@”Aî€0<NAgH瀀 | `ð*H Hz&@ç/:çLßgNwDßX�Ñ®,Ñ®4Ñ®( ¡f aߺ0aâÈ`¬ ¢f aߨ2aäN`š £f aß–B�aâ¬`ˆ faà"`ÿ|aß|`ÿtB@092€y4€y6€y8=@Ns:üÅgNu&lAú pN@` `ÔHDIO*H0<"m6Eé " ¼!UDRáŠ]‚„ü 1BB¸0$:²g2 BpN@`aê!È0aEè ŠáŠQ‚„üÄüÔŠ!B1ú„4!ü–aºJ¸fœB¸GúÀCë <€pN@`ad4+;B,g +x !ÍEëpB�JjgR�EêQÈÿòGë(m6AIì p(ÛQÈÿü “!TCBg†aœ.x2<ÀaD/:ªNuHVMù,¯@îFü'MîHÖ?ÿ-_8-O<2<¢a`ø,áŽ,FÝÈB†-½ÈnúNu0<`0<�F虀2<é™"x:Cé2�A02�2€@02€Nua&a°‹fa†a|°�faÿ|Cí!ÉaÂazNuB€AúH°Pgaÿ^B‡EЇ Eê Rÿÿfð‡#à�*(B(:ƺ„c*„ÿBKúûû" B*AMú5,Bœ�°º–f†` (<�B*DB†º„baþöNu hÿÿ g,a2 ÿfaN`aðJga$`a@°‹ga¾a`Ì3|ÿÿ Nu~Aè Cé ((„ÿB*(B*DB†º„baþ�Nu•ÊB�B‚BƒIÕKõhHz ?NsaB# þ8!üRUN ìNs 9(€J€gòJù(fø 9(€ @/×#ß(U3 ‚A ¹(B†B‡(>( ¡f aB" ýÜ0aB ýÖ`¬ ¢f aB" ýÊ2aB ýÄ`š £f aB" ý¸-3 ˆ B�aB ý²`ˆ faB ý¦`ÿ|aB" ýž`ÿt4 éééÓB1INET ASREL' INET SA'9 „Initialization and NTSþ2pOUTTERMS pNWCT pNWTESTAD pSTRTADR pSSCT pMAXCONN pSYSTYPE pMAXLNAU pNWPSEG pNTSREQ pNWTSEG pMAXSEC pSZDBUF pGETSTA pBEGSDLC pNUMBUF pFQULWM pDLCBLDCB pNTBLDTB pSBINFRBF pTRASCAN pDLNKRQD pMAXNAME 2(þF3 Aú0<NAg.H瀀 |`Ø DATAfB˜³ÈnúH3 Nu,HOî€ OCîfaê=|ÿÿ´AúA ¨-H¸Aî´0<:NAgH瀀 |`‚pÿNA@çîI3 ·Aî´0<:NADßgrHzb@ç/:B ÿdLßgNwDßX�`.Please kill netwI3 ork first - then initialize Hç`CúÿÌEúÿôaB ÿLß`úH瀀 |I3 `ö®·Hz @ç/:B þìLßgNwDßX�Aú0< NAgH瀀 |`ºF3 SSCT"HAú0<NAgH瀀 |`Ž-|SSCT˜-zþŠœ=|¸¬F3 =|ª-I®Aî˜0< NAgH瀀 |`VŸüp O/ EúÊ0ÚQÈÿü$_ O$zG3@ þ@!J0<NAßügH瀀 |`-|NWCT˜-zþœÓüH-I®Aî˜0< F3 NAgH瀀 |`æŸüp O/ Eúj0ÚQÈÿü$_ O$zýÔ!J0<NAßüF3 gH瀀 | `¨AúH0<NAgNH瀀 | `Ž€`SSCTSSCTI3 SSCTNWCT SSCTSSCTaB ýRgH瀀 | `:AL3 Hz@@ç/:B ý2LßgNwDßX� <_B-@ rXÂúB ýg-@$�B-AL3 (Ð�Hzh@ç/:B üðLßgNwDßX�-@,2:B' üØÂü�B-A0Ð�-@42:O3€ B ü¾Âü&�B-A8Ð�-@<2:B ü¤ÂüJ�B-A@Ð�Hz@ç/:B ü†LßL3@ gNwDßX�-@DrÒzB ül�=ALHz>@ç/:B üXLßgNwDßX��ÂúO3€H B ü>�ÿB-AHÐ�=zB ü,N=zB! ü&P=| ˆ-|.NTWŒ-@”Aî€0<NAgH瀀 |L3 `ð*H Hz&@ç/:B ûèLßgNwDßX�Ñ®,Ñ®4Ñ®Bç/:B üXLßgNwDßX��ÂúO3€H B ü>�ÿB-AHÐ�=zB ü,N=zB! ü&P=| ˆ-|.NTWŒ-@”Aî€0<NAgH瀀 |L3 `ð*H Hz&Bç/:B ûèLßgNwDßX�Ñ®,Ñ®4Ñ®NsaB# þ8!üRUN ìNs 9(€J€gòJù(fø 9(€ @/×#ß(U3 ‚A ¹(B†B‡(>( ¡f aB" ýÜ0aB ýÖ`¬ ¢f aB" ýÊ2aB ýÄ`š £f aB" ý¸-3 ˆ B�aB ý²`ˆ faB ý¦`ÿ|aB" ýž`ÿt4é éé' NTS NTCREQP RONTSREQ RO  NTSSERV RO99NWCREQ ROBBNWCTPRI ROKKSSCT ROddTRANSSCNROmmTRANSSUBROvvI1NTCREQ ASREL' NTS NTCREQP SA5 „HANDLE NTC REQUESTS FROM SSCT÷2pNWMGSSC 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 ÞAúNgAú\gæ nàåˆJ3 ÑðüN�J€k@ þgÿÿgA ¨ìNs €ÿÿÿÿgöD€`A ’pNu0 ÌI3 ì^Úÿÿÿäÿÿÿäÿÿÿä°ÿÿÿäÿÿÿä*y($aB! ÿTg f* fNuaI3€ B ÿ> -fp Nu$@Bj %l 5l5l Bª,gê ê ê L3 � +R$­+JB€Nu*y($", 4,aB) þÜg* f aB þÎB€NupNup Nu*y($O3‚ ", 4,aB) þ°gaB( þªB€NupýNu*y($", 4,aB) þ�fp Nu* fô&j* I3 g&k* gB€+NuJ«fp#Nu+fpNu(,:,aB, þ@f - I3‚ fpNu!m y("*¨!M y("J¨fp NuaB% þ í;l+ f(O3 AëaB* ýîg `ÿÿ <þNuB¬!Lë pÿNuaB ýÊB€Nu,aB ý¾gpýNu(,I3 :,aB, ý¬gpóNuJ«gf­f- gpàNu`ÿÿ <þNu"m$B­$lI3 f:;lí +@@RfR`ð@é kÉIaB+ ý<ÉIB€NuL3H aB ý2`ä*y($", 4,aB) ýfp Nu* gp Nu* fè&j* g&kR3 (,:,aB, üègpúNu,aB üÚfJ«faB üÎJ«f/ IëaB& ü¾B«"(_B€Nu*3A *y($", 4,aB) ü¢gaB üœB€NupýNu4éé  A1NTSREQ ASREL' NTS NTSREQ SA69 „Handle NTS user callsþ2JNWMGSSC HJNWDCLCT ^JNWFRLCT êpTRACTOLC pTRACTOLL JNWFRNNT �JNWLNKBQ ÞJNWSETLA `pSBPTFRML pNWSTATUS JNWSETDC ¨pTRADTXQ pSYSPOFF pTRABTOU JNTSRRTN dJNWFNAT  pNTCREQ JNWFLCT .JNWTNAM û2JNWCNSD ÔpLCTBEG JNTSREQ pNATBEG pNNTBEG JPATCH šJNWLSTC ÊJNWBLDLCT ØJNWFREPB öJNWLODSC pSBGTFRBF JNWFNLCC PJNWCLRLA „JNWTNAMC  &pTRAMOVB JNWLNKPB JJNWSIGNAL B«"(_ìNu0,@€°lgpNuF3 +g*@|!a,gìNu|!aÖföJ«gÉJIë|!aîB«IëaâB«"F3 ÉJ$kB«B«"F«!)ë B«B®TafB€ìNu0,@‘°lF3 gpNu Ng Aì pN@``*,,, h6pN@` Nqp NupNu, fFaI3 ¶fÀ- fp - g B†-a2 NuAí2a†f–B¬!Lí6aB ú(F3 B€NuKë -g*@JmHgòAí2aTfÿdB¬!L`ÊAëa>fÿNB¬!LF3 B€Nu0,@€°lgpNuJ,g4afò/ |Ií2a°­6­ 6­ 6F3 B­8(_ìB€Nu/ |Iëa‚B«"`â0,@é°lgpNu Ng Aì F3 pN@``*,,, h6pN@`Nqp NuJ¬oöaŽfÆ- fp - g B†I3 -a NuAía^fœB¬!LíaB ùB€NupAì o, ~n&I3€ QÈÿð",4,Eí g$@²ªfô´jfîpNupNuB€NuaB ø¶g <ÿNuCèF3 B‘¼ ÑÑ||Bi|#B)BiB(1|(-G #|F3 .NTS #Té3l#j3j3j j #l 3l$3l&F3@ B€NuAí< g @`øB’ Ší6* fgRmHB€Nu*y(B€S€Àü&GõF3 +gB€Nup NuKë M -g*@¾- fð¼-fêB€NupNuKë, -F3 g *@²-fòB€NupNuKë -g M*@¸­ fðºmfêB€NupNu *g&"@*y(F3€ Aí g°‰g @`ôBi ‘"­+I*y(2* Cí I fNu"@²i fðB© ‘F3 "­+I`â- fV-fN y(»Èeÿÿ Ш €J»Àbÿÿ y(Aë (F3 g °�g @`ò!m y(*¨!MKøNuB€"(g A¹Èfôp`ðJ€Nu2* *yF3€@ (Aí g @²h fôè `ìNu2* *y(Aí g @²h fô¨ `ìNu2*F3  *y(Aí g @²h fôè ¨ ¨ `àNu y(J¨gÿÿ*h»ÈeF3 ÿÿ Ш €J»Àbÿÿ!U MCèJBX³Ènú*«;k +l ;lAë (F3 g @`ö!MNu gÿÿ �!TCBfÿÿ(-f/ pN@"_Nu-f - g F3@ BmBm4`Bmí F- g y(Aèÿô (g°�g @`ò!mBm6I3 Bm -,3SRequest Disconnect ÿUnknown SDLC Response ÿ24  ééééG1SSCT ASREL' NTS SSCT SADE „System Service Control Task+2pOUTTERM NSSCT pNTSSERV .JF3"$ & (Aú0<NAg.H瀀 |`6 DATAB˜³ÈnúF3Nu,HOî€ OCîaêHîŠB®¢~Aî¦1|ÿÿCè"!IB¨Aè^QÏÿèaà~F3Aî1|ÿÿCè"!IB¨AèJQÏÿè~AîF1|ÿÿB¨Aè"QÏÿðpýNAIî„*LF3 -g (@,gì+lB¬&lkJ,fž f|ÿÿ`Ä F3gH瀀 |`H&l ÿÿgp Aú(Cú4°�gAè³ÈnôH瀀 |`F3 (Nû.NTS2.SSCr)m+L`ÿZaô |d0<NA`ÿ>€F3 oH瀀 |`ÂAú åˆÑðüNФ¤¤šš¤€F3 oH瀀 |`‚Aú åˆÑðüNÐŠŠŠØØŠ&L€F3 oH瀀 |`@Aú åˆÑðüNÐ"""öÿÿþÐÿÿþÐ+F3°+gtadfÿ "úÿ0< I0ÛQÈÿü|ÿÿal`þVaºfþæ0< J4ÛQÈÿüI3|ÿÿ(HB,aBýrajgeô`”g |ÿÿ`þ ƒgðÔ&L`ŒalfI3þ˜0< J"K4ÙQÈÿü!k !k!k !k|ÿÿ(HB,aBý ageôF3`,g |ÿÿ`ý°a€`ý¨ÔfýÔJ,gýÌ`ÿ LCîÎ$I$üSSCT$ü PF3.B$ü. ER4üR $:ÖÂraÜÂraÔÂraÌÂraÄÂra¼Âra´I3Âra¬`DCúbEú "<CaBüf$:†EîÎ$Â$Â$ Kra‚Âr azAèÂrI3@apÂrajÂr adü ¼ CîÎ" ’‰R�aBü|ÿÿ`üÔSSCT Error- Code F3STS BCT R E C # R TH RH Data èaaF3SAfîNu o^0ÀNu0<NA~Aî¦ (ÿÿf ¼B(1|Bh!|I3<aaBûxAè^QÏÿÒNuCî„ )g"@`öB¨#HNu~Eî *ÿÿf Bj"jI3B€NuEêJQÏÿæpÿNupJ.™f)@¼ Bª%|( JažaBûNu/JF3g ÿgDü`/ |è0<NA _DüLßNu~EîF *ÿÿfBjB€NuEê3"QÏÿêpÿNu4é\M1TRANSSCN ASREL' NTS TRANSSCNSAEU „TRANSPORT LAYER - SCAN USER QUEUE³2pNWLNKBQ pNWSETDC pTRADTXQ pTRABTOU pSBGTUSQ pNWDQHD pLCTBEG pNATBEG pNNTBEG pNWLSTC pNWLODSC JTRAMOVB ÚJTRASCAN pNWSIGNAL pSBPTFRBF *¾J3„ &nT + g=|Ns 9(gX&@IúN +g*@|#aA Îgì`<|#aA Äf4$kJ3�H B«B«"F«ë B«aA ž#ë(`¦†aA Šf*$y(B‡J*F3€ f( $H( ga `ÿda:`ÿ^&x Gëÿô +g&*@'mB­-fÞI3 ­ aB ÿ2- gÌNsHçôJjgfJjf^CêJk°B€)S€Àü&*xI3€@ GõJ«g+f+ g0 JaB þØ`p)áH+ )áIKë$-I3 g*B°mfð²mfê- fÄg )fžaB þŽ-6f +"g+@8I3  @'h"B¨í6aB þfLß/NuHçôCêpÀü&*x Gõ*k *  — gJjF3 f¦* * Aí< g @²( fô´( fî`ÿ:B� Ší6* fgRmO3 H`ÿj JaB ýð­ g,/ (m$ìì+l$gí  UaB ýÂaB ý¾(_F3 `ÿT"<ÿ`"<ÿ`"<ÿ*x Cêp1² QÈÿø3A B‘¼ ÑÑ>3 ||Bi|#B)BiBjBª5|4-G `þ24éééeG1TRANSSUB ASREL' NTS TRANSSUBSAG „TRANSPORT LAYER - MOVE DATAÊ2JTRACTOLC XJTRACTOLL JTRADTXQ pSBSDLCKL JTRABTOU lpSBPTXMQ JSNDBIU $pLCTBEG pNATBEG pNNTBEG pDBUFSZ pTRAMOVB pNWLNKPB pNWSIGNAL pSBPTFRBF pSBGTFRML *ôF3 / 0-gÆ f¾(m 2-*-f°- fZ fœ U,F3 gAì pN@`| ì`8*,,, h6pN@`Nq`Ú+F,B€08 ]@"I3€ XAÒ¬S�ƒÀ;A*aB ÿpgkí aj(_Nuí “m*$HCê IB€08 ¼ F3 B)mmBi><- f>ÑRmgú+l0í |B)F3 Bi, g éí XˆY€XG3m\ˆ]€°­0mÑ -0­ Þ@"mF3 ,"ä‰$B` ÙQÉÿü`ÙQÊÿüÑ­,‘­0J’g/a¸$_-gÿ8`4-I3 ga€`Bì­  UaB þd­+l gí- ga4`F3 ìa\`þ6aT(_Nu- f4 fî+l,+l0X­,Y­0B€08 U@I3 "Ò¬�ƒÀfr;A*aB ýèg nþxí $H“m*- f|"li B-F3 J-fi Bm( ) f 2)Aóÿ;A( -0Aê.‡ nB‡-(ÁF3  ¾x b ÁA`þ¬í B‡>8  € A`þ�m AêB€08 F3 B‡BjB* 2-(g0ÁT‡U€°­0mþ` -0èÿþB* `þNGíB¬ +g&@F3 `ö'LNu&x B­Gëÿô +g&@`ö'MNu5G-f| BjB* mL3@ -gG ¾- f / aB ü¨*_Nu JaB üžfNup N@/ -6gÆ-6gF3 ¼(m8- 6g<$m8 ¾jg€`ÿÿaÐJ€oâ0< m@&-D(¶€F3 l(�„™­DÙ¬,äŽD` ÙQÎÿü`ÙQÌÿüJ€g|fí 6+H@L3€ g,­ 6­ 6a¨ì UaB úà­ 6ga `þ> JaB úÊ`þ4(_NuF3 /$m< JaýNu/ « g +fnw ë `ë AëaB ùÈB¬!LF3 (_$@"L'jg*ë `"/ « gÊ +gÄ$L"@'igë  kzI3! ,) h6pN@`Nqé|  k(IaB ù\(J`° F*x  ª!j!j @3 !j éê k(IaB ù&pÀü&Aõ h(JaB ù(_Nu4  ééééééé' SDLC MACROS SI‹‹BEGSDLC RO””BUFMGTX RO��BUFMGT RO¦¦DLTRACE RO¯¯EXORDLC RO¸¸IBFMGT ROÁÁPORTAIO ROÊÊPORTAV4 ROÓÓOVERVIEWSIØØU¦ROOT AG55“SYSCMD CDFF \******************************** BEGINNING OF SDLC.MACROS.AI ******************************** RTS2RTE‚MACRO‰IFEQ†CHIPTYPE-680101‹MOVE.W„(A7),-(A7)ˆCREATE:�0(A7)�=�PC�(High�Word)1‹MOVE.W„4(A7),2(A7)‡.......�2(A7)�=�PC�(Low�Word).‹CLR.W…4(A7)�.......�4(A7)�=�VOR�(Short�Stack)‰ENDC6‰MOVE.W„SR,-(A7)ŒPush�SR�so�we�can�RTE�rather�than�RTS‰ENDM ************************** END OF SDLC.MACROS.AI **************************ééé  éééƒE1BEGSDLC ASREL' SDLC BEGSDLC SAI4 „Beginning of SDLC segment2IBEGSDLC )3 `þ4éééééééŒI1BUFMGTX ASREL' SDLC BUFMGTX SAP1 „BUFFER MANAGEMENT SUBROUTINESö2pUSERQHD pUSERQND pSDLCPCB ISBPTFRML  pSYSPOFF pSDLCQXMT ISBGTUSQ LpSDLCQUSB ISBPTUSQ ÂISBPTXMQ *IGTFRBF ¢pFQBCNT IGTFRIR IPTFRBF †IGTFRML @pFQLWM pMEMOFF IPTFRML pNATBEG …2IGTUSQ FIPTUSQ ¼IPTXMQ $pFREEQHD pFREEQND ISBGTFRBF ¨ISBGTFRIR ISBPTFRBF ŒISBGTFRML F)ºF3P� a@×Ns@ç/ |"x J¸ fÿýFï|Jé kòfÿýSi n kF|B© F3B  &i —ü€×ø Ófÿý#S © gÿýFïB“B«B«B« "_FßNuRi F3 fÿý© gÿýFïB/&|ÿÿÿÿ"_FßNua@×Ns@ç|/ "x Fï|JéF3…"„ kòfÿý0) °i oPSi nk@B©  i ‘ü€Ñø Ðfÿý#P © gF3 ÿýFïB�B¨B¨B¨ "_  FßNuRi fÿý© gÿýFïB/ |ÿÿÿÿ"_FßNuF3 a@×Ns@çB/BgB§JAoÿý`aÿNf| —.ˆRoQÉÿê| _2n |ÿÿF3 ÿÿFßNua@×Ns@ç/ ±ügÿý"x B�Fï|Jé kòfÿý © �gÿý‘øF3… P€ Ñü€#H J© fJi fÿý‘ü€#H Ri oÿý© gÿýFï"_ |ÿÿI3 ÿÿFßNua@×Ns  @J€g aÿt`ò |ÿÿÿÿNua@×Ns@ç±ügÿýJ¸ gaB ýÂF3@ |FßNuB€( "x "iD ÿg°gÓüXJfò|FßNuBhB( B(I3 B�i|$iJ©fEé#H$ˆBiF×aB ýV| |ÿÿÿÿFßNua@×F3E$ Ns@ç gÿý"x B�F×|Jé kôfÿý ) g@$@Õø ‘ø $ˆ#H © gÿýF3  F× 8 g @pÀü&Að hpN@ |ÿÿÿÿFßNu‘ø #H Ñü€#H © gF3„ ÿýF×`¼a@×Ns@ç|"x F×|Jé kôfÿý ) €J€g, @Ñø J�fB©@3‚@ Ðfÿý#P © gÿýF×B�FßNu© gÿýF× |ÿÿÿÿB/FßNu4éé•I1BUFMGT ASREL' SDLC BUFMGT SAI9 „BUFFER MANAGEMENT SUBROUTINESó2pUSERQHD 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(#Ó(F×B“FßNuRy(F×B/&|ÿÿÿÿF3 J FßNua@×Ns@ç||09(°y(o"Sy(k y(#Ð(F×B�FßNuRy(F×B/F3 |ÿÿÿÿFßNua@×Ns@çB/BgB§JAoÿý`ašf| —.ˆRoQÉÿì| _F3 2n |ÿÿÿÿFßNua@×Ns@ç±ügÿý| ¹(#È(Ry(Fß |ÿÿÿÿNua@×NsF3€  @J€g aÂ`ô |ÿÿÿÿNua@×Ns@çB€±ügÿý( "y("iD ÿg°gF3 ÓüXJfò|FßNuBhB( B( B�i|$iJ©fEé#H$ˆI3Š BiF×aB þ\| |ÿÿÿÿFßNua@×Ns@ç gÿýB�|$y( fEù(#È($ˆF3  Fß 9(g @pÀü&Að hpN@ |ÿÿÿÿNua@×Ns@ç|| 9(g @#Ð&3� (fB¹(F×B�FßNuF×B/ |ÿÿÿÿFßNu4éééžI1DLTRACE 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é kúCé  €J€g"@Óù( fô"ˆ"y(© ` /×3 "Ÿ‘"_NuNu4éééééé °M1IBUFMGT ASREL' SDLC IBFMGT SAR8 „BUFFER MANAGEMENT INIT SUBROUTINE 2pSZDBUF HSBINFRBF ( (3 B�B€0:A ú@$HÑÀ³Èm$ˆRA`ò•ÀB’Nu4ééééééé¹D1PORTAIO ASREL' SDLC PORTAIO SARU „PASS INERRUPT ON TO HDIO 2IPORTAIO pNECCTL_A ):>3 9(f )Ofp$qNÒ$o/iT"iX)ÿÿgäH€LßNu4ééééé ééÂN1PORTAV4 ASREL' SDLC PORTAV4 SAS „MVME400, PASS INTERRUPT ON TO HDIO 2IPORTAIO pNECCTL_A )$(3 $iX€$iTBgHz@çNÒ9(fìLßNs4éééééééË6* ****************************************************6* * BEGINNING OF FILE 'FIX:48.SDLC.OVERVIEW.AI' *1*�*�Date�Revised:�September�7,�1983,�Ed�Skinner†**�*²*2*�*�Note:�This�is�a�"generated"�file.‚Updates�to„*3*�*�these�introductory�notes�should�be�applied�to„*2*�*�SDLC.OVERVIEW.PR�-�See�a�description�of�this…**�*�contained�herein. **�*²*6* ******************************************************** 1 Introduction*C*†The�Motorola�Synchronous�Data�Link�Control�(referred�to‚simply‚asG*�SDLC)‚is‚a‚component�of�the�Network�Services�facility�available�under * VERSAdos.B*†The�SDLC�implementation�provides�a‚communications‚circuit‚driverI*�using�the�NEC7201�device�in�the�bit-oriented�protocol�mode.‚Frame�levelI*�commands�are�highly�similar�to�those�in�IBM's�SDLC.‚Support�is�providedG*�for‚the‚remote‚loading�and�dumping�of�stations,�multi-drop�as�well�asJ* point to point configurations, with circuit speeds of up to 57,600 baud.  ÔÙÝáåéíñ&õùý  !%) E*†Because�of�the�many�configurations�within�which�this�implementationI*�must�function,�operation�is�limited�to�half-duplex�only�(at�the‚present* time).***"* 2 Overview of System Preparation*D*†The‚SDLC�implementation�exists�as�a�permanently�resident�extensionF*�of�the�system's�executive�(RMS68K).‚As�such,�it�is‚"link"ed‚with‚theE*�executive‚such‚that‚a‚single‚load�module�exists�containing�both�theE*�executive�and�the�SDLC�driver.‚Additionally,‚in‚those‚systems‚whereD*�Network‚Services‚(NTS)‚executes‚on‚the‚same�processor,�it�(NetworkE* Services) will be similarly "link"ed and loaded with the executive.D*†Generally�speaking,�a�version�of�the�SDLC�driver�is�first‚producedH*�which‚is�"customized"�for�the�target�system.‚The�parameters�which�makeG*�a�given�implementation�unique�include�the�type�of‚processor‚(68000‚orH*�68010),‚the‚residence�of�Network�Services�(on-board�or�off-board),�theD*�type�of�board�upon�which‚the‚communications‚device‚(an‚NEC7201)‚isG*�located,‚and‚the‚address�of�the�various�registers�of�that�device,�andC* whether the implementation is for a primary or secondary station.C*†Generation�of�the�SDLC�driver�is�facilitated�by�chain‚files‚which?*�"customize"ƒtheƒgeneric‚driver‚for‚one‚of‚the‚specific‚targetB*�environments.‚This‚"customized"‚version‚(an‚object‚file)‚is‚thenA*�combined‚with‚other‚modules‚(such‚as‚the‚RMS68K‚kernel,‚NetworkA*�Services,�and�so�on)‚to‚create‚a‚single‚load‚module.ƒThis‚final4* preparation is outside the scope of this document.B*†For‚the‚GMAD‚system,�the�primary�station�software�runs�on�a�VM02J* board, with Network Services executing on a tightly coupled Exormacs MPUH*�board.ƒA�shared�memory�facility�is�used�for�the�communications�between* Network Services and SDLC.D*†Similarly,�the�secondary�GMAD�station�software�also�runs�on�a‚VM02I*�board,‚except�that�its�Network�Services�is�on-board,�and�a�considerably=* simpler shared memory area is used for inter-communication.>*†Preparation�of‚the‚HDS-400‚Primary‚and‚Secondary‚stations‚is* similar to the GMAD stations.C*†The‚VME/10‚Primary�station�for�an�HDS-400�runs�on�a�VME/10�systemD*�using�an�MC68010�MPU�and‚MVME400‚board‚(which‚contains‚the‚NEC7201 * device).**** 3 SDLC Driver Preparation*@*†The‚first‚step,‚is‚to‚prepare�a�copy�of�the�informational�fileJ* (what you are currently reading) for inclusion into the assembly stream.F*�Note‚that‚this‚preparation‚need�be�done�only�if�the�SDLC.OVERVIEW.PRH*�input�file�has�been�updated.‚When�several�versions�of�SDLC�drivers‚areB*�to‚be‚generated,‚the‚OVERVIEW.CF‚(SDLC.OVERVIEW.CF)‚need‚only‚beH*�executed�before�generating�the�first�version.‚Once�this�has�been‚done,J* several different versions of the SDLC driver may be generated, re-using* the overview file./*†An�example�of�creating�this�overview�file�is;*†=USE�48.SDLC*†=OVERVIEW.CF)*‹=/*�CREATE�OVERVIEW.AI�FROM�OVERVIEW.PR1*‹=101.USERLIB.PROSE�OVERVIEW.PR,OVERVIEW.LS;Z=64*‹Version:�dd-mmmm-yy*‹No�errors�detected.*‹=DEL�OVERVIEW.AI#*‹DELETED�FIX:0048.SDLC.OVERVIEW.AI*‹=E�OVERVIEW.LS,OVERVIEW.AI;L*‹VERSAdos�EDITOR‚RELEASE‚x.y*‹COPYRIGHT�BY�MOTOROLA�19zz&*Ž(Example�output�deleted�for�brevity) *‹EDIT�DONE*‹=ENDE*†The�next�one�or�more�steps�consist�of�generating�version(s)�of�SDLCG*�as‚required‚for�the�target�system.‚SDLC�may�be�generated�as�a�primaryE*�or�secondary�station,�and�for�the�MC68000‚or‚MC68010‚processor.ƒTheE*�chain‚file‚which‚performs‚this�is�&.CONFIG.CF.‚It�is�always�invokedI*�with�two�arguments.‚The�first�argument�specifies�the�configuration,�theI*�second�argument�specifies�the�overall�listing�file�or�device.‚The�firstE*�argument�names�for�various‚SDLC‚configurations‚are:‚HDS-400‚ PrimaryF*�Station‚("HDS4PRI"),‚HDS-400‚Secondary‚Station�("HDS4SEC"),�GMAD�DMSJ* (Primary) Station ("GMADPRI"), GMAD PMS (Secondary) Station ("GMADSEC"),/* and VME/10 HDS-400 Primary Station ("VME10").B*†The‚chain‚file‚produces�object�and�listing�files�appropriate�for"* 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*†The�following�files�are�the�minimum�set�required‚to‚generate‚all* versions of the SDLC driver;F*�&.SYSGEN.CF‚-‚The‚user‚invoked�chain�file�producing�SDLC�for�the�all*†SDLC�implementations.G*�SDLC.SYSCMD.CD�-�The�SYSGEN�command�file�used�in�the‚preparation‚of‚a*†version�of�the�SDLC�driver,F*�SDLC.ROOT.AG‚-‚The‚file‚"assembled"�to�produce�a�version�of�the�SDLCE*†driver,�as�directed�by�parameters�specified�by�the�user,�and�by�the*†SYSCMD.CD�command�file,G*�SDLC.OVERVIEW.CF‚-‚The‚chain�file�which�causes�SDLC.OVERVIEW.AI�to�be7*†created�from�SDLC.OVERVIEW.PR�via�the�PROSE�facility,9*�SDLC.OVERVIEW.PRƒ-ƒTheƒ"prose"ƒinput„file,„processed„by3*†SDLC.OVERVIEW.CF,�which�creates�SDLC.OVERVIEW.AI,G*�SDLC.OVERVIEW.AI‚-‚Created‚from�SDLC.OVERVIEW.PR�by�SDLC.OVERVIEW.CF,B*†this�file�presents�a�gross�overview�of�the‚implementation,‚and‚a'*†list�of�known�problems�and/or�errors,0* 9995.&.NEC7201.EQ - Defines NEC7201 Symbolics,2* 9995.&.STR.EQ - Defines RMS68K Kernel Symbolics,3* SDLCPRI.TEMPLTS.EQ - Defines SDLC Control Blocks,;* MVME400.EQUATES.AI - Defines the MVME400 board Symbolics,A* SDLC.MACROS.AI - Defines miscellaneous macros required by SDLC,F*�SDLCPRI.POLLQ.AI‚-‚Primary‚Station,‚External�(User)�Interfaces,�SDLC(*†Start�Up�Logic,�and�Polling�Algorithm,D*�SDLCPRI.INT7201.AI�-‚Primary‚Station,‚Transmitter‚Flush‚Logic,‚and*†NEC7201�Interrupt�Dispatcher,;* 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‚-‚Secondary�Station,�External�(User)�Interfaces,�SDLC5*†Start�Up�Logic,�and�Polling�Response�Algorithm,�andD*�SDLCSEC.FRMCNT.AI�-�Secondary‚Station‚Frame‚Handler,‚and‚Link‚Mode*†Finite�State�Machine.**** 5 Primary Station Files*@*†The�following�files�comprise�the�primary�station's�generation;* 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*†The�following�files�comprise�the�secondary�station's�generation;* 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*†The�files�which�comprise�SDLCROM�are�currently�unknown.**** 8 Primary Data Flows*>*†The‚primary‚data‚flow‚into‚SDLC‚is‚via�the�SBPTXMQ�and�PTXMQI*�functions�which�are�located�in�the�buffer�management�module�(BUFMGT‚andH*�BUFMGTX).ƒThese�functions�enqueue�a�transmit�buffer�to�the�appropriateI*�Secondary�Control�Block�(SCB)�where�the�SDLC�driver�will�find�it�at‚theF*�proper‚time.ƒIn‚the�primary�station,�the�SBPTXMQ�and�PTXMQ�functionsH*�"awaken"�SDLC�each�time�a�buffer�is�enqueued�by�calling�the‚SDLC‚entryF*�point‚SDLCQUSB‚o r‚SDLCQU�function.‚In�the�secondary�station,�SDLC�is?*�not‚"awakened"‚when‚a‚buffer‚is‚enqueued.ƒIn‚anƒEXORMACS/VM02J* configuration, buffers are passed from the EXORMACS to the VM02 thru the* VM02 request queue.>*†The�primary�data�flow�from‚SDLC‚is‚via‚the‚SBPTUSQ‚and‚PTUSQI*�functions‚which�are�located�in�the�buffer�management�module�(BUFMGT�andG*�BUFMGTX).‚When�SDLC�has�received�an�error�free�transmission‚(which‚isB*�not‚an‚internally‚used‚SDLC‚control‚frame),‚the‚SBPTUSQ�or�PTUSQD*�function�is�called�and�the�received‚buffer‚is‚enqueued‚to‚the‚userI*�queue.‚In�an�EXORMACS/VM02�configuration,�the�user�queue�passes�buffers * from the VM02 to the EXORMACS.C*†In�general,�all�information�frames�(I_frames)‚contain‚applicationH*�program‚data,‚supervisory�frames�(S_frames)�are�used�internally�by�theI*�various�SDLC�stations�on�a�link,�and�un-numbered�(U_frames)�are�used‚to* control the mode of the link.C*†It‚is‚very�important�to�note�that�U_frames�are�never�"created"�orI*�"consumed"�by�the�SDLC�module:‚They�are�always�initiated�and�terminatedE*�outside‚of‚SDLC.ƒ"Hand-shake"‚procedures�exist�between�SDLC�and�theH*�U_frame�creator�and�consumer�to�assist�in�the�synchronization‚of‚these* two processes.**** 9 Entry Points*C*†External‚entry‚points�are�provided�within�the�SDLC�implementation* for the following conditions;*@* +----------+------+------------------------+-----+-----+-----+8*�!�Entry„!�Type�!�Input�Description†!�Pri�!�Sec�!�ROM�!@* +----------+------+------------------------+-----+-----+-----+;*�!�PWRUP„!�Subr�!�Start�SDLC�Operationƒ!�Yes�!�Yes�!�Yes�!2*�!�PWR†!�Intr�!�NEC7201�A-Side�Intr„!‚?‚!‚?‚!‚?‚!<*�!�INT7201‚!�Intr�!�NEC7201�B-Side�Intr„!�Yes�!�Yes�!�Yes�!=*�!�INT7201A�!�Intr�!�NEC7201�A-Side�Intr„!�Yes�!�Yes�!�Yes�!+*�!�SDLCQXMT�!�Subr�!�Unknown�!‚?‚!‚?‚!‚?‚!>*�!�SDLCQUSB�!�Subr�!�Send�Traffic�Enqueued‚!�Yes�!�No‚!�Yes�!<*�!�SDLCQUƒ!�Trap�!�Send�Traffic�Enqueued‚!�Yes�!�No‚!�Yes�!?*�!�SBUSRACK�!�Subr�!�Ack�SIM,�DISC,�or�SNRM�!�No‚!�Yes�!�Yes�!=*�!�USRACKƒ!�Trap�!�Ack�SIM,�DISC,�or�SNRM�!�No‚!�Yes�!�Yes�!>*�!�SDLCTMOU�!�Subr�!�Receive�Timer�Expired‚!�Yes�!�Yes�!�No‚!>*�!�SDLCTTMO�!�Trap�!�Receive�Timer�Expired‚!�Yes�!�Yes�!�No‚!:*�!�SDLCKLƒ!�Trap�!�Terminate�Operation„!�Yes�!�Yes�!�No‚!<*�!�SBSDLCKL�!�Subr�!�Terminate�Operation„!�Yes�!�Yes�!�No‚!9*�!�SDLCPRSB�!�Subr�!�50�mSecond�Tickˆ!�Yes�!�Yes�!�***�!7*�!�SDLCPRƒ!�Trap�!�50�mSecond�Tickˆ!�Yes�!�Yes�!�***�!=*�!�SDLCFLƒ!�Trap�!�Flush�All�Send�Traffic�!�Yes�!�Yes�!�No‚!?*�!�SBSDLCFL�!�Subr�!�Flush�All�Send�Traffic�!�Yes�!�Yes�!�No‚!<*�!�SDLCRCST�!�Trap�!�Buffer(s)�Now�Exist„!�No‚!�Yes�!�Yes�!<*�!�SBSDLCRC�!�Subr�!�Buffer(s)�Now�Exist„!�No‚!�Yes�!�Yes�!@* +----------+------+------------------------+-----+-----+-----+*F*�***�SDLCROM�executes�without�the�aid�of�"timers",‚and‚so‚these‚entry,* points are never used in actual operation.***'* 10 Support Functions and/or Variables*C*†Externally‚defined‚routines�which�are�used�by�this�implementation* are;I*�SBGTFRIR�-�FOREGROUND�(interrupt�handler)�USE�ONLY,�get�one�buffer‚fromE*†the�free�pool�regardless�of�the�low�water�mark�and�how�many�buffers *†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�-�(RMS68K�kernel�entry�point)�request‚a‚periodic‚activation‚-B*†Note‚that‚the�use�of�this�function�is�being�phased�out.‚ExistingD*†versions�(based�on�the�MC68000�MPU)�continue�to�use�this‚function,;*†andƒthereforeƒrequireƒLINK'ing‚with‚the‚associated‚RMS68KC*†functions.‚Newer�versions�(based�on�the�MC68010�MPU)�will�use‚theE*†TRAP�#0�instruction�to�access�the�same�function,�and�so�do�not�need'*†to�be�LINK'ed�with�the�RMS68K�Kernel.:* Additionally, various RMS68K functions are used by SDLC.*C*†Externally�defined�symbolic�variables�us ed�by‚this‚implementation* are;D* NECCTL_A - address of the NEC7201 device control register, Port A,D* NTCCTL_B - address of the NEC7201 device control register, Port B,A* NECDAT_A - address of the NEC7201 device data register, Port A,A* NECDAT_B - address of the NEC7201 device data register, Port B,5* SDLCPCB - pointer to the Primary Control Block, and2* TRACFLAG - trace wanted (least significant bit).**** 11 Known Problems*@*†The‚following‚paragraphs‚detail‚the‚"known"�problems�which�areD*�either�thought�to�be�within‚this‚SDLC‚implementation,‚or‚that‚haveI*�significant�bearing�on�SDLC's�performance.‚The�order�of�presentation�of'* these problems is of no significance.*G*�Thruput�Improvement�-�The�overall�system�thruput�could‚be‚improved‚byE*†adding�a�transmission�to�a�secondary�system�after�receiving�traffic@*†from�it.‚Presently,�when�a‚secondary‚station‚transmits‚inboundC*†traffic,‚it‚must�wait�for�the�next�poll�before�it�"finds�out"�howA*†many�frames�the�primary�station�received.‚During‚this‚period‚of6*†time,ƒseveralƒbuffersƒmayƒbeƒtiedƒup‚waiting‚for‚theC*†acknowledgement.‚If�the�primary�station�were�to�transmit�an�RR‚orA*†RNR‚(without‚the‚poll‚bit)�after�receiving�the�final�bit�from�a<*†secondary‚(assuming‚that‚informationƒframesƒwereƒreceived,E*†otherwise�the�extra�transmission�is�extraneous),�then�the�secondary<*†station‚would‚immediately‚know‚how‚many‚of‚its‚frames‚wereA*†successfully‚received‚by‚the�primary�station.‚This�change�would?*†have�a�significant�impact‚during‚the‚upload‚process‚where‚the7*†secondaryƒstationƒonlyƒhasƒfourƒbuffersƒto‚play‚with.A*†Unfortunately,�Network�Services�appears�to�be‚unable‚to‚keep‚up>*†with‚the‚current‚upload‚rate,‚and‚this‚proposed�change�would?*†significantly�accelerate‚the‚upload‚thruput‚thereby‚causing‚a+*†resource�shortage�in�the�primary�station.J* Architectural Problem - Use of the Low Water Mark facility of the buffer?*†pool�is�incorrect.ƒGenerally‚speaking,‚routines‚which‚consumeE*†system�buffers�should�be�subject�to�the�Low�Water�Mark,�while�those@*†which�return�buffers�to�the�pool,‚or‚that‚initiate‚some‚actionC*†which‚will‚cause�buffers�to�be�returned�to�the�pool�should�not�beA*†subject�to�the�Low�Water�Mark.‚Presently,�there�are‚a‚couple‚of@*†exceptions‚to‚these‚guidelines.ƒSpecifically,�the�SDLC�traffic>*†receive�routines�are�not�subject‚to‚the‚Low‚Water‚Mark:ƒThey;*†shouldƒbe.ƒThe‚NTS‚functions‚which‚perform‚the‚connectionE*†tear-down�(disconnect,�etc)�are�subject�to�the�Low�Water�Mark:�They>*†should‚not‚be.ƒBecause‚of‚these‚"mis-architected"�functions,C*†dead-lock�situations�occur�when�a�node�receives�to�a‚traffic‚loadB*†which‚exceeds‚its�thruput.‚All�buffers�are�consumed�with�receive@*†traffic,�and�no�buffers�are‚left‚to‚send‚application-level,‚orE*†definite�response�traffic�which�would�uncommit�some�of�the�received *†buffers.C*�Performance�Problem�-‚The‚primary‚station‚is‚not‚re-enabling‚it'sE*†receiver�soon�enough�between�successive�receptions�when�the�sendingC*†secondary�station�is�running�in�its�ROM�version�and�is‚sending‚an>*†upload.ƒThe‚primary‚receives‚the‚first‚and�third�information>*†frames,�but�misses�the‚second‚one.ƒThis‚results‚in‚excessive*†upload�durations.G*�Unknown‚Cause‚-‚A�"Receive�buffer�overrun"�error�occurs�approximatelyE*†every�four�frames�when�receiving�an�upload�from�a�secondary�stationB*†running‚in‚it's�ROM�version.‚This�problem�is�most�likely�relatedA*†to�the�preceeding�problem.‚However,�the�sequence‚of‚events‚that=*†lead‚to‚the‚receive‚buffer‚overrun‚error‚are�a�mystery:‚TheC*†secondary�station�should�not�be�sending�over-length‚messages,‚and@*†error‚recovery‚in‚the‚primary‚should�prevent�other�errors�from*†"turning�into"�this�error.F*�Unknown�Cause�-�A�secondary�station�is�apparently‚getting‚stuck‚in‚a@*†Frame‚Reject‚state‚thereby‚preventing‚that�station�(only)�from*†completing�a�restart.I*�Unknown�Cause�-�Cessation�of�down-load�during�stress�periods�requi res‚a?*†reboot‚of‚the‚entire‚system.ƒThis�situation�is�rare,�and�onlyE*†occurs�when�one�or�more�uploads�are�in�progress�at�the�same�time�as@*†downloads.ƒA‚"dead-lock"‚situation‚occurs�where�all�the�systemA*†buffers�are�in�use,�and�another�buffer�is�needed‚to‚free‚up‚anyB*†buffers.ƒThere‚may�be�other�problems�which�appear�to�be�the�sameA*†as�the�dead-lock�situation.‚This�may�be�an‚overall‚buffer‚usageB*†problem,‚or‚an‚NTS�problem�rather�than�a�specific�problem�in�the*†SDLC�implementation.E*�Architectural�Problem�-�If�a�secondary‚fails‚(or‚is‚manually‚reset)A*†while‚a‚download‚is‚in�progress�to�that�secondary,�the�state�ofC*†that�station�as�recorded�in�the�primary�occasionally‚prevents‚theC*†flushing‚of�traffic.‚This�causes�a�large�number�of�system�buffers>*†to�be�tied�up�for�an�extended�period�(conceivably,�forever).H*�Architectural�Problem�-�The�download�(and�upload)�processes‚contain‚noE*†data�rate�regulating�mechanisms�and�tend,�therefore,�to�drive�otherA*†parts�of�the�system�into�error�recovery‚situations‚by‚placing‚aB*†severe‚load‚on�the�system�unnecessarily.‚Due�to�the�difficultiesD*†in�correcting�this�problem,�no�practical�solution�appears�to‚existA*†at‚this‚time.ƒ(These�"difficulties"�include�the�need�to�totallyD*†revamp�how�uploads�and�downloads�are�performed�across�all‚products-*†currently�using�Network�Services�and�SDLC.)D*�Unknown‚Cause‚-‚An‚excessive‚retransmission‚error�is�occuring�on�a8*†download‚information‚block.„Theƒblockƒshouldƒhaveƒbeen>*†acknowledged‚by‚the‚loaded‚secondary,‚or‚it‚should�have�been@*†flushed�upon�download�completion.‚Either‚of‚these‚events‚would?*†prevent‚the‚excessive‚retransmission‚error‚which‚is�occuring.?*†There�is,�ostensibly,�no�problem�with‚this.ƒBut‚the‚system‚is'*†indicating�some�error,�none�the�less.F*�Unknown‚Cause‚-‚Apparently‚a�message�is�occasionally�being�discarded>*†erroneously�during‚the‚download‚and/or‚restart‚process.ƒThisD*†causes‚the�affected�secondary�station�to�be�unable�to�complete�itsA*†restart�and�requires�the�manual�resetting�of‚that‚station.ƒThis<*†problemƒmayƒbe‚related‚to‚the‚aforementioned‚architectural%*†difficulties�concerning�link�reset.@*�Architectural‚Problem‚-‚The‚"cooperation"‚between‚SDLCƒandƒNTSC*†concerning‚link‚reset�and/or�restart�is�faulty�due�to�a�number�ofC*†problems�in�the�architecture�of�this�area.‚The�"problems"�lead‚to1*†dead-lock�and/or�poor�performance�fairly�often.D*�Architectual‚Difficulty‚-‚RMS68K‚handling‚of‚set�date�and�time�may>*†result�in‚several‚seconds‚of‚computation‚with‚all‚interruptsC*†masked.ƒNTS/SDLC�"feels"�this�by�missing�transmission(s)�from�theC*†primary�station,�and�loosing�contact�for�several�seconds.‚As‚thisE*†only�occurs�when�a�secondary�station�is�re-starting,�the�problem�isD*†minor�the�problem�is�considered�to�be�an�"annoyance"�rather�than‚a=*†"problem".ƒCorrection‚of‚this‚problem‚may‚be‚implemented�byE*†changing�the�algorithm�within�RMS68K�and/or�by�revamping�the�"powerD*†on"�/�"power�off"�decision�criteria�within�SDLC.‚Regardless�of�theC*†RMS68K�changes,�the�SDLC's�up/down�criteria�should�be‚revamped‚as@*†the‚present‚implementation‚is‚crude‚and�"over-reacts"�to�minor*†transgressions.G*�Hardware�Problem�-�If�a�secondary�(or�the�primary)‚station‚fails‚suchC*†that‚it‚is�unable�to�perform�a�reset�of�the�communications�deviceD*†(NEC�7201),�and�the�failure�occurs�at�a�time�when�that�station‚hasA*†its‚transmitter‚enabled,‚the‚communications�circuit�will�be�"in?*†use"�for�an�indefinate�period�and‚no‚stations‚will‚be‚able‚to=*†communicate.ƒThis‚situation‚will‚continue‚until‚the‚failingC*†station�is�identified�and�disconnected�from�the�circuit.‚The‚mostD*†expeditious‚method�for�resolving�this�problem�is�to�1)�verify�thatE*†it�is�occuring�-�a�line�monitor�will�display�a�continuous�stream�ofC*†data‚on‚the�circuit�-�normally�the�same�byte�over�and�over�again,E*†and�then�to�2)�begin�disconnecting�secondary�stati ons�one�at�a�timeC*†until‚the�line�monitor�indicates�a�cessation�of�this�pattern.‚TheB*†continuous�transmission�will�cease�when�the‚offending‚station‚isD*†disconnected.‚Alternatively,�secondary�stations�may�be�powered�off@*†rather�than�being�disconnected.‚This‚condition‚(of‚a‚secondaryE*†"hogging"�the�circuit)�is�very�difficult�to�identify�in�the�primaryD*†station's�software,�and�it�is�uncertain�if�any�automatic‚procedureC*†can‚be‚initiated�by�the�primary�to�resolve�this�situation�even�if%*†it�could�determine�that�it�existed.*0* **********************************************0* * END OF FILE 'FIX:48.SDLC.OVERVIEW.AI' *0* **********************************************éé!‰TTL‡SDLC�DRIVER,�GENERIC�SECTION'* Arguments substituted via SYSGEN are;**„VERSION�-�Version�number*„REVISIO�-�Revision�number#*„REVDATE�-�Date�of�latest�revision%*„CHIPTYP�-�MPU�type�-�68000�or�680107*„STATION�-�Station�type�-�1�(Primary)�or�2�(Secondary)<*„IFRMBCT�-�I_frame�byte�counts�included�-�1�(Yes)�or�0�(No)E*„RES7201�-�Board�containing�the�NEC7201�-�02�(VM02)�or�400�(MVME400)* ‰OPT‡MEX,CRE VER†EQU‡\VERSIONŒVERSION�NUMBER/REV†EQU‡\REVISIOŒREVISION�NUMBER�WITHIN�VERSION /CHIPTYPE�EQU‡\CHIPTYPŒMPU�TYPE�(68000�OR�68010) 8STATION‚EQU‡\STATIONŒSTATION�TYPE�(PRIMARY�OR�SECONDARY)#PRIMARY‚EQU‡1“PRIMARY�STATION�VALUE&SECONDAR�EQU‡2“SECONDARY�STATION�VALUE 4IFRMBCT‚EQU‡\IFRMBCTŒSEND/RCV�BYTE�COUNT�ON�I_FRAMES YES†EQU‡1NO‡EQU‡0 0RES7201‚EQU‡\RES7201ŒNEC7201�RESIDENT�BOARD�TYPE* 02 = VM02, or 400 = MVME400 ‰IFEQ†CHIPTYPE-68000 ‹OPT‡P=68000‹IFEQ†STATION-PRIMARY/SDLCPRI†IDNT†VER,REVƒ68000�SDLC�PRIMARY�STATION:�TTL‡68000�PRIMARY�STATION�(Copyright�1982/3�Motorola�Inc)‹ENDC‹IFEQ†STATION-SECONDAR1SDLCSEC†IDNT†VER,REVƒ68000�SDLC�SECONDARY�STATION<�TTL‡68000�SECONDARY�STATION�(Copyright�1982/3�Motorola�Inc)‹ENDC‰ENDC‰IFEQ†CHIPTYPE-68010 ‹OPT‡P=68010‹IFEQ†STATION-PRIMARY/SDLCPRI†IDNT†VER,REVƒ68010�SDLC�PRIMARY�STATION:�TTL‡68010�PRIMARY�STATION�(Copyright�1982/3�Motorola�Inc)‹ENDC‹IFEQ†STATION-SECONDAR1SDLCSEC†IDNT†VER,REVƒ68010�SDLC�SECONDARY�STATION<�TTL‡68010�SECONDARY�STATION�(Copyright�1982/3�Motorola�Inc)‹ENDC‰ENDC‰IFNE†CHIPTYPE-68000‹IFNE†CHIPTYPE-680100�FAIL†1�INVALID�CHIPTYPE,�MUST�BE�68000�OR�68010‹ENDC‰ENDC‰IFNE†STATION-PRIMARY‹IFNE†STATION-SECONDAR5�FAIL†1�INVALID�STATION,�MUST�BE�PRIMARY�OR�SECONDARY‹ENDC‰ENDC‰IFNE†IFRMBCT-YES‹IFNE†IFRMBCT-NO8�FAIL†1�INVALID�IFRMBCT�VALUE,�MUST�BE�1�(YES)�OR�0�(NO)‹ENDC‰ENDC‰IFNE†RES7201-02‹IFNE†RES7201-400;�FAIL†1�INVALID�RES7201,�MUST�BE�02�(VM02)�OR�400�(MVME400)‹ENDC‰ENDC‰IFEQ†RES7201-400-H6L$‹XREF†MVME400ƒMVME400's�Base�Address‰ENDC‰PAGE‰INCLUDEƒSDLC.OVERVIEW.SI‰PAGE‰INCLUDEƒSDLC.MACROS.SI‰PAGE‰INCLUDEƒ9995.&.CRASH.MC‰INCLUDEƒ9995.&.NEC7201.EQ ‰INCLUDEƒ9995.SDLCPRI.TEMPLTS.EQ‰PAGE‰IFEQ†RES7201-400‹INCLUDEƒ9995.&.MVME400.EQ‹PAGE‰ENDC‰INCLUDEƒ9995.&.STR.EQ‰PAGE** NEC7201 Device Addresses*;‰XREF†NECCTL_A,NECCTL_B,NECDAT_A,NECDAT_B�NEC7201�Addresses ‰SECTIONƒ9 L**************************************************************************** *‰DC.B†'**SDLC**'‰IFEQ†STATION-PRIMARY)‹DC.B†'PRIMARY�'ŠEYE-CATCHER�STATION�TYPE‰ENDC‰IFEQ†STATION-SECONDARY)‹DC.B†'SECONDAR'ŠEYE-CATCHER�STATION�TYPE‰ENDC‰IFEQ†CHIPTYPE-68000‹DC.B†'68000ƒ'ŠMPU�TYPE‰ENDC‰IFEQ†CHIPTYPE-68010‹DC.B†'68010ƒ'ŠMPU�TYPE‰ENDC‰IFEQ†RES7201-02‹DC.B†'VM02„'ŠBOARD�TYPE‰ENDC‰IFEQ†RES7201-400‹DC.B†'MVME400�'ŠBOARD�TYPE‰ENDC(‰DC.B†'\REVDATE'ŠDATE�OF�LATEST�REVISION*L*****************************************************************************;‰XDEF†PWRUP,SBSDLCRCST,SBUSRACK,SDLCQUSB,SDLCTMOUT,SDLCPRSB>‰XDEF†SDLCRCST,USRACK,SDLCQU,SDLCTTMOUT,SDLCPR,SBSDLCFL,SDLCFL*‰XDEF†INT7201,INT7201A,PWR,SDLCKL,SBSDLCKL*0‰XREF†SBGTFRIR,SBPTFRBF,SBPTFRML,SBPTUSQ,SDLCPCB‰IFEQ†CHIPTYPE-68000 ‹XREF†SBRQPA‰ENDC‰XREF†TRACFLAG,DLTRACE*‰IFEQ†STATION-PRIMARY‹INCLUDEƒSDLCPRI.POLLQ.SI‰ENDC‰IFEQ†STATION-SECONDARY‹INCLUDEƒSDLCSEC.PWRUP.SI‰ENDC‰INCLUDEƒSDLCPRI.INT7201.SI‰INCLUDEƒSDLCPRI.TRANSMIT.SI‰INCLUDEƒSDLCPRI.RECEIVE.SI‰IFEQ†STATION-PRIMARY‹INCLUDEƒSDLCPRI.FRMCNT.SI‰ENDC‰IFEQ†STATION-SECONDARY‹INCLUDEƒSDLCSEC.FRMCNT.SI‰ENDC‰INCLUDEƒSDLCPRI.SUBRTN.SI‰ENDéC‚******************************************************************‚*�SDLC.SYSCMD.CD1‚*„SYSGEN�Command�File�for�SDLC�driver�generation‚*4‚*„Create�an�SDLC�driver�for�a�specific�environment.‚*‚*„Arguments�are:*‚*‡Arg�1�=�Mnemonic�-�legal�mnemonics�are:‚* ‚*‘"GMADPRI"�-�GM�primary�system"‚*‘"GMADSEC"�-�GM�secondary�system$‚*‘"HDS4PRI"�-�HDS400�primary�system&‚*‘"HDS4SEC"�-�HDS400�secondary�system$‚*‘"VME10PRI"-�VME/10�primary�system‚*:‚*‡Arg�2�=�Overall�listing�file/device.‚Listing�is�handled‚*‘by�driver�chain�file.‚*K‚*�Each�time�maintenance�is�performed,�the�following�three�arguments�should1‚*�be�updated:�REVDATE�-�Date�of�latest�revision, ‚*�VERSION�-�Version�number,�and‚*�REVISIO�-�Revision�number.‚*/‚REVDATEƒ=�"09/07/83"ƒ*�Date�of�latest�revision‚VERSIONƒ=�3Œ*�Version�number‚REVISIOƒ=�7Œ*�Revision�number ‚*‚&LF‡=�0ŒLegal�mnemonic�flag ‚IFEQˆ"\1"‰,"GMADPRI"…&LF‡=�1…STATIONƒ=�1‰Primary�station…CHIPTYPƒ=�"68000"…RES7201ƒ=�02ˆVM02…SUBSˆSDLC.ROOT.AG3…ASM‰SDLC.ROOT.AG,SDLC.GMADPRI.RO,&.SYSGEN.TF;Z=100 …=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A$…=COPY‡&.SYSGEN.TF,SDLC.GMADPRI.LS;Y‚ENDC‚IFEQˆ"\1"‰,"GMADSEC"…&LF‡=�1…STATIONƒ=�2‰Secondary�station…CHIPTYPƒ=�"68000"…RES7201ƒ=�02ˆVM02…SUBSˆSDLC.ROOT.AG3…ASM‰SDLC.ROOT.AG,SDLC.GMADSEC.RO,&.SYSGEN.TF;Z=100 …=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A$…=COPY‡&.SYSGEN.TF,SDLC.GMADSEC.LS;Y‚ENDC‚IFEQˆ"\1"‰,"HDS4PRI"…&LF‡=�1…STATIONƒ=�1‰Primary�station…CHIPTYPƒ=�"68000"…RES7201ƒ=�02ˆVM02…SUBSˆSDLC.ROOT.AG3…ASM‰SDLC.ROOT.AG,SDLC.HDS4PRI.RO,&.SYSGEN.TF;Z=100 …=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A$…=COPY‡&.SYSGEN.TF,SDLC.HDS4PRI.LS;Y‚ENDC‚IFEQˆ"\1"‰,"HDS4SEC"…&LF‡=�1…STATIONƒ=�2‰Secondary�station…CHIPTYPƒ=�"68000"…RES7201ƒ=�02ˆVM02…SUBSˆSDLC.ROOT.AG3…ASM‰SDLC.ROOT.AG,SDLC.HDS4SEC.RO,&.SYSGEN.TF;Z=100 …=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A$…=COPY‡&.SYSGEN.TF,SDLC.HDS4SEC.LS;Y‚ENDC‚IFEQˆ"\1"‰,"VME10PRI"…&LF‡=�1…STATIONƒ=�1‰Primary�station…CHIPTYPƒ=�"68010">JG…RES7201ƒ=�400‡MVME400…SUBSˆSDLC.ROOT.AG1…ASM‰SDLC.ROOT.AG,SDLC.VME10.RO,&.SYSGEN.TF;Z=100 …=COPY‡&.SYSGEN.TF,&.SYSASM.LS;A"…=COPY‡&.SYSGEN.TF,SDLC.VME10.LS;Y‚ENDC ‚IFEQˆ\&LF6…MSG‰"\1"�is�an�invalid�mnemonic.�Legal�mnemonics�are:;…MSG‰"GM ADPRI","GMADSEC","HDS4PRI","HDS4SEC",�or�"VME10PRI".…MSG‰Please�rerun�sysgen�with�proper�mnemonic.…ABORT‡‚ENDC 3‚IFRMBCTƒ=�1Œ*�Send�and�Receive�I_Frame�Byte�Counts ‚*�END�OF�SDLC.SYSCMD.CDC‚******************************************************************‚END‰ééééé' TEST OUTTERM RO[[G1OUTTERM ASREL' TEST OUTTERM SASD „Put Message out to terminal2NOUTTERM .*03AÖ!I !J0¼1|1|B¨Bh B¨NBNu4éééé ééé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é "0�for�secondary STAFLG‡SETƒ2ŠENDC ŠIFEQƒSTAFLG5�FAIL‚100ƒSTATION�must�equal�'PRIMARY'�or�'SECONDARY'ŠENDC ŠIFNEƒSTAFLG*STAFLG‡SET‚S TAFLG-1…0=PRIMARY,�1=SECONDARYŠENDC* ŠXDEFƒSYSTYPE7SYSTYPEƒDC.Bƒ\SYSTYPE‹System�type�(NOLINK,LINKMAIN,...)* ŠXDEFƒMAXSEC ŠIFEQƒSTAFLGBMAXSEC‡DC.Wƒ\MAXSEC…Max�#�secondary�stations�(if�local�is�primary) �XDEFƒFSSTN0FSSTNˆDC.Bƒ\FSSTN�First�Secondary�Station�Number �XDEFƒSSINC-SSINCˆDC.Bƒ\SSINC�Secondary�Station�INCrementŠENDC ŠIFNEƒSTAFLG5MAXSEC‡DC.Wƒ1’If�local�station�is�secondary,�MAXSEC=1 �XDEFƒFSSTN FSSTNˆDC.Bƒ0 �XDEFƒSSINC SSINCˆDC.Bƒ0ŠENDC ŠXDEFƒDLBR%DLBR†DC.Wƒ\DLBRŽData�Link's�Baud�Rate ŠXDEFƒTXRTRY(TXRTRY„DC.Bƒ\TXRTRYŒTransmit�Retry�Count ŠXDEFƒRCRTRY'RCRTRY„DC.Bƒ\RCRTRYŒReceive�Retry�Count ŠXDEFƒMXOBF3MXOBF…DC.Bƒ\MXOBF�Maximum�Number�of�Outbound�Frames ŠXDEFƒRCTOV3RCTOV…DC.Wƒ\RCTOV�Receive�Timeout�Value�(1=50�Msec) ŠXDEFƒRTRDLY+RTRDLY„DC.Wƒ\RTRDLYŒRetry�Delay�(1=50�Msec) ŠXDEFƒTXDLY,TXDLY…DC.Wƒ\TXDLY�Transmit�Delay�(1=50�Msec) ŠXDEFƒPFDLY4PFDLY…DC.Wƒ\PFDLY�Poll�Powered�Off�Delay�(1=50�Msec) ŠXDEFƒPNDLY3PNDLY…DC.Wƒ\PNDLY�Poll�Powered�On�Delay�(1=50�Msec) ŠXDEFƒTXPDS$TXPDS…DC.Bƒ\TXPDS�#�of�Transmit�PadsŠEND•J(ILOADP„IDNTƒ1,0�Init.�equates�for�LOADV2 ŠSECTION�8*$* COPYRIGHTED 1982 BY MOTOROLA, INC.*#* Initialization equates for LOADV2* ŠXDEFƒV2OFF'V2OFF…EQU„\V2OFF�Offset�for�VM02�memory ŠXDEFƒV2SYSP0V2SYSP„EQU„\V2SYSPŒAddress�for�VM02�SYSPAR�area.ŠENDééééééž "=LINK ,&.INET.LO,&.SYSGEN.TF;HMIXS TASK INET,$AATTR SDPSEG SDLC(R):9,10,2 $0000 SEG SSCT:14,0 SEG INET(R):8DEFƒDLCBLDCB,$0000DEFƒSBINFRBF,$0000DEFƒSTRSDLC,$0000INPUT„SDLC.BEGSDLC.ROINPUT„SDLC.BUFMGTX.ROINPUT„SDLC.EXORDLC.ROINPU T„NTS.NTSREQ.ROINPUT„NTS.NTCREQP.ROINPUT„NTS.NWCREQ.ROINPUT„NTS.TRANSSUB.ROINPUT„NTS.TRANSSCN.ROINPUT‡NTS.SSCT.ROINPUT‡NTS.NWCTPRI.ROINPUT‡TEST.OUTTERM.ROINPUT‡NTS.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:8DEFƒPORTAIO,$0000DEFƒNECDAT_A,$F70011DEFƒNECDAT_B,$F70013DEFƒNECCTL_A,$F70015DEFƒNECCTL_B,$F70017INPUT„SDLC.BEGSDLC.ROINPUT„SDLC.BUFMGTX.ROINPUT„SDLC.SDLCPRI.ROINPUT„SDLC.DLTRACE.ROINPUT„9999.M68XXX.EXRQPA.ROINPUT„9999.M6840.RDTIMER.ROINPUT„NTS.NTSREQ.ROINPUT„NTS.NTCREQP.ROINPUT„NTS.NWCREQ.ROINPUT„NTS.TRANSSUB.ROINPUT„NTS.TRANSSCN.ROINPUT‡NTS.SSCT.ROINPUT‡NTS.NWCTPRI.ROINPUT‡TEST.OUTTERM.ROINPUT‡NTS.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éééé °,/INETP„IDNT†1,0ƒINIT�PARAMS�FOR�NETWORK�SERVICES ‰SECTIONƒ8*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.*F***********************************************************************Ä*0*„Initialization�Parameters�for�Network�Services*Ä*F*********************************************************************** ‰XDEF†MAXLNAUFMAXLNAU‚DC.W†\MAXLNAU‚Max�#�Network�Addressable�Units�at�local�station ‰XDEF†MAXNAMEGMAXNAME‚DC.W†\MAXNAME‚Max�#�Network�Names�(if�primary�-�max�in�network) ‰XDEF†MAXCONN/MAXCONN‚DC.W†\MAXCONN‚Max�#�Logical�Connections ‰XDEF†OPERDEVOPERDEV‚DC.L†0‰ENDééééé¹%=LINK ,VM02.INET.LO,&.SYSGEN.TF;SHMIX TASK INET,$AATTR SDPSEG SDLC:9,10,2 \V2BSTR SEG SSCT:14,0 SEG &INT:8DEFƒNECDAT_A,$F70011DEFƒNECDAT_B,$F70013DEFƒNECCTL_A,$F70015DEFƒNECCTL_B,$F70017DEFƒMAXCONN,$0000DEFƒMAXLNAU,$0000DEFƒMAXNAME,$0000DEFƒNTBLDTB,$0000DEFƒNTSREQ,$0000DEFƒNWCT,$0000DEFƒOUTTERMS,$0000DEFƒSSCT,$0000DEFƒTRASCAN,$0000INPUT‡9999.M68XXX.EXRQPA.ROINPUT‡9999.M6840.RDTIMER.ROINPUT‡SDLC.BEGSDLC.ROINPUT‡SDLC.BUFMGTX.ROINPUT‡SDLC.PORTAIO.ROINPUT‡SDLC.SDLCPRI.ROINPUT‡SDLC.DLTRACE.ROINPUT„&.SYSPAR.ROINPUT„M68000.INET.ROINPUT„GEN.IDLCP.ROINPUT„GEN.IBUFQ.ROINPUT„GEN.ILOADP.ROINPUT„INET.IPSDLC.ROINPUT„SDLC.IBFMGT.ROINPUT„M68000.SRSN.ROINPUT„INET.NWTEST.ROINPUT„VM02.STRSDLC.ROINPUT„VM02.VEC7201.ROINPUT„INET.GETSTA.ROLIB 0.&.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):8DEFƒMVME400,$F1C1C1DEFƒNECDAT_A,$F1C1C9DEFƒNECDAT_B,$F1C1CBDEFƒNECCTL_A,$F1C1CDDEFƒNECCTL_B,$F1C1CFDEFƒV2OFF,$FFFFFFFFINPUT„SDLC.BEGSDLC.ROINPUT„SDLC.IBFMGT.ROINPUT„SDLC.BUFMGT.ROINPUT„SDLC.PORTAV4.ROINPUT„SDLC.VME10.ROINPUT„SDLC.DLTRACE.ROINPUT„9999.CAOE.SYSPAR.ROINPUT„NTS.NTSREQ.ROINPUT„NTS.NTCREQP.ROINPUT„NTS.NWCREQ.ROINPUT„NTS.TRANSSUB.ROINPUT„NTS.TRANSSCN.ROINPUT‡NTS.SSCT.ROINPUT‡NTS.NWCTPRI.ROINPUT‡TEST.OUTTERM.ROINPUT‡NTS.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 SIéé5ÊINT7201 SI""+POLLQ SISS.cRECEIVE SI„„5žSUBRTN SI½½ TRANSMITSIÞÞL‰PAGE4****************************************************5* BEGINNING OF FILE 'FIX:48.SDLCPRI.FRMCNT.AI' *4**************************************************** 9TRANSEQ‚EQU‡*‰End�of�Xmt�Queue�reached,�P/F�bit�NOT�sent!‰MOVE.B„#NCW0EOI,NECCTL_A8‰MOVE.B„#NCW0RG1,NECCTL_B„Disable�Transmitter�Interrupts!‰MOVE.B„#NCW1IRD+NCW1STV,NECCTL_B9‰MOVE.B„#SDPBFC,SDPBSY(A5)�SET�SDLC�BUSY�IN�FRAME�CONTROL‰ADD.W…#1,SDSHCTOF(A4)…3/2/83‰MOVE.L„SDSTHD(A4),A3‰MOVE.L„SDPRCV(A5),A2 ‰BSR.L…SOMEFREE�FREE�RCV�BUFFERS ‰LEA‡0,A2�*-‰CLR.B…SDSPWR(A4)�ASSUME�DEVICE�IS�POWERED�UP0‰BRA.L…DSPUI…DISPOSE�OF�ANY�TxMITTED�"UI"�FRAMES .TRANSPB‚BRA.L…RECEIVEƒTRANSMIT�(POLL�BIT)�EXIT ‰PAGE %TRANSUF‚EQU‡*‰TRANSMIT�UNDERFLOW�EXIT8‰MOVE.B„#NCW0RG1,NECCTL_B„Disable�Transmitter�Interrupts!‰MOVE.B„#NCW1IRD+NCW1STV,NECCTL_B9‰MOVE.B„#SDPBFC,SDPBSY(A5)�SET�SDLC�BUSY�IN�FRAME�CONTROL'‰BTST.B„#0,SDDCMD(A3)�I�FIELD�TxMITTED?‰IFˆ�THEN.S*‹SUB.B…#2,SDSVSC(A4)�YES,�FIX�UP�Vs�COUNTS‹AND.B…#$0E,SDSVSC(A4)‹SUB.B…#1,SDSUKT(A4)‰ENDI)‰TST.L…SDSTHD(A4)�Did�a�flush�just�occur?(‰BEQ.S…TRANSUF3‚Yes,�go�send�an�"RR"�now&‰TST.B…SDDRTC(A3)�No,�any�retry�count?2‰BEQ.L…TRANSMTƒNo,�retry�sending�forever�and�ever!>‰SUB.B…#1,SDDRTC(A3)�Yes,�count�one�attempt�to�send�the�buffer7‰BNE.L…TRANSMTƒand�go�re-send�it�if�count�not�exhausted4* 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.*‡unsendable�one�to�the�buffer�just�before�it.?* For example, if the transmit queue currently looks like this;'*†A�-->�B�-->�C,�where�B�is�unsendable.:* 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 J33‰MOVE.B„#SDDSSTE,SDDSTS+1(A3)�Mark�it�as�unsendable6‰MOVE.L„A3,A1…A1�=�A(Unsendable�buffer�-�for�SOMESEND)>‰MOVE.L„A3,A2…A2�=�A(Unsendable�buffer�-�for�WHILE�clause�use)6‰BSR.L…SOMESEND‚Pass�the�Unsendable�buffer�to�the�user7‰MOVE.L„A1,A3…A3�=�A(Next�buffer�in�the�transmit�queue)?‰LEA‡SDSTHD-SDDLNK(A4),A1�Find�buffer�before�the�unsendable�one?‰WHILE.LƒSDDLNK(A1)��A2�DO.S�Pointing�to�unsendable�buffer?/‹MOVE.L„SDDLNK(A1),A1‡No,�on�to�the�next�buffer‰ENDW@‰MOVE.L„A3,SDDLNK(A1)�yes,�store�"next"�into�"before�unsendable"8‰BNE.L…TRANSMTƒGo�send�the�next�one�if�something's�thereETRANSUF3�MOVE.L„SDPRCV(A5),A3�Otherwise,�send�an�"RR"�command�instead‰BRA.L…SDLCPR5B ‰PAGE /RECEIEE‚EQU‡*‰RECEIVE�EXCESSIVE�ERRORS�OCCURRED‰MOVE.B„#SDDSSRE,SDDSTS+1(A3)‰ADD.W…#1,SDSHCREX(A4) ‰BRA.S…HSKP2 ‰PAGE 'RECEITO‚EQU‡*‰RECEIVE�TIME�OUT�OCCURRED‰MOVE.B„#SDDERTO,SDDERR(A3)‰ADD.W…#1,SDSHCRTP(A4) +RECEIFB‚EQU‡*‰RECEIVED�A�FINAL�BIT�RESPONSE *RECEILB‚EQU‡*‰RECEIVE�DEPLETED�BUFFER�POOL ***ˆEND�OF�A�RCV�SEQUENCE,�SHUT�RECEIVER�OFF*HSKP2„MOVE.B„#NCW0RG1,NECCTL_B!‰MOVE.B„#NCW1IRD+NCW1STV,NECCTL_B‰MOVE.B„#NCW0RG3,NECCTL_B!‰MOVE.B„#NCW3BT8+NCW3AUE,NECCTL_B‰ADD.W…#1,SDSHCROF(A4)…3/2/83&‰BSR.L…SOMETOCLR�CLEAR�RECEIVE�TIMEOUT‰MOVE.L„SDSTHD(A4),A3‰MOVE.L„SDPRCV(A5),A2&* A5 = PRIMARY CONTROL BLOCK'S ADDRESS(* A4 = SECONDARY CONTROL BLOCK'S ADDRESS%* A3 = CURRENT TXMIT BUFFER'S ADDRESS#* A2 = CURRENT RCV BUFFER'S ADDRESS * Fall-thru to the next page‰PAGE3* NOTE: WE FALL-THRU TO HERE FROM THE PREVIOUS PAGE **ˆSDLC�FRAME�CONTROL�PROCEDURES*9‰MOVE.B„#SDPBFC,SDPBSY(A5)�SET�SDLC�BUSY�IN�FRAME�CONTROL,‰MOVE.W„#$2500,SR�LOWER�68000�INTERRUPT�MASK@‰CLR.B…SDSTXF(A4)�ASSUME�NOT�(RNR�SENT�&�GOOD�RSP�RCV'D)�2/24/83 %‰IF.B†SDDRSP(A2)��#SDDRRIM�THEN.S5‹OR.B†#SDDSRIM,SDDSTS(A2)�IF�RIM,�THEN�SET�RIM�STATUS‰ELSE.S$‹IF.B…SDDRSP(A2)��#SDDRDM�THEN.S5�OR.B†#SDDSRDM,SDDSTS(A2)�IF�RDM,�THEN�SET�RDM�STATUS‹ELSE.S$�IF.B†SDDRSP(A2)��#SDDRRD�THEN.S3�OR.B†#SDDSRRD,SDDSTS(A2)�IF�RD,�THEN�SET�RD�STATUS�ENDI‹ENDI‰ENDI.‰MOVE.B„SDDERR(A2),D0�Very�bad�error�received?‰IFˆ�THEN.S4‹IF.B†D0��#SDDENNR�AND.B�D0��#SDDEIFU�THEN.S-�BRA.L…INVRSP„Yes,�can't�tell�what�it�is,�out‹ENDI‰ENDI7‰CLR.B…SDSPWR(A4)�No,�It's�either�OK,�or�just�sorta�bad‰MOVE.B„#SDSCNRM,SDSCST(A4)$‰IF.B†SDPTXF(A5)��#SDPTRN�THEN.S<‹MOVE.B„#SDSTRN,SDSTXF(A4)�Sent�RNR�or�RR,�assert�good�reply‰ENDI ‰PAGE+HSKP9„IF.B†SDDRSP(A2)��#SDDRFRMR�THEN.SA*ŠSecondaries�send�Frame�Reject�for�any�of�the�following�reasons;*Œ1�-�Invalid�command,?*�In�DISC�or�NRM�state,�and�Rcv�XID�but�don't�have�one�to�send,/*�In�NRM�state�and�Rcv�an�"unknown"�command,�or6*�In�FRMR�state�and�Rcv�other�than�SIM,�DISC,�or�SNRM,*Œ2�-�Prohibited�I_field,7*�Rcv�an�I_field�on�a�SIM,�SNRM,�DISC,�RR,�RNR,�or�REJ,*Œ3�-�Buffer�Overrun,<*�Rcv�an�otherwise�good�frame�which�is�longer�than�a�buffer,*Œ4�-�Invalid�Nr�Count,>*�Rcv�an�Nr�count�which�acknowledges�an�frame�he's�never�sent.2‹OR.B†#SDDSFRM,SDDSTS(A2)�SET�FRMR�OCCURRED�STATUS.‹MOVE.L„A2,A1�SEND�FRMR�TO�APPLICATION�PROGRAM‹BSR.L…SOMESEND ‹MOVE.L„A1,A2$‹BSR.L…SOMEFREE�FREE�ALL�RCV�BUFFERS)‹BRA.L…DCRTX�DECREMENT�TxMIT�RETRY�COUNTS‰ENDI‰CLR.L…D0ˆNO,�IS�RESPONSE�UI?‰MOVE.B„SDDRSP(A2),D0‰AND.B…#$EF,D0‰IF.B†D0��#SDDCUI�THEN.S8‹MOVE.L„A2,A1…SEND�RECEIVE�BUFFER�TO�APPLICATION�PROGRAM‹BSR.L…SOMESEND%‹MOVE.L„A1,A2…END�OF�RECEIVE�BUFFERS? ‹MOVE.L„A1,D 0 ‹BEQ.L…DSPUI'‹BRA.L…HSKP9…NO,�TEST�BUFFER'S�RESPONSE‰ENDI!‰AND‡#$0F,D0ƒNO,�IS�RESPONSE�RNR?‰IF.B†D0��#SDDRRNR�THEN.S6‹MOVE.B„#SDSCBSY,SDSCST(A4)�YES,�SET�REMOTE�BUSY�STATE ‹BRA.L…DSPNR‰ENDI!‰CMP.B…#SDDRRR,D0�IS�RESPONSE�RR?‰BEQ.L…DSPNR…* '‰CMP.B…#SDDRREJ,D0�NO,�IS�RESPONSE�REJ?‰BEQ.L…DSPNR…* $‰BTST.L„#$0,D0„NO,�IS�IT�AN�I�FIELD?!‰BEQ.L…DSPNR1„YES,�CHECK�Nr�COUNT *‰MOVE.L„A3,D0…NO,�ANYTHING�IN�TxMIT�QUEUE?‰BEQ.L…DSPRC1„*<‰CMP.B…#SDPTXQ,SDPTXF(A5)�DID�WE�TxMIT�FROM�THE�TxMIT�QUEUE?‰BNE.L…DSPRC1„* ‰PAGE%‰IF.B†SDDCMD(A3)��#SDDCSIM�THEN.S$‹IF.B†SDDRSP(A2)��#SDDRUA�THEN.S)�MOVE.B„#SDSCRDM,SDSCST(A4)�RDM�-->�STATE�CLR.B…SDSVRC(A4)�0�-->�Vr�CLR.B…SDSVSC(A4)�0�-->�Vs �BRA.L…OKRSP‹ELSE.S �BRA.L…INVRSP‹ENDI‰ENDI&‰IF.B†SDDCMD(A3)��#SDDCSNRM�THEN.S$‹IF.B†SDDRSP(A2)��#SDDRUA�THEN.S)�MOVE.B„#SDSCNRM,SDSCST(A4)�NRM�-->�STATE�CLR.B…SDSVRC(A4)�0�-->�Vr�CLR.B…SDSVSC(A4)�0�-->�Vs �BRA.L…OKRSP‹ELSE.S �BRA.L…INVRSP‹ENDI‰ENDI&‰IF.B†SDDCMD(A3)��#SDDCDISC�THEN.S$‹IF.B†SDDRSP(A2)��#SDDRUA�THEN.S)�MOVE.B„#SDSCRDM,SDSCST(A4)�RDM�-->�STATE �BRA.L…OKRSP‹ELSE.S �BRA.L…INVRSP‹ENDI‰ENDI#‰IF.B†SDDCMD(A3)��#SDDCXID�OR.B!“SDDCMD(A3)��#SDDCTEST�THEN.S‹MOVE.B„SDDCMD(A3),D0‹IF.B†D0��SDDRSP(A2)�THEN.S9�MOVE.L„A3,A1…If�response�=�command,�discard�xmit�buffer,�BSR.L…SOMEDISPOSE�MOVE.L„A1,SDSTHD(A4).�MOVE.L„A2,A1…Pass�the�response�to�application�BSR.L…SOMESEND �MOVE.L„A1,A2�BSR.L…SOMEFREE2�BRA.L…SDLCRQ„and�select�next�station�to�talk�with‹ELSE.S �BRA.L…INVRSP‹ENDI‰ENDI0‰BRA.L…DSPUI…All�others�go�to�DSPUI�for�handling‰PAGE /* May fall-thru to here from the previous page! ADSPNR„TST.W…SDDBCT(A2)�DATA�FIELD�ON�"RR"�"RNR"�OR�"REJ"�COMMAND?(‰BNE.L…INVRSP„*�IF�YES,�INVALID�RESPONSE**ˆTEST�FOR�A�VALID�Nr�COUNT*DSPNR1ƒCLR.L…D0 ‰CLR.L…D1 ‰CLR.L…D2$‰MOVE.B„SDDRSP(A2),D0�FETCH�Nr�COUNT‰LSR.B…#5,D0…*$‰MOVE.B„SDSVSC(A4),D1�FETCH�Vs�COUNT‰LSR.B…#1,D1…*-‰MOVE.B„SDSUKT(A4),D2�FETCH�#�TxMITTED�FRAMES ‰BEQ.S…DSPNR2„*�FRAMES�TxMITTED?9‰CMP.L…#0,A3…XMIT�I_FRMS�GONE�JUST�AFTER�A�PURGE?�3/21/836‰BEQ.S…DSPNR2„YES,�SAME�AS�IF�NO�I_FRAMES�SENT�3/21/833‰BTST.B„#0,SDDCMD(A3)�NO,�"I"�FRAME�ON�TxMIT�QUEUE? ‰BNE.S…DSPNR2/‰MOVE.B„SDDCMD(A3),D1�YES,�GET�Ns�COUNT�FROM�IT ‰LSR.B…#1,D1 ‰ADD.B…D2,D1 ‰AND.B…#7,D1DSPNR2ƒWHILE.BƒD0��D1�DO.S‹SUB.B…#1,D1…NEXT�Vs�COUNT ‹AND.B…#7,D1#‹SUB.B…#1,D2…ALL�Vs�COUNTS�CHECKED?#‹BMI.L…INVRSP„YES,�INVALID�Nr�COUNT‰ENDW* Fall-thru to the next page‰PAGE3* NOTE: WE FALL-THRU TO HERE FROM THE PREVIOUS PAGE *"*ˆDISPOSE�OF�TXMIT�BUFFERS�TO�NR-1*&‰CLR.L…D1‰FETCH�Nr�COUNT�FROM�RESPONSE‰MOVE.B„SDDRSP(A2),D1 ‰LSR.B…#4,D1‰AND.B…#$0E,D1‰MOVE.B„D1,SDSVSC(A4)�Vs�=�Nr&‰MOVE.L„A3,D0…ANYTHING�IN�TxMIT�QUEUE? ‰BEQ.L…DSPRC1'DSPNR3A‚CLR.L…D0ˆTXMITTED�A�UI�COMMAND?‰MOVE.B„SDDCMD(A3),D0‰AND.B…#$EF,D0‰IF.B†D0��#SDDCUI�THEN.S‹BTST.L„#0,D0…I�FIELD? ‹BNE.L…DCRTX8‹TST.B…SDSUKT(A4)�YES,�UNACKNOWLEDGED�I�FRAMES�TxMITTED? ‹BEQ.L…DSPRC1‹AND.B…#$0E,D0ƒYES,�Nr�=�Ns? ‹CMP.B…D1,D0‹IF.B†D1��D0�THEN.S8�MOVE.B„SDDRSP(A2),D0�Nr�=�Ns,�IS�RESPONSE�RR,�RNR,�REJ?�AND.B…#$03,D0 �CMP.B…#1,D0 �BNE.S…DSPUI,�MOVE.L„A2,A1…YES,�DISPOSE�OF�RECEIVE�BUFFER�BSR.L…SOMEDISPOSE%�MOVE.L„A1,A2…END�OF�RECEIVE�BUFFERS? �MOVE.L„A1,D0,�BNE.L…HSKP9…No,�go�see�what�the�next�one�is>�CMP.B…#SDPTXQ,SDPTXF(A5)�Yes,�did�we�send�from�the�xmt�queue?'�BNE.L…DSPRC1„No,�go�finish�cleaning�up6�BRA.S…DSPUI…Yes,�discard�any�transmitted�"UI"�buffers‹ENDI‰ENDI/‰MOVE.L„A3,A1…Nr�<>�Ns,�DISPOSE�OF�TxMIT�BUFFER‰BTST.B„#4,SDDCMD(A3)‰IFˆ�THEN.S.‹BSR.L…SOMEDISPOSE�YES,�DISPOSE�OF�RCV�BUFFERS ‹MOVE.L„A1,A34‹CLR.B…SDSUKT(A4)�CLEAR�UNACKNOWLEDGED�I�FRAME�COUNT ‹BRA.L…DSPRC1‰ELSE.S‹BSR.L…SOMEDISPOSE ‹MOVE.L„A1,A3‹SUB.B…#1,SDSUKT(A4)‹BRA.S…DSPNR3A‰ENDI ‰PAGE*"*ˆAN�INVALID�RESPONSE�WAS�RECEIVED*DINVRSPƒMOVE. B„#$FF,SDSPWR(A4)„LET'S�ASSUME�THE�DEVICE�IS�POWERED�OFF**ˆDISPOSE�OF�UI�TXMIT�BUFFERS*&DSPUI„MOVE.L„A3,D0…END�OF�TxMIT�QUEUE?‰BEQ.L…DSPRC1„Yes,�out ‰CLR.L…D1ˆNo,‰MOVE.B„SDDCMD(A3),D1‰AND.B…#$EF,D1+‰CMP.B…#SDDCUI,D1�Did�we�send�a�UI�command? ‰BNE.S…DCRTX*‰MOVE.L„A3,A1…YES,�DISPOSE�OF�TXMIT�BUFFER)‰BTST.B„#4,SDDCMD(A3)�Poll/final�bit�set?‰IFˆ�THEN.S‹BSR.L…SOMEDISPOSE�No ‹MOVE.L„A1,A3 ‹BRA.S…DSPUI‰ENDI7‰BSR.L…SOMEDISPOSE�Yes,�also�dispose�of�receive�buffers ‰MOVE.L„A1,A3 ‰BRA.S…DSPRC1 ‰PAGE**ˆDECREMENT�TxMIT�RETRY�COUNTS*DCRTX„MOVE.L„A3,A1…*‰MOVE.B„SDSUKT(A4),D1�**DCRTX2ƒCMP.L…#0,A3…ALL�TxMIT�BUFFERS�GONE? ‰BEQ.S…DCRTX5"‰BTST.B„#0,SDDCMD(A3)�NO,�I�FIELD?‰IFˆ�THEN.S*‹TST.B…D1ˆYES,�UNACKNOWLEDGED�COUNT�CLEAR? ‹BEQ.S…DCRTX5‹SUB.B…#1,D1…YES,�DECREMENT�IT‰ENDI7‰TST.B…SDDRTC(A3)�NO,�DECREMENT�RETRY�COUNT�IF�NON-ZERO ‰BEQ.S…DCRTX4*‰SUB.B…#1,SDDRTC(A3)�DECREMENT�RETRY�COUNT‰BNE.S…DCRTX4„EXPIRED??‰MOVE.L„A3,A1…YES,�SEND�THIS�TxMIT�BUFFER�TO�APPL�PGM�AS�UNSENT>‰MOVE.B„#SDDSSTE,SDDSTS+1(A3)‚SET�RETRY�COUNTER�EXPIRED�STATUS$‰BTST.B„#$4,SDDCMD(A3)‚POLL�BIT�SET?‰IFˆ�THEN.S&‹BSR.L…SOMESEND�YES,�LAST�TXMIT�BUFFER4‹CLR.B…SDSUKT(A4)�CLEAR�UNACKNOWLEDGED�I�FRAME�COUNT ‹BRA.S…DCRTX5‰ENDI"‰BTST.B„#0,SDDCMD(A3)�NO,�I�FIELD?‰IFˆ�THEN.S2‹SUB.B…#1,SDSUKT(A4)�YES,�FIX�UNACKNOWLEDGED�COUNT‰ENDI‰BSR.L…SOMESEND%‰MOVE.L„A1,A3�FETCH�NEXT�TxMIT�BUFFER ‰BRA.S…DCRTX2 )DCRTX4ƒCLR.B…SDDERR(A3)�CLEAR�ERROR�FIELD$‰BTST.B„#$4,SDDCMD(A3)�POLL�BIT�SET? ‰BNE.S…DCRTX5-‰MOVE.L„SDDLNK(A3),A3�FETCH�NEXT�TxMIT�BUFFER ‰BRA.S…DCRTX2 +DCRTX5ƒMOVE.L„A1,A3ƒNEW�HEAD�OF�TxMIT�QUEUE*ˆBRA.S…DSPRC1„FALL-THRU ‰PAGE:* WARNING: WE MAY FALL-THRU TO HERE FROM THE PREVIOUS PAGE**ˆDISPOSE�OF�RCV�BUFFERS*3DSPRC1ƒMOVE.L„A3,SDSTHD(A4)�NEW�HEAD�OF�TxMIT�QUEUE.‰MOVE.L„A2,D0…ALL�RECEIVE�BUFFERS�DISPOSED�OF?‰BEQ.L…SDLCRQ„*‰MOVE.B„SDDERR(A2),D0‰IFˆ�THEN.S4‹IF.B†D0��#SDDENNR�AND.B�D0��#SDDEIFU�THEN.S?�MOVE.B„#$FF,SDSPWR(A4)�Bad�error,�assume�station�is�turned�off‹ENDI)‹TST.B…SDDSTS+1(A2)�REPORT�ERROR�TO�USER?‹BNE.S…DSPRC3„Yes,�go�tell�him+‹BRA.S…DSPRC5„NO,�JUST�FREE�THE�RCV�BUFFERS‰ENDIC‰MOVE.B„SDDRSP(A2),D0�IS�RESPONSE�FRMR,�RD,�DM,�RIM,�UI�OR�I�FIELD?‰AND.B…#$EF,D0ƒ*‰CMP.B…#SDDCUI,D0�*‰BEQ.S…DSPRC3„*‰CMP.B…#SDDRRD,SDDRSP(A2)�*‰BEQ.S…DSPRC3„*‰CMP.B…#SDDRDM,SDDRSP(A2)�*‰BEQ.S…DSPRC3„*‰CMP.B…#SDDRRIM,SDDRSP(A2) ‰BEQ.S…DSPRC3‰CMP.B…#SDDRFRMR,SDDRSP(A2) ‰BEQ.S…DSPRC3 ‰BTST.L„#0,D0 ‰BNE.S…DSPRC5CDSPRC3ƒMOVE.L„A2,A1…YES,�SEND�RECEIVE�BUFFER�TO�APPLICATION�PROGRAM$‰BTST.B„#4,SDDRSP(A2)‚Final�bit�set?‰IFˆ�THEN.S‹BSR.L…SOMESEND‚NO ‹MOVE.L„A1,A2 ‹BRA.S…DSPRC1‰ENDI3‰BSR.L…SOMESEND‚YES,�ALSO�FREE�ALL�RCV�BUFFERS�LEFT ‰MOVE.L„A1,A2*DSPRC5ƒBSR.L…SOMEFREE‚FREE�ALL�RCV�BUFFERS0‰BRA.S…SDLCRQ„SELECT�NEXT�SDLC�SECONDARY�STATION ‰PAGE*(*ˆTHE�RESPONSE�WAS�VALID�FOR�THE�COMMAND**OKRSP„MOVE.L„A3,A1…DISPOSE�OF�TXMIT�BUFFER‰BSR.L…SOMEDISPOSE�*‰MOVE.L„A1,SDSTHD(A4)�*‰BSR.L…SOMEFREE�*=*ˆBRA.S…SDLCRQ„Fall�thru�and�select�next�station�to�talk�with ‰PAGE8* Warning: May fall-thru to here from the previous page!*#*ˆSET�THE�STATION'S�POLL�DELAY�TIME*%SDLCRQƒIF.B†SDSPWR(A4)��#0�THEN.S‹IF.L‡SDSTHD(A4)��#0�THEN.S<�MOVE.W…SDSTPN(A4),SDSCTD(A4)�Up,�no�tfc,�use�Power�On�Delay‹ELSE.S8�MOVE.W…SDSTTX(A4),SDSCTD(A4)�Up,�tfr,�use�Traffic�Delay‹ENDI‰ELSE.S3‹FAIL†501�Is�this�next�MOVE.B�correct�at�this�time?9‹MOVE.B„#SDSCBSY,SDSCST(A4)�Set�busy�state�to�poll�device‹IF.L†SDSTHD(A4)��#0�THEN.S?�MOVE.W„SDSTPF(A4),SDSCTD(A4)�Down,�no�tfc,�use�Power�Off�Delay‹ELSE.S:�MOVE.W„SDSTRT(A4),SDSCTD(A4)�Down,�tfc,�use�Re-Xmit�Delay‹ENDI‰ENDI+‰MOVE.L„A4,A0…SELECT�NEXT�SECONDARY�STATION‰BRA.L…SDLCSN1 .**********************************************/* END OF FILE 'FIX:48.SDLCPRI.FRMCNT.AI' *.********************************************** éé‰PAGE6******************************************************6* BEGINNING OF FILE 'FIX:48.SDLCPRI.INT7201.AI' *6****************************************************** INTRSRG‚MACROD‰MOVEM.Lƒ(A7)+,A1-A2/D0�Restore�Registers�Used�by�Interrupt�Handlers‰ENDM INTSVRG‚MACROA‰MOVEM.LƒA1-A2/D0,-(A7)�Save�Registers�Used�by�Interrupt�Handlers‰ENDM H*************************************************************************Æ*9*ˆSUBROUTINE:‚"SBSDLCFL"‚FLUSH�(PURGE)�A�TRANSMIT�QUEUE‡**ˆTRAP:ˆ"SDLCFL"©*.*ˆENTER:‚D1.B�=�SDLC�STATION�NUMBER�TO�FLUSH“**ˆRETURN:�CCR³**‘Z�set�BUFFERS�WERE�FLUSHED›*%*‘N�set�ILLEGAL�SDLC�STATION�NUMBER”*#*ˆREGISTERS�USED:ƒ0�1�2�3�4�5�6�7�**˜DƒP©* *˜A�U�U‹S�**œ|‹|_�stack–**œ|_____________�used—**Æ*H************************************************************************ SBSDLCFL RTS2RTE5SDLCFLƒBSR.L…FINDSCBƒFind�the�Secondary�Control�Block‰IFˆ�THEN.L?‹ANDI.B„#$F7,1(A7)�Return�Negative�Clear�(Legal�station�number)0‹ORI.B…#$04,1(A7)�And�Zero�Set�(Buffers�Flushed)+‹ORI.W…#$700,SR�SCB�Found,�MASK�INTERRUPTS!(‹ADD.W…#1,SDSHCFLS(A1)�Count�the�flushes/‹MOVE.L„SDSTHD(A1),A0�Find�his�transmit�buffers)‹MOVE.L„A2,-(A7)�Protect�A2�while�tracing‹BSR.L…GETRACE�Get�a�trace�row‹IFˆ�THEN.SE**********************************************************************�Trace�Entry�Format°*E**********************************************************************Ã*#*‚+0Ž+4Ž+8‚+9‚+10…+12�+13�+14�+15‚*E* +---------------+---------------+---+---+-------+---+---+---+---+ *6*�!†PC‡!�A(1st�Buffer)�!�#�!�S�!ƒ0ƒ!�C�!�R�!�D0!�D1!�*E* +---------------+---------------+---+---+-------+---+---+---+---+ **Ã**�PC�=�Program�Counter,­*A*�A(1st�Buffer)�=�Address�of�the�first�buffer�being�flushed,�or…*1*‘Zero�when�no�buffer(s)�is(are)�being�flushed,…**�#�=�Station's�Number,­* *�S�=�Station's�Current�State,¦**�0�=�Unused,·*7*�C�=�When�A(1st�Buffer)�<>�0,�Buffer's�Command�Byte,�*7#8+ 30;1C8*�R�=�When�A(1st�Buffer)�<>�0,�Buffer's�Response�Byte,Ž*9*�D0�=�When�A(1st�Buffer)�<>�0,�Buffer's�1st�Data�Byte,�*9*�D1�=�When�A(1st�Buffer)�<>�0,�Buffer's�2nd�Data�Byte.�**Ã*E*********************************************************************�PEA‡*(PC)�If�we�get�one,�then)�MOVE.L„(A7)+,0(A2)�trace�our�PC�address,�MOVE.L„A0,4(A2)�A(1st�Buffer),)�MOVE.B„SDSSEC(A1),8(A2)�Station�address,9�MOVE.B„SDSCST(A1),9(A2)�His�current�state�(as�in�IOWA?),&�CLR.W…10(A2)�(Zero�fill�unused�bytes)�IF.L†#0��A0�THEN.S/�MOVE.B„SDDCMD(A0),12(A2)�1st�Buffer's�Command,#�MOVE.B„SDDRSP(A0),13(A2)�Response,#�MOVE.B„SDDDAT+0(A0),14(A2)�and�two.�MOVE.B„SDDDAT+1(A0),15(A2)�...�...�data�bytes�ELSE.S-�CLR.L…12(A2)�But�if�no�buffers,�store�zeroes�ENDI‹ENDI)‹MOVE.L„(A7)+,A2�Recover�A2�after�tracing‹IF.L†#0��A0�THEN.S-�CLR.L…SDSTHD(A1)�Make�all�buffers�disappear,.�BSR.L…SBPTFRML‚(return�them�to�the�free�pool)‹ENDI'‹MOVE.L„A1,A0…A0�=�A(SCB�being�flushed)‹MOVE.L„SDLCPCB,A1�A1�=�A(PCB)?‹IF.B†#SDPBTX��SDPBSY(A1)�AND.L�A0��SDPRRTA4(A1)�THEN.S$�IF.B†#SDPTXQ��SDPTXF(A1)�THEN.S;�MOVE.B„#NCW0SAB,NECCTL_B�Xmt'g�one�of�the�flushed�buffers,'�MOVE.B„#NCW0RG1,NECCTL_B�Abort�it,�and6�MOVE.B„#NCW1IRD+NCW1STV,NECCTL_B�turn �off�everything!�MOVEM.LƒA0-A6/D0-D2,-(A7)�MOVE.L„SDLCPCB,A64�MOVEM.LƒSDPRRTA0(A6),A0-A6�Restore�driver's�context�ADD.W…#1,SDSHCTOF(A4)�MOVE.L„SDPRCV(A5),A2,�BSR.L…SOMEFREE†Release�Rcv�Bfr�to�free�pool�LEA‡0,A2ŠNo�Rcv"�MOVE.L„A2,A3‰......�or�Xmt�Buffer0�MOVE.B„#$FF,SDSPWR(A4)�and�mark�station�as�DOWN$�BRA.L…SDLCRQˆNow�go�reset�its�timer�ENDI‹ENDI‰ELSE.S?‹ANDI.B„#$FB,1(A7)�Return�Zero�Clear�(Buffers�were�not�flushed);‹ORI.B…#$08,1(A7)�And�Negative�Set�(Illegal�station�number)‰ENDI‰RTE‘(UN-MASKS�INTERRUPTS) ‰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)*„the�address�of�the�INT7201�routine,�andO* 2) The SDLC Primary Control Block (PCB) contains eight vectors, four for eachI*„side�of�the�NEC7201.‚B-side�vectors�(0..3)�in�the�PCB�are�maintained�byI*„the�SDLC�driver.‚A-side�vectors�(4..7)�are�all�the�same�however,�eitherE*„pointing�to�INT7201A�or�to�PORTAIO.‚INT7201A�is�used�when�no�A-sideB*„driver�exists,�PORTAIO�is�used�when�an�A-side�driver�is�present. * NEC7201 INTERRUPT VECTOR NOTES J* When no interrupt is pending in the NEC7201, the interrupt vector numberM*�register�(2B)�"rests"�at�vector�7.‚Note�that�vector�7�is�for�A-side�SpecialM*�Receive�Condition�Interrupts.‚The�difference�between�a�"resting"�and�"real"L* interrupt vector in register 2B is indicated in the A-side register 0, bitJ*�number�1:‚Where�this�bit�is�set�(1),�an�interrupt�is�pending.‚Where�thisO* 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*�as�the�NEC7201s�vector,�the�MPU�vectors�to�the�INT7201�routine.‚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*�to�some�other�address.‚(The�A-side�driver�has�stored�these�two�addresses.)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"�External�Status�interrupt�is�questionable.‚As�we�don't�knowM* who interrupted (it is not the NEC7201), it is unclear what to do about it.‰PAGEH*************************************************************************Æ*9*ˆI.�S.�R.:‚"INT7201"‚NEC7201�Interrupt�Service�Routine‡**Æ*#*�REGISTERS�USED:ƒ0�1�2�3�4�5�6�7¤**‘D´**‘A�S¤* *¡|__�stackœ**Æ*<*ˆVectors�through�Primary�Control�Block's�Indirect�Vectors†*6*ˆOffset�by�NEC7201's�Status�Affects�Vector�RegisterŒ**Æ*3*ˆSaves�Registers�D0.L,�A1.L,�&�A2.L�on�the�Stack�*+*˜A1.L�=�Address�of�Primary�Control�Block‡**Æ*H**************************** ******************************************** "INT7201‚INTSVRG—SAVE�REGS�ON�STACK,‰CLR.W…D0’Read�the�NEC7201's�Vector�Register‰MOVE.B„#NCW0RG2,NECCTL_B‰MOVE.B„NECCTL_B,D01‰MOVE.L„SDLCPCB,A1Š(A1�=�A(Primary�Control�Block)0*ˆBTST†#0,TRACFLAG+1‡Should�interrupt�be�traced?*ˆIFˆ�THEN.S!*ŠBSR‡DLTRACE�Trace�the�interrupt*ˆENDIB‰MOVE.L„SDPVCT(A1,D0.W),A2‚Find�out�Where�To�Go�for�this�Interrupt‰JMP‡(A2)�And�Go�There! ‰PAGE I**************************************************************************Ç*'*ˆINT7201A�-�A-Side�Interrupt�Handlerœ**Ç*H*�An�A-Side�Interrupt�has�occurred,�or�something�other�than�an�NEC7201‚*I* interrupt has brought us here (in which case the NEC7201 has given us *F*�vector�#7).‚Either�way,�we�don't�want�the�nasty�little�sucker.‚So,‚*H*�if�the�NEC7201�really�did�cause�the�interrupt,�we�acknowledge�it�and‚*H*�thereby�make�the�interrupt�go�away.‚Otherwise,�we�simply�exit�in�the�*G*�hope�that�whatever�brought�us�here�won't�do�it�again�(as�we�have�noƒ*F*�idea�what�we�should�do�about�it�since�we�don't�know�what�"it"�is)!„**Ç*I************************************************************************* @INT7201A�BTST.B„#1,NECCTL_A‰Is�an�interrupt�pending�in�the�7201?1‰IFˆ�THEN.S‰Yes,�see�what�flavor�of�interrupt9‹IF.W†D0��#16�THEN.S�On�Transmitter�Empty�Interrupts,;�MOVE.B„#NCW0RTI,NECCTL_AƒReset�Transmitter�Empty�Interrupt‹ELSE.S7�IF.W†D0��#20�THEN.S�On�External�Status�Interrupts,9�MOVE.B„#NCW0REX,NECCTL_AƒReset�External�Status�Interrupt�ELSE.S8�IF.W†D0��#24�THEN.S�On�Receive�Character�Interrupts/‘TST.B…NECDAT_AŒRead�the�Char�(Clears�the�Intr)�ELSE.S5*�Otherwise,�on�Special�Receive�Condition�Interrupts,7‘MOVE.B„#NCW0ERR,NECCTL_AƒReset�Error�(Clears�the�Intr)�ENDI�ENDI‹ENDI?‹MOVE.B„#NCW0EOI,NECCTL_AƒWhatever,�make�the�interrupt�go�away!‰ENDI4*ˆBRA.S…INTEXIT�And�go�exit�from�handling�interrupts)* Fall-thru to the Interrupt Exit Routine APWR†EQU‡INT7201A‚On�Power�Up,�Reset�Any�Pending�A-Side�Interrupts ‰PAGE H*************************************************************************Æ*.*ˆ"INTEXIT"�-�NEC7201�Interrupt�Exit�Routine”**Æ*:*ˆNOTE:�All�interrupt�handling�procedures�must�come�hereˆ**ˆupon�completion.®**Æ*:*ˆChecks�for�"another"�pending�interrupt�in�the�NEC7201.ˆ*:*ˆIf�present,�we�vector�thru�the�Primary�Control�Block'sˆ*?*ˆIndirect�Vector�as�indicated�by�the�7201's�Vector�Register.ƒ*>*ˆIf�no�"other"�interrupt�is�pending,�registers�are�restored„*?*ˆfrom�the�stack,�and�an�RTE�is�executed�thereby�returning�toƒ**ˆthe�interrupted�process.¦**Æ*;*ˆAssumes�Registers�D0.L,�A1.L,�&�A2.L�still�on�the�Stack‡**Æ*H************************************************************************ ?* Warning: We may "fall-thru" to here from the preceeding page. INTEXIT‚CLR.W…D0‰MOVE.B„#NCW0RG2,NECCTL_B9‰MOVE.B„NECCTL_B,D0‰Read�the�7201's�Vector�Register,�then9‰BTST.B„#1,NECCTL_A‰If�Interrupt�Pending�Flag�Is�Now�Set,4‰IFˆ�THEN.S‰Then�"another"�Interrupt�is�Present.8‹MOVE.L„SDLCPCB,A1ŠSo,�Set�A1�=�A(Primary�Control�Block)0*ŠBTST†#0,TRACFLAG+1‡Should�interrupt�be�traced?*ŠIFˆ�THEN.S!*ŒBSR‡DLTRACE�Trace�the�interrupt*ŠENDI:‹MOVE.L„SDPVCT(A1,D0.W),A2‚Regardless,�Fetch�"Where�To�Go")‹JMP‡(A2)�And�Go�Handle�the�new�Interrupt-‰ENDIšBut�if�no�"other"�Interrupt�is�present,#‰INTRSRG—Then�Restore�the�Registers'‰RTE›And�Resume�the�Interrupted�Process 0************************************************0* END OF FILE 'FIX:48.SDLCPRI.INT7201.AI' *0************************************************é ééé4****************************************************4* BEGINNING OF FILE 'FIX:48.SDLCPRI.POLLQ.AI' *4**************************************************** SDLRSRG‚MACRO2‰MOVEM.Lƒ(A7)+,A0-A6/D0-D2�RESTORE�SAVED�REGISTERS‰ENDM SDLSVRG‚MACRO‰MOVEM.LƒA0-A6/D0-D2,-(A7)�*‰ENDM ‰SECTIONƒ9‰PAGEH*************************************************************************Æ*D*�SUBROUTINE:‚"PWRUP"�INITIALIZE�THE�NEC7201�CHIP�AT�POWER�UP�TIME„**Æ*+*�ENTER:‚A4.L�=�ADDRESS�OF�SDLC'S�SEGMENT�**Æ*#*�REGISTERS�USED:ƒ0�1�2�3�4�5�6�7¤* *‘D�U�U°**‘A�U�U�UƒP…S¤* *¡|__�stackœ**Æ*H************************************************************************ ‰NEXTWB,PWRUP„MOVE.B„#NCW0RCN,NECCTL_BƒCHANNEL�RESET‰MOVE.B„#NCW0RG2,NECCTL_A)‰MOVE.B„#NCW2RTS+NCW2PRI+NCW2BIN,NECCTL_A*‰MOVE.B„#NCW0RG2,NECCTL_BƒINTERRUPT�VECTOR‰MOVE.B„#0,NECCTL_B‰MOVE.B„#NCW0RG4,NECCTL_BƒMODE)‰MOVE.B„#NCW4C01+NCW4SDL+NCW4SME,NECCTL_B#‰MOVE.B„#NCW0RG7,NECCTL_BƒSDLC�FLAG‰MOVE.B„#SDLCFLAG,NECCTL_B3‰MOVE.B„#NCW0RG3,NECCTL_BƒENABLE�AUTO�ENABLE�OF�CTS!‰MOVE.B„#NCW3BT8+NCW3AUE,NECCTL_B‰IFEQ†RES7201-400‹MOVE.W„SR,-(A7)!‹ORI.W…#$0700,SRŠMask�Interrupts!5‹MOVE.L„#MVME400,A0ˆA0�=�Address�of�the�MVME400�board'‹BCLR.B„#REGSELEC,CTLPIA_A(A0)�Set�DDRAA‹MOVE.B„#WRT_LED+WRT_SEL,DATPIA_A(A0)�to�output�mid-two�bits�only:‹BSET.B„#REGSELEC,CTLPIA_A(A0)�Switch�now�to�Data�Reg�on�A=‹BSET.B„#WRT_SEL,DATPIA_A(A0)�Select�baud�rate�jumpers�Port�2(‹MOVE.B„DATPIA_A(A0),D0�and�read�them�in6‹ANDI.W„#$07,D0‹AND'ing�off�all�but�the�baud�rate�bitsB‹MOVE.B„V400BAUD(PC,D0.W),D0�and�get�the�4-bit�corresponding�value3‹MOVE.B„D0,-(A7)Šsaving�it�on�the�stack�temporarily,‹BCLR.B„#REGSELEC,CTLPIA_B(A0)�Now,�set�DDRB2‹MOVE.B„#%11111111,DATPIA_B(A0)�to�all�bits�output:‹BSET.B„#REGSELEC,CTLPIA_B(A0)�Switch�now�to�Data�Reg�on�B;‹MOVE.B„DATPIA_B(A0),D0�and�read�the�current�4-bit�settings.‹ANDI.B„#RATE1MSK,D0�drop�out�Port�2's�setting;‹OR.B†(A7)+,D0�and�OR�in�the�new�value�we�figured�out�aboveK8TK\Id0l;t-B‹MOVE.B„D0,DATPIA_B(A0)�and�output�the�new�rate�(Port�1�unchanged)#‹MOVE.W„(A7)+,SRŠUnmask�Interrupts!‰ENDC,‰LEA‡SDLCPR(PC),A0†FETCH�ADDRESS�OF�"SDLCPR"‰MOVE.L„#TIMCNST,A1'‰MOVE.W„#$4005,D1�INTERRUPT�LEVEL�->�D1‰MOVE.L„#DLC1,D2ŒI.D.�#�->�D2‰IFEQ†CHIPTYPE-68000 ‹TR0.RQPA‰ENDC‰IFNE†CHIPTYPE-68000 ‹TR0$.RQPA‰ENDC3‰RTS‘RETURN�(MUST�BE�A�2�BYTE�INSTRUCTION!)‚2/24/831‰ILLEGAL�DIE�IF�SBRQPA�RETURNS�ANY�ERROR!ˆ2/24/83 ‰IFEQ†RES7201-400"V400BAUDƒDC.B†15,14,13,12,10,7,5,2‰ENDC *3*„This�is�a�dummy�routine�to�satisfy�XREF�in�BUFMGT*‰XDEF†SDLCQXMT SDLCQXMT RTS‰PAGEH*************************************************************************Æ*9*ˆTRAP:‚"SDLCRCST"�THIS�ROUTINE�IS�A�"DUMMY"�TO�PROVIDEˆ*'*šCOMPATABILITY�FOR�BUFFER�MANAGEMENT‰**ˆSUBROUTINE:‚"SBSDLCRCST"¥**Æ*#*�REGISTERS�USED:ƒ0�1�2�3�4�5�6�7¤**‘D´**‘A�S¤* *¡|__�stackœ**Æ*H************************************************************************ =SDLCRCST�BSR.S…SBSDLCRCST�TRAP �ENTRY�POINT,�DO�THE�SUBROUTINE+‰MOVE.W„SR,0(A7)‚REPLACE�THE�CONDITION�CODE"‰RTE‘SO�WE�GIVE�PROPER�RETURN�CODE +SBSDLCRCST�ILLEGAL‹Die,�should�not�be�used!‰PAGEH*************************************************************************Æ*0*ˆTRAP:‚"USRACK"ƒTRAP�SERVICE�ROUTINE�FOR�SDLC�**ˆSUBROUTINE:‚"SBUSRACK"§**Æ*#*�REGISTERS�USED:ƒ0�1�2�3�4�5�6�7¤**‘D´**‘A�S¤* *¡|__�stackœ**Æ*H************************************************************************ 9USRACKƒBSR.S…SBUSRACK‚TRAP�ENTRY�POINT,�DO�THE�SUBROUTINE+‰MOVE.W„SR,0(A7)‚REPLACE�THE�CONDITION�CODE"‰RTE‘SO�WE�GIVE�PROPER�RETURN�CODE )SBUSRACK�ILLEGAL�Die,�should�not�be�used!‰PAGEH*************************************************************************Æ*0*ˆTRAP:‚"SDLCKL"ƒTRAP�SERVICE�ROUTINE�FOR�SDLC�*&*šTHIS�ROUTINE�EFFECTIVELY�KILLS�THEŠ*.*šSDLC�LINK�AND�CANCELS�PERIODIC�ACTIVATIONS‚**ˆSUBROUTINE:‚"SBSDLCKL"§**Æ*#*�REGISTERS�USED:ƒ0�1�2�3�4�5�6�7¤* *‘DƒU�U®**‘A�S¤* *¡|__�stackœ**Æ*H************************************************************************ 9SDLCKLƒBSR.S…SBSDLCKL‚TRAP�ENTRY�POINT,�DO�THE�SUBROUTINE+‰MOVE.W„SR,0(A7)‚REPLACE�THE�CONDITION�CODE&‰RTE‘SO�WE�GIVE�THE�PROPER�RETURN�CODE @SBSDLCKL�MOVE.B„#NCW0RCN,NECCTL_B�CHANNEL�RESET�THE�NEC7201�CHIP2‰MOVE.W„#$8005,D1�DISCONTINUE�PERIODIC�ACTIVATIONS‰MOVE.L„#DLC1,D2‚*‰IFEQ†CHIPTYPE-68000 ‹TR0.RQPA‰ENDC‰IFNE†CHIPTYPE-68000 ‹TR0$.RQPA‰ENDC.‰RTS‘OK,�RETURN�(MUST�BE�A�2�BYTE�INSTRUCTION)1‰ILLEGAL�DIE�IF�SBRQPA�RETURNS�ANY�ERROR!ˆ2/24/83‰PAGEH*************************************************************************Æ*0*ˆTRAP:‚"SDLCQU"‚TRAP�SERVICE�ROUTINE�FOR�SDLC�*+*™THIS�ROUTINE�CHECKS�TRANSMIT�QUEUES�FOR†*0*™DATA�TO�TRANSMIT�BETWEEN�PERIODIC�ACTIVATIONS**ˆSUBROUTINE:‚"SDLCQUSB"§**Æ**Æ*#*�REGISTERS�USED:ƒ0�1�2�3�4�5�6�7¤**‘D´**‘A�S¤* *¡|__�stackœ**Æ*H************************************************************************ SDLCQUSB RTS2RTESDLCQUƒSDLSVRG‰MOVE.L„SDLCPCB,A5‰ADD.W…#1,SDPHCQUS(A5) ‰MOVE.W„SR,D0%‰AND.W…#$0700,D0‹AT�LEAST�AT�LEVEL�5?‰IF.W†D0��#$0500�THEN.S ‹MOVE.W„SR,D0‹AND.W…#$F8FF,D0‹No,-‹OR.W†#$0500,D0‹assert�we�are�now�at�level�5!.‹MOVE.W„D0,SR�(old�SR�and�intr�level�on�stack)‰ENDI‰BRA.S…SDLCPR3‰PAGEH*************************************************************************Æ*4*ˆTRAP:‚"SDLCTTMOUT"‚TRAP�SERVICE�ROUTINE�FOR�SDLCŒ*,*�THIS�ROUTINE�IS�ENTERED�WHEN�THE�RECEIVE�**�TIMEOUT�EXPIRESš**ˆSUBROUTINE:‚"SDLCTMOUT"¦**Æ**Æ*#*�REGISTERS�USED:ƒ0�1�2�3�4�5�6�7¤**‘D´**‘A�S¤* *¡|__�stackœ**Æ*H************************************************************************ SDLCTMOUT‚RTS2RTE%SDLCTTMOUT�SDLSVRG�SAVE�ALL�USER�REGS+‰MOVE.L„SDLCPCB,A6�RESTORE�REGS�FROM�P.C.B.‰MOVEM.LƒSDPRRTA0(A6),A0-A6‰ADD.W…#1,SDSHCRTO(A4)…3/2/83‰BRA.L…RECEITOƒRECEIVE�TIMEOUT ‰PAGE H*************************************************************************Æ*>*ˆTRAP:‚"SDLCPR"‚TRAP�ROUTINE�WHICH�IS�ENTERED�WHEN�PERIODIC‚**™TIMER�RUNS�DOWNž**ˆSUBROUTINE:‚"SDLCPRSB"§**Æ*0*ˆENTER:‚D0.L�=�#�INTERVALS�WHICH�HAVE�ELAPSED‘**�D1.L�=�ACTIVATION�I.D. **Æ*C*�WARNING:‚THIS�SECTION�OF�CODE�RUNS�AT�INTERRUPT�LEVEL�FIVE�(5).…*C*�HOWEVER,�WHEN�WE�ENTER�HERE�AFTER�COMPLETING�A�TRANSACTION�WITH†*F*�A�SECONDARY�STATION,�WE�ARE�AT�"FUNNY�LEVEL�5"�-�I.E.,�WE�SUFFEREDƒ*E*�A�LEVEL�SIX�(6)�INTERRUPT,�HANDLED�IT,�AND�THEN�LOWERED�THE�LEVEL„*E*�TO�FIVE.‚AS�A�RESULT,�WE�MAY�HAVE�INTERRUPTED�OURSELVES.‚FOR�THIS‚*G*�REASON,�THE�VARIABLE�"SDPBSY"�IS�USED�TO�ALLOW�ACCESS�TO�THE�"START‚*D*�NEW�WORK"�PORTIONS�OF�THIS�IMPLEMENTATION.‚WHEN�THIS�VARIABLE�IS„*E*�SET�TO�"NOT�BUSY",�THEN�AND�ONLY�THEN�CAN�WE�LOOK�FOR�NEW�WORK�TO„*G*�BE�INITIATED.‚WHEN�WE�ARE�NOT�"NOT�BUSY"�(I.E.,�WE�ARE�BUSY�SENDING�*E*�OR�RECEIVING,�OR�WHATEVER)�WE�CAN�ONLY�DECREMENT�THE�TIMER�VALUES„*F*�IN�THE�SECONDARY�CONTROL�BLOCKS,�AND�NO�MORE.‚LASTLY,�BECAUSE�EVEN‚*D*�THIS�COULD�BE�"INTERRUPTED "�BY�OURSELVES,�WE�MUST�HANDLE�A�TIMER…*G*�VALUE�WHICH�GOES�TO�LESS�THAN�ZERO�(I.E.,�WE�COMMITTED�TO�DECREMENT‚*H* A TIMER, WERE INTERRUPTED AND ZEROED THAT COUNTER, AND THEN RETURNED *2*�TO�SUBTRACT�ONE,�LEAVING�THAT�COUNT�NEGATIVE).—**Æ**�ED�SKINNER,�MARCH�2,�1983¬**Æ*H************************************************************************ SDLCPRSB RTS2RTESDLCPRƒSDLSVRG‰MOVE.L„#0,A1…SET�UP�REGISTERS‰MOVE.L„SDLCPCB,A5�*‰MOVE.L„SDPFSEC(A5),A0†**<*ˆDECREMENT�THE�CURRENT�TIME�DELAY�OF�ALL�SECONDARY�STATIONS$*‰AND�SELECT�THE�1ST�ONE�THAT'S�ZERO* ‰WHILE.BƒSDSSEC(A0)��#0�DO.S‹IF.W†SDSCTD(A0)��#0�THEN.S2�SUB.W…D0,SDSCTD(A0)�Timer�:=�Timer�-�Elapsed_Time‹ENDI<‹ADD.L…#SDSLNG,A0�Thusly�update�ALL�Secondary�Control�Blocks‰ENDW* Fall-thru to the next page‰PAGE:* NOTE: MAY BE FALLING-THRU TO HERE FROM THE PREVIOUS PAGE F* NOTE: ENTER HERE FROM SDLCQUSB - SOMEONE HAS ENQUEUED AN XMIT BUFFER FSDLCPR3‚MOVE.L„SDPFSEC(A5),A0�Are�we�NOT�"NOT�BUSY"�(ie,�are�we�busy?)$‰IF.B†SDPBSY(A5)��#SDPBNB�THEN.S‹SDLRSRG�Yes,�exit‹RTE‰ENDI‰PAGE*1*ˆSELECT�THE�1ST�SCB�WHOSE�TIME�DELAY�IS�NOW�ZERO*?SDLCSLƒWHILE.BƒSDSSEC(A0)��#0�AND.W�SDSCTD(A0)��#0�DO.S,SDLCSN1„ADD.L…#SDSLNG,A0�Advance�to�next�SCB‰ENDW‰IF.B†SDSSEC(A0)��#0�THEN.S<‹MOVE.B„#SDPBNB,SDPBSY(A5)�End�of�list,�set�SDLC�to�NOT�BUSY‹SDLRSRG�And�exit‹RTE‰ENDI‰MOVE.L„A0,A4…A4�=�A(SCB)(‰MOVE.B„#SDPBFC,SDPBSY(A5)�set�SDLC�BUSY* Fall-Thru to next page‰PAGE7* WARNING: MAY FALL-THRU TO HERE FROM THE PREVIOUS PAGE*0* A4 = CURRENT SECONDARY'S CONTROL BLOCK ADDRESS.* A5 = CURRENT PRIMARY'S CONTROL BLOCK ADDRESS*.*ˆA�SECONDARY�CONTROL�BLOCK�HAS�BEEN�SELECTED,*ˆDetermine�what�to�send.*3‰CMP.B…#SDSCBSY,SDSCST(A4)�SECONDARY�IN�BUSY�STATE?‰BEQ.S…SDLCPR5ƒ*)‰TST.L…SDSTHD(A4)�NO,�SOMETHING�TO�TXMIT?‰BNE.S…SDLCPR6ƒ*=SDLCPR5‚BSR.L…SBGTFRIR‚NO,�FETCH�A�RCV�BUFFER�&�TXMIT�AN�"RR"-‰BEQ.S…SDLCPR5B‚GOT�ONE�AND�IT'S�NOT�THE�LAST‰IFˆ�THEN.S6‹MOVE.B„#SDPBNB,SDPBSY(A5)�Didn't�get�one,�go�NOT�BUSY‹SDLRSRG�And�exit‹RTE‰ENDI!* GOT ONE, BUT IT'S THE VERY LASTASDLCPR5A�MOVE.B„#SDDRRNR+$10,SDDCMD(A3)�YES,�SET�AN�"RNR"�COMMAND‰BRA.S…SDLCPR5C #*ˆA3�=�BUFFER�CONTROL�BLOCK�ADDRESS;SDLCPR5B�MOVE.B„#SDDRRR+$10,SDDCMD(A3)�SEND�AN�"RR"�COMMAND?SDLCPR5C�MOVE.L„A3,SDPRCV(A5)‚*�(TxMIT�FROM�THE�RECEIVE�BUFFER)‰MOVE.B„#SDPTRQ,SDPTXF(A5)�*�**‰MOVE.W„SDPRLG(A5),SDDBCT(A3)�*�BYTE�COUNT‰CLR.W…SDDSTS(A3)�*�STATUS‰CLR.B…SDDERR(A3)�*�SDLC�ERROR$‰CLR.B…SDDRTC(A3)�*�SDLC�RETRY�COUNT.‰MOVE.B„SDSSEC(A4),SDDSEC(A3)�*�STATION�NUMBER‰BRA.L…TRANSMTƒ*�*‰PAGEH* NOTE: ED SKINNER, 2/24/83 - WHEN WE HAVE A "SNRM" TO SEND, WE ACTUALLYI*�PERFORM�THE�FOLLOWING:‚1)�TRANSMIT�A�"RNR"�COMMAND�AND�RECEIVE�A�"GOOD"H*�RESPONSE.‚THIS�IS�DONE�SO�THE�REMOTE�STATION�WILL�KNOW�HOW�MANY�OF�HISH* INFORMATION FRAMES THAT WE HAVE RECEIVED, THEREBY AVOIDING DUPLICATIONH*�OF�FRAMES.‚WE�MUST�GET�A�"GOOD"�RESPONSE�TO�THE�RNR�BEFORE�SENDING�THEH* SNRM SO THAT WE KNOW HE GOT THE RNR OK, AND THEREFORE NOW KNOWS OUR NrI*�VALUE.‚(BY�A�"GOOD"�RESPONSE,�I�MEAN�A�RECEIVED�REPLY�OF�ANY�KIND�WHICHJ* WAS RECEIVED WITHOUT ANY ERRORS - DOES AN Ns ERROR COUNT? I DON'T KNOW!)D* ONCE WE'VE RECEIVED A "GOOD" REPLY, WE CAN THEN TRANSMIT THE SNRM. 6SDLCPR6‚MOVE.L„SDSTHD(A4),A3�WE�HAVE�SOMETHING�TO�TXMT3‰CMP.B…#SDDCSNRM,SDDCMD(A3)�"SNRM"�COMMAND?Ž9/14/82&‰BNE.S…SDLCPR6C‚*�BRANCH�IF�NOš9/14/829‰CMP.B…#SDSTRN,SDSTXF(A4)�YES,�TXMITTED�AN�"RNR"?ˆ2/23/83'‰BEQ.S…SDLCPR6C‚*�BRANCH�IF�YES™9/14/82?‰BSR.L…SBGTFRIR‚NO,�FETCH�A�RCV�BUFFER�&�TXMIT�AN�"RNR"�9/14/825‰BEQ.S…SDLCPR5A‚GOT�ONE�AND�IT'S�NOT�THE�LAST‹9/14/82‰IFˆ�THEN.S6‹MOVE.B„#SDPBNB,SDPBSY(A5)�Didn't�get�one,�go�NOT�BUSY‹SDLRSRG�And�exit‹RTE‰ENDI"* WE JUST GOT THE VERY LAST BUFFER)‰BRA.S…SDLCPR5A‚TRANSMIT�AN�"RNR"—9/14/82 "SDLCPR6C�MOVE.B„#SDPTXQ,SDPTXF(A5)‰MOVE.L„A3,-(A7),‰BSR.L…SBGTFRIR‚Get�a�buffer �to�receive�into‰IFˆ�THEN.S:‹MOVE.W„SDPRLG(A5),SDDBCT(A3)�Ok,�Prepare�it�for�later�use‹CLR.W…SDDSTS(A3)�STATUS‹CLR.B…SDDERR(A3)�SDLC�ERROR‹MOVE.L„A3,SDPRCV(A5)‹MOVE.L„(A7)+,A3)‹BTST.B„#0,SDDCMD(A3)�I�Frame�to�be�sent?‹IFˆ�THEN.S4�CLR.B…SDSUKT(A4)�Yes,�zero�the�number�of�frames�out‹ENDI‰ELSE.S.‹MOVE.L„(A7)+,A0�Absolutely�no�buffers�at�all,-‹MOVE.B„#SDPBNB,SDPBSY(A5)�Set�SDLC�not�busy,‹SDLRSRG�And�exit‹RTE‰ENDI$‰BRA.L…TRANSMTƒGo�start�transmitting .**********************************************.* END OF FILE 'FIX:48.SDLCPRI.POLLQ.AI' *.**********************************************é‰PAGE6******************************************************6* BEGINNING OF FILE 'FIX:48.SDLCPRI.RECEIVE.AI' *6****************************************************** H*************************************************************************'*ˆMODULE:‚"RECEIVE"�RECEIVE�SDLC�FRAMES*-*ˆENTER:‚A5.L�=�PRIMARY�CONTROL�BLOCK�ADDRESS(*�A4.L�=�SECONDARY�CONTROL�BLOCK�ADDRESS*9*ˆENTRY�ASSUMES�A0-A6/D0-D7�HAVE�BEEN�PUSHED�ON�THE�STACK5*–AND�ENTRY�WAS�THROUGH�EXCEPTION�(TRAP�OR�INTERRUPT)*>*ˆEXIT:‚"RECEIFB"‚SDLC�RESPONSE�WITH�FINAL�BIT�SET�CAUSED�EXIT'*�"RECEITO"‚RECEIVE�TIMEOUT�CAUSED�EXIT3*�"RECEILB"‚THE�FREE�QUEUE�HAS�ONLY�ONE�BUFFER�LEFT9*�"RECEIEE"‚AN�EXCESSIVE�NUMBER�OF�RCV�ERRORS�CAUSED�EXIT*!*ˆREGISTERS�USED:ƒ0�1�2�3�4�5�6�7*˜D�U*˜A�U�U�U�U�P�PƒS* |ƒ|ƒ|__�stack* |ƒ|______�preserved* |__________�used*#*ˆEXITS�TO�EXTERNALLY�DEFINED�LABEL&*ŽWITH�A0-A6/D0-D7�PUSHED�ON�THE�STACK&*ŽAND�ASSUMES�FINAL�EXIT�WILL�BE�"RTE"*H************************************************************************ ?RECEIVE‚MOVE.B„#SDPBRC,SDPBSY(A5)‚Mark�us�as�busy�receiving�now ‰ADD.W…#1,SDSHCRCV(A4)…3/2/83 <‰LEA‡RCVSTSEI(PC),A0…and�set�interrupt�vectors�for�receiving‰MOVE.L„A0,SDPVCT2(A5)‰LEA‡RCVST1(PC),A0‰MOVE.L„A0,SDPVCT3(A5)‰LEA‡RCVSTS(PC),A0‰MOVE.L„A0,SDPVCT4(A5) 5‰MOVE.L„SDPRCV(A5),A3‡Find�the�buffer�to�receive�into6‰LEA‡SDDDAT(A3),A2‡A2�=�A(data�area�within�the�buffer)(‰MOVE.L„#0,A1�(Zero�the�high�word�of�A1)‰MOVE.W„SDPRLG(A5),A1‡and6‰MOVE.W„A1,SDDBCT(A3)‹store�maximum�byte�count‚2/24/83:‰MOVE.B„SDSRRT(A4),SDSCSE(A4)�Initialize�the�error�counter.‰CLR.B…SDDERR(A3)ŠClear�the�error�flagŠ2/24/83B‰MOVEM.LƒA0-A6,SDPRRTA0(A5)‚Save�regs�for�interrupt�handlers�usage9‰MOVE.W„#-1,SDPRBCT(A5)…make�the�count�field�"bad"„3/8/83 ‰OR.W†#$700,SRŒMask�interrupts2‰MOVE.B„#NCW0RG6,NECCTL_B„Load�the�station�address0‰MOVE.B„SDSSEC(A4),NECCTL_B‚We�are�interested�in;‰MOVE.B„#NCW0REX+NCW0RG1,NECCTL_B�EXT�&�RCV�CHAR�INT�ENABLE|:…B�K•G�4¥:­#)‰MOVE.B„#NCW1IRX+NCW1EXI+NCW1STV,NECCTL_B$‰MOVE.B„#NCW0RG3,NECCTL_B„RCV�ENABLE;W3TOTAL‚EQU‡NCW3BT8+NCW3AUE+NCW3EHU+NCW3CRC+NCW3ADS+NCW3RXE‰MOVE.B„#W3TOTAL,NECCTL_B!‰MOVE.B„#NCW0RG5,NECCTL_B„SET�DTR‰MOVE.B„#NCW5DTR,NECCTL_B5‰MOVE.B„#NCW0RTX,NECCTL_B„ENABLE�INT�ON�NEXT�RCV�CHAR!‰MOVE.B„#NCW0RTC+NCW0REX,NECCTL_B '‰BSR.L…SOMETOUT‚TRIGGER�RECEIVE�TIMEOUT ‰SDLRSRG—Restore�all�registers,‰INTSVRG—Then�save�only�the�"interrupt"�ones‰BRA.L…INTEXIT ‰PAGE*#* External Status Interrupt Handler*I*�NOTE:‚THIS�STATE�IS�USED�WHEN�AN�EXTERNAL�STATUS�INTERRUPT�OCCURS�PRIORB*ˆTO�RECEIVING�THE�FIRST�CHARACTER�OF�A�RECEIVE�FRAME.‚DURING�THISF*ˆPERIOD�(BEFORE�WE�BEGIN�RECEIVING�A�FRAME)�WE�IGNORE�EXTERNAL�STATUSE*ˆINTERRUPTS.‚WE�DON 'T�CARE�ABOUT�RECEIVE�ABORTS�AND/OR�CLEAR�TO�SENDC*ˆAND/OR�DATA�CARRIER�DETECT�STATE�CHANGES�WHEN�WE�ARE�NOT�ACTUALLY*ˆRECEIVING�A�FRAME. 1RCVSTSEI�MOVE.B„NECCTL_B,D0ŠGET�THE�CHIP'S�STATUS*œIGNORE�RECEIVE�ABORT,*œHUNT�MODE�CHANGES,*œCLEAR�TO�SEND�CHANGES,�AND*œDATA�CARRIER�DETECT�CHANGES./‰MOVE.B„#NCW0REX,NECCTL_B�RESET�EXTERNAL�STATUS.‰MOVE.B„#NCW0EOI,NECCTL_A�AND�END�OF�INTERRUPT‰BRA.L…INTEXIT‰PAGE*#* External Status Interrupt Handler**1*ˆVECTORED�STATE�TO�PROCESS�EXT/STATUS�INTERRUPTS*%RCVSTEƒMOVE.B„NECCTL_B,D0�SDLC�ABORT?‰BTST.L„#7,D0…*‰BNE.S…RCVSTE1ƒ*,‰BTST.L„#3,D0…NO,�DataCarrierDetect�DROPPED?‰BEQ.S…RCVSTE2ƒ*4‰MOVE.B„#NCW0REX,NECCTL_B�NO,�RESET�INTERRUPT�&�EXIT‰MOVE.B„#NCW0EOI,NECCTL_A�*‰BRA.L…INTEXIT‡* 7RCVSTE1‚MOVE.B„#NCW0REX,NECCTL_B„RESET�INTERRUPT�&�EXIT‰MOVE.B„#NCW0EOI,NECCTL_A�*3RCVSTE1A�INTRSRG“LET'S�SAVE�ALL�THE�USERS'�REGS�NOW ‰SDLSVRG“*‰MOVE.L„SDLCPCB,A6�RESTORE�REGS‰MOVEM.LƒSDPRRTA0(A6),A0-A6�*3‰MOVE.B„#SDDEABT,SDDERR(A3)„SET�SDLC�ABORT�OCCURRED‰ADD.W…#1,SDSHCRAB(A4)…3/2/83‰BRA.L…RCVSTSF�*   7RCVSTE2‚MOVE.B„#NCW0REX,NECCTL_B„RESET�INTERRUPT�&�EXIT‰MOVE.B„#NCW0EOI,NECCTL_A�*+‰INTRSRG“LET'S�SAVE�ALL�THE�USERS'�REGS�NOW ‰SDLSVRG“*‰MOVE.L„SDLCPCB,A6�RESTORE�REGS‰MOVEM.LƒSDPRRTA0(A6),A0-A6�*<‰MOVE.B„#SDDEABT,SDDERR(A3)„ASSUME�AN�ABORT�OCCURREDƒ2/24/83‰ADD.W…#1,SDSHCRDD(A4)…3/2/83‰BRA.L…RCVSTSE�* ‰PAGE *%* Receive Character Interrupt Handler**2*ˆVECTORED�STATE�TO�PROCESS�1ST�RCV�CHAR�AVAILABLE*�THEN.S0‹MOVE.L„SDPRRTA2(A1),A2…More�may�be�received�OK,5‹MOVE.B„NECDAT_B,(A2)+‡Store�received�byte�into�buffe2‹MOVE.L„A2,SDPRRTA2(A1)…Save�updated�data�address.‰ELSE.S9‹LEA‡RCVST4(PC),A2‡Buffer�is�full,�better�by�1st�FCS�byte<‹MOVE.L„A2,SDPVCT3(A1)†Use�BUFFER�OVERRUN�vector�if�rcv�more2‹MOVE.B„NECDAT_B,D0Šand�discard�1st�FCS�byte�(hope‰ENDI‰MOVE.B„#NCW0EOI,NECCTL_A‰BRA.L…INTEXIT ‰PAGE *%* Receive Character Interrupt Handler**+*ˆVECTORED�STATE�TO�PROCESS� OVERRUN�BUFFERS*2RCVST4ƒMOVE.L„SDPRRTA3(A1),A2�BUFFER�OVERRUN�ERROR‰MOVE.B„#SDDERBO,SDDERR(A2)1‰MOVE.B„NECDAT_B,D0�REMOVE�CHARACTER�FROM�NEC7201‰MOVE.L„SDPRRTA4(A1),A2…3/2/83‰ADD.W…#1,SDSHCROB(A2)…3/2/83‰MOVE.B„#NCW0EOI,NECCTL_A‰BRA.L…INTEXIT ‰PAGE *-* Special Receive Condition Interrupt Handler**2*ˆVECTORED�STATE�TO�PROCESS�SPECIAL�RCV�CONDITIONS*?RCVSTSƒMOVE.B„NECDAT_B,D0‚REMOVE�2ND�CRC�CHARACTER�FROM�NEC7201+‰INTRSRG“LET'S�SAVE�ALL�THE�USERS'�REGS�NOW‰SDLSVRG‰MOVE.L„SDLCPCB,A6�RESTORE�REGS‰MOVEM.LƒSDPRRTA0(A6),A0-A64‰MOVE.B„#NCW0RG1,NECCTL_B�Get�Register�1�Information‰MOVE.B„NECCTL_B,D03‰MOVE.B„#NCW0ERR,NECCTL_B�(reset�special�interrupt)!‰MOVE.B„#NCW0RTC+NCW0RTX,NECCTL_B‰MOVE.B„#NCW0EOI,NECCTL_A )‰MOVE.L„A2,-(A7)ŒProtect�A2�while�tracing‰BSR.L…GETRACE�Get�a�trace�row‰IFˆ�THEN.SE**********************************************************************�Trace�Entry�Format°*E**********************************************************************Ã*'*‚+0Ž+4Ž+8‚+9‚+10�+11�+12�+13�+14�+15‚*E* +---------------+---------------+---+---+---+---+---+---+---+---+ *:*�!†PC‡!�A(Rcv�Buffer)�!�#�!�S�!�C�!�R�!�D0!�D1!�E�!�R1!�*E* +---------------+---------------+---+---+---+---+---+---+---+---+ **Ã**�PC�=�Program�Counter,­*8*�A(Rcv�Buffer)�=�Address�of�the�buffer�just�received,Ž**�#�=�Station's�Number,­* *�S�=�Station's�Current�State,¦**�C�=�Buffer's�Command�Byte,¨**�R�=�Buffer's�Response�Byte,§* *�D0�=�Buffer's�1st�Data�Byte,¦* *�D1�=�Buffer's�2nd�Data�Byte,¦*!*�E�=�Buffer's�Error�Code�Byte,¥*(*�R1�=�NEC7201�Read�Register�One�Byte.ž**Ã*E*********************************************************************,‹PEA‡*(PC)�If�we�get�a�trace�row,�then�trace#‹MOVE.L„(A7)+,0(A2)‰our�PC�address,‹MOVE.L„A3,4(A2)ŒA(Rcv�Buffer),)‹MOVE.B„SDSSEC(A4),8(A2)„Station�address,+‹MOVE.B„SDSCST(A4),9(A2)„His�current�state,0‹MOVE.B„SDDCMD(A3),10(A2)ƒCommand�Byte�(if�any),(‹MOVE.B„SDDRSP(A3),11(A2)ƒResponse�Byte,%‹MOVE.B„SDDDAT+0(A3),12(A2)�First�and.‹MOVE.B„SDDDAT+1(A3),13(A2)�Second�data�bytes,.‹MOVE.B„SDDERR(A3),14(A2)ƒError�code�byte,�and-‹MOVE.B„D0,15(A2)‹Register�1�from�the�NEC7201‰ENDI)‰MOVE.L„(A7)+,A2ŒRecover�A2�after�tracing $‰BTST.L„#7,D0…End�of�Frame�detected?‰BEQ.S…RCVSTSA‰BTST.L„#6,D0…Yes,�FCS�error?‰IFˆ�THEN.S=‹MOVE.B„#SDDECRC,SDDERR(A3)�Yes,�post�the�error�in�the�buffer‹ADD.W…#1,SDSHCRCR(A4)…3/2/83‰ENDI&RCVSTSA‚BTST.L„#5,D0…receiver�overrun?‰IFˆ�THEN.S6‹MOVE.B„#SDDERCU,SDDERR(A3)�Yes,�post�it�in�the�buffer‹ADD.W…#1,SDSHCROR(A4)…3/2/83‰ENDI,‰CMP.B…#SDDERTO,SDDERR(A3)�Receive�time-out?0‰BEQ.L…RECEITO�Yes,�depart�from�here�completely!,‰TST.B…SDDERR(A3)ŠAny�error�detected�so�far?‰IFˆ�THEN.S/‹CMP.B…#SDDERBO,SDDERR(A3)�Yes,�frame�too�long?1‹BNE.L…RCVSTSE�No,�just�ignore�the�received�frame(‹TST.B…SDSCSE(A4)ŠYes,�any�retries�left?-‹BNE.L…RCVSTSE’Yes,�ignore�the�received�frame7* When a Buffer Overrun occurs and no retries are left,J* the overlength frame is passed to the application with the error posted.L* This allows someone to complain about these "big" frames we are receiving.‰ENDI9‰MOVE.W„A1,D0…Calculate�how�many�bytes�are�in�the�buffer,5‰ADD.W…#1,D0…Adding�one�for�1st�FCS�character�overrun‰SUB.W…D0,SDDBCT(A3)C‰CMP.W…#-1,SDDBCT(A3)�Is�the�frame�too�short?�(LT�32�bits?)�8/27/82‰IFˆ�THEN.S8‹MOVE.B„#SDDEIFU,SDDERR(A3)�Yes,�post�the�error‰10/13/82‹ADD.W…#1,SDSHCR32(A4)…3/2/83‹BRA.L…RCVSTSF©10/13/82‰ENDI,‰BTST.B„#0,SDDRSP(A3)‚No,�was�it�an�I�frame?$‰BNE.S…RCVSTSDƒOut�if�not�an�I�frame‰IFEQ†IFRMBCT-YES3‹MOVE.W„SDPRBCT(A5),D0‚I�Frame's�Length�as�Claimed?‹CMP.W…SDDBCT(A3),D0‹BNE.S…RCVSTSB6ˆNo,�branch‰ENDC=‰CMP.B…#SDPTRN,SDPTXF(A5)‚Yes,�did�we�just�send�an�RNR�frame?0‰BNE.S…RCVSTSB3ŒNo,�it's�OK�to�rcv�I�frames�thenHRCVSTSB6�MOVE.B„#SDDEIFU,SDDERR(A3)�Yes,�station�shouldn't�have�sent�it!‰ADD.W…#1,SD SHCRLN(A4)…3/2/83‰BRA.S…RCVSTSB4 ARCVSTSB3�MOVE.B„SDDRSP(A3),D0‡NO,�DOES�Vr�=�Ns�in�received�frame? ‰ASL.B…#4,D0‰AND.B…#$E0,D0‰CMP.B…SDSVRC(A4),D0‰BEQ.S…RCVSTSC:RCVSTSB5�MOVE.B„#SDDENNR,SDDERR(A3)�NO,�SET�Vr�<>�Ns�ERROR‰ADD.W…#1,SDSHCRNR(A4)…3/2/83ARCVSTSB4�BTST.B„#4,SDDRSP(A3)‡Is�the�received�poll/final�bit�set?‰BEQ.S…RCVSTSE-‰BRA.L…RECEIFB�YES,�EXIT�(RECEIVED�FINAL�BIT) 5RCVSTSC‚ADD.B…#$20,SDSVRC(A4)…Vr�=�Ns,�so�Vr�=�Vr�+�1‰AND.B…#$E0,SDSVRC(A4)@RCVSTSD‚BTST.B„#4,SDDRSP(A3)‡Is�the�received�poll/final�bit�set?‰BEQ.S…RCVSTSD1-‰BRA.L…RECEIFB�YES,�EXIT�(RECEIVED�FINAL�BIT) �A2 ‰ADD.L…A3,A2#‰MOVE.L„#0,A1…BUFFER'S�LENGTH�->�A1‰MOVE.W„SDPRLG(A5),A1 ‰MOVE.W„A1,SDDBCT(A3)�BYTE�COUNT"‰CLR.B…SDDERR(A3)„CLEAR�SDLC�ERROR%‰MOVEM.LƒA0-A6,SDPRRTA0(A5)�SAVE�REGS2‰LEA‡RCVST1(PC),A0‡VECTORED�STATE�FOR�1ST�RCV�CHAR‰MOVE.L„A0,SDPVCT3(A5)*‰LEA‡RCVSTSEI(PC),A0…AND�IGNORE�EXT�STATUS‰MOVE.L„A0,SDPVCT2(A5)7‰MOVE.W„#-1,SDPRBCT(A5)…MAKE�COUNT�FIELD�INVALID†3/8/83‰ADD.W…#1,SDSHCRRS(A4)…3/2/835‰MOVE.B„#NCW0RG3,NECCTL_BƒRe-enable�hunt�mode�2/10/83H MOVE.B #NCW3BT8+NCW3AUE+NCW3EHU+NCW3CRC+NCW3ADS+NCW3RXE,NECCTL_B 2/10/8'‰BSR.L…SOMETOUT‚TRIGGER�RECEIVE�TIMEOUT$‰SDLRSRG—Restore�all�registers,�then'‰INTSVRG—Save�only�the�"interrupt"�ones‰BRA.L…INTEXIT 0************************************************0* END OF FILE 'FIX:48.SDLCPRI.RECEIVE.AI' *0************************************************éé‰PAGE5*****************************************************5* BEGINNING OF FILE 'FIX:48.SDLCPRI.SUBRTN.AI' *5*****************************************************   J***************************************************************************È*6*‚SUBROUTINE:‚"SOMETOUT"‚TRIGGER�THE�RECEIVE�TIMEOUT’**È*1*‚ENTER:�A4.L�=�SECONDARY�CONTROL�BLOCK�ADDRESS™**È**È*#*‚REGISTERS�USED:ƒ0�1�2�3�4�5�6�7¥* *’D�U�U�U¯* *’A�U�U…P…S¥**”|‡|…|_�stackž**”|‡|_______�preservedš**”|_______________�usedŸ**È*J************************************************************************** 7SOMETOUT�LEA‡SDLCTTMOUT(PC),A0ƒACTIVATION�ADDRESS�->�A0'‰CLR.L…D0’TIME�INTERVAL�(IN�MSEC)�->�A1‰MOVE.W„SDSTOC(A4),D0‡*‰BEQ.S…SOMETOU1Œ* ‰MULU.W„#TIMCNST,D0‰*‰MOVE.W„D0,A1�*'‰MOVE.W„#$0006,D1‹INTERRUPT�LEVEL�->�D1‰MOVE.L„#DLC2,D2ŒI.D.�#�->�D2‰IFEQ†CHIPTYPE-68000 ‹TR0.RQPA‰ENDC‰IFNE†CHIPTYPE-68000 ‹TR0$.RQPA‰ENDC3SOMETOU1�RTS›(MUST�BE�A�2�BYTE�INSTRUCTION)�2/24/831‰ILLEGAL�DIE�IF�SBRQPA�RETURNS�ANY�ERROR!ˆ2/24/83 ‰PAGE J***************************************************************************È*5*‚SUBROUTINE:‚"SOMETOCLR"‚CLEAR�THE�RECEIVE�TIMEOUT“**È**È**È*#*‚REGISTERS�USED:ƒ0�1�2�3�4�5�6�7¥* *’D�U�U�U¯* *’A�U�U‹S¥**”|�|_�stackž**”|_______________�usedŸ**È*J************************************************************************** 8SOMETOCLR�LEA†SDLCTTMOUT(PC),A0ƒACTIVATION�ADDRESS�->�A0'‰CLR.L…D0’TIME�INTERVAL�(IN�MSEC)�->�D1‰MOVE.W„SDSTOC(A4),D0‡*‰BEQ.S…SOMECLR1Œ*‰MULU.W„#TIMCNST,D0‰*‰MOVE.W„D0,A1�*'‰MOVE.W„#$8006,D1‹INTERRUPT�LEVEL�->�D1‰MOVE.L„#DLC2,D2‹I.D.�#�->�D2‰IFEQ†CHIPTYPE-68000 ‹TR0.RQPA‰ENDC‰IFNE†CHIPTYPE-68000 ‹TR0$.RQPA‰ENDC3SOMECLR1�RTS›(MUST�BE�A�2�BYTE�INSTRUCTION)�2/24/831‰ILLEGAL�DIE�IF�SBRQPA�RETURNS�ANY�ERROR!ˆ2/24/83 ‰PAGE J***************************************************************************È*1*‚SUBROUTINE:‚"SOMEDISPOSE"�DISPOSE�OF�A�BUFFER˜*µN¾QÆAÎ+*È*.*‚ENTER:�A1.L�=�ADDRESS�OF�BUFFER�TO�DISPOSEœ*(*‰A5.L�=�PRIMARY�CONTROL�BLOCK�ADDRESS›**È*;*‚RETURN:�A1.L�=�ADDRESS�OF�LINK�FIELD�OF�DISPOSED�BUFFER�**È*#*‚REGISTERS�USED:ƒ0�1�2�3�4�5�6�7¥**’Dµ* *’A�U�R‡PƒS¥**”|�|‡|ƒ|_�stackž**”|�|‡|_____�preservedš**”|�|_____________�returned›**”|_______________�usedŸ**È*J************************************************************************** #SOMEDISPOSE MOVE.L SDDLNK(A1),-(A7) ‰MOVE.L„A1,A0‰BSR.L…SBPTFRBF‰MOVE.L„(A7)+,A1‰RTS ‰PAGE J***************************************************************************È*?*‚SUBROUTINE:‚"SOMESEND"‚SEND�A�BUFFER�TO�APPLICATION�PROGRAM‰**È*+*‚ENTER:�A1.L�=�ADDRESS�OF�BUFFER�TO�SENDŸ*(*‰A5.L�=�PRIMARY�CONTROL�BLOCK�ADDRESS›**È*7*‚RETURN:�A1.L�=�ADDRESS�OF�LINK�FIELD�OF�SENT�BUFFER“**È*#*‚REGISTERS�USED:ƒ0�1�2�3�4�5�6�7¥**’D�U³* *’A�U�R‡PƒS¥* *–|‡|ƒ|¥**–|‡|ƒ|_�stackž**–|‡|_____�preservedš**–|_____________�returned›**È*J************************************************************************** SOMESEND�MOVE.L„SDDLNK(A1),-(A7) ‰MOVE.L„A1,A0‰MOVE.L„A2,-(A7)‰BSR.L…SBPTUSQ‰MOVE.L„(A7)+,A2‰MOVE.L„(A7)+,A1‰RTS ‰PAGE J***************************************************************************È*F*‚SUBROUTINE:‚"SOMEFREE"�FREE�THE�LINK�OF�RCV�BUFFERS�TO�BUFFER�POOLƒ**È*5*‚ENTER:�A2.L�=�ADDRESS�OF�FIRST�RCV�BUFFER�TO�FREE•*(*‰A5.L�=�PRIMARY�CONTROL�BLOCK�ADDRESS›**È*#*‚REGISTERS�USED:ƒ0�1�2�3�4�5�6�7¥**’D�U³* *’A�UƒP…PƒS¥**”|‰|ƒ|_�stackž**”|‰|_____�preservedš**”|_______________�usedŸ**È*J************************************************************************** SOMEFREE�MOVE.L„A2,A0‰BSR.L…SBPTFRML‰RTS ‰PAGE J***************************************************************************È*8*‚SUBROUTINE:‚"FINDSCB"�Find�a�Secondary�Control�Block‘**È*D*‚ENTER:�D1.B�=�Secondary�Station�Address,�or�$FF�(Global�Address)†*7*�Note:�Where�the�Global�Address�is�used,�the�address…*3*–of�the�1st�Secondary�Control�Block�is�returned.ƒ**È*4*‚RETURN:�Negative�=�0�(Plus)�-�SCB�Found,�see�A1,–*** A1�=�A(SCB�-�Secondary�Control�Block),‚*>*ŠNegative�=�1�(Minus)�-�SCB�Not�Found,�A1�is�indeterminite.„**È*#*‚REGISTERS�USED:ƒ0�1�2�3�4�5�6�7¥**’D�P³* *’A�|�R‹S¥**”|�|‹|_�stackž**”|�|_____________�returned›**”|_______________�preservedš**È*J************************************************************************** ‰XDEF†FINDSCB >FLYPAPER�EQU‡$FFFFFFFF‹Fly-Paper ,�causes�Address�Error�if�used 8FINDSCB‚MOVE.L„SDLCPCB,A1ŠVia�the�Primary�Control�Block,8‰MOVE.L„SDPFSEC(A1),A1†Find�the�address�of�the�first�SCB‰IF.B†D1��#$FF�THEN.S9‹WHILE.BƒSDSSEC(A1)��#0�AND.B�SDSSEC(A1)��D1�DO.S&�ADDA.L„#SDSLNG,A1ŠAdvance�to�next�SCB‹ENDW‰ENDI‰IF.B†SDSSEC(A1)��#0�THEN.S0‹MOVE.L„#FLYPAPER,A1ˆNot�Found,�A1�=�Bug�Catcher ‹ORI.B…#$08,CCRŒAnd�Negative�=�1‰ELSE.S1‹ANDI.B„#$F7,CCRŒFound,�Negative�=�0,�A1�=�A(SCB)‰ENDI‰RTS ‰PAGE J***************************************************************************È*1*‚SUBROUTINE:‚"GETRACE"�Get�a�Trace�Row�Address˜**È**‚ENTER:�No�Arguments³**È*A*‚RETURN:�Carry�=�0�(Carry�Clear)�-�Trace�Row�Address�Returned,‰**¤A2�=�A(Trace�Row),’*%*¤(The�trace�flag�is�on�and�a�traceƒ**¥area�exists),–*3*ŠCarry�=�1�(Carry�Set)�-ƒNo�Trace�Row�Available,�**¤A2�=�#$FFFFFFFF,”*%*¤(Either�the�trace�flag�is�off,�orƒ**¥no�trace�area�exists).�**È*H*‚Note:�The�sixteen�bytes�from�0(A2)�thru�15(A2)�are�available�for�any‚*B*ˆtrace�information�(when�the�"Not�Equal"�return�occurs).‚Common�*B*ˆusage�is�to�store�the�current�PC�value�at�0(A2).L,�identifying‚*B*ˆthe�procedure�which�is�tracing,�followed�by�procedure�specific‚**ˆtrace�information.®**È**‚Example�Usage:¸*+*ŠMOVE.L„A2,-(A7)ŒProtect�A2�if�necessary‰*!*ŠBSR.L…GETRACE�Get�a�trace�row‘*)*ŠIFˆ�THEN.S‰If�a�row�is�available,Š* *ŒPEA‡*(PC)­***ŒMOVE.L„(A7)+,0(A2)‰Store�my�PC�address‹**ŒMOVE.B„x,4(A2)«**ŒMOVE.B„y,5(A2)«*)*ŒMOVE.L„z,6(A2)�Store�some�informationˆ**ŒMOVE.L„a,10(A2)ª*.*ŒMOVE.W„b,14(A2)Œ-�Do�Not�Exceed�15(A2).B�-„**ŠENDIº*0*ŠMOVE.L„(A7)+,A2Œand�recover�A2�(if�"pushed")„**È*J************************************************************************** ‰XREF†TRACEBEG GETRACE‚MOVE.L„TRACEBEG,A2‰BTST.B„#0,TRACFLAG+1 ‰IFˆ�AND.L�A2��#0�THEN.S‹MOVEM.LƒA3-A4,-(A7)0‹MOVE.L„A2,A3�A3�=�A(Trace�control�&�trace�area)‹MOVE.W„SR,-(A7) ‹ORI.W…#$0700,SR‹MASK�INTERRUPTS ‹MOVE.L„0(A3),A2ŒGet�A(Next�Row)%‹LEA‡16(A2),A4‹Figure�A(New�Next�Row)‹IF.L†A4��4(A3)�THEN.S.�LEA‡8(A3),A4ŠReset�to�beginning�when�past�end �MOVE.L„A4,A2�LEA‡16(A2),A4‹ENDI4‹MOVE.L„A4,0(A3)ŒStore�new�A(Next�Row)�for�next�time"‹MOVE.W„(A7)+,SRŒUNMASK�INTERRUPTS)‹LEA‡15(A2),A4‹See�if�a�"Full�Row"�exists‹IF.L†A4��4(A3)�THEN.S,�ANDI.Bƒ#$FE,CCR�and�assert�Row�Exists�if�OK‹ELSE.S3�MOVE.Lƒ#FLYPAPER,A2‰otherwise,�A2�=�#$FFFFFFFF�and�ORI.B„#$01,CCR˜No�Row�Exists‹ENDI‹MOVEM.Lƒ(A7)+,A3-A4‰ELSE.S.‹MOVE.L„#FLYPAPER,A2ˆelse,�A2�=�#$FFFFFFFF�and‹ORI.B…#$01,CCR’No�Row�Exists‰ENDI‰RTS /***********************************************/* END OF FILE 'FIX:48.SDLCPRI.SUBRTN.AI' */***********************************************ééé‰PAGE7*******************************************************7* BEGINNING OF FILE 'FIX:48.SDLCPRI.TRANSMIT.AI' *7******************************************************* H*************************************************************************(*ˆMODULE:‚"TRANSMT"�TRANSMIT�SDLC�FRAMES*-*ˆENTER:‚A5.L�=�PRIMARY�CONTROL�BLOCK�ADDRESS(*�A4.L�=�SECONDARY�CONTROL�BLOCK�ADDRESS%*�A3.L�=�BUFFER�CONTROL�BLOCK�ADDRESS9*ˆENTRY�ASSUMES�A0-A6/D0-D7�HAVE�BEEN�PUSHED�ON�THE�STACK5*–AND�ENTR Y�WAS�THROUGH�EXCEPTION�(TRAP�OR�INTERRUPT)2*ˆEXIT:‚"TRANSUF"‚A�TRANSMIT�UNDERFLOW�CAUSED�EXIT-*�"TRANSEQ"‚END�OF�TRANSMIT�QUEUE�CAUSED�EXIT6*�"TRANSPB"‚SDLC�COMMAND�WITH�POLL�BIT�SET�CAUSED�EXIT!*ˆREGISTERS�USED:ƒ0�1�2�3�4�5�6�7*˜D�U*˜A�U�U�U�U�P�PƒS* |ƒ|ƒ|_�stack* |ƒ|_____�preserved* |_________�used#*ˆEXITS�TO�EXTERNALLY�DEFINED�LABEL&*ŽWITH�A0-A6/D0-D7�PUSHED�ON�THE�STACK&*ŽAND�ASSUMES�FINAL�EXIT�WILL�BE�"RTE"*H************************************************************************E* NOTE: ALL INFORMATION FRAMES HAVE THEIR LENGTHS TRANSMITTED AS WELLA*�AS�THEIR�DATA.‚THE�LENGTH�IS�SENT�AS�THE�FIRST�TWO�BYTES�OF�THE* INFORMATION FIELD AS FOLLOWS;N*
H*�THE�RECEIVING�STATION�MUST,�OF�COURSE,�EXPECT�THIS.‚THE�LENGTH�IS�SENTM* AS THE NEC7201 HAS THE NASTY TENDENCY TO SEND THE FRAME CHECK SEQUENCE WHENN*�A�TRANSMITTER�UNDERRUN�OCCURS.‚IF�WE�DO�THIS�BY�ACCIDENT,�THEN�WE�MUST�BEGINL* SENDING AN ABORT WITHIN THREE CHARACTER TIMES (TWO FCS CHARACTERS PLUS THEL*�ENDING�FLAG)�FOR�THE�RECEIVING�STATION�TO�KNOW�THAT�WE�GOOFED.‚IF�FOR�SOMEH* 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*�RECEIVED�IS�NO�GOOD.‚THE�RECEIVER�HANDLES�THIS�"BAD�LENGTH"�FRAME�JUST�LIKE>* ANY OTHER ERRONEOUS FRAME - HE IGNORES THE FRAME COMPLETELY. :TRANSMT‚MOVE.B„#SDPBTX,SDPBSY(A5)‚Set�us�busy�transmittingÖ+ß9çï8÷>ÿ6JE>‰ADD.W…#1,SDSHCTXM(A4)…3/2/83‰OR.W†#$700,SRŒMask�Interrupts!<‰MOVE.B„#NCW0REX+NCW0RG1,NECCTL_B�Reset�any�pending�ExternalB‰MOVE.B„#NCW1EXI+NCW1STV,NECCTL_B�Enable�only�ExtStatus�(not�Xmtr)‰MOVE.B„#NCW0RG5,NECCTL_B9‰MOVE.B„#NCW5DTR+NCW5TX8+NCW5TXE+NCW5RTS+NCW5TCE,NECCTL_B ‰PAGE C* DTR and RTS are now active, wait for CTS to become active as well ‰MOVE.B„NECCTL_B,D0.‰BTST.L„#5,D0�Is�Clear�to�Send�already�active?‰IFˆ�THEN.S)‹LEA‡TXMSTCTS(PC),A0…No,�Must�wait�for�it7‹MOVE.L„A0,SDPVCT2(A5)†ExtStatus�to�TXMSTCTS�(CTS�Wait)‹LEA‡TXMSTOFF(PC),A0;‹MOVE.L„A0,SDPVCT1(A5)†and�XmtrEmpty�to�TXMSTOFF�(Xmtr�Off)‹MOVEM.LƒA0-A6,SDPRRTA0(A5)‹SDLRSRG‹INTSVRG'‹BRA.L…INTEXIT�Exit�till�CTS�comes�true *#* External Status Interrupt Handler*0TXMSTCTSƒMOVE.B„NECCTL_B,D0‰ExtStatus�Interrupt,‹MOVE.B„#NCW0REX,NECCTL_B+‹MOVE.B„#NCW0EOI,NECCTL_AƒAck�the�interrupt*‹BTST.L„#5,D0�Is�Clear�to�Send�now�active?‹IFˆ�THEN.S!�BRA.L…INTEXIT‹No,�wait�some�more‹ENDI‹INTRSRG‹SDLSVRG)‹MOVE.L„SDLCPCB,A6ŠYes,�Now�we�can�begin!0‹MOVEM.LƒSDPRRTA0(A6),A0-A6‚Restore�BG�Registers‰ENDI * Fall-thru to the next page‰PAGE7* NOTE: WE MAY FALL-THRU TO HERE FROM THE PREVIOUS PAGE ‰MOVE.B„#NCW0RG1,NECCTL_B@‰MOVE.B„#NCW1TXI+NCW1EXI+NCW1STV,NECCTL_B�Enable�Xmtr�Interrupts )* Pre-frame transmission delay algorithm.+* Replaced on August 23, 1983 by Ed Skinner*D*†Where�a�pre-frame�transmission�delay�is�required,�we�send�a�"null"L*�frame�consisting�of�the�specified�number�of�bytes.‚This�frame�is�addressedH* to station $00 (there ain't no such station), and is not sent with anyJ*�FCS.‚These�two�conditions�(station�$00�and�no�FCS)�should�guarantee�that3* no station receives this as a valid transmission.E*†A�pre-frame�transmission�delay�is�needed�for�either�of�two�reasons.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*�by�the�target�station.‚This�may�be�due�to�some�difficulty�in�the�MancesterJ*�receiver�and/or� NEC7201.‚Regardless,�it�remains�that�the�first�characterM* transmitted by the NEC7201 (an SDLC Flag) is not always received correctly.C*†Secondly,�a�pre-frame�transmission�delay�may�be�used�to�allow�theM* receiving software (in the target node) additional time in which to prepare* for receiving a frame.D*†To�effect�the�pre-frame�transmission�delay,�a�frame�containing�$00I*�bytes�in�all�fields�is�transmitted.‚As�the�station�address�$00�is�not�aI* valid station address according to the SDLC protocol, no station should.* begin active reception of this "null" frame.F*†Once�the�specified�number�of�"null"�bytes�have�been�transmitted,�theI* transmitter is allowed to revert to the "flagging" condition (no FCS isG*�sent).‚Since�any�receiver�of�this�frame�will�think�the�last�two�bytesH* 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*�valid�frame�are�comfortably�remote.‚(Besides�that,�the�reason�we'reE* sending this little sucker is because the first frame usually isn'tJ*�received�as�the�leading�flag�is�missed.‚This�makes�it�even�more�unlikelyB* that this leading pad frame might be received as a valid frame.)D*†Note�that�when�a�frame�transmission�completes,�we�do�not�send�thisK* "leading pad" frame when more than one frame is sent in quick succession. 2TXMSTPAD�TST.W…SDSTPD(A4)ŠAny�leading�frame�delay?‰IFˆ�THEN.S1‹MOVE.W„SDSTPD(A4),A1‡Yes,�A1.W�=�Character�Count‹LEA‡TXMSTPNX(PC),A08‹MOVE.L„A0,SDPVCT1(A5)†Xmtr�Intr�-->�TXMSTPNX�(Next�Pad)‹LEA‡TXMSTEI(PC),A07‹MOVE.L„A0,SDPVCT2(A5)†ExtSta�Intr�-->�TXMSTEI�(Ignore)‹MOVEM.LƒA0-A6,SDPRRTA0(A5)‹SDLRSRG‹INTSVRG9‹MOVE.B„#$00,NECDAT_B‡Send�Station�Address�=�$00�(Nobody)#‹BRA.L…INTEXIT�Exit�till�Xmtr�Empty ‰PAGE*%* Transmitter Empty Interrupt Handler*B* Enter here upon Transmitter Empty interrupts where the last byteE*�output�is�now�being�transmitted�by�the�NEC7201.‚Because�the�NEC7201J* gives us the Transmitter Empty interrupt up to one character time beforeF* the character is actually needed, there is a one character "latency"E*�between�what�we�output,�and�what�the�NEC7201�is�sending.‚Therefore,H* we actually output one more than the specified number of leading pads,H* and terminate this operation when we get the interrupt indicating thatG* the last byte output (the "extra" byte) is now being transmitted, andI* therefore, that the specified number of leading pads have, in fact, now* all been transmitted. 5TXMSTPNXƒSUB.W…#1,SDPRRTA1+2(A1)ƒSent�one�delay�byte,‹IFˆ�THEN.S7�MOVE.B„#$00,NECDAT_B‡Send�another�till�count�exhausted*�MOVE.B„#NCW0EOI,NECCTL_AƒEnd�of�Interrupt.�BRA.L…INTEXIT�And�exit�till�another�Xmtr�Intr‹ENDI1‹MOVE.B„#NCW0EOI,NECCTL_AƒEnd�of�Interrupt�(Xmtr)‹INTRSRG‹SDLSVRG‹MOVE.L„SDLCPCB,A60‹MOVEM.LƒSDPRRTA0(A6),A0-A6‚Restore�BG�Registers‰ENDI%* And begin sending the "real" frame. %TXMSTNXT�ADD.W…#1,SDSHCTXS(A4)‡3/2/83* Fall-thru to the next page‰PAGE8* NOTE: WE WILL FALL-THRU TO HERE FROM THE PREVIOUS PAGE 7* "EMBELLISH" SDLC COMMAND WITH Nr/Ns COUNTS & POLL BIT ‰MOVE.B„SDDCMD(A3),D0‰AND.B…#$03,D0‰IF.B†D0��#3�THEN.S#‹MOVE.B„SDDCMD(A3),D0ƒS�or�I�frame,‹AND.B…#$1F,D0/‹OR.B†SDSVRC(A4),D0ƒOR�in�the�current�Vr�count. ‹BTST.L„#0,D0‹IFˆ�THEN.S�AND.B…#$F1,D0‰I�frame,4�OR.B†SDSVSC(A4),D0ƒOR�in�the�current�Vs�count�also,(�OR.B†#$10,D0‰assert�the�poll/final�bit,/�ADD.B…#2,SDSVSC(A4)ƒ(Advance�Vs�for�next�time)  :�AND.B…#$0E,SDSVSC(A4)ƒ(making�sure�it's�only�3�bits�wide)3�ADD.B…#1,SDSUKT(A4)ƒbump�the�number�of�frames�out,�MOVE.B„SDSUKT(A4),D11�TST.L…SDDLNK(A3)†any�more�frames�after�this�one?(�IFˆ�AND.B�D1��SDSMXF(A4)�THEN.S9�MOVE.L„SDDLNK(A3),A0ƒyes,�and�haven't�reached�max�limit,�BTST.B„#0,SDDCMD(A0)�IFˆ�THEN.S2‘AND.B…#$EF,D0‰don't�poll/final�if�next�is�I�frame�ENDI�ENDI‹ELSE.S�MOVE.B„D0,D1ŽIf�we�are�sending*�AND.B…#$1F,D1Œa�Receiver�Not�Ready�frame,!�IF.B†D1��#SDDRRNR+$10�THEN.S/�MOVE.B„#SDPTRN,SDPTXF(A5)�Then�assert�RNR�Sent�ENDI‹ENDI7‹MOVE.B„D0,SDDCMD(A3)‡Store�the�command�byte�to�be�sent‰ENDI* Fall-thru to the next page‰PAGE8* NOTE: WE WILL FALL-THRU TO HERE FROM THE PREVIOUS PAGE 8‰LEA‡TXMST0(PC),A0‡Prepare�interrupt�vectors�for�sending‰MOVE.L„A0,SDPVCT1(A5)<‰LEA‡TXMSTEI(PC),A0†For�1st�Char�Out,�we�ignore�ExtSta�Intrs‰MOVE.L„A0,SDPVCT2(A5) .‰LEA‡SDDDAT(A3),A2‡A2�=�A(data�area�of�buffer) +‰MOVE.B„SDDCMD(A3),D0‡Figure�I�field�length)‰AND.B…#$03,D0�according�to�type�of�frame‰IF.B†D0��#$01�THEN.S<‹MOVE.W„SDDBCT(A3),A1‡I�and�U�frames�specify�I�field�lengths‰ELSE.S2‹MOVE.W„#0,A1�While�S�frames�never�have�an�I�field‰ENDI C‰MOVEM.LƒA0-A6,SDPRRTA0(A5)‚Save�regs�for�interrupt�handlers�to�use* A5 = SDPRRTA5 = A(PCB)* A4 = SDPRRTA4 = A(SCB)* A3 = SDPRRTA3 = A(Buffer)(* A2 = SDPRRTA2 = A(Data within I field)#* A1 = SDPRRTA1 = Length of I fieldG* A0 = SDPRRTA0 = Not used for anything special - just leftover garbage ‰ADD.W…#1,SDSHCTXA(A4)…3/2/83 ‰MOVE.B„SDSSEC(A4),D0‡3/3/832‰IF.B†D0��SDDSEC(A3)�AND.B�D0��#$FF�THEN.S$‹ILLEGAL—Die�if�bad�station�address!‰ENDI* Fall-thru to the next page‰PAGE8* NOTE: WE WILL FALL-THRU TO HERE FROM THE PREVIOUS PAGE )‰MOVE.L„A2,-(A7)ŒProtect�A2�while�tracing‰BSR.L…GETRACE�Get�a�trace�row‰IFˆ�THEN.SE**********************************************************************�Trace�Entry�Format°*E**********************************************************************Ã*'*‚+0Ž+4Ž+8‚+9‚+10�+11�+12�+13�+14�+15‚*E* +---------------+---------------+---+---+---+---+---+---+---+---+ *:*�!†PC‡!�A(Xmt�Buffer)�!�#�!�S�!�U�!�C�!�RC!�D0!�D1!�0�!�*E* +---------------+---------------+---+---+---+---+---+---+---+---+ **Ã**�PC�=�Program�Counter,­*<*�A(Xmt�Buffer)�=�Address�of�the�buffer�to�be�transmitted,Š**�#�=�Station's�Number,­* *�S�=�Station's�Current�State,¦*/*�U�=�Station's�Current�Unacknowledged�Count,—**�C�=�Buffer's�Command�Byte,¨**�RC�=�Buffer's�Retry�Count,¨* *�D0�=�Buffer's�1st�Data�Byte,¦* *�D0�=�Buffer's�2nd�Data�Byte,¦**�0�=�Unused.·**Ã*E*********************************************************************,‹PEA‡*(PC)�If�we�get�a�trace�row,�then�trace#‹MOVE.L„(A7)+,0(A2)‰our�PC�address, ‹MOVE.L„A3,4(A2)ŒA(Xmit�buffer),)‹MOVE.B„SDSSEC(A4),8(A2)„Station�Address,+‹MOVE.B„SDSCST(A4),9(A2)„His�current�state,7‹MOVE.B„SDSUKT(A4),10(A2)ƒCurrent�unacknowledged�count,'‹MOVE.B„SDDCMD(A3),11(A2)ƒCommand�byte,&‹MOVE.B„SDDRTC(A3),12(A2)ƒRetry�Count,%‹MOVE.B„SDDDAT+0(A3),13(A2)�and�first4‹MOVE.B„SDDDAT+1(A3),14(A2)�...�.....�two�data�bytes$‹CLR.B…15(A2)Ž(Zero�the�unused�byte)‰ENDI)‰MOVE.L„(A7)+,A2ŒRecover�A2�after�tracing ?‰MOVE.B„#NCW0RTG,NECCTL_B„Reset�the�transmitter's�FCS�generatorB‰MOVE.B„SDDSEC(A3),NECDAT_B‚Output�the�secondary�station's�address=‰MOVE.B„#NCW0RTU,NECCTL_B„Enable�FCS�transmission�on�Underrun ‰SDLRSRG—Recover�all�registers,,‰INTSVRG—Make�stack�look�like�interrupt�regs4‰BRA.L…INTEXIT�And�go�see�if�an�interrupt�is�pending‰PAGE *%* Transmitter Empty Interrupt Handler*,*ˆVECTORED�STATE�TO�TxMIT�SDLC�COMMAND�FIELD*ATXMST0ƒMOVE.B„NECCTL_B,D0‰Since�we've�been�ignoring�ExtSta�Intrs,2‰BTST.L„#6,D0�We�now�check�for�an�earlier�underrun,‰BNE.L…TXMSTE1�If�true,�go�send�an�Abort�now"‰MOVE.L„SDPRRTA3(A1),A2…Otherwise,2‰MOVE.B„SDDCMD(A2),NECDAT_B�Send�the�command�field  ‰IFEQ†IFRMBCT-YES6‹BTST.B„#0,SDDCMD(A2)‡Where�we�are�sending�an�I�frame,‹BNE.S…TXMST012‹LEA‡TXMSTL1(PC),A2†We�Send�a�"Length"�Field�first‹BRA.S…TXMST02‰ENDCATXMST01‚LEA‡TXMST1(PC),A2‡Set�Up�the�Next�Xmtr�Empty�Intr�HandlerTXMST02‚MOVE.L„A2,SDPVCT1(A1)1‰LEA‡TXMSTE(PC),A2‡And�from�now�on,�we�care�about1‰MOVE.L„A2,SDPVCT2(A1)†External�Status�Interrupts‰MOVE.B„#NCW0EOI,NECCTL_A‰BRA.L…INTEXIT ‰PAGE ‰IFEQ†IFRMBCT-YES*%* Transmitter Empty Interrupt Handler**/*ˆVECTORED�STATE�TO�TxMIT�SDLC�LENGTH�FIELD�#�1*7TXMSTL1‚MOVE.L„SDPRRTA3(A1),A2�OUTPUT�SDLC�LENGTH�FIELD‰MOVE.B„SDDBCT(A2),NECDAT_B‚*+‰LEA‡TXMSTL2(PC),A2†SET�NEXT�VECTORED�STATE‰MOVE.L„A2,SDPVCT1(A1)†*‰MOVE.B„#NCW0EOI,NECCTL_A‰BRA.L…INTEXIT ‰PAGE *%* Transmitter Empty Interrupt Handler**/*ˆVECTORED�STATE�TO�TxMIT�SDLC�LENGTH�FIELD�#�2*7TXMSTL2‚MOVE.L„SDPRRTA3(A1),A2�OUTPUT�SDLC�LENGTH�FIELD"‰MOVE.B„SDDBCT+1(A2),NECDAT_B�*œ10*‰LEA‡TXMST1(PC),A2‡SET�NEXT�VECTORED�STATE‰MOVE.L„A2,SDPVCT1(A1)†*‰MOVE.B„#NCW0EOI,NECCTL_A„*�10‰BRA.L…INTEXIT‡*‚ENDC ‰PAGE *#* External Status Interrupt Handler**4*ˆVECTORED�STATE�TO�PROCESS�STATUS�CHANGE�INTERRUPTS*!TXMSTEƒMOVE.B„NECCTL_B,D0‰GET�RR0‰BTST.L„#6,D0�UNDERRUN?(‰BNE.S…TXMSTE1�YES,�HURRY�AND�SEND�ABORTTXMSTE0‚BTST.L„#5,D0�CTS�DROP?%‰BEQ.S…TXMSTE1�YES,�XMTR�DYING,�ABORT'‰BRA.S…TXMSTE2�NO,�IGNORE�THE�INTERRUPT 3TXMSTE1‚MOVE.B„#NCW0SAB,NECCTL_BƒSEND�AN�SDLC�ABORT‰MOVE.L„SDPRRTA4(A1),A2‰ADD.W…#1,SDSHCTUN(A2)4‰MOVE.L„SDPRRTA3(A1),A2…RESTORE�BUFFER�CONTROL�BLOCK0‰MOVE.B„#SDDETXU,SDDERR(A2)�TxMIT�UNDERRUN�ERROR*‰MOVE.B„#NCW0REX,NECCTL_BƒRESET�INTERRUPTS‰MOVE.B„#NCW0EOI,NECCTL_A‰INTRSRG—SAVE�ALL�USER'S�REGS‰SDLSVRG‰MOVE.L„SDLCPCB,A5ŠRESTORE�REGS‰MOVEM.LƒSDPRRTA3(A5),A3-A5(‰BRA.L…TRANSUF�EXIT�(TRANSMIT�UNDERFLOW) ETXMSTE2‚MOVE.B„#NCW0REX,NECCTL_BƒIgnore�the�External�Status�Interrupt‰MOVE.B„#NCW0EOI,NECCTL_A‰BRA.L…INTEXIT ‰PAGE *%* Transmitter Empty Interrupt Handler**0*ˆVECTORED�STATE�TO�TxMIT�SDLC�INFORMATION�FIELD*>TXMST1ƒSUB.W…#1,SDPRRTA1+2(A1)ƒDecrement�number�of�bytes�to�go‰IFˆ�THEN.S/‹MOVE.L„SDPRRTA2(A1),A2…If�"more"�bytes�remain,5‹MOVE.B„(A2)+,NECDAT_B‡Output�the�next�data�byte,�and7‹MOVE.L„A2,SDPRRTA2(A1)…Save�data�pointer�for�next�time‰ELSE.S9‹LEA‡TXMSTOFF(PC),A2…When�done,�prepare�to�send�FCS�bytes/‹MOVE.L„A2,SDPVCT1(A1)†(Xmtr�Intr�not�expected)0‹LEA‡TXMST2(PC),A2‡and�Expect�an�External�Status&‹MOVE.L„A2,SDPVCT2(A1)†interrupt�next,9‹MOVE.B„#NCW0RTI,NECCTL_BƒAnd�make�the�Xmtr�Empty�go�away‰ENDI6‰MOVE.B„#NCW0EOI,NECCTL_AƒEither�way,�End�of�Interrupt‰BRA.L…INTEXIT ‰PAGE *#* External Status Interrupt Handler* *ˆVECTORED�STATE�TO�TRANSMIT�CRC*0TXMST2ƒMOVE.B„NECCTL_B,D0‰Get�the�Chip's�Status,(‰BTST.L„#6,D0�Is�it�sending�the�FCS�now?$‰BEQ.L…TXMSTE0�No,�go�check�CTS�fall5‰LEA‡TXMSTEI(PC),A2†Yes,�Chip�is�now�sending�the�FCS.3‰MOVE.L„A2,SDPVCT2(A1)†Ignore�Underruns�from�now�on‰MOVE.B„#NCW0REX,NECCTL_B‰MOVE.B„#NCW0EOI,NECCTL_AƒAnd2‰LEA‡TXMST3(PC),A2‡Set�up�for�Xmtr�Empty�Interrupt,‰MOVE.L„A2,SDPVCT1(A1)†To�take�us�to�TXMST3.4‰BRA.L…INTEXIT�(Occurs�when�FCS�sending�is�complete) ‰PAGE *%* Transmitter Empty Interrupt Handler*(*ˆVECTORED�STATE�AFTER�CRC�HAS�BEEN�SENT* TXMST3ƒINTRSRG—SAVE�ALL�REGS�NOW‰SDLSVRG‰MOVE.L„SDLCPCB,A6�RESTORE�REGS‰MOVEM.LƒSDPRRTA0(A6),A0-A6.‰BTST.B„#4,SDDCMD(A3)‡POLL�BIT�SET�IN�COMMAND?‰BNE.S…TXMST3A�Yes,�See�below‰MOVE.B„#NCW0EOI,NECCTL_AƒNo,6‰MOVE.L„SDDLNK(A3),A3‡Is�there�something�else�to�send? ‰MOVE.L„A3,D04‰BNE.L…TXMSTPADŽYup,�go�send�it�(with�leading�delay)'‰ADD.W…#1,SDSHCTNP(A4)…No,�done�sending+‰BRA.L…TRANSEQ�Go�figure�out�what�to�do�now ‰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*�3�MORE�BIT! �TIMES).‚SINCE�WE�CANNOT�MEASURE�INDIVIDUAL�BIT�TIMES,�WE�WAITL* 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*�OF�THEM�WILL�START�TO�RECEIVE�THIS�INFORMATION.‚ADDITIONALLY,�WE�TURN�THEM* 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*�A�RECEIVE�ABORT,�AND�THEN�A�MARKING�(IDLE)�LINE.‚FROM�THESE�INDICATIONSF* WE ARE ASSURED THAT NO STATION WILL RECEIVE THESE TRAILING PADS AS A+*�VALID�FRAME.ƒED�SKINNER,�MARCH�2,�1983... /TXMST3A‚MOVE.B„#$00,NECDAT_B�OUTPUT�A�NULL�CHAR*‰LEA‡TXMST4(PC),A0‡SET�NEXT�VECTORED�STATE‰MOVE.L„A0,SDPVCT1(A5)‰MOVE.B„#NCW0EOI,NECCTL_A&‰SDLRSRG—Restore�full�set�of�registers$‰INTSVRG—And�stack�the�interrupt�set4‰BRA.L…INTEXIT�And�go�see�if�another�interrupt�pends ‰PAGE *%* Transmitter Empty Interrupt Handler***ˆOUTPUT�2ND�NULL�CHAR*-TXMST4ƒMOVE.B„#$00,NECDAT_B�OUTPUT�A�PAD�NULL*‰LEA‡TXMST5(PC),A2‡SET�NEXT�VECTORED�STATE‰MOVE.L„A2,SDPVCT1(A1)‰MOVE.B„#NCW0EOI,NECCTL_A‰BRA.L…INTEXIT ‰PAGE *%* Transmitter Empty Interrupt Handler**E*ˆTxMIT�SHUTDOWN�WITH�POLL�BIT�SET�IN�COMMAND�(NOT�NECESSARILY!�E.S.)*=TXMST5ƒMOVE.B„#NCW0EOI,NECCTL_A�LETS�SAVE�ALL�THE�USER'S�REGSTXMENDƒINTRSRG‰SDLSVRG‰MOVE.L„SDLCPCB,A6�RESTORE�REGS‰MOVEM.LƒSDPRRTA0(A6),A0-A6‰ADD.W…#1,SDSHCTEN(A4)…3/2/83"‰BRA.L…TRANSPBƒEXIT�(POLL�BIT�SET) ‰PAGE *#* External Status Interrupt Handler**8*ˆEXTERNAL�STATUS�INTERRUPT�HANDLER�WHICH�IS�USED�DURING*’1)�LEADING�PAD�TRANSMISSION,+*’2)�TRANSMISSION�OF�THE�ADDRESS�FIELD,�AND*’3)�TRAILING�PAD�TRANSMISSION.@*ˆIN�ALL�THREE�CASES,�"UNDERRUN"�INDICATIONS�ARE�IGNORED�AS�WELL=*ˆAS�ALL�OTHER�CONDITIONS�EXCEPT�FOR�A�FALL�OF�CLEAR�TO�SEND.*0TXMSTEI‚MOVE.B„NECCTL_B,D0‰GET�THE�CHIP'S�STATUS/‰MOVE.B„#NCW0REX,NECCTL_BƒRESET�EXTERNAL�STATUS.‰MOVE.B„#NCW0EOI,NECCTL_AƒAND�END�OF�INTERRUPT‰MOVE.L„SDPRRTA4(A1),A2…3/2/83‰ADD.W…#1,SDSHCEXA(A2)…3/2/83?‰BTST.L„#5,D0…CTS�fall?‚If�yes,�then�must�assume�frame�sent�OK,=‰BEQ.S…TXMEND„We�"assume"�poll�bit�sent,�and�go�into�rcv�now.I* CTS did not drop, so we ignore the External Status Interrupt completely‰BRA.L…INTEXIT ‰PAGE *%* Transmitter Empty Interrupt Handler*F* This state is to be used when transmitter interrupts are supposed toE*�be�off,�or�are�otherwise�not�expected.‚If�one�happens�while�in�this-* state, the system is intentionally crashed.* 2TXMSTOFF�CRASH.Tƒ*+1‘Fail�with�an�Addressing�Error 1*************************************************1* END OF FILE 'FIX:48.SDLCPRI.TRANSMIT.AI' *1*************************************************ééé' SDLCSEC FRMCNT SI33PˆPWRUP 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!@*‡WE�WILL�RE-USE�THE�FIRST�BUFFER�IN�THE�RECEIVE�QUEUE.‚IS�THEREE*‡ALWAYS�ONE�THERE?‚IS�IT�OK�TO�RE-INITIALIZE�ITS�BYTE�COUNT,�STATUS,3*‡ERROR,�RETRY�COUNT,�AND�SECONDARY�STATION�NUMBER?L* This situation (reaching the end of the transmit queue without sending the;*‡final�bit�should�occur�only�as�a�result�of�a�FLUSH�order.* ED SKINNER, MARCH 3, 1983 &‰FAIL†501‡TRANSEQ�IS�VERY,�VERY�WRONG! *TRANSEQ‚EQU‡*‰TRANSMIT�(END�OF�QUEUE)�EXIT/‰MOVE.L„SDPRCV(A5),A2�TRANSMIT�AN�"RR"�RESPONSE ‰CMPA.L„#0,A2‰CRASH.EQ‚*+1‡DIE�IF�NO�BUFFER! ‰MOVE.B„#SDDRRR+$10,SDDCMD(A2)�*‰BRA.L…VCTINIT6‚* &TRANSPB‚EQU‡*‰TRANSMIT�(POLL�BIT)�EXIT@‰MOVE.L„SDPRCV(A5),A3�TxMITTED�A�POLL�BIT,�GET�INTO�RECEIVE�MODE‰BRA.L…SDLCRC02‚* ‰PAGE%TRANSUF‚EQU‡*‰TRANSMIT�UNDERFLOW�EXIT‰MOVE.B„#NCW0RG1,NECCTL_B„*#‰MOVE.B„#NCW1IRD+NCW1STV,NECCTL_B�*9‰MOVE.B„#SDPBFC,SDPBSY(A5)�SET�SDLC�BUSY�IN�FRAME�CONTROL‰ADD.W…#1,SDSHCTOF(A4)…3/2/83'‰BTST.B„#0,SDDCMD(A3)�I�FIELD�TxMITTED?‰IFˆ�THEN.S)‹SUB.B…#2,SDSVSC(A4)�YES,�FIX�UP�Vs�COUNT‹AND.B…#$0E,SDSVSC(A4)6‹SUB.B…#1,SDSUKT(A4)�And�number�of�un-ack'd�frames�out‰ENDI/‰TST.L…SDSTHD(A4)�DID�AN�SDLC�FLUSH�JUST�OCCUR?‰IFˆ�THEN.S/‹MOVE.L„SDPRCV(A5),A2�Yes,�send�an�"RR"�command‹MOVE.B„#SDDRRR+$10,SDDCMD(A2)3‹MOVE.B„#SDPTRQ,SDPTXF(A5)�(sending�from�rcv�queue)‹BRA.L…VCTINIT6‰ENDI1‰TST.B…SDDRTC(A3)�No,�shall�we�try�sending�again?<‰BEQ.S…TRANSPBƒCount�is�zero,�so�we'll�try�again�when�polled@‰SUB.B…#1,SDDRTC(A3)�Count�isn't�zero�yet,�decrement�one�attempt=‰BNE.S…TRANSPBƒand�resend�(when�polled)�if�count�not�zero�yet?* Fall-thru to next page when the retransmission count expires.‰PAGE4* Note: We fall-thru to here from the previous page. +543<<D=L<TK\BdQlMt?|4* The retry count has expired for a transmit buffer.=* Return it to the originator after marking it as unsendable.F* Then, fix up the transmit queue by linking the buffer just after the.*‡unsendable�one�to�the�buffer�just�before�it.?* For example, if the transmit queue currently looks like this;'*†A�-->�B�-->�C,�where�B�is�unsendable.:* 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.3‰MOVE.B„#SDDSSTE,SDDSTS+1(A3)�Mark�it�as�unsendable6‰MOVE.L„A3,A1…A1�=�A(Unsendable�buffer�-�for�SOMESEND)>‰MOVE.L„A3,A2…A2�=�A(Unsendable�buffer�-�for�WHILE�clause�use)6‰BSR.L…SOMESEND‚Pass�the�Unsendable�buffer�to�the�user7‰MOVE.L„A1,A3…A3�=�A(Next�buffer�in�the�transmit�queue)?‰LEA‡SDSTHD-SDDLNK(A4),A1�Find�buffer�before�the�unsendable�one?‰WHILE.LƒSDDLNK(A1)��A2�DO" .S�Pointing�to�unsendable�buffer?/‹MOVE.L„SDDLNK(A1),A1‡No,�on�to�the�next�buffer‰ENDW@‰MOVE.L„A3,SDDLNK(A1)�yes,�store�"next"�into�"before�unsendable"<‰BRA.S…TRANSPBƒAll�done�with�clean-up,�go�see�what�to�do�now ‰PAGE'RECEITO‚EQU‡*‰RECEIVE�TIME�OUT�OCCURRED‰MOVE.B„#SDDSSRT,SDDSTS+1(A3)‰ADD.W…#1,SDSHCRTP(A4)…3/2/83 ‰BRA.S…HSKP0 /RECEIEE‚EQU‡*‰RECEIVE�EXCESSIVE�ERRORS�OCCURRED‰MOVE.B„#SDDSSRE,SDDSTS+1(A3)‰ADD.W…#1,SDSHCREX(A4)…3/2/83 *ˆBRA.S…HSKP0 &RECEILB‚EQU‡*‰RECEIVE,�NO�BUFFERS�LEFT +RECEIFB‚EQU‡*‰RECEIVED�A�FINAL�BIT�RESPONSE ***ˆEND�OF�A�RCV�SEQUENCE,�SHUT�RECEIVER�OFF* HSKP0„MOVE.B„#NCW0RG1,NECCTL_B„*#‰MOVE.B„#NCW1IRD+NCW1STV,NECCTL_B�*‰MOVE.B„#NCW0RG3,NECCTL_B„*#‰MOVE.B„#NCW3BT8+NCW3AUE,NECCTL_B„*‰ADD.W…#1,SDSHCROF(A4)…3/2/83&‰BSR.L…SOMETOCLR�CLEAR�RECEIVE�TIMEOUT&* A5 = PRIMARY CONTROL BLOCK'S ADDRESS(* A4 = SECONDARY CONTROL BLOCK'S ADDRESS‰MOVE.L„SDPRCV(A5),A2#* A2 = CURRENT RCV BUFFER'S ADDRESS9‰MOVE.B„#SDPBFC,SDPBSY(A5)�SET�SDLC�BUSY�IN�FRAME�CONTROL,‰MOVE.W„#$2500,SR�LOWER�68000�INTERRUPT�MASK,‰BSR.L…SBXIDQ„CHECK�FOR�"XID"�ON�TxMIT�QUEUE* Fall-thru to the next page‰PAGE7* NOTE: WE MAY FALL-THRU TO HERE FROM THE PREVIOUS PAGE **ˆSDLC�FRAME�CONTROL�PROCEDURES*9HSKP1„MOVE.L„A2,SDPRCV(A5)�SAVE�NEW�HEAD�OF�RECEIVE�QUEUE!‰IF.B†SDDSTS+1(A2)��#0�THEN.S‹CLR.L…D0ˆNo�RCV�errors,‹MOVE.B„SDSCST(A4),D0 ‹SUB.B…#1,D0 ‹ASL.L…#2,D08‹JMP.S…RCVVCT(PC,D0.W)�To�current�state�if�no�RCV�errors,RCVVCT…BRA.L…VCTINITƒTo�INITIALIZATION�STATE+‹BRA.L…VCTINIBƒTo�INITIALIZATION�BUSY�STATE$‹BRA.L…VCTDISCƒTo�DISCONNECTED�STATE&‹BRA.L…VCTNRM„To�NORMAL�RESPONSE�STATE‹BRA.L…VCTBSY„To�BUSY�STATE$‹BRA.L…VCTFRMRƒTo�FRAME�REJECT�STATE‰ENDI‰MOVE.L„A2,A1…Rcv�Errors,5‰BSR.L…SOMESEND‚Tell�the�Application�Program�about�it ‰MOVE.L„A1,A20‰BSR.L…SOMEFREE‚*�FREE�ANY�OTHER�RECEIVE�BUFFERS+‰BRA.L…SDLCRC01‚*�GO�BACK�INTO�RECEIVE�MODE‰PAGE *$*ˆINITIALIZATION�STATE�FRAME�CONTROL*2VCTINIT‚MOVE.B„#SDSCIBSY,SDSCST(A4)�"SIM"�COMMAND?‰CMP.B…#SDDCSIM,SDDRSP(A2)‰BEQ.S…VCTINIT3,‰MOVE.B„#SDSCIM,SDSCST(A4)�NO,�POLL�BIT�SET?‰BTST.B„#$4,SDDRSP(A2)‰IFˆ�THEN.S5‹MOVE.B„#SDSCIM,SDSCST(A4)�Yes,�Send�a�"RIM"�Response‹MOVE.B„#SDDRRIM,SDDCMD(A2))VCTINIT6ƒCLR.W…SDDBCT(A2)�INIT�BYTE�COUNT%VCTINIT7ƒCLR.W…SDDSTS(A2)�INIT�STATUS"‹CLR.B…SDDRTC(A2)�INIT�RETRY�COUNT!‹CLR.B…SDDERR(A2)�INIT�SDLC�ERROR,‹MOVE.B„SDSSEC(A4),SDDSEC(A2)�INIT�STATION�#4‹MOVE.L„A2,SDPRCV(A5)�SAVE�NEW�HEAD�OF�RECEIVE�QUEUE ‹MOVE.L„A2,A3$‹BRA.L…TRANSMTƒTRANSMIT�THE�RESPONSE‰ENDI�FREE�QUEUE‰BSR.L…SOMEDISPOSE ‰MOVE.L„A1,A26‰MOVE.L„A1,D0…Any�more�receive�buffers�after�that�one?;‰BNE.L…HSKP1…Yes,�loop�back�up�and�see�what�the�next�one�is;‰BRA.L…SDLCRC01‚No,�just�go�turn�the�receiver�back�on�again :VCTINIT2�MOVE.B„#SDSCRDM,SDSCST(A4)�SET�DISCONNECTED�STATEGVCTINIT3�TST.W…SDDBCT(A2)�DATA�FIELD�ON�"SIM"�"SNRM"�OR�"DISC"�COMMAND?=‰BNE.L…FRMRPI„Yes,�he�shouldn't�have�done�that!�(Go�FRMR�him)<‰BSR.L…SBGTFRIR‚NO,�Get�a�buffer�for�sending�a�"UA"�response‰IFˆ�THEN.S2‹BSR.L…SOMEFREE‚NO�BUFFERS,�So�don't�send�anything@‹BRA.L…SDLCRC01‚(Make�like�we�didn't�receive�his�command�at�all)‰ENDI6‰CLR.B…SDSVRC(A4)�No�data�field,�it's�a�valid�command,-‰CLR.B…SDSVSC(A4)�reset�our�Vr�and�Vs�counts,1‰MOVE.L„A2,A1…and�tell�the�user�what�has�happened‰BSR.L…SOMESEND'‰MOVE.L„A3,A2…then�send�a�"UA"�response‰MOVE.B„#SDDRUA,SDDCMD(A2)�*@‰MOVE.B„#SDPTRN,SDPTXF(A5)�*�SET�TxMIT�FLAG�AS�IF�"RNR"�TxMITTEDJ* NOTE: THIS WILL CAUSE RECEIVED I-FRAMES TO BE IGNORED UNTIL AN "RNR" CAN?* BE TRANSMITTED BECAUSE WE ARE IN THE BUSY OR INIT BUSY STATE.M* WE HAVE PASSED A RECEIVED SNRM ON TO THE "USER" IN OUR MACHINE, AND HE MUST(* ACKNOWLEDGE IT BEFORE WE CAN CONTINUE.‰BRA.S…VCTINIT6‚* ‰PAGE *)*ˆINITIALIZATION�BUSY�STATE�FRAME�CONTROL*+VCTINIB‚BTST.B„#$4,SDDRSP(A2)�POLL�BIT�SET?2‰BEQ.S…VCTINIT1‚*�NO,�FREE�BUFFER,�GO�INTO" �RECEIVEF‰MOVE.B‚#SDDRRNR+$10,SDDCMD(A2)�YES,�BUILD�&�TRANSMIT�A�"RNR"�RESPONSE‰BRA.S…VCTINIT6‚* ‰PAGE **ˆBUSY�STATE�FRAME�CONTROL**VCTBSYƒBTST.B„#$4,SDDRSP(A2)�POLL�BIT�SET?2‰BEQ.L…VCTINIT1‚*�NO,�FREE�BUFFER,�GO�INTO�RECEIVEF‰MOVE.B‚#SDDRRNR+$10,SDDCMD(A2)�YES,�BUILD�&�TRANSMIT�A�"RNR"�RESPONSE‰BRA.L…VCTINIT6ƒ* ‰PAGE *"*ˆFRAME�REJECT�STATE�FRAME�CONTROL*+VCTFRMR‚BTST.B„#$4,SDDRSP(A2)�POLL�BIT�SET?2‰BEQ.L…VCTINIT1‚*�NO,�FREE�BUFFER,�GO�INTO�RECEIVEC‰MOVE.B„#SDSCIBSY,SDSCST(A4)�YES,�"SIM",�"DISC",�OR�"SNRM"�COMMAND?‰CMP.B…#SDDCSIM,SDDRSP(A2)�*‰BEQ.L…VCTINIT3‚*‰CMP.B…#SDDCDISC,SDDRSP(A2)�*‰BEQ.L…VCTINIT2‚*‰MOVE.B„#SDSCBSY,SDSCST(A4)�*‰CMP.B…#SDDCSNRM,SDDRSP(A2)�*‰BEQ.L…VCTINIT3‚*4‰BRA.S…FRMRSP„NO,�BUILD�&�TRANSMIT�A�"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*–TRANSMITTED�AN�XID,�OR2*–IN�NRM�AND�RECEIVE�AN�"UNKNOWN"�SDLC�COMMAND,�OR2*–IN�FRAME�REJECT�STATE�AND�RECEIVE�ANY�OTHER�THAN*–A�SIM,�DISC,�OR�SNRM�COMMAND.J* 2) PROHIBITED I-FIELD - RECEIVED AN I-FIELD ON A COMMAND WHICH IS A SIM,*–SNRM,�DISC,�RR,�RNR,�OR�REJ.G* 3) BUFFER OVERRUN - RECEIVE AN OTHERWISE "GOOD" FRAME WHICH IS LONGER*–THAN�A�BUFFER.H* 4) INVALID Nr COUNT - RECEIVED AN Nr VALUE (IN EITHER A SUPERVISORY OR2*–AN�INFORMATION�FRAME)�WHICH�ACKNOWLEDGES�A�FRAME*–WE�HAVE�NOT�TRANSMITTED. **ˆCREATE�"FRaMe�Reject"�DATA*4FRMRICƒMOVE.B„#$01,SDPFRB+2(A5)‚INVALID�COMMAND�FRMR)‰CMP.B…#SDSCRDM,SDSCST(A4)�IN�DISC�STATE?,‰BEQ.L…VCTDISC1‚*�IF�YES,�SEND�"DM"�RESPONSE‰BRA.S…FRMRGN„NO,�SEND�"FRMR" 7FRMRPIƒMOVE.B„#$03,SDPFRB+2(A5)ƒPROHIBITED�I�FIELD�FRMR‰BRA.S…FRMRGN„* 3FRMRBOƒMOVE.B„#$04,SDPFRB+2(A5)ƒBUFFER�OVERRUN�FRMR‰BRA.S…FRMRGN„* 5FRMRNRƒMOVE.B„#$08,SDPFRB+2(A5)ƒINVALID�NR�COUNT�FRMR*BFRMRGNƒMOVE.B„SDDRSP(A2),SDPFRB(A5)�OFFENDING�COMMAND�->�FRMR�DATA=‰MOVE.B„SDSVSC(A4),D0�CURRENT�"NR"�&�"NS"�COUNTS�->�FRMR�DATA‰OR.B†SDSVRC(A4),D0‡*‰AND.B…#$EE,D0ƒ*‰MOVE.B„D0,SDPFRB+1(A5)(‰BSR.L…SOMEFREE‚FREE�ALL�RECEIVE�BUFFERS"‰BSR.L…SBGTFRIR‚FETCH�A�NEW�BUFFER6‰BGT.L…SDLCRC01‚OUT�IF�THERE�ARE�ABSOLUTELY�NO�BUFFERS2* GOT ONE, DON'T CARE IF IT'S THE LAST ONE OR NOT.‰MOVE.L„A3,A2…*DFRMRSPƒMOVE.B„#SDSCRFR,SDSCST(A4)�BUILD�&�TRANSMIT�A�"FRMR"�RESPONSE‰MOVE.B„#SDDRFRMR,SDDCMD(A2)�*'‰MOVE.W„#3,SDDBCT(A2)�*�INIT�BYTE�COUNT)‰MOVE.L„SDPFRB(A5),SDDDAT(A2)�*�INIT�DATA‰BRA.L…VCTINIT7‚* ‰PAGE * *ˆDISCONNECT�STATE�FRAME�CONTROL*+VCTDISC‚BTST.B„#$4,SDDRSP(A2)�POLL�BIT�SET?2‰BEQ.L…VCTINIT1‚*�NO,�FREE�BUFFER,�GO�INTO�RECEIVEC‰MOVE.B„#SDSCIBSY,SDSCST(A4)�YES,�"SIM",�"DISC",�OR�"SNRM"�COMMAND?‰CMP.B…#SDDCSIM,SDDRSP(A2)�*‰BEQ.L…VCTINIT3‚*‰CMP.B…#SDDCDISC,SDDRSP(A2)�*‰BEQ.L…VCTINIT2‚*‰MOVE.B„#SDSCBSY,SDSCST(A4)�*‰CMP.B…#SDDCSNRM,SDDRSP(A2)�*‰BEQ.L…VCTINIT3‚*.‰MOVE.B„#SDSCRDM,SDSCST(A4)�NO,�"XID"�COMMAND?‰CMP.B…#SDDCXID,SDDRSP(A2)�*‰BEQ.S…XIDRSP„*/‰CMP.B…#SDDCTEST,SDDRSP(A2)�NO,�"TEST"�COMMAND?‰BEQ.S…TESTRSP‚*GVCTDISC1�MOVE.B„#SDDRDM,SDDCMD(A2)‚NO,�BUILD�&�TRANSMIT�A�"DM"�RESPONSE‰BRA.L…VCTINIT6‚* ‰PAGE **ˆTRANSMIT�A�"TEST"�RESPONSE*%TESTRSP‚MOVE.B„#SDDCTEST,SDDCMD(A2)�*‰BRA.L…VCTINIT7‚* ‰PAGE J***************************************************************************<*‚SUBROUTINE:‚"SBXIDQ"�CHECK�FOR�AN�"XID"�ON�THE�TxMIT�QUEUE*2*‚ENTER:ŠA4.L�=�ADDRESS�OF�SECONDARY�CONTROL�BLOCK)*’A5.L�=�ADDRESS�OF�PRIMARY�CONTROL�BLOCK*!*‚REGISTERS�USED:ƒ0�1�2�3�4�5�6�7*’D�U*’A�U�UƒU�P�PƒS *¢|_�stack*K*************************************************************************** 9SBXIDQƒMOVE.L„SDSTHD(A4),A3�"XID"�REPONSE�ON�TxMIT�QUEUE?6‰IF.L†A3��#0�AND.B�SDDCMD(A3)��#SDDCXID�THEN.S8‹MOVE.L„SDDLNK(A3),SDSTHD(A4)�TAKE�"XID"�OFF�TxMIT�QUEUE‹IF.L†SDPXID(A5)��#0�THEN.S5�MOVE.L„SDPXID(A5),A1…DISPOSE�OF�THE�OLD�"XID"�BUFFER�BSR.L…SOMED# ISPOSE‹ENDI/‹MOVE.L„A3,SDPXID(A5)�NEW�"XID"�RESPONSE�BUFFER‰ENDI‰RTS ‰PAGE *&*ˆTRANSMIT�AN�"XID"�OR�"FRMR"�RESPONSE*2XIDRSPƒBSR.S…SBXIDQ„CHECK�FOR�"XID"�ON�TxMIT�QUEUE,‰MOVE.L„SDPXID(A5),D0�"XID"�RESPONSE�BUFFER?&‰BEQ.L…FRMRIC„*�IF�NO,�INVALID�COMMAND,‰BSR.L…SBGTFRIR‚FETCH�A�RCV�BUFFER�FOR�LATER‰IFˆ�THEN.S1‹BSR.L…SOMEFREE‚NO�BUFFERS,�JUST�STAY�IN�RCV�MODE‹BRA.L…SDLCRC01‰ENDI‰MOVE.L„A3,SDPRCV(A5)�*0‰MOVE.L„A2,A1…SEND�THE�"XID"�COMMAND�TO�THE�USER‰BSR.L…SOMESEND‚*,‰MOVE.L„SDPXID(A5),A3�PREPARE�"XID"�RESPONSE‰CLR.W…SDDSTS(A3)�*�STATUS!‰CLR.B…SDDRTC(A3)�*�RETRY�COUNTER‰CLR.B…SDDERR(A3)�*�ERROR)‰MOVE.B„SDSSEC(A4),SDDSEC(A3)�*�STATION�#%‰MOVE.B„#SDDCXID,SDDCMD(A3)�*�COMMAND1‰BRA.L…TRANSMTƒTRANSMIT�THE�"XID"�&�GO�TO�RECEIVE ‰PAGE *%*ˆNORMAL�RESPONSE‚STATE�FRAME�CONTROL*/VCTNRMƒMOVE.L„SDSTHD(A4),A3‡HEAD�OF�TxMIT�QUEUE*VCTNRM02�CLR.L…D0ˆIS�COMMAND�AN�"I"�FIELD?‰MOVE.B„SDDRSP(A2),D0 ‰BTST.L„#0,D0#‰BEQ.L…DSPNR1„YES,�OUT�IF�"I"�FRAME0‰BTST.L„#1,D0…NO,�"RR",�"RNR",�OR�"REJ"�COMMAND?0‰BEQ.S…DSPNR…YES,�OUT�IF�RR,�RNR,�OR�REJ�COMMAND‰BTST.L„#4,D0…NO,�POLL�BIT�SET?‰BEQ.S…VCTNRM06C‰MOVE.B„#SDSCIBSY,SDSCST(A4)�YES,�"SIM",�"DISC",�OR�"SNRM"�COMMAND?‰CMP.B…#SDDCSIM,D0‰BEQ.L…VCTINIT3‰CMP.B…#SDDCDISC,D0‰IF.B†D0��#SDDCDISC�THEN.S<‹CMP.B…#SDPTXQ,SDPTXF(A5)�"DISC",�TxMITTED�FROM�TxMIT�QUEUE?‹BNE.L…VCTINIT26‹CMP.B…#SDDRRD,SDDCMD(A3)�YES,�WAS�"RD"�LAST�RESPONSE?‹BNE.L…VCTINIT2K* NOTE: THE "RD" RESPONSE WILL BE LEFT ON THE TRANSMIT QUEUE UNTIL A "DISC"F*�COMMAND�IS�RECEIVED.‚THE�"RD"�CAME�FROM�A�"USER"�WITHIN�OUR�MACHINE.&‹MOVE.L„A3,A1…YES,�DISPOSE�OF�THE�"RD"‹BSR.L…SOMEDISPOSE-‹MOVE.L„A1,SDSTHD(A4)�NEW�HEAD�OF�TxMIT�QUEUE‹BRA.L…VCTINIT2‰ENDI‰MOVE.B„#SDSCBSY,SDSCST(A4)�*‰CMP.B…#SDDCSNRM,D0�*‰BEQ.L…VCTINIT3‚*.‰MOVE.B„#SDSCNRM,SDSCST(A4)�NO,�"XID"�COMMAND?‰CMP.B…#SDDCXID,D0�*‰BEQ.L…XIDRSP„*'‰CMP.B…#SDDCTEST,D0�NO,�"TEST"�COMMAND?‰BEQ.L…TESTRSP‚*!‰AND.B…#$EF,D0‚NO,�CLEAR�POLL�BIT)VCTNRM06�CMP.B…#SDDCUI,D0�IS�COMMAND�"UI"‰BEQ.L…RSPUI…*%‰BRA.L…FRMRIC„*�I�GIVE�UP�IF�IT�ISN'T ‰PAGE ADSPNR„TST.W…SDDBCT(A2)�DATA�FIELD�ON�"RR"�"RNR"�OR�"REJ"�COMMAND?$‰BNE.L…FRMRPI„*�IF�YES,�FRAME�REJECT**ˆTEST�FOR�A�VALID�Nr�COUNT*DSPNR1ƒCLR.L…D0 ‰CLR.L…D1 ‰CLR.L…D2$‰MOVE.B„SDDRSP(A2),D0�FETCH�Nr�COUNT‰LSR.B…#5,D0…*$‰MOVE.B„SDSVSC(A4),D1�FETCH�Vs�COUNT‰LSR.B…#1,D1…*-‰MOVE.B„SDSUKT(A4),D2�FETCH�#�TxMITTED�FRAMES ‰BEQ.S…DSPNR2„*�FRAMES�TxMITTED?>‰CMP.L…#0,A3…ALL�XMIT�FRAMES�GONE�(RESULT�OF�A�FLUSH)?�3/21/831‰BEQ.S…DSPNR2„YES,�SAME�AS�IF�NO�I_FRAMES�3/21/833‰BTST.B„#0,SDDCMD(A3)�NO,�"I"�FRAME�ON�TxMIT�QUEUE?‰BNE.S…DSPNR2„*�*1‰MOVE.B„SDDCMD(A3),D1�*�YES,�GET�Ns�COUNT�FROM�IT‰LSR.B…#1,D1…*�*‰ADD.B…D2,D1…*�*‰AND.B…#7,D1…*�*DSPNR2ƒWHILE.BƒD0��D1�DO.S‹SUB.B…#1,D1…NEXT�Vs�COUNT ‹AND.B…#7,D1#‹SUB.B…#1,D2…ALL�Vs�COUNTS�CHECKED?#‹BMI.L…FRMRNR„YES,�INVALID�Nr�COUNT‰ENDW* Fall-thru to the next page‰PAGE3* NOTE: WE FALL-THRU TO HERE FROM THE PREVIOUS PAGE *"*ˆDISPOSE�OF�TXMIT�BUFFERS�TO�NR-1*%‰CLR.L…D1ˆFETCH�Nr�COUNT�FROM�COMMAND‰MOVE.B„SDDRSP(A2),D1�*‰LSR.B„#4,D1…*‰AND.B…#$0E,D1ƒ*‰MOVE.B„D1,SDSVSC(A4)�*�Vs�=�Nr ‰MOVE.L„A3,D0…TxMIT�QUEUE�EMPTY?‰BEQ.L…DSPRC1„YES,�OUT>DSPNR4ƒCMP.B…#SDPTXQ,SDPTXF(A5)�NO,�TxMITTED�FROM�TxMIT�QUEUE?‰BNE.L…DSPRC1„*&‰CLR.L…D0ˆYES,�TXMITTED�A�UI�RESPONSE?‰MOVE.B„SDDCMD(A3),D0�*‰AND.B…#$EF,D0ƒ*‰IF.B†D0��#SDDCUI�THEN.S‹BTST.L„#0,D0…I�FIELD? ‹BNE.L…DCRTX8‹TST.B…SDSUKT(A4)�YES,�UNACKNOWLEDGED�I�FRAMES�TxMITTED? ‹BEQ.L…DSPRC1‹AND.B…#$0E,D0ƒYES,�Nr�=�Ns?‹IF.B†D1��D0�THEN.S4�MOVE.B„SDDRSP(A2),D0�YES,�is�response�RR,�RNR,�REJ?�AND.B…#$03,D0ƒ*�CMP.B…#1,D0…*�BNE.S…DSPUI…*-�BTST.B„#4,SDDRSP(A2)�and�poll/final�bit�set?�BNE.S…DSPUI…*+�MOVE.L„A2,A1…NO,�DISPOSE�OF�RECEIVE�BUFFER�BSR.L…SOMEDISPOSE�*%�MOVE.L„A1,A2…END�OF�RECEIVE�BUFFERS?�MOVE.L„A1,D0…*�BEQ.S…DSPUI…**�BRA.L…VCTNRM02‚NO,�TEST�BUFFER'S�RESPONSE‹ENDI‰E# NDI)‰MOVE.L„A3,A1…NO,�DISPOSE�OF�TxMIT�BUFFER!‰BTST.B„#4,SDDCMD(A3)�POLL/FINAL?‰IFˆ�THEN.S‹BSR.L…SOMEDISPOSE�NO ‹MOVE.L„A1,A3‹SUB.B…#1,SDSUKT(A4) ‹BRA.S…DSPNR4‰ELSE.S7‹BSR.L…SOMEDISPOSE�YES,�ALSO�DISPOSE�OF�RECEIVE�BUFFERS ‹MOVE.L„A1,A34‹CLR.B…SDSUKT(A4)�CLEAR�UNACKNOWLEDGED�I�FRAME�COUNT ‹BRA.L…DSPRC1‰ENDI ‰PAGE *,*ˆA�UI�(UNNUMBERED�I�FIELD)�COMMAND�OCCURRED*=RSPUI„MOVE.L„A2,A1…SEND�RECEIVE�BUFFER�TO�APPLICATION�PROGRAM‰BSR.L…SOMESEND%‰MOVE.L„A1,A2…END�OF�RECEIVE�BUFFERS? ‰MOVE.L„A1,D0 ‰BEQ.S…DSPUI*‰BRA.L…VCTNRM02‚NO,�TEST�BUFFER'S�RESPONSE ‰PAGE **ˆDISPOSE�OF�UI�TXMIT�BUFFERS*9DSPUI„CMP.B…#SDPTXQ,SDPTXF(A5)�TxMITTED�FROM�TxMIT�QUEUE?‰BNE.L…DSPRC1„*&‰MOVE.L„A3,D0…YES,�END�OF�TxMIT�QUEUE?‰BEQ.L…DSPRC1„*%‰CLR.L…D1ˆNO,�TXMITTED�A�UI�RESPONSE?‰MOVE.B„SDDCMD(A3),D1�*‰AND.B…#$EF,D1ƒ*‰CMP.B…#SDDCUI,D1�*‰BNE.S…DCRTX…**‰MOVE.L„A3,A1…YES,�DISPOSE�OF�TXMIT�BUFFER‰BTST.B„#4,SDDCMD(A3)�*‰IFˆ�THEN.S>‹BSR.L…SOMEDISPOSE�POLL/FINAL�SET,�ALSO�DISPOSE�OF�RCV�BUFFERS ‹MOVE.L„A1,A3 ‹BRA.S…DSPRC1‰ENDI#‰BSR.L…SOMEDISPOSE�POLL/FINAL�CLEAR ‰MOVE.L„A1,A3 ‰BRA.S…DSPUI ‰PAGE **ˆDECREMENT�TxMIT�RETRY�COUNTS*DCRTX„MOVE.L„A3,A1…*‰MOVE.B„SDSUKT(A4),D1+DCRTX2ƒMOVE.L„A3,D0…ALL�TxMIT�BUFFERS�GONE?‰BEQ.S…DCRTX5„*"‰BTST.B„#0,SDDCMD(A3)�NO,�I�FIELD?‰IFˆ�THEN.S*‹TST.B…D1ˆYES,�UNACKNOWLEDGED�COUNT�CLEAR?‹BEQ.S…DCRTX5„YES,�OUT ‹SUB.B…#1,D1‰ENDI7‰TST.B…SDDRTC(A3)�NO,�DECREMENT�RETRY�COUNT�IF�NON-ZERO ‰BEQ.S…DCRTX4*‰SUB.B…#1,SDDRTC(A3)�DECREMENT�RETRY�COUNT‰BNE.S…DCRTX4„EXPIRED??‰MOVE.L„A3,A1…YES,�SEND�THIS�TxMIT�BUFFER�TO�APPL�PGM�AS�UNSENT>‰MOVE.B„#SDDSSTE,SDDSTS+1(A3)�SET�RETRY�COUNTER�EXPIRED�STATUS$‰BTST.B„#$4,SDDCMD(A3)�POLL�BIT�SET?‰IFˆ�THEN.S&‹BSR.L…SOMESEND‚YES,�LAST�TXMIT�BUFFER4‹CLR.B…SDSUKT(A4)�CLEAR�UNACKNOWLEDGED�I�FRAME�COUNT ‹BRA.S…DCRTX5‰ENDI"‰BTST.B„#0,SDDCMD(A3)�NO,�I�FIELD?‰IFˆ�THEN.S#‹SUB.B…#1,SDSUKT(A4)�YES,�FIX�COUNT‰ENDI‰BSR.L…SOMESEND%‰MOVE.L„A1,A3…FETCH�NEXT�TxMIT�BUFFER ‰BRA.S…DCRTX2 .DCRTX4ƒCLR.B…SDDERR(A3)�CLEAR�SDLC�ERROR�FIELD$‰BTST.B„#$4,SDDCMD(A3)�POLL�BIT�SET?‰IFˆ�THEN.S1‹MOVE.L„SDDLNK(A3),A3�No,�FETCH�NEXT�TxMIT�BUFFER ‹BRA.S…DCRTX2‰ENDI!* Fall-Thru if poll/final bit set ‰PAGE +DCRTX5ƒMOVE.L„A1,A3ƒNEW�HEAD�OF�TxMIT�QUEUE**ˆDISPOSE�OF�RCV�BUFFERS*3DSPRC1ƒMOVE.L„A3,SDSTHD(A4)�NEW�HEAD�OF�TxMIT�QUEUE.‰MOVE.L„A2,D0…ALL�RECEIVE�BUFFERS�DISPOSED�OF? ‰BEQ.S…SELTX4‰CMP.B…#SDDERBO,SDDERR(A2)�NO,�BUFFER�OVERRUN�ERROR? ‰BEQ.L…FRMRBO0‰TST.B…SDDERR(A2)�NO,�SOME�OTHER�SDLC�RCV�ERROR? ‰BNE.S…SELTX2/‰MOVE.B„SDDRSP(A2),D0�IS�COMMAND‚UI�OR�I�FIELD?‰AND.B…#$EF,D0‰IF.B†D0��#SDDCUI�THEN.S ‹BTST.L„#0,D0 ‹BNE.S…SELTX2„OUT�IF�NOT�I-FRAME‰ENDI;‰MOVE.L„A2,A1…UI�OR�I-FRAME,�SEND�IT�TO�APPLICATION�PROGRAM‰BTST.B„#4,SDDRSP(A2)‰IFˆ�THEN.S!‹BSR.L…SOMESEND‚FINAL�BIT�NOT�SET ‹MOVE.L„A1,A2 ‹BRA.S…DSPRC1‰ELSE.S5‹BSR.L…SOMESEND‚*�YES,�ALSO�FREE�ALL�RCV�BUFFERS�LEFT$‹MOVE.L„A1,A2…FALL-THRU�TO�NEXT�PAGE‰ENDI ‰PAGE :* WARNING: WE MAY FALL-THRU TO HERE FROM THE PREVIOUS PAGE*%*ˆFETCH�A�BUFFER�&�TRANSMIT�SOMETHING*)SELTX„BSR.L…SOMEFREE‚FREE�ANY�OLD�BUFFERS"‰BSR.L…SBGTFRIR‚FETCH�A�NEW�BUFFER3‰BGT.L…SDLCRC01‚OUT�IF�ABSOLUTELY�NO�BUFFERS�AT�ALL‰IFˆ�THEN.S* GOT THE VERY LAST BUFFER/‹MOVE.L„A3,SDPRCV(A5)�NEW�HEAD�OF�RECEIVE�QUEUE ‹MOVE.L„A3,A21‹MOVE.B„#SDDRRNR+$10,SDDCMD(A2)�TRANSMIT�AN�"RNR"3‹MOVE.B„#SDPTRQ,SDPTXF(A5)�TxMITTING�FROM�RCV�QUEUE‹BRA.L…VCTINIT6‰ENDI3‰MOVE.L„A3,SDPRCV(A5)�NO,�NEW�HEAD�OF�RECEIVE�QUEUE-‰MOVE.L„A3,A2…USE�NEW�BUFFER�TO�TRANSMIT�FROM‰MOVE.B„#$10,SDDRSP(A2)**ˆSELECT�A�RESPONSE�TO�TRANSMIT*+SELTX2ƒBTST.B„#$4,SDDRSP(A2)�FINAL�BIT�SET?‰IFˆ�THEN.S(‹MOVE.L„A2,A1…NO,�DISPOSE�OF�THIS�BUFFER‹BSR.L…SOMEDISPOSE ‹MOVE.L„A1,A2 ‹BRA.L…DSPRC1‰ENDI5‰MOVE.L„A2,SDPRCV(A5)�ONLY�1�BUFFER�LEFT�IN�RCV�QUEUE‰MOVE.B„SDDRSP(A2),D0?‰A$ ND.B…#$1F,D0ƒWere�we�sent�an�RNR�command?�or�have�no�traffic?9‰IF.B†D0��#SDDRRNR+$10�OR.L�SDSTHD(A4)��#0�THEN.S9‹MOVE.B„#SDDRRR+$10,SDDCMD(A2)�Yes,�send�an�"RR"�response3‹MOVE.B„#SDPTRQ,SDPTXF(A5)�(sending�from�rcv�queue)‹BRA.L…VCTINIT6‰ENDI‰MOVE.L„SDSTHD(A4),A3‰MOVE.B„#SDPTXQ,SDPTXF(A5)#‰BTST.B„#0,SDDCMD(A0)�YES,�I�FIELD?‰IFˆ�THEN.S:‹CLR.B…SDSUKT(A4)�YES,�CLEAR�UNACKNOWLEDGED�TRANSMIT�COUNT‰ENDI‰BRA.L…TRANSMT ‰PAGEG* When a "flush" occurs, after all transmit frames have been discarded,H* and when, at the moment of the flush, we are transmitting one of theseH* frames, an abort is transmitted and the transmitter turned off (by theE*�flush�procedure).‚Immediately�after�doing�that,�we�branch�to�SDLCRQ* to decide what to do next.I* In a secondary station, we simply exit because we will wait to see whatK* the primary wants us to do next (presumably he will poll us fairly soon). SDLCRQƒSDLRSRG‰RTE /***********************************************/* END OF FILE 'FIX:48.SDLCSEC.FRMCNT.AI' */***********************************************ééééééé4****************************************************4* BEGINNING OF FILE 'FIX:48.SDLCSEC.PWRUP.AI' *4**************************************************** M*�NOTE:�AT�STARTUP,�OUR�CURRENT�STATE�IS�"DISCONNECT�MODE".‚THE�STARTER-UPPERE*‡(WHO?)�STORES�#SDSCRDM�INTO�SDSCST�THEREBY�ASSERTING�THIS�STATE.‚WEE*‡ARE�IN�THIS�STATE�WHEN�THE�PWRUP�SUBROUTINE�IS�CALLED,�WHICH�IS�THE&*‡FIRST�CALL�TO�THE�SDLC�DRIVER�LOGIC. SDLRSRG‚MACRO2‰MOVEM.Lƒ(A7)+,A0-A6/D0-D2�RESTORE�SAVED�REGISTERS‰ENDM SDLSVRG‚MACRO‰MOVEM.LƒA0-A6/D0-D2,-(A7)‰ENDM‰PAGE H*************************************************************************Æ*D*�SUBROUTINE:‚"PWRUP"�INITIALIZE�THE�NEC7201�CHIP�AT�POWER�UP�TIME„*#*�REGISTERS�USED:ƒ0�1�2�3�4�5�6�7¤* *‘D�U�U�U®**‘A�U�U�UƒP…S¤**Æ*H************************************************************************ ‰NEXTWB,PWRUP„MOVE.B„#NCW0RCN,NECCTL_B„CHANNEL�RESET‰MOVE.B„#NCW0RG2,NECCTL_A)‰MOVE.B„#NCW2RTS+NCW2PRI+NCW2BIN,NECCTL_A*‰MOVE.B„#NCW0RG2$ ,NECCTL_B„INTERRUPT�VECTOR‰MOVE.B„#0,NECCTL_B‰MOVE.B„#NCW0RG4,NECCTL_B„MODE)‰MOVE.B„#NCW4C01+NCW4SDL+NCW4SME,NECCTL_B#‰MOVE.B„#NCW0RG7,NECCTL_B„SDLC�FLAG‰MOVE.B„#SDLCFLAG,NECCTL_B3‰MOVE.B„#NCW0RG3,NECCTL_B„ENABLE�AUTO�ENABLE�OF�CTS!‰MOVE.B„#NCW3BT8+NCW3AUE,NECCTL_B‰IFEQ†RES7201-400‹MOVE.W„SR,-(A7)!‹ORI.W…#$0700,SRŠMask�Interrupts!5‹MOVE.L„#MVME400,A0ˆA0�=�Address�of�the�MVME400�board'‹BCLR.B„#REGSELEC,CTLPIA_A(A0)�Set�DDRAA‹MOVE.B„#WRT_LED+WRT_SEL,DATPIA_A(A0)�to�output�mid-two�bits�only:‹BSET.B„#REGSELEC,CTLPIA_A(A0)�Switch�now�to�Data�Reg�on�A=‹BSET.B„#WRT_SEL,DATPIA_A(A0)�Select�baud�rate�jumpers�Port�2(‹MOVE.B„DATPIA_A(A0),D0�and�read�them�in6‹ANDI.W„#$07,D0‹AND'ing�off�all�but�the�baud�rate�bitsB‹MOVE.B„V400BAUD(PC,D0.W),D0�and�get�the�4-bit�corresponding�value3‹MOVE.B„D0,-(A7)Šsaving�it�on�the�stack�temporarily,‹BCLR.B„#REGSELEC,CTLPIA_B(A0)�Now,�set�DDRB2‹MOVE.B„#%11111111,DATPIA_B(A0)�to�all�bits�output:‹BSET.B„#REGSELEC,CTLPIA_B(A0)�Switch�now�to�Data�Reg�on�B„5�L•K�I¥;‹MOVE.B„DATPIA_B(A0),D0�and�read�the�current�4-bit�settings.‹ANDI.B„#RATE1MSK,D0�drop�out�Port�2's�setting;‹OR.B†(A7)+,D0�and�OR�in�the�new�value�we�figured�out�aboveB‹MOVE.B„D0,DATPIA_B(A0)�and�output�the�new�rate�(Port�1�unchanged)#‹MOVE.W„(A7)+,SRŠUnmask�Interrupts!‰ENDC,‰LEA‡SDLCPR(PC),A0‡Address�of�"SDLCPR"�->�A0‰MOVE.L„#TIMCNST,A1‰MOVE.W„#$4005,D19‰MOVE.L„#DLC1,D2ŒRequest�a�Periodic,�Recurring�Activation‰IFEQ†CHIPTYPE-68000 ‹TR0.RQPA‰ENDC‰IFNE†CHIPTYPE-68000 ‹TR0$.RQPA‰ENDC3‰BRA.S…HOPOVER�(MUST�BE�2�BYTE�INSTRUCTION)‚2/24/831‰ILLEGAL�DIE�IF�SBRQPA�RETURNS�ANY�ERROR!ˆ2/24/83 5HOPOVER‚BRA.L…SBSDLCRCSTŠGo�turn�on�the�receiver�now! ‰IFEQ†RES7201-400"V400BAUDƒDC.B†15,14,13,12,10,7,5,2‰ENDC *3*„This�is�a�dummy�routine�to�satisfy�XREF�in�BUFMGT*‰XDEF†SDLCQXMT )SDLCQXMT�ILLEGAL�Die,�should�not�be�used! ‰PAGE ‰SECTIONƒ9H*************************************************************************Æ*0*ˆTRAP:‚"SDLCQU"‚TRAP�SERVICE�ROUTINE�FOR�SDLC�*0*™A�BUFFER�HAS�BEEN�ENQUEUED�FOR�TRANSMISSION.�*,*™IN�THE�SECONDARY�STATION,�WE�DON'T�CARE.…**ˆSUBROUTINE:‚"SDLCQUSB"§**Æ**Æ*#*�REGISTERS�USED:ƒ0�1�2�3�4�5�6�7¤**‘D´**‘A�S¤* *¡|__�stackœ**Æ*H************************************************************************ 'SDLCQUƒBSR.S…SDLCQUSB‚DO�THE�SUBROUTINE=‰MOVE.W„SR,0(A7)‚REPLACE�SR�ON�STACK�TO�GIVE�PROPER�CC�RETURN‰RTE‘AND�RETURN 2SDLCQUSB�RTS‘Just�Return,�We�don't�care�about�this ‰PAGE H*************************************************************************Æ*4*ˆTRAP:‚"SDLCTTMOUT"‚TRAP�SERVICE�ROUTINE�FOR�SDLCŒ*,*�THIS�ROUTINE�IS�ENTERED�WHEN�THE�RECEIVE�**�TIMEOUT�EXPIRESš**ˆSUBROUTINE:‚"SDLCTMOUT"¦**Æ**Æ*#*�REGISTERS�USED:ƒ0�1�2�3�4�5�6�7¤**‘D´**‘A�S¤* *¡|__�stackœ**Æ*H************************************************************************ SDLCTMOUT‚RTS2RTE%SDLCTTMOUT�SDLSVRG�SAVE�ALL�USER�REGS‰MOVE.L„SDLCPCB,A6�RESTORE�REGS‰MOVEM.LƒSDPRRTA0(A6),A0-A6‰ADD.W…#1,SDSHCRTO(A4)…3/2/83‰BRA.L…RECEITOƒRECEIVE�TIMEOUT ‰PAGE H*************************************************************************Æ*8*ˆTRAP:‚"SDLCPR"‚TRAP�SERVICE�ROUTINE�WHICH�IS�ENTEREDˆ*%*™WHEN�THE�PERIODIC�TIMER�RUNS�DOWNŒ**ˆSUBROUTINE:‚"SDLCPRSB"§**Æ**Æ*#*�REGISTERS�USED:ƒ0�1�2�3�4�5�6�7¤**‘D´**‘A�S¤*H************************************************************************ SDLCPRSB RTS2RTE!SDLCPRƒSDLSVRGŽSAVE�ALL�REGISTERS2‰MOVE.L„SDLCPCB,A5�ARE�WE�BUSY�WAITING�FOR�BUFERS?$‰IF.B†SDPBSY(A5)��#SDPBWB�THEN.S‹SDLRSRGŽNO,�RETURN‹RTE‰ENDI8‰BRA.S…SDLCRC01‚YES,�GO�GET�ONE�AND�TURN�ON�THE�RECEIVER‰PAGE H*************************************************************************Æ*0*ˆTR% AP:‚"SDLCKL"ƒTRAP�SERVICE�ROUTINE�FOR�SDLC�*&*šTHIS�ROUTINE�EFFECTIVELY�KILLS�THEŠ*.*šSDLC�LINK�AND�CANCELS�PERIODIC�ACTIVATIONS‚**ˆSUBROUTINE:‚"SBSDLCKL"§**Æ*#*�REGISTERS�USED:ƒ0�1�2�3�4�5�6�7¤* *‘DƒU�U®**‘A�S¤* *¡|__�stackœ**Æ*H************************************************************************ 9SDLCKLƒBSR.S…SBSDLCKL‚TRAP�ENTRY�POINT,�DO�THE�SUBROUTINE9‰MOVE.W„SR,0(A7)‚REPLACE�SR�ON�STACK�SO�WE�GIVE�PROPER�CC‰RTE‘AND�RETURN /SBSDLCKL�MOVE.W„SR,-(A7)‚SUBROUTINE�ENTRY�POINT!‰ORI.W…#$0700,SR�MASK�TO�LEVEL�7!1‰MOVE.B„#NCW0RCN,NECCTL_B�CHANNEL�RESET�7201�CHIP'‰BSR.L…SOMETOCLR�TURN�OFF�RECEIVE�TIMER‰MOVE.W„#$8005,D1;‰MOVE.L„#DLC1,D2‚Discontinue�Recurring�Periodic�Activations‰IFEQ†CHIPTYPE-68000 ‹TR0.RQPA‰ENDC‰IFNE†CHIPTYPE-68000 ‹TR0$.RQPA‰ENDC‰BRA.S…SDLCKLEX)‰ILLEGAL�DIE�IF�SBRQPA�RETURNS�ANY�ERROR! 6SDLCKLEX�MOVE.W„(A7)+,SR‚RESTORE�PRIOR�INTERRUPT�LEVEL‰RTS‘AND�RETURN ‰PAGE H*************************************************************************Æ*<*ˆSUBROUTINE:‚"SBUSRACK"‚USER�ACKNOWLEDGES�RECEIPT�OF�SDLC„*!*¡"SIM"�"DISC"�OR�"SNRM"�FRAMESˆ**ˆTRAP:ˆ"USRACK"©**Æ*&*ˆENTER:‚D0.B�=�"SDDCSIM"�=>�ACK�SIM›**•=�"SDDCDISC"�=>�ACK�DISC™**•=�"SDDCSNRM"�=>�ACK�SNRM™**Æ**Æ*#*ˆREGISTERS�USED:ƒ0�1�2�3�4�5�6�7�**˜D�P«* *˜A�U�S�**š|‚|Š|_�stack–**š|‚|____________�preserved’**š|_______________�used—**Æ**Æ*H************************************************************************ 9USRACKƒBSR.S…SBUSRACK‚TRAP�ENTRY�POINT,�DO�THE�SUBROUTINE5‰MOVE.W„SR,0(A7)‚REPLACE�SR�ON�STACK�GIVING�PROPER�CC‰RTE‘AND�RETURN @SBUSRACK�MOVE.L„SDLCPCB,A0�FETCH�SECONDARY�CONTROL�BLOCK�ADDRESS‰MOVE.L„SDPFSEC(A0),A0‰IF.B†D0��#SDDCSIM�THEN.S2‹MOVE.B„#SDSCRDM,SDSCST(A0)�IF�SIM,�SET�DISC�STATE‰ELSE.S‹IF.B†D0��#SDDCDISC�THEN.S3�MOVE.B„#SDSCRDM,SDSCST(A0)�IF�DISC,�SET�DISC�STATE‹ELSE.S�IF.B†D0��#SDDCSNRM�THEN.S2�MOVE.B„#SDSCNRM,SDSCST(A0)�IF�SNRM,�SET�NRM�STATE�ELSE.S%‘ILLEGAL�OTHERWISE,�ILLEGAL�ACK,�DIE!�ENDI‹ENDI‰ENDI‰RTS ‰PAGE H*************************************************************************Æ*2*ˆTRAP:‚"SDLCRCST"‚TRAP�SERVICE�ROUTINE�FOR�SDLCŽ*)*™THIS�ROUTINE�FETCHES�A�RECEIVE�BUFFERˆ**™AND�STARTS�UP�THE�RECEIVER“**ˆSUBROUTINE:‚"SBSDLCRCST"¥**Æ**Æ*#*�REGISTERS�USED:ƒ0�1�2�3�4�5�6�7¤**‘D´**‘A�S¤* *¡|__�stackœ**Æ*H************************************************************************ SBSDLCRCST RTS2RTE#SDLCRCST�SDLSVRG�SAVE�ALL�USER�REGS>SDLCRC01�MOVE.L„SDLCPCB,A5�PRIMARY�CONTROL�BLOCK�ADDRESS�->�A5<‰MOVE.L„SDPFSEC(A5),A4�SECONDARY�CONTROL�BLOCK�ADDRESS�->�A4)‰CLR.L…SDPRCV(A5)�CLEAR�HEAD�OF�RCV�QUEUE ‰MOVE.W„SR,D0‰AND.W…#$0700,D0%‰CMP.W…#$0500,D0�AT�LEAST�LEVEL�FIVE?‰IF.W†#$0500��D0�THEN.S‹MOVE.W„SR,D0…NO,‹AND.W…#$F8FF,D0.‹OR.W†#$0500,D0�RAISE�TO�INTERRUPT�LEVEL�FIVE!-‹MOVE.W„D0,SR…(OLD�SR�AND�LEVEL�ARE�ON�STACK)‰ENDI-‰MOVE.B„#SDPBNB,SDPBSY(A5)�SET�SSDLC�NOT�BUSY$‰BSR.L…SBGTFRIR‚GET�A�RECEIVE�BUFFER‰IFˆ�THEN.S8‹MOVE.B„#SDPBWB,SDPBSY(A5)�NONE�AVAILABLE,�SLEEP�A�WHILE‹SDLRSRG‹RTE‰ENDIBSDLCRC02�MOVE.L„A3,SDPRCV(A5)�LINK�RCV�BUFFER�TO�HEAD�OF�RCV�QUEUE-‰MOVE.W„SDPRLG(A5),SDDBCT(A3)�INIT�BYTE�COUNT‰CLR.W…SDDSTS(A3)�INIT�STATUS!‰CLR.B…SDDERR(A3)�INIT�SDLC�ERROR,‰MOVE.B„SDSSEC(A4),SDDSEC(A3)�STATION�NUMBER#‰BRA.L…RECEIVEƒGO�INTO�RECEIVE�MODE .**********************************************.* END OF FILE 'FIX:48.SDLCSEC.PWRUP.AI' *.**********************************************é% ééééé' DLOAD SAµµËDLOAD LFÒÒDLOAD PFÛÛDLOAD PCàà+ TRANSFERSA „TRANSFERAF33TRANSFERLF<<ULOAD SAAAØULOAD LF^^ULOAD PFggULOAD PCll' TRANSFERRO™™DLOAD RO¶¶ ULOAD ROÃà %PROGRAM DOWNLOAD(INPUT,OUTPUT,INFIL); J(************************************************************************)D(*�THIS�PROGRAM�READS�RECORDS�FROM�A�SOURCE�FILE,�PACKS�THEM�INTO‡*)D(*�BLOCKS�AND�WRITES�THEM�TO�THE�TERMINAL.‚THE�PROGRAM�RUNS�ON�AN†*)(*�EXORMACS�SYSTEM.µ*)J(************************************************************************) 6ƒCONST�CMAX‚=‚132;ˆ(*�MAX�NO.�OF�CHARS�IN�ONE�BLOCK�*)-‰RMAX‚=‚132;ˆ(*�MAXIMUM�SINGLE�RECORD�SIZE�*)5‰BLKCNT=‚1;Š(*�NUMBER�OF�BLOCKS�UNDER�ONE�CHECKSUM�*)3‰BMAX‚=‚268;ˆ(*�BUFFER�SIZE�=�BLKCNT*CMAX+RMAX+2�*)/‰OPTION�=�'AA';‡(*�COM/CHAR�PROTOCOL�OPTIONS�*),‰CHRMAX�=�127;ˆ(*�MAXIMUM�CHARACTER�VALUE�*) ƒTYPE‚BKINDEX‚=�1..CMAX;‰BFINDEX‚=�INTEGER;*‰BFTYPEƒ=�PACKED�ARRAY(.1..BMAX.)�OF�CHAR;(‰RSPTYPE‚=�PACKED�ARRAY(.1..2.)�OF�CHAR;+‰RECTYPE‚=�PACKED�ARRAY(.1..RMAX.)�OF�CHAR; ƒVARƒQ…:‚BOOLEAN; ‰INFIL�:‚TEXT;™(*�SOURCE�FILE�*)>‰ASCII�:‚ARRAY(.CHAR.)�OF�INTEGER;…(*�ASCII�CHARACTER�CODES�*)±¶!º%¾/Â$Æ?‰ASHEX�:‚PACKED�ARRAY(.1..36.)�OF�CHAR;(*�FOR�HEX�CONVERSION�*)&‰RECƒ:‚RECTYPE;–(*�HOLDS�RAW�RECORD�*)/‰RECSIZ:‚INTEGER;–(*�HOLDS�LENGTH�OF�RAW�REC�*)-‰BUFF‚:‚BFTYPE;—(*�BUFF�HOLDS�PACKED�BLOCK�*))‰BUFFP�:‚BFINDEX;–(*�INDEX�INTO�BUFFER�*)*‰RESPONSE:�RSPTYPE;•(*�ACK�NAK�RESPONSE�*) ƒPROCEDURE�INITIALIZE;0†TYPE‚CHRARRAY�=‚PACKED�ARRAY�(.1..16.)�OF�CHAR;†VARƒIˆ:‚INTEGER; 2†PROCEDURE�ASGCODE(CODE:INTEGER;�CHRSET:CHRARRAY);‰VARƒI‚:‚INTEGER;‰BEGIN�(*�ASGCODE�*)‰FOR�I�:=�1�TO�16�DO%& ŒASCII(.CHRSET(.I.).)�:=�CODE�+�I�-�1‰END;‚(*�ASGCODE�*) †BEGIN�(*�INITIALIZE�*)†FOR�I:=�0�TO�CHRMAX�DO0‰ASCII(.CHR(I).)�:=�32;…(*�FORCE�ASCII�BLANKS�*) †RESET(INFIL);1†ASHEX�:=�'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';!†ASGCODE(112,'pqrstuvwxyz{|}~�');!†ASGCODE(32,'�!"#$%&''()*+,-./'); †ASGCODE(48,'0123456789:;<=>?'); †ASGCODE(64,'@ABCDEFGHIJKLMNO'); †ASGCODE(80,'PQRSTUVWXYZ[\]^_'); †ASGCODE(96,'`abcdefghijklmno'); -†BUFFP�:=�4;œ(*�START�PACKING�RECORDS�HERE�*)†REPEAT/‰WRITE(OUTPUT,'PREAMBLED');Œ(*�SEND�PREAMBLE�*)(‰WRITE(OUTPUT,OPTION);‘(*�SEND�OPTION�*),‰WRITE(OUTPUT,CMAX:3);‘(*�SEND�BLOCK�SIZE�*)1‰WRITELN(OUTPUT,BLKCNT:1);�(*�SEND�BLOCK�COUNT�*)‰READLN(INPUT,RESPONSE);6†UNTIL�(RESPONSE(.1.)�=�'N')�OR�(RESPONSE(.1.)�=�'T');†IF�RESPONSE(.1.)�=�'T'(‰THEN�Q�:=�TRUE;˜(*�EARLY�TERMINATION�*)†END;‚(*�INITIALIZE�*) IƒPROCEDURE�COMPRESS(VAR�REC:RECTYPE;�VAR�RECSIZ:INTEGER;�VAR�BUFF:BFTYPE;"–VAR�P:BFINDEX;�VAR�CCNT:INTEGER); ƒVARƒI,Jƒ:‚INTEGER;‰RECPTR:‚INTEGER; †PROCEDURE�COUT(C:CHAR);‰BEGIN�(*�COUT�*)‰BUFF(.P.)�:=�C; ‰P�:=�P�+�1;‰CCNT�:=�CCNT�+�1‰END;‚(*�COUT�*) ƒBEGIN�(*�COMPRESS�*) ƒRECPTR�:=�1;ƒWHILE�RECPTR�<=�RECSIZ�DO†BEGIN †I�:=�RECPTR;F†WHILE�(I<=RECSIZ)�AND�(REC(.RECPTR.)�=�REC(.I.))�AND�(I-RECPTR<35)�DO ‰I�:=�I�+�1;5†I�:=�I�-�RECPTR;‚(*�NUMBER�OF�MATCHING�CHARACTERS�*)/†IF�(I<=3)�AND�(I>0)�AND�(REC(.RECPTR.)�<>�'|')†THEN‰BEGIN‰FOR�J�:=�1�TO�I�DOŒCOUT(REC(.RECPTR.));‰RECPTR�:=�RECPTR�+�I‰END†ELSE ‰IF�I�>�0‰THENŒBEGIN ŒCOUT('|');ŒCOUT(REC(.RECPTR.));ŒCOUT(ASHEX(.I+1.));ŒRECPTR�:=�RECPTR�+�I ŒENDƒ(*THEN*)†ENDƒ(*WHILE*)ƒEND;‚(*�COMPRESS�*) 2ƒPROCEDURE�GETREC(VAR�P:BFINDEX;�VAR�BUFF:BFTYPE);?†VARƒCPOS‚:‚BFINDEX;„(*�POSITION�IN�BUFF�FOR�CHARACTER�COUNT�*)5ŒCCNT‚:‚INTEGER;„(*�NUMBER�OF�CHARACTERS�IN�RECORD�*) ŒQ…:‚BOOLEAN; †BEGIN„(*�GETREC�*)#†IF�EOLN(INFIL)�THEN�READLN(INFIL);†IF�NOT�EOF(INFIL)†THEN‰BEGIN ‰CPOS�:=�P; ‰CCNT�:=�0;,‰P�:=�P+2;’(*�LEAVE�ROOM�FOR�RECORD�COUNT�*) ‰RECSIZ�:=�0;‰WHILE�NOT�EOLN(INFIL)�DOŒBEGINŒREAD(INFIL,REC(.RECSIZ+1.));ŒRECSIZ�:=�RECSIZ�+�1;ŒEND;�(*WHILE*)‰IF�RESPONSE(.2.)�=�'B'‰THENŒBEGIN ŒQ�:=�FALSE;"ŒWHILE�(NOT�Q)�AND�(RECSIZ�>�0)�DO�IF�REC(.RECSIZ.)�=�'�'�THEN’RECSIZ�:=�RECSIZ�-�1�ELSE ’Q�:=�TRUEŒEND;"‰COMPRESS(REC,RECSIZ,BUFF,P,CCNT);F‰BUFF(.CPOS.)�:=�ASHEX(.CCNT�DIV�16+1.);ƒ(*�CONSTRUCT�HEX�CHAR�COUNT*)*‰BUFF(.CPOS+1.)�:=�ASHEX(.CCNT�MOD�16+1.); ‰ENDƒ(*THEN*)†END;‚(*�GETREC�*) @ƒPROCEDURE�PUTREC(VAR�Q:BOOLEAN;�VAR�P:BFINDEX;�VAR�BUFF:BFTYPE;”VAR�RESPONSE:RSPTYPE); †VARƒI‚:‚BFINDEX; †PROCEDURE�OUTBLOCK(RTYPE:CHAR);‰VAR�I�:‚INTEGER; �J�:‚INTEGER;�C�:‚INTEGER;‡(*�CHECKSUM�*) ‰BEGIN�(*�OUTBLOCK�*)*‰BUFF(.3.)�:=�RTYPE;‹(*�MARK�BLOCK�TYPE�*)‰C�:=�0;4‰FOR�I�:=�3�TO�CMAX*BLKCNT�DOˆ(*�COMPUTE�CHECKSUM�*)ŒC�:=�C�+�ASCII(.BUFF(.I.).);2‰C�:=�C�MOD�255�+�1;�(*�0�CHECKSUM�IS�WILD�CARD�*)B‰BUFF(.1.)�:=�ASHEX(.C�DIV�16+1.);�(*�PLACE�CHECKSUM�INTO�BLOCK�*)"‰BUFF(.2.)�:=�ASHEX(.C�MOD�16+1.);‰REPEATŒFOR�J�:=�0�TO�BLKCNT-1�DO�BEGIN<�FOR�I�:=�J*CMAX+1�TO�(J+1)*CMAX�DO„(*�WRITE�OUTPUT�BLOCK�*)’WRITE(OUTPUT,BUFF(.I.));�WRITELN(OUTPUT);�END;ŒREADLN(INPUT,RESPONSE)6‰UNTIL�(RESPONSE(.1.)�=�'N')�OR�(RESPONSE(.1.)�=�'T');‰Q�:=�RESPONSE(.1.)='T';5‰C�:=�BLKCNT*CMAX+1;‘(*�JUSTIFY�ANY�BLOCK�OVERFLOW�*)‰WHILE�C�<�P�DOŒBEGIN&ŒBUFF(.C-BLKCNT*CMAX+3.)�:=�BUFF(.C.); ŒC�:=�C�+�1ŒEND;8‰P�:=�P�-�(BLKCNT*CMAX�-�3);‰(*�RESET�NEXT�IN�POINTER�*)‰END;‚(*�OUTBLOCK�*) †BEGIN„(*�PUTREC�*)†WHILE�P�>�BLKCNT*CMAX+1�DO/‰OUTBLOCK('A');Š(*�OUTPUT�INTERMEDIATE�BLOCK�*)†IF�EOF(INFIL)†THEN‰BEGIN‰FOR�I�:=�P�TO�BLKCNT*CMAX�DO5ŒBUFF(.I.)�:=�'�';„(*�FORCE�BLANKS�TO�END�OF�BLOCK�*)'‰OUTBLOCK('Z');Š(*�OUTPUT�LAST�BLOCK�*) ‰Q�:=�TRUE;‰END†ELSEF‰IF�P�>�BLKCNT*CMAX�THEN�OUTBLOCK('A')�(*�OUTPUT�INTERMEDIATE�BLOCK�*)†END;…(*�PUTREC�*) ƒBEGIN„(*�MAIN�*) ƒQ�:=�FALSE; ƒINI& TIALIZE;ƒWHILE�NOT�Q�DO†BEGIN†GETREC(BUFFP,BUFF);†PUTREC(Q,BUFFP,BUFF,RESPONSE);†ENDƒEND.…(*�MAIN�*)é=/*=/*†FILE:�DLOAD.LF=/*F=/*†Link�file�for�DLOAD�which�is�an�associated�support�program�for�the=/*�TRANSFER�utility.=/*=/*=/*0=/*†PARAMETER�01ˆ\1�=�Listing�output�file/device=/*=/*†DEFAULT�PARAMETERS�ARE=/*!=/*�DEFAULT�PARAMETER�01ŠDLOAD.LL=/*=/*=/IFC \1 =ARG DLOAD.LL=/ENDIF=/*=/*�DEFAULT�PARAMETER�01=/*=LINK ,DLOAD.LO,\1;HAMIX INPUT DLOADLIB 0.&.PASVMDOS.ROLIB 0.&.PASCALIB.ROEND=ENDééééééÊ=/*=/*†FILE:�DLOAD.PF=/*C=/*†Compilation�chain�file�for�DLOAD�which�is�an�associated�support%=/*�program�for�the�TRANSFER�utility.=/*@=/*†NOTE:�this�chain�file�requires�the�pascal�compiler�reside�on9=/*Œthe�system�default.�The�compiler�is�not�provided�with7=/*Œthis�product,�therefore�this�chain�file�will�abort.=/*#=/*†Default�output�file�is�DLOAD.LS=/*=/IFC \1 =ARG DLOAD.PL=/ENDIF=/*-=/*†PARAMETER‚1†\1=Listing�output�file/device=/*#=/*šDefault�values�will�be�used�for =/*¤Volume=/*¤User�number =/*¤Catalog=/*®Unless�specified=/*=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)ƒÿÿÿøB‰E (E )?�= Aÿÿýæ5= AFÿÿÿüFFÿÿÿüƒÿÿÿü4Fÿÿÿü?(,FÿÿÿüFÿÿÿø?lE *E +E , INITIALIƒÿÿÿüB)ƒÿÿÿøB‰ E -?�= AÿÿýæFÿÿÿüB ƒÿÿÿü4 Fÿÿÿü? (,FÿÿÿüFÿÿÿøE .E /? pQAÿÿÿæE 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? • QAÿÿÿðB  PREAMBLEDBE ;•QAÿÿÿðB AABE <“QAÿÿÿðB„BE =�“QAÿÿÿðBBE >mgQAÿÿÿøAÿÿü(BE ?† $Fÿÿü(BN( $Fÿÿü(BT? E @E A( $Fÿÿü(BTƒÿÿÿïBE B? lE CE DE EE FE GE HE IE JE KE L COUT �= F5FFE M�F35FE NE O�F35FlE PE QE R COMPRESSƒÿÿÿôBE SŒ?(CFÿÿÿô5F E TE UƒÿÿÿøFÿÿÿôE VŒ?(CFÿÿÿø5F ($5= FFÿÿÿô5= FFÿÿÿø(DrFÿÿÿøFÿÿÿôB#E Wƒÿÿÿø3Fÿÿÿø‰E X?ƒÿÿÿørFÿÿÿøFÿÿÿôE YE Z(CFÿÿÿøB(,FÿÿÿøB(S5= FFÿÿÿôB|E [E \ƒÿÿÿüB)ƒÿÿÿðFÿÿÿø‰E ]?Q5= FFÿÿÿôƒÿÿÿü4Fÿÿÿü?(,FÿÿÿüFÿÿÿðE ^E _?ƒÿÿÿôFÿÿÿôFÿÿÿøE `‰E aE b?(,FÿÿÿøBE cE dQB|E eQ5= FFÿÿÿôE fQ5= AÿÿýÁ3FÿÿÿøE gE hƒÿÿÿôFÿÿÿôFÿÿÿøE iE j??‰?lE kE lE mE nE oE pE qE r GETREC (#QAÿÿÿæmQAÿÿÿæE sE t?†"QAÿÿÿæE uE vƒÿÿÿü5FE wƒÿÿÿøBE x�F35FE yƒÿÿý:BE zŒ? †!#QAÿÿÿæE {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ÿÿý:FFAÿÿÿøE ‹�= FFÿÿÿü5= AÿÿýÁ3FÿÿÿøBE Œ�= F3Fÿÿÿü5= AÿÿýÁ3LFÿÿÿøBE �E Ž?lE �E �E ‘E ’E “E ”E •E –E —E ˜E ™E šE › 'OUTBLOCK�3FFE œƒÿÿÿôBE �ƒÿÿÿüB)ƒÿÿÿðB„‰*E ž?)ƒÿÿÿôFÿÿÿô5= Aÿÿýæ5= FFÿÿÿüƒÿÿÿü4+Fÿÿÿü?*(),FÿÿÿüFÿÿÿðE Ÿ?+ƒÿÿÿô3LFÿÿÿôBÿE  �F5= AÿÿýÁ3FÿÿÿôBE ¡�3F5= AÿÿýÁ3LFÿÿÿôBE ¢E £k?,ƒÿÿÿøB)ƒÿÿÿðB‰.E ¤E ¥?-ƒÿÿÿü3OFÿÿÿøB„)ƒÿÿÿìO3FÿÿÿøB„‰1E ¦?0�QAÿÿÿð5= FFÿÿÿüBƒÿÿÿü42Fÿÿÿü?1(0,FÿÿÿüFÿÿÿìE §?2�QAÿÿÿðE ¨ƒÿÿÿø4/Fÿÿÿø?.(-,FÿÿÿøFÿÿÿðE ©E ª?/mgQAÿÿÿøFB†3$5FBN(,$5FBT?3E «�F $5FBTE ¬ƒÿÿÿôB…E ­Œ?4(5DFÿÿÿô5FE ®E ¯�= F�Fÿÿÿô5= FFÿÿÿôE °E ±ƒÿÿÿô3Fÿÿÿô‰4E ²?5�F�5FE ³lE ´E µE ¶ 6PUTREC Œ?8(9,5FB…E ·QBA‰8E ¸E ¹?9(:"QAÿÿÿæE ºE »ƒÿÿÿü5F)ƒÿÿÿøB„‰<E ¼?;�= FFÿÿÿüB ƒÿÿÿü4=Fÿÿÿü?<(;,FÿÿÿüFÿÿÿøE ½?=QBZE ¾�F BE ¿E À‰>E Á?:(?,5FB„E ÂQBA???>lE ÃE ÄE Å @DOWNLOAD0QAÿÿÿæBBB0QAÿÿÿðBBBqQAÿÿÿð0QAÿÿÿøBBBpQAÿÿÿøƒÿÿÿïBE ÆQE ÇŒ?B†CFÿÿÿïE ÈE ÉQAÿÿü*Aÿÿü.E ÊQAÿÿÿïAÿÿü*Aÿÿü.Aÿÿü(E ËE ̉B?C QAÿÿÿæ QAÿÿÿð QAÿÿÿø‚)ƒÿÿÿøB„‰<E ¼?;�= FFÿÿÿüB ƒÿÿÿü4=Fÿÿÿü?<(;,FÿÿÿüFÿÿÿøE ½?=QBZE ¾�F BE ¿E À‰>E Á?:(?,5FB„E ÂQBA???>lE ÃE ÄE Å @DOWNLOAD0QAÿÿÿæBB( B0QAÿÿÿðBBBqQAÿÿÿð0QAÿÿÿøBBBpQAÿÿÿøƒÿÿÿïBE ÆQE  ŠTTL„ASCII�file�transfer�utility-TRANSFER‚IDNTƒ4,0�ASCII�file�transfer�utility<*************************************************************�TRANSFER�PROGRAM�-§**º*3*�THIS�PROGRAM�HANDLES�ASCII�FILE�TRANSFER�ON�THEŠ**�EXORMACS�(NONHOST)�SYSTEM **º*<************************************************************ ŠSECTION�0ŠXREFƒPARSE,EDITFILE,OPTIONA‰EQU„*’BASE�OF�SEGMENTDEFPORTƒEQU„'CN20'�DEFAULT�PORT8BLKLGH„EQU„200�SIZE�OF�HOST�BUFFER�(NOT�NEC.�BLOCK�SIZE)#RMAX†EQU„130�MAXIMUM�SIZE�OF�RECORD** DIRECTIVE EQUATESABORT…EQU„14‘ABORT�SELFTERM†EQU„15‘TERMINATE�SELFDELAY…EQU„21‘DELAYRELINQ„EQU„22‘RELINQUISH)RQSTPA„EQU„29‘REQUEST�PERIODIC�ACTIVATIONGTASQ…EQU„31‘ALLOCATE�AN�ASQRDEVNT„EQU„34‘READ�EVENTWTEVNT„EQU„36‘WAIT�ON�EVENT**!BUSY†EQU„$E2�IOS�BUSY�STATUS�CODE"CNTL.A„EQU„$01�CONTROL-A�CHARACTERŠDS.Lƒ40 STACK…EQU„*2SAVSTACK‚DS.Lƒ1’SAVE�FOR�STACK�POINTER�RESTORATION)INITREGS‚EQU„*’SAVE�FOR�INITIAL�REGISTERS ŠDS.Lƒ1’D0ŠDS.Lƒ1’D1=SESSION�NUMBERVOLNAM„DS.Lƒ1’D2=VOLUME�NAMEUSERNUMƒDS.Lƒ1’D3=USER�NUMBERCATNAM„DS.Lƒ1’D4=CATALOGUE�NAME ŠDS.Lƒ1’D5 ŠDS.Lƒ1’D6 ŠDS.Lƒ1’D7** VERSION MESSAGE/VMSGS…DC.Bƒ'ASCII�FILE�TRANSFER�-�VERSION�2.02' VMSGE…EQU„*-1ŠDS…0** COMMAND LINE RECEIVING AREACLINE…COMLINE�$A0** RETURN REGISTERS FROM PARSE1PARSAREG‚DS.Lƒ1’A1�-�ADDRESS�OF�OUTPUT�FIELD�OR�0*ŠDS.Lƒ1’A2�-�ADDRESS�OF�OPTIONS�FIELD�OR�0** PREAMBLE VARIABLES#COMOPT„DS.Bƒ1’COMMUNICATIONS�OPTION)CHROPT„DS.Bƒ1’CHARACTER�CONVERSION�OPTION,CHRBLK„DC.Lƒ0’NUMBER�OF�CHARACTERS�PER�BLOCK+BLKSUM„DC.Lƒ0’NUMBER�OF�BLOCKS�PER�CHECKSUM*+BLKRED„DC.Lƒ0’RUNNING�NUMBER�OF�BLOCKS�READ%WBUF†DS.Lƒ1’ADDRESS�OF�WORKING�BUFFER,WLGH†DC.Lƒ0’LENGTH�OF�DATA�IN�WORKING�BUFFER,CHRNUM„DC.Lƒ0’NUMBER�OF�CHARACTERS�PER�FRAME%BLKCMAXƒDS.Lƒ1’LIMIT�ADDRESS�OF�FRAME0DPSAV…DS.Lƒ14‘SAVE�RGISTERS�FOR�DOWNLOAD�PROCESS,RESPONSE‚DC.Bƒ'‚'�RESPONSE�(ACK/NAK)�TO�HOST ŠDC.Bƒ$0DŠDS…0DLTEMP„DS.Lƒ1’TEMPORARY*BBOUNDSƒDS.Lƒ2’BUFFER�BOUNDARIES�ON�UPLOAD GKR"T*I2O:?B9J>RUZCbCjKrCz:‚<ŠQ’8šC¢>ªA²CºHÂAÊAÒEÚFâBêBò73UREC1…DS.Lƒ1’ADDRESS�OF�1ST�REC�IN�FRAME�FOR�UPLOAD)BCHR†DS.Wƒ1’SAVE�FOR�COMPRESSED�CHARACTER** OPTIONS EQUATES AND FLAG WORD"B‰EQU„0’1=TRUNCATE�TRAILING�BLANKSC‰EQU„1’1=USE�CHECKSUMS*D‰EQU„2’1=DISPLAY�DATA�AS�IT�IS�TRANSFEREDH‰EQU„3’1=HALF�DUPLEX�MODE* OPTFLG„DC.Bƒ(1<*ƒCHECKSUM�MATCH�IS�FORCED.‚THE�DEFAULT�VALUE�(IN�THIS�CASE�3)=*ƒIS�USED�UNLESS�THE�TRANSFER�PROGRAM�IS�STARTED�WITH�ANOTHER8*ƒVALUE�SPECIFIED�ON�THE�'C'�OPTION.‚IE�'C=10'�WOULD�SET*ƒREP1�AND�REP2�TO�10.*'REP1†DC.Lƒ3’COUNTDOWN�FOR�BAD�CHECKSUMS#REP2†DC.Lƒ3’RESET�FOR�BAD�CHECKSUMS*)* FHS PARAMETER BLOCK TO ASSIGN HOST PORT FHS1†EQU„*ŠDC.Wƒ$40�ASSIGN�(OPEN)ŠDC.Wƒ4’PUBLIC�READ/WRITEŠDC.Bƒ0’STATUS ŠDC.Bƒ1’PORT�LOGICAL�UNIT�NUMBERŠDC.LƒDEFPORTŒVOLUMEŠDC.Bƒ'‚'�USER�NUMBERŠDC.Bƒ'ˆ'‰CATALOGUE�NAMEŠDC.Bƒ'ˆ'‰FILE�NAMEŠDC.Bƒ'‚'�EXTENSIONŠDC.Wƒ0’RESERVED ŠDC.Bƒ0’WCODE ŠDC.Bƒ0’RCODEŠDC.Wƒ0’RECORD�LENGTHŠDC.Lƒ0’SIZE/POINTER*0* PARAMETER BLOCK TO ASSIGN UPLOAD/DOWNLOAD FILE FHS4†EQU„*ŠDC.Wƒ0’FUNCTIONŠDC.Wƒ4’PUBLIC�READ/WRITEŠDC.Bƒ0’STATUS ŠDC.Bƒ4’PORT�LOGICAL�UNIT�NUMBERŠDC.Lƒ0’VOLUMEŠDC.Bƒ'‚'�USER�NUMBERŠDC.Bƒ'ˆ'‰CATALOGUE�NAMEŠDC.Bƒ'ˆ'‰FILE�NAMEŠDC.Bƒ'‚'�EXTENSIONŠDC.Wƒ0’RESERVED ŠDC.Bƒ0’WCODE ŠDC.Bƒ0’RCOD) EŠDC.Wƒ0’RECORD�LENGTHŠDC.Lƒ0’SIZE/POINTER*G* FHS PARAMETER BLOCK TO CHANGE ACCESS PERMISSION ON LU 5 TO READ/WRITE FHS5†EQU„*$ŠDC.Wƒ$0020ŽCHANGE�ACCESS�PERMISSIONŠDC.Wƒ4’PUBLIC�READ�WRITEŠDC.Bƒ0’STATUSŠDC.Bƒ5’LOGICAL�UNIT�NUMBERŠDC.Lƒ'„'�VOLUMEŠDC.Bƒ'‚'�USER�NUMBERŠDC.Bƒ'ˆ'‰CATALOGUE�NAMEŠDC.Bƒ'ˆ'‰FILE�NAMEŠDC.Bƒ'‚'�EXTENSIONŠDC.Wƒ0’RESERVED ŠDC.Bƒ0’WCODE ŠDC.Bƒ0’RCODEŠDC.Wƒ0’RECORD�LENGTHŠDC.Lƒ0’SIZE/POINTER*=* IOS PARAMETER BLOCK TO READ/WRITE WITH PROCEED TO HOST PORTIOS1†DC.Wƒ0’FUNCTION�(DYNAMIC)ŠDC.Wƒ0’OPTIONS�(DYNAMIC)ŠDC.Bƒ0’STATUS ŠDC.Bƒ1’LUNŠDC.Wƒ0’RESERVEDŠDC.Lƒ0’RANDOM�RECORD�NUMBERŠDC.Lƒ0’BUFFER�STARTŠDC.Lƒ0’BUUFFER�ENDŠDC.Lƒ0’LENGTH�OF�TRANSFERŠDC.Lƒ0’COMPLETION�ADDRESS*1* PARAMETER BLOCK TO HALT I/O ON LU 1 (HOST PORT)$IOS1H…DC.Wƒ$0110ŽFUNCTION�(HALT�I/O)ŠDC.Wƒ0’OPTIONSŠDC.Bƒ$FF�STATUS ŠDC.Bƒ1’LUNŠDC.Wƒ0’RESERVEDŠDC.Lƒ0’RANDOM�RECORD�NUMBERŠDC.Lƒ0’BUFFER�STARTŠDC.Lƒ0’BUUFFER�ENDŠDC.Lƒ0’LENGTH�OF�TRANSFERŠDC.Lƒ0’COMPLETION�ADDRESS*ŠDC.Wƒ0’HALT�SYNC�COUNTER*&* IOS PARAMETER BLOCK TO WRITE TO FILEIOS4†DC.Wƒ0’FUNCTION�(DYNAMIC)ŠDC.Wƒ0’OPTIONS�(DYNAMIC)ŠDC.Bƒ0’STATUS ŠDC.Bƒ4’LUNŠDC.Wƒ0’RESERVEDŠDC.Lƒ0’RANDOM�RECORD�NUMBERŠDC.Lƒ0’BUFFER�STARTŠDC.Lƒ0’BUUFFER�ENDŠDC.Lƒ0’LENGTH�OF�TRANSFERŠDC.Lƒ0’COMPLETION�ADDRESS*<* IOS PARAMETER BLOCK TO READ/WRITE WITH PROCEED TO TERMINALIOS5†DC.Wƒ0’FUNCTION�(DYNAMIC)ŠDC.Wƒ0’OPTIONS‚(DYNAMIC)ŠDC.Bƒ0’STATUS ŠDC.Bƒ5’LUNŠDC.Wƒ0’RESERVEDŠDC.Lƒ0’RANDOM�RECORD�NUMBERŠDC.Lƒ0’BUFFER�STARTŠDC.Lƒ0’BUUFFER�ENDŠDC.Lƒ0’LENGTH�OF�TRANSFERŠDC.Lƒ0’COMPLETION�ADDRESS*F* IOS PARAMETER BLOCK TO PERFORM READ/WRITE WITH WAIT TO TERMINAL PORTIOS5W…DC.Wƒ0’FUNCTION�(DYNAMIC)ŠDC.Wƒ0’OPTIONS‚(DYNAMIC)ŠDC.Bƒ0’STATUS ŠDC.Bƒ5’LUNŠDC.Wƒ0’RESERVEDŠDC.Lƒ0’RANDOM�RECORD�NUMBERŠDC.Lƒ0’BUFFER�STARTŠDC.Lƒ0’BUUFFER�ENDŠDC.Lƒ0’LENGTH�OF�TRANSFERŠDC.Lƒ0’COMPLETION�ADDRESS*5* PARAMETER BLOCK TO HALT I/O ON LU 5 (HOME TERMINAL)$IOS5H…DC.Wƒ$0110ŽFUNCTION�(HALT�I/O)ŠDC.Wƒ0’OPTIONSŠDC.Bƒ$FF�STATUS ŠDC.Bƒ5’LUNŠDC.Wƒ0’RESERVEDŠDC.Lƒ0’RANDOM�RECORD�NUMBERŠDC.Lƒ0’BUFFER�STARTŠDC.Lƒ0’BUUFFER�ENDŠDC.Lƒ0’LENGTH�OF�TRANSFERŠDC.Lƒ0’COMPLETION�ADDRESS*ŠDC.Wƒ0’HALT�SYNC�COUNTER*:* IOS PARAMETER BLOCK TO DISPLAY ERROR/TRANSPARENT MESSAGEIOS6†DC.Wƒ0’FUNCTION�(DYNAMIC)ŠDC.Wƒ0’OPTIONS‚(DYNAMIC)ŠDC.Bƒ0’STATUS ŠDC.Bƒ6’LUNŠDC.Wƒ0’RESERVEDŠDC.Lƒ0’RANDOM�RECORD�NUMBERŠDC.Lƒ0’BUFFER�STARTŠDC.Lƒ0’BUUFFER�ENDŠDC.Lƒ0’LENGTH�OF�TRANSFERŠDC.Lƒ0’COMPLETION�ADDRESS*0* PARAMETER BLOCK TO GIVE EVENT AFTER TIME DELAYTIM1†DC.Lƒ'TRAN'�TASK�NAME#ŠDC.Lƒ0’SESSION�(N/A�FOR�USER�TASK)(ŠDC.Wƒ1<<13ŽEVENT�TO�DEFAULT�ASR�ADDRESSŠDC.Lƒ01ŠDC.Lƒ2*1000�TIME�INTERVAL�(DYNAMICALLY�MODIFIED)TSVC†DC.Lƒ0’SERVICE�ADDRESS*!* PARAMETER BLOCK TO ALLOCATE ASQASQ1†DC.Lƒ'TRAN'�TASK�NAME(ŠDC.Lƒ0’SESSION�CODE�(N/A�FOR�USER�TASK)$ŠDC.Bƒ8’DISABLE�REG�STACKING,ASR,ASQ#ŠDC.Bƒ20‘LONGEST�MESSAGE�ACCEPTABLE ŠDC.Lƒ$100�QUEUE�LENGTH�IF�BYTES,ŠDC.Lƒ0’ALTERNATE�SERVICE�ADDRESS�(NOT�USED)$ŠDC.Lƒ0’ASR�RECEIVING�AREA�(DYNAMIC)** ASR RECEIVING AREAASQBUFFƒDS.Bƒ20** FLAGSTRANFLGƒDC.Wƒ0TBSY†EQU„0’TERMINAL�BUFFER�BUSYTPND†EQU„1’TERMINAL�I/O�PENDING)TIN‡EQU„2’TERMINAL�INPUT�IN�PROGRESS�FLAG%LBLK†EQU„3’LAST�BLOCK�FLAG�FOR�UPLOADTFLG†EQU„4’'T'�KEYED�IN�FLAGCTLA†EQU„5’CONTROL-A�MODE** WORKING BUFFER5TERMLGHƒDC.Lƒ0’LENGTH�OF�STRING�IN�TERM�OUTPUT�BUFFER(TPTR†DC.Lƒ0’POINTER�INTO�TERMINAL�BUFFER TBUF†EQU„*ŠDS.BƒBLKLGH*10** RECORD BUFFER FOR DOWNLOAD$RLGH†DS.Lƒ1’LENGTH�OF�RECORD�IN�RBUFRPTR†DS.Lƒ1’POINTER�INTO�RBUFRBUF†DS.BƒRMAX*F* RECORD BUFFER FOR UPLOAD STAGING TO DISPLAY RECORDS ON HOME TERMINAL'USTAGELƒDC.Lƒ0’LENGTH�OF�DATA�IN�BUFFERUSTAGE„DS.BƒRMAX�BUFFER** INPUT BUFFERS$BUFF1S„DS.BƒBLKLGH�HOST�INPUT�BUFFERBUFF1E„EQU„*-1*%BUFF5S„DS.Bƒ$80�TERMINAL�INPUT�BUFFERBUFF5E„EQU„*-1* * MESSAG) ES CLERRS„DC.Bƒ'COMMAND�LINE�ERROR'CLERRE„EQU„*-1ŠDS…0*!OPTERRSƒDC.Bƒ'OPTION�FIELD�ERROR'OPTERREƒEQU„*-1ŠDS…0*"FHSERRSƒDC.Bƒ'XX‚FHS�ERROR,�LUN�='FHSERLUN‚DC.Bƒ'X�'FHSERREƒEQU„*-1ŠDS…0*"IOSERRSƒDC.Bƒ'XX‚IOS�ERROR,�LUN�='IOSERLUN‚DC.Bƒ'X�'IOSERREƒEQU„*-1ŠDS…0*ŠPAGE%************************************** DRIVING ROUTINE* XFR‡EQU„*#ŠLEA„STACK(PC),A7‡SET�STACK�POINTERŠBSR.S‚INIT�INITIALIZE'XFR2†BSR„TRANSP�INVOKE�TRANSPARENT�MODE#ŠBSR„UPDN�GO�HANDLE�UPLOAD/DOWNLOADŠBRA„XFR2�GO�HANDLE�NEXT�FILE*!XFRTERMƒMOVE.L�#TERM,D0‹TERMINATEŠTRAPƒ#1ŠPAGE%*************************************** INITIALIZATION* INIT†EQU„*-ŠLEA„A(PC),A6‹USE�A6�AS�BASE�ADDRESS�REGISTER1ŠMOVEM.L�D0-D7,INITREGS-A(A6)�SAVE�INITIAL�D-REGS%ŠMOVE.L�A0,TIM1-A(A6)†PLUG�IN�TASK�ID%ŠMOVE.L�A0,ASQ1-A(A6)†PLUG�IN�TASK�ID*:* CHANGE ACCESS PERMISSION FOR UNIT 5 TO PUBLIC READ/WRITEŠLEA„FHS5-A(A6),A0ŠTRAPƒ#3 ŠBEQ.S‚INIT05 ŠBSR„FHSERR ŠBSR„XABORT** PARSE THE COMMAND LINEINIT05„LEA„CLINE-A(A6),A0 ŠBSR„PARSE ŠTST.L‚D0.ŠBPL.S‚INIT20�BRANCH�IF�COMMAND�LINE�OK�SO�FAR9INIT10„LEA„CLERRS-A(A6),A1„COMPLAIN�OF�COMMAND�LINE�ERRORŠLEA„CLERRE-A(A6),A2INIT15„BSR„MSGOUTŠBRA.S‚XFRTERMŒGO�TERMINATE*F* FILL DEVICE MNEMONIC INTO ASSIGN P.B. (IF INPUT FIELD WAS SPECIFIED) INIT20„EQU„*9ŠMOVEM.L�A1-A2,PARSAREG-A(A6)�SAVE�RETURN�REGS�FROM�PARSEŠSWAPƒD0'ŠCMP.B‚#$40,D0ŒWAS�THERE�AN�INPUT�FIELD0ŠBEQ.S‚INIT25�BRANCH�IF�NO�-�MNEMONIC�ALREADY�IN+ŠLEA„CLINE-A(A6),A0…ADDRESS�OF�COMMAND�LINEŠLEA„FHS1-A(A6),A6'ŠBSR„EDITFILE‹PLACE�MNEMONIC�INTO�FIELD0ŠBPL.S‚INIT25�BRANCH�IF�NO�ERROR�IN�COMMAND�LINE#ŠLEA„A(PC),A6‹RESTORE�BASE�REGISTER+ŠBRA„INIT10�GO�COMPLAIN�OF�BAD�COMMAND�LINE** ASSIGN THE HOST PORT-INIT25„LEA„A(PC),A6‹REESTABLISH�BASE�REGISTER6ŠMOVE.W�USERNUM+2-A(A6),FHS1+$C-A(A6)�PLUG�USER�NUMBER1ŠMOVE.L�CATNAM-A(A6),FHS1+$C-A(A6)„CATALOGUE�NAME&ŠMOVE.L�CATNAM+4-A(A6),FHS1+$C+4-A(A6)ŠLEA„FHS1-A(A6),A0ŠTRAPƒ#3‘ASSIGN�DEVICE#ŠBEQ.S‚INIT28�BRANCH�ON�GOOD�ASSIGN ŠBSR„FHSERR ŠBRA„INIT15*%* ALLOCATE ASYNCHRONOUS SERVICE QUEUEINIT28„LEA„ASQ1-A(A6),A0ŠLEA„ASQBUFF-A(A6),A1%ŠMOVE.L�A1,18(A0)ŠPLUG�IN�ASQ�ADDRESSŠMOVE.L�#GTASQ,D0ŠTRAPƒ#1$ŠBSR„XFRABORT‹ABORT�IF�CAN'T�GET�ASQ* * CLAIM BREAK SERVICE FOR DEVICE&ŠLEA„IOS5-A(A6),A0†ADDRESS�OF�IOS�P.B.+ŠMOVE.L�#$01200200,(A0)„CLAIM�BREAK�SERVICEŠLEA„BREAKSV-A(A6),A1ŠMOVE.L�A1,24(A0)ŠTRAPƒ#2 ŠBSR„XFRABORT*#* SET FLAG BITS FOR OPTIONS PRESENT*ƒLEGAL�OPTIONS�ARE:9*‰B†TRUNCATE�TRAILING�BLANKS�FROM�ALL�TRANSFERRED�RECORDS*‰C†USE�CHECKSUMS"*‰D†ECHO�DATA�AS�IT�IS�TRANSFERRED*‰H†HALF�DUPLEX�MODE** DEFAULTS ARE B,-D,C,H*4ŠMOVE.L�PARSAREG+4-A(A6),A2�ADDRESS�OF�OPTIONS�FIELDŠLEA„OPTIONS-A(A6),A5INIT42„MOVE.L�A2,D0,ŠBEQ.S‚INIT50�BRANCH�IF�NO�OPTIONS�SPECIFIED ŠBSR„OPTION1ŠCMP.B‚#$40,D0ŒHAVE�WE�FINISHED�SCANNING�OPTIONS?ŠBEQ.S‚INIT50�BRANCH�IF�YES ŠMOVE.L�#7,D0INIT44„CMP.B‚#'�',0(A5,D0) ŠBNE.S‚INIT480ŠLEA„OPTERRS-A(A6),A1ƒCOMPLAIN�OF�ILLEGAL�OPTIONŠLEA„OPTERRE-A(A6),A2 ŠBSR„MSGOUT ŠBRA„XFRTERMINIT48„CMP.B‚0(A5,D0),D1ŠDBEQƒD0,INIT44 ŠSUB.L‚#7,D0-ŠNEG.L‚D0‘D0�CONTAINS�NUMBER�OF�FLAG�POSITION%ŠBSETƒD0,OPTFLG-A(A6)„SET�OPTION�FLAG)ŠCMP.B‚#'C',D1ŒWAS�THIS�A�CHECKSUM�OPTIONŠBNE.S‚INIT49�BRANCH�IF�NOŠCMP.L‚REP1-A(A6),D3 ŠBLS.S‚INIT49;ŠMOVE.L�D3,REP1-A(A6)†MAKE�REPETITION�FACTOR�MATCH�THAT�...2ŠMOVE.L�D3,REP2-A(A6)†...�SPECIFIED�ON�'C='�OPTIONINIT49„TST.L‚D1 ŠBPL„INIT425ŠBCLRƒD0,OPTFLG-A(A6)„OPTION�SPECIFIED�WITH�MINUS�'-' ŠBRA„INIT42** PUT OUT VERSION MESSAGE INIT50„EQU„*ŠBSR„LF6ŠLEA„VMSGS-A(A6),A1ŠLEA„VMSGE-A(A6),A2 ŠBSR„MSGOUTŠBSR„LF6*ŠRTSŠPAGE%************************************** ESTABLISH TRANSPARENT MODE* PREAM…DC.Lƒ8ŠDC.Bƒ'PREAMBLE'‰KEYIN�TO�RTSŠDS…0*KTRANMS DC.B '** TRANSPARENT MODE - TYPE CONTROL-A TO TERMINATE PROGRAM'TRANME„EQU„*-1ŠDS…0* TRANSP„EQU„**6* SET UP SERVICE ADDRESSES I* N VARIOUS PARAMETER BLOCKSŠLEA„HOSTIO-A(A6),A0ŠMOVE.L�A0,IOS1+24-A(A6)ŠLEA„TERMIO-A(A6),A0ŠMOVE.L�A0,IOS5+24-A(A6)ŠLEA„TIMEV-A(A6),A0ŠMOVE.L�A0,TSVC-A(A6)*ŠLEA„TRANMS-A(A6),A1ŠLEA„TRANME-A(A6),A2)ŠBSR„MSGOUT�TELL�THEM�OF�TRANSPARENT�MODE*>* PERFORM INPUT I/O AND PROCEED ON TERMINAL PORT AND HOST PORT1ŠBTSTƒ#H,OPTFLG-A(A6)„ARE�WE�IN�HALF�DUPLEX�MODE?ŠBNE.S‚TRANS04ŒBRANCH�IF�YES-ŠBSR„INPP5C�INPUT�ONE�CHARACTER�FROM�TERMINALŠBRA.S‚TRANS05.TRANS04ƒBSR„INPP5ŽINPUT�ONE�LINE�FROM�TERMINALTRANS05ƒBSR„INPP1ŽHOST�PORT** ENABLE ASQ AND WAIT FOR EVENTTRANSRTN‚EQU„*4ŠMOVE.L�A7,SAVSTACK-A(A6)‚SAVE�CURRENT�STACK�POINTER!ŠMOVE.L�#WTEVNT,D0‰ENABLE�ASQ,ASRŠTRAPƒ#1*J* IN CASE OF TIMEOUT EVENT, PERFORM INPUT I/O AND PROCEED ON TERMINAL PORT)*ƒAND�GO�BACK�AND�WAIT�FOR�ANOTHER�EVENT.* TIMEV…EQU„*/ŠMOVE.L�SAVSTACK-A(A6),A7‚RESTORE�STACK�POINTER ŠBSR„ASQREAD%ŠLEA„TIM1-A(A6),A0†ADDR�OF�TIMER�P.B.&ŠCLR.W‚8(A0)ŽCLEAR�PERIODIC�ACTIVATIONŠMOVE.L�#RQSTPA,D0ŠTRAPƒ#12ŠBTSTƒ#TBSY,TRANFLG-A(A6)�IS�TERMINAL�BUFFER�BUSY?5ŠBNE„TRANS48ŒBRANCH�IF�YES�-�QUEUE�ANOTHER�TIME�EVENT.ŠBTSTƒ#H,OPTFLG-A(A6)„NO�-�IS�HALF�DUPLEX�SET?ŠBNE.S‚TRANS07ŒBRANCH�IF�YES-ŠBSR„INPP5C�ONPUT�ONE�CHARACTER�FROM�TERMINALŠBRA.S‚TRANS09.TRANS07ƒBSR„INPP5ŽINPUT�ONE�LINE�FROM�TERMINALTRANS09ƒBRA„TRANSRTN*'* IN CASE OF BREAK EVENT, TERMINATE !!! BREAKSVƒEQU„*/ŠMOVE.L�SAVSTACK-A(A6),A7‚RESTORE�STACK�POINTER(BREAKSV2‚BSR„HALT1ŽHALT�I/O�ON�HOST�PORTŠBEQ.S‚BREAKSV2BREAKSV4‚BSR„HALT5ŠBEQ.S‚BREAKSV4ŠBRA„XFRTERMŒGO�TERMINATE*'* EVENT WAS I/O COMPLETION ON HOST PORT HOSTIO„EQU„*7ŠMOVE.L�SAVSTACK-A(A6),A7‚RESTORE�CURRENT�STACK�POINTERŠBSR„ASQREADŒREAD�THE�EVENTŠLEA„IOS1H-A(A6),A0ŠBSR„HLTCHK�CHECK�FOR�HALT�I/OŠBEQ„TRANSRTN‹BRANCH�IF�YES*ŠLEA„IOS1-A(A6),A0ŠCMP.B‚#$EA,4(A0)(ŠBEQ.S‚TRANS12ŒDON'T�COMPLAIN�ON�OVERRUN ŠBSR„IOERCHKŒCHECK�FOR�I/O�ERROR3TRANS12ƒCMP.W‚#$0002,(A0)ˆSEE�IF�FROM�WRITE�REQUESTŠBEQ.S‚TRANS55ŒBRANCH�IF�YES*3* EVENT WAS FROM INPUT OR OUTPUT WITH INPUT REQUEST/ŠBTSTƒ#2,IOS1+1-A(A6)„WAS�IT�OUTPUT�WITH�INPUT?ŠBEQ.S‚TRANS16ŒBRANCH�IF�NO;ŠMOVE.L�IOS1+8-A(A6),IOS1+12-A(A6)�CORRECT�STARTING�ADDRESS9TRANS16ƒBTSTƒ#TBSY,TRANFLG-A(A6)�IS�TERMINAL�BUFFER�FREE?ŠBEQ.S‚TRANS20ŒBRANCH�IF�YES7ŠBSETƒ#TPND,TRANFLG-A(A6)�SET�TERMINAL�I/O�PENDING�FLAGŠBRA„TRANSRTN‹RETURN�FROM�EVENT*1TRANS20ƒLEA„TBUF-A(A6),A3†ADDRESS�TO�MOVE�DATA�TO0ŠBSR„EDITMOV1‹MOVE�DATA�TO�WORKING�OUTPUT�BUFFERŠBSR„PREACHKŒSEE�IF�'PREAMBLE'ŠBEQ„TRANNXTŒBRANCH�IF�YES)ŠBSR„INPP1ŽINPUT�AND�PROCEED�ON�HOST�PORT6ŠTST.L‚TERMLGH-A(A6)†LENGTH�OF�DATA�IN�TERMINAL�BUFFER*ŠBEQ.S‚TRANS52ŒBRANCH�IF�NO�DATA�TO�OUTPUTŠBSR„HALT5ŽHALT�I/O�ON�TERMINAL7ŠBSETƒ#TBSY,TRANFLG-A(A6)�MARK�TERMINAL�BUFFER�NOT�FREE7ŠBTSTƒ#TIN,TRANFLG-A(A6)�ARE�WE�IN�TERMINAL�INPUT�MODE?ŠBNE.S‚TRANS50ŒBRANCH�IF�YES*ŠBSR„OUTP5F�OUTPUT�AND�PROCEED�TO�TERMINAL*=* SET TIMER TO ACTIVATE US A LITTLE LATER ONLY IF NOT ECHOING/TRANS48ƒLEA„TIM1-A(A6),A0†TIMER�PARAMETER�BLOCK;ŠMOVE.W�#$7000,8(A0)‡INTERVAL�ACTIVATION�AT�SPC.�SVC.�ADDR.ŠMOVE.L�#RQSTPA,D0ŠTRAPƒ#1 ŠBSR„XFRABORT+ŠBRA.S‚TRANS52ŒGO�RETURN�FROM�EVENT�SERVICE** OUTPUT TO TERMINAL (IMAGE)/TRANS50ƒBSR„OUTW5I�OUTPUT�CHARACTER�TO�TERMINAL2ŠBCLRƒ#TBSY,TRANFLG-A(A6)�CLEAR�TERMINAL�BUSY�FLAG<ŠTST.W‚IOS5H+28-A(A6)…WAS�ANY�ACTIVE�I/O�HALTED�ON�TERMINAL?9ŠBEQ.S‚TRANS52ŒBRANCH�IF�NO�-�HAVE�I/O�COMPLETION�ALREADY,ŠBSR„INPP5C�YES�SO�TAKE�IN�ANOTHER�CHARACTERTRANS52ƒBRA„TRANSRTN*(* EVENT WAS OUTPUT COMPLETE TO HOST PORT-TRANS55ƒBSR„INPP1ŽINPUT�AND�PROCEED�FROM�HOST ŠBRA„TRANSRTN*+* EVENT WAS I/O COMPLETION ON TERMINAL PORT TERMIO„EQU„*/ŠMOVE.L�SAVSTACK-A(A6),A7‚RESTORE�STACK�POINTERŠBSR„ASQREADŒREAD�THE�EVENTŠLEA„IOS5H-A(A6),A0%ŠBSR„HLTCHK�WAS�THIS�FROM�A�HALT�I/O?ŠBEQ„TRANSRTN‹BRANCH�IF�YES*ŠLEA„IOS5-A(A6),A0 ŠBSR„IOERCHK,ŠCMP.W‚#$0002,(A0)ˆSEE�IF�FROM�WRITE�REQUESTŠBEQ.S‚TRANS80ŒBRANCH�IF�YES*-* EVENT WAS INPUT COMPLETION ON TERMINAL POR* T3ŠBTSTƒ#CTLA,TRANFLG-A(A6)�ARE�WE�IN�CONTROL-A�MODE?ŠBNE.S‚TRANS63ŒBRANCH�IF�YES1ŠCMP.B‚#CNTL.A,BUFF5S-A(A6)�WAS�THIS�A�CONTROL�A?ŠBNE.S‚TRANS60ŒBRANCH�IF�NO1ŠBSETƒ#CTLA,TRANFLG-A(A6)�SET�CONTROL�A�MODE�FLAGŠBRA.S‚TRANS637TRANS60ƒBSETƒ#TIN,TRANFLG-A(A6)�SET�TERMINAL�INPUT�FLAG ŠBSR„HALT1ŽHALT�I/O�ON�HOST�PORT0TRANS63ƒBTSTƒ#H,OPTFLG-A(A6)„IS�HALF�DUPLEX�SET?+ŠBNE.S‚TRANS70ŒYES�-�GO�OUTPUT�LINE�TO�HOST7ŠCMP.B‚#$0D,BUFF5S-A(A6)‚WAS�A�CARRIAGE�RETURN�ENTERED?ŠBEQ.S‚TRANS70ŒBRANCH�IF�YES2ŠBTSTƒ#CTLA,TRANFLG-A(A6)�ARE�WE�IN�CONTROL-A�MODEŠBNE.S‚TRANS66ŒBRANCH�IF�YES4ŠBSR„OIP1CŽNO�SO�GIVE�HOST�CHAR�ON�OUTPUT�WITH�INPUT.TRANS66ƒBSR„INPP5C�ASK�FOR�NEXT�TERMINAL�INPUTŠBRA.S‚TRANS88*:TRANS70ƒBCLRƒ#CTLA,TRANFLG-A(A6)�ARE�WE�IN�CONTROL�A�MODE?)ŠBNE„BREAKSVŒBRANCH�IF�YES�-�GO�TERMINATE(ŠBSR„OIP15ŽOUTPUT�THE�LINE�OR�CR�TO�HOSTŠBCLRƒ#TIN,TRANFLG-A(A6) ŠBRA„TRANS48*.* EVENT WAS OUTPUT COMPLETION ON TERMINAL PORT5TRANS80ƒBTSTƒ#TPND,TRANFLG-A(A6)�IS�PENDING�FLAG�SET?ŠBNE.S‚TRANS86ŒBRANCH�IF�YES8ŠBCLRƒ#TBSY,TRANFLG-A(A6)�NO�SO�CLEAR�TERMINAL�BUSY�FLAGŠBRA.S‚TRANS88*1TRANS86ƒLEA„TBUF-A(A6),A3†ADDRESS�TO�MOVE�DATA�TO)ŠBSR„EDITMOV1‹MOVE�DATA�TO�WORKING�BUFFERŠBSR„PREACHKŒSEE�IF�'PREAMBLE'ŠBEQ.S‚TRANNXTŒBRANCH�IF�YES$ŠBSR„INPP1ŽINPUT�AND�PROCEED�ON�HOST*ŠBSR„OUTP5F�OUTPUT�AND�PROCEED�TO�TERMINAL,ŠBCLRƒ#TPND,TRANFLG-A(A6)�CLEAR�PENDING�FLAGTRANS88ƒBRA„TRANSRTN%*************************************1* TRANNXT IS BRANCHED TO AFTER READING 'PREAMBLE'/*ƒFROM�THE�HOST.‚HALTS�ALL�I/O�ON�LU�1�AND�LU�5/*ƒUNITS,�DELAYS�2�SECONDS,�READS�THE�ASQ�OF�ALL*ƒEVENTS,�AND�PERFORMS�AN�RTS.* TRANNXTƒEQU„* ŠBSR„HALT1ŽHALT�I/O�ON�HOST�PORTŠBEQ.S‚TRANNXT,TRANNXT2‚BSR„HALT5ŽHALT�I/O�ON�TERMINAL�PORTŠBEQ.S‚TRANNXT2ŠMOVE.L�#DELAY,D0ŠMOVE.L�#2000,A0ŠTRAPƒ#1‘DELAY�2�SECONDSTRANNXT4‚BSR„ASQREADŒFLUSH�ASQŠTST.B‚ASQBUFF-A(A6) ŠBNE„TRANNXT4.ŠCLR.W‚IOS1H+28-A(A6)…INDICATE�HALT�EVENT�READ.ŠCLR.W‚IOS5H+28-A(A6)…INDICATE�HALT�EVENT�READŠRTS*ŠPAGE%*************************************#* INITIATE UPLOAD/DOWNLOAD SEQUENCE* UPDN†EQU„**(* INITIALIZE VARIABLES FROM THE PREAMBLE8ŠMOVE.B�TBUF+9-A(A6),COMOPT-A(A6)�COM�OPTION/CHAR�OPTION9ŠMOVE.B�TBUF+10-A(A6),CHROPT-A(A6)�CHAR�CONVERSION�OPTION2ŠLEA„TBUF+11-A(A6),A1ƒADDRESS�OF�CHARS/BLOCK�FIELDŠMOVE.L�#3,D1Ž#CHARS�IN�FIELD"ŠBSR„ASCDBINŒBINARY�TO�ASCII�IN�D06ŠMOVE.W�D0,CHRBLK+2-A(A6)‚SET�UP�NUMBER�OF�CHARS/BLOCK7ŠLEA„TBUF+14-A(A6),A1ƒADDRESS�OF�#BLOCKS/CHECKSUM�FIELDŠMOVE.L�#1,D1Ž#CHARS�IN�FIELD"ŠBSR„ASCDBINŒBINARY�TO�ASCII�IN�D0:ŠMOVE.W�D0,BLKSUM+2-A(A6)‚SET�UP�NUMBER�OF�BLOCKS/CHECKSUMŠMULUƒCHRBLK+2-A(A6),D06ŠMOVE.L�D0,CHRNUM-A(A6)„NUMBER�OF�CHARACTERS�PER�FRAMEŠLEA„TBUF-A(A6),A0 ŠADD.L‚A0,D0.ŠSUB.L‚#1,D0ŽFRAME�LIMIT�ADDRESS�OFF�FROM�TBUFŠMOVE.L�D0,BLKCMAX-A(A6)** CLOSE ANY ASSIGNMENT TO LU 4ŠLEA„FHS4-A(A6),A0ŠMOVE.L�#$00040000,(A0)ŠTRAPƒ#3** INITIALIZE FRAME VARIABLES ŠBSR„DLINITF*ŠCLR.W‚TRANFLG-A(A6)ŠBTSTƒ#B,OPTFLG-A(A6) ŠBEQ.S‚UPDN10=ŠMOVE.B�#'B',RESPONSE+1-A(A6)‚FLAG�TRAILING�BLANK�SUPPRESSION*/* BRANCH TO APPROPRIATE UPLOAD/DOWNLOAD ROUTINEUPDN10„CMP.B‚#'U',TBUF+8-A(A6) ŠBEQ„UPLOADŠCMP.B‚#'D',TBUF+8-A(A6) ŠBEQ„DOWNLOAD ŠBSR„XFRABORT%************************************** DOWNLOAD SEQUENCE*!DLOADMSƒDC.Bƒ'DOWNLOAD�INITIATED'DLOADMEƒEQU„*-1ŠDS…0*JREVMS DC.B 'ENTER RECEIVING FILE NAME OR ''Q'' TO RESUME TRANSPARENT MODE' REVME…EQU„*-1ŠDS…0*RDONS…DC.Bƒ'RECORD�DISPLAY�ON' RDONE…EQU„*-1ŠDS…0*RDOFS…DC.Bƒ'RECORD�DISPLAY�OFF' RDOFE…EQU„*-1ŠDS…0*"BADCCS„DC.Bƒ'BAD�CHARACTER�COUNT‚'BADCCR„DC.Bƒ'…RECEIVED�'(BADCCT„DC.Bƒ'…EXPECTED�-�RETRANSMITTING'BADCCE„EQU„*-1ŠDS…0*BADCSS„DC.Bƒ'BAD�CHECKSUMƒ'BADCSR„DC.Bƒ'…RECEIVED�'(BADCST„DC.Bƒ'…EXPECTED‚-�RETRANSMITTING'BADCSE„EQU„*-1ŠDS…0*4DTERMS„DC.Bƒ'DOWNLOAD�TERMINATED�WITH�''T''�KEY-IN�'(DTERMN„DC.Bƒ'XXXXXX�RECORDS�TRANSFERRED'DTERME„EQU„*-1ŠDS…0*!DDONES„DC.Bƒ'DOWNLOAD�COMPLETED‚'(DDONEN„DC.Bƒ'XXXXXX�RECORDS�TRANSFERRED'DD+ ONEE„EQU„*-1ŠDS…0*BFORCMS„DC.Bƒ'**************�FORCING�CHECKSUM�MATCH�**************'FORCME„EQU„*-1ŠDS…0*7DOWNLOAD‚LEA„REVMS-A(A6),A1…ASK�FOR�RECEIVING�FILE�NAMEŠLEA„REVME-A(A6),A2 ŠBSR„MSGOUT*ŠBSR„INPW5ŽTAKE�THE�INPUT�(INPUT�AND�WAIT)*(ŠBSR„ASGFLD�GO�ASSIGN�THE�FILE�TO�LUN�#4&ŠBEQ.S‚DL00�BRANCH�IF�'Q'�NOT�KEYED�IN*ŠMOVE.B�#'T',D0ŒTERMINATION�ACKNOWLEDGMENT!ŠBSR„RESPOND2‹SEND�IT�TO�THE�HOST ŠBRA„QUITUPDN* DL00†BSR„LF65ŠLEA„DLOADMS-A(A6),A1ƒTELL�THEM�DOWNLOAD�IS�INITIATEDŠLEA„DLOADME-A(A6),A2 ŠBSR„MSGOUT**ŠBSR„IMSG�TELL�THEM�OF�INTERACTIVE�OPTIONS.ŠCLR.L‚IOS4+8-A(A6)‡CLEAR�RANDOM�RECORD�NUMBER*2* PLACE COMPLETION ADDRESSES INTO PARAMETER BLOCKSŠLEA„DHIO-A(A6),A0ŠMOVE.L�A0,IOS1+24-A(A6)ŠLEA„DTIO-A(A6),A0ŠMOVE.L�A0,IOS5+24-A(A6)*!* INITIALIZE RECORD POINTERS ETC.ŠLEA„RBUF-A(A6),A06ŠMOVE.L�A0,RPTR-A(A6)†INITIALIZE�RECORD�BUFFER�POINTERŠLEA„DPIN-A(A6),A0>ŠMOVEM.L�D0-D7/A0-A5,DPSAV-A(A6)�SAVE�PROCESSING�INPUT�ADDRESS*2ŠCMP.B‚#'B',COMOPT-A(A6)‚'B'�COMMUNICATION�OPTION?ŠBNE.S‚DL02�BRANCH�IF�NO ŠBSR„WAITDC1*DL02†MOVE.B�#'N',D0.ŠBSR„RESPOND1‹RESPOND�TO�PREAMBLE�WITH�'NEXT?')ŠBSR„INPP5C�INPUT�AND�PROCEED�ON�TERMINAL** WAIT FOR EVENT DLWAIT„EQU„*,ŠMOVE.L�A7,SAVSTACK-A(A6)‚SAVE�STACK�POINTERŠMOVE.L�#WTEVNT,D0(ŠTRAPƒ#1‘WAIT�FOR�HOST�OR�TERMINAL�INPUT*)* EVENT WAS I/O COMPLETION FROM HOST PORT DHIO†EQU„*/ŠMOVE.L�SAVSTACK-A(A6),A7‚RESTORE�STACK�POINTERŠBSR„ASQREADŒREAD�THE�EVENTŠLEA„IOS1H-A(A6),A0%ŠBSR„HLTCHK�WAS�THIS�FROM�A�HALT�I/O?ŠBEQ„DLWAIT�BRANCH�IF�YES*ŠLEA„IOS1-A(A6),A0+ŠCMP.B‚#$EA,4(A0)‰DON'T�COMPLAIN�ON�OVERRUN ŠBEQ.S‚DL10 ŠBSR„IOERCHKŒCHECK�FOR�I/O�ERROR0DL10†CMP.W‚#$0002,(A0)ˆSEE�IF�FROM�WRITE�REQUESTŠBEQ„DL500ŽBRANCH�IF�YES*)* EVENT WAS INPUT COMPLETION ON HOST PORT/ŠBTSTƒ#2,IOS1+1-A(A6)„WAS�IT�OUTPUT�WITH�INPUT?ŠBEQ.S‚DL40�BRANCH�IF�NO;ŠMOVE.L�IOS1+8-A(A6),IOS1+12-A(A6)�CORRECT�STARTING�ADDRESS/ŠBTSTƒ#H,OPTFLG-A(A6)„IS�THIS�JUST�AN�ACK�ECHO?,ŠBEQ.S‚DL45�BRANCH�IF�YES,�PUT�UP�READ�AGAIN*DL40†LEA„TBUF-A(A6),A3,ŠADD.L‚WLGH-A(A6),A3†ADDRESS�TO�MOVE�DATA�TO)ŠBSR„EDITMOV1‹MOVE�DATA�TO�WORKING�BUFFER5ŠADD.L‚#1,BLKRED-A(A6)„BUMP�#BLOCKS�READ�FOR�CHECKSUMŠMOVE.L�TERMLGH-A(A6),D0ŠLEA„TBUF-A(A6),A2?ŠADD.L‚WLGH-A(A6),A2†POINT�A2�TO�FIRST�BYTE�OF�LAST�MOVED�BLOCK6DL42†CMP.L‚CHRBLK-A(A6),D0„DID�WE�FILL�THE�FULL�BLOCK?ŠBHS.S‚DL43�BRANCH�IF�YES0ŠMOVE.B�#'�',0(A2,D0)†FORCE�BLANKS�TO�FULL�BLOCK ŠADD.L‚#1,D0 ŠBRA„DL42DL43†ADD.L‚WLGH-A(A6),A27ŠADD.L‚D0,WLGH-A(A6)†BUMP�DATA�LENGTH�IN�WORKING�BUFFERŠMOVE.L�BLKRED-A(A6),D0ŠCMP.L‚BLKSUM-A(A6),D0'ŠBHS.S‚DL60�BRANCH�IF�ENTIRE�FRAME�READ!DL45†BSR„INPP1ŽREAD�ANOTHER�BLOCKŠBRA„DLWAIT�GO�WAIT�FOR�EVENT*J* ENTIRE FRAME HAS BEEN RECEIVED - IF TERMINATE HAS BEEN KEYED IN, GET OUT9DL60†BTSTƒ#TFLG,TRANFLG-A(A6)�HAS�TERMINATE�BEEN�KEYED�INŠBEQ.S‚DL90�BRANCH�IF�NO*2ŠCMP.B‚#'B',COMOPT-A(A6)‚'B'�COMMUNICATION�OPTION?ŠBNE.S‚DL62�BRANCH�IF�NO ŠBSR„WAITDC1*DL62†MOVE.B�#'T',D0-ŠBSR„RESPOND2‹RESPOND�WITH�OUTPUT�AND�PROCEED ŠBRA„DLWAIT*A*�NO�TERMINATION�YET�-�VALIDATE�CHECKSUM.‚IF�BAD�CHECKSUM�ASK�FOR*ƒRETRANSMISSION?DL90†MOVE.L�CHRNUM-A(A6),D0„NUMBER�OF�CHARACTERS�WE�SHOULD�HAVEŠCMP.L‚WLGH-A(A6),D0)ŠBEQ.S‚DL100ŽBRANCH�IF�CHARACTER�COUNT�OK-ŠMOVE.L�#4,D1ŽCOMPLAIN�ON�BAD�CHARACTER�COUNTŠLEA„BADCCT-A(A6),A0-ŠBSR„BINDASCŒCONVERT�EXPECTED�CHARACTER�COUNTŠMOVE.L�WLGH-A(A6),D0ŠLEA„BADCCR-A(A6),A0-ŠBSR„BINDASCŒCONVERT�RECEIVED�CHARACTER�COUNTŠBSR„LF6ŠLEA„BADCCS-A(A6),A1ŠLEA„BADCCE-A(A6),A2*ŠBSR„MOUT�TELL�THEM�OF�BAD�CHARACTER�COUNT DL95†EQU„**2ŠCMP.B‚#'B',COMOPT-A(A6)‚'B'�COMMUNICATION�OPTION?ŠBNE.S‚DL97�BRANCH�IF�NO ŠBSR„WAITDC1*#DL97†MOVE.L�#DELAY,D0ŠWAIT�A�SECONDŠMOVE.L�#1000,A0ŠTRAPƒ#1ŠMOVE.B�#'R',D0)ŠBSR„RESPOND1‹RESPOND�/�OUTPUT�WITH�INPUT'ŠBSR„DLINITFŒINITIALIZE�FRAME�VARIABLES ŠBRA„DLWAIT*2DL100…BTSTƒ#C,OPTFLG-A(A6)„IS�CHECKSUM�OPTION�SET?ŠBEQ.S‚DL130ŽBRANCH�IF�NO'ŠLEA„TBUF-A(A6),A1†POINT�A1�+ TO�CHECKSUM.ŠMOVE.L�#2,D1ŽNUMBER�OF�CHARACTERS�IN�CHECKSUMŠBSR„ASCHBINŒCONVERT�TO�ASCIIŠTST.W‚D0‘IS�CHECKSUM�WILD?'ŠBEQ.S‚DL130ŽBRANCH�IF�YES�(0�CHECKSUM)3ŠMOVE.W�D0,-(A7)‹SAVE�CHECKSUM�FOR�LATER�COMPARISON6ŠLEA„TBUF+2-A(A6),A1„WHERE�TO�BEGIN�COMPUTING�CHECKSUM ŠMOVE.L�A1,A2ŠADD.L‚WLGH-A(A6),A2!ŠSUB.L‚#2,A2ŽEND�OF�DATA�+�1�BYTE ŠCLR.L‚D0 ŠCLR.L‚D16DL110…MOVE.B�(A1)+,D1‹ACCUMULATE�CHECKSUM�IN�THIS�LOOP ŠADD.L‚D1,D0 ŠCMP.L‚A1,A2-ŠBNE.S‚DL110ŽBRANCH�IF�MORE�CHARACTERS�TO�SUM ŠDIVUƒ#255,D0 ŠCLR.W‚D0ŠSWAPƒD0‘SUM�MOD�255�IN�D0.W$ŠADD.W‚#1,D0ŽINSURE�NONZERO�CHECKSUM ŠCLR.L‚D20ŠMOVE.W�(A7)+,D2‹CHECKSUM�SENT�FROM�OTHER�SYSTEMŠCMP.W‚D0,D2ŽSEE�IF�IT�MATCHESŠBEQ.S‚DL130ŽBRANCH�ON�MATCH+ŠBSR„NAKRPT�SEE�IF�RETRY�COUNT�IS�EXHAUSTEDŠBNE.S‚DL115ŽBRANCH�IF�NO-ŠLEA„FORCMS-A(A6),A1„TELL�OF�FORCING�CHECKSUMŠLEA„FORCME-A(A6),A2 ŠBSR„MOUT ŠBRA.S‚DL1300DL115…MOVE.L�#4,D1ŽCOMPLAIN�ON�CHECKSUM�MISMATCHŠLEA„BADCST-A(A6),A0 ŠBSR„BINDASC ŠMOVE.L�D2,D0ŠLEA„BADCSR-A(A6),A0 ŠBSR„BINDASCŠBSR„LF6ŠLEA„BADCSS-A(A6),A1ŠLEA„BADCSE-A(A6),A2%ŠBSR„MOUT�PUT�UP�BAD�CHECKSUM�MESSAGE$ŠBRA„DL95�GO�TELL�THEM�TO�RETRANSMIT*(* CHECKSUM MATCHES - GO PROCESS THE DATA?DL130…MOVE.L�REP2-A(A6),REP1-A(A6)�RESET�CHECKSUM�RETRY�COUNTERŠLEA„TBUF-A(A6),A0%ŠADD.L‚#3,A0ŽBYPASS�CHAR�AND�CHECKSUM,ŠMOVE.L�A0,TPTR-A(A6)†SAVE�POINTER�INTO�TBUFŠBSR„DPROCESS‹PROCESS�THE�DATAŠBEQ.S‚DL140ŽBRANCH�IF�DONE*,* COME HERE FOR FRAME PROCESSED SUCCESSFULLY6ŠCMP.B‚#'Z',TBUF+2-A(A6)‚HAS�THE�LAST�FRAME�BEEN�READ?ŠBEQ.S‚DL140ŽBRANCH�IF�YES*2ŠCMP.B‚#'B',COMOPT-A(A6)‚'B'�COMMUNICATION�OPTION?ŠBNE.S‚DL138ŽBRANCH�IF�NO ŠBSR„WAITDC1*DL138…MOVE.B�#'N',D0)ŠBSR„RESPOND1‹RESPOND�/�OUTPUT�WITH�INPUT&ŠBSR„DLINITFŒINITIALIZE�FOR�NEXT�FRAMEŠBRA„DLWAIT�GO�WAIT�FOR�NEXT* DL140…EQU„**2ŠCMP.B‚#'B',COMOPT-A(A6)‚'B'�COMMUNICATION�OPTION?ŠBNE.S‚DL148ŽBRANCH�IF�NO ŠBSR„WAITDC1*DL148…MOVE.B�#'T',D0-ŠBSR„RESPOND2‹RESPOND�WITH�OUTPUT�AND�PROCEED ŠBRA„DLWAIT*(* EVENT WAS OUTPUT COMPLETE ON HOST PORT DL500…EQU„*ŠBTSTƒ#TFLG,TRANFLG-A(A6)+ŠBNE.S‚DL550ŽBRANCH�IF�''T''�KEYIN�FLAG�SET** NORMAL TERMINATION)ŠMOVE.L�IOS4+8-A(A6),D0„NUMBER�TO�CONVERT-ŠMOVE.L�#6,D1ŽNUMBER�OF�CHARACTERS�TO�CONVERTŠLEA„DDONEN-A(A6),A0)ŠBSR„BINDASCŒCONVERT�TO�ASCII�FOR�DISPLAYŠBSR„LF6)ŠLEA„DDONES-A(A6),A1„'DOWNLOAD�COMPLETED'ŠLEA„DDONEE-A(A6),A2 ŠBSR„MOUT ŠBRA„QUITUPDN** TERMINATED BT 'T' KEYIN.DL550…MOVE.L�IOS4+8-A(A6),D0„NUMBER�TO�CONVERT-ŠMOVE.L�#6,D1ŽNUMBER�OF�CHARACTERS�TO�CONVERTŠLEA„DTERMN-A(A6),A0)ŠBSR„BINDASCŒCONVERT�TO�ASCII�FOR�DISPLAYŠBSR„LF6:ŠLEA„DTERMS-A(A6),A1„'DOWNLOAD�TERMINATED�WITH�'T'�KEY-IN'ŠLEA„DTERME-A(A6),A2 ŠBSR„MOUT ŠBRA„QUITUPDN*&* EVENT WAS I/O COMPLETION ON TERMINAL DTIO†EQU„*/ŠMOVE.L�SAVSTACK-A(A6),A7‚RESTORE�STACK�POINTERŠBSR„ASQREADŒREAD�THE�EVENTŠLEA„IOS5H-A(A6),A0%ŠBSR„HLTCHK�WAS�THIS�FROM�A�HALT�I/O?ŠBEQ„TRANSRTN‹BRANCH�IF�YES*ŠMOVE.B�BUFF5S-A(A6),D0ŠCMP.B‚#'T',D0'ŠBNE.S‚DL700ŽBRANCH�IF�NOT�A�'T'�KEY�IN-ŠBSETƒ#TFLG,TRANFLG-A(A6)�YES�-�FLAG�THE�FACT ŠBRA.S‚DL800*.DL700…CMP.B‚#'D',D0ŒWAS�KEYIN�A�'D'�(DISPLAY)? ŠBNE.S‚DL800)ŠBCHGƒ#D,OPTFLG-A(A6)„CHANGE�DISPLAY�FLAG1ŠBEQ.S‚DL750ŽBRANCH�IF�DISPLAY�WAS�PREVIOUSLY�OFFŠBSR„LF61ŠLEA„RDOFS-A(A6),A1…PUT�OUT�'DISPLAY�OFF�MESSAGE'ŠLEA„RDOFE-A(A6),A2 ŠBSR„MSGOUTŠBSR„LF6 ŠBRA.S‚DL800 DL750…BSR„LF60ŠLEA„RDONS-A(A6),A1…PUT�OUT�'DISPLAY�ON�MESSAGE'ŠLEA„RDONE-A(A6),A2 ŠBSR„MSGOUTŠBSR„LF6**DL800…BSR„INPP5C�TAKE�ANOTHER�CHARACTER�IN ŠBRA„DLWAIT%*************************************.* DLINITF INITIALIZES VARIABLES IN PREPARATION*ƒFOR�READING�NEXT�FRAME*6DLINITFƒCLR.L‚BLKRED-A(A6)‡CLEAR�NUMBER�OF�BLOCKS�READ,ŠLEA„TBUF-A(A6),A0†ADDRESS�OF�WORKING�BUFFER/ŠMOVE.L�A0,WBUF-A(A6)†ADDRESS�IN�WORKING�BUFFER'ŠCLR.L‚WLGH-A(A6)‰CLEAR�LENGTH�OF�FRAMEŠRTS%*************************************)* DPROCESS PROCESSES THE FRAME JUST READ.*ƒEXIT�CONDITION�CODES�ARE:5*ƒEQUAL�-�FRAME�PROCESSING�OK�(L, AST�RECORD�PROCESSED).*ƒPLUS‚-�FRAME�PROCESSING�OK�(NOT�LAST�RECORD)*DPROCESS‚EQU„*=ŠMOVEM.L�DPSAV-A(A6),D0-D7/A0-A5�PICK�UP�RESUME�REGISTERS�...ŠJMP„(A0)�...�AND�GO�THERE&DPIN†BSR„GETCHR�GET�1ST�CHAR�OF�LENGTH)ŠBEQ.S‚DL910ŽBRANCH�ON�CHARACTER�OBTAINED%ŠLEA„DPIN-A(A6),A0†NEED�ANOTHER�BLOCK6ŠMOVEM.L�D0-D7/A0-A5,DPSAV-A(A6)�SAVE�RESUME�REGISTERSŠBRA„DPEXOK�TAKE�OK�EXIT**DL910…CMP.B‚#'�',D0ŒSEE�IF�NO�MORE�RECORDS&ŠBEQ„DPEXENDŒBRANCH�IF�NO�MORE�RECORDS/ŠMOVE.B�D0,DLTEMP-A(A6)„SAVE�CHARACTER�OBTAINED'DL915…BSR„GETCHR�GET�2ND�CHAR�OF�LENGTH)ŠBEQ.S‚DL920ŽBRANCH�ON�CHARACTER�OBTAINED&ŠLEA„DL915-A(A6),A0…NEED�ANOTHER�BLOCK6ŠMOVEM.L�D0-D7/A0-A5,DPSAV-A(A6)�SAVE�RESUME�REGISTERS ŠBRA„DPEXOK*DL920…MOVE.B�D0,DLTEMP+1-A(A6)0ŠLEA„DLTEMP-A(A6),A1„CONVERT�ASCII�HEX�TO�BINARY-ŠMOVE.L�#2,D1ŽNUMBER�OF�CHARACTERS�TO�CONVERT ŠBSR„ASCHBIN(ŠMOVE.L�D0,RLGH-A(A6)†SAVE�RECORD�LENGTH*4* MOVE RECORD FROM TBUF TO RBUF - EXPANDING AS WE GO+ŠLEA„RBUF-A(A6),A3†ADDRESS�OF�RECORD�BUFFER ŠCLR.L‚D3‘'GET'�RELATIVE�COUNTER4ŠMOVE.L�RPTR-A(A6),D2†D2�=�POINTER�INTO�'PUT'�BUFFER ŠSUB.L‚A3,D2*6DL951…CMP.L‚RLGH-A(A6),D3†SEE�IF�WE'VE�MOVED�ALL�CHARSŠBHS.S‚DL1000�BRANCH�IF�YES*#DL960…BSR„GETCHR�GET�NEXT�CHARACTER*ŠBEQ.S‚DL962ŽBRANCH�IF�CHARACTER�AVAILABLE"ŠLEA„DL960-A(A6),A0…RESUME�ADDRESS6ŠMOVEM.L�D0-D7/A0-A5,DPSAV-A(A6)�SAVE�RESUME�REGISTERS!ŠBRA„DPEXOK�GO�EXIT�FOR�NEW�FRAME*$DL962…ADD.L‚#1,D3ŽBUMP�'GET'�COUNTER.ŠCMP.B‚#'|',D0ŒIS�IT�THE�COMPRESSION�SENTINEL?ŠBNE.S‚DL980ŽBRANCH�IF�NO*)DL964…BSR„GETCHR�GET�COMPRESSED�CHARACTER*ŠBEQ.S‚DL965ŽBRANCH�IF�CHARACTER�AVAILABLE&ŠLEA„DL964-A(A6),A0…GET�RESUME�ADDRESS6ŠMOVEM.L�D0-D7/A0-A5,DPSAV-A(A6)�SAVE�RESUME�REGISTERS)ŠBRA„DPEXOK�BRANCH�FOR�NEW�FRAME�REQUIRED*$DL965…ADD.L‚#1,D3ŽBUMP�'GET'�COUNTER/ŠMOVE.B�D0,BCHR-A(A6)†SAVE�COMPRESSED�CHARACTER$DL966…BSR„GETCHR�GET�COUNT�CHARACTER*ŠBEQ.S‚DL968ŽBRANCH�IF�CHARACTER�AVAILABLE&ŠLEA„DL966-A(A6),A0…GET�RESUME�ADDRESS6ŠMOVEM.L�D0-D7/A0-A5,DPSAV-A(A6)�SAVE�RESUME�REGISTERS+ŠBRA.S‚DPEXOK�BRANCH�FOR�NEW�FRAME�REQUIRED*$DL968…ADD.L‚#1,D3ŽBUMP�'GET'�COUNTER2ŠSUB.B‚#'0',D0ŒCONVERT�CODE�TO�BINARY�REPEAT�VALUE ŠCMP.L‚#9,D0 ŠBLS.S‚DL970ŽBRANCH�IF�RANGE�0-9ŠSUB.B‚#7,D0ŽRANGE�10-35*DL970…TST.B‚D0‘ARE�WE�STILL�UNCOMPRESSING?ŠBEQ.S‚DL951ŽBRANCH�IF�NO0ŠSUB.L‚#1,D0ŽDECREMENT�REMAING�COMPRESSION�COUNT*ŠMOVE.B�BCHR-A(A6),0(A3,D2.L)�MOVE�TO�BUFF"ŠADD.L‚#1,D2ŽADVANCE�'PUT'�POINTER ŠBRA.S‚DL970*9DL980…MOVE.B�D0,0(A3,D2.L)†MOVE�'RAW'�DATA�BYTE�TO�BUFFER"ŠADD.L‚#1,D2ŽADVANCE�'PUT'�POINTER ŠBRA„DL951*'* OUTPUT RECORD TO DISK AND/OR TERMINAL(DL1000„TST.L‚D2‘TEST�UNCOMPRESSED�LENGTH"ŠBHI.S‚DL1005�BRANCH�IF�LENGTH�>�0-ŠMOVE.L�#1,D2ŽIF�NOT�THEN�FORCE�LENGTH�OF�ONE$ŠMOVE.B�#'�',(A3)ŠFOR�A�BLANK�RECORD4DL1005„MOVE.L�A3,RPTR-A(A6)†SET�POINTER�BACK�TO�RBUF2ŠLEA„IOS4-A(A6),A0†ADDRESS�OF�DISK�PARAMETER�BLOCK ŠMOVE.L�A3,12(A0)ŠBUFFER�ADDRESS$ŠADD.L‚D2,A3ŽADD�UNCOMPRESSED�LENGTH'ŠSUB.L‚#1,A3ŽPOINT�A3�TO�LAST�CHARACTER'ŠMOVE.L�A3,16(A0)ŠENDING�BUFFER�ADDRESSŠMOVE.L�#$00026028,(A0)ŠTRAPƒ#2‘OUTPUT�TO�DISK ŠBEQ.S‚DL1010�BRANCH�ON�GOOD�I/O ŠMOVE.L�D0,-(A7)‹SAVE�ERROR�CODEŠBSR„HALT5ŽHALT�THE�I/OŠMOVE.L�(A7)+,D0$ŠBSR„IOSERR�COMPLAIN�OF�BAD�DISK�I/O$ŠBRA„XABORT�ERROR�ON�BAD�DISK�OUTPUT6DL1010„ADD.L‚#1,IOS4+8-A(A6)„BUMP�RANDOM�RECORD�NUMBER4ŠBTSTƒ#D,OPTFLG-A(A6)„ARE�WE�TO�DISPLAY�TO�TERMINAL?ŠBEQ.S‚DL1020�BRANCH�IF�NOŠMOVEM.L�$C(A0),A1/A2ŠBSR„HALT5ŽHALT�I/O�ON�TERMINAL"ŠBSR„MSGOUT�PUT�DATA�ONTO�TERMINAL"DL1020„BRA„DPIN�GO�FOR�NEXT�RECORD*1DPEXOK„MOVE.L�#1,D0ŽINDICATE�PLUS�CONDITION�CODES ŠBRA.S‚DPIO/DPEXENDƒCLR.L‚D0‘INDICATE�EQUAL�CONDITION�CODES+DPIO†MOVEƒD0,-(A7)‹SAVE�FOR�CONDITION�CODES,ŠCMP.B‚#$FF,IOS5+4-A(A6)‚IS�I/O�IN�PROGRESS?ŠBEQ.S‚DPRTSŽBRANCH�IF�YESŠBSR„INPP5C�NO�SO�REISSUE�INPUT+DPRTS…MOVEƒ(A7)+,D0‹RESTORE�CONDITION�CODESŠRTS%*************************************%* GETCHR GETS ONE CHARACTER FROM TBUF'*ƒPOINTED�AT�BY�TPTR.‚IF�ALL�CHARACTERS, &*ƒHAVE�BEEN�FETCHED,�UNEQUAL�CONDITION&*ƒCODES�ARE�RETURNED.‚OTHERWISE,�EQUAL&*ƒCONDITION�CODES�ARE�RETURNED�AND�THE*ƒCHARACTER�IS�RETURNED�IN�D0.GETCHR„MOVE.L�TPTR-A(A6),A0ŠMOVE.B�(A0),D0ŠLEA„TBUF-A(A6),A1 ŠSUB.L‚A1,A0ŠCMP.L‚CHRNUM-A(A6),A0.ŠBHS.S‚GETCNO�BRANCH�IF�NO�CHARACTER�TO�RETURN+ŠADD.L‚#1,TPTR-A(A6)†ADVANCD�BUFFER�POINTER&ŠCMP.L‚D0,D0ŽSET�EQUAL�CONDITION�CODESŠRTS/GETCNO„MOVE.L�#1,D0ŽSET�UNEQUAL�CONDITION�CODESŠRTSŠPAGE%*************************************.* IMSG DISPLAYS MESSAGE EXPLAINING INTERACTIVE *ƒOPTIONS.*JIM1S DC.B 'KEY IN ''T'' TO TERMINATE TRANSFER AND RESUME TRANSPARENT MODE' IM1E�EQU‚*-1…DSƒ0/IM2S�DC.B�'‡''D''�TO�TOGGLE�THE�RECORD�DISPLAY' IM2E�EQU‚*-1…DSƒ0* IMSG†EQU„*ŠBSR„LF6�TWO�LINE�FEEDSŠLEA„IM1S-A(A6),A1ŠLEA„IM1E-A(A6),A2 ŠBSR„MSGOUTŠLEA„IM2S-A(A6),A1ŠLEA„IM2E-A(A6),A2 ŠBSR„MSGOUTŠBSR„LF6�TWO�LINE�FEEDSŠRTS%************************************** UPLOAD SEQUENCE*ULOADMSƒDC.Bƒ'UPLOAD�INITIATED'ULOADMEƒEQU„*-1ŠDS…0*HSEVMS DC.B 'ENTER SENDING FILE NAME OR ''Q'' TO RESUME TRANSPARENT MODE' SEVME…EQU„*-1ŠDS…0**NAKMS…DC.Bƒ'NAK�RECEIVED�-�RETRANSMITTING' NAKME…EQU„*-1ŠDS…0*2UTERMS„DC.Bƒ'UPLOAD�TERMINATED�WITH�''T''�KEY-IN�'(UTERMN„DC.Bƒ'XXXXXX�RECORDS�TRANSFERRED'UTERME„EQU„*-1ŠDS…0*UDONES„DC.Bƒ'UPLOAD�COMPLETED‚'(UDONEN„DC.Bƒ'XXXXXX�RECORDS�TRANSFERRED'UDONEE„EQU„*-1ŠDS…0*3UPLOAD„LEA„SEVMS-A(A6),A1…ASK�FOR�SENDING�FILE�NAMEŠLEA„SEVME-A(A6),A2 ŠBSR„MSGOUT2ŠBSR„INPW5ŽTAKE�SENDING�FILE�NAME�(INPUT�AND�WAIT)*ŠBSR„ASGFLU�ASSIGN�THE�FILE&ŠBEQ.S‚UL00�BRANCH�IF�'Q'�NOT�KEYED�IN*ŠMOVE.B�#'T',D0ŒTERMINATION�ACKNOWLEDGMENT!ŠBSR„RESPOND2‹SEND�IT�TO�THE�HOST ŠBRA„QUITUPDN* UL00†BSR„LF63ŠLEA„ULOADMS-A(A6),A1ƒTELL�THEM�UPLOAD�IS�INITIATEDŠLEA„ULOADME-A(A6),A2 ŠBSR„MSGOUT* ŠBSR„IMSG1ŠCLR.B‚BUFF5S-A(A6)‡CLEAR�BYTE�FOR�OPERATOR�INPUT0ŠBSR„INPP5C�INPUT�AND�PROCEED�FROM�HOME�TERMINAL**2* PLACE COMPLETION ADDRESSES INTO PARAMETER BLOCKSŠLEA„UHIO-A(A6),A0ŠMOVE.L�A0,IOS1+24-A(A6)ŠLEA„UTIO-A(A6),A0ŠMOVE.L�A0,IOS5+24-A(A6)** INITIALIZE FOR RECORD READS/ŠLEA„IOS4-A(A6),A0†ADDR�OF�FILE�PARAMETER�BLOCK$ŠCLR.L‚8(A0)ŽCLEAR�RRN�FOR�DISK�READ#ŠLEA„RBUF-A(A6),A1†STARTING�ADDRESS(ŠLEA„RBUF+RMAX-1-A(A6),A2�ENDING�ADDRESS/ŠMOVEM.L�A1/A2,12(A0)†PLUG�IN�BUFFER�BOUNDARIES-ŠMOVE.L�#$00016020,(A0)„PLUG�IN�READ�FUNCTION!ŠLEA„TBUF-A(A6),A0†PACKING�BUFFER.ŠADD.L‚#3,A0ŽBYPASS�CHECKSUM�AND�EOF�CHARACTER6ŠMOVE.L�A0,TPTR-A(A6)†SAVE�POINTER�FOR�PACKING�RECORDS/ŠMOVE.B�#'A',-1(A0)ˆINDICATE�INTERMEDIATE�FRAME:ŠMOVE.L�A0,UREC1-A(A6)…SAVE�ADDRESS�OF�1ST�RECORD�IN�FRAME6ŠCLR.L‚USTAGEL-A(A6)†INDICATE�NO�STAGED�DISPLAY�RECORD*=* READ ANOTHER RECORD ONLY IF WE STILL HAVE ROOM IN THE FRAME5UL10†MOVE.L�TPTR-A(A6),D0†POINTER�INTO�PACKING�BUFFER1ŠLEA„TBUF-A(A6),A0†BASE�ADDRESS�OF�PACKING�BUFFER-ŠSUB.L‚A0,D0ŽD0�=�NUMBER�OF�CHARACTERS�PACKED(ŠCMP.L‚CHRNUM-A(A6),D0„SEE�IF�FULL�FRAME!ŠBHS.S‚UL100ŽBRANCH�IF�FRAME�FULLŠLEA„IOS4-A(A6),A0ŠTRAPƒ#2‘READ�THE�RECORDŠBNE.S‚UL15�BRANCH�ON�BAD�READ*E*�READ�WAS�GOOD,�TRANSFER�RECORD�TO�TBUF�UNDER�AN�EDITING�MOVE.‚PLACED*ƒTHE�ACTUAL�NUMBER�OF�CHARACTERS�MOVED�INTO�THE�LENGTH�FIELD�OF�THE*ƒFRAME.*ŠADD.L‚#1,8(A0)‹BUMP�RANDOM�RECORD�POINTER+ŠMOVE.L�TPTR-A(A6),A3†POINT�TO�LENGTH�FIELD"ŠADD.L‚#2,A3ŽWHERE�TO�MOVE�DATA�TOŠBSR„EDITMOV2‹MOVE�DATA�TO�TBUF3ŠMOVE.L�TERMLGH-A(A6),D0ƒNUMBER�OF�CHARACTERS�MOVED ŠMOVE.L�D0,D2#ŠBSR„BINHASCŒCONVERT�TO�ASCII�IN�D1ŠMOVE.L�TPTR-A(A6),A0$ŠMOVE.B�D1,1(A0)‹2ND�DIGIT�OF�LENGTHŠROR.L‚#8,D1ŽPOSITION�1ST�DIGITŠMOVE.B�D1,(A0)ŒPLACE�1ST�DIGIT$ŠADD.L‚#2,A0ŽPOSITION�TO�DESTINATIONŠADD.L‚TERMLGH-A(A6),A0!ŠMOVE.L�A0,TPTR-A(A6)†UPDATE�TPTR"ŠBRA.S‚UL10�CONTINUE�FILLING�FRAME*&UL15†CMP.B‚#$C2,D0ŒWAS�IT�END�OF�FILE?!ŠBEQ.S‚UL20�BRANCH�ON�END�OF�FILE"ŠMOVE.L�D0,-(A7)‹SAVE�ERROR�STATUSŠBSR„HALT5ŽHALT�THE�I/O%ŠMOVE.L�(A7)+,D0‹RECOVER�ERROR�STATUSŠBSR„IOSERR�COMPLAIN�ON�ERROR"ŠBRA„XABORT�ABORT�ON�BAD�DIS- K�READ** BLANK FILL THE FRAME1UL20†MOVE.L�TPTR-A(A6),A0†WHERE�TO�MOVE�BLANKS�TOŠLEA„TBUF-A(A6),A1$ŠADD.L‚CHRNUM-A(A6),A1„LAST�ADDR�+�1'UL25†MOVE.B�#'�',(A0)+‰STUFF�BLANKS�...ŠCMP.L‚A0,A1Ž...�TO�THE�END�...ŠBNE.S‚UL25�...�OF�THE�FRAME2ŠMOVE.L�A0,TPTR-A(A6)†SET�TPTR�TO�END�OF�FRAME�+�1-ŠMOVE.B�#'Z',TBUF+2-A(A6)‚INDICATE�LAST�FRAME*)* COMPUTE CHECKSUM FOR THIS FRAME OF DATA UL100…EQU„*-ŠBTSTƒ#C,OPTFLG-A(A6)„IS�CHECKSUM�OPTION�SET?ŠBNE.S‚UL102ŽBRANCH�IF�YES>ŠMOVE.W�#'00',TBUF-A(A6)ƒNO�SO�INSERT�ZERO�(WILDCARD)�CHECKSUM ŠBRA.S‚UL1500UL102…LEA„TBUF+2-A(A6),A1„WHERE�TO�START�SUMMING ŠMOVE.L�A1,A2ŠADD.L‚CHRNUM-A(A6),A2ŠSUB.L‚#2,A2ŽENDING�ADDRESS�+�1ŠCLR.L‚D0‘ACCUMULATORŠCLR.L‚D1‘HOLDS�BYTE6UL110…MOVE.B�(A1)+,D1‹ACCUMULATE�CHECKSUM�IN�THIS�LOOP ŠADD.L‚D1,D0 ŠCMP.L‚A1,A2 ŠBNE.S‚UL110 ŠDIVUƒ#255,D0ŠSWAPƒD0‘SUM�MOD�255�IN�D0.W$ŠADD.W‚#1,D0ŽINSURE�NONZERO�CHECKSUM'ŠBSR„BINHASCŒCONVERT�TO�HEX�ASCII�IN�D1&ŠMOVE.W�D1,TBUF-A(A6)†PLUG�IN�CHECKSUM*'* LOOP FOR SENDING FRAME BLOCK BY BLOCK5UL150…LEA„TBUF-A(A6),A2†BASE�OF�FRAME�AND�FIRST�BLOCK ŠMOVE.L�A2,A1ŠADD.L‚CHRBLK-A(A6),A2+ŠSUB.L‚#1,A2ŽBRACKET�FIRST�BLOCK�WITH�A1/A2 ŠBRA.S‚UL182* UL180…EQU„*ŠMOVEM.L�BBOUNDS-A(A6),A1/A20ŠADD.L‚CHRBLK-A(A6),A1„ADVANCE�BUFFER�BOUNDARIESŠADD.L‚CHRBLK-A(A6),A2!UL182…MOVEM.L�A1/A2,BBOUNDS-A(A6)ŠLEA„TBUF-A(A6),A0ŠADD.L‚CHRNUM-A(A6),A0 ŠSUB.L‚#1,A0 ŠCMP.L‚A2,A0*ŠBEQ.S‚UL185ŽBRANCH�IF�LAST�BLOCK�OF�FRAME** NOT LAST BLOCK OF FRAME/ŠBTSTƒ#H,OPTFLG-A(A6)„IS�HALF�DUPLEX�IN�EFFECT?ŠBEQ.S‚UL187ŽBRANCH�IF�NO#ŠBSR„OUTP1ŽYES�-�OUTPUT�AND�PROCEEDŠSUB.L‚#1,A2ŽREADJUST�A2ŠBRA„ULWAIT�GO�WAIT�FOR�EVENT*#* LAST BLOCK OF FRAME IS BEING SENT2UL185…BSETƒ#LBLK,TRANFLG-A(A6)�SET�LAST�BLOCK�FLAG1UL187…BSR„OIP1�OUTPUT�DATA�WITH�INPUT�AND�PROCEEDŠSUB.L‚#1,A2ŽREADJUST�A2ŠBRA„ULWAIT�GO�WAIT�FOR�EVENT*'* EVENT WAS I/O COMPLETION ON HOST PORT UHIO†EQU„*/ŠMOVE.L�SAVSTACK-A(A6),A7‚RESTORE�STACK�POINTERŠBSR„ASQREADŒREAD�THE�EVENTŠLEA„IOS1H-A(A6),A0%ŠBSR„HLTCHK�WAS�THIS�FROM�A�HALT�I/O?ŠBEQ„ULWAIT�BRANCH�IF�YES*2ŠLEA„IOS1-A(A6),A0†ADDRESS�OF�HOST�PARAMETER�BLOCK1ŠCMP.B‚#$EA,4(A0)‰DON'T�COMPLAIN�ON�OVERRUN�ERROR ŠBEQ.S‚UL200 ŠBSR„IOERCHKŒCHECK�FOR�I/O�ERROR/UL200…CMP.W‚#$2,(A0)‹WAS�IT�OUTPUT�AND�PROCEED?-ŠBEQ„UL180ŽBRANCH�IF�YES�TO�OUTPUT�NEXT�BLOCK)ŠCMP.W‚#$1,(A0)‹WAS�IT�INPUT�AND�PROCEED?ŠBEQ.S‚UL680ŽBRANCH�IF�YES*1* IT MUST HAVE BEEN OUTPUT WITH INPUT AND PROCEED;*ƒIF�WE�ARE�NOT�IN�HALF�DUPLEX�MODE,�THEN�WE�HAVE�JUST�READ8*ƒTHE�ECHO�OF�OUR�LAST�TRANSMISSION.‚IF�THIS�IS�THE�CASE=*ƒAND�WE�ARE�ON�THE�LAST�BLOCK�OF�TRANSMISSION�THEN�PUT�UP�AN@*ƒINPUT�AND�PROCEED�FOR�RESPONSE�FROM�HOST�SYSTEM.‚IF�WE�ARE�NOT?*ƒON�THE�LAST�BLOCK�OF�TRANSMISSION�AND�NOT�IN�HALF�DUPLEX�MODE'*ƒTHEN�SIMPLY�GO�OUTPUT�THE�NEXT�BLOCK.2ŠMOVE.L�8(A0),12(A0)‡CORRECT�INPUT�ADDRESS�FROM�OI*ŠBTSTƒ#H,OPTFLG-A(A6)„WAS�HALF�DUPLEX�SET?ŠBNE.S‚UL680ŽBRANCH�IF�YES0ŠBCLRƒ#LBLK,TRANFLG-A(A6)�WAS�IT�THE�LAST�BLOCK?ŠBEQ„UL180ŽBRANCH�IF�NOŠBSR„INPP1ŽREAD�RESPONSE%ŠBRA„ULWAIT�GO�WAIT�FOR�ANOTHER�EVENT* UL680…EQU„*ŠLEA„TBUF-A(A6),A0ŠADD.L‚CHRNUM-A(A6),A0,ŠLEA„RESPONSE-A(A6),A3‚WHERE�TO�MOVE�DATA�TOŠBSR„EDITMOV1‹MOVE�DATA�TO�RBUF*2ŠCMP.B‚#'B',COMOPT-A(A6)‚'B'�COMMUNICATION�OPTION?ŠBNE.S‚UL682ŽBRANCH�IF�NO ŠBSR„WAITDC1*6UL682…CMP.B‚#'N',RESPONSE-A(A6)�WAS�IT�AN�ACKNOWLEDGE?ŠBEQ.S‚UL700ŽBRANCH�IF�YES,ŠCMP.B‚#'T',RESPONSE-A(A6)�WAS�IT�TERMINATE? ŠBEQ.S‚UL700(ŠBSR„NAKRPT�SEE�IF�RETRY�COUNT�EXHAUSTEDŠBNE.S‚UL695ŽBRANCH�IF�NO,ŠMOVE.W�#'00',TBUF-A(A6)ƒFORCE�GOOD�CHECKSUM6ŠLEA„FORCMS-A(A6),A1„TELL�THEM�THAT�CHECKSUM�MATCH�...#ŠLEA„FORCME-A(A6),A2„...�WAS�FORCED ŠBSR„MOUT ŠBRA„UL150* UL695…BSR„LF62ŠLEA„NAKMS-A(A6),A1…TELL�THEM�WE'RE�RETRANSMITTINGŠLEA„NAKME-A(A6),A2 ŠBSR„MOUTŠMOVE.L�#DELAY,D0ŠWAIT�A�SECONDŠMOVE.L�#1000,A0ŠTRAPƒ#1ŠBRA„UL150ŽGO�RETRANSMIT*$* THE DATA WAS SENT AND ACKNOWLEDGED>*ƒIF�D�OPTION�SET�THEN�DISPLAY�RECORDS�JUST�SENT�ONT- O�TERMINAL"UL700…MOVE.L�REP2-A(A6),REP1-A(A6)ŠBTSTƒ#D,OPTFLG-A(A6)#ŠBEQ„UL800ŽBRANCH�IF�OPTION�NOT�SET5ŠMOVE.L�UREC1-A(A6),D0…SEE�IF�USTAGE�READY�TO�DISPLAYŠLEA„TBUF-A(A6),A0 ŠSUB.L‚A0,D0ŠCMP.L‚CHRNUM-A(A6),D0.ŠBHI„UL800ŽBRANCH�IF�USTAGE�STILL�ACCUMULATINGŠBSR„HALT5ŽHALT�I/O�ON�TERMINAL8ŠTST.L‚USTAGEL-A(A6)†DO�WE�HAVE�A�STAGED�DISPLAY�RECORD?ŠBEQ.S‚UL710ŽBRANCH�IF�NO*A* DISPLAY THE STAGING BUFFER (LEFT OVER FROM LAST FRAME OVERFLOW)ŠLEA„USTAGE-A(A6),A1 ŠMOVE.L�A1,A2ŠADD.L‚USTAGEL-A(A6),A2 ŠSUB.L‚#1,A2 ŠBSR„MSGOUTŠCLR.L‚USTAGEL-A(A6)*M* NOW SET UP TO DISPLAY THE REST OF THE RECORDS FROM TBUF THAT HAVE JUST BEEN*ƒSENT�IN�THIS�FRAME.UL710…LEA„TBUF-A(A6),A35ŠADD.L‚CHRNUM-A(A6),A3„A3�=�LAST�ADDRESS�+�1�OF�FRAMEBŠMOVE.L�UREC1-A(A6),DLTEMP-A(A6)�POINTER�TO�NEXT�RECORD�TO�DISPLAY*>UL720…MOVE.L�DLTEMP-A(A6),A1„ADDRESS�OF�LENGTH�FIELD�OF�RECORD8ŠCMP.B‚#'�',(A1)ŠIS�THIS�THE�LAST�RECORD�OF�ENTIRE�FILE?ŠBEQ.S‚UL790ŽBRANCH�IF�YES* ŠCLR.L‚D0ŠLEA„TBUF-A(A6),A0ŠADD.L‚CHRNUM-A(A6),A0,ŠCMP.L‚A0,A1ŽARE�WE�AT�THE�END�OF�THE�FRAME?ŠBHS.S‚UL790ŽBRANCH�IF�YES*=* NOT THE LAST RECORD IN TBUF SO MOVE IT TO USTAGE TO DISPLAY-ŠMOVE.L�#2,D1ŽNUMBER�OF�CHARACTERS�TO�CONVERT-ŠBSR„ASCHBINŒCONVERT�FROM�ASCII�HEX�TO�BINARY,ŠMOVE.L�A1,A2ŽADDRESS�OF�BEGINNING�OF�RECORD)ŠADD.L‚D0,A2ŽADDRESS�+�1�OF�END�OF�RECORD4ŠMOVE.L�D0,USTAGEL-A(A6)ƒLENGTH�OF�COMPRESSED�RECORD+ŠLEA„USTAGE-A(A6),A4„BASE�OF�DISPLAY�BUFFER** MOVE AND UNCOMPRESS RECORD*ƒA1‚-‚'FROM'�ADDRESS*ƒA4‚-‚'TO'�ADDRESS*3UL740…MOVE.B�(A1)+,D0‹CHARACTER�UNDER�CONSIDERATIONŠCMP.B‚#'|',D0/ŠBNE.S‚UL760ŽBRANCH�IF�NOT�COMPRESSION�SENTINEL%ŠMOVE.B�(A1)+,D0‹COMPRESSED�CHARACTER ŠMOVE.B�(A1)+,D1‹REPETITION�CODE ŠSUB.B‚#'0',D1ŒCONVERT�TO�BINARY ŠCMP.B‚#9,D1%ŠBLS.S‚UL750ŽBRANCH�IF�IN�RANGE�0�-�9%ŠSUB.B‚#7,D1ŽCONVERT�IN�RANGE�10�-�35UL750…TST.B‚D1 ŠBEQ.S‚UL761*ŠMOVE.B�D0,(A4)+‹MOVE�COMPRESSED�CHARACTER ŠSUB.B‚#1,D1 ŠBRA.S‚UL750*3UL760…MOVE.B�D0,(A4)+‹MOVE�NON�COMPRESSED�CHARACTER%UL761…CMP.L‚A2,A1ŽARE�WE�DONE�MOVING?ŠBLO.S‚UL740ŽBRANCH�IF�NO*1ŠCMP.L‚A3,A2ŽSEE�IF�THIS�RECORD�FLOWS�OFF�THE�ENDŠBHI.S‚UL780ŽBRANCH�IF�YES6ŠMOVE.L�A1,DLTEMP-A(A6)„ADDRESS�OF�NEXT�RECORD�IN�TBUF*$* NOW DISPLAY THE RECORD FROM USTAGE ŠMOVE.L�A4,A2$ŠSUB.L‚#1,A2ŽLAST�ADDRESS�TO�DISPLAYŠLEA„USTAGE-A(A6),A1ŠBSR„MSGOUT�DISPLAY�THE�RECORD)ŠCLR.L‚USTAGEL-A(A6)†CLEAR�STAGING�LENGTHŠBRA„UL720ŽCONTINUE�DISPLAYING*>UL780…LEA„USTAGE-A(A6),A1„CALCULATE�UNCOMPRESSED�RECORD�LENGTH ŠSUB.L‚A1,A4ŠMOVE.L�A4,USTAGEL-A(A6)*/UL790…BSR„INPP5C�TAKE�INPUT�FROM�TERMINAL�AGAIN*#* ENTIRE FRAME HAS BEEN TRANSMITTED8*ƒIF�LAST�FRAME,�ISSUE�TERMINATION�OR�COMPLETION�MESSAGE**6UL800…CMP.B‚#'Z',TBUF+2-A(A6)‚WAS�THIS�THE�LAST�FRAME?%ŠBNE.S‚UL840ŽBRANCH�IF�NOT�LAST�FRAME0ŠBTSTƒ#TFLG,TRANFLG-A(A6)�HAS�'T'�BEEN�KEYED�IN?ŠBEQ.S‚UL830ŽBRANCH�IF�NO*)ŠMOVE.L�IOS4+8-A(A6),D0„NUMBER�TO�CONVERT-ŠMOVE.L�#6,D1ŽNUMBER�OF�CHARACTERS�TO�CONVERTŠLEA„UTERMN-A(A6),A0)ŠBSR„BINDASCŒCONVERT�TO�ASCII�FOR�DISPLAYŠBSR„LF6ŠLEA„UTERMS-A(A6),A1ŠLEA„UTERME-A(A6),A2(ŠBSR„MOUT�TELL�THEM�UPLOAD�IS�TERMINATED ŠBRA„QUITUPDN*.UL830…MOVE.L�IOS4+8-A(A6),D0„NUMBER�TO�CONVERT-ŠMOVE.L�#6,D1ŽNUMBER�OF�CHARACTERS�TO�CONVERTŠLEA„UDONEN-A(A6),A0)ŠBSR„BINDASCŒCONVERT�TO�ASCII�FOR�DISPLAYŠBSR„LF6ŠLEA„UDONES-A(A6),A1ŠLEA„UDONEE-A(A6),A2'ŠBSR„MOUT�TELL�THEM�UPLOAD�IS�COMPLETED ŠBRA„QUITUPDN*5UL840…BTSTƒ#TFLG,TRANFLG-A(A6)�HAS�'T'�BEEN�KEYED�IN?ŠBEQ.S‚UL850ŽBRANCH�IF�NO4ŠLEA„TBUF-A(A6),A0†SET�UP�TBUF�POINTER�TO�BLANK�FILL)ŠADD.L‚#3,A0ŽBYPASS�CHECKSUM�AND�SEQUENCEŠMOVE.L�A0,TPTR-A(A6)/ŠBRA„UL20�GO�CONSTRUCT�ENDING�FRAME�AND�SEND�IT*>* JUSTIFY ANY FRAME OVERFLOW AND CONTINUE SENDING DATA TO HOST3UL850…MOVE.L�TPTR-A(A6),A2†LAST�ADDRESS�+�1�TO�MOVEŠLEA„TBUF-A(A6),A0,ŠADD.L‚CHRNUM-A(A6),A0„FIRST�ADDRESS�TO�MOVE$ŠLEA„TBUF+3-A(A6),A1„WERE�TO�MOVE�TOUL855…CMP.L‚A2,A0"ŠBHS.S‚UL900ŽBRANCH�IF�DONE�MOVINGŠMOVE.B�(A0)+,(A1)+ ŠBRA.S‚UL855:UL900…MOVE.L�A1,TPTR-A(A6)†U. PDATE�TEMPORARY�BUFFER�POINTER,ŠMOVE.L�A1,UREC1-A(A6)…FIRST�RECORD�OF�FRAME5ŠMOVE.B�#'A',TBUF+2-A(A6)‚INDICATE�INTERMEDIATE�FRAMEŠBRA„UL10�GO�CONTINUE�FILLING*&* EVENT WAS I/O COMPLETION ON TERMINAL UTIO†EQU„*/ŠMOVE.L�SAVSTACK-A(A6),A7‚RESTORE�STACK�POINTERŠBSR„ASQREADŒREAD�THE�EVENTŠLEA„IOS5H-A(A6),A0%ŠBSR„HLTCHK�WAS�THIS�FROM�A�HALT�I/O?ŠBEQ.S‚ULWAIT�BRANCH�IF�YES*ŠMOVE.B�BUFF5S-A(A6),D0(ŠCMP.B‚#'D',D0ŒWAS�KEYIN�A�'D'�(DISPLAY) ŠBNE.S‚UTIO10ŠBCHGƒ#D,OPTFLG-A(A6)2ŠBEQ.S‚UTIO08�BRANCH�IF�DISPLAY�WAS�PREVIOUSLY�OFF*ŠCLR.L‚USTAGEL-A(A6)†CLEAR�HANGING�DISPLAYŠBSR„LF61ŠLEA„RDOFS-A(A6),A1…PUT�OUT�'DISPLAY�OFF�MESSAGE'ŠLEA„RDOFE-A(A6),A2 ŠBSR„MSGOUTŠBSR„LF6 ŠBRA.S‚UTIO99UTIO08„BSR„LF60ŠLEA„RDONS-A(A6),A1…PUT�OUT�'DISPLAY�ON�MESSAGE'ŠLEA„RDONE-A(A6),A2 ŠBSR„MSGOUTŠBSR„LF6 ŠBRA.S‚UTIO99*(UTIO10„CMP.B‚#'T',D0ŒWAS�A�'T'�KEYED�IN?ŠBNE.S‚UTIO99�BRANCH�IF�NO5ŠBSETƒ#TFLG,TRANFLG-A(A6)�YES�SO�SET�TERMINATION�FLAG*UTIO99„BSR„INPP5C**7* RESET STACK POINTER AND POINTER AND GO WAIT FOR EVENT ULWAIT„EQU„*,ŠMOVE.L�A7,SAVSTACK-A(A6)‚SAVE�STACK�POINTER!ŠMOVE.L�#WTEVNT,D0‰WAIT�FOR�EVENTŠTRAPƒ#1%*************************************"* QUITUPDN HALTS ANY ACTIVE I/O ON#*ƒTERMINAL�OR�HOST�PORT,�DELAYS�FOR,*ƒ2�SECONDS.‚READS�ALL�THE�EVENTS�IN�THE�ASQ*ƒAND�PERFORMS�RTS.QUITUPDN‚BRA„TRANNXT%*************************************** ASGFLD ASSIGNS THE FILE KEYED IN IN TBUF6*ƒTO�LOGICAL�UNIT�#4�FOR�UPLOAD.‚EQUAL�CONDITION�CODES.*ƒRETURNED�FOR�GOOD�ASSIGN,�NE�CONDITION�CODES#*ƒRETURNED�IF�OPERATOR�KEYS�IN�'Q'.*0RENTRS„DC.Bƒ'REENTER�FILE�NAME�OR�''Q''�TO�QUIT'RENTRE„EQU„*-1ŠDS…03OVRMSGSƒDC.Bƒ'FILE�EXISTS�-�OK�TO�OVERWRITE(Y/N)�?'OVRMSGEƒEQU„*-1ŠDS…0 ASGFLD„EQU„*!ŠBSR„EDFILŽSET�UP�PARAMETER�BLOCK&ŠBNE.S‚ASGFLD40‹BRANCH�IF�'Q'�KEYED�IN*ŠLEA„FHS4-A(A6),A0#ŠMOVE.L�#$00400000,(A0)„ASSIGN�CODEŠTRAPƒ#38ŠBEQ.S‚ASGOVRWŒBRANCH�IF�GOOD�ASSIGN�(OVERWRITE�REQUEST)*>* ASSIGN FAILED - SEE IF NONEXISTENT FILE AND IF NOT, COMPLAINŠCMP.B‚#$17,D0#ŠBEQ.S‚ASALLO�BRANCH�IF�NONEXISTENT!ŠBSR„FHSERR�COMPLAIN�OF�FHS�ERROR;ASGFLD20‚LEA„RENTRS-A(A6),A1„TELL�THEM�TO�REENTER�FILE�NAMEŠLEA„RENTRE-A(A6),A2 ŠBSR„MOUTŠBSR„INPW5ŽGET�INPUTŠBRA„ASGFLD�GO�FOR�ANOTHER�TRY*8*�THE�FILE�ALREADY�EXISTS.‚ASK�IF�THEY�WISH�TO�OVERWRITEASGOVRWƒLEA„OVRMSGS-A(A6),A1ŠLEA„OVRMSGE-A(A6),A2 ŠBSR„MOUTŠBSR„INPW5ŽWAIT�FOR�THE�INPUTŠCMP.B‚#'Y',BUFF5S-A(A6) ŠBNE„ASGFLD20*;*�THEY�WANT�TO�OVERWRITE.‚FREE�THE�FILE�AND�DELETE�IT,�THEN*ƒREALLOCATE�IT�AND�ASSIGN�IT.ŠLEA„FHS4-A(A6),A0ŠMOVE.L�#$00040000,(A0)ŠTRAPƒ#3‘FREE�THE�FILEŠMOVE.L�#$00020000,(A0)ŠTRAPƒ#3‘DELETE�THE�FILEASALLO„MOVE.L�#$00C00304,(A0)%ŠTRAPƒ#3‘ALLOCATE�AND�ASSIGN�THE�FILEŠBEQ.S‚ASGFLD40$ŠBSR„FHSERR�PUT�UP�FHS�ERROR�MESSAGE/ŠBRA„ASGFLD20‹GO�TELL�THEM�TO�REENTER�FILE�NAME* ASGFLD40‚RTS%*************************************** ASGFLU ASSIGNS THE FILE KEYED IN IN TBUF6*ƒTO�LOGICAL�UNIT�#4�FOR�UPLOAD.‚EQUAL�CONDITION�CODES.*ƒRETURNED�FOR�GOOD�ASSIGN,�NE�CONDITION�CODES$*ƒRETURNED�IF�OPERATOR�KEYS�IN�QUIT.* ASGFLU„EQU„*#ŠBSR.S‚EDFILŽSET�UP�PARAMETER�BLOCK&ŠBNE.S‚ASGFLU50‹BRANCH�IF�'Q'�KEYED�IN*ŠLEA„FHS4-A(A6),A0#ŠMOVE.L�#$00400000,(A0)„ASSIGN�CODEŠTRAPƒ#3%ŠBEQ.S‚ASGFLU50‹BRANCH�ON�GOOD�ASSIGN*2* ASSIGN FAILED - COMPLAIN AND LET THEM TRY AGAIN.!ŠBSR„FHSERR�COMPLAIN�OF�FHS�ERROR3ŠLEA„RENTRS-A(A6),A1„TELL�THEM�TO�REENTER�FILE�NAMEŠLEA„RENTRE-A(A6),A2 ŠBSR„MOUTŠBSR„INPW5ŽGET�INPUTŠBRA„ASGFLU�GO�FOR�ANOTHER�TRY*5*�THE�FILE�IS�ASSIGNED.‚RETURN�EQUAL�CONDITION�CODES. ASGFLU50‚RTS%*************************************3* EDFIL FREES ANY FILE ATTACHED TO LOGICAL UNIT #3,1*ƒAND�ATTEMPTS�TO�ASSIGN�THE�FILE�KEYED�IN�IN�THE,*ƒBUFFER�POINTED�AT�BY�IOS5�PARAMETER�BLOCK.4*ƒIF�THE�ASSIGNMENT�WAS�GOOD,�EQ�CONDITION�CODES�ARE-*ƒRETURNED.‚IF�'Q'�WAS�KEYED-IN,�NE�CONTITION4*ƒCODES�ARE�RETURNED.‚EDFIL�WILL�INTERACTIVELY�QUERY2*ƒTHE�OPERATOR�IF�A�ERROR�WAS�MA. DE�IN�ENTERING�THE *ƒFILE�NAME.*DBADFILSƒDC.Bƒ'BAD�FILE�NAME�ENTERED�-�REENTER�NAME�OR�''Q''�TO�QUIT'BADFILEƒEQU„*-1ŠDS…0*4* FIRST FREE IF ANY FILE ATTACHED TO LOGICAL UNIT #3EDFIL…LEA„FHS4-A(A6),A0ŠMOVE.L�#$00040000,(A0)ŠTRAPƒ#3*8* SEE IF 'Q' WAS KEYED IN - IF SO BRANCH TO QUIT ROUTINEEDFIL4„BSR„QUITCHK%ŠBEQ.S‚EDFIL8�BRANCH�IF�QUIT�KEYED�IN*/* NOW SET UP PARAMETER BLOCK TO ASSIGN THE FILEŠLEA„FHS4-A(A6),A0ŠBSR.S‚DEFAULTS6ŠMOVE.L�IOS5+12-A(A6),A0ƒADDRESS�OF�KEYED�IN�FILE�NAME ŠMOVE.L�A0,A2ŠADD.L‚IOS5+20-A(A6),A24ŠMOVE.B�#',',1(A2)‰TERMINATE�WITH�COMMA�FOR�EDITFILEŠLEA„FHS4-A(A6),A6 ŠBSR„EDITFILE ŠLEA„A(PC),A6 ŠTST.L‚D0#ŠBPL.S‚EDFIL6�BRANCH�IF�EDITFILE�OKŠLEA„BADFILS-A(A6),A1ŠLEA„BADFILE-A(A6),A2 ŠBSR„MOUTŠBSR„INPW5ŽWAIT�FOR�THE�INPUT ŠBRA.S‚EDFIL4,EDFIL6„CMP.L‚D0,D0ŽSET�EQUAL�FOR�GOOD�ASSIGNŠBRA.S‚EDFILRTS3EDFIL8„MOVE.L�#1,D0ŽSET�NE�CONDITION�CODES�FOR�QUIT EDFILRTS‚RTS%*************************************3* RESPOND1 RESPONDS TO HOST WITH OUTPUT WITH INPUT.)*ƒRESPONSE�VALUE�PASSED�IN�LOW�ORDER�BYTE(*ƒOF�DO.‚INPUT�IS�DONE�INTO�BUFF1S.�THIS*ƒROUTINE�CALLS�OIP1.*/RESPOND1‚MOVE.B�D0,RESPONSE-A(A6)‚SAVE�RESPONSE3ŠLEA„RESPONSE-A(A6),A1‚SET�UP�BUFFER�BOUNDARIES�...ŠMOVE.L�A1,A2Ž...�FOR�OIP1 ŠADD.L‚#2,A2 ŠBSR„OIP1ŠRTS%*************************************3* RESPOND2 RESPONDS TO HOST WITH OUTPUT AND PROCEED5*ƒWITH�RESPONSE�VALUE�PASSED�IN�LOW�ORDER�BYTE�OF�D0.*RESPOND2‚EQU„*)ŠMOVE.B�D0,RESPONSE-A(A6)‚SET�UP�RESPONSE*ŠLEA„RESPONSE-A(A6),A1‚ADDRESS�OF�RESPONSE&ŠMOVE.L�A1,A2ŽSET�UP�BUFFER�BOUNDARIES ŠADD.L‚#2,A2ŠLEA„IOS1-A(A6),A0ŠMOVEM.L�A1/A2,12(A0)6ŠMOVE.L�#$0002020A,(A0)„IMAGE�WRITE,�SVC�ADDR,�PROCEED"ŠMOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/OŠTRAPƒ#2 ŠBSR„XFRABORTŠRTS%*************************************(* DEFAULTS SETS UP DEFAULT VALUES IN FHS,*ƒPARAMETER�BLOCK.‚A0�CONTAINS�FHS�PARAMETER*ƒBLOCK�ADDRESS.*:DEFAULTS‚MOVE.W�USERNUM+2-A(A6),$A(A0)�DEFAULT�USER�NUMBER'ŠMOVE.L�VOLNAM-A(A6),$6(A0)„VOLUME�NAME(ŠMOVE.L�CATNAM-A(A6),$C(A0)„CATALOG�NAME7ŠMOVE.L�CATNAM+4-A(A6),$10(A0)�2ND�PART�OF�CATALOG�NAMEŠRTS%*************************************(* NAKRPT COUNTS DOWN THE REP1 COUNTER TO+*ƒSEE�IF�THE�REPETITION�COUNT�IS�EXHAUSTED..*ƒIF�REP1�IS�ZERO,�COUNT�IS�EXHAUSTED�AND�REP1.*ƒIS�RESET�WITH�REP2�VALUE�AND�EQUAL�CONDITION*ƒCODES�ARE�RETURNED.+*ƒOTHERWISE�REP1�IS�DECREMENTED�AND�UNEQUAL*ƒCONDITION�CODES�ARE�RETURNED.*NAKRPT„TST.L‚REP1-A(A6),ŠBGT.S‚NAKRPT2ŒBRANCH�IF�COUNT�NOT�EXHAUSTED5ŠMOVE.L�REP2-A(A6),REP1-A(A6)‚EXHAUSTED�-�RESET�COUNT ŠCMP.L‚D0,D0ŠBRA.S‚NAKRRTSNAKRPT2ƒSUB.L‚#1,REP1-A(A6)'ŠTST.L‚(A7)�SET�NONZERO�CONDITION�CODES NAKRRTSƒRTS%*************************************.* PREACHK CHECKS THE TERMINAL BUFFER TO SEE IF)*ƒIT�CONTAINS�'PREAMBLE'.‚EQUAL�CONDITION.*ƒCODES�ARE�RETURNED�IF�SO,�UNEQUAL�OTHERWISE.*2PREACHKƒLEA„PREAM-A(A6),A1…STRING�TO�CHECK�AGAINST"ŠLEA„TBUF-A(A6),A2†BUFFER�TO�CHECK ŠBSR.S‚SCHKŠRTS&**************************************-* QUITCHK CHECKS THE IOS5 BUFFER TO SEE IF IT2*ƒCONTAINS�'Q'.‚EQUAL�CONDITION�CODES�ARE�RETURNED*ƒIF�SO,�UNEQUAL�OTHERWISE.*QUITCHKƒMOVE.L�IOS5+12-A(A6),A2ŠCMP.B‚#'Q',(A2)ŠRTS%*************************************:* SCHK CHECKS THE TERMINAL BUFFER POINTED AT BY A2 FOR THE(*ƒCHARACTER�STRING�SPECIFIED�BY�A1.‚UPON,*ƒENTRY,�A1�POINTS�TO�A�LONG�WORD�SPECIFYING+*ƒTHE�NUMBER�OF�CHARACTERS�IN�THE�STRING�TO+*ƒMATCH,�FOLLOWED�IMMEDIATELY�BY�THE�STRING *ƒITSELF.* SCHK†EQU„*ŠMOVE.L�(A1)+,D0 ŠSUB.L‚#1,D0TCHK2…CMP.B‚(A1)+,(A2)+ŠDBNEƒD0,TCHK2ŠRTS%*************************************&* MOUT HALTS ANY I/O ON LU 5 AND CALLS**ƒMSGOUT�TO�OUTPUT�DATA�TO�LU�6.‚IF�A�REAL+*ƒI/O�FUNCTION�WAS�ACTUALLY�HALTED�ON�LU�5,)*ƒMOUT�WILL�REISSUE�THE�I/O�REQUEST�AFTER*ƒCALLING�MOUT.*#MOUT†BSR„HALT5ŽHALT�I/O�ON�TERMINAL(ŠBEQ.S‚MOUT4ŽBRANCH�IF�I/O�REALLY�HALTED ŠBSR„MSGOUTŠBRA.S‚MOUTRTS*MOUT4…BSR„MSGOUTŠMOVE.L�A0/ ,-(A7)ŠLEA„IOS5-A(A6),A0"ŠMOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/O!ŠTRAPƒ#2‘REISSUE�THE�PREVIOUS�I/OŠMOVE.L�(A7)+,A0 MOUTRTSƒRTS%*************************************)* FHSERR PUTS UP A MESSAGE COMPLAINING OF+*ƒFHS�ERROR�NUMBER�AND�LOGICAL�UNIT�NUMBER.'*ƒENTERED�WITH�ERROR�CODE�IN�D0�AND�FHS *ƒPARAMETER�BLOCK�ADDRESS�IN�A0.*ƒA0,A1,A2,D0�DESTROYEDFHSERR„BSR„BINHASCŠMOVE.W�D1,FHSERRS-A(A6)ŠMOVE.B�5(A0),FHSERLUN-A(A6)ŠADD.B‚#$30,FHSERLUN-A(A6)ŠLEA„FHSERRS-A(A6),A1ŠLEA„FHSERRE-A(A6),A2 ŠBSR„MOUTŠRTS%*************************************)* IOSERR PUTS UP A MESSAGE COMPLAINING OF+*ƒIOS�ERROR�NUMBER�AND�LOGICAL�UNIT�NUMBER.'*ƒENTERED�WITH�ERROR�CODE�IN�D0�AND�IOS*ƒPARAMETER�BLOCK�ADDRESS�IN�A0*ƒA0,A1,A2,D0�DESTROYED.IOSERR„BSR„BINHASCŠMOVE.W�D1,IOSERRS-A(A6)ŠMOVE.B�5(A0),IOSERLUN-A(A6)ŠADD.B‚#$30,IOSERLUN-A(A6)ŠLEA„IOSERRS-A(A6),A1ŠLEA„IOSERRE-A(A6),A2 ŠBSR„MOUTŠRTS%*************************************.* IOP PERFORMS I/O REQUEST FOR I/O AND PROCEED(*ƒA0�CONTAINS�ADDRESS�OF�PARAMETER�BLOCK"*ƒA1�CONTAINS�BUFFER�START�ADDRESS *ƒA2�CONTAINS�BUFFER�END�ADDRESS)*ƒSTATUS�BYTE�OF�P.B.�IS�FLAGGED�WITH�$FF(*ƒTO�SHOW�ACTIVE�I/O.‚REQUEST�IS�IGNORED*ƒIF�I/O�IS�ALREADY�ACTIVE.* IOP‡EQU„*(ŠCMP.B‚#$FF,4(A0)‰IS�I/O�ALREADY�ACTIVE?ŠBEQ.S‚IOPRTS�BRANCH�IF�YES.ŠMOVEM.L�A1/A2,12(A0)†PLUG�IN�BUFFER�ADDRESSES"ŠMOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/OŠTRAPƒ#2,ŠBSR„XFRABORT‹ABORT�ON�PARAMETER�BLOCK�ERROR IOPRTS„RTS%*************************************&* INPP5C PERFORMS INPUT AND PROCEED ON**ƒLOGICAL�UNIT�5�(TERMINAL).‚ONE�CHARACTER*ƒIS�INPUT�AT�BUFF5S.*ƒINPUT�IS�IMAGE�MODE,�NO�ECHOINPP5C„LEA„BUFF5S-A(A6),A1 ŠMOVE.L�A1,A2ŠLEA„IOS5-A(A6),A03ŠMOVE.L�#$0001022A,(A0)„READ,IMAGE,SVC�ADDR,PROCEEDŠBSR„IOPŠRTS%*************************************%* INPP5 PERFORMS INPUT AND PROCEED ON.*ƒLOGICAL�UNIT�5�(TERMINAL).‚BUFFER�BOUNDARIES*ƒARE�BUFF5S�AND�BUFF5E*ƒINPUT�IS�FORMATTED�WITH�ECHOINPP5…LEA„BUFF5S-A(A6),A1ŠLEA„BUFF5E-A(A6),A2ŠLEA„IOS5-A(A6),A0-ŠMOVE.L�#$00010202,(A0)„READ,SVC�ADDR,PROCEEDŠBSR„IOPŠRTS%*************************************** INPW5 PERFORMS INPUT AND WAIT ON LOGICAL&*ƒUNIT�5�(TERMINAL).‚BUFFER�BOUNDARIES*ƒARE�BUFF5S�AND�BUFF5E.INPW5…LEA„BUFF5S-A(A6),A1ŠLEA„BUFF5E-A(A6),A2ŠLEA„IOS5-A(A6),A0ŠMOVEM.L�A1/A2,12(A0)ŠMOVE.L�#$00010000,(A0)"ŠMOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/OŠTRAPƒ#2 ŠBSR„XFRABORTŠRTS%*************************************%* INPP1 PERFORMS INPUT AND PROCEED ON$*ƒLOGICAL�UNIT�1�(HOST�PORT).‚BUFFER"*ƒBOUNDARIES�ARE�BUFF1S�AND�BUFF1EINPP1…LEA„BUFF1S-A(A6),A1ŠLEA„BUFF1E-A(A6),A2ŠLEA„IOS1-A(A6),A0;ŠMOVE.L�#$0001022A,(A0)„READ,SVC�ADDR,NO�ECHO,IMAGE,PROCEEDŠBSR„IOPŠRTS%*************************************&* OUTP1 PERFROMS OUTPUT AND PROCEED ON$*ƒLOGICAL�UNIT�1�(HOST�PORT).‚BUFFER**ƒARE�DEFINED�IN�A1/A2.‚THIS�ROUTINE�CALLS*ƒIOP.*OUTP1…LEA„IOS1-A(A6),A04ŠMOVE.L�#$0002020A,(A0)„IMAGE�WRITE,SVC�ADDR,PROCEEDŠBSR„IOP ŠBSR„XFRABORTŠRTS%*************************************1* OUTW5I PERFORMS OUTPUT AND WAIT (IMAGE MODE) ON,*ƒLOGICAL�UNIT�5�(TERMINAL�PORT).‚BOUNDARIES#*ƒARE�TBUF�FOR�A�LENGTH�OF�TERMLGH.**ƒOUTPUT�IS�ATTEMPTED�UNTIL�NO�BUSY�STATUS*ƒIS�RETURNED.OUTW5I„LEA„IOS5W-A(A6),A0ŠLEA„TBUF-A(A6),A1 ŠMOVE.L�A1,A2ŠADD.L‚TERMLGH-A(A6),A2 ŠSUB.L‚#1,A2/ŠMOVEM.L�A1/A2,12(A0)†MOVE�IN�BUFFER�BOUNDARIES(ŠMOVE.L�#$00020008,(A0)„IMAGE�WRITE,WAIT)OUTW5IAƒMOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/OŠTRAPƒ#2"ŠCMP.B‚#BUSY,D0‹SEE�IF�DEVICE�BUSYŠBNE.S‚OUTW5IX!ŠBSR„TINYWAIT‹WAIT�A�LITTLE�WHILEŠBRA.S‚OUTW5IA OUTW5IXƒRTS%*************************************3* OUTP5F PERFORMS OUTPUT AND PROCEED (FORMATTED) ON,*ƒLOGICAL�UNIT�5�(TERMINAL�PORT).‚BOUNDARIES#*ƒARE�TBUF�FOR�A�LENGTH�OF�TERMLGH.**ƒOUTPUT�IS�ATTEMPTED�UNTIL�NO�BUSY�STATUS*ƒIS�RETURNED.OUTP5F„LEA„IOS5-A(A6),A0ŠLEA„TBUF-A(A6),A1 ŠMOVE.L�A1,A2ŠADD.L‚TERMLGH-A(A6),A2 ŠSUB.L‚#1,A2/ŠMOVEM.L�A1/A2,12(A0)†MOVE�IN�BUFFER�BOUND/ ARIES5ŠMOVE.L�#$00020202,(A0)„FORMAT�WRITE,SVC�ADDR,PROCEED)OUTP5FAƒMOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/OŠTRAPƒ#2"ŠCMP.B‚#BUSY,D0‹SEE�IF�DEVICE�BUSYŠBNE.S‚OUTP5FX!ŠBSR„TINYWAIT‹WAIT�A�LITTLE�WHILEŠBRA.S‚OUTP5FA OUTP5FXƒRTS%*************************************%* OIP15 PERFORMS OUTPUT WITH INPUT ON/*ƒLOGICAL�UNIT�1�(HOST�PORT).�OUTPUT�BOUNDARIES&*ƒARE�DEFINED�IN�IOS5�PARAMETER�BLOCK.(*ƒINPUT�BOUNDARIES�ARE�BUFF1S�AND�BUFF1E**ƒI/O�IS�ATTEMPTED�UNTIL�NO�BUSY�STATUS�IS$*ƒRETURNED.‚THIS�ROUTINE�CALLS�OIP1.*;OIP15…MOVE.L�IOS5+12-A(A6),A1ƒCONSTRUCT�BOUNDARIES�IN�A1/A2 ŠMOVE.L�A1,A2 ŠBSR.S‚OIP1ŠRTS%*************************************$* OIP1 PERFORMS OUTPUT WITH INPUT ON/*ƒLOGICAL�UNIT�1�(HOST�PORT).�OUTPUT�BOUNDARIES*ƒARE�DEFINED�IN�A1/A2.(*ƒINPUT�BOUNDARIES�ARE�BUFF1S�AND�BUFF1E**ƒI/O�IS�ATTEMPTED�UNTIL�NO�BUSY�STATUS�IS *ƒRETURNED.OIP1†LEA„IOS1-A(A6),A02ŠMOVEM.L�A1/A2,12(A0)†SET�OUTPUT�BUFFER�BOUNDARIESŠLEA„BUFF1S-A(A6),A1#ŠMOVE.L�A1,8(A0)‹INPUT�BUFFER�STARTŠLEA„BUFF1E-A(A6),A2 ŠSUB.L‚A1,A2 ŠADD.L‚#1,A2!ŠMOVE.L�A2,20(A0)ŠLENGTH�OF�INPUT>ŠMOVE.L�#$0004062A,(A0)„OUT/IN,�IMAGE,SVC�ADDR,NO�ECHO,PROCEED'OIP1A…MOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/OŠTRAPƒ#2"ŠCMP.B‚#BUSY,D0‹SEE�IF�DEVICE�BUSY ŠBNE.S‚OIP1X#ŠBSR.S‚TINYWAIT‹WAIT�A�LITTLE�WHILE ŠBRA.S‚OIP1A OIP1X…RTS%*************************************%* OIP1C PERFORMS OUTPUT WITH INPUT ON+*ƒLOGICAL�UNIT�1�(HOST�PORT).�OUTUPT�IS�ONE'*ƒCHARACTER�FROM�BUFFER�DEFINED�IN�IOS5*ƒPARAMETER�BLOCK.%*ƒINPUT�IS�ONE�CHARACTER�INTO�BUFF1S.**ƒI/O�IS�ATTEMPTED�UNTIL�NO�BUSY�STATUS�IS *ƒRETURNED.OIP1C…LEA„IOS1-A(A6),A0ŠMOVE.L�IOS5+12-A(A6),A1 ŠMOVE.L�A1,A2ŠADD.L‚IOS5+20-A(A6),A2 ŠSUB.L‚#1,A22ŠMOVEM.L�A1/A2,12(A0)†SET�OUTPUT�BUFFER�BOUNDARIESŠLEA„BUFF1S-A(A6),A1#ŠMOVE.L�A1,8(A0)‹INPUT�BUFFER�START!ŠMOVE.L�#1,20(A0)ŠLENGTH�OF�INPUT>ŠMOVE.L�#$0004062A,(A0)„OUT/IN,�IMAGE,SVC�ADDR,NO�ECHO,PROCEED(OIP1CA„MOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/OŠTRAPƒ#2"ŠCMP.B‚#BUSY,D0‹SEE�IF�DEVICE�BUSY ŠBNE.S‚OIP1CX#ŠBSR.S‚TINYWAIT‹WAIT�A�LITTLE�WHILE ŠBRA.S‚OIP1CA OIP1CX„RTS%*************************************(* TINYWAIT DOES A RELINQUISH AND RETURNSTINYWAIT‚MOVE.L�#RELINQ,D0ŠTRAPƒ#1ŠRTS%*************************************)* HALT1 HALTS THE I/O IN PROGRESS ON LU 1)*‚EQUAL�CONDITION�CODES�RETURNED�FOR�HALT+*‚ACTUALLY�SCHEDULED,�NE�CONDTION�CODES�FOR'*‚HALT�NOT�SCHEDULED.‚ROUTINE�WAITS�FOR)*‚HALT�STATUS�TO�APPEAR�IN�IOS1�PARAMETER&*‚BLOCK�BEFORE�RETURNING.‚IF�A�HALT�IS**‚ACTUALLY�EFFECTED,�THE�HALT�SYNC�COUNTER.*‚WORD�IMMEDITELY�FOLLOWING�THE�HALT�PARAMETER*‚BLOCK�IS�INCREMENTED.*HALT1…LEA„IOS1H-A(A6),A0ŠTRAPƒ#2‘HALT�THE�I/O(ŠBNE.S‚HALT1RTS‹BRANCH�IF�I/O�NOT�HALTEDHALT1A„CMP.B‚#$E6,IOS1+4-A(A6)+ŠBEQ.S‚HALT1B�BRANCH�IF�HALT�STATUS�IN�P.B."ŠBSR„TINYWAIT‹WAIT�FOR�HALT�STATUS ŠBRA.S‚HALT1A5HALT1B„ADD.W‚#1,IOS1H+28-A(A6)‚BUMP�HALT�SYNC�COUNTER&ŠCMP.L‚D0,D0ŽSET�EQUAL�CONDITION�CODES HALT1RTS‚RTS%*************************************)* HALT5 HALTS THE I/O IN PROGRESS ON LU 5)*‚EQUAL�CONDITION�CODES�RETURNED�FOR�HALT+*‚ACTUALLY�SCHEDULED,�NE�CONDTION�CODES�FOR'*‚HALT�NOT�SCHEDULED.‚ROUTINE�WAITS�FOR)*‚HALT�STATUS�TO�APPEAR�IN�IOS5�PARAMETER&*‚BLOCK�BEFORE�RETURNING.‚IF�A�HALT�IS**‚ACTUALLY�EFFECTED,�THE�HALT�SYNC�COUNTER)*‚WORD�FOLLOWINT�THE�HALT�PARAMETER�BLOCK*‚IS�INCREMENTED.*HALT5…LEA„IOS5H-A(A6),A0ŠTRAPƒ#2‘HALT�THE�I/O(ŠBNE.S‚HALT5RTS‹BRANCH�IF�I/O�NOT�HALTEDHALT5A„CMP.B‚#$E6,IOS5+4-A(A6)+ŠBEQ.S‚HALT5B�BRANCH�IF�HALT�STATUS�IN�P.B."ŠBSR„TINYWAIT‹WAIT�FOR�HALT�STATUS ŠBRA.S‚HALT5A5HALT5B„ADD.W‚#1,IOS5H+28-A(A6)‚BUMP�HALT�SYNC�COUNTER&ŠCMP.L‚D0,D0ŽSET�EQUAL�CONDITION�CODES HALT5RTS‚RTS%*************************************&*�HLTCHK�CHECKS�FOR�A�HALTED�I/O.‚ZERO%*ƒCONDITION�CODES�ARE�RETURNED�IF�THE$*ƒI/O�HAS�HALTED,�NONZERO�OTHERWISE.'*ƒTHE�ADDRESS�OF�THE�HALT�I/O�PARAMETER$*ƒBLOCK�IS�PASSED�IN�A0.‚THE�ROUTINE+*ƒCHECKS�THE�SYSC�COUNTER�(WORD�IMMEDIATELY(*ƒFOLLOWING�THE�HALT�PARAMETER�BLOCK�FOR**ƒZERO.‚IF0 �ZERO,�NO�HALT�HAS�BEEN�EFFECTED**ƒIF�NONZERO,�A�HALT�HAS�BEEN�EFFECTED�AND.*ƒTHE�ROUTINE�WILL�DECREMENT�THE�SYNC�COUNTER.+HLTCHK„TST.W‚28(A0)�HAS�HALT�BEEN�EFFECTED?ŠBEQ.S‚HLTCHKBŒBRANCH�IF�NO$ŠSUB.W‚#1,28(A0)ŠCHECK�OFF�THIS�HALT/ŠCMP.L‚D0,D0ŽSET�EQUAL�CONDITION�CODES�FOR�HALTŠBRA.S‚HLTCRTSŒGO�RETURN:HLTCHKBƒTST.L‚(A7)�SET�NONZERO�CONDITION�CODES�FOR�NO�HALT HLTCRTSƒRTS%*************************************(* IOERCHK CHECKS PARAMETER BLOCK POINTED,*ƒAT�BY�A0�FOR�ERROR.‚IF�ERROR�THEN�COMPLAIN*ƒWITH�MESSAGE.*IOERCHKƒMOVE.B�4(A0),D0"ŠBEQ.S‚IOERRTSŒBRANCH�FOR�NO�ERROR$ŠMOVEM.L�D0/A0,-(A7)‡SAVE�ERROR�CODE!ŠBSR„IOSERR�COMPLAIN�OF�I/O�ERROR'ŠMOVEM.L�(A7)+,D0/A0‡RESTORE�ERROR�CODE IOERRTSƒRTS%*************************************** WAITDC1 WILL PUT UP A TWO CHARACTER READ$*ƒTO�THE�HOST�PORT.‚WHEN�THE�READ�IS+*ƒSATISFIED�THE�ROUTINE�PERFORMS�AN�RTS.‚IF-*ƒTHE�READ�IS�NOT�SATISFIED,�THE�ROUTINE�WILL0*ƒRTS�AFTER�TWO�SECONDS.‚THE�PURPOSE�IS�TO�DELAY4*ƒUNTIL�RECEIPT�OF�A�DC1�INDICATING�LINE�TURNAROUND.5*ƒTHE�TWO�CHARACTERS�READ�SHOULD�BE�A�LINE�FEED�($0A) *ƒFOLLOWED�BY�A�CARRIAGE�RETURN.* WAITDC1ƒEQU„*ŠMOVE.L�#10,D1�LOOP�COUNT+ŠLEA„WAITDRTN-A(A6),A0‚EVENT�RETURN�ADDRESSŠMOVE.L�IOS1+24-A(A6),-(A7)5ŠMOVE.L�A0,IOS1+24-A(A6)ƒSET�NEW�EVENT�RETURN�ADDRESSŠLEA„BUFF1S-A(A6),A1 ŠMOVE.L�A1,A2*ŠADD.L‚#1,A2ŽSET�UP�FOR�TWO�CHARACTER�READŠLEA„IOS1-A(A6),A0;ŠMOVE.L�#$0001022A,(A0)„READ,SVC�ADDR,NO�ECHO,IMAGE,PROCEEDŠBSR„IOPŠMOVE.L�(A7)+,IOS1+24-A(A6)0WAITD05ƒCMP.B‚#$FF,IOS1+4-A(A6)‚IS�THE�I/O�DONE?ŠBNE.S‚WAITDRTS‹BRANCH�IF�YES(ŠSUB.L‚#1,D1ŽNO�-�DECREMENT�WAIT�COUNTER1ŠBMI.S‚WAITD08ŒBRANCH�IF�WE'VE�WAITED�LONG�ENOUGH&ŠMOVE.L�#DELAY,D0ŠWAIT�FOR�2/10�SECONDŠMOVE.L�#200,A0ŠTRAPƒ#1-ŠBRA.S‚WAITD05ŒGO�BACK�AND�CHECK�FOR�I/O�DONE*WAITD08ƒBSR„HALT1ŽHALT�THE�I/O'ŠBNE.S‚WAITDRTS‹BRANCH�IF�NO�I/O�HALTED,ŠSUB.W‚#1,IOS1H+28-A(A6)‚ADJUST�SYNC�COUNTER* WAITDRTS‚RTS*!WAITDRTN‚BSR„ASQREADŒDUMMY�RETURN+ŠMOVE.L�#WTEVNT,D0‰JUST�READ�EVENT�AND�WAITŠTRAPƒ#1%*************************************-* EDITMOV1 MOVES DATA THAT HAS JUST BEEN READ0*ƒFROM�THE�HOST�INTO�A�WORKING�BUFFER�POINTED�AT)*ƒBY�A3.‚PARITY�BIT�(BIT�7)�IS�MASKED�OFF*ƒTHE�NUMBER�OF�CHARACTERS%*ƒACTUALLY�MOVED�IS�SAVED�IN�TERMLGH.4*ƒONLY�DATA�IN�THE�RANGE�$20-$7E�INCLUSIVE�IS�MOVED.0*ƒIF�A�CARRIAGE�RETURN�IS�ENCOUNTERED�BEFORE�ANY7*ƒOTHER�DATA,�A�BLANK�IS�MOVED�IN�PLACE�OF�THE�CARRIAGEú:8 EN?#>4*ƒRETURN.‚IF�A�LINE�FEED�IS�ENCOUNTERED�IN�THE�DATA,3*ƒALL�MOVEMENT�UP�TO�AND�INCLUDING�THE�LINE�FEED�IS5*ƒSCRUBBED�AND�ONLY�THE�PORTION�OF�THE�LINE�FOLLOWING2*ƒIS�MOVED.‚THE�BUFFER�BOUNDARIES�FOR�EDITMOV1�ARE(*ƒIMPLIED�FROM�THE�IOS1�PARAMETER�BLOCK.*EDITMOV1‚EQU„*ŠMOVEM.L�A1-A4/D0,-(A7)0ŠMOVE.L�IOS1+12-A(A6),A1ƒSTART�ADDRESS�FROM�HOST ŠMOVE.L�A1,A2ŠADD.L‚IOS1+20-A(A6),A2ŠSUB.L‚#1,A2ŽEND�ADDRESS�IN�A2 ŠMOVE.L�A3,A4EDMV2…CMP.L‚A2,A1"ŠBHI.S‚EDMV4ŽBRANCH�IF�DONE�MOVING%ŠMOVE.B�(A1)+,D0‹CHARACTER�TO�EXAMINE"ŠAND.B‚#$7F,D0ŒMASK�OFF�PARITY�BIT ŠCMP.L‚A3,A4.ŠBNE.S‚EDMV3ŽBRANCH�IF�AT�LEAST�ONE�CHAR�MOVED)ŠCMP.B‚#$0D,D0ŒIS�THIS�A�CARRIAGE�RETURN?ŠBNE.S‚EDMV3ŽBRANCH�IF�NO4ŠMOVE.B�#$20,D0ŒSUBSTITUTE�BLANK�FOR�CARRIAGE�RETURN$ŠBRA.S‚EDMV5ŽFORCE�MOVEMENT�OF�BLANK&EDMV3…CMP.B‚#$0A,D0ŒIS�IT�A�LINE�FEED?+ŠBNE.S‚EDMV8ŽBRANCH�IF�NO�-�NORMAL�MOVEMENT'ŠMOVE.L�A4,A3ŽRESET�DESTINATION�POINTER(ŠBRA„EDMV2ŽCONTINUE�WITH�NORMAL�MOVEMENTEDMV8…CMP.B‚#$20,D0 ŠBLO.S‚EDMV2ŽBRANCH�ON�NON-ASCIIŠCMP.B‚#$7F,D0ŠBHS.S‚EDMV2ŽBRANCH�NON�ASCII-EDMV5…MOVE.B�D0,(A3)+‹MOVE�IN�ASCII�CHARACTER ŠBRA.S‚EDMV2*EDMV4…SUB.L‚A4,A38ŠMOVE.L�A3,TERMLGH-A(A6)ƒSAVE�NUMBER�OF�CHARACTERS�MOVEDŠMOVEM.L�(A7)+,A1-A4/D0ŠRTS%**************************0 ***********-* EDITMOV2 MOVES DATA THAT HAS JUST BEEN READ0*ƒVIA�IOS4�PARAMETER�BLOCK�TO�A�LOCATION�POINTED/*ƒTO�BY�A3.‚NUMBER�OF�CHARACTERS�ACTUALLY�MOVED2*ƒIS�RETURNED�IN�TERMLGH.‚THE�DATA�IS�EDITED�AS�IT/*ƒIS�MOVED�IN�THE�FOLLOWING�WAY:‚ALL�CHARACTERS/*ƒTHAT�DO�NOT�FALL�IN�THE�CODE�RANGE�OF�$20-$7E0*ƒINCLUSIVE�(NON�PRINTABLE�ASCII�CHARACTERS)�ARE,*ƒCONVERTED�TO�BLANK�(CODE�$20).‚IN�ADDITION3*ƒIF�COMOPT�CONTAINS�A�'B'�(OBTAINED�FROM�PREAMBLE)5*ƒANY�LOWER�CASE�LETTERS�ARE�CONVERTED�TO�UPPER�CASE.3*ƒCHARACTER�COMPRESSION�PACKET�IS�MOVED�IN�PLACE�OF0*ƒANY�REPETITION�OF�4�OR�MORE�LIKE�CHARACTERS�IS#*ƒREPLACED�BY�A�COMPRESSION�PACKET.*EDITMOV2‚MOVEM.L�A1-A4,-(A7)*ŠMOVE.L�IOS4+12-A(A6),A1ƒMOVE�FROM�ADDRESS ŠMOVE.L�A1,A2ŠADD.L‚IOS4+20-A(A6),A2ŠSUB.L‚#1,A2ŽEND�ADDRESS�IN�A2 ŠMOVE.L�A3,A4EDMV222ƒCMP.L‚A2,A1$ŠBHI.S‚EDMV299ŒBRANCH�IF�DONE�MOVING*ŠBSR.S‚GETC�GET�NEXT�CHARACTER+ŠMOVE.B�D0,D2ŽSAVE�CHARACTER�FOR�COMPARISON*ŠMOVE.L�#1,D3ŽCOUNT�OF�MATCHING�CHARACTERS*-EDMV250ƒCMP.L‚A2,A1ŽHAVE�WE�FETCHED�THE�LAST?ŠBHI.S‚EDMV262ŒBRANCH�IF�YES ŠCMP.L‚#35,D34ŠBEQ.S‚EDMV262ŒBRANCH�ON�MAX�SIZE�COMPRESSION�PACKET ŠBSR.S‚GETC ŠCMP.B‚D0,D2+ŠBNE.S‚EDMV260ŒBRANCH�ON�NO�CHARACTER�MATCH.ŠADD.L‚#1,D3ŽBUMP�COUNT�OF�MATCHING�CHARACTERSŠBRA.S‚EDMV250*7EDMV260ƒSUB.L‚#1,A1ŽPOINT�A1�TO�NEXT�CHARACTER�TO�FETCH4EDMV262ƒCMP.L‚#3,D3ŽDO�WE�NEED�A�COMPRESSION�PACKET?ŠBHI.S‚EDMV268ŒBRANCH�IF�YESŠCMP.B‚#'|',D25ŠBEQ.S‚EDMV268Œ'|'�ALWAYS�REQUIRES�COMPRESSION�PACKET*?EDMV264ƒMOVE.B�D2,(A3)+‹NO�COMPRESSION�SO�PLUG�IN�RAW�CHARACTER ŠSUB.L‚#1,D3ŠBNE.S‚EDMV264ŒKEEP�PLUGGINGŠBRA.S‚EDMV222*6EDMV268ƒMOVE.B�#'|',(A3)+‰PLUG�IN�COMPRESSION�SENTINEL-ŠMOVE.B�D2,(A3)+‹PLUG�IN�COMPRESSED�CHARACTER.ŠADD.B‚#'0',D3ŒCONVERT�D3�TO�ASCII�LENGTH�CODEŠCMP.B‚#'9',D3'ŠBLS.S‚EDMV272ŒBRANCH�IF�IN�RANGE�0�-�9-ŠADD.B‚#7,D3ŽCONVERT�IN�RANGE�10�-�35�(A�-�Z)+EDMV272ƒMOVE.B�D3,(A3)+‹PLUG�IN�LENGTH�CODEŠBRA.S‚EDMV222*EDMV299ƒSUB.L‚A4,A38ŠMOVE.L�A3,TERMLGH-A(A6)ƒSAVE�NUMBER�OF�CHARACTERS�MOVEDŠMOVEM.L�(A7)+,A1-A4ŠRTS**GETC†MOVE.B�(A1)+,D0‹CHARACTER�IN�QUESTIONŠCMP.B‚#'�',D0+ŠBLO.S‚GETC23�BRANCH�IF�NOT�PRINTABLE�ASCIIŠCMP.B‚#$7F,D0'ŠBLO.S‚GETC24�BRANCH�IF�PRINTABLE�ASCII3GETC23„MOVE.B�#'�',D0ŒCHANGE�NON�PRINTABLE�TO�BLANK#ŠBRA.S‚GETCRTSŒGO�PLUG�IN�CHARACTER5GETC24„CMP.B‚#'B',COMOPT-A(A6)‚IS�THE�'B'�COMOPT�SET?ŠBNE.S‚GETCRTSŒBRANCH�IF�NOŠCMP.B‚#'a',D0'ŠBLO.S‚GETCRTSŒBRANCH�IF�NOT�LOWER�CASEŠCMP.B‚#'z',D0'ŠBHI.S‚GETCRTSŒBRANCH�IF�NOT�LOWER�CASE#ŠAND.B‚#$DF,D0ŒCHANGE�TO�UPPER�CASE GETCRTSƒRTS%************************************** READ EVENT INTO ASQBUFF* ASQREADƒEQU„*ŠLEA„ASQBUFF-A(A6),A0ŠMOVE.L�#RDEVNT,D0ŠTRAPƒ#1(ŠBSR„XFRABORT‹ABORT�ON�BAD�READ�OF�EVENTŠRTS%*************************************** MESSAGE OUTPUT ROUTINE TO LOGICAL UNIT 6)*ƒOUTPUT�IS�FORMATTED.‚MESSAGE�BOUNDARIES*ƒARE�POINTED�TO�BY�A1�AND�A2.* MSGOUT„EQU„*ŠLEA„IOS6-A(A6),A0/ŠMOVEM.L�A1/A2,12(A0)†PLUG�IN�BUFFER�BOUNDARIES0ŠMOVE.L�#$00020000,(A0)„PLUG�IN�FUNCTION/OPTIONS)MSGOUT2ƒMOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/OŠTRAPƒ#2ŠCMP.B‚#BUSY,D0ŠBNE.S‚MSGOUTX ŠBSR„TINYWAITŠBRA.S‚MSGOUT2 MSGOUTXƒRTS%*************************************'* LF6 HALTS ANY I/O ON LU 5 AND OUTPUTS$*ƒTWO�LINE�FEEDS�TO�LU�6�(TERMINAL).*ƒANY�HALTED�I/O�IS�REISSUED.*LF6‡BSR„HALT5ŽHALT�I/O�ON�5'ŠBEQ.S‚LF6D�BRANCH�IF�I/O�REALLY�HALTED!ŠBSR.S‚LFIT�I/O�NOT�REALLY�HALTED ŠBRA.S‚LF6RTS*LF6D†BSR.S‚LFITŠLEA„IOS5-A(A6),A0%ŠMOVE.B�#$FF,4(A0)‰MARK�AS�ACTIVE�I/OŠTRAPƒ#2‘REISSUE�PREVIOUS�I/O LF6RTS„RTS* LFS‡DC.Bƒ'‚' LFE‡EQU„*-1*LFIT†LEA„LFS-A(A6),A1ŠLEA„LFE-A(A6),A2!ŠBSR„MSGOUT�OUTPUT�TWO�LINE�FEEDS ŠBSR„MSGOUTŠRTS%*************************************H* BINARY TO ASCII ROUTINE TAKES LOW ORDER BYTE OF DO, CONVERTS IT TO HEX *ƒASCII�IN�LOW�ORDER�WORD�OF�D1.*BINHASCƒCLR.L‚D1 ŠMOVE.B�D0,D1 ŠROR.L‚#4,D1ŠADD.B‚#'0',D1ŠCMP.B‚#'9',D1 ŠBLE.S‚BIN2ŠADD.B‚#'A'-'9'-1,D1BIN2†LSL.W‚#4,D1 ŠROL.L‚#4,D1ŠADD1 .B‚#'0',D1ŠCMP.B‚#'9',D1 ŠBLE.S‚BIN4ŠADD.B‚#'A'-'9'-1,D1BIN4†RTS%*************************************<* ASCDBIN CONVERTS ASCII DECIMAL TO BINARY. INPUT POINTED AT/*ƒBY�A1,�NUMBER�OF�CHARS�IN�D1.‚RESULT�RETURNED1*ƒIN�D0.‚LEADING�BLANKS�TREATED�AS�LEADING�ZEROS./*ƒSCAN�TERMINATES�AT�END�OF�FIELD�OR�UPON�FIRST.*ƒNONNUMERIC�CHARACTER�ENCOUNTERED�AFTER�FIRST*ƒNUMERIC�CHARACTER. ASCDBINƒEQU„*ŠCLR.L‚D0‘RETURN�VALUEASCDB2„BSR.S‚ASCDB200ŠBRA.S‚ASCDB12ŒBRANCH�ON�NON-NUMERIC�&�NON-BLANKŠBRA.S‚ASCDB2�BRANCH�ON�BLANKASCDB4„MOVE.L�D0,-(A7) ŠLSL.L‚#3,D0ŠADD.L‚(A7),D0ŠADD.L‚(A7)+,D0‹*10ŠADD.L‚D2,D0ŽADD�IN�NEW�DIGITŠBSR.S‚ASCDB200ŠBRA.S‚ASCDB12ŒBRANCH�ON�NON-NUMERIC�&�NON-BLANKŠBRA.S‚ASCDB12ŒBRANCH�ON�BLANKŠBRA.S‚ASCDB4�BRANCH�ON�NUMERICASCDB12ƒRTS—MAIN�RETURNASCDB20ƒSUB.L‚#1,D1,ŠBPL.S‚ASCDB22ŒBRANCH�IF�NOT�DONE�WITH�FIELD6ŠLEA„4(A7),A7‹BYPASS�RETURN�ADDRESS�ON�DONE�WITH�FIELD(ŠBRA.S‚ASCDB12ŒDONE�WITH�FIELD�SO�RETURNASCDB22ƒCLR.L‚D2#ŠCMP.B‚#'�',(A1)ŠCLASSIFY�CHARACTERŠBEQ.S‚ASCDB24ŒBRANCH�ON�BLANKŠCMP.B‚#'0',(A1)$ŠBLO.S‚ASCDB30ŒBRANCH�ON�NON-NUMERICŠCMP.B‚#'9',(A1)$ŠBHI.S‚ASCDB30ŒBRANCH�ON�NON-NUMERICŠADD.L‚#2,(A7)ASCDB24ƒADD.L‚#2,(A7)"ASCDB30ƒMOVE.B�(A1)+,D2‹ADVANCE�A1ŠSUB.B‚#'0',D2ŒBINARY�TO�D2ŠRTS%*************************************8*�ASCHBIN�CONVERTS�ASCII�HEX�TO�BINARY.‚INPUT�POINTED�AT/*ƒBY�A1,�NUMBER�OF�CHARS�IN�D1.‚RESULT�RETURNED1*ƒIN�D0.‚LEADING�BLANKS�TREATED�AS�LEADING�ZEROS./*ƒSCAN�TERMINATES�AT�END�OF�FIELD�OR�UPON�FIRST3*ƒNON�HEX�NUMERIC�CHARACTER�ENCOUNTERED�AFTER�FIRST*ƒHEX�NUMERIC�CHARACTER ASCHBINƒEQU„*ŠCLR.L‚D0‘RETURN�VALUEASCHB2„BSR.S‚ASCHB200ŠBRA.S‚ASCHB12ŒBRANCH�ON�NON-NUMERIC�&�NON-BLANKŠBRA.S‚ASCHB2�BRANCH�ON�BLANKASCHB4„LSL.L‚#4,D0Ž*16ŠADD.B‚D2,D0ŽADD�IN�NEW�DIGITŠBSR.S‚ASCHB200ŠBRA.S‚ASCHB12ŒBRANCH�ON�NON-NUMERIC�&�NON-BLANKŠBRA.S‚ASCHB12ŒBRANCH�ON�BLANKŠBRA.S‚ASCHB4�BRANCH�ON�NUMERICASCHB12ƒRTS—MAIN�RETURNASCHB20ƒSUB.L‚#1,D1,ŠBPL.S‚ASCHB22ŒBRANCH�IF�NOT�DONE�WITH�FIELD6ŠLEA„4(A7),A7‹BYPASS�RETURN�ADDRESS�ON�DONE�WITH�FIELD(ŠBRA.S‚ASCHB12ŒDONE�WITH�FIELD�SO�RETURNASCHB22ƒCLR.L‚D2#ŠCMP.B‚#'�',(A1)ŠCLASSIFY�CHARACTERŠBEQ.S‚ASCHB24ŒBRANCH�ON�BLANKŠCMP.B‚#'0',(A1)$ŠBLO.S‚ASCHB30ŒBRANCH�ON�NON-NUMERICŠCMP.B‚#'9',(A1) ŠBLS.S‚ASCHB23ŒBRANCH�IF�NUMERICŠCMP.B‚#'A',(A1) ŠBLO.S‚ASCHB30ŒBRANCH�IF�NOT�HEXŠCMP.B‚#'F',(A1) ŠBHI.S‚ASCHB30ŒBRANCH�IF�NOT�HEXŠSUB.B‚#7,D2ŽCORRECTION�FOR�A-FASCHB23ƒADD.L‚#2,(A7)ASCHB24ƒADD.L‚#2,(A7)!ASCHB30ƒADD.B‚(A1)+,D2‹ADVANCE�A1ŠSUB.B‚#'0',D2ŒBINARY�TO�D2ŠRTS$************************************+*‚32�BIT�BINARY�TO�DECIMAL�ASCII�SUBROUTINE*,*‚CONVERTS�BINARY�IN�D0�AND�PUTS�ASCII�DIGIT(*…CHARACTERS�AT�ADDRESS�SPECIFIED�IN�A0.(*…LEADING�ZEROS�ARE�CONVERTED�TO�SPACES.+*…THE�FIELD�LENGTH�(NO.�CHARS)�IS�SPECIFIED *…IN�D1�IN�THE�CALLING�SEQUENCE.**‚CALLING�SEQUENCE:!*…MOVE.L�,�D0*…MOVE.L�,D11*…MOVE.L�,A0 *…BSR�BINDASC* *‚RETURNS:*…D0�=�0�=>GOOD�CONVERSION**‚REGS�USED:‚0�1�2�3�4�5�6�7 *ŠDƒ*�P�P*ŠAƒP�P**‰*†*’*!BINDASCƒMOVEM.L�D1/D2/A0/A1,-(A7)ŠMOVE.L�#8,D2ŽMAX�NO.�DIGITSŠSUB.L‚D1,D2ŽNO.�DIGITS�TO�SKIP!ŠBMI.S‚BINDASC5‹BRANCH�ERROR�EXITŠLSL.L‚#2,D2ŽDOUBLE�WORD�LENGTH!ŠLEA„TENS-A(A6),A1†START�OF�TABLE"ŠADD.L‚D2,A1ŽADJUST�FOR�DIFFERENCE&ŠMOVE.W�#'‚',D2‹INITIALIZE�ACCUMULATOR%BINDASC1‚SUB.L‚(A1),D0ŒSUBTRACT�10**NŠBCS.S‚BINDASC2‹BRANCH�TOO�BIG*ŠADD.W‚#1,D2ŽINCREMENT�CURRENT�DIGIT�COUNTŠBRA„BINDASC1‹CONTINUE)BINDASC2‚ADD.L‚(A1)+,D0‹RESTORE,�ADV�PNTRŠTST.L‚(A1)�TEST�DONEŠBEQ.S‚BINDASC4‹BRANCH�DONE ŠCMP.W‚#'‚',D2‹LEADING�ZERO�TEST!ŠBEQ.S‚BINDASC3‹BRANCH�STILL�ZERO#ŠADD.B‚#$10,D2ŒBRING�TO�ASCII�DIGIT%BINDASC3‚MOVE.B�D2,(A0)+‹DEPOSIT�CHARŠLSL„#8,D2ŽSAVE�CHAR�DEPOSITED#ŠMOVE.B�#$20,D2ŒRESTORE�LS�TO�SPACEŠBRA„BINDASC1‹CONTINUE4BINDASC4‚ADD.B‚#$10,D2ŒLAST�ONE�BECOMES�DIGIT�ALWAYS"ŠMOVE.B�D2,(A0)+‹DEPOSIT�LAST�CHAR'ŠTST.L‚D0‘SET�CONDITION�CODE,�0�1 IF�GOOD"BINDASC5‚MOVEM.L�(A7)+,D1/D2/A0/A1ŠRTS*7TENS†DC.Lƒ10000000,1000000,100000,10000,1000,100,10,1,0%*************************************$*�XFRABORT�TESTS�CONDITION�CODES.‚IF"*ƒEQUAL,�RTS�IS�MADE.‚IF�NOT�EQUAL"*ƒBSR�ADDRESS�FROM�STACK�IS�PLACED&*ƒINTO�A0�AND�SELF�ABORT�IS�PERFORMED.,* XABORT ENTRY POINT UNCONDITIONALLY ABORTS.*XFRABORT‚BEQ.S‚ABORTS)XABORT„MOVE.L�D0,-(A7)‹SAVE�D0�FOR�A�LOOKŠMOVE.L�#ABORT,D0ŠTRAPƒ#1 ABORTS„RTS*PATCH…DS.Bƒ50‘PATCH�AREAŠEND„XFRé=/*=/*†FILE:�TRANSFER.AF=/*-=/*†Assembly�chain�file�for�TRANSFER�utility.?=/*†The�associated�support�programs�listed�below�have�their�own=/*�assembly/compilation�files=/*=/*�DLOAD�(Pascal)†DLOAD.PF=/*�ULOAD�(Pascal)†ULOAD.PF=/*�BREAK�(Assembly)„BREAK.AF=/*.=/*†Default�listing�output�file�is�TRANSFER.LS=/*=/IFC„\1=ARG TRANSFER.LS=/ENDIF=/*-=/*†PARAMETER‚1†\1=Listing�output�file/device=/*#=/*šDefault�values�will�be�used�for =/*¤Volume=/*¤User�number =/*¤Catalog=/*®Unless�specified=/*=ASM TRANSFER,,\1;RZ=106=/*{ Included files are:=/*ƒ--�none�--=/*}=ENDééééé+=/*=/*†FILE:�TRANSFER.LF=/*-=/*†Link�chain�file�for�the�TRANSFER�utility.?=/*†The�associated�support�programs�listed�below�have�their�own=/*�chain�link�files=/*=/*�DLOAD�(Pascal)†DLOAD.LF=/*�ULOAD�(Pascal)†ULOAD.LF=/*�BREAK�(Assembly)„BREAK.LF=/*.=/*†Default�listing�output�file�is�TRANSFER.LL=/*=/IFC„\1=ARG TRANSFER.LL=/ENDIF=/*.=/*†PARAMETER�01ˆ\1=Listing�output�file/device=/*=LINK ,TRANSFER,\1;HAMIX ATTRIBUTES PSEG SEG0:0,14 $0INPUT TRANSFERLIB 0..UTILIB.ROEND=ENDé2 éééé4$PROGRAM UPLOAD(INPUT,OUTPUT,OUTFIL); E(*******************************************************************)C(*�THIS�PROGRAM�READS�PACKED�BLOCKS�FROM�THE�TERMINAL,�SEPARATESƒ*)?(*�INDIVUDUAL�RECORDS�AND�WRITES�THEM�TO�AN�OUTPUT�FILE.‚THE†*))(*�PROGRAM�RUNS�ON�AN�EXORMACS�SYSTEM.�*)E(*******************************************************************) "CONST�CMAX‚=‚132;Š(*�BLOCK�SIZE�*)&†RMAX‚=‚132;Š(*�MAXIMUM�RECORD�SIZE�*)5†BLKCNT=‚1;Œ(*�NUMBER�OF�BLOCKS�UNDER�ONE�CHECKSUM�*),†BMAX‚=‚132;Š(*�BUFFER�SIZE�=�BLKCNT*CMAX�*)/†OPTION�=�'AA';‰(*�COM/CHAR�PROTOCOL�OPTIONS�*),†CHRMAX�=�127;Š(*�MAXIMUM�CHARACTER�VALUE�*) TYPE‚CINDEXƒ=‚0..255;$†RECTYPE‚=‚ARRAY(.1..RMAX.)�OF�CHAR;*†BFTYPEƒ=‚PACKED�ARRAY(.1..BMAX.)�OF�CHAR;†BFINDEX‚=‚INTEGER;*†BKTYPEƒ=‚PACKED�ARRAY(.1..CMAX.)�OF�CHAR; VARƒQ…:‚BOOLEAN; †OUTFIL:‚TEXT;–(*�OUTPUT�FILE�*)D†ASCII�:‚PACKED�ARRAY(.CHAR.)�OF�CINDEX;ƒ(*�ASCII�CHARACTER�CODES�*)@†ASHEX�:‚PACKED�ARRAY(.1..36.)�OF�CHAR;„(*�FOR�HEX�CONVERSION�*)=BF+J7N.RE†NUMƒ:‚PACKED�ARRAY(.CHAR.)�OF�CINDEX;ƒ(*�ACCII-DECIMAL�CONVERSION�*))†RECƒ:‚RECTYPE;“(*�HOLDS�OUTPUT�RECORD�*)1†BUFFP�:‚BFINDEX;“(*�INDEX�INTO�HOLDING�BUFFER�*)$†BUFF‚:‚BFTYPE;”(*�HOLDING�BUFFER�*)3†COUNT�:‚INTEGER;“(*�HOLDS�CHAR�COUNT�FOR�RECORD�*)/†RESPONSE:�CHAR;•(*�HOLDS�RESPONSE�CHARACTER�*)4†BCNT‚:‚INTEGER;“(*�NUMBER�OF�REPEATED�CHARACTERS�*)&†BCHR‚:‚CHAR;–(*�REPEATED�CHARACTER�*) ƒPROCEDURE�INITIALIZE;0†TYPE‚CHRARRAY�=‚PACKED�ARRAY�(.1..16.)�OF�CHAR;†VARƒIˆ:‚INTEGER; ŒCˆ:‚CHAR; 2†PROCEDURE�ASGCODE(CODE:INTEGER;�CHRSET:CHRARRAY);‰VARƒI‚:‚INTEGER;‰BEGIN�(*�ASGCODE�*)‰FOR�I�:=�1�TO�16�DO%ŒASCII(.CHRSET(.I.).)�:=�CODE�+�I�-�1‰END;‚(*�ASGCODE�*) †BEGIN�(*�INITIALIZE�*)†FOR�I:=�0�TO�CHRMAX�DO‰BEGIN9‰ASCII(.CHR(I).)�:=�0;‰(*�INDICATE�NON-ASCII�CHARCTERS�*)‰NUM(.CHR(I).)�:=�0‰END;†REWRITE(OUTFIL);1†ASHEX�:=�'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';!†ASGCODE(112,'pqrstuvwxyz{|}~�');!†ASGCODE(32,'�!"#$%&''()*+,-./'); †ASGCODE(48,'0123456789:;<=>?'); †ASGCODE(64,'@ABCDEFGHIJKLMNO'); †ASGCODE(80,'PQRSTUVWXYZ[\]^_'); †ASGCODE(96,'`abcdefghijklmno');†FOR�I�:=�1�TO�36�DO‰NUM(.ASHEX(.I.).)�:=�I�-�1;†BUFFP�:=�BLKCNT*CMAX+1;†BUFF(.3.)�:=�'A';/†WRITE(OUTPUT,'PREAMBLEU');‰(*�SEND�PREAMBLE�*)(†WRITE(OUTPUT,OPTION);Ž(*�SEND�OPTION�*),†WRITE(OUTPUT,CMAX:3);Ž(*�SEND�BLOCK�SIZE�*)1†WRITELN(OUTPUT,BLKCNT:1);Š(*�SEND�BLOCK�COUNT�*)†RESPONSE�:=�'�';†END;‚(*�INITIALIZE�*)  .PROCEDURE GETREC(VAR Q:BOOLEAN; VA2 R P:BFINDEX;6“VAR�BUFF:BFTYPE;�VAR�REC:RECTYPE;�VAR�RESPONSE:CHAR); VARƒI,Jƒ:‚INTEGER;†C1,C2�:‚CHAR; GƒPROCEDURE�GETFRAME(VAR�BUFF:BFTYPE;�VAR�Q:BOOLEAN;�VAR�RESPONSE:CHAR);  ƒVARƒI…:‚INTEGER; ‰J…:‚INTEGER; ‰K…:‚INTEGER;‰CKSUM1:‚INTEGER;‰CKSUM2:‚INTEGER;‰TBLOCK:‚BKTYPE; †BEGIN�(*�GETFRAME�*) †IF�BUFF(.3.)�=�'Z'†THEN ‰Q�:=�TRUE; †IF�NOT�Q†THEN‰REPEATŒI�:=�1;ŒJ�:=�1;ŒIF�RESPONSE�<>�'�';ŒTHEN�WRITELN(OUTPUT,RESPONSE);�(*�RESPOND�TO�LAST�FRAME�*)ŒWHILE�J�<=�BLKCNT�DO�BEGIN�READLN(INPUT,TBLOCK); �J�:=�J�+�1;�FOR�K�:=�1�TO�CMAX�DO’BEGIN’BUFF(.I.)�:=�TBLOCK(.K.); ’I�:=�I�+�1;’END;�IF�BUFF(.1.)�=�'T'�THEN*’J�:=�BLKCNT�+�1;‚(*�FORCED�TERMINATION�*)�END;ŒQ�:=�BUFF(.1.)�=�'T'; ŒIF�NOT�QŒTHEN�BEGIN�RESPONSE�:=�'N';2�CKSUM1�:=�16*NUM(.BUFF(.1.).)�+�NUM(.BUFF(.2.).);�IF�CKSUM1�<>�0�THEN’BEGIN ’CKSUM2�:=�0;’FOR�I�:=�3�TO�BLKCNT*CMAX�DO%•CKSUM2�:=�CKSUM2+ASCII(.BUFF(.I.).); ’CKSUM2�:=�(CKSUM2�MOD�255)�+�1;’IF�CKSUM1�<>�CKSUM2’THEN•RESPONSE�:=�'R'Œ(*�NAK�*)’END;�(*THEN*) �END�(*THEN*)‰UNTIL�(RESPONSE�=�'N')�OR�(Q)†END;�(*�GETFRAME�*)  ;ƒPROCEDURE�GETC(VAR�C:CHAR;�VAR�BUFF:BFTYPE;�VAR�P:BFINDEX;•VAR�Q:BOOLEAN); †BEGIN�(*GETC*)†IF�P�<=�BLKCNT*CMAX†THEN‰BEGIN‰C�:=�BUFF(.P.); ‰P�:=�P�+�1‰END†ELSE‰BEGIN‰GETFRAME(BUFF,Q,RESPONSE);‰C�:=�BUFF(.4.);‰P�:=�5‰END†END;�(*GETC*)  ƒBEGIN�(*�GETREC�*)2ƒGETC(C1,BUFF,P,Q);‹(*�DIGIT�#1�OF�LENGTH�FIELD�*)2ƒGETC(C2,BUFF,P,Q);‹(*�DIGIT�#2�OF�LENGTH�FIELD�*)ƒIF�C1�=�'�'�THEN�Q�:=�TRUE; ƒIF�NOT�QƒTHEN†BEGIN#†COUNT�:=�NUM(.C1.)*16�+�NUM(.C2.);†J�:=�1;†I�:=�1;†WHILE�I�<=�COUNT�DO‰BEGIN‰GETC(REC(.J.),BUFF,P,Q);‰IF�REC(.J.)�=�'|'‰THENŒBEGIN4ŒGETC(BCHR,BUFF,P,Q);„(*�GET�COMPRESSED�CHARACTER�*)(ŒGETC(C1,BUFF,P,Q);†(*�GET�COUNT�CODE�*)8ŒBCNT�:=�NUM(.C1.);†(*�COUNT�OF�COMPRESSED�CHARACTERS�*)ŒWHILE�BCNT�>�0�DO�BEGIN5�REC(.J.)�:=�BCHR;„(*�EXPAND�COMPRESSED�CHARACTERS�*)�BCNT�:=�BCNT�-�1; �J�:=�J�+�1�END;%ŒI�:=�I�+�3Ž(*�ADVANCE�GET�COUNTER�*) ŒENDƒ(*THEN*)‰ELSEŒBEGIN&ŒI�:=�I�+�1;�(*�ADVANCE�GET�COUNTER�*)&ŒJ�:=�J�+�1;�(*�ADVANCE�PUT�POINTER�*) ŒENDƒ(*ELSE*)‰END;‚(*WHILE*)†COUNT�:=�J�-�1;†END‚(*�THEN�*)ƒEND;�(*�GETREC�*)  5PROCEDURE PUTREC(VAR COUNT:INTEGER; VAR REC:RECTYPE); ƒVARƒI‚:‚INTEGER; ƒBEGIN�(*�PUTREC�*)ƒI�:=�1;ƒWHILE�I�<=�COUNT�DO†BEGIN†WRITE(OUTFIL,REC(.I.)); †I�:=�I+1†END;ƒWRITELN(OUTFIL);ƒEND;�(*�PUTREC�*) BEGIN„(*�MAIN�*) INITIALIZE; Q := FALSE;"GETREC(Q,BUFFP,BUFF,REC,RESPONSE);WHILE NOT Q DOƒBEGINƒPUTREC(COUNT,REC);#ƒGETREC(Q,BUFFP,BUFF,REC,RESPONSE);ƒEND;,WRITELN(OUTPUT,'T')�(*�TERMINATE�WITH�'T'�*)END.…(*�MAIN�*)éé=/*=/*†FILE:�ULOAD.LF=/*F=/*†Link�file�for�ULOAD�which�is�an�associated�support�program�for�the=/*�TRANSFER�utility.=/*=/*=/*0=/*†PARAMETER�01ˆ\1�=�Listing�output�file/device=/*=/*†DEFAULT�PARAMETERS�ARE=/*!=/*�DEFAULT�PARAMETER�01ŠULOAD.LL=/*=/*=/IFC \1 =ARG ULOAD.LL=/ENDIF=/*=/*�DEFAULT�PARAMETER�01=/*=LINK ,ULOAD.LO,\1;HAMIX INPUT ULOADLIB 0.&.PASVMDOS.ROLIB 0.&.PASCALIB.ROEND=END3 ééééééV=/*=/*†FILE:�ULOAD.PF=/*C=/*†Compilation�chain�file�for�ULOAD�which�is�an�associated�support%=/*�program�for�the�TRANSFER�utility.=/*@=/*†NOTE:�this�chain�file�requires�the�pascal�compiler�reside�on9=/*Œthe�system�default.�The�compiler�is�not�provided�with7=/*Œthis�product,�therefore�this�chain�file�will�abort.=/*#=/*†Default�output�file�is�ULOAD.LS=/*=/IFC \1 =ARG ULOAD.PL=/ENDIF=/*-=/*†PARAMETER‚1†\1=Listing�output�file/device=/*#=/*šDefault�values�will�be�used�for =/*¤Volume=/*¤User�number =/*¤Catalog=/*®Unless�specified=/*=PASCAL ULOAD,,\1=PASCAL2 ULOAD;-L=ENDééééé_3  2.30 hmquy}�…‰�ÿÿ????????   œ"$!&.% 02/463VÿÿE 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)ƒÿÿÿøB‰E ,E -?�= Aÿÿþæ5= AFÿÿÿüFFÿÿÿüƒÿÿÿü4Fÿÿÿü?(,FÿÿÿüFÿÿÿø?lE .E /E 0 INITIALIƒÿÿÿüB)ƒÿÿÿöB‰ E 1E 24 ?�= AÿÿþæFÿÿÿüBE 3E 4�= AÿÿýÂFÿÿÿüBƒÿÿÿü4 Fÿÿÿü? (,FÿÿÿüFÿÿÿöE 5? qQAÿÿÿæE 6ƒ ÿÿþÂ$B $0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZE 7QBpB pqrstuvwxyz{|}~ E 8QB B  !"#$%&'()*+,-./E 9QB0B 0123456789:;<=>?E :QB@B @ABCDEFGHIJKLMNOE ;QBPB PQRSTUVWXYZ[\]^_E <QB`B `abcdefghijklmnoE =ƒÿÿÿüB)ƒÿÿÿöB$‰ E >? �= AÿÿýÂ5= AÿÿþÁFÿÿÿüFÿÿÿüƒÿÿÿü4 Fÿÿÿü? ( ,FÿÿÿüFÿÿÿöE ?? ƒÿÿý:B…E @ƒÿÿü¸BAE A• QAÿÿÿðB  PREAMBLEUBE B•QAÿÿÿðB AABE C“QAÿÿÿðB„BE D�“QAÿÿÿðBBE Eƒÿÿü±B 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 bƒÿÿÿøBE cE d(S5FB ��QAÿÿÿð5FBE e?Œ?(CFÿÿÿøBE fE gmgQAÿÿÿøAÿÿÿhB„E hƒÿÿÿø3FÿÿÿøE iƒÿÿÿôB)ƒÿÿÿdB„‰E jE k?�= FFÿÿÿü5= AÿÿÿgFÿÿÿôE lƒÿÿÿü3FÿÿÿüE mƒÿÿÿô4Fÿÿÿô?(,FÿÿÿôFÿÿÿdE nE o?($5FBTE pƒÿÿÿøBE q?‰E r?�F$5FBTE sE t†5FE uE v�FBNE wƒÿÿÿðO5= AÿÿýÂ5FB5= AÿÿýÂ5FE xE y(SFÿÿÿðBE zE {ƒÿÿÿìBE |ƒÿÿÿüB)ƒÿÿÿdB„‰E }?ƒÿÿÿìFÿÿÿì5= Aÿÿþæ5= FFÿÿÿüƒÿÿÿü4Fÿÿÿü?(,FÿÿÿüFÿÿÿdE ~?ƒÿÿÿì3LFÿÿÿìBÿE E €(SFÿÿÿðFÿÿÿìE �E ‚�FBRE ƒE „E …???† $5FBN(5F? ?l E †E ‡E ˆE ‰E ŠE ‹E ŒE � !GETC (#C5FB„E ŽE ��F 5= F5FE �E ‘�F35FE ’‰$E “E ”?#QFFFE •�F 5FE –E —�FBE ˜?$lE ™E šE ›E œ %GETREC QAÿÿÿöFF FE �QAÿÿÿ÷FF FE ž('$FÿÿÿöB �FBE ŸE  ?'†(5FE ¡E ¢ƒÿÿü²O5= AÿÿýÂFÿÿÿöB5= AÿÿýÂFÿÿÿ÷E £ƒÿÿÿüBE ¤ƒÿÿÿøBE ¥Œ?)(*CFÿÿÿøFÿ4 ÿü²E ¦E §Q= FFÿÿÿüFF FE ¨E ©(+$5= FFÿÿÿüB|E ªE «QAÿÿü«FF FE ¬QAÿÿÿöFF FE ­ƒÿÿü¬5= AÿÿýÂFÿÿÿöE ®Œ?,(-,Fÿÿü¬BE ¯E °�= FFÿÿÿüFÿÿü«E ±ƒÿÿü¬Fÿÿü¬E ²E ³ƒÿÿÿü3Fÿÿÿü‰,E ´E µ?-ƒÿÿÿø3FÿÿÿøE ¶‰.E ·E ¸?+ƒÿÿÿø3FÿÿÿøE ¹ƒÿÿÿü3FÿÿÿüE ºE »?.‰)E ¼?*ƒÿÿü²FÿÿÿüE ½E ¾?(lE ¿E ÀE ÁE ÂE ÃE ÄE ÅE Æ /PUTREC ƒÿÿÿüBE ÇŒ?1(2CFÿÿÿü5FE ÈE É�QAÿÿÿæ5= FFÿÿÿüBE ÊE ˃ÿÿÿü3Fÿÿÿü‰1E Ì?2�QAÿÿÿæE ÍlE ÎE ÏE Ð 3UPLOAD 0QAÿÿÿæBBB0QAÿÿÿðBBBqQAÿÿÿð0QAÿÿÿøBBBpQAÿÿÿøQE уÿÿÿïBE ÒQAÿÿÿïAÿÿý:Aÿÿü¶Aÿÿý>Aÿÿü±E ÓŒ?5†6FÿÿÿïE ÔE ÕQAÿÿü²Aÿÿý>E ÖQAÿÿÿïAÿÿý:Aÿÿü¶Aÿÿý>Aÿÿü±E ׉5E ØE Ù?6��QAÿÿÿðBTB QAÿÿÿæ QAÿÿÿð QAÿÿÿø‚PQAÿÿÿæ5= FFÿÿÿüBE ÊE ˃ÿÿÿü3Fÿÿÿü‰1E Ì?2�QAÿÿÿæE ÍlE ÎE ÏE Ð G1TRANSFER AMSTR' TRANSFERSA T„ASCII file transfer utility-2pPARSE pOPTION pEDITFILE $˜€æŸH3ÿÀ ASCII FILE TRANSFER - VERSION 2.02 ASF33À8  HDCB@CN20F3  F3  F3ÿF3F3ÿTRAN K3AçÐTRANЂ‚È€F3COMMAND LINE ERROROPTION FIELD ERRORXX FHS ERROR, LUN =X XX IOF3S ERROR, LUN =X Oúò�aaxa€`öpNAMúñÜHîÿ¤-HL-HbAî\NCgaL3>aAîæaBñ¶J€jCî ¾Eî Ïa�`ÀHî†H@ @gAîæMî aBñŠjMúñ„F3`ÐMúñ~=n²-n´-n¸Aî NCgaÜ`´AîbCîx!IpNAa¦AîÚ ¼I3€ Cî!INBaŽ$nŠKîü gRaBñ" @gHp 5 fCî ÐEî áað`F3ÿ ²5WÈÿâ_€D€îú Cf¶®c-C-CJ�j°®ú`ªaàCîÄEîåa®F3aÐNuPREAMBLE** TRANSPARENT MODE - TYPE CONTROL-A TO TEF3RMINATE PROGRAMAî-HœAîÂ-HòAîÐ-H^CîPEîŒa:.úfaF3`a*ab-O p$NA.n aAîLBhpNA.Œf¢.úfaà`aF3î`Æ.n a6gúaLgú`þ .n aÀAî aRg Aî„ (êgaR Pg|F3.…g-nŒ�.Œg îŒ`ÿlGî–aŒaÐga¸J®Žg>aàîF3Œ.ŒfaøAîL1|ppNAa¾`a®®ŒJn.ga$`ÿalF3`ÿ.n aAîa¦gþôAîÚa¬ Pg\.Œf . >fîŒ` îF3Œa:.úf . >g.ŒfaØa´`D®ŒfþÒa‚®Œ`F3ÿP.Œf®Œ`Gî–aša ÞgaÈa ®Œ`þZaÌgúaâgúpF3 |ÐNAaTJ.xfö5 Bn¼Bn.NunŸŽn �Cî¡ra°=@’Cî¤ra¢F3=@–Àî’-@¤Aî–ЈS€-@¨Aî4 ¼NCa¶BnŒ.úg|Bå .UžF3g^ .Džg–aNDOWNLOAD INITIATEDENTER RECEIVING FILE NAME ORF3 'Q' TO RESUME TRANSPARENT MODERECORD DISPLAY ONRECORD DISP‘š¢ªLAYF3 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` ¤aLCîEî!aa˜B®ÆAî-HœAî4-HòAî n-H jAî´Hî?ÿ¬ .F3BŽfa –<Na ¼a Æ-O p$NA.n aºAî a LgæAî„ (êga LF3 Pg¤.…g-nŒ�.úg>Gî–×î a ŠR®˜ .ŽEî–Õî °®�d F3¼ R€`ðÕî Ñ®  .˜°®”da Œ`ÿt.Œg .BŽfa è<Ta F3`ÿT .¤°® gLrAî¥a . Aî—aa,Cî‚EîÂa j .BŽfa  F3p |èNA<Ra ¼aˆ`þþ.úgvCî–ra|J@gh?Cî˜$IÕî UŠB€F3B�Ð�µÉfø€üÿB@H@R@B‚4´@gEîka N`T .ÆrAî$a Ôa îCîEî=a ,`2.n a ¢AîF3a 4gù‚. > TfîŒ`8 Df2núga ¦CîpEî�a ta –`F3a �Cî^Eîna ^a €a D`ý|B®˜Aî–-HœB® NuLî?ÿ¬NÐa4gAî´F3Hî?ÿ¬` g@èagAîÔHî?ÿ¬`ì@éCîèra °-@ fGî nF3Bƒ$. j”‹¶® fdpaÜgAî Hî?ÿ¬`´Rƒ |fLaÀgAî(Hî?ÿ¬`˜RƒF3@øa¦g AîBHî?ÿ¬`~Rƒ0 € c_JgžS€®ø(R‚`ð€(R‚`ŠJ‚F3bt¼ -K jAî¾!K ×ÂS‹!K ¼`(NBg/a ² aî` ¬R®Æ.úF3gLè a ’a `þäp`B€? .ÿÞgaô0Nu n’Cî–‘ɱî¤dR®F3’°€NupNuKEY IN 'T' TO TERMINATE TRANSFER AND RESUME TRANSPARENF3T MODE 'D' TO TOGGLE THE RECORD DISPLAYa ¢CîEîCa pCîF3DEîja 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 TRANSFERREDCîžEîÖa ‚a–aªg <Tab`F3æa ŽCîŽEî�a \aþÚB. >a>Aîæ-HœAîø-HòAî¾B¨Cî nEî ïHèF3 ¼` Aî–Vˆ-H’|Aÿÿ-HôB® ð .’Aî–�ˆ°®¤dlAî¾NBf0R¨&nF3’T‹a> .Ž$a , n’Aà™�TˆÑîŽ-H’`¸ Âg/a( ad` "F3 n’Cî–Óî¤ü ³Èfø-H’|Z˜.úf=|00–`(Cî˜$IÕî¤UŠB€B�F3Ð�µÉfø€üÿH@R@a¬=A–Eî–"JÕî�SŠ`LîìÓî�Õî�HîìAî–Ñî¤F3Sˆ±Êg.úgapSŠ`ˆîŒaâSŠ`x.n aðAî a‚gdAî„F3 (êga€ Pg’ Pg !h .úf®Œgÿvaø`(Aî–Ñî¤F3Gîäa¬ .BŽfaL .NägB .Täg:a¼f=|00–CîlEîŸaâ`ÿF3a�CîØEîôaÎp |èNA`þú-n.úgº .ôAî–�ˆ°®¤b¨F3ašJ® ðgCî ô$IÕî ðSŠaB® ðGî–×î¤-nôè"nè  glB€Aî–Ñî¤F3³Èd^raž$IÕÀ-@ ðIî ô |f0  c_JgÀS`öÀ³ÊeصËF3b-Iè$LSŠCî ôaœB® ð`”Cî ô™É-L ðav .Z˜fL.Œg" .ÆrAîF3araŒCîöEî1aÊ`Ð .ÆrAîDaPajCî2Eî]a¨`®.ŒF3gAî–Vˆ-H’`ýr$n’Aî–Ñî¤Cî™±ÊdØ`ø-I’-Iô|A˜`üê.n aF3ÞAîapgR. > Df8núgB® ðaîCîpEî�a¼aÞ`"aØCî^F3Eîna¦aÈ` TfîŒa~-O p$NA`ô REENTER FILE NAME OR 'F3Q' TO QUITFILE EXISTS - OK TO OVERWRITE(Y/N) ?aÊffAî4 ¼@NCF3g gBa´CîhEî‡a†a*`ÐCîˆEî«ata .Y >fÖAî4 ¼F3NC ¼NC ¼ÀNCgah`²Nua\f$Aî4 ¼@NCgaNCîhEî‡a aF3Ä`ØNuBAD FILE NAME ENTERED - REENTER NAME OR 'Q' TO QUITAî4 ¼I3NCa¾g$IAîÚ ¼*aÒNuCî >Eî ½AîÚ ¼F3a¼NuCî >Eî ½AîÚHè ¼|ÿNBa8NuCî vEî =Aî„ ¼*a€NuF3Aî„ ¼ aÿraNuAîöCî–$IÕîŽSŠHè ¼|ÿNB âfaF3º`ìNuAîÚCî–$IÕîŽSŠHè ¼|ÿNB âfaˆ`ìNu"næ$IaF3NuAî„Hè Cî v!IEî =•ÉRŠ!J ¼*|ÿNB âfaD`îNuAî„"nF3æ$IÕîîSŠHè Cî v!I!| ¼*|ÿNB âfa`îNupNANuF3Aî NBf .æˆgaè`ôRn¼°€NuAîNBf .æÞgaÌ`ôRn.°€NuJhgShF3°€`J—Nu(g H瀀aþLßNur Aî!è/.œ-HœCî v$IRŠAî„ ¼*aF3ýþ-_œ .ÿˆfS�k p |ÈNA`èaÿ`fSn¼Nuaòp$NAHç€x"n�$IÕî˜F3SŠ(K³Êb0¹Ëf f< ` f&L`Ü eÖ dÐÀ`Ì—Ì-KŽLßF3NuHçx"nÊ$IÕîÒSŠ(K³ÊbJaTv³Êb ƒ#g aB´fRƒ`êS‰ ƒbF3 |gÂSƒfú`Èü|Â0 9c^Ã`²—Ì-KŽLßNu  e e?aþÜ/<@N«@@ABCDEFGHIJKLMH3 NOaþ¼/<PN«@PQRSTUVWXYZ[\]^_aþœ/<`N«@`abcdefghijklmI3  noaþ|+|ü*HmÿðN«@ PREAMBLEDBgN«@Hmÿð/<AABgN«@r <„K3E²·»€ N«@rpN«@N«@pCíü(AíÿøN«@N«@ -Nü(g -Tü(fœ -Tü(f|ÿïF3 N^+_ NuNV m "h0)S@$h® R€"€(h R€(€N^ _T�NÐ/- F3 NVÿð+N -|ÿô n °®ÿôm-nÿôÿø n °®ÿøm00.ÿöS@"n2.ÿúSAF3 1´1f .ÿø�®ÿô €#lR®ÿø`Ä .ÿ6 ô‘®ÿø ®ÿønPJ®ÿøoJS€ n 0F3 |g<-|ÿü-nÿøÿð`0.ÿöS@ n0aÿ"R®ÿüi .ÿð°®ÿülÞ .ÿøÑ®ÿôF3 `:J®ÿøo4<|aþú0.ÿöS@ n0aþè .ÿøR€AíýÁ0aþÖ .ÿøÑ®ÿô`ÿK3 ‚ ÿäâN^+_ _ßüNÐNVÿöAíÿæN«@JgAíÿæN«@AíÿæN«@Jf n H3@ -PÿüB®ÿø T€ €B­ý:AíÿæN«@Jf -ý:R€Aíý=CðAíÿæN«@R­ý:`Ø -Bü)F3 f.B.ÿ÷J.ÿ÷f$J­ý:o0-ýHmý:/./. H3 Hnÿøaþ<0.ÿþS@ nt".ÿøN«@R�CíýÁ± .ÿüR€S€".ÿøN«@R�±H3( ÿ6ÊÈN^ _P�NÐNVÿì m "hnB®ÿô-|ÿü-|„ÿð`(0.ÿþS@G3 m "h1H�åAEíýæ 2Ñ®ÿôR®ÿüi .ÿð°®ÿülÎ"<ÿ .ÿôN«@R€-@H3@ ÿôrN«@R€AíýÁ"m $i° .ÿôN«@R€pB®ÿøB®ÿð`d"<„ .I3  ÿøN«@ R€-@ÿü$.ÿøR‚&N«@ -Bÿì`"0.ÿþS@ m "hr1AíÿðN«@!R®I3  ÿüi .ÿì°®ÿülÔAíÿðN«@R®ÿøi .ÿð°®ÿøl’p m "h AíÿøN«@N«@ m F3 "h Ng Tfÿ^ m "h TWÀD$h€-|…ÿô m "h °®ÿôo"F3 .ÿô€�S€$h2.ÿöSA²R®ÿô`Î m "h €�"€N^$_T�NÒ/- G3 NVÿø+N n �…o <Aaþ8`êAíÿæN«@JgD n-Pÿü-|„ÿø`0.ÿþF3 S@ n¼ R®ÿüi .ÿø°®ÿülà<Zaýð n¼` n �„o<AaI3 D ýÒN^+_ _ßüNОüØtrpAíÿæN«@"trpAíÿðN«@"AíÿðN«@#trH3€ pAíÿøN«@"AíÿøN«@B-ÿïaù†J-ÿïf"Hmü*Hmü.aürHmÿïHmü*Hmü.Hmü(aþþ)3ˆ `ØAíÿæN«@$AíÿðN«@$AíÿøN«@$BgNN4é]1UPLOAD PSYST' ULOAD PC$9!ƒM68000 Pascal object from 2.30 resident compilerü2h.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@6H�ãAAíþæ .ÿüЮS€1€R®ÿüi .ÿøF3 °®ÿülÐN^ _ßüNÐ/- NVÿö+N B®ÿü-|ÿö`&.ÿÿH€ã@AíþæBp.ÿÿH3D H€ã@CíýÂBqR®ÿüi .ÿö°®ÿülÐAíÿæN«@AíþÂN«@$0123456789ABCDEFGHH3 IJKLMNOPQRSTUVWXYZ/<pN«@pqrstuvwxyz{|}~ aÿ/< N«@ !H3 "#$%&'()*+,-./aþð/<0N«@0123456789:;<=>?aþÐ/<@N«@@AH3 BCDEFGHIJKLMNOaþ°/<PN«@PQRSTUVWXYZ[\]^_aþ�/<`N«@`aF3 bcdefghijklmnoaþp-|ÿü-|$ÿö`$0.ÿþAíþÁ0H�ãACíý .ÿüS€3€H3 ¿ÄÈR®ÿüi .ÿö°®ÿülÒ+|…ý:|Aü¸HmÿðN«@ PREAMBLEUBgN«@Hmÿð/Hmü±aþ J-ÿïf&HmI3D ü²Hmý>aÿJHmÿïHmý:Hmü¶Hmý>Hmü±aýâ`ÔrpTAíÿðN«@N«@AíÿæN«@ Aíÿð3D N«@ AíÿøN«@ BgNN4éé' TSO DLOAD CFÔÔDLOAD SAÙÙÕULOAD CFòòULOAD SA÷÷à PROC 1 FILEALLOC DDNAME(OUTPUT) DSNAME(*)ALLOC�DDNAME(INPUT)‚DSNAME(*)"ALLOC�DDNAME(INFIL)‚DSNAME(&FILE.) CALL DLOADFREEALLéééÐ%PROGRAM DOWNLOAD(INPUT,OUTPUT,INFIL); J(************************************************************************)D(*�THIS�PROGRAM�READS�RECORDS�FROM�A�SOURCE�FILE,�PACKS�THEM�INTO‡*)D(*�BLOCKS�AND�WRITES�THEM�TO�THE�TERMINAL.‚THE�PROGRAM�RUNS�ON�AN†*)(*�IBM�370�UNDER�TSO.³*)J(************************************************************************) 5ƒCONST�CMAX‚=‚80;‰(*�MAX�NO.�OF�CHARS�IN�ONE�BLOCK�*),‰RMAX‚=‚80;‰(*�MAXIMUM�SINGLE�RECORD�SIZE�*)5‰BLKCNT=‚1;Š(*�NUMBER�OF�BLOCKS�UNDER�ONE�CHECKSUM�*)3‰BMAX‚=‚162;ˆ(*�BUFFER�SIZE�=�BLKCNT*CMAX+RMAX+2�*)/‰OPTION�=�'BB';‡(*�COM/CHAR�PROTOCOL�OPTIONS�*),‰CHRMAX�=�255;ˆ(*�MAXIMUM�CHARACTER�VALUE�*) ƒTYPE‚BKINDEX‚=�1..CMAX;‰BFINDEX‚=�INTEGER;*‰BFTYPEƒ=�PACKED�ARRAY(.1..BMAX.)�OF�CHA7 R;(‰RSPTYPE‚=�PACKED�ARRAY(.1..2.)�OF�CHAR;+‰RECTYPE‚=�PACKED�ARRAY(.1..RMAX.)�OF�CHAR; ƒVARƒQ…:‚BOOLEAN; ‰INFIL�:‚TEXT;™(*�SOURCE�FILE�*)>‰ASCII�:‚ARRAY(.CHAR.)�OF�INTEGER;…(*�ASCII�CHARACTER�CODES�*)ÕÚ Þ%â0æ%ê$?‰ASHEX�:‚PACKED�ARRAY(.1..36.)�OF�CHAR;(*�FOR�HEX�CONVERSION�*)&‰RECƒ:‚RECTYPE;–(*�HOLDS�RAW�RECORD�*)/‰RECSIZ:‚INTEGER;–(*�HOLDS�LENGTH�OF�RAW�REC�*)-‰BUFF‚:‚BFTYPE;—(*�BUFF�HOLDS�PACKED�BLOCK�*))‰BUFFP�:‚BFINDEX;–(*�INDEX�INTO�BUFFER�*)*‰RESPONSE:�RSPTYPE;•(*�ACK�NAK�RESPONSE�*) ƒPROCEDURE�INITIALIZE;0†TYPE‚CHRARRAY�=‚PACKED�ARRAY�(.1..16.)�OF�CHAR;†VARƒIˆ:‚INTEGER; 2†PROCEDURE�ASGCODE(CODE:INTEGER;�CHRSET:CHRARRAY);‰VARƒI‚:‚INTEGER;‰BEGIN�(*�ASGCODE�*)‰FOR�I�:=�1�TO�16�DO%ŒASCII(.CHRSET(.I.).)�:=�CODE�+�I�-�1‰END;‚(*�ASGCODE�*) †BEGIN�(*�INITIALIZE�*)†FOR�I:=�0�TO�CHRMAX�DO0‰ASCII(.CHR(I).)�:=�32;…(*�FORCE�ASCII�BLANKS�*) †INTERACTIVE(INPUT);†RESET(INFIL);1†ASHEX�:=�'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';!†ASGCODE(112,'pqrstuvwxyz{|}~�');!†ASGCODE(32,'�!"#$%&''()*+,-./'); †ASGCODE(48,'0123456789:;<=>?'); †ASGCODE(64,'@ABCDEFGHIJKLMNO'); †ASGCODE(80,'PQRSTUVWXYZ[\]^_'); †ASGCODE(96,'`abcdefghijklmno'); >†(*#�THE�FOLLOWING�STATEMENT�WAS�REQUIRED�TO�ALLOW�DOWNLOADING†OF�'~'�FROM�IBM�*) †ASCII(.CHR(95).)�:=�126; -†BUFFP�:=�4;œ(*�START�PACKING�RECORDS�HERE�*)†REPEAT/‰WRITE(OUTPUT,'PREAMBLED');Œ(*�SEND�PREAMBLE�*)(‰WRITE(OUTPUT,OPTION);‘(*�SEND�OPTION�*),‰WRITE(OUTPUT,CMAX:3);‘(*�SEND�BLOCK�SIZE�*)1‰WRITELN(OUTPUT,BLKCNT:1);�(*�SEND�BLOCK�COUNT�*)‰READLN(INPUT,RESPONSE);6†UNTIL�(RESPONSE(.1.)�=�'N')�OR�(RESPONSE(.1.)�=�'T');†IF�RESPONSE(.1.)�=�'T'(‰THEN�Q�:=�TRUE;˜(*�EARLY�TERMINATION�*)†END;‚(*�INITIALIZE�*) IƒPROCEDURE�COMPRESS(VAR�REC:RECTYPE;�VAR�RECSIZ:INTEGER;�VAR�BUFF:BFTYPE;"–VAR�P:BFINDEX;�VAR�CCNT:INTEGER); ƒVARƒI,Jƒ:‚INTEGER;‰RECPTR:‚INTEGER; †PROCEDURE�COUT(C:CHAR);‰BEGIN�(*�COUT�*)‰BUFF(.P.)�:=�C; ‰P�:=�P�+�1;‰CCNT�:=�CCNT�+�1‰END;‚(*�COUT�*) ƒBEGIN�(*�COMPRESS�*) ƒRECPTR�:=�1;ƒWHILE�RECPTR�<=�RECSIZ�DO†BEGIN †I�:=�RECPTR;F†WHILE�(I<=RECSIZ)�AND�(REC(.RECPTR.)�=�REC(.I.))�AND�(I-RECPTR<35)�DO ‰I�:=�I�+�1;5†I�:=�I�-�RECPTR;‚(*�NUMBER�OF�MATCHING�CHARACTERS�*)/†IF�(I<=3)�AND�(I>0)�AND�(REC(.RECPTR.)�<>�'|')†THEN‰BEGIN‰FOR�J�:=�1�TO�I�DOŒCOUT(REC(.RECPTR.));‰RECPTR�:=�RECPTR�+�I‰END†ELSE ‰IF�I�>�0‰THENŒBEGIN ŒCOUT('|');ŒCOUT(REC(.RECPTR.));ŒCOUT(ASHEX(.I+1.));ŒRECPTR�:=�RECPTR�+�I ŒENDƒ(*THEN*)†ENDƒ(*WHILE*)ƒEND;‚(*�COMPRESS�*) 2ƒPROCEDURE�GETREC(VAR�P:BFINDEX;�VAR�BUFF:BFTYPE);?†VARƒCPOS‚:‚BFINDEX;„(*�POSITION�IN�BUFF�FOR�CHARACTER�COUNT�*)5ŒCCNT‚:‚INTEGER;„(*�NUMBER�OF�CHARACTERS�IN�RECORD�*) ŒQ…:‚BOOLEAN; †BEGIN„(*�GETREC�*)#†IF�EOLN(INFIL)�THEN�READLN(INFIL);†IF�NOT�EOF(INFIL)†THEN‰BEGIN ‰CPOS�:=�P; ‰CCNT�:=�0;,‰P�:=�P+2;’(*�LEAVE�ROOM�FOR�RECORD�COUNT�*) ‰RECSIZ�:=�0;‰WHILE�NOT�EOLN(INFIL)�DOŒBEGINŒREAD(INFIL,REC(.RECSIZ+1.));ŒRECSIZ�:=�RECSIZ�+�1;ŒEND;�(*WHILE*)‰IF�RESPONSE(.2.)�=�'B'‰THENŒBEGIN ŒQ�:=�FALSE;"ŒWHILE�(NOT�Q)�AND�(RECSIZ�>�0)�DO�IF�REC(.RECSIZ.)�=�'�'�THEN’RECSIZ�:=�RECSIZ�-�1�ELSE ’Q�:=�TRUEŒEND;"‰COMPRESS(REC,RECSIZ,BUFF,P,CCNT);F‰BUFF(.CPOS.)�:=�ASHEX(.CCNT�DIV�16+1.);ƒ(*�CONSTRUCT�HEX�CHAR�COUNT*)*‰BUFF(.CPOS+1.)�:=�ASHEX(.CCNT�MOD�16+1.); ‰ENDƒ(*THEN*)†END;‚(*�GETREC�*) @ƒPROCEDURE�PUTREC(VAR�Q:BOOLEAN;�VAR�P:BFINDEX;�VAR�BUFF:BFTYPE;”VAR�RESPONSE:RSPTYPE); †VARƒI‚:‚BFINDEX; †PROCEDURE�OUTBLOCK(RTYPE:CHAR);‰VAR�I�:‚INTEGER; �J�:‚INTEGER;�C�:‚INTEGER;‡(*�CHECKSUM�*) ‰BEGIN�(*�OUTBLOCK�*)*‰BUFF(.3.)�:=�RTYPE;‹(*�MARK�BLOCK�TYPE�*)‰C�:=�7 0;4‰FOR�I�:=�3�TO�CMAX*BLKCNT�DOˆ(*�COMPUTE�CHECKSUM�*)ŒBEGINŒIF�BUFF(.I.)�=�'^',ŒTHEN�BUFF(.I.)�:=�'~';‹(*#�UNIQUE�TO�IBM�*)ŒC�:=�C�+�ASCII(.BUFF(.I.).)ŒEND;2‰C�:=�C�MOD�255�+�1;�(*�0�CHECKSUM�IS�WILD�CARD�*)B‰BUFF(.1.)�:=�ASHEX(.C�DIV�16+1.);�(*�PLACE�CHECKSUM�INTO�BLOCK�*)"‰BUFF(.2.)�:=�ASHEX(.C�MOD�16+1.);‰REPEATŒFOR�J�:=�0�TO�BLKCNT-1�DO�BEGIN<�FOR�I�:=�J*CMAX+1�TO�(J+1)*CMAX�DO„(*�WRITE�OUTPUT�BLOCK�*)’WRITE(OUTPUT,BUFF(.I.));�WRITELN(OUTPUT);�END;ŒREADLN(INPUT,RESPONSE)6‰UNTIL�(RESPONSE(.1.)�=�'N')�OR�(RESPONSE(.1.)�=�'T');‰Q�:=�RESPONSE(.1.)='T';5‰C�:=�BLKCNT*CMAX+1;‘(*�JUSTIFY�ANY�BLOCK�OVERFLOW�*)‰WHILE�C�<�P�DOŒBEGIN&ŒBUFF(.C-BLKCNT*CMAX+3.)�:=�BUFF(.C.); ŒC�:=�C�+�1ŒEND;8‰P�:=�P�-�(BLKCNT*CMAX�-�3);‰(*�RESET�NEXT�IN�POINTER�*)‰END;‚(*�OUTBLOCK�*) †BEGIN„(*�PUTREC�*)†WHILE�P�>�BLKCNT*CMAX+1�DO/‰OUTBLOCK('A');Š(*�OUTPUT�INTERMEDIATE�BLOCK�*)†IF�EOF(INFIL)†THEN‰BEGIN‰FOR�I�:=�P�TO�BLKCNT*CMAX�DO5ŒBUFF(.I.)�:=�'�';„(*�FORCE�BLANKS�TO�END�OF�BLOCK�*)'‰OUTBLOCK('Z');Š(*�OUTPUT�LAST�BLOCK�*) ‰Q�:=�TRUE;‰END†ELSEF‰IF�P�>�BLKCNT*CMAX�THEN�OUTBLOCK('A')�(*�OUTPUT�INTERMEDIATE�BLOCK�*)†END;…(*�PUTREC�*) ƒBEGIN„(*�MAIN�*) ƒQ�:=�FALSE; ƒINITIALIZE;ƒWHILE�NOT�Q�DO†BEGIN†GETREC(BUFFP,BUFF);†PUTREC(Q,BUFFP,BUFF,RESPONSE);†ENDƒEND.…(*�MAIN�*) PROC 1 FILE'ATTR FIL LRECL(80) BLKSIZE(80) RECFM(F)ALLOC DDNAME(OUTPUT) DSNAME(*)ALLOC�DDNAME(INPUT)‚DSNAME(*).ALLOC‚DDNAME(OUTFIL)�DSNAME(&FILE.)�USING(FIL) CALL ULOADFREEALLéééî$PROGRAM UPLOAD(INPUT,OUTPUT,OUTFIL); E(*******************************************************************)C(*�THIS�PROGRAM�READS�PACKED�BLOCKS�FROM�THE�TERMINAL,�SEPARATESƒ*)?(*�INDIVUDUAL�RECORDS�AND�WRITES�THEM�TO�AN�OUTPUT�FILE.‚THE†*)+(*�PROGRAM�RUNS�ON�AN�IBM�370�UNDER�TSO.›*)E(*******************************************************************) !CONST�CMAX‚=‚80;‹(*�BLOCK�SIZE�*)%†RMAX‚=‚80;‹(*�MAXIMUM�RECORD�SIZE�*)5†BLKCNT=‚1;Œ(*�NUMBER�OF�BLOCKS�UNDER�ONE�CHECKSUM�*)+†BMAX‚=‚80;‹(*�BUFFER�SIZE�=�BLKCNT*CMAX�*)/†OPTION�=�'BB';‰(*�COM/CHAR�PROTOCOL�OPTIONS�*),†CHRMAX�=�255;Š(*�MAXIMUM�CHARACTER�VALUE�*) TYPE‚CINDEXƒ=‚0..255;$†RECTYPE‚=‚ARRAY(.1..RMAX.)�OF�CHAR;*†BFTYPEƒ=‚PACKED�ARRAY(.1..BMAX.)�OF�CHAR;†BFINDEX‚=‚INTEGER;*†BKTYPEƒ=‚PACKED�ARRAY(.1..CMAX.)�OF�CHAR; VARƒQ…:‚BOOLEAN; †OUTFIL:‚TEXT;–(*�OUTPUT�FILE�*)D†ASCII�:‚PACKED�ARRAY(.CHAR.)�OF�CINDEX;ƒ(*�ASCII�CHARACTER�CODES�*)@†ASHEX�:‚PACKED�ARRAY(.1..36.)�OF�CHAR;„(*�FOR�HEX�CONVERSION�*)óøü)708 E†NUMƒ:‚PACKED�ARRAY(.CHAR.)�OF�CINDEX;ƒ(*�ACCII-DECIMAL�CONVERSION�*))†RECƒ:‚RECTYPE;“(*�HOLDS�OUTPUT�RECORD�*)1†BUFFP�:‚BFINDEX;“(*�INDEX�INTO�HOLDING�BUFFER�*)$†BUFF‚:‚BFTYPE;”(*�HOLDING�BUFFER�*)3†COUNT�:‚INTEGER;“(*�HOLDS�CHAR�COUNT�FOR�RECORD�*)/†RESPONSE:�CHAR;•(*�HOLDS�RESPONSE�CHARACTER�*)4†BCNT‚:‚INTEGER;“(*�NUMBER�OF�REPEATED�CHARACTERS�*)&†BCHR‚:‚CHAR;–(*�REPEATED�CHARACTER�*) ƒPROCEDURE�INITIALIZE;0†TYPE‚CHRARRAY�=‚PACKED�ARRAY�(.1..16.)�OF�CHAR;†VARƒIˆ:‚INTEGER; ŒCˆ:‚CHAR; 2†PROCEDURE�ASGCODE(CODE:INTEGER;�CHRSET:CHRARRAY);‰VARƒI‚:‚INTEGER;‰BEGIN�(*�ASGCODE�*)‰FOR�I�:=�1�TO�16�DO%ŒASCII(.CHRSET(.I.).)�:=�CODE�+�I�-�1‰END;‚(*�ASGCODE�*) †BEGIN�(*�INITIALIZE�*)†FOR�I:=�0�TO�CHRMAX�DO‰BEGIN9‰ASCII(.CHR(I).)�:=�0;‰(*�INDICATE�NON-ASCII�CHARCTERS�*)‰NUM(.CHR(I).)�:=�0‰END;)†INTERACTIVE(INPUT);Ž(*#�UNIQUE�TO�IBM�*)†REWRITE(OUTFIL);1†ASHEX�:=�'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';!†ASGCODE(112,'pqrstuvwxyz{|}~�');!†ASGCODE(32,'�!"#$%&''()*+,-./'); †ASGCODE(48,'0123456789:;<=>?'); †ASGCODE(64,'@ABCDEFGHIJKLMNO'); †ASGCODE(80,'PQRSTUVWXYZ[\]^_'); †ASGCODE(96,'`abcdefghijklmno'); <†(*#�THE�FOLLOWING�STATEMENT�WAS�REQUIRED�TO�ALLOW�UPLOADING†OF�'~'�TO�IBM�*) †ASCII(.CHR(95).)�:=�126; †FOR�I�:=�1�TO�36�DO‰NUM(.ASHEX(.I.).)�:=�I�-�1;†NUM(.'�'.)�:=�0;†BUFFP�:=�BLKCNT*CMAX+1;†BUFF(.3.)�:=�'A';/†WRITE(OUTPUT,'PREAMBLEU');‰(*�SEND�PREAMBLE�*)(†WRITE(OUTPUT,OPTION);Ž(*�SEND�OPTION�*),†WRITE(OUTPUT,CMAX:3);Ž(*�SEND�BLOCK�SIZE�*)1†WRITELN(OUTPUT,BLKCNT:1);Š(*�SEND�BLOCK�COUNT�*)†RESPONSE�:=�'�';†END;‚(*�INITIALIZE�*)  .PROCEDURE GETREC(VAR Q:BOOLEAN; VAR P:BFINDEX;6“VAR�BUFF:BFTYPE;�VAR�REC:RECTYPE;�VAR�RESPONSE:CHAR); VARƒI,Jƒ:‚INTEGER;†C1,C2�:‚CHAR; GƒPROCEDURE�GETFRAME(VAR�BUFF:BFTYPE;�VAR�Q:BOOLEAN;�VAR�RESPONSE:CHAR);  ƒVARƒI…:‚INTEGER; ‰J…:‚INTEGER; ‰K…:‚INTEGER;‰CKSUM1:‚INTEGER;‰CKSUM2:‚INTEGER;‰TBLOCK:‚BKTYPE; †BEGIN�(*�GETFRAME�*) †IF�BUFF(.3.)�=�'Z'†THEN ‰Q�:=�TRUE; †IF�NOT�Q†THEN‰REPEATŒI�:=�1;ŒJ�:=�1;ŒIF�RESPONSE�<>�'�';ŒTHEN�WRITELN(OUTPUT,RESPONSE);�(*�RESPOND�TO�LAST�FRAME�*)ŒWHILE�J�<=�BLKCNT�DO�BEGIN�READLN(INPUT,TBLOCK); �J�:=�J�+�1;�FOR�K�:=�1�TO�CMAX�DO’BEGIN’BUFF(.I.)�:=�TBLOCK(.K.); ’I�:=�I�+�1;’END;�IF�BUFF(.1.)�=�'T'�THEN*’J�:=�BLKCNT�+�1;‚(*�FORCED�TERMINATION�*)�END;ŒQ�:=�BUFF(.1.)�=�'T'; ŒIF�NOT�QŒTHEN�BEGIN�RESPONSE�:=�'N';2�CKSUM1�:=�16*NUM(.BUFF(.1.).)�+�NUM(.BUFF(.2.).);�IF�CKSUM1�<>�0�THEN’BEGIN ’CKSUM2�:=�0;’FOR�I�:=�3�TO�BLKCNT*CMAX�DO%•CKSUM2�:=�CKSUM2+ASCII(.BUFF(.I.).); ’CKSUM2�:=�(CKSUM2�MOD�255)�+�1;’IF�CKSUM1�<>�CKSUM2’THEN•RESPONSE�:=�'R'Œ(*�NAK�*)’END;�(*THEN*) �END�(*THEN*)‰UNTIL�(RESPONSE�=�'N')�OR�(Q)†END;�(*�GETFRAME�*)  ;ƒPROCEDURE�GETC(VAR�C:CHAR;�VAR�BUFF:BFTYPE;�VAR�P:BFINDEX;•VAR�Q:BOOLEAN); †BEGIN�(*GETC*)†IF�P�<=�BLKCNT*CMAX†THEN‰BEGIN‰C�:=�BUFF(.P.); ‰P�:=�P�+�1‰END†ELSE‰BEGIN‰GETFRAME(BUFF,Q,RESPONSE);‰C�:=�BUFF(.4.);‰P�:=�5‰END†END;�(*GETC*)  ƒBEGIN�(*�GETREC�*)2ƒGETC(C1,BUFF,P,Q);‹(*�DIGIT�#1�OF�LENGTH�FIELD�*)2ƒGETC(C2,BUFF,P,Q);‹(*�DIGIT�#2�OF�LENGTH�FIELD�*)ƒIF�C1�=�'�'�THEN�Q�:=�TRUE; ƒIF�NOT�QƒTHEN†BEGIN#†COUNT�:=�NUM(.C1.)*16�+�NUM(.C2.);†J�:=�1;†I�:=�1;†WHILE�I�<=�COUNT�DO‰BEGIN‰GETC(REC(.J.),BUFF,P,Q);‰IF�REC(.J.)�=�'|'‰THENŒBEGIN4ŒGETC(BCHR,BUFF,P,Q);„(*�GET�COMPRESSED�CHARACTER�*)(ŒGETC(C1,BUFF,P,Q);†(*�GET�COUNT�CODE�*)8ŒBCNT�:=�NUM(.C1.);†(*�COUNT�OF�COMPRESSED�CHARACTERS�*)ŒWHILE�BCNT�>�0�DO�BEGIN5�REC(.J.)�:=�BCHR;„(*�EXPAND�COMPRESSED�CHARACTERS�*)�BCNT�:=�BCNT�-�1; �J�:=�J�+�1�END;%ŒI�:=�I�+�3Ž(*�ADVANCE�GET�COUNTER�*) ŒENDƒ(*THEN*)‰ELSEŒBEGIN&ŒI�:=�I�+�1;�(*�ADVANCE�GET�COUNTER�*)&ŒJ�:=�J�+�1;�(*�ADVANCE�PUT�POINTER�*) ŒENDƒ(*ELSE*)‰END;‚(*WHILE*)†COUNT�:=�J�-�1;†END‚(*�THEN�*)ƒEND;�(*�GETREC�*)  8 5PROCEDURE PUTREC(VAR COUNT:INTEGER; VAR REC:RECTYPE); ƒVARƒI‚:‚INTEGER; ƒBEGIN�(*�PUTREC�*)ƒI�:=�1;ƒWHILE�I�<=�COUNT�DO†BEGIN†WRITE(OUTFIL,REC(.I.)); †I�:=�I+1†END;ƒWRITELN(OUTFIL);ƒEND;�(*�PUTREC�*) BEGIN„(*�MAIN�*) INITIALIZE; Q := FALSE;"GETREC(Q,BUFFP,BUFF,REC,RESPONSE);WHILE NOT Q DOƒBEGINƒPUTREC(COUNT,REC);#ƒGETREC(Q,BUFFP,BUFF,REC,RESPONSE);ƒEND;,WRITELN(OUTPUT,'T')�(*�TERMINATE�WITH�'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 ¹&ŠTTL„BIOS�-�BASIC�INPUT/OUTPUT�SERVICE0BIOS†IDNTƒ5,0„BASIC�INPUT/OUTPUT�SERVICE�5/26/82ŠOPT�PCS,FRS,MEX*.*‰BIOS�IS�A�BASIC�INPUT/OUTPUT�SERVICE�PROGRAM4*‰THIS�VERSION�OF�BIOS�MAY�BE�RUN�USING�AN�EXORmacs,1*‰A�VERSAmodule-01,�A�VERSAmodule-02�OR�A�VME110.*7*‰BIOS�USES�CONDITIONAL�ASSEMBLY�STATEMENTS�TO�SEPARATE@*‰THE�EXORmacs,VERSA�-�AND�VMEmodule�FUNCTIONS.�THIS�PROGRAM�MAY?*‰ALSO�BE�USED�EITHER�WITH�OR�WITHOUT�AN�MMU.�THESE�DIFFERENCES8*‰ARE�ALSO�SET-UP�USING�CONDITIONAL�ASSEMBLY�STATEMENTS.5*‰THERE�IS�NO�MMU�ASSOCIATED�WITH�A�VERSAmodule-01,�A*‰VERSAmodule-02�OR�A�VME110.*5*‰ANY�OF�THE�VECTORS�AND�DEVICE�CONFIGURATIONS�MAY�BEB*‰ALTERED�OR�DELETED.�NEW�CONFIGURATIONS�MAY�BE�ADDED�AT�ANY�TIME.!*‰THE�CURRENT�CONFIGURATIONS�ARE:*%*‰EXORmacs�DEVICES�KNOWN�TO�BIOS�ARE:*‰2�ACIA'S�FOR�2�CONSOLES*‰1�PIA�FOR�THE�PRINTER+*‰THESE�THREE�DEVICES�USE�VECTOR�#139�($8B)*+*‰VERSAmodule-01�DEVICES�KNOWN�TO�BIOS�ARE:*‰2�SERIAL�PORTS�FOR�2�CONSOLES(*‰THESE�TWO�DEVICES�USE�VECTOR�#29�($1D)!*‰1�PARALLEL�PORT�FOR�THE�PRINTER#*‰THIS�DEVICE�USES�VECTOR�#30�($1E)*+*‰VERSAmodule-02�DEVICES�KNOWN�TO�BIOS�ARE:*‰2�SERIAL�PORTS�FOR�2�CONSOLES'*‰THESE�2�DEVICES�USE�VECTOR�#140�($8C)*#*‰VME110�DEVICES�KNOWN�TO�BIOS�ARE:"*‰1�ACIA�SERIAL�PORT�FOR�CONSOLE�1#*‰THIS�DEVICE�USES�VECTOR�#29�($1D)*/*‰EXTERNAL�BOARD�VME400�CONNECTED�TO�THE�VME110-*‰VIA�THE�I/O�CHANNEL�HAS�THESE�DEVICES�KNOWN *‰TO�BIOS:*‰2�SERIAL�PORTS�FOR�2�CONSOLES&*‰THESE�2�DEVICES�USE�VECTOR�#26�($1A)*/*‰EXTERNAL�BOARD�VME410�CONNECTED�TO�THE�VME110-*‰VIA�THE�I/O�CHANNEL�HAS�THESE�DEVICES�KNOWN *‰TO�BIOS:*‰2�PIA'S�FOR�2�PRINTERS&*‰THESE�2�DEVICES�USE�VECTOR�#25�($19)*:*‰EACH�OF�THESE�DEVICES�HAVE�A�CHANNEL�CONTROL�BLOCK�(CCB)7*‰9 ASSOCIATED�WITH�THEM�WHICH�CONTAINS�THE�MEMORY�MAPPED8*‰I/O�ADDRESS�FOR�EACH�DEVICE,THE�LOGICAL�UNIT�NUMBER(S)4*‰ASSOCIATED�WITH�EACH�DEVICE,THE�READ/WRITE�ROUTINE5*‰ADDRESSES,�AND�OTHER�PERTINENT�INFORMATION.�SEE�THE*‰CCB�LAYOUT�FOR�SPECIFICS. 8$"<*B2G:JBCJFR<Z>bQjRr6z<‚AŠ<’<š:¢ª².º<Â6Ê2Ò8Ú0â4ê>ò6ú35*‰BIOS�CONTAINS�AN�INTERRUPT�SERVICE�ROUTINE�FOR�EACH6*‰VECTOR�IT�IS�AWARE�OF.�THE�ACTUAL�I/O�IS�DONE�WITHIN!*‰THE�INTERRUPT�SERVICE�ROUTINES.*@*ˆBIOS�MAY�BE�PLACED�IN�A�ROM.�A�DATA�SEGMENT�IS�ACQUIRED�AT�THE<*ˆSTART�OF�BIOS�AND�INITIALIZED�FOR�USE.�THE�BASE�ADDRESS�OF9*ˆTHE�DATA�SEGMENT�IS�KEPT�IN�REGISTER�A6�DURING�ALL�BIOS8*ˆPROCESSING.�IN�THE�INTERRUPT�SERVICE�ROUTINES,THE�BASE3*ˆADDRESS�IS�PASSED�IN�REGISTER�A1�AND�MOVED�TO�A6. PAGE8*ˆANY�OF�THE�CCB'S�MAY�BE�CHANGED�OR�DELETED�TO�USE�BIOS8*ˆAS�A�CUSTOM�DRIVER.�THE�ACIA�AND�PIA�CCB'S�MAY�BE�USED7*ˆWITH�VERSAmodule-01�WITH�A�VAM�BOARD�INSTEAD�OF�USING;*ˆTHE�VERSAmodule-01�SERIAL�AND�PARALLEL�PORTS.�BIOS�IS�RUNA*ˆCOMPLETELY�IN�AN�INTERRUPT�DRIVEN�MODE.�EACH�DRIVER�IS�ACTUALLY8*ˆA�SUBROUTINE,CALLED�FROM�THE�TRAP�2�HANDLER�ROUTINE�OR:*ˆFROM�THE�I/O�COMLETION�ROUTINE.�THE�INDIVIDUAL�DEVICE�ISB*ˆSET�TO�INTERRUPT�MODE�AND�THE�DRIVER�THEN�RETURNS�TO�THE�CALLER.>*ˆTHE�ACTUAL�I/O�IS�DONE�WITHIN�THE�INTERRUPT�SERVICE�ROUTINES:*ˆFOR�THE�DEVICES.�ONE�BYTE�IS�HANDLED�AT�A�TIME.�WHEN�THE<*ˆINTERRUPT�SERVICE�ROUTINE�IS�DONE�WITH�THE�I/O�(I/O�BUFFER=*ˆIS�EMPTY�OR�AN�ERROR�WAS�DETECTED)�THE�ISR�EXITS�BY�ISSUINGA*ˆAN�EVENT�TO�BIOS.�THIS�EVENT�IS�PROCESSED�IN�THE�MODULE�ISREVT.<*ˆCOMPLETION�FLAGS�ARE�SET�IN�THIS�ROUTINE�AND�A�RETURN�FROM>*ˆEVENT�IS�ISSUED.�BIOS�RETURNS�TO�THE�LINE�FOLLOWING�THE�WAIT<*ˆFOR�EVENT�DIRECTIVE�AFTER�ANY�EVENT�HANDLING�IS�COMPLETED.8*ˆTHIS�MODULE�DETERMINES�WHICH�CCB'S�HAVE�COMPLETED�I/O.:*ˆIF�A�COMPLETION�IS�FOUND,�THE�CALLER�IS�NOTIFIED�AND�THE=*ˆNEXT�REQUEST�FOR�I/O�IS�INITIATED.�IF�THERE�ARE�NO�REQUESTS4*ˆQUEUED�FOR�THIS�CCB,BIOS�WAITS�FOR�THE�NEXT�EVENT.**ˆBIOS�USES�THE�FOLLOWING�INTERNAL�TABLES:2*ˆTRAP1PB:ƒA�COMMON�AREA�FOR�ANY�TRAP�1�DIRECTIVESF*ˆRTBL:�REQUEST�TABLE�-�SEE�THE�REQUEST�TABLE�LAYOUT�FOR�DOCUMENTATION8*ˆMENU:�I/O�MENU�-�DRIVES�THE�INTERRUPT�SERVICE�ROUTINES0*ˆRECBUF:CALLER�I/O�BUFFERS�(USED�WITH�MMU�ONLY)6*ˆTHESE�TABLES�ARE�DOCUMENTED�IN�BIOS�WITH�THE�LAYOUTS*ˆOF�THE�TABLE�ENTRIES. PAGE*/*‰CONDITIONAL�ASSEMBLY�FLAGS�USED�TO�DIRECT�THE5*‰ENVIRONMENT�BIOS�RUNS�IN.�THESE�FLAGS�ARE�TO�BE�SET)*‰FOR�EACH�CONFIGURATION�BIOS�CAN�RUN�IN.*D********************************************************************* *‰MMU�FLAG*‰0=RUNNING�WITH�NO�MMU*‰1=RUNNING�WITH�AN�MMU8*‰IF�RUNNING�WITH�AN�MMU,BIOS�MUST�GET�THE�MEMORY�MAPPED=*‰I/O�SPACE�AS�A�SEGMENT.�BIOS�MUST�ALSO�USE�INTERNAL�BUFFERS4*‰FOR�THE�I/O�RECORDS.�WHEN�THERE�IS�NO�MMU,BIOS�MAY"*‰USE�THE�REQUESTOR'S�I/O�BUFFERS.* MMU‡EQU„1*F***********************************************************************$*‰VERSAmodule-01�PARALLEL�PORTS�FLAG1*‰0=NOT�USING�A�PARALLEL�PORT�IN�A�VERSAmodule-01-*‰1=USING�A�PARALLEL�PORT�IN�A�VERSAmodule-017*‰WHEN�RUNNING�IN�A�VERSAmodule-01,BIOS�IS�AWARE�OF�THE7*‰PARALLEL�PORTS�ASSOCIATED�WITH�THE�LEVEL�6�INTERRRUPT *‰AUTOVECTOR.* VMPP†EQU„0*H*************************************************************************"*‰VERSAmodule-01�SERIAL�PORTS�FLAG/*‰0=NOT�USING�A�SERIAL�PORT�IN�A�VERSAmodule-01)*‰1=USING�SERIAL�PORT�IN�A�VERSAmodule-017*‰WHEN�RUNNING�IN�A�VERSAmodule-01,BIOS�IS�AWARE�OF�THE5*‰SERIAL�PORTS�ASSOCIATED�WITH�THE�LEVEL�5�INTERRRUPT *‰AUTOVECTOR.* VMS‡EQU„0*K****************************************************************************"*‰VERSAmodule-02�SERIAL�PORTS�FLAG2*‰0=NOT�USING�THE�SERIAL�PORTS�IN�A�VERSAmodule-02.*‰1=USING�THE�SERIAL�PORTS�IN�A�VERSAmodule-027*‰WHEN�RUNNING�IN�A�VERSAmodul9 e-02,BIOS�IS�AWARE�OF�THE;*‰SERIAL�PORTS�ASSOCIATED�WITH�LEVEL�6�INTERRRUPTS�&�VECTOR>*‰#140($8C).�THESE�PORTS�ARE�CONFIGURED�FOR�ASYNCHRONOUS�MODE.* VM2‡EQU„0*O******************************************************************************* PAGED**********************************************************************‰EXORmacs�ACIA-PIA�FLAG*‰0=NOT�RUNNING�IN�AN�EXORmacs*‰1=RUNNING�IN�AN�EXORmacs6*‰WHEN�RUNNING�IN�AN�EXORmacs�THE�STANDARD�I/O�DEVICES6*‰USED�ARE�2�ACIAS�FOR�THE�TERMINALS�AND�1�PIA�FOR�THE%*‰PRINTER,ALL�USING�VECTOR�#139($8B).* EXOR†EQU„1*D*********************************************************************'*‰ACIA�FLAG�FOR�THE�READ/WRITE�ROUTINES'*‰0=NOT�USING�AN�ACIA�FOR�THE�TERMINALS#*‰1=USING�AN�ACIA�FOR�THE�TERMINALS* ACIA†EQU„0*A******************************************************************&*‰PIA�FLAG�FOR�THE�READ/WRITE�ROUTINES#*‰0=NOT�USING�A�PIA�FOR�THE�PRINTER*‰1=USING�A�PIA�FOR�THE�PRINTER* PIA‡EQU„1*B*******************************************************************6*‰VERSAmodule-01�SERIAL�PORT-ASYNCHRONOUS�FLAG�FOR�THE*‰READ/WRITE�ROUTINES<*‰0=NOT�USING�A�VERSAmodule-01�SERIAL�PORT-ASYNCHRONOUS�MODE9*‰1=�USING�A�VERSAmodule-01�SERIAL�PORT-ASYNCHRONOUS�MODE* VMSA†EQU„0*D*********************************************************************5*‰VERSAmodule-01�SERIAL�PORT-SYNCHRONOUS�FLAG�FOR�THE=*‰READ/WRITE�ROUTINES.�THIS�VERSION�OF�BIOS�IS�NOT�CONFIGURED6*‰TO�SUPPORT�THE�SERIAL�PORTS�IN�THE�SYNCHRONOUS�MODE.;*‰0=NOT�USING�A�VERSAmodule-01�SERIAL�PORT-SYNCHRONOUS�MODE8*‰1=�USING�A�VERSAmodule-01�SERIAL�PORT-SYNCHRONOUS�MODE* VMSS†EQU„0*G*********************************************************************** PAGEG*************************************************************************‰VMEmodule�-�VME110*‰0=NOT�RUNNING�IN�A�VME110*‰1=RUNNING�IN�A�VME110(*‰WHEN�RUNNING�IN�A�STANDARD�VME110�ONLY$*‰ONE�ACIA�IS�USED�FOR�TERMINAL�I/O.**‰IF�USING�OFF-BOARD�I/O�DEVICES�SET�FLAGS*‰BELOW* VME110„EQU„0*F***********************************************************************@*‰VMEmodule�-�VME410�PIA�FLAG�(VME410�USED�TOGETHER�WITH�VME110)*‰0=NOT�USING�OFF-BOARD�PIA'S*‰1=USING�OFF-BOARD�PIA'S* VMEPIA„EQU„0*F***********************************************************************;*‰VMEmodule�-�VME400�SERIAL�PORT�FLAG�(VME400�USED�TOGETHER,*‰WITH�VME110).�NOTICE�BAUD�RATE�FLAG�BELOW.$*‰0=NOT�USING�OFF-BOARD�SERIAL�PORTS *‰1=USING�OFF-BOARD�SERIAL�PORTS*VME400SP‚EQU„0*F**********************************************************************#*‰VMEmodule�-�VME400�BAUD�RATE�FLAG:*‰USING�BIOS�YOU�MAY�CHOOSE�BETWEEN�16�SOFTWARE�SELECTABLE;*‰BAUD�RATES.�BIOS�DOESN'T�TAKE�ANY�NOTICE�OF�THE�HARDWARE,*‰JUMPER�SELECTED�BAUD�RATE.*‰MENU:*)*†HEX�VALUE„BAUD�RATEƒHEX�VALUE„BAUD�RATE *‹0‰50�8‡1800 *‹1‰75�9‡2000*‹2ˆ110�A‡2400*‹3ˆ134.5‹B‡3600*‹4ˆ150�C‡4800*‹5ˆ300�D‡7200*‹6ˆ600�E‡9600*‹7‡1200�F†19200* VMEBPSP2‚EQU…$E“PORT�2�9600�BAUD VMEBPSP3‚EQU…$E“PORT�3�9600�BAUD*F********************************************************************** PAGE**‰COMMON�EQUATES�USED�BY�BIOS*1TASK†EQU„0’TASK�NAME�FOR�TRAP�#1�PARAMETER�BLOCKS7SESSN…EQU„0’SESSION�NUMBER�FOR�TRAP�#1�PARAMETER�BLOCKS'TRAP2…EQU„2’TRAP�#�USED�FOR�I/O�SERVICE7TRAP3…EQU„3’TRAP#�USED�FOR�SERVICE-NO�ACTUAL�PROCESSING,ENTRY…EQU„10‘NUMBER�OF�REQUEST�TABLE�ENTRIES1RECSIZ„EQU„200�MAXIMUM�RECORD�SIZE�IF�HAVE�AN�MMUCRˆEQU„$0D�CARRIAGE�RETURNLFˆEQU„$0A�LINE�FEED4FIVE†EQU„5’MAX�#�OF�NORMAL�I/O�ENTRIES�IN�MENU�TABLEDEL‡EQU„$7F�DELETE�CHARACTERBSˆEQU„$08�BACKSPACE�CHARACTER!CNTLS…EQU„$13�CONTROL-S�CHARACTER!CNTLX…EQU„$18�CONTROL-X�CHARACTER**‰EXEC�DIRECTIVE�EQUATES*GTSEG…EQU„1’ALLOCATE�A�SEGMENTMOVELL„EQU„6’MOVE�LOGICALABORT…EQU„14‘ABORTGTASQ…EQU„31‘ALLOCATE�AN�ASQSETASQ„EQU„33‘SET�ASQ�STATUSRDEVNT„EQU„34‘READ�EVENTWTEVNT„EQU„36‘WAIT�FOR�AN�EVENTSERVER„EQU: „51‘CLAIMING�SERVER'DERQST„EQU„53‘SET�SERVER�REQUEST�STATUS!AKRQST„EQU„54‘ACKNOWLEDGE�REQUEST/CISR†EQU„61‘CONFIGURE�INTERRUPT�SERVICE�ROUTINE**‰INTERRUPT�VECTORS�NUMBERS* ‰IFEQ‚VME1102VECTSP„EQU„29‘LEVEL�5�AUTOVECTOR-SERIAL�PORTS-VM014VECTPP„EQU„30‘LEVEL�6�AUTOVECTOR-PARALLEL�PORTS-VM01‰ENDC ‰IFNE‚EXOR9VECTEXOR‚EQU„139�ACIA-PIA�VECTOR-COMPATABLE�WITH�EXORmacs‰ENDC ‰IFNE‚VM2(VECTVM2ƒEQU„140�VECTOR-SERIAL�PORTS-VM02‰ENDC ‰IFNE‚VMEPIA0V110PIA‚EQU…25‘AUTOVECTOR�1�OFF-BOARD�PIA�VME110‰ENDC‰IFNE‚VME400SP/VECTVM2ƒEQU„26‘AUTOVECTOR�2�OFF-BOARD�SP�VME110‰ENDC ‰IFNE�VME1102VECTEXOR‚EQU„29‘ACIA�VECTOR-COMPATIBLE�WITH�VME110‰ENDC*)*‰ERROR�CODES�RETURNED�TO�THE�TARGET�TASK*ISTAIF„EQUƒ$82‡INVALID�FUNCTIONISTAILUƒEQUƒ$83‡INVALID�LUN2ISTADD„EQUƒ$84‡INVALID�DATA�BUFFER�ADDRESS�OR�SIZE/ISTATM„EQUƒ$C5‡INVALID�TRANSFER�FOR�THIS�DEVICEISTAFE„EQUƒ$C6‡FRAMING�ERRORISTAIE„EQUƒ$C7‡INTERNAL�ERROR ISTADNRƒEQUƒ$E1‡DEVICE�NOT�READYISTADO„EQUƒ$EA‡DATA�OVERRUN PAGE**‰SERVER�EVENT�CODE�$07�LAYOUT* ŠOFFSET�0EVLNG…DS.Bƒ1’EVENT�LENGTHEVCODE„DS.Bƒ1’EVENT�CODEEVTIN…DS.Bƒ1’TRAP�#!EVPRI…DS.Bƒ1’REQUESTOR'S�PRIORITY"EVTSK…DS.Lƒ1’REQUESTOR'S�TASK�NAME'EVSES…DS.Lƒ1’REQUESTOR'S�SESSION�NUMBER%EVUNUM„DS.Wƒ1’REQUESTOR'S�USER�NUMBER#EVD0†DS.Lƒ1’REQUESTOR'S�REGISTER�D0#EVA0†DS.Lƒ1’REQUESTOR'S�REGISTER�A0#EVSTA…DS.Bƒ1’PARAMETER�BLOCK�STATUS"EVPSIZ„DS.Bƒ1’PARAMETER�BLOCK�SIZE"EVPB†EQU„*’PARAMETER�BLOCK�FOLLOWSPBCODE„DS.Bƒ1’CODEPBFNC…DS.Bƒ1’FUNCTIONPBOPTS„DS.Wƒ1’OPTIONSPBSTA…DS.Bƒ1’STATUSPBLUN…DS.Bƒ1’LUNŠDS.Wƒ1’RESERVED!PBRRN…DS.Lƒ1’RANDOM�RECORD�NUMBER!PBSAD…DS.Lƒ1’BUFFER�START�ADDRESSPBEAD…DS.Lƒ1’BUFFER�END�ADDRESS!PBLNG…DS.Lƒ1’DATA�TRANSFER�LENGTHPBCAD…DS.Lƒ1’COMPLETION�ADDRESS.IOSPBLNG‚EQU„*-EVPB�IOS�PARAMETER�BLOCK�LENGTH EVPBLNG…EQU„*-EVLNGŠTOTAL�LENGTH PAGE**‰REQUEST�TABLE�LAYOUT* ŠOFFSET�0BIOS05‚MOVE.L�A0,A6‰SAVE�AND�USE�PHYSICAL�ADDRESS�OF�DATA�AREA*6*ˆINITIALIZE�SOME�DATAƒA6=BASE�ADDRESS�OF�DATA�SEGMENT*3‰MOVE.L�#STACK/2,D0ŒNUMBER�OF�WORDS�IN�DATA�SEGMENT.BIOSCLR‚CLR.W�(A0)+“CLEAR�OUT�THE�DATA�SEGMENT‰SUB.L�#1,D0“DECREMENT�COUNTER(‰BNE.S�BIOSCLR‘BRANCH�IF�NOT�ALL�CLEARED1‰MOVE.W�#$0A0D,LFCR(A6)ˆLINE�FEED�CARRIAGE�RETURN ‰MOVE.W�#'\�',BKSL(A6)‰BACKSLASH9‰MOVE.L�#ENTRY,ENTRIES(A6)…MAX�NUMBER�OF�STACKED�REQUESTS(‰LEA„STACK(A6),A7‹LOAD�THE�STACK�POINTER!ŠIFNEƒMMU�ASSEMBLE�IF�HAVE�AN�MMU*#*‰ATTACH�TO�MEMORY�MAPPED�I/O�SPACE*7ŠLEA…TRAP1PB(A6),A0‰GET�SEGMENT�PARAMETER�BLOCK�ADDRESS1‰MOVE.L�A0,A1’USE�A1�TO�BUILD�THE�PARAMETER�BLOCK‰CLR.L�(A1)+“TASK�NAME=ME‰CLR.L�(A1)+“SESSION=ME6‰MOVE.W�#SEGOPTS,(A1)+‰OPTIONS=MEMORY�MAPPED�I/O�SPACE0‰MOVE.W�#SEGATR,(A1)+ŠATTRIBUTES=PHYSICAL�MEMORY"‰MOVE.L�#'SHRS',(A1)+ŠSEGMENT�NAME%‰MOVE.L�#SEGADR,(A1)+ŠSEGMENT�ADDRESS#‰MOVE.L�#SEGLNG,(A1)‹SEGMENT�LENGTH'ŠMOVE.L�#GTSEG,D0ŠGET�SEGMENT�DIRECTIVE%ŠTRAPƒ#1‘CALL�EXEC�TO�DO�THE�ALLOCATE(ŠBNE„GTSEGERR‹GO�ABORT�IF�AN�ERROR-FATALŠENDC***‰ALLOCATE�AN�ASYNCHRONOUS�SERVICE�ROUTINE,*‰TO�BE�USED�FOR�TRAP�#2�AND�TRAP�#3�SERVICE*8ŠLEA�TRAP1PB(A6),A0„ALLOCATE�ASQ�PARAMETER�BLOCK�ADDRESS1ŠMOVE.L�A0,A1ŽUSE�A1�TO�BUILD�THE�PARAMETER�BLOCKŠCLR.L�(A1)+�TASK=MEŠCLR.L�(A1)+�SESSION=MEŠMOVE.B�#ASQSTAT,(A1)+†STATUS-ŠMOVE.B�#EVPBLNG,(A1)+†MAXIMUN�MESSAGE�LENGTH ŠMOVE.L�#ASQLNG,(A1)+‡ASQ�LENGTH0ŠMOVE.L�#ISREVT,(A1)+‡ASR�ADDRESS-FOR�ISR�RETURN‰CLR.L‚(A1)‘NOT�USED(ŠMOVE.L�#GTASQ,D0ŠALLOCATE�ASQ�DIRECTIVE%ŠTRAPƒ#1‘CALL�EXEC�TO�DO�THE�ALLOCATE(ŠBNE„GTASQERR‹GO�ABORT�IF�AN�ERROR-FATAL**‰CLAIM�TRAP�#2�FOR�SERVICE(*‰USER�I/O�CALLS�USE�TRAP�#2�FOR�SERVICE*<ŠLEA�TRAP1PB(A6),A0„ESTABLISH�SERVER�PARAMETER�BLOCK�ADDRESS1ŠMOVE.L�A0,A1ŽUSE�A1�TO�BUILD�THE�PARAMETER�BLOCK#ŠMOVE.L�#SERVTRAP,(A1)+‡ASR�ADDRESSŠMOVE.B�#SERVTN2,(A1)+ˆTRAP�#2%ŠMOVE.B�#SERVTL,(A1)ŠPARAMETER�LENGTH-‰MOVE.L�A0,A1’RESTORE�PARAMETER�BLOCK�ADDRESS#ŠMOVE.L�#SERVER,D0‰SERVER�DIRECTIVE&ŠTRAPƒ#1‘CALL�EXEC�TO�DO�THE�ESTABLISH(ŠBNE„SERVERR2‹GO�ABORT�IF�AN�ERROR-FATAL**‰CLAIM�TRAP�#3�FOR�SERVICEB*‰TO�BE�COMPATABLE�WITH�VERSAdos�-�BIOS�DOES�NO�TRAP�#3�PROCESSING6*‰STATUS�IS�SET�TO�ZERO�(GOOD�RETURN)�AND�< BIOS�RETURNS*"‰ADD.L�#4,A1�BUMP�PAST�ASR�ADDRESS1ŠMOVE.B�#SERVTN3,(A1)+†TRAP�#3,NO�PARAMETER�BLOCK%ŠCLR.B‚(A1)�NO�PARAMETER�BLOCK�LENGTHŠMOVE.L�#SERVER,D0‰DIRECTIVE&ŠTRAPƒ#1‘CALL�EXEC�TO�DO�THE�ESTABLISH(ŠBNE„SERVERR3‹GO�ABORT�IF�AN�ERROR-FATAL=ŠIFNE‚(EXOR+VME110)‡ASSEMBLE�IF�RUNNING�IN�AN�EXORmacs�OR�VME*7*‰CONFIGURE�INTERRUPT�SERVICE�ROUTINE�AND�CLAIM�CONTROL8*‰OF�THE�INTERRUPT�SERVICE�VECTOR�FOR�EXORmacs�OR�VME110C*‰ACIA�DEVICES(CONSOLES)�AND�THE�PIA�DEVICE(PRINTER)(EXORmacs�only)*+ŠLEA�TRAP1PB(A6),A0„PARAMETER�BLOCK�ADDRESS-ŠMOVE.L�A0,A1ŽUSE�A1�TO�BUILD�PARAMETER�BLOCKŠCLR.L�(A1)+�TASK=MEŠCLR.L�(A1)+�SESSION=ME#ŠCLR.W�(A1)+�OPTION=ALLOCATE�VECTOR?ŠMOVE.W�#VECTEXOR,(A1)+„VECTOR�NUMBER�USED�FOR�THE�ACIA'S�&�PIA8ŠMOVE.L�#EXORISR,(A1)+…INTERRUPT�SERVICE�ROUTINE�ADDRESS-ŠMOVE.L�A6,(A1)ŒPASS�THE�DATA�SEGMENT�ADDRESSŠMOVE.L�#CISR,D0‹CISR�DIRECTIVE#ŠTRAPƒ#1‘CALL�EXEC�TO�DO�THE�SET-UP(ŠBNE„CISREXER‹GO�ABORT�IF�AN�ERROR-FATAL)‰LEA�CCBBEG(A6),A0‰START�ADDRESS�OF�CCB'SŠENDC ‰IFNE�ACIA**ˆBUILD�THE�ACIA�CCB'S*(‰MOVE.L�#ACIACNT,D0ŒNUMBER�OF�ACIA�CCB'S%‰MOVE.L�#'ACIA',(A0)+‹I/O�DEVICE�TYPE/‰MOVE.L�#ACIAP1,(A0)+ŠMEMORY�MAPPED�I/O�ADDRESS‰MOVE.B�#ACIARL1,(A0)+‰READ�LUN ‰MOVE.B�#ACIAWL1,(A0)+‰WRITE�LUN.BIOS15ƒCLR.L�(A0)+“REQUEST�TABLE�ENTRY�ADDRESS,‰MOVE.L�#ACIAREAD,(A0)+ˆREAD�ROUTINE�ADDRESS-‰MOVE.L�#ACIAWRIT,(A0)+ˆWRITE�ROUTINE�ADDRESS8‰MOVE.L�#ACIAOWI,(A0)+‰OUTPUT�WITH�INPUT�ROUTINE�ADDRESS‰CLR.L�(A0)+“MENU�ADDRESS‰CLR.L�(A0)+“SAVE�AREA)‰MOVE.B�#-1,(A0)+ŽNO�INTERRUPT�BIT�NIMBER‰CLR.B�(A0)+“FLAGS‰CLR.W�(A0)+“FLAGS#‰MOVE.L�A0,A5’SAVE�NEXT�CCB�ADDRESS)‰IFEQ‚VME110’IF�VME110�THEN�ONLY�ONE�ACIA‰SUB.L�#1,D0“DECREMENT�COUNTER,‰BLE.S�BIOS20’BRANCH�IF�DONE�WITH�ACIA�CCB'S%‰MOVE.L�#'ACIA',(A0)+ŠI/O�DEVICE�TYPE/‰MOVE.L�#ACIAP2,(A0)+ŠMEMORY�MAPPED�I/O�ADDRESS‰MOVE.B�#ACIARL2,(A0)+ŠREAD�LUN ‰MOVE.B�#ACIAWL2,(A0)+ŠWRITE�LUN$‰BRA�BIOS15”GO�CONTINUE�BUILDING�CCB BIOS20‚EQU�*‰ENDC‰ENDC* ‰IFNE�VMEPIA*7*ˆCONFIGURE�INTERRUPT�SERVICE�ROUTINE�AND�CLAIM�CONTROL,*ˆOF�THE�INTERRUPT�SERVICE�VECTOR�FOR�VME110*ˆPIA�DEVICES�(PRINTER)*+‰LEA‚TRAP1PB(A6),A0‹PARAMETER�BLOCK�ADDRESS-‰MOVE.L‚A0,A1‘USE�A1�TO�BUILD�PARAMETER�BLOCK‰CLR.Lƒ(A1)+‘TASK=ME‰CLR.Lƒ(A1)+‘SESSION=ME#‰CLR.Wƒ(A1)+‘OPTION=ALLOCATE�VECTOR>‰MOVE.W‚#V110PIA,(A1)+ˆVECTOR�NUMBER�USED�FOR�THE�PIA'S�VME1109‰MOVE.L‚#EXORISR,(A1)+ˆINTERRRUPT�SERVICE�ROUTINE�ADDRESS-‰MOVE.L‚A6,(A1)�PASS�THE�DATA�SEGMENT�ADDRESS‰MOVE.L‚#CISR,D0ŽCISR�DIRECTIVE#‰TRAP„#1”CALL�EXEC�TO�DO�THE�SET-UP(‰BNE…CISREXERŽGO�ABORT�IF�AN�ERROR�FATAL‰ENDC ŠIFNEƒ(PIA+VMEPIA) **ˆBUILD�THE�PIA�CCB*%‰MOVE.L‚A5,A0‘USE�A0�TO�BUILD�THE�CCB&‰MOVE.L�#PIACNT,D0�NUMBER�OF�PIA�CCB'S%‰MOVE.L�#'PIA�',(A0)+ŠI/O�DEVICE�NAME.‰MOVE.L�#PIAP1,(A0)+ŠMEMORY�MAPPED�I/O�ADDRESS‰MOVE.B�#PIARL,(A0)+‹READ�LUN‰MOVE.B�#PIAWL1,(A0)+ŠWRITE�LUN.BIOS25ƒCLR.L�(A0)+“REQUEST�TABLE�ENTRY�ADDRESS1‰MOVE.L�#ISTATM,(A0)+ŠREAD�ROUTINE�ADDRESS-INVAID,‰MOVE.L�#PIAWRIT,(A0)+‰WRITE�ROUTINE�ADDRESS;‰MOVE.L�#ISTATM,(A0)+ŠOUTPUT�WITH�INPUT�ROUTINE�ADR-INVALID‰CLR.L�(A0)+“MENU�ADDRESS‰CLR.L�(A0)+“SAVE�AREA)‰MOVE.B�#-1,(A0)+ŽNO�INTERRUPT�BIT�NUMBER‰CLR.B�(A0)+“FLAGS‰CLR.W�(A0)+“FLAGS)‰MOVE.L�A0,A5’SAVE�THE�ADRESS�TO�NEXT�CCB ‰IFNEƒVMEPIA‘IF�VMEPIA�THEN‰SUB.L‚#1,D0’DECREMENT�COUNTER+‰BLE.S‚BIOS30‘BRANCH�IF�DONE�WITH�PIA�CCB'S%‰MOVE.L�#'PIA�',(A0)+‹I/O�DEVICE�TYPE.‰MOVE.L�#PIAP2,(A0)+‹MEMORY�MAPPED�I/O�ADDRESS‰MOVE.B�#PIARL,(A0)+‹READ�LUN‰MOVE.B�#PIAWL2,(A0)+ŠWRITE�LUN‰BRA.S‚BIOS25‘CONTINUE�BUILDINGBIOS30ƒEQU‡*“JUNCTION�AHEAD‰ENDC ‰IFNE�VMEPIA*3*ˆINITIALIZE�THE�FIRST�PIA�ON�EXTERNAL�BOARD�VME410*‰MOVE.L‚#PIAP1,A3�PIA1�ADDRESS‰CLR.BƒD0”CLEAR�FOR�USE&‰MOVE.B‚D0,2(A3)ŽSELECT�DDR�FOR�A-SIDE&‰MOVE.B‚D0,6(A3)ŽSELECT�DDR�FOR�B-SIDE‰MOVE.B„#$FF,(A3)‹A-SIDE=OUTPUT'‰MOVE.B‚#$80,4(A3)ŒB-SIDE=INPUT(STATUS)‰MOVE.B‚#$04,D0�SET-UP�FOR�USE2‰MOVE.B‚D0,2(A3)ŽSELECT�PERIPHERAL�DATA�REG�A-SIDE ‰MOVE.B‚(A3),D1�STROBE�TO�SET�IT2‰MOVE.B‚D0,6(A3)< ŽSELECT�PERIPHERAL�DATA�REG�B-SIDE!‰MOVE.B‚4(A3),D1ŽSTROBE�TO�SET�IT3‰MOVE.B‚#$2E,2(A3)ŒSET�A-SIDE�FOR�NO�INTERRUPTS�NOW3‰MOVE.B‚#$3C,6(A3)ŒSET�B-SIDE�FOR�NO�INTERRUPTS�NOW!‰BCLR.B„#7,4(A3)ŒCLEAR�FAIL�LIGHT‰MOVE.L„#PIAP2,A3‹PIAP2�ADDRESS)‰BRA.S…BIOS31ŽBRANCH�AND�INITIALIZE�PIA�2‰ENDC*5*‰INITIALIZE�THE�EXORmacs�PIA�OR�SECOND�PIA�ON�VME410*‰MOVE.L‚#PIAP1,A3ƒPIA1�ADDRESSBIOS31ƒCLR.BƒD0ŠCLEAR�FOR�USE&‰MOVE.B�D0,2(A3)…SELECT�DDR�FOR�A-SIDE&‰MOVE.B�D0,6(A3)…SELECT�DDR�FOR�B-SIDE‰MOVE.B�#$FF,(A3)„A-SIDE=OUTPUT%‰MOVE.B�D0,4(A3)…B-SIDE=INPUT(STATUS)‰MOVE.B�#$04,D0†SET-UP�FOR�USE7‰MOVE.B�D0,2(A3)…SELECT�PERIPHERAL�DATA�REGISTER�A-SIDE ‰MOVE.B‚(A3),D1…STROBE�TO�SET�IT7‰MOVE.B‚D0,6(A3)„SELECT�PERIPHERAL�DATA�REGISTER�B-SIDE!‰MOVE.B‚4(A3),D1„STROBE�TO�SET�IT3‰MOVE.B‚#$2E,2(A3)ƒSET�A-SIDE�FOR�NO�INTERRUPTS�NOW3‰MOVE.B‚#$3C,6(A3)ƒSET�B-SIDE�FOR�NO�INTERRUPTS�NOW‰ENDC ‰IFEQ�EXOR3‰CLR.L�D7ŒSAVE�THE�BIT�#'S�FOR�VM01�STATUS�REGISTER‰ENDC1ŠIFNEƒVMS�ASSEMBLE�IF�VERSAmodule-01-SERIAL�PORTS*7*‰CONFIGURE�INTERRUPT�SERVICE�ROUTINE�AND�CLAIM�CONTROL4*‰OF�THE�INTERRUPT�SERVICE�VECTOR�FOR�VERSAmodule-01*‰SERIAL�PORT�DEVICES.*+‰LEA�TRAP1PB(A6),A0…PARAMETER�BLOCK�ADDRESS-‰MOVE.L�A0,A1�USE�A1�TO�BUILD�PARAMETER�BLOCK‰CLR.L�(A1)+“TASK=ME‰CLR.L�(A1)+“SESSION=ME‰CLR.W�(A1)+“ALLOCATE�VECTOR/ŠMOVE.W�#VECTSP,(A1)+†VECTOR�NUMBER�FOR�SERVICE6ŠMOVE.L�#SPISR,(A1)+‡INTERRUPT�SERVICE�ROUTINE�ADDRESS-ŠMOVE.L�A6,(A1)ŒPASS�THE�DATA�SEGMENT�ADDRESS‰MOVE.L�#CISR,D0�CISR�DIRECTIVE#ŠTRAPƒ#1‘CALL�EXEC�TO�DO�THE�SET-UP(ŠBNE„CISRSPER‹GO�ABORT�IF�AN�ERROR-FATALŠENDC ‰IFEQ�VMSA+VME110/‰MOVE.L�#-1,A5‡SET�TO�NO�VM01�SERIAL�PORT�CCB'S‰ENDC ‰IFNE�VMSA*,*ˆBUILD�THE�VERSAmodule-01�SERIAL�PORT�CCB'S**‰MOVE.L�#SPCNT,D0„NUMBER�OF�CCB'S�TO�BUILD5‰MOVE.B�#VMSAP1BN,D1‹INTERRUPT�BIT�NUMBER�FOR�1ST�CCB$‰LEA�CCBBEG(A6),A0‰CCB�START�ADDRESS%‰MOVE.L�#'VMSA',(A0)+ŠI/O�DEVICE�TYPE/‰MOVE.L�#VMSAP1,(A0)+ŠMEMORY�MAPPED�I/O�ADDRESS‰MOVE.B�#VMSARL1,(A0)+ˆREAD�LUN ‰MOVE.B�#VMSAWL1,(A0)+ˆWRITE�LUN.BIOS30ƒCLR.L�(A0)+“REQUEST�TABLE�ENTRY�ADDRESS)‰MOVE.L�#SREAD,(A0)+‹READ�ROUTINE�ADDRESS*‰MOVE.L�#SWRIT,(A0)+‹WRITE�ROUTINE�ADDRESS5‰MOVE.L�#SOWI,(A0)+ŒOUTPUT�WITH�INPUT�ROUTINE�ADDRESS‰CLR.L�(A0)+“MENU�ADDRESS‰CLR.L�(A0)+“SAVE�AREA%‰MOVE.B�D1,(A0)+�INTERRUPT�BIT�NUMBER‰CLR.B�(A0)+”FLAGS‰CLR.W�(A0)+”FLAGS!‰SUB.L�#1,D0“MORE�CCB'S�TO�BUILD?‰BLE.S�BIOS40’BRANCH�IF�NO%‰MOVE.L�#'VMSA',(A0)+ŠI/O�DEVICE�TYPE/‰MOVE.L�#VMSAP2,(A0)+ŠMEMORY�MAPPED�I/O�ADDRESS‰MOVE.B�#VMSARL2,(A0)+ˆREAD�LUN ‰MOVE.B�#VMSAWL2,(A0)+ˆWRITE�LUN)‰MOVE.B�#VMSAP2BN,D1‹INTERRUPT�BIT�NUMBER ‰BRA�BIOS30”GO�BUILD�REST�OF�CCB)BIOS40ƒMOVE.L�A0,A5’SAVE�NEXT�CCB�ADDRESS‰ENDC ‰IFNE�VMSA*5*ˆINITIALIZE�VERSAmodule-01�SERIAL�PORTS-ASYNCHRONOUS*(‰MOVE.L�#CCBCNT,D1ƒTOTAL�NUMBER�OF�CCB'S(‰MOVE.L�#SPCNT,D0„NUMBER�OF�SERIAL�PORTS)‰LEA�CCBBEG(A6),A2ƒSTART�ADDRESS�OF�CCB'S E.B�#$05,CREG(A4)†POINT�TO�CONTROL�REGISTER�5�PORT�28ŠMOVE.B�#$E2,CREG(A3)†8�BITS,TRANSMITTER�DISABLED,PORT�18ŠMOVE.B�#$E2,CREG(A4)†8�BITS,TRANSMITTER�DISABLED,PORT�28ŠMOVE.B�#$11,CREG(A3)†POINT�TO�CONTROL�REGISTER�1�PORT�18ŠMOVE.B�#$11,CREG(A4)†POINT�TO�CONTROL�REGISTER�1�PORT�29ŠMOVE.B�#$1C,CREG(A3)†EXT.�INTERRUPT�&�Tx�DISABLED,PORT�19ŠMOVE.B�#$1C,CREG(A4)†EXT.�INTERRUPT�&�Tx�DISABLED,PORT�2ŠENDC**-*‰MAKE�ALL�ENTRIES�IN�THE�REQUEST�TABLE�EMPTY*&ŠLEA�RTBL(A6),A1‡REQUEST�TABLE�ADDRESS#ŠMOVE.L�#ENTRY,D0ŠNUMBER�OF�ENTRIES5BIOS10„BSET�#EMTY,RTSTAT(A1)…SET�ALL�ENTRIES�TO�EMPTY(ŠADD.L�#RTELNG,A1ŠBUMP�TO�THE�NEXT�ENTRY-ŠSUB.L�#1,D0�DECREMENT�NUMBER�OF�ENTRIES�LEFT#ŠBNE.S�BIOS10ŽBRANCH�IF�MORE�TO�SET*-*‰WAIT�FOR�A�TRAP�#2�OR�TRAP�#3�SERVICE�EVENT*WAITEVNT‚EQU„*+ŠMOVE.L�#WTEVNT,D0‰WAIT�FOR�EVENT�DIRECTIVEŠTRAPƒ#1‘CALL�EXECŠPAGE***’SEE�IF�AN�ENTRY�IN�THE�REQUEST�TABLE�HAS.*’COMPLETED�I/O.�IF�NONE�FOUND,WAIT�FOR�EVENT.4*’IF�AN�ENTRY�IS�FOUND,GO�DO�THE�COMPLETION�PROCESS.!*’A6=BASE�ADDRESS�OF�DATA�SEGMENT*!ŠMOVE.L�#SETASQ,D0‰SET�ASQ�STATUSŠMOVE.L�#9,A0ŽDISABLE�THE�ASRŠTRAP�#1“CALL�EXEC�TO�DISABLE(ŠBNE�SETASQERŽGO�ABORT�IF�AN�ERROR,FATAL-ŠMOVE.L�#ENTRY,D0ŠGET�NUMBER�OF�TABLE�ENTRIES&ŠLEA‚RTBL(A6),A1ŒREQUEST�TABLE�ADDRESS-CKIOC10ƒBTST�#ACT,RTSTAT(A1)†AN�ACTIVE�ENTRY?#ŠBEQ.S�CKIOC20�BRANCH�IF�NOT�ACTIVE)ŠMOVE.L�RTCCBA(A1),A2†GET�THE�CCB�ADDRESSŠTST.B�CCBIOC(A2)ŠI/O�COMPLETE?(ŠBEQ.S�IOC‘BRANCH�IF�THE�I/O�IS�COMPLETE,CKIOC20ƒADD.L�#RTELNG,A1ŠPOINT�TO�NEXT�ENTRY(ŠSUB.L�#1,D0�DECREMENT�NUMBER�OF�ENTRIES'ŠBNE.S�CKIOC10�BRANCH�IF�MORE�TO�SEARCH4ŠBRA�WAITEVNTŽNOTHING�READY�NOW-GO�WAIT�FOR�AN�EVENTŠPAGE**‰IOC„I/O�COMPLETED&*‰ENTRY:A1=REQUEST�TABLE�ENTRY�ADDRESS*�A2=CCB�ADDRESS*�A3=MEMORY�MAPPED�I/O�ADDRESS!*�A6=BASE�ADDRESS�OF�DATA�SEGMENT*ˆCALLS:MOVEPB„ACKSRQ* IOC‡EQU�*!ŠIFNE�MMU’ASSEMBLE�IF�HAVE�AN�MMU**‰MOVE�INPUT�BUFFER�TO�USER*)ŠBTST�#INP,RTFLAG(A1)†AN�INPUT�OPERATION?ŠBEQ.S�IOC20�BRANCH�IF�NO8ŠLEA�TRAP1PB(A6),A0‹MOVE�LOGICAL�PARAMETER�BLOCK�ADDRESS1ŠMOVE.L�PBSAD(A1),MOVDADR(A0)�DESTINATION�ADDRESS0IOC10…MOVE.L�PBLNG(A1),MOVLNG(A0)‚LENGTH�OF�MOVE&ŠBEQ.S�IOC20�BRANCH�IF�NOTHING�TO�MOVE&ŠMOVE.L�#TASK,MOVSTSK(A0)‚MY�TASK�NAME%ŠMOVE.L�#SESSN,MOVSSES(A0)�MY�SESSION-ŠMOVE.L�RTBUFA(A1),MOVSADR(A0)‚SOURCE�ADDRESS3ŠMOVE.L�EVTSK(A1),MOVDTSK(A0)„DESTINATION�TASK�NAME1ŠMOVE.L�EVSES(A1),MOVDSES(A0)‚DESTINATION�SESSION)ŠMOVE.L�#MOVELL,D0‰MOVE�LOGICAL�DIRECTIVE!ŠTRAP�#1“CALL�EXEC�TO�DO�THE�MOVE$ŠBEQ.S�IOC30�BRANCH�IF�A�GOOD�RETURN=ŠMOVE.B�#ISTADD,PBSTA(A1)‚ERROR-SET�TO�INVALID�BUFFER�ADDRESS1ŠBRA.S‚IOC30ŽGO�SEND�PARAMETER�BLOCK�BACK�TO�USER8IOC20…BTST�#OWIR,RTFLAG(A1)…OUTPUT�WITH�INPUT�OPERATION?ŠBEQ.S�IOC30�BRANCH�IF�NO+ŠBCLR�#OWIR,RTFLAG(A1)…CLEAR�THE�INPUT�FLAG<ŠLEA�TRAP1PB(A6),A0„GET�MOVE�LOGICAL�PARAMETER�BLOCK�ADDRESS1ŠMOVE.L�PBRRN(A1),MOVDADR(A0)�DESTINATION�ADDRESS'ŠBRA�IOC10‘GO�MOVE�INPUT�BUFFER�TO�USERŠENDC5IOC30…BSR�MOVEPB�GO�MOVE�PARAMETER�BLOCK�BACK�TO�USER*,*‰FIX-UP�THE�REQUEST�TABLE�ENTRY�AND�THE�CCB*!ŠCLR.B�RTFLAG(A1)ŠCLEAR�ANY�FLAGS"ŠCLR.B�RTSTAT(A1)ŠCLEAR�THE�STATUS1ŠADD.L�#1,ENTRIES(A6)†BUMP�#�OF�AVAILABLE�ENTRIES.ŠBSET�#EMTY,RTSTAT(A1)…SET�THIS�ENTRY�TO�EMPTY*ŠCLR.L�RTBUFA(A1)ŠCLEAR�THE�BUFFER�ADDRESS.ŠCLR.L�CCBBUF(A2)ŠCLEAR�THE�CCB�BUFFER�ADDRESS/ŠCLR.B�CCBIOC(A2)ŠCLEAR�THE�I/O�COMPLETION�FLAG7ŠSUB.B�#1,CCBNQ(A2)ˆDECREMENT�NUMBER�OF�REQUESTS�QUEUED#ŠBNE.S�IOC60�BRANCH�IF�MORE�WAITING%ŠCLR.B�CCBBSY(A2)ŠCLEAR�THE�BUSY�FLAGŠCLR.L�D0’CLEAR�FOR�USE1ŠMOVE.B�PBSTA(A1),D0‡GET�THE�COMPLETED�I/O�STATUS&ŠBSR�ACKSRQ�GO�ACKNOWLEDGE�THE�REQUEST-IOC50…BRA�WAITEVNTŽGO�WAIT�FOR�THE�NEXT�EVENTIOC60…CLR.L�D0’CLEAR�FOR�USE1ŠMOVE.B�PBSTA(A1),D0‡GET�THE�COMPLETED�I/O�STATUS&ŠBSR�ACKSRQ�GO�ACKNOWLEDGE�THE�REQUEST*1*‰GET�THE�REQUEST�ENTRY�FOR�THE�NEXT�ONE�TO�START*&ŠLEA�RTBL(A6),A1�REQUEST�TABLE�ADDRESS-ŠMOVE.L�#ENTRY,D0ŠNUMBER�OF�ENTRIES�TO�SEARCH*IOC70…BTST�#QUE,RTSTAT(A1)†A�QUEUED�ENTRY?ŠBEQ.S�IOC80�BRANCH�IF�NO*ŠCMPA.L�RTCCBA(A> 1),A2†QUEUED�FOR�THIS�CCB?ŠBEQ.S�IOC90�BRANCH�IF�YES-IOC80…ADD.L�#RTELNG,A1ŠBUMP�TO�THE�NEXT�ENTRY2ŠSUB.L�#1,D0�DECREMENT�NUMBER�OF�ENTRIES�TO�SEARCH#ŠBNE�IOC70‘BRANCH�IF�MORE�TO�SEARCH*'*‰NO�QUEUED�ENTRY�TO�START�FOR�THIS�CCB*%ŠCLR.B�CCBBSY(A2)ŠSET�CCB�TO�NOT�BUSY*ŠCLR.B�CCBNQ(A2)‹NO�REQUESTS�QUEUED�FOR�IT(ŠBRA�IOC50‘GO�ENABLE�REQUESTS�AND�RETURN*&*‰FOUND�AN�ENTRY�TO�START�FOR�THIS�CCB*'IOC90…MOVE.B�#1,CCBBSY(A2)†SET�CCB�BUSY*ŠMOVE.B�#1,CCBIOC(A2)†SET�I/O�NOT�COMPLETE,ŠBCLR�#QUE,RTSTAT(A1)†TURN�OFF�QUEUED�STATUS,ŠBSET�#ACT,RTSTAT(A1)†SET�TO�AN�ACTIVE�ENTRYŠCLR.L‚D0‘CLEAR�FOR�USE*ŠMOVE.B�PBFNC(A1),D0‡GET�THE�FUNCTION�CODE%ŠCMP.B�#4,D0�SEE�IF�OUTPUT�WITH�INPUTŠBNE.S�IOC100ŽBRANCH�IF�NOT-ŠSUB.L�#1,D0�IS�OUTPUT�WITH�INPUT,ADJUST�CODE9IOC100„SUB.L�#1,D0�USE�FUNCTION�CODE�AS�OFFSET�TO�ROUTINE'ŠLSL.L�#2,D0�CONVERT�TO�LONGWORD�OFFSET)ŠMOVE.L�RTCCBA(A1),A2†GET�THE�CCB�ADDRESS4ŠMOVE.L�CCBREAD(A2,D0),A4‚ROUTINE�ADDRESS�TO�PROCESS:ŠMOVE.L�A1,CCBBUF(A2)†SAVE�THE�REQUEST�TABLE�ENTRY�ADDRESS8ŠMOVE.L�CCBMEMA(A2),A3…GET�THE�MEMORY�MAPPED�I/O�ADDRESS)ŠCLR.B‚RTFLAG(A1)‰START�WITH�NO�FLAGS�SETŠJSR�(A4)’GO�START�THE�I/O3ŠBEQ�WAITEVNTŽGO�WAIT�FOR�AN�EVENT�ON�A�GOOD�RETURN-ŠMOVE.B�D0,PBSTA(A1)‡ERROR-GET�THE�ERROR�CODE&ŠCLR.B�CCBIOC(A2)ŠSET�TO�I/O�COMPLETED*ŠCLR.L�PBLNG(A1)‹SET�TO�NO�TRANSFER�LENGTH!ŠBRA�IOC“GO�HANDLE�THE�COMPLETION PAGE**ƒSERVTRAP…SERVICE�TRAPS*�HANDLES�TRAP�#2�AND�TRAP�#3/*ƒTRAP�#3:…SETS�STATUS�TO�NO�ERRORS�AND�RETURNS8*ƒTRAP�#2:…RESERVES�A�REQUEST�TABLE�ENTRY�FOR�THE�EVENT.$*�DETERMINES�CCB�TO�USE�FOR�THE�I/O.4*�EITHER�QUEUES�THE�EVENT�IF�THE�CCB�IS�BUSY�OR�SETS4*�THE�EVENT�STATUS�TO�READY�TO�INITIATE�I/O.�THE�I/O:*�IS�STARTED�EITHER�AT�'CKSTRT'�(AFTER�THE�WAIT�FOR�EVENT)7*�OR�'IOC'-AFTER�THE�CURRENTLY�RUNNING�I/O�IS�COMPLETE.7*�BEFORE�RETURN�FROM�THIS�EVENT,STATUS�IS�SET�TO�ENABLE6*�EVENT�REQUESTS�IF�THERE�ARE�ANY�AVAILABLE�ENTRIES�IN9*�THE�REQUEST�TABLE.�STATUS�IS�SET�TO�DISABLE�REQUESTS�IF4*�THE�REQUEST�TABLE�IS�FULL.�UPON�I/O�COMPLETION�THE**�STATUS�IS�ALWAYS�SET�TO�ENABLE�REQUESTS.!*�A6=BASE�ADDRESS�OF�DATA�SEGMENT**SERVTRAPƒEQU‚**5*ˆDETERMINE�REQUEST�TABLE�ENTRY�TO�USE�FOR�THIS�EVENT*&‰LEA�RTBL(A6),A1‰REQUEST�TABLE�ADDRESS‰MOVE.L�#ENTRY,D0„#�OF�ENTRIES-SERVT10‚BTST�#EMTY,RTSTAT(A1)�AN�EMPTY�ENTRY?%‰BNE.S�SERVT20ƒBRANCH�IF�EMPTY,USE�IT$‰ADD.L�#RTELNG,A1‹BUMP�TO�NEXT�ENTRY2‰SUB.L�#1,D0…DECREMENT�NUMBER�OF�ENTRIES�TO�SEARCH'‰BNE.S‚SERVT10‚BRANCH�IF�MORE�TO�SEARCH4‰BRA„NOENTRYƒGO�ABORT�IF�NO�ENTRIES�LEFT,FATAL�ERROR**ˆREAD�THE�EVENT*8SERVT20ƒMOVE.L�A1,A0ƒENTRY�ADDRESS�TO�RECEIVE�THIS�EVENT'‰MOVE.L�#RDEVNT,D0„READ�EVENT�DIRECTIVE!‰TRAP‚#1ŒCALL�EXEC�TO�DO�THE�READ"‰BNE‡RDEVNTER‚GO�ABORT�IF�AN�ERROR;‰SUB.L‚#1,ENTRIES(A6)�DECREMENT�NUMBER�OF�ENTRIES�AVAILABLE*%*ˆDETERMINE�TRAP�NUMBER�OF�THIS�EVENT*7‰MOVE.B‚EVTIN(A1),D0ŠGET�THE�TRAP�NUMBER�FROM�THE�EVENT'‰AND.L‚#$0F,D0‘MASK�OFF�UNECESSARY�BITS‰CMP.B‚#TRAP2,D0�TRAP�#2? ‰BEQ.S�SERVT30‘BRANCH�IF�TRAP�#2*,*ˆTRAP�#3�EVENT�-�SET�USER'S�PARAMETER�BLOCK*ˆSTATUS�BYTE�TO�ZERO*ŠIFNE�MMU’ASSEMBLE�IF�MMU5ŠMOVE.L�EVA0(A1),A2�GET�USERS�PARAMETER�BLOCK�ADDRESSŠCLR.L‚EVD0(A1)‹CLEAR�USER'S�D08ŠLEA�TRAP1PB(A6),A0„MOVE�LOGICAL�PARAMETER�BLOCK�ADDRESS#ŠMOVE.L�#MOVELL,D0‰DIRECTIVE�NUMBER*ŠMOVE.L�#TASK,MOVSTSK(A0)‚SOURCE�TASK�NAME0ŠMOVE.L�#SESSN,MOVSSES(A0)�SOURCE�SESSION�NUMBER+ŠMOVE.L�A1,MOVSADR(A0)…SET-UP�SORCE�ADDRESS'ŠADD.L‚#EVD0,MOVSADR(A0)ƒSOURCE�ADDRESS.ŠMOVE.L�EVTSK(A1),MOVDTSK(A0)‚TARGET�TASK�NAME3ŠMOVE.L�EVSES(A1),MOVDSES(A0)‚TARGET�SESSION�NUMBER1ŠMOVE.L�A2,MOVDADR(A0)…SET-UP�DESTINATION�ADDRESSAŠADD.L‚#4,MOVDADR(A0)…DESTINATION�ADDRESS=PARA.�BLOCK�STATUS�BYTE+ŠMOVE.L�#1,MOVLNG(A0)†LENGTH�OF�MOVE=1�BYTE*ŠTRAP�#1“CALL�EXEC�TO�MOVE�THE�STATUS�BYTE&ŠBNE„MOVELERR‹BRANCH�IF�AN�ERROR-FATALŠENDCŠIFEQƒMMU�ASSEMBLE�IF�NO�MMU;ŠMOVE.L�EVA0(A1),A2ˆGET�PHYSICAL�ADDRESS�OF�PARAMETER�BLOCK)ŠCLR.B�4(A2)�CLEAR�THE�USER'S�STATUS�BYTEŠENDC%ŠCLR.B�RTFLAG(A1)ŠCLEAR�ANY�FLAG? S�SET&ŠCLR.B�RTSTAT(A1)ŠCLEAR�ANY�STATUS�SET.ŠBSET�#EMTY,RTSTAT(A1)…SET�THIS�ENTRY�TO�EMPTY6ŠADD.L�#1,ENTRIES(A6)†BUMP�NUMBER�OF�AVAILABLE�ENTRIES"ŠCLR.L�D0’SET-UP�FOR�A�GOOD�RETURN'ŠBSR�ACKSRQ�GO�ACKNOWLEDGE�THIS�REQUEST!ŠMOVE.L�#SETASQ,D0‰SET�ASQ�STATUSŠMOVE.L�#$D,A0ŽENABLE�THE�ASR#ŠTRAP�#1“CALL�EXEC�TO�DO�THE�ENABLE(ŠBNE�SETASQERŽGO�ABORT�IF�AN�ERROR,FATALŠRTR—RETURN�FROM�THIS�EVENT*'*‰TRAP�#2�EVENT�-�DETERMINE�CCB�ADDRESS*‰CCB�ADDRESS�->A2*%SERVT30ƒEQU�*•SEE�IF�A�VALID�FUNCTION*ŠMOVE.B�PBFNC(A1),D0‡GET�THE�FUNCTION�CODEŠCMP.B�#1,D0�1=READ ŠBEQ.S�SERVT50�BRANCH�IF�READ,OKŠCMP.B�#2,D0�2=WRITE!ŠBEQ.S�SERVT50�BRANCH�IF�WRITE,OK ŠCMP.B�#4,D0�4=OUTPUT�WITH�INPUT-ŠBEQ.S�SERVT40�BRANCH�IF�OUTPUT�WITH�INPUT,OK5ŠMOVE.L�#ISTAIF,D0‰SET�ERROR�CODE�TO�INVALID�FUNCTION*ŠBRA�TRAPERR�GO�RETURN�WITH�ERROR�CODE�SET4SERVT40„SUB.L�#1,D0ŽIS�OUTPUT�WITH�INPUT,ADJUST�CODE4SERVT50ƒMOVE.B�PBLUN(A1),D1‡GET�USER'S�SPECIFIED�LUN0ŠMOVE.L�#CCBCNT,D3‰GET�NUMBER�OF�CCB'S�TO�SEARCH)ŠLEA�CCBBEG(A6),A2�START�ADDRESS�OF�CCB'S.SERVT60ƒCMP.B�CCBRLUN(A2),D1‡CCB�FOR�THIS�LUN?$ŠBEQ.S�SERVT70�BRANCH�IF�CORRECT�CCB'ŠCMP.B�CCBWLUN(A2),D1†CCB�FOR�THIS�LUN?$ŠBEQ.S�SERVT70�BRANCH�IF�CORRECT�CCB)ŠADD.L�#CCBLNG,A2‰GET�ADDRESS�OF�NEXT�CCB0ŠSUB.L�#1,D3�DECREMENT�#�OF�CCB'S�LEFT�TO�SEARCH%ŠBNE�SERVT60�BRANCH�IF�MORE�TO�SEARCH)ŠMOVE.L�#ISTAILU,D0ˆINVALID�LUN�SPECIFIED%ŠBRAƒTRAPERR�GO�RETURN�WITH�ERROR�SET2SERVT70ƒMOVE.L�A2,RTCCBA(A1)†SAVE�THIS�CCB�ADDRESS8ŠSUB.L�#1,D0�USE�FUNCTION�CODE�AS�OFFSET�FOR�R/W�ROUTINE'ŠLSL.L�#2,D0�CONVERT�TO�LONGWORD�OFFSET4ŠMOVE.L�CCBREAD(A2,D0),A4‚ROUTINE�ADDRESS�TO�PROCESSŠMOVE.L�A4,D0ŽGET�THE�ADDRESS3ŠCMP.L�#ISTATM,D0‰INVALID�FUNCTION�FOR�THIS�DEVICE?ŠBNE.S�SERVT80�BRANCH�IF�OK,ŠBRA.S�TRAPERR�GO�RETURN�WITH�ERROR�CODE�SET*+*‰VALID�EVENT�-�SEE�IF�PROCESSING�CAN�START*1SERVT80ƒADD.B�#1,CCBNQ(A2)ˆBUMP�THE�NUMBER�QUEUED!ŠCLR.B�RTFLAG(A1)ŠCLEAR�ANY�FLAGS(ŠCLR.B�RTSTAT(A1)ŠCLEAR�THE�ENTRY�STATUS'ŠTST.B�CCBBSY(A2)ŠIS�THIS�LUN�BUSY�NOW?!ŠBEQ.S�SERVT85�BRANCH�IF�NOT�BUSY+ŠBSET�#QUE,RTSTAT(A1)†SET�TO�REQUEST�QUEUED%ŠBRA.S�SERVT90�GO�CONTINUE�PROCESSING4SERVT85ƒMOVE.B�#1,CCBIOC(A2)†SET�TO�I/O�NOT�COMPLETE6ŠBSET�#ACT,RTSTAT(A1)†SET�TO�READY�TO�INITIATE�THE�I/O*ŠMOVE.B�#1,CCBBSY(A2)†SET�THIS�CCB�TO�BUSY8ŠMOVE.L�CCBMEMA(A2),A3…GET�THE�MEMORY�MAPPED�I/O�ADDRESS:ŠMOVE.L�A1,CCBBUF(A2)†SAVE�THE�REQUEST�TABLE�ENTRY�ADDRESSŠJSR�(A4)’GO�INITIATE�THE�I/O(ŠBEQ.S�SERVT90�BRANCH�IF�NO�ERRORS�FOUND(ŠMOVE.B�D0,PBSTA(A1)‡SAVE�THE�ERROR�CODE*ŠCLR.L�PBLNG(A1)‹SET�TO�NO�TRANSFER�LENGTH%ŠCLR.B�CCBIOC(A2)ŠSET�TO�I/O�COMPLETE*9*‰SEE�IF�ANY�EMPTY�SLOTS�AVAILABLE�FOR�MORE�TRAP�REQUESTS*%SERVT90ƒTST.L�ENTRIES(A6)‰0=NONE�LEFT#ŠBLE.S�SERVT100ŒBRANCH�IF�NONE�LEFT!ŠMOVE.L�#SETASQ,D0‰SET�ASQ�STATUSŠMOVE.L�#$D,A0ŽENABLE�THE�ASR#ŠTRAP�#1“CALL�EXEC�TO�DO�THE�ENABLE(ŠBNE�SETASQERŽGO�ABORT�IF�AN�ERROR,FATAL7ŠMOVE.L�#DERQST,D0‰SET�SERVER�STATUS�TO�ENABLE�REQUESTSŠMOVE.L�#$82,A0ŒENABLE�CODE*ŠTRAP�#1“CALL�EXEC�TO�ENABLE�TRAP�REQUESTS&ŠBNE�DERQSTERŽBRANCH�IF�AN�ERROR,FATAL#SERVT100‚RTR—RETURN�FROM�THIS�EVENT*'*‰ERROR�HANDLING�DURING�TRAP�PROCESSING*?TRAPERRƒMOVE.B�D0,PBSTA(A1)†SET�ERROR�STATUS�IN�PARAMETER�BLOCK#ŠCLR.L�PBLNG(A1)‹NO�TRANSFER�LENGTH+ŠMOVE.L�D0,EVD0(A1)ˆSET�ERROR�CODE�IN�EVENT7ŠBSR�MOVEPB�GO�MOVE�THE�PARAMETER�BLOCK�BACK�TO�THE�USE,ŠMOVE.L�EVD0(A1),D0ˆGET�THE�ERROR�CODE�AGAIN'ŠBSR�ACKSRQ�GO�ACKNOWLEDGE�THIS�REQUEST&ŠBRA�SERVT90�GO�RETURN�FROM�THIS�EVENTŠPAGE*0*ˆEVENT�HANDLING�ROUTINE�FOR�I/O�COMPLETION�FROM<*ˆTHE�INTERRUPT�HANDLING�ROUTINES.�THE�RETURN�FROM�THE�ISR'S9*ˆON�I/O�COMPLETION�OR�FAULT�COME�HERE.�THE�EVENT�MESSAGE6*ˆCONTAINS�THE�ADDRESS�OF�THE�REQUEST�TABLE�ENTRY�THAT6*ˆWAS�BEING�PROCESSED.�THE�ROUTINE�SETS�ANY�ERROR�CODE6*ˆAND�SETS�THE�I/O�COMPLETION�FLAG.�THE�PROCESSING�FOR1*ˆTHE�I/O�COMPLETION�IS�DONE�AT�'CKIOC'�AFTER�THE*ˆWAIT�FOR�EVENT.**ˆA6�CONTAINS�BASE�ADDRESS�OF�DATA�SEGMENT* ISREVT EQU *9‰LEA�TRAP1PB(A6),A0…EVENT�MESSAG? E�PARAMETER�BLOCK�ADDRESS'‰MOVE.L�#RDEVNT,D0ƒREAD�EVENT�DIRECTIVE$‰TRAP�#1�CALL�EXEC�TO�READ�THE�EVENT%‰BNE�RDEVNTERˆABORT�IF�AN�ERROR,FATAL;‰MOVE.L�ISREVTMG(A0),A1ˆGET�THE�REQUEST�TABLE�ENTRY�ADDRESS)‰MOVE.L�RTCCBA(A1),A2ŠGET�THE�CCB�ADDRESS.‰CLR.B�PBSTA(A1)�HOPE�FOR�A�GOOD�RETURN�STATUS.‰BTST�#FLT,RTFLAG(A1)‹AN�ERROR�DURING�THE�I/O?"‰BEQ.S�ISREVT10�BRANCH�IF�NO�ERROR/‰MOVE.B�CCBBSY(A2),PBSTA(A1)ƒSET�THE�ERROR�CODE)‰MOVE.B�#1,CCBBSY(A2)ŠRESET�CCB�BUSY�FLAGISREVT10 EQU *"‰BTST�#INP,RTFLAG(A1)ŠDOING�INPUT?‰BNE.S�ISREVT20�BRANCH�IF�YES#‰BTST�#OWIR,RTFLAG(A1)‰DOING�INPUT?‰BNE.S�ISREVT20�BRANCH�IF�YES.‰BTST�#FORM,RTFLAG(A1)‰DOING�FORMATTED�OUTPUT?"‰BEQ.S�ISREVT20�BRANCH�IF�NO,IMAGE8‰SUB.L�#2,RTRNLNG(A1)ŠFORMATTED�OUTPUT-DON'T�COUNT�CR-LF&‰BPL.S�ISREVT20�BRANCH�IF�A�GOOD�VALUE+‰CLR.L�RTRNLNG(A1)�MUST�HAVE�BEEN�NO�LENGTH=ISREVT20�MOVE.L�RTRNLNG(A1),PBLNG(A1)‚SET�THE�TRANSFER�LENGTH%‰CLR.B�CCBIOC(A2)ŽSET�TO�I/O�COMPLETE‰RTR›RETURN�FROM�THIS�EVENT PAGE ‰IFNE�ACIA*4*ˆACIAREAD‚READ�ROUTINE�FOR�EXORmacs�AND�VME110�ACIA*’SET�INPUT�FLAG.$*’USES�ACIAWRIT�ROUTINE�FOR�THE�READ&*ˆENTRY:A1=REQUEST�TABLE�ENTRY�ADDRESS*ŽA2=CCB�ADDRESS*ŽA3=MEMORY�MAPPED�I/O�ADDRESS!*ŽA6=BASE�ADDRESS�OF�DATA�SEGMENT*ACIAREAD EQU *'‰BSET�#INP,RTFLAG(A1)ŠSET�TO�INPUT�MODE‰PAGE*5*ˆACIAWRIT‚WRITE�ROUTINE�FOR�EXORmacs�AND�VME110�ACIA*’(USED�BY�ACIAREAD�ALSO))*’DETERMINE�BUFFER�ADDRESSES�FOR�THE�I/O.2*’DETERMINE�MENU�ENTRIES�FOR�THE�ISR�TO�DO�THE�I/O*’DETERMINE�USER'S�I/O�OPTIONS.*’ARM�THE�ACIA�FOR�INTERRUPTS.,*’ALL�I/O�DONE�IN�INTERRUPT�SERVICE�ROUTINE.0*’WHEN�THE�I/O�IS�COMPLETE�THE�INTERRUPT�SERVICE**’ROUTINE�EXITS�AND�CAUSES�AN�EVENT�TO�THE.*’ASR,WHICH�HANDLES�SETTING�ALL�THE�COMPLETION#*’FLAGS�AND�DETECTS�ANY�I/O�ERRORS.&*ˆENTRY:A1=REQUEST�TABLE�ENTRY�ADDRESS*ŽA2=CCB�ADDRESS*ŽA3=MEMORY�MAPPED�I/O�ADDRESS!*ŽA6=BASE�ADDRESS�OF�DATA�SEGMENT%*ˆEXIT:D0=0=GOOD�RETURN,I/O�INITIATED3*�D0.B�NOT�0=ERROR�FOUND,D0�CONTIANS�THE�ERROR�CODE*’I/O�NOT�INITIATED.*ˆUSES:0�1�2�3�4�5�6�7*‹D�**‹A�*�P�P�P�*�*�P*ˆCALLS:GETBUF‚GETMENUA**ACIAWRIT EQU *,‰CLR.L�RTRNLNG(A1)�CLEAR�I/O�TRANSFER�LENGTH$‰BSR�GETBUF”GET�I/O�BUFFER�ADDRESSES‰BNE„ACIAW50‘BRANCH�IF�AN�ERROR3‰MOVE.L�A4,RTBUFA(A1)ŠSAVE�THE�BUFFER�START�ADDRESS!‰BSR�GETMENUA’GO�GET�MENU�ADDRESS!‰BNE.S�ACIAW50‘BRANCH�IF�AN�ERROR0‰MOVE.W�PBOPTS(A1),D0ŠGET�THE�USER'S�I/O�OPTIONS‰BTST�#5,D0”TO�ECHO�THE�I/O?‰BNE.S�ACIAW10‘BRANCH�IF�NO'‰BSET�#ECHO,RTFLAG(A1)‰SET�TO�ECHO�MODE!ACIAW10‚BTST�#3,D0”FORMATTED�I/O?!‰BNE.S�ACIAW20‘BRANCH�IF�NO,IMAGE,‰BSET�#FORM,RTFLAG(A1)‰SET�TO�FORMATTED�MODE)ACIAW20‚BTST�#INP,RTFLAG(A1)ŠDOING�INPUT?(‰BNE.S�ACIAW30‘BRANCH�IF�YES,DOING�INPUT*!*ˆDOING�OUTPUT-BUILD�MENU�ENTRIES*‰MOVE.W�#OUT,(A0)+�OUTPUT�FLAG,‰MOVE.L�A4,(A0)+�OUTPUT�BUFFER�START�ADDRESS*‰MOVE.L�A5,(A0)+�OUTPUT�BUFFER�END�ADDRESS(‰BTST�#FORM,RTFLAG(A1)‰FORMATTED�OUTPUT?!‰BEQ.S�ACIAW25‘BRANCH�IF�NO,IMAGE4‰MOVE.W�#OUT,(A0)+�FORMATTED�OUTPUT-SET�UP�FOR�LF-CR8‰LEA�LFCR(A6),A4�LINE�FEED�CARRIAGE�RETURN�START�ADDRESS2‰MOVE.L�A4,(A0)+ŒLINE-FEED�CARRIAGE�RETURN�ADDRESS2‰ADD.L�#1,A4�LINE-FEED�CARRIAGE�RETURN�END�ADDRESS6‰MOVE.L�A4,(A0)+ŠLINE-FEED�CARRIAGE�RETURN�END�ADDRESS&ACIAW25�CLR.W�(A0)•END�OF�MENU�ENTRIES0‰MOVE.B�#ARMOUT,D0�DOING�OUTPUT,ARM�FOR�TRANSMIT‰BRA.S�ACIAW40‘GO�CONTINUE* *ˆDOING�INPUT-BUILD�MENU�ENTRIES*&ACIAW30‚MOVE.W�#IN,(A0)+ŽSET�FOR�INPUT+‰MOVE.L�A4,(A0)+�INPUT�BUFFER�START�ADDRESS)‰MOVE.L�A5,(A0)+�INPUT�BUFFER�END�ADDRESS'‰BTST�#FORM,RTFLAG(A1)‰FORMATEED�INPUT?!‰BEQ.S�ACIAW35’BRANCH�IF�NO,IMAGE6‰MOVE.W�#OUT,(A0)+�FORMATTED�INPUT,MUST�OUTPUT�A�LF-CR8‰LEA�LFCR(A6),A4�LINE�FEED�CARRIAGE�RETURN�START�ADDRESS2‰MOVE.L�A4,(A0)+ŒLINE-FEED�CARRIAGE�RETURN�ADDRESS2‰ADD.L�#1,A4�LINE-FEED�CARRIAGE�RETURN�END�ADDRESS6‰MOVE.L�A4,(A0)+ŠLINE-FEED�CARRIAGE�RETURN�END�ADDRESS&ACIAW35‚CLR.W�(A0)”END�OF�MENU�ENTRIES!‰MOVE.B�#ARMIN,D0ŽARM�FOR�RECEIVE'ACIAW40‚MOVE.B�#$03,(A3)ŽRESET�THE�ACIA&‰MOVE.B�D0,(A3)�SET�THE�INTERRUPT�MODE‰CLR.L�D0–SET�@ FOR�GOOD�RETURNACIAW50‚RTS›RETURN�TO�CALLER‰ENDC ‰IFNE�ACIA‰PAGE*@*ˆACIAOWIƒOUTPUT�WITH�INPUT�ROUTINE�FOR�EXORmacs�AND�VME110�ACIA.*’DETERMINE�OUTPUT�AND�INPUT�BUFFER�ADDRESSES.*’BUILD�THE�ISR�MENU�ENTRIES.*’DETERMINE�OUTPUT�I/O�OPTIONS.*’SET�FOR�DOING�OUTPUT.*’ARM�FOR�INTERRUPT.,*’ALL�I/O�DONE�IN�INTERRUPT�SERVICE�ROUTINE.0*’WHEN�THE�I/O�IS�COMPLETE�THE�INTERRUPT�SERVICE**’ROUTINE�EXITS�AND�CAUSES�AN�EVENT�TO�THE.*’ASR,WHICH�HANDLES�SETTING�ALL�THE�COMPLETION#*’FLAGS�AND�DETECTS�ANY�I/O�ERRORS.&*ˆENTRY:A1=REQUEST�TABLE�ENTRY�ADDRESS*ŽA2=CCB�ADDRESS*ŽA3=MEMORY�MAPPED�I/O�ADDRESS!*ŽA6=BASE�ADDRESS�OF�DATA�SEGMENT%*ˆEXIT:D0=0=GOOD�RETURN,I/O�INITIATED3*�D0.B�NOT�0=ERROR�FOUND,D0�CONTIANS�THE�ERROR�CODE*’I/O�NOT�INITIATED.*ˆUSES:0�1�2�3�4�5�6�7 *‹D�*�*�*�**‹A�*�P�P�P�*�*�P*ˆCALLS:GETBUFƒGETMENUA* ACIAOWI EQU *%‰BSET�#OWIW,RTFLAG(A1)‰SET�FOR�OUTPUT,‰CLR.L�RTRNLNG(A1)�CLEAR�THE�TRANSFER�LENGTH'‰BSR�GETBUF”GET�OUTPUT�BUFFER�ADDRESSES‰BNEƒACIAO40‘BRANCH�IF�AN�ERROR"‰BSR�GETMENUA’GET�THE�MENU�ADDRESS(‰BNE�ACIAO40“BRANCH�IF�AN�ERROR�RETURNED*2*ˆBUILD�THE�MENU�ENTRIES�FOR�THE�OUTPUT�WITH�INPUT*'‰MOVE.W�#OUT,(A0)+�SET�FOR�OUTPUT�FIRST,‰MOVE.L�A4,(A0)+�OUTPUT�BUFFER�START�ADDRESS*‰MOVE.L�A5,(A0)+�OUTPUT�BUFFER�END�ADDRESS0‰MOVE.W�PBOPTS(A1),D3ŠGET�THE�USER'S�I/O�OPTIONS‰BTST�#3,D3”FORMATTED?‰BNE.S�ACIAO10‘BRANCH�IF�NO7‰MOVE.W�#OUT,(A0)+�FORMATTED�OUTPUT,MUST�OUTPUT�A�LF-CR8‰LEA�LFCR(A6),A4�LINE�FEED�CARRIAGE�RETURN�START�ADDRESS2‰MOVE.L�A4,(A0)+ŒLINE-FEED�CARRIAGE�RETURN�ADDRESS2‰ADD.L�#1,A4�LINE-FEED�CARRIAGE�RETURN�END�ADDRESS6‰MOVE.L�A4,(A0)+ŠLINE-FEED�CARRIAGE�RETURN�END�ADDRESS7ACIAO10‚BSET�#INP,RTFLAG(A1)ŠFAKE�INPUT�FOR�GETBUF�CALL<‰MOVE.L�PBSAD(A1),-(A7)ˆSAVE�THE�OUTPUT�BUFFER�START�ADDRESS:‰MOVE.L�PBEAD(A1),-(A7)ˆSAVE�THE�OUTPUT�BUFFER�END�ADDRESS&‰MOVE.L�A0,-(A7)�SAVE�THE�MENU�ADDRESS4‰MOVE.L�PBRRN(A1),PBSAD(A1)„GET�INPUT�BUFFER�ADDRESS?‰MOVE.L�PBRRN(A1),PBEAD(A1)„SET-UP�FOR�INPUT�BUFFER�END�ADDRESS#‰MOVE.L�PBLNG(A1),D2‹GET�THE�LENGTH%‰ADD.L�D2,PBEAD(A1)ŒADD�IN�THE�LENGTH&‰SUB.L�#1,PBEAD(A1)ŒACTUAL�END�ADDRESS*‰BSR�GETBUF”GO�GET�BUFFER�ADDRESSES�TO�USE*‰BCLR�#INP,RTFLAG(A1)ŠCLEAR�THE�INPUT�FLAG)‰MOVE.L�(A7)+,A0�RESTORE�THE�MENU�ADDRESS9‰MOVE.L�(A7)+,PBEAD(A1)ˆRESTORE�THE�USER'S�OUTPUT�ADDRESS9‰MOVE.L�(A7)+,PBSAD(A1)ˆRESTORE�THE�USER'S�OUTPUT�ADDRESS"‰TST.B�D0–CHECK�RETURN�FROM�GETBUF.‰BNE.S�ACIAO40“BRANCH�IF�AN�ERROR�WAS�RETURNED3‰MOVE.L�A4,RTBUFA(A1)ŠSAVE�THE�INPUT�BUFFER�ADDRESS9‰MOVE.W�#OUTIN,(A0)+‹SET�UP�FOR�SWITCHING�OUTPUT�TO�INPUT+‰MOVE.L�A4,(A0)+�INPUT�BUFFER�START�ADDRESS)‰MOVE.L�A5,(A0)+�INPUT�BUFFER�END�ADDRESS‰BTST�#10,D3“INPUT�FORMATTED?!‰BNE.S�ACIAO20‘BRANCH�IF�NO,IMAGE-‰BSET�#FORM,RTFLAG(A1)‰SET�TO�INPUT�FORMATTED6‰MOVE.W�#OUT,(A0)+�FORMATTED�INPUT,MUST�OUTPUT�A�LF-CR8‰LEA�LFCR(A6),A4�LINE�FEED�CARRIAGE�RETURN�START�ADDRESS2‰MOVE.L�A4,(A0)+ŒLINE-FEED�CARRIAGE�RETURN�ADDRESS2‰ADD.L�#1,A4�LINE-FEED�CARRIAGE�RETURN�END�ADDRESS6‰MOVE.L�A4,(A0)+ŠLINE-FEED�CARRIAGE�RETURN�END�ADDRESS&ACIAO20‚CLR.W�(A0)”END�OF�MENU�ENTRIES‰BTST�#5,D3”TO�ECHO�THE�INPUT?‰BNE.S�ACIAO30‘BRANCH�IF�NO(‰BSET�#ECHO,RTFLAG(A1)‰SET�THE�ECHO�FLAG'ACIAO30‚MOVE.B�#$03,(A3)ŽRESET�THE�ACIA%‰MOVE.B�#ARMOUT,(A3)ŒARM�FOR�TRANSMIT‰CLR.L�D0–SET�FOR�A�GOOD�RETURNACIAO40‚RTS›RETURN�TO�CALLER‰ENDC‰IFNE�(PIA+VMEPIA)‰PAGE*3*ˆPIAWRITƒWRITE�ROUTINE�FOR�EXORmacs�AND�VME110�PIA,*’DETERMINE�BUFFER�ADDRESSES�FOR�THE�OUTPUT.*’BUILD�THE�MENU�ENTRIES*’DETERMINE�I/O�OPTIONS.*’ARM�FOR�INTERRUPT.,*’ALL�I/O�DONE�IN�INTERRUPT�SERVICE�ROUTINE.0*’WHEN�THE�I/O�IS�COMPLETE�THE�INTERRUPT�SERVICE**’ROUTINE�EXITS�AND�CAUSES�AN�EVENT�TO�THE.*’ASR,WHICH�HANDLES�SETTING�ALL�THE�COMPLETION#*’FLAGS�AND�DETECTS�ANY�I/O�ERRORS.&*ˆENTRY:A1=REQUEST�TABLE�ENTRY�ADDRESS*ŽA2=CCB�ADDRESS*ŽA3=MEMORY�MAPPED�I/O�ADDRESS!*ŽA6=BASE�ADDRESS�OF�DATA�SEGMENT%*ˆEXIT:D0=0=GOOD�RETURN,I/O�INITIATED3*�D0.B�NOT�0=ERROR�FOUND,D0�CONTIANS�THE�ERROR�CODE*’I/O�NOT�INITIATED.*ˆUSES:0�1�2�3�4�5�6�7@ *‹D�**‹A�*�P�P�P�*�*�P*ˆCALLS:GETBUFƒGETMENUA* PIAWRIT EQU *0‰CLR.L�RTRNLNG(A1)�CLEAR�THE�I/O�TRANSFER�LENGTH+‰BSRƒGETBUF”GET�THE�OUTPUT�BUFFER�ADDRESSES ‰BNE.S�PIAW20’BRANCH�IF�AN�ERROR5‰MOVE.L�A4,RTBUFA(A1)ŠSAVE�THE�RETURNED�START�ADDRESS'‰BSRƒGETMENUA’GO�GET�MENU�ENTRY�ADDRESS)‰BNE.S�PIAW20’BRANCH�IF�AN�ERROR�RETURNED,‰MOVE.W�#OUT,(A0)+�SET�MENU�ENTRY�FOR�OUTPUT,‰MOVE.L�A4,(A0)+�OUTPUT�BUFFER�START�ADDRESS*‰MOVE.L�A5,(A0)+�OUTPUT�BUFFER�END�ADDRESSû7 ;64#8+637;8C*K?SB[@cAkDsB{6ƒ=‹5“?›>£4«>³A»5ÃDË?Ó9Û4ã=ë;0‰MOVE.W�PBOPTS(A1),D0ŠGET�THE�USER'S�I/O�OPTIONS‰BTST�#3,D0”FORMATTED�OUTPUT? ‰BNE.S�PIAW10’BRANCH�IF�NO,IMAGE'‰BSET�#FORM,RTFLAG(A1)‰SET�TO�FORMATTED7‰MOVE.W�#OUT,(A0)+�FORMATTED�OUTPUT,MUST�OUTPUT�A�LF-CR8‰LEA�LFCR(A6),A4�LINE�FEED�CARRIAGE�RETURN�START�ADDRESS2‰MOVE.L�A4,(A0)+ŒLINE-FEED�CARRIAGE�RETURN�ADDRESS2‰ADD.L�#1,A4�LINE-FEED�CARRIAGE�RETURN�END�ADDRESS6‰MOVE.L�A4,(A0)+ŠLINE-FEED�CARRIAGE�RETURN�END�ADDRESS%PIAW10ƒCLR.W�(A0)”END�OF�MENU�ENTRIES7‰MOVE.B�#$2F,2(A3)�A-SIDE,ARM�FOR�INTERRUPT�ON�NOT�BUSY7‰MOVE.B�#$3D,6(A3)�B-SIDE,ARM�FOR�INTERRUPT�ON�NOT�BUSY8‰MOVE.B�#$0,(A3)�OUTPUT�A�BYTE�TO�GET�INTERRUPTS�STARTED'‰MOVE.B�(A3),D0�STROBE�TO�SEND�THE�BYTE‰CLR.L�D0–SET�FOR�A�GOOD�RETURNPIAW20ƒRTS›RETURN�TO�CALLER‰ENDC ‰IFNE�VMSA‰PAGE*A*ˆSREAD…READ�ROUTINE�FOR�VERSAmodule-01�ASYNCHRONOUS�SERIAL�PORTS*’SET�INPUT�FLAG.!*’USES�SWRIT�ROUTINE�FOR�THE�READ&*ˆENTRY:A1=REQUEST�TABLE�ENTRY�ADDRESS*ŽA2=CCB�ADDRESS*ŽA3=MEMORY�MAPPED�I/O�ADDRESS!*ŽA6=BASE�ADDRESS�OF�DATA�SEGMENT* SREAD„EQU�*'‰BSET�#INP,RTFLAG(A1)ŠSET�TO�INPUT�MODE‰PAGE*B*ˆSWRIT…WRITE�ROUTINE�FOR�VERSAmodule-01�ASYNCHRONOUS�SERIAL�PORTS*’(USED�BY�SREAD�ALSO))*’DETERMINE�BUFFER�ADDRESSES�FOR�THE�I/O.*’DETERMINE�USER'S�I/O�OPTIONS.3*’BUILD�THE�MENU�ENTRIES�FOR�THE�ISR�TO�DO�THE�I/O.,*’ALL�I/O�DONE�IN�INTERRUPT�SERVICE�ROUTINE.0*’WHEN�THE�I/O�IS�COMPLETE�THE�INTERRUPT�SERVICE**’ROUTINE�EXITS�AND�CAUSES�AN�EVENT�TO�THE.*’ASR,WHICH�HANDLES�SETTING�ALL�THE�COMPLETION#*’FLAGS�AND�DETECTS�ANY�I/O�ERRORS.&*ˆENTRY:A1=REQUEST�TABLE�ENTRY�ADDRESS*ŽA2=CCB�ADDRESS*ŽA3=MEMORY�MAPPED�I/O�ADDRESS!*ŽA6=BASE�ADDRESS�OF�DATA�SEGMENT%*ˆEXIT:D0=0=GOOD�RETURN,I/O�INITIATED3*�D0.B�NOT�0=ERROR�FOUND,D0�CONTIANS�THE�ERROR�CODE*’I/O�NOT�INITIATED..*’CONDITION�CODES�SET�ACCORDING�TO�DO�CONTENTS*ˆUSES:0�1�2�3�4�5�6�7*‹D�**‹A�*�P�P�P�*�*�P*ˆCALLS:GETBUF‚GETMENA** SWRIT„EQU�*,‰CLR.L�RTRNLNG(A1)�CLEAR�I/O�TRANSFER�LENGTH$‰BSR�GETBUF”GET�I/O�BUFFER�ADDRESSES‰BNE�SWRIT50‘BRANCH�IF�AN�ERROR3‰MOVE.L�A4,RTBUFA(A1)ŠSAVE�THE�BUFFER�START�ADDRESS'‰BSR�GETMENUA’GO�GET�MENU�TABLE�ADDRESS!‰BNE.S�SWRIT50‘BRANCH�IF�AN�ERROR0‰MOVE.W�PBOPTS(A1),D0ŠGET�THE�USER'S�I/O�OPTIONS‰BTST�#5,D0”TO�ECHO�THE�I/O?‰BNE.S�SWRIT10‘BRANCH�IF�NO'‰BSET�#ECHO,RTFLAG(A1)‰SET�TO�ECHO�MODE!SWRIT10‚BTST�#3,D0”FORMATTED�I/O?!‰BNE.S�SWRIT20‘BRANCH�IF�NO,IMAGE,‰BSET�#FORM,RTFLAG(A1)‰SET�TO�FORMATTED�MODE)SWRIT20‚BTST�#INP,RTFLAG(A1)ŠDOING�INPUT?(‰BNE.S�SWRIT30‘BRANCH�IF�YES,DOING�INPUT*4*ˆDOING�SERIAL�PORT�OUTPUT-SET�UP�FOR�INTERRUPT�MODE*ˆAND�BUILD�THE�MENU�ENTRIES*‰MOVE.W�#OUT,(A0)+�OUTPUT�FLAG,‰MOVE.L�A4,(A0)+�OUTPUT�BUFFER�START�ADDRESS*‰MOVE.L�A5,(A0)+�OUTPUT�BUFFER�END�ADDRESS(‰BTST�#FORM,RTFLAG(A1)‰FORMATTED�OUTPUT?!‰BEQ.S�SWRIT25‘BRANCH�IF�NO,IMAGE+‰MOVE.W�#OUT,(A0)+�FORMATTED,DO�MORE�OUTPUT8‰LEA�LFCR(A6),A4�LINE�FEED�CARRIAGE�RETURN�START�ADDRESS2‰MOVE.L�A4,(A0)+ŒLINE-FEED�CARRIAGE�RETURN�ADDRESS2‰ADD.L�#1,A4�LINE-FEED�CARRIAGE�RETURN�END�ADDRESS6‰MOVE.L�A4,(A0)+ŠLINE-FEED�CARRIAGE�RETURN�END�ADDRESS'SWRIT25‚CLR.W�(A0)”ZERO�FOR�END�OF�MENU2‰MOVE.B�#$33,CREG(A3)ŠDOING�OUTPUT,ENABLE‚TRANSMIT‰BRA.S�SWRIT40‘GO�CONTINUE*3*ˆDOING�SERIAL�PORT�INPUT-SET�UP�FOR�INTERRUPT�MODE*#SWRIT30‚MOVE.W�#A IN,(A0)+ŽINPUT�FLAG+‰MOVE.L�A4,(A0)+�INPUT�BUFFER�START�ADDRESS)‰MOVE.L�A5,(A0)+�INPUT�BUFFER�END�ADDRESS'‰BTST�#FORM,RTFLAG(A1)‰FORMATTED�INPUT?!‰BEQ.S�SWRIT35‘BRANCH�IF�NO,IMAGE7‰MOVE.W�#OUT,(A0)+�FORMATTED-MUST�OUTPUT�A�LINE-FEED,CR8‰LEA�LFCR(A6),A4�LINE�FEED�CARRIAGE�RETURN�START�ADDRESS2‰MOVE.L�A4,(A0)+ŒLINE-FEED�CARRIAGE�RETURN�ADDRESS2‰ADD.L�#1,A4�LINE-FEED�CARRIAGE�RETURN�END�ADDRESS6‰MOVE.L�A4,(A0)+ŠLINE-FEED�CARRIAGE�RETURN�END�ADDRESS(SWRIT35‚CLR.W�(A0)”ZEROS�FOR�END�OF�MENU%‰MOVE.B�#$36,CREG(A3)ŠENABLE‚RECEIVER SWRIT40‚EQU�*‰CLR.L�D0–SET�FOR�GOOD�RETURNSWRIT50‚RTS›RETURN�TO�CALLER‰ENDC ‰IFNE�VMSA‰PAGE*3*ˆSOWI†OUTPUT�WITH�INPUT�ROUTINE�FOR�VERSAmodule-01*’ASYNCHRONOUS�SERIAL�PORTS.*’DETERMINE�OUTPUT�AND�INPUT�BUFFER�ADDRESSES.*’DETERMINE�I/O�OPTIONS.*’BUILD�THE�ISR�MENU�ENTRIES.*’SET�FOR�DOING�OUTPUT.*’ARM�FOR�INTERRUPT.,*’ALL�I/O�DONE�IN�INTERRUPT�SERVICE�ROUTINE.0*’WHEN�THE�I/O�IS�COMPLETE�THE�INTERRUPT�SERVICE**’ROUTINE�EXITS�AND�CAUSES�AN�EVENT�TO�THE.*’ASR,WHICH�HANDLES�SETTING�ALL�THE�COMPLETION#*’FLAGS�AND�DETECTS�ANY�I/O�ERRORS.&*ˆENTRY:A1=REQUEST�TABLE�ENTRY�ADDRESS*ŽA2=CCB�ADDRESS*ŽA3=MEMORY�MAPPED�I/O�ADDRESS!*ŽA6=BASE�ADDRESS�OF�DATA�SEGMENT%*ˆEXIT:D0=0=GOOD�RETURN,I/O�INITIATED4*�D0.B�NOT�0=ERROR�FOUND,D0�CONTAINS�THE�ERROR�CODE,*’I/O�NOT�INITIATED./*’CONDITION�CODES�SET�ACCORDING�TO�D0�CONTENTS.*ˆUSES:0�1�2�3�4�5�6�7 *‹D�*�*�*�**‹A�*�P�P�P�*�*�P*ˆCALLS:GETBUF‚GETMENUA* SOWI„EQU�*5‰BSET�#OWIR,RTFLAG(A1)‰SET�FOR�OUTPUT�WITH�INPUT�FLAG,‰CLR.L�RTRNLNG(A1)�CLEAR�THE�TRANSFER�LENGTH'‰BSR�GETBUF”GET�OUTPUT�BUFFER�ADDRESSES‰BNE�SOWI40‘BRANCH�IF�AN�ERROR$‰BSR�GETMENUA“GET�MENU�ENTRY�ADDRESS'‰BNE�SOWI40’BRANCH�IF�AN�ERROR�RETURNED*2*ˆBUILD�THE�MENU�ENTRIES�FOR�THE�OUTPUT�WITH�INPUT*'‰MOVE.W�#OUT,(A0)+�SET�FOR�OUTPUT�FIRST,‰MOVE.L�A4,(A0)+�OUTPUT�BUFFER�START�ADDRESS*‰MOVE.L�A5,(A0)+�OUTPUT�BUFFER�END�ADDRESS0‰MOVE.W�PBOPTS(A1),D3ŠGET�THE�USER'S�I/O�OPTIONS‰BTST�#3,D3”FORMATTED�OUTPUT? ‰BNE.S�SOWI10‘BRANCH�IF�NO,IMAGE+‰MOVE.W�#OUT,(A0)+�FORMATTED,SET�FOR�OUTPUT8‰LEA�LFCR(A6),A4�LINE�FEED�CARRIAGE�RETURN�START�ADDRESS2‰MOVE.L�A4,(A0)+ŒLINE-FEED�CARRIAGE�RETURN�ADDRESS2‰ADD.L�#1,A4�LINE-FEED�CARRIAGE�RETURN�END�ADDRESS6‰MOVE.L�A4,(A0)+ŠLINE-FEED�CARRIAGE�RETURN�END�ADDRESS6SOWI10ƒBSET�#INP,RTFLAG(A1)ŠFAKE�INPUT�FLAG�FOR�GETBUF?‰MOVE.L�PBSAD(A1),-(A7)ˆSAVE�USER'S�OUTPUT�BUFFER�START�ADDRESS=‰MOVE.L�PBEAD(A1),-(A7)ˆSAVE�USER'S�OUTPUT�BUFFER�END�ADDRESS&‰MOVE.L�A0,-(A7)�SAVE�THE�MENU�ADDRESS:‰MOVE.L�PBRRN(A1),PBSAD(A1)„GET�INPUT�BUFFER�START�ADDRESS.‰MOVE.L�PBRRN(A1),PBEAD(A1)„SET�UP�END�ADDRESS,‰MOVE.L�PBLNG(A1),D2‹GET�INPUT�BUFFER�LENGTH%‰ADD.L�D2,PBEAD(A1)ŒADD�IN�THE�LENGTH&‰SUB.L�#1,PBEAD(A1)ŒACTUAL�END�ADDRESS&‰BSR�GETBUF”GET�INPUT�BUFFER�ADDRESSES)‰MOVE.L�A0,(A7)+�RESTORE�THE�MENU�ADDRESS2‰MOVE.L�(A7)+,PBEAD(A1)ˆRESTORE�USER'S�END�ADDRESS4‰MOVE.L�(A7)+,PBSAD(A1)ˆRESTORE�USER'S�START�ADDRESS*‰BCLR�#INP,RTFLAG(A1)ŠCLEAR�THE�INPUT�FLAG"‰TST�D0˜CHECK�GETBUF�RETURN�STATUS)‰BNE.S�SOWI40’BRANCH�IF�AN�ERROR�RETURNED:‰MOVE.L�A4,RTBUFA(A1)ŠSAVE�THE�INPUT�BUFFER�ADDRESS�IN�CCB6‰MOVE.W�#OUTIN,(A0)+‹SET�OUTPUT�WITH�INPUT�SWITCH�FLAG+‰MOVE.L�A4,(A0)+�INPUT�BUFFER�START�ADDRESS)‰MOVE.L�A5,(A0)+�INPUT�BUFFER�END�ADDRESS‰BTST�#10,D3“FORMATTED�INPUT? ‰BNE.S�SOWI20‘BRANCH�IF�NO,IMAGE.‰BSET�#FORM,RTFLAG(A1)‰SET�FOR�FORMATTED�INPUT&‰MOVE.W�#OUT,(A0)+�SET�MENU�FOR�OUTPUT8‰LEA�LFCR(A6),A4�LINE�FEED�CARRIAGE�RETURN�START�ADDRESS2‰MOVE.L�A4,(A0)+ŒLINE-FEED�CARRIAGE�RETURN�ADDRESS2‰ADD.L�#1,A4�LINE-FEED�CARRIAGE�RETURN�END�ADDRESS6‰MOVE.L�A4,(A0)+ŠLINE-FEED�CARRIAGE�RETURN�END�ADDRESSSOWI20ƒCLR.W�(A0)”SET�FOR�END‰BTST�#5,D3”TO�ECHO?‰BNE.S�SOWI30’BRANCH�IF�NO'‰BSET�#ECHO,RTFLAG(A1)‰SET�TO�ECHO�MODE2SOWI30ƒMOVE.B�#$33,CREG(A3)ŠENABLE�THE�TRANSMITTER‰CLR.L�D0–SET�FOR�GOOD�RETURNSOWI40ƒRTS›RETURN�TO�CALLER‰ENDC ‰IFNE�VMPP‰PAGE*?*ˆPPWRIT„WRITE�ROUTINE�FOR�VERSAmodule-01�PARALLEL�PORT-PRINTER,*’DETERMINA E�BUFFER�ADDRESSES�FOR�THE�OUTPUT.*’DETERMINE�I/O�OPTIONS.#*’BUILD�THE�MENU�ENTRY�FOR�THE�I/O.*’ARM�FOR�INTERRUPT.,*’OUTPUT�A�NULL�BYTE�TO�ACTIVATE�THE�PRINTER,*’ALL�I/O�DONE�IN�INTERRUPT�SERVICE�ROUTINE.0*’WHEN�THE�I/O�IS�COMPLETE�THE�INTERRUPT�SERVICE**’ROUTINE�EXITS�AND�CAUSES�AN�EVENT�TO�THE.*’ASR,WHICH�HANDLES�SETTING�ALL�THE�COMPLETION#*’FLAGS�AND�DETECTS�ANY�I/O�ERRORS.&*ˆENTRY:A1=REQUEST�TABLE�ENTRY�ADDRESS*ŽA2=CCB�ADDRESS*ŽA3=MEMORY�MAPPED�I/O�ADDRESS!*ŽA6=BASE�ADDRESS�OF�DATA�SEGMENT%*ˆEXIT:D0=0=GOOD�RETURN,I/O�INITIATED3*�D0.B�NOT�0=ERROR�FOUND,D0�CONTIANS�THE�ERROR�CODE*’I/O�NOT�INITIATED..*’CONDITION�CODES�SET�ACCORDING�TO�D0�CONTENTS*ˆUSES:0�1�2�3�4�5�6�7*‹D�**‹A�*�P�P�P�*�*�P*ˆCALLS:GETBUF* PPWRIT‚EQU�*0‰CLR.L�RTRNLNG(A1)�CLEAR�THE�I/O�TRANSFER�LENGTH+‰BSRƒGETBUF”GET�THE�OUTPUT�BUFFER�ADDRESSES"‰BNE.S�PPWRIT20�BRANCH�IF�AN�ERROR5‰MOVE.L�A4,RTBUFA(A1)ŠSAVE�THE�RETURNED�START�ADDRESS'‰BSRƒGETMENUA’GO�GET�MENU�ENTRY�ADDRESS+‰BNE.S�PPWRIT20�BRANCH�IF�AN�ERROR�RETURNED!‰MOVE.W�#OUT,(A0)+�SET�FOR�OUTPUT.‰MOVE.L�A4,(A0)+�SAVE�THE�BUFFER�START�ADDRESS.‰MOVE.L�A5,(A0)+�SAVE�THE�RETURNED�END�ADDRESS0‰MOVE.W�PBOPTS(A1),D0ŠGET�THE�USER'S�I/O�OPTIONS‰BTST�#3,D0”FORMATTED�OUTPUT?"‰BNE.S�PPWRIT10�BRANCH�IF�NO,IMAGE'‰BSET�#FORM,RTFLAG(A1)‰SET�TO�FORMATTED7‰MOVE.W�#OUT,(A0)+�FORMATTED,MUST�OUTPUT�A�LINE�FEED-CR8‰LEA�LFCR(A6),A4�LINE�FEED�CARRIAGE�RETURN�START�ADDRESS2‰MOVE.L�A4,(A0)+ŒLINE-FEED�CARRIAGE�RETURN�ADDRESS2‰ADD.L�#1,A4�LINE-FEED�CARRIAGE�RETURN�END�ADDRESS6‰MOVE.L�A4,(A0)+ŠLINE-FEED�CARRIAGE�RETURN�END�ADDRESS(PPWRIT10�CLR.W�(A0)”ZERO�FOR�END�OF�MENU'‰MOVE.B�#0,PDATA(A3)‹OUTPUT�A�NULL�BYTE&‰TST.B�PDATA(A3)�CLEAR�THE�ACKNOWLEDGE%‰MOVE.B�#$34,PCREG(A3)‰STROBE�TO�SEND.‰MOVE.B�#$3C,PCREG(A3)‰STROBE�TO�SEND�THE�BYTE‰CLR.L�D0–SET�FOR�A�GOOD�RETURNPPWRIT20�RTS›RETURN�TO�CALLER‰ENDCŠIFNE�(VM2+VME400SP)ŠPAGE*A*ˆVM2READƒREAD�ROUTINE�FOR�VERSAmodule-02�AND�VME400�ASYNCHRONOUS*’SERIAL�PORTS*’SET�INPUT�FLAG."*’USES�VM2WRT�ROUTINE�FOR�THE�READ&*ˆENTRY:A1=REQUEST�TABLE�ENTRY�ADDRESS*ŽA2=CCB�ADDRESS*ŽA3=MEMORY�MAPPED�I/O�ADDRESS!*ŽA6=BASE�ADDRESS�OF�DATA�SEGMENT* VM2READ‚EQU�*'‰BSET�#INP,RTFLAG(A1)ŠSET�TO�INPUT�MODE‰PAGE*A*ˆVM2WRT„WRITE�ROUTINE�FOR�VERSAmodule-02�AND�VME400�ASYNCHRONOUS%*’SERIAL�PORTS�(USED�BY�VM2READ�ALSO))*’DETERMINE�BUFFER�ADDRESSES�FOR�THE�I/O.*’DETERMINE�USER'S�I/O�OPTIONS.3*’BUILD�THE�MENU�ENTRIES�FOR�THE�ISR�TO�DO�THE�I/O.,*’ALL�I/O�DONE�IN�INTERRUPT�SERVICE�ROUTINE.0*’WHEN�THE�I/O�IS�COMPLETE�THE�INTERRUPT�SERVICE**’ROUTINE�EXITS�AND�CAUSES�AN�EVENT�TO�THE.*’ASR,WHICH�HANDLES�SETTING�ALL�THE�COMPLETION#*’FLAGS�AND�DETECTS�ANY�I/O�ERRORS.&*ˆENTRY:A1=REQUEST�TABLE�ENTRY�ADDRESS*ŽA2=CCB�ADDRESS*ŽA3=MEMORY�MAPPED�I/O�ADDRESS!*ŽA6=BASE�ADDRESS�OF�DATA�SEGMENT%*ˆEXIT:D0=0=GOOD�RETURN,I/O�INITIATED3*�D0.B�NOT�0=ERROR�FOUND,D0�CONTIANS�THE�ERROR�CODE*’I/O�NOT�INITIATED..*’CONDITION�CODES�SET�ACCORDING�TO�DO�CONTENTS*ˆUSES:0�1�2�3�4�5�6�7*‹D�**‹A�*�P�P�P�*�*�P*ˆCALLS:GETBUF‚GETMENA** VM2WRTƒEQU�*,‰CLR.L�RTRNLNG(A1)�CLEAR�I/O�TRANSFER�LENGTH$‰BSR�GETBUF”GET�I/O�BUFFER�ADDRESSES ‰BNE�VM2WRT50’BRANCH�IF�AN�ERROR3‰MOVE.L�A4,RTBUFA(A1)ŠSAVE�THE�BUFFER�START�ADDRESS'‰BSR�GETMENUA’GO�GET�MENU�TABLE�ADDRESS ‰BNEƒVM2WRT50�BRANCH�IF�AN�ERROR0‰MOVE.W�PBOPTS(A1),D0ŠGET�THE�USER'S�I/O�OPTIONS‰BTST�#5,D0”TO�ECHO�THE�I/O?‰BNE.S�VM2WRT10�BRANCH�IF�NO'‰BSET�#ECHO,RTFLAG(A1)‰SET�TO�ECHO�MODE"VM2WRT10�BTST�#3,D0”FORMATTED�I/O?"‰BNE.S�VM2WRT20�BRANCH�IF�NO,IMAGE,‰BSET�#FORM,RTFLAG(A1)‰SET�TO�FORMATTED�MODE*VM2WRT20�BTST�#INP,RTFLAG(A1)ŠDOING�INPUT?)‰BNE.S�VM2WRT30�BRANCH�IF�YES,DOING�INPUT*4*ˆDOING�SERIAL�PORT�OUTPUT-SET�UP�FOR�INTERRUPT�MODE*ˆAND�BUILD�THE�MENU�ENTRIES*‰MOVE.W�#OUT,(A0)+�OUTPUT�FLAG,‰MOVE.L�A4,(A0)+�OUTPUT�BUFFER�START�ADDRESS*‰MOVE.L�A5,(A0)+�OUTPUT�BUFFER�END�ADDRESS(‰BTST�#FORM,RTFLAG(A1)‰FORMATTED�OUTPUT?"‰BEQ.S�VM2WRT25�BRANCH�IF�NO,IMAGE+‰MOVE.W�#OUT,(A0)+�FORMATTED,DO�MORE�OUTPUT8‰LEAB �LFCR(A6),A4�LINE�FEED�CARRIAGE�RETURN�START�ADDRESS2‰MOVE.L�A4,(A0)+ŒLINE-FEED�CARRIAGE�RETURN�ADDRESS2‰ADD.L�#1,A4�LINE-FEED�CARRIAGE�RETURN�END�ADDRESS6‰MOVE.L�A4,(A0)+ŠLINE-FEED�CARRIAGE�RETURN�END�ADDRESS(VM2WRT25�CLR.W�(A0)”ZERO�FOR�END�OF�MENU1‰MOVE.B�#$11,CREG(A3)ŠPOINT�TO�CONTROL�REGISTER�13‰MOVE.B�#$1E,CREG(A3)ŠENABLE�TRANSMITTER�INTERRUPTS1‰MOVE.B�#$05,CREG(A3)ŠPOINT�TO�CONTROL�REGISTER�5(‰MOVE.B�#$EA,CREG(A3)ŠENABLE�TRANSMITTER5‰MOVE.B�#0,(A3)�TRANSMIT�A�NULL�TO�GET�THINGS�STARTED‰BRA.S�VM2WRT40�GO�CONTINUE*3*ˆDOING�SERIAL�PORT�INPUT-SET�UP�FOR�INTERRUPT�MODE*$VM2WRT30�MOVE.W�#IN,(A0)+ŽINPUT�FLAG+‰MOVE.L�A4,(A0)+�INPUT�BUFFER�START�ADDRESS)‰MOVE.L�A5,(A0)+�INPUT�BUFFER�END�ADDRESS'‰BTST�#FORM,RTFLAG(A1)‰FORMATTED�INPUT?"‰BEQ.S�VM2WRT35�BRANCH�IF�NO,IMAGE7‰MOVE.W�#OUT,(A0)+�FORMATTED-MUST�OUTPUT�A�LINE-FEED,CR8‰LEA�LFCR(A6),A4�LINE�FEED�CARRIAGE�RETURN�START�ADDRESS2‰MOVE.L�A4,(A0)+ŒLINE-FEED�CARRIAGE�RETURN�ADDRESS2‰ADD.L�#1,A4�LINE-FEED�CARRIAGE�RETURN�END�ADDRESS6‰MOVE.L�A4,(A0)+ŒLINE-FEED�CARRIAGE�RETURN�END�ADDRESS)VM2WRT35�CLR.W�(A0)”ZEROS�FOR�END�OF�MENU1‰MOVE.B�#$13,CREG(A3)ŠPOINT�TO�CONTROL�REGISTER�3%‰MOVE.B�#$E1,CREG(A3)ŠENABLE‚RECEIVERVM2WRT40 EQU *‰CLR.L�D0–SET�FOR�GOOD�RETURNVM2WRT50�RTS›RETURN�TO�CALLER‰PAGE*5*ˆVM2OWI„OUTPUT�WITH�INPUT�ROUTINE�FOR�VERSAmodule-02&*’AND�VME400�ASYNCHRONOUS�SERIAL�PORTS.*’DETERMINE�OUTPUT�AND�INPUT�BUFFER�ADDRESSES.*’DETERMINE�I/O�OPTIONS.*’BUILD�THE�ISR�MENU�ENTRIES.*’SET�FOR�DOING�OUTPUT.*’ARM�FOR�INTERRUPT.,*’ALL�I/O�DONE�IN�INTERRUPT�SERVICE�ROUTINE.0*’WHEN�THE�I/O�IS�COMPLETE�THE�INTERRUPT�SERVICE**’ROUTINE�EXITS�AND�CAUSES�AN�EVENT�TO�THE.*’ASR,WHICH�HANDLES�SETTING�ALL�THE�COMPLETION#*’FLAGS�AND�DETECTS�ANY�I/O�ERRORS.&*ˆENTRY:A1=REQUEST�TABLE�ENTRY�ADDRESS*ŽA2=CCB�ADDRESS*ŽA3=MEMORY�MAPPED�I/O�ADDRESS!*ŽA6=BASE�ADDRESS�OF�DATA�SEGMENT%*ˆEXIT:D0=0=GOOD�RETURN,I/O�INITIATED4*�D0.B�NOT�0=ERROR�FOUND,D0�CONTAINS�THE�ERROR�CODE,*’I/O�NOT�INITIATED./*’CONDITION�CODES�SET�ACCORDING�TO�D0�CONTENTS.*ˆUSES:0�1�2�3�4�5�6�7 *‹D�*�*�*�**‹A�*�P�P�P�*�*�P*ˆCALLS:GETBUF‚GETMENUA* VM2OWIƒEQU�*5‰BSET�#OWIR,RTFLAG(A1)‰SET�FOR�OUTPUT�WITH�INPUT�FLAG,‰CLR.L�RTRNLNG(A1)�CLEAR�THE�TRANSFER�LENGTH'‰BSR�GETBUF”GET�OUTPUT�BUFFER�ADDRESSES ‰BNE�VM2OWI40�BRANCH�IF�AN�ERROR$‰BSR�GETMENUA“GET�MENU�ENTRY�ADDRESS)‰BNE�VM2OWI40�BRANCH�IF�AN�ERROR�RETURNED*2*ˆBUILD�THE�MENU�ENTRIES�FOR�THE�OUTPUT�WITH�INPUT*'‰MOVE.W�#OUT,(A0)+�SET�FOR�OUTPUT�FIRST,‰MOVE.L�A4,(A0)+�OUTPUT�BUFFER�START�ADDRESS*‰MOVE.L�A5,(A0)+�OUTPUT�BUFFER�END�ADDRESS0‰MOVE.W�PBOPTS(A1),D3ŠGET�THE�USER'S�I/O�OPTIONS‰BTST�#3,D3”FORMATTED�OUTPUT?"‰BNE.S�VM2OWI10�BRANCH�IF�NO,IMAGE+‰MOVE.W�#OUT,(A0)+�FORMATTED,SET�FOR�OUTPUT8‰LEA�LFCR(A6),A4�LINE�FEED�CARRIAGE�RETURN�START�ADDRESS2‰MOVE.L�A4,(A0)+ŒLINE-FEED�CARRIAGE�RETURN�ADDRESS2‰ADD.L�#1,A4�LINE-FEED�CARRIAGE�RETURN�END�ADDRESS6‰MOVE.L�A4,(A0)+ŠLINE-FEED�CARRIAGE�RETURN�END�ADDRESS8VM2OWI10�BSET�#INP,RTFLAG(A1)ŠFAKE�INPUT�FLAG�FOR�GETBUF?‰MOVE.L�PBSAD(A1),-(A7)ˆSAVE�USER'S�OUTPUT�BUFFER�START�ADDRESS=‰MOVE.L�PBEAD(A1),-(A7)ˆSAVE�USER'S�OUTPUT�BUFFER�END�ADDRESS&‰MOVE.L�A0,-(A7)�SAVE�THE�MENU�ADDRESS:‰MOVE.L�PBRRN(A1),PBSAD(A1)„GET�INPUT�BUFFER�START�ADDRESS.‰MOVE.L�PBRRN(A1),PBEAD(A1)„SET�UP�END�ADDRESS,‰MOVE.L�PBLNG(A1),D2‹GET�INPUT�BUFFER�LENGTH%‰ADD.L�D2,PBEAD(A1)ŒADD�IN�THE�LENGTH&‰SUB.L�#1,PBEAD(A1)ŒACTUAL�END�ADDRESS(‰BSR.S�GETBUF’GET�INPUT�BUFFER�ADDRESSES)‰MOVE.L�A0,(A7)+�RESTORE�THE�MENU�ADDRESS2‰MOVE.L�(A7)+,PBEAD(A1)ˆRESTORE�USER'S�END�ADDRESS4‰MOVE.L�(A7)+,PBSAD(A1)ˆRESTORE�USER'S�START�ADDRESS*‰BCLR�#INP,RTFLAG(A1)ŠCLEAR�THE�INPUT�FLAG"‰TST�D0˜CHECK�GETBUF�RETURN�STATUS+‰BNE.S�VM2OWI40�BRANCH�IF�AN�ERROR�RETURNED:‰MOVE.L�A4,RTBUFA(A1)ŠSAVE�THE�INPUT�BUFFER�ADDRESS�IN�CCB6‰MOVE.W�#OUTIN,(A0)+‹SET�OUTPUT�WITH�INPUT�SWITCH�FLAG+‰MOVE.L�A4,(A0)+�INPUT�BUFFER�START�ADDRESS)‰MOVE.L�A5,(A0)+�INPUT�BUFFER�END�ADDRESS‰BTST�#10,D3“FORMATTED�INPUTB ?"‰BNE.S�VM2OWI20�BRANCH�IF�NO,IMAGE.‰BSET�#FORM,RTFLAG(A1)‰SET�FOR�FORMATTED�INPUT&‰MOVE.W�#OUT,(A0)+�SET�MENU�FOR�OUTPUT8‰LEA�LFCR(A6),A4�LINE�FEED�CARRIAGE�RETURN�START�ADDRESS2‰MOVE.L�A4,(A0)+ŒLINE-FEED�CARRIAGE�RETURN�ADDRESS2‰ADD.L�#1,A4�LINE-FEED�CARRIAGE�RETURN�END�ADDRESS6‰MOVE.L�A4,(A0)+ŠLINE-FEED�CARRIAGE�RETURN�END�ADDRESSVM2OWI20�CLR.W�(A0)”SET�FOR�END‰BTST�#5,D3”TO�ECHO?‰BNE.S�VM2OWI30�BRANCH�IF�NO'‰BSET�#ECHO,RTFLAG(A1)‰SET�TO�ECHO�MODE9VM2OWI30�MOVE.B�#$11,CREG(A3)ŠPOINT�TO�CONTROL�REGISTER�13‰MOVE.B�#$1E,CREG(A3)ŠENABLE�TRANSMITTER�INTERRUPTS1‰MOVE.B�#$05,CREG(A3)ŠPOINT�TO�CONTROL�REGISTER�5,‰MOVE.B�#$EA,CREG(A3)ŠENABLE�THE�TRANSMITTER3‰MOVE.B�#0,(A3)�OUTPUT�A�NULL�TO�GET�THINGS�STARTED‰CLR.L�D0–SET�FOR�GOOD�RETURNVM2OWI40�RTS›RETURN�TO�CALLER‰ENDC‰PAGE*/*ˆGETBUF‚GET�THE�START�AND�END�BUFFER�ADDRESSES-*�TO�USE�FOR�THE�INPUT�AND�OUTPUT.�IF�NO�MMU,/*�USE�THE�USER'S�ADDRESS�SPACE.�IF�HAVE�AN�MMU,#*�USE�INTERNAL�BUFFERS�FOR�THE�I/O..*�ON�A�WRITE�AND�AN�MMU,MOVE�THE�USER'S�OUTPUT *�BUFFER�TO�THE�INTERNAL�BUFFER..*�WHEN�USING�THE�USER'S�ADDRESS�SPACE,ANY�SIZE/*�BUFFER�IS�OK.�WHEN�USING�INTERNAL�BUFFERS�THE#*�MAXIMUM�BUFFER�SIZE�IS�200�BYTES.&*ˆENTRY:A1=REQUEST�TABLE�ENTRY�ADDRESS!*ŽA6=BASE�ADDRESS�OF�DATA�SEGMENT*ˆEXIT:A1=UNCHANGED*�A4=BUFFER�START�ADDRESS*�A5=BUFFER�END�ADDRESS*�D0=0=NO�ERRORS�ENCOUNTERED**�D0.B=ERROR�CODE,AN�ERROR�WAS�ENCOUNTERED,*�CONDITION�CODES�SET�ACCORDING�TO�D0�VALUE.*ˆUSES:0�1�2�3�4�5�6�7*‹D�R�**‹A�*�P�P�P�R�R�P* GETBUF EQU * ‰IFEQ�MMU*/*ˆNO�MMU�-�USE�USER'S�ADDRESS�SPACE�FOR�THE�I/O*)‰MOVE.L�PBSAD(A1),A4‹BUFFER�START�ADDRESS'‰MOVE.L�PBEAD(A1),A5‹BUFFER�END�ADDRESS#‰MOVE.L�A4,D0’GET�THE�START�ADDRESS!‰MOVE.L�A5,D1‘GET�THE�END�ADDRESS%‰SUB.L�D0,D1“CHECK�FOR�A�GOOD�ADDRESS%‰BLT.S�GETBUF10�BRANCH�IF�END�<�START‰CLR.L�D0–SET�FOR�GOOD�RETURN‰RTS›RETURN�TO�CALLER>GETBUF10�MOVE.L�#ISTADD,D0�SET�FOR�INVALID�DATA�BUFFER�ADDRESS‰RTS›RETURN�TO�CALLER‰ENDC ‰IFNE�MMU*#*ˆHAVE�AN�MMU�-�USE�INTERNAL�BUFFER*-‰MOVE.L�A1,A0ˆGET�REQUEST�TABLE�ENTRY�ADDRESS!‰SUB.L�A6,A0‰STRIP�OFF�THE�OFFSET+‰SUB.L�#RTBL,A0†STRIP�OFF�THE�START�ADDRESS%‰MOVE.L�A0,D0ˆNEED�IN�A�DATA�REGISTER+‰BEQ.S�GETBUF20†BRANCH�IF�USING�FIRST�ENTRY%‰DIVU�#RTELNG,D0…GET�THE�ENTRY�NUMBER=GETBUF20�MULU�#RECSIZ,D0…GET�OFFSET�INTO�INTERNAL�BUFFER�AREA‰ADD.L�A6,D0‰ADD�IN�THE�OFFSET&‰ADD.L�#RECBUF,D0„BUFFER�START�ADDRESS$‰MOVE.L�D0,A4ˆSAVE�THE�START�ADDRESS$‰MOVE.L�A4,A5ˆSET-UP�FOR�END�ADDRESS+‰MOVE.L�PBEAD(A1),A0�GET�USER'S�END�ADDRESS‰SUBA.L�PBSAD(A1),A0�GET�LENGTH"‰ADDA.L�A0,A5ˆINTERNAL�END�ADDRESS(‰MOVE.L�A5,D1ˆNEED�IT�IN�A�DATA�REGISTER‰SUB.L�D0,D1‰CHECK�LENGTH&‰BLT.S�GETBUF30†BRANCH�IF�<�ZERO,ERROR"‰CMP.L�#RECSIZ-1,D1‚SEE�IF�TOO�BIG$‰BLE.S�GETBUF40†BRANCH�IF�SIZE�IS�OK**ˆERROR�RETURN*5GETBUF30�MOVE.L�#ISTADD,D0ƒSET�TO�INVALID�DATA�BUFFER‰RTS‘RETURN�TO�CALLER**ˆSEE�IF�EVEN�ADDRESS*'GETBUF40�BTST�#0,D0ŠSEE�IF�EVEN�ADDRESS#‰BNE.S�GETBUF30†BRANCH�IF�ODD,ERROR"‰BTST�#INP,RTFLAG(A1)…DOING�INPUT?)‰BEQ.S‚GETBUF60…BRANCH�IF�NO,DOING�OUTPUT'GETBUF50�CLR.L�D0ŒSET�FOR�A�GOOD�RETURN‰RTS‘RETURN�TO�CALLER*6*ˆDOING�OUTPUT�-�MOVE�USER'S�BUFFER�TO�INTERNAL�BUFFER*3GETBUF60�LEA�TRAP1PB(A6),A0…PARAMETER�BLOCK�ADDRESS.‰MOVE.L�EVTSK(A1),MOVSTSK(A0)‚SOURCE�TASK�NAME,‰MOVE.L�EVSES(A1),MOVSSES(A0)ƒSOURCE�SESSION,‰MOVE.L�PBSAD(A1),MOVSADR(A0)‚SOURCE�ADDRESS*‰MOVE.L�#TASK,MOVDTSK(A0)†DESTINATION�TASK.‰MOVE.L�#SESSN,MOVDSES(A0)…DESTINATION�SESSION*‰MOVE.L�A4,MOVDADR(A0)‰DESTINATION�ADDRESS‰ADD.L�#1,D1“#�BYTES�TO�MOVE$‰MOVE.L�D1,MOVLNG(A0)ŠLENGTH�OF�MOVE)‰MOVE.L�#MOVELL,D0�MOVE�LOGICAL�DIRECTIVE!‰TRAP�#1—CALL�EXEC�TO�DO�THE�MOVE‰RTS›RETURN�TO�CALLER,D0�IS�SET‰ENDC‰PAGE*(*‚GETMENUAˆGET�MENU�TABLE�ENTRY�ADDRESS.5*’THERE�IS�A�MENU�ENTRY�FOR�2�CONSOLES�AND�1�PRINTER.1*’AN�ENTRY�IS�ASSIGNED�BY�THE�LOGICAL�UNIT�NUMBER *’OF�THE�CCB.*’LOGICAL�UNIT�#5&6=ENTRY�1*’LOGICAL�UNIT�#4‚=ENTRY�2*’LOGICAL�UNIT�#3‚=ENTC RY�3$*’USING�VME110�THE�LOGICAL�UNITS�ARE*’LOGICAL�UNIT�#5&6=ENTRY�1*’LOGICAL�UNIT�#4‚=ENTRY�2*’LOGICAL�UNIT�#7&8=ENTRY�3*’LOGICAL�UNIT�#3‚=ENTRY�4*’LOGICAL�UNIT�#2‚=ENTRY�5*+*’EACH�ENTRY�ADDRESS�IS�SAVED�IN�THE�CCB�AT)*’LOCATION�CCBSADR.�THE�ADDRESS�POINTS�TO,*’LOCATION�MNORM�FOR�THE�INITIALIZATION.�THE,*’MENU�ADDRESS�MAY�BE�CHANGED�DURING�THE�I/O,*’IF�ANY�OF�THE�SPECIAL�CHARACTERS�ARE�INPUT*’DURING�FORMATTED�INPUT.*ˆENTRY:A2=CCB�ADDRESS!*ŽA6=BASE�ADDRESS�OF�DATA�SEGMENT*ˆEXIT:A0=ENTRY�ADDRESS*�CCBSADR(A2)=ENTRY�ADDRESS*�D0=0=GOOD�RETURN1*�D0=NOT�ZERO=ERROR�RETURN,D0�CONTAINS�ERROR�CODE.*�CONDITION�CODES�SET�ACCORDING�TO�D0�CONTENTS*ˆUSES:0�1�2�3�4�5�6�7*‹D�R *‹A�RƒP‡P*GETMENUA EQU *‰CLR.L�D0ŒCLEAR�FOR�USE,‰LEA�MENU(A6),A0ŠSTART�ADDRESS�OF�MENU�TABLE1‰MOVE.B�CCBWLUN(A2),D0‰LOGICAL�UNIT�NUMBER�OF�CCB‰CMP.B�#6,D0“LOGICAL�UNIT�#�6?‰BNE.S�GETM20’BRANCH�IF�NO4GETM10ƒADD.L�#MNORM,A0�POINT�TO�NORMAL�ENTRY�ADDRESS&‰MOVE.L�A0,CCBSADR(A2)‰SAVE�IN�THE�CCB‰CLR.L�D0–SET�FOR�A�GOOD�RETURN‰RTS›RETURN�TO�CALLER '‰IFEQ‚VME110’IF�NOT�VME110�THE�ASSEMBLE3GETM20ƒADD.L�#MENULNG,A0�BUMP�TO�NEXT�ENTRY�ADDRESS‰CMP.B�#4,D0“LOGICAL�UNIT�#4?‰BEQ.S�GETM10’BRANCH�IF�YES(‰ADD.L�#MENULNG,A0�BUMP�TO�ENTRY�ADDRESS‰CMP.B�#3,D0“LOGICAL�UNIT�#3?‰BEQ.S�GETM10’BRANCH�IF�YES.‰MOVE.L�#ISTAIE,D0�ERROR-SET�TO�INTERNAL�ERROR$‰RTS›RETURN�TO�CALLER�WITH�ERROR�SET‰ENDC ‰IFNEƒVME110‘IF�VME110�THEN GETM20ƒEQU‡*'‰IFEQƒVME400SP+VMEPIAˆIF�ONLY�ACIA�THEN.‰MOVE.Lƒ#ISTAIE,D0‹ERROR-SET�TO�INTERNAL�ERROR‰RTS‰ENDC‰ENDC -‰IFNEƒVME400SP�IF�VME110�EXTERNAL�SERIAL�PORT-‰ADD.L�#MENULNG,A0�BUMP�TO�NEXT�ENTRY�ADDRESS‰CMP.B‚#4,D0’LOGICAL�UNIT�#4?‰BEQ.S‚GETM10‘BRANCH�IF�YES(‰ADD.L‚#MENULNG,A0ŒBUMP�TO�ENTRY�ADDRESS‰CMP.B‚#8,D0’LOGICAL�UNIT�#8?‰BEQ.S‚GETM10‘BRANCH�IF�YES %‰IFEQƒVMEPIA‘IF�NOT�VMEPIA�THEN�ERROR.‰MOVE.L‚#ISTAIE,D0ŒERROR-SET�TO�INTERNAL�ERROR$‰RTS›RETURN�TO�CALLER�WITH�ERROR�SET‰ENDC‰ENDC #‰IFNE�VMEPIA“IF�VME110�EXTERNAL�PIA-‰ADD.L‚#MENULNG,A0‹BUMP�TO�NEXT�ENTRY�ADDRESS‰CMP.Bƒ#3,D0‘LOGICAL�UNIT�#3?‰BEQ.SƒGETM10�BRANCH�IF�YES-‰ADD.L‚#MENULNG,A0ŒBUMP�TO�NEXT�ENTRY�ADDRESS‰CMP.Bƒ#2,D0‘LOGICAL�UNIT�#2‰BEQ.SƒGETM10�BRANCH�IF�YES.‰MOVE.L‚#ISTAIE,D0ŒERROR-SET�TO�INTERNAL�ERROR‰RTS›RETURN�TO�CALLER‰ENDC =ŠIFNE�(EXOR+VME110)‰ASSEMBLE�IS�RUNNING�IN�EXORmacs�OR�VME110‰PAGE*'*‰EXORISR‚INTERRUPT�SERVICE�ROUTINE�FOR-*’EXORmacs,VME110�AND�VME410�ACIA'S�AND�PIA'S6*’POLL�THE�CCB'S�ASSOCIATED�WITH�THIS�INTERRUPT�VECTOR,*’TO�FIND�WHICH�DEVICE�CAUSED�THE�INTERRUPT.2*’THE�MENU�ENTRY�POINTED�TO�WITHIN�THE�CCB�IS�USED4*’TO�DIRECT�THE�I/O.�RETURN�AFTER�EACH�BYTE�TRANSFER"*’WITH�NO�WAKE-UP,NO�EVENT�QUEUED.0*’WHEN�THE�I/O�IS�COMPLETE(BUFFERS�ARE�EXHAUSTED.*’AND�MENU�ENTRY=0)�OR�AN�ERROR�IS�ENCOUNTERED4*’THE�ISR�RETURNS�BY�QUEUING�AN�EVENT�TO�THE�DEFAULT5*’ASR(ISREVT).�THE�EVENT�MESSAGE�IS�THE�REQUEST�TABLE%*’ENTRY�ADDRESS�OF�THE�COMPLETED�I/O.2*ˆREGISTER�USAGE:A0=INPUT/OUTPUT�CHARACTER�ADDRESS *—A1=REQUEST�TABLE�ENTRY�ADDRESS*—A2=CCB�ADDRESS*—A3=MEMORY�MAPPED�I/O�ADDRESS*—A4=CURRENT�MENU�ENTRY�ADDRESS!*—A6=BASE�ADDRESS�OF�DATA�SEGMENT* EXORISR‚EQU�***ˆPOLL�THE�ACIA�CCB'S*/‰MOVE.L�A1,A6’GET�THE�DATA�SEGMENT�BASE�ADDRESS"‰IFNE�ACIA•POLL�ACIA'S�IF�HAVE�ANY(‰MOVE.L�#ACIACNT,D2ŒNUMBER�OF�ACIA�CCB'S)‰LEA�CCBBEG(A6),A2‘START�ADDRESS�OF�CCB'S6EXISR10‚MOVE.L�CCBMEMA(A2),A3‰MEMORY�MAPPED�IO�ADDRESS$‰MOVE.B�(A3),D0�ACIA�STATUS�REGISTER‰BTST�#7,D0”ACIA�INTERRUPT?‰BNE.S�EXISR40‘BRANCH�IF�YES‰SUB.L�#1,D2“DECREMENT�COUNTER1‰BLE.S�EXISR20‘BRANCH�IF�NO�MORE�ACIA'S�TO�SEARCH#‰ADD.L�#CCBLNG,A2�POINT�TO�NEXT�CCB‰BRA�EXISR10“GO�POLL�NEXT�CCB EXISR20‚EQU‚*‰ENDC%‰IFEQ�(PIA+VMEPIA)ŽASSEMBLE�IF�NO�PIA5‰BRA�EXORISRR’FATAL�ERROR�IF�NO�PIA�AND�NOT�ACIA�INT.‰ENDC+‰IFNE…(PIA+VMEPIA)‰POLL�THE�PIA�IF�HAVE�ONE*‰MOVE.L�#PIACNT,D2�NUMBER�OF�PIA'S�TO�POLL"‰IFNE�ACIA‹ASSEMBLE�IF�HAVE�ACIA'S#‰ADD.L�#CCBLNG,A2�POINT�TO�NEXT�CCBC ‰ENDC ‰IFEQ�ACIA•ASSEMBLE�IF�NO�ACIA'S&‰LEA�CCBBEG(A6),A2‘GET�PIA�CCB�ADDRESS‰ENDC**ˆPOLL�THE�PIA�CCB'S*6EXISR30‚MOVE.L�CCBMEMA(A2),A3‰MEMORY�MAPPED�IO�ADDRESS"‰MOVE.B�2(A3),D0�STATUS�REG-A�SIDE%‰BMI�EXISR170’BRANCH�IF�PIA�INTERRUPT"‰MOVE.B�6(A3),D0�STATUS�REG-B�SIDE%‰BMIƒEXISR170�BRANCH�IF�PIA�INTERRUPT"‰SUB.L�#1,D2“DECREMENT�PIA�COUNTER/‰BLE�EXORISRR’FATAL�ERROR�IF�NO�INTERRUPT�FOUND#‰ADD.L�#CCBLNG,A2�POINT�TO�NEXT�CCB‰BRA�EXISR30“GO�POLL�IT‰ENDC‰PAGE ‰IFNE†ACIA**ˆACIA�INTERRUPT*ˆON�ENTRY:A2=CCB�ADDRESS*‘A3=MEMORY�MAPPED�I/O�ADDRESS* EXISR40 EQU *5‰MOVE.L�CCBBUF(A2),A1ŠGET�REQUEST�TABLE�ENTRY�ADDRESS'‰MOVE.L�CCBSADR(A2),A4‰GET�MENU�ADDRESS)‰MOVE.L�MPTR(A4),A0ŒGET�CHARACTER�ADDRESS(‰MOVE.B�(A3),D7�READ�THE�STATUS�REGISTER‰MOVE.B�D7,D6’SAVE�IT*‰AND.B�#$70,D7‘MASK�TO�JUST�THE�FAULT�BITS!‰BEQ.S�EXISR50‘BRACH�IF�NO�FAULTS/‰MOVE.B�#ISTAFE,CCBBSY(A2)…SET�TO�FRAMING�ERROR#‰BTST�#4,D7”REALLY�A�FRAMING�ERROR?‰BNE.S�EXISRFLT�BRANCH�IF�YES.‰MOVE.B�#ISTADO,CCBBSY(A2)…SET�TO�DATA�OVERRUN‰ENDC* *ˆFAULT�FOUND*6EXISRFLT�BSET�#FLT,RTFLAG(A1)ŠSET�FAULT�CONDITION�FLAG*7*ˆDONE�WITH�I/O�-�RETURN�BY�QUEUEING�AN�EVENT�TO�ISREVT*-EXISRWK‚MOVE.B�#DISARM,(A3)‹DISARM�INTERRUPTS-EXISRWK1�MOVE.L�#2,D0’REQUEST�AN�EVENT�QUEUED‰CLR.L�D1–USE�THE�DEFAULT�ASR2‰MOVE.L�A1,D2’SEND�THE�REQUEST�TABLE�ENTRY�ADDRESS‰TRAP�#1—RTE�DIRECTIVE*(*ˆSUCCESSFUL�I/O�-�RETURN�WITH�NO�WAKEUP*-EXISRNWK�MOVE.B�D1,(A3)�RE-ARM�FOR�INTERRUPTSEXISRNW1�CLR.L�D0–NO�WAKEUP‰TRAP�#1—RTE�DIRECTIVE ‰IFNE�ACIA**ˆDETERMINE�I/O�TYPE**EXISR50‚BTST�#DOECHO,MOP(A4)ŠIN�ECHO�MODE?‰BNE.S�EXISR60‘BRANCH�IF�YES‰MOVE.W�MOP(A4),D0�GET�OPTION‰CMP.B�#IN,D0’DOING�INPUT?‰BEQ�EXISR80“BRANCH�IF�YES‰PAGE*?*ˆDOING�ACIA�OUTPUT�-�OUTPUT�ONE�BYTE�IF�NOT�PAST�END�OF�BUFFER*ˆON�ENTRY:A0=CHARACTER�ADDRESS *‘A1=REQUEST�TABLE�ENTRY�ADDRESS*‘A2=CCB�ADDRESS*‘A3=MEMORY�MAPPED�I/O�ADDRESS*‘A4=MENU�ADDRESS* EXISR60‚EQU�*#‰BCLR�#DOECHO,MOP(A4)ŠIN�ECHO�MODE?‰BEQ.S�EXISR65‘BRANCH�IF�NO*5*ˆIN�ECHO�MODE�-�GET�THE�BYTE�AND�CONTINUE�WITH�INPUT*‰CLR.L�D7–CLEAR�FOR�USE#‰MOVE.B�CCBEADR(A2),D7ŠGET�THE�BYTE‰MOVE.B�#ARMIN,D1ŽSET�FOR�INPUT$‰BRA�EXISRAFT’GO�CONTINUE�WITH�INPUT‰MOVE.L�RTBUFA(A1),MPTR(A4)„RESTORE�INPUT�BUFFER�START�ADDRESS7EXISR130�SUB.L�#MENUNTRY,A4ŒPOINT�TO�PREVIOUS�MENU�SLOT#‰MOVE.W�#OUT,MOP(A4)‹SET�FOR�OUTPUT8‰LEA�LFCR(A6),A5�LINE�FEED�CARRIAGE�RETURN�START�ADDRESS6‰MOVE.L�A5,MPTR(A4)‰OUTPUT�A�LINE-FEED�CARRIAGE�RETURN2‰ADD.L�#1,A5�LINE�FEED�CARRIAGE�RETURN�END�ADDRESS%‰MOVE.L�A5,MEND(A4)‰LF-CR�END�ADDRESS/‰SUB.L�#MENUNTRY,A4ŒPOINT�TO�PREVIOUS�MENU�SLOT(‰BRA�EXISRNXT’GO�PROCESS�NEXT�MENU�ENTRY**ˆDELETE�OR�BACKSPACE�CHARACTER*0EXISR140�CMP.L‚RTBUFA(A1),A0ŠAT�START�OF�BUFFER?"‰BEQ.S�EXISR150†BRANCH�IF�AT�START.‰SUB.L�#1,MPTR(A4)�BACKUP�TO�DELETED�CHARACTER$‰SUB.L�#1,RTRNLNG(A1)ŠDON'T�COUNT�IT,EXISR150�CMP.B�#BS,D7’A�BACKSPACE�CHARACTER?"‰BEQ�EXISRNWK’BRANCH�IF�YES,RETURN/‰SUB.L�#MENUNTRY,A4ŒPOINT�TO�PREVIOUS�MENU�SLOT#‰MOVE.W�#OUT,MOP(A4)‹SET�FOR�OUTPUT(‰LEA�BKSL(A6),A5‘BACKSLASH�START�ADDRESS+‰MOVE.L�A5,MPTR(A4)‰MUST�OUTPUT�A�BACKSLASH,‰MOVE.L�A5,MEND(A4)‰END�ADDRESS�OF�BACKSLASH/‰SUB.L�#MENUNTRY,A4ŒPOINT�TO�PREVIOUS�MENU�SLOT(‰BRA�EXISRNXT’GO�PROCESS�NEXT�MENU�ENTRY‰ENDC‰IFNE�(PIA+VMEPIA)‰PAGE*ˆPIA�INTERRUPT�-�OUTPUT�ONLY*ˆON�ENTRY:A2=CCB�ADDRESS*‘A3=MEMORY�MAPPED�I/O�ADDRESS*ˆUSES:A0=CHARACTER�ADDRESS *�A1=REQUEST�TABLE�ENTRY�ADDRESS*�A4=MENU�ADDRESS*=EXISR170�MOVE.L�CCBBUF(A2),A1ŠGET�REQUEST�TABLE�ENTRY�ADDRESS'‰MOVE.L�CCBSADR(A2),A4‰GET�MENU�ADDRESS)‰MOVE.L�MPTR(A4),A0‰GET�CHARACTER�ADDRESS.‰MOVE.B�#$04,2(A3)�SELECT�DATA�REGISTER,A-SIDE*‰MOVE.B�(A3),D0�STROBE�TO�CLEAR�INTERRUPTS.‰MOVE.B�#$04,6(A3)�SELECT�DATA�REGISTER,B-SIDE+‰MOVE.B�4(A3),D0�STROBE�TO�CLEAR�INTERRUPTS+‰MOVE.B�#$2F,2(A3)�SELECT�INTERRUPTS,A-SIDE+‰MOVE.B�#$3D,6(A3)�SELECT�INTERRUPTS,B-SIDE&‰MOVE.B�4(A3),D7�GET�FAULT�INFORMATION-‰AND.B�#$07,D7‘MASK�TO�BUSY,FAULT,SELECT�BITS#‰CMP.B�#$01,D7‘SELECTED�&�NO�FAULT?+‰BEQ.S�EXISR190�BRANCH�IF�YES,EVERYTHING�OK$‰BSET�#FLT,RTFLAG(A1)ŠSET�FAULT�FLAG3‰MOVE.B�#ISTADNR,CCBBSY(A2)„SET�TO�DEVICE�NOT�READY**ˆCLEAR�THE�PIA*6EXISR180�MOVE.B�#$04,2(A3)�SELECT�DATA�REGISTER,A-SIDE‰MOVE.B�(A3),D0�READ�TO�CLEAR.‰MOVE.B�#$04,6(A3)�SELECT�DATA�REGISTER,B-SIDE‰MOVE.B�4(A3),D0�READ�TO�CLEAR'‰MOVE.B�#$3C,6(A3)�NO�INTERRUPTS,B-SIDE'‰MOVE.B�#$2E,2(A3)�NO�INTERRUPTS,A-SIDE.‰BRA�EXISRWK1’GO�RETURN�FROM�INTERRUPT�SERVICE**ˆSEE�IF�CAN�OUTPUT�NEXT�BYTE*/EXISR190�CMPA.L�MEND(A4),A0ŒPAST�END�OF�D BUFFER?0‰BGT.S�EXISR210�BRANCH�IF�YES,GET�NEXT�MENU�ITEM0EXISR200�MOVE.B�(A0)+,D0�GET�NEXT�BYTE�TO�OUTPUT"‰MOVE.L�A0,MPTR(A4)ŒUPDATE�POINTER‰ADD.L�#1,RTRNLNG(A1)ŠCOUNT�IT**ˆOUTPUT�NEXT�BYTE**‰MOVE.B�D0,(A3)�PLACE�IN�THE�DATA�REGISTER!‰MOVE.B�(A3),D0�STROBE�TO�SEND�IT‰BSR�EXISRNW1“GO�RETURN**ˆGET�NEXT�MENU�ITEM-PIA*/EXISR210�ADD.L�#MENUNTRY,A4‹POINT�TO�NEXT�ENTRY‰MOVE.L�A4,CCBSADR(A2)‰SAVE�IT'‰MOVE.W�MOP(A4),D0�GET�THE�OPTION�TO�DO.‰BEQ.S�EXISR180�BRANCH�IF�END,GO�CLEAR�THE�PIA‰CMP.B�#OUT,D0‘FOR�OUTPUT?‰BEQ.S�EXISR220�BRANCH�IF�YES:‰MOVE.B�#ISTAIE,CCBBSY(A2)…ERROR-SET�TO�INVALID�MENU�ENTRY(‰BSET�#FLT,RTFLAG(A1)ŠSET�THE�ERROR�FLAG)‰BRA�EXISR180’GO�CLEAR�THE�PIA�AND�RETURN**ˆSTART�NEXT�PIA�OUTPUT*1EXISR220�MOVE.L�MPTR(A4),A0ŒGET�CHARACTER�ADDRESS‰BRA�EXISR200’GO�OUTPUT�IT‰ENDC1‰ENDC†(END�OF�EXORmacs�INTERRUPT�SERVICE�ROUTINE)0ŠIFNE�VMSA‘ASSEMBLE�IS�RUNNING�IN�VERSAmodule-01‰PAGE*%*‰SPISR„INTERRUPT�SERVICE�ROUTINE�FOR**’VERSAmodule-01�ASYNCHRONOUS�SERIAL�PORTS6*’POLL�THE�CCB'S�ASSOCIATED�WITH�THIS�INTERRUPT�VECTOR,*’TO�FIND�WHICH�DEVICE�CAUSED�THE�INTERRUPT.2*’THE�MENU�ENTRY�POINTED�TO�WITHIN�THE�CCB�IS�USED4*’TO�DIRECT�THE�I/O.�RETURN�AFTER�EACH�BYTE�TRANSFER"*’WITH�NO�WAKE-UP,NO�EVENT�QUEUED.0*’WHEN�THE�I/O�IS�COMPLETE(BUFFERS�ARE�EXHAUSTED.*’AND�MENU�ENTRY=0)�OR�AN�ERROR�IS�ENCOUNTERED4*’THE�ISR�RETURNS�BY�QUEUING�AN�EVENT�TO�THE�DEFAULT5*’ASR(ISREVT).�THE�EVENT�MESSAGE�IS�THE�REQUEST�TABLE%*’ENTRY�ADDRESS�OF�THE�COMPLETED�I/O.2*ˆREGISTER�USAGE:A0=INPUT/OUTPUT�CHARACTER�ADDRESS *—A1=REQUEST�TABLE�ENTRY�ADDRESS*—A2=CCB�ADDRESS*—A3=MEMORY�MAPPED�I/O�ADDRESS*—A4=CURRENT�MENU�ENTRY�ADDRESS!*—A6=BASE�ADDRESS�OF�DATA�SEGMENT* SPISR„EQU�*+‰MOVE.L�A1,A6’GET�DATA�SEGMENT�BASE�ADDRESS**ˆPOLL�THE�CCB'S*-‰MOVE.L�#SPCNT,D2ŒNUMBER�OF�SERIAL�PORT�CCB'S(‰MOVE.L�#CCBCNT,D1‹TOTAL�NUMBER�OF�CCB'S)‰LEA�CCBBEG(A6),A2‘START�ADDRESS�OF�CCB'S6SPISR10‚CMP.L�#'VMSA',CCBTYPE(A2)…AN�ASY.�SERIAL�PORT?+‰BNE.S�SPISR30‘BRANCH�IF�NO,SEARCH�NEXT�CCB+‰SUB.L�#1,D2“AN�ASY.�PORT,DECREMENT�COUNTER4‰MOVE.L�CCBMEMA(A2),A3‰GET�MEMORY�MAPPED�I/O�ADDRESS-‰MOVE.B�CREG(A3),D0ŒREAD�THE�CONTROL�REGISTER‰BTST�#CR0,D0’SET�FOR�TRANSMIT?/‰BEQ.S�SPISR20‘BRANCH�IF�NO,SEE�IF�FOR�RECEIVER,‰MOVE.B�SREG(A3),D3ŒREAD�THE�STATUS�REGISTER$‰BTST�#SR0,D3’TRANSMITTER�INTERRUPT?‰BNE.S�SPISRTRN�BRANCH�IF�YES$‰BTST�#SR2,D3’TRANSMITTER�INTERRUPT?‰BNE.S�SPISRTRN�BRANCH�IF�YES&‰CMP.B�#$C0,D3‘ANY�TRANSMITTER�ERRORS?+‰BEQ.S�SPISR30‘BRANCH�IF�NO,SEARCH�NEXT�CCB-‰BRA.S�SPISR40“AN�ERROR-GO�FIND�OUT�WHAT�KIND&SPISR20‚BTST�#CR2,D0’SET�FOR�RECEIVER?+‰BEQ.S�SPISR30‘BRANCH�IF�NO,SEARCH�NEXT�CCB,‰MOVE.B�SREG(A3),D3ŒREAD�THE�STATUS�REGISTER!‰BTST�#SR1,D3’RECEIVER�INTERRUPT?‰BNE�SPISREC“BRANCH�IF�YES‰CMP.B�#$C0,D3‘ANY�ERRORS?5‰BNE.S�SPISR40‘BRANCH�IF�ERRORS,GO�FIND�OUT�WHAT�KIND*SPISR30‚TST.L�D2–ANY�MORE�PORTS�TO�SEARCH?/‰BEQƒSPREC10‘BRANCH�IF�NO,IGNORE�THIS�INTERRUPT"‰SUB.L�#1,D1“DECREMENT�TOTAL�COUNT ‰BEQƒSPREC10‘IGNORE�IF�NONE�LEFT"‰ADD.L�#CCBLNG,A2�NEXT�CCB�ADDRESS‰BRA�SPISR10“GO�POLL�IT‰PAGE*(*ˆERROR�FOUND�DURING�TRANSMIT�OR�RECEIVE*8SPISR40�MOVE.L�CCBBUF(A2),A1‹REQUEST�TABLE�ENTRY�ADDRESS‰BTST�#SR4,D3’DATA�OVERRUN?‰BEQ.S�SPISR60‘BRANCH�IF�NO.‰MOVE.B�#ISTADO,CCBBSY(A2)…SET�TO�DATA�OVERRUN,SPISR50‚BRA�SPNXTER“GO�RETURN�WITH�ERROR�SET#SPISR60‚BTST�#SR5,D3’FRAMING�ERROR?‰BEQ.S�SPISR70‘BRANCH�IF�NO/‰MOVE.B�#ISTAFE,CCBBSY(A2)…SET�TO�FRAMING�ERROR‰BRA�SPISR50“GO�RETURN;SPISR70‚MOVE.B�#ISTADNR,CCBBSY(A2)„MUST�BE�DEVICE�NOT�READY‰BRA�SPISR50“GO�RETURN‰PAGE*0*ˆASYNCHRONOUS�SERIAL�PORT�INTERRUPT-TRANSMITTER*SPISRTRN‚EQU�*#‰TST.B�CCBBSY(A2)ŽA�TRUE�INTERRUPT?%‰BEQ.S�SPREC10“BRANCH�IF�NO-GO�RETURN5‰MOVE.L�CCBBUF(A2),A1ŠGET�REQUEST�TABLE�ENTRY�ADDRESS-‰MOVE.L�CCBSADR(A2),A4‰GET�MENU�ENTRY�ADDRESS)‰MOVE.L�MPTR(A4),A0ŒGET�CHARACTER�ADDRESS#‰BCLR‚#DOECHO,MOP(A4)‰IN�ECHO�MODE?‰BEQ.S�SPTRN10‘BRANCH�IF�NO*<*ˆIN�INPUT�ECHO�MODE-GET�THE�BYTE�AND�CONTINUE�WITH�RECEIVERE *‰CLR.L�D7–CLEAR�FOR�USE)‰MOVE.B�CCBEADR(A2),D7‰GET�THE�INPUT�BYTE&‰MOVE.B�#$36,CREG(A3)ŠARM�THE�RECEIVER'‰BRA�SPRECAFT’GO�CONTINUE�WITH�RECEIVER**ˆSEE�IF�BUFFER�IS�FULL*&SPTRN10‚CMP.L�MEND(A4),A0�BUFFER�FULL?!‰BLE.S�SPTRN20‘BRANCH�IF�NOT�FULL*,*ˆOUTPUT�BUFFER�EXHAUSTED-DISARM�TRANSMITTER*5‰MOVE.B�#$22,CREG(A3)ŠDISARM�TRANSMITTER�AND�RECEIVER!‰BRA‚SPNEXT“GO�GET�NEXT�MENU�ITEM**ˆOUTPUT�THE�NEXT�BYTE*3SPTRN20‚BTST�#INP,RTFLAG(A1)ŠHERE�BECAUSE�OF�INPUT?‰BNE.S�SPTRN30‘BRANCH�IF�YES-‰BTST�#OWIR,RTFLAG(A1)‰HERE�BECAUSE�OF�INPUT?‰BNE.S�SPTRN30‘BRANCH�IF�YES%‰ADD.L�#1,RTRNLNG(A1)ŠCOUNT�THIS�BYTE/SPTRN30‚MOVE.B�(A0)+,D0�GET�NEXT�BYTE�TO�OUTPUT&‰MOVE.L�A0,MPTR(A4)ŒUPDATE�THE�POINTER"‰MOVE.B�D0,THR(A3)�OUTPUT�THE�BYTE‰CLR.L�D0–RETURN�FROM�INTERRUPT‰TRAP�#1—RTE�DIRECTIVE‰PAGE**ˆRECEIVER�INTERRUPT�FOUND* SPISREC‚EQU‚*#‰TST.B�CCBBSY(A2)ŽA�TRUE�INTERRUPT?2‰BEQ.S�SPREC10‘BRACNH�IF�NO-GO�CLEAR�IT�AND�RETURN5‰MOVE.L�CCBBUF(A2),A1ŠGET�REQUEST�TABLE�ENTRY�ADDRESS*‰BTST�#INP,RTFLAG(A1)ŠENTRY�SET�FOR�INPUT?‰BNE.S�SPREC20‘BRANCH�IF�YES+‰BTST�#OWIR,RTFLAG(A1)‰ENTRY�SET�FOR�INPUT?‰BNE.S�SPREC20‘BRANCH�IF�YES>SPREC10‚MOVE.B�#$22,CREG(A3)ŠTURN�OFF�RECEIVER�AND�TRANSMITTER%‰BRA.S�SPRECRTN’RETURN�FROM�INTERRUPT4SPREC20‚MOVE.L�CCBSADR(A2),A4‰GET�MENU�ENTRY�ADDRESS)‰MOVE.L�MPTR(A4),A0ŒGET�CHARACTER�ADDRESS!‰MOVE.B�RHR(A3),D7�READ�THE�INPUT‰AND.B�#$7F,D7‘MASK�TO�7�BITS*‰BTST�#ECHO,RTFLAG(A1)‰TO�ECHO�THIS�INPUT?‰BEQ.S�SPRECAFT�BRANCH�IF�NO**ˆECHO�THE�INPUT*)‰MOVE.B�D7,CCBEADR(A2)‰SAVE�THE�CHARACTER*‰BSET�#DOECHO,MOP(A4)ŠSET�THE�DO�ECHO�FLAG9‰MOVE.B�#$33,CREG(A3)ŠDISABLE�RECEIVER,ENABLE�TRANSMITTER"‰MOVE.B�D7,THR(A3)�OUTPUT�THE�BYTE*2*ˆRETURN�FROM�INTERRUPT-NO�WAKE�UP,NO�EVENT�QUEUED*(SPRECRTN�CMP.B�#CR,D7’A�CARRIAGE�RETURN?*‰BEQ.S�SPREC40‘BRANCH�IF�A�CARRIAGE�RETURN‰CLR.L�D0–NO�RTE�OPTIONS‰TRAP�#1—RTE�DIRECTIVE*"*ˆDETERMINE�IF�A�SPECIAL�CHARACTER*/SPRECAFT�BTST�#FORM,RTFLAG(A1)‰FORMATTED�INPUT?!‰BEQ.S�SPREC30“BRANCH�IF�NO,IMAGE0‰CMP.B�#CNTLX,D7�CONTROL-X�FOR�CANCEL�THIS�LINE?"‰BEQ.S�SPREC60‘BRANCH�IF�CONTROL-X0‰CMP.B�#CNTLS,D7�CONTROL-S�FOR�RE-DISPLAY�INPUT?"‰BEQ.S�SPREC50‘BRANCH�IF�CONTROL-S ‰CMP.B�#DEL,D7‘DELETE�CHARACTER?)‰BEQ.S�SPREC80‘BRANCH�IF�DELETE�CHARACTER!‰CMP.B�#BS,D7’BACKSPACE�CHARACTER$‰BEQ.S�SPREC80‘BRANCH�IF�A�BACKSPACE0SPREC30‚MOVE.B�D7,(A0)+�SAVE�THE�INPUT�CHARACTER-‰MOVE.L�A0,MPTR(A4)ŒUPDATE�THE�BUFFER�POINTER‰ADD.L�#1,RTRNLNG(A1)ŠCOUNT�IT‰CMP.L�MEND(A4),A0�BUFFER�FULL?0‰BLE�SPRECRTN’BRANCH�IF�NO,RETURN�FROM�INTERRUPT*+*ˆCARRIAGE�RETURN�INPUT�OR�AT�END�OF�BUFFER***ˆMOVEPB‚MOVE�THE�'TRAP'�PARAMETER�BLOCK�BACK�TO�THE�REQUESTOR*&*ˆENTRY:A1=REQUEST�TABLE�ENTRY�ADDRESS!*ŽA6=BASE�ADDRESS�OF�DATA�SEGMENT*ˆEXIT:GOOD�RETURN-TO�CALLER *�ERROR�RETURN-FATAL,BIOS�ABORTS**ˆUSES:0�1�2�3�4�5�6�7*‹D�* *‹A�*�P‡*�P* MOVEPBƒEQU�* ‰IFNE�MMU8‰LEA�TRAP1PB(A6),A0‰MOVE�LOGICAL�PARAMETER�BLOCK�ADDRESS)‰MOVE.L�#MOVELL,D0�MOVE�LOGICAL�DIRECTIVE&‰MOVE.L�#TASK,MOVSTSK(A0)†MY�TASK�NAME,‰MOVE.L�#SESSN,MOVSSES(A0)…MY�SESSION�NUMBER(‰LEA„EVPB(A1),A5�PARAMETER�BLOCK�ADDRESS%‰MOVE.L�A5,MOVSADR(A0)‰SOURCE�ADDRESS3‰MOVE.L�EVTSK(A1),MOVDTSK(A0)‚DESTINATION�TASK�NAME1‰MOVE.L�EVSES(A1),MOVDSES(A0)‚DESTINATION�SESSION0‰MOVE.L�EVA0(A1),MOVDADR(A0)ƒDESTINATION�ADDRESS+‰MOVE.L�#IOSPBLNG,MOVLNG(A0)ƒLENGTH�OF�MOVE!‰TRAP�#1—CALL�EXEC�TO�DO�THE�MOVE(‰BNE.S�MOVELERR’BRANCH�IF�AN�ERROR,FATAL‰RTS›RETURN�TO�CALLER‰ENDC ‰IFEQ�MMU6‰MOVE.L�EVA0(A1),A0ŒGET�USER'S�PARAMETER�BLOCK�ADDRESS'‰MOVE.B�PBSTA(A1),4(A0)ˆSET�STATUS�BYTE-‰MOVE.L�PBLNG(A1),$14(A0)†SET�TRANSFER�LENGTH‰RTS‰ENDC‰PAGE*(*ˆACKSRQ„ACKNOWLEDGE�THE�SERVICE�REQUEST*&*ˆENTRY:A1=REQUEST�TABLE�ENTRY�ADDRESS!*ŽA6=BASE�ADDRESS�OF�DATA�SEGMENT"*ŽD0=CONTENTS�OF�D0�TO�BE�RETURNED*ˆEXIT:GOOD�RETURN-TO�CALLER *�ERROR�RETURN-FATAL,BIOS�ABORTS*ˆUSES:0�1�2�3�4�5�6�7*‹D�*�* *‹A�*�P‰P* ACKSRQƒEQU�*+‰LEA�TRAP1PB(A6),A0�PARAMETER�BLOCK�ADDRESS-‰MOVE.L�EVTSK(A1),AKRTSK(A0)ƒTARGET�TASK�NAME+‰MOVE.L�EVSES(A1),AKRSES(A0)ƒTARGET�SESSION(‰MOVE.B�EVTIN(A1),D1‹GET�THE�TRAP�NUMBER'‰AND.L�#$0F,D1‘STRIP�OFF�ANY�EXTRA�BITS ‰MOVE.B�D1,AKRTN(A0)‹TRAP�NUMBER!‰TST.L�D0–SET�THE�CONDITION�CODES%‰MOVE.W�SR,D1’GET�THE�CONDITION�CODES7‰MOVE.B�D1,AKRCC(A0)‹CONDITION�CODES�TO�THE�PARA.�BLOCK&‰MOVE.L�D0,AKRD0(A0)‹SET�D0�FOR�RETURN;‰MOVE.W�#AKROPT,AKROP(A0)†OPTIONS=SET�CC,D0,REACTIVATE�TASK(‰MOVE.L�#AKRQST,D0�ACKNOWLEDGE�DIRECTIVE(‰TRAP�#1—CALL�EXEC�TO�DO�THE�ACKNOWLEDGE(‰BNE.S�AKRQSTER�BRANCH�IF�AN�ERROR,FATAL‰RTS›RETURN�TO�CALLER‰PAGE**ˆFATAL�ERRORS�-�BIOS�ABORTS%*ˆD3=ERROR�CODE�-�ON�THE�ABORT�OUTPUT(*ˆD4=ERROR�ADDRESS�-�ON�THE�ABORT�OUTPUT*5GTSEGERR�BSR.S…ABRT†GET�MEMORY�MAPPED�I/O�SPACE�ERROR>ASQERR�BSR.S…ABRT†ALLOCATE�ASQ�ERROR)SERVERR2�BSR.S…ABRT†TRAP�#2�SERVICE�ERROR)SERVERR3�BSR.S…ABRT†TRAP�#3�SERVICE�ERROR5CISREXER�BSR.S…ABRT†CISR�FOR�EXORmacs�OR�VME110�ERROR@CISRPPER�BSR.S…ABRT†CISR�FOR�VERSAmodule-01-PARALLEL�PORTS�ERROR>CISRSPER�BSR.S…ABRT†CISR�FOR�VERSAmodule-01-SERIAL�PORTS�ERRORDEXORISRR�BSR.S…ABRT†ISR�EXORmacs�OR�VME110�ERROR-NO�INTERRUPTS�FOUND7MOVELERR�BSR.S…ABRT†CAN'T�MOVE�PARA.�BLOCK�BACK�TO�USER-AKRQSTER�BSR.S…ABRT†ACKNOWLEDGE�REQUEST�ERROR3NOENTRY‚BSR.S…ABRT†NO�ENTRIES�AVAILABLE�FOR�RDEVENT$RDEVNTER‚BSR.S…ABRT†READ�EVENT�ERROR+DERQSTER‚BSR.S…ABRT†SET�SERVER�STATUS�ERROR(SETASQER‚BSR.S…ABRT†SET�ASQ�STATUS�ERROR;CISRVM2R‚BSR.S…ABRT†CISR�FOR�VERSAmodule-02�OR�VME110�ERROR>VM02ERRƒBSR.S…ABRT†CCB'S�FOR�VERSAmodule-2�OR�VME110�NOT�FOUND‰NOP9ABRT…MOVE.L�(A7),D4†SAVE�THE�ERROR�ADDRESS�FOR�VISABILITY6ABRT10ƒMOVE.L�D0,D3ˆSAVE�THE�ERROR�CODE�FOR�VISABILITY!‰MOVE.L�#ABORT,D0„ABORT�DIRECTIVE ‰TRAP�#1�CALL�EXEC�TO�ABORT�BIOS ‰ENDƒBIOSINITéH ééé ó =/*†BIOS.AF=/*=/*=/*@=/*†IF�NO�OUTPUT�ARGUMENT�FOR�THE�LISTING�IS�SPECIFIED�THE�CHAIN =/*†FILE�WILL�DEFAULT�TO�BIOS.LS=/*=/IFC \1 =ARG BIOS.LS=/ENDIF=/*=ASM BIOS,BIOS,\1;MRZ=66=/*{ Included files are:=/*ƒ--�none�--=/*}=/*=ENDééééééü=/*=/*1=/*†This�link�file�was�previously�called�LBIOS.CF?=/*†The�name�was�changed�to�more�correctly�reflect�its�identity=/*=/*=LINK ,BIOS,BIOS;IXHMSEGMENT SEG0:8 \BIOSSTRTIN BIOSEND=ENDééH ééééé  I=/*********************************************************************** =/* RMSGEN.CF'=/*�SYSGEN�command�file�to�sysgen�RMS£*I=/***********************************************************************=OPT N,O=/*==/*�Insure�two�arguments.‚Second�argument�defaults�to�'#NULL'=/*=/RX=\0 =/IF RX = 0 ƒ=ARG�NOARGƒ=/RX=\0=/ENDIF =/IF RX = 1ƒ=ARG�\1,#NULLƒ=/RX=\0=/ENDIF=/*$=/* See if we have a valid mnemonic.2=/*ƒIf�not�a�valid�mnemonic,�put�out�help�message.=/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ƒ=/*’**�HELP�MESSAGE�**ƒ=/*7ƒ=/*�No�argument�or�an�invalid�argument�was�specified�-=ƒ=/*ƒThis�chain�file�must�be�restarted�with�a�valid�argument.3ƒ=/*ƒA�description�of�the�calling�sequence�follows.Aƒ=/*ƒType��to�continue�help�message�after�reading�one�screen.ƒ=/*ƒ=/*�Calling�sequence:ƒ=/*ƒ=RMSGEN.CF�arg1,arg2ƒ=/*ƒ=/*†arg1…=‚Mnemonicƒ=/*†arg2…=‚Output�file/deviceƒ=/*Dƒ=/*ƒArg1�is�optional.‚If�not�specified,�a�help�message�will�appear.Aƒ=/*ƒArg2�will�typically�be�'#NULL'�or�'#PR'�-�defaults�to�#NULL.ƒ=/*ƒ=/*ƒ=/&>ƒ=/*ƒRMSGEN.CF�will�perform�the�RMS�sysgen�associated�with�theƒ=/*…specified�mnemonic.ƒ=/*1ƒ=/*ƒThe�mnemonic�(arg1)�is�one�of�the�following:ƒ=/*ƒ=/*ƒ"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 ƒ=SYSGEN�EXORMACS.RMS.CD,,&.S.LSƒ=/RX=1ƒ=/IF�RD<$C000†=/R?†=/*�Errors�in�SYSGEN _ W %†=@ENDƒ=/ENDIFƒ=COPY�EXORMACS.RMS.LL,&.S.LS;A$ƒ=/*�Created�file�is�EXORMACS.RMS.LOƒ=/*ƒand�&.S.LS=/ENDIF=OPT NOF=/*-------------------------------------------------------------------F=/*---------------------------------------------------I ----------------=/IFEQ "VM01"\1 ƒ=OPT�-NOƒ=SYSGEN�VM01.RMS.CD,,&.S.LSƒ=/RX=1ƒ=/IF�RD<$C000†=/R?†=/*�Errors�in�SYSGEN†=@ENDƒ=/ENDIFƒ=COPY�VM01.RMS.LL,&.S.LS;A ƒ=/*�Created�file�is�VM01.RMS.LOƒ=/*ƒand�&.S.LS=/ENDIF=OPT NOF=/*-------------------------------------------------------------------F=/*-------------------------------------------------------------------=/IFEQ "VM02"\1 ƒ=OPT�-NOƒ=SYSGEN�VM02.RMS.CD,,&.S.LSƒ=/RX=1ƒ=/IF�RD<$C000†=/R?†=/*�Errors�in�SYSGEN†=@ENDƒ=/ENDIFƒ=COPY�VM02.RMS.LL,&.S.LS;A ƒ=/*�Created�file�is�VM02.RMS.LOƒ=/*ƒand�&.S.LS=/ENDIF=OPT NOF=/*-------------------------------------------------------------------F=/*-------------------------------------------------------------------=/IFEQ "VM03"\1 ƒ=OPT�-NOƒ=SYSGEN�VM03.RMS.CD,,&.S.LSƒ=/RX=1ƒ=/IF�RD<$C000†=/R?†=/*�Errors�in�SYSGEN†=@ENDƒ=/ENDIFƒ=COPY�VM03.RMS.LL,&.S.LS;A ƒ=/*�Created�file�is�VM03.RMS.LOƒ=/*ƒand�&.S.LS=/ENDIF=OPT NOF=/*-------------------------------------------------------------------F=/*-------------------------------------------------------------------=/IFEQ "VME101"\1 ƒ=OPT�-NOƒ=SYSGEN�VME101.RMS.CD,,&.S.LSƒ=/RX=1ƒ=/IF�RD<$C000†=/R?†=/*Errors�in�SYSGEN†=@ENDƒ=/ENDIFƒ=COPY�VME101.RMS.LL,&.S.LS;A"ƒ=/*�Created�file�is�VME101.RMS.LO ƒ=/*ƒ&.S.LS=/ENDIF=OPT NOF=/*-------------------------------------------------------------------F=/*-------------------------------------------------------------------=/IFEQ "VME110"\1 ƒ=OPT�-NOƒ=SYSGEN�VME110.RMS.CD,,&.S.LSƒ=/RX=1ƒ=/IF�RD<$C000†=/R?†=/*�Errors�in�SYSGEN†=@ENDƒ=/ENDIFƒ=COPY�VME110.RMS.LL,&.S.LS;A"ƒ=/*�Created�file�is�VME110.RMS.LO ƒ=/*ƒ&.S.LS=/ENDIF=OPT NOF=/*-------------------------------------------------------------------F=/*-------------------------------------------------------------------=/IFEQ "VMES10"\1 ƒ=OPT�-NOƒ=SYSGEN�VMES10.RMS.CD,,&.S.LSƒ=/RX=1ƒ=/IF�RD<$C000†=/R?†=/*�Errors�in�SYSGEN†=@ENDƒ=/ENDIFƒ=COPY�VMES10.RMS.LL,&.S.LS;A"ƒ=/*�Created�file�is�VMES10.RMS.LOƒ=/*ƒand�&.S.LS=/ENDIFF=/*-------------------------------------------------------------------F=/*-------------------------------------------------------------------=/IFEQ "NETVM02"\1 ƒ=OPT�-NOƒ=SYSGEN�NETVM02.RMS.CD,,&.S.LSƒ=/RX=1ƒ=/IF�RD<$C000†=/R?†=/*�Errors�in�SYSGEN†=@ENDƒ=/ENDIFƒ=COPY�NETVM02.RMS.LL,&.S.LS;A#ƒ=/*�Created�file�is�NETVM02.RMS.LOƒ=/*ƒand�&.S.LS=/ENDIF=OPT NOF=/*-------------------------------------------------------------------F=/*-------------------------------------------------------------------=OPT -NO=COPY &.S.LS,\2;Y!=/* Output listing directed to \2=ENDééééFSYSPAR„IDNTƒ5,1…System�parameters�at�\SYSPAR;�Crash�save�at�\CRASHSAV.O*v*****************************************************************************O*******************************************************************************O******************I ****************************************************************É***>***…ROUTINE:‚SYSPAR�--�SYSTEM�PARAMETERS�TABLE�FOR�RMS68K.�******É***J***…ENVIRONMENT:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family.***(***‡Copyright�1983�by�Motorola,�Inc.¢******É***H***…FUNCTION:‚This�table�gets�SUBSed�and�ASMed�during�an�RMSGEN,�andƒ***F***‡is�then�linked�in�with�RMS68K.‚The�data�defined�in�this�moduleƒ***D***‡are�primarily�the�variables�and�parameters�needed�by�RMS68K.†******É***O*******************************************************************************O*******************************************************************************O*^***************************************************************************** *,*‚Revision�history�(add�new�changes�to�top).*…Date†Author‚Changes@*…--------‚------‚----------------------------------------------*…10/�4/83‚SJF…Format�revision.*  **‚Included�files:**‰9995.&.TIOT.EQ*ŠNOLISTŠINCLUDE�9995.&.TIOT.EQŠLISTŠPAGE*E*‚First�define�the�location�of�the�'crash�save�area,'�the�place�whereD*‚the�KILLER�module�will�save�the�processor's�registers,�etc.�in�the*‚event�of�a�system�crash.*ŠXDEFƒCRASHSAVCRASHSAV‚EQU„\CRASHSAV  *E*‚Now�define�the�structure�of�the�'system�parameters�area'�to�all�theD*‚various�RMS68K�modules.‚Note�that�we�are�not�actually�defining�anyE*‚storage�here--this�is�just�a�big�offset�block�which�will�define�theB*‚locations�of�the�parameters.‚Initialization�of�the�parameters�is1*‚handled�by�the�RMS68K�initializer�at�boot�time.*ŠOFFSET�\SYSPARŠXDEFƒSYSPAR,ENDSYSP SYSPAR„EQU„* ŠXDEF�MAPBEG"MAPBEG„DS.L�1‰POINTS�TO�MEMORY�MAPŠDS.L�1ŠXDEF�EXCSTACK%EXCSTACK‚DS.L�1‰ADDRESS�OF�EXEC�STACK '< 0H 8L @3 ŠXDEF�RUNNER$RUNNER„DS.L�1‰ADDRESS�OF�RUNNING�TCB ŠXDEF�TCBHD0TCBHD…DS.L�1‰POINTS�TO�FIRST�TCB�IN�ALL-TCB�LIST ŠXDEF�READYHD0READYHDƒDS.L�1‰POINTS�TO�FIRST�TCB�IN�READY�LIST ŠXDEF�CCBHD2CCBHD…DS.L�1‰POINTS�TO�FIRST�CHANNEL�CONTROL�BLOCK ŠXDEF�MMUHERE:MMUHEREƒDS.L�1‰HOLDS�ADDRESS�OF�MMU�HARDWARE�IN�MEMORY�MAP ŠXDEF�GSTBEG+GSTBEG„DS.L�1‡START�OF�GLOBAL�SEGMENT�TABLE ŠXDEF�USTBEG+USTBEG„DS.L�1‡START�OF�USER�SEMAPHORE�TABLE ŠXDEF„UDRBEG5UDRBEG„DS.L„1ˆPointer�to�User�Defined�Directive�Table ŠXDEF�PATBEG0PATBEG„DS.L�1‡START�OF�PERIODIC�ACTIVATION�TABLEŠXDEF�TRACEBEG+TRACEBEG‚DS.L�1ˆSTART�OF�SYSTEM�TRACE�TABLEŠXDEF�TRACFLAG"TRACFLAG‚DS.W�1ˆSYSTEM�TRACE�FLAGS ŠXDEF�MACSTRC,MACSTRCƒDS.L�1ˆMACSBUG�TRACE�ROUTINE�ADDRESS ŠXDEF�PANEL PANEL…DS.L�1�FRONT�PANEL�ADDRESS**„TIMER�PARAMETERS** ŠXDEF�DATEDATE†DS.L�1‡ORDINAL�DATE ŠXDEF�TIMEOD(TIMEOD„DS.L�1‡TIME�OF�DAY�(IN�SECS*1000) ŠXDEF�TIMBASETIMBASEƒDS.L�1‡BASE�TIME ŠXDEF�DATBASEDATBASEƒDS.L�1‡BASE�DATE ŠXDEF�PTMADDR8PTMADDRƒDS.L�1‡ADDRESS�USED�TO�ACCESS�PROGRAMMABLE�TIMER ŠXDEF�TIMEOUT&TIMEOUTƒDS.W�1‡TIMER�INTERRUPT�COUNTERŠXDEF�TIMESLICBTIMESLIC‚DS.W�1‡NUMBER�OF�TIMER�INTERRUPTS�BEFORE�TASK�INTERRUPTED ŠXDEF�TIMINTV3TIMINTVƒDS.W�1‡#�MILLISECS�BETWEEN�TIMER�INTERRUPTSŠXDEF�TIMINTV4TIMINTV4‚DS.W�1‡TIMINTV*4-1ŠXDEF�TINTFLAG$TINTFLAG‚DS.B�1‡TIMER�INTERRUPT�FLAGŠXDEF�TMSGFLAG7TMSGFLAG‚DS.B�1‡FLAG�-�MESSAGE�SENT�DURING�I/O�HANDLING* ŠXDEF‚SPURCNT+SPURCNTƒDS.W„1…COUNT�OF�SPURIOUS�INTERRUPTSŠXDEF‚SPURTIME9SPURTIME‚DS.L„1…TIME�THAT�1ST�SPURIOUS�INTERRUPT�OCCURRED* ŠXDEF‚MMULOAD+MMULOADƒDS.L„1…MMU�LOADED�FROM�THIS�ADDRESS ŠXDEF‚VCTUBGN(VCTUBGNƒDS.L„1…START�OF�VECTOR�USE�TABLEŠXDEF‚IOVCTBGN0IOVCTBGN‚DS.L„1…START�OF�VECTOR�ASSIGNMENT�TABLE* ŠXDEF‚ADEFTYP,ADEFTYPƒDS.B„1…DEFAULT�MEMORY�TYPE�FOR�ASQ'S ŠXDEF‚TDEFTYP,TDEFTYPƒDS.B„1…DEFAULT�MEMORY�TYPE�FOR�TCB'S ŠXDEF‚SDEFTYP>SDEFTYPƒDS.B„2…DEFAULT�MEMORY�TYPE�FOR�SYSTEM�TASKS(RO�AND�RW) ŠXDEF‚UDEFTYPJ ŠLEA‚EXECPB(A6),A0ˆATTACH�TO�MEMORY�MAPPED�I/O�SPACE,IF�NEEDED'ŠMOVE.L‚A0,A1�USE�A1�TO�BUILD�THE�BLOCKŠCLR.Lƒ(A1)+�TASK=MEŠCLR.Lƒ(A1)+�SESSION=MEŠMOVE.W‚#SEGOPTS,(A1)+„OPTIONS ŠMOVE.W‚#SEGATR,(A1)+…ATTRIBUTES"ŠMOVE.L‚#'SHRS',(A1)+…SEGMENT�NAME ŠMOVE.L‚#ADR,(A1)+ˆSTART�ADDRESSŠMOVE.L‚#LNG,(A1)‰LENGTH'ŠMOVE.L‚#GTSEG,D0‰GET�SEGMENT�DIRECTIVEŠTRAP„#1�CALL�EXEC!ŠBNE…DIE�BRANCH�IF�IT�DIDN'T�WORKŠENDCŠIFNEƒBIOS�ASSEMBLE�FOR�BIOS*-*‰RELINQUISH�TO�GIVE�BIOS�TIME�TO�GET�STARTED**ŠMOVE.L�#RELINQ,D0‰RELINQ�DIRECTIVE�NUMBERŠTRAPƒ#1‘CALL�RMSŠENDC–END�BIOS**‰DECLARE�MYSELF�SHAREABLE**ŠMOVE.L�#DCLSHR,D0‰DCLSHR�DIRECTIVE�NUMBER-ŠLEA„EXECPB(A6),A0†ADDRESS�OF�PARAMETER�BLOCK1ŠMOVE.L�A0,A1ŽUSE�A1�TO�BUILD�THE�PARAMETER�BLOCKŠCLR.L‚(A1)+ŽMY�TASKŠCLR.L‚(A1)+ŽMY�SESSIONŠCLR.W‚(A1)+ŽOPTIONSŠMOVE.W‚#BIT13,(A1)+†SHARABLEŠMOVE.L‚A1,A2�SAVE�THIS�ADDRESSŠMOVE.L‚A1,A3�AND�AGAIN"ŠMOVE.L‚#'REP0',(A1)+…SEGMENT�NAME"ŠMOVE.L‚#ENTRY,(A1)+†START�ADDRESSŠCLR.L‚(L A1)�NAŠTRAPƒ#1‘CALL�RMS!ŠBNE„DIE�BRANCH�IF�IT�DIDN'T�WORK8ŠMOVE.L�#'DATA',(A2)+†DECLARE�DATA�SEGMENT�SHARABLE�ALSOŠMOVE.L‚A6,(A2)‹START�ADDRESS-ŠMOVE.L�#DCLSHR,D0‰DECLARE�SHARABLE�DIRECTIVEŠTRAP‚#1’CALL�EXEC!ŠBNE‚DIE’BRANCH�IF�IT�DIDN'T�WORK ŠIFNEƒMMU=ŠMOVE.L�#'SHRS',(A3)+…DECLARE�MEMORY�MAPPED�IO�SPACE�SHARABLEŠCLR.L�(A3)�NA-ŠMOVE.L�#DCLSHR,D0ˆDECLARE�SHARABLE�DIRECTIVEŠTRAP�#1’CALL�EXEC!ŠBNE‚DIE‘BRANCH�IF�IT�DIDN'T�WORKŠENDC**‰INITIALIZE�TASK�NUMBER*AŠMOVE.L�#1,TASKNO(A6)†THIS�TASK�IS�NUMBER�1,�BUT�IS�CALLED�'REPL'+ŠIFEQƒVERSADOS+BIOS†ASSEMBLE�FOR�INTERRUPTS*$*‰IF�NO�IO�SERVER,�THEN�DIFFERENT�IO*!ŠIFNEƒINT�ASSEMBLE�FOR�INTERRUPTS&ŠMOVE.L�#CISR,D0‹CISR�DIRECTIVE�NUMBER-ŠLEA„CISRPB(A6),A0†ADDRESS�OF�PARAMETER�BLOCK1ŠMOVE.L�A0,A1ŽUSE�A1�TO�BUILD�THE�PARAMETER�BLOCKŠCLR.L‚(A1)+ŽTASK=MEŠCLR.L‚(A1)+ŽSESSION=MEŠCLR.W‚(A1)+ŽOPTIONSŠCLR.B‚(A1)+ŽNA#ŠMOVE.B�#VECTNO,(A1)+†VECTOR�NUMBERŠMOVE.L�#ISR,(A1)+‰ISR�ADDRESS$ŠMOVE.L�A6,(A1)ŒDATA�SEGMENT�ADDRESSŠTRAPƒ#1‘CALL�RMS#ŠBEQ.S‚CISRDONE‹BRANCH�IF�IT�WORKEDŠBRA„DIE�DIE�IF�IT�DIDN'T�WORK*)*‰HERE'S�WHERE�WE�RESPOND�TO�AN�INTERRUPT* ISR‡EQU„*)ŠLEA„SAYPB(A1),A6‡PARAMETER�BLOCK�ADDRESS,ŠMOVE.L�SAYS(A6),A0ˆPOINTS�TO�NEXT�CHARACTER0ŠCMP.L‚SAYE(A6),A0ˆHAS�LAST�CHARACTER�BEEN�SENT?ŠBGT.S‚ISRDONEŒBRANCH�IF�YES,ŠMOVE.B�(A0)+,DATA‰PUT�BYTE�IN�DATA�REGISTER#ŠMOVE.L�A0,SAYS(A6)ˆREPLACE�POINTERŠCLR.L‚D0‘NO�WAKEUPŠTRAPƒ#1‘RTE�DIRECTIVE)ISRDONEƒMOVE.B�#$11,CNTLŠDISARM�INTERRUPTŠMOVE.L�#1,D0ŽREQUEST�WAKEUPŠTRAPƒ#1‘RTE�DIRECTIVE***‰SET�CISR�PARAMETER�BLOCK�UP�FOR�NEXT�USE*CISRDONE‚EQU„*3ŠLEA„CISRPB(A6),A3†GET�CISR�PARAMETER�BLOCK�ADDRESS9ŠMOVE.W�#BIT14,CISROPT(A3)�PREPARE�FOR�SWITCHES�TO�FOLLOWŠENDC–END�INTERRUPTSŠENDC–END�NO�IO�SERVER**‰BUILD�THE�OUTPUT�BUFFERS*&ŠLEA�STRT(A6),A1‹START�MESSAGE�ADDRESSŠMOVE.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)+…END�MESSAGEŠMOVE.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)„MAX�NUMBER�OF�TASKSŠPAGE**‰REPLICATED�TASKS�BEGIN�HERE* ENTRY2„EQU„*ŠLEA„STACK(A6),A7‡GET�A�STACK(ŠMOVE.L�TASKNO(A6),D7ŠGET�MY�TASK�NUMBER-ŠIFEQƒVERSADOS+BIOS†ASSEMBLE�FOR�NO�IO�SERVER!ŠIFNEƒINT�ASSEMBLE�FOR�INTERRUPTS**‰SWITCH�VECTOR�TO�ME*&ŠMOVE.L�#CISR,D0‹CISR�DIRECTIVE�NUMBER-ŠLEA„CISRPB(A6),A0ŠADDRESS�OF�PARAMETER�BLOCKŠTRAPƒ#1‘CALL�RMS#ŠBEQ.S‚SWITCHED‹BRANCH�IF�IT�WORKEDŠBSR„DIE�DIE�IF�IT�DIDN'T�WORKSWITCHED‚EQU„*’CONTINUEŠENDC–END�INTERRUPTSŠENDC–END�NO�SERVER***(ŠBSR„ASCIIŽCONVERT�TASKNO�TO�ASCII�IN�D6)ŠLEA„STRT(A6),A1ˆADDRESS�OF�START�MESSAGE&ŠLEA„STRTE(A6),A2‡END�OF�START�MESSAGEŠBSR„SAY�SAY�START�MESSAGE-ŠCMP.W‚NTASKS(A6),D7†DO�WE�NEED�ANOTHER�TASK?-ŠBGE„SAYDONEŒBRANCH�IF�I'M�THE�HIGHEST�NUMBER**‰REPLICATE�MYSELF**ŠADD.L‚#1,TASKNO(A6)†INCREMENT�TASK�NUMBER-ŠMOVE.L�#CRTCB,D0ŠCREATE�TCB�DIRECTIVE�NUMBER-ŠLEA„TASKNO(A6),A0†ADDRESS�OF�PARAMETER�BLOCK'ŠMOVE.L�A0,A1ŽUSE�A1�TO�BUILD�THE�BLOCK ŠADD.L‚#4,A1ŽBUMP�PAST�TASK�NAMEŠCLR.L‚(A1)+ŽSESSIONŠCLR.W‚(A1)+ŽOPTIONSŠCLR.L‚(A1)+ŽNO�MONITORŠCLR.L‚(A1)+ŽNO�MONITOR!ŠMOVE.B‚#100,(A1)+ˆPRIORITY�LIMIT!ŠMOVE.B‚#100,(A1)+ˆPRIORITY�LIMIT ŠCLR.W‚(A1)+!ŠMOVE.L‚#ENTRY2,(A1)+…ENTRY�POINT ŠCLR.Wƒ(A1)ŠTRAPƒ#1‘CALL�RMS ŠBEQ.S‚REPLDŽBRANCH�IF�IT�WORKED*:*ˆCANNOT�START�NEXT�TASK,SET�FOR�THIS�IS�NOW�THE�LAST�TASK*.ŠSUB.L�#1,TASKNO(A6)‡DECREMENT�THE�TASK�NUMBER1ŠMOVE.L�TASKNO(A6),D7†GET�CURRENT�NUMBER�OF�TASKS)ŠMOVE.W�D7,NTASKS(A6)†SET�NUMBER�OF�TASKSŠBRA�SAYDONE�GO�COMPLETEREPLD…EQU„*’CONTINUE* *‰GIVE�ADDRESS�SPACE�TO�NEW�TASK*1ŠMOVE.L�#SHRSEG,D0‰SHARE�SEGMENT�DIRECTIVE�NUMBER-ŠLEA„EXECPB(A6),A0†ADDRESS�OF�PARAMETER�BLOCK1ŠMOVE.L�A0,A1ŽUSE�A1�TO�BUILD�THE�PARAMETER�BLOCK"ŠMOVE.L�TASKNO(A6),(A1)+ƒTASK�NAMEŠCLR.L‚(A1)+ŽSESSIONŠIFEQƒVEL RSADOS5ŠMOVE.W�#BIT13,(A1)+‡LOGICAL�ADDRESS=PHYSICAL�ADDRESSŠENDCŠIFNEƒVERSADOS ŠCLR.W‚(A1)+ŽUSE�LOGICAL�ADDRESSŠENDCŠMOVE.W�#BIT13,(A1)+‡ATTRIBUTESŠMOVE.L�#'REP0',(A1)+†NAMEŠIFEQƒVERSADOS!ŠCLR.L‚(A1)+ŽUSE�PHYSICAL�ADDRESSŠENDCŠIFNEƒVERSADOS$ŠMOVE.L�#ENTRY,(A1)+‡LOGICAL�ADDRESSŠENDC ŠCLR.L‚(A1)+ŠTRAPƒ#1‘CALL�RMS#ŠBEQ.S‚HASSPACE‹BRANCH�IF�IT�WORKEDŠBSR„DIE�DIE�IF�IT�DIDN'T�WORKHASSPACE‚EQU„*’CONTINUE$ŠLEAƒEXECPB(A6),A0‡PARAMETER�ADDRESS'ŠMOVE.L�A0,A1ŽUSE�A1�TO�BUILD�THE�BLCOK,ŠADD.L‚#8,A1ŽBUMP�PAST�TASK�NAME�AND�SESSION5ŠMOVE.W‚#BIT13,(A1)+†LOGICAL�ADDRESS=PHYSICAL�ADDRESSŠTST.Wƒ(A1)+�SAME�ATTRIBUTES"ŠMOVE.L‚#'DATA',(A1)+…SEGMENT�NAME ŠCLR.Lƒ(A1)ŽUSE�PHYSICAL�ADDRESS ŠMOVE.L‚#SHRSEG,D0ˆRMS�DIRECTIVEŠTRAP‚#1’CALL�RMS#ŠBEQ.S�HASPACE1ŒBRANCH�IF�IT�WORKEDŠBSRƒDIE‘DIE�IF�IT�DIDN'THASPACE1‚EQUƒ* ŠIFNE�MMU$ŠLEA‚EXECPB(A6),A0ˆPARAMETER�ADDRESS1ŠMOVE.L�A0,A1ŽUSE�A1�TO�BUILD�THE�PARAMETER�BLOCK<ŠADD.L‚#12,A1ŠBUMP�PAST�TASK�NAME,SESSION,OPTIONS,ATTRIBUTES"ŠMOVE.L�#'SHRS',(A1)+†SEGMENT�NAME ŠCLR.L�(A1)�USE�PHYSICAL�ADDRESS ŠMOVE.L�#SHRSEG,D0‰RMS�DIRECTIVEŠTRAP�#1“CALL�RMS#ŠBEQ.S‚HASPACE2‹BRANCH�IF�IT�WORKEDŠBSR„DIE�DIE�IF�IT�DIDN'TŠENDCHASPACE2‚EQU�*$ŠIFNEƒVERSADOS‹ASSEMBLE�FOR�VERSADOS*+*‰IF�FOR�VERSADOS,�THEN�SEND�LU�TO�NEW�TASK*-ŠLEA„EXECPB(A6),A0†ADDRESS�OF�PARAMETER�BLOCK'ŠMOVE.L�A0,A1�USE�A1�TO�BUILD�THE�BLOCK%ŠMOVE.W�#$110,(A1)+ˆCHANGE�ASSIGNMENT"ŠMOVE.W‚#BIT15,(A1)+†SEND�AND�KEEPŠCLR.B‚(A1)+ŽSTATUSŠMOVE.B�#6,(A1)+‹LUN�6�-�SEND ŠMOVE.B�#6,(A1)+‹LUN�6�-�RECEIVE ŠCLR.B‚(A1)+!ŠMOVE.L�TASKNO(A6),(A1)+ƒNEW�TASK ŠMOVE.L�SENDSES(A6),(A1)ƒSESSIONŠTRAPƒ#3‘CALL�FHS"ŠBEQ.S‚LUNSENTŒBRANCH�IF�IT�WORKEDŠBSR„DIELUNSENTƒEQU„*’CONTINUEŠENDC**‰START�THE�NEW�TASK*-ŠMOVE.L�#START,D0ŠSTART�TASK�DIRECTIVE�NUMBER.ŠLEA„STARTPB(A6),A0…ADDRESS�OF�PARAMETER�BLOCK1ŠMOVE.L‚A0,A1�USE�A1�TO�BUILD�THE�PARAMETER�BLOCK"ŠMOVE.L‚TASKNO(A6),(A1)+‚TASK�NAMEŠCLR.L�(A1)+�SESSION%ŠMOVE.W‚#BIT13,(A1)+†SUPPLY�REGISTERSŠCLR.L‚(A1)+ŽNO�MONITORŠCLR.L‚(A1)+ŽNO�MONITOR)ŠMOVEM.L‚D0-D7/A0-A6,(A1)‚REGISTER�VALUESŠTRAPƒ#1‘CALL�RMS"ŠBEQ.S‚STARTEDŒBRANCH�IF�IT�WORKEDŠBSR„DIE�DIE�IF�IT�DIDN'T�WORKSTARTEDƒEQU„*’CONTINUE**‰PAUSE�UNTIL�MY�TURN�TO�FINISH*&ŠMOVE.L�#WAIT,D0‹WAIT�DIRECTIVE�NUMBERŠTRAPƒ#1‘CALL�RMS**‰OUTPUT�ENDING�MESSAGE*-SAYDONEƒLEA„END(A6),A1‰ADDRESS�OF�END�MESSAGE#ŠLEA„ENDE(A6),A2ˆEND�OF�END�MESSAGEŠBSR„SAY�SAY�END�MESSAGE**‰WAKEUP�MY�CREATOR*"ŠSUB.L‚#1,D7ŽDECREMENT�TASK�NUMBER'ŠBEQ.S‚QUIT�BRANCH�IF�NOBODY�TO�WAKE�UP*ŠCMP.B‚#1,D7ŽAM�I�ABOUT�TO�WAKE�UP�TASK�1?ŠBNE.S‚WAKE�BRANCH�IF�NO3ŠMOVE.L�#'REPL',D7‰TASK�1�IS�ACTUALLY�CALLED�'REPL')WAKE†MOVE.L�D7,TASKNO(A6)†TASK�TO�WAKE�UP)ŠIFEQƒVERSADOS+BIOS†ASSEMBLE�IF�NO�SERVER!ŠIFNEƒINT�ASSEMBLE�FOR�INTERRUPTS7ŠMOVE.L�D7,CISRPB(A6)†PREPARE�FOR�SWITCHING�VECTOR�BACK%ŠMOVE.L�#CISR,D0‹CISR�PARAMETER�BLOCK-ŠLEA„CISRPB(A6),A0†ADDRESS�OF�PARAMETER�BLOCKŠTRAPƒ#1‘CALL�RMSŠENDC–END�OF�INTERRUPTSŠENDC–END�OF�NO�SERVER*ŠMOVE.L�#WAKEUP,D0‰WAKEUP�DIRECTIVE�NUMBER-ŠLEA„TASKNO(A6),A0†ADDRESS�OF�PARAMETER�BLOCKŠTRAPƒ#1‘CALL�RMS**‰TERMINATE�MYSELF**QUIT†MOVE.L�#TERM,D0‹TERM�DIRECTIVE�NUMBERŠTRAPƒ#1‘Goodbye.ŠPAGE1ŠIFNEƒVERSADOS+BIOS†ASSEMBLE�FOR�VERSADOS�OR�BIOS**‰OUTPUT�MESSAGE�TO�CONSOLE* SAY‡EQU„*,ŠLEA„SAYPB(A6),A0‡ADDRESS�OF�PARAMETER�BLOCK&ŠMOVEM.L�A1-A2,12(A0)†START�OF�MESSAGEŠMOVE.W�D6,12(A1)ŠTASK�NUMBERŠMOVE.W�#BIT1,(A0)‰WRITEŠMOVE.W�#BIT3,2(A0)ˆIMAGEŠMOVE.B�#6,5(A0)‹LUN‚6ŠTRAPƒ#2‘CALL�IOŠBEQ.S‚SAYX�BRANCH�IF�IT�WORKEDŠBSR„DIE�DIE�IF�IT�DIDN'T�WORKSAYX†RTS—GO�BACKŠENDC–END�OF�SERVER)ŠIFEQƒVERSADOS+BIOS†ASSEMBLE�IF�NO�SERVER#ŠIFEQƒINT�ASSEMBLE�IF�NO�INTERRUPTS* *‰OUTPUT�MESSAGE�STATUS�CHECKING* SAY‡EQU„*ŠMOVE.W�D6,12(A1)ŠTASK�NUMBER#SAYBYTEƒCMP.L‚A2,A1ŽLAST�BYTE�SENT?ŠBGT.S‚SAYX�BRANCH�IF�YESSAYWT…BTSTƒ#1,CNTLŒACIA�READY?ŠBEQ.S‚SAYWTŽWAIT�TILL�IT�ISŠMOVE.B�(A1)+,DATA‰OUTPUT�BYTEŠBRA.S‚SAYBYTEŒDO�NEXT�BYTESAYX†RTS—GO�BACKŠENDC–END�STM ATUS�CHECKING!ŠIFNEƒINT�ASSEMBLE�FOR�INTERRUPTS* *‰OUTPUT�MESSAGE�WITH�INTERRUPTS* SAY‡EQU„*)ŠLEA…SAYPB(A6),A0†PARAMETER�BLOCK�ADDRESS.ŠMOVEM.L�A1-A2,12(A0)†START�AND�END�OF�MESSAGEŠMOVE.W�D6,12(A1)ŠTASK�NUMBER"ŠMOVE.B�#$31,CNTLŠARM�FOR�TRANSMIT&ŠMOVE.L�#WAIT,D0‹WAIT�DIRECTIVE�NUMBERŠTRAPƒ#1‘CALL�RMSŠRTS—GO�BACK�WHEN�OUTPUT�DONEŠENDC–END�OF�INTERRUPTSŠENDC–END�OF�NO�SERVERŠPAGE**‰D7.W�TO�ASCII�IN�D6.W* ASCII…EQU„*%ŠMOVE.L�D7,D6ŽWORK�IN�RESULT�REGISTERŠDIVUƒ#10,D6�D6�=�0-ONES-0-TENSŠSWAPƒD6‘D6�=�0-TENS-0-ONESŠLSL.W‚#8,D6ŽD6�=�0-TENS-ONES-0ŠLSR.L‚#8,D6ŽD6�=�0-0-TENS-ONESŠADD.W‚#'00',D6‹D6�=�ASCII ŠRTS—GO�BACK*'*‰DIE�(SUSPEND)�IF�SOMETHING�GOES�WRONG*‰STACK�TELLS�WHERE�IT�FAILED6*‰IF�THERE'S�NO�STACK,�THEN�I�FAILED�EARLY�IN�THE�GAME*-DIE‡MOVE.L�#SUSPND,D0‰SUSPND�DIRECTIVE�NUMBERŠTRAPƒ#1‘CALL�RMS)ŠBRA.S‚DIE�JUST�IN�CASE�THIS�DOESN'T�WORKŠEND=/*B=/*†This�file�was�formerally�called�LREPLB.CF�but�has�been�renamed =/*†REPLB.LF.=/*=LINK ,REPL,\LINKLS;IHXMSEGMENT REP0:8 \REPLSTRTIN REPLEND=ENDééééééé œ ,1REPL ASYST' REPL SA!A!ƒ2((G3@ Aù) pNAg` DATAÜ,HpnU€BXS€fú-ApAÖ"HB™B™F3@ BY2ü $I&I"üREP0"ü( B‘NAfÄ$üDATA$ŽpNAf´-|nCî<"üTASK"üF3 NUM"üBER "ü S"üTART2ü "üTASK"ü NUM"üBER "ü T"üERMI"üNATE2¼F3 =| lOîÜ..na:Cî ¼!UDRáŠ]‚„ü 1BB¸ 0$:Žg2 BpN@`aê!È 0aEè ŠáŠQ‚„üÄüÔŠ!B1ú` 4!ü –aÀJ¸ fœB¸ GúœCë <€pN@`ad4+;B,g +x  !Í EëpB�JjgR�EêQÈÿòGë(m6AIì p(ÛQÈÿü “!TCBg†a¢.x 2<ÀaD/:†NuHVMù,¯@îFü'MîHÖ?ÿ-_8-O<2<¢a`ø,áŽ,FÝÈB†-½ÈnúNu0<`0<�F虀2<é™"x :Cé2�A02�2€@02€Nua&a°‹fa†a|°�faÿ|Cí!É aÂazNuB€Aú$°Pgaÿ^B‡EЇ Eê Rÿÿfð‡#à�*(B(:¢º„c*„ÿBKúûû" B*AMú,Bœ�°ºrf†` (< �B*DB†º„baþöNu hÿÿ g,a2 ÿfaN`aðJga$`a@°‹ga¾a`Ì3|ÿÿ Nu~Aè Cé ((„ÿB*(B*DB†º„baþ�Nu•ÊB�B‚BƒIÕKõhHz ?þàB9þà ü>þà9þà è àÁþàü6þàOïNuNuSS P þ þ þà@ þˆÿÿN REPLPÿÿÿÿÿ€REP0PÿÿÿÿPRÿÿAùPpNAg` DATAÜ,HpnU€BXS€fú-ApAÖ"HB™B™BY2ü $I&I"üREP0"üPB‘NAfÄ$üDATA$ŽpNAf´-|nCî<"üTASK"ü NUM"üBER "ü S"üTART2ü "üTASK"ü NUM"üBER "ü T"üERMI"üNATE2¼ =| lOîÜ..na:Cî