IMD 1.17: 11/11/2014 11:49:21 82VKXSVRDOS B* VERSADOS/RMS68K SRC/OBJ 4.4 (NOT BOOTABLE) SN=49367 22 OF 30  SR22q82VKXSVRDOS 0420§k-*g4gRjÇ fX g­,fí-`­ ,g` B­X­,AÕaêf|$©#JF×`$* |a :F×FßNuHçAp@ç|a„$8>&68@FßHC(HD4<  g 4<8***HB g2Hçz,* m6a `NqLß8`Lßp&*HC6‚€4*AÕaìNqLß‚R�`ÿX?5|$* *g |a –` |$©#J"*0<@ÂÄjFÂ&jNÓ84gaHî`*_a N _N`Lßÿ\�|JxfNsj?_f aþJ8fNs?_'fö/,x Hî?ÿL× NiHî8`ü@ç8 4gaàî HçÿþNi/ /9d oF,hHV?<„/(@À@ÿ?"h 0P*n6` ä fÿnP�,_( „!TCBga bJ@gÿF @f AÖaC`ÿ6 @fÿ.J�f&HC4<HBAÖa¨Nq`ÿHBHA(&64< ‚HB4`àâˆ&T�(T�,_" �!TCBga üCð=C^AÖaB´J®@gþÐ$< ÿÿHCHD6`¢-@L× NiHî8AÖa  .x|øÿMø|"N ) gì,@.,fð#n ®-!Î /.D/.@Qø1øHFpàÀ.-fh|øÿ*n6a ¨ n<€™AÖa®Ü‡(F9n@ÿú)nBÿü-'fLîÿHìÿÿ¾Lî0Hìÿî -/@-@B`ÿ*n6a¨ n, ,"0<2 gB@2g<,*.,(>,°H@0,²H@"@J²f -@g4&@4+HC6+HCAòa J²gHç@(AÕa¸`Lß ra ž,sf`0Lß,sò Rr ì ,NuÇ1G*è)!|EXEC°!| ´<(,Æ1F.½Èg$F-ÿ† g†1F,|ð& fa –Nu1F,X�`9Ra aaaaaaaaaa a aaaaNq?/_'g/ gÎar//N,y Hî?ÿ8 4g @ça~ªT�Kú`ºhLa*8]…š�Nh,œ… n6a¦`Nq`"(F CN`&8UC _8ß¿Ãfú/?,ÿú/<<`B† m n _-_¸-_¼/.)g".èg a nbJf\ nCø˜ 1pfÊaû¦`rJFf:AÖaü¤ Hzüü�Ÿ`ùŠ P�` €¸`ùx~$.èffffNLî?ÿ,_` z,.ð n6aÊ`Nq`&~ F&(.ô·„f È®ìg-Cô`"R‡È®ìgg°Rnø .ø°nøb ~aN`˜.�/,x ½üg0/ f(.)g .è8gîè,_"¯PøNs,_"/86NuaØ$< 4.&.(.8áL<Aîàa `®)Lîÿt®-@&Nuî ,X�`ø¸ .`p|Jxf Lî?þ,_Nsjø‚aõtJ8gè`øtB®L× NiHî8`øvp`Np`Jp`Fp`Bp`>p`:p`6p`2p `.p `*p `&p `"p `p`p`p`=@=|ç�G` H@0<.H@ xQˆYˆ.H|`ÿV@çHç0x "x,JAkj fah|&)fFïT¯`Ø`J$C#RFïBª€%@ %H%BBjgêáIAøÿ5A$|aœFï`Œa`†Hç8Eé&J|$S ªf"´ªf&’(R(,Ù¸NÙ¸J¸JFï0`:&J&g2$C ªf ´ªf&’(R¸üg(*Ù¬Fï0` `&J&`Ì`$©#JLßNuLß FßNu&i"’¸Nl!ÂNÓ¸J¸JD�'A$‹#J`&(S’¬m &L(S’¬`ô%lÓªD�)A$“&ŠNu/)µßfa`a&Nu#R$©#J$i *ѸNѸJ¸JNu&’$©#J *$SѪNu#R&i +ѸNѸJ¸JNuHøÿÿ @ø !× Ni!É H!ø L"x:3|•3|µ3| 3|°|`Þ- °8g @ç|!Íd*x@@ÀaóFßNu- °8g|!Íd*x@@ÀaòôNs-)f8 8tg2 @ �!ASNgaÿVAè0<~J˜WÈÿügT—Nu! D m6@ Nu 8tg* @ �!ASNgaÿ"l6B@) g @€maÿåHB°Nu/ aòx*_J- gR"x€<@))1g()&²- f2) ²uPm²uPn|1!ɈÀ�R fÂCé@B³ø„o¶NuHçÿþJ¸gÔ xdJ( gÈz,/Naê`Nq`¶a¸6( 0PÃ@ç|Lø€(J. G),1g(†g"F1R  fIì@B¹Éo(HR¾KfιÊfÊ"_Bx^NsHçÀÀ xB(B@r@ç|xqXnR�@èÑxX“¸NFßJ¸Nn"x,AéCúŸ €%búŒÐ€0;2Nû./ �%bÒ�2;Aû±üf �@gT¯"NuúTýýÀþ2ü\ ` ÄâúT¼ Œ üìúTúTúTúTúTúTúT3ÌÌúT ÈúTýüúTúT.ÊúTúTø’ÿÔíPíÀ?_'fD|/,x Hî?ÿ.)g.å@k. @,b,(H$;,j g*@ •!TCBg`÷˜*NNû `ï@`:`®`÷z÷xÀ:ÀäÀ,@ÌÀÜÀ”@ *(xÀ Ž@ Þ@.2À @ 0 ,,R@ *à*ÖÀ#L2À2jÜ#BÀ.À 'Ú@1Z@$2J@82ZÀ/ÎÀ$fÀ`2tÀ62Ô&,÷x÷x@ 8@ (@ (@ ª@ 2À÷x÷x÷x÷x@'V!<Àp÷x÷x÷x@ r*€3¦À @Ê÷xÀ!àÀàÀ !ÄÀ %šÀ "ÔÀ #`÷x÷x@Ž@(Ä@"´Ø84gažÿ.)g".èg~aõ–å@kN @,bDGúþž$3g2*HE…ÿ, n6aœ`Nq`õô(FgAÔaâ``õä*HNó `õÒ$x($ gôä@D@°jnêS@Àü EòJªgÚ4*‚f"²®fÈ-W8BnH??<„Hz @ç$jNÒ0.HfõÎ0gõ: @fAÖaû|`õR"( PaJ` T—Nu �!TCBfô*H(m@ gê ᘀÿgÞ@ç|2,$0{Nû€0000>>>>00008Š8Ê8ª8ö8T8ZFßT¯NuFßa÷aZ``ê¬ %FßaNu l` l 9A$Fßaà"HA fa¦AÕaúªNua``ž9A$Fßa€aÄNuaî``ÿ~9A$Fßa^a¤Nu9A$Fß l aV"HA fa8axNu9A$Fß l a*"HA fa aLNug"2HA)A`6‚g "2HA)A`)l`‚gY@‚4&(*,. "JåHNûú`|NqNqNq ‚`~NqNq ‚/`hNqHÐ `lNqHÐ /`VHÐ`\NqHÐ/`FHÐ<`LNqHÐKøIøB§$I"xfFJQk$¶1@f&i OJ�g·Øg`öHSAëa÷¬a”Cé QÿÿfÎB„J—g| g4´¬o  g($,aœ‚)aØ®- K gT¯Lß88Nu g@î-|ð&Aí-H”@ç|0ãHâ@S@lü0€a÷b�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®JQk iµèlž`µél”µém˜fÿ@JQk’*iHUAíaöF gþâáŠ&J×ÂàŠ(@°ŠnþÒ ,áˆÐŒ°Šn fè`þ¾°‹gþzn gþ®�Šàˆ$`þf&”g"T#K(‹'L'l B¬ �‹àˆ'@‘¬`þHç $nLß0T—Nu$H"x ÿÿg *iµílµémÜJQkÞá‰Òв­bÎ` Cé QÿÿfÐ`ÀCøAíaõh&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õ``îCé QÿÿfÜAíaõLLß0NuT—`îHçÀ@ç&x0|*S»ëfKëIí&ŒFß+@+H+N (o:”T¯;o+o Uïÿb+o aõ*+A;@Lß8NuBƒB€"x gbEé0)gP—ËJj f ·üf$&J` ±êf´’gB* g f4 f& ÕüS@fÄJƒf"0) K·üf J°i m‘ÈR€T—Nu JNu CNuB€*g B…:(0P$f `¾°P g Q… E læ*T—NuB‚BƒB�"x$( gd4)´i gRB(pJq fJƒf:& „g04)`*±üg±ñf$lµñf$lµñg"Jq k"€SDf²T—JƒfB€B‚Nu Nu qNu gJ�g` N".Nu gô"(g.(f".°®f²®gÖ x±üg°¨f²¨g* h`æJf @Hz?)gB,,Jm g.¼•f*­ Jm f0-@ fB�2- m aù:`aì,ÛüSGfÂNu>, fz,, n6aüx`Nq`éø$F,g z,, m6aüX` ` JEgJ0Ðf`éº., m6aúÖ``ìB€00P, f:ÐpPáˆ%@B€$°P 5pP$ª00Páˆ%@B€00Páˆÿ%@ `éáˆ-@ `é»Îg-,f `éT`é<`é<., m6aú\`îJ…gæ0, 2,A'ÿg� f  gÁÁÁ� B‡,,g�  gB† ff-)f ¸fÁ.8xΆެÞ¸xθ|à�"Ff�fAørfRˆ-(fTˆHG>G‡ÿ?HG Gaõ:`(T�S€g`èj`èj2f"AÓa÷z`aêl`è\&H.*á�g, "F m6aú¾`Ê`ÈJ0PfÂ!¬ P 0, @Oÿ gÀ1€P$1¼Pg1¼P àˆ1€PЇS€1€P �‰àˆ1€P�P&ðP$R(-K gá�-G$½Íf *n6aê*NT�`çZ., 8,(M¹Îg ,,f `ç Nh)H<*l6AÕaø¬``ç~J¬@g ,<àˆ°uPe °uPb`çja`ç05P$@0g@$,25P$ uP a÷ì`aéX<(SFÜuP;†PSh B†<(  g†1F JFf.05P$@ f$B€05PÐuPáˆB�25P’uPR� @aö`aéBuPaéüBµP BµP$BµPBuPS-Nu*Na*n6aé`æb»Îgæ¸a`æV$-2, l a÷D``æ”`æˆ`æœ`æ„&H$m6.+AÒa÷ `êJ…gÞB…:+á�, gº¬d`æ|*,…ÿB$,,B, g,+ AÒaø¾` `žJ…faèBJ0Pf�%«P B2P' àŽ5†PàŠÜBSF5†PD€Ð« àˆ5€P5¼P+g5¼P5«P$òP$R*Rk -k  NuB‚,"xhJ1 oåÒBƒ,g Co`å¬á‹à ?<„Hz @ç?<„åŠ B/?85gaõÄîNs85gaõ´Ý`å&M*n6., AÕaö~``åPJ®@gNh àˆ°uPe°uPcå>·Îgå "E$L.* k6aöH`J…f`å`å* ,**fB†<5P* g ÜuPáŽB€05P�uP$R@*á�a÷f` `J…faæê`äÚJ0Pfö"( à‰ÔA1�P1‚P’u@DAÒu@1�P!µ@ P 1µ@&P&65@$*gƒ* gÃÃ1ƒP$1¼Pg1¼PBu@ÉEaçzËDBµ@ Bµ@$Bµ@Bu@S-R(20PÒpPá‰-A  g$$.´«g pP "(KaôÀ`aæ,&L$+ ‚`ã°,,`&"-6g*,,, Aaöz`` J…gJ0Pf`ãì..)g , g @ �!TCBg` Aì aõœ``ã® N.(f ((g`ã "(6g*,,, Aaö`` J…gJ0Pf`ãŠHzÿ”?,--gGÿg­-g- ,gSs­-f­ ,Ss3g³ gAóaègl A g+l  g+l  g- ,fAÕaèJ`áþ g í,`áî gØí ,`áÞJ­@fâ&B‚,gfâ6B‡, g*,, m6aôˆ`Nq`âfâ B†&, $‚0¶‚l&ƒÿà‹HC8pHC Caî†``áÀ ¼!ASQ!l!F Gè,!K!K!K 1G(áŠÔˆX‡”‡!BBƒ,481B&;01B$Bh*+H@`á $L(m@ gb.)g@"j B€ cPr fY fP@R@€°l(b0@ç|4,$6{ (Nû°$z,* n6aóˆ`Nq`á"F`ª`àà`á 0000<<<<00006‚6¨6Æ6ê6\6bFß`àÎFßaâÈaÈa`Fß`à”¬%FßaÖ`à8 l` l B9B$FßaàAÕaæ^`àa‚a¼``¸9B$Fßa€ar`ßì9B$Fß l a†aT`ßÎa>az``ÿv9B$Fßa �&\e�&\R€HÔ`Ôj&L- ,gÔ¾zJaÿœ(FCí0<"ÜQÈÿü+mt+m ”+\B0-è+\è-èø�-è@A--gÔ+lÿîô;lÿúø+lÿöú`ÓüAÖaÚ2`Ô­ ,gÔHAÕaÚ0`ÓÞ&L- ,gÔ2zaÿ(F--f­@`­ø+lð+lô+l ì+løBmø-è8�-èJgF--fí@`íø.-èg&z,-ð m6aæ6`Nq`Ó†(Ff+Tô­ ,0-,@ÿfAÕaÙp`Ó$@ç$, 6,|B„g (,nFß`Ó|B… g *,fÆaÙCÀg*B†6, gƒg´�lJ„gÔ„`ô‚&\`6,$Ô„"x,Eé|&J$S gλêfð*fèJ†kºªfÞ&’ R±éf (ѸNѸJ¸J` *ѨF×J†f2%M„%D %lBj%EÃ5C”�|aÓêF×`‚RFCf* g0êªêB‚Hç~|aÓ´FïLß~J†kÿF`@|$©#JF×J†kÿ0`*J†f| )g $@#RF×`ÿ`Fß`ÒSFnFß`ÑþFß`Ѥ&Lz`aüà(FCí0<(ÙQÈÿü(íB8í@ -è€ÿÿÿ(À(í,0-è@ø8À(íð(íô(íì(íø--gÑP)môÿØ9møÿä)múÿà`Ñ:*N"(n@ g<,'f8Nj~,'f‡<.)f&*, n6aãà`Nq><€™AÖaÌ\`Ñ6`Ñ>&F`&J ‡oLÛ}Hî}LÛ|Hî| .‰0@ÿ/gÀ?@/[ÔÇNb@ç|4,$4{ Nû <d”d<|”|0606060600000000FßaÒÐFß`ÐTFßgÐJ)l"lJ)j)iaô¸`Ð^g B9B$Fß`Ðg B9B$Fß`ÏüFßgÏò l aòÂaôn`Ð>,.(f‡J”gz, n6aâ¨`Nq`Ð(J®@gÐ,‚Eø˜J2 fÏò¼ Eø¨Äü%Ž %® 5¼ B² %” Br 5‡ 2` ò `Ïd.(f -(fÏ®,°-%cB® m%#`Ïš@$@&`Ï.BG`><&,"x$0àH°i lF(¸±0f>Jq0 g8 10f ¾10g.‡0Jq0 j&10JGg Añ0aÔ`ÎÚAñ0aÔ®`ÎÎ`Ï`Ï",*H"x0 g i‘É*$ n6aáˆ`Nq`Ï$F&äŠS‚$ÙQÊÿü$F(M"x0&Q—ÉÙË$ÌÛÃ$Í`Îz.(f`ÎÊ@ç2<€tÿaÏNqLÜ.<&\¾„b˜‡Rƒ`ö|!Ã>&8J–¸N–¸R–„׸R¸RaR 8>"8J’¸N’¸R�( xB a~|‚È� aº@àˆ@àˆ€üdH@@|FFß`ÍØ"8R’¸JÒ¸N�&\�"AB�tÿAúaÎb`aÐNu@ç|R¸>¸&\R¸RaºFßNs€üê`"B€0€ü<@AÑaŘ"i f¾,)gañÐNqaôl,)gaó´~Cø˜Eø¨"Âü 1pf2g/aÄ"., ,gaÎÜR‡ ‡oÄaêÄa߈J¬gH4<HB4,&,8,HD8,°*,²<,¶HF<<.,*>,,)g<<$LAìaÔPNq(JCø )g¹Àg"@`ò#laÌšB¸ rAÔaØÄ`L× NiHî8a˪`Éb-mp =m("--gÉ `É|Iëÿþ6<€a&NuT—Nu&LLìpHF>,6.(Ba ``É~`ÈìAÓaÛ"``pT—NuB€8qH@0< @aÕâ`pT—Nu*H4<B˜QÊÿü+S +fgJ€f `<.p .;Fp+@aÚ€fDÿ;D(+El+EB;|„FHD0àHgfJg¸.%c.%D%°c@$@&*¼!TCB|€,;|:;|0$MÕü`+J6$¼!TST|5|$5|D x -"-±üg"°¨f²¨g h`ærAÕa×HNqpT—NuaÊÄ`pT—Nu+x!ÍNufg2 .".` ", , g.(g J�g` .".+@+ANu.(gÇÂ*<,, n6aÚ4`Nq`Ç´,gǶ&Fp&ÝQÈÿü`Ç4@ç, gzR` ,gz,. n6aÙð`NqFß`ÇFJ”f6".*y»üg,²­f-(f-,g-.fB*m`ÔAÔaÙ` B® Fß`Æþ*H½Íg-(g.(fFß`Æú-,f Fß`Æà-m -.fX>,aþÌ+mlB<-(F€g@z,-B m6aÙ<`NqFß`ƺ+FB:(0P$g00PÑpPÑpPBpPQ… E làBm., gGìLÛÿHíÿLÛHí |­,0-,@ßfF×AÕaÌ2Fß`Åä@çJ”f8".*x»üg0²­f-(f½Íg--fí,gJ*m`ÐAÔa×Ü` B® Fß`ÅØ*H--fì½Íg-(g.(fFß`ÅÌí,gFß`Ų;m,.-m |­-gCø I"h ³üg ³Ífî!i Fß`Å(|®-fî,|øÿ`Å6|øÿAÖaËL0.^gÄüBn^`Å‚-n Hî)`Ää-n Lî)`ÄÔ Ma`ÄÌ@ç|¨,f è-FßNu (Xg"Hçp$@"x,Gé µÓg&S`øaÆžB¨XLßFß0(^g1|1@|ABh^aÊ´Nu*N(n@ g(,'f$@ç|.-f 4,$4{ Nû Fß`Ä8`Ä|`Ä„N6z6N6z60606060600000000FßaÆjî , 9B$Fß`Ä 9B$Fß)l"lJ)j)iaè<`ÃÞ9B$Fß l aæraè`ÃÀ..)f,fz n6aÖ\`Nq`ô F$H"*f`ÃÊAøŒAøŒaÈŒGø"SJ“g²©gØGé`ì f¾.)f, n6B…*ç�EaÕü`Nq` B€* e c @dpËa„r Âj A fp ar"xhJ1gj´*fª *ÿg Jª fpÇaH *b *dpÌa4GêB…*g0 opÎaS…ç�2*²sPdpÏa ²sPd pÏa``\Q…lâp Àjf" * @fRˆHyZ\? *(SJ“fp a¦Gì°¬fì*,Ig°,(gp a† ¬g(l`ð"SJ“gGé`ô j p(R@ @Hç€8aÎà` LßpaÿJLß"HíˆB˜S€nú*g)I&‰"¼!CCB*giHLê?Hé?))àáˆ3@B@3@@GêIép)+g(Û(ÛS`öB€*åˆ#@D&j ×Ó#K )ÿf#|` *géI*géH`R*fbB€*&xhJ3g:(iD &TGëÿ¶*` &lJ¬g +*²n(K`ê¹Àg #K)I`#K&iD3|N¹J#|`ÀLIéJ&ŒB€* xh¼ÿ iÑè*I/N�,_`‚`jp aøp aôpað gFo opÁaÜ n6B€S&@B… f )e: )c )€e* )�b".)f;°g,aÒö` Nq`š×ËGû°ÖÓNÓÿþ Ê Øî *aºf² © ©HfV")D(A&TGëÿ¶ `&lJ¬faÂ*°‹g(K`ê¹Áf$J«g&(k9|N¹J)|`ÀLIìJ&kD&Œ` )k`B�)(&iDHz¶¾&Ÿ&xhB3Iø &TJ”faÁʰ‹gIë`ì(«AøŒaÅ Iraδ`@aÁ¤p�az&Iaø"Kfpal)Hgp‚a`)IgpƒaT)Ig .(gþ€)Igp a6 )c )c )€e )�c*g< * d pÆa¢`žj :#j `½Â )AîDJ�g"P°©gAé `îF€NuX�B�AøŒaÂä `½�AøŒaÂÖ`¼ö,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ÌpîFßHç€Ä*oKíÿ°"m/ N‘*_e -g*@`êLß#X�|JxfNs`³85gaÌ(îHç€Ä 8g*@ m ( g / @çN°Fß*_ -`àLß#|JxfNs`²ÄHçÿüp`Hçÿüp:<J-ìg prAúþè` Fgê+Kd+mPhprAúþ°¼XWÈÿüfÒpþNðþr‚(mdAAíʼ |p1AAú Îp%N@`Æ"m"(mvAú p%N@`²,+z:"mha"F(mvN¬<€m|ml3mn0-p3@AítCép2ØQÈÿür`ÿxAíl(j!lŠ!lŽ0<€2< aŠAú$p%N@r`ÿJ(jAìzB@BAal mp(g8(Víìg,,(*z"mhapg~C`Z+F¦HzýÆ!_*!M.1mB2 mp/ (mvN¬<(_€AèCì‚p2ØQÈÿür`þÐ,+z:"mha "F+Ip~ÀifþÂifö~0<ÿÿ�mnÀifä0<ÿÿ�mpÀifÔ0) ÁiF@Àh�i0)// Aè Cé EúüîB�gâHe SAØQÉÿü`ÑÁÓÁ`æ"_ _~B)& b‚,-r gx~A0<Ài @gh~@)( b)fJ©gN` rðÂé²f@) g )(c)(g )á˜g jB`öm|0-l@PìPNu‡rˆ`ý®aœHípÆaFíB+g;|4pª`;|8pª`ZPíäPíåQíéB­°Qíæ+f -uWíæNuaLHípÒFíB+gQíéPíå+g;|pª`;|pª"mhR)'Fü AúŽp%N@p.m`Nu(mvN¬<f -grá`üô;k®+gAëpN@`r„`üÖ+HhB­¸,+ *+š†RE"mhaNuagr„`ü°(Ú†S…NuHçÀ IaúLßNua†HípÒ,+*+"mhaÈHípÆaþôFíB+g|ª`|ª+g|4«`|8«|p¬`ÿAúÂp%N@`ÿ/ "m"aú(mvN¬0 mp(f(fJ-gN¬8QíQíN¬<€AèCítpFíB2ØQÈÿüFü N¬4a"_NuHçÀ€Aíl((rðÂA¾fpé@¿pÿ2(A0 A g( gp@ÀLßNu"m"(mvPíÁa¾QíÁNu"m"(mvAíÊJ-ªf|‚1|‚`&|&md|æaø'@aN¬01|æ¼ |qPíÁa "QíÁgp N@NuKéýè"m"(mvJmðfNuJmöfNu m ücPíëNuQíë2-ò²mþfB md"-Î’­Æ!AmAíʼ |pB(m a~N¬0a¤gp N@Nu5Smòf;|àòSmöJ-çg mÌöba`0-ðNûNuNq`Nq`’ mαíÊc aDgpa`6Á+HÎJ-ægaî -Î-tg°­Êc�­Æ+@¸`À`a`ÿ -Šá˜g²gB`ô-¾À°-¿f" -Î�­Æ+@¸HçÀAí "mN‘LßBmðNu mÎaºf ±íÊb�`JJgþ° c pa``þ g ff±íÆc\ +HÎS­°J-ægL-ug&Jíêfpaܲ-ˆf -Ža¤+mÆÚB­°+|8pª`¨²-‰f0+mÆÎJ-æg-ugp\a– -Žaf`ýÎ+| 8pª`p±íÊcpat`DÁ+HÎR­°J-æg bp^aTR­°r@ÒaF-tg±íÊc ‘íÆ+H¸``ýnJ-æg J-êgp>a -ŽaèBmðHçÀAí "mN‘LßNuH瀀 -ªc¤á˜+@ª /bB­´@ïHçÀAí "mN‘Lß`z ?b2Qíê0@ñ-®f-uga\HçÀAí"mN‘Lß`BB­ª md|!m¸QíäQíå mhS('Aíʼ |p1|aœgp N@LßNu@çFíB;|àò;|àôBmöBmþFßJ-çgaTNuJ-äf -Ú�­Ò+@¸NuKéýÜ"m"(mv -zgn -ìffJ-ªk`f(AíØ¼ |€1|N¬<À@ | `$ mda²!@pÆ@Aíʼ |p1@a²N¬0aØgp N@NuKéýô"m"(mvN¬,fNu0-îNû`pNq`Ö`ò`:`T`ŒJ-ég0B-¼;|ø;|úBmü -ÖR€+@ÚJ-ÃgB-Ä`B-ï`¢N¬( g fm“¼g a6íÃNuJ-ëgQíëHçÀAí"mN‘Lß` JmðfaýØNuHçÀQíç-ugaðíÃHçÀAí "mN‘Lß` FíBN¬DFü LßNu mÚ±íÖc aþdBmî`‚`+HÚ`ÿ mÚ±íÖb g+HÚ cR­´`þúBmîaþ& -´B�2-vg��nüg -ŽaþNu`þªJ­°gS­° < aäNuBmî`ÿ mÚ±íÎfBmî`þü+HÚR­° bR­°@H@€^a¤Nu`þx-Ãf2-Ãf,-Ãf2-Ãf8-Ãf2-ÃfBmÄï`þNu­Ã-„`þd­Ã-…`þVNuJ-¼f­Ã`˜pS-¼`þJmüf­Ã`€2-ø5oSmøf;|øSmü`ýÜá˜g"a@Bá˜føaRíÃHçÀAí "mN‘LßNuaa4íÃHçÀAí "mN‘LßNu2-ú€oSmúf;|úRmüNuJ-Ãf mïÄ|ïNuKéýÐ"m"(mvJ-ègaØíÃNuKéýÄ"m"(mvQíè­ÃHçÀAí "mN‘LßNuKéý¸"m"(mvPíç-ugaŒíÃHçÀAí "mN‘Lß` FíBN¬@Fü NuJmþf"@;môþ màöfRmþ màþcBmþNu -¸fJ-äg -Î�­Æ` -Ú�­ÒNuHç@aûš;|ø;|úBmüBmîB-ÃBmðJ-ªc B­ª"mhS)'QíéQíäQíåQíëQíèB-¼LßNuKéý¬"m"(mvHç?|FíBN¬HFü aþ¨íÃAú"|,r$ p"N@`p N@Lß>üNu/ *AJ-ìg&@ç@À@FÀ"m"/ (mvN¬L(_Fß m¦N¨ `HçÀAí`"mN‘Lß*_NsKéý "m"(mv­Ãg$FíBN¬LFü |pªHçÀAí "mN‘LßNuPíÁAíÊa QíÁgp N@NuHçX2(&-l( pf -Áfaîd`aîV`: qf -ÁfaîÂ`aî´` €f8( -Áfaî¸`aîª``þLßNu|ÿüª|ÑÂNuJ-ªc8AíÊ"mdaþ*#@pá@¼ |p1@aþ./ (mvN¬0(_aÿLNuJ-ìg m¦N¨NuHçÀAí "mN‘LßNuJ-ìg À-À m¦N�NuÀ-ÀfJ-ègJ-…gÊ-tfNu`f°-†fHçÀAí$"mN‘LßNu-…fJ-èf–²f J-èfŠNu°-„fPíèHçÀAí0"mN‘LßNu°-‡f J-åfF-éNu màöfpêaýNu2-ô€Smôf;|àôRmö mÖöfHçÀAíH"mN‘LßHçÀAí"mN‘LßNuHçÀAí<"mN‘LßNuJ-ìg m¦N¨NuHçÀAí$"mN‘LßNuHçH"m"(mvN¬(LßpNuHç~@ç@À@FÀ"m"(mvN¬HFßAúý2"|,r$ p"N@`p N@Lß~þpNu`¿ÿwÿÿÿa¿ÿwÿÿÿd¿ÿÿÿÿe¿ÿÿÿÿt¿ÿÿÿÿu¿ÿÿÿÿj �ÿÿ÷ÿk �ÿÿ÷ÿl �ÿÿTäp �ÿÿTär Ÿÿÿý¿s Ÿÿÿý¿n�ÿÿÿÿf �ÿÿÿÿg �ÿÿÿÿh �ÿÿÿÿvŸÿÿWÿwŸÿÿWÿ xœ(022585 4Aúä+H| m"g:|fúgVítNu2<ÿAQÉÿú2<ÿ²(fQÉÿø`VítNuAí”pZB˜QÈÿüNu T@®€ €þ +Op,*z:*aÖ(F&j|+*róJ-tf6Cí¢pVÀÆÓÀ0Aúÿ²r‚4g °XføzNð Eé a üóp0ÚQÈÿüra´.mppNu,,z.av FJ) WЀízÊRgzRÅüNuüNuEë‚2<å `Eé #kŠ#kŽ2<å zHça¨04v@ÂBf\vA2<ûàÂ@fRJéfpÿtÿÁPF@ÀZ�P(WİX`"ÿâZJBk’± QÈÿöRA;ÜH€lèvC(ÿðSèfÆvD0(ÿògTr@å�1AÿÞ‚ÀHA@€AfàHAvEp(ÿì4âcHvFz(ÿÝfvGa"f„vFR…(ÿÝgRE`(ÿíÄÅÄèÿîgf ‚ b\(ÿÝg”€cN BBHB„Á1Bÿà4„Á1Bÿâp# QÈÿüJ—g3A00,fPé çXjB) PëPaþ”Lß`J…gþrv` Fƒrˆ`þfzS…x&,rÔJ) gþRx0) gÄfÄgÄgÄ0) r@€gR`öç ˆ„ÄEéV mP5,jAì/ pN@``�"_,, â…g *,š†R…a\(؆S„"„Šé t4´…fÌ )�ƒcBr´€crÃ40)0ÄÀx؃e*S@bø0) âXd(èXe$p)⸀d�„ãD´€b Ô€d r…`ýjØ€eöpã@* )Rf8tx) f 8)$`8)SD)SBáJëJˆB4)& Bÿo4<ÿHâ.˜5 )Rfj iTfbr‚0) güü )r…�†cüð0)0vr…Ö†eüâS@bö#C<#C@ a3@A aöBB‚°if²)f<‚`ü¨R('@çFíBAí”0!‰ðXPJ@fAú:+H| m"a Fß`ü| mPHçý€DÆeJ…g h6pN@`Nqr„`üVLß¿Nup`pHçüAtpv xNPÿî"HB!# -8*-<¼ZWÏÿüf(EúÿÆgXŠ gPŠ6<–G(ÿì´20LßÜNu m"pPÀfNu¼fhÿþ˜Hçp8"m„&m|NÓ ÀGí|)QB€)3f )4"<ÿ°�c ‘©4')8[)Së ƒ#Ñ©8)RH€f$iz iTg( iTg  iTfp`pB�)²ko+ÇIúÿ�4)Tf|—`|—að2) J)3gâIîIA–a¾&i@)Râfj )Rf^ iTfV0)))<aÆQíza†f�J-˜f8iza Gíva€a`<@< aŒQíz`ê`ðj’gL €°‘c Joa@`œJm`vH&ÀH&ÀH&ÀH&ÀH&ÀH&ÀH&ÀH&ÀQËÿÎ`^vHHHHHHHHQËÿÞNuv È È È È È È È ÈQËÿÎ#K@S-–fþ¾R­vS-zbþ fhÿþ˜` a`flJ-˜fB)3J©4fýÚ)PLé<”€)BEúög²fø)Caü¸S)'LíˆHí„Ym”býžaPít`ø+_|LßJ-zg¼<NuB�B‚))€Á"à‰à‰‚Â$àŠàŠNuHçþ<<B´o EC|||R[F`Ü8àLë Ò  l|€CD@ARR[F`ÜÈYFføLßNu/"-v�ÿà+i<v­ÿÿvƒ­v"NuS-—0<Ií˜ ‚-—(ÿþ´gÂQÈÿðJf,&i@–é B�-ŸÖÁ- ³-¡³GívJ-zfý`þ˜R-zS­vJ-—g(<þÂ-˜ fB�2) J)3gâI“©@Gív`üÜB‚-˜ )Rf  fþL €f<Ñ`þN Dc<ù`þ@; HIú<g2²fø$-v‚ÿÿ) f) gv)´ƒmâ‹”ƒ`âŠ&`ýþÒÓãåìíïòÑéçáîììïùùù‚ùùùùùããäÑùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùшõX�Pítrô`ý¦r fê[ÿþQÉÿòNu²²b013085 4@€€0Üø>f@€î^` ¶` ºo+O\-Aúÿôr°WÉÿüg|ùÀ|ÿü¦NuB­¦Qíçp÷aÔaf í¹`|ÿü¦|ÑÀNu+O\+jh,*B…:*"mPaD&F-Àg+K``><J-ëg p rAúÿf` Fg°+K`+mPdpr Aúÿ2¼XWÈÿüfÒpþNðþr‚(m`AAíȼ |p1Aí¹FíB`t,+z:"mdaÂ"FBm||3|ƒÁ0ÀifÊ0<ˆÀif¾0)ÁiF@Àh�i0)// Aè Cé Eúý¤B�gâHe SAØQÉÿü`ÑÁÓÁ`æ"_ _~A0<Ài @gh~@)( b)fJ©gN` rðÂé²f@) g )(c)(g )á˜g jB`öBm||PìPNu‡rˆ`ýøa°HípÄaFíB+g;|4p¦`;|8p¦`ZPíâPíãQíèB­¬Qíä+f -qWíäNua`HípÐFíB+gQíèPíã+g;|p¦`;|p¦"mdR)'í¸"m"Pí¿Hz/`8Qí¿Fü p.m\Nu;kª+gAëpN@`r„`ý(+HdB­´,+ *+š†RE"mdaNuagr„`ý(Ú†S…NuHçýü?<fJ…g i6pN@BWNqNq0Lß?¿NuaŠHípÐ,+*+"mda°HípÄaþäFíB+g|¦`|¦+g|4§`|8§|p¨`ÿí ¸FíB`ÿ/a ¢jJ-ëg m¢N¨`°í¸`(fh"|ÿþNu`–J-ëgÀ-¾ m¢N�`‚À-¾f J-ægJ-�gš-pgd`R°-‚f í¸`Ô-�fJ-æfp²f J-æff`8°-€fPíæí¸`¦°-ƒfJ-ãfF-è` mÜôfpê`82-ò€Smòf;|ÜòRmô mÖôfaí¸`Xí¸`NJmüf"@þ;mòü mÜôfRmü mÜücBmü`  -´fJ-âg -Ì�­Ä` -Ø�­ÐNuJíçfxFí@­¸f­¸fh­¸fð­¸fD­¸fŽ­¸f°­¸fº­¹f\­¹fB­¹fBFíBJm¸fŽQíç"|NuJmîgäJmôgÞ m úcPíê`Ð2-ð²müf8 m`"-Ì’­Ä!AmþAíȼ |pB(mþ aDaÞ`Ž5Smðf;|ÜðSmôJ-åg mÈôba¶0-îNû`ÿ^`Nq`† m̱íÈc aDgpa®`6Á+HÌJ-ägaš -Ì-pg°­Èc�­Ä+@´`´`a`ÿ -†á˜g²gB`ô-¼À°-½f -Ì�­Ä+@´í¸BmîNu mÌaÆf ±íÈb�`JJgþÎ c pa`þ¾g ff±íÄc\ +HÌS­¬J-ägL-qg&Jíéfpa”²-„f -Šar+mÄØB­¬+|8p¦`¨²-…f0+mÄÌJ-äg-qgp\aN -Ša4`ýì+| 8p¦`p±íÈcpa,`DÁ+HÌR­¬J-äg bp^a R­¬r@Òaþ-pg±íÈc ‘íÄ+H´``ýŒJ-äg J-égp>aÐ -Ša¶Bmîí¸`ýN0-ìNû`xNq`F`v`º`Ø` J-èg0B-º;|ö;|øBmú -ÔR€+@ØJ-ÁgB-Â`B-í`ªaîí¸ g fm�ºg ajíÁ`üÌJ-êg Qíêí¸`Jmîfa`ü®H瀀 -¦c†á˜+@¦ /bB­°@íí¸`h ?b&Qíé0@ï-ªf-qgaJí¸`'@at1|æFí@¼ |qaú&_`ù¨/ aP mlAèCíppFíB2ØQÈÿüFí@a„"_`ù|J-æg aÿíÁ`ùhQíæ­Áí¸`ùTHç€@aý6;|ö;|øBmúBmìB-ÁBmîJ-¦c B­¦"mdS)'QíèQíâQíãQíêQíæB-ºLßNuHçÀðAíh((rðÂA¼fpé@½pÿ( gp@¾LßNuAíÈa`øÂaÿlaÿ¼`ø¶J­4gPHç?üm8!mhB(|$-? ÐÖÕÔÑ×0123456789ABCDEF,.Hç@  e ¿br`a>rLßNuÝÿÿÞÿÿHçÀÀ°zÿøg@-…g²gjBA; AúJNðxxxxxxx¬ttt~xxxxxxxxxxxxxxxxxxLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxttxxxxxxxxxxxnnxxxxxttxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxpüñ !9ñ #áHüñ !9ñ #ЀNu : °ºúgŽa΀ñp�ºÞ @pÀP`LpÂa°a f`&a¤`p aTpÕaN` a–€ñp°ºÀgpa8p a2pa,Pù–2`,Pù–2aaÿd€ñp°ºŒfpÁa`Pù–2aøLßNua4 :p°º^f üÙ–7`üß–7p aÎp aÈ`ˆPù‘ª`ÄHç€ÀPù–3Cúý~PÙÀaþô€ú  ÀH@âH ÀJ9–2g.Qù–2úýR–6 zø0:îrÂXÁQÈÿø0:àr ²!VÈÿüR‰¼ÞAúý"#È™D“ÈRI3É™HLßNuaþˆ€úž À–8a`ÿ.HçÀÈ(zÿêSy™Hk Hz/`îxJ-ågæ#Ì™DPù™J`(J9™Kg Hç?4 zÿº":ÿºpN@`p N@Qù™KLß,üLßNuPíåNuQíåJ9™JgaŽNuP OñpñO ñpñp D3üP™È3ü™ÊBy™Ô3ü™ÖBy™Ð3üO™ÒBy™ôH瀀B€3üD™ò09™Èãˆ#À™ÌB€09™Ò�y™Ð3À™àR@ãH#À™âB€09™È�y™àS@ãH3À™îB€09™Ö�y™Ô3À™ð 9™ÌÀù™ÔÐy™ÐÐy™Ð€ñp#À™Ø 9™ÌÀù™ÖÐy™ÒÐy™Ò€ñpT€#À™ÜB€üñ !9ñ #áHüñ !9ñ #ãH @ÑüñpâH€ù™ÈH@�y™ÐãH�À#È™æÐù™àÐù™àTH#È™êLßNuHçÿða ´Cù™òEù™æ,9™â*9™Ì(9™ê˜ˆâLSDBƒ69™ðtJ9™ôfJy›Zf J9›7g4J9›6gQù›6ÀÂ` f Pù›6` :Qù›7&zÿVNÓ0Ð@0;Nû  ">fæF„ ’ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,  ž Ìæ"FZÎú4Tx’ BBbr|†šžÞ4 >r� & H j Œ ® ¾ Î ð  4 T t ¨ ° Pÿ€ `  Àñ 1NuPù‘ª` ±ù™æg±ù™Øf y™êUˆ` ¼&HTˆ`0Jk±ù™êf y™æ·Èfè` ÂUˆ` ” €ñp€ù™Î°y™Öf` `’QD y™æ` ha ¾À`ýa ² ÿf 3üÿÿ–Œ`3–ŒPù›X` `Qù›X` V y™Ø#È™æ#È™êݪ` ‘Å›’›ª±ù™Øl y™Ü#È™æ�’#È™êRDãL�Ä`æÑÅÛ’Ûª±ù™Üm y™Ø#È™æ#È™êݪRDãLš„ÐÅ`´Tˆ±ù™êf y™æ` aöÀ›8aìr ²y™Ðe¨²y™Òbžp:û¶ °y™Ôeаy™Öb€ÀÅ€ñpÒAÒ€ Ar29™ÐÒAÒ€#Á™æÒ†#Á™ê`,aV‚ÅHAïI�Ý ÞAúûj �3ü™H#È™Daùf`(3üÿÿ™ôQù›Z0<À` °By™ôQù›Z`þ®Pù›ZBy™ô0<À` Œa ´y™ÖbÜ3™Ôaùà`þzaü ´y™Êd¼´y™Ôe²3™Ö`ÔaØ ´y™Òb˜3™Ð`ºa¾ ´y™Èd~´y™Ðet3™Ò`–àHJ@fB€ €ñpâH€ù™ÈNu>âOžD`BCBGJPk@Pÿ€X QÌÿðÐù™î89™à±ù™Üo y™ØQËÿÒ8QÏÿÌ` a: Ýfö3Ñ›`a*À›8a r ²y™ÈdÜp:ùô °y™ÊbÈ#È›<ÀÅ€ñpÒAÒ€ Ar29™ÐÒAÒ€#Á™æÒ†#Á™êPù›7Gú #Ë›@`^ ÞfD :ùž"€ñp€ù™ÎB@H@’€09™ÐÐ@Ò€#Á™æÒ¹™â#Á™ê zùj3úùŠ™ò`Pù›7 àe ëdJ9›bf|ÿPù›b`ùæJ9›bgTˆQù›b09™ÊÀÅ€ñp„y™ò0°ˆb`ä`¸aÀ›8aÀ›9aúÀ›:aðÀ›;p |“ÉN@``¦Pù™K#È™L#È™D$H#ü™PüÝ3ü™H0:ø˜@ ad"H0:øŠ@ aX"Ò…²ˆf üùRy™HÒ…J(f üùRy™H (fTˆ`(ÀTˆRy™H³Èf¾¼ÞRy™HaöL`/B†<@ÿ°y™ÈnàŽ¼y™ÊnÌÅãH܆ñp F,Nup rÂPPÿ€�X0QÌÿò`Ê0(@�XPÿ€QÌÿðP `°Qù–3`¦Pù–3`œaý4�y™Ô–@a²`ˆBC`ô y™Ü±ù™êc"H“Å/09™à1!QÈÿü _‘Å`à09™à € <DQÈÿò` y™æ"HÓÅ09™à³ù™Üd/0ÙQÈÿü _ÑÅ`àüD€ QÈÿò y™æ`ÜHçÿð69™ðEù™æ,9™â y™Ø89™àa`úˆ yÿÿ™ôfJXkP€XDQÌÿè89™àÐù™îQËÿØNu&H±ù™æf y™ê0 Jk·Èfè`jB¹›\`"T¹›\ :ö°¹™Ìe B ga `ô`ha–69™ÊSC  f&J¹›\fAùñp:9™ÊÊù™ÈXÿQÍÿú`0 zönÑüñp  g– gèÑÅQËÿö`‚¨ÑÅQËÿö`ÿt (fÑ`¼d¹™ò|`Ú¹™ò| (f‘`¼,`¸ (fÑ`¼L¹™ò|`–¹™ò| (f‘`¼D`tø‚`dø‚`T (fÑ`¼T¹™ò|`¤¹™ò| (f‘`¼,`‚ (f‘`¼¹™ò|`î¹™ò| (fÑ`¼D`> (fÑ`¼Ä¹™ò|`¹™ò| (f‘`¼D`ŒHçÿðEù™æ,9™â`3ü›daóJAùñp4±ù™êfÑÅ#骐Ԯ#È™æPù©°±ù™Üf y™Ø#È™æ#È™êݹ™êPù©°·ÈfŒ` QD y™æa >` àa 6À`üNa * ÿf 3üÿÿ–Œ`3–ŒPù©ªQù™ôQù›Z` ÌQù©ª`  y™Ø#È™æ#È™êݪa Ú` |‘Å›’›ª±ù™Øl$ �¹™æ y™Ü#È™æ�’#È™ê y™æÑÀAè`þ&ÑÅÛ’Ûª±ù™Üm �¹™æ y™Ø#È™æ#È™êݪÑÀa f` &HTˆ`JXkJ(ÿÿf`LUˆ` ð 9ÿÿ™ôf` â±ù™Üf y™Ø#È™æ#È™êݹ™ê±ù™êfÑÅ#骐Ԯ#È™æ·Èf¤` Êa øÀ¨\a îr ²y™Ðe ª²y™Òb  p:ù� °y™Ôe Œ°y™Öb ‚ÀÅ€ñpÒAÒ€ Ar29™ÐÒAÒ€#Á™æÒ†#Á™ê 9ÿÿ›Zfa ~` a J‚ÅHAïI�Ý ÞAúù4 �3ü™H#È™Daê` 3üÿÿ™ôQù›Z`þJBy™ôQù›Z y™Ø#È™æ#È™êݪ` ¼Pù›ZBy™ô`þa  ´y™Öb Â3™Ôaêz`ýôa â ´y™Êd ¢´y™Ôe ˜3™Ö`Ôa ¾ ´y™Òb ~3™Ð`ºa ¤ ´y™Èd d´y™Ðe Z3™Ò`–àHJ@fB€ €ñpâH€ù™ÈNua f Ýfö3Ñ©²a VÀ¨\a Lr ²y™Èd p:÷ø °y™Êbô#Ȩ^ÀÅ€ñpÒAÒ€ Ar29™ÐÒAÒ€#Á™æÒ†#Á™êPù¨[Gú #˨b`Š Þf@ :÷ "€ñp€ù™ÎB@H@’€09™ÐÐ@Ò€#Á™æÒ¹™â#Á™ê z÷l2ºø¼`DPù¨[ àe ëdJ9©´f|ÿPù©´`øÒJ9©´gTˆQù©´09™ÊÀÅ€ñp„y™ò0°ˆb``èNù¢"H³ù™æfNu)ÿÿgNu³ù™æg )ÿÿf)ÿþ``U‰`ä<DÀ™ò"H³ù™æg!f `èNu.*( 52383 4Nup N@/ m"B@(ÿö(ÿô;fk *m"mNñ pJ-þgÀ-ÿ` |À(g*m€f*m"mNñ(ÿú;kJ(ÿø*m*m"mNñ "NuüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüŽtP102384 4`F`H`J`„``€`¸`Ä`Ð`âNqNqNqNqN¹eLg kp N@`NuAúÎp%N@Nu -2½f mhÿô–N¹fNu`.Nq``@Nq`B`Nq`î`,Nq`.`|```\A–"m"¼(¼8N¹u<`–A–"m")ÿü¼8J-f N¹u``vJ-fnÀ-À fQíHçÀAí$"mN‘Lß`JF-˜fa(`a4PíFí@AúP"|…r$ p"N@`Qí`/@çFíBQí˜p@`/@çFíBPí˜pÀ-?”�-”¼­”Fß Nu/ *AQí*_NsA–"m"-—A—³¼¼8rÂgHçÀAíˆ"mN‘L߀À-—gN¹vb`�A–"m"¼¼0¼8rPÂg pèN¹s `h`r Âg pêN¹s `V`TA–HçÀAí|"mN‘Lß`<A–-f Ò¨ÿö`¨ÿú|p™JkHçÀAí|"mN‘Lß`Nq"pU@Nu@ÿüNuNuHç€@ -2½f,|t™<-tgÀ"m-f@ÿö`@ÿúLßNuHçàð@çAíl"m"$mGêp@J-˜gpÀ( f` ( g( gFíB¼€@”F×p!( g@`ÀFíB¼€F×pŠ(g( g ``FíB¼€@•¼¼Fß -2½f(&rð-férÃ*ÿø�*ÿø -:½f"(&rð-gér9øqÄ„ÂøqLßNuB/rÂ-—gÀJ-gÀ -2½f-–-fÒJjÀ"Nu-•¼­•Nu-€•¼­•NuHç€p€-•¼€LßNu¼­•Nu@çFíBIúû¾+LvAùÂ|+HŒAùÂ&+H€+m"-gU­ -2½fh mCèèÿö(ÿôgRèÿô¨ÿö|ÿô (ÿôfv¨ÿú|ÿÿø¼¼¼¼¼ fPèÿöèÿú¨ÿô"m"$mGê¼¼¼¼¼¼¼Q—Qí˜N¹sVaýfFßNuN¹tîFßNuKéý„"m"(mv -p™f4 m-fèÿö`èÿú|t™HçÀAí$"mN‘Lß` N¹tügp N@NuKéýx"m"(mv-tgHçÀAí$"mN‘LßpÀ-—g-tgN¹sVaüÂaû’PíNuà¨8121784 4@€€è0f‚FíBaFí@Nu"m"||¼ÿ -Rf|€`||J|J)|<|< -Rf|©©NuB…,*:*"mPa¸`<†`Ž&F Sgª-qg<„`’;kœ+j˜+Kv(j+mPzpAúÿ,<¼XWÈÿüf\ˆ0Nð<‚`:aÊíqB­Î"m"aÿJ mzR(' m�-§fJ,QfPìQ< a``aFFü ` aÊa1|1|7p2ØQÈÿü<`ÎBm||Nua’(j<)f¤!lŠ`ax j(HÑüz4<0<ÿøÀif|0<ÿÈÀifr0)ÁiF@Àh�i0)âHe3h âHe#h âHe#häHe3hâHeh<@) gJ)g<A0) g6)g°Cd <B<õ‚`PìPaÿ$pPˆP‰0ÙQÈÿü<`Ü-qfIí~p<q$*6<aÜ`ÖFíB&mv"m"aýЭqFü mÎB­Î mzS('|æ6<æ<qp$-˜Ií~a�`Š+gAëpN@` Nq<”JŸ`P+Hz,+ *+š†RE/"mzaX`P�<„`.+F�ÜŸ+F”NuAíž/,+z*"mza0`P�<„`"F _NuIí~p$*Aÿ6A<paB€NufJ…g i6pN@`T—NupN@`NqT—NuR­Î±í”gb+H�-�f gLa¤-�fÖ ( ÿÿm2R­Î$-΄í¶HBJBf ¶m¨ga^`-§f< ah-§f±í”m a> ­q mzS('6< g6<áp<p$-˜C'mÎIí~a4Nu-¸-§f< aJf < a JgJŸHzÿžNuBB�)$ f8J-×gB2< )VÉÿøf2@Ì+_ÈU­È+_ÒFíBééNu aûÀB-×JPÃ`J€©éPí×)Fí@Nu"m")� �g)� �g|ÿþNu-If-Hg-qf"m"aûRFí@|NuHç:aû@B-×J m�-Ì$mÈ&mv(m˜R-ÖHz/-ÒNÒS-ÖLß\þ|Nu,~|)m<g X€X‡”€�p­8pX€°-:c-:€)‚p9ƒp g9„p g…p B4p LÔüaNuHç m4pJ-ÖfpN@` Lß8+Wr`Lß8B­rNu``bFHSD120384 4,HAúàpNAga0$H <nBS€fú%J$ŽOê&a¦a&Aê$p3NAg gH瀀0|0<NA,RAî,Ðp&NAgaà�ÎBj,IêZ, fà,$ fÐf öa èAìa�J€gAì2, aÒJ€g a ja ª` VJ,g ,g ŒKêrJk B�JgJ˜‚gJf :J�g 4 PNÐR�J˜ g $`Þ ,(m HB�a LJmf AúØCúñ4ÿ´g±Ég ò`ôB�-aJ€gk U€g 6hg`a°J€f2Aƒf úB�ÁA,rAú¼B‚4gF‚gJ�g>` J˜S�k ~`ì P5B*N�J�ga ¼` h*,g ìB‚4**g RrAúr`ºa Xa ’` >B�2A@f$ -&gB†a g g |` *a š` B�-aFJ€k f :`.B�-a0J€k f $J-f ,g òa ÌJ€gZ6hÁÁ�hR6x 2-A�ha¢fa (` š/6h���hS6x B6ha   g Ö` ªa Üa fJ€g a ìa ä` ’2-A f ² 6ÿX$f|26X$g ¬f Ra rJ€f Ba ¤J€f &"6X g ¬ga ªfª,`"a „J€f -…h6hÁÁ�hR6x a Xa P` ÂB�-a üJ€k Ôg ð6hf ôfa–fa ` Ž/`ÿ *6ha ò6ha2-Aa RJCgvX!JDgvX a ¤J€f ta ÖJ€f Xa ØJ€gvha ÊJ€gaü^` R�ha ¬a ¤` B�-a PJ€k (g D6hf Hf 6hf aàfa f`Ø/`þTJl f òa ‚J€f îAíra ÌJ€f öa ¬J€g ìa *6h-­Xa "a `ŒB�-a ÆJ€k žg º6hf ¾f 6hf žaVfa Ü`N/`ýÊ*6hJl f Ra ôJ€f `a  =­ Xa ²a ª`B�-a VJ€k .g J6hg,g*6h$6Xg JvXo` 2a6aa ``Òa(Á�ha Âfa H`º6h��h/`ý*6hgÁ�ha 0<NAaö`Þ�f�hNuaä*6h6haaZaðNua B6Xf6XgB¶Xb` vXbJCfJDgS¨fJCgjBƒ`DCÖvX"JDgjB„`DDØvX =ƒX"=„X NuJ¶X f."6XfJ6XPg0-@faÂ` ¬ga 6Nu6h$����g� vhB¨ZB¨^�hB¶hBvhB6hS6x Nua Žf B†a`„/`üB�-a ¸J€k�g¬6hfa Zfaà`R/`ûÎaÒ`D ,(m„B�aˆrAú x4Bÿ‚g JBf.J�g*`J˜S�k"`ê PN�J�gaZ`6hgŠ`öaa>`êJmfôB�-a J€gðkì6hfa ºfa@`²/`û.*6h6ha†"6XJCf�JDf�;A ,E;n„"+n†$�ÎvX$+vXAê!M!l1|(AÐ0<NAgaø~aÐ`BJmfPB�-atJ€oL6hf46haüJCg>a fa�`/`ú~JŸa€2- Ag Ag2 Ag,ra.`ÚB†a Îg` fa&`aøa `¸Bª&Aê1| Gê2!K!mBƒ"R"i$4-* gZ"6X Bf gDRj(`  g8Rj(¶­ d.Rj&&¶XvX% AÐ0<NAg ra˜`DC ¨ "vX`¢Mê&!N�Î!l¨ 1|AÐ0<NAf¼`J­f+l+l `H,J­ f+l ` ,°­ gf&güfAêD"m - a 0fâ+HAíAÐ0<NAfÎ%H.B�-aÌ2-AfÈJ€g˜k”6hfˆB�2-A€g6ha8JDkzJCkt"*.�€g ,gD&(Aía@J€g"*.HAAía€fB�-aFJ€kf:J-f"*.�€g-¶8h-¶8hR6x B�2-A€fØÇFÉGaûêÇFÉG`ÈJ€kÒfîJ-f,g¼,g¤&(Aía J€g"*.HAAíaàf|B�-a¦J€g~kz6hfnfff^HçB�2-A€g6ha JDkPJCkJLß-¶h8-¶h8R6H B�2-A€faû ÇFÉG6hg62-A€g$aJ*6h6ha²JCgRvX"JDgRvX aFa>`°Á�h2-Aga˜` ÇFÉGaŽÇFÉGfa`‚/2-A€f-¶h8-¶h8R6H aúŽ`öàJŸ`ª ,m˜B�aœ gŠrAú¤4Bÿ‚gJBfDJ�g> PNÐJ˜S�k2`âB†aša¼gœraV` ,m>,gB�a6 g$rAú^4Bÿ‚gJBfÞJ�gØ PNÐJ˜S�kÌ`âB†a4a¤g6 faü`aÎaâ`ŽAìa J€g`~aäCöx, J6x g*6hfP†6x ÄüCöxÓ¼‰mÜ` aø aùn`Êa® R*($g¾¶XRfB¶XR*6Xfða®aB†B‡aga˜`a�`–B�NuAê<| ¬!ll 1|hB¨ ,fmgrçA AêMêAêD"|.IOSpaúgaî¦%HZ%I^AêD"|.FMSpaÜkgaî†%Hb%IfNu%|ÿÿÿÿb`ôAêD|;pL@ !@ MêZ!NpNAgaîLNu @€ $(,048Mê*, JvXgûÆBvX¶X%fû¸B�6X5$.6X²6x caû”GöxÄü׺«gaû€Gêaúgaûr`û|JvXf þ=¼ÿXaÌ-¬XLaŽJf Ì`r ,m Ò2-A€g",g š ¬f Ž ,$m ¦Jmf |agk v` €a ðˆƒg `J€f Za 8J€gk \` JAúä`¾6hg 6ÿX$g Ug &"-²­ m "- f  Uf"-o úf òJ­o ê6hfa @6Xg`¦a &26X$g äf ØJf Ugf ÎJvXft=¼ÿXöh-‡X¬X+-¬XLaˆa Rg’aHJg BvXB¶XB6X+6h��ha Ð` ha È @gJf2-Agöa ¨`^Jf b2-Af Ja taL/a Œ f 6öh6hga p`²a p`ªAêD!vX&!l!l !E!lBhlap6Xg66XgB6XQ,E%nŽ(�Î U@g Uf ,E%nŠ(�ÎJª(ga >Bª(Nu`ò/ AêN"vX pa(gaøÒ%Hì%Ið"_Nu|%EaÒAê ìp#NAg g f |d0<NA`ÜpNuHçB*¸, kr,EÝü0ÝSfúLß`Nu6hfÎa &``ýÔ ,mÞJmf´aRgk°`ºa ‚J€gk¦`”AúN fAúdB�4Bÿ‚gJBftJ�gn PNÐJ˜R g^`Þa¨Aìa ¨fB�-a ÂJ€kgB€NupÿNupNu6hfa‚`dar26X$ 6ÿX$g˜g&JvXf*J¶Xf"0 @fB¶X,`ý> @f 0-@` @ gX @`f"-k,E .†�β€nò-�X,`6 @@f"6X,S�kà-�X,` @f�"6X,R�,E .†�β€n¾-�X,aì`–6hgŒaÖ`J6hgz6hfa¦`ˆa–JvXfa®`XCöX0 iaœ`Þaú"6hg6hg &laÒf agaöŠ`ü¼aÎ`ðAêD/ "J$KGéµËfB¨B¨ 1|`!l!l Bhl!vX&!E!J$I"_pr„`Favr‚`@r‚`>rƒ`8ahrÅ`2rÇ`0rƒ`*rë`$rá` rä`r†`6hfaJ`a>râ`r…`rÂa2a,aü4`žr�`öp)` p(`p*`p+"jÓÀJÑg0<NA`ôNup)` p(`p*`p+ jB0NuB€B�6ha Ug. Ug. U@g( Ug" Ug U g UfJCgJDgNuJCgNuJDg Nu fNupNuB€BƒAú46hB�2²XgJk`úJkö±ü÷VgH`èkgB`öAú 2-&JXgÆ�f`Æ�gJk`ú±ü÷šd`àBƒkg`öJjæJ`âpNupÿNu"j.)g"²¶xf "(²¶xg.6xfèpNuB€²6x bÂüCöxÓÁ, )fNupÿNup*6hNuAú Bƒ(²Pf 6(8(NuÑü±ü÷ dð`â ¶.IOSX f ¶XNu6Xf, gí¬aþ\R6XQaþva4`í˜aþH26X$, g�`Á�gÁ46X$gf `gÁ=�X$aþ gíBa`í:aýê"j"i$* g",²¶X&f öX$¶X$"Q`âaýâ lÿgJª$fa`ìø%_$"j"i$* f /*$Bª$Nu²¶X&g"Q`èa:!AöX%=¼ÿX`6Xg6¼@B‘`6¼€B«pþ¹üga"d(Nu") ,yKn²–gMîv½ùKrcð`¶a)Øa$ža)þ$yKv½Òfê EêVµùKzcê`ŒùL_gPa'Z$h µüf $h!J `JJªgF&R·üg$K`ì&JÕü8µèe B(*Hzÿþ#ßMvAùK˜KùKÂp `•ü&ŠB’Bª)g%i %i` %i %i %i$i)iAB*%|LZ h ¨LZf µÈgJ¨kJ�g P`äê#ÊLZ`b*¶(n&&H"(�J�g A`ä" (gÁ!A`2J¨j¨"Á%A#ÊLZ`" J«jÁ'A%H yM$B(*`þ4üÿÿLTB¹LVEùK˜GùKö0</6ÚS@fúCùKöKùL )f ¢-g )4)eøJfX -&f0@ÀgUÀ-g­a(™Ì�ÎCùKöAù<-2<fJXSAjö`$B€0€ü @NÐAùL0JPaý(°XgàJX`òB�AùKöKùL $(&(x"h$-a'¢AùL”!B !CB�Gú ²gJfø`4ÒÓïãåìíGîV!K gGé$`Gé!K!|AÐ0<NAºg&ÁKÆ!|KÆ!IX¨!|AÐ0<NA f<,g4AùLô ‚!CBh,g !l,1|€#ÉMAÐ0<#NA`a$–a$| f Jªfª B(+`üpa%zB(+`üD¹L_J¹LZgÜEùLZ`ÜpAùKöaB� Uf-fa¸`$Jf -gah`-g "h ©`þœp`²p`®p`ªp `¦p`¢p`žp`šp`–p`’p`Žp `Öp`Òp `Îpë`Êp`Æp`ÂpÎ`¾p`ºp&p @0  �v€ ô@ à ¢Ž€Ülœ a#Þfÿ4a%œ4-B -@f)gŠ BfÿX` Bg° BbÿF2-"fÿ>B…-% Bg Bg B` e dbfJAg²Ed`ÿ"-'f 0<@'` eÿ-&f 0<@&` bþöBƒ6-"fTƒB„-'Èü¸ƒeþ¾ã……B„-&Èü¸…eþ¾`J­$gþ a²fX#ÊLV5m 0-÷@25m"4m&8m'9m%7%m$ -@g -&fa èaì<aÄg`ýìÁLTB€a)ªg* f -@g -&f a ®a²`Ø"a;¦ `Äa;žf¾-gB¹LVaÂ#ÊLV`a¶­`ü - gafTa‚fNa#ÚAí 0< X fS@fö`anf0a4e * g&`ýÀa¦f#ÊLVa$ - g a'ºg`ý aT2-Aa#ÌfêaÜfäÁLT2)a2JjJBg JAg²nfüäa„f¼`Øa šf²HBa °fªHB gàadfü¾a/Š-g¬BÀa&gal`üœAùLd ©!i-g+lt(!lt`!m(!ll 1|1| ,|�¬tR€!@AÐ0<NAg" faà`Š g aø$aô`ü–+yLp0 9LxS€Ð­(+@,)m(pa"9mŒlÿøŒB�9LTƒlŒJEjlÿÇŒ-g )j(8)j,4)i)i)i )iJk*.Mf"AùL°0<JNA5h<ê JBg5h:a†,�g!|2a"pga4`û¾üÿÿLTB¹LVa`"i #J3|_Jj©2,ŒA�©B()­`ù¦a¾fha!~aòdû`anfV#ÊLV5m 0aæ<a¾f<ÁLTa‚f0a-ªB€a+>fa8zfa”aê­`ùD"a8` az`úªaa!B…* gzë`$aba88* *&fpÿa*æg*a8 g*)fB,�g:AùLÜ ¬!lAÐ0<NAf AùLÜ!ll AÐ0<NAf4AÐ0< NAf*2,ŒA , �¬€€ü@aÎÁaÌaõîa!JfRJªRfL:¼Bma ü/ AùMl"|.SPLpaEÌ#ÈMD#ÉMH"_JfAùMD0<#NA  g ga”`ÀJªRf * faÂafªa­ fùp`÷öaÈaÐ i fù®aæfùP* fùÄ - € g°®fù� * gù& -&gù€ -@gôa*f¼a°f¶0- °j g 2)aºf¢"JaXfš#ÊLVaÖ&J$Ia)Ìf†aü­`÷Va(a0 * fù* fô* fù& mÿþ ga@f^aˆ%l€F5l„J%l†L5lŠP2)a')jF€9jJ„)jL†9jPŠJg"Aê 2< 0ü SAføBj Bj0Jg÷`ø8aF!m$!J¨ !|<agºp`¶g")aÜeB�B¨(yK~$)&)´¬f¶¬f $T,R`ý4anIì�¹ùK‚cÔxB�$)&)`÷paaaÊaf@/ AùMl"|.SPLpaC”#ÈMD#ÉMH"_JfAùMD0<#NAgJ ga\`À"i ;i Áa$aóFJBf­!HBJBf­!a8a2gö`÷‚a¾x`öÚ/ -f"_+i+i `"@ - AùMlaBøf+H+I "_,-.- f J†f,)`$ yM$ h±ügV¼¨f¾¨g P`è,B‡-ÎüÞ†‡-f$G ) `$i $j(yK~°¬ gIì�¹ùK‚cîaò\,�föÒ-gD *&göL&Laêf. L0<H0ÛS@fúB¬lBlŽa(ò2,ŒA,Raò�Îgaä`ö-f -"- fJ€f`,).) )"))@)A)F)G "G©`ô¦Cí0<ajeöS@fô ­ göB…0- @f"`>JkS�²€g4 fJkÚ Ff<`Î €ÿÿÿÿg �ÿÿÿÿg²€e `þ)A4¬Ž r�a Èg ÂfÌ lfÂ`T)l\8"lt",4B€0*4g ’¬`ÂÀÓÁ`($,`²‚gB€0gR€ÓÀ³ìxb¢R‚`â0g˜B lg€ lg lgÒ lfÐJj4fdT‰ *@gZ,fR,fJBƒ*7–€Dƒ n@îMk±îDb"ÁS€fð`°ƒbîAgð±îDb ü SAfò`àtÁ"n@‘É  g,fB�*7ÓÁ��dB€¸€d tÁa2!@(g !I!l AÐ0<NAg gœaæê ì�`ü„ �¬t`î f2,ŒA fv¸€fh`H" n@a g gRaæ a &fhgR�,gR†¼�gb(a \fÎ �†R‰`àa Lf¾ì�¬�B`ÿp �� IJj4fT�ÑÁ`8 g( n@a ’fˆJfr g a ®dð`a ¤bæ f ,|�¬xgBJj4fU€°„e6"lxR‰R¬4 fÐa Äfÿ6³ì|dBi)Ixpa êa ´`ÿ\a:fd)l\8"ltS‰)Ix`´(pÿa Àì  Ž Jj4fT€a.f^`ÿ l|Rˆa ÚfþÐ&Ha(ª lg$)l\8)A4¬Ž Êf(B€0*4gýz`ý| Âgÿ~ Êf g Ég`Ò)A4)l\8¬Ž I Jj4fT€a(ÂfÚa äfþV lfpa BJ�gþ‚Sf a' f²`þtB€Sgpì�¬�a%f”`ýÖa Df† f–R¬4B€0*4f 0gR€ÓÀ`ÿ|apa&Ff0a ´`NqB�aj$,&,x"l0,,gz�`ç`p‡B�`Ôp„`öp†`òp‚`îpÃ`êpÂ`æp…`âpÊ`Þa1Þ`ØpÌ`Ôpë`ÐpÎ`ÌFUTY031584 4/ “É yK†J�f"H`²¨f <þ"_NuPˆ±ùKŠcÞ I<`êHç@€ -g† € f\ - g> -&f "e8S@fò`  f,S@fö0<a8`  gaeS@fòB"_Nu  fS@fö`îp`ì  g 0e 9c Ae ZbJ<þNu<NuHç@"|à?? ÿÿf J_p LßøNu²gJJ™`æJ$/gJ_`Ê<>B * gz6jJgDC8jJgDD2�f¢JFg jÿÿTg¢JFjJjTf˜`ÜjTJGg jÿÿRg†JGj JjRfÿ|`ÞjRJCg nÿÿJgÿhJCj JnJfÿ\`ÖnJJDg nÿÿHgÿHJDj JnHfÿ<`ØnHJFg5FTJGg5GRJCg=CJJDg=DHB`ÿJFgjBjT` JjTgSjTJGgjBjR` JjRgSjRJCgjBnJ` JnJgSnJJDgjBnH` JnHgSnH` ÿÿÿÿÿÿÿÿÿÿÿÿÿ$yKvJ’gEêVµùKzcðHzÿþ#ßMvp Nu$ŽBNu?0<+BZS@fú0Nu(yK~J”gIì�¹ùK‚cðHzÿþ#ßMvp Nu(ŠBNuHç€aÒ0<HB\S@fúLßNuHç€$yKv½Òf"Gí Iê ¹Kf0< ¹KfS@fø<þLßNuEêVµùKzcÎ<`èHçà 9LTkÁaýšüÿÿLT$yLVµüg aÿ@B¹LVLßNuH瀀AùK˜$h $j(yK~°¬ f,RLßNuIì�¹ùK‚cæaß\Hç€À yL"yL/ab _S( ©©© yM$B()LßNuHç€À F"G`È l ¨(gAùM 0<NAaÞøNuHçÀ@B� * g2*2@ f;|""*$R�+A$`"+j6$;j4"`"V+i†$;i„"i$aÎCí!I"yLCé!I!|&LßNuHçp€gfXAùLÄJ¨ gBhAÐ0<NAB¨ AùL|R¹LˆBA*8f BB*9RBÒBÂü!AAÐ0<NAg g aÞp LßNuf&)HtBB*9ÄüS‚ÑÂ)H|)HxÑüì�)H@BB*8ÄüS‚ÑÂ)HD)yLˆlAùLÄ!yLˆ 1|1| g1| AÐ0<NAg€ g a, g`ÿja `ÿ Hzÿþ#ßMv`ÿZHzÿþ#ßMv`ÿLH瀀AùLÄ ,lga1|B¬lAÐ0<NAB¨ LßNuH瀀AùLÄ ,lgD°¨ g>BhJ¨ gAÐ0<NA!ll 1| ,�g1| 1| AÐ0<NAaÜÔLßNuH瀀AùM,`Â:<ÿÿ * g*2 gEÿJENuHç€0,@` @ f(,Žf,�f,�f <LßNu<þ`ô @f ,ŽfìÒ‚`è @@fJ�gÔ �ÿÿÿÿgÌS�`Ò", lfÆ �ÿÿÿÿf¾,f¶"*,`°Hç`aL&lLB‚+’‚gÓª(Ó¬dÓ+ê a(´LßJ@NuѪ,Ѭh/ &lLÑk&_ê a(ŽNu",x’¬tR�‚üHA0BAHAJ@gR�NuB€#ÈL¨aèB‚*7g!B!l AÐ0<NA hJ€Nu/ JgJj4fT‰³fSBføB€"_Nu/a¤!D!l !I *@f 2¬U¨T¨AÐ0<NAfÓÄS‰ _NuHç €Jj4f2Ä*I¾„fa²fa'È fR‰BB€Lß�NuÉG.Mg"n@aˆfè n@"MpaF`Èpÿ)@8)@4D€)@4* .$ff*n Úî“Éa Bƒ»î$cJ"Kaªe8ºƒc axf&aœe `ð"aÿ|f,ÆîMS…gaX`ð$†B€` ÏgJf aDg´ ÏfpÍLß,|Nu*@�® Àü"@aÿ8Bƒ"KaFeºƒcªafa:e`òJfÿxagà`ÿpR‹Jf$†Jšµî c / "Kaþü"_Nut,B€NuS`ø f J†g †ÿÿÿÿf6×ÂB‚`4Ö‚×ÂB‚Rƒ<þNu f JFgè FÿÿgÜ` f JgÖ ÿgÊgÒ<NuHç"0$V³ê†epÏ`&I×Á·ê†bòJ�gîaþxgLß DNu†îMS�gaÿNfè`ì$†B€`à/³î$ga4f B®$-|`Na f-I$B€ _Nu-@V-nZ-n^aüÐNu/B€.Mg .$fa `-|`NaÈf®MJ€ _NuHç@àpra`B®JfN ©EXORøfJ ©MACSüf@ g< € g4 yKn°¨g($V°ªg Aèv±ùKrcæAîp 0ÙS@fúB€LßNup`ö/îM n@"nDHA2<`-ANHîV"Haü _NuHç@ÀpraÌfBCî n@p 0ÙS@fú n@"nDBh>pÿ³H@³H@±Écð n@@>H@@?praˆLßNuHç<ÔHçCB�B†B‡ .f0B�S�2Oï pLß+%KF5BJa Ž`þ /³î0ga4f -|`NB®0a f-I0B€ _Nu-@V-n(Z-n,^aøRNu/B€.Mg .0faŽ`-|`NaÈf®MJ€ _Nu/³î f¸ jÿþ g&Cê p *gS@föBªFBjJBªLBjPp`Š4*P *L`ÿ"Kó JgªAêpa|f pAêKó anf’&HC Cm3 g Cgÿ|¸Efâ5BJ%IFGó pAê0ÛS@fú²Dg JAg|ÿÿ0"n40*PCñpGê 6ÙS@fúB€Lß+NuâHB[S@fú`ØHç@@",HfpÄ`"Aa LßNuHç|Ð$,Hfaê`F l@Cè )IP((p&a8f.aŽf(Jƒf %D$ê J„f %C ê ašB¬H¬�Lß >JNuHç`T$ g>raöf6Ké gJ‚j&lPÀâHg:ÛS@fúU‚g`S‚g#D raõÌLß*NugêBSBfú`âHç@@ graõ¬f"ƒ raõ ` %C ê JLßNuHçTA? ma`h&(B€Aù6€ãI00€ü"@¬Ž&l@*lD",H lLB€B…NÑ:È:º=*>€>€>€)HL¬ŽgabfB€Lß*þNuJfaš`pÂB¬LJ€`æ$*,,<`X~h`$*(,<\T.<ÿÿd fpÿ¶€gÊR‚gÆS‚¶‚bÀJ�gZºˆg< ,\(J‡k ,`:(Ú€°ƒb¶…d,�fÿr`ÂB€afÿtB¬LB…Jƒg¶‚g`ab`aœgš`.¶‚gòaNf$+ AóP ",H¶´`e ¶´pcaž`aÞgä`ÿ( 4`aý B�B„HFHG(KðP¶€gDda°`ÿ(2(JGgЄ`Ð�°ƒb$Ù¬\Ó¬` M*lDW�±Íea~`ÌJ�f¶at`ô)HL gþ¤B… &lt(ÊüS…  Ú‹)Ex" Hî#V-|`Naðjg� �¬@"yK~³Ìg$)�g"²”f")H²¬Hf ")L’©@²€gCé�³ùK‚cÌ`L/".Za–,�g A"it Ù±Åcú`$aî:!it!A ��R€!@AÐ0<NAaÅaz _`$,�f-lj-lnîP/aï" _fV0*4gÀè×ÀS‹)Kxaˆgý¨`:,�g|g"ER‰BQB�B€·ìxbÒ0ggR€RA×À`èW‹²hgºpÈ`þ¶J„fa`òJ*7fa `òJ�fJª gaVg‚`ý\ºˆgj"B€*7 ltJj4fTˆa2eJf4aLf.Aë CóP ³ìLgAéCñP³ìDeêa²`œaúg` A^ˆaîca0f `üÔJ¬\göB€ahfüÔB¬LAë aÆc† lPaºb†BE+ GóP aúš`,+Û¬\:+Û¬`BE^‹fa2`ˆ×ÅAíÿý·ÈdJ“gAë)KLanbÆ`& *$°¬Hga`ЗÅQ‹+›¬\:+›¬`BE K`ý„J¬Tg‚aì` J“gÿxašgÿJ`ü"p‚`ü/ aÔf~Hî(VB¬Haíèg:"yK~¹Ég °”f²©HgCé�³ùK‚cä`a: K"i@ Ù±ÍcúaL`af.)AHB€+ Aó ±ìDea\`pÄJ�g쎬ŽB€"_NuHçTB€",Hg6"g2aÿdfF ,dR€)@T)@\",hR�)AX)A`a jS€S�Hìd`L`ûRHçTB€",Hgð"+gêaÿfû2 ,T&S€",X(S�HìdB€B�a "–€˜�HìTHì\`úìHçT * g¦",H²€g"pÿ)@d)@h`ÿ^B@+ Aó J¬\gÊB€aXf&aø²`¼HçTB€",Hg"l@J‘gX"*$gÿVaþ†fúœB€a&fôB�BC+ Aó0 a ’Lê(HìdRƒ*–€R„,˜�B€%š€0%œ€J¥ MHìxT`ú@",Lg²a �gú6`¨HçpÐB€¬�g|Lì @ fpÄ`nHîVB‚&HB�+ Có J‘f B¬HB¬L`.CéCñ³ìDU‰dJ‘fê“Ë*8Äü €ÂH@J@gRBa &f¬�g Jg&pÿaøÈLß Nu *FfaPNuHçÀ"@aòdf$0*J"n(ÓÀAêp2ØS@fúîMª B€LßNu¬�fB€NuS€a¶faNuHçXÐLìt R€�ˆ@ÿg2<’@R‰âIBYSAfúS‰&lL HîV*2 g\B„*72*4 Bƒ6f6fa ¤`:g RCfa ”`*Gð8& JAfTƒ¶¬xbaØbfaòg<ÿÌ` K`´Lß Nua fô¬�B€`êHçÔLìtR‰&lL fa 8`f*2B†B…B„Bƒ*7:*4f$6g*HgRƒÑÃR„±Ébfè`±ÉgJXf`ö( ˜ˆˆÅv*I›ÅHDJDfŽHDaãrB@*9²@ca Ð`p,�grJg. fHç„ MKëB„& aLß!eg Jfaf6B€0+‘¬h‘ª,7DÙ¬hÙª,aâ¸gJCgê a „lÿŸŽB€Lß+þNupË`ö,�gæ²+fP¸kfJ& 8gÔAëaŠgÊd8"l@B€Aé Cñ ·Ég) ICñ³ìDeìa `¦aXbšazg”`NqpÈ`”/B�* gaýŠ"B€aýÄg"aüêg"að–g"að g"aëšf LßNu/B�`ÜB@/ *CJg°eg»fS@føB*_Nup¸`öHç|Ô"lL fa r`B…*7gÀGéB€fa X`ºga X`4 l@B‚v Öˆ( Að ±ìDea :`³Èg&^ƒ(Að fâa "`p C& (aÿdbeha‚gJ¬\f\AóP$,DW‚±ÂdRJ�gN^ˆB‚aÿ:e b>aXgJg6BaNfHç°fSEföLß( gÝSEfúa ÐJ‚gì�B€Lß+>NupÌ`ö l@t g¾raëfäAé `ž*2 NuHç>€J*7fa h`^ r‚aõNfT,,`B„*7"ltB…:*4"J‚fa >`4³ìxd>JEf2fa *` gR� K0& aþrgepÉ"JEfJaLß|NuÓÁR†`ÀpÊ`èz`âHç?B§B§B§,gR€(fa Ø`B" ‚ga È`2&lx.,|B�³Ëcr&a^fv)Mxaßê»ì|ga»þB­a¬B€$& IB„"_* ga�("_* gaxg("_* gajg(""H f Lß(üNu @ÑË*H±ÇbR‹Rˆ³Ëg1#`øB€Nu lt �ˆR€�„$”ˆ& –‰Rƒ*,Lfa `„°‚d¶€b¬ aîfì¶‚d~" Jƒg*KJgB€�Ò€‡a”gaâ`Æ lta fÿB"HÑÄKð8ÿ&AâKg±Ëgb0ÛSCfú`" ãK×ÃÑÃ1#²‹fú&EB@+Gó·ìDea”` r azgþÚ`þòaTfø FKðHÿ&Er a`fèaýêfrB€`Ø a fÔa,fÐ)Ix&EB� a:fÂaf¾œ‰Ø†KðHÿ"H`’)IxS¬xp`)FtB€ì�a4aú)HtJNuHçÿÄ. B€B‚"lL³Àfaü`J‘faò`Ø"l@&()) Cñ *,DKéCñ,S†³Ëb$ ³ÆdJ‘fä*7Kñ»ÆbÖgB•P€B†·Éf Cë)IP` !·ÉfúѬP·ìLgB€"lL)Ѭ\0)Ѭ`B„*7)KL"WJ™"f J™"faV`Nu&lD&,@"lL¬�$B�)“¬d“ª(W‹B€)Kñ»ËdJ•g X‹2Ý»Ëfú`ì�B‘B¬L"Bal/ CB€( Að aÀ fJ�faîV`ˆaüføa^B€`ðJ*7g.B…:*4fB€0fa$`Ö*HgR€ÑÀ±Áfæ`*A›Åaøˆgÿ&SCT€œ\ò &SCT€€ÿ€^ &BCTS S &EETRxS VP&EETP.STT&EET[(€ØVERSAdos Version 4.4 8503011623 BBAA>€SYS:0.& CN00LOG OFæm²LOGOFæm²OFFm²BYEm¶LOADnSTARôn"STOPp CONTéîõån4TERMéîáôåo�^fðDATErTIMErºUSEpfDEFáõìôóq$ARGõíåîôósšNOARGõíåîôós¼BSTOðqŽBTERíqœOPTéïîóqªNEWStÐHELPtèASSIçîv   CLOSåuÜCHAIî}END}´RETRùüPROCååä€R?„~BATCè„–CANCå쇖QUERù‡ ELIMéîáôåˆPASS÷ïòäw°SWORDx,SECUREzú`1n` Â`#�EET 121084 4GùPOëœ'O”Oë–Iúýà/< OÜ :fø&LùVPLùðV`@H@@ÙB€9VPãˆÀü#ÀS>'A'B'C°'D'E7F.AùSaÞAùSaÔAùS0aÊAùSJNBgpNA`ðAùSB˜±ùSköaÐ9W g"0|èaþAëx'HpAùW 'PzAëfp#NAaªLë0Òº„c8µÉg4<ja4'JÞ`ð fa&`æ4¼@LëÂ$*aDg4¼€`ÎR„'DÒa À`´PеùSkEùS NuLØÿ$+¬AëdHàNAfNuJŸ` `òAë`Hà~NANu <ÿÿB�$+¬&<€aR`ª |p!`Ø |`ô&SCTê\à&SCTP&EETV&SCT .SCT&SCT .ARG&SCTÚaô (g (g`òLè“ÉAùS'C̱üS g."g¶�gPH`ì³üf"H`ð'Až'hŽp#AëŠNA`ª³ügôfš «âf J«fa`ôaÜ'@š'@ Aë¢!@aþšAúþîaþxAúþþaþp'HàAúÿaþd'HÜ +g'@°AúÿLØÿAë–& kàÑü–,*+¬aþa Ò`Âa*B+Çf/+ <a '_/Gp% |NAp"AëpNANug.7hg/,kà.ÿgÇ,_2(‚k7AjÇ"+È�²¨f$+Ô´¨fB«ÈB«Ø (gŒ (g < AèJ(f <a ð`ÿh ¨&SCT fÿ\J+gÿTS+`ÿLaÿVÇ'h ü`ÿ:aÿDÇ/h /hfÿ"Ç`ÿUSM 121084 4-Mà&NOë–B-;| PaüpCùa~a Æa Èa ÄyViÀMùVa ZB,kà=|@þMùgdJ«fšMùg>Ç9W g„aØAúÖ/ a,¸&_,KCú L™?< ga ’gaþ,SW`ðCúöL™a |`*Aë` ¼!|Cúè!I Cú!INBT�`ÆT�‡AëŠIúøÔ  føAëŠ`a–f�ajgŒ/,kà®þ,_ +´'@ÐJ«gnyViÀaùjg$‡aìga<`ò‡föatf‡ga&`ðLù_ÊÖ‹'| `af*Mùga ´`jMùga ¨Nu ægºaêS+Àfþ¨,KGù_¶va ¤ <a n`REJECT NW <` V&EETQB‡ kàÑüP'HäLë¨Hë B«ÈLùa`ajpJAëNAB«Ø <aÜ,Kf Gùatva 9Vrg( «0001¬f/+ÐB«´B«ÐMùaa€'W´'_ÐfˆaÒAú­/ a*²&_CùaœL™a ’CúîL™a †fCúøL™a xCúÔa 6Múpa(`Ñü, €d. |`$ yVtR+f÷" <ÿÿ&<€a Òp0|€NAAëH!k <`JLë'AÈ'BÔB†+:'FÀgNug$AëÈ < ‚0000d <a~ëÈNuAëH!B 0¼�!A'AÈ,+ÄgVgX(+èB… †J†g`R… gúE f fB(E1|€J(g f1|NCgÂa0&HC` @|5H`|6HAëH <` pJAëØNAgkpAë–HÐp a®f*,+Ä(+èÄÌ„'FÄfp$NAJ«ÈggðJ€NuAë\ <` <>`Ø CHAIN ABORTED(CHAIN)=  =ENTER DEFAULT SYSTEM VOLUME:USER NO.=ENTER USER NO.=LëøAë`Hà~NAf8NuIù’„g$Lù8h”aÌ"<$<‡g.A `(*kà-ÿgSŽ<€KëŠaÖLù~hŒaŽ* ang ‚fЫJg&a^  f†/,(AëŠCð`ü ü Aë,R†!QÎÿüKëŠB� ae {d/,kà.þf ,_ =f /fÇ \g>±ÍcÁ  fº�'Mô, A늜ˆ'Fì JNuŠŠ+ ,H (g<4fZ‡ kàEèP Ngú  g¦ =g ²gêJfü`â =gF`ò (Rf„ (Xfz ()frXˆÇ0+gf` Ça(ÔJ@g"$kà°nP2EòPÇJgþø±Íc0Ú`î/ $kà*$_€ü a H@aÇ`þÒ±Íc0ÀNu   <`H Nf SˆÇ`þÞü~‡ \gÿ =gþŒ !gþ¼ &gþ´4kþ¬`Ôff æg fa`JJNu/,kà.þg,_`,,_f$f fgHçþüU�aŽLß?ÇNufrÇ`jKëB…atAë("<$<* +ÇfB‚Aë`Hà~NBg8 áfJ«Øk¢ ÆfJ«Øk”ÇgÇ` ÂfÇJNuKëŠB…aAëŠ(`’ M/ÞfünS� Nu  oášNuB‚aðaîaì`êáš  oNu$< aìaêaè`æ'kÌNL™a.fÿ&(+ÄÄ'DÄJNuL™afÿ(+è„'Dè(+Ä„`ÜAëNH pBhNCNu +¬Lëž�B„ kà(þgÄ69Vjg69Vn` g69Vl*+ÐAë8Hàü7|`>8pAëBhJNDNuHëpAë!|+ÇfB¨NDLëJ€NuaH@a < aNuáXÀáXÀÅNu  fSˆB†`4k`ê  gö,+ôœˆ'Fì'HðNuRˆ  gøNu$/".AîH,H<ü@<Â<Ã,ÁB^$< ,üPRIV,Â,Û,Û<ÛB^Bž&_NCNuB.?2<a¼g f€X+gx |ôpNAAëHNC`Þ|ÿì"<$<Lú8üaÚAë`Hà~NBf>*(Aë‰Úˆ"<$<Aë`Hà~NBfR+k¶fªMùlðaú´gžÇ7|HBkJ7_LNCNuJffÀJ€Nug g'kÌNNuLДªj‚&\S�’’NuÔ© ‚&\e‚&\R�Ò‘"Á"‚Nuڋ؋֋Nu"+¬a f60¼À`.AùS ±ùSj ²¨gPˆ`îJ�NuSYSCNTRL121084 4ÇÇ&<€aÈ+Çg vB‚2<aý6J«Øf,KGùnvaê°gf Mùgaü, <aòøpNAACCOUNT OWÇ`ö^alJ�f÷ø <`ûòaZÁ²«Èf <`ûv�Bƒp aþ PgNu < J+Lf < aJ�gÖgøpÇ`øn'HHAëH`ýaüJ" � g( �ALL g.áš .g( @c Zc <X�`û`"+Èf <`ìB�aý2g &g.$<0000aûÞ ‚0000f $+Ôf$+¬´«¬gJ«ÐgX�`ð²/a"t"$gØ`à/J�gAëH�HÐpagP�Nu  f _Nu <=aúÖ`äAëHHÐNAg$AëH fúV ‚0000d€ J+gú@`R+J€NuB�B‚`>aþþf|� <ÿÿ&<€J�f,J‚g ´«¬g"<&SCTpa”f <aþ¼B�`B«ÈB«Ôaê¼0<aÿrf.J‚g´«¬g <J+Lf <aþ‚`R+aê~J�gÄaêvNuB�$+¬`aþnpaÿ*gNu < J+Lf < aþBJ�gÜNuKë°MëH-]J]=] -] -UNuaâ/ aÈ&_/,kà-@òj ,_ <4`Œ,_fî€pf <5aù~`HJ«f €`kdKë°*îJ]:î *î *îL¹q aúRf6J«f4<aúBf&'k°/,kà.þf",_a&/,kà .ò,_Nu <6aù 0<ÿÿNu,_`Þ€a:"+Lë|¬AëŠHÐ~LëÈ�Hè <aúDNua <`ú6*kà2-þKë²'M(pg€@R€ cîüÿ'M,Nu/,kàîþ`h/,kà®þ`Z$H  c¢ ;fJaLJk8fNf, d&Jg"/,kàf2.þÁ`2.þ�=Aþ,_`À <7`÷¼.þg,_Nu,_`ÿ@/,kà`æagNu‡føfòMùr¢aõP‡gÇNua¢ € nÒáˆ& /fÈaŒ €n¼ /f¶ax €Pm¨€lHCЃH@aô/AëHpJNA'_H`rpJ`p ENTER DATE (MM/DD/YR)=atfZ‡fTfNMùsaô¸‡gÇNua €nÒÀü<& :fÆaò €g6À`âJføB$ // ,kàCîO”‰"_,_µëäeÚÇ`JgÀR`°SfÆ`ªB|  /,kàRŽ�ŽSŽ@,_JfNu <`÷(,_x$kà¸n6KëŠü\ aÄáXÀáXÀü:B@2@MòP/Baöaõø(R„`Ƈg¬ <`õ`CMDOPT1 121084 4,KGùtÞv`÷nNEWS NWMùušaõ<,KGùWKîŠJgD›fø| ÿÿ Z€€&@ / IîŠ�Œ(_"‚ü HAJAgü R`ì/ IÌkP(_S�/ &NaõR,K&_Jf¢&NMùu´BaôÈAëN < ÀBX À À üHELP À0¼LOaõ®f"+`ðTNu(_`ÿfSESSION CONTROL COMMANDS:(ENTRY OF LOWER CASE LETTERS OPTIONAL)a²gJ bD g fgÇgÇ`óè2<BBaôø‡f¦Nuang c <9`óŠ  f <:`î/,kà-Cò,_aùø/ aÜ&_j <4`Ìgg0f'kÌN`" <)`ª/,kàîò,_gÂg¼ ;g\B‚aô$aô aôaôMùwnr´–g HB´žgQÉÿôB�/,kà&.ò,_ƒ gD fJ gD g> <;`ÿ0$H/ aþ&_kê OfägÞ4 kà&(òƒ`& g fÂ4g kà(òg‚@2<@aóœfg ,+èÆ'FèNuEREWERPWPREWPRPWEWPWERPRSECURE121084 4 �-:]_f +̰¨J—NuJ«Ðf <aóÖyViÀaèfDJgaÂLù8zŒÖ‹a gaç�`&Hç|Lù?yBaõp  Hë?HLß>AëHNBgaò AëH0¼Bh1|NCNuJ«ÐfçŽyViÀLù8z˜Ö‹a¾gaç.Nu KGè/&Ú/&ÒLù_ÊÖˆ!|`/ &Haï,_--fÆNu KGèH"K×ü(Eùy*'"·Éfú#h&HAëHNCNuaÔg f8 |épNAaâ`ê'kÐLùy*aô”AëdHàþNBg Éf <1añ.`ÿCë Nu@ PRIV ACCOUNT PWÿ‰+‰++EJ€fè «0001¬fä gŠEfHaÿ*fæ aþ‚JgjLù8z€Ö‹a`f AëŠaýîgRCë MëÝü³Îg@³gøaŽ`ÌJ«g(Lù8ztÖ‹a&fAëŠaý´gC뱉gab`Ö±‰fø+f‚NuLùzHAë\Hà|NBLùzP(|*Ú†Aë\Hà|NBf$C*(B2PR…¼…döB€Nu0 Æf Hç~aåLß~S+Àgå*NuŠz¤z¶ŠzÐzæ zèzù z¸zÎENTER SECURITY WORDENTER NEW SECURITY WORDENTER EXISTING PASSWORDENTER NEW PASSWORDJ«ÐfäÀMù{´aï"Lù{òÜ‹aMù{ÞaMù{æaLù|Ö‹'|``ì>+é@Baì>g+0@ŠKëŒaî¤+Š 4dÞ 0eØ 2d+ü€@aî`Nuaüð/aüx gÚ gÔJŸaîv`ÿHLEVELS ARE: 0/NONE,1/SWORD,2/PWORD,3/BOTHUSER=0:USER NOT 0:&EETQ&EETQ,K2<aïàfT'kЊLù|ŒÖ‹Ø‹AëdHàþNBf6AëªpJNAEëaðØCë²aðæCëŠR©0Lù|¤Ö‹Ø‹AëdHàþNBNu‰ŠÉ‰ŠÉCHAINBAT121084 4faèÇaŠgNu¸9Vpbtva–g fìÄ Å`Ì Å'E ,kä+BfBf'Näa>aó,=|CF/ a &_ @ügìaïÜj <aìz`lHçÿÿCùaœaí´LßÿÿÇHç@€Cùa„aí†ëëLßJfH«Ç/,kà®ÿ,_Ç  ga¾aö2f BkBkBkNuÇCùaœaíH,kä"kàÓüP½ÉgDXŽ'Nä<ažëëëÇgaëÄ`¶*+ …'E f¦´+gžfZfï”Cùa„aìÂëë‡ëÇ/,kàîÿ,_Bk‡‡gÿ\‡Mù„Œ`ëÈ,+Ä*+ x f fNuR„  eîDDNu"HAëH1| f1|€0¼CDB(B¨B¨ NC INu,kä]ŽB€/,kà.ÐŽ,_½ÀeNuÇX� <`ë8faÌaÿtgNu¸9Vpb^va‚g fê² Å'E `Ò Å'E ,kägÄ+a&aZ=f7CaJ='Nä¶nd¢ÇÇNuÇ <`ê´f^fÿ~,kä+°.fè6¶ncFRn.f7nÇCùaœaëX.<AëHaþÔ ëë ëÇNu‡‡,käZŽ'Nä2<*+ …'E aëNuÇÇ«Ç/,kà®ÿ,_gNu <@aéö`ýˆf <2`é‚JB‚aêv *gl @güz &gzaê^ BENg„ BIFgP BELg6gNu BRXg˜ BRAg˜ BRDg˜ BR?gâaê ‚ABTg" ‚FORgþ6`æ\g6NuÇ*kô`èôÇ`é gNuaéfôMùg;aæÌ`â(`èèa^<!<&B†< Ba°e f†`ôa`ò†NutB�¼dºg¸g ~gìr`èÄNuagJŸNuaða¦g+ëÇNu+«‡Nu < `ÿHaé> Qfìa¸a"Ha  f "gÈNÕ³gîNÕ  gÆ "fòNuaŒaÿBf¨NÕ +g¬R+g+ëKúÿ|aèÞ Cgÿj SgÆ EgˆaÿL Rft,Kal (gŠ =gt >gJ g* (=gaJ€f ¶Rnÿ&NÕ`ÿ aêJ€f ¶RlðNÕaÜJ€fþf¶RfàNÕ (=gaÆJ€fæ¶RmÊNÕa¶J€fضRo¼NÕaªJ€fʶRg®NÕafkÖfgžNÕf˜NÕaè ‚SEfä\+g "S+gNuk++gÇNu‡NuaçÜ ‚DIFg ‚DFORgüp`ä+«S+k`À <!`ý¦,KGî`,KGî`,KGî$Ka" (fa¼k6gÄ`„6„&NNu =f aÔk>J€fê6ƒ&NNuRˆ Xg Ag DgJŸ`òEî` Eî`EîaºNu RfÔaÆ +g@ -g* &g !g`¶ajJ€f„0€C`a\J€fv0ÀC` aPJ€fj0�C6€&NNua@J€fZ0ÐC`îa Š )f$aP =f Cja@8 0fNu 1fJNu6<ÿÿNuRˆa TJ�k B€ ƒjJ�Nu <3Nu&N`ülRˆBA  g  gî4NuJŸ <"`üH&N`ò <#Aë`ç END CHAINg <$`åB«üLùˆ’a>a('yˆÈ^7kÒbLùˆ®:9VnaâœfæLùZ¸aâŒfÆLùZÐaâ|f¶Kè–'MüLùZìaâdfžÑü'HøLùZœaâJf„ kðaë=|CF/ aò&_"HaçÊkdL¹a„aôfTaåÂfH8<aøf< I(ÿÿ  b&$aøLùˆ’ap*<‰°'kü`a@‡ A€gAëø <*`äî <-aã <ÿÿ&<€aà´ <.Aëø`ãP kà<(üHE8:< aà˜‡faÕØ`ôNu/AëZ.HG6.HD8HD.Nua6fLùˆ’aÖ*<ŠFa¬‡faŽfÜNufø <'`äT  g$<0000aãx ‚0000f$+üg" ‚0ALLfB‚'B`B†<+Ò/,kà-Fú,_Nu —‡ gàJŸ <&`â*aªLùˆ’aÿP*<ŠNaÿ$‡fØafàNu kà!Aò <,f <+f <* f <,HëŠAëŠaãœ/,kà  ,.ò,_B‚ÇBFJ†NuJ«Ðfרaè./ a&_kgB†'F`<+R kà!Fú`ÿV <(`árv,+Äg RC Cfô6<ÿNuLëøAëN0ÄHÐ"<taâ¤g /rB‚a☠Nu#&EET€Z‰Š &BCT€&EET@€ˆèp Aù‰jNA&Hp Aù‰zNA'HàOë–aÑ‚Lë¨LëøHë¨'Bš'B B«üBkBkBk.<¡,kà=kþ®ÿ'|`ÄaæöL¹q aáÄfÓ†`Ö€&BCT .SCT&BCT .ARGaÓ’aÒþ,Lù?‹/aýR _$(aк`Ò„aÓlLè "kÚ,o"<€` �ÿÿÁ"Á"³ùSkCùS 'IÚ,'B`Lù?‹/aüö _`¢B�$(/ a†f&_`Ògp/ &o‘«Ò&_Áfà‚C6�`ÚaÒæLè J‚g|`L/ aì&_`œ/ aäg4JAk0&<€/" &o/B�paÏögø"<&BCTpaÏè&_"A€6�&_Aëp`ÿZGùS ·ùSj´«gP‹`îJAg ²kgB�B‚NuB�2Nu0( çˆGùS Gó·ùSjÜJAg ²kgP‹`êJ«gö €S æˆR€H@0"$+Nu#&SCT€Z]Æ#&SCT€Z]Ø Hç8 .gJ4k`ÊÀ6<ÿþ` ƒ€g ƒ'cÀ` =C ` À`À4<aX6< Gî at4<aD n& f| 6< GîaR4<a" (g6<Gîa84<a (fœBBBC4kJ )gg> Pn8AéK†AB`Ø4Bÿg BnÀ BcÀ=C `HÀÀÀBÿ BcÀ`,Rˆ6<Gîa¬4<a|$< Gî &Â&Â&Â&Â6ÂBn $B|gÀ$fÀ fÀ fÀ fÀ fÀ4B|gÀg :f€J€Lß<NuJ€jÀX�`’QBgQBÀ`ÀBgÀNu4HB€€»Èg64k.f(f @À`< *fÀÁSCn΀€`$HB´CfÀ`< (*ÿþf<*`ÂSCnúNuNqHçB€B�Iúr ,gø4k6 -fÀ`æg0ƒgÁ` =fRŠa`  f@` Lß NuBƒ:< &J $gN4gˆ`&4k&gã‹/å‹ÖŸ�Ö�SEnÞ‚4jø  f"+ÿþNu:<4käfgÌ_�郆�SEnÜ`ºNq€üê`"B€0€ügAîv0<6NA=|ÿÿ~aÞf´.gaaòf¢Gî:EîºLÓg,aäfÿ|Ö‚Sƒ<ÿarfÿlaPfÿdGëAÈeÊaxaÄfÿNNuBnl.>g-|@N|SAîNNCg.-@‚NunAT-|€N|SHîÀVAîNNCg-@‚Nu2.PA Ag -|‚NuDüNu-|NAîNNCNuB®¨Aî -H¬Aî -H°Aî NBfR®¨-@‚Nu. f-n&=n<n€6n€0.>f-n "f-n&f=n*f LîHî,fn4fn52.JngýœB€.(°.@c.@Jgý†HîÀÈ-nJÐ-n"Ô-n&Ø-n$Ü-@àAîÈ0<NAgýV-@‚Nu.g¨Jng B‡ ®&SCTgÀ-nAî0<NAEî"Cúù”0<)4ÙQÈÿü=n<-n&Aî -HJî ><?B†B‡|�aûø> .�g n„fPR®"SGfÖ`F-n"î-n&òAîî0< NAf.=|~0<NAAîv0<6NAg Aø„0<5NA |0<%NAAî0< NA~#üÿÿÿÿ–taZAîCîÜajAîCîîa` .Iîóa BAîØ-HÈAîø-HÌAî¼NBJ‡gAúù-HÈAúù"-HÌAî¼NBAúøºNC`ÿnCúøØ-n–-Y’kAîŠNCfòNu2< c {c< ÀSAfèNué˜0 :m^�ÁSBfæNuHçÿKî Ií0B„B…B†B‡ ¬ÿÿÿÿ g aa:afIì`êLß8ÿNuLìÀ Ð…°¬c)@ , D€€ÿÿЬ (,*Nu Ї¼­b°­cÙ­�­¼­b°­eÙ­�­Nu$&Ö‡àŠà‹"’†à‰Gí°pÿ “ÿÿgR€´Sb¶ke î fÓ[Ó[`Gë`ÚNužÊžìSRV4: UNABLE TO LOAD TASKDUMP.SY $ $  FROM ** EMH ERROR # $ USR SVC IOS FHS LDR ¥:¥T¥J¥†¥À¦†¥2¦2¥@¥v¥h¥X¥&ABCIKLTWXYZD˜–€B@† 'èd €ŸŠ @ ERRORMSGSYADIÿAVAILABLEUNABLE TO OBTAIN USERS LOGICAL UNIT NUMBERUNABLE TO ASSIGN ERRORMSG.SYNO ERROR MESSAGE AVAILABLEUNABLE TO READ SENTINEL CODE \K BINARY VALUEAVAILABLEUNABLE TO WRITE TO USERS OUTPUT DEVICENESTED \K SENTINEL ARE ILLEGALMESSAGE BEING BUILT EXCEEDED BUFFER SPACEUNABLE TO RECEIVE LOGICAL UNIT NUMBER FOR DEVICE CODEUNABLE TO RETURN LOGICAL UNIT BACK TO USERUNABLE TO MOVE CALLERS PARAMETER BLOCK OR PLUG POOLPLUG POOL SIZE EXCEEDS MAXIMUM SIZE OF 96INSUFFICIENT NUMBER OF PLUG POOL DELIMITERS ð  ú*¡$¡@¡Z,¡† ¡�&¡¶¡Ô)¡þ5¢4*¢^3¢’)¢¼+B¹ äB¹ èBy Þ#üžî Ú/.Š.�/-|€Šn+�#Æžî#ÇžøHîÀâ#Æ–tCù–taú&C�-_ŠJ€fŒAúý0¼@1|NCfÄ ."#ÀŸŠAúüÔ!|ŸŠ NBf¢&(ajaˆAî:HÐÀB¨ B¨GúûšIúû`.:üüægŒLúüÜB¹ äB¹ è¹Ëd: \fb+J®&f(ù Þazgp Cg Kf×À–€ãˆ×À–€`4¹ ÞaRT‹a¦Cúûþr ¸1WÉÿúå�Kî Cúûº"qNÑÛSƒnŒ`ÿlAúú!züF SŒ!LHç0$h  g4µÌcöSŠ!JNBf*µÌd&TŠ  fRŠ gJ"¼µÌd !J `ÆUŠ`ÎLß J€ftAúûÂ0¼Bh,:ùò.:ùø-|¬|NC|NC ." n&`ó#üŸ Ú` 5PaŽYƒ`ÿJ05Pax`ð5Paf`æKî&ü$ 5Pa6T…`ü$ 5Pa&`ÄB@ü$5Pa`´¹ Þg¼0|4B…KúûN(af õ@aäR„S…nòaÈ]ƒ`þÊAúûKîVf2ÐAî:!n. .2�®.R€ €`bN!@!MpNAfDAî: hÑÍ ` »Èd$JjöS…fòÝk »Èdaj`ðSŒ`ÿ 0."@ ÐEH@05P( Gî!AúúL/(!KGîúa(!_J€f"(Ûa&S�fö (a&D`þ¼&D`þäU‹pB… 9c é�ŠQÈÿê]ƒoHù äÖ‹Rƒþ&C`GúøÌ a¾f¤&( \f Sƒg Kg|Sƒfê&h &(ü ü …g … fý ."€€füþAîÚ0¼1|n|NCf4Aî²0¼€|NC#è ìù ÞAîÚ1|NCfâ`ü¬#ü.... ìù Þ`ü–Aúù!K &€NBNuà˜4<`4<é˜0 :m^€ÀSBfèNuAúøÎH€`Aúø¾HÀ`AúøªJ€jü-D€r `Â4��eRBÁ`ôИJ�jBJ�f J�kB NuJ�kÒB`ÐtB… 9n 0lR‹J…fgËü €Ú€SBfÚNuR9 R9 R9 R9 R9 R9 R9 R9 R9 R9 R9 R9 R9 #À ÚIú÷ˆaÿ :øFH@Iú÷~aþúaÂaœB€:÷b/Iú÷\aÿCúöXAú÷DraôìAúõæ|0¼!|žî Àü €TnIúùü<4(tü ü ÜSFfúü ü S‰!I?(hNB1_B9 `ûÄ#üÿÿÿÿ–taôZfÿB`úb."€xâ cB€CúöÆ#ñŸ Nu ."Iúõ”aþ* ."H@IúõŠaþNu/ $ fBS€fô(_Nu , ÿÿm ,~ÿÿc J,ÿÿg|.ÿÿNuCú÷.Jk¸føNu¹ Þf::÷f2ù Þ*KAî:!n&Gî !K!|0p&MNAg*_`þBNuNu!TCB”&LDRÈÈÈ ¬`—ú—„!TST$D–ª&LDR„­H¯G¯H´o´p¹´pµHD00.IOSWIN1ó 22™3µÀFD02.IOSWIN1óOPP(¶tCN00.IOS3#CN00ÁwóP »  »  Þ ·(CN01.IOS3#CMP1ÿóP »  »  Þ ·ÜCN02.IOS3#CMP2ÿóP »  »  Þ ¸€PR .IOS2 _CPR 3„BÔÀ„ NULL÷ÿ:º0WIN1!þxñÀÓDº^CN00oþƒƒB0ºŒSPR1þ»ñÁÍE0ºº CMP1dþ½SPR1ñÁÍE0ºè CMP2eþ½SPR1ñÁÏE0»CPR RþÄñÁáA DIOI›Í,|­`jAúÿÚpNAf&H <BS€fúOëT |­'M2f'H2,k2a˜"|ºJ‘gLAëN/ 1i!iLé? Hè?&_ (g (f(p ¼!UDRáŠ]‚„ü 1BB¸0$:Fg2 BpN@`aê!È0aEè ŠáŠQ‚„üÄüÔŠ!B1ú4!ü˜arJ¸fœB¸Gú`Cë <€pN@`ad4+;B,g +x !ÍEëpB�JjgR�EêQÈÿòGë(m6AIì p(ÛQÈÿü “!TCBg†a,.x2<ÀaD/:>NuHVMù ,¯@î|MîHÖ?ÿ-_8-O<2<¢a`ø,áŽ,FÝÈB†-½ÈnúNu0<`0<�F虀2<é™"x:Cé2�A02�2€@02€Nua&a°‹fa†a†°�faÿ|Cí!ÉaÌazNuB€AúܰPgaÿ^B‡EЇ Eê Rÿÿfð‡#à�*(B(:^º„c*„ÿBKúû‹" B*AMúÕ,Bœ�°º.f†` (<•B*DB†º„baþöNu hÿÿ g2a8 ÿfaX`"aúJga.`aF°ŠfCéÿö`aÂa`Æ3|ÿÿ Nu~Aè Cé ((„ÿB*(B*DB†º„baþŠNu•ÊB�B‚BƒIÕKõhHz"?H"z2!ÉBgâHzÞ?`!øNJB¸R!ü>1údV| )|F\�Nu!ü BNu;Zx—µÔó0Nm<[y˜¶Õô1OnHç@a8BAîH06þÐALß@Hç`"€ÿBAHAA¼$ÄümЂVAäIÐ�LßNuMúÿŒf&f "BAHA‚üdHAJAf f fMúÿzNuHyÅœ?.VERSAPT.CF is built from VERSAPT.BEGIN.CF at sysgen time.F=/* It will contain patches to be applied to VERSADOS after the sysgenA=/*�process.‚The�.VERSAPT.CF�file�is�built�dynamically�atC=/* sysgen time depending on the configuration of your system whichC=/*�is�defined�by�.CNFGDRVR.CI�and�&.CNFGTASK.CI�files.‚TheE=/* other VERSAPT.*.CF files are copy appended to this file to createB=/*�the�final�.VERSAPT.CF�file.‚The�SUBS�command�is�run�onE=/* .VERSAPT.CF to create the .XVERSAPT.CF file whichB=/* is run after the sysgen has completed, to apply any patches to%=/* .VERSADOS.SY as required.=/*=/*=/* VERSAPT.RWINDRV.CF=/*=PATCH VERSADOS.SYH*>----------------------------------------------------------------------O�$7800Ž*�Start�of�RWINDRVH*<----------------------------------------------------------------------QUIT=/*9=/*‚VERSAPT.DRVS10.CF�-�TERMDRV�driver�patches�for�VME/10=/*=PATCH VERSADOS.SYH*>----------------------------------------------------------------------O�$8300Ž*�Start�of�TERMDRVH*<----------------------------------------------------------------------QUIT=/*=/* VERSAPT.MPSCSPR.CF=/*=PATCH VERSADOS.SYH*>----------------------------------------------------------------------O�$BB00Ž*�Start�of�MPSCSPRH*<----------------------------------------------------------------------QUIT=/*=/* VERSAPT.MPSCDRV.CF=/*=PATCH VERSADOS.SYH*>----------------------------------------------------------------------O�$BD00Ž*�Start�of�MPSCDRVH*<----------------------------------------------------------------------QUIT=/*=/* VERSAPT.PIADRV.CF=/*=PATCH VERSADOS.SYH*>----------------------------------------------------------------------O�$C400�*�Start�of�PIADRVH*<----------------------------------------------------------------------QUIT=/*=/*†VERSAPT.FHS.CF=/*=PATCH VERSADOS.SYH*>----------------------------------------------------------------------Ý8æ7O�$CA00�*�Start�of�FHSH*<----------------------------------------------------------------------QUIT=/*=/*†VERSAPT.IOS.CF=/*=PATCH VERSADOS.SYH*>----------------------------------------------------------------------O�$E000�*�Start�of�IOSH*<----------------------------------------------------------------------QUIT=/*=/*†VERSAPT.FMS.CF=/*=PATCH VERSADOS.SYH*>----------------------------------------------------------------------O�$FC00�*�Start�of�FMSH*<------------------------ ----------------------------------------------QUIT=/*=/*†VERSAPT.EET.CF=/*=PATCH VERSADOS.SYH*>----------------------------------------------------------------------O�$15000�*�Start�of�EETH*<----------------------------------------------------------------------QUIT=/*=/*†VERSAPT.LDR.CF=/*=PATCH VERSADOS.SYH*>----------------------------------------------------------------------O�$19600�*�Start�of�LDRH*<----------------------------------------------------------------------QUIT=/*=/*†VERSAPT.IOI.CF=/*=PATCH VERSADOS.SYH*>----------------------------------------------------------------------O�$1AD00�*�Start�of�IOCH*<----------------------------------------------------------------------QUIT=/*=/*†VERSAPT.SYSINIT.CF=/*=PATCH VERSADOS.SYH*>----------------------------------------------------------------------O�$1C100�*�Start�of�INTH*<----------------------------------------------------------------------QUIT=/*8=/* SYSTEM MUST BE RE-BOOTED FOR PATCHES TO TAKE EFFECT.=/*=ENDé6' ACCT AFúúrrACCT LFrrACCT SA  ^ErrANALCCBSAImm@rrANALDATAAIvvCrrANALGST AI WrrANALIO AI��ãrrANALMACRAI±± ¿rrANALMAINAIÂÂÖrrANALMAP AIããÀrrANALNET AIüü]PrrANALPDMPAI]]¨rrANALSYSPAIvvÅrrANALTABLSA��3rrANALTASKAI  ?ErrANALTRAPAIáá\rrANALUST AIêê QrrANALUTILAIûû)¡rrBACKUP AF,,rrBACKUP LF55rr=/* =/*†ACCT.AF=/*'=/* Chain file to assemble ACCT utility=/*:=/* If no output argument is specified for the listing the&=/* chain file will default to ACCT.LS=/*=/IFC \1 ƒ=ARG�ACCT.LS=/ENDIF=/*=ASM ACCT.SA,ACCT.RO,\1;RZ=106=/*{ Included files are:=/*ƒ9995.&.USM.EQ=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.EXE.EQ=/*}=/*=ENDéééé ééò=/* =/*†ACCT.LF=/*%=/* Link chain file to create ACCT.LO=/*:=/* If no output argument is specified for the listing the&=/* chain file will default to ACCT.LL=/*=/IFC \1 ƒ=ARG�ACCT.LL=/ENDIF=/*=/*=LINK ,ACCT.LO,\1;AHMIXATTRIBUTES D PSEG SEG0:0,14 $0000 INPUT ACCT.ROLIB 0.&.UTILIB.ROEND=/*=ENDééééééû,ACCT…IDNT�4,00�8211150830�ACCOUNTING�UTILITYO*********************************************************************************ˆACCOUNT�USER�UTILITY*F*ˆESTABLISHES�AND�UPDATES�PRIV.ACCOUNT.OW�FILE�USING�THE�PASSWORD�FILE *ˆAS�A�BASE**ˆHBR8**ˆREVISION�HISTORY„12/20/84*8*’THE�CODE�WAS�MADE�POSITION�INDEPENDENT�BY�REVISING�ALL9*’BY�LEA�INSTRUCTIONS�TO�LOAD�OFF�THE�PC,�AND�BY�REVISING4*’MEMORY�LABELS�REFERENCED�TO�BE�REFERENCED�OFF�PBA.*O*******************************************************************************‰PAGE‰NOLIST‰INCLUDE�9995.&.USM.EQ‰INCLUDE�9995.&.TR1.EQ‰INCLUDE�9995.&.IOE.EQ‰INCLUDE�9995.&.EXE.EQ‰LIST ‰SECTION�0 PBA†EQU‡**œPBA=PROGRAM�BASE�ADDRESS"MAXERRƒEQU�3�MAX�INPUT�ERROR�COUNT‰DC.B�'122084�4'‰DS.B�32�STACK STACK„EQU�*CMDBUFƒCOMLINE�OWRECLPASSKEY‚DS.B�PWRECLBUFF…DS.B�OWRECLDEPARTƒDS.B�OWDEPTCCUMTIME‚DC.L�0,0"ASSIPAR‚DC.W�FHASGN,FOPPR+FOPISK,1PASSNAME DC.L PWVOL ‰DC.W�PWUSR!‰DC.L�PWCAT1,PWCAT2,PWFIL1,PWFIL2 )‰DC.W�PWEXT,0,PWPROT,PWRECL,PWKSIZ,PWFBLK%ASSIPARA DC.W FHASGN,FOPPRPW+FOPISK,2ACCTNAME DC.L PWVOL ‰DC.W�PWUSR!‰DC.L�PWCAT1,PWCAT2,PWFIL1,PWFIL2)‰DC.W�OWEXT,0,PWPROT,OWRECL,OWKSIZ,PWFBLKCLOS2„DC.W�FHCLOS,0,2-READ1PAR DC.W IOREAD,IOPBIN+IOPIMG+IOPRTK,1,0*‰DC.L�0,PASSKEY-PBA,PASSKEY+PWRECL-1-PBA,04READCPAR DC.W IOREAD,IOPBIN+IOPIMG+IOPRRN+IOPRTK,1,0*‰DC.L�0,PASSKEY-PBA,PASSKEY+PWRECL-1-PBA,04READIPAR DC.W IOREAD,IOPBIN+IOPIMG+IOPRRN+IOPRTK,2,0$‰DC.L�0,BUFF-PBA,BUFF+OWRECL-1-PBA,0-READ2PAR DC.W IOREAD,IOPBIN+IOPIMG+IOPRTK,2,0$‰DC.L�0,BUFF-PBA,BUFF+OWRECL-1-PBA,0-WRITEPAR DC.W IOWRIT,IOPBIN+IOPIMG+IOPRRN,2,0$‰DC.L�0,BUFF-PBA,BUFF+OWRECL-1-PBA,0-UPDATPAR DC.W IOUPDR,IOPBIN+IOPIMG+IOPRRN,2,0$‰DC.L�0,BUFF-PBA,BUFF+OWRECL-1-PBA,0-DELETPAR DC.W IODELR,IOPBIN+IOPIMG+IOPRRN,2,0$‰DC.L�0,BUFF-PBA,BUFF+OWRECL-1-PBA,0ERRORPAR DC.W IOWRIT,IOPASC,6,0 ‰DC.L�0,0,0,0ERRPARƒDC.L�2,ERRORPAR-PBA*** PAGE**ˆ**�TABLE�OF�OPERATIONS* OPERATE EQU *H EPN%D-B5<=HE?MGUB]I DC.B 'A',0 DISPLAY ALL RECORDS DC.L DSPLYALL-PBA! DC.B 'B',0 DISPLAY SINGLE RECORD DC.L DISPLAY-PBA) DC.B 'C',0 ENTER OWNER DATA FOR USER NO. DC.L ENTERNEW-PBA, DC.B 'D',0 DISPLAY RECORDS FOR A DEPARTMENT DC.L DPLYDEPT-PBA+ DC.B 'N',0 BUILD NEW RECORD FOR ACCOUNTING DC.L BUILDNEW-PBA DC.B 'P',0 DISPLAY PASSWORD DC.L DPLYPASS-PBA3 DC.B 'R',0 RESET ACCUMULATION FOR RECORD SPECIFIED DC.L RESET1-PBA7 DC.B 'U',0 UPDATE/CREATE OWNER FILE FROM PASSWORD FILE DC.L UPDATE-PBA DC.B 'X',0 DELETE RECORD DC.L DELENTRY-PBA. DC.B 'Z',0 RESET ACCUMULATION FOR ALL RECORDS DC.L RESETALL-PBA DC.L 0 END OF TABLE**0HEADER‚DC.B�'USER-DEPT-----OWNER�NAME----------'1ˆDC.B�'LAST�LOG�OFF------USAGE--------#S-RESET',0‰DS�0‰PAGE ‰XDEF�ACCT.‰XREF�ASCVAL,CLASCODE,BDCONV,ODATCONV,TIMECONV**ˆ**�INITIALIZE* ACCT EQU *‰LEA‡PBA(PC),A6(*œA6=PROGRAM�BASE�ADDRESS�REGISTER�(PBA)‰LEA‡PASSKEY(PC),A7"‰MOVE.L„A7,READ1PAR-PBA+IOSSAD(A6)"‰MOVE.L„A7,READCPAR-PBA+IOSSAD(A6)1*œESTABLISH�START�ADDRESS�IN�I/O�PARAMETER�BLOCKS‰LEA‡PASSKEY+PWRECL-1(PC),A7"‰MOVE.L„A7,READ1PAR-PBA+IOSEAD(A6)"‰MOVE.L„A7,READCPAR-PBA+IOSEAD(A6)1*œESTABLISH�END�ADDRESSES�IN�I/O�PARAMETER�BLOCKS‰LEA‡BUFF(PC),A7"‰MOVE.L„A7,READIPAR-PBA+IOSSAD(A6)"‰MOVE.L„A7,READ2PAR-PBA+IOSSAD(A6)"‰MOVE.L„A7,WRITEPAR-PBA+IOSSAD(A6)"‰MOVE.L„A7,UPDATPAR-PBA+IOSSAD(A6)"‰MOVE.L„A7,DELETPAR-PBA+IOSSAD(A6)1*œESTABLISH�START�ADDRESS�IN�I/O�PARAMETER�BLOCKS‰LEA‡BUFF+OWRECL-1(PC),A7"‰MOVE.L„A7,READIPAR-PBA+IOSEAD(A6)"‰MOVE.L„A7,READ2PAR-PBA+IOSEAD(A6)"‰MOVE.L„A7,WRITEPAR-PBA+IOSEAD(A6)"‰MOVE.L„A7,UPDATPAR-PBA+IOSEAD(A6)"‰MOVE.L„A7,DELETPAR-PBA+IOSEAD(A6)/*œESTABLISH�END�ADDRESS�IN�I/O�PARAMETER�BLOCKS‰LEA‡ERRORPAR(PC),A7‰MOVE.L„A7,ERRPAR-PBA+4(A6) *œESTABLISH�ADDRESS�IN�WORK�AREA* LEA STACK(PC),A7 INITIALIZE STACK POINTER CMP.L #0,A2 CHECK USER NUMBER BEQ.S ACCT10 BRANCH USER =0+ MOVE.L #EM_PRIV,D0 PRIVILEGE ERROR MESSAGE BRA ERROROUT ERROR EXIT**ˆ**�DECODE�INPUT�COMMAND* ACCT10 EQU */ LEA CLASCODE(PC),A4 CHARACTER VALIDATION TABLE! LEA CMDBUF(PC),A0 POINT TO INPUT ACCT15 EQU * CMP.B #$D,(A0) END OF LINE?' BEQ DISPLAY YES, ASSUME DISPLAY RECORD CMP.B #';',(A0)+ OPTION PREFIX? BNE ACCT15 NO, CONTINUE# MOVE.B (A0),D1 FETCH OPTION LETTER ACCT20 EQU *' LEA OPERATE(PC),A1 TABLE OF OPERATIONS ACCT30 EQU * TST.W (A1) END OF LIST? BNE.S ACCT35 NO, CONTINEUE MOVE.L #EM_CMDER,D0 NOT FOUND BRA ERROROUT ERROR EXIT ACCT35 EQU * CMP.B (A1),D1 COMPARE ENTRY BEQ.S ACCT40 FOUND ADD.L #6,A1 GO TO NEXT ENTRY BRA ACCT30 TRY NEXT ONE ACCT40 EQU * MOVE.L 2(A1),A1 GET ADDRESS ‰ADD.L…A6,A1&*œESTABLISH�ADDRESS�TO�JUMP�TO�FOR�THE*œSPECIFIED�PROCESSING JMP (A1) GO TO PROCEDURE* PAGE**ˆ**�ASSIGN/ALLOCATE�F ILE* ASGN EQU *- MOVE.L A0,-(A7) SAVE PARAMETER BLOCK POINTER TRAP #3# BEQ.S ASGNX BRANCH ASSIGNMENT GOOD8 CMP.B #FSTAAP,D0 FILE IN USE (ACCESS PERMISSION ERROR)? BEQ.S ASGN20 OK CMP.B #FSTANNM,D0 NOT FOUND? BNE ERROROUT BRANCH OTHER ERROR, BSET #7,ASSIPARA-PBA+1(A6) SET ALLOCATE BIT TRAP #3 ALLOCATE+ASSIGN BNE ERROROUT ERROR EXIT ASGNX EQU * MOVE.L (A7)+,A0 RESTORE POINTER,�CLR.L�CUMTIME-PBA(A6)‰RESET�CUMULATIVE�TIME$�CLR.L�CUMTIME-PBA+4(A6)‡SECOND�PART RTS ASGN20 EQU * MOVE.L #DELAY,D0 DELAY COMMAND MOVE.L #233,A0 233 MILLISECONDS TRAP #1 MOVE.L (A7)+,A0 RESTORE POINTER BRA ASGN TRY AGAIN* PAGE GETFLD EQU * MOVE.B (A0)+,D1 GET CHARACTER CMP.B #'.',D1 FIELD TERMINATOR? BEQ.S GETFLD1 YES& CMP.B #';',D1 OTHER FIELD TERMINATOR? BEQ.S GETFLD1 YES MOVE.B D1,(A3)+ PUT CHAR" SUB.L #1,D6 DECREMENT FIELD COUNT BPL GETFLD CONTINUE- MOVE.L #EM_FLDSZ,D0 FIELD SIZE ERROR MESSAGE BRA ERROROUT ERROR EXIT GETFLD1 EQU * MOVE.B #' ',D2 GET A SPACE CHAR GETFLD2 EQU * TST.L D6 TEST DONE BLE.S GETFLDX BRANCH DONE MOVE.B D2,(A3)+ SPACE FILL SUB.L #1,D6 DECREMENT COUNT BRA GETFLD2 CONTINUE GETFLDX EQU * RTS* MOVEFLD EQU * TST.L D6 DONE? BLE.S MOVEFLDX YES" MOVE.B (A0)+,(A5)+ MOVE CHARACTER SUB.L #1,D6 BRA MOVEFLD CONTINUEMOVEFLDX EQU * MOVE.B #' ',(A5)+ ADD SEPARATOR RTS,PUTREGLZ OR.L #$30000000,D0 FORCE ASCII ZERO7PUTREGLS OR.L #$20000000,D0 FORCE ASCII SPACE (OR ZERO) ROL.L #8,D0 POSTION FOR MOVING MOVE.B D0,(A5)+ MOVE CHAR RTSPUTREG4 BSR PUTREGLSPUTREG3 BSR PUTREGLSPUTREG2 BSR PUTREGLZ BSR PUTREGLZ MOVE.B D5,(A5)+ PUT SEPARATOR RTS PUTMSW EQU * ROL.W #8,D0 MS WORD -> LS OR.B #'0',D0 FORCE DIGIT MOVE.B D0,(A5)+ PUT IN BUFFER RTS PUTD0 EQU * BSR PUTMSW BSR PUTMSW SWAP D0 BSR PUTMSW BSR PUTMSW RTS PAGEO*********************************************************************************ˆADD/CUMULATE�ELAPSED�TIME*B*ˆADDS�THE�ELAPSED�TIME�IN�REGS�D1�AND�D2�TO�THE�ADDRESS�SPECIFIED *ˆIN�REG�A1.*O*******************************************************************************ADDLAPSE EQU * ADD.L 4(A1),D2 ADD TIME& CMP.L #1000*60*60*24,D2 TEST ROLLOVER BCS.S ADDLAPS1 NO ROLLOVER' SUB.L #1000*60*60*24,D2 SUBTRACT 1 DAY ADD.L #1,D1 INCREMENT DAY COUNTADDLAPS1 EQU * ADD.L (A1),D1 ADD DAYS MOVE.L D1,(A1)+ PUT DAYS BACK MOVE.L D2,(A1) PUT TIME BACK RTSO*********************************************************************************ˆ**�CUMULATE�TIME*O******************************************************************************* ACCUM EQU *3 MOVEM.L BUFF-PBA+OWCTIMS(A6),D1-D2 GET TIME TO ADD. LEA CUMTIME(PC),A1 POINT TO PLACE TO CUMULATE BRA ADDLAPSE ADD IT AND RETURN* PAGEO********************************************************************************4*ˆCOMPUTE�ELAPSED�HOURS,MINUTES,SECONDS,MILLISECONDS**ˆMOVE.L�,D0*ˆMOVE.L�,D1*ˆBSR�ELAPTIME**ˆRETURNS�HOURSˆD0 *�MINUTES†D1 *�SECONDS†D2*O*******************************************************************************ELAPTIME EQU *. DIVU #60000,D1 REMAINDER MILLISECONDS,MINUTES MOVE.L D1,D3 SAVE CLR.L D2 CLEAR UPPER MOVE.W D3,D2 MINUTES DIVU #60,D2 MINUTES,HOURS CLR.L D1 CLEAR UPPER MOVE.W D2,D1 HOURS MULU #24,D0 DAYS TO HOURS ADD.L D1,D0 TOTAL HOURS CLR.W D2 RESET HOURS MOVE.L D2,D1 FETCH MINUTES SWAP D1 POSITION MINUTES CLR.W D3 CLEAR MINUTES SWAP D3 POSITION MILLISECONDS# DIVU #1000,D3 MILLISECONDS,SECONDS CLR.L D2 CLEAR UPPER MOVE.W D3,D2 SECONDS RTS*LAPSEPUT EQU * MOVE.B #':',D5 SEPARATOR" BSR BDCONV CONVERT HOURS TO ASCII BSR PUTREG4 TRANSFER TO BUFFER MOVE.L D1,D0 FETCH MINUTES$ BSR BDCONV CONVERT MINUTES TO ASCII SWAP D0 2 CHAR MAX BSR PUTREG2 TRANSFER TO BUFFER MOVE.L D2,D0 FETCH SECONDS$ BSR BDCONV CONVERT SECONDS TO ASCII SWAP D0 2 CHAR MAX MOVE.B #' ',D5 SPACE TERMINATOR BSR PUTREG2 TRANSFER TO BUFFER RTS  PAGEH************************************************************************5*ˆ**�SUPPORT�SUBROUTINE�TO�PUT�DATE/TIME�IN�REGISTERS*�TO�MESSAGE�BUFFER;*ˆREQUIRES�PUT�ADDRESS�IN�A0�WHICH�IS�INCREMENTED�ON�RETURN#*ˆREQUIRES�SEPARATOR�CHARATER�IN�D5 *ˆPUTS�SPACE�FOLLOWING�3RD�GROUP*H************************************************************************PUTDTIM BSR.S PUT HH OR MM SWAP D0 GET OTHER HALF BSR.S PUT MM OR DD MOVE.B #' ',D5 SPACE TERMINATOR MOVE.L D1,D0 GET 3RD PART BSR.S PUT SS OR YY RTSPUT ROL.W #8,D0 GET MS CHAR MOVE.B D0,(A5)+ TO BUFFER ROL.W #8,D0 GET LS CHAR MOVE.B D0,(A5)+ TO BUFFER$ MOVE.B D5,(A5)+ SEPARATOR TO BUFFER RTSO*********************************************************************************ˆ**�DISPLAY�CUMULTIVE�TIME�SUM*O******************************************************************************* DPLYSUM EQU *# LEA CMDBUF(PC),A5 START OF MESSAGE& MOVE.L #'USAG',(A5)+ START OF MESSAGE! MOVE.L #'E = ',(A5)+ SECOND PART) MOVEM.L CUMTIME-PBA(A6),D0-D1 FETCH TIME BSR ELAPTIME CONVERT TO ASCII BSR LAPSEPUT PUT IN BUFFER MOVE.B #$C,(A5)+ FORM FEED CLR.B (A5) PUT TERMINATOR# LEA CMDBUF(PC),A5 START OF MESSAGE BRA OUTMSG OUTPUT IT AND RETURN PAGEO******************************************************************************** *ˆ**�READ�SPECIFIED�OWNER�RECORD*O*******************************************************************************REDOWNER EQU *& LEA ASSIPARA(PC),A0 ASSIGN OWNER FILE BSR ASGN ASSIGN IT BSR USERNUM GET USER NUMBER MOVE.L A0,-(A7) SAVE POINTER(�MOVE.L�D3,BUFF-PBA(A6)…PUT�USER�NO./KEY LEA READIPAR(PC),A0 READ RANDOM TRAP #2 BNE ERROROUT ERROR EXIT' MOVE.L (A7)+,A0 RESTORE CMDBUF POINTER RTSO*********************************************************************************ˆ**�READ�NEXT�OWNER�RECORD*O******************************************************************************* REDNEXT EQU *4 LEA READ2PAR(PC),A0 READ SEQUENTIAL PARAMETER BLOCK TRAP #2 BEQ.S REDNEXTX OK CMP.B #ISTAEOF,D0 END OF FILE? BEQ.S REDNEXTX OK, RETURN BRA ERROROUT ERROR EXITREDNEXTX EQU * RTSO*********************************************************************************ˆ**�WRITE�UPDATED�RECORD�BACK*O*******************************************************************************UPRECORD EQU ** LEA UPDATPAR(PC),A0 UPDATE PARMETER BLOCK TRAP #2 BNE ERROROUT ERROR EXIT RTS* PAGEO********************************************************************************,*ˆ**�RESET�CUMULATIVE�TIME�AND�SESSION�COUNT*O******************************************************************************* RESETIT EQU *2 LEA BUFF+OWCTIMS(PC),A1 ADDRESS TO START CLEARING‰MOVE.L„#BUFF-PBA+OWRECL,D7 ‰ADD.L…A6,D7*œD7=ADDRESS�TO�COMPARE�AGAINSTRESETIT1 EQU *‰CMP.L…D7,A1…TEST�DONE BEQ.S RESETITX DONE CLR.B (A1)+ ZERO BRA RESETIT1 CONTINUERESETITX EQU ** MOVE.L #GTDTIM,D0 GET RESET TIME AND DATE$ LEA BUFF+OWRESTS(PC),A0 PUT ADDRESS TRAP #1 GET IT RTS PAGEO*******************************************************************************#*ˆ**�FORMAT�OWNER�RECORD�AND�OUTPUTO*******************************************************************************FMTOWNER EQU *+ LEA BUFF(PC),A0 START OF OWNER RECORD READ$ LEA CMDBUF(PC),A5 BUFFER FOR OUTPUT' MOVE.L (A0),D0 FETCH KEY (USER NUMBER) BSR BDCONV CONVERT TO ASCII% OR.L #'0000',D0 FORCE LEADING ZEROES BSR PUTREG4 TO OUTPUT BUFFER/ LEA BUFF+OWDEPTS(PC),A0 GET DEPARTMENT ADDRESS* MOVE.L #OWDEPTC,D6 DEPARTMENT FIELD COUNT" BSR MOVEFLD MOVE DEPARTMENT FIELD) LEA BUFF+OWNAMES(PC),A0 GET NAME ADDRESS$ MOVE.L #OWNAMEC,D6 NAME FIELD COUNT BSR MOVEFLD MOVE NAME FIELD SUB.L #1,A5 NO SPACE$ CLR.L D1 CLEAR IN CASE DATE IS ZERO7 MOVE.L BUFF-PBA+OWLLOFFS(A6),D0 FETCH LAST LOGOFF DATE BEQ.S FMTOWN1 NONE TO CONVERT BSR ODATCONV CONVERT DATE FMTOWN1 EQU * OR.W #'00',D1 FORCE ZEROES OR.L #'0000',D0 FORCE ZEROES MOVE.B #'/',D5 SEPARA TOR BSR PUTDTIM MOVE DATE4 MOVE.L BUFF-PBA+OWLLOFFS+4(A6),D0 FETCH LOGOFF TIME BSR TIMECONV CONVERT TIME OR.W #'00',D1 FORCE ZEROES OR.L #'0000',D0 FORCE ZEROES MOVE.B #':',D5 TIME SEPARATOR BSR PUTDTIM TRANSFER TIME6 MOVEM.L BUFF-PBA+OWCTIMS(A6),D0-D1 FETCH ELAPSED TIME" BSR ELAPTIME COMPUTE ELAPSED TIME( BSR LAPSEPUT PUT ELAPSED TIME IN BUFFER1 MOVE.L BUFF-PBA+OWSCNTS(A6),D0 GET SESSION COUNT* BSR BDCONV CONVERT SESSION COUNT TO ASCII# BSR PUTREG4 TRANSFER SESSION COUNT$ CLR.L D1 CLEAR IN CASE DATE IS ZERO* MOVE.L BUFF-PBA+OWRESTS(A6),D0 RESET DATE BEQ.S FMTOWN2 NONE TO CONVERT BSR ODATCONV CONVERT DATE FMTOWN2 EQU * ROL.W #8,D1 POSITION YR OR.B #'0',D1 FORCE DIGIT MOVE.B D1,(A5)+ ROL.W #8,D1 POSITION 2ND DIGIT OR.B #'0',D1 FORCE DIGIT MOVE.B D1,(A5)+ BSR PUTD0 PUT MO/DAY0 MOVE.L BUFF-PBA+OWRESTS+4(A6),D0 GET RESET TIME BSR TIMECONV CONVERT TIME BSR PUTD0 HOURS/MINUTES CLR.B (A5) OUTPUT TERMINATOR LEA CMDBUF(PC),A5 START OF LINE BRA OUTMSG OUTPUT LINE PAGEO********************************************************************************&*ˆ**�FORMAT�PASSWORD�RECORD�AND�OUTPUT*O******************************************************************************* FMTPASS EQU *" LEA PASSKEY(PC),A0 ADDRESS OF KEY LEA CMDBUF(PC),A5 PUT ADDRESS MOVE.L (A0)+,D0 GET KEY BSR BDCONV CONVERT TO ASCII OR.L #'0000',D0 FORCE DIGITS MOVE.B #'=',D5 SEPARATOR BSR PUTREG4 PUT IN BUFFER# MOVE.L #PWRECL-PWKSIZ,D6 GET COUNT BSR MOVEFLD MOVE PASSWORD CLR.B (A5) PUT TERMINATOR# LEA CMDBUF(PC),A5 START OF MESSAGE$ BRA OUTMSG OUTMSG OUTPUT AND RETURN PAGEO********************************************************************************)*ˆ**�CREATE�OWNER�FILE�FROM�PASSWORD�FILE*O********************************************************************************-*ˆ**�READ�SEQUENTIAL�ENTRIES�IN�PASSWORD�FILE* UPDATE EQU *( LEA ASSIPAR(PC),A0 ASSIGN PASSWORD FILE BSR ASGN ASSIGN IT& LEA ASSIPARA(PC),A0 ASSIGN OWNER FILE BSR ASGN ASSIGN IT UPDATE5 EQU *3 LEA READ1PAR(PC),A0 READ NEXT PASSWORD FILE RECORD TRAP #2 READ BEQ.S UPDAT10 OK CMP.B #ISTAEOF,D0 END OF FILE?) BEQ.S UPDAT100 YES, END OF PASSWORD FILE> BRA ERROROUT OUTPUT ERROR MESSAGE AND RETURN TO COMMAND INPUT*"*ˆ**�USE�KEY,�PREPARE�BLANK�RECORD* UPDAT10 EQU * LEA PASSKEY(PC),A1 PASSWORD KEY LEA BUFF(PC),A2 WRITE BUFFER MOVE.L (A1),(A2)+ TRANSFER KEY‰MOVE.L„#BUFF-PBA+OWLLOFFS,D7 ‰ADD.L…A6,D7&*œESTABLISH�ADDRESS�TO�COMPARE�AGAINST UPDAT15 EQU *‰CMP.L…D7,A2�END�OF�OWNER�INFO? BEQ.S UPDAT20 YES+ MOVE.B #' ',(A2)+ PUT SPACES IN OWNER INFO BRA UPDAT15 CONTINUE UPDAT20 EQU *‰MOVE.L„#BUFF-PBA+OWRECL,D7 ‰ADD.L…A6,D7&*œESTABLISH�ADDRESS�TO�COMPARE�AGAINST UPDAT20X:‰CMP.L…D7,A2…END�OF�BUFFER? BEQ.S UPDAT30 YES CLR.L (A2)+ CLEAR BUFFER BRA UPDAT20X CONTINUE*"*ˆ**�ATTEMPT�WRITE�OF�BLANK�RECORD* UPDAT30 EQU *3 LEA WRITEPAR(PC),A0 PARAMTER BLOCK TO WRITE RECORD TRAP #2 BEQ UPDATE5 CONTINUE( CMP.B #ISTARE,D0 RECORD ALREADY EXISTS? BEQ UPDATE5 CONTINUE BRA ERROROUT ERROR EXIT*!*ˆ**�READ�OWNER�FILE�SEQUENTIALLY*UPDAT100 EQU *2�CLR.L�BUFF-PBA(A6)‡READ�FIRST�ACCOUNT�FILE�RECORD0 LEA READIPAR(PC),A0 READ INITIAL ACCOUNT RECORD TRAP #2 BEQ.S UPDAT110 OK �CLR.L�BUFF-PBA(A6)ƒKEY�=�USER�0> BRA ERROROUT OUTPUT ERROR MESSAGE AND RETURN TO COMMAND INPUT*'*ˆ**�READ�CORRESPONDING�PASSWORD�RECORD*UPDAT110 EQU *9�MOVE.L�BUFF-PBA(A6),PASSKEY-PBA(A6)„TRANSER�USER�NO./KEY; LEA READCPAR(PC),A0 READ PASSWORD FILE FOR USER IN ACCOUNT TRAP #2 BEQ.S UPDAT150 OK1 CMP.B #ISTARN,D0 TEST FOR ABSENT PASSWORD RECORD BNE ERROROUT OTHER ERROR*3*ˆ**�DELETE�OWNER�RECORD�FOR�ABSENT�PASSWORD�RECORD*= LEA DELETPAR(PC),A0 PARAMETER BLOCK TO REMOVE ACCOUNT RECORD TRAP #2 BEQ.S UPDAT150 OK> BRA ERROROUT OUTPUT ERROR MESSAGE AND RETURN TO COMMAND INPUTUPDAT150 EQU *- LEA READ2PAR(PC),A0 READ NEXT ACCOUNT RECORD TRAP  #2 BEQ UPDAT110 CONTINUE' CMP.B #ISTAEOF,D0 END OF ACCOUNT FILE? BEQ ACCTEXIT DONE8 BRA ERROROUT OUTPUT MESSAGE AND RETURN TO COMMAND INPUT PAGEO******************************************************************************** *ˆ**�BUILD�NEW�ACCOUNTING�RECORD*O*******************************************************************************BUILDNEW EQU *9 LEA ASSIPARA(PC),A0 PARAMETER BLOCK TO ASSIGN OWNER FILE BSR ASGN BSR USERNUM GET USER NUMBER7�MOVE.L�D3,BUFF-PBA(A6)ƒPUT�USER�NUMBER�IN�KEY�POSITIONBUILDNEX EQU *2 MOVE.L #OWDEPTC,D6 CHARACTER COUNT FOR DEPARTMENT$ LEA BUFF+OWDEPTS(PC),A3 PUT ADDRESS BSR GETFLD GET DEPARTMENT FIELD2 MOVE.L #OWNAMEC,D6 CHARACTER COUNT FOR NAME FIELD$ LEA BUFF+OWNAMES(PC),A3 PUT ADDRESS BSR GETFLD GET NAME FIELD& BSR RESETIT RESET ACCUMULATION FIELDS4 LEA WRITEPAR(PC),A0 PARAMETER BLOCK TO WRITE RECORD TRAP #2 BEQ ACCTEXIT BRANCH GOOD WRITE! CMP.B #ISTARE,D0 ALREADY EXISTS? BEQ.S ENTER60 OK, MODIFY IT BRA ERROROUT ERROR EXIT* PAGEO********************************************************************************$*ˆ**�ENTER�OWNER�DEPARTMENT�AND�NAME*O*******************************************************************************ENTERNEW EQU * BSR REDOWNER' BNE BUILDNEX DOES NOT EXIST, BUILD NEW ENTER20 EQU *" MOVE.L #OWDEPTC,D6 EXPECTED COUNT$ LEA BUFF+OWDEPTS(PC),A3 PUT ADDRESS BSR GETFLD GET DEPARTMENT FIELD ENTER40 EQU *" MOVE.L #OWNAMEC,D6 EXPECTED COUNT$ LEA BUFF+OWNAMES(PC),A3 PUT ADDRESS BSR GETFLD GET NAME ENTER60 EQU *+ LEA UPDATPAR(PC),A0 UPDATE PARAMETER BLOCK TRAP #2% BEQ.S DISPLAY1 DISPLAY RESULTS, EXIT BRA ERROROUT ERROR EXIT PAGEO*********************************************************************************ˆ**�DELETE�ENTIRE�OWNER�RECORD*O*******************************************************************************DELENTRY EQU *9 LEA ASSIPARA(PC),A0 PARAMETER BLOCK TO ASSIGN OWNER FILE BSR ASGN ASSIGN IT BSR USERNUM GET USER NUMBER�MOVE.L�D3,BUFF-PBA(A6)…PUT�KEY2 LEA DELETPAR(PC),A0 DELETE RECORD PARAMETER BLOCK TRAP #2 BEQ ACCTEXIT BRANCH OK BRA ERROROUT ERROR EXIT* PAGEO********************************************************************************$*ˆ**�DISPLAY�SINGLE�SPECIFIED�RECORD*O******************************************************************************* DISPLAY EQU * BSR REDOWNER BNE ERROROUT ERROR EXIT MOVE.L A0,-(A7) SAVE POINTER' LEA CLOS2(PC),A0 CLOSE PARAMETER BLOCK TRAP #3& LEA HEADER(PC),A5 HEADER LINE MESSAGE BSR OUTMSG OUTPUT MOVE.L (A7)+,A0 RESTORE POINTERDISPLAY1 EQU * BSR FMTOWNER BRA ACCTEXIT* PAGEO*********************************************************************************ˆ**�DISPLAY�ALL�RECORDS*O*******************************************************************************DSPLYALL EQU *$ LEA ASSIPARA(PC),A0 OPEN OWNER FILE BSR ASGN LEA HEADER(PC),A5 HEADER LINE BSR OUTMSG OUTPUTDSPLYA10 EQU * BSR REDNEXT READ NEXT RECORD TST.B D0 TEST STATUS' BMI USETIME RETURN MINUS => EOF (DONE)& BSR FMTOWNER FORMAT AND OUTPUT RECORD BSR ACCUM CUMULATE USAGE BRA DSPLYA10 CONTINUE* PAGEO********************************************************************************-*ˆ**�DISPLAY�RECORDS�FOR�DEPARTMENT�SPECIFIED*O*******************************************************************************DPLYDEPT EQU *+ LEA ASSIPARA(PC),A0 ASSIGN PARAMETER BLOCK BSR ASGN LEA CMDBUF(PC),A0 GET ADDRESS LEA DEPART(PC),A3 PUT ADDRESS MOVE.L #8,D6 FETCH COUNT BSR GETFLD GET DEPARTMENT FIELD LEA HEADER(PC),A5 HEADER LINE BSR OUTMSG OUTPUTDPLYDEP1 EQU * BSR REDNEXT READ NEXT RECORD TST.B D0 TEST DONE�BMI.S‚USETIME�DONE. MOVEM.L DEPART-PBA(A6),D1-D2 FETCH DEPARTMENT8 LEA BUFF+OWDEPTS(PC),A3 CORRESPONDING ADDRESS IN RECORD' CMP.L (A3)+,D1 COMPARE DEPARTMENT NAME BNE DPLYDEP1 SKIP THIS ONE" CMP.L (A3),D2 COMPARE SECOND HALF BNE DPLYDEP1 SKIP THIS ONE' BSR FMTOWNER FORMAT AND DISPLAY RECORD B SR ACCUM CUMULATE TIME BRA DPLYDEP1 CONTINUE* PAGEO*********************************************************************************ˆ**�RESET�ONE�RECORD*O******************************************************************************* RESET1 EQU * BSR REDOWNER READ RECORD, MOVE.L BUFF-PBA+OWCTIMS(A6),CUMTIME-PBA(A6)0 MOVE.L BUFF-PBA+OWCTIMS+4(A6),CUMTIME-PBA+4(A6)& BSR DPLYSUM DISPLAY USAGE BEING RESET BSR RESETIT RESET BSR UPRECORD UPDATE WRITE BRA.S ACCTEXIT* PAGEO*********************************************************************************ˆ**�RESET�ALL�RECORDS*O*******************************************************************************RESETALL EQU *$ LEA ASSIPARA(PC),A0 OPEN OWNER FILE BSR ASGN ASSIGN ITRESETA10 EQU * BSR REDNEXT READ NEXT RECORD TST.B D0 TEST STATUS) BMI.S USETIME MINUS RETURN => EOF (DONE) BSR ACCUM CUMULATE USAGE BSR RESETIT RESET BSR UPRECORD UPDATE WRITE BRA RESETA10 CONTINUEO*********************************************************************************ˆ**�DISPLAY�PASWWORD*O*******************************************************************************DPLYPASS EQU *3 LEA ASSIPAR(PC),A0 ASSIGN PASSWORD PARAMETER BLOCK BSR ASGN BSR.S USERNUM GET USER NUMBER"�MOVE.L�D3,PASSKEY-PBA(A6)…PUT�KEY LEA READCPAR(PC),A0 READ RANDOM TRAP #2 BEQ.S DPLYPAS1 BRANCH GOOD BRA.S ERROROUT ERROR EXITDPLYPAS1 EQU * BSR FMTPASS BRA.S ACCTEXIT PAGE**ˆ**�DISPLAY�USAGE�TIME* USETIME EQU * BSR DPLYSUM DISPLAY USAGE TIME**ˆ**�UTILITY�EXIT*ACCTEXIT EQU * CLR.L D0 RESET UPPER HALF" MOVE.L #0,A0 CLEAR ABORT REGISTER ACCTBYE EQU *" MOVE.W #TERM,D0 TERMINATE COMMAND TRAP #1 DONE!!!**ˆ**�USERNUM�SUBROUTINE* USERNUM EQU *( LEA CMDBUF(PC),A0 START OF INPUT BUFFER0 BSR ASCVAL CONVERT ASCII STRING TO BINARY VALUE TST.L D1 NUMBER FOUND? BPL.S USERNUM1 YES, MOVE.L #EM_NONUM,D0 NO NUMBER ERROR MESSAGE BRA.S ERROROUT ERROR EXITUSERNUM1 EQU * CMP.L #9999,D3 TEST SIZE BLS.S USERNUMX BRANCH OK ADD.L #4,A7 POP RETURN' MOVE.L #EM_VSIZE,D0 SIZE ERROR MESSAGE BRA.S ERROROUT ERROR EXITUSERNUMX EQU * RTS**ˆ**�OUTPUT�MESSAGE* OUTMSG EQU * MOVE.L D0,-(A7) SAVE ERROR CODE2 LEA ERRORPAR(PC),A0 ERROR MESSAGE PARAMETER BLOCK* MOVE.L A5,12(A0) START ADDRESS OF MESSAGE OUTMSG1 EQU *& TST.B (A5)+ SEARCH FOR END OF MESSAGE BNE OUTMSG1 CONTINUE SUB.L #1,A5 ADJUST BACK! MOVE.L A5,16(A0) PUT END ADDRESS TRAP #2 OUTPUT MESSAGE# MOVE.L (A7)+,D0 REFETCH ERROR CODE RTS**ˆ**�ERROR�TERMINATION*ERROROUT EQU */�MOVEM.L�D0/A0,ERRORPAR-PBA(A6)…SAVE�PARAMETERS- MOVEM.L ERRPAR-PBA(A6),D0/A0 INITIALIZE REGS4 MOVE.L #(LDFLUN<<16+CDFLUN),8(A0) PUT LOGICAL UNITS CLR.L 12(A0) NO PLUG POOL CLR.L 16(A0) NO PLUG POOL TRAP #4, MOVE.L ERRORPAR-PBA(A6),D0 FETCH ERROR CODE! SWAP D0 ERROR CODE TO UPPER HALF MOVE.W #8000,A0 BRA ACCTBYE TERMINATE* END ACCTé;ŠTTL„ANALCCBS.AIˆ-�Crash/System�analysis�-�DUMPANAL/SYSANALŠPAGE9**********************************************************�INCLUDE�FILE:�ANALCCBS.AI�*9********************************************************* ŠSECTION�0**…CHANNEL�CONTROL�BLOCK�HEADER**PCCBHDAƒENDLINEŠDC.Bƒ'ˆCHANNEL�CONTROL�BLOCKS'ŠENDLINEŠDC.Bƒ'ˆ----------------------'ŠENDLINEPCCBHDAE‚EQU„*-1ŠDS.Wƒ0PCCBHD„DC.Bƒ'�'(ŠDC.Bƒ'„CHANNEL�CONTROL�BLOCK�--�LEVEL�'PCCBHDLƒDC.Bƒ0ŠDC.Bƒ'‚--�VECTOR�#�'PCCBHDVƒDC.Bƒ'ƒ'PCCBHDEƒEQU„*-1ŠDS.Wƒ0**‡EQUATE�FIELDS�WITHIN�CCB* CCBALL„EQU„$4CCBVECTƒEQU„$24CCBPPRIO‚EQU„$25ŠPAGE ŠSECTION�8**‡PRINT�CHANNEL�CONTROL�BLOCKS*ŠXREF.S�CCBHD,NEWPAGE ŠXREF.S�ADROFST2,ADRBGND,CNTBYTEŠX REF.S�PMDUMP,CONVDEC3,RDBUF ŠXDEFƒCRCCBS*/CRCCBS„MOVE.L�CCBHD(A3),D4‡ADDRESS�OF�FIRST�CCBŠBEQ„CRCCB4�BRANCH�IF�NONE ŠBSR„NEWPAGEŠPRINT‚PCCBHDA*$CRCCBA„WANTƒ#18,#2�TEST�FOR�NEW�PAGE,ŠMOVE.L�D4,ADROFST2-MBD(A6)�STARTING�ADDRESS#ŠCLR.L‚ADRBGND-MBD(A6)„COUNT�FROM�0ŠMOVE.L�#$100,CNTBYTE-MBD(A6) ŠBSR„PMDUMP ŠPRINTF�SPACE#ŠLEA„RDBUF(PC),A5‡WHERE�CCB�LOCATED$ŠMOVE.B�CCBPPRIO(A5),D0„LEVEL�NUMBERŠADD.B‚#$30,D0ŒCONV�TO�ASCIIŠLEA„PCCBHDL(PC),A0ŠMOVE.B�D0,(A0)ŠMOVE.B�CCBVECT(A5),D0$ŠLEA„PCCBHDV(PC),A1…WHERE�IN�MESSAGE ŠBSR„CONVDEC3ŠPRINTF�PCCBHD*CRCCBA1ƒPRINTF�SPACE1ŠMOVE.L�RDBUF+CCBALL-MBD(A6),D4�NEXT�CCB�IN�CHAIN ŠBNE„CRCCBA CRCCB4„RTSééeA;ŠTTL„ANALDATA.AIˆ-�Crash/System�analysis�-�DUMPANAL/SYSANALŠPAGE9**********************************************************�INCLUDE�FILE:�ANALDATA.AI�*9********************************************************* ŠSECTION.S�0 BEGDATAƒEQU„* ŠXDEFƒMBD MBD‡EQU„*+VERSIONƒDC.Bƒ'021585'‹DATE�OF�LAST�REVISION(ŠDC.Bƒ'�'�BLANK�INDICATES�CLEAN�ASSEMBLY!ŠDC.Bƒ'4'�MAJOR�VERSA-DOS�RELEASE ŠDS.Bƒ$80 STACK…EQU„*INITDREG‚EQU„*.MONITORƒDC.Lƒ0,0�MONITOR�TASK�NAME�AND�SESSION"VOLNAMEƒDC.Lƒ0’DEFAULT�VOLUME�NAME"USERNUMƒDC.Lƒ0’DEFAULT�USER�NUMBER CATALOGƒDC.Lƒ0,0�DEFAULT�CATALOG!CMDLNG„DC.Lƒ0’COMMAND�LINE�LENGTH%LOGUNTSƒDC.Lƒ0’LOGICAL�UNITS�ASSIGNEDTASKNAMƒDC.Lƒ0’THIS�TASK'S�NAME"TASKSESƒDC.Lƒ0’THIS�TASK'S�SESSION"USERNUML‚DC.Lƒ0’LOG�ON�USER�NUMBER*(CLINE…COMLINE�80�BUFFER�FOR�COMMAND�LINE*PARSAREG‚EQU„*ŠXDEFƒOUTPSRT,SYSPAROF#OUTPSRTƒDC.Lƒ0’OUTPUT�FIELD�ADDRESS"OPTSRT„DC.Lƒ0’OPTION�FIELD�ADDRESS6SYSPAROF‚DC.Lƒ$900�SYSPAR�offset�(Default�to�EXORmacs)*2FATLCNTƒDC.Wƒ5’NUMBER�OF�TIMES�TO�TRY�BEFORE�ABORT*"ASQPB…DC.Lƒ0,0�TASK,SESSION�=�SELFŠDC.Bƒ7,30�STATUS,MAX�MSGŠDC.Lƒ200�SIZE�OF�QŠDC.Lƒ0,0�ASR�ADDRESS**…FHS�AND�IOS�PARAMETER�BLOCKS*0BRKIOS„DC.WƒIOBRKS�CLAIM�BREAKS�FOR�THIS�SESSION ŠDC.WƒIOPCAD ŠDC.Wƒ5,0)ŠDC.Lƒ0,0,0,0,0ŠADDRESS�TO�GO�TO�ON�BREAKŠPAGE*4*‡ERROR�MESSAGE�USED�BY�MANY�TABLE�PRINTING�ROUTINES*ŠXDEFƒERMSG1,ERMSG1EERMSG1„ENDLINEEŠDC.B‚'*****�ERROR�-�BAD�START/END/COUNT�-�PRINTOUT�TERMINATED�*****'ŠENDLINEERMSG1EƒEQU„*-1ŠDS.Wƒ0 ŠXDEFƒERRPBLK*'* Error message handler parameter block*4ERRPBLKƒDC.Lƒ0’User�reg�D0�contains�ERRMSG�key�value/ŠDC.Lƒ0’User�reg�A0�points�at�I/O�control�block0ŠDC.Bƒ0’Error�options�[bit�0�-->�query�response](ŠDC.BƒLDFLUN�Logging�logical�unit�numberŠDC.Bƒ0’Query�return�character.ŠDC.BƒCDFLUN�Command�input�logical�unit�number(ŠDC.Lƒ0’Beginning�of�user�text�plug�pool"ŠDC.Lƒ0’End�of�user�text�plug�poolnD:ŠTTL„ANALGST.AI‰-�Crash/System�analysis�-�DUMPANAL/SYSANALŠPAGE9**********************************************************�INCLUDE�FILE:�ANALGST.AIž*9********************************************************* ŠSECTION�0*%*�G�L�O�B�A�LƒS�E�G� M�E�N�TƒT�A�B�L�E*GSTBHD„ENDLNLFŠDC.Bƒ'ˆGLOBAL�SEGMENT�TABLE'ŠENDLINEŠDC.Bƒ'ˆ--------------------'ŠENDLINE:ŠDC.B‚'�SESSION„---�NAME�---‚ATTRƒCNT‚SRTADR„ENDADR‚BYTES'ŠENDLINEGSTBHDEƒEQU„*-1ŠDS.Wƒ0**„GST�DETAIL�LINE* GSTB†DC.Bƒ'‚'ŠFLD„GSHDSS,<'�'>,6,CƒSESSION ŠFLD„GSHDNM,<'‚'>,8,C‚NAME�(HEX)"ŠFLD„GSHNMA,<'�'>,4,CƒNAME�(ASCII) ŠFLD„GSHDAT,<'‚'>,4,C‚ATTRIBUTESŠFLD„GSHDCT,<'‚'>,4,C‚USE�COUNT!ŠFLD„GSHDPA,<'‚'>,4,C‚PHY�ADDRESS.ŠFLD„GSHDNB,<'00�TO�XXXXFF‚'>,4,C�NUMBER�BYTES2ŠFLD„GSHDSZ1,<'00‚'>,4,C�SIZE�IN�1024�BYTES‚012585ŠFLD„GSHDSZ2,<'.'>,2,C ŠDC.Bƒ'K�' GSTBE…EQU„*-1ŠDS.Wƒ0ŠPAGE ŠSECTION�8*,*‚*�*�*‚PRINT�THE�GLOBAL�SEGMENT�TABLE‚*�*�** ŠXDEFƒGSTBLŠXREF.S�RDBUF,GSTBEG,PDSKERR*GSTBL…TST.L‚GSTBEG(A3)-ŠBEQ„GSTBLR�Branch�if�no�global�segment�table+ŠWANTƒ#12,#2�CHECK�FOR�ENOUGH�LINES�ON�PAGEŠPRINT‚GSTBHD�PRINT�THE�HEADING!ŠLEA„RDBUF(PC),A4‡START�OF�BUFFER*ŠRD…#20,GSTBEG(A3),(A4),PDSKERR�GET�HEADER ŠCLR.L‚D2ŠCLR.L‚D4‘0125850ŠMOVE.W�GSTNPAGE(A4),D2„SIZE�OF�TABLE�(IN�PAGES)ŠLSL.L‚#8,D2ŽCONVERT�TO�BYTES#ŠCMP.L‚#MAXBUF,D2‰GREATER�THAN�MAX?ŠBLE.S‚GSTBL2�BRANCH�IF�NO#ŠMOVE.L�#MAXBUF,D2‰IF�YES�-�USE�MAXGSTBL2„MOVE.L�A4,D6$ŠADD.L‚D2,D6ŽD6=END�OF�TABLE�ADDRESS,ŠRD…D2,GSTBEG(A3),(A4),PDSKERR�READ�AN�ENTRY&ŠMOVE.W�GSTLENT(A4),D7…MAX�ENTRY�COUNTŠBEQ„GSTBLR�BRANCH�IF�NONE ŠLEA„GSTENTRY(A4),A5„FIRST�ENTRY*&GSTBL4„TST.W‚GSTCNT(A5)‰TEST�USE�COUNT"ŠBEQ„GSTBL6�SKIP�ENTRY�IF�NOT�USED2ŠTST.W‚GSTSESSN(A5)‰IS�SESSION�IN�BINARY?‚<<012585ŠBNE.S‚GSTBL5�NO:ŠOR.Wƒ#$30,GSTSESSN+2(A5)‚SET�LAST�DIGIT�TO�ASCII‚012585>>.GSTBL5„MVASC‚4,GSTSESSN(A5),GSHDSS(PC)�SESSION*ŠMVHEX‚4,GSTNAME(A5),GSHDNM(PC)�NAME�(HEX),ŠMVASC‚4,GSTNAME(A5),GSHNMA(PC)�NAME�(ASCII)wF€*ŠMVHEX‚2,GSTATTR(A5),GSHDAT(PC)�ATTRIBUTES(ŠMVHEX‚2,GSTCNT(A5),GSHDCT(PC)�USE�COUNTŠMOVE.W�GSTNP(A5),D4‡#�PAGES%ŠMOVE.L�GSTPA(A5),D3‡STARTING�ADDRESSŠLSR.L‚#8,D3ŽCONVERT�TO�PAGE�#ŠADD.W‚D3,D4ŽEND�ADDRESS+1ŠSUB.W‚#1,D4ŽEND�ADDRESS-ŠLEA„GSHDPA(PC),A1ŠWHERE�TO�PUT�START�ADDRESS'ŠLEA„GSHDNB(PC),A2ŠWHERE�TO�PUT�#�BYTES#ŠLEA„GSHDSZ1(PC),A0‰WHERE�TO�PUT�#K ŠBSR„PSEGSIZ ŠPRINT‚GSTB-GSTBL6„LEA„GSTEL(A5),A5‡ADDRESS�OF�NEXT�ENTRYŠSUB.W‚#1,D7ŽDECREMENT�COUNTŠBEQ.S‚GSTBLR�BRANCH�IF�DONEŠCMP.L‚A5,D6ŽTOO�FAR?ŠBGT„GSTBL4�NO,COUNTINUE GSTBLR„RTSééééé 9ŠTTL„ANALIO.AIŠ-�Crash/System�analysis�-�DUMPANAL/SYSANALŠPAGE9**********************************************************�INCLUDE�FILE:�ANALIO.AIŸ*9********************************************************* ŠSECTION�0/PRINTERƒDC.Wƒ0’NON-ZERO�IF�OUTPUT�IS�TO�PRINTER#PAGESIZƒDC.Wƒ0’SIZE�OF�PRINTER�PAGE ŠXDEFƒCNTLIN(CNTLIN„DC.Wƒ0’COUNT�OF�LINE�LEFT�ON�PAGE0PAGEONEƒDC.Wƒ0’FLAG�1ST�LINE�-�NO�SLEW�ON�HEADERŠPAGE**…FHS�AND�IOS�PARAMETER�BLOCKS* ŠXDEFƒLISTFHS(LISTFHSƒDC.WƒFHASGN�ASSIGN�OUTPUT�DEVICE ŠDC.WƒFOPEWŠDC.Wƒ3 ŠDC.Bƒ'„'ŠDC.Wƒ0 ŠDC.Bƒ'’' ŠDC.Lƒ$FF ŠDC.Wƒ0,0,0* ŠXDEFƒMSGIOS+MSGIOS„DC.WƒIOWRIT�SEND�MESSAGE�TO�OPERATORŠDC.WƒIOPFOR+IOPCNP ŠDC.WƒLDFLUNŠDC.Wƒ0ŠDC.Lƒ0,0,0,0,0* ŠXDEFƒMSGIIOS.MSGIIOSƒDC.WƒIOREAD�READ�COMMAND�FROM�OPERATORŠDC.WƒIOPFOR+IOPCNP ŠDC.WƒCDFLUN ŠDC.Wƒ0,0,0ŠDC.Lƒ0ŠDC.Lƒ0 ŠDC.Lƒ0,80*,LSTIOS„DC.WƒIOWRIT�FORMATTED�WRITE�TO�OUTPUT ŠDC.WƒIOPFORŠDC.WƒLDFLUN,0ŠDC.Lƒ0,0,0,0,0,0*ŠXDEFƒINPTBUF,PRTLININPTBUFƒDS.Bƒ80ŠDS.Bƒ2PRTLIN„DS.Bƒ80ŠPAGE ŠSECTION�8**‡INPUT/OUTPUT�SUBROUTINES*L******************************************************************************ˆSET�UP�NEW�OUTPUT�DEVICE+*‹OUTPSRT‚HAS�POINTER�TO�OUTPUT�DESCRIPTION*ŠXREFƒEDITFILE*)NEWOUT„LEA„LISTFHS(PC),A0‰FHS�PARAM�BLOCK/ŠMOVE.W�#FHCLOS,(A0)‡CLOSE�WHATEVER�IS�NOW�OPENŠTRAPƒ#36ŠMOVE.L�OUTPSRT-MBD(A6),A0…ADDRESS�OF�FILE�OR�DEV�NAMEŠCMP.L‚#0,A0ŽSYNTAX�ERROR�IF�0ŠBEQ.S‚NEWOUT2Œ*3NEWOUT1ƒMOVEM.L�A3/A6,-(A7)‡SAVE�RESERVED�REGISTERS)ŠMOVE.L�A6,A3ŽSAVE�A6�FOR�USE�IN�DEFAULTSŠLEA„LISTFHS(PC),A6)ŠBSR„DEFAULTS‹SET�DEFAULTS�IN�PARAM�BLOCK.ŠBSR„EDITFILE‹FILL�IN�PARAM�BLOCK�FROM�REQUEST/ŠMOVEM.L�(A7)+,A3/A6‡RESTORE�RESERVED�REGISTERS&ŠTST.L‚D0‘SYNTAX�ERROR�IN�DESCRIPTION?ŠBPL.S‚NEWOUT4ŒBRANCH�IF�NO>ŠBLO.S‚PRTLXI0ŒBranch�if�noŠENDSUB*%PRTLXI2ƒBSR.S‚PRTLASKŒASK�ABOUT�RETRY ŠBRA„PRTLXI6**†DO�FORMATTED�WRITE�TO�OUTPUT**†PRTLXX�-�PRINT�ONE�LINE&*†PRTL80�-�PRINT�ONE�75�CHARACTER�LINE*ŠXDEFƒPRTL80,PRTLXX$PRTL80„LEA„74(A1),A2ŠSET�END�ADDRESS PRTLXX„BEGSUB,ŠTST.W‚PRINTER-MBD(A6)„IS�OUTPUT�TO�PRINTER?ŠBEQ.S‚PRTLXX2ŒBRANCH�IF�NO-ŠSUB.W‚#1,CNTLIN-MBD(A6)‚DECREMENT�LINE�COUNT,ŠBPL.S‚PRTLXX2ŒBRANCH�IF�NEW�PAGE�NOT�NEEDED ŠBSR„NEWPAGE8PRTLXX2ƒMOVE.L�A1,LSTIOS+IOSSAD-MBD(A6)�STARTING�ADDRESS/ŠMOVE.L�A2,LSTIOS+IOSEAD-MBD(A6)�ENDING�ADDRESSPRTLXX4ƒLEA„LSTIOS(PC),A0ŠTRAPƒ#2‘OUTPUT�ONE�LINEŠBEQ.S‚PRTLXX5ŒOK‚<<012585ŠCMP.B‚#$C6,D0ŒBREAK�ENTERED?ŠBNE.S‚PRTLXX6ŒNO,�ERROR(ŠBRA„ANSMSG�YES,�TELL�USER�BREAK�ENTEREDPRTLXX5ƒENDSUB”012585>>*%PRTLXX6ƒBSR.S‚PRTLASKŒASK�ABOUT�RETRY ŠBRA„PRTLXX4*%*„PRINTER�ERROR�-�ASK�USER�WHAT�TO�DO*5PRTLASKƒLEA„OUTERRD0(PC),A1„CONVERT�ERROR�CODE�TO�HEX ŠBSR„CONVHEX4,<\2>,XŠMOVE.W�#IOPCNP,IOSOPT(A0)ŠLEA„MSGIIOS(PC),A0ŠTRAPƒ#2 ŠBSR„SBARG ŠIFNCƒ'\3','' �IFC„'\0','' �BNE„CMDPABRT�ENDC �IFNCƒ'\0',''�BNE.\0�CMDPABRT�ENDCŠENDCŠENDM**(*****************************************‡FIELD�FORMATTING�MACRO‰*…(*****************************************'*ƒFLD�ASM-LABEL,TEXT,DATA-SIZE,CONTINUE* FLD‡MACROŠDC.Bƒ\2\1ˆDCB.B‚\3,$20ŠIFNCƒ'C','\4'�ENDLINEŠENDCŠENDM** End of line MACRO* ENDLINEƒMACROŠDS…0’Insure�even�byte�boundary-ŠDC.Bƒ0’Force�carriage�return�to�odd�boundaryŠDC.BƒCR‘Carriage�returnŠENDM*:* End of line MACRO with extra line feed after end of line* ENDLNLFƒMACROŠENDLINE5ŠDC.Bƒ0,CR�Extra�carriage�return�will�force�line�feedŠENDM**†SUBROUTINE�START�AND�END* BEGSUB„MACROŠMOVE.L�A6,-(A7)ŠLEA„BEGDATA(PC),A6ŠENDM* ENDSUB„MACROŠMOVE.L�(A7)+,A6ŠRTSŠENDM*)******************************************‹UTILITY�MACROSŽ*)******************************************+*ˆRD‚BYTE-COUNT,FILE-ADDR,MEMORY-ADDR,ERROR*RDˆMACROŠIFNCƒ'D2','\1' �MOVE.L�\1,D2ŠENDCŠIFNCƒ'D1','\2' �MOVE.L�\2,D1ŠENDC ŠLEA„\3,A1 ŠIFC„'\5',''�XREF.S�MOVEMEMŠENDC ŠBSR„MOVEMEM ŠIFC„'\0',''ŽBNE„\4ŠENDC ŠIFNCƒ'\0','' ŽBNE.\0�\4ŠENDCŠENDM**‚MOVE�TIME�TO�PRINT�LINE* ATIME…MACRO ŠMOVE.L�\1,D0ŠLEA„\2(PC),A1ŠXREF.S�CONVTIME ŠBSR„CONVTIMEŠENDM*.*�MOVE-HEX‚BYTE-COUNT,SOURCE-ADDR,DEST-ADDRESS*©w²I MVHEX…MACRO ŠIFEQƒ\1-1 �MOVE.B�\2,D0ŠENDC ŠIFEQƒ\1-2 �MOVE.W�\2,D0ŠENDC ŠIFEQƒ\1-3 �MOVE.L�\2,D0ŠENDC ŠIFEQƒ\1-4 �MOVE.L�\2,D0ŠENDC ŠLEA„\3,A1ŠXREF.S�CONVHEX\1ŠBSR„CONVHEX\1ŠENDM*0*�MOVE-ASCII‚BYTE-COUNT,SOURCE-ADDR,DEST-ADDRESS* MVASC…MACROŠMOVE.L�#\1,D1 ŠLEA„\2,A0 ŠLEA„\3,A1ŠXREF.S�MOVEASC ŠBSR„MOVEASCŠENDM**…WANT�-�CONDITIONAL�PAGE�SKIP* WANT†MACRO ŠIFC„'\3',''�XREF.S�CNTLINŠENDCŠLEA„CNTLIN(PC),A0ŠCMP.W‚\1,(A0) ŠBGT.S‚\@AŠXREF.S�NEWPAGE ŠBSR„NEWPAGEŠSUB.W‚\2,(A0) \@A‡EQU„*ŠENDM**…PRINT‚-‚PRINT�A�LINE* PRINT…MACRO ŠWANTƒ#1,#2ŠLEA„\1(PC),A1 ŠIFC„'\2',''�LEA„\1E(PC),A2ŠENDC ŠIFNCƒ'\2',''�LEA„\2(PC),A2ŠENDCŠXREF.S�PRTLXI ŠBSR„PRTLXIŠENDM CRˆSET„$0D LFˆSET„$0A PRINTF„MACROŠLEA„\1(PC),A1 ŠIFC„'\2',''�LEA„\1E(PC),A2ŠENDC ŠIFNCƒ'\2',''�LEA„\2(PC),A2ŠENDCŠXREF.S�PRTLXX ŠBSR„PRTLXXŠENDM*MAXBUF„EQU„$1400 éé éé;ŠTTL„ANALMAIN.AIˆ-�Crash/System�analysis�-�DUMPANAL/SYSANALŠPAGE9**********************************************************�INCLUDE�FILE:�ANALMAIN.AI�*9**********************************************************:*„THROUGHOUT�ALL�ROUTINES�---�A6�IS�OFFSET�TO�DATA�SEGMENT* A3�POINTS�TO�SYSPARS�BUFFER* ŠSECTION�8)BEGIN…LEA„STACK(PC),A7‹LOAD�STACK�POINTER)ŠLEA„BEGDATA(PC),A6‰START�OF�DATA�SEGMENT<ŠMOVEM.L�D0-D7/A0-A2,INITDREG-MBD(A6)�SAVE�INITIAL�REGISTERSŠLEA„ANSBRK(PC),A0†ASR�ADDRESS9ŠMOVE.L�A0,ASQPB+14-MBD(A6)�SAVE�ASR�ADDR�IN�PB�FOR�GTASQ<ŠMOVE.L�A0,BRKIOS+IOSCAD-MBD(A6)�SAVE�IN�CLAIM�BREAK�PB�ALSOŠERQ.GTASQ�ASQPB(PC) ŠIOSCALL�BRKIOS(PC)ˆCLAIM�BREAKS&ŠLEA„MSGIIOS(PC),A0…IN/OUT�PARAM�BLOCK&ŠLEA„INPTBUF(PC),A1…INPUT�BUFF�ADDRESS(ŠMOVE.L�A1,IOSSAD(A0)†SAVE�START�ADDRESSŠLEA„79(A1),A1&ŠMOVE.L�A1,IOSEAD(A0)†SAVE�ENDƒADDRESS**†INTERPRET�COMMAND�LINE*1DUMPA2„BSR„COMMANDL‹GO�CHANGE�OUTPUT�IF�REQUESTED*(*ˆif�S=$xxx�is�on�command�line�skip�next*ŠIF.B�D1��#'S'�THEN.S‹BRA.SƒDUMPA14ŠENDI**ˆgo�find�out�where�SYSPARM�is*&ŠXREF.S�SYSPARS,RUNNER,SYSPAR,EXCSTACK*ŠOPT‚MEXéééº'Ã*ËJÓ<0ŠFOR.L�D1�=�#$500�TO�#$2400�BY�#$100�DO.S‚021585'‹RD‚#$100,D1,SYSPARS(PC),NOTADDR‰021585.‹LEAƒSYSPARS(PC),A3…get�address�of�where�it�is7‹MOVE.L�EXCSTACK-SYSPAR(A3),D4‚this�addr�points�to�self-‹MOVE.L�RUNNER-SYSPAR(A3),A3ƒget�addr�of�!TCB*3‹IF.L�D4��D1�THEN.S†skip�!TCB�check�if�not�addrŒBRA.S‚NOTADDR‹ENDI*‹MOVE.L‚D1,D5�save�this ‹RD�#$100,A3,SYSPARS(PC),PDSKER6‹MOVE.L‚D5,D1�reset‹MOVE.L�SYSPARS(PC),D3ŠIF.L�D3��#'!TCB'�THEN.S(‹BRA.S‚FNDSYSP‹terminate�if�SYSPAR�foundŠENDI* NOTADDRƒEQU„**ŠENDF* FNDSYSPƒEQU„* ŠOPT„NOMEX**‰save�the�address�of�SYSPAR*ŠMOVE.L�D1,SYSPAROF-MBD(A6)***‡READ�IN�SYSTEM�PARAMETERS*4DUMPA14ƒPEA„CMDPRO(PC)‰PUT�ON�STACK�IN�CASE�OF�ERRORŠXREF.S�READSPŠBSR„READSP�GO�TO�READ**†CONVERT�TIME�FOR�HEADING�LINE* ŠXREF.S�DATE ŠXDEFƒTIMEOD*-DUMPA18ƒBSR„TIMEOD�TIME�FROM�SYS�PARAMS�TO�D0é ééé!ŠLEA„PTIME(PC),A1‹MESSAGE�ADDRESS ŠBSR„CONVTIME**…CONVERT�DATE�FOR�HEADING�LINE*/ŠMOVE.L�DATE(A3),D0ˆGET�DATE�FROM�SYSTEM�PARAMS ŠBSR„DATEOG�CONVERT�TO�GREGORIAN&ŠLEA„PDATE(PC),A1‹ADDRESS�OF�PRINT�LOC#ŠBSR„CONVDATE‹CONVERT�DATE�TO�ASCII/ŠMOVE.L�VERSION-MBD(A6),TITVER-MBD(A6)‚<<012585*ŠMOVE.L�VERSION+4-MBD(A6),TITVER+4-MBD(A6)8ŠMESGƒTITLES(PC),TITLEE(PC),X‚SYSANAL�ID�ITSELF�012585>> ŠBRA.S‚CMDPRO**‡RESPOND�TO�BREAK*ANSBRK„ERQ.RDEVNT�INPTBUF(PC)ŠLEA„STACK(PC),A7‹RESET�STACKŠERQ.SETASQ�#7+ANSMSG„MESGƒBRKRCV(PC),BRKRCVE(PC),X‚012585 ŠBRA.S‚CMDPRO**‡DISK�ERROR�ROUTINE*ŠXDEFƒPDSKERR,PDSKER6PDSKER6ƒMOVE.L�(A7)+,A6PDSKERRƒLEA„DSKERRD0(PC),A1 ŠBSR„CONVHEX4ŠMESGƒDSKERRS(PC),DSKERRE(PC),XŠRTS* ŠXDEFƒPDSKERSPDSKERSƒBSR„PDSKERRŠPAGE*!*…COMMAND�LINE�PROCESSING�ROUTINE*‡-�PUTS�OUT�PROMPT*‡-�READS�COMMAND�FROM�KEYBOARD%*‡-�CALLS�APPROPRIATE�COMMAND�PROCESS*‡-�HAS�ERROR�RETURN* ŠXDEFƒCMDPRO?CMDPRO„LEA„STACK(PC),A7‹RESET�STACK�-�CAN�GET�HERE�FROM�ANYWHER)ŠLEA„BEGDATA(PC),A6‰START�OF�DATA�SEGMENT$ŠINPUT.S�PROMPTCS(PC),PROMPTCE(PC),X*%*…SEARCH�FOR�COMMAND�IN�COMMAND�TABLE*!ŠLEA„CMDTBL(PC),A4ŠSTART�OF�TABLEŠLEA„INPTBUF(PC),A2…INPUT�LINE ŠLEA„CMDTBLE(PC),A0‰END�OF�TABLEŠMOVE.L�A0,D7ŽSAVE�FOR�COMPARE'CMDPR4„CMP.B‚#$D,(A2)‹IS�1ST�CHAR�A�CR?ŠBEQ.S‚CMDPWHAT‹BRANCH�IF�YES%ŠCMP.B‚#'�',(A2)+‰SKIP�LEADING�BLANKS ŠBEQ„CMDPR4*-CMDPR6„LEA„-1(A2),A0ŠSTART�OF�COMMAND�ENTERED"ŠMOVE.L�A4,A1ŽNEXT�CMD�TABLE�ENTRY#ŠMOVE.B�(A0)+,D0‹FIRST�BYTE�ENTERED"ŠCMP.B‚(A1)+,D0‹MATCH�TABLE�ENTRY?ŠBNE.S‚CMDPR9�BRANCH�IF�NO"ŠMOVE.L�#3,D1ŽCOMPARE�3�MORE�CHARS(CMDPR7„MOVE.B�(A0)+,D0‹NEXT�CHAR�ENTEREDŠCMP.B‚#'�',D0ŒIS�IT�A�BLANK?#ŠBEQ.S‚CMDPR20ŒIF�YES�-�FOUND�MATCHŠCMP.B‚#$D,D0�IS�IT�A�CR?#ŠBEQ.S‚CMDPR16ŒIF�YES�-�FOUND�MATCH$ŠCMP.B‚(A1)+,D0‹MATCH�CHAR�IN�TABLE?ŠBNE.S‚CMDPR9�BRANCH�IF�NO!ŠSUB.L‚#1,D1ŽDECREMENT�CHAR�COUNT&ŠBNE„CMDPR7�GO�BACK�TO�CHECK�NEXT�CHARŠBRA.S‚CMDPR12ŒFOUND�COMMAND*1CMDPR9„LEA„8(A4),A4‹INCREMENT�TO�NEXT�TABLE�ENTRYŠCMP.L‚D7,A4ŽEND�OF�TABLE?ŠBNE„CMDPR6�BRANCH�BACK�IF�NOŠBRA.S‚CMDPWHAT‹GO�SAY�WHAT?*-*†FOUND�COMMAND�IN�TABLE�-�GO�TO�SPEC�ROUTINE*+CMDPR12ƒMOVE.B�(A0)+,D0‹FIND�END�OF�COMMANDŠCMP.B‚#$D,D0�IS�IT�A�CR?ŠBEQ.S‚CMDPR16ŒBRANCH�IF�YESŠCMP.B‚#'�',D0ŒIS�IT�A�BLANK?'ŠBNE„CMDPR12ŒIF�NO�-�GO�CHECK�NEXT�CHARŠBRA.S‚CMDPR20,CMDPR16ƒLEA„0,A0�INPUT�LINE�HAS�NO�MORE�INFO0CMDPR20ƒLEA„CMDTBL(PC),A1ŠSTART�OF�COMMAND�TABLE*ŠADD.L‚4(A4),A1‹ADDRESS�OF�SPECIAL�ROUTINE ŠJMP„(A1)�GO�TO�ROUTINE�SELECTED**…CANNOT�COMMUNICATE�WITH�USER*=CMDPABRT‚SUB.W‚#1,FATLCNT-MBD(A6)�HAVE�WE�TRIED�ENOUGH�TIMES?ŠBNE„CMDPRO�BRANCH�IF�NOCMDPABTF‚ERQ.ABORT�#$200**„COMMAND�NOT�UNDERSTOOD*ŠXDEFƒCMDPWHAT)CMDPWHAT‚MESGƒWHATMSGS(PC),WHATMSGE(PC),X ŠBRA„CMDPROŠPAGE**‡CHANGE�TO�NEW�OUTPUT�DEVICE*2CHGOUT„MOVE.L�A0,OUTPSRT-MBD(A6)�USER'S�INPUT�LINE7ŠBSR„NEWOUT�Start�new�page�-�must�be�BSR.L�for�DUMPANALŠBRA„CMDPRO�GO�GET�NEXT�COMMAND**…SET�DEFAULT�OFFSET�VALUE*ŠXREF.S�ADROFST1*0OFFSET„LEA„ADROFST1(PC),A1„PLACE�TO�STORE�OFFSETŠBSR.S‚OFFSETCŒCONVERT�OFFSETŠBNE„CMDPWHAT‹BRANCH�IF�ERRORŠBRA„CMDPRO�GO�GET�NEXT�COMMAND* ŠXDEFƒOFFSETC$OFFSETCƒBSR„HEXBIN�CONVERT�TO� BINARYŠBNE.S‚OFFSETCR‹BRANCH�IF�ERROR ŠMOVE.L�(A1),D0ŒGET�BINARY�VALUE'ŠLSL.L‚#8,D0ŽSHIFT�TO�SET�BIT�15�IF�NEGŠASR.L‚#8,D0ŽEXTEND�SIGN$ŠMOVE.L�D0,A5ŽEXTEND�SIGN�TO�32�BITSŠMOVE.L�A5,(A1)ŒPUT�IT�BACKŠCLR.L‚D0‘GOOD�RETURN�FLAG OFFSETCR‚RTS**†USER�SAYS�QUIT* QUIT†ERQ.TERMé:ŠTTL„ANALMAP.AI‰-�Crash/System�analysis�-�DUMPANAL/SYSANALŠPAGE9**********************************************************�INCLUDE�FILE:�ANALMAP.AIž*9********************************************************* ŠSECTION�0**�M�E�M�O�R�YƒM�A�PƒT�A�B�L�E* PMHDR…ENDLNLFŠDC.Bƒ'ˆMEMORY�MAP'ŠENDLINEŠDC.Bƒ'ˆ----------'ŠENDLINE7ŠDC.Bƒ'‚PARTITION�TYPE‚STRTADDRƒENDADDR„PARTITION�SIZE'ŠENDLINEPMHDRE„EQU„*-1ŠDS.Wƒ0** MEMORY MAP TABLE DETAIL LINE*&PMAPL…FLD„PMAPPT,<'ˆ'>,2,C�PARTITION�#"ŠFLD„PMAPTYP,<'ƒ'>,2,C�MEMORY�TYPE%ŠFLD„PMAPSTRT,<'…'>,4,C�START�ADDRESS$ŠFLD„PMAPEND,<'00„'>,4,C�END�ADDRESS!ŠFLD„PMAPBYTS,<'FF‚'>,4,C�#�BYTES!ŠFLD„PMAPK,<'00�BYTES‚('>,4,C�#�KŠFLD„PMAPK2,<'.'>,2,C ŠDC.Bƒ'K)'PMAPLE„EQU„*-1ŠDS.Wƒ0**�F�R�E�EƒM�E�M�O�R�YƒL�I�S�T* PFHDR…ENDLNLF&ŠDC.Bƒ'ˆFREE�MEMORY�LIST�-�PARTITION�'PFHDRP„DC.Bƒ'XX'ŠENDLINE(ŠDC.Bƒ'ˆ-------------------------------'ŠENDLINE*ŠDC.Bƒ'„STRTFREEƒENDFREE�STRTUSEDƒENDUSED'ŠENDLINEPFHDRE„EQU„*-1ŠDS.Wƒ0** FREE MEMORY LIST DETAIL LINE*+PFREEL„FLD„FREESTRT,<'†'>,4,C�START�OF�FREE#ŠFLD„FREEND,<'00„'>,4,C�END�OF�FREE+ŠFLD„FREEK,<'FF‚('>,4,C�SIZE�OF�FREE‚012585ŠFLD„FREEK2,<'.'>,2,C'ŠFLD„USEDSTRT,<'K)…'>,4,C�START�OF�USED$ŠFLD„USEDEND,<'00„'>,4,C�END�OF�USED+ŠFLD„USEDK,<'FF‚('>,4,C�SIZE�OF�USED‚012585ŠFLD„USEDK2,<'.'>,2,C ŠDC.Bƒ'K)'PFREELEƒEQU„*-1ŠDS.Wƒ0PRFRNO„ENDLNLF&ŠDC.Bƒ'„CANNOT�PRINT�FREE�MEMORY�LIST'ŠENDLINEPRFRNOEƒEQU„*-1ŠDS.Wƒ0ŠPAGE ŠSECTION�8*(*‚*�*�*‚PRINT�THE�MEMORY�MAP�TABLE‚*�*�** ŠXDEFƒPRMAPŠXREF.S�RDBUF,MAPBEG,PDSKERR*0PRMAP…WANTƒ#12,#2�CHECK�FOR�ENOUGH�LINES�ON�PAGEŠPRINT‚PMHDRŽPRINT�THE�HEADING!ŠLEA„RDBUF(PC),A4‡START�OF�BUFFER<ŠRD…#60,MAPBEG(A3),(A4),PDSKERR�GET�HEADER�(6�PARTS.)�012985$ŠMOVE.W�#20,D7�LIMIT�#�LINES�PRINTED**PRMAP4„MOVE.W�MAPMTYP(A4),D0…END�OF�TABLE?"ŠADD.W‚#1,D0Ž-1�MEANS�END�OF�TABLEŠBEQ.S‚PRMAP6�BRANCH�IF�DONE ŠSUB.W‚#1,D7 ŠBEQ.S‚PRMAP6 ŠMVHEX‚1,MAPMTYP(A4),PMAPTYP(PC)ÛSäGì'ŠMVHEX‚1,MAPPART(A4),PMAPPT(PC)$ŠMOVE.L�MAPSTRA(A4),D3…START�ADDRESSŠLSR.L‚#8,D3ŽSTART�PAGEŠLEA„60(A4),A5Š<<012985%ŠRD…#FMLHDSZ,MAPFMLP(A4),(A5),PDSKERRŠMOVE.L�ENDAVAIL(A5),D4!ŠSUB.L‚#1,D4ŽEND�ADDRESS‚012985>>ŠLSR.L‚#8,D4ŽEND�PAGE#ŠLEA„PMAPSTRT(PC),A1ˆBUFF�FOR�START"ŠLEA„PMAPBYTS(PC),A2ˆBUFF�FOR�SIZEŠLEA„PMAPK(PC),A0‹BUFF�FOR�#K ŠBSR„PSEGSIZ ŠPRINTF�PMAPL,ŠLEA„MAPENTSZ(A4),A4„INCREMENT�TO�NEXT�ENTRY ŠBRA„PRMAP4*8PRMAP6„MOVE.L�#-1,D7�FREE�LIST�FOR�ALL�PARTITIONS�020185$ŠBSR.S‚PRFREE�GO�PRINT�FREE�MEM�LISTŠRTSŠPAGE*(*‚*�*�*‚PRINT�THE�FREE�MEMORY�LIST‚*�*�** ŠXDEFƒPRFREE*=PRFREE„MOVE.L�D7,-(A7)‹SAVE�PARTITION�NUMBER�OR�IND.‚<<020185)ŠBPL.S‚PRFR1ŽONLY�ONE�PARTITION�ASKED�FORŠCLR.L‚D6‘PARTITION�LAST�DONEŠCLR.L‚D7‘PARTITION�WORKING�ONPRFR1…MOVE.L�D6,-(A7)9PRFR2…WANTƒ#12,#2�CHECK�FOR�ENOUGH�LINES�ON�PAGE�020185>>ŠMVHEX‚1,D7,PFHDRP(PC)ŠPRINT‚PFHDRŽPRINT�THE�HEADING!ŠLEA„RDBUF(PC),A4‡START�OF�BUFFER+ŠRD…#$E4,MAPBEG(A3),(A4),PDSKERR�GET�HEADER *1PRFREE1ƒCMP.B‚MAPPART(A4),D7…LOOK�FOR�PARTITION�#ŠBEQ.S‚PRFREE3ŒBRANCH�IF�FOUND,ŠLEA„MAPENTSZ(A4),A4„INCREMENT�TO�NEXT�ENTRY,ŠMOVE.W�MAPMTYP(A4),D0…LOOK�FOR�END�OF�TABLE ŠADD.W‚#1,D0ŠBNE„PRFREE1ŒBRANCH�IF�NOT�END/ŠADD.L‚#8,A7ŽUPDATE�STACK�BEFORE�LEAVING‚020185ŠRTS*)PRFREE3ƒMOVE.L�#10,D7�LIMIT�#�TRIES�TO�10*PRFREE4ƒCLR.L‚D6‘PREVIOUS�ENTRYŠMOVE.L�MAPFMLP(A4),D1ŠLEA„RDBUF+$100(PC),A5ŠRD…#20,D1,(A5),PDSKERR*&PRFREE6ƒMOVE.L�FMLFP(A5),D1‡NEXT�ENTRY ŠBEQ.S‚PRFREE8ŒBRANCH�IF�NO�MORE%ŠLEA„16(A5),A5ŠNEXT�PLACE�TO�STORE�ITŠRD.Sƒ#16,D1,(A5),PRFREEX%ŠMOVE.L�FMLBP(A5),D0‡GET�BACK�POINTER!ŠCMP.L‚D0,D6ŽIS�IT�THE�RIGHT�ONE?ŠBNE.S‚PRFREEXŒBRANCH�IF�NO ŠMOVE.L�D1,D6 ŠBRA„PRFREE6*PRFREEXƒSUB.L‚#1,D7ŠBNE„PRFREE4ŒGO�BACK�TO�RETRYŠPRINT‚PRFRNO�PRINT�MESSAGE PRFREEXR‚RTS*PRFREE8ƒLEA„RDBUF+$100(PC),A5/PRFREE9ƒMOVE.L�FMLFP(A5),D3‡GET�FORWARD�POINTER3ŠBEQ.S‚PRFREE10‹DONE�THIS�PART,�CHK�FOR�NEXT‚020185&ŠLEA„16(A5),A5ŠINCREMENT�TO�NEXT�ENTRY%ŠLSR.L‚#8,D3ŽPAGE�#�-�START�FREE�AREA ŠMOVE.L�D3,D5.ŠADD.L‚FMLFREE(A5),D5…PAGE�#�-�START�USED�AREA ŠMOVE.L�D5,D4&ŠSUB.L‚#1,D4ŽPAGE�#�-�END�OF�FREE�AREA ŠMOVE.L�D5,D6ŠADD.L‚FMLUSED(A5),D6&ŠSUB.L‚#1,D6ŽPAGE�#�-�END�OF�USED�AREA.ŠLEA„FREESTRT(PC),A1ˆBUFFER�FOR�START�IN�ASCII&ŠLEA„FREEK(PC),A0‹BUFFER�FOR�SIZE�IN�K ŠLEA„0,A2.ŠBSR„PSEGSIZŒPUT�LIMITS�AND�SIZE�IN�PRINT�LINE ŠMOVE.L�D5,D3 ŠMOVE.L�D6,D4.ŠLEA„USEDSTRT(PC),A1ˆBUFFER�FOR�START�IN�ASCII&ŠLEA„USEDK(PC),A0‹BUFFER�FOR�SIZE�IN�K.ŠBSR„PSEGSIZŒPUT�LIMITS�AND�SIZE�IN�PRINT�LINEŠPRINTF�PFREEL�PRINT�IT ŠBRA„PRFREE92PRFREE10‚MOVEM.L�(A7)+,D6/D7‡RESTORE�REGS‚<<020185 ŠTST.L‚D7‘DOING�ALL�PARTITIONS�? ŠBPL„PRFREEXR‹NO,�ONLY�ONE--EXITŠADD.L‚#1,D6ŽBUMP�COUNTER/ŠMOVEM.L�D6/D7,-(A7)‡SAVE�COUNTER�AND�INDICATOR&ŠMOVE.L�D6,D7ŽPREPARE�PARTITION�NUMBER**ƒSEE�IF�ANY�MORE�TO�PROCESS*!ŠLEA„RDBUF(PC),A4‡START�OF�BUFFER+ŠRD…#$E4,MAPBEG(A3),(A4),PDSKERR�GET�HEADER*2PRFREE11‚CMP.B‚MAPPART(A4),D7…LOOK�FOR�PARTITION�#ŠBEQ„PRFR2ŽBRANCH�IF�FOUND,ŠLEA„MAPENTSZ(A4),A4„INCREMENT�TO�NEXT�ENTRY,ŠMOVE.W�MAPMTYP(A4),D0…LOOK�FOR�END�OF�TABLE ŠADD.W‚#1,D0ŠBNE„PRFREE11‹BRANCH�IF�NOT�END(ŠADD.L‚#8,A7ŽUPDATE�STACK�BEFORE�LEAVINGŠBRA„PRFREEXR‹EXIT‚020185>>ééé:ŠTTL„ANALNET.AI‰-�Crash/System�analysis�-�DUMPANAL/SYSANALŠPAGE9**********************************************************�INCLUDE�FILE:�ANALNET.AIž*9********************************************************* ŠSECTION�0*!*ƒN�E�T�W�O�R�KƒN�A�M�EƒT�A�B�L�E*NNTBHD„ENDLNLFŠDC.Bƒ'ˆNETWORK�NAME�TABLE'ŠENDLINEŠDC.Bƒ'ˆ------------------'ŠENDLINEŠDC.Bƒ'‚STATION�ID--THIS�NODE�' STATID„DS.Bƒ2ŠENDLNLF)ŠDC.Bƒ'„BADR†----�NAME�----„NAUƒSIDƒSTAT' ŠDC.Bƒ'„NAT'ŠENDLINENNTBHDEƒEQU„*-1ŠDS.Wƒ0**ƒNNT�DETAIL�LINE*1NNTB†FLD„NNTHDPTR,<'�'>,8,C�POINTER�TO�NEXT�ENTRY(ŠFLD„NNTNAMH,<'‚'>,8,C�NAME�(HEX�PART�1)$ŠFLD„NNTNAMH1,,4,C†NAME�(HEX�PART�2)$ŠFLD„NNTHDNAM,<'�'>,6,C�NAME�(ASCII)+ŠFLD„NNTHDNAU,<'‚'>,2,C�NAU�NETWORK�ADDRESS-ŠFLD„NNTHDSID,<'„'>,2,C�STATION�ID�-�THIS�NAU"ŠFLD„NNTHDSTA,<'„'>,4,C�NAU�STATUS6ŠFLD„NNTHDNAT,<'‚'>,8‚POINTER�TO�NETWORK�ADDRESS�TABLE NNTBE…EQU„*-1ŠDS.Wƒ0ŠPAGE ŠSECTION�8 ŠXDEFƒNNTBLŠXREF.S�RDBUF,NNTBEG,PDSKERR0NNTBL…WANTƒ#12,#2�Chec k�for�enough�lines�on�page ŠPRINT‚NNTBHDŠTST.L‚NNTBEG(A3)+ŠBEQ„NNTRTS�Branch�if�no�network�name�table!ŠLEA„RDBUF(PC),A4‡START�OF�BUFFER/ŠRD…#18,NNTBEG(A3),(A4),PDSKERR�READ�NNT�HEADER.ŠMVHEX‚1,NNTHSID(A4),STATID(PC)�GET�STATION�ID)ŠTST.L‚NNTAHDR(A4)ˆTEST�FOR�AN�EMPTY�LISTŠBEQ„NNTBL2�BRIF�NO�ENTRIES*ŠMOVE.L�NNTAHDR(A4),-(A7)‚SAVE�ADR�OF�NEXT5ŠRD…#NNTESIZ,NNTAHDR(A4),(A4),PDSKERR�GET�FIRST�ENTRYNNTBL10ŠMVHEX‚4,(A7),NNTHDPTR(PC)�ADDRESS�OF�THIS�ENTRY1ŠMVHEX‚4,NNTNAM(A4),NNTNAMH(PC)�NAME�(HEX�PART�1)4ŠMVHEX‚2,NNTNAM+4(A4),NNTNAMH1(PC)�NAME�(HEX�PART�2)-ŠMVASC‚6,NNTNAM(A4),NNTHDNAM(PC)�NAME�(ASCII)4ŠMVHEX‚1,NNTNAU(A4),NNTHDNAU(PC)�NAU�NETWORK�ADDRESS5ŠMVHEX‚1,NNTSID(A4),NNTHDSID(PC)�STATION�ID--THIS�NAU,ŠMVHEX‚2,NNTSTAT(A4),NNTHDSTA(PC)�NAU�STATUS2ŠMVHEX‚4,NNTNAT(A4),NNTHDNAT(PC)�POINTER�NAT�ENTRY ŠPRINT‚NNTB#ŠMOVE.L�(A7)+,A0‹CLEAN�UP�THE�STACK1ŠTST.L‚NNTNEXT(A4)ˆDONE�WHEN�LINK�TO�NEXT�IS�ZEROŠBEQ.S‚NNTBL2�BRANCH�IF�DONE&ŠMOVE.L�NNTNEXT(A4),-(A7)‚SAVE�ADDRESSô@ý?I 4NP%G-a5W=CEFM/4ŠRD…#NNTESIZ,NNTNEXT(A4),(A4),PDSKERR�GET�NEXT�ENTRY ŠBRA„NNTBL1NNTBL2 NNTRTS„RTSŠPAGE ŠSECTION�0*'*ƒN�E�T�W�O�R�K‚A�D�D�R�E�S�S‚T�A�B�L�E*NATBHD„ENDLNLFŠDC.Bƒ'ˆNETWORK�ADDRESS�TABLE'ŠENDLINEŠDC.Bƒ'ˆ---------------------'ŠENDLNLF-ŠDC.Bƒ'‚BADR…TCB…NAU�SID�STAT�DISC�LCCƒLCTLK'ŠDC.Bƒ'„LCNLK„CNNLKƒANYLK�'ŠENDLINENATBHDEƒEQU„*-1ŠDS.Wƒ0**ƒNAT�DETAIL�LINE*1NATB†FLD„NATHDNXT,<'�'>,8,C�POINTER�TO�NEXT�ENTRY#ŠFLD„NATHDTCB,<'�'>,8,C�TCB�ADDRESS+ŠFLD„NATHDNAU,<'‚'>,2,C�NAU�NETWORK�ADDRESS,ŠFLD„NATHDSID,<'‚'>,2,C�STATION�ID--THIS�NAU"ŠFLD„NATHDSTD,<'�'>,4,C�NAU�STATUS.ŠFLD„NATHDCOD,<'‚'>,2,C�DISCONNECT�REASON�CODE/ŠFLD„NATHDLCC,<'ƒ'>,2,C�NEXT�UNASSIGNED�LOGICAL*ºCONNECT�CODE2ŠFLD„NATHDLCT,<'�'>,8,C�POINTER�TO�FIRST�LCT�ENTRY7ŠFLD„NATHDLCN,<'�'>,8,C�POINTER�TO�FIRST�LISTEN/CONNECT*¦RECV�PARAM�BLOCK5ŠFLD„NATHDCNN,<'�'>,8,C�POINTER�TO�FIRST�CONNECT-INIT*¦PARAMETER�BLOCK6ŠFLD„NATHDANY,<'�'>,8ƒPOINTER�TO�FIRST�'RECV-FROM-ANY'*¦PARAMETER�BLOCK NATBE…EQU„*-1ŠDS.Wƒ0ŠPAGE ŠSECTION�8 ŠXDEFƒNATBLŠXREF.S�RDBUF,NATBEG,PDSKERR0NATBL…WANTƒ#12,#2�Check�for�enough�lines�on�pageŠPRINT‚NATBHD�Print�headerŠTST.L‚NATBEG(A3).ŠBEQ„NATRTS�Branch�if�no�network�address�table!ŠLEA„RDBUF(PC),A4‡START�OF�BUFFER/ŠRD…#16,NATBEG(A3),(A4),PDSKERR�READ�NAT�HEADER2ŠTST.L‚NATAHDR(A4)ˆTEST�FOR�NOTHING�ON�ACTIVE�LIST#ŠBEQ„NATBL2�BRANCH�IF�NOTHING�TO�DO&ŠMOVE.L�NATAHDR(A4),-(A7)‚SAVE�ADDRESS6ŠRD…#NATESIZ,NATAHDR(A4),(A4),PDSKERR�READ�FIRST�ENTRYNATBL16ŠMVHEX‚4,(A7),NATHDNXT(PC)�PRINT�ADDRESS�OF�THIS�ENTRY,ŠMVHEX‚4,NATTCB(A4),NATHDTCB(PC)�TCB�ADDRESS4ŠMVHEX‚1,NATNAU(A4),NATHDNAU(PC)�NAU�NETWORK�ADDRESS+ŠMVHEX‚1,NATSID(A4),NATHDSID(PC)�STATION�ID,ŠMVHEX‚2,NATSTAT(A4),NATHDSTD(PC)�NAU�STATUS8ŠMVHEX‚1,NATDCOD(A4),NATHDCOD(PC)�DISCONNECT�REASON�CODE5ŠMVHEX‚1,NATLCC(A4),NATHDLCC(PC)�LOGICAL�CONNECT�CODE0ŠMVHEX‚4,NATLCTLK(A4),NATHDLCT(PC)�1st�LCT�ENTRY;ŠMVHEX‚4,NATLCNLK(A4),NATHDLCN(PC)�1st�LISTEN�CONNECT�BLOCK4ŠMVHEX‚4,NATCNNLK(A4),NATHDCNN(PC)�1st�CONNECT�BLOCK9ŠMVHEX‚4,NATANYLK(A4),NATHDANY(PC)�1st�RCV�FORM�ANY�BLOCK ŠPRINT‚NATB2ŠMOVE.L�(A7)+,A0‹RESTORE�STACK‚DISCARD�OLD�ADDRESS,ŠTST.L‚NATNEXT(A4)ˆANY�MORE�ENTRIES�TO�PRINTŠBEQ.S‚NATBL2�BRANCH�IF�NOT&ŠMOVE.L�NATNEXT(A4),-(A7)‚SAVE�ADDRESS5ŠRD…#NATESIZ,NATNEXT(A4),(A4),PDSKERR�READ�NEXT�ENTRYŠBRA„NATBL1�GO�PRINT�THE�NATNATBL2 NATRTS„RTSŠPAGE ŠSECTION�0*'*ƒL�O�G�I�C�A�L‚C�O�N�N�E�C�T‚T�A�B�L�E*LCTBHD„ENDLNLFŠDC.Bƒ'ˆLOGICAL�CONNECT�TABLE'ŠENDLINEŠDC.Bƒ'ˆ---------------------'ŠENDLNLF0ŠDC.Bƒ'‚TCB„LCC�CCD�NAU�SID�RNAU�RSID�-NAME-ƒLI'ŠDC.Bƒ'NK„BFLNKƒCSTA�COFT'ŠENDLINELCTBHDEƒEQU„*-1ŠDS.Wƒ0**ƒLCT�DETAIL�LINE*"LCTB†FLD„LCTHDTCB,,8,C†TCB�ADDRESS,ŠFLD„LCTHDLCC, <'‚'>,2,C�LOGICAL�CONNECT�CODEŠFLD„LCTHDCCD,<'‚'>,2,CŠFLD„LCTHDNAU,<'‚'>,2,CŠFLD„LCTHDSID,<'‚'>,2,CŠFLD„LCTHDRNU,<'‚'>,2,CŠFLD„LCTHDRID,<'ƒ'>,2,CŠFLD„LCTHDNAM,<'‚'>,6,CŠFLD„LCTHDLNK,<'�'>,8,CŠFLD„LCTHDFLK,<'�'>,8,CŠFLD„LCTHDSTA,<'�'>,4,CŠFLD„LCTHDOPT,<'�'>,4ŠFLD„LCTHTSEQ,<'ƒTx‚SEQ�'>,4,CŠFLD„LCTHTSTA,<'�STA�'>,4,CŠFLD„LCTHTWXM,<'�TXM�'>,8,CŠFLD„LCTHWTRP,<'�WTRP�'>,8,CŠFLD„LCTHDCAD,<'�CAD�'>,8,CŠFLD„LCTHTSZ,<'�SIZE�'>,8ŠFLD„LCTHRSEQ,<'ƒRx‚SEQ�'>,4,CŠFLD„LCTHRSTA,<'�STA�'>,4,CŠFLD„LCTHWTRV,<'�WTR�'>,8,CŠFLD„LCTHWTBF,<'�WTBF�'>,8,CŠFLD„LCTHRCAD,<'�CAD�'>,8,CŠFLD„LCTHRSZ,<'�SIZE�'>,8ŠDC.BƒLF LCTBE…EQU„*-1ŠDS.Wƒ0ŠPAGE ŠSECTION�8 ŠXDEFƒLCTBL#ŠXREF.S�RDBUF,NNTBEG,PDSKERR,NATBEGLCTBL…WANTƒ#12,#2ŠPRINT‚LCTBHD�Print�LCT�headerŠTST.L‚NATBEG(A3).ŠBEQ„LCTRTS�Branch�if�no�logical�connect�table!ŠLEA„RDBUF(PC),A4‡START�OF�BUFFER/ŠRD…#16,NATBEG(A3),(A4),PDSKERR�READ�NAT�HEADER'ŠTST.L‚NATAHDR(A4)ˆANY�NATS�IN�THE�LISTŠBEQ„LCTBL4�EXIT�IF�NONE.ŠRD…#38,NATAHDR(A4),(A4),PDSKERR�GET�FIRST�NATLCTBL1/ŠMOVE.L�NATNEXT(A4),-(A7)‚SAVE�LINK�TO�NEXT�NAT1ŠTST.L‚NATLCTLK(A4)‡IS�THERE�AN�LCT�WITH�THIS�NAT,ŠBEQ„LCTBL3�BRANCH�IF�NOT�(GO�READ�NEXT�NAT)=ŠRD…#LCTESIZ,NATLCTLK(A4),(A4),PDSKERR�GET�FIRST�LCT�IN�CHAINLCTBL2;ŠMVHEX‚4,LCTLOTCB(A4),LCTHDTCB(PC)�TCB�ADDRESS�OF�LOCAL�NAU7ŠMVHEX‚1,LCTLOLCC(A4),LCTHDLCC(PC)�LOGICAL�CONNECT�CODE=ŠMVHEX‚1,LCTLOCCD(A4),LCTHDCCD(PC)�CANCEL�CONNECT�REASON�CODE9ŠMVHEX‚1,LCTLONAU(A4),LCTHDNAU(PC)�NET.�ADR.�OF�LOCAL�NAU;ŠMVHEX‚1,LCTLOSID(A4),LCTHDSID(PC)�STATION�ID--THIS�STATION:ŠMVHEX‚1,LCTRMNAU(A4),LCTHDRNU(PC)�NET.�ADR.�OF�REMOTE�NAU>ŠMVHEX‚1,LCTRMSID(A4),LCTHDRID(PC)�STA.�ID�WHERE�REMOTE�NAU�IS=ŠMVASC‚6,LCTRMNAM(A4),LCTHDNAM(PC)�NETWORK�NAME�OF�REMOTE�NAU1ŠMVHEX‚4,LCTLULNK(A4),LCTHDLNK(PC)�NEXT�LCT�ENTRY>ŠMVHEX‚4,LCTBFLNK(A4),LCTHDFLK(PC)�NEXT�LCT�WAIT-FOR-BUFFERS�Q0ŠMVHEX‚2,LCTCSTA(A4),LCTHDSTA(PC)�CONNECT�STATUS1ŠMVHEX‚2,LCTCOPT(A4),LCTHDOPT(PC)�CONNECT�OPTIONS**‚XMIT�PART�OF�LCT*:ŠMVHEX‚2,LCTTSEQ(A4),LCTHTSEQ(PC)�TRANSMIT�SEQUENCE�NUMBER9ŠMVHEX‚2,LCTTSTA(A4),LCTHTSTA(PC)�CURRENT�TRANSMIT�STATUS;ŠMVHEX‚4,LCTTWTXM(A4),LCTHTWXM(PC)�1st�BLOCK�IN�WAIT�XMIT�Q;ŠMVHEX‚4,LCTTWTRP(A4),LCTHWTRP(PC)�1st�BLOCK�IN�WAIT�RESP�Q5ŠMVHEX‚4,LCTTCAD(A4),LCTHDCAD(PC)�USER�BUFFER�ADDRESS0ŠMVHEX‚4,LCTTTSZ(A4),LCTHTSZ(PC)�USER�BYTE�COUNT**ƒRCV�PART�OF�LCT*9ŠMVHEX‚2,LCTRSEQ(A4),LCTHRSEQ(PC)�RECEIVE�SEQUENCE�NUMBER0ŠMVHEX‚2,LCTRSTA(A4),LCTHRSTA(PC)�RECEIVE�STATUS9ŠMVHEX‚4,LCTRWTRV(A4),LCTHWTRV(PC)�1st�BLOCK�IN�AVA-RCV�Q;ŠMVHEX‚4,LCTRWTBF(A4),LCTHWTBF(PC)�1st�BLOCK�IN�BUFF�HERE�Q5ŠMVHEX‚4,LCTRCAD(A4),LCTHRCAD(PC)�USER�BUFFER�ADDRESS0ŠMVHEX‚4,LCTRTSZ(A4),LCTHRSZ(PC)�USER�BYTE�COUNTŠPRINT‚LCTB�PRINT�THE�TABLE4ŠTST.L‚LCTLULNK(A4)‡ARE�THERE�MORE�LCT'S�IN�THE�LISTŠBEQ.S‚LCTBL3�BRANCH�IF�NOT4ŠRD…#LCTESIZ,LCTLULNK(A4),(A4),PDSKERR�READ�NEXT�LCT ŠBRA„LCTBL2LCTBL3-ŠTST.L‚(A7)�CHECK�IF�LINK�TO�NEXT�NAT�IS�ZERO%ŠMOVE.L�(A7)+,A5‹GET�LINK�TO�NEXT�NAT*ŠBEQ.S‚LCTBL4�EXIT�IF�LINK�TO�NEXT�IS�ZERO%ŠRD…#38,A5,(A4),PDSKERR�READ�NEXT�NATŠBRA„LCTBL1�GO�TO�READ�NEXT�LCTLCTBL4 LCTRTS„RTSŠPAGE ŠSECTION�0*'*ƒP�R�I�M�A�R�Y‚C�O�N�T�R�O�L‚B�L�O�C�K**ˆFIRST�HEADER*PCBAHD„ENDLNLFŠDC.Bƒ'ˆPRIMARY�CONTROL�BLOCK'ŠENDLINEŠDC.Bƒ'ˆ---------------------'ŠENDLNLFŠDC.Bƒ'ƒJUMP�VECTORS'ŠENDLINEŠDC.Bƒ'ˆTBMT†STAT†RXCH†SPRX‚'ŠENDLINEPCBAHDEƒEQU„*-1ŠDS.Wƒ0**ˆSECOND�HEADER*PCBBHD„ENDLNLFŠDC.Bƒ'‡A0ˆA1ˆA2ˆA3ˆA4'ŠDC.Bƒ'ˆA5ˆA6'ŠENDLINEPCBBHDEƒEQU„*-1ŠDS.Wƒ0**ˆTHIRD�HEADER*PCBCHD„ENDLNLF ŠDC.Bƒ'‡XID†FRDF†FSEC†RCVQ„RXLN'ŠDC.Bƒ'‚PA‚BSY‚TXF‚BAUD'ŠENDLINEPCBCHDEƒEQU„*-1ŠDS.Wƒ0ŠPAGE**ƒPCB�DETAIL�LINE*+PCB1†FLD„SDHDVCT1,<'CH�B‚'>,8,C�CHNL�B�TBMT5ŠFLD„SDHDVCT2,<'‚'>,8,C�CHNL�B�EXTERNAL/STATUS�CHANGE-ŠFLD„SDHDVCT3,<'‚'>,8,C�CHNL�B�RCV�CHAR�AVAIL2ŠFLD„SDHDVCT4,<'‚'>,8‚CHNL�B�SPECIAL�RCV�CONDITION'ŠFLD„SDHDVCT5,<'CH�A‚'>,8,C�CHNL�A�TBMT5ŠFLD„SDHDVCT6,<'‚'>,8, C�CHNL�A�EXTERNAL/STATUS�CHANGE-ŠFLD„SDHDVCT7,<'‚'>,8,C�CHNL�A�RCV�CHAR�AVAIL2ŠFLD„SDHDVCT8,<'‚'>,8‚CHNL�A�SPECIAL�RCV�CONDITION PCB1E…EQU„*-1ŠDS.Wƒ01PCB2†FLD„SDPHDRA0,<'„'>,8,C�REGISTER�RESTORE�AREAŠFLD„SDPHDRA1,<'‚'>,8,CŠFLD„SDPHDRA2,<'‚'>,8,CŠFLD„SDPHDRA3,<'‚'>,8,CŠFLD„SDPHDRA4,<'‚'>,8,CŠFLD„SDPHDRA5,<'‚'>,8,CŠFLD„SDPHDRA6,<'‚'>,8 PCB2E…EQU„*-1ŠDS.Wƒ02PCB3†FLD„SDHDXID,<'„'>,8,C�ADR�OF�XID�RESPONSE�BCB.ŠFLD„SDHDFRB,<'‚'>,8,C�FRAME�REJECT�DATA�FIELD(ŠFLD„SDHDSEC,<'‚'>,8,C�ADDR�OF�FIRST�SCB$ŠFLD„SDHDRCV,<'‚'>,8,C�HEAD�OF�RCV�Q+ŠFLD„SDHDRLG,<'‚'>,4,C�LENGTH�OF�RCV�BUFFER,ŠFLD„SDHDPOP,<'‚'>,2,C�POLLING�ALGORITHM�OPT%ŠFLD„SDHDBSY,<'ƒ'>,2,C�SDLC�BUSY�FLAG!ŠFLD„SDHDTXF,<'ƒ'>,2,C�TXMIT�FLAG&ŠFLD„SDHDBAUD,<'‚'>,4‚LINK'S�BAUD�RATE PCB3E…EQU„*-1ŠDS.Wƒ0ŠPAGE ŠSECTION�8 ŠXDEFƒPCBTBLŠXREF.S�RDBUF,SDLCPCB,PDSKERRŠXREFƒMEMOFSET)PCBTBL„WANTƒ#12,#2�Check�for�enough�linesŠPRINT‚PCBAHD�Print�headerŠTST.L‚SDLCPCB(A3)/ŠBLE„PCBTBLXŒBranch�if�no�primary�control�block&ŠLEA„RDBUF(PC),A4‡START�OF�READ�BUFFER?ŠMOVE.L�SDLCPCB(A3),-(A7)‚ADJUST�ADDRESS�IF�PCB�IS�IN�VM02�MEM.ŠMOVE.L�MEMOFSET(PC),D0„*ŠADD.L‚D0,(A7)Œ**ŠRD…#SDPLNG,(A7),(A4),PDSKERR�READ�THE�PCB"ŠMOVE.L�(A7)+,A0‹RESTORE�THE�STACK!ŠMVHEX‚4,SDPVCT1(A4),SDHDVCT1(PC)!ŠMVHEX‚4,SDPVCT2(A4),SDHDVCT2(PC)!ŠMVHEX‚4,SDPVCT3(A4),SDHDVCT3(PC)!ŠMVHEX‚4,SDPVCT4(A4),SDHDVCT4(PC)!ŠMVHEX‚4,SDPVCT5(A4),SDHDVCT5(PC)!ŠMVHEX‚4,SDPVCT6(A4),SDHDVCT6(PC)!ŠMVHEX‚4,SDPVCT7(A4),SDHDVCT7(PC)!ŠMVHEX‚4,SDPVCT8(A4),SDHDVCT8(PC) ŠPRINT‚PCB1 ŠPRINT‚PCBBHD"ŠMVHEX‚4,SDPRRTA0(A4),SDPHDRA0(PC)"ŠMVHEX‚4,SDPRRTA1(A4),SDPHDRA1(PC)"ŠMVHEX‚4,SDPRRTA2(A4),SDPHDRA2(PC)"ŠMVHEX‚4,SDPRRTA3(A4),SDPHDRA3(PC)"ŠMVHEX‚4,SDPRRTA4(A4),SDPHDRA4(PC)"ŠMVHEX‚4,SDPRRTA5(A4),SDPHDRA5(PC)"ŠMVHEX‚4,SDPRRTA6(A4),SDPHDRA6(PC) ŠPRINT‚PCB2 ŠPRINT‚PCBCHDŠMVHEX‚4,SDPXID(A4),SDHDXID(PC)ŠMVHEX‚4,SDPFRB(A4),SDHDFRB(PC) ŠMVHEX‚4,SDPFSEC(A4),SDHDSEC(PC)ŠMVHEX‚4,SDPRCV(A4),SDHDRCV(PC)ŠMVHEX‚2,SDPRLG(A4),SDHDRLG(PC)ŠMVHEX‚1,SDPPOP(A4),SDHDPOP(PC)ŠMVHEX‚1,SDPBSY(A4),SDHDBSY(PC)ŠMVHEX‚1,SDPTXF(A4),SDHDTXF(PC)!ŠMVHEX‚2,SDPBAUD(A4),SDHDBAUD(PC) ŠPRINT‚PCB3 PCBTBLXƒRTSŠPAGE ŠSECTION�0*+*ƒS�E�C�O�N�D�A�R�Y‚C�O�N�T�R�O�L‚B�L�O�C�K* SCBHD…ENDLINE(ŠDC.Bƒ'ˆSECONDARY�STATION�CONTROL�BLOCK'ŠENDLINE(ŠDC.Bƒ'ˆ-------------------------------'ŠENDLNLF=ŠDC.Bƒ'STA�SRT�RRT�OPT�MXF�STOC�STRT�STTX�STPF�STPN�SCTD�PWR'ŠDC.Bƒ'�CSE�STPD�VR�VS�UD�CS'ŠENDLINESCBHDE„EQU„*-1ŠDS.Wƒ0**ƒSCB�DETAIL�LINE*SCBDT…FLD„SDHDSSEC,<'�'>,2,CŠFLD„SDHDSR,<'‚'>,2,CŠFLD„SDHDRR,<'‚'>,2,CŠFLD„SDHDOPT,<'‚'>,2,CŠFLD„SDHDMXF,<'‚'>,2,CŠFLD„SDHDTOC,<'�'>,4,CŠFLD„SDHDTRT,<'�'>,4,CŠFLD„SDHDTTX,<'�'>,4,CŠFLD„SDHDTPF,<'�'>,4,CŠFLD„SDHDTPN,<'�'>,4,CŠFLD„SDHDCTD,<'�'>,4,CŠFLD„SDHDPWR,<'‚'>,2,CŠFLD„SDHDCSE,<'‚'>,2,CŠFLD„SDHDTPD,<'�'>,4,CŠFLD„SDHDVRC,<'�'>,2,CŠFLD„SDHDVSC,<'�'>,2,CŠFLD„SDHDUKT,<'�'>,2,CŠFLD„SDHDCST,<'�'>,2"ŠFLD„SDHDTHD,<'„HD�XMIT�Q�=�'>,8,C#ŠFLD„SDHDTND,<'‚END�XMIT�Q�=�'>,8,C ŠFLD„SDHDTNX,<'‚NEXT�XMIT�=�'>,8ŠDC.BƒLFSCBDTE„EQU„*-1ŠDS.Wƒ0ŠPAGE ŠSECTION�8 ŠXDEFƒSCBTBLŠXREF.S�RDBUF,PDSKERRŠXREFƒMEMOFSET)SCBTBL„WANTƒ#12,#2�Check�for�enough�linesŠPRINT‚SCBHDŽPrint�headerŠTST.L‚SDLCPCB(A3)/ŠBEQ„SCBTBLXŒBranch�if�no�primary�control�block&ŠLEA„RDBUF(PC),A4‡START�OF�READ�BUFFER)ŠMOVE.L�SDLCPCB(A3),-(A7)‚ADJUST�FOR�VM02ŠMOVE.L�MEMOFSET(PC),D0„*ŠADD.L‚D0,(A7)Œ*2ŠRD…#SDPLNG,(A7),(A4),PDSKERR�READ�PCB�TO�FIND�SCB"ŠMOVE.L�(A7)+,A0‹RESTORE�THE�STACK5ŠMOVE.L�SDPFSEC(A4),-(A7)‚SAVE�ADDRESS�OF�CURRENT�SCB*ŠMOVE.L�MEMOFSET(PC),D0„ADJUST�THE�ADDRESSŠADD.L‚D0,(A7)Œ*%ŠTST.L‚SDPFSEC(A4)ˆARE�THERE�ANY�SCBSŠBEQ„SCBTBL2ŒBRANCH�IF�NOT&ŠRD…#SDSLNG,(A7),(A4),PDSKERR�READ�SCBSCBTBL1 ŠMVHEX‚1,SDSSEC(A4),SDHDSSEC(PC)ŠMVHEX‚1,SDSSRT(A4),SDHDSR(PC)ŠMVHEX‚1,SDSRRT(A4),SDHDRR(PC)ŠMVHEX‚1,SDSOPT(A4),SDHDOPT(PC)ŠMVHEX‚1,SDSMXF(A4),SDHDMXF(PC)ŠMVHEX‚2,SDSTOC(A4),SDHDTOC(PC)ŠMVHEX‚2,SDSTRT(A4),SDHDTRT(PC)ŠMVHEX‚2,SDSTTX(A4),SDHDTTX( PC)ŠMVHEX‚2,SDSTPF(A4),SDHDTPF(PC)ŠMVHEX‚2,SDSTPN(A4),SDHDTPN(PC)ŠMVHEX‚2,SDSCTD(A4),SDHDCTD(PC)ŠMVHEX‚1,SDSPWR(A4),SDHDPWR(PC)ŠMVHEX‚1,SDSCSE(A4),SDHDCSE(PC)ŠMVHEX‚2,SDSTPD(A4),SDHDTPD(PC)ŠMVHEX‚1,SDSVRC(A4),SDHDVRC(PC)ŠMVHEX‚1,SDSVSC(A4),SDHDVSC(PC)ŠMVHEX‚1,SDSUKT(A4),SDHDUKT(PC)ŠMVHEX‚1,SDSCST(A4),SDHDCST(PC)ŠMVHEX‚4,SDSTHD(A4),SDHDTHD(PC)ŠMVHEX‚4,SDSTND(A4),SDHDTND(PC)ŠMVHEX‚4,SDSTNX(A4),SDHDTNX(PC) ŠPRINT‚SCBDT+ŠMOVE.L�(A7)+,A5‹GET�ADDRESS�OF�CURRENT�SCB=ŠADD.L‚#SDSLNG,A5‰NEXT�SCB�FOLLOWS�PREVIOUS�ADD�LENGTH�OF�SCB)ŠMOVE.L�A5,-(A7)‹SAVE�CURRENT�SCB�ADDRESS(ŠRD…#SDSLNG,A5,(A4),PDSKERR�READ�THE�SCBŠTST.B‚SDSSEC(A4)‰CHECK�IF�DONEŠBNE„SCBTBL1ŒBRANCH�IF�NOT�DONESCBTBL2#ŠMOVE.L�(A7)+,A5‹CLEAN�UP�THE�STACKSCBTBLXƒRTS—EXITŠPAGE ŠSECTION�0*%*ƒU�S�E�R‚D�I�R�E�C�T�I�V�E‚T�A�B�L�E* UDRHD…ENDLNLFŠDC.Bƒ'ˆUSER�DIRECTIVE�TABLE'ŠENDLINEŠDC.Bƒ'ˆ--------------------'ŠENDLNLF"ŠDC.Bƒ'„SESS„OPTIONS„ADDR‚'‚021585ŠENDLINEUDRHDE„EQU„*-1ŠDS.Wƒ0**ƒUDR�DETAIL�LINE*UDRDL…FLD„UDHDSESS,<'„'>,8,CŠFLD„UDHDROPT,<'‚'>,4,C‚021585ŠFLD„UDHDADDR,<'ƒ'>,8UDRDLE„EQU„*-1ŠDS.Wƒ0ŠPAGE ŠSECTION�8 ŠXDEFƒUDRTBLŠXREF.S�RDBUF,UDRBEG,PDSKERR)UDRTBL„WANTƒ#12,#2�Check�for�enough�linesŠPRINT‚UDRHDŽPrint�headerŠTST.L‚UDRBEG(A3)ŠBEQ„UDRTBLXŒBranch�if�no�UDR.&ŠLEA„RDBUF(PC),A4‡START�OF�READ�BUFFER*ŠRD…#6,UDRBEG(A3),(A4),PDSKERR�READ�HEADER0ŠMOVE.W�UDRCNT(A4),D6†GET�TOTAL�ENTRIES�IN�TABLE)ŠMOVE.L�UDRBEG(A3),-(A7)ƒFIND�FIRST�ENTRYŠADD.L‚#6,(A7)Œ*UDRTBL1,ŠRD…#UDRESIZ,(A7),(A4),PDSKERR�READ�AN�ENTRYŠTST.L‚UDRADDR(A4)ˆ*'ŠBEQ.S‚UDRTBL2ŒBRANCH�IF�ENTRY�NOT�USED.ŠTST.W‚UDRSESS(A4)ˆSESSION�IN�BINARY?‚<<012585ŠBNE.S‚UDRTBL15‹NO,�ASCII9ŠOR.Wƒ#$30,UDRSESS+2(A4)ƒSET�LAST�DIGIT�TO�ASCII‚012585>>)UDRTBL15‚MVASC‚4,UDRSESS(A4),UDHDSESS(PC)'ŠMVHEX‚2,UDROPT(A4),UDHDROPT(PC)ƒ021585!ŠMVHEX‚4,UDRADDR(A4),UDHDADDR(PC) ŠPRINT‚UDRDLUDRTBL22ŠSUB.W‚#1,D6ŽHAS�THE�END�OF�THE�TABLE�BEEN�REACHEDŠBEQ.S‚UDRTBL3ŒBRANCH�IF�IT�HAS(ŠADD.L‚#UDRESIZ,(A7)†POINT�TO�NEXT�ENTRY ŠBRA„UDRTBL1UDRTBL3#ŠMOVE.L�(A7)+,A5‹CLEAN�UP�THE�STACKUDRTBLXƒRTS—EXITŠPAGE ŠSECTION�0**ƒF�R�E�E‚Q�U�E�U�E*FREEHD„ENDLNLFŠDC.Bƒ'ˆFREE�QUEUE'ŠENDLINEŠDC.Bƒ'ˆ----------'ŠENDLNLFFREEHDEƒEQU„*-1ŠDS.Wƒ0**ƒFREE�QUEUE�LINE�DETAIL*%FREEQDLƒFLD„FRHEAD,<'FREEQHD�=�'>,8,CŠFLD„BFSIZE,<'‚DBUFSZ�=�'>,4,CŠFLD„FRQLWM,<'‚FQLWM�=�'>,4,CŠFLD„FRQBCNT,<'‚FQBCNT�=�'>,4FREEQDLE‚EQU„*-1ŠDS.Wƒ0ŠPAGE**ƒU�S�E�R‚Q�U�E�U�E*USEQHD„ENDLNLFŠDC.Bƒ'ˆUSER�QUEUE'ŠENDLINEŠDC.Bƒ'ˆ----------'ŠENDLNLFUSEQHDEƒEQU„*-1ŠDS.Wƒ0**ƒUSER�QUEUE�DETAIL�LINE*-USERQDLƒFLD„USEQHDR,<'ƒUSER�QUEUE�HEAD�=�'>,8USERQDLE‚EQU„*-1ŠDS.Wƒ0ŠPAGE**ƒR�E�C�E�I�V�E‚Q�U�E�U�E*RCVQHD„ENDLNLFŠDC.Bƒ'ˆRECEIVE�QUEUE'ŠENDLINEŠDC.Bƒ'ˆ-------------'ŠENDLNLFRCVQHDEƒEQU„*-1ŠDS.Wƒ0**ƒRECEIVE�QUEUE�DETAIL�LINE*0RCVQDL„FLD„SDHDRRCV,<'ƒRECEIVE�QUEUE�HEAD�=�'>,8RCVQDLEƒEQU„*-1ŠDS.Wƒ0ŠPAGE**ƒT�R�A�N�S�M�I�T‚Q�U�E�U�E* TXQHD…ENDLNLFŠDC.Bƒ'ˆTRANSMIT�QUEUE'ŠENDLINEŠDC.Bƒ'ˆ--------------'ŠENDLNLFTXQHDE„EQU„*-1ŠDS.Wƒ0**ƒTRANSMIT�QUEUE�DETAIL�LINE*3XMITQDLƒFLD„TMITQHD,<'‚TRANSMIT�QUEUE�HEAD�=�'>,8,C.ŠFLD„STANUM,<'ƒSECONDARY�STATION�NUMBER�=�'>,2XMITQDLE‚EQU„*-1ŠDS.Wƒ0ŠPAGE**„BUFFER�HEADER*/BUFHDR„DC.Bƒ'‚BADRƒSTS‚BCT‚RT�ER�CD�SC�RP„DATA'ŠENDLINEBUFHDREƒEQU„*-1ŠDS.Wƒ0**ƒBUFFER�DETAIL�LINE*BUFDL…FLD„SDHDLNK,,8,CŠFLD„SDHDSTS,<'�'>,4,CŠFLD„SDHDBCT,<'�'>,4,CŠFLD„SDHDRTC,<'�'>,2,CŠFLD„SDHDERR,<'�'>,2,CŠFLD„SDHDCMD,<'�'>,2,CŠFLD„SDHDSCD,<'�'>,2,CŠFLD„SDHDRSP,<'�'>,2,CŠFLD„SDHDRSV,<'�'>,2,CŠFLD„SDHDDAT1,<'�'>,8,CŠFLD„SDHDDAT2,,8,CŠFLD„SDHDDAT3,,8,CŠFLD„SDHDDAT4,,8,CŠFLD„SDHDDAT5,,8BUFDLE„EQU„*-1ŠDS.Wƒ0**ƒHELP�PANEL�DETAIL�LINE*HELPAHELPBHELPPNLƒFLD„CMD1,<'‚'>,4,CHELPAE„EQU„*-1ŠFLD„CMD2,<'„'>,4,CHELPBE„EQU„*-1ŠFLD„C MD3,<'„'>,4HELPPNLE‚EQU„*-1ŠDS.Wƒ0ŠPAGE* *ˆFREE�QUEUE* ŠSECTION�8ŠXDEFƒFREQ,USRQ,RECVQ,TMITQ1ŠXREF.S�RDBUF,FREEQHD,PDSKERR,DBUFSZ,FQLWM,FQBCNTŠXREF.S�USERQHD,SDLCPCBŠXREFƒMEMOFSET'FREQ†WANTƒ#12,#2�Check�for�enough�lines ŠPRINT‚FREEHD&ŠLEA„RDBUF(PC),A4‡START�OF�READ�BUFFER&ŠMOVE.L�FREEQHD(A3),A0…GET�FREE�Q�HEAD.ŠADD.L‚MEMOFSET(PC),A0„ADJUST�ADDRESS�FOR�VM02&ŠMOVE.L�A0,-(A7)‹SAVE�ADJUSTED�ADDRESSŠMVHEX‚4,FREEQHD(A3),FRHEAD(PC)ŠMVHEX‚2,DBUFSZ(A3),BFSIZE(PC)ŠMVHEX‚2,FQLWM(A3),FRQLWM(PC)ŠMVHEX‚2,FQBCNT(A3),FRQBCNT(PC)ŠPRINT‚FREEQDL+ŠTST.L‚FREEQHD(A3)ˆIS�ANYTHING�ON�THE�QUEUEŠBEQ.S‚FREQ2ŽBRANCH�IF�NOT%ŠPRINT‚BUFHDR�PRINT�THE�BUFFER�HEADER+ŠRD…#80,(A7),(A4),PDSKERR�READ�FIRST�BUFFER&ŠMOVE.L�FREEQHD(A3),-(A7)‚SAVE�ADDRESSFREQ1 ŠBSR„PRINTBUF‹DISPLAY�THE�BUFFERŠMOVE.L�(A7)+,A0‹RESTORE�STACK"ŠTST.L‚SDDLNK(A4)‰ANY�MORE�BUFFERSŠBEQ.S‚FREQ2ŽBRANCH�IF�NOT*ŠMOVE.L�SDDLNK(A4),-(A7)ƒSAVE�NEXT�ADDRESS.ŠMOVE.L�MEMOFSET(PC),D0„ADD�OFFSET�TO�VM02�MEMŠADD.L‚D0,SDDLNK(A4)†*0ŠRD…#80,SDDLNK(A4),(A4),PDSKERR�READ�NEXT�BUFFER ŠBRA„FREQ1FREQ2"ŠMOVE.L�(A7)+,A0‹RESTORE�THE�STACK ŠRTS—EXITŠPAGE* *ƒUSER�QUEUE*'USRQ†WANTƒ#12,#2�Check�for�enough�linesŠPRINT‚USEQHD�Print�the�header&ŠLEA„RDBUF(PC),A4‡START�OF�READ�BUFFER4ŠMVHEX‚4,USERQHD(A3),USEQHDR(PC)�DISPLAY�USER�Q�HEADŠPRINT‚USERQDL(ŠTST.L‚USERQHD(A3)ˆANYTHING�ON�THE�QUEUEŠBEQ.S‚USRQ3ŽBRANCH�IF�NOT!ŠPRINT‚BUFHDR�PRINT�BUFFER�HEADER@ŠMOVE.L�USERQHD(A3),-(A7)‚ADJUST�ADDRESS�BY�ADDING�OFSET�TO�VM02ŠMOVE.L�MEMOFSET(PC),D0„*ŠADD.L‚D0,(A7)Œ*+ŠRD…#80,(A7),(A4),PDSKERR�READ�FIRST�BUFFER-ŠMOVE.L�USERQHD(A3),-(A7)‚SAVE�BUFFER�ADDRESSUSRQ1%ŠBSR„PRINTBUF‹DISPLAY�BUFFER�CONTENTS"ŠMOVE.L�(A7)+,A0‹RESTORE�THE�STACK"ŠTST.L‚SDDLNK(A4)‰ANY�MORE�BUFFERSŠBEQ.S‚USRQ2ŽBRANCH�IF�NOT-ŠMOVE.L�SDDLNK(A4),-(A7)ƒSAVE�ADDRESS�OF�NEXT6ŠMOVE.L�MEMOFSET(PC),D0„ADJUST�THE�ADDRESS�TO�VM02�MEMŠADD.L‚D0,SDDLNK(A4)†*0ŠRD…#80,SDDLNK(A4),(A4),PDSKERR�READ�NEXT�BUFFER ŠBRA.S‚USRQ1USRQ2"ŠMOVE.L�(A7)+,A0‹RESTORE�THE�STACKUSRQ3ŠRTSŠPAGE**ƒRECEIVE�QUEUE*(RECVQ…WANTƒ#12,#2�Check�for�enough�linesŠPRINT‚RCVQHD�Print�header&ŠLEA„RDBUF(PC),A4‡START�OF�READ�BUFFERŠTST.L‚SDLCPCB(A3) ŠBEQ„RECVQX7ŠMOVE.L�SDLCPCB(A3),-(A7)‚ADJUST�THE�ADDRESS�OF�THE�PCBŠMOVE.L�MEMOFSET(PC),D0„*ŠADD.L‚D0,(A7)Œ*8ŠRD…#SDPLNG,(A7),(A4),PDSKERR�READ�PRIMARY�CONTROL�BLOCK9ŠMVHEX‚4,SDPRCV(A4),SDHDRRCV(PC)�PRINT�RECEIVE�QUEUE�HEAD ŠPRINT‚RCVQDL.ŠTST.L‚SDPRCV(A4)‰ANY�BUFFERS�IN�RECEIVE�QUEUEŠBEQ.S‚RECVQ2�BRANCH�IF�NOT ŠPRINT‚BUFHDR*ŠMOVE.L�MEMOFSET(PC),D0„ADJUST�THE�ADDRESSŠADD.L‚D0,SDPRCV(A4)†*,ŠMOVE.L�SDPRCV(A4),-(A7)ƒSAVE�BUFFER�ADDRESS1ŠRD…#80,SDPRCV(A4),(A4),PDSKERR�READ�FIRST�BUFFERRECVQ1%ŠBSR„PRINTBUF‹DISPLAY�BUFFER�CONTENTS"ŠMOVE.L�(A7)+,A0‹RESTORE�THE�STACK"ŠTST.L‚SDDLNK(A4)‰ANY�MORE�BUFFERSŠBEQ.S‚RECVQ2�BRANCH�IF�NOT,ŠMOVE.L�SDDLNK(A4),-(A7)ƒSAVE�BUFFER�ADDRESS*ŠMOVE.L�MEMOFSET(PC),D0„ADJUST�THE�ADDRESSŠADD.L‚D0,SDDLNK(A4)†*0ŠRD…#80,SDDLNK(A4),(A4),PDSKERR�READ�NEXT�BUFFER ŠBRA.S‚RECVQ1RECVQ2#ŠMOVE.L�(A7)+,A0‹CLEAN�UP�THE�STACKRECVQX„RTS—EXITŠPAGE**ƒDISPLAY�TRANSMIT�QUEUE*(TMITQ…WANTƒ#12,#2�Check�for�enough�linesŠPRINT‚TXQHDŽPrint�headerŠTST.L‚SDLCPCB(A3).ŠBEQ„TMITQX�Branch�if�no�primary�control�blockŠLEA„RDBUF(PC),A4/ŠMOVE.L�SDLCPCB(A3),-(A7)‚ADJUST�MEMORY�ADDRESSŠMOVE.L�MEMOFSET(PC),D0„*ŠADD.L‚D0,(A7)Œ*8ŠRD…#SDPLNG,(A7),(A4),PDSKERR�GET�THE�PCB�TO�FIND�AN�SCB"ŠMOVE.L�(A7)+,A0‹RESTORE�THE�STACK0ŠMOVE.L�SDPFSEC(A4),-(A7)‚SAVE�ADDR�OF�FIRST�SCBŠMOVE.L�MEMOFSET(PC),D0„*ŠADD.L‚D0,(A7)Œ*8ŠRD…#SDSLNG,(A7),(A4),PDSKERR�XMIT�QUEUES�ARE�IN�THE�SCBTMITQ15ŠMVHEX‚4,SDSTHD(A4),TMITQHD(PC)�PRINT�XMIT�QUEUE�HEAD2ŠMVHEX‚1,SDSSEC(A4),STANUM(PC)�SEC.�STATION�NUMBERŠPRINT‚XMITQDLŒ*(ŠTST.L‚SDSTHD(A4)‰ANYTHING�ON�XMIT�QUEUE%ŠBEQ.S‚TMITQ3�BRANCH�IF�NOTHING�THERE+ŠMOVE.L�SDSTHD(A4),-(A7)ƒSAVE�BUFFER�HEADER&ŠPRINT‚BUFHDR�PRINT�BUFFER�HEADER�LINE*ŠMOVE.L�MEMOFSET(PC),D0„ADJUST�THE�ADDRESSŠADD.L‚D 0,SDSTHD(A4)†*6ŠRD…#80,SDSTHD(A4),(A4),PDSKERR�READ�FIRST�XMIT�BUFFERTMITQ26ŠBSR„PRINTBUF‹DISPLAY�THE�FIRST�40�BYTES�OF�THE�BUFFER"ŠMOVE.L�(A7)+,A0‹RESTORE�THE�STACK!ŠTST.L‚SDDLNK(A4)‰ANY�MORE�LINKED&ŠBEQ.S‚TMITQ3�BRANCH�IF�NO�MORE�LINKED0ŠMOVE.L�SDDLNK(A4),-(A7)ƒSAVE�THE�BUFFER�ADDRESS*ŠMOVE.L�MEMOFSET(PC),D0„ADJUST�THE�ADDRESSŠADD.L‚D0,SDDLNK(A4)†*5ŠRD…#80,SDDLNK(A4),(A4),PDSKERR�READ�NEXT�XMIT�BUFFER ŠBRA.S‚TMITQ2TMITQ3%ŠADD.L‚#SDSLNG,(A7)‡POINT�TO�NEXT�SCB+ŠRD…#SDSLNG,(A7),(A4),PDSKERR�READ�NEXT�SCB)ŠTST.B‚SDSSEC(A4)‰IS�THIS�SCB�A�VALID�ONEŠBNE„TMITQ1�BRANCH�IF�MORE�SCBSTMITQ4#ŠMOVE.L�(A7)+,A6‹CLEAN�UP�THE�STACKTMITQX„RTS—EXITŠPAGE** HELP COMMAND*!HELPSO„DC.Bƒ'Start�up�option�is:'ŠENDLNLF5ŠDC.Bƒ';S=$xxxx„Where�$xxxx�is�the�address�of�SYSPAR'ŠENDLINE&ŠDC.Bƒ'ŒThis�address�defaults�to�$900'ŠENDLNLFŠDC.Bƒ'Legal�subcommands�are:'ŠENDLNLFHELPSOEƒEQU„*-1ŠDS…0ŠPAGE ŠSECTION�8**„DISPLAY�LEGAL�COMMANDS*ŠXREFƒCMDTBL,CMDTBLE ŠXDEFƒHELPHELP ŠPRINT‚HELPSO!ŠPEA„CMDTBL(PC)‰CMD�TABLE�ADDRESSHELP1ŠMOVE.L�(A7),A5ŒEND�OF�TABLE�?ŠLEA„CMDTBLE(PC),A0…*ŠCMP.L‚A0,A5Ž*ŠBEQ„HELP4ŽBRANCH�IF�DONE=ŠMVASC‚4,(A5),CMD1(PC)„MOVE�ASCII�OF�COMMAND�INTO�DISPLAY�BUF$ŠADD.L‚#8,(A7)ŒPOINT�TO�NEXT�COMMANDŠMOVE.L�(A7),A5ŒEND�OF�TABLE�?ŠLEA„CMDTBLE(PC),A0…*ŠCMP.L‚A0,A5Ž*ŠBEQ.S‚HELP3ŽBRANCH�IF�IT�IS(ŠMVASC‚4,(A5),CMD2(PC)„MOVE�NEXT�COMMAND$ŠADD.L‚#8,(A7)ŒPOINT�TO�NEXT�COMMANDŠMOVE.L�(A7),A5ŒEND�OF�TABLE�?ŠLEA„CMDTBLE(PC),A0…* ŠCMP.L‚A0,A5ŠBEQ.S‚HELP2ŽBRANCH�IF�IT�IS(ŠMVASC‚4,(A5),CMD3(PC)„MOVE�NEXT�COMMANDŠPRINT‚HELPPNLŠADD.L‚#8,(A7)ŒNEXT�COMMAND ŠBRA„HELP1HELP21ŠPRINT‚HELPBŽPRINT�2�OF�THE�THREE�COMMAND�BUFFERSŠBRA.S‚HELP4Ž*HELP31ŠPRINT‚HELPAŽPRINT�1�OF�THE�THREE�COMMAND�BUFFERSHELP4"ŠMOVE.L�(A7)+,A0‹RESTORE�THE�STACK ŠRTS—EXITŠPAGE*5*„DISPLAY�BUFFER�CONTENTS�SUBROUTINE‚(FIRST�40�BYTES)**%*†ENT:‚A7�-�ADDRESS�OF�BUFFER�ADDRESS*PRINTBUF1ŠMVHEX‚4,4(A7),SDHDLNK(PC)�CURRENT�BUFFER�ADDRESS/ŠMVHEX‚2,SDDSTS(A4),SDHDSTS(PC)�RETURNED�STATUS:ŠMVHEX‚2,SDDBCT(A4),SDHDBCT(PC)�ACTUAL�XMIT/RCV�BYTE�COUNT+ŠMVHEX‚1,SDDRTC(A4),SDHDRTC(PC)�RETRY�COUNT+ŠMVHEX‚1,SDDERR(A4),SDHDERR(PC)�SDLC�ERRORS,ŠMVHEX‚1,SDDCMD(A4),SDHDCMD(PC)�SDLC�COMMAND2ŠMVHEX‚1,SDDSEC(A4),SDHDSCD(PC)�SDLC�SEC�STATION�#-ŠMVHEX‚1,SDDRSP(A4),SDHDRSP(PC)�SDLC�RESPONSE/ŠMVHEX‚1,SDDRSP+1(A4),SDHDRSV(PC)�RESERVED�BYTE/ŠMVHEX‚4,SDDDAT(A4),SDHDDAT1(PC)�DATA�IN�BUFFER$ŠMVHEX‚4,SDDDAT+4(A4),SDHDDAT2(PC)�*$ŠMVHEX‚4,SDDDAT+8(A4),SDHDDAT3(PC)�*%ŠMVHEX‚4,SDDDAT+12(A4),SDHDDAT4(PC)�*%ŠMVHEX‚4,SDDDAT+16(A4),SDHDDAT5(PC)�*ŠPRINT‚BUFDLŽPRINT�THE�LINE ŠRTS—EXITéé;ŠTTL„ANALPDMP.AIˆ-�Crash/System�analysis�-�DUMPANAL/SYSANALŠPAGE9**********************************************************�INCLUDE�FILE:�ANALPDMP.AI�*9***********************************************************‰REVISION�STATUS:*‰---------------**’11/15/83�-�EE5*’Clear�bit�zero�on�MD�so�it�does�not�say�dump�is�odd/*’byte�while�actually�starting�it�on�even�byte.** ŠSECTION�0 ŠXDEFƒADRBGND)ADRBGNDƒDC.Lƒ0’SAVE�ADDRESS�TO�START�DUMP ŠXDEFƒCNTBYTECNTBYTEƒDC.Lƒ0’#�BYTES�TO�DUMPŠXDEFƒADROFST1)ADROFST1‚DC.Lƒ0’OFFSET�TO�LOGICAL�ADDRESSŠXDEFƒADROFST23ADROFST2‚DC.Lƒ0’TEMP�OFFSET�GIVEN�WITH�DUMP�COMMAND*SAMEABOV‚DC.Bƒ'Œ'?ŠDC.Bƒ'********************�SAME�AS�ABOVE�********************' ŠDC.Bƒ'�'*HOLDLINƒ DS.Bƒ16RBUF†DS.Bƒ$100 ŠXDEFƒRDBUFRDBUF…DS.BƒMAXBUFŠPAGE ŠSECTION�8+ŠXREF.S�HEXBIN,NEWPAGE,PRTL80,FMTLIN,PRTLIN'ŠXREF.S�CMDPRO,OFFSETC,CMDPWHAT,PDSKER6**…DUMP�BLOCK�OF�MEMORY.*ˆA0�=�0�OR�POINTS�TO�PARAMETERS�ON�INPUT�LINE* ŠXDEFƒPADMPPADMP…LEA„BEGDATA(PC),A6:ŠMOVE.L�ADROFST1-BD(A6),ADROFST2-BD(A6)�GET�DEFAULT�OFFSET3ŠLEA„ADRBGND(PC),A1‰PLACE�TO�PUT�DUMP�START�ADDRESSŠBSR„HEXBIN�CONVERT�ADDRESS-ŠBMI„CMDPWHAT‹BRANCH�IF�BAD�VALUE�FOR�ADDRESS ŠBEQ.S‚PADMP2�BRANCH�IF�NO�COMMA(ŠLEA„ADROFST2(PC),A1ˆPLACE�TO�PUT�OFFSETŠBSR„OFFSETCŒCONVERT�OFFSET,ŠBNE„CMDPWHAT‹BRANCH�IF�BAD�VALUE�FOR�OFFSET7PADMP2„LEA„CNTBYTE(PC),A1‰PLACE�TO�STORE�ENDING�ADDRESS"ŠBSR„HEXBIN�CONVERT�ENDING�ADDRESS1ŠBNE„CMDPWHAT‹BRANCH�IF�BAD�VALUE�FOR�END�ADDRESS)ŠMOVE.L�CNTBYTE-BD(A6),D0‰GET�END�ADDRESS5ŠSUB.L‚ADRBGND-BD(A6),D0‰-�START�ADDRESS�=�BYTE�COUNTŠBMI„CMDPWHAT‹CAN'T�BE�MINUS)ŠADD.L‚#1,D0ŽINCLUDE�THE�END�POINT�012985&ŠMOVE.L�D0,CNTBYTE-BD(A6)‚SAVE�#�BYTESŠBRA.S‚PMDMP3�CONTINUE�DUMP* ŠXDEFƒPMDMPPMDMP…LEA„BEGDATA(PC),A6:ŠMOVE.L�ADROFST1-BD(A6),ADROFST2-BD(A6)�GET�DEFAULT�OFFSET3ŠLEA„ADRBGND(PC),A1‰PLACE�TO�PUT�DUMP�START�ADDRESSŠBSR„HEXBIN�CONVERT�ADDRESS-ŠBMI„CMDPWHAT‹BRANCH�IF�BAD�VALUE�FOR�ADDRESSUB^@f' ŠBEQ.S‚PMDMP2�BRANCH�IF�NO�COMMA(ŠLEA„ADROFST2(PC),A1ˆPLACE�TO�PUT�OFFSETŠBSR„OFFSETCŒCONVERT�OFFSET,ŠBNE„CMDPWHAT‹BRANCH�IF�BAD�VALUE�FOR�OFFSET3PMDMP2„LEA„CNTBYTE(PC),A1‰PLACE�TO�STORE�BYTE�COUNTŠBSR„HEXBIN�CONVERT�#�BYTES+ŠBNE„CMDPWHAT‹BRANCH�IF�BAD�VALUE�FOR�COUNT$PMDMP3„BSR„NEWPAGEŒSTART�ON�NEW�PAGEŠBSR.S‚PMDUMP�GO�PRINT�DUMP#ŠBRA„CMDPRO�RETURM�FOR�NEXT�COMMANDŠPAGE*3*„PMDUMP‚-‚FORMAT�AND�PRINT�SPECIFIED�BLOCK�OF�DUMP*!*ˆADRBGND�=�ADDRESS�TO�START�DUMP*ˆADROFST2�=�OFFSET*ˆCNTBYTE‚=�NUMBER�OF�BYTES* ŠXDEFƒPMDUMP PMDUMP„BEGSUB(ŠMOVE.L�CNTBYTE-BD(A6),D0‰GET�BYTE�COUNT ŠBNE.S‚PMDMP4�BRANCH�IF�NOT�ZERO ŠMOVE.L�#1,D0ŽMUST�BE�AT�LEAST�1PMDMP4„ADD.L‚#$F,D0�ADD�15/ŠAND.B‚#$F0,D0ŒALWAYS�DUMP�MULTIPLE�OF�16�BYTES-ŠMOVE.L�D0,CNTBYTE-BD(A6)‚SAVE�ADJUSTED�COUNT**…READ�FROM�DISKETTE�OR�MEMORY*ŠCLR.L‚D7‘FLAG�1ST�LINE0PMDMP6„MOVE.L�ADRBGND-BD(A6),D1‰STARTING�ADDRESS$ŠADD.L‚ADROFST2-BD(A6),D1ˆADD�OFFSET ŠMOVE.L�CNTBYTE-BD(A6),D2‰LENGTH&ŠBLE„PMDMP30ŒBRANCH�IF�NO�MORE�TO�DUMP-ŠSUB.L‚#MAXBUF,CNTBYTE-BD(A6)�MAXIMUM�#�BYTES-ŠBMI.S‚PMDMP8�BRANCH�IF�READ�IS�LESS�THAN�MAX#ŠMOVE.L�#MAXBUF,D2‰SET�COUNT�TO�MAX-PMDMP8„RD…D2,D1,RDBUF(PC),PDSKER6,X�READ�DISK%ŠLEA„RDBUF(PC),A5‹ADDRESS�TO�GET�DATA8ŠMOVE.L�ADRBGND-BD(A6),D6‚ADDRESS�TO�START�DUMPŠ11/15/835ŠBCLRƒ#0,D6Žmake�sure�dump�is�from�even�byte�11/15/83ŠMOVE.L�D6,A4¯11/15/83ŠMOVE.L�D2,D6Ž#�BYTES�TO�DUMP**†FORMAT�AND�PRINT�DUMP�LINES*ŠTST.W‚D7‘CHECK�FOR�1ST�LINE!ŠBEQ.S‚PMDMP14ŒBRANCH�IF�1ST�LINE(PMDMP10ƒMOVE.L�A5,A0ŽPOINTER�TO�16�BYTES2ŠLEA„HOLDLIN(PC),A1‰BUFFER�WITH�PRECEDING�16�BYTES%ŠMOVE.L�#4,D0Ž16�BYTES�=�4�LONG�WORDS)PMDMP12ƒCMP.L‚(A0)+,(A1)+ˆCOMPARE�4�BYTES!ŠBNE.S‚PMDMP14ŒBRANCH�IF�NOT�SAME ŠSUB.L‚#1,D0 ŠBNE„PMDMP12"ŠTST.W‚D7‘HAS�'SAME'�BEEN�PRINTED?ŠBMI.S‚PMDMP20ŒBRANCH�IF�YESŠNOT.W‚D7‘FLAG�'SAME'�PRINTED'ŠLEA„SAMEABOV(PC),A1ˆADDRESS�OF�MESSAGEŠBSR„PRTL80�GO�PRINT�MESSAGEŠBRA.S‚PMDMP20* PMDMP14ƒEQU„*!ŠMOVE.L�#1,D7ŽFLAG�-�NOT�1ST�LINE!ŠMOVE.L�A5,A0ŽADDRESS�OF�16�BYTES$ŠLEA„HOLDLIN(PC),A1‰SAVE�FOR�COMPAREŠMOVE.L�(A0)+,(A1)+ŠMOVE.L�(A0)+,(A1)+ŠMOVE.L�(A0)+,(A1)+ŠMOVE.L�(A0)+,(A1)+**ŠMOVE.L�A5,A0ŽADDRESS�OF�16�BYTES�TO�PRINT*ŠLEA„PRTLIN(PC),A1†ADDRESS�OF�PRINT�BUFFER'ŠMOVE.L�A4,D0ŽPHYSICAL�ADDRESS�TO�PRINT&ŠMOVE.L�A4,D1ŽLOGICAL�ADDRESS�TO�PRINT5ŠADD.L‚ADROFST2-BD(A6),D0�ADD�OFFSET�TO�PHYSICAL�ADDR ŠBSR„FMTLIN�GO�FORMAT�PRINT�LINEŠLEA„PRTLIN(PC),A1ŠBSR„PRTL80�PRINT�IT**„INCREMENT�TO�NEXT�LINE*PMDMP20ƒ ADD.L‚#16,A4 ŠADD.L‚#16,A5ŠSUB.L‚#16,D2�DECREMENT�#�BYTESŠBGT„PMDMP10ŒBRANCH�IF�MORE.ŠMOVE.L�A4,ADRBGND-BD(A6)‚NEW�STARTING�ADDRESSŠBRA„PMDMP6�GO�READ�MORE*!*‡DUMP�FINISHED�-�CHECK�LAST�LINE*'PMDMP30ƒTST.W‚D7‘WAS�LAST�LINE�PRINTED?ŠBPL.S‚PMDMP40ŒBRANCH�IF�YES$ŠLEA„HOLDLIN(PC),A0‰CONTENTS�OF�LINE'ŠLEA„PRTLIN(PC),A1†ADDR�OF�PRINT�BUFFER&ŠLEA„-16(A4),A4‰BACK�UP�TO�GET�ADDRESSŠMOVE.L�A4,D0ŽPHYSICAL�ADDRESSŠMOVE.L�A4,D1ŽLOGICAL�ADDRESS8ŠADD.L‚ADROFST2-BD(A6),D0�ADD�OFFSET�TO�PHYSICAL�ADDRESS ŠBSR„FMTLIN�GO�FORMAT�PRINT�LINEŠLEA„PRTLIN(PC),A1ŠBSR„PRTL80�PRINT�ITPMDMP40ƒENDSUBééé;ŠTTL„ANALSYSP.AIˆ-�Crash/System�analysis�-�DUMPANAL/SYSANALŠPAGE9**********************************************************�INCLUDE�FILE:�ANALSYSP.AI�*9********************************************************* ŠSECTION�0**…S�Y�S�P�A�RƒV�A�R�I�A�B�L�E�S*3SPARHD„DC.Bƒ'ˆSYSPAR�VARIABLES�-�SYSPAR�ADDRESS�=�'SPARAD„DC.Bƒ'ˆ'ŠENDLINEŠDC.Bƒ'ˆ----------------'ŠENDLINE*ŠFLD„SPHDMB,<'MAPBEGƒ'>,8,CŠFLD„SPHDES,<'„EXECSTACK‚'>,8,CŠFLD„SPHDDT,<'„DATE‡'>,8,CŠFLD„SPHDDT2,<'„'>,8*ŠFLD„SPHDRN,<'RUNNERƒ'>,8,CŠFLD„SPHDTH,<'„TCBHD†'>,8,CŠFLD„SPHDTD,<'„TIMEOD…'>,8,CŠFLD„SPHDTD2,<'„'>,8*ŠFLD„SPHDRH,<'READYHD‚'>,8,C ŠFLD„SPHDCH,<'„CCBHD†'>,8„102684*ŠFLD„SPHDMH,<'MMUHERE‚'>,8,C!ŠFLD„SPHDGB,<'„GSTBEG…'>,8„102684*ŠFLD„SPHDUB,<'USTBEGƒ'>,8,CŠFLD„SPHDUD,<'„UDRBEG…'>,8,CŠFLD„SPHDPB,<'„PATBEG…'>,8*ŠFLD„SPHDTB,<'TRACBEG‚'>,8,CŠFLD„SPHDTF,<'„TRACFLAGƒ'>,8,CŠFLD„SPHDMS,<'„MACSTRC„'>,8*ŠFLD„SPHPNL,<'PANEL„'>,8,CŠFLD„SPHDPT,<'„PTMADDR„'>,8,CŠFLD„SPHTMO,<'„TIMEOUT„'>,8*ŠFLD„SPHTSC,<'TIMESLIC�'>,8,CŠFLD„SPHTTV,<'„TIMINTV„'>,8,CŠFLD„SPHTV4,<'„TIMINTV4ƒ'>,8*ŠFLD„SPHTTF,<'TINTFLAG�'>,8,CŠFLD„SPHSPR,<'„SPURCNT„'>,8*ŠFLD„MMULOA,<'MMULOAD‚'>,8,CŠFLD„VCTUBG,<'„VCTUBGN„'>,8,CŠFLD„SPURTIM,<'„SPURTIMEƒ'>,8,CŠFLD„SPURTI2,<'„'>,8*ŠFLD„SPHDIB,<'IOVCTBGN�'>,8,CŠFLD„SPHST7,<'„SLFTSTA7ƒ'>,8*ŠFLD„FREEQH,<'FREEQHD‚'>,8,CŠFLD„DBUFS,<'„DBUFSZ…'>,8,CŠFLD„FQLW,<'„FQLWM†'>,8*ŠFLD„FQBCN,<'FQBCNTƒ'>,8,CŠFLD„USERQH,<'„USERQHD„'>,8,CŠFLD„USERQN,<'„USERQND„'>,8*ŠFLD„SDLCPC,<'SDLCPCB‚'>,8,CŠFLD„NNTBEX,<'„NNTBEG…'>,8,CŠFLD„NATBEX,<'„NATBEG…'>,8*ŠFLD„LCTBEX,<'LCTBEGƒ'>,8,CŠFLD„NWPSE,<'„NWPSEG…'>,8,CŠFLD„NWTSE,<'„NWTSEG…'>,8*ŠFLD„NWDQH,<'NWDQHDƒ'>,8,CŠFLD„NWSTATU,<'„NWSTATUSƒ'>,8,CŠFLD„V2RQH,<'„V2RQHD…'>,8*ŠFLD„MEMOF,<'MEMOFFƒ'>,8,CŠFLD„SYSPOF,<'„SYSPOFF„'>,8,CŠFLD„CTRLRE,<'„CTRLREG„'>,8*ŠFLD„DPRVA,<'DPRVAOƒ'>,8,CŠFLD„RAD1TB,<'„RAD1TBL„'>,8,CnTwA1ŠFLD„RIOTB,<'„RIOTBL…'>,8*ŠFLD„FREEQN,<'FREEQND‚'>,8*ŠENDLINE(ŠFLD„SPHDAD,<'MEM�DEFAULTS�--�ASQ='>,2,CŠFLD„SPHDTDF,<'�TCB='>,2,CŠFLD„SPHDSD1,<'‚SYS�TASK='>,2,CŠFLD„SPHDSD2,<'�'>,2,C ŠFLD„SPHDUD1,<'‚USER�TASK='>,2,CŠFLD„SPHDUD2,<'�'> ,2SPARHDEƒEQU„*-1ŠDS.Wƒ0ŠPAGE ŠSECTION�8ŠOPT„PCS**‡XREF'S�FOR�SYSPAR�VARIABLES*ŠXREF.S�SYSPAR,CRASHSAVŠXREF.S�MAPBEG3ŠXREF.S�EXCSTACK,RUNNER,TCBHD,READYHD,CCBHD,MMUHERE<ŠXREF.S�UDRBEG,GSTBEG,USTBEG,TRACEBEG,TRACFLAG,MACSTRC,PANEL"ŠXREF.S�PATBEG,DATE,TIMEOD,PTMADDR;ŠXREF.S�TIMEOUT,TIMESLIC,TIMINTV,TIMINTV4,TINTFLAG,SLFTSTA71ŠXREF.S�SPURCNT,SPURTIME,MMULOAD,VCTUBGN,IOVCTBGN'ŠXREF.S�ADEFTYP,TDEFTYP,SDEFTYP,UDEFTYPŠXREF.S�DATEOG,CONVDATEDŠXREF.S�SYSPAROF,FREEQHD,DBUFSZ,FQLWM,FQBCNT,USERQHD,USERQND,SDLCPCBAŠXREF.S�NNTBEG,NATBEG,LCTBEG,NWPSEG,NWTSEG,NWDQHD,NWSTATUS,V2RQHD<ŠXREF.S�MEMOFF,SYSPOFF,CTRLREG,DPRVAO,RAD1TBL,RIOTBL,FREEQND **‚*�*�*ƒPRINT�SYSPARƒ*�*�** ŠXDEFƒSYSPARM*ŠXREF.S�READSP,PDATESYSPARMƒWANTƒ#20,#20/ŠMVHEX‚4,SYSPAROF(PC),SPARAD(PC)�SYSPAR�address"ŠBSR„READSP�Read�system�parameters$ŠMOVE.L�DATE(A3),D0ˆGET�CURRENT�DATE ŠBSR„DATEOG�CONVERT�TO�GREGORIAN&ŠLEA„SPHDDT2(PC),A1‰PRINT�BUFF�ADDRESSŠBSR„CONVDATE‹CONVERT�TO�ASCII%ŠMVHEX‚4,MAPBEG(A3),SPHDMB(PC)‚MAPBEG)ŠMVHEX‚4,EXCSTACK(A3),SPHDES(PC)�EXCSTACK%ŠMVHEX‚4,RUNNER(A3),SPHDRN(PC)�RUNNER#ŠMVHEX‚4,TCBHD(A3),SPHDTH(PC)�TCBHD'ŠMVHEX‚4,READYHD(A3),SPHDRH(PC)�READYHD#ŠMVHEX‚4,CCBHD(A3),SPHDCH(PC)�CCBHD'ŠMVHEX‚4,MMUHERE(A3),SPHDMH(PC)�MMUHERE%ŠMVHEX‚4,GSTBEG(A3),SPHDGB(PC)�GSTBEG%ŠMVHEX‚4,USTBEG(A3),SPHDUB(PC)�USTBEG%ŠMVHEX‚4,UDRBEG(A3),SPHDUD(PC)‚UDRBEG%ŠMVHEX‚4,PATBEG(A3),SPHDPB(PC)‚PATBEG)ŠMVHEX‚4,TRACEBEG(A3),SPHDTB(PC)‚TRACEBEG'ŠMVHEX‚4,MACSTRC(A3),SPHDMS(PC)‚MACSTRC#ŠMVHEX‚4,PANEL(A3),SPHPNL(PC)‚PANEL!ŠMVHEX‚4,DATE(A3),SPHDDT(PC)‚DATEŠBSR„TIMEOD†102684ŠMOVE.L�D0,D1‡102684)ŠMVHEX‚4,D1,SPHDTD(PC)�TIME�OF�DAY‰102684'ŠMVHEX‚4,PTMADDR(A3),SPHDPT(PC)‚PTMADDR.ŠMVHEX‚2,SPURCNT(A3),SPHSPR(PC)‚SPUR�INT�COUNT0ŠMVHEX‚4,MMULOAD(A3),MMULOA(PC)‚MMU�LOAD�ADDRESS'ŠMVHEX‚4,VCTUBGN(A3),VCTUBG(PC)‚VCTUBGN)ŠMVHEX‚4,IOVCTBGN(A3),SPHDIB(PC)‚IOVCTBGN,ŠMVHEX‚2,TRACFLAG(A3),SPHDTF(PC)‚TRACE�FLAGS,ŠMVHEX‚1,ADEFTYP(A3),SPHDAD(PC)‚ASQ�MEM�TYPE-ŠMVHEX‚1,TDEFTYP(A3),SPHDTDF(PC)‚TCB�MEM�TYPE2ŠMVHEX‚1,SDEFTYP(A3),SPHDSD1(PC)‚SYS�TASK�MEM�TYPE4ŠMVHEX‚1,SDEFTYP+1(A3),SPHDSD2(PC)‚SYS�TASK�MEM�TYPE3ŠMVHEX‚1,UDEFTYP(A3),SPHDUD1(PC)‚USER�TASK�MEM�TYPE5ŠMVHEX‚1,UDEFTYP+1(A3),SPHDUD2(PC)‚USER�TASK�MEM�TYPEŠBSR„TIMEODˆ102684ŠATIME‚D0,SPHDTD2„102684ŠATIME‚SPURTIME(A3),SPURTI2*ŠMVHEX‚2,TIMEOUT(A3),SPHTMO(PC) ŠMVHEX‚2,TIMESLIC(A3),SPHTSC(PC)ŠMVHEX‚2,TIMINTV(A3),SPHTTV(PC) ŠMVHEX‚2,TIMINTV4(A3),SPHTV4(PC) ŠMVHEX‚1,TINTFLAG(A3),SPHTTF(PC)ŠMVHEX‚4,MMULOAD(A3),MMULOA(PC)ŠMVHEX‚4,VCTUBGN(A3),VCTUBG(PC)!ŠMVHEX‚4,SPURTIME(A3),SPURTIM(PC) ŠMVHEX‚4,SLFTSTA7(A3),SPHST7(PC)*ŠMVHEX‚4,FREEQHD(A3),FREEQH(PC)ŠMVHEX‚2,DBUFSZ(A3),DBUFS(PC)ŠMVHEX‚2,FQLWM(A3),FQLW(PC)ŠMVHEX‚2,FQBCNT(A3),FQBCN(PC)ŠMVHEX‚4,USERQHD(A3),USERQH(PC)ŠMVHEX‚4,USERQND(A3),USERQN(PC)ŠMVHEX‚4,SDLCPCB(A3),SDLCPC(PC)ŠMVHEX‚4,NNTBEG(A3),NNTBEX(PC)ŠMVHEX‚4,NATBEG(A3),NATBEX(PC)ŠMVHEX‚4,LCTBEG(A3),LCTBEX(PC)ŠMVHEX‚4,NWPSEG(A3),NWPSE(PC)ŠMVHEX‚4,NWTSEG(A3),NWTSE(PC)ŠMVHEX‚4,NWDQHD(A3),NWDQH(PC)!ŠMVHEX‚4,NWSTATUS(A3),NWSTATU(PC)ŠMVHEX‚4,V2RQHD(A3),V2RQH(PC)ŠMVHEX‚4,MEMOFF(A3),MEMOF(PC)ŠMVHEX‚4,SYSPOFF(A3),SYSPOF(PC)ŠMVHEX‚4,CTRLREG(A3),CTRLRE(PC)ŠMVHEX‚4,DPRVAO(A3),DPRVA(PC)ŠMVHEX‚4,RAD1TBL(A3),RAD1TB(PC)ŠMVHEX‚4,RIOTBL(A3),RIOTB(PC)ŠMVHEX‚4,FREEQND(A3),FREEQN(PC)*ŠPRINT‚SPARHD�PRINT�THE�PAGEŠRTSé;ŠTTL„ANALTABL.SAˆ-�Crash/System�analysis�-�DUMPANAL/SYSANAL7ANALTABL‚IDNTƒ4,3�PRINT�TABLES�FOR�SYSANAL�AND�DUMPANAL ŠXREFƒMBD*ˆINCLUDE�ANALMACR.AI**ˆINCLUDE�9995.&.TCB.EQ†Task�control�block**ˆINCLUDE�9995.&.TST.EQ†Task�segment�table,*ˆINCLUDE� 9995.&.GST.EQ†Global�segment�table3*ˆINCLUDE�9995.&.BAB.EQ†Background�activation�block1*ˆINCLUDE�9995.&.PAT.EQ†Periodic�activation�table)*ˆINCLUDE�9995.&.TIOT.EQ…Trap�owner�table,*ˆINCLUDE�9995.&.UST.EQ†User�semephore�table4*ˆINCLUDE�9995.&.UDR.EQ†User�defined�directive�table"*ˆINCLUDE�9995.&.MAP.EQ†Memory�map1*ˆINCLUDE�9995.&.ASQ.EQ†Asynchronous�Queueƒ012585,*ˆINCLUDE�9995.NTS.NNT.EQ„Network�name�table/*ˆINCLUDE�9995.NTS.NAT.EQ„Network�address�table/*ˆINCLUDE�9995.NTS.LCT.EQ„Logical�connect�table.*ˆINCLUDE�9995.SDLCPRI.TEMPLTS.EQ�SDLC�equates'*ˆINCLUDE�ANALSYSP.AI‹SYSTEM�PARAMETERS1*ˆINCLUDE�ANALTRAP.AI‹TRAP�TABLES�(TIAT�AND�TIOT) *ˆINCLUDE�ANALTASK.AI‹LIST�TASKS)*ˆINCLUDE�ANALGST.AIŒGLOBAL�SEGMENT�TABLE)*ˆINCLUDE�ANALUST.AIŒUSER�SEMAPHORE�TABLE,*ˆINCLUDE�ANALCCBS.AI‹CHANNEL�CONTROL�BLOCKS-*ˆINCLUDE�ANALMAP.AIŒMEMORY�MAP�AND�FREE�LIST,*ˆINCLUDE�ANALNET.AIŒNETWORK�SERVICES�TABLESŠNOLISTŠINCLUDE�ANALMACR.AIŠLIST)ŠINCLUDE�9995.&.TCB.EQ†Task�control�block)ŠINCLUDE�9995.&.TST.EQ†Task�segment�table+ŠINCLUDE�9995.&.GST.EQ†Global�segment�table2ŠINCLUDE�9995.&.BAB.EQ†Background�activation�block0ŠINCLUDE�9995.&.PAT.EQ†Periodic�activation�table(ŠINCLUDE�9995.&.TIOT.EQ…Trap�owner�table+ŠINCLUDE�9995.&.UST.EQ†User�semephore�table3ŠINCLUDE�9995.&.UDR.EQ†User�defined�directive�table!ŠINCLUDE�9995.&.MAP.EQ†Memory�map0ŠINCLUDE�9995.&.ASQ.EQ†Asynchronous�Queue‚012585+ŠINCLUDE�9995.NTS.NNT.EQ„Network�name�table.ŠINCLUDE�9995.NTS.NAT.EQ„Network�address�table.ŠINCLUDE�9995.NTS.LCT.EQ„Logical�connect�table-ŠINCLUDE�9995.SDLCPRI.TEMPLTS.EQ�SDLC�equates&ŠINCLUDE�ANALSYSP.AI…SYSTEM�PARAMETERS0ŠINCLUDE�ANALTRAP.AI…TRAP�TABLES�(TIAT�AND�TIOT)ŠINCLUDE�ANALTASK.AI…LIST�TASKS(ŠINCLUDE�ANALGST.AI†GLOBAL�SEGMENT�TABLE‡/�(ŠINCLUDE�ANALUST.AI†USER�SEMAPHORE�TABLE+ŠINCLUDE�ANALCCBS.AI…CHANNEL�CONTROL�BLOCKS,ŠINCLUDE�ANALMAP.AI†MEMORY�MAP�AND�FREE�LIST+ŠINCLUDE�ANALNET.AI†NETWORK�SERVICES�TABLESŠENDééééééé ;ŠTTL„ANALTASK.AIˆ-�Crash/System�analysis�-�DUMPANAL/SYSANALŠPAGE9**********************************************************�INCLUDE�FILE:�ANALTASK.AI�*9********************************************************* ŠSECTION�0*&*ˆDATA�SECTION�FOR�TASK�CONTROL�BLOCKS***…BUFFER�SPACE‚FOR�TASK�TABLE* ŠOFFSET�0TASKTNAM‚DS.Lƒ1TASKTSES‚DS.Lƒ1TASKTADR‚DS.Lƒ1TASKTESZ‚EQU„*-TASKTNAM* ŠSECTION�0* BEGDATAƒEQU„*BDˆEQU„* ŠXDEFƒBLDTFLGBLDTFLGƒDC.Wƒ0ŠXDEFƒTASKTCNT,TASKTBLTASKTCNT‚DC.Wƒ0TASKTBLƒDCB.B‚TASKTESZ*50,0ŠPAGE*!*�T�A�S�KƒC�O�N�T�R�O�LƒB�L�O�C�K*TCHDG1„ENDLINESPACE…DC.Bƒ'�'"SPACEE„DC.Bƒ'‡TASK�CONTROL�BLOCKS'ŠENDLINEŠDC.Bƒ'ˆ-------------------'ŠENDLINETCHDG1EƒEQU„*-1ŠDS.Wƒ0*RLHDG1„ENDLINEŠDC.Bƒ'ˆREADY�LIST�CHAIN'ŠENDLINEŠDC.Bƒ'ˆ----------------'ŠENDLINERLHDG1EƒEQU„*-1ŠDS.Wƒ0 DLHD1…ENDLINE4ŠDC.Bƒ'ˆPERIODIC�ACTIVATION�TABLEƒ-�CURRENT�TIME�=�'DLHDTM„DC.Bƒ'XX:XX:XX'ŠENDLINE"ŠDC.Bƒ'ˆ-------------------------'ŠENDLINEDLHD1E„EQU„*-1ŠDS.Wƒ0*,4,CƒTCBNAME�(ASCII)ŠFLD„TCHDSS,<'�'>,4,CƒSESSIONŠFLD„TCHDUR,<'�'>,4,CƒUSER'ŠFLD„TCHCPRI,<'�'>,2,C‚CURRENT�PRIORITY%ŠFLD„TCHLPRI,<'�'>,2,C‚LIMITƒPRIORITY#ŠFLD„TCHRPRI,<'�'>,2,C‚RUN…PRIORITYŠFLD„TCHDST,<'�'>,4,CƒSTATE!ŠFLD„TCHDUT,<'�'>,2,CƒUSER�TRAP�#%ŠFLD„TCHDSR,<'�'>,4,CƒSTATUS�REGISTER%ŠFLD„TCHDPC,<'�'>,6,CƒPROGRAM�COUNTER!ŠFLD„TCHDABT,<'�'>,4,C‚ABORT�CODEŠFLD„TCHDASQ,<'�'>,6,C‚ASQ!ŠFLD„TCHDLAY,<'�'>,8,C‚DELAY�TIME#ŠFLD„TCHMONT,<'�'>,4,C‚MONITOR�TASK˜Z¡U©E±B¹OÁIÉCÑ5#TCHMONSƒDC.Bƒ'0000'�MONITOR�SESSION TCHDE…EQU„*-1ŠDS.Wƒ0TCHD2…DCB.B‚16,'�'$ŠFLD„TCHEVCT,<'�'>,6,C‚EXCEP�VECTORS#ŠFLD„TCHTVCT,<'�'>,6,C‚TRAP‚VECTORS!ŠFLD„TCHATTR,<'�'>,4,C‚ATTRIBUTESŠFLD„TCHIOCT,<'�'>,2,C‚IO�COUNTŠFLD„TCHENTR,<'†'>,6,C�ENTRY"ŠFLD„TCHCHAN,<'†'>,6,C�CCB�ADDRESS)ŠFLD„TCHEXMT,<'ˆ'>,4,C�EXCEP�MONITOR�TASK*ŠFLD„TCHEXMS,<'�'>,4„EXCEP�MONITOR�SESSIONTCHD2E„EQU„*-1ŠDS.Wƒ0**…TASK�STATE�AND�ATTRIBUTES*PCSTAT„ENDLINEŠFLD„PXSTAT,<'ƒTASK�STATE�'>,4PCSTATEƒEQU„*-1ŠDS.Wƒ0$GTEV†DC.Bƒ'*GETTING�EVENT‚'ƒ<<012585 GTEVE…EQU„*-1ŠDS.Wƒ0ASQBUF„DS.Bƒ$100‘012585>> PATTR…ENDLINE#ŠFLD„PXATTR,<'ƒTASK�ATTRIBUTES�'>,4PATTRE„EQU„*-1ŠDS.Wƒ0CSTATE„DC.Bƒ'*DORMANTŠ'COMNTSZƒEQU„*-CSTATEŠDC.Bƒ'*BLOCKED�BY�WAIT‚'ŠDC.Bƒ'*SEMAPHORE�WAITƒ'ŠDC.Bƒ'*WAIT�FOR�EVENTƒ'ŠDC.Bƒ'*WAIT�ACK�TRAP�X‚'CSTATETƒEQU„*-3ŠDC.Bƒ'*WAIT�FOR�EXMONƒ'ŠDC.Bƒ'*SUSPENDEDˆ'ŠDC.Bƒ'*BIT�8�SETˆ'ŠDC.Bƒ'*TERM�PENDING…'ŠDC.Bƒ'*RETURN�TO�EXECƒ'ŠDC.Bƒ'*HEADED�FOR�ASRƒ'ŠDC.Bƒ'*ON�READY�LIST„'ŠDC.Bƒ'*WAKEUP�PENDINGƒ'ŠDC.Bƒ'*2ND�ACK�PENDING‚'ŠDC.Bƒ'*BIT�1�SETˆ'ŠDC.Bƒ'*BIT�0�SETˆ'CATTRB„DC.Bƒ'*SYSTEM�TASK†'ŠDC.Bƒ'*MEMORY�RESIDENT‚'ŠDC.Bƒ'*CRASH�ON�ABORTƒ'ŠDC.Bƒ'*USER�DUMP�REQ„'ŠDC.Bƒ'*RELOCATABLE†'ŠDC.Bƒ'*BIT�10�SET‡'ŠDC.Bƒ'*BIT�9‚SET‡' ŠDC.Bƒ'*USER�SEMAPHORES‚'ƒ012585ŠDC.Bƒ'*REAL-TIME�TASKƒ'ƒ012585ŠDC.Bƒ'*EXMON�CONTROLLED�'ŠDC.Bƒ'*EXCPTION�MONITOR�'ŠDC.Bƒ'*HAS�EXCP�VECTORS�'ŠDC.Bƒ'*HAS�TRAP�VECTORS�'ŠDC.Bƒ'*LAST�TASK�IN�SES�'ŠDC.Bƒ'*TASK�WAS�ABORTED�'ŠDC.Bƒ'*CLAIM�USR�VECTOR�'ŠDS.Wƒ0**…SEGMENT�INFORMATION�LINE*!MSGSEGMƒFLD„MGSGNAM,<'SEG=�'>,4,CŠFLD„MGSGFRML,<'�FR�'>,4,CŠFLD„MGSGTOL,<'00�TO�'>,4,CŠFLD„MGSGPO,<'FF�(PO�'>,4,CŠFLD„MGSGSIZ,<'00)�'>,4,C ŠFLD„MGSGS IZ2,<'00�BYTES�('>,4,CŠFLD„MGSGSIZ3,<'.'>,2,CŠFLD„MGSGTYP,<'K)�-�'>,4,CŠFLD„MGSGSHR,<'�'>,4,CMSGSEGME‚EQU„*-1ŠDS.Wƒ0MGSGTY1ƒDC.Bƒ'READROM�'MGSGTY3ƒDC.Bƒ'R/W�MMIO'MGSGTY5ƒDC.Bƒ'ASQ�'MGSGSHR1‚DC.Bƒ'„GSHRLSHR' **…TASK�REGISTERS* TCREG…ENDLINEŠFLD„PPC,<'�PC�'>,8,CŠFLD„PSR,<'�SR�'>,4ŠFLD„PD0,<'�D0�'>,8,CŠFLD„PD1,<'�D1�'>,8,CŠFLD„PD2,<'�D2�'>,8,CŠFLD„PD3,<'�D3�'>,8ŠFLD„PD4,<'�D4�'>,8,CŠFLD„PD5,<'�D5�'>,8,CŠFLD„PD6,<'�D6�'>,8,CŠFLD„PD7,<'�D7�'>,8ŠFLD„PA0,<'�A0�'>,8,CŠFLD„PA1,<'�A1�'>,8,CŠFLD„PA2,<'�A2�'>,8,CŠFLD„PA3,<'�A3�'>,8ŠFLD„PA4,<'�A4�'>,8,CŠFLD„PA5,<'�A5�'>,8,CŠFLD„PA6,<'�A6�'>,8,CŠFLD„PA7,<'�A7�'>,8 TCREGE„EQU„*ŠPAGE ŠSECTION�8***…PRINT�OUT�ALL�INFORMATION�ABOUT�ONE�TASK* ŠXDEFƒONETASK*8ŠXREF.S�PDSKERR,NEWPAGE,PTASK,CONVDEC2,CONVDEC3,CONVTIMEŠXREF.S�READYHD,PATBEG,TCBHDŠXREF.S�ERMSG1,ERMSG1E ŠXREF.S�RDBUF*%ONETASKƒRD…#$200,A5,RDBUF(PC),PDSKERR'ŠLEA„RDBUF(PC),A4‡ADDRESS�OF�TCB�BUFFER7ŠMVASC‚4,TCBNAME(A4),PTASK(PC)�PUT�TASK�NAME�IN�HEADINGŠBSR„NEWPAGEŒSTART�ON�NEW�PAGEŠPRINT‚TCHDG2AŒPRINT�HEADING"ŠMVHEX‚3,A5,TCHDAD(PC)„TCB�ADDRESS-ŠBSR„TCBDTAIL‹FILL�IN�1ST�LINE�-�AND�PRINT�IT"ŠPRINTF�TCHD�PRINT�THE�DETAIL�LINE ŠPRINTF�SPACE$ŠPRINT‚TCHDG3�PRINT�2ND�HEADING�LINE3ŠMVHEX‚3,TCBEVECT(A4),TCHEVCT(PC)‚EXCEPTION�VECTORS.ŠMVHEX‚3,TCBTVECT(A4),TCHTVCT(PC)‚TRAP†VECTORS+ŠMVHEX‚2,TCBATTR(A4),TCHATTR(PC)‚ATTRIBUTES*ŠMVHEX‚1,TCBIOCNT(A4),TCHIOCT(PC)‚IO�COUNT/ŠMVHEX‚3,TCBENTRY(A4),TCHENTR(PC)‚ENTRY�ADDRESS,ŠMVHEX‚3,TCBCHAN(A4),TCHCHAN(PC)‚CCB�ADDRESS2ŠMVASC‚4,TCBEXM(A4),TCHEXMT(PC)‚EXCEP�MONITOR�TASK6ŠMVASC‚4,TCBEXMS(A4),TCHEXMS(PC)‚EXCEP�MONITOR�SESSION ŠPRINT‚TCHD2*!*„PRINT�TASK�STATE�AND�ATTRIBUTES*6ŠMVHEX‚1,TCBUTRP(A4),CSTATET(PC)‚PUT�TRAP�#�IN�MESSAGE5ŠMVHEX‚2,TCBSTATE(A4),PXSTAT(PC)‚PUT�STATE�IN�MESSAGE ŠPRINT‚PCSTAT&ŠMOVE.W�TCBSTATE(A4),D5„GET�STATE�WORD&ŠLEA„CSTATE(PC),A5ŠSTATE�WORD�COMMENTSŠBSR„PCOMENTŒGO�PRINT�COMMENTS4ŠBSR„GT_EVENT_STATEƒCHECK�FOR�GET�EVENT�STATE‚0125859ŠMVHEX‚2,TCBATTR(A4),PXATTR(PC)‚PUT�ATTRIBUTES�IN�MESSAGE ŠPRINT‚PATTR%ŠMOVE.W�TCBATTR(A4),D5…GET�ATTRIBUTES%ŠLEA„CATTRB(PC),A5ŠATTRIBUTE�COMMENTSŠBSR„PCOMENTŒGO�PRINT�COMMENTSŠSUB.W‚#2,CNTLIN-MBD(A6)**‡PRINT�SEGMENT�INFORMATION* ŠPRINTF�SPACE.ŠLEA„TSTBEGIN(A4),A5„ADDRESS�OF�TASK�SEG�TABLE(ŠLEA„TSTMMU(A5),A5†START�OF�SEGMENT�LIST&ŠMOVE.L�#SEGMENTS-1,D5…SEGMENT�COUNTER+ONETS1„TST.W‚TSTCTL(A5)‰DOES�SEGMENT�EXIST?ŠBEQ„ONETS8�BRANCH�IF�NO.ŠMVASC‚4,TSTANAME(A5),MGSGNAM(PC)‚SEGMENT�NAME-ŠMVHEX‚2,TSTPO(A5),MGSGPO(PC)‚PHYSICAL�OFFSET#ŠMOVE.W�TSTLB(A5),D3‡BEG�OF�SEGMENT#ŠMOVE.W�TSTLE(A5),D4‡END�OF�SEGMENT%ŠLEA„MGSGFRML(PC),A1ˆADDR�TO�STOR�BEG.ŠLEA„MGSGSIZ(PC),A2‰ADDR�TO�STOR�SIZE�IN�BYTES$ŠLEA„MGSGSIZ2(PC),A0ˆADDR�TO�STOR�#K ŠBSR„PSEGSIZ.ŠLEA„MGSGTY1(PC),A0‰TYPE�POINTER�FOR�READ�ONLYŠMOVE.W�TSTAATTR(A5),D7!ŠBTSTƒ#SEGAROM,D7ˆIS�IT�READ�ONLYŠBNE.S‚ONETS4�BRANCH�IF�YES(ŠLEA„MGSGTY3(PC),A0‰TYPE�POINTER�FOR�R/W+ONETS4„AND.B‚#$0C,D7ŒCHECK�FOR�MMIO�OR�PROM"ŠBEQ.S‚ONETS5�BRANCH�IF�NOT�EITHER$ŠLEA„4(A0),A0‹INCREMENT�TYPE�POINTER ONETS5„MOVE.L�#4,D1Ž#�CHARACTERS ŠLEA„MGSGTYP(PC),A1‰MESSAGE�ADDR ŠBSR„MOVEASC(ŠLEA„MGSGSHR1(PC),A0ˆBLANK�SHARE�POINTER)ŠBTSTƒ#SEGAGLBL,D7‡IS�IT�GLOBALLY�SHARED?ŠBEQ.S‚ONETS6�BRANCH�IF�NOŠLEA„4(A0),A0‹CHANGE�POINTER-ONETS6„BTSTƒ#SEGASHR,D7ˆIS�IT�LOCALLY�SHARED?ŠBEQ.S‚ONETS7�BRANCH�IF�NOŠLEA„8(A0),A0‹CHANGE�POINTER ONETS7„MOVE.L�#4,D1Ž#�CHARACTERS#ŠLEA„MGSGSHR(PC),A1‰MESSAGE�ADDRESS ŠBSR„MOVEASCŠPRINTF�MSGSEGM)ONETS8„LEA„8(A5),A5‹INCREMENT�TO�NEXT�SEGŠDBRAƒD5,ONETS1**‡PRINT�ASQ�(IF�EXISTS)*-ŠMOVE.L�TCBASQ(A4),D3†DOES�ASQ�ADDRESS�EXIST?ŠBEQ.S‚ONETR1�BR�IF�NO#ŠRD.Sƒ#$40,D3,RDBUF+$200(PC),ONETR1ŠLEA„RDBUF+$200(PC),A5-ŠMVASC‚4,(A5),MGSGNAM(PC)�PUT�!ASQ�IN�MESSAGEŠLSR.L‚#8,D3ŽBEG�PAGE�#ŠMOVE.L�#4,D4Ž012585ŠADD.W‚ASQML(A5),D4‡012585ŠADD.L‚ASQTOP(A5),D4†012585ŠLSR.L‚#8,D4ŽEND�PAGE�#�PLUS�1ŠSUB.L‚#1,D4ŽEND�PAGE�#!ŠLEA„MGSGFRML(PC),A1ˆADDR�OF�FROM#ŠLEA„MGSGS IZ(PC),A2‰ADDR�OF�#�BYTESŠLEA„MGSGSIZ2(PC),A0ˆADDR�OF�#K ŠBSR„PSEGSIZ ŠCLR.L‚D2ŠMVHEX‚2,D2,MGSGPO(PC)0ŠMVASC‚4,MGSGTY5(PC),MGSGTYP(PC)ƒUSE�ASQ�AS�TYPEŠMVASC‚4,SPACE(PC),MGSGSHR(PC)ŠPRINTF�MSGSEGM**‡PRINT�REGISTERS* ONETR1„MVHEX‚4,TCBD0(A4),PD0(PC)ŠMVHEX‚4,TCBD0+4(A4),PD1(PC)ŠMVHEX‚4,TCBD0+8(A4),PD2(PC)ŠMVHEX‚4,TCBD0+12(A4),PD3(PC)ŠMVHEX‚4,TCBD0+16(A4),PD4(PC)ŠMVHEX‚4,TCBD0+20(A4),PD5(PC)ŠMVHEX‚4,TCBD0+24(A4),PD6(PC)ŠMVHEX‚4,TCBD0+28(A4),PD7(PC)ŠMVHEX‚4,TCBA0+00(A4),PA0(PC)ŠMVHEX‚4,TCBA0+04(A4),PA1(PC)ŠMVHEX‚4,TCBA0+08(A4),PA2(PC)ŠMVHEX‚4,TCBA0+12(A4),PA3(PC)ŠMVHEX‚4,TCBA0+16(A4),PA4(PC)ŠMVHEX‚4,TCBA0+20(A4),PA5(PC)7ŠBTSTW‚#TSK2RTEX,TCBSTATE(A4)‚RETURN�TO�EXEC�?‚<<012585ˆIF��THEN.S!ŠMVHEX‚4,TCBSTKA6(A4),PA6(PC)‚YESŠMVHEX‚2,TCBSTKSR(A4),PSR(PC)ŠMVHEX‚4,TCBSTKPC(A4),PPC(PC)ˆELSE.SŠMVHEX‚4,TCBA6(A4),PA6(PC)…NOŠMVHEX‚2,TCBSR(A4),PSR(PC)ŠMVHEX‚4,TCBPC(A4),PPC(PC)ˆENDI­012585>>ŠMVHEX‚4,TCBA0+28(A4),PA7(PC) ŠPRINT‚TCREGŠMVASC‚4,SPACE(PC),PTASK(PC)ŠRTSŠPAGE*3*‚SUBROUTINE�TO�LOOK�FOR�A�GET_EVENT�STATE�<<012585*GT_EVENT_STATE:#ŠMOVE.L�TCBASQ(A4),D5†ASQ�PRESENT�?ŠBEQ.S‚GT_EV_DNEŠNOŠRD…#$100,D5,ASQBUF(PC),PDSKERRŠLEA„ASQBUF(PC),A5ŠMOVE.W�ASQSTATE(A5),D5ŠAND.W‚#STATE_MASK,D5ŠCMP.W‚#GT_EN,D5ŠGET�EVENT�?ŠBNE.S‚GT_EV_DNEŠNOŠPRINT‚GTEV�YES,�ONLY�ONE�STATEGT_EV_DNE�RTS—RETURNƒ012585>>  *(*‚SUBROUTINE�TO�PRINT�SIZE�OF�MEMORY�SEG**‚D3=BEG�PAGEƒD4=END�PAGE=*‚A1=PTR�TO�PRINT�BEG†A2=PTR�TO�PRINT�SIZE‚A0=PTR�TO�PRINT�#K* ŠXDEFƒPSEGSIZ)PSEGSIZƒMVHEX‚2,D3,(A1)ŠPRINT�BEG�ADDRESS#ŠMVHEX‚2,D4,6(A1)‰PRINT�END�ADDRESSŠSUB.W‚D3,D4ŽSUBTR�BEG�FROM�ENDŠADD.W‚#1,D4Ž+1�=�TOTAL�#�PAGES(ŠMOVE.L�A2,D0ŽSHOULD�#�BYTES�BE�PRINTED?ŠBEQ.S‚PSEGSZ4ŒBRANCH�IF�NOŠMVHEX‚2,D4,(A2)ŠPRINT�#�BYTES PSEGSZ4ƒDIVUƒ#4,D4ŽDIV�BY�4�=�#K ŠMOVE.W�D4,D0ŠLEA„(A0),A1ŒPRINT�LINE�ADDR ŠBSR„CONVDEC4ŠSWAPƒD4‘GET�REMAINDER ŠMULUƒ#25,D4�CHANGE�TO�FRAC�PART"ŠMOVE.B�#'.',(A1)+‰STORE�DEC�POINT ŠMOVE.W�D4,D0 ŠBSR„CONVDEC2ŠRTSŠPAGE**‚SUBROUTINE�TO�PRINT�COMMENTS**†A5�POINTS�TO�COMMENT�TABLE%*†D5�CONTAINS�STATE�OR�ATTRIBUTE�WORD*ŠXREF.S�PRTLIN*,PCOMENTƒLEA„PRTLIN(PC),A2†OUTPUT�LINE�BUFFER!ŠMOVE.L�#15,D7�READY�FOR�BIT�TESTPCOM4…BTSTƒD7,D5ŽIS�BIT�SET?ŠBEQ.S‚PCOM8ŽBRANCH�IF�NO&ŠMOVE.W�#COMNTSZ,D6ˆ#�BYTES�IN�COMMENT/PCOM6…MOVE.W�(A5)+,(A2)+ˆMOVE�COMMENT�TO�OUTPUT!ŠSUB.W‚#2,D6ŽDECREMENT�BYTE�COUNT!ŠBNE„PCOM6ŽGO�BACK�TO�FINISH�MOVEŠLEA„PRTLIN+64(PC),A0ŠCMP.L‚A0,A2ŽOUTPUT�LINE�FULL?ŠBMI.S‚PCOM9ŽBRANCH�IF�NO2PCOM7…MOVE.B�#$0D,(A2)+‰PUT�CAR�RET�AT�END�OF�LINE.ŠMOVE.B�#$0A,(A2)ŠPUT�LINE�FEED‚AT�END�OF�LINE+ŠLEA„PRTLIN(PC),A1†ADDRESS�OF�LINE�TO�PRINTŠBSR„PRTLXI�PRINT�IT!ŠLEA„PRTLIN(PC),A2†RESTART�OUTPUTŠBRA.S‚PCOM9ŽGO�TEST�NEXT�BIT)PCOM8…LEA„COMNTSZ(A5),A5…NEXT�TABLE�ENTRY&PCOM9…SUB.L‚#1,D7ŽDECREMENT�BIT�NUMBER"ŠBPL„PCOM4ŽGO�BACK�IF�MORE�TO�TESTŠLEA„PRTLIN(PC),A0ŠCMP.L‚A0,A2ŽANY�MORE�TO�PRINT?ŠBNE„PCOM7ŽBRANCH�IF�YES ŠRTS—RETURNŠPAGE*!*‚*�*�*‚PRINT�THE�TCB�CHAIN‚*�*�**ŠXDEFƒTCBCHN,UTCBCHN,STCBCHNŠXREF.S�READSP,CONVDEC4**‰PRINT�USER�TASKS�ONLY*)UTCBCHNƒMOVE.L�#-1,D3�FLAG�FOR�USER�TASKSŠBRA.S‚TCBCHN2**‰PRINT�SYSTEM�TASKS�ONLY**STCBCHNƒMOVE.L�#1,D3ŽFLAG�FOR�SYSTEM�TASKSŠBRA.S‚TCBCHN2**‰PRINT�ALL�TASKS*"TCBCHN„CLR.L‚D3‘FLAG�FOR�ALL�TASKS TCBCHN2ƒWANTƒ#6,#2ŽLINES�ON�PAGE%ŠBSR„READSP�Read�in�system�parameters ŠPRINT‚TCHDG1ŠPRINT‚TCHDG2�PRINT�HEADING+ŠMOVE.L�TCBHD(A3),D1‡1ST�TASK�CONTROL�BLOCK6CTTC20„RD…#$200,D1,RDBUF(PC),PDSKERR�READ�A�TCBƒ012585ŠLEA„RDBUF(PC),A4ŠTST.L‚D3‘PRINT�ALL�TASKS?ŠBEQ.S‚TCBCHN6ŒBRANCH�IF�YES*ŠBPL.S‚TCBCHN5ŒBRANCH�IF�SYSTEM�TASKS�ONLY/ŠBTSTƒ#TSKASYST,TCBATTR(A4)�IS�THIS�A�USER�TASKŠBEQ.S‚TCBCHN6ŒBRANCH�IF�YESŠBRA.S‚TCBCHN88TCBCHN5ƒBTSTƒ#TSKASYST,TCBATTR(A4)�IS�THIS�A�SYSTEM�TASKŠBEQ.S‚TCBCHN8ŒBRANCH�IF�NO)TCBCHN6ƒMVHEX‚3,D1,TCHDAD(PC)„TCB�ADDRESSŠBSR„TCBDTAIL‹PRINT�A�TCB�LINE"ŠPRINTF�TCHD�PRINT�THE�DETAIL�LINE -TCBCHN8ƒMOVE.L�TCBALL(A4),D1†NEXT�TCB�ADDRESS%ŠBNE.S‚CTTC20�Continue�if�more�to�do. CTTC30„RTSŠPAGE**'*‚*�*�*‚PRINT�THE�READY�TCB�CHAIN‚*�*�** ŠXDEFƒREADYL*READYL„WANTƒ#6,#2ŽLINES�ON�PAGE%ŠBSR„READSP�Read�in�system�parametersŠPRINT‚RLHDG1�PRINT�HEADINGS ŠPRINT‚TCHDG2ŠMOVE.W�#50,D6�LOOP�COUNTER+ŠMOVE.L�READYHD(A3),D7…START�OF�READY�CHAIN&ŠBEQ.S‚CTRL30�BRANCH�IF�NO�TASKS�READY$ŠLEA„RDBUF(PC),A4‡MEM�ADDRESS�OF�TCB'ŠLEA„TCBREADY(A4),A5„READY�LIST�POINTER*6CTRL20„RD…#$200,D7,RDBUF(PC),PDSKERR�READ�A�TCB…012585$ŠLEA„RDBUF(PC),A4‡MEM�ADDRESS�OF�TCB-ŠMVHEX‚3,D7,TCHDAD(PC)„PUT�TCB�ADDRESS�IN�MSGŠBSR„TCBDTAIL‹PRINT�A�TCB�LINE"ŠPRINTF�TCHD�PRINT�THE�DETAIL�LINEŠTST.L‚(A5)�DONE?ŠBEQ.S‚CTRL30�YES,STOP"ŠMOVE.L�(A5),D7ŒLOAD‚FOR�NEXT�READŠSUB.W‚#1,D6ŽLOOP�COUNTŠBNE„CTRL20�NO,CONTINUE*%ŠPRINT‚ERMSG1,ERMSG1E…ERROR�-�TOO�FAR CTRL30„RTS**„*�*�*�PRINT�DELAY�LIST�CHAIN* ŠXDEFƒDELAYLŠXREF.S�TIME_LEFT,NSE,MIDNIGHT*DELAYL„WANTƒ#6,#2ŽLINES�ON�PAGE%ŠBSR„READSP�Read�in�system�parametersŠBSR„TIMEOD�102684ŠATIME‚D0,DLHDTMŠPRINT‚DLHD1ŽPRINT�HEADINGS ŠPRINT‚DLHD23ŠMOVE.L�PATBEG(A3),D1†START�OF�PER�ACTIVATION�TABLEŠBEQ„DELAY8�BRANCH�IF�NO�TABLEŠMOVE.L�D1,A5ŽSTART�OF�TABLE/ŠLEA„RDBUF+$200(PC),A4‚START�OF�TABLE�IN�MEMORY ŠMOVE.L�A4,D7)ŠSUB.L‚A5,D7ŽADJUSTMENT�FOR�ENTRY�ADDRESSŠRD…#$100,D1,(A4),PDSKERR$ŠMOVE.L�PATTSIZ(A4),D2…SIZE�OF�TABLEŠRD…D2,D1,(A4),PDSKERR.ŠLEA„PATHDR(A4),A5�POINTER�TO�1ST�ENTRY‚102684/ŠMOVE.L�TIME_LEFT(A3),D0‚VALUE�FOR�FIRSTƒ102684$ŠMOVE.L�D0,PATDELTA(A5)ƒENTRY�102684ŠBSR„TIMEODž102684%ŠMOVE.L�D0,D4ƒSAVE�TIME�OF�DAYŒ102684'DELAY6„MOVE.L�PATNEXT(A5),D0…NEXT�ENTRY'ŠBEQ.S‚DELAY8�BRANCH�IF�NO�MORE�ENTRIESŠMOVE.L�D0,A5ŽPUT�IN�A�REG&ŠADD.L‚D7,A5ŽADJUST�FOR�MEMORY�ADDRESS!ŠMOVE.L�PATTCB(A5),D6†TCB�ADDRESS"ŠBEQ.S‚DELAY6�BRANCH�IF�ENTRY�NULL0ŠRD…#$200,D6,RDBUF(PC),PDSKERR�READ�A�TCB…012585ŠLEA„RDBUF(PC),A4-ŠMVHEX‚3,D6,TCHDAD(PC)„PUT�TCB�ADDRESS�IN�MSGŠBSR.S‚TCBDTAILŠMVHEX‚2,PATOPT(A5),TCHDABT(PC) ŠMVHEX‚4,PATARID(A5),TCHMONT(PC)/ŠADD.L‚PATDELTA(A5),D4„ADD�DELTA�TO�BASE‚102684/ŠMVHEX‚3,D4,TCHDASQ(PC)ˆPREPARE�HEX�TIMEƒ102684ŠMOVE.L�D4,D0¡102684ŠLEA„TCHDLAY(PC),A1 ŠBSR„CONVTIME‹PRINT�IN�REAL�TIME ŠPRINTF�TCHD ŠBRA„DELAY6 DELAY8„RTS**‚PRINT�A�TCB�DETAIL�LINE*7TCBDTAIL‚MVASC‚4,TCBNAME(A4),TCHNMA(PC)‚TCBNAME�(ASCII))ŠTST.W‚TCBSESSN(A4)‡IS�SESSION�IN�BINARY?ŠBNE.S‚TCBDT4�BRANCH�IF�NO1ŠOR.Wƒ#$30,TCBSESSN+2(A4)�SET�LAST�DIGIT�TO�ASCII.TCBDT4„MVASC‚4,TCBSESSN(A4),TCHDSS(PC)‚SESSION%ŠLEA„TCHDUR(PC),A1ŠUSER�IN�PRINT�LINE"ŠMOVE.W�TCBUSER(A4),D0…USER�NUMBERŠBSR„CONVDEC4‹CONVERT�TO�DEC)ŠMVHEX‚1,TCBCPRI(A4),TCHCPRI(PC)‚PRIORITY)ŠMVHEX‚1,TCBLPRI(A4),TCHLPRI(PC)‚PRIORITY ŠMVHEX‚1,TCBRPRI(A4),TCHRPRI(PC))ŠMVHEX‚2,TCBSTATE(A4),TCHDST(PC)‚TCBSTATEŠMOVE.B�#'�',(A1)+ŠMVHEX‚3,TCBASQ(A4),TCHDASQ(PC)‚ASQ�ADDRESS4ŠMVHEX‚4,TCBDLAY(A4),TCHDLAY(PC)‚DELAY�ENTRY�ADDRESS,ŠMVHEX‚2,TCBABORT(A4),TCHDABT(PC)‚ABORT�CODE*ŠMVHEX‚3,TCBPC(A4),TCHDPC(PC)ƒPROG�COUNTER+ŠMVHEX‚1,TCBUTRP(A4),TCHDUT(PC)‚USER�TRAP�#ŠMOVE.B�#'�',(A1)(ŠMVHEX‚2,TCBSR(A4),TCHDSR(PC)‚STATUS�REG,ŠMVASC‚4,TCBMON(A4),TCHMONT(PC)‚MONITOR�TASK)ŠTST.W‚TCBMON+4(A4)‡IS�SESSION�IN�BINARY?ŠBNE.S‚TCBDT8�BRANCH�IF�NO/ŠOR.Wƒ#$30,TCBMON+6(A4)‚SET�LAST�DIGIT�TO�ASCII7TCBDT8„MVASC‚4,TCBMON+4(A4),TCHMONS(PC)ƒMONITOR�SESSIONŠRTSŠPAGE* *ƒSUBROUTINE�TO�BUILD�TASK�TABLE*ŠXDEFƒBLDTASKT*BLDTASKT‚BEGSUB4ŠMOVE.W�BLDTFLG(PC),D0…TEST�FLAG�-�SET�TO�SKIP�BUILDŠBNE.S‚BLDTASK6‹BRANCH�IF�SET%ŠBSR„READSP�Read�in�system�parameters+ŠCLR.L‚TASKTCNT-BD(A6)„CLEAR�COUNT�OF�TASKS'ŠMOVE.L�TCBHD(A3),D4‡TCB�HEAD�-�1ST�TCBŠBEQ.S‚BLDTASK6‹BRANCH�IF�NONE'ŠLEA„TASKTBL(PC),A5‰START�OF�TASK�TABLE3BLDTASK1‚MOVE.L�D4,TASKTADR(A5)„SAVE�ADDRESS�OF�TCB'ŠRD…#32,D4,RDBUF(PC),PDSKERR�READ�1�TCB$ŠLEA„RDBUF(PC),A4‡MEM�ADDRESS�OF�TCB/ŠMOVE.L�TCBNAME(A4),TASKTNAM(A5)�SAVE�TASK�NAME.ŠMOVE.L�TCBSESSN(A4),TASKTSES(A5)�SAVE�SESSION%ŠADD.W‚#1,TASKTCNT-BD(A6)�COUNT�TASKS,ŠLEA„TASKTESZ(A5),A5„INCREMENT�TO�NEXT�ENTRY&ŠMOVE.L� TCBALL(A4),D4†NEXT�TCB�ADDRESSŠBNE„BLDTASK1‹GO�BACK�IF�MOREBLDTASK6‚ENDSUB;ŠTTL„ANALTRAP.AIˆ-�Crash/System�analysis�-�DUMPANAL/SYSANALŠPAGE9**********************************************************�INCLUDE�FILE:�ANALTRAP.AI�*9********************************************************* ŠSECTION�0**…TRAP�ASSIGNMENT�TABLES*PTRPHD„ENDLNLFŠDC.Bƒ'�TRAP�ASSIGNMENT�TABLES'ŠENDLINEŠDC.Bƒ'�----�----------�------'ŠENDLNLFPTRPHDEƒEQU„*-1ŠDS.Wƒ0*PTRPA…FLD„TR0,<'0='>,2,CŠFLD„TR1,<'�1='>,2,CŠFLD„TR2,<'�2='>,2,CŠFLD„TR3,<'�3='>,2,CŠFLD„TR4,<'�4='>,2,CŠFLD„TR5,<'�5='>,2,CŠFLD„TR6,<'�6='>,2,CŠFLD„TR7,<'�7='>,2,CŠFLD„TR8,<'�8='>,2,CŠFLD„TR9,<'�9='>,2,CŠFLD„TRA,<'�A='>,2,CŠFLD„TRB,<'�B='>,2,CŠFLD„TRC,<'�C='>,2,CŠFLD„TRD,<'�D='>,2,CŠFLD„TRE,<'�E='>,2,CŠFLD„TRF,<'�F='>,2PTRPAE„EQU„*-1*ŠDS.Wƒ0PTRPOH„ENDLINE8ŠDC.Bƒ'�TR#�-TCBADDR-‚SESSION„SEMAPHORE„INTADDR‚ST�PBSZ'ŠENDLINEPTRPOHEƒEQU„*-1ŠDS.Wƒ0*PTRPOL„FLD„PTRPNM,<'‚'>,2,CŠFLD„PTRPTCB,<'ƒ'>,6,CŠFLD„PTRPSN,<'‚'>,8,CŠFLD„PTRPSM1,<'‚'>,4,CŠFLD„PTRPSM2,<'�'>,8,CŠFLD„PTRPIA,<'�'>,8,CŠFLD„PTRPST,<'‚'>,2,CŠFLD„PTRPBZ,<'‚'>,2PTRPOLEƒEQU„*-1ŠDS.Wƒ0ŠPAGE ŠSECTION�8**…PRINT�TRAP�ASSIGNMENT�TABLES*ŠXREF.S�CONVHEX1ŠXREF.S�TIAT,TIOTŠXDEFƒCTRAPASGCTRAPASG‚WANTƒ#8,#2ŠPRINT‚PTRPHD�PRINT�HEADINGS*ŠMOVE.L�#15,D7�LOOP�COUNTERŠLEA„TIAT(A3),A0ŠLEA„TR0(PC),A1CTRAP2„MOVE.B�(A0)+,D0 ŠBSR„CONVHEX1 ŠLEA„3(A1),A1ŠDBRAƒD7,CTRAP2ŠPRINT‚PTRPAŽPRINT�TIAT*ŠPRINT‚PTRPOH�PRINT�TIOT�HEADERŠMOVE.L�#15,D7�LOOP�COUNTERŠLEA„TIOT(A3),A5ˆENTRY�OFFSET(CTRAP4„TST.L‚TIOTTCB(A5)ˆIS�ENTRY�EMPTY?ŠBEQ.S‚CTRAP8�BRANCH�IF�YESŠMOVE.W�#15,D0ŠSUB.W‚D7,D0ŽGET�TRAP�#ŠLEA„PTRPNM(PC),A1 ŠBSR„CONVHEX1 ŠMVHEX‚3,TIOTTCB(A5),PTRPTCB(PC) ŠMVHEX‚4,TIOTSESS(A5),PTRPSN(PC) ŠMVHEX‚2,TIOTSEM(A5),PTRPSM1(PC)"ŠMVHEX‚4,TIOTSEM+2(A5),PTRPSM2(PC) ŠMVHEX‚4,TIOTADDR(A5),PTRPIA(PC) ŠMVHEX‚1,TIOTSTAT(A5),PTRPST(PC) ŠMVHEX‚1,TIOTPBSZ(A5),PTRPBZ(PC) ŠPRINT‚PTRPOL*CTRAP8„LEA„TIOTEL(A5),A5ŠDBRAƒD7,CTRAP4ŠRTSÙ]:ŠTTL„ANALUST.AI‰-�Crash/System�analysis�-�DUMPANAL/SYSANALŠPAGE9**********************************************************�INCLUDE�FILE:�ANALUST.AIž*9********************************************************* ŠSECTION�0*%*�U�S�E�RƒS�E�M�A�P�H�O�R�EƒT�A�B�L�E*USHDG1„ENDLNLFŠDC.Bƒ'ˆUSER�SEMAPHORE�TABLE'ŠENDLINEŠDC.Bƒ'ˆ--------------------'ŠENDLINEF„DC.B�'�-�TASK�NAME�-ƒSESSION‚SEMPHORE�NAME‚UCNT�XCNT�TYPEƒSEMAPHORES'ŠENDLINEUSHDG1EƒEQU„*-1ŠDS.Wƒ0*"* USER SEMAPHORE TABLE DETAIL LINE**USDL†FLD„USHTNA,<'�'>,4,CƒTASKNAME�(ASCII)$ŠFLD„USHDTN,<'�'>,8,CƒTASKNAME�(HEX)ŠFLD„USHDSS,<'‚'>,8,C‚SESSION&ŠFLD„USHSNA,<'‚'>,4,C‚SEM�NAME�(ASCII)$ŠFLD„USHDSN,<'�'>,8,CƒSEM�NAME�(HEX)ŠFLD„USHDUC,<'‚'>,4,C‚UCNTŠFLD„USHDXC,<'‚'>,1,C‚XCNTŠFLD„USHDTY,<'ƒ'>,1,C�TYPE!ŠFLD„USHDSM1,<'ƒ'>,4,C�SEMAPHORESŠFLD„USHDSM2,<'�'>,8 USDLE…EQU„*-1ŠDS.Wƒ0ŠPAGE ŠSECTION�8*,*‚*�*�*‚PRINT�THE�USER�SEMAPHORE�TABLE‚*�*�** ŠXDEFƒUSTBLŠXREF.S�RDBUF,USTBEG,PDSKERR*USTBL…TST.L‚USTBEG(A3)-ŠBEQ„USTBLR�Branch�if�no�user�semaphore�table+ŠWANTƒ#12,#2�CHECK�FOR�ENOUGH�LINES�ON�PAGEŠPRINT‚USHDG1�PRINT�THE�HEADING!ŠLEA„RDBUF(PC),A4‡START�OF�BUFFER*ŠRD…#20,USTBEG(A3),(A4),PDSKERR�GET�HEADER ŠCLR.L‚D20ŠMOVE.W�USTNPAGE(A4),D2„SIZE�OF�TABLE�(IN�PAGES)ŠLSL.L‚#8,D2ŽCONVERT�TO�BYTES#ŠCMP.L‚#MAXBUF,D2‰GREATER�THAN�MAX?ŠBLE.S‚USTBL2�BRANCH�IF�NO#ŠMOVE.L�#MAXBUF,D2‰IF�YES�-�USE�MAXUSTBL2„MOVE.L�A4,D6$ŠADD.L‚D2,D6ŽD6=END�OF�TABLE�ADDRESS,ŠRD…D2,USTBEG(A3),(A4),PDSKERR �READ�AN�ENTRY&ŠMOVE.W�USTCENT(A4),D7…MAX�ENTRY�COUNTŠBEQ„USTBLR�BRANCH�IF�NONE ŠLEA„USTENTRY(A4),A5„FIRST�ENTRY*'USTBL4„TST.W‚USTUCNT(A5)ˆTEST�USE�COUNT"ŠBEQ„USTBLR�SKIP�ENTRY�IF�NOT�USED*ŠMVASC‚4,USTTNAME(A5),USHTNA(PC)‚TASK�NAME*ŠMVHEX‚4,USTTNAME(A5),USHDTN(PC)‚TASK�NAME2ŠTST.W‚USTSESSN(A5)‰IS�SESSION�IN�BINARY?‚<<012585ŠBNE.S‚USTBL5�NO1ŠOR.Wƒ#$30,USTSESSN+2(A5)‚SET�LAST�DIGIT�TO�ASCII7USTBL5„MVASC‚4,USTSESSN(A5),USHDSS(PC)‚SESSIONŠ012585>>âDë-ŠMVASC‚4,USTSNAME(A5),USHSNA(PC)‚NAME�(ASCII)+ŠMVHEX‚4,USTSNAME(A5),USHDSN(PC)‚NAME�(HEX)$ŠMVHEX‚2,USTUCNT(A5),USHDUC(PC)‚UCNT$ŠMVHEX‚1,USTXCNT(A5),USHDXC(PC)‚XCNT$ŠMVHEX‚1,USTTYPE(A5),USHDTY(PC)‚TYPE*ŠMVHEX‚2,USTSEM(A5),USHDSM2(PC)‚SEMAPHORES!ŠMVHEX‚4,USTSEM+2(A5),USHDSM2(PC) ŠPRINT‚USDL'ŠLEA„USTEL(A5),A5‡ADDRESS�OF�NEXT�ENTRYŠSUB.W‚#1,D7ŽDECREMENT�COUNTŠBEQ.S‚USTBLR�BRANCH�IF�DONEŠCMP.L‚A5,D6ŽTOO�FAR?ŠBGT„USTBL4�NO,COUNTINUE USTBLR„RTSéééééé;ŠTTL„ANALUTIL.AIˆ-�Crash/System�analysis�-�DUMPANAL/SYSANALŠPAGE9**********************************************************�INCLUDE�FILE:�ANALUTIL.AI�*9*********************************************************%ŠXDEFƒFMTLIN,CONVAORH,HEXBIN,CONVHEX4%ŠXDEFƒFMTLIN,CONVAORH,HEXBIN,CONVHEX4 ŠXDEFƒCONVHEX3,CONVHEX2,CONVHEX1(ŠXDEFƒCONVDEC4,CONVDEC3,CONVDEC2,MOVEASC*.*„MOVE�ONE�LINE�TO�PRINT�BUFFER�IN�DUMP�FORMAT**‡A0�=�ADDRESS�OF�16�BYTES�OF�DATA�TO�MOVE'*‡A1�=�ADDRESS�OF�PRINT�LINE�(80�CHARS)*‡D0�=�PHYSICAL�ADDRESS*‡D1�=�LOGICAL�ADDRESS*FMTLIN„MOVEM.L�D0-D2,-(A7)"ŠMOVE.L�A0,-(A7)‹SAVE�DATA�ADDRESS&ŠBSR„CONVHEX3‹CONVERT�PHYSICAL�ADDRESS+ŠMOVE.B�#'�',D2ŒPUT�BLANK�IN�D2�FOR�SPACING%ŠMOVE.B�D2,(A1)+‹BLANK�BETWEEN�FIELDS ŠMOVE.L�D1,D0%ŠBSR„CONVHEX3‹CONVERT�LOGICAL�ADDRESSŠMOVE.B�D2,(A1)+&ŠMOVE.B�D2,(A1)+‹BLANKS�BETWEEN�FIELDS!ŠMOVE.L�#$10004,D1‰2�COUNTS�IN�D1$FMTLIN1ƒMOVE.W�#4,D1ŽCONVERT�4�WORDSFMTLIN2ƒMOVE.W�(A0)+,D0&ŠBSR„CONVHEX2‹PUT�1�WORD�IN�PRINT�LINE ŠMOVE.B�D2,(A1)+‹BLANK�SEPARATORŠSUB.W‚#1,D1ŽDECREMENT�COUNT ŠBNE„FMTLIN2'ŠMOVE.B�D2,(A1)+‹DOUBLE�BLANK�SEPARATORŠSWAPƒD1%ŠSUB.W‚#1,D1ŽHAS�2ND�HALF�BEEN�MOVED?ŠBEQ„FMTLIN1ŒBRANCH�IF�NOŠMOVE.B�D2,(A1)++ŠMOVE.L�(A7)+,A0‹GET�STARTING�ADDRESS�AGAINŠM  OVE.L�#16,D1�8�CHARACTERS%ŠBSR„MOVEASCŒMOVE�SAME�BYTES�IN�ASCII ŠMOVE.B�D2,(A1)+‹BLANK�SEPARATOR&ŠMOVEM.L�(A7)+,D0-D2‡RESTORE�REGISTERSŠRTSŠPAGE*%*…CONVERT�INPUT�(MAY�BE�ASCII�OR�HEX)* *ˆINPUT:‚A0�POINTS�TO�INPUT�LINE.*�A1�POINTS�TO�LONG�WORD�WHERE�RESULT�IS�SAVED***ˆOUTPUT:�CC=Z…INPUT�ENDS�WITH�BLANK�OR�CR*�CC=N…ILLEGAL�CHARACTER�FOUND*�CC=GT„INPUT�ENDS�WITH�COMMA.*�A0�=�0�IF�CR�FOUND,�ELSE�POINTS�TO�NEXT�CHAR*CONVAORH‚CLR.L‚D1 ŠMOVE.L�A0,D0ŽTEST�INPUT�ADDRESS ŠBEQ„HEXBINR1‹BRANCH�IF�NO�INPUT ŠCLR.L‚D0$ŠMOVE.L�#3,D2ŽCOUNT�ASCII�CHARACTERS)CONVAH2ƒMOVE.B�(A0)+,D1‹GET�ONE�CHARACTERŠCMP.B‚#'�',D1ŒIS�IT�BLANK? ŠBEQ„CONVAH2ŒSKIP�LEADING�BLANKSŠCMP.B‚#'$',D1ŒIS�1ST�CHAR�A�$?ó@üN[ ^M)ŠBEQ.S‚HEXBIN4ŒIF�YES�-�MUST�BE�HEX�VALUEŠBRA.S‚CONVAH5*%CONVAH4ƒMOVE.B�(A0)+,D1‹GET�NEXT�CHAR.CONVAH5ƒCMP.B‚#$21,D1ŒIS�IT�GREATER�THAN�BLANKŠBMI.S‚CONVAH8ŒBRANCH�IF�NO#ŠCMP.B‚#$7E,D1ŒIS�IT�IN�ASCII�RANGE$ŠBHI.S‚HEXBINRI‹IF�NO�-�ILLEGAL�CHARŠLSL.L‚#8,D0ŽSHIFT�OUTPUTŠADD.L‚D1,D0ŽADD�CURRENT�CHAR&ŠDBRAƒD2,CONVAH4‰GO�BACK�FOR�NEXT�CHARCONVAH6ƒMOVE.B�(A0)+,D1 ŠCMP.B‚#'�',D1ŒIS�NEXT�CHAR�END?ŠBHI„CONVAH6ŒSKIP�TO�ENDŠBRA.S‚HEXBIN8*CONVAH8ƒTST.L‚D0ŠBEQ.S‚HEXBIN8ŠSWAPƒD15ŠMOVE.B�#'�',D1ŒFILL�IN�REST�OF�LONG�WORD�WITH�BLANKSCONVAH9ƒLSL.L‚#8,D0 ŠADD.B‚D1,D0ŠDBRAƒD2,CONVAH9ŠSWAPƒD1‘RESTORE�ORIG�CHARACTERŠBRA.S‚HEXBIN8ŠPAGE*#*…CONVERT�HEX�INPUT�TO�BINARY�VALUE* *ˆINPUT:ƒA0�POINTS�TO�HEX�NUMBER.*‘A1�POINTS�TO�LONG�WORD�WHERE�RESULT�IS�SAVED***ˆOUTPUT:‚CC=Z„INPUT�ENDS�WITH�BLANK�OR�CR*‘CC=N„ILLEGAL�CHARACTER�FOUND*‘CC=GTƒINPUT�ENDS�WITH�COMMA.*‘A0�=�0�IF�CR�FOUND,�ELSE�POINTS�TO�NEXT�CHAR*HEXBIN„CLR.L‚D1 ŠMOVE.L�A0,D0ŽTEST�INPUT�ADDRESSŠBEQ.S‚HEXBINR1 ŠCLR.L‚D0(HEXBIN2ƒMOVE.B�(A0)+,D1‹GET�1�INPUT�CHARŠCMP.B‚#'�',D1ŒIS�IT�BLANK?*ŠBEQ„HEXBIN2ŒBRANCH�TO�SKIP�LEADING�BLANKSŠBRA.S‚HEXBIN5*(HEXBIN4ƒMOVE.B�(A0)+,D1‹GET�1�INPUT�CHAR(HEXBIN5ƒCMP.B‚#'0',D1ŒIS�IT�LESS�THAN�1?*ŠBMI.S‚HEXBIN8ŒYES�-�GO�LOOK�FOR�SEPARATORŠCMP.B‚#'F',D1ŒIS�IT�HEX�CHAR?&ŠBHI.S‚HEXBINRI‹BRANCH�IF�ILLEGAL�CHARŠCMP.B‚#'9',D1ŒIS�IT�0-9ŠBLS.S‚HEXBIN6ŒBRANCH�IF�YES ŠCMP.B‚#'@',D1ŒIS�IT�LEGAL�CHAR?ŠBLS.S‚HEXBINRI‹BRANCH�IF�NOŠSUB.B‚#7,D1ŽCONVERT�A-F!HEXBIN6ƒAND.L‚#$F,D1�BINARY�DIGIT!ŠLSL.L‚#4,D0ŽMULTIPLY�BY�SHIFTING ŠADD.L‚D1,D0 ŠBRA„HEXBIN4*$HEXBIN8ƒCMP.B‚#'�',D1ŒIS�IT�A�BLANK?ŠBEQ.S‚HEXBINR2%ŠCMP.B‚#',',D1ŒIS�FINAL�CHAR�A�COMMA?ŠBEQ.S‚HEXBINR1‹BRANCH�IF�YES!ŠCMP.B‚#$D,D1�IS�FINAL�CHAR�A�CR?ŠBEQ.S‚HEXBINR3‹BRANCH�IF�YES*‰ILLEGAL�CHARACTERHEXBINRI‚NOT.W‚D1ŠRTS*HEXBINR3‚LEA„0,A0�CR�FOUND(HEXBINR2‚CLR.L‚D1‘ENDED�WITH�BLANK�OR�CR#HEXBINR1‚MOVE.L�D0,(A1)ŒSAVE�RESULTŠTST.W‚D1‘SET�CONDITION�CODESŠRTSŠPAGE**…CONVERT�BINARY�TO�HEX*‡D0�=�BINARY�VALUE(*‡A1�=�ADDRESS�OF�BUFFER�TO�STORE�RESULT*CONVHEX4‚MOVE.L�D0,-(A7)ŠSWAPƒD0ŠBSR.S‚CONVHEX2ŠMOVE.L�(A7)+,D0ŠBRA.S‚CONVHEX2*CONVHEX3‚MOVE.L�D0,-(A7)ŠSWAPƒD0ŠBSR.S‚CONVHEX1ŠMOVE.L�(A7)+,D0*CONVHEX2‚ROR.L‚#8,D0ŠBSR.S‚CONVHEX1 ŠROL.L‚#8,D0*CONVHEX1‚ROR.W‚#4,D0ŠAND.B‚#$0F,D0 ŠCMP.B‚#9,D0ŠBLS.S‚CONVHEXA ŠADD.B‚#7,D0CONVHEXA‚ADD.B‚#$30,D0ŠMOVE.B�D0,(A1)+ ŠROL.W‚#4,D0ŠAND.B‚#$0F,D0 ŠCMP.B‚#9,D0ŠBLS.S‚CONVHEXB ŠADD.B‚#7,D0CONVHEXB‚ADD.B‚#$30,D0ŠMOVE.B�D0,(A1)+ŠRTS***†CONVERT�BINARY�TO�DECIMAL�-�4�CHARACTERS*-CONVDEC4‚AND.L‚#$FFFF,D0ŠNUMBER�MUST�BE�SMALLŠDIVUƒ#1000,D0‹GET�1ST�DIGIT ŠAND.B‚#$F,D0ŠADD.B‚#$30,D0ŒCONVERT�TO�ASCII!ŠMOVE.B�D0,(A1)+‹SAVE�1�CHARACTERŠSWAPƒD0***†CONVERT�BINARY�TO�DECIMAL�-�3�CHARACTERS*,CONVDEC3‚AND.L‚#$FFF,D0‹NUMBER�MUST�BE�SMALLŠDIVUƒ#100,D0ŒGET�1ST�DIGIT ŠAND.B‚#$F,D0ŠADD.B‚#$30,D0ŒCONVERT�TO�ASCII!ŠMOVE.B�D0,(A1)+‹SAVE�1�CHARACTERŠSWAPƒD0  ***†CONVERT�BINARY�TO�DECIMAL�-�2�CHARACTERS*+CONVDEC2‚AND.L‚#$FF,D0ŒNUMBER�MUST�BE�SMALLŠDIVUƒ#10,D0�SEPARATE�DIGITS ŠAND.B‚#$F,D0ŠADD.B‚#$30,D0ŒCONVERT�TO�ASCIIŠMOVE.B�D0,(A1)+‹SAVE�1ST�CHARŠSWAPƒD0‘GET�2ND�CHARŠADD.B‚#$30,D0ŒCONVERT�TO�ASCII#ŠMOVE.B�D0,(A1)+‹SAVE�2ND�CHARACTERŠRTSŠPAGE*!*…MOVE�ASCII�DATA�TO�PRINT�BUFFER*‡D1�=�NUMBER�OF�CHARACTERS*‡A0�=�ADDRESS�TO�MOVE�FROM*‡A1�=�ADDRESS�TO�MOVE�TO*)MOVEASCƒMOVE.B�(A0)+,D0‹GET�ONE�CHARACTER+ŠCMP.B‚#$1F,D0ŒIS�IT�LESS�THAN�PRINT�RANGE?ŠBLS.S‚MOVEASC2‹BRANCH�IF�YES.ŠCMP.B‚#$7B,D0ŒIS�IT�GREATER�THAN�PRINT�RANGE?ŠBLS.S‚MOVEASC4‹BRANCH�IF�NO7MOVEASC2‚MOVE.B�#'.',D0ŒREPLACE�UNPRINTABLE�CHAR�WITH�.1MOVEASC4‚MOVE.B�D0,(A1)+‹STORE�CHAR�IN�PRINT�BUFFŠSUB.W‚#1,D1ŽDECREMENT�COUNT$ŠBNE„MOVEASCŒLOOP�BACK�FOR�NEXT�CHARŠRTSŠPAGE***„SUBROUTINE�TO�COMPUTE�TIME�OF�DAY‹102684*†ENTER„A3�=�POINTER�TO�SYSPAR*†EXIT…D0�=�TIME�OF�DAY*‰XREF.S�NSE,TIME_LEFT,MIDNIGHT TIMEODƒEQU�*‰MOVE.L�NSE(A3),D0‰SUB.L�TIME_LEFT(A3),D0‰SUB.L�MIDNIGHT(A3),D0‰BCLR.L�#31,D0‰RTS‰PAGE*%*„SUBROUTINE�TO�CONVERT�TIME�TO�ASCII*ŠXDEFƒCONVTIME*CONVTIME‚DIVUƒ#1000*60,D0ŠSWAPƒD0 ŠCLR.L‚D3ŠMOVE.W�D0,D3ŽSECONDS*1000ŠDIVUƒ#1000,D3‹SECONDS ŠCLR.W‚D0ŠSWAPƒD0‘HOURS*60+MINUTES ŠDIVUƒ#60,D0 ŠMOVE.L�D0,D2ŠSWAPƒD2‘MINUTESŠBSR„CONVDEC2‹CONVERT�HOURSŠMOVE.B�#':',(A1)+ ŠMOVE.W�D2,D0ŠBSR„CONVDEC2‹CONVERT�MINUTESŠMOVE.B�#':',(A1)+ ŠMOVE.W�D3,D0ŠBSR„CONVDEC2‹CONVERT�SECONDSŠRTSŠPAGE**†CONVERT�DATE�TO�ASCII**‡D0�=�DATE�(GREGORIAN�FORM)(*‡A1�=�ADDRESS�OF�BUFFER�TO�STORE�RESULT*ŠXDEFƒCONVDATECONVDATE‚MOVE.L�D0,D1ŽSAVE�DATE)ŠLSR.L‚#8,D0ŽMOVE�MONTH�TO�LOW-ORDER�BITSŠBSR„CONVDEC2‹CONVERT�MONTH*ŠMOVE.B�#'/',(A1)+‰SEPARATE�MONTH�FROM�DAYŠMOVE.L�D1,D0ŽRESTORE�DATEŠBSR„CONVDEC2‹CONVERT�DAY)ŠMOVE.B�#'/',(A1)+‰SEPARATE�DAY�FROM�YEARŠMOVE.L�D1,D0ŽRESTORE�DATE$ŠSWAPƒD0‘MOVE�YEAR�TO�LOW�ORDER�BITSŠSUB.W‚#1900,D0ŠBSR„CONVDEC2‹CONVERT�YEARŠRTSŠPAGE*Ç*ˆDATE�CONVERSIONS¯*Ç *ˆ11/12/79·*Ç*ˆCALLING�INFO:²*Ç*ˆPUT�INPUT�DATE�INTO�D0©*ˆCALL�ROUTINE:²!*–DATEGO�--�GREGORIAN�TO�ORDINAL“!*–DATEOG�--�ORDINAL�TO�GREGORIAN“*ˆRESULT�SUPPLIED�IN�D0ª *ˆALL�OTHER�REGISTERS�PRESERVED¢*Ç1*ˆDATE�FORMATS:‚ALL�FIELDS�BINARY�--�USE�LONG�D0�*Ç*ˆGREGORIAN�--�YYYYMMDDª*ˆJULIAN„--�YYYYDDDDª)*ˆORDINALƒ--�DAY�NUMBER�(1�JAN�1980�=�1)—*Ç*Ç*ˆNON-LEAP�DAYS�BEFORE�TABLE¥*ÇrrBUILDS SA¶¶%“rrCONFIG LFããrrCONFIG PFìì †rrCONFIG SAýîd brr" CONNECT AFgg rrCONNECT LFpprrCONNECT1SAyyeRrrCONNECT2SAââT rrCOPY AF ; ;rrCOPY LF D DrrOPY SA M M¯:rr'BACKUPƒIDNT†4,1‡VERSAdos�BACKUP�utility ‰LLEN�120<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*’MODIFICATION�HISTORY�-�BACKUP**ˆREVISION�CODE‡011185*9*ˆDECIMAL�VALUE�OF�THE�SECTOR�NUMBER�TO�BE�DISPLAYED�WHEN#*ˆPRINTING�DIFFERENCES�IN�A�SECTOR.*:*ˆWHEN�DOING�A�BACKUP�WITH�5�1/4�FLOPPIES,�THE�DEFAULT�WAS9*ˆFILE-BY-FILE.‚INITIN�WAS�CHANGED�TO�CHECK�INFLOP�BEFORE*ˆSETTING�AFLAG.**ˆREVISION�CODE‡010485*<*ˆCOPYING�A�FOREIGN�DISK�WITH�A�CONTROLLER�CAPABLE�OF�HAVING>*ˆALTERNATE�TRACKS�HAD�A�PROBLEM.‚BACKUP�DID�NOT�CONSIDER�THAT=*ˆFOREIGN�DISKS�DID�NOT�HAVE�SAT�AND�CONFIGURATION�SECTORS�ON<*ˆDISKS�THAT�WERE�FOREIGN,�BUT�HAPPENED�TO�HAVE�THE�BYTE�SET<*ˆTHAT�INDICATED�ALTERNATES�WERE�AVAILABLE.‚THEREFORE,�ADDI-5*ˆTIONAL�CHECKS�WERE�INSERTED�FOR�FOREIGN�INPUT�DISK.**ˆREVISION�CODE‡103184*;*ˆINSTALLED�THE�ABILITY�OF�BACKUP�TO�ONLY�COPY�THAT�PORTION8*ˆOF�A�DISK�THAT�HAS�DATA�ON�IT,�DURING�A�TRACK-BY-TRACK5*ˆOPERATION.‚THE�SAT�IS�SEARCHED�ON�THE�INPUT�DISK�TO*ˆDETERMINE�THIS.*6*ˆREVISION�CODE‡092184‚4�(all�changes�marked�'ALTTRK')*7*ˆA�CHANGE�WAS�INSTALLED�TO�HAVE�BACKUP�BE�ABLE�TO�TAKE=*ˆADVANTAGE�OF�SOME�CONTROLLER'S�ABILITY�TO�MAP�BAD�TRACKS�TO9*ˆALTERNATES.‚THREE�CHANGES�WERE�MADE�TO�BACKUP�FOR�THIS:?*ˆ1:‚TRACK-BY-TRACK�BACKUP�AND�VERIFY�WILL�PROCEED�UNTIL�EITHER;*ŒEND�OF�VOLUME�IS�DETECTED,�OR�IN�THE�CASE�OF�AN�ALTERNATE;*ŒSECTOR-CAPABLE�CONTROLLER,�THE�ALTERNATE�AREA�IS�REACHED.=*ˆ2:‚FOR�ALTERNATE�SECTOR-CAPABLE�CONTROLLERS,�THE�SLT�OF�THE9*ŒINPUT�DISK�WILL�NOT�BE�COPIED�TO�THE�OUTPUT�DISK.‚(EACH*ŒDISK�HAS�ITS�OWN�SLT.)=*ˆ3:‚IF�THE�CONTROLLERS�FOR�THE�TWO�DISKS�ARE�DIFFERENT,�THEN;*ŒTHE�CONFIGURATION�SECTORS�FOR�EACH�ARE�DIFFERENT�AND�WILL*ŒNOT�BE�COPIED.**ˆREVISION�CODE‡071184‚4**ˆHELP�OPTION�ADDED*#*ˆUTILITY�IDENTIFIES�ITSELF�BY�NAME*A*ˆBUFFER�LENGTH�FOR�FETCH�DEVICE�MNEMONICS�CALL�INCREASE�TO�1000.@*ˆTHIS�PREVENTS�A�PROBLEM�SIMILAR�TO�THE�ONE�DESCRIBED�IN�SPR8973:5C9K#S0[?cOkYsK{PƒC‹+“=›>£>«Z³F»EÃLË;ÓDÛ_ãCë>ó>û:C E<6#?;*ˆFROM�OCCURING�WHEN�THE�NUMBER�OF�DISK�DEVICES�EXCEEDS�25.*B*ˆLOGIC�WAS�ADDED�TO�CHECK�FOR�READ�AND�WRITE�ERRORS�IN�THE�VERIFYA*ˆROUTINE.�THIS�CORRECTS�A�PROBLEM�WHICH�CAUSED�GARBAGE�DATA�LEFTA*ˆOVER�FROM�A�PREVIOUS�READ�TO�BE�COMPARED�AGAINST�GOOD�DATA�WHEN&*ˆA�BAD�SECTOR�WAS�ENCOUNTERED.�SPR711*@*ˆTHE�ERROR�CODE�IN�D0�IS�RESTORED�UPON�EXIT�FROM�C_EM_PGM.�THIS>*ˆFIXES�A�PROBLEM�WHICH�CAUSED�BACKUP�TO�HANG�WHEN�THE�DOOR�ON*ˆONE�OF�THE�DRIVES�WAS�OPEN*?*ˆA�TEST�ON�THE�FIRST�BYTE�OF�(A1)�WHICH�WAS�SUPPOSED�TO�DETECT<*ˆA�NULL�OUTPUT�FIELD�WAS�CAUSING�BACKUP�TO�ABORT�WITH�A�BUS?*ˆERROR.�A�CMP.L�#0,A1�WAS�ADDED�TO�DETECT�A�NULL�OUTPUT�FIELD.C*ˆTHE�OLD�INSTRUCTION�WAS�KEPT�TO�DETECT�AN�OUTPUT�FIELD�CONTAINING*ˆONLY�A�COMMA. *¬MARK�FOGLE**ˆREVISION�CODE‡032784‚4*=*ˆCORRECTED�THE�PROBLEM�WHERE�THE�USE�OF�THE�DEFAULTS�FOR�THE)*ˆHARD�DISKS�CAUSED�THE�PROGRAM�TO�ABORT.*’BACKUP�,,#PR1 *ˆNOW�WORKS.****ˆREVISION�CODE‡031384‚4*<*ˆCORRECTED�THE�PROBLEM�WHERE�THE�LAST�SECTORS�READ�FROM�THE?*ˆMASTER�DISK�WERE�NOT�TRANSFERRED�TO�OR�VERIFIED�ON�THE�BACKUP*ˆDISK.*°PEGGY�HASSETT;*************************************************************�*****ƒBACKUP�COMMANDƒ******2*ˆTHIS�COMMAND�WILL�CREATE�A�DUP" LICATE�DISK�VOLUME0*ˆOR�COPY�FILES�FROM�DISK�TO�ANOTHER�OR�THE�SAME(*ˆSELECT�ABILITY�EXIST�WITH�OPTION�A�&�R2*ˆTHERE�IS�DATE�SELECTION,�FILE�SELECTION�OR�UNDER*ˆUSER�CONTROL�SELECTION0*ˆYOU�CAN�NOT�REORGANIZE�TO�A�HARD�DISK�(USE�THE1*ˆINIT�COMMAND�AND�THEN�BACKUP�WITH�THE�A�OPTION)*=*************************************************************   ‰PAGE* OPTIONS AND MODIFIERS:D*„A�-�APPEND�OPTION.‚FILES�ARE�BACKED�UP�FROM�THE�SOURCE�DISK�TO�THE3*’DESTINATION�DISK.‚THIS�IS�THE�DEFAULT�OPTION�WHEN"*’THE�BACKUP�INVOLVES�A�HARD�DISK.@*‡Y�-�THE�Y�MODIFIER�COMES�INTO�PLAY�WHEN�A�FILE�TO�BE�BACKED�UP3*’ALREADY�EXISTS�ON�THE�OUTPUT�DISK.‚THE�Y�MODIFIER**’CAUSES�ALL�SUCH�FILES�TO�BE�OVERWRITTEN.@*‡N�-�THE�N�MODIFIER�COMES�INTO�PLAY�WHEN�A�FILE�TO�BE�BACKED�UP3*’ALREADY�EXISTS�ON�THE�OUTPUT�DISK.‚THE�N�MODIFIER(*’CAUSES�NO�SUCH�FILE�TO�BE�OVERWRITTEN.A*‡S�-�THE�S�MODIFIER�ALLOWS�THE�USER�TO�ENTER�A�STARTING�POINT�IN4*’THE�INPUT�VOLUME�DIRECTORY�FOR�THE�BACKUP.‚THIS�IS4*’ESPECIALLY�USEFUL�IF�A�BACKUP�IS�ABORTED,�SINCE�IT<*’PREVENTS�ONE�FROM�HAVING�TO�START�OVER�FROM�THE�BEGINNING.@*‡P�-�THE�P�MODIFIER�SPECIFIES�THAT�ALL�UNUSED�SPACE�WITHIN�DATA7*’BLOCKS�IS�TO�BE�RECLAIMED,�THEREBY�GENERATING�TIGHTLY6*’PACKED�FILES�ON�THE�OUTPUT�DISK�AND�MORE�FREE�SPACE./*’THE�BACKUP�WILL�PROCEED�MORE�SLOWLY,�HOWEVER.I*„R�-�REORGANIZE�OPTION�(OUTPUT�DISK�MUST�BE�A�FLOPPY).‚THE�OUTPUT�FLOPPY9*’IS�FIRST�INITIALIZED,�FOLLOWED�BY�AN�OPTION�A�COPY.‚THE<*’EFFECT�OF�THIS�IS�TO�CONSOLIDATE�AVAILABLE�DISK�SPACE�INTO<*’ONE�LARGE�BLOCK�AT�THE�END�OF�THE�DISK.‚THE�INITIALIZATION<*’THAT�TAKES�PLACE�DOES�NOT�DO�ANY�FORMATTING�OR�VALIDATION,;*’SO�THE�FLOPPY�MUST�HAVE�BEEN�INITIALIZED�PREVIOUSLY�USING*’THE�INIT�UTILITY.@*‡P�-�THE�P�MODIFIER�SPECIFIES�THAT�ALL�UNUSED�SPACE�WITHIN�DATA7*’BLOCKS�IS�TO�BE�RECLAIMED,�THEREBY�GENERATING�TIGHTLY6*’PACKED�FILES�ON�THE�OUTPUT�DISK�AND�MORE�FREE�SPACE./*’THE�BACKUP�WILL�PROCEED�MORE�SLOWLY,�HOWEVER.K*„U�-�TRACK-BY-TRACK�OPTION�(DISKS�MUST�BE�OF�EQUAL�SIZE�OR�BOTH�FLOPPIES).5*’THE�INPUT�DISK�WILL�BE�COPIED�TRACK-BY-TRACK�TO�THE9*’OUTPUT�DISK.‚THIS�IS�THE�DEFAULT�OPTION�WHEN�BOTH�DISKS*’ARE�FLOPPIES.H*‡C�-�THE�C�MODIFIER�SPECIFIES�THAT�IF�READ�OR�WRITE�ERRORS�OCCUR�DURING8*’THE�BACKUP,�THE�PROGRAM�SHOULD�CONTINUE�FROM�THE�POINT-*’BEYOND�THE�ERROR�(RATHER�THAN�TERMINATING).G*„V�-�VERIFY�OPTION�(DISKS�MUST�BE�OF�EQUAL�SIZE�OR�BOTH�FLOPPIES).‚THE9*’INPUT�AND�OUTPUT�DISKS�WILL�BE�COMPARED,�BYTE�FOR�BYTE,(*’AND�ANY�DISCREPANCIES�WILL�BE�PRINTED.F*‡T�-�THE�T�MODIFIER�TRUNCATES�THE�VERIFY�LISTING�SO�THAT�IF�MORE�THAN6*’ONE�DISCREPANCY�IS�FOUND�IN�A�GIVEN�SECTOR,�ONLY�THE$*’FIRST�DISCREPANCY�WILL�BE�PRINTED.F*„B�-�BACKUP�OPTION�(DISKS�MUST�BE�OF�EQUAL�SIZE�OR�BOTH�FLOPPIES).‚AN5*’OPTION�U�BACKUP�IS�PERFORMED,�AND�IS�FOLLOWED�BY�AN%*’OPTION�V�BACKUP�TO�VERIFY�THE�DATA.H*‡C�-�THE�C�MODIFIER�SPECIFIES�THAT�IF�READ�OR�WRITE�ERRORS�OCCUR�DURING8*’THE�BACKUP,�THE�PROGRAM�SHOULD�CONTINUE�FROM�THE�POINT-*’BEYOND�THE�ERROR�(RATHER�THAN�TERMINATING).F*‡T�-�THE�T�MODIFIER�TRUNCATES�THE�VERIFY�LISTING�SO�THAT�IF�MORE�THAN6*’ONE�DISCREPANCY�IS�FOUND�IN�A�GIVEN�SECTOR,�ONLY�THE$*’FIRST�DISCREPANCY�WILL�BE�PRINTED.  ‰PAGE* USER # OF OUTPUT DISK:G*„U�&�B�OPTIONS�-�THE�USER�#�OF�THE�OUTPUT�DISK�WILL�BE�THE�SAME�AS�THE*’USER�#�OF�THE�INPUT�DISK. *„R�OPTION�-H*‡IF�THE�USER�LOGGED�ON�AS�USER�#�0�-�THE�USER�WILL�BE�PROMPTED�TO�ENTER:*’A�USER�#�FOR�THE�OUTPUT�DISK.‚IF�HE�DEFAULTS�(JUST�GIVES5*’A�CR),�HIS�DEFAULT�(NOT�LOGON)�USER�#�WILL�BE�USED.H*‡IF�THE�USER�LOGGED�ON�AS�OTHER�THAN�USER�#�0�-�HIS�DEFAULT�(NOT�LOGON)*’USER�#�WILL�BE�USED.  0* USER # AND CATALOG OF FILES FOR A & R OPTIONS:H*„INPUT�-�USER�#�&�CATALOG�DEFAULT�TO�THE�'USE'�VALUES�IF�NOT�SPECIFIED.8*’EITHER�OR�BOTH�MAY�BE�SPECIFIED.‚EITHER�OR�BOTH�MAY�BE<*’A�FAMILY�SPECIFICATION.‚THE�CATALOG�FIELD�MAY�BE�PARTIALLY*’WILD�(E.G.,�VOL:*.AB*).I*„OUTPUT�-�USER�#�&�CATALOG�DEFAULT�# TO�THE�'USE'�VALUES�IF�NOT�SPECIFIED.8*’EITHER�OR�BOTH�MAY�BE�SPECIFIED.‚EITHER�OR�BOTH�MAY�BE:*’A�FAMILY�SPECIFICATION.‚THE�CATALOG�FIELD�MAY�NOT�(!)�BE6*’PARTIALLY�WILD�(E.G.,�VOL:*.AB*).‚IF�A�FIELD�IS�WILD8*’ON�THE�INPUT�SIDE,�IT�MAY�NOT�BE�SPECIFIED�NON-WILD�ON,*’THE�OUTPUT�SIDE�(E.G.,�BACKUP�V1:*,V2:10).  7* ACCESS CODES FOR DEVICES/FILES UNDER VARIOUS OPTIONS: *‘DISK�FILES*ŒINPUTƒOUTPUT†INPUTƒOUTPUT#*‹----------------„---------------- *„V‡PRˆPREW *„U,B…PRˆEREW*„A‡PRˆPRˆPRˆEREW*„R‡PRˆEREW†PRˆEREW*K*„(NOTE:�WE�ORIGINALLY�CONSIDERED�ADDING�EXCLUSIVE�WRITE�FOR�SEVERAL�OF�THEK*…INPUT�DISKS�AND�FILES�TO�KEEP�THEM�FROM�BEING�MODIFIED�DURING�THE�BACKUP,*…BUT�THERE�WERE�TWO�PROBLEMS:B*ˆ1:�IF�THE�SYSTEM�DISK�IS�ASSIGNED�FOR�EXCLUSIVE�WRITE,�THE�ERROR;*‹MESSAGE�HANDLER�WON'T�BE�ABLE�TO�DO�ITS�THING�COMPLETELY;D*ˆ2:�IF�THE�INPUT�FILE�IS�ASSIGNED�FOR�ANY�KIND�OF�WRITE�ACCESS,�ITS2*‹CHANGE�DATE�IS�UPDATED--THAT'S�NOT�A�GOOD�IDEA.)‰PAGE3****************************************************ˆINCLUDES�OF�SYSTEM�FILES**ˆINCLUDEƒ9995.&.FME.EQ*ˆINCLUDEƒ9995.&.IOE.EQ*ˆINCLUDEƒ9995.&.TR1.EQ*ˆINCLUDEƒ9995.&.EXE.EQ3***************************************************‰NOLIST‰INCLUDEƒ9995.&.FME.EQ‰INCLUDEƒ9995.&.IOE.EQ‰INCLUDEƒ9995.&.TR1.EQ‰INCLUDEƒ9995.&.EXE.EQ‰LIST‰PAGE2****************************************************…***„DATA�SEGMENT�(DSEG)ƒ****1***************************************************ˆ***‚EQUATE�AREA‚****$STKLENƒEQU�100ŠSTACK�LENGTH�IN�WORDS*COMMSIZE‚EQU�160‰INPUT�COMMAND�BUFFER�SIZE DSKLUI„EQU�1(DSKLUOƒEQU�2‹DISK�LOG�UNIT�ASSIGN�OUTPUT!LISTLUƒEQU�3‹LISTING�LOGICAL�UNIT6REORGLU‚EQU�7‹REORGANIZE�LOGIC�UNIT�FOR�INPUT�DISKETTETSKNAMƒEQU�'BACK'†MY�TASK�NAME7SECLENƒEQU�256‰#�OF�BYTES/SECTOR�ON�FLOPPY�OR�HARD�DISKBDEVLENƒEQU�1000ˆLENGTH�OF�BUFFER�USED�ON�FETDEV�CALL.�ALLOWS�UP�TO6*˜100�DISK�DEVICES�-�PREVENTS�AN�ERROR�SIMILAR�TO�THAT&*˜DESCRIBED�IN�SPR897�-�***�071184�***,FSECTRAK�EQU�13Š#�OF�SECTORS/TRACK�ON�FLOPPY/HSECTRAK�EQU�64Š#�OF�SECTORS/TRACK�ON�HARD�DISK"IYEAR„EQU�80ŽSTART�OF�NOMINAL�YEARCENTURY‚EQU�1900ŒSTART�OF�BASE@SECT2048�EQU�2048ˆ#�OF�BITS�IN�A�256�BYTE�SECTOR�OR�#�SECTORS�IN5BIGFLOP‚EQU�2552ˆUPPER�LIMIT�FOR�A�FLOPPY�SIZE‚010485 *™A�DOUBLE�SIDED�8�INCH�DISKETTE„TST.B�BLIP�(NOTE:�ACCEPTS�.S�OR�.L;*›IF��THEN.S�DEFAULT�IS�.S)* IF_SETƒMACRO ‰TST.B�\1 ‰IFC�'\0',''‰IF��THEN.S‰ENDC ‰IFNC�'\0',''‰IF��THEN.\0‰ENDC‰ENDM B**********‚IF�FLAG�IS�NOT�SET�MACRO.‚TESTS�FOR�FLAG�OFF�CONDITION.*;*ƒIF_NOT_SET�BLIP„---->„TST.B�BLIP‰(NOTE:�ACCEPTS�.S�OR�.L;*ŸIF��THEN.SŒDEFAULT�IS�.S)* IF_NOT_SET MACRO ‰TST.B�\1 ‰IFC�'\0',''‰IF��THEN.S‰ENDC ‰IFNC�'\0',''‰IF��THEN.\0‰ENDC‰ENDM‰PAGEM*******************************************************************************ˆ***‚DATA�SECTION‚****M***************************************************************************** PBA†EQU‡* <**************************************************************ˆREVISION�INFO--MUST�BE�AT�TOP�OF�PROGRAM<************************************************************ !‰DC.B†'011185'‚DATE�LAST�MODIFIED(‰DC.B†'�'‡BL# ANK�INDICATES�CLEAN�ASSEMBLY‰DC.B†'4'‡MAJOR�REVISION�NUMBER <*************************************************************ˆUSER�STACK�AREA<************************************************************ ‰DS.W�STKLEN PROGSTK‚EQU�* <************************************************************)*ˆCOMMLIN�IS�THE�AREA�THE�COMMAND�LINE�IS**ˆREAD�INTO�WHEN�THIS�PROGRAM�IS�CALLED�IN<************************************************************ 8ŠDC.B�'‹'�HOLDS�INPUT�&�OUTPUT�DEVICES�IF�NOT�SPECIFIED.>COMMLINƒCOMLINE�COMMSIZE‚THE�ACTUAL�COMMAND�LINE�INPUT�BUFFER. B******************************************************************8*ˆEQUATES�FOR�VERSION�&�REVISION�FOR�DISK�INITIALIZATIONB****************************************************************** ‰NEXTWBEVIDVNO‚DC.B�'03' ‰DC.B�'00'‰PAGE5******************************************************+*ˆ**‚IOS�PARAMETER�TABLE�FOR�DISK�READS‚****5***************************************************** ‰NEXTWB,‰IOS.RDSK�IOREAD,IOPWAT+IOPBLK+IOPRAN,DSKLUI 9**********************************************************-*ˆ***�IOS�PARAMETER�TABLE�FOR�DISK�WRITES�****9********************************************************* ‰NEXTWB%‰IOS.WDSK�IOWRIT,IOPBLK+IOPRAN,DSKLUOWDSKSZƒEQU‚*-WDSKIOS 5******************************************************'*†IOS�PARAMETER�TABLE�TO�READ/WRITE�SLT*5*****************************************************‰NEXTWBSLTRDWT‚EQU�*­<> 3****************************************************ŒIOS�PARAMETER�TABLE(*ˆSET�UP�IOS�(ERR0R-LOG)‚PARAMETER�BLOCK3*************************************************** ‰NEXTWBOUT6IOS‚DC.W�IOWRIT‰DC.W�0‰DC.B�0 ‰DC.B�LDFLUN‰DC.B�0‰DC.B�0‰DC.L�0‰DC.L�0‰DC.L�0‰DC.L�0‰DC.L�0 ‰NEXTWB&‰IOS.OUT6I�IOWRIT,IOPIMG+IOPWAT,LDFLUN  C*******************************************************************8*ˆFHS�PARAMETER�TABLE�FOR�CHANGE�LOGICAL�UNIT�ASSIGNMENT5*ˆCHANGE�IS�FROM�6�TO�3�-�SEND�SOURCE�IS�LU�A�IN�MASK*ˆAND�RECEIVE�IS�LU�B�IN�MASK4*ˆLU3�IS�USED�F0R�LISTING�AND�LU6�FOR�ERR0R�/LOGGING*4*ˆPARAMETER�TABLE�FOR�CHANGE�LOGICAL�UNIT�ASSIGNMENT,*ˆIS�DIFFERENT�FROM�STANDARD�PARAMETER�TABLE?*************************************************************** ‰NEXTWB.LU3AFHS‚DC.W�FHCHLU„COMMAND�(CHANGE�LU�ASSIGN)‰DC.W�FOPKEP…OPTION�KEEP�ASSIGN‰DC.B�0ŠSTATUS‰DC.B�LDFLUNŠSEND�LU�NUMBER‰DC.B�LISTLUŠRECEIVE�LU�NUM‰DC.B�0ŠRESERVED&‰DC.L�0ŠTASK-ID�(0�MEANS�USE�YOURSELF)(‰DC.L�0ŠSESSION�#�(0�MEANS�USE�YOURSELF) 1*************************************************&*ˆPARM�BLOCK�FOR�VOLUME�MSG�FOR�OUTPUT1************************************************* ‰NEXTWB‰IOS.INP5�IOREAD,IOPFOR,CDFLUN  +*******************************************  ‰NEXTWB‰IOS.INP9�IOREAD,IOPFOR,CDFLUN  9*********************************************************'*ˆPARAMETER�BLOCK�TO�OBTAIN�USER�NUMBER9********************************************************* ‰NEXTWB‰IOS.INP6�IOREAD,IOPFOR,CDFLUN -********************************************* *ˆOK�TO�COPY�RESPONSE�PARM�BLOCK-********************************************* ‰NEXTWB‰IOS.INP4�IOREAD,IOPFOR,CDFLUN *******************************************-*ˆPARM�BLOCK�OUTPUT�WITH�INPUT�FOR�DEVIC$ E�MSG******************************************* ‰NEXTWB‰IOS.INP1�IOREAD,IOPFOR,CDFLUN )******************************************ˆPARM�BLOCK�FOR�RETRY�RECEIVE)***************************************** ‰NEXTWB‰IOS.INP3�IOREAD,IOPFOR,CDFLUN #************************************ˆSET�UP�IOS�FOR�LISTING�LU3*‹IOS�PARM�TABLE!********************************* ‰NEXTWB,‰IOS.OUT3�IOWRIT,IOPASC+IOPFOR+IOPWAT,LISTLU )*****************************************?*ˆLU3FHS�IS�PARM�TABLE�FOR�LU3�WHICH�IS�USED�FOR�OUTPUT�LISTING******************************************* ‰NEXTWB‰FHS.LU3�0,0,LISTLU ;***********************************************************:*ˆ***�DSKFHS�IS�THE�PARAMETER�TABLE�FOR�THE�FHS�INPUT�FILE*šSOURCE�DISKETTE;*********************************************************** ‰NEXTWBINFHS„DC.W�FHASGNŒCOMMAND‰DC.W�FOPPR†OPTIONS‰DC.B�0ŠSTATUS ‰DC.B�DSKLUI†LOGICAL�UNIT�NUMBER‰DC.L�$20202020‚VOLUME�NAME‰DC.W�0ŠUSER�NUMBER‰DC.L�$20202020ˆCATALOG�NAME‰DC.L�$20202020‰DC.L�$20202020ˆFILE�NAME‰DC.L�$20202020‰DC.W�$2020ŠEXTENSION‰DC.W�0ŠRESERVED‰DC.B�0ŠWRITE�PROTECT�CODE‰DC.B�0ŠREAD�PROTECT�CODE‰DC.W�0ŠLOGICAL�RECORD�LENGTH0‰DC.L�0ŠCONTIGUOUS�FILE�SIZE�/�DIR�ENTRY�POINTER 1*************************************************%*ˆFHS�PARAMETER�BLOCK�FOR�DISK�OUTPUT1************************************************* ‰NEXTWBOUTFHSƒDC.W�FHASGNŠCOMMAND‰DC.W�FOPPRŒOPTIONS‰DC.B�0ŠSTATUS‰DC.B�DSKLUO…LOGICAL�UNIT�NUM‰DC.L�$20202020‚VOLUME�NAME‰DC.W�0ŠUSER�NUM‰DC.L�$20202020ˆCAT�NAME‰DC.L�$20202020‰DC.L�$20202020ˆFILE�NAME‰DC.L�$20202020‰DC.W�$2020ŠEXTENSION‰DC.W�0‰DC.B�0ŠWRITE�PROT�CODE‰DC.B�0‰DC.W�0‰DC.L�0ŠCONT�FILE�SIZE OUTFHSSZ EQU *-OUTFHS5*‘FOLLOWING�FHS�PARAMETERS�FOR�SHARED�SEGMENT�REQUEST(‰DC.L�0ŠSEGMENT�STARTING�LOGICAL�ADDRESS&‰DC.L�0ŠSEGMENT�ENDING�LOGICAL�ADDRESS‰DC.L�0ŠSHARED�SEGMENT�NAME =*************************************************************0*ˆPARAMETER�BLOCK�FOR�FETCH�DIRECTORY�ENTRY�CALL=************************************************************* ‰NEXTWBDIRFHSƒDC.W�FHFDEN…CMD‰DC.W�0ŠOPTIONS‰DC.B�0ŠSTATUS‰DC.B�DSKLUI…LOG�UNITDIRFHSV‚DC.L�$20202020‚VOL‰DC.W�-2‰USER�NUM‰DC.L�'****'…CATALOGUE ‰DC.L�'****'‰DC.L�'****'…FILE ‰DC.L�'****'‰DC.W�'**'‡EXT‰DC.W�0‰DC.B�0‰DC.B�0‰DC.W�0,‰DC.L�0ŠWILL�HOLD�ADDRESS�OF�DIR�ENTRY�BLOCK ;***********************************************************&*ˆDIRECTORY�ENTRY�(DIR)�DATA�STRUCTURE-*ˆTHE�DIRECTORY�ENTRY�IS�READ�INTO�THIS�BLOCK;*********************************************************** ‰NEXTWBDIRBLKƒDS.B�FDLEN :**********************************************************,*ˆPARAMETER�TABLE�FOR�FETCH�DEVICE�MNEMONICS7******************************************************* ‰NEXTWBFETDEVƒDC.W�FHFDMN…CMD‰DC.W�FOPFRA…OPTIONS‰DC.W�0ŠSTATUS�&�RESERVED‰DC.L�0ŠBUFFERB‰DC.L�DEVLEN…BUFFER�LENGTH�-�ALLOWS�UP�TO�100�DEVICES�-�SEE�SPR897*˜***�071184�*** .**********************************************,*ˆPARAMETER�TABLE�FOR�GET�SEGMENT�FOR�BUFFER.********************************************** ‰NEXTWBBUFPAR:‚DC.L�0,0ˆTASK�(0=SELF)-‰DC.W�SGOPPA…OPTIONS:�RETURN�PHYSICAL�ADDRESS‰DC.W�0Š(RAM�SEGMENT)‰DC.L�'BUFR'…NAME�OF�SEGMENT‰DC.L�0BUFSIZƒDC.L�0ŠLENGTH�OF�BUFFER 3***************************************************$*ˆDUMMY�PARAMETER�BLOCK�FOR�EDITFILE3*************************************************** ‰FHS.DUMMY‰PAGE9***********************************************************�***ƒWORK‚AREAƒ****9**********************************************************STSKNAMƒDC.L�0‰SAVE�TASK�NAMESESNUMƒDC.L�0ˆSAVE�SESSION�NUM#VOLNAMƒDC.L�0‰SAVE�VOL�DEFAULT�NAME‰DC.W�0/USERNUM‚DC.W�0ŠDEFAULT�USER�NUM�(16�BIT�BINARY)%CATNAMƒDC.L�0,0ˆDEFAULT�CATAGORY�NAME REGD6„DC.L�0ŠCOMMAND�LINE�LENGTHREGD7„DC.L�0ŠLOGICAL�UNI$ T�MASKADDREGƒDS.L�1ŠADDR�REG�0‰DS.L�1ŠTERM�ID�AT�LOG�ON�TIME‰DC.W�0ŠTOP�HALF�REG�2ADDREG2‚DC.W�0ŠLOG�ON�USER�NUM‰DS.L�4ŠREGISTERS�A3�-�A6*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º1/24/84DLYTIME‚EQU‡500/*œDELAY�TIME�FOR�VOLUME�ERROR�LOOP�COUNT�(VELC)VELC: ‰DC.B†$20 ‰DC.B†$00*œVOLUME�ERROR�LOOP�COUNT1*œIN�SOME�CASES�EXECUTING�CODE�IS�READY�TO�ACCESS/*œA�VOLUME�BEFORE�IT�HAS�BEEN�RECOGNIZED�BY�THE0*œSYSTEM�SO�THIS�LOOP�COUNT�HAS�BEEN�IMPLEMENTED1*œTO�GIVE�THE�SYSTEM�TIME�TO�RECOGINZE�THE�VOLUME)*œTHE�UPPER�BYTE�IS�THE�LOOP�CONTROL�BYTE%*œAND�THE�LOWER�BYTE�IS�THE�WORK�BYTE* *º1/24/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'SOUTCAT‚DS.L�2ˆSAVE�OUTPUT�CATALOG�NAME+SAVEPATT�DC.W�0ˆPATTERN�OF�OPTIONS�SELECTED/TABDATE‚DC.B�'ˆ'‚DATE�FROM�SYSTEM�(DATE�&�TIME)"OPTNOAƒDC.B�0ˆDO�NOT�USE�A�OPTIONSRFLAG„DC.B�0‰REORGANIZE�FLAG!UFLAG„DC.B�0…COPY�ALL�TRACKS�FLAG!BFLAG„DC.B�0…COPY�AND�VERIFY�FLAGVFLAG„DC.B�0…VERIFY�FLAG AFLAG„DC.B�0…APPEND�TO�DISK�FLAGSFLAG„DC.B�0…RESTART�FLAG+CFLAG„DC.B�0…CONTINUE�U�OPT�WITH�ERROR�FLAG(NFLAG„DC.B�0†DO�NOT�DELETE�EXISTING�FILE,YFLAG„DC.B�0…OVERRIDE�DUPLICATE�MESSAGE�FLAG:TFLAG„DC.B�0…TRUNCATE�VERIFY�FLAG�(ONE�MESSAGE/SECTOR�MAX):PFLAG„DC.B�0„PACK�DATA�ON�OUTPUT�DISK�(A�&�R�BACKUPS�ONLY)0HFLAG„DC.B�0„PRINT�HELP�MESSAGE�-�***�071184�***&FLAG1„DC.B�0…1ST�TIME�FLAG�FOR�PRT�MSG)DEVOUTƒDC.B�0ŠDEVICE�INDICATED�FOR�OUTPUTDEVIN„DC.B�0…DEVICE�FOR�INPUTKUSN_CAT‚DC.B�0„SET�IF�USER#�OR�CATALOG�SPECIFIED�IN�INPUT�OR�OUTPUT�FIELDS.AFAMUSNƒDC.B�0„SET�IF�OUTPUT�FILES�GET�SAME�USER�#�AS�INPUT�FILES.GFAMCATƒDC.B�0„SET�IF�OUTPUT�FILES�GET�SAME�CATALOG�NAME�AS�INPUT�FILES.ENOIOFLAG�DC.B�0„SET�IF�NO�INPUT�AND�NO�OUTPUT�FIELDS�IN�COMMAND�LINE.5INPNULL‚DC.B�0„SET�IF�NO�INPUT�FIELD�IN�COMMAND�LINE.3SIZFLAG‚DC.B�0ŠSET�IF�OUTPUT�DISK�LARGER�THAN�INPUT INFORNƒDC.B�0ŠFOREIGN�INPUT‚DISK"OUTFORN‚DC.B�0ŠFOREIGN�OUTPUT�DISK%IOTYPEƒDC.B�0ŠINPUT�OR�OUTPUT�POINTER%ISEND„DC.B�10ŠEND�FLAG�0�MEANS�AT�END,ONESECT‚DC.B�0Š'SAT�IS�JUST�ONE�SECTOR'�FLAG'INHARDƒDC.B�0Š'INPUT‚IS�HARD�DISK'�FLAG)OUTHARD‚DC.B�0Š'OUTPUT�IS�HARD�DISK'�FLAG;INALT„DC.B�0„INPUT‚DISK'S�ALT�SECTOR�BYTE�FROM�VID‚<>+INFLOPƒDC.B�0„INPUT�DISK�IS�A�FLOPPY‚010485#PACKITƒDC.B�0Š'PACK�THIS�FILE'�FLAG>VIDREQƒDC.B�0Š'VID�ENTRIES�REQUIRED'�FLAG:�DISALLOW�DEFAULTING'*¨ON�OUTPUT�VOLUME,�USER#,�DESCRIPTION."DATESWƒDC.B�0ŽDATE�SEL�ROUT�SWITCH%DATEFLAG�DC.B�0ŽDATE�SELECT�ACTIVATED%FILEFLAG�DC.B�0ŽSELECT�FILE�ACTIVATED!FOKFLAG‚DC.B�0ŽFILE�SELECTED�FLAG!DOKFLAG‚DC.B�0ŽDATE�SELECTED�FLAG$CRDERRƒDC.B�0ŽC�OPTION�FLAG�READ�ERR&CWRTERR‚DC.B�0ŽC�OPTION�FLAG�WRITE�ERR‰NEXTWBBALTLAST‚DC.L�0„DISK'S�LAST�WRITABLE�SECTOR�(ALT�SEC�ONLY)�<>8LASTDATA�DC.L�0„LAST�SECTOR�ON�DISK�CONTAING�DATA‘103184;SECTNUM‚DC.L�13�SECTORS/TRACK�(CHANGED�TO�64�FOR�HARD�DISK);SAVINPƒDC.L�0„SAVE�LOCATION�OF�INPUTƒFIELD�IN�COMMAND�LINE.BUFFDEV‚DS.B�DEVLEN‰HOLDS�DEVICE�MNEMONICS�TABLE�WHEN�FETCHED./*œHOLDS�100�DEVICES�-�SEE�SPR897�***�071184�****‰NEXTWBEBUFFMULT‚DS.B�SECLENˆBUFFER�USED�IN�CODE�FOR�MULTIPLE�OUTPUT�DEVICES.*!*’VID‚DIAGNOSTIC�PATTERN�FOR�INIT‰NEXTWB5DIAGPAT1 DC.L $0F1E2D3C,$4B5A6978,$8796A5B4,$C3D2E1F0-‰DC.L�$0F1E2D3C,$4B5A6978,$8796A5B4,$C3D2E1F0-‰DC.L�$F1F2F4F8,$F9FAFCFE,$FF7FBFDF,$EF6FAFCF-‰DC.L�$4F8F0F07,$0B0D0E06,$0A0C0408,$04020100  1*’BITSON�TABLE�USED�TO�SET�LAST�BYTE�IN�SAT�TABLE‰NEXTWB$BITSONƒDC.B�$FF,$7F,$3F,$1F,$F,7,3,1 5*’BIT1�&�BIT2�TABLES�USED�TO�SET�INITIAL�BYTES�IN�SAT‰NEXTWB#BIT1…DC.B�0,$C0,$E0,$F0,$F8,$FC,$FF‰NEXTWB'BIT2…DC.B�0,$80,$C0,$E0,$F0,$F8,$FC,$FE‰PAGE.***********************************************"*†***�PRINT�HEADERS�&�MESSAGES‚****.********************************************** ‰NEXTWBVERSION‚DC.B�'BACKUP‚011185�4' V_END„EQU�*-17****‹THIS�IS�THE�OUTPUT�FOR�THE�H�OPTION�***�071184�***HELPMSG‚DC.B�'‚'=‰DC.B�'Command�format:�BACKUP�[,]'#‰DC.B�'[,][;]' ‰DC.B�'‚'‰DC.B�'where:' ‰DC.B�'‚'C‰DC.B�'‚input�field�may�be�a�volume�name�(followed�by�an�optional�'‰DC.B�'user�number�and�'C‰DC.B�'‚optional�catalog)�or�a�device�name.�Default�is�the�lowest�'‰DC.B�'numbered�disk�'‰DC.B�'‚device.�' ‰DC.B�'‚'D‰DC.B�'‚output�field�may�take�on�any�of�the�values�legal�for�input�'‰DC.B�'field.�Default�is'1‰DC.B�'‚the�second�lowest�numbered�disk�device.�' ‰DC.B�'‚'F‰DC.B�'‚list�field�is�a�file�or�device�name�to�which�the�output�from�'‰DC.B�'the�utility'>‰DC.B�'‚will�be�sent.�If�the�input�and�output�fields�are�not�'!‰DC.B�'specified,�the�list�field'<‰DC.B�'‚must�be�preceded�by�two�commas.�Default�is�the�user'‰DC.B�$27ƒSINGLE�QUOTE‰DC.B�'s�terminal.�' ‰DC.B�'‚' ‰DC.B�'‚' ‰DC.B�'‚' ‰DC.B�'‚' ‰DC.B�'‚' ‰DC.B�'‚' ‰DC.B�'‚'B‰DC.B�'‚options‚(�file-by-file�mode)�-�Selected�by�A�or�R�option�' ‰DC.B�'‚'B‰DC.B�'„A�-�append�option�-�Files�are�transferred�from�source�to�'‰DC.B�'destination.�' ‰DC.B�'‚'‰DC.B�'†sub-options:' ‰DC.B�'‚'?‰DC.B�'ˆY�-�Overwriting�of�a�file�on�the�destination�disk�will'‰DC.B�'�occur�if�there�is';‰DC.B�'Œa�file�on�the�source�disk�which�has�the�same�name.'?‰DC.B�'ˆN�-�Overwriting�of�files�on�the�destination�disk�will�'‰DC.B�'not�occur.':‰DC.B�'ˆS�-�User�may�enter�a�starting�point�in�the�input�'‰DC.B�'volume�directory.'>‰DC.B�'ˆP�-�All�unused�space�within�indexed�sequential�files�'‰DC.B�'will�be�reclaimed.�' ‰DC.B�'‚'>‰DC.B�'„R�-�Reorganize�option�(destination�must�be�floppy)�-�'‰DC.B�'consolidates�all�'<‰DC.B�'ˆavailable�disk�space�into�a�large�block�at�the�end�'‰DC.B�'of�the�disk.�Note'5‰DC.B�'ˆthat�the�destination�floppy�is�initialized,�' ‰DC.B�'destroying�any�existing�'‰DC.B�'ˆfiles.' ‰DC.B�'‚'‰DC.B�'†sub-options:' ‰DC.B�'‚'+‰DC.B�'ˆP�-�same�effect�as�with�A�option.�' ‰DC.B�'‚' ‰DC.B�'‚' ‰DC.B�'‚'?‰DC.B�'‚(track-by-track�mode):�Selected�by�U,V,�or�B�options.�'‰DC.B�'Source�and�destination'D‰DC.B�'‚must�be�of�equal�capacity,�except�when�performing�a�single-'‰DC.B�'to-double�sided'‰DC.B�'‚diskette�backup.' ‰DC.B�'‚'C‰DC.B�'„U�-�Track-by-track�option.�This�is�the�default�for�floppy�'‰DC.B�'disks�or�when�C�'#‰DC.B�'ˆoption�is�specified�alone.' ‰DC.B�'‚'‰DC.B�'†sub-options:' ‰DC.B�'‚'8‰DC.B�'ˆC�-�If�read�or�write�errors�occur,�BACKUP�will�'‰DC.B�'continue�instead�of'‰DC.B�'Œaborting.�' ‰DC.B�'‚'?‰DC.B�'„V�-�Verify�option.�The�input�and�output�disks�will�be�'‰DC.B�'compared'=‰DC.B�'ˆtrack-by-track�and�any�discrepancies�will�be�listed.' ‰DC.B�'‚'‰DC.B�'†sub-options:' ‰DC.B�'‚'6‰DC.B�'ˆT�-�Truncates�listing�so�that�only�the�first�'!‰DC.B�'discrepancy�in�any�sector'7‰DC.B�'Œwill�be�listed.�Can�only�be�used�with�V�and�B�'‰DC.B�'options.' ‰DC.B�'‚' ‰DC.B�'‚' ‰DC.B�'‚' ‰DC.B�'‚')% ‰DC.B�'ƒtrack-by-track�mode‚(continued)�' ‰DC.B�'‚'=‰DC.B�'„B�-�Backup�option.�An�option�U�backup�is�performed,�' ‰DC.B�'followed�by�an�option�V�'‰DC.B�'ˆto�verify�the�backup.�' ‰DC.B�'‚'‰DC.B�'†sub-options:' ‰DC.B�'‚'8‰DC.B�'ˆC�-�If�read�or�write�errors�occur,�BACKUP�will�'‰DC.B�'continue�instead�of'‰DC.B�'Œaborting.�'6‰DC.B�'ˆT�-�Truncates�listing�so�that�only�the�first�'!‰DC.B�'discrepancy�in�any�sector'7‰DC.B�'Œwill�be�listed.�Can�only�be�used�with�V�and�B�'‰DC.B�'options.' ‰DC.B�'‚'/‰DC.B�'‚H�-�Help�option.�Prints�this�listing.�'?***‚A�TABLE�OF�THE�LENGTHS�OF�ALL�THE�HELP�LINES�***�071184�***AHELPLEN: DC.B 1,79,1,5,1,75,73,9,1,77,41,1,73,79,65,1,1,1,1,1,1,1#‰DC.B�59,1,73,1,17,1,79,61,71,73,79A‰DC.B�1,73,75,75,13,1,17,1,41,1,1,1,77,75,17,1,77,33,1,17,1,73,21G‰DC.B�1,65,59,1,17,1,77,65,1,1,1,1,35,1,79,29,1,17,1,73,21,77,65,1,39,0‰NEXTWBEQUERYSƒDC.B�'�For�next�page�or�N�to�abort�-‚'�***�0711184�***QUERYEƒEQU�*-1‚***�071184�***$CLS†DC.B�27�CODE�FOR�CLEARING�SCREEN ‰DC.B�'X'#DESCMSG‚DC.B�'THE�OUTPUT�IS�VOL�=�'DESCV„DC.B�'„' ‰DC.B�'‚'‰DC.B�'USER�#‚=�'DESCUSN‚DC.B�'„' ‰DC.B�'‚'‰DC.B�'DESC‚=�'DESCDESC‚DC.B�'”'DESCMSGE EQU *-1*‰NEXTWBCOPM…DC.B�'COPYƒFROM�DEVICE‚'#COPMD1ƒDC.L�'„'’HOLDS�INPUT�DEVICE.‰DC.B�'‚TO�DEVICE�'$COPMD2ƒDC.L�'„'’HOLDS�OUTPUT�DEVICE.‰DC.B�'�(Y/N)�?‚' COPME„EQU�*-1*‰NEXTWBVM1†DC.B�'SECTOR�$'…<<011185 VMS†DC.B�'„' ‰DC.B�'‚'VMD†DC.B�'†'‡011185>> VM1E…EQU�*-1*VM2†DC.B�'„OFFSET‚' VM21…DC.B�'‚' ‰DC.B�'‚DR0�'VMO1…DC.B�'„DR1�' VMO2…DC.B�'‚' ‰DC.B�'ˆ'VMO11„DC.B�'�' ‰DC.B�'…'VMO21„DC.B�'�' VM2E…EQU�*-1*‰NEXTWBDIRMSGƒEQU�*ŒSTART�OF�DIR�MSG%VOLPRTƒDC.L�'„'…VOLUME�NAME�GOES�HERE ‰DC.W�':�'L1USN„DC.L�0ŠUSER�NUM ‰DC.W�'.�'L1CAT„DC.L�'„'…CATALOGUE ‰DC.L�'„' ‰DC.W�'.�'L1FIL„DC.L�'„'…FILE�NAME ‰DC.L�'„' ‰DC.W�'.�'L1EXT„DC.W�'‚'‡EXTENSIONDIRMSGL‚EQU�*-DIRMSG‰NEXTWB*DUPMSGƒDC.B�'DUPLICATE�FILE�-‚'* COPOK„EQU�*‰DC.B�'OK�TO�COPY�(Y/N/Q)�?‚'"COPOKBƒDS.B�55ŽHOLDS�THE�FILENAME.*‰NEXTWB;CONTM2ƒDC.B�'REPLACE�OUTPUT�DISK�WITH�NEW�INITIALIZED�DISK'‰DC.B‚CR,LF‰CARR�RET;‰DC.B�'ENTER�THE�NEW�VOLUME�WHEN�READY�TO�PROCEED�(VOLN:)�'CONTM2E‚EQU�*-1*‰NEXTWB3CONTM3ƒDC.B�'WE�ARE�SWITCHING�TO�THE�APPEND�OPTION' ‰DC.B�CR,LF2‰DC.B�'IS�YOUR�DISK�PROPERLY�INITIALIZED�(Y/N)�?�'CONTM3E‚EQU�*-1*‰NEXTWB7USNCATƒDC.B�'ERROR--USER�#�&�CATALOG�NOT�ALLOWED�WITH�'%‰DC.B�'TRACK-BY-TRACK�COPY�OR�VERIFY'USNCATE‚EQU�*-1*&***************************************>‰LINE†COPAM,*0‰LINE†ASM,*2‰LINE†USM,*#‰LINE†VSM,*4‰LINE†DESCM,*7‰LINE†FORMSG,*%‰LINE†VOLMSG,*+‰LINE†SIZERM,*@‰LINE†FORLMSG,*=‰LINE†FILFRMG,*3‰LINE†SIZWM,*<‰LINE†WSIZM,*'‰LINE†BIGMSG,*A‰LINE†HARDRM,*=‰LINE†RESTM,*‰LINE†USNM,*‰LINE†RESTNF,*/‰LINE†SELM1,*:‰LINE†RANM,*8‰LINE†SELM2,*D‰LINEƒSELM3,*?‰LINE†SELM4,*‰LINE†FILM,*7‰LINE†CONTM1,<**�OUTPUT�DISK�FULL�**„CONTINUE�(Y/N)�?�>*&‰LINE†COPWM,*/****************************************& ********‰NEXTWB;DESCANS‚DC.B†'Š'ƒHOLDS�VOLUME�DESCRIPTION�(UP�TO�20�BYTES).2‰DC.B†'‹'‚LEAVE�A�DEAD�BYTE�FOR�FORCED�CR�(SBARG).DESCANSE�EQU‡*-2*‰NEXTWB8RETRYAƒDC.B†'…'ˆHOLDS�ANSWER�TO�MISCELLANEOUS�QUESTIONS.0RETRYAE‚EQU‡*-2ŒLEAVE�A�DEAD�BYTE�FOR�FORCED�CR.*‰NEXTWB.RETRYBƒDC.B†'…'ˆHOLDS�ANSWER�TO�COPY?�MESSAGE.0RETRYBE‚EQU‡*-2ŒLEAVE�A�DEAD�BYTE�FOR�FORCED�CR.*‰NEXTWB8VOLR…DC.B†'Š'ƒHOLDS�VOLUME�NAME�ENTERED�FOR�OUTPUT�DISK..VOLRE„EQU‡*-2ŒLEAVE�A�DEAD�BYTE�FOR�FORCED�CR.*‰NEXTWB=WORKUSN‚DC.B†'ˆ'…HOLDS�USER�#�ENTERED�WHEN�LOGON�USER�#�IS�0.1WORKUSNE�EQU‡*-2ŒLEAVE�A�DEAD�BYTE�FOR�FORCED�CR.*‰NEXTWB5INBUF„DS.B†81�MISCELLANEOUS�INPUT�BUFFER�FOR�INP9IOS./INBUFEƒEQU‡*-2ŒLEAVE�A�DEAD�BYTE�FOR�FORCED�CR. *º<>‰PAGEJ****************************************************************************’ERROR�MESSAGE�PARAMETER�BLOCK*J************************************************************************** ‰DS.W�0EM_PBLK: -EM_D0„DC.L‚0‚D0�-�IOS/FHS�RETURN�ERROR�STATUS*ª(ERROR�MSG�KEYVALUE)-EM_A0„DC.L‚0‚A0�-�ADDR�OF�I/O�PARAMETER�BLOCKEM_OPTƒDC.B‚0‚OPTIONS�FLAG*­BIT‡MEANING�IF�SET*®0ˆQUERY�RESPONSE�DESIRED+EM_TLUN‚DC.B‚0‚USER�TERMINAL�LUN�-�(LDFLUN)$EM_QRCƒDC.B‚0‚QUERY�RETURN�CHARACTER+EM_KLUN‚DC.B‚0‚USER�KEYBOARD�LUN�-�(CDFLUN)3EM_SPAƒDC.L‚0‚START�ADDRESS�FOR�USER�TEXT�PLUG�POOL1EM_EPAƒDC.L‚0‚ENDƒADDRESS�FOR�USER�TEXT�PLUG�POOL‰PAGE=***************************************************************ˆOPTION�CONFLICT�TABLE*=***************************************************************‰DS.W�0OPTTBL:,*’EACH�WORD�REPRESENTS�A�SET,�OR�PATTERN,�OF**’OPTIONS�WHICH�DO�NOT�REPRESENT�AN�OPTION,*’CONFLICT.‚ANYTHING�NOT�IN�THIS�TABLE�DOES.**’AYNSRP..UBCVT...*‰DC.W†%1000000000000000ƒA‰DC.W†%1100000000000000ƒAY‰DC.W†%1010000000000000ƒAN‰DC.W†%1001000000000000ƒAS‰DC.W†%1101000000000000ƒAYS‰DC.W†%1011000000000000ƒANS‰DC.W†%1000010000000000ƒAP‰DC.W†%1100010000000000ƒAYP‰DC.W†%1010010000000000ƒANP‰DC.W†%1001010000000000ƒASP‰DC.W†%1101010000000000ƒAYSP‰DC.W†%1011010000000000ƒANSP‰DC.W†%0000100000000000ƒR‰DC.W†%0000110000000000ƒRP‰DC.W†%0000000010000000ƒU‰DC.W†%0000000010100000ƒUC‰DC.W†%0000000001000000ƒB‰DC.W†%0000000001100000ƒBC‰DC.W†%0000000001001000ƒBT‰DC.W†%0000000001101000ƒBCT‰DC.W†%0000000000010000ƒV‰DC.W†%0000000000011000ƒVT4‰DC.W†%0000000011000000ƒUB‡THESE�FOUR�ARE�NOT�REALLY4‰DC.W†%0000000011100000ƒUBC†KOSHER�SINCE�B�IMPLIES�U4‰DC.W†%0000000011001000ƒUBT†RATHER�THAN�SERVING�AS�A,‰DC.W†%0000000011101000ƒUBCT…MODIFIER�TO�IT. OPTTBLE‚EQU‡*-1‰PAGE<*************************************************************#*�IMAGE�OF�BUFFER�AREA�FOR�DISK�I/O1*ˆFOR�THE�VERIFY�(AND�B)�OPTION�WE�NEED�2�BUFFERS-*ˆLARGE�ENOUGH�FOR�1�TRACK�OF�THE�APPROPRIATE.*ˆMEDIA.‚FOR�NON-VERIFY�WE�ONLY�NEED�1�BUFFER.*<************************************************************  1*’***�THIS�ONE�IF�EITHER�OR�BOTH�ARE�FLOPPIES�*** ‰OFFSET�07FINBUFƒDS.B�FSECTRAK*SECLENŠBYTES/TRACK�=�SECTORS/TRACKFINBUFE‚EQU�*-1§*�BYTES/SECTOR FOUTBUF‚DS.B�FSECTRAK*SECLENFOUTBUFE EQU *-1 FBUFSIZ‚EQU�*-FINBUF  (*’***�THIS�ONE�IF�BOTH�ARE�HARD�DISK�*** ‰OFFSET�0HINBUFƒDS.B�HSECTRAK*SECLENHINBUFE‚EQU�*-1 HOUTBUF‚DS.B�HSECTRAK*SECLENHOUTBUFE EQU *-1 HBUFSIZ‚EQU�*-HINBUF‰PAGE<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<**************************************************************/*ˆ***‚PROCEDURE�SECTION�FOR�BACKUP�COMMAND‚******;************************************************************+*ˆD0�TO�STSKNAM�=�TASK�NAME�THAT�STARTED�ME*ˆD1�TO�SESNUM‚=�SESSION�NUM$*ˆD2�TO�VOLNAM‚=�DEFAULT�VOLUME�NAME*ˆD3�TO�USERNUM�=�USER�NUMBER*ˆD4�TO�CATNAM‚=�CATALOGUE�NAME*ˆD5�TO�CATN& AM�+4*ˆD6‹=‚LENGTH�OF�COMMAND�LINE)*ˆD7�=�BIT�MASK�OF�LOGICAL�UNITS�ASSIGNED*ˆA0�=�YOUR�TASK�NAME*ˆA1�=�TERMINAL�ID*ˆA2�=�ACTUAL�USER�NUMBER*#*********************************** ‰SECTION�0 BEGPROC: 4‰LEA‡PBA(PC),A7ŽSAVE�CONTENTS�OF�ALL�REGISTERS�BUT�A$‰MOVEM.L�D0-D7/A0-A6,STSKNAM-PBA(A7) 1‰LEA�PBA(PC),A4”LOAD�THE�PROGRAM�BASE�ADDRESS�AND-‰LEA�PROGSTK(PC),A7�SET�UP�THE�STACK�POINTER. ;‰LEA�VERSION(PC),A0†START�OF�INITIAL�MESSAGE‚***�071184�***/‰LEA�V_END(PC),A1ˆEND�OF�MESSAGE�***�071184�***-‰BSR�SENDMSG‚PRINT�THE�MESSAGE�***�071184�*** <‰BSR�SETADDR‰SET�THE�ADDRESSES�IN�THE�I/O�PARAM�BLOCKS,�ETC. &*’***�PARSE�THE�INPUT�COMMAND�LINE�***B‰LEA�COMMLIN(PC),A0†LOAD�ADDRESS�OF�COMMAND�LINE�WE�GOT�FROM�SYSTE <‰TST.L�REGD6-PBA(A4)�IF�THE�COMMAND�LINE�IS�NOT�EMPTY,�START‰BNE.S�PARSITˆWITH�THE�PARSE. <‰MOVE.B�#CR,(A0)…OTHERWISE,�PUT�A�CR�IN�THE�COMMAND�LINE�ANDF‰MOVE.L�#1,REGD6-PBA(A4)�PREPARE�TO�GUESS�AT�INPUT�AND�OUTPUT�DEVICES. MGETINOUT�MOVE.B�#1,NOIOFLAG-PBA(A4)‚GET�THE�FIRST�TWO�DEVICES�FROM�THE�DEVICE5‰BSR�NOINOUT‰MNEMONICS�TABLE�AND�PUT�IN�COMMAND�LINE. ;PARSITƒMOVE.L�A0,A5ˆSAVE�THE�COMMAND�LINE�START�ADDRESS�AND0‰MOVE.L�REGD6-PBA(A4),D6…PARSE�THE�COMMAND�LINE. ‰BSR�PARSE‹* ‰TST.L�D0Œ*‰BMI�ERINVAL‰*6******************************* 071184 ***************‰MOVE.L�A2,SAVOPT-PBA(A4)�**‰BSR�CKFOROPTˆRECORD�THE�OPTIONS�SELECTED.C‰TST.B�HFLAG-PBA(A4)‚CHECK�FOR�HELP�OPTION�SPECIFIED�***�071184�***9‰BNE�LISTH‹PRINT�THE�HELP�MESSAGE�AND�EXIT�***�071184�***6******************************* 071184 ***************7‰BTST.L�#22,D0‡RECORD�WHETHER�THERE�WAS�AN�INPUT�FIELD.‰SNE�INPNULL-PBA(A4)�* B‰IF_NOT_SET�NOIOFLAG-PBA(A4)‚IF�THIS�IS�THE�ORIGINAL�COMMAND�LINE, D‰CMP.B�#';',COMMLIN-PBA(A4)�IF�THE�ONLY�THING�IN�THE�COMMAND�LINE�IS=‰BEQ�GETINOUT‚OPTIONS,�GET�DEVICES�FROM�TABLE�AND�START�OVER. G‡IF.L�A1��#0�OR.B�(A1)��#','‚THEN.S‚IF�THERE'S�NO�OUTPUT�FIELD, 2‹IF_SET�INPNULL-PBA(A4)†IF�THERE'S�NO�INPUT�FIELD,7�MOVE.B�#'�',(A1)ŠREMOVE�THE�SECOND�COMMA�(FOR�SYNTAX),4�BRA�GETINOUTŽGET�DEVICES�FROM�TABLE�AND�START�OVER.‹ENDI–*.‰BRA�ERINVAL‘INPUT�WITHOUT�OUTPUT�IS�AN�ERROR. $‰ELSE.S˜IF�THERE�IS�AN�OUTPUT�FIELD, 9‹IF_SET�INPNULL-PBA(A4)†OUTPUT�WITHOUT�INPUT�IS�AN�ERROR.�BRA�ERINVAL�*�ENDI–* ‹ENDI ‰ENDI D‰MOVE.L�A5,SAVINP-PBA(A4)�SAVE�THE�LOCATIONS�OF�THE�INPUT�AND�OUTPUT5‰MOVE.L�A1,SAVOUT-PBA(A4)�FIELDS�IN�THE�COMMAND�LINE. 4‰BSR�INITINŠINITIALIZE�THE�INPUT�AND�OUTPUT�DEVICES.‰BSR�INITOUT‰* 6‰BSR�CKOPTCONˆCHECK�FOR�OPTION�CONFLICTS�AND�CHECK�THE 5‰BSR�GETBUFŠGET�A�SEGMENT�FOR�THE�I/O�BUFFERS.†ALTTRK 8‰BSR�ATTRIBŠSIZE�ATTRIBUTES�OF�INPUT�AND�OUTPUT�DEVICES. 5‰TST.L�SAVLST-PBA(A4)�IF�A�LIST�DEVICE�WAS�SPECIFIED,‰IF‚‚THEN.S„ASSIGN�IT. ‹BSR�NEWOUT‰ELSE.S:‹BTST.B�#3,REGD7+3-PBA(A4)�OTHERWISE,�CHECK�TO�SEE�IF�LU�3%‹IF‚‚THEN.S‚IS�FREE�AND�IF�IT�IS,6�FHSCALL�LU3AFHS(PC)�ASSIGN�IT�TO�MATCH�LU�6,�WHICH�IS4�BNE�FATALERR„TERMINAL�OR�BATCH�LISTING�FILE/DEVICE.�ENDI‹ENDI 8*********************************************************&*ˆCALL�THE�APPROPRIATE�COPY�ROUTINE(S)*8******************************************************** )******************************************ˆBACKUP�AND�VERIFY�COMMAND)*****************************************‰IF_SET�BFLAG-PBA(A4)4‰BSR�COPYIT�PERFORM�A�TRACK-BY-TRACK�COPY,�RESET�THE9‰MOVE.B�#1,ISEND-PBA(A4)‚END�SWITCH�AND�VERIFY�THE�DISKS. ‰BSR�VEROPT�*9‰BSR�WRITSLT‰WRITE�OUTPUT�DISK'S�SLT�IF�ALTS.�USEDƒALTTRK:‰BSR�WRITCONFˆWRITE�CONF�SECT�IF�CHANNEL�TYPES�DIFFƒALTTRK‰BRA.S�STOPIT‹*‰ENDI ,*********************************************ˆVERIFY�OPTION,********************************************‰IF_SET�VFLAG-PBA(A4)‰BSR�VEROPTŠVERIFY�THE�DISKS.‰BRA.S�STOPITˆ*‰ENDI )******************************************ˆREORGANIZE�OPTION'***************************************‰IF_SET�RFLAG-PBA(A4))‰BRA�OPTIONR‰PERFORM�A' �FILE-BY-FILE�COPY.‰ENDI &***************************************ˆTRACK�TO�TRACK�COPY&**************************************‰IF_SET�UFLAG-PBA(A4)*‰BSR�COPYITŠPERFORM�A�TRACK-BY-TRACK�COPY.9‰BSR�WRITSLT‰WRITE�OUTPUT�DISK'S�SLT�IF�ALTS.�USEDƒALTTRK:‰BSR�WRITCONFˆWRITE�CONF�SECT�IF�CHANNEL�TYPES�DIFFƒALTTRK‰BRA.S�STOPITˆ*‰ENDI #************************************ˆAPPEND�OPTION#***********************************)‰BRA�OPTIONR‰PERFORM�A�FILE-BY-FILE�COPY. **@****************************************************************$*ˆCLOSE�THE�INPUT�AND�OUTPUT�DEVICES@*****************************************************************3STOPITƒBSR.S�CLOSINˆCLOSE�INPUT�AND�OUTPUT�DEVICES.‰BSR.S�CLOSOUT‡*‰BNE�FATALERRˆ****@****************************************************************(*ˆTERMINATE�W/�NORMAL�TERMINATION�STATUS@*****************************************************************TERMP„ERQ.TERM‚#0,#0‰PAGE%************************************** *ˆCLOSE�INPUT*%************************************* CLOSIN: .‰LEA�INFHS(PC),A0’CLOSE�THE�INPUT�FILE/DEVICE.‰MOVE.W�#FHCLOS,FHSCMD(A0)…*‰FHSCALL�(A0)’*‰BNE�FATALERR’* .‰MOVE.B�#1,ISEND-PBA(A4)‡RESET�THE�END�SWITCH. ‰RTS****&****************************************ˆCLOSE�OUTPUT*&************************************** CLOSOUT: 6‰LEA�OUTFHS(PC),A0‘CLOSE�THE�OUTPUT�FILE/DEVICE.‚DON'T?‰MOVE.W�#FHCLOS,FHSCMD(A0)…CHECK�FOR�ERROR�YET�(DO�AFTER�CALL).‰FHSCALL�(A0)’* ‰RTS‰PAGE0*************************************************$*ˆROUTINE�TO�SET�UP�ADDRESSES�IN�IOS*ˆPARAMETER�BLOCKS.*0************************************************  6*’***�THIS�MACRO�GETS�THE�START�&�END�ADDRESSES�OF…***:*’***�BUFFER�\1�AND�STORES�THEM�IN�IOS�PARAM�BLOCK�\2.�***STORE_ADDR MACRO‰LEA�\2(PC),A2‰LEA�\1(PC),A1‰MOVE.L�A1,IOSSAD(A2)‰LEA�\1E(PC),A1‰MOVE.L�A1,IOSEAD(A2)‰ENDM  SETADDR: ‰STORE_ADDR�VOLR,INP1IOS‰STORE_ADDR�RETRYA,INP3IOS‰STORE_ADDR�RETRYB,INP4IOS‰STORE_ADDR�DESCANS,INP5IOS‰STORE_ADDR�WORKUSN,INP6IOS‰STORE_ADDR�INBUF,INP9IOS ,‰LEA�DIRBLK(PC),A1›PUT�THE�ADDRESS�OF�BUFFER-‰LEA�DIRFHS(PC),A2›DIRBLK�IN�PARAM�BLOCK�DIRF‰MOVE.L�A1,FHSSIZ(A2)”* -‰LEA�BUFFDEV(PC),A1šPUT�THE�ADDRESS�OF�BUFFER-‰LEA�FETDEV(PC),A2›BUFFDEV�IN�PARAM�BLOCK�FET‰MOVE.L�A1,FHSPTR(A2)”* ‰LEA�SLTBUF(PC),A1¡<> ‰RTS‰PAGEC********************************************************************2*ˆROUTINE�TO�SET�ACCESS�CODES�FOR�INPUT�AND�OUTPUT* *ˆON�CALL:1*ŠHIGH�ORDER�16�BITS�OF�D1�<--�OUTPUT�ACCESS�CODE/*ŠLOW‚ORDER�16�BITS�OF�D1�<--�INPUT‚ACCESS�CODE*C******************************************************************* ACCESS: 5‰LEA�INFHS(PC),A0’CHANGE�THE�ACCESS�CODE�OF�THE�INPUT;‰MOVE.W�#FHCHNG,FHSCMD(A0)…DEVICE�TO�WHATEVER�IS�IN�THE�LOW!‰MOVE.W�D1,FHSOPT(A0)ŠWORD�OF�D1.‰FHSCALL�(A0)’*‰BNE�FATALERR’* 7‰LEA�OUTFHS(PC),A0‘CHANGE�THE�ACCESS�CODE�OF�THE�OUTPUT<‰MOVE.W�#FHCHNG,FHSCMD(A0)…DEVICE�TO�WHATEVER�IS�IN�THE�HIGH‰SWAP�D1—WORD�OF�D1.‰MOVE.W�D1,FHSOPT(A0)Š*‰FHSCALL�(A0)’*‰BNE�FATALERR’* ‰RTS‰PAGE/************************************************$*ˆ**‚INITALIZATION�OF�INPUT�DISK‚***3*ˆ***‚SET�UP�FHS�PARM�BLOCK�BASED�ON�CMD�LINE�INPUT1*ˆTHIS�ROUTINE�WILL�DO�ASSIGN�AND�ATTRIBUTE�CALLS*/*********************************************** INITIN: -‰LEA�INFHS(PC),A6’LOAD�THE�DEFAULT�USER�#�ANDD‰MOVE.W�USERNUM-PBA(A4),FHSUSN(A6)�CATALOG�FIELDS�INTO�THE�PARAMETER'‰MOVE.L�CATNAM-PBA(A4),FHSCLG(A6)‚BLOCK'‰MOVE.L�CATNAM+4-PBA(A4),FHSCLG+4(A6)‚* <‰MOVE.L�SAVINP-PBA(A4),A0†USE�EDITFILE�ON�THE�INPUT�FIELD�OF‰BSR�EDITFILE’THE�COMMAND�LINE.‰BMI�ERINVAL“* ?‰MOVE.L�#$F0040,D4ƒIF�FILENAME,�EXTENSION,�OR�PROTECTION�FIELDS' 2‰AND.L‚D0,D4ˆWERE�SPECIFIED,�OR�*�IN�VOLUME�FIELD,‰BNE„ERINVAL†THAT'S�AN�ERROR. >‰BTST�#22,D0‰IF�NO�VOLUME�NAME�WAS�SPECIFIED,�THAT'S�AN�ERROR.‰BEQ�ERINVAL‰* =‰BTST.L�#5,D0ˆRECORD�WHETHER�USER�#�&�CATALOG�FIELDS�INCLUDED*‰SNE�FAMUSN-PBA(A4)‚FAMILY�SPECIFICATIONS.‰BTST.L�#4,D0ˆ*‰SNE�FAMCAT-PBA(A4)‚* >‰MOVE.L�#$300000,D1‚RECORD�WHETHER�USER�#�OR�CATALOG�FIELD�WAS‰AND.L�D0,D1‰SPECIFIED.‰SNE�USN_CAT-PBA(A4)�* 5‰LEA�INFHS(PC),A0’LOAD�INPUT�PARAMETER�BLOCK�ADDRESS.+‰BTST�#1,D0”IF�THE�INPUT�FIELD�IS�A�DEVICE,‰IF‚‚THEN.S 3‰MOVE.L�FHSVOL(A0),D4ŠGO�CHECK�THE�DEVICE�MNEMONICS&‰BSR�CKTAB•TABLE�TO�SEE�IF�HE'S�IN�IT.‰LEA�INFHS(PC),A0’* 7‰MOVE.W�#-2,FHSUSN(A0)‰PUT�FAMILY�SPECIFICATIONS�IN�THE4‰MOVE.B�#1,FAMUSN-PBA(A4)†USER�#�AND�CATALOG�FIELDS.‰MOVE.L�#'****',FHSCLG(A0)…*‰MOVE.L�#'****',FHSCLG+4(A0)ƒ*‰MOVE.B�#1,FAMCAT-PBA(A4)†* ‰ENDI '*’***�ASSIGN�INPUT�VOLUME�OR�DEVICE�***4‰LEA�DIRFHS(PC),A6‘MOVE�THE�VOLUME�NAME,�USER�#,�AND;‰MOVE.L�FHSVOL(A0),FHSVOL(A6)‚CATALOG�FIELDS�FROM�THE�INPUT:‰MOVE.W�FHSUSN(A0),FHSUSN(A6)‚PARAMETER�BLOCK�TO�THE�FETCH>‰MOVE.L�FHSCLG(A0),FHSCLG(A6)‚DIRECTORY�ENTRY�PARAMETER�BLOCK.!‰MOVE.L�FHSCLG+4(A0),FHSCLG+4(A6) 7‰MOVE.L�#'„',FHSCLG(A0)…PUT�SPACES�IN�THE�CATALOG�FIELD7‰MOVE.L�#'„',FHSCLG+4(A0)ƒOF�THE�INPUT�PARAMETER�BLOCK. -‰FHSCALL�(A0)’ASSIGN�THE�INPUT�VOLUME/DEVICE.‰BNE�FATALERR’* A‰MOVE.W�#FHRATT,FHSCMD(A0)…FETCH�ITS�ATTRIBUTES�SO�WE'LL�HAVE�ITS)‰FHSCALL�(A0)’SIZE�EVEN�IF�IT�IS�FOREIGN.‰BNE�FATALERR’* ;‰IF.L‚FHSSIZ(A0)��#SECT2048�THEN.S‚IF�#�OF�SECTORS>2048?‹MOVE.B�#1,INHARD-PBA(A4)„FLAG�THAT�INPUT�IS�HARD�DISK�OR�5�1/4 *°<<0104858‹IF.L�FHSSIZ(A0)��#BIGFLOP�THEN.S‚IF�SECTORS�<=�2552,�MOVE.B�#1,INFLOP-PBA(A4)ŒINPUT�IS�ON�FLOPPY‹ENDI¢010485>>B‹IF_NOT_SET�OPTNOA-PBA(A4)ƒA�CONTRADICTORY�OPTION�WAS�NOT�SELECTED2�IF_NOT_SET�INFLOP-PBA(A4)�AND�NOT�FLOPPIES„011185-�MOVE.B�#1,AFLAG-PBA(A4)ƒDEFAULT�TO�OPTION�A.�ENDI‹ENDI˜*‰ENDIš* ‰RTS‰PAGE6********************************************************ˆINITIALIZATION�OF�OUTPUT�DISK*6****************************************************** INITOUT: *‰MOVE.B„#1,IOTYPE-PBA(A4)ƒSET�OUTPUT�FLAG. 2‰LEA�OUTFHS(PC),A6‘LOAD�THE�OUTPUT�PARAMETER�BLOCK>‰MOVE.W�USERNUM-PBA(A4),FHSUSN(A6)…WITH�THE�DEFAULT�USER�#�AND*‰MOVE.L�CATNAM-PBA(A4),FHSCLG(A6)†CATALOG.'‰MOVE.L�CATNAM+4-PBA(A4),FHSCLG+4(A6)‚* <‰MOVE.L�SAVOUT-PBA(A4),A0‡CALL�EDITFILE�ON�THE�OUTPUT�FIELD,.‰BSR�EDITFILE‹PUTTING�THE�RESULT�IN�THE�OUTPUT‰BMI�ERINVALŒPARAMETER�BLOCK. ?‰MOVE.L�#$F0040,D4ƒIF�FILENAME,�EXTENSION,�OR�PROTECTION�FIELDS6‰AND.W‚D0,D4ˆWERE�SPECIFIED,�OR�*�WAS�IN�VOLUME�FIELD,‰BNE„ERINVAL†THAT'S�AN�ERROR. >‰BTST�#22,D0‰IF�NO�VOLUME�NAME�WAS�SPECIFIED,�THAT'S�AN�ERROR.‰BEQ�ERINVAL‰* C‰MOVE.L�#$300000,D1‚IF�USER�#�OR�CATALOG�FIELDS�WERE�SPECIFIED,�SET‰AND.L�D0,D1‰THE�FLAG.‰IF‚‚THEN.S„*‹ST�USN_CAT-PBA(A4)‰ENDI�* 6*’***�CHECK�FOR�A�LIST�FILE/DEVICE�IN�COMMAND�LINE�***%‰BTST�#0,D0ŠWAS�THE�TERMINATOR�A�'/'?‰BNE�ERINVAL‰YES--ERROR. 0‰IF.B‚-1(A0)��#','�THEN.S�IF�IT�WAS�A�COMMA,6‹MOVE.L�A0,SAVLST-PBA(A4)„SAVE�THE�LOCATION�FOR�LATER.‹ENDI˜* +*’***�CHECK�FOR�DEVICE�OR�FAMILY�FIELDS�***7‰LEA�OUTFHS(PC),A0‘LOAD�THE�OUTPUT�PARAMETER�BLOCK�ADDR .‰BTST�#1,D0”IF�IT'S�A�DEVICE,�CHECK�THE�DEVICE4‰IF‚‚THEN.SŽMNEMONICS�TABLE�FOR�THE�VOLUME�NAME.:‹MOVE.L�FHSVOL(A0),D4ˆALSO,�RECORD�THAT�USER�#�AND�CATALOG.‹BSR�CKTAB“FIELDS�ARE�TO�BE�TREATED�AS�FAMILY.‹LEA�OUTFHS(PC),A0�*‹MOVE.B�#1,FAMUSN-PBA(A4)„*‹MOVE.B�#1,FAMCAT-PBA(A4)„*‹ENDI˜* 1‰BTST.L�#5,D0’IF�THE�USER�#�SPECIFIED�WAS�FAMILY,‰IF‚‚THEN.SŽREMEMBER�IT.‹MOVE.B�#1,FAMUSN-PBA(A4)„*-‰ELSE.S˜OTHERWISE�(OUTPUT�USER�#�NOT�FAMILY),<‹IF_SET�FAMUSN-PBA(A4)‡IF�INPUT�USER�#�WAS�FAMILY�AND�OUTPUT)‹BTST�#21,D0‘USER�#�WAS�SPECIFIED,�ERROR!%‹BNE�ERINVAL‘(E.G.�BACKUP�V1:*,V2:99)‹ENDI˜*‰ENDIš* 2‰BTST.L�#4,D0’IF�THE�CATALOG�SPECIFIED�WAS�FAMILY,2‰I( F‚‚THEN.SŽREMEMBER�IT.�IT�MUST�BE�ALL�STARS,@‹MOVE.B�#1,FAMCAT-PBA(A4)„HOWEVER�(E.G.�BACKUP�V1:99.*,V2:99.AB*'‹CMP.L�#'****',FHSCLG(A6)„IS�AN�ERROR).‹BNE�ERINVAL‘*‹CMP.L�#'****',FHSCLG+4(A6)‚*‹BNE�ERINVAL‘*.‰ELSE.S˜OTHERWISE�(OUTPUT�CATALOG�NOT�FAMILY),=‹IF_SET�FAMCAT-PBA(A4)‡IF�INPUT�CATALOG�WAS�FAMILY�AND�OUTPUT*�BTST�#20,D0�CATALOG�WAS�SPECIFIED,�ERROR!-�BNE�ERINVAL�(E.G.�BACKUP�V1:99.*,V2:99.BLIP)�ENDI–*‹ENDI˜* *’***�ASSIGN�OUTPUT�DISK�***D‚MOVE.L�FHSCLG(A0),SOUTCAT-PBA(A4)„SAVE�THE�OUTPUT�CATALOG�FIELD�AND:‚MOVE.L�#'„',FHSCLG(A0)ŒPUT�SPACES�IN�THE�PARAMETER�BLOCK.(‚MOVE.L�FHSCLG+4(A0),SOUTCAT+4-PBA(A4)�*‚MOVE.L�#'„',FHSCLG+4(A0)Š* ‚FHSCALL�(A0)™DO�THE�ASSIGNMENT.‚BNE„FATALERR–* A‰MOVE.W�#FHRATT,FHSCMD(A0)…FETCH�ITS�ATTRIBUTES�SO�WE'LL�HAVE�ITS)‰FHSCALL�(A0)’SIZE�EVEN�IF�IT�IS�FOREIGN.‰BNE�FATALERR’* 6‰MOVE.L�FHSSIZ(A0),SAVESIZE-PBA(A4)†SAVE�#�OF�SECTORS. <‰IF.L‚FHSSIZ(A0)��#SECT2048�THEN.S�IF�#�OF�SECTORS>2048, *’***�HARD�DISK�***5‰MOVE.B�#1,OUTHARD-PBA(A4)…SET�HARD�DISK�OUTPUT�FLAG. 7‰TST.B�RFLAG-PBA(A4)‹AN�ATTEMPT�TO�REORGANIZE�TO�A�HARD‰BNE�HARDRERR’DISK�IS�AN�ERROR. <‰IF_NOT_SET�OPTNOA-PBA(A4)…UNLESS�A�CONTRADICTORY�OPTION�WAS=‹IF_NOT_SET�INFLOP-PBA(A4)ƒSELECTED�OR�USING�FLOPPIES,�011185-�MOVE.B�#1,AFLAG-PBA(A4)ƒDEFAULT�TO�OPTION�A.‹ENDI‰ENDIš* ‰ENDI ‰RTS‰PAGE:***********************************************************0*ˆROUTINE�FOR�NO�INPUT�OR�OUTPUT�ON�COMMAND�LINE*:***********************************************************B*ˆThis�routine�calls�the�device�mnemonics�table�to�get�the�name�ofG* the hard disks on the system and insert them into the command line in!* order to backup #HD00 to #HD01.?*ˆ1.‚Get�the�device�mnemonics�table;�information�is�returned�in *ŒBUFFDEV.@*ˆ2.‚Move�the�names�of�the�devices�to�COPM�buffer�to�ask�user�if*Œthis�is�the�desired�backup.>*ˆ3.‚If�user�answers�affirmatively,�then�move�the�device�names?*Œ(going�from�the�back�of�the�buffer�to�the�front)�into�COMMLIN<*Œwhich�already�contains�the�name�of�the�list�field,�if�any.A*ŒA�call�to�NOINSUB�does�the�actual�move�and�counts�the�number�of#*Œcharacters�moved�for�line�length.=*ˆ4.‚Store�the�address�of�the�beginning�of�the�filled�buffer.**NOINOUT: 8‚FHSCALL�FETDEV(PC)‰FETCH�THE�DEVICE�MNEMONICS�TABLE�FOR$‚BNE…FATALERR‹RANDOM�ACCESS�DEVICES. 7‚CMP.W�#2,FHSLEN(A0)ˆIF�THERE�ARE�FEWER�THAN�2�ENTRIES,‚BLO�ERINVAL�THAT'S�AN�ERROR. 9‚LEA�BUFFDEV(PC),A1�THE�FIRST�TWO�DEVICES�WILL�BECOME�THEI‚MOVE.L�FDVDEV(A1),COPMD1-PBA(A4)�INPUT�AND�OUTPUT�DEVICES,�RESPECTIVELY./‚ADD.L�#FDVLEN,A1‹PUT�THEM�IN�THE�MESSAGE�LINE.#‚MOVE.L�FDVDEV(A1),COPMD2-PBA(A4)�* 3‚LEA�COPM(PC),A0�ASK�THE�USER�IF�HE�WANTS�TO�BACKUP'‚LEA�COPME(PC),A1�DEVICE�1�TO�DEVICE�2.‚BSR�SENDMSGI�* $‚IOSCALL�INP4IOS(PC)ŒGET�HIS�ANSWER.‚BNE„FATALERRŒ* ‚BSR„SBARG�*‚BNE„FATALERRŒ* @‚CMP.B�#'Y',RETRYB-PBA(A4)‚IF�IT'S�NOT�Y,�TERMINATE�THE�PROGRAM. ‚BNE�TERMP’* 6*’***�INSERT�THE�DEVICE�NAMES�IN�THE�COMMAND�LINE.�***4*’***�AN�11�BYTE�BUFFER�SITS�BEFORE�THE�ORIGINALƒ***0*’***�COMMAND�LINE�TO�HOLD�THEM.ƒ#XXXX,#XXXX…***6*’***�INSERTION�STARTS�WITH�THE�LAST�BYTE�AND�GOES�***/*’***�TOWARD�THE�FRONT.‚SPACES�ARE�REMOVED.‡***6‰MOVE.L�REGD6-PBA(A4),D6ƒLOAD�THE�COMMAND�LINE�LENGTH. 8‰LEA�COMMLIN(PC),A0�MOVE�THE�SECOND�DEVICE�NAME�INTO�THE8‰ADDQ.L„#1,A0�ADJUST�FOR�ADDR�DECR�BEFORE�STORAGE�032784*‰SUBQ.L„#1,D6�ADJUST�COMMAND�LENGTH�0327847‰MOVE.B„#',',(A0)‰MOVE�IN�COMMA�BEFORE�FILE�NAME†032784  ‰LEA�COPMD2+4(PC),A1�BUFFER.‰BSR.S�NOINSUB‘* 9‰MOVE.B�#',',-(A0)ŒMOVE�A�COMMA�AND�THE�FIRST�DEVICE�NAME4‰LEA�COPMD1+4(PC),A1�INTO�THE�BUFFER.‚(REMEMBER,�ALL3‰BSR.S�NOINSUB‘THIS�IS�HAPPENING�IN�REVERSE�ORDER.) 2‰ADD.L�#3,D6“INCREMENT�COMMAND�LINE�LENGTH�FOR�THE=‰MOVE.L�D6,REGD6-PBA(A4)‡#'S�AND�COMMA;�THEN�SAVE�THE�RESULT. ‰RTS‰PAGE9**********************************************************+*ˆTRANSFER( �DEVICE�NAME�FROM�(A1)�TO�(A0)�IN,*ˆREVERSE�ORDER�(LAST�BIT�FIRST).‚SPACES�ARE.*ˆNOT�TRANSFERRED�AND�NAME�IS�PRECEDED�BY�A�#.*9********************************************************* NOINSUB: ‰MOVE�#3,D0 &NOINSUB1�IF.B‚-(A1)��#SPACE‚THEN.S:‹MOVE.B�(A1),-(A0)ŠIF�THE�CHAR�IS�NOT�A�SPACE,�TRANSFER�IT3‹ADD.W�#1,D6‘AND�INCREMENT�THE�COMMAND�LINE�LENGTH.‹ENDI˜* +‰DBF�D0,NOINSUB1�REPEAT�A�TOTAL�OF�4�TIMES. 3‰MOVE.B�#'#',-(A0)ŒPUT�IN�THE�#�(DEVICE�INDICATOR). ‰RTS‰PAGE6*******************************************************&*ˆROUTINE�TO�DO�FETCH�DEVICE�MNEMONICS *ˆAND�GET�VOLUME�NAME�IF�PRESENT7*ˆD4�CONTAINS�THE�VOLUME�NAME�TO�CHECK�FOR�IN�THE�TABLE3*ˆIOTYPE�IS�A�FLAG�0�=�INPUT�DISK�&�1�=�OUTPUT�DISK*5***************************************************** CKTAB: B‰LEA�BUFFDEV(PC),A1†FETCH�THE�DEVICE�MNEMONICS�TABLE�INTO�BUFFDEV.‰FHSCALLƒFETDEV(PC)�*‰BNE‡FATALERR‚* 9‰MOVE.W�FHSLEN(A0),D1‚SAVE�THE�#�OF�ENTRIES�IN�THE�TABLE. >CKTAB2ƒCMP.L�FDVDEV(A1),D4�CHECK�EACH�TABLE�ENTRY�TO�SEE�IF�IT/‚BEQ.S�CKTABF�MATCHES�THE�DEVICE�NAME�IN�D4.‚IF0‚SUB.W�#1,D1�IT'S�NOT�IN�THE�TABLE�AT�ALL,�IT�IS2‚BLSƒERDEVICE�NOT�A�KNOWN�RANDOM�ACCESS�DEVICE,�SO‚ADD.L�#FDVLEN,A1‹ERROR. ‚BRA�CKTAB2‘* .*’***�FOUND�A�MATCH--IS�IT�A�FOREIGN�DISK?�***DCKTABFƒTST.L�FDVVOL(A1)„A�VOLUME�NAME�OF�0�INDICATES�A�FOREIGN�DISK.‰IF‚‚THEN.S *—***�DISK�NOT�FOREIGN�***‰IF_NOT_SET�IOTYPE-PBA(A4) *œ***�INPUT�DISK�***5‰LEA�INFHS(PC),A0’MOVE�THE�VOLUME�NAME�FOR�THE�DEVICE@‰MOVE.L�FDVVOL(A1),FHSVOL(A0)‚TO�THE�INPUT�FHS�PARAM�BLOCK.‚FLAG?‰MOVE.B�#1,DEVIN-PBA(A4)‡THAT�A�DEVICE�WAS�SPECIFIED�FOR�INPUT. ‰ELSE.S*œ***�OUTPUT�DISK�***6‰LEA�OUTFHS(PC),A0‘MOVE�THE�VOLUME�NAME�FOR�THE�DEVICEA‰MOVE.L�FDVVOL(A1),FHSVOL(A0)‚TO�THE�OUTPUT�FHS�PARAM�BLOCK.‚FLAGA‰MOVE.B�#1,DEVOUT-PBA(A4)†THAT�A�DEVICE�WAS�SPECIFIED�FOR�OUTPUT. ‰ENDI ‰ELSE.S*—***�DISK�IS�FOREIGN�***3‰TST.B�AFLAG-PBA(A4)�IF�THIS�IS�AN�OPTION�A�BACKUP,‰BNE�FILFRERRˆTHAT'S�AN�ERROR. ‰IF_NOT_SET�IOTYPE-PBA(A4) *œ***�FOREIGN�INPUT�DISK�***=‰TST.B�RFLAG-PBA(A4)�IF�THIS�IS�AN�OPTION�R�BACKUP,�THAT'S�AN1‰BNE�FILFRERRˆERROR�TOO�FOR�A�FOREIGN�INPUT�DISK. A‰LEA„FORMSG(PC),A0„INFORM�THE�USER�THAT�THE�INPUT�DISK�IS�FOREIGNA‰LEA„FORMSGE(PC),A1ƒAND�ASK�HIM�IF�HE�WANTS�TO�CONTINUE.‚TERMINAT‰BSR„GETRESP†IF�HE�DOESN'T. ‰BNE„TERMPˆ* F‰MOVE.B�#1,INFORN-PBA(A4)�HE�WANTS�TO�GO�AHEAD.‚FLAG�INPUT�AS�FOREIGN. ‰ELSE.S*œ***�FOREIGN�OUTPUT�DISK�***D‰MOVE.B�#1,OUTFORN-PBA(A4)�REMEMBER�THAT�THE�OUTPUT�DISK�IS�FOREIGN. ‰ENDI ‰ENDI ‰RTS‰PAGE4*****************************************************1*ˆROUTINE�TO�CHECK�ATTRIBUTES�OF�INPUT�AND�OUTPUT*4**************************************************** ATTRIB: ?‰TST.B�AFLAG-PBA(A4)�IF�THIS�IS�AN�A-TYPE�BACKUP,�NONE�OF�THESE/‰BNE.S�ATTRIBEX†TESTS�ARE�NECESSARY--JUST�EXIT. :‰LEA�INFHS(PC),A0„COMPARE�SIZES�OF�INPUT�AND�OUTPUT�DISKS.8‰LEA�OUTFHS(PC),A1ƒIF�THEY�ARE�THE�SAME�SIZE,�JUST�EXIT.‰MOVE.L�FHSSIZ(A0),D4‰CMP.L�FHSSIZ(A1),D4‰BEQ.S�ATTRIBC¥ALTTRK ‰IF‚‚THEN.S "*’***�OUTPUT�DISK�>�INPUT�DISK�***IATTRIBA‚TST.B�OUTHARD-PBA(A4)�IF�OUTPUT�IS�HARD�DISK,�ERROR!--ONLY�OPTION3‰BNE�LSIZERR‰A�ALLOWED�TO�DIFFERENT�SIZE�HARD�DISK. 6‰TST.B�INFORN-PBA(A4)�IF�INPUT�DISK�IS�FOREIGN,�ERROR!‰BNE�FORLGERRˆ* :‰LEA�SIZWM(PC),A0ˆINFORM�THE�USER�THAT�OUTPUT�>�INPUT,�AND%‰LEA�SIZWME(PC),A1‡FLAG�IT�FOR�LATER.‰BSR�SENDMSG‰*‰MOVE.B�#1,SIZFLAG-PBA(A4)�*9*…PERMIT�BACKUP�OF�SINGLE�SIDED�TO�DOUBLE�SIDED�DISKETTES ‡ELSE.S "*’***�INPUT�DISK�>�OUTPUT�DISK�***DATTRIBB‚TST.B�RFLAG-PBA(A4)�WE�KNOW�OPTION�A�IS�NOT�SET.‚IF�OPTION�R‰BEQ�SIZERRŠIS�NOT�SET,�ERROR! 4‰LEA�WSIZM(PC),A0ˆWARN�THE�USER�THAT�INPUT�>�OUTPUT.‰LEA�WSIZME(PC),A1‡*‰BSR�SENDMSG‰*‰ENDI ATTRIBEX RTS *º<>*‰BSR�IOSREAD‚READ�INPUT�DISK,�GET�VID�INFO!‰MOVE.L�RDSKIOS+IOSSAD-PBA(A4),A1:‰MOVE.B�IOSCTP+SECLEN(A1),INCHAN-PBA(A4)�SAVE�CHANNEL�TYPE5‰MOVE.B�VIDALT(A1),D4�SAVE�ALT�SEC�BYTE�OF�INPUT�DISK/‰MOVE.B�D4,INALT-PBA(A4)�SAVE�ALT�SEC�INDICATOR(‰BEQ.S�ATTRIBD�ALT�IND�NOT�SET,�CONTINUE3‰BSR.S�ATTLAST‚COMPUTE�LAST�READABLE�SECTOR�ON�DISK>ATTRIBD‚MOVE.B�#DSKLUO,RDSKIOS+IOSLUN-PBA(A4)�CHG�LU�TO�OUTPUT*‰BSR�IOSREAD‚READ�OUTPUT�DISK,�GET�ITS�VID:‰MOVE.B�#DSKLUI,RDSKIOS+IOSLUN-PBA(A4)�RESTORE�LU�TO�INPUT3‰MOVE.L�VIDSLT(A1),OUTSLT-PBA(A4)�SAVE�SLT�LOCATION;‰MOVE.B�IOSCTP+SECLEN(A1),OUTCHAN-PBA(A4)�SAVE�CHANNEL�TYPE‰MOVE.B�VIDALT(A1),D50‰MOVE.B�D5,OUTALT-PBA(A4)‚SAVE�ALT�SEC�INDICATOR6‰CMP.B�D4,D5‚BOTH�USING/NOT�USING�ALT�SEC�CAPABILITY�?&‰BEQ�ATTRIBEX�YES,�SAME�LOGICAL�LENGTH+‰TST.B�D4‚INPUT�USE�ALT�SECTOR�CAPABILITY�?*‰BNE�ATTRIBA‚YES,�DO�OUTPUT�>�INPUT�CHECKS)‰BRA�ATTRIBB‚NO,‚DO�INPUT�>�OUTPUT�CHECKS*:*ˆCOMPUTE�LAST�READABLE�SECTOR�ON�DRIVE�IF�USING�ALTERNATE *ˆSECTOR�DISK)*ŠENTER:�A1�=�BUFFER�ADDRESS�OF�LAST�READ2*ŠEXIT:‚(NONE),�ALTLAST�SET�TO�LAST�SECTOR�TO�READ$*™ALTDIAG�SET�TO�LOC�OF�DIAG.�TRACKS* ATTLAST‚EQU�*#‰MOVEM.LƒD0-D7,-(A7)�SAVE�REGISTERS ‰CLR.L…D1 ‰CLR.L…D24‰MOVE.B„IOSSPT+SECLEN(A1),D1‚GET�SEC�PER�TRACK�MEDIA2‰MOVE.W„IOSPSM+SECLEN(A1),D2‚GET�PH�SEC�SIZE�MEDIA)‰MULU†D1,D2‚COMPUTE�TOTAL�SECTORS�ON�DISK3‰DIVU†#SECLEN,D2‚COMPUTE�NUM�VDOS�SECTORS�PER�TRACK0‰MOVE.L„IOSRSZ+SECLEN(A1),D3‚GET�SECTORS�ON�DISK ‰CLR.L…D0‰MOVE.B„#MAXBAD,D0=*‚ADD�1�CYLINDER�FOR�THE�DIAGNOSTIC�TRACKS�AT�THE�END�OF�DISK ‰ADD.B…#1,D0‰MOVE.B„IOSHDS+SECLEN(A1),D1.‰MOVE.B„D1,ALTHDS-PBA(A4)‚SAVE�NUMBER�OF�HEADS‰AND.W…#$FF,D1�CLEAR�UPPER�BYTE ‰MULU†D1,D0 ‰MULU†D2,D0=*ƒSUBTRACT�1�TRACK�MORE�THAN�NEEDED�SINCE�TRACKS�START�WITH�0 ‰ADD.L…D2,D0 ‰SUB.L…D0,D3‰MOVE.L„D3,ALTLAST-PBA(A4)'*ƒCOMPUTE�LOCATION�OF�DIAGNOSTIC�TRACKS1‰MULU†#MAXBAD,D1‚NUMBER�OF�TRKS�PER�DISK�FOR�ALTS/‰MULU†D2,D1‚NUMBER�OF�SECTORS�PER�DISK�FOR�ALTS+‰ADD.L…D2,D1‚GET�TO�BEGINNING�OF�NEXT�TRACK5‰ADD.L…D1,D3‚POINTS�TO�BEGINNING�OF�DIAGNOSTIC�TRACKS‰MOVE.L„D3,ALTDIAG-PBA(A4)&‰MOVEM.Lƒ(A7)+,D0-D7‚RESTORE�REGISTERS‰RTS‡RETURN¢ALTTRK>>‰PAGEG************************************************************************2*ˆROUTINE�TO�GET�MEMORY�SEGMENT�FOR�I/O�BUFFER(S).5*ˆSIZE�OF�BUFFER�DEPENDS�ON�WHETHER�FLOPPIES�ARE�USED"*ˆAND�WHETHER�VERIFY�WILL�BE�DONE.*G***********************************************************************  /*’***�THIS�MACRO�TAKES�THE�ADDRESS�WHICH�IS‚***0*’***�THE�SUM�OF�\1�AND�A0,�AND�PLACES�IT�IN�*** *’***�MEMORY�AT�LOCATION�\2.‘*** STORE„MACRO‰LEA�\1(A0),A1‰MOVE.L�A1,\2-PBA(A4)‰ENDM  GETBUF: 8‰MOVE.L�#FBUFSIZ,D0ŒLOAD�#�OF�BYTES�IN�FLOPPY�I/O�BUFFERC‰MOVE.L�#FSECTRAK,SECTNUM-PBA(A4)�AND�SET�SECTORS/TRACK�FOR�FLOPPY. ;‰IF_SET�INHARD-PBA(A4)‰IF�BOTH�DISKS�ARE�HARD,�THEN�REPLACE9‹IF_SET�OUTHARD-PBA(A4)†THOSE�VALUES�WITH�THE�APPROPRIATE'�MOVE.L�#HBUFSIZ,D0ˆONES�FOR�HARD�DISK.#�MOVE.L�#HSECTRAK,SECTNUM-PBA(A4)�*‹ENDI˜*‰ENDIš* ?‰IF_NOT_SET�VFLAG-PBA(A4)†UNLESS�WE�ARE�DOING�A�VERIFY�(OPTIONS>‹IF_NOT_SET�BFLAG-PBA(A4)„V�OR�B),�WE�ONLY�NEED�ONE�BUFFER,�SO#�LSR.L�#1,D0�HALVE�THE�BUFFER�SIZE.‹ENDI˜*‰ENDIš* >‰MOVE.L�D0,BUFSIZ-PBA(A4)†MOVE�THE�DESIRED�LENGTH�TO�THE�GTSEG:‰ERQ.GTSEG�BUFPAR-PBA(A4)†PARAMETER�BLOCK�AND�DO�THE�CALL.‰BNE�FATALERR’* =‰STORE�FINBUF,BUF1SADŠSAVE�THE�BEGINNING�AND�ENDING�ADDRESSES;‰STORE�FINBUFE,BUF1EAD‰FOR�THE�TWO�BUFFERS,�ASSUMING�FLOPPY'‰STORE�FOUTBUF,BUF2SAD‰DISK�TRACK�SIZE.‰STORE�FOUTBUFE,BUF2EADˆ* 6‰IF_SET�INHARD-PBA(A4)‰IF�BOTH�DISKS�ARE�H) ARD,�REPLACE:‹IF_SET�OUTHARD-PBA(A4)†ADDRESSES�WITH�THOSE�FOR�HARD�DISK!�STORE�HINBUF,BUF1SAD†TRACK�SIZE.�STORE�HINBUFE,BUF1EAD…*�STORE�HOUTBUF,BUF2SAD…*�STORE�HOUTBUFE,BUF2EAD„*‹ENDI˜*‰ENDIš* 7‰LEA�RDSKIOS(PC),A2�LOAD�THE�INPUT�AND�OUTPUT�IOS�PARAMF‰MOVE.L�BUF1SAD-PBA(A4),IOSSAD(A2)�BLOCKS�WITH�THE�STARTING�AND�ENDINGA‰MOVE.L�BUF1EAD-PBA(A4),IOSEAD(A2)…ADDRESSES�OF�THE�FIRST�BUFFER.‰LEA�WDSKIOS(PC),A2�*$‰MOVE.L�BUF1SAD-PBA(A4),IOSSAD(A2)…*$‰MOVE.L�BUF1EAD-PBA(A4),IOSEAD(A2)…* ‰RTS‰PAGEG************************************************************************:*ˆROUTINE�TO�CHECK�FOR�OPTIONS,�SETTING�APPROPTIATE�FLAGS.:*ˆVALID�OPTIONS�ARE‚A�Y�N�S�R�PƒU�B�C�V�T.‚ANY�OPTION�THAT<*ˆSHOULD�NEVER�BE�USED�WITH�OPTION�A�SHOULD�SET�OPTNOA�TO�1.*G************************************************************************TEST_FOR MACRO‰IF.B‚D1��#'\1'‚THEN.S‹MOVE.B‚#1,\1FLAG-PBA(A4)‹OR.W„#1<<\2,D7 ‹BRA…CKFOR1‹ENDI‰ENDM** CKFOROPT: 1‰CLR.L…D7ˆINITIALIZE�THE�OPTION�PATTERN�REGISTER.B‰MOVE.L‚SAVOPT-PBA(A4),A2ƒIF�THERE�WERE�ANY�OPTIONS�IN�THE�COMMAND2‰IF�A2��#0‚THEN�LINE,�CHECK�THEM�FOR�VALIDITY. :CKFOR1…BSR…OPTION„GET�THE�NEXT�OPTION�IN�THE�COMMAND�LINE.&‹BTST„#6,D0…EXIT�IF�THERE�ARE�NO�MORE. ‹BNE…CKFOR9„* 0‹TEST_FOR‚A,15„IF�'A',�SET�AFLAG�&�BIT�15�OF�D7.0‹TEST_FOR‚Y,14„IF�'Y',�SET�YFLAG�&�BIT�14�OF�D7.‹TEST_FOR‚N,13„ETC.‹TEST_FOR‚S,12‹TEST_FOR‚R,11‹TEST_FOR‚P,108‹TEST_FOR‚H,8…***�071184�***‚BIT�NUMBER�DOESN'T�MATTER�-*œAS�IT�WON'T�BE�CHECKED ‹TEST_FOR‚U,7 ‹TEST_FOR‚B,6 ‹TEST_FOR‚C,5 ‹TEST_FOR‚V,4 ‹TEST_FOR‚T,3*********-‹BRA‡EROPTINVŠIF�YOU�GOT�TO�HERE,�IT�WASN'T�A******** VALID�OPTION.**BCKFOR9…MOVE.W‚D7,SAVEPATT-PBA(A4)�SAVE�THE�PATTERN.‚IF�ANY�U-GROUP2‹AND.Wƒ#$8FF,D7ŒOPTIONS�OR�R�WERE�SET,�SET�OPTNOA.‹SNE…OPTNOA-PBA(A4)†* ‹ENDI ‰RTS‰PAGEE**********************************************************************6*ˆROUTINE�TO�CHECK�FOR�INVALID�OPTION�COMBINATIONS�AND+*ˆCALL�FOR�'OPTION�CONFLICT'�ERROR�MESSAGE.*E*********************************************************************** CKOPTCON:1*’SAVEPATT�HOLDS�THE�PATTERN�OF�OPTIONS�SELECTED.2*’COMPARE�TO�THE�TABLE�TO�SEE�IF�IT�IS�A�VALID�SET *’OF�OPTIONS.*‰LEA‡OPTTBL(PC),A0‰LEA‡OPTTBLE(PC),A1‰MOVE.W„SAVEPATT-PBA(A4),D7***œIF�AFLAG�IS�SET,�BE�SURE�IT�IS�MARKED�IN+*œTHE�PATTERN�(AFLAG�CAN�BE�SET�LATE�BY�THE"*œINPUT�AND�OUTPUT�INIT�ROUTINES).‰IF_SET�AFLAG-PBA(A4)‹OR.W„#1<<15,D7‹ENDI*8‰MOVE.W„D7,D6…IF�NO�OTHER�OPTION�IS�SET�(BESIDES�C),�SET‰AND.W…#$FFDF,D6„DEFAULT�TO�U.‰IF‚‚THEN.S‹OR.W„#1<<7,D7‹MOVE.B‚#1,UFLAG-PBA(A4)‹ENDI*$B+Q4G<DD8L9T=\AdQlFtH|G„GŒE”;œ5¤=¬W´P¼CÄ=Ì:ÔCÜ>äMì=ôBüCO G@?‰MOVE.W„D7,SAVEPATT-PBA(A4)�RESAVE�IT�IN�CASE�WE�NEED�IT�LATER.**,‰REPEAT˜COMPARE�THE�PATTERN�TO�EACH�ENTRY�IN6‹CMP.W…(A0)+,D7ŠTHE�TABLE.‚BRANCH�IF�YOU�FIND�A�MATCH.‹BEQ.S…CKOPT2Œ*‰UNTIL.L‚A0��A1‹* 4‰BRA‡EROPTCON‡NO�MATCH�FOUND.‚OPTION�CONFLICT�ERROR! 4CKOPT2ƒTST.B�D7–IF�ANY�OF�THE�TRACK-BY-TRACK�OPTIONS3‰IF‚‚THEN.SŽ(UBCVT)�ARE�SET,�THERE�SHOULDN'T�BE;‹TST.B�USN_CAT-PBA(A4)‡ANY�USER�#�OR�CATALOG�SPECIFICATIONS+‹BNE�USNCATER�IN�THE�INPUT�&�OUTPUT�FIELDS.‰ENDIš* ‰RTS‰PAGE2***************************************************-*ˆROUTINE�TO�PERFORM�COPY�ALL�TRACKS�OPTION�U*2************************************************** COPYIT: 1‰LEA�USM(PC),A0”PRINT�MESSAGE�INDICATING�THAT�THE1‰LEA�USME(PC),A1“TRACK-BY-TRACK�BACKUP�PROCESS�IS‰BSR�SENDMSG“UNDERWAY. 6‰MOVE.L�#FOPPR+FOPEREW<<16,D1ŒSET�THE�INPUT�AND�OUTPUT‰BSR�ACCESSžACCESS�CODES. +‰BSR�IOSREAD‚GET�VID�AND�CONFIG�DATA˜103184:‰BSR�ENDDATA‚COMPUTE�LAST�MEANINGFUL�SECTOR�ON�DISK‰10* 3184 (‰BSR�IOSREAD…1ST�TIME�READ�TO�BEGIN�COPY #‰BSR�FIRSTIO…DO�1ST�TIME�PROCESSING "‰BSR�CHECKSUMˆNEW�CHECKSUM�FOR�VID (‰LEA�RDSKIOS(PC),A3‡IOS�INPUT�PARM�BLOCK%‰LEA�WDSKIOS(PC),A6‡OUTPUT�PARM�BLOCK >‰BSR�READSLT‚SAVE�SLT�OF�OUTPUT�DISK�IF�ALT�TRACKS�USED…ALTTRK 4‰BSR�READCONF�SAVE�CONFIG�DATA�OF�OUTPUT�DISK�ALTTRK #‰BRA.S�IOSWSETƒGO�TO�WRITE�1ST�TIME*7*********************************************************ˆDO�READ�OF�INPUT�FILE*+********************************************,COPYREAD MOVE.L IOSRRN(A3),A5 SAVE START PSN&‰CLR.B�CRDERR-PBA(A4)ƒCLEAR�ERROR�FLAG ‰BSR�IOSREAD )‰TST.B�ISEND-PBA(A4)�END�FOUND�?“<>*1IOSWSET‚TST.B�CRDERR-PBA(A4)�ERROR�WITH�C�OPT�SET‰BEQ.S�IOSWSET1†NO$‰MOVE.L�IOSRRN(A3),D6‚SAVE�ERROR�PSN‰SUB.L�A5,D6‰GET�#�OF�SECTORS‰BNE.S�IOSWSET0†SOME�WERE�READ$‰ADD.L�#1,IOSRRN(A3)�GET�NEXT�SECTOR+‰ADD.L�#1,IOSRRN(A6)�GET�NEXT�SECTOR™103184 ‰BRA�COPYREAD*.IOSWSET0�MULU�#SECLEN,D6ƒCONV�SECTORS�TO�BYTES$‰MOVE.L�D6,IOSLEN(A3)ƒESTAB�CORR�LEN‰BRA.S�IOSWSET2*$**************************************ˆSET�UP�TO�WRITE�FILE*$**************************************IOSWSET1�MOVE.L�IOSLEN(A3),D0‚INPUT�LENGTH‰CMP.L�IOSLEN(A6),D0…CK�LENGTHS‰BEQ.S�IWRITEJ‚SAME**,IOSWSET2�MOVE.L�IOSSAD(A3),D0‹START�BUF�ADDR‰ADD.L�IOSLEN(A3),D0‚ADD�LENGTH‰SUB.L�#1,D0ŠADJUST�END�ADDR%‰MOVE.L�D0,IOSEAD(A6)‹END�BUFFER�ADDR.************************************************ˆDO�WRITE�TO�OUTPUT�FILE*.***********************************************IWRITEJ‚BSR�IOSWRITEˆGOOD*+‰TST.B�CWRTERR-PBA(A4)„C�OPT�ERROR�ON�WRITE‰BEQ.S�IOSWGOˆNO‰CLR.B�CWRTERR-PBA(A4)3****************************************************ŒSET�UP�NEW�PSN�ON�BAD�WRITE3***************************************************&‰ADD.L�#1,IOSRRN(A6)ƒMOVE�PAST�BAD�PSN-‰MOVE.L�IOSRRN(A6),IOSRRN(A3)‚SET�UP�READ�PSN ‰BRA‚COPYREAD*&IOSWGOƒTST.B�CRDERR-PBA(A4)�READ�ERROR‰BEQ.S�IOSWGO1‡NO0*************************************************…SET�UP�NEW�PSN�ON�BAD�READ0************************************************‰ADD.L�#1,IOSRRN(A3)‰MOVE.L�IOSRRN(A3),IOSRRN(A6) ‰BRA�COPYREAD8********************************************************2*SET�UP�RANDOM�SECTOR�NUMBER�FOR�GOOD‚READ�&�WRITE8********************************************************EIOSWGO1‚TST.B…ISEND-PBA(A4)�EOV?�LAST�BYTES�WRITTEN�AT�IWRITEJ‚031384‰BNE.S…IOSWG02‚NO�<*ƒNOW�SKIP�THE�ALTERNATE�TRACKS�AND�RESTART�READING�AFTER�THEM8‰MOVE.L�ALTDIAG-PBA(A4),D0‚PREPARE�FOR�COPYING�DIAG�TRKS‰MOVE.L�D0,IOSRRN(A3)‰MOVE.L�D0,IOSRRN(A6),‰MOVE.B�#1,ISEND-PBA(A4)‚RESET�END�INDICATOR=‰BRA�COPYREAD‚NOW,�RESTART�READING�DIAGNOSTIC�TRACKS�ALTTRK>>*!IOSWG02‚MOVE.L�SECTNUM-PBA(A4),D0+‰ADD.L�D0,IOSRRN(A3)‚SET�READ�NEXT�SECTOR�##‰ADD.L�D0,IOSRRN(A6)‚WRITE�SECTOR�#‰BRA�COPYREADŠGET�NEXT�BLOCK*;IOSENDƒCLR.B�FLAG1-PBA(A4)‚TURN�ON�1ST�TIME�FLAG�FOR�VERIFY*‰RTS‰PAGEA**********************************************************‹103184*Ä1031842*ˆROUTINE�TO�COMPUTE�THE�LAST�SECTOR�ON�THE“1031845*ˆDISK�THAT�CONTAINS�DATA.‚THE* �SAT�IS�ACCESSED�1031843*ˆFROM�THE�LAST�SECTOR�TO�THE�FIRST,�LOOKING’1031842*ˆFOR�THE�FIRST�BIT�THAT�IS�SET,�WHICH�WILL“103184.*ˆINDICATE�THAT�A�SECTOR�IS�BEING�USED.—1031840*‹ENTER�A0�=�ADDRESS�READ�PARAMETER�BLOCK’103184 *–USED�TO�GET�FIRST�TRACK—103184*Ä103184A**********************************************************‹103184 ENDDATA: 0‰MOVEM.L�D0-D7/A0-A7,-(A7)‚SAVE�REGISTERS“103184*Ä1031846*ƒGET�TOTAL�VERSADOS�SECTORS�FOR�USE�BY�LASTSAT”103184*Ä103184+‰TST.B�INFORN-PBA(A4)‚FOREIGN�DISK�?˜103184.‰BNE.S�ENDDATAX‚YES,�SKIP--MAYBE�NO�SAT•103184>‰MOVE.L�IOSSAD(A0),A1‚GET�ADD�OF�BUFFER�(POINTS�TO�VID)…103184A‰MOVE.L�IOSRSZ+SECLEN(A1),D6‚TOTAL�SECTORS�FROM�CONFIG�SEC‚103184*Ä103184.*ƒPREPARE�TO�READ�IN�LAST�SECTOR�OF�SATœ103184*Ä103184‰MOVE.L�VIDSAT(A1),D0¨103184‰CLR.L�D1´103184‰MOVE.W�VIDSAL(A1),D1¨103184'‰MOVE.L�D1,D2‚SAVE�LENGTH�OF�SATœ103184‰ADD.L�D0,D1±103184‰SUB.L�#1,D1±103184‰MOVE.L�D1,IOSRRN(A0)¨103184)‰MOVE.L�BUF1SAD-PBA(A4),IOSEAD(A0)›103184<‰ADD.L�#SECLEN-1,IOSEAD(A0)‚SET�UP�TO�READ�ONE�SECTOR‡103184‰IOSCALL�RDSKIOS(PC)©103184‰BNE�FATALERR‚ERROR©103184 0‰BSR.S�LASTSAT‚PROCESS�LAST�SECTOR�OF�SAT“103184*Ä103184A*ƒSINCE�LAST�SECTOR�DOES�NOT�NECESSARILY�REPRESENT�A�WHOLE‰103184>*ƒSECTOR,�WE�MUST�ADD�BACK�THOSE�SECTORS�REPRESENTED�BYŒ1031842*ƒTHE�BITS�SET�FOR�NON-EXISTENT�DISK�SPACE.˜103184*Ä103184‰ADD.L�D1,D6±103184 ‰MOVE.L�IOSSAD(A0),A2¨103184‰MOVE.L�IOSEAD(A0),A3¨103184DENDDATAA�BSR�FINDBIT‚CHECK�IF�ANY�BITS�SET�IN�THIS�SAT�RECORD‡103184<‰BNE.S�ENDDATAB�BIT�FOUND�SET�IN�LAST�SAT�SECTOR�READˆ103184*Ä103184>*ƒNO�BITS�SET�IN�LAST�SECTOR�READ,�ADJUST�TOTAL�BY�2048Œ103184*Ä103184‰SUB.L�#2048,D6®103184'‰SUB.W�#1,D2‚ALL�DONE�WITH�SAT�?œ1031849‰BEQ.S�ENDDATAC�YES�(PROBABLY�NEVER�USE�THIS�EXIT)‹103184:‰SUB.L�#1,IOSRRN(A0)�ADJUST�RRN�FOR�PREVIOUS�SECTORŠ1031847‰IOSCALL�RDSKIOS(PC)‚READ�NEXT�(PREVIOUS�SECTOR)Œ103184‰BNE�FATALERR‚ERROR©103184$‰BRA�ENDDATAA‚PROCESS�THE�SATŸ103184*Ä1031849*ƒSAT�BIT�SET,�DO�LAST�ADJUSTMENT�OF�TOTAL�SECTORS‘103184*Ä103184ENDDATAB�SUB.L�D1,D6±103184-‰MOVE.L�D6,LASTDATA-PBA(A4)‚SAVE�TOTAL–103184?ENDDATAC�MOVE.L�#0,IOSRRN(A0)‚RESTORE�SECTOR�NUMBER�TO�0Œ103184@‰MOVE.L�BUF1EAD-PBA(A4),IOSEAD(A0)‚RESTORE�ORIG�BUFF�SIZEƒ103184ENDDATAX�EQU�*·1031843‰MOVEM.L�(A7)+,D0-D7/A0-A7‚RESTORE�REGISTERS�103184‰RTS‚RETURN±103184‰PAGEB***********************************************************Š103184*Ä1031841*ˆROUTINE�TO�ZERO�OUT�THE�PART�OF�THE�LAST”103184.*ˆSAT�SECTOR�THAT�CONTAINS�BITS�SET�FOR—103184!*ˆNON-EXISTENT�DISK�SPACE.¤103184*ŠENTER:´103184.*‘A0�=�ADDRESS�FOR�READ�PARAMETER�BLOCKŽ103184**–THAT�WAS�USED�TO�READ�IN�LAST�SAT�103184*–SECTOR¨103184#*‘D6�=�TOTAL�SECTORS�ON�DISK™103184*‹EXIT:´1031841*‘D1�=�NUMBER�OF�SECTORS�FOUND�REPRESENTED‹103184'*–BY�BITS�SET�IN�LAST�SAT�SECTOR�103184*Ä103184C************************************************************‰103184 LASTSAT: 0‰MOVEM.L�D4-D7/A1-A3,-(A7)‚SAVE�REGISTERS“103184‰CLR.L�D1´103184+‰DIVU�#2048,D6ƒ#�POF�BITS�PER�SECTOR—103184 ‰CLR.W�D6‚DELETE�QUOTIENT£103184‰SWAP�D6ƒGET�REMAINDER¥103184)‰BEQ.S�LASTSATX‚NONE,�EVEN�SECTORSš103184*Ä103184*„PROCESS�REMAINDER¯103184*Ä103184‰CLR.L�D5´103184‰CLR.L�D7´103184"‰DIVU�#8,D6‚GET�TOTAL�BYTES¡103184.‰MOVE.W�D6,D7‚BYTE�TO�START�ZEROING�OUT•103184 0‰MOVE.L�IOSSAD(A0),A3‚BEGINNING�OF�SECTOR“103184‰ADD.L�D7,A3…ADD�OFF�SET¡103184‰SWAP�D6‰GET�REMAINDERŸ103184=‰MOVE.W�D6,D5„NUMBER�OF�BITS�OF�FIRST�BYTE�TO�NOT�ZERO„103184"‰LEA�BIT2(PC),A1…INIT�TABLE¢103184‰MOVE.B�0(A1,D5),D4ª1031844‰AND.B�D4,(A3)‡CLEAR�BITS�NOT�CONTAINING�DATAŠ1031849*ƒNOW�CLEAR�SECTOR�FROM�BUFFER+D7�TO�END�OF�SECTOR‘103184%‰MOVE.L�IOSEAD(A0),A2‡INIT�END™103184‰ADD.L�#1,A3‚INIT�START¥103184BYTECLR‚CLR.B�(A3)+±103184‰CMP.L�A2,A3‚AT�END�?§103184‰BLE�BYTECLR‚NO­103184*Ä103184D*ƒCOMPUTE�NUMBER�OF�SECTORS�REPRESENTED�BY�BITS�SET�IN�SECTOR†103184*ƒFOR�NON-EXISTENT�DISK¬103184*Ä103184‰MOVE.L�#255,D1®103184‰SUB.L�D7,D1±103184*‰MULU�#8,D1‚AL+ L�BYTES�CONTAINING�FF™103184‰ADD.L�#8,D1±103184‰SUB.L�D5,D1‚FIRST�BYTE¥103184LASTSATX�EQU�*·1031843‰MOVEM.L�(A7)+,D4-D7/A1-A3‚RESTORE�REGISTERS�103184‰RTS‚RETURN±103184‰PAGEE**************************************************************‡103184*Ä103184;*ˆROUTINE�TO�SEARCH�A�BUFFER�LOOKING�FOR�ANY�BIT�SETŠ1031840*ˆIT�SEARCHES�FROM�THE�BOTTOM�TO�THE�TOP.•103184*ŠENTER:´103184!*‘A2�=�BEGINNING�OF�BUFFER›103184*‘A3�=�END�OF�BUFFER¡103184*‹EXIT:´1031840*‘ZERO�FLAG�SET�=�ALL�BITS�IN�SECTOR�ZEROŒ1031840*‘ZERO�FLAG�NOT�SET�=�D1�HAS�SECTORS�THATŒ103184*¥WERE�ZERO–103184*Ä103184E**************************************************************‡103184 FINDBIT: -‰MOVEM.L�D0/A2-A3,-(A7)‚SAVE�REGISTERS–103184+‰ADD.L�#1,A3‚ADJUST�FOR�PREDECREMENT˜103184‰CLR.L�D1´103184/FINDBITA�CMP.L�#0,-(A3)‚LONG�WORD�ZERO�?œ103184/‰BNE.S�FINDBITB‚NO,�CHECK�WORD�AND�BYTES”103184+‰ADD.L�#32,D1‚INCREMENT�SECTOR�COUNT˜103184*‰CMP.L�A3,A2‚FINISHED�WITH�BUFFER�?™103184‰BLT�FINDBITA�NO­103184&‰CLR.B�D0‚SET�FLAG�ALL�BITS�OFF�103184FINDBITX�EQU�*·1031840‰MOVEM.L�(A7)+,D0/A2-A3‚RESTORE�REGISTERS“103184‰RTS‚RETURN±103184*FINDBITB�CMP.W�#0,2(A3)‚WORD�ZERO�?¡103184*‰BNE.S�FINDBITD‚NO,�CHECK�LAST�BYTE™103184+‰ADD.L�#16,D1‚INCREMENT�SECTOR�COUNT˜103184&‰CMP.B�#0,1(A3)�2ND�BYTE�ZERO�?ž103184‰BNE�FINDBITX‚NO,�DONE¦1031842FINDBITC�ADD.L�#8,D1‚INCREMENT�SECTOR�COUNT™103184‰BRA�FINDBITX‚NOW�DONE¦103184.FINDBITD�CMP.B�#0,3(A3)�4TH�BYTE�ZERO�?ž103184‰BNE�FINDBITX‚NO,�DONE¦103184+‰BRA�FINDBITC‚INCREMENT�SECTOR�COUNT˜103184‰PAGEB*********************************************************‚<>‰PAGE 9***********************************************************ˆWRITE�DISK�ROUTINE*9********************************************************* IOSWRITE: ‰IOSCALL�WDSKIOS(PC)‰BEQ.S�IOSWEX„GOOD�WRITE? ,‰CMP.B�#+ ISTAEOV,D0‚NO--END�OF�VOLUME?—031384‰BEQ.S�IOSWEX†YES§031384/‰CMP.B�#ISTARR,D0‚END�OF�VOL�FOR�DEVICE?”031384‰BEQ.S�IOSWEX†YES§031384&‰CMP.B�#ISTAEOF,D0„END�OF�FILE?›031384‰BEQ.S�IOSWEX‹YES¢031384 &‰BSRƒC_EM_PGM†NO--FIRST�LOG�THE�ERROR.%‰TST.B�CFLAG-PBA(A4)�IS�C�OPTION�SET?+‰BEQƒERREXIT‡NO--TERMINATE�W/�ERROR�STATUS.$‰BSR.S�DSKCK‰IS�THIS�AN�ERROR�WE�CAN‰TST.B�D0ŽCONTINUE�OVER?+‰BNEƒERREXIT‡NO--TERMINATE�W/�ERROR�STATUS. 6*�***�IT'S�AN�ERROR�APPROPRIATE�FOR�C,�SO�CONTINUE�***<‰MOVE.B�#1,CWRTERR-PBA(A4)�FLAG�THE�WRITE�ERROR�W/�C�OPTION. IOSWEXƒRTS‰PAGE1***************************************************’READ�DISK�ROUTINE*1************************************************* IOSREAD: ‰IOSCALL�RDSKIOS(PC)‰BEQ.S�IOSREXˆGOOD�READ %‰CMP.B�#ISTAEOV,D0‚NO--END�OF�VOLUME?‰BEQ.S�IOSSET†YES(‰CMP.B�#ISTARR,D0‚END�OF�VOL�FOR�DEVICE?‰BEQ.S�IOSSET†YES‰CMP.B�#ISTAEOF,D0„END�OF�FILE?‰BEQ.S�IOSSET‹YES "‰BSRƒC_EM_PGM†FIRST�LOG�THE�ERROR."‰TST.B�CFLAG-PBA(A4)�IS�C�OPT�SET?+‰BEQƒERREXIT‡NO--TERMINATE�W/�ERROR�STATUS.$‰BSR.S�DSKCK‰IS�THIS�AN�ERROR�WE�CAN‰TST.B�D0ŽCONTINUE�OVER?+‰BNEƒERREXIT‡NO--TERMINATE�W/�ERROR�STATUS. 6*’***�IT'S�AN�ERROR�APPROPRIATE�FOR�C,�SO�CONTINUE�***7‰MOVE.B�#1,CRDERR-PBA(A4)�FLAG�THE�READ�ERR�W/�OPTION�C ‰BRA.S�IOSREX 5IOSSETƒCLR.B�ISEND-PBA(A4)‚SET�AT�END�FLAG�(SET�TO�0) IOSREXƒRTS‰PAGE5*******************************************************ˆCHECK�TO�SEE�IF�THE�ERROR�CAN�BE�RELATED)*ˆTO�A�PARTICULAR�SECTOR�#�(AND�THEREFORE"*ˆSOMETHING�WE�CAN�CONTINUE�OVER).5***************************************************** DSKCK: 7‰CMP.B�#ISTACMP,D0�IF�THE�ERROR�(RETURNED�IN�THE�STATUS3‰BEQ.S�DSKCK1’BYTE�AND�D0)�INDICATES�A�PROBLEM�WITH8‰CMP.B�#ISTASPE,D0�A�PARTICULAR�SECTOR,�WE�CAN�GO�AROUND‰BEQ.S�DSKCK1’IT.‰CMP.B�#ISTACRC,D0�*‰BEQ.S�DSKCK1’*‰CMP.B�#ISTADDM,D0�*‰BEQ.S�DSKCK1’*‰CMP.B�#ISTADME,D0�*‰BEQ.S�DSKCK1’*‰CMP.B�#ISTAMRK,D0�*‰BEQ.S�DSKCK1’*‰CMP.B�#ISTABDS,D0�*‰BNE.S�DSKCKEX‘* (*’***�IT'S�AN�ERROR�WE�CAN�GO�AROUND�***4DSKCK1ƒMOVE.B�D0,D1’SAVE�ERROR�CODE�IN�D1,�AND�CLEAR-‰CLR.L�D0–D0�(TO�FLAG�ERROR�AS�CONTINUEABLE). DSKCKEX‚RTS‰PAGE%**************************************;*ˆROUTINE�TO�DIRECT�OUTPUT�TO�SOMETHING�OTHER�THAN�TERMINAL*&************************************** NEWOUT: 4‰LEA�LU3FHS(PC),A6‘LOAD�DEFAULTS�INTO�FILENAME�FIELDD‰MOVE.L�VOLNAM-PBA(A4),FHSVOL(A6)�OF�PARAMETER�BLOCK�FOR�LU�3.‚LEAVED‰MOVE.W�USERNUM-PBA(A4),FHSUSN(A6)�READ�&�WRITE�PROTECT�CODES�ZEROES4‰MOVE.L�CATNAM-PBA(A4),FHSCLG(A6)†FOR�NO�PROTECTION.'‰MOVE.L�CATNAM+4-PBA(A4),FHSCLG+4(A6)‚*‰MOVE.W�#'LS',FHSEXT(A6)‡* =‰MOVE.L�SAVLST-PBA(A4),A0ŠLOAD�SAVED�ADDRESS�OF�LISTING�FIELD ‰BSR�EDITFILE’AND�CALL�EDITFILE.‰BMI�ERINVAL“* ‰BTST�#1,D0ŠIF�IT'S�A�DEVICE,‰IF‚‚THEN.S >‰MOVE.W�#FHASGN,FHSCMD(A6)‚SET�ASSIGN�COMMAND;�EXCLUSIVE�WRITE!‰MOVE.W�#FOPEW,FHSOPT(A6)ƒOPTION. ‰FHSCALL�(A6)�DO�THE�ASSIGNMENT.‰BNE‡FATALERR‰* ‰ELSE.SŽ(IF�IT'S�NOT�A�DEVICE), .‰TST.B�D0ŒIF�THERE�WAS�A�FAMILY�INDICATOR�(*),‰BNE�ERINVAL‰THAT'S�AN�ERROR. >‰MOVE.W�#FHALLO+FHASGN,FHSCMD(A6)‚SET�ALLOCATE�&�ASSIGN�CODES;IƒMOVE.W�#FOPEW+FOPEND+FOPSEQ,FHSOPT(A6)�EXCL�WRITE,�OVERWRITE,�&�VARIABLE7‰CLR.W�FHSLRL(A6)„LENGTH�RECORD�OPTIONS;�LOGICAL�RECORD(‰CLR.L�FHSSIZ(A6)„LENGTH�0;�SIZE�CODE�0. ?NOTDEV1‚FHSCALL�(A6)ˆDO�THE�ASSIGNMENT�(AND�POSSIBLY�ALLOCATE).‰BEQ.S�NEWOUTE‡* 1‰CMP.B�#5,D0‰IF�THE�ERROR�WAS�'DUPLICATE�FILE'�WE2‰BNE�FATALERRˆCAN�JUST�GO�AHEAD�AND�ASSIGN�THE�OLD<‰MOVE.W�#FHASGN,(A6)�FILE.‚ANY�OTHER�ERROR�IS�A�FATAL�ERROR.‰BRA�NOTDEV1‰* ‰ENDI NEWOUTE‚RTS‰PAGE;*************************************************************)*ˆROUTINE�TO�HANDLE�FIRST�TIME�PROCESSING*<************************************************************ FIRSTIO: /‰MOVE.B�#1,FLAG1-PBA(A4)�TURN�OFF�1ST�TIME�FLAG -‰TST.B�INFORN-PBA(A4)�IS�THIS�A�FOREIGN�DISK?‰BNE�FIRSEXITˆYES--JUST�EXIT. 5FIRNAMƒLEA�V, OLMSG(PC),A0‡PROMPT�USER�FOR�VOLUME�NAME.‰LEA�VOLMSGE(PC),A1†*‰BSR�SENDMSGIˆ* )‰IOSCALL�INP1IOS(PC)…RECEIVE�VOLUME�NAME.‰BNE†FATALERRƒ* ‰BSR†SBARG†*‰BNE†FATALERRƒ* 3*‹***�VALIDATE�VOLUME�NAME�&�EXTEND�WITH�SPACES�***‰LEA�VOLR(PC),A1‰LEA�VOLRE(PC),A2 5‰CMP.B�#CR,(A1)‚IS�FIRST�CHARACTER�A�CARRIAGE�RETURN?$‰BNE.S�FIRGOT„NO--PROCESS�THE�INPUT. *’***�NULL�INPUT�(JUST�A�CR)�***=‰TST.B�VIDREQ-PBA(A4)�IF�HE'S�REQUIRED�TO�ENTER�SOMETHING,�GO7‰BNE�FIRNAM‹ASK�AGAIN.‚OTHERWISE,�GO�TEST�FOR�OPTION�R.‰MOVE.L�VOLR-PBA(A4),D0†*‰BRA.S�FIRTSTˆ* *’***�HE�ENTERED�SOMETHING�***AFIRGOTƒCMP.B�#'A',(A1)‚IF�THE�FIRST�CHARACTER�IS�NOT�IN�THE�RANGE‰BCS�FIRNAM‡A-Z,�GO�ASK�AGAIN.‰CMP.B�#'Z',(A1)+�* ‰BHI�FIRNAM‡* 0FIR1…CMP.B�#CR,(A1)�IF�IT'S�A�CARRIAGE�RETURN,�A-‰BEQ.S�FIRBLK’COLON,�OR�A�SPACE,�THAT'S�ALL--/‰CMP.B�#$3A,(A1)�JUST�BLANK�OUT�THE�REST�OF�THE‰BEQ.S�FIRBLK’FIELD.‰CMP.B�#'�',(A1)�*‰BEQ.S�FIRBLK’* .‰CMP.B�#'Z',(A1)�IF�IT'S�HIGHER�THAN�A�'Z',�GO‰BHI�FIRNAM”UP�AND�ASK�AGAIN. 0‰CMP.B�#'A',(A1)�IF�IT'S�IN�THE�RANGE�A-Z�OR�ONE0‰BCC.S�FIRADD’OF�THE�CHARACTERS�&@*,�IT'S�OK,�SO-‰CMP.B�#'&',(A1)�GO�ON�TO�THE�NEXT�CHARACTER.‰BEQ.S�FIRADD’*‰CMP.B�#'@',(A1)�*‰BEQ.S�FIRADD’*‰CMP.B�#'*',(A1)�*‰BEQ.S�FIRADD’* 0‰CMP.B�#'0',(A1)�AT�THIS�POINT�IF�IT'S�A�DECIMAL+‰BCS�FIRNAM”DIGIT�IT'S�OK;�OTHERWISE,�GO�UP‰CMP.B�#'9',(A1)�AND�ASK�AGAIN. ‰BHI�FIRNAM”* 1FIRADDƒADD.L�#1,A1“MOVE�TO�THE�NEXT�CHARACTER.‚IF2‰CMP.L�A2,A1“THERE�ARE�MORE,�PROCESS�THE�NEXT�ONE. ‰BCS�FIR1–* ‰BRA.S�FIRA*7FIRBLKƒMOVE.B�#'�',(A1)+�PUT�SPACES�IN�THE�REMAINDER�OF‰CMP.L�A2,A1“THE�BUFFER. ‰BCS�FIRBLK”* 9FIRA…MOVE.L�VOLR-PBA(A4),D0�IF�THE�VOLUME�NAME�ENTERED�IS8‰MOVE.L�BUF1SAD-PBA(A4),A5�THE�SAME�AS�THAT�OF�THE�INPUT1‰CMP.L�VIDVOL(A5),D0‹DISK�AND�THIS�IS�AN�OPTION�R$‰BNE.S�FIR2”BACKUP,�THAT'S�AN�ERROR!FIRTSTƒTST.B�RFLAG-PBA(A4)‹* ‰BNE�FIRNAM”* 9FIR2…MOVE.L�D0,VIDVOL(A5)ŠMOVE�THE�VOLUME�NAME�TO�THE�VID1‰LEA�OUTFHS(PC),A1‘IMAGE�AND�THE�PARAMETER�BLOCK.‰MOVE.L�D0,FHSVOL(A1)Š* #*’***�GET�USER#�AND�DESCRIPTION�***1FIRSTIO1�BSR.S�GETUSNUM�GET�THE�USER�#�AND�VOLUME*‰BSR�GETDESC“DESCRIPTION�FOR�THE�NEW�DISK. @‰IF_NOT_SET�RFLAG-PBA(A4)†IF�TRACK-TO-TRACK�BACKUP�AND�THE�INPUT>‹IF_NOT_SET�AFLAG-PBA(A4)„DISK�IS�LARGER�THAN�THE�OUTPUT�DISK,8�IF_SET�SIZFLAG-PBA(A4)„MARK�THE�EXTRA�SAT�AS�AVAILABLE. �BSR�DSKGR�*�ENDI”*�ENDI–*‹ENDI˜* )‰MOVE.L�BUF1SAD-PBA(A4),A5�PRINT�THE�LINE9‰MOVE.L�VIDVOL(A5),DESCV-PBA(A4)�'THE�OUTPUT�IS�VOL�=�XXX#‰CLR.L�D0–USER�#�=�XXXƒDESC�=�XXX'.‰MOVE.W�VIDUSN(A5),D0Š*‰LEA�DESCUSN(PC),A0�* ‰BSR�BINDEC”*‰LEA�DESCMSG(PC),A0�*‰LEA�DESCMSGE(PC),A1�*‰BSR�SENDMSG“* FIRSEXIT RTS‰PAGE0*************************************************#*ˆROUTINE�TO�GET�THE�USER�#�FOR�THE*ˆVID�OF�THE�OUTPUT�DISK*1************************************************* GETUSNUM: .*�IF�THIS�IS�A�TRACK-BY-TRACK�BACKUP,�WE�CAN'T'*�ALLOW�HIM�TO�CHANGE�THE�USER#.�(IF�WE+*�ALLOWED�IT,�WE�MIGHT�PUT�USER�17�FILES�ON+‰IF_SET�RFLAG-PBA(A4)�A�USER�20�DISK,�ETC.) E‰MOVE.L�BUF1SAD-PBA(A4),A3�SET�UP�VID�WITH�THE�USER'S�DEFAULT�USER�#.$‰MOVE.W�USERNUM-PBA(A4),VIDUSN(A3)�* C‰TST.W�ADDREG2-PBA(A4)‚IF�HE�LOGGED�ON�AS�USER�0,�WE�WILL�ALLOW�HIM%‰IF‚‚THEN.S„TO�CHANGE�THE�USER�#. 9GETUSNƒLEA�USNM(PC),A0‰PROMPT�THE�USER�TO�ENTER�A�USER�#.‰LEA�USNME(PC),A1ˆ*‰BSR�SENDMSGIˆ* (‰IOSCALL�INP6IOS(PC)…RECEIVE�HIS�ANSWER.‰BNE…FATALERR„* ‰BSR…SBARG‡*‰BNE…FATALERR„* %‰IF.B‚WORKUSN-PBA(A4)��#CR‚THEN.S *’***�NULL�INPUT�(JUST�A�CR)�***?‰IF_SET�VIDREQ-PBA(A4)�IF�HE�IS�REQUIRED�TO�ENTER�SOMETHING,�GO‹BRA�GETUSNˆASK�HIM�AGAIN.‰ENDI�* ‰ELSE.S *’***�HE�ENTERED�SOMETHING�***<‰LEA�WORKUSN(PC),A0†USE�EDITFILE�ON�THE�INPUT�LINE,�ALLOWING=‰LEA�DUMMYFHS(PC),A6…RESULT�TO�BE�STORED�IN�A�DUMMY�PARAMETER‰BSR�EDITFILEˆBLOCK. ‰BMI�GETUSNŠ* >‰AND.L�#$7F0000,D0ƒWE�ARE�LOOKING�FOR�A�USER�#�WITHOUT�VOLUME,;‰EOR.L�#$200000,D0ƒCATALOG,�FILENA, ME,�EXTENSION,�OR�PROTECT‰BNE�GETUSNŠCODE�FIELDS. A‰MOVE.W�FHSUSN(A6),VIDUSN(A3)‚RESULT�IS�OK,�SO�MOVE�TO�THE�BUFFER*§CONTAINING�THE�VID. ‰ENDI ‰ENDI ‰ENDI ‰RTS‰PAGEE**********************************************************************8*ˆROUTINE�TO�CREATE�SAT�FOR�A�DOUBLE-SIDED�OUTPUT�FLOPPY:*ˆFROM�THE�SAT�OF�A�SINGLE-SIDED�INPUT�FLOPPY.�ESSENTIALLY0*ˆWE�ARE�JUST�MARKING�THE�EXTRA�SECTORS�AS�FREE.*E**********************************************************************6*ˆBYTES�IN�SATˆARE�SET�AS�FOLLOWS�(0=FREE,1=ALLOCATED)*)*Š0�-�124‹LEFT�AS�IS�(SAME�AS�INPUT�DISK).*‹125ŽHIGH�BIT�LEFT�AS�IS,�LOW�7�BITS�SET�TO�0*ˆ126�-�249‹ALL�SET�TO�0/*‹250ŽHIGH�2�BITS�SET�TO�0,�LOW�6�BITS�SET�TO�1*ˆ251�-�255‹ALL�SET�TO�1* DSKGR: 6‰MOVE.L�BUF1SAD-PBA(A4),A3…LOAD�A3�WITH�THE�ADDRESS�IN6‰MOVE.L�VIDSAT(A3),D3ŠMEMORY�OF�BYTE�#�125�OF�THE�SAT.+‰MULS�#SECLEN,D3�(A3�=�BUFFER�START�ADDRESS.‰ADD.L�D3,A3—+�SAT�START�SECTOR�*�BYTES/SECTOR‰ADD.L�#125,A3•+�125) 2‰AND.B�#$80,(A3)+ŽZERO�THE�LOW�7�BITS�OF�BYTE�125. 6‰MOVE.W�#31,D1‘ZERO�ALL�BITS�OF�BYTES�126-249,�32�BITS LOPGR„MOVE.L�#0,(A3)+�AT�A�TIME.‰SUB.W�#1,D1“* ‰BNE�LOPGR•* :‰MOVE.W�#$3FFF,(A3)+‹ZERO�THE�HIGH�2�BITS�OF�BYTE�250,�AND@‰MOVE.L�#$FFFFFFFF,(A3)ˆSET�THE�BITS�FOR�THE�REST�OF�THE�SECTOR. ‰RTS‰PAGE;************************************************************3*†ROUTINE�TO�REQUEST�DESCRIPTION�AND�MOVE�TO�BUFFER*;*********************************************************** GETDESC: =‰LEA�DESCM(PC),A0ˆPROMPT�THE�USER�TO�ENTER�A�DESCRIPTION.�USE‰LEA�DESCME(PC),A1‡IMAGE�MODE.‰BSR�SENDMSGIˆ* &‰IOSCALL�INP5IOS(PC)…GET�HIS�RESPONSE.‰BNE†FATALERRƒ* ‰BSR†SBARG†*‰BNE†FATALERRƒ* A‰LEA�DESCANS(PC),A2…A2‚<--‚START�ADDR�OF�INPUT�BUFFER�(HIS�RESPON‰MOVE.L�BUF1SAD-PBA(A4),A5@‰LEA�VIDVD(A5),A3„A3‚<--‚START�ADDR�OF�DESCRIPTION�IN�VID�IMAGE.;‰LEA�19(A3),A0‡A0‚<--‚ENDƒADDR�OF�DESCRIPTION�IN�VID�IMAGE.A‰LEA�DESCDESC(PC),A6…A6‚<--‚START�ADDR�OF�DESCRIPTION�IN�OUTPUT�L 7‰IF.B‚(A2)��#CR‚AND.B‚VIDREQ-PBA(A4)��#0‚THEN.S 2*’***�NULL�INPUT�(JUST�A�CR),�AND�DEFAULTS�ARE�***1*’***�ALLOWED.‚USE�DESCRIPTION�FROM�INPUT�VID.***6‰MOVE.L�(A3)+,(A6)+ŒJUST�LEAVE�THE�VID�AS�IS,�SINCE�IT7‰MOVE.L�(A3)+,(A6)+ŒWAS�TAKEN�FROM�THE�INPUT�DISK.‚MOVE7‰MOVE.L�(A3)+,(A6)+ŒTHE�DESCRIPTION�TO�THE�OUTPUT�LINE.‰MOVE.L�(A3)+,(A6)+Œ*‰MOVE.L�(A3),(A6)Ž* ‰ELSE.S *’***�SOMETHING�WAS�ENTERED,�*** *’***�OR�DEFAULT�NOT�ALLOWED�***A‹WHILE.B�(A2)��#CR�DO.S‚MOVE�CHARACTERS�FROM�THE�INPUT�BUFFER9�MOVE.B�(A2),(A6)+‰TO�THE�OUTPUT�LINE�AND�VID�DESCRIPTION,�MOVE.B�(A2)+,(A3)+ˆFIELD�UNTIL�WE�HIT�A�CR.‹ENDW˜* =‹WHILE.L‚A3��A0‚DO.SƒIF�THERE�IS�ANYTHING�LEFT�TO�THE�VID5�MOVE.B�#SPACE,(A3)+‡DESCRIPTION�FIELD,�BLANK�IT�OUT.‹ENDW˜* ‰ENDI ‰RTS‰PAGE2***************************************************)*ˆROUTINE�TO�VERIFY�DISK�1�AGAINST�DISK�2**ˆD4�=�SECTOR�NUMBER"*ˆD5�=�OFFSET�WITHIN�SECTOR�NUMBER *ˆD6�=�WORK�REG�WITHIN�LONG�WORDA*ˆD7�=�ADDRESS�OF�FIRST�BYTE�THAT�DIFFERS�FOR�SINGLE/DOUBLE-SIDED**ˆA2�=�ADDR�OF�CMP�DSK1*ˆA5�=�ADDR�OF�CMP�DSK2*ˆA6�=�END�OF�BUFFER�ADDR*3*************************************************** VEROPT: 8‰MOVE.L�#FOPPR+FOPPREW<<16,D1ŒSET�ACCESS�CODES�FOR�INPUT‰BSR�ACCESSžAND�OUTPUT�DISKS. 6‰TST.B�BFLAG-PBA(A4)‚DID�USER�DO�A�COPY�FIRST�?�1031845‰BNE.S�VEROPTA‚YES,�SKIP�INITIALIZING�LASTDATAŽ1031848‰BSR�IOSREAD‚READ�FIRST�SEVERAL�SECTORS�FROM�DISK‹103184:‰BSR�ENDDATA‚COMPUTE�LAST�MEANINGFUL�SECTOR�ON�DISK‰103184 3VEROPTA‚LEA�VSM(PC),A0ŠSEND�'START�VERIFY'�MESSAGE.‰LEA�VSME(PC),A1‰*‰BSR�SENDMSG‰* ?‰LEA�RDSKIOS(PC),A2†INITIALIZE�SECTOR�COUNTERS�IN�THE�IOS�PARAM ‰LEA�WDSKIOS(PC),A3†BLOCKS�TO�0.‰CLR.L�IOSRRN(A2)„*‰CLR.L�IOSRRN(A3)„* E‰MOVE.L�BUF1EAD-PBA(A4),IOSEAD(A2)�LOAD�PARAM�BLKS�FOR�INPUT�&�OUTPUTF‰MOVE.L�BUF2SAD-PBA(A4),IOSSAD(A3)�WITH�BUFF�EXTENTS�(IOSSAD�FOR�INPUTB‰MOVE.L�BUF2EAD-PBA(A4),IOSEAD(A3)�IS�ALREADY�- SET)�&�SET�UP�OUTPUT/‰MOVE.W�#IOREAD,IOSFCT(A3)�PARAM�BLOCK�TO�READ. C******ƒMOVE.L�BUF1EAD,A6ŠLOAD�THE�END�OF�INPUT�BUFFER�FOR�END�TEST.&*£****�071184�****�THIS�IS�NOW�DONE�AT)*£THE�BEGINNING�OF�EACH�READ.�THIS�CHANGE(*£WAS�MADE�AS�PART�OF�THE�CORRECTION�FOR *£SPR�711. ‰CLR.L�D4ˆINIT�SECTOR�#ŠCLR.L�D5‡INIT�OFFSET ,VREAD1ƒMOVE.L�BUF1SAD-PBA(A4),A2‚START�DSK�1&‰MOVE.L�BUF2SAD-PBA(A4),A5ƒSTART�DSK�2@*****************071184**************** ADDED TO CORRECT SPR 7119‰MOVE.L�BUF1EAD-PBA(A4),A6‚RESTORE�CORRECT�ENDING�ADDRESS‰CLR.B‚CRDERR-PBA(A4)(‰CLR.B‚CWRTERR-PBA(A4)ƒCLEAR�ERROR�FLAGS/‰MOVEA.L�IOSRRN+RDSKIOS-PBA(A4),A1�REMEMBER�RRN'*****************071184*****************'****************************************ˆREAD�DSK�1�INTO�FIRST�BUFFER'***************************************9‰BSR�IOSREAD…GO�DO�READ„ERROR�CHECKING�DONE�BY�IOSREAD�IS%*¦SUFFICIENT,�ERROR�FIXING�SHOULD�NOT!*¦BE�THE�RESPONSIBILITY�OF�VERIFY"********************************** *ˆREAD�DSK�2"***********************************‰TST.B�FLAG1-PBA(A4)‚FIRST�TIME‰BNE.S�VREAD2A…NO$‰BSR�VDSKGR†CK�FOR�DISK�GR�CONDITION VREAD2A‚EQU�*‰BSR�IOSWRITE„GO�READ�2ND�DISK*********************************************ˆVERIFY�DATA�IN�BUFFERS*********************************************B***************071184******************** ADDED TO CORRECT SPR 711*,*ŠTHIS�ROUTINE�CHECKS�FOR�ANY�IOS�ERRORS�AND6*ŠADJUSTS�THE�LENGTH�OF�THE�COMPARE�BUFFER�ACCORDINGLY*8‰TST.B�CRDERR-PBA(A4)�CHECK�FOR�READ�ERROR�WITH�C�OPTION/‰BNE.S�VCMP4�YES�-�GET�LAST�VALID�SECTOR�NUMBER7‰TST.B�CWRTERR-PBA(A4)�CHECK�FOR�READ�ERROR�ON�2ND�DISK%‰BEQ.S�VCMPŠNO�-�DO�COMPARE�AS�NORMALC‰BRA.S�VCMP2�SINCE�ONLY�ERROR�OCCURED�ON�2ND�DISK,�WDSKIOS�CONTAINS*šLAST�SECTOR�READJVCMP4„MOVE.L�RDSKIOS+IOSRRN-PBA(A4),D6�RRN�OF�LAST�SECTOR�READ�FROM�DISK�10‰TST.B�CWRTERR-PBA(A4)�CHECK�FOR�WRITE�ERROR�TOO2‰BEQ.S�VCMP5�NO,�RDSKIOS�CONTAINS�LAST�SECTOR�READ‰LEA�WDSKIOS(PC),A0C‰CMP.L�IOSRRN(A0),D6�COMPARE�AGAINST�LAST�SECTOR�READ�FROM�DISK�TWOG‰BLT.S�VCMP5�THE�READ�FROM�DISK�1�WAS�SHORTER�-�USE�THE�INFO�IN�IOSREAD;VCMP2„MOVE.L�WDSKIOS+IOSRRN-PBA(A4),D6�USE�INFO�IN�IOSWRITE6VCMP5„MOVE.L�D6,D0�USE�D0�TO�COMPUTE�NEW�SECTOR�NUMBER'‰SUB.L�SECTNUM-PBA(A4),D0�DECREMENT�RRN*‰ADDQ�#1,D0�SKIP�OVER�THE�ERRONEOUS�SECTOR(‰ADDQ�#1,D4�INCREMENT�THE�SECTOR�COUNTER6‰LEA�WDSKIOS(PC),A0�SO�IT�WILL�POINT�TO�CORRECT�SECTOR3‰MOVE.L�D0,IOSRRN(A0)�AFTER�INCREMENTING�BY�SECTNUM‰LEA�RDSKIOS(PC),A0‰MOVE.L�D0,IOSRRN(A0)!‰SUB.L�A1,D6�COMPUTE�SECTORS�READ3‰BEQ.S�VCMP6�NO�SECTORS�WERE�READ�-�READ�NEXT�TRACK,‰MULU�#SECLEN,D6�COMPUTE�VALID�BUFFER�LENGTH‰MOVE.L�A2,A6�BUFFER�START ‰ADDA.L�D6,A6�COMPUTE�BUFFER�END8*************************071184*************************#VCMP…CMPM.L�(A2)+,(A5)+‚CK�ONE�WORD‰BNE.S�VCMPSˆNOT�EQUAL‰ADD.W�#4,D5…ADD�OFFSET$VCMP1„CMP.W�#SECLEN,D5ƒEND�OF�SECTOR‰BLT�VCMPˆNO-GET�NEXT�BYTE*(*****************************************ˆAT�END�OF�SECTOR/BUFFER(*****************************************‰CLR.L�D5ˆCLEAR�OFFSET‰ADD.W�#1,D4…ADD�TO�SECTOR�#*‰CMP.L�A2,A6…END�OF�BUFFER ‰BHI�VCMPˆNO:VCMP6„MOVE.L�SECTNUM-PBA(A4),D0ˆ***�071184�***�LABEL�ADDED‰LEA�RDSKIOS(PC),A0(‰ADD.L�D0,IOSRRN(A0)†ADD�SECTOR�INCREASE‰MOVE.L�IOSRRN(A0),D1¨103184+‰TST.B�INFORN-PBA(A4)‚FOREIGN�DISK�?˜1031840‰BNE.S�VCMP7‚YES,�WAIT�TILL�END�OF�VOLUME“1031849‰TST.B�INALT-PBA(A4)�DOING�ALTERNATE�TRACK�DISK?ƒ<>,‰ADD.L�D0,IOSRRN(A0)†SECTOR�OFFSET�FOR�WRITE ‰TST.B…ISEND-PBA(A4)‚EOV?Ÿ031384#‰BEQ‡VSET‹STOP�VERIFY�IF�EOV‘031384 ‰BRA�VREAD1*/***********************************************+*ˆPROCESS�INDIVIDUAL�BYTES�WITHIN�LONG�WORD/************************************************VCMPS„MOVE.W�#4,D6„INIT‰SUB.L�#4,A2…RESET ‰SUB.L�#4,A5!VCMPS1ƒCMPM.B�(A2)+,(A5)+‚CK�BYTE‰BNE.S�VPRT†NOT�SAMEVCMPS2ƒADD.W�#1,D5…ADD�OFFSET‰SUB.B�#1,D6…REDUCE�COUNT‰BEQ�VCMP1‡DONE‰BRA�VCMPS1†CK�NEXT*)******************************************ˆPRINT�BYTE�THAT�IS�DIFFERENT)******************************************8VPRT…IF_SET�SIZFLAG-PBA(A4)ˆIF�OUTPUT�DISK�>�INPUT�DISK,=‹IF.L‚A2��D7‚THEN.S„IF�WE�HAVE�REACHED�THE�AREA�WHERE�THE=�CLR.B�SIZFLAG-PBA(A4)…SAT'S�DIFFER,�RESET�THE�OUTPUT�>�INPUT/�BRA�VNXTSECTŽFLAG�AND�SKIP�TO�THE�NEXT�SECTOR.‹ENDI˜*‰ENDIš* "***********************************ˆCONVERT�SECTOR�#�&�PRINT#*************************************/‰MOVE.L�D4,D0ŒCONVERT�THE�SECTOR�#�TO�HEX�ASCII‰MOVE.L�#4,D1Œ*‰LEA�VMS(PC),A0Š* ‰BSR�BINHEXŽ* ‰BSR�LEFTJ�LEFT�JUSTIFY„<<0111851‰LEA�VMD(PC),A0ŠCONVERT�THE�SECTOR�#�TO�DEC�ASCII ‰BSR�BINDECŽ*‰MOVE.L�#6,D1Œ* ‰BSR�LEFTJ�LEFT�JUSTIFY„011185>> '‰LEA�OUT3IOS(PC),A0†PRINT�THE�SECTOR�#.‰LEA�VM1(PC),A1Š*‰MOVE.L�A1,IOSSAD(A0)„*‰LEA�VM1E(PC),A1‰*‰MOVE.L�A1,IOSEAD(A0)„*‰IOSCALL�(A0)Œ**)******************************************ˆMOVE�OFFSET�TO�MSG(***************************************** ‰MOVE.L�D5,D0 ‰MOVE.L�#2,D1‰LEA�VM21(PC),A0‰BSR�BINHEX†GO�CONVERT*)***************************************** *ˆCONVERT�DSK0�BYTE�FOR�PRINTING)******************************************‰CLR.L�D0ˆINIT‰MOVE.B�-(A2),D0‚GET�DK0�BYTE‰MOVE.L�D0,D1„LOAD�REG%‰BSRƒASCCK‡CHECK�ASCII�PRINTING�RANGE/‰MOVE.B�D1,VMO11-PBA(A4)‚MOVE�ASCII�CHAR�TO�MSG‰ASR.B�#4,D0…TOP�4�BITS‰LEA�VMO1(PC),A0…REC�ADDR‰MOVE.L�#1,D1„SIZE‰BSR�BINHEX†GO�CONVERT*‰MOVE.B�(A2),D0‰AND.B�#$0F,D0„LOW�4�BITS‰LEA�VMO1+1(PC),A0ƒADDR�TO�REC‰MOVE.L�#1,D1„SAZE ‰BSR�BINHEX‰ADD.L�#1,A2…RESET�LOCATION*&***************************************ˆCONVERT�DSK1�FOR�PRINTING&****************************************‰MOVE.B�-(A5),D0‰MOVE.L�D0,D1„INIT ‰BSRƒASCCK/‰MOVE.B�D1,VMO21-PBA(A4)�MOVE�ASCII�CHAR�TO�MSG‰ASR.B�#4,D0…HI�4�BITS‰LEA�VMO2(PC),A0…ADDR‰MOVE.L�#1,D1„SIZE ‰BSR�BINHEX*‰MOVE.B�(A5),D0‰ADD.L�#1,A5…RESET�LOCATION‰AND.B�#$0F,D0„LOW�4�BITES‰LEA�VMO2+1(PC),A0 ‰MOVE.L�#1,D1 ‰BSR�BINHEX***************************** *ˆPRINT�LINE2****************************‰LEA�OUT3IOS(PC),A0‰LEA�VM2(PC),A1‰MOVE.L�A1,IOSSAD(A0)‰LEA�VM2E(PC),A1‰MOVE.L�A1,IOSEAD(A0)‰IOSCALL ‰BNE†FATALERR "‰IF_SET�TFLAG-PBA(A4)ŠIF�OPTION�T, :*”ONLY�ONE�MESSAGE�IS�WANTED�PER�SECTOR,�SO�FOOL�THE�LOOPS7*’TO�THINK�WE�JUST�FINISHED�THAT�SECTOR.‚FIRST,�THOUGH,.*’WE�MUST�ADJUST�THE�BUFFER�INDICES�A2�AND�A5.-*”THE�CURRENT�OFFSET�WITHIN�THE�SECTOR�IS�D5,3*’BUT�A2�HAS�BEEN�INCREMENTED�ONE�BYTE�BEYOND�THAT,1*’TO�D5+1.‚WE�WANT�TO�TAKE�THAT�ALL�THE�WAY�TO�AN1*’EQUIVALENT�OFFSET�OF�SECLEN,�WHICH�MEANS�ADDING0*’SECLEN-(D5+1),�OR�(SECLEN-1)-D5,�TO�A2�AND�A5. *’***�SKIP�TO�NEXT�SECTOR�***/VNXTSECTƒMOVE.L„#SECLEN-1,D6†D6�=�(SECLEN-1)-D5 ‹SUB‡D5,D6 ‹ADD.L…D6,A2 ‹ADD.L…D6,A5 7*’NOW�THAT�THAT'S�TAKEN�CARE�OF,�ALL�THAT�REMAINS�IS�TO1*’SET�THE�LOOP�INDICES�D5�AND�D6�SO�THE�LOOPS�ARE*’IMMEDIATELY�TERMINATED. ‹MOVE†#1,D6‹MOVE†#SECLEN-1,D5 ‹ENDI ‰BRA�VCMPS2‡CONTINUE**VSET…RTS‰PAGE<*************************************************************0*ˆROUTINE�TO�SET�D7�TO�THE�MEMORY�ADDRESS�OF�THE0*ˆFIRST�BYTE�OF�SAT�THAT�DIFFERS�BETWEEN�SINGLE-*ˆAND�DOUBLE-SIDED�DISKS.*<************************************************************ VDSKGR: 8‰MOVE.B�. #1,FLAG1-PBA(A4)‡TURN�OFF�THE�'FIRST�TIME'�FLAG. 4‰IF_SET�SIZFLAG-PBA(A4)ˆIF�OUTPUT�DISK�>�INPUT�DISK, 4‹MOVE.L�VIDSAT(A2),D7’D7�<--�STARTING�SECTOR�OF�SAT. "‹IF.L‚D7��SECTNUM-PBA(A4)‚OR.B;‘INFORN-PBA(A4)��#0‚THEN.S‚IF�SAT�IS�NOT�IN�THIS�BUFFER5�CLR.B�SIZFLAG-PBA(A4)�OR�INPUT�DISK�IS�FOREIGN,�JUST*±RESET�THE�OUT�>�IN�FLAG.-‹ELSE.S–OTHERWISE�(IF�WE�CAN�GET�TO�THE�SAT), 5�MULU�#SECLEN,D7‹D7�=�SAT�START�SECTOR�*�BYTES/SECTOR&�ADD.L�A2,D7’+�START�ADDRESS�OF�BUFFER-�ADD.L�#125,D7�+�OFFSET�TO�1002nd�BIT�IN�SAT.‹ENDI ‰ENDI ‰RTS****8*********************************************************5*‚ROUTINE�TO�BLANK�OUT�NON-PRINTABLE�ASCII�CHARACTERS*8******************************************************** ASCCK: ‰IF.B‚D1��#SPACE‚OR.B8�D1��#$7F‚THEN.S„IF�WHAT'S�IN�D1�IS�NOT�IN�THE�RANGE6‹MOVE.B�#SPACE,D1Œ$20�TO�$7F,�REPLACE�IT�WITH�A�SPACE.‹ENDI˜* ‰RTS‰PAGE8*********************************************************&*ˆOPTION�R�(REORGANIZE)�ROUTINE�DRIVER*8******************************************************** OPTIONR: 1‰LEA�ASM(PC),A0”PRINT�MESSAGE�INDICATING�THAT�THE/‰LEA�ASME(PC),A1“FILE-BY-FILE�BACKUP�PROCESS�IS‰BSR�SENDMSG“UNDERWAY. 3‰LEA�OUTFHS(PC),A0‘RESTORE�THE�OUTPUT�CATALOG�NAME.$‰MOVE.L�SOUTCAT-PBA(A4),FHSCLG(A0)…*(‰MOVE.L�SOUTCAT+4-PBA(A4),FHSCLG+4(A0)�* 6‰LEA�COPAM(PC),A0ˆASK�USER�WHETHER�HE�WANTS�TO�BACK�UP'‰LEA�COPAME(PC),A1‡ALL�OR�SELECT�FILES.‰BSR�SENDMSGIˆ* &‰IOSCALL�INP4IOS(PC)„GET�HIS�RESPONSE.‰BNE†FATALERRƒ* ‰BSR†SBARG†*‰BNE†FATALERRƒ* B‰IF.B‚RETRYB-PBA(A4)��#'A'‚THEN.S‚IF�THE�RESPONSE�WAS�NOT�'A', 6‹CMP.B‚#'Q',RETRYB-PBA(A4)‚IF�IT�WAS�A�'Q',�THEN�QUIT. ‹BEQ‚TERMP /‹CMP.B‚#'S',RETRYB-PBA(A4)‚WAS�RESPONSE�AN�'S'?%‹BNE‚OPTIONR�NO--GO�UP�AND�ASK�AGAIN. 5‹BSR‚SELOTHER�YES--CHECK�FOR�OTHER�SELECTION�OPTIONS. ‰ENDI D‰IF_SET.L�RFLAG-PBA(A4)ƒIF�THIS�IS�AN�R-TYPE�BACKUP,�SET�UP�NEW�VID. B‰MOVE.L�#FOPPR+FOPEREW<<16,D1‚SET�ACCESS�CODES�OF�INPUT�AND�OUTPUT,‰BSR�ACCESS”DISKS�(OUTPUT�DISK�IS�ALL�OURS). (*’***�READ�THE�VID�OF�THE�INPUT�DISK�***5‰LEA�RDSKIOS(PC),A0�WE�ONLY�NEED�TO�READ�SECTOR�0,�SOE‰MOVE.L�BUF1SAD-PBA(A4),IOSEAD(A0)�TEMPORARILY�ADJUST�THE�BUFFER�SIZE(‰ADD.L�#SECLEN-1,IOSEAD(A0)„TO�1�SECTOR. -‰IOSCALL�(A0)’READ�THE�VID�OF�THE�INPUT�DISK. &‰IF‚‚THEN.SŽIF�THERE�WAS�AN�ERROR,4‹CMP.B�#ISTAPC,D0ŒIF�IT�WASN'T�A�PROTECT�CODE�ERROR,1‹BNE�FATALERR�IT'S�FATAL;�IF�IT�WAS,�IT'S�NOT�HIS4‹ST‚VIDREQ-PBA(A4)ŠDISK�(WRONG�USER�#)--FLAG�THAT�HE#‰ENDIšCAN'T�DEFAULT�VID�USER#,�ETC. D‰MOVE.L�BUF1EAD-PBA(A4),IOSEAD(A0)�RESTORE�THE�ORIGINAL�BUFFER�SIZE. **•***�BUILD�THE�VID�OF�THE�OUTPUT�DISK�***%*•***�FROM�THAT�OF�THE�INPUT�DISK†***1‰MOVE.L�BUF1SAD-PBA(A4),A6ƒCLEAR�MOST�OF�THE�VID.‰LEA�VIDSDS(A6),A0ƒ*‰LEA�VIDMAC(A6),A1ƒ* ‰REPEATŽ*‹CLR.L�(A0)+‡*‹UNTIL.L�A0��A1�* *‰BSR�FIRSTIO‰GET�VOLUME�NAME,�USER�#,�ETC. ?‰MOVE.L�BUF1SAD-PBA(A4),A6…PUT�IN�THE�SAT�START�SECTOR,�THE�SAT>‰MOVE.L�#1,VIDSAT(A6)‚LENGTH,�&�THE�VERSION�&�REVISION�#�INFO.‰MOVE.W�#1,VIDSAL(A6)‚*$‰MOVE.L�EVIDVNO-PBA(A4),VIDVNO(A6)‚* ;‰ERQ.GTDTIM�TABDATE-PBA(A4)„GET�SYSTEM�DATE�&�TIME�AND�MOVE3‰MOVE.L�TABDATE-PBA(A4),VIDDTE(A6)‚DATE�TO�THE�VID. 4‰MOVE.L�#'EXOR',VIDMAC(A6)…NOW�THE�'EXORMACS'�LABEL.‰MOVE.L�#'MACS',VIDMAC+4(A6)ƒ* 8‰BSR�TESTPAT‰MOVE�THE�DIAGNOSTIC�TEST�PATTERN�OUT�THERE. :‰BSR�CHECKSUMˆTHAT'S�EVERYTHING,�SO�CALCULATE�CHECKSUM�ANDD‰MOVE.L�BUF1SAD-PBA(A4),A0‚WRITE�VID�OUT�TO�SECTOR�0�OF�OUTPUT�DISK.?‰LEA�SECLEN-1(A0),A0�(END�ADDR�OF�VID�=�START�ADDR�+�SECLEN�-1)‰LEA�WDSKIOS(PC),A1†*‰MOVE.L�A0,IOSEAD(A1)�* ‰BSR�IWRITEŠ* ‰BSR�DOSAT‹BUILD�SAT�SECTOR. ‰ENDI &*–***�A�&�R�OPTIONS�RECONVENE�HERE�***3‰BSR�CLOSOUT“WE�DON'T�NEED�THE�OUTPUT�DISK�ASSIGNED3‰BNE�FATALERR’ANYMORE�(IT'S�FILE�I/O�FROM�HERE),�SO *§CLOSE�IT. :‰IF_SET�SFLAG-PBA(A4)ŠIF�THE�RESTART�FLAG�IS�SET,�CALL�THE2‰BSR�RESTART“ROUTINE�TO�POSITION�US�AT�THE�CORRECT4‰BRA.S�OPTRCK’FILE,�AND�JUMP. �INTO�THE�LOOP�AFTER�THE‰ENDIšDIRECTORY�ENTRY�FETCH. -*’***‚FETCH�DIRECTORY�ENTRY�ON�INPUT�DISK�***RDIR…FHSCALL�DIRFHS(PC) ‰BEQ.S�OPTRCK *’***�WE�GOT�AN�ERROR�***6‰CMP.B�#FSTAEOD,D0ƒIF�WE�HIT�THE�END�OF�THE�DIRECTORY,!‰BEQ�TERMP‹JUST�EXIT�THE�PROGRAM. +‰BRA�FATALERRˆWASN'T�THE�END,�SO�ERROR�OUT. +*’***�NO�ERROR--CHECK�THE�ENTRY�AGAINST�***!*’***�THE�SELECTION�CRITERIA.‹***LOPTRCKƒIF.B�RETRYB-PBA(A4)��#'S'�THEN.S�IF�HE�DIDN'T�ASK�FOR�A�SELECTIVE0‹BSR�SETNAMES�BACKUP,�JUST�SET�UP�NAMES�IN�PARAM(‹BRA.S�OPTRDO1�BLOCKS�AND�SKIP�ALL�THIS.‹ENDI˜* ;‰IF_SET�DATEFLAG-PBA(A4)‡IF�HE�MADE�A�DATE�RANGE�SELECTION,4‹BSR�OPCKDAT‘CHECK�TO�SEE�IF�WE'RE�IN�RANGE.�IF�NOT,;‹TST.B�DOKFLAG-PBA(A4)‡MOVE�ON�TO�THE�NEXT�DIRECTORY�ENTRY. ‹BEQ�RDIR”*‹ENDI˜* ;‰IF_SET�FILEFLAG-PBA(A4)‡IF�HE�MADE�FILE/FAMILY�SELECTIONS,1‹BSR�OPCKFIL‘CHECK�TO�SEE�IF�WE�MATCH�ANYTHING�IN=‹TST.B�FOKFLAG-PBA(A4)‡THE�TABLE.‚IF�NOT,�MOVE�ON�TO�THE�NEXT‹BEQ�RDIR”DIRECTORY�ENTRY. 2‹BSR�SETNAMES†IT�PASSED�ALL�TESTS.‚SET�UP�NAMES�IN0‹BRA.S�OPTRDO1…PARAMETER�BLOCKS�AND�TRY�TO�COPY.‹ENDIŽ* :*’***�WE�DID�NOT�FAIL�THE�DATE�TEST�(IF�THERE�WAS�ONE),***5*’***�AND�THERE�WAS�NO�FILE�TEST.‚IF�THERE�WAS�NO…***6*’***�DATE�TEST�(DOKFLAG�NOT�SET),�WE�MUST�ASK�THE…***,*’***�USER�IF�HE�WANTS�TO�COPY�THE�FILE.�***3‰BSR�SETNAMES’SET�UP�NAMES�IN�THE�PARAMETER�BLOCKS.0‰TST.B�DOKFLAG-PBA(A4)‰IF�THERE�WAS�A�DATE�TEST,$‰BNE.S�OPTRDO1‘WE�DON'T�NEED�TO�ASK. *’***�WE�HAVE�TO�ASK�***:‰BSR�PROCITEMˆREADY�THE�OUTPUT�FILENAME,�&�ASK�THE�USER�IF?‰LEA�COPOK(PC),A0ˆHE�WANTS�TO�COPY�IT.‚VALID�ANSWERS�ARE�Y,N,Q.‰MOVE.L�ADDRH1-PBA(A4),A1„*‰BSR�GETRESP‰* %‰BEQ.S�OPTRDO1‡IF�HE�SAID�Y,�COPY�IT. ?‰CMP.B�#'Q',RETRYA-PBA(A4)…IF�HE�SAID�Q,�TERMINATE�THE�PROGRAM. ‰BEQ�TERMP•* 9‰BRA�RDIRŒANYTHING�ELSE�WE�ASSUME�IS�AN�N--DON'T�COPY,�SO&*©MOVE�ON�TO�THE�NEXT�DIRECTORY�ENTRY.**)*’***�OPEN�SOURCE�&�DESTINATION�FILES�***EOPTRDO1‚CMP.B�#'@',FDFIL(A3)�IF�THIS�IS�A�SPOOLER�FILE�OR�A�TEMPORARY&‰BEQ.S�OPTNOCLˆFILE,�WE�CAN'T�COPY�IT.‰CMP.B�#'&',FDFIL(A3)�*‰BEQ.S�OPTNOCLˆ* ?‰MOVE.W�#FHASGN,FHSCMD(A5)…SET�THE�COMMAND�TO�ASSIGN,�ACCESS�TO=‰MOVE.W�#FOPPR,FHSOPT(A5)†PUBLIC�READ,�AND�SET�THE�LU�FOR�THE;‰MOVE.B�#REORGLU,FHSLUN(A5)„INPUT�FILE.‚THEN�DO�THE�ASSIGN.‰FHSCALL�INFHS(PC)�*‰BEQ.S�OPTRAOUT�* '*’***�ERROR�ON�ASSIGN�OF�INPUT�FILE�***�OR.W�FHSOPT(A5)��#FOPCON‚THEN.SB‹MOVE.L�BUF1SAD-PBA(A4),FHSSAD(A6)�USE�THE�SEGMENT�WE�GOT�ALREADY."‹MOVE.L�BUF1EAD-PBA(A4),FHSEAD(A6)‰ELSE.S=‹OR.W�#FOPABF+FOPADR,FHSOPT(A6)�OTHERWISE�HAVE�FMS�ALLOCATE�A!‹ENDI˜SHARED�SEGMENT�FOR�THE�I/O. IOPTRALLO�MOVE.W�#FHALLO+FHASGN,FHSCMD(A6)‚ALLOCATE�THE�FILE�ON�THE�OUTPUT<‰OR.W�#FOPEREW,FHSOPT(A6)†DISK�AND�ASSIGN�FOR�EXCLUSIVE�READO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º1/24/84#‰MOVE.B„VELC-PBA(A4),VELC+1-PBA(A4).*œMOVE�THE�LOOP�COUNT�TO�THE�WORKING�BYTE�LOOP*œCOUNTX00100:+‰FHSCALL�OUTFHS(PC)ŒEXCLUSIVE�WRITE�ACCESS.‰BEQ.S�ALLROK’* #*’***�ERROR�ON�ASS/ IGN�OF�OUTPUT�***‰CMP.B…#FSTAVOL,D0 ‰BNE.S…X00200*œJUMP�IF�NOT�A�VOLUME�ERROR‰MOVEM.LƒA0/D0,-(A7)*œSAVE�REGISTERS‰MOVE.L„#DELAY,D0‰MOVE.L„#DLYTIME,A0‰TRAP†#1*œSET�FOLLOWING *�DIRECTIVE*�TIME�TO�DELAY-*œDELAY�TO�ALLOW�FMS�TIME�TO�RECOGNIZE�VOLUME‰MOVEM.Lƒ(A7)+,A0/D0‰SUB.B…#1,VELC+1-PBA(A4) ‰BNE.S…X00100*œADJUST�THE�LOOP�COUNT"*œJUMP�IF�LOOP�COUNT�NOT�EXHAUSTEDX00200: *º1/24/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<0‰CMP.B�#FSTADNM,D0�IF�IT�WAS�A�DUPLICATE�FILE�OR,‰BEQ.S�OPTDUP’IF�WE�HAVE�FILLED�THE�DISK,�WE3‰CMP.B�#ISTAIDS,D0�CAN�HANDLE�THE�ERROR.‚OTHERWISE,‰BEQ�WCONTM”ERROR!‰CMP.B�#FSTADS,D0 ‰BEQ‡WCONTM"*¦BRANCH�IF�INSUFFICIENT�DIRECTORY'*¦SPACE�--�GIVE�USER�OPTION�TO�CONTINUE*¦ON�MULTIPLE�VOLUMES‰BRA„FATALERR�* *’***�DUPLICATE�FILE�ERROR�***:OPTDUPƒTST.B�NFLAG-PBA(A4)‹IF�NFLAG�IS�SET,�SKIP�THE�FILE. ‰BNE�RWENDI”* 4‰TST.B�YFLAG-PBA(A4)‹IF�YFLAG�IS�SET,�COPY�THE�FILE.‰BNE.S�OPTDUPC‘* .‰BSR�PROCITEM’NEITHER�NFLAG�NOR�YFLAG�WAS�SET,3‰LEA�DUPMSG(PC),A0‘SO�ASK�THE�USER�WHETHER�HE�WANTS>‰MOVE.L�ADDRH1-PBA(A4),A1†TO�COPY�IT.‚VALID�ANSWERS�ARE�Y,N,Q.‰BSR�GETRESP“* )‰BEQ.S�OPTDUPC‘IF�HE�ANSWERED�Y,�COPY�IT. 2‰CMP.B�#'Q',RETRYA-PBA(A4)…IF�HE�ANSWERED�Q,�QUIT. ‰BEQƒTERMP“* 5‰BRA�RWENDI�ANYTHING�ELSE�WE�ASSUME�IS�AN�N.�SKIP�IT.**9OPTDUPC‚LEA�OUTFHS(PC),A0‘IN�ORDER�TO�COPY,�WE�DELETE�THE=‰MOVE.W�#FHDELT,FHSCMD(A0)…OLD�FILE�FIRST�AND�START�OVER�WITH&‰FHSCALL�(A0)’THE�ALLOCATE�AND�ASSIGN.‰BNE�FATALERR’*‰BRA�OPTRALLO’***/*’***�OUTPUT�FILE�ALLOCATED�AND�ASSIGNED�OK�***8ALLROKƒLEA�RDSKIOS(PC),A0�LOAD�ADDRESSES�OF�READ�&�WRITE%‰LEA�WDSKIOS(PC),A1�PARAMETER�BLOCKS. A‰MOVE.B�#REORGLU,IOSLUN(A0)„SET�THE�LU�FOR�READ,�AND�THE�LOCATIONB‰MOVE.L�FHSSAD(A6),IOSSAD(A0)‚OF�THE�BUFFER�FOR�READ�&�WRITE�(TAKE?‰MOVE.L�FHSSAD(A6),IOSSAD(A1)‚ADDRESSES�FROM�OUTPUT�FHS�BLOCK).‰MOVE.L�FHSEAD(A6),IOSEAD(A0)‚* <‰IF_SET�PACKIT-PBA(A4)‰IF�WE�ARE�SUPPOSED�TO�PACK�THIS�FILE,?‹MOVE.W�#IOPREC+IOPNXT+IOPRTK,IOSOPT(A0)‚SET�UP�FOR�RECORD�I/O.*‹MOVE.W�#IOPREC+IOPNXT+IOPRTK,IOSOPT(A1)‚*‰ELSE.S˜OTHERWISE,7‹MOVE.W�#IOPBLK+IOPNXT,IOSOPT(A0)‚SET�UP�FOR�BLOCK�I/O.#‹MOVE.W�#IOPBLK+IOPNXT,IOSOPT(A1)‚*‹ENDIž* "*’***�READ�FROM�THE�INPUT�FILE�***&OPTRREAD�BSR�IOSREAD™PERFORM�THE�READ. $‰TST.B�ISEND-PBA(A4)‹IF�IT'S�NOT�THE‰IF‚‚THEN.SŽEND�OF�FILE, "*’***�WRITE�TO�THE�OUTPUT�FILE�***2‹LEA�RDSKIOS(PC),A0ŽCOMPUTE�THE�END�ADDRESS�OF�THE6‹LEA�WDSKIOS(PC),A1ŽI/O�BUFFER�AND�PUT�IT�IN�THE�WRITE&‹MOVE.L�IOSSAD(A0),D0ˆPARAMETER�BLOCK.‹ADD.L�IOSLEN(A0),D0‰*‹SUB.L�#1,D0‘*‹MOVE.L�D0,IOSEAD(A1)ˆ* '‹IOSCALL�WDSKIOS(PC)‰PERFORM�THE�WRITE.%‹IF‚‚THEN.SŒIF�THERE�IS�AN�ERROR,&�CMP.B�#ISTAIDS,D0‰IF�IT'S�END�OF�DISK.�BEQ�WCONT‘GO�TO�MULTIPLE�OUTPUT�DISK�ROUTINE.*�BRA�FATALERRŽANY�OTHER�ERROR�IS�AN�ERROR!�ENDI–* /‰BRA�OPTRREAD’GO�BACK�UP�FOR�NEXT�RECORD/BLOCK.‰ENDIš* -*’***�ENTIRE�FILE�TRANSFERRED--WRAP�IT�UP�****‰BSR�CLOSOUT“TRY�TO�CLOSE�THE�OUTPUT�FILE. $‰IF‚‚THEN.SŽIF�THERE'S�AN�ERROR,'‹CMP.B�#ISTAIDS,D0‹IF�IT'S�END�OF�DISK,.‹BEQ�WCONT“GO�TO�MULTIPLE�OUTPUT�DISK�ROUTINE.*‹BRA�FATALERR�ANY�OTHER�ERROR�IS�AN�ERROR!‹ENDI˜* 6‰BSR�PROCITEMˆREADY�THE�OUTPUT�FILENAME�FOR�PRINT,�AND5‰LEA�COPOKB(PC),A0‡LOG�IT�TO�THE�LISTING�FILE/DEVICE.‰MOVE.L�ADDRH1-PBA(A4),A1„*‰BSR�SENDPRT‰* 5RWENDIƒBSR�CLOSIN”CLOSE�THE�INPUT�FILE�AND�MOVE�ON�TO‰BRA�RDIR–THE�NEXT�ONE.‰PAGE=**************************************************************-*ˆROUTINE�TO�ZERO�SECTOR�FOR�SECT�ALLOC�TABLE*=************************************************************* BUFFCLR: ;‰MOVE.L�BUF1SAD-PBA(A4),A0…SINCE�SAT�IS�AT�THE�BEGINNING�OF7‰LEA�SECLEN-1(A0),A6‹BUFFER�1,�LOAD�EXTENT�OF�BUFFER�1. )‰REPEAT˜CLEAR�LONGWORDS�FOR�THE�EXTENT�OF‹CLR.L�(A0)+‘THE�SECTOR.‰UNTIL.L‚A0��A6‹* ‰RTS****>***************************************************************#*ˆWRITE�A�SECTOR�TO�TH/ E�OUTPUT�DISK*>************************************************************** IWRITE: ‰BSR�IOSWRITEˆDO�THE�WRITE. /‰LEA�WDSKIOS(PC),A0†MOVE�ON�TO�THE�NEXT�SECTOR.‰ADD.L�#1,IOSRRN(A0)�* ‰RTS‰PAGE9**********************************************************/*ˆROUTINE�TO�CHECK�WHETHER�OR�NOT�THE�DIRECTORY+*ˆENTRY�IS�WITHIN�THE�SPECIFIED�DATE�RANGE.*9********************************************************* OPCKDAT: =‰CLR.B�DOKFLAG-PBA(A4)‰INIT�DATE�SELECT�FLAG�TO�OUT-OF-RANGE. 7‰LEA�DIRBLK(PC),A0‘D2�<--�THE�DATE�OF�THIS�DIRECTORY�EN‰MOVE.W�FDDTEC(A0),D2Š* "‰IF.W‚D2��SAVEFM-PBA(A4)‚AND.W=�D2��SAVETO-PBA(A4)‚THEN.S‚IF�THAT'S�BETWEEN�THE�FROM�ANDC‹MOVE.B�#1,DOKFLAG-PBA(A4)ƒTO�DATES�(INCLUSIVE),�SET�THE�'OK'�FLAG.‰ENDI ‰RTS‰PAGE:***********************************************************/*ˆROUTINE�TO�CHECK�WHETHER�OR�NOT�THE�DIRECTORY/*ˆENTRY�MATCHES�ONE�OF�THE�FILE/FAMILY�ENTRIES.*:********************************************************** OPCKFIL: 9‰CLR.B…FOKFLAG-PBA(A4)…INIT�FILE�SELECT�FLAG�TO�NO-MATCH.4‰MOVE.B„FILEFLAG-PBA(A4),D0�LOAD�#�OF�TABLE�ENTRIES.6‰LEA‡FILEAREA(PC),A2‰POINT�A2�TO�THE�TOP�OF�THE�TABLE. ?OPCKFIL1�LEA‡DIRBLK(PC),A0‹POINT�A0�TO�THE�DIRECTORY�ENTRY,�AND,‰MOVE.L„A2,A1�A1�TO�THE�CURRENT�TABLE�ENTRY. 2‰CMP.W…(A0)+,(A1)+‰CHECK�USER�#�OF�TABLE�ENTRY�FOR2‰BEQ.S…OPCKFIL2ŒTRUE�MATCH�OR�WILDCARD�MATCH�(-2).‰CMP.W…#-2,-2(A1)Š*‰BNE.S…OPCKFIL5Œ* 5OPCKFIL2�MOVE.W„#17,D7ŽCHECK�CATALOGUE,�FILENAME,�AND@OPCKFIL3�CMP.B…(A0)+,(A1)+‰EXTENSION�FIELDS�(TOTAL�OF�18�BYTES).1‰BEQ.S…OPCKFIL4ŒEACH�BYTE�MUST�EITHER�MATCH�OR�BE‰CMP.B…#'*',-1(A1)‰A�'*'.‰BNE.S…OPCKFIL5Œ*OPCKFIL4�DBF‡D7,OPCKFIL3‰**A‰MOVE.B„#1,FOKFLAG-PBA(A4)‚IF�WE�FALL�THROUGH�TO�HERE,�WE�MATCHED2‰BRA.S…OPCKFEX�ALL�FIELDS.‚SET�FILE�SELECT�FLAG�TO*¨GOT-MATCH�AND�RETURN.*;OPCKFIL5�LEA�20(A2),A2‘DIDN'T�MATCH�THAT�TABLE�ENTRY.‚POINT2‰SUB.B…#1,D0�TO�THE�NEXT�ONE�AND�CHECK�IT�IF�THERE‰BNE‡OPCKFIL1ŒARE�ANY�LEFT. OPCKFEX‚RTS‰PAGED*********************************************************************3*ˆSET�UP�NAMES�IN�INPUT�AND�OUTPUT�PARAMETER�BLOCKS*D******************************************************************** SETNAMES: 5‰LEA�DIRBLK(PC),A3‘LOAD�ADDRESSES�OF�DIRECTORY�ENTRY,5‰LEA�INFHS(PC),A5’INPUT,�AND�OUTPUT�PARAMETER�BLOCKS.‰LEA�OUTFHS(PC),A6‘* :‰IF.B‚FDWCD(A3)��#$FF‚THEN.S‡IF�THE�WRITE�PROTECT�CODE+‹CLR.B�FDWCD(A3)—IS�$FF,�CHANGE�IT�TO�ZERO.‹ENDI¢* **’***�MOVE�FIELDS�FROM�DIRECTORY�PARAM�***%*’***�BLOCK�TO�INPUT�PARAM�BLOCK.†***#‰MOVE.W�FDUSN(A3),FHSUSN(A5)�USER�#$‰MOVE.L�FDCLG(A3),FHSCLG(A5)�CATALOG"‰MOVE.L�FDCLG+4(A3),FHSCLG+4(A5)‰*%‰MOVE.L�FDFIL(A3),FHSFIL(A5)�FILENAME"‰MOVE.L�FDFIL+4(A3),FHSFIL+4(A5)‰*&‰MOVE.W�FDEXT(A3),FHSEXT(A5)�EXTENSION5‰MOVE.W�FDWCD(A3),FHSWCD(A5)�READ/WRITE�PROTECT�CODES *’***�OUTPUT�PARAMETER�BLOCK�***9‰IF_SET�RFLAG-PBA(A4)ŠIF�THIS�IS�AN�R-TYPE�BACKUP,�CHANGEE‹MOVE.L�VOLR-PBA(A4),FHSVOL(A6)�THE�VOLUME�NAME�TO�MATCH�THE�NEW�VID.‹ENDI˜* 8‰IF_SET�FAMUSN-PBA(A4)‰IF�THE�FAMILY�USER�#�FLAG�IS�SET,>‹MOVE.W�FHSUSN(A5),FHSUSN(A6)�COPY�THE�INPUT�USER�#�TO�OUTPUT.‹ENDI˜* 9‰IF_SET�FAMCAT-PBA(A4)‰IF�THE�FAMILY�CATALOG�FLAG�IS�SET,?‹MOVE.L�FHSCLG(A5),FHSCLG(A6)�COPY�THE�INPUT�CATALOG�TO�OUTPUT.#‹MOVE.L�FHSCLG+4(A5),FHSCLG+4(A6)�*‹ENDI˜* D‰MOVE.L�FHSFIL(A5),FHSFIL(A6)‚MOVE�THE�INPUT�FILENAME�&�EXTENSION�TO=‰MOVE.L�FHSFIL+4(A5),FHSFIL+4(A6)‚THE�OUTPUT�PARAMETER�BLOCK.‰MOVE.W�FHSEXT(A5),FHSEXT(A6)‚* F‰MOVE.W�FDWCD(A3),FHSWCD(A6)�GET�THE�PROTECT�CODES�FROM�THE�DIR�ENTRY. ‰RTS‰PAGE3****************************************************)*ˆROUTINE�TO�HANDLE�MULTIPLE�OUTPUT�DISK.'*ˆREQUIRED�BECAUSE�INPUT�DISK�TOO�LARGE*3***************************************************3***************************************************WCONT: ‰BSR�CLOSOUT‰CLOSE�OUTPUT‰BNE�FATALERRˆ* 4‰LEA�OUTFHS(PC),A0‘DELETE�THE�FILE�WE�WERE0 �TRYING�TO<‰MOVE.W�#FHDELT,FHSCMD(A0)…BACK�UP�WHEN�WE�RAN�OUT�OF�SPACE.‰FHSCALL�(A0)’*‰BNE…FATALERRŽ* 9WCONTMƒLEA�CONTM1(PC),A0‘ASK�USER�IF�HE�WANTS�TO�CONTINUE6‰LEA�CONTM1E(PC),A1�ON�ANOTHER�VOLUME.�VALID�RESPONSES‰BSR�GETRESP“ARE�Y,N. #‰IF‚‚THEN.SŽIF�HE�DIDN'T�SAY�Y,7‹CMP.B�#'N',RETRYA-PBA(A4)ƒAN�N�MEANS�HE�WANTS�TO�QUIT;'‹BEQ�TERMP“ANYTHING�ELSE�WAS�A�MISTAKE,‹BRA�WCONTM’SO�ASK�AGAIN.‹ENDI˜* 2‰BSR�MOVNAMF“SAVE�DIRECTORY�FILENAME;�REPLACE�WITH-‰BSR�CLOSIN”INPUT�FILENAME.‚CLOSE�INPUT�FILE. -‰LEA�INFHS(PC),A0’CLOSE�THE�DIRECTORY�VOLUME.‰MOVE.B�#DSKLUI,FHSLUN(A0)…* ‰BSR�CLOSIN”* :WCONTM1‚LEA�CONTM2(PC),A0‡PROMPT�USER�TO�LOAD�NEW�DISK�AND*‰LEA�CONTM2E(PC),A1†ENTER�ITS�VOLUME�NAME.‰BSR�SENDMSGIˆ*-‰IOSCALL�INP5IOS(PC)…RECEIVE�THE�VOLUME�NAME.‰BNE†FATALERRƒ* ‰BSR†SBARG†*‰BNE†FATALERRƒ* 6‰LEA�DESCANS(PC),A0†IF�HE�DIDN'T�ENTER�ANYTHING�(FIRST2‰CMP.B�#CR,(A0)†CHARACTER�A�CARRIAGE�RETURN),�THEN#‰BEQ�WCONTM1‰GO�BACK�AND�ASK�AGAIN. ‰CMP.B�#'#',(A0)+ŠDEVICE‰BEQ.S�CONT2‰YES‰LEA�3(A0),A1ˆSET�ENDWCONT1A�CMP.B�#CR,(A0)‡END‰BNE.S�WCONT1B‡NOWCONT1MC MOVE.B #CR,1(A0)‰MOVE.B‚#':',(A0)ƒINDICATE�VOL‰BRA.S�WCONT1C#WCONT1B�CMP.B�#':',(A0)+…TERMINATOR‰BEQ.S�WCONT1C‡YES‰CMP.L�A0,A1‰AT�END‰BHI�WCONT1A‰NOˆBRA�WCONT1MC‰SET�END*WCONT1C‚TST.B�RFLAG-PBA(A4)�REORG�FLAG�SET‰BEQ.S�CONT2‰NO‰LEA�CONTM3(PC),A0‰LEA�CONTM3E(PC),A1*‰BSR�GETRESPˆSEND�SWITCH�TO�APPEND�OPT�MSG ‰BNE�WCONTM1 ‰CLR.B�RFLAG-PBA(A4)�CLEAR�REORG‰MOVE.B�#1,AFLAG-PBA(A4)*’CONTINUE�PROCESSING(CONT2„LEA�DESCANS(PC),A0†VERIFY�VOL�NAME‰LEA�OUTFHS(PC),A60‰MOVE.W�FHSUSN(A6),L1USN-PBA(A4)�SAVE�OLD�USER�#O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º1/24/84!‰MOVE.L„FHSVOL(A6),X10000-PBA(A4)*¦SAVE�OLD�VOLUME�NAME *º1/24/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ‰BSR�EDITFILE ‰BPL.S�CONT3CONT2ER‚BSR�INVAL‹SEND�ERR�MSG‰BRA�WCONTM1“TRY�AGAIN*CONT3„BTST�#1,D0ŠDEVICE‰BEQ.S�CONT3AˆNO‰MOVE.B�#1,IOTYPE-PBA(A4)‰LEA�OUTFHS(PC),A6‰MOVE.L�FHSVOL(A6),D4‰BSR�CKTAB‹GET�VOL�NAME/‰MOVE.W�L1USN-PBA(A4),FHSUSN(A6)ƒRESET�USER�NUM ‰BRA.S�CONT3BCONT3AƒBTST.L�#22,D0‘VOL�NAME‰BEQ‚CONT2ER’NO CONT3B:O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º1/24/84 ‰BSR‡X10010.*œForce�FHS�to�recognize�that�a�new�volume�has*œbeen�input�into�the�system *º1/24/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6‰LEA�INFHS(PC),A0’SET�UP�THE�INPUT�PARAM�BLOCK�TO�ASSIA‰MOVE.W�#FHASGN,FHSCMD(A0)…THE�NEW�VOLUME.‚THE�COMMAND�IS�ASSIGN,8‰MOVE.L�#'„',D1�AND�THE�CATALOG,�FILENAME,�AND�EXTENSION(‰MOVE.L�D1,FHSCLG(A0)ŠFIELDS�ARE�SPACES.‰MOVE.L�D1,FHSCLG+4(A0)ˆ*‰MOVE.L�D1,FHSFIL(A0)Š*‰MOVE.L�D1,FHSFIL+4(A0)ˆ*‰MOVE.W�D1,FHSEXT(A0)Š* ‰FHSCALL�(A0)‡ASSIGN�VOLUME ‰BNE†FATALERR9‰MOVE.B�#REORGLU,FHSLUN(A0)„SET�UP�NEW�LOG�UNIT�FOR�FILES-‰BSR.S�MOVNAMB‰READ�LAST�NAME�AND�RESET�TABLE&‰BRA�OPTRCK‰START�PROCESSING�NEXT�DISK‰PAGE8*********************************************************%*ˆMOVE�FILENAME�(VOL,USN,CAT,FIL,EXT)*ˆFROM�(A0)�TO�(A1).*8******************************************************** MOVEVOL: ‰MOVE.L�(A0)+,(A1)+‰MOVE.L�(A0)+,(A1)+‰MOVE.L�(A0)+,(A1)+‰MOVE.L�(A0)+,(A1)+‰MOVE.L�(A0)+,(A1)+‰MOVE.L�(A0),(A1) ‰RTS****7********************************************************%*ŠSAVE�DIRECTORY�FILENAME�&�PUT�INPUT$*ŠFILENAME�IN�FETCH�PARAMETER�BLOCK.*7******************************************************* MOVNAMF: <‰LEA�DIRFHSV(PC),A0†MOVE�FILENAME�FROM�FETCH�DIR�ENTRY�PARAM/‰LEA�BUFFMULT(PC),A1…BLOCK�TO�A�HOLDING�BUFFER.‰BSR�MOVEVOL‰* 9‰LEA�INFHS(PC),A0ˆMOVE�FILENAME�FROM�INPUT�PARAM�BLOCK�TO/‰LEA�FHSVOL(A0),A0ƒFETCH�DIR�ENTRY�PARAM�BLOCK.‰LEA�DIRFHSV(PC),A1†*‰BSR�MOVEVOL‰* ‰RTS‰PAGE:**********************************************0 *************(*ˆFETCH�DIR�ENTRY�&�RESTORE�DIR�FILENAME*:********************************************************** MOVNAMB: 4‰FHSCALL�DIRFHS(PC)†MAKE�FETCH�DIRECTORY�ENTRY�CALL. &‰IF‚‚THEN.SŽIF�THERE�WAS�AN�ERROR,4‹CMP.B�#FSTAEOD,D0‹IF�IT�WAS�END�OF�DIRECTORY,�'FILE,‹BEQ�NOTFND’NOT�FOUND'�ERROR.‚OTHERWISE,JUST0‹BRA�FATALERR�LET�ERROR�MESSAGE�HANDLER�HAVE�IT.‹ENDI˜* 6‰LEA�BUFFMULT(PC),A0�RESTORE�THE�SAVED�DIRECTORY�ENTRY5‰LEA�DIRFHSV(PC),A1�FILENAME�FROM�THE�HOLDING�BUFFER.‰BSR�MOVEVOL“* ‰RTS‰PAGE3***************************************************"*’ROUTINE�FOR�OTHER�SELECT�OPTIONS*’DATE�RANGE�AND�FILE�SELECTION'*’PARAMETERS�ARE�SET�UP�IN�THIS�ROUTINE7******************************************************* SELOTHER: <‰LEA�SELM1(PC),A0ˆASK�USER�IF�HE�WANTS�TO�ENTER�A�DATE�RANGE;‰LEA�SELM1E(PC),A1‡SELECTION.‚IF�HIS�ANSWER�IS�NOT�Y,�GO�TO&‰BSR�GETRESP‰THE�FILE�SELECTION�STUFF. ‰BNE�SELFILŠ* 4SEL1…LEA�RANM(PC),A0‰PROMPT�USER�TO�ENTER�THE�DATES.‰LEA�RANME(PC),A1ˆ*‰BSR�SENDMSGIˆ*'‰IOSCALL�INP5IOS(PC)…RECEIVE�HIS�ENTRY.‰BNE‡FATALERR‚* ‰BSR‡SBARG…*‰BNE‡FATALERR‚* 6‰LEA�DESCANS(PC),A0†IF�HE�DIDN'T�ENTER�ANYTHING�(FIRST-‰CMP.B�#CR,(A0)†CHARACTER�A�CARRIAGE�RETURN),)‰BEQ�SELOTHERˆTHEN�GO�BACK�AND�ASK�AGAIN. SEL2…BSR�CVT2ŒCONVERT�2�DIGITS ‰CMP.L�#12,D0ˆTEST�MONTH�TOO�BIG‰BLS.S�SEL3ŠBR�LOW�OR�SAMESELER„BSR�INVAL‹PRT�ERROR�MSG'‰CLR.B�DATESW-PBA(A4)�CLEAR�PATH�SWITCH‰BRA�SEL1ŒTRY�AGAINSEL3…LSL.L�#8,D0‰POSITION�MONTH‰MOVE.L�D0,D3ˆSAVE�MONTH‰CMP.B�#'/',(A0)+„TEST�TERM‰BNE�SELER‹ERROR‰BSR�CVT2ŒCONVERT�DAY‰CMP.L�#31,D0ˆTEST�DAY�TOO�BIG‰BGT�SELER‹ERROR‰CMP.B�#'/',(A0)+„TEST�TERM‰BNE�SELER‹ERROR‰MOVE.B�D0,D3ˆSAVE�DAY‰BSR�CVT2ŒCONV�YEAR‰CMP.L�#IYEAR,D0…TEST�TOO�SMALL‰BCS‚SELERŠERROR%‰ADD.L�#CENTURY,D0ƒGET�FULL�YEAR�19XX‰SWAP�D3�TRANSPOSE‰ADD.L�D3,D0‰INS�YEAR‰SWAP�D0�POS�FOR�CONV%‰BSR�DATEGOŠCONV�GREGORIAL�TO�ORDINAL‰TST.B�DATESW-PBA(A4)�PASS�2‰BNE.S�SELTO‰YES*’PASS�1(‰MOVE.W�D0,SAVEFM-PBA(A4)�SAVE�FROM�DATE!‰CMP.B�#CR,(A0)†CK�FOR�TERMINATOR‰BEQ.S�SEL4ŠYES"‰CMP.B�#'-',(A0)+„CK�FOR�SEPARATOR‰BNE�SELER‹ERROR(‰MOVE.B�#1,DATESW-PBA(A4)�SET�FOR�PASS�2 ‰BRA�SEL2*SELTO„MOVE.W�SAVEFM-PBA(A4),D1$‰CMP.W�D0,D1‰IS�FROM�DATE�>�TO�DATE?‰BGT�SELER‹NO--ERROR.*SEL4…MOVE.W�D0,SAVETO-PBA(A4)‚SAVE�TO�DATE-‰MOVE.B�#1,DATEFLAG-PBA(A4)�SET�DATE�SEL�FLAG*7******************************************************* *’BUILD�FILE�TABLE�FOR�SELECTION7*******************************************************9SELFILƒLEA�SELM2(PC),A0ˆASK�IF�FAMILY/FILE�SELECTIONS�ARE4‰LEA�SELM2E(PC),A1‡WANTED;�EXIT�IF�HE�DOESN'T�SAY�Y.‰BSR�GETRESP‰*‰BNE�SELEXIT‰* <‰LEA�FILEAREA(PC),A0…POINT�TO�THE�1ST�OF�THE�10�ENTRY�SLOTS.‰MOVE.L�A0,ADDRH2-PBA(A4)�* 2‰LEA�SELM3(PC),A0ˆEXPLAIN�HOW�TO�ENTER�FAMILY/FILE‰LEA�SELM3E(PC),A1‡SELECTIONS.‰BSR�SENDMSG‰*‰LEA�SELM4(PC),A0ˆ*‰LEA�SELM4E(PC),A1‡*‰BSR�SENDMSG‰* 2SELF1„LEA�FILM(PC),A0‰PROMPT�FOR�A�SELECTION�USING‰LEA�FILME(PC),A1ˆIMAGE�MODE.‰BSR�SENDMSGIˆ* 3‰IOSCALL�INP9IOS(PC)…GET�THE�FAMILY/FILE�SELECTION.‰BNE…FATALERR„* ‰BSR…SBARG‡*‰BNE…FATALERR„* ;‰CMP.B�#CR,INBUF-PBA(A4)‡WAS�NOTHING�ENTERED�(JUST�RETURN)?‰BEQ.S�SELEXIT‘YES--EXIT. 7*’***�SOMETHING�WAS�ENTERED--VALIDATE�WITH�EDITFILE�***4‰LEA�DIRFHS(PC),A0‘MOVE�THE�VOLUME�NAME,�THE�USER�#,8‰LEA�DUMMYFHS(PC),A1�AND�THE�CATALOG�NAME�FROM�THE�FETCH@‰MOVE.L�FHSVOL(A0),FHSVOL(A1)‚DIRECTORY�ENTRY�PARAM�BLOCK�TO�THE<‰MOVE.W�FHSUSN(A0),FHSUSN(A1)‚DUMMY�PARAM�BLOCK�AS�DEFAULTS.‰MOVE.L�FHSCLG(A0),FHSCLG(A1)‚*#‰MOVE.L�FHSCLG+4(A0),FHSCLG+4(A1)�* ?‰LEA�DUMMYFHS(PC),A6…VALIDATE�THE�INPUT�USING�EDITFILE;�RESULTS3‰LEA�INBUF(PC),A0ˆWILL�GO�TO�THE�DUMMY�PARAM�BLOCK.‰BSR�EDITFILEˆ* &‰IF‚‚THEN.S„IF�THERE�WAS�AN�ERROR,5SELFERƒBSR�INVAL‹PRINT�'INVALID�ENTRY'�AND�TRY�AGAIN. ‰BRA�SELF1‹*‰ENDI�* >‰LEA�INFHS(PC),A2ˆIF�THE�VOLUME�NAME�ENTERED�DIFFERS�FROM�THATC‰LEA�DUMMY1 FHS(PC),A6…OF�THE�INPUT�DISK,�SIGNAL�ERROR�AND�TRY�AGAIN.‰MOVE.L�FHSVOL(A2),D2�*‰CMP.L�FHSVOL(A6),D2�* ‰BNE�SELFERŠ* 4‰BTST�#19,D0‰IF�FILENAME�AND�EXTENSION�WERE�NOT�BOTH'‰BEQ�SELFERŠSPECIFIED,�THAT'S�AN�ERROR!‰BTST�#18,D0‰* ‰BEQ�SELFERŠ* !*’***�THE�ENTRY�IS�ACCEPTABLE�***3‰ADD.B�#1,FILEFLAG-PBA(A4)‚INCREMENT�ENTRY�COUNTER. C‰MOVE.L�ADDRH2-PBA(A4),A0„MOVE�THE�FILENAME�TO�THE�CURRENT�ENTRY�IN3‰LEA�FHSUSN(A6),A1ƒTHE�FILE/FAMILY�SELECTION�TABLE.‰MOVE.W�(A1)+,(A0)+‚USER�#‰MOVE.L�(A1)+,(A0)+‚CATALOGUE‰MOVE.L�(A1)+,(A0)+‚CATALOGU‰MOVE.L�(A1)+,(A0)+‚FILE‰MOVE.L�(A1)+,(A0)+‚FILE‰MOVE.W�(A1)+,(A0)+‚EXT A‰IF.B‚FILEFLAG-PBA(A4)��#10�THEN.S‚IF�THERE�ARE�FEWER�THAN�10?‹MOVE.L�A0,ADDRH2-PBA(A4)†ENTRIES,�SAVE�THE�CURRENT�LOCATION�IN+‹BRA�SELF1•THE�TABLE�AND�GET�ANOTHER�ENTRY.‹ENDIš* SELEXIT‚RTS‰PAGE3****************************************************$*ˆRESTART�ROUTINE�WILL�START�ON�FILE*ˆENTERED�AND�WALK�FORWARD*4**************************************************** RESTART: /‰LEA�RESTM(PC),A0ˆPROMPT�USER�FOR�FILENAME�WITH$‰LEA�RESTME(PC),A1‡WHICH�TO�RESTART.‰BSR�SENDMSG‰**‰IOSCALL�INP9IOS(PC)…RECEIVE�THE�FILENAME.‰BNE†FATALERRƒ* ‰BSR†SBARG†*‰BNE†FATALERRƒ* 1‰LEA�INBUF(PC),A0ˆCHECK�THE�INPUT�USING�EDITFILE.‰LEA�INFHS(PC),A6ˆ*‰BSR�EDITFILEˆ*&‰IF‚‚THEN.S„IF�IT'S�BAD,�GO�UP�AND‹BSR�INVAL‰ASK�AGAIN.‹BRA�RESTART‡*‹ENDIŽ* =‰BSR�MOVNAMF‰SAVE�THE�DIRECTORY�ENTRY�FILENAME�&�REPLACE�WITH9‰BSR�MOVNAMB‰THAT�JUST�ENTERED.‚DO�FETCH�TO�THAT�FILENAME*§&�RESTORE�ORIGINAL. ‰RTS‰PAGEB*******************************************************************,*‹CONVERT�OUTPUT�FILENAME�TO�READABLE�FORMAT*‹IN�DIRMSG�BUFFER�FOR�PRINT.*B****************************************************************** PROCITEM: 5‰LEA�OUTFHS(PC),A6‘MOVE�VOLUME�NAME�FROM�OUTPUT�PARAM2‰MOVE.L�FHSVOL(A6),VOLPRT-PBA(A4)‚BLOCK�TO�BUFFER. ,‰CLR.L�D0–CONVERT�USER�#�TO�ASCII�IN�BUFFER.‰MOVE.W�FHSUSN(A6),D0Š*‰LEA�L1USN(PC),A0’* ‰BSR�BINDEC”* D‰MOVE.L�FHSCLG(A6),L1CAT-PBA(A4)�MOVE�CATALOG,�FILENAME,�&�EXTENSION/‰MOVE.L�FHSCLG+4(A6),L1CAT+4-PBA(A4)�TO�BUFFER."‰MOVE.L�FHSFIL(A6),L1FIL-PBA(A4)�*&‰MOVE.L�FHSFIL+4(A6),L1FIL+4-PBA(A4)�*"‰MOVE.W�FHSEXT(A6),L1EXT-PBA(A4)�* 7‰LEA�DIRMSG(PC),A1‘MOVE�THE�FILENAME�FROM�THE�BUFFER�TO6‰LEA�COPOKB(PC),A2‘THE�PRINT�LINE,�COMPRESSING�SPACES.‰MOVE.L�#DIRMSGL,D1Œ*‰BSR.S�SPCOMP’* 3‰MOVE.B�#'�',(A2)ŽFOLLOW�THE�FILENAME�WITH�A�SPACE. -‰MOVE.L�A2,A1’SAVE�THE�LOCATION�FOLLOWING�THE#‰MOVE.L�A2,ADDRH1-PBA(A4)†FILENAME. ‰RTS‰PAGE>***************************************************************+*…***�MOVE�A�BUFFER,�COMPRESSING�SPACES�**** *ˆON�CALL:)*ŠA1.L�<--�START�ADDRESS�OF�SOURCE�BUFFER)*ŠA2.L�<--�START�ADDRESS�OF�TARGET�BUFFER"*ŠD1.L�<--�LENGTH�OF�SOURCE�BUFFER *ˆON�RETURN:**ŠA2.L‚POINTS�JUST�AFTER�THE�TARGET�BUFFER*>************************************************************** SPCOMP:3K%R-R5O=SEFMMU>]EeZm ‰REPEAT 6‹IF.B‚(A1)+��#SPACE‚THEN.S‡IF�THE�CHARACTER�IS�NOT&�MOVE.B�-1(A1),(A2)+‘A�SPACE,�MOVE�IT.�ENDI * "‹SUB.W�#1,D1›REPEAT�FOR�THE�ENTIRE‹UNTIL�œSOURCE�BUFFER. ‰RTS‰PAGE6*******************************************************0*ˆROUTINE�TO�SET�UP�SECTOR�ALLOCATION�TABLE�WHIC/*ˆRESIDES�ON�PHYSICAL�SECTOR�2�OF�DISK�(ADDR�1)*7*ˆTHE�CORRECT�BITS�MUST�BE�TURNED�ON�OR�OFF�TO�INDICATE*ˆWHICH�SECTORS�ARE�AVAILABLE5*ˆTHIS�ROUTINE�IS�FOR�SINGLE�&�DOUBLE�SIDED�DISKETTES*6****************************************************** DOSAT: ‰BSR�BUFFCLR…CLEAR�SECTOR  0************************************************!*ˆSET�UP�SIDE�ONE�OF�THE�DISKETTE,******************************************** 1  .‰MOVE.L�SAVESIZE-PBA(A4),D6‚GET�NUM�OF�SECTORS(‰DIVU�#SECT2048,D6ƒ#�POF�BITS�PER�SECTOR‰CLR.L�D1ˆINIT ‰MOVE.W�D6,D1 ‰MOVE.L�D1,D2‰TST.W�D6ˆOVER�2�SIDES‰BNE.S�BIGLOP†YES@‰MOVE.B�#1,ONESECT-PBA(A4)‚SET�FLAG�ONLY�ONE�SECTOR�WILL�BE�USED ‰BRA.S�DOREM*&*ˆROUTINE�FOR�>�THAN�DOUBLE�SIDED�DISK* BIGLOPƒEQU�*‰BSR�IWRITE„WRITE�SECTOR$‰SUB.W�#1,D1…AT�END�OF�WHOLE�SECTORS‰BNE�BIGLOP†NO* DOREM„EQU�*‰SWAP�D6‰GET�REMAINDER‰TST.W�D6ˆIS�IT�0‰BEQ.S�DOFIRST…YES*‰CLR.L�D1ˆINIT******************************************* *ˆPROCESS�REMAINDER�OF�LAST�SIDE*******************************************‰MOVE.W�D6,D1‰GET�REMAINDER‰DIVU�#8,D1‹GET�TOTAL�BYTES ‰CLR.L�D6 ‰MOVE.W�D1,D6 A‰MOVE.L�BUF1SAD-PBA(A4),A0ƒA0�<--�START�ADDRESS�OF�SAT�IN�BUFFER.9‰LEA�SECLEN-1(A0),A2�A2�<--�ENDƒADDRESS�OF�SAT�IN�BUFFER. ‰ADD.L�D6,A0…ADD�OFF�SET‰SWAP�D1‰GET�REMAINDER‰MOVE.W�D1,D6‰GET�REMAINDER‰LEA�BITSON(PC),A1ˆINIT�TABLE‰MOVE.B�0(A1,D6),D60‰MOVE.B�D6,(A0)+†SET�BIT�FOR�LAST�BYTE�AVAILABLE BITLOOP‚EQU�*‰CMP.L�A0,A2ŠAT�END‰BCS.S�LSTWRTŠYES‰MOVE.B�#$FF,(A0)+„SET�BITS�ON ‰BRA�BITLOOP%LSTWRTƒBSR�IOSWRITE‰WRITE�LAST�SECTOR ‰ADD.W�#1,D2ŠINC�FOR�LAST�SECTOR*-*********************************************&*ˆTURN�ON�BITS�IN�SAT�FOR�SECTORS�USED-********************************************* DOFIRST‚EQU�*)‰TST.B�ONESECT-PBA(A4)‡ONLY�ONE�SECT�USED‰BNE.S�SETRRN„YES‰BSR�BUFFCLR…CLEAR�SECTOR SETRRNƒEQU�*‰LEA�WDSKIOS(PC),A0%‰MOVE.L�#1,IOSRRN(A0)ˆSET�UP�SECTOR�#,‰MOVE.L�BUF1SAD-PBA(A4),A0‚INIT�BUFF�POINTER ‰CMP.W�#7,D2 ‰BCS.S�BITL ‰BHI.S�BITH*ˆEQUAL BITE…EQU�*‰MOVE.B�#$FF,(A0)‰BRA.S�DOSATEX…EXIT *ˆLESS�THEN�7 BITL…EQU�*‰LEA�BIT1(PC),A1…INIT�TABLE BITM…EQU�*‰MOVE.B�0(A1,D2),D2‚GET�BITS‰MOVE.B�D2,(A0)!DOSATEX‚BSR�IOSWRITE„WRITE�SECTOR‰RTS***/************************************************&*ˆGREATER�THAN�7�-�1ST�BYTE�PROCESSING*.**********************************************BITH: ‰SUB.W�#7,D2 BITH1„MOVE.B�#$FF,(A0)+ ‰CMP.W�#8,D2‰BEQ�BITEˆEQUAL ‰BHI.S�BIT8H******************* *ˆLESS�THEN�8*******************‰LEA�BIT2(PC),A1 ‰BRA�BITM**********************ˆGREATER�THAN�8*********************BIT8H„SUB.W�#8,D2 ‰BRA�BITH1‰PAGE **********************************„HELP�OPTION�-�ADDED�071184* ********************************!LISTH„CLR.L�D1ŒCLEAR�LINE�COUNTER7‰ADDQ.B�#1,D1ˆINCREMENT�FOR�UTILITY�IDENTIFICATION�LINE&‰LEA�HELPMSG-1(PC),A1„START�OF�MESSAGE%‰LEA�HELPLEN(PC),A2†LINE�LENGTH�TABLE.PLINE„ADDQ.W�#1,A1ˆPOINT�TO�START�OF�NEXT�LINE)‰MOVEA.L�A1,A0‡A0�POINTS�TO�MESSAGE�START‰CLR.L�D0ŒCLEAR�LENGTH�REGISTER‰MOVE.B�(A2)+,D0…GET�LENGTH‰TST.L�D0ŒCHECK�FOR�ZERO�LENGTH-‰BEQ.S�HELPEXIT†END�OF�MESSAGE�-�EXIT�PROGRAM)‰ADDA.W�D0,A1ˆA1�POINTS�TO�END�OF�MESSAGE‰BSR.S�SENDMSG‰PRINT�THE�LINE"‰ADDQ.B�#1,D1ˆINCREMENT�LINE�COUNT!‰CMP.B�#23,D1ˆCHECK�FOR�FULL�PAGE‰BLT�PLINE‹NO�-�PRINT�NEXT�LINE#‰MOVEM.L�A1,-(A7)„SAVE�LINE�POINTER7‰LEA�QUERYS(PC),A0‡START�OF�'�FOR�NEXT�PAGE'�PROMPT ‰LEA�QUERYE(PC),A1‡END�OF�PROMPT‰BSR.S�SENDMSGIˆSEND�MESSAGE#‰IOSCALL�INP4IOS(PC)…GET�THE�ANSWER‰BNE�FATALERRˆ* ‰BSR�SBARG‹*‰BNE�FATALERRˆ*)‰CMP.B�#'N',RETRYB-PBA(A4)�CHECK�FOR�EXIT/‰BEQ.S�HELPEXIT�ABORT�LISTING�AND�LEAVE�ROUTINE3CLSCR„LEA�CLS(PC),A0ŠBEGINNING�OF�CLEAR�SCREEN�CODE‰MOVEA.L�A0,A1-‰ADDQ�#1,A1ŠPOINT�TO�END�OF�CLEAR�SCREEN�CODE ‰BSR.S�SENDMSGIˆCLEAR�THE�SCREEN&‰MOVEA.L�(A7)+,A1�RESTORE�LINE�POINTER‰CLR.L�D1ŒCLEAR�LINE�COUNT‰BRA�PLINE‹PRINT�NEXT�PAGE7HELPEXIT�BRA�TERMP‹EXIT�PROGRAM�WITH�NORMAL�TERMINATION ‰PAGE8********************************************************+*ˆSEND�MESSAGE�AND�GET�RESPONSE�INTO�RETRYA8********************************************************GETRESP:‰BSR.S�SENDMSGI!‰IOSCALL�INP3IOS(PC)…GET�RESPONSE ‰BNE†FATALERR ‰BSR†SBARG ‰BNE†FATALERR 5‰CMP.B�#'Y',RETRYA-PBA(A4)‚TEST�RESPONSE�AGAINST�'Y'. ‰RTS˜RETURN**&***************************************ˆSEND2 �OUTPUT�TO�LU3&**************************************SENDPRT:0‰MOVE.L�A0,D0’A0‚<--�ADDRESS�OF�IOS�PARAM�BLOCK.6‰LEA�OUT3IOS(PC),A0�D0�&�A1�ARE�MESSAGE�START�AND�END. DSENDCOMN�MOVE.L�D0,IOSSAD(A0)ŠSTUFF�THE�START�AND�END�ADDRESSES�INTO<‰MOVE.L�A1,IOSEAD(A0)ŠTHE�IOS�PARAM�BLOCK,�SEND�THE�MESSAGE,‰IOSCALL�(A0)’AND�RETURN.‰BNE…FATALERRŽ*‰RTS›**(*****************************************ˆSEND�MSG�TO�LU6'***************************************SENDMSG: ‰MOVE.L�A0,D0‰LEA�OUT6IOS(PC),A0 ‰BRA�SENDCOMN*-*********************************************"*ˆMESSAGE�OUTPUT�WITH�IMAGE�OPTION-********************************************** SENDMSGI: ‰MOVE.L�A0,D0‰LEA�OUT6IIOS(PC),A0 ‰BRA�SENDCOMN‰PAGE6********************************************************ˆNONSTANDARD�ERROR�MESSAGES*6****************************************************** *“FILE�NOT�FOUND�MSGNOTFNDƒLEA�RESTNF(PC),A0‰LEA�RESTNFE(PC),A1 ‰BRA.S�ERCALL*)*’USER�#�&�CATALOG�NOT�ALLOWED�WITH�UBCVTUSNCATER LEA USNCAT(PC),A0‰LEA�USNCATE(PC),A1 ‰BRA.S�ERCALL**’MUST�USE�A�OPTIONLSIZERR‚LEA�BIGMSG(PC),A0‰LEA�BIGMSGE(PC),A1 ‰BRA.S�ERCALL**’USE�INIT,�THEN�OPTION�AHARDRERR LEA HARDRM(PC),A0‰LEA�HARDRME(PC),A1 ‰BRA.S�ERCALL*-*’INPUT�DISK�FOREIGN�&�OUTPUT�DISK�LARGER�MSGFORLGERR LEA FORLMSG(PC),A0‰LEA�FORLMSGE(PC),A1 ‰BRA.S�ERCALL*$*’A�OR�R�TYPE�COPY�WITH�FOREIGN�DISKFILFRERR LEA FILFRMG(PC),A0‰LEA�FILFRMGE(PC),A1 ‰BRA.S�ERCALL**’SIZE�OF�DISK�TOO�SMALL�ERRORSIZERRƒLEA�SIZERM(PC),A0‰LEA�SIZERME(PC),A1**6*******************************************************)*ˆPRINT�NONSTANDARD�ERROR�MESSAGE�AND�DIE*6*******************************************************ERCALL: )‰BSR�SENDMSG“SEND�THE�MESSAGE�TO�LU�6�AND0‰ERQ.TERM‚#0,#$C000‹TERMINATE�WITH�ERROR�STATUS.‰PAGEJ***************************************************************************+*ˆERROR�MESSAGES�FROM�ERROR�MESSAGE�HANDLER*J***************************************************************************INVAL:7‰MOVE.L„#EM_NVE,D0Š'INVALID�ENTRY'�MESSAGE,�BUT�RETURN!‰BSR.S…C_EM_PGM‰RTS* ERDEVICE:8‰MOVE.L„#EM_NVDEV,D0ˆ'INVALID�DEVICE�FOR�REQUEST'�ERROR.‰BRA.S…FATALERR* EROPTINV:*‰MOVE.L„#EM_NVO,D0Š'INVALID�OPTION'�ERROR.‰BRA.S…FATALERR* EROPTCON:-‰MOVE.L„#EM_OPTCF,D0ˆ'OPTION�CONFLICT'�ERROR.‰BRA.S…FATALERR*ERINVAL:)‰MOVE.L„#EM_NVE,D0Š'INVALID�ENTRY'�ERROR.***J***************************************************************************2*ˆROUTINE�TO�CALL�ERROR�MESSAGE�HANDLER,�THEN�DIE.*J*************************************************************************** FATALERR:‰BSR.S…C_EM_PGM2ERREXIT‚ERQ.TERM‚#0,#$C000‹EXIT�WITH�ERROR�STATUS.***M****************************************************************************** *’CALL�TO�ERROR�MESSAGE�HANDLER.*’OUTPUT�GOES�TO�LU�6.**ˆCALL†BSR‡C_EM_PGM*A*ˆINPUTS„D0�AND�A0�SET�BY�IOS�OR�FHS�CALL,�OR�D0�FOR�NON�IOS/FHS.*"*ˆOUTPUTSƒNO�REGISTER�PRESERVATION*N******************************************************************************* C_EM_PGM:C‰MOVEM.LƒD0/A0,EM_PBLK-PBA(A4)ƒSAVE�D0,A0�IN�ERROR�MSG�PARAM�BLOCK.4‰LEA‡EM_PBLK(PC),A0ŽPOINT�A0�TO�THE�PARAMETER�BLOCK.:‰MOVE.B„#6,EM_TLUN-EM_PBLK(A0)‚SET�THE�LU�FOR�OUTPUT�TO�6. ‰MOVE.L„#2,D0‰TRAP†#4@‰MOVEM.LƒEM_PBLK-PBA(A4),D0/A0ƒRESTORE�ERROR�CODE‚***�071184�***‰RTS‰PAGE-*********************************************$*ˆBINARY�TO�DECIMAL�ASCII�SUBROUTINE*�REV�1.00‚3/27.79�GAT*�**�16�BIT�BINARY�INPUT�**4****************************************************6*ˆCONVERTS�BINARY�QUANTITY�IN�D0�TO�ASCII�STRING�WHICH *ˆIS�DEPOSITED�AT�LOCATION�(A0)+**ˆCALLING�SEQUENCE:'*‹LOAD�D0�WITH�QUANTITY�TO�BE�CONVERTED.*‹LOAD�A0�WITH�ADDRESS�TO�DEPOSIT�ASCII�STRING *‹JSR�BINDEC*!*ˆREGISTERS�USED:�0�1�2�3�4�5�6�7*“D„*�* *“A„*�*�***ˆA1�POINTS�AT�BINARY�TABLE*ˆA2�POINTS�AT�ASCII�TABLE*ˆD1�IS�2 WORK�REGISTER*@**************************************************************** BINEQS‚DC.W�0,1,10,100,1000)BINASCB‚DC.B�'0123456789ABCDEF'…HEX�TABLE BINDEC: 0‰MOVEM.L�D0-D1/A0-A2,-(A7)�SAVE�REGISTERS‚011185‰LEA�BINEQS+8(PC),A1‡ADDR�10**5+BINDE1ƒLEA�BINASCB(PC),A2ŠBASE�ADDR�ASCII�0#BINDE2ƒSUB.W�(A1),D0ŠSUBTRACT�10**N‰BCS.S�BINDE3�BRANCH�OVERBORROW&‰ADD.L�#1,A2ŒINCREMENT�NEXT�ASCII�CHAR‰BRA�BINDE2�CONTINUE'BINDE3ƒADD.W�(A1),D0ŠRESTORE�OVERBORROW!‰MOVE.B�(A2),(A0)+†PUT�ASCII�CHAR‰MOVE.W�-(A1),D1ˆTEST�DONE‰BNE�BINDE1�BRANCH�NOT�DONE3‰MOVEM.L�(A7)+,D0-D1/A0-A2‚RESTORE�REGISTERS‚011185‰RTS‰PAGEG**************************************************************************�***�CONVERT�32-BIT�WORD�TO�HEX�ASCII�****6*ˆRIGHT�JUSTIFIES�THE�VALUE�AND�DOES�BLANK�FILL�ON�THE0*ˆLEFT�(EXCEPT�THAT�0�CONVERTS�TO�A�SINGLE�'0').* *ˆON�CALL:-*ŠD0.L‚<--‚VALUE�TO�BE�CONVERTED�TO�HEX�ASCII$*ŠD1.L‚<--‚LENGTH�OF�RECEIVING�FIELD6*ŠA0.L‚<--‚ADDRESS�OF�LEFTMOST�BYTE�OF�RECEIVING�FIELD*!*ˆREGISTER�USAGE:‡0‚1‚2‚3‚4‚5‚6‚7 *›D‚*‚*…* *›A‚*‚*‚*‚*‚**G*********************************************************************** BINHEX: 0‰MOVEM.L�D0-D3/A0-A4,-(A7)…SAVE�REGISTERS‚011185/‰ADD.L�D1,A0“A0‚<--‚ADDRESS�OF�BYTE�PAST�FIELD.0‰LEA�BINASCB(PC),A1�A1‚<--‚ADDRESS�OF�HEX�TABLE. ,‰SUB.B�#1,D1“DECREMENT�D1�FOR�USE�WITH�DBEQ. 8BINHEX1‚MOVE.B�D0,D3’ISOLATE�THE�LOW�4�BITS�OF�D0�IN�D3.-‰AND.W�#$0F,D3‘(WE'RE�WORKING�RIGHT�TO�LEFT.) <‰MOVE.B�0(A1,D3),-(A0)‰MOVE�THE�CORRESPONDING�CHARACTER�FROM*§THE�TABLE�TO�THE�FIELD. 3‰ASR.L�#4,D0“MOVE�NEXT�BYTE�INTO�POSITION.‚IF�THERE5‰DBEQ�D1,BINHEX1�IS�SOMETHING�LEFT�IN�D0�AND�THERE�IS *§FIELD�SPACE�REMAINING,�REPEAT. 3‰SUB.B�#1,D1“IF�THERE�IS�ANY�FIELD�SPACE�REMAINING,$‰IF‚‚THEN.SŽFILL�IT�WITH�SPACES.BINHEX2„MOVE.B�#'�',-(A0)‹*‹DBF�D1,BINHEX2Ž*‰ENDIš*3‰MOVEM.L�(A7)+,D0-D3/A0-A4…RESTORE�REGISTERSƒ011185 ‰RTS›RETURN   C***********************************************************<<011585*$*‘***�LEFT�JUSTIFICATION�OF�DATA�****3*ˆSEARCHES�FIELD�IDENTIFIED�BY�A0�AND�D1�FOR�BLANKS/*ˆOR�ZEROES�AND�DELETES�ALL,�SAVE�THE�LAST�ONE.* *ˆON�CALL:*ŠD1.L‚<--‚LENGTH�OF�FIELD,*ŠA0.L‚<--‚ADDRESS�OF�LEFTMOST�BYTE�OF�FIELD*!*ˆREGISTER�USAGE:‡0‚1‚2‚3‚4‚5‚6‚7 *›D‚*‚*…* *›A‚*…*‚*‚**@**************************************************************** LEFTJ: &‰MOVEM.L�D3/A1-A4,-(A7)ˆSAVE�REGISTERS)‰MOVE.L�D1,D3’LEFT�JUSTIFY�AND�BLANK�FILL‰LEA„-1(A0,D1),A4#LJH0…CMP.B‚#$30,(A0)ŽLEADING�ZERO�?‰BEQ.S‚LJH00”YES,�REMOVE ‰CMP.B‚#'�',(A0)ŽLEADING�BLANK�?‰BNE.S‚LJH5•NO,�DATALJH00„SUB.L‚#1,D3 ‰BEQ.S‚LJH4 ‰MOVE.L�A0,A2 ‰LEA„1(A2),A3LJH1…MOVE.B�(A3)+,(A2)+ ‰CMP.L‚A4,A3 ‰BLS.S‚LJH1‰MOVE.B�#'�',-1(A0,D1) ‰BRA.S‚LJH0LJH4…MOVE.B�#'0',(A0)-LJH5…MOVEM.L�(A7)+,D3/A1-A4ˆRESTORE�REGISTERS ‰RTS›011185>>‰PAGE+*********************************************ˆBUILD�TEST�PATTERN�IN�VID*+******************************************* TESTPAT: 1‰LEA�DIAGPAT1(PC),A0…A0�<--�START�OF�TEST�PATTERNB‰MOVE.L�BUF1SAD-PBA(A4),A1ƒA1�<--�LOCATION�FOR�TEST�PATTERN�IN�VID‰LEA�VIDDTP(A1),A18‰MOVE.B�#15,D0‡D0�<--�LENGTH�OF�PATTERN�IN�LONGWORDS�-�1 FTESTPATL�MOVE.L�(A0)+,(A1)+‚MOVE�THE�TEST�PATTERN�IN�16�4-BYTE�CHUNKS.‰DBF�D0,TESTPATL…* ‰RTS‘RETURN�FROM�TESTPAT‰PAGE/*************************************************ˆCALCULATE�CHECKSUM�PROCESSING*0************************************************* CHECKSUM:-*œIF�THE�INPUT�DISK�IS�FOREIGN,�WE�DON'T�WANT*œTO�CALCULATE�A�CHECKSUM!!*6‰TST.B�INFORN-PBA(A4)‚IF�INPUT�DISK�IS�NOT�FOREIGN,...‰IF‚‚THEN.S*@‰MOVE.L�BUF1SAD-PBA(A4),A0ƒA0�<--�STARTING�ADDRESS�OF�VID�BUFFER8‰LEA�SECLEN-1(A0),A1�A1�<--�ENDINGƒADDRESS�OF�VID�BUFFER‰CLR.W�VIDCHK(A0)„ZERO�CHECKSUM‰MOVE.L�#$FFFFFFFF,D0CHECK1ƒMOVE.B�(A0)+,D1 ‰EOR.B‚D1,D0‰SWAPƒD0‰MOVE.B‚(A0)+,D1 ‰EOR.B‚D1,D0‰SWAP‚D0‰CMP.L‚A1,A0ˆFIN�ALL�BYTES?‰BLS.S‚CHECK1‡NO3 ,‰MOVE.L�BUF1SAD-PBA(A4),A0ƒYES�SAVE�CHECKSUM‰MOVE.B‚D0,VIDCHK(A0)‰SWAP‚D0‰MOVE.B‚D0,VIDCHK+1(A0)*‰ENDI*‰RTS‰PAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º1/24/84**ˆThe�following�routine>*�will�force�FHS�to�recognize�that�a�new�volume�has�been�input?*�into�the�system.�This�became�necessary�because�a�product�likeC*�the�VMES10�which�has�only�one�floppy�disk�drive�does�not�generate<*�an�interrupt�when�the�floppy�diskette�is�removed�and�a�new?*�one�is�inserted.�The�user�currently�has�to�use�the�MT�and�DMT<*�utility�to�change�diskettes.�This�becomes�a�problem�on�the>*�VMES10�since�there�is�only�one�terminal�and�it�is�being�used@*�potentially�interactively�thus�denying�the�user�the�capability"*�to�use�the�MT�and�DMT�utilities.*E*ˆThus�the�user�who�wants�to�BACKUP�his�hard�disk�to�the�floppy�mediaA*ˆhas�a�problem�when�the�hard�disk�contains�more�data�than�can�be'*ˆaccomodated�on�a�single�floppy�media.*D*ˆTo�eleminate�this�problem�this�routine�will�perform�the�following:=*�Assign�the�volume�in�the�floppy�media�using�the�last�volume*’name�that�FHS�does�recognize-*�Perform�a�Random�Record�read‚on�sector�zero.*�Perform�a�Random�Record�write�on�sector�zero*�Close�the�volume�assignment?*ˆThe�above�sequence�of�events�will�force�FHS�to�recognize�thatA*ˆa�new�volume�assignment�now�exist�in�the�system,�the�new�volumeC*ˆthat�the�backup�should�continue�on,�thus�eleminating�the�need�for+*ˆthe�user�to�use�the�MT�and�DMT�utilities.**ˆCall *’BSR‡X10010**ˆInput8*’X10000�-�Contains�the�last�target�volume�recognized�by *›the�system(*’A4…-�Contains�the�program�base�address**ˆOutput*’N/A**ˆRegister�alteration*’D0�-�Destroyed**ˆCondition�Codes(*’Non-zero�-�Error�condition�encountered*–Zero�-�Successful�completionI*----------------- It should be noted that even though error detection isK*----------------- performed in the routine and the error value is returnedI*----------------- in register D0 the user CANNOT go to the error messageL*----------------- handler to output the message because the parameter blockK*----------------- has been restored to its original value. If this becomesD*----------------- necessary it will become necessary to install theO*----------------- appropriate parameter blocks and modify the code accordingly*-----------------*X10000: ‰DC.B�'„')*œLast�target�volume�recognized�by�systemX10001:‚DC.L†0*œReserved�for�error�returnX10010:‰MOVEM.LƒA0-A1,-(A7)*œSave�registersX10100: ‰BSR‡X10600&*œSave�OUTFHS�parameter�block�on�stack‰MOVE.W„#FHASGN,FHSCMD(A0)‰MOVE.L„#'„',D0‰MOVE.L„D0,FHSCLG(A0)‰MOVE.L„D0,FHSCLG+4(A0)‰MOVE.L„D0,FHSFIL(A0)‰MOVE.L„D0,FHSFIL+4(A0)‰MOVE.W„D0,FHSEXT(A0)*œInitialize�respectively*�code/cmd�-�assign *�catalogue *�file�name *�extension!‰MOVE.L„X10000-PBA(A4),FHSVOL(A0)*œSet�the�volume�name�to�assign‰MOVE.W„#FOPEREW,FHSOPT(A0)*œSet�the�assign�options *�Public�read*�Public�write ‰FHSCALLƒ(A0).*œAssign�the�volume�using�the�last�volume�name*œrecognized�by�the�system ‰BEQ.S…X10200*œJump�if�successful‰CMP.B…#FSTAVOL,D0 ‰BEQ.S…X10400**œJump�if�the�volume�to�be�assigned�is�not-*œfound.�Probably�means�we�have�hardware�that**œgenerates�an�interrupt�which�has�already,*œcaused�FHS�to�recognize�that�we�have�a�new *œvolume. ‰BRA‡X11200X10200: ‰BSR.S…X10800'*œSave�WDSKIOS�parameter�block�on�stack‰MOVE.W„#IOREAD,IOSFCT(A0)(‰MOVE.W„#IOPRAN+IOPBLK+IOPIMG,IOSOPT(A0)‰CLR.L…IOSRRN(A0)$*œThe�following�has�been�established*�cmd/function�-�read *�options*žrandom�record�read *žblock�i/o*žimage�format*�random�record�to�read‰MOVE.L„BUF1SAD-PBA(A4),A1‰MOVE.L„A1,IOSSAD(A0)‰ADD.L…#SECLEN-1,A1‰MOVE.L„A1,IOSEAD(A0)2*œEstablish�the�start�and�end�address�for�the�read‰IOSCALLƒWDSKIOS(PC)*œRead�sector�zero ‰BNE.S…X11400*œBranch�if�error�encountered‰MOVE.W„#IOWRIT,IOSFCT(A0)*œEstablish�the*�cmd/3 function�-�write‰IOSCALLƒWDSKIOS(PC)*œWrite�sector�zero�back�out ‰BNE.S…X11400*œBranch�if�error�encounteredX10300: ‰BSR.S…X10900!*œRestore�WDSKIOS�parameter�block ‰BSR‡CLOSOUT*œClose�the�volume�assignmentX10400:‰CLR.L…X10001-PBA(A4)*œForce�a�good�return ‰BSR.S…X11100 *œRestore�OUTFHS�parameter�blockX10500:‰MOVEM.Lƒ(A7)+,A0-A1*œRestore�registers‰MOVE.L„X10001-PBA(A4),D0*œSet�return�conditions‰RTS*X10600:‰MOVE.L„(A7)+,A1*œSave�return�address‰LEA‡OUTFHS+OUTFHSSZ-PBA(A4),A0*œA0�=�Address�move�from‰MOVE.B„#(OUTFHSSZ/2),D0*œD0�=�Number�of�words�to�moveX10700:‰MOVE.W„-(A0),-(A7) ‰SUB.B…#1,D0 ‰BNE.S…X10700*œSave�parameter�block�on�stack‰MOVE.L„A1,-(A7)*œRestore�return�address‰RTSX10800:‰MOVE.L„(A7)+,A1*œSave�return�address‰LEA‡WDSKIOS+WDSKSZ-PBA(A4),A0*œA0�=�Address�to�move�from‰MOVE.B„#(WDSKSZ/2),D0*œD0�=�Number�of�words�to�move ‰BRA.S…X10700*œRestore�parameter�blockX10900:‰MOVE.L„(A7)+,A1*œSave�return�address‰MOVE.B„#(WDSKSZ/2),D0‰LEA‡WDSKIOS(PC),A0*œD0�=�Number�of�words�to�move*œA0�=�Address�move�toX11000:‰MOVE.W„(A7)+,(A0)+ ‰SUB.B…#1,D0 ‰BNE.S…X11000*œRestore�parameter�block‰MOVE.L„A1,-(A7)*œRestore�return�address‰RTSX11100:‰MOVE.L„(A7)+,A1*œSave�return�address‰LEA‡OUTFHS-PBA(A4),A0*œA0�=�Address�to�move�to‰MOVE.B„#(OUTFHSSZ/2),D0*œD0�=�Number�of�words�to�move ‰BRA.S…X11000X11200:‰MOVE.L„D0,X10001-PBA(A4)*œSave�error�code�to�returnX11300: ‰BSR.S…X11100 *œRestore�OUTFHS�parameter�block ‰BRA.S…X10500X11400:‰MOVE.L„D0,X10001-PBA(A4)*œSave�error�code�to�return ‰BSR.S…X10900!*œRestore�WDSKIOS�parameter�block ‰BRA.S…X11300 *º1/24/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ‰END�BEGPROCééééé=/* =/*†BREAK.AF=/*G=/* Chain file to assemble BREAK which is an associated support program=/* for the TRANSFER utility=/*:=/* If no output argument is specified for the listing the'=/* chain file will default to BREAK.LS=/*=/IFC \1ƒ=ARG�BREAK.LS=/ENDIF=/* =ASM BREAK.SA,BREAK.RO,\1;RZ=106=/*{ Included files are:=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.TR1.EQ=/*}=/*=ENDé4 éééééu=/* =/*†BREAK.LF=/*&=/* Link chain file to create BREAK.LO=/*:=/* If no output argument is specified for the listing the'=/* chain file will default to BREAK.LL=/*=/IFC \1ƒ=ARG�BREAK.LL=/ENDIF=/*=LINK ,BREAK.LO,\1;HAMIXATTRIBUTES S PSEG SEG0:0,14 $0INPUT BREAK.ROLIB 0.&.UTILIB.ROEND=/*=ENDéééééé~BREAK„IDNT†04,00…BREAK�UTILITY<*************************************************************�BREAKER�FAKER�PROGRAM�-¢**º**ˆREVISION�HISTORY„122084˜**º***’THE�CODE�WAS�MADE�POSITION�INDEPENDENT‚*&*’BY�REVISING�ALL�LEA�INSTRUCTION�TO†**’LO4 AD�OFF�THE�PC.˜**º* *‚THIS�PROGRAM�GETS�AROUND�THEœ*8*‚PROBLEM�OF�NOT�BEING�ABLE�TO�SEND�A�BREAK�THROUGH�AN„*/*‚MCCM�PORT.‚THE�PROGRAM�WILL�QUEUE�TO�EET�ANŒ*7*‚ATTENTION�EVENT�INDICATING�A�BREAK�ON�THE�INDICATED…*0*‚PORT.‚THE�PROGRAM�THEN�TERMINATES.‚THIS�WILLŠ*8*‚'FAKE'�THE�SYSTEM�OUT�TO�THINK�THAT�A�BREAK�ACTUALLY„*:*‚OCCURRED�ON�THE�PORT.‚TO�EFFECT�TRANSPARENT�MODE,�THIS�*9*‚PROGRAM�MUST�BE�MANUALLY�STARTED�ON�THE�HOST�EXORMACSƒ**‚UNDER�USER�NUMBER�0.¤*9*‚THE�TRANSFER�PROGRAM�MAY�THEN�BE�STARTED�ON�THE�OTHERƒ*6*‚SYSTEM.‚NOTE�THAT�WHEN�LINKING�THIS�PROGRAM,‚IT�IS„*8*‚NECESSARY�TO�SET�THE�SYSTEM�ATTRIBUTES�OPTION�IN�THE„*7*‚LOADER�INFORMATION�BLOCK.‚THIS�CAN�BE�DONE�BY�SPEC-„*2*‚IFYING�THE�'ATTRIBUTES�S'�OPTION�WHEN�LINKING.Š**º* *‚SYNTAX:±**‰BREAK�<#CNXX>¤**º*9*‚#CNXX�IS�THE�DEVICE�MNEMONIC�FOR�THE�PORT�WHICH�IS�TOƒ*9*‚FAKE�THE�BREAK.‚A�DEFAULT�PORT�MNEMONIC�IS�USED�IF�NO‚*$*‚EXPLICIT�PORT�NUMBER�IS�ENTERED.˜*<**************************************************************ŠXREFƒPARSE,EDITFILE*‰INCLUDE�9995.&.IOE.EQ*‰INCLUDE�9995.&.TR1.EQŠNOLISTŠINCLUDE�9995.&.IOE.EQŠINCLUDE�9995.&.TR1.EQŠLIST ŠSECTION�0D‰EQU„*’BASE�OF�SEGMENTŠDC.Bƒ'122084�4'(DEFPORTƒEQU„'CN20'�DEFAULT�PORT�MNEMONICŠDS.Lƒ40 STACK…EQU„*!INITREGS‚EQU„*’SAVE�FOR�REGISTERSŠDS.Lƒ1 SESNUM„DS.Lƒ1ŠDS.Lƒ1USERNUMƒDS.Lƒ1 CATNAM„DS.Lƒ1ŠDS.Lƒ1ŠDS.Lƒ1ŠDS.Lƒ1+PARSAREG‚DS.Lƒ2’SAVE�FOR�A-REGS�AFTER�PARSE*QE1‡EQU„*’EVENT�PARAMETER�BLOCK"ŠDC.Bƒ'&EET'�TASK�TO�RECEIVE�EVENTŠDC.Lƒ2’SESSION�CODE-ŠDC.Wƒ0’OPTIONS�(NO�ALTERNATE�SERVICE�VECTOR)2ATTNPT„DC.Lƒ0’POINTER�TO�ATTENTION�EVENT�(DYNAMIC)*ATTN†EQU„*’ATTENTION�EVENTŠDC.Bƒ8’LENGTH ŠDC.Bƒ6’CODE‡C�K˜/9ATTNDEVƒDC.LƒDEFPORTŒDEVICE�NUMBER�DYNAMICALLY�STUCK�HEREŠDC.Wƒ0ŠDC.Lƒ0 CLGH†EQU„$A0CLINE…COMLINE�CLGH*$* FHS PARAMETER BLOCK TO ASSIGN PORT FHS1†EQU„*ŠDC.Wƒ$40�ASSIGN�(OPEN)ŠDC.Wƒ0’PUBLIC�READŠDC.Bƒ0’STATUS ŠDC.Bƒ1’PORT�LOGICAL�UNIT�NUMBERŠDC.Bƒ'„'�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*'* ERROR MESSAGE HANDLER PARAMETER BLOCK*4ERRPBLKƒDC.Lƒ0’USER�REG�D0�CONTAINS�ERRMSG�KEY�VALUE-ŠDC.Lƒ0’USER�REG�A0�POINTS�AT�I/O�CONTROL�BLK,ŠDC.Bƒ0’ERROR�OPTIONS�[BIT�0=QUERY�RESPONSE]'ŠDC.BƒLDFLUN�USER�LDFLUN�LUN�FOR�SCREENŠDC.Bƒ0’QUERY�RETURN�CHARACTER%ŠDC.BƒCDFLUN�USER�CDFLUN�FOR�KEYBOARD(ŠDC.Lƒ0’BEGINNING�OF�USER�TEXT�PLUG�POOL"ŠDC.Lƒ0’END�OF�USER�TEXT�PLUG�POOL* * I/O BUFFER BUFF†DS.Bƒ1 BUFFE…EQU„*-1ŠDS…0* BREAK…EQU„** * INITIALIZE#ŠLEA„STACK(PC),A7‡SET�STACK�POINTER%ŠLEA„D(PC),A6‹USE�A6�AS�BASE�REGISTER4ŠMOVEM.L�D0-D7,INITREGS-D(A6)�SAVE�INITIAL�REGISTERSŠLEA„ATTN-D(A6),A06ŠMOVE.L�A0,ATTNPT-D(A6)„SET�POINTER�TO�ATTENTION�EVENT** PARSE THE COMMAND LINE(ŠLEA„CLINE-D(A6),A0…COMMAND�LINE�ADDRESS ŠBSR„PARSE ŠTST.L‚D00ŠBPL.S‚CMLOK1�BRANCH�IF�NO�ERROR�ON�COMMAND�LINE4CLERR…MOVE.L�#EM_NVE,D0‰COMPLAIN�OF�BAD�COMMAND�LINE ŠBSR.S‚ERRMSG ŠBRA„BREAKX*6* FILL IN DEVICE MNEMONIC FOR ATTENTION EVENT ON BREAK?CMLOK1„MOVEM.L�A1-A2,PARSAREG-D(A6)�SAVE�RETURN�REGS�FROM�PARSEŠSWAPƒD0(ŠCMP.B‚#$40,D0ŒWAS�THERE�AN�INPUT�FIELD?0ŠBEQ.S‚CMLOK2�BRANCH�IF�NO�-�MNEMONIC�ALREADY�IN(ŠLEA„CLINE-D(A6),A0…COMMAND�LINE�ADDRESS<ŠLEA„(ATTNDEV-6)-D(A6),A6�SET�A6�SO�ARNOLD�WILL�FILL�IN�P.B. ŠBSR„EDITFILE'ŠBPL.S‚CMLCK2�BRANCH�IF�NO�SYSTAX�ERROR ŠLEA„D(PC),A6*ŠBRA.S‚CLERRŽBRANCH�FOR�COMMAND�LINE�ERRORCMLCK2„LEA„D(PC),A6‹REBASE�A6#ŠBTSTƒ#1,D0ŽWAS�A�DEVICE�SPECIFIED?!ŠBEQ.S‚CLERRŽBRANCH�IF�NO�-�ERRORCMLOK2„LEA„D(PC),A6‹REBASE�A6 ** NOW ASSIGN THE PORT5 2ŠMOVE.L�ATTNDEV-D(A6),FHS1+6-D(A6)ŠDEVICE�MNEMONIC1ŠMOVE.W�USERNUM+2-D(A6),FHS1+$A-D(A6)‡USER�NUMBER1ŠMOVE.L�CATNAM-D(A6),FHS1+$C-D(A6)ŠCATALOGUE�NAME9ŠMOVE.L�CATNAM+4-D(A6),FHS1+$C+4-D(A6)†2ND�HALF�CAT.�NAMEŠLEA„FHS1-D(A6),A0ŠTRAPƒ#3 ŠBEQ.S‚ASGOKŽBRANCH�IF�ASSIGN�OK$ŠBSR.S‚ERRMSG�COMPLAIN�ON�BAD�ASSIGN ŠBRA.S‚BREAKX ASGOK…EQU„**&* NOW FREE UP THE PORT FOR &EET TO USEŠLEA„FHS1-D(A6),A0"ŠMOVE.W�#$0004,(A0)ˆCLOSE�FUNCTIONŠTRAPƒ#3*!* NOW QUEUE A BREAK EVENT TO &EET-ŠLEA„ATTN-D(A6),A0†ADDRESS�OF�ATTENTION�EVENT7ŠMOVE.L�A0,ATTNPT-D(A6)„MOVE�TO�Q-EVENT�PARAMETER�BLOCK4ŠLEA„QE1-D(A6),A0‡ADDRESS�OF�Q-EVENT�PARAMETER�BLOCKŠMOVE.L�#QEVNT,D0ŠTRAPƒ#1‘QUEUE�A�BREAK�TO�&EET)ŠBEQ.S‚BRTERM�BRANCH�IF�EVENT�QUEUEING�OK ŠBSR.S‚ERRMSG ŠBRA.S‚BREAKX%*************************************)* SUBROUTINE TO USE ERROR MESSAGE HANDLER*ƒD0�-�MESSAGE�CODE'*ƒA0�-�POINTS�TO�PARAMETER�BLOCK�IF�ANY* ERRMSG„EQU„*ŠMOVEM.L�D0/A0,ERRPBLK-D(A6)ŠMOVE.W�SR,-(A7) ŠMOVE.L�#2,D0ŠLEA„ERRPBLK-D(A6),A0ŠTRAPƒ#4ŠMOVE.W�(A7)+,CCRŠMOVEM.L�ERRPBLK-D(A6),D0/A0ŠRTS** NOW TERMINATEBRTERM„ERQ.TERM** ABORTBREAKX„ERQ.TERM�#0,#$C000* ŠEND„BREAKééé=/* =/*†BUILDS.LF=/*'=/* Link chain file to create BUILDS.LO=/*:=/* If no output argument is specified for the listing the(=/* chain file will default to BUILDS.LL=/*=/IFC \1ƒ=ARG�BUILDS.LL=/ENDIF=/*=LINK ,BUILDS.LO,\1;AHMIXSEG SEG0:0-14 $0 SEG SEG2:15 ATTRIBUTES PINPUT BUILDS.ROIN„BUILDS.DEFAULT.ROIN„BUILDS.SETDIAG.ROIN„BUILDS.FORCE.ROIN„BUILDS.FILENAME.ROINPUT BUILDS.LOOKUP.ROLIB 0.&.PASVMDOS.ROLIB 0.&.PASCALIB.ROEND=/*=ENDéééééé5  =/* =/*†BUILDS.PF=/*I=/* Chain file to compile BUILDS utility and assemble associated routines=/*:=/* If no output argument is specified for the listing the(=/* chain file will default to BUILDS.LS=/*@=/*†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.=/*=/IFC \1ƒ=ARG�BUILDS.LS=/ENDIF=/*$=PASCAL BUILDS.SA,BUILDS.PC,TEMP1.LS=/*{ Included files are:=/*ƒ--�none�--=/*}=/*=PASCAL2 BUILDS.PC,BUILDS.ROƒ=COPY�TEMP1.LS,TEMP2.LS;Y=/*3=ASM BUILDS.DEFAULT.SA,BUILDS.DEFAULT.RO,TEMP1.LS;R=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*3=ASM BUILDS.SETDIAG.SA,BUILDS.SETDIAG.RO,TEMP1.LS;R=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*/=ASM BUILDS.FORCE.SA,BUILDS.FORCE.RO,TEMP1.LS;R=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*5=ASM BUILDS.FILENAME.SA,BUILDS.FILENAME.RO,TEMP1.LS;R=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*1=ASM BUILDS.LOOKUP.SA,BUILDS.LOOKUP.RO,TEMP1.LS;R=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;Aƒ=COPY�TEMP2.LS,\1;Yƒ=DEL�TEMP1.LS;Yƒ=DEL�TEMP2.LS;Y=/*=ENDéé©?1PROGRAM�BUILDS(INPUT,OUTPUT,LOADMODULE,SRECORD);˜ H{‚**********************************************************************ƒ***ƒB�U�I�L�D�S�.�L�O¬***Dƒ***ƒVERSAdos�utility�to�take�a�load�module�and�create�a�file�of‚***3ƒ***ƒS-records�containing�the�same�information.“***ƒ***…Calling�sequence:ª***.ƒ***ƒBUILDS�[,]˜***?ƒ***…where�loadmodule�has�default�extension�.LO,�but�may�be…***Cƒ***…either�.LO�or�.SY,�and�S-record�file�has�default�extension�*** ƒ***….MX.·***Gƒ********************************************************************** ƒREVISION�HISTORY:%‰??/??/??‚Initial�writing�by�Floyd�B..Š2/18/82‚VERSAdos�3.0�release�by�Steve�Franck:1—Fixed�problem�w/�crossover�from�16-bit�to�24-bit šaddresses.+—Put�in�check�for�no�source�file�specified.'—Put�in�check�for�existing�output�file.—et.�al..Š9/01/82‚VERSAdos�4.0�release�by�Steve�Franck:2—Allow�.SY�as�well�as�.LO�extension�on�loadmodule./—Fixed�problem�w/�DO�YOU�WISH�TO�OVERWRITE?�and²·»,¿%Ã;Ç3Ë2Ï0Ó3× /šchain�files�(answer�not�read�in�correctly�fromša�chain�file).#—Added�header�and�revision�history.>‰12/20/84ƒOPT�A�added�to�assembly�routines�and�code�tested�and0—shown�to�be�position�independent.‚Peggy�Hassett }‚CONST „REVISION‚=�'122086 4�4';„S1RECSIZE�=‰32;@„ABORTCFƒ=…-16384;‚{VALUE�TO�PUT�IN�DIAGNOSTIC�REGISTER�TO�ABORTžA�CHAIN�FILE};„NOABORTCF�=Š0;‚{VALUE�TO�PUT�IN�DIAGNOSTIC�REGISTER�TO�NOTžABORT�A�CHAIN�FILE} ‚TYPE%ƒ{$A=2�USE�2-BYTE�INTEGER�ARITHMETIC}…INTEGERƒ=�-32767..32767;…INTEGER2‚=�-32768..32767;…FILENAME‚=�STRING�[30];4…FILESTAT‚=�(FOUND,PROTECT,NOTFOUND,INVALID,UNABLE);(…EXTENSION�=�PACKED�ARRAY[1..2]�OF�CHAR;&…LINT†=�PACKED�ARRAY[1..3]�OF�INTEGER;'…SECTOR„=�PACKED�ARRAY[0..255]�OF�CHAR;…LOADMOD�=�FILE�OF�SECTOR; ‚VAR<…LOADINFOBLOCK‚:�SECTOR;‚(*�1ST�SECTOR�IS�DATA�ABOUT�FILE�*)/…CURRDATASECTOR�:�SECTOR;‚(*�SECTORS�OF�DATA�*)'…LOADMODULE…:�LOADMOD;�(*�INPUT�FILE�*)"…SRECORDˆ:�TEXT;„(*�OUTPUT�FILE�*)/…CURR_ADR‡:�LINT;„(*�CURRENT�POINTER�IN�DATA�*)*…HEXDIGITS†:�PACKED�ARRAY�[0..15]�OF�CHAR;…FNAMEŠ:�FILENAME;…FSTATUSˆ:�FILESTAT;…ANSWER‰:�CHAR;…DONE‹:�BOOLEAN;‚{$E}1{‰*****�EXTERNAL�PROCEDURES�AND�FUNCTIONS�*****‚} APROCEDURE‚P$TDEFAULT(VAR�DEFAULT,RESULT:LOADMOD;EXT�:�EXTENSION); ‹FORWARD; KPROCEDURE‚P$RDEFAULT(VAR�DEFAULT�:�LOADMOD;�VAR�RESULT:TEXT;EXT:EXTENSION); ‹FORWARD; ,PROCEDURE‚P$SETDIAG(VAL�:�INTEGER);�FORWARD; +PROCEDURE‚P$FORCE(VAR�FIL�:�TEXT);�FORWARD; 8FUNCTIONƒP$FNAME(VAR�FIL�:�LOADMOD)�:�FILENAME;�FORWARD; 6FUNCTIONƒP$1FNAME(VAR�FIL�:�TEXT)�:�FILENAME;�FORWARD; :FUNCTIONƒP$LOOKUP(VAR�FIL�:�FILENAME)�:�FILESTAT;�FORWARD;‚{$E}"FUNCTION‚INT(CH�:�CHAR)�:�INTEGER; ƒVAR…VAL�:�INTEGER; ƒBEGIN …VAL�:=�ORD(CH);†IF�VAL�<�0�THEN‰INT�:=�VAL�+�256†ELSE ‰INT�:=�VAL; ƒEND;{$E}9PROCEDURE‚EMITBYTE(DATA�:�INTEGER;�VAR�CHKSUM�:�INTEGER); ƒBEGIN#†CHKSUM�:=�(CHKSUM�+�DATA)�MOD�256;'†WRITE(SRECORD,HEXDIGITS[DATA�DIV�16]);'†WRITE(SRECORD,HEXDIGITS[DATA�MOD�16]); ƒEND;{$E}PROCEDUREƒINIT; …BEGIN ˆDONE�:=�FALSE;1ˆP$SETDIAG(ABORTCF);‚{SET�UP�TO�ABORT�CHAIN�FILE}!ˆHEXDIGITS�:=�'0123456789ABCDEF'; ˆ{�VALIDATE�&�OPEN�INPUT�FILE�}(ˆP$TDEFAULT(LOADMODULE,LOADMODULE,'LO');ˆFNAME�:=�P$FNAME(LOADMODULE);1ˆIF‚(�COPY(FNAME,LENGTH(FNAME)-1,2)�<>�'LO'�)‚AND/Œ(�COPY(FNAME,LENGTH(FNAME)-1,2)�<>�'SY'�)‚THEN‹BEGIN=‹WRITELN('ERROR--INPUT�FILE�MUST�HAVE�EXTENSION�.LO�OR�.SY'); ‹HALT(0);‹END;-ˆIF‚COPY(FNAME,LENGTH(FNAME)-4,2)�=�'.&'‚THEN‹BEGIN/‹WRITELN('ERROR--NO�INPUT�FILE�WAS�SPECIFIED'); ‹HALT(0);‹END;ˆRESET(LOADMODULE); *ˆ{�CHECK�FOR�EXISTING�OUTPUT�FILE�&�OPEN�}%ˆP$RDEFAULT(LOADMODULE,SRECORD,'MX');ˆFNAME�:=�P$1FNAME(SRECORD);ˆFSTATUS�:=�P$LOOKUP(FNAME);1ˆIF‚(FSTATUS�=�FOUND)‚OR‚(FSTATUS�=�PROTECT)‚THEN‹BEGINA‹WRITE('FILE�EXISTS--OK�TO�OVERWRITE�(Y/N)�?�');�P$FORCE(OUTPUT);‹READLN(ANSWER);,‹IF‚(ANSWER�<>�'Y')‚AND‚(ANSWER�<>�'y')‚THENŽDONE�:=�TRUE;‹END;ˆIF‚NOT�DONE‚THEN‹REWRITE(SRECORD); …END;{$E}.„(*‚FUNCTION�TO�MAKE�INTEGER�FROM�TWO�BYTES‚*)8FUNCTION‚MAKEINT(INDEX�:�INTEGER;�VAL�:�SECTOR):INTEGER; „BEGIN 7‡MAKEINT�:=�INT(VAL[INDEX])�*�256�+�INT(VAL[INDEX�+�1]) „END;{$E}4PROCEDURE MAKE_LINT(DATA:INTEGER;VAR RESULT : LINT);ƒTYPE†MAGICREC�=‚RECORD‘CASE�BOOLEAN�OF–TRUE�:�(INTPART�:�INTEGER);–FALSE�:�(CHPART1�:�CHAR;ŸCHPART2�:�CHAR)ŽEND�;ƒ(*‚MAGIC�RECORD‚*)ƒVAR …MAGIC�:�MAGICREC; ‡BEGIN ŠMAGIC.INTPART�:=�DATA;ŠRESULT[3]�:=�0;!ŠRESULT[2]�:=�INT(MAGIC.CHPART1);!ŠRESULT[1]�:=�INT(MAGIC.CHPART2);‡END;{$E}.PROCEDURE‚MULT_LINT_BY_256(VAR�RESULT�:�LINT);‰‡BEGIN‚ ‹RESULT[3]�:=�RESULT[2];‹RESULT[2]�:=�RESULT[1];‹RESULT[1]�:=�0;‡END;{$E}6PROCEDURE‚INC_LINT(VAR�RESULT�:�LINT;�DATA�:�INTEGER); „VAR ŠI�:�0..3; ŠC�:�INTEGER;‡TEMP�:�INTEGER; ‡BEGIN ŠI�:=�0; ŠC�:=�DATA; ŠREPEAT ‘I�:=�I�+�1;ŽTEMP�:=�RESULT[I]�+�C;‘C�:=�TEMP�DIV�256;ŽIF�C�>�0�THEN�•TEMP�:=�TEMP�-�256;ŽRESULT[I]�:=�TEMP ŠUNTIL�(I�=�3)‚OR‚(C�=�0) ‡END;{$E}-PROCEDURE WRITES0REC(LOADINFOBLOCK : SECTOR); „VAR ‹I�:�INTEGER;†CHK6 SUM�:�INTEGER;  ‡BEGIN *ŠCHKSUM�:=�16#07;‚(*�HEX�REPRESENTATION�*)ŠWRITE(SRECORD,'S0070000'); ŠFOR�I�:=�0�TO�3�DO(ŠEMITBYTE(INT(LOADINFOBLOCK[I]),CHKSUM); 2ŠEMITBYTE(255-CHKSUM,CHKSUM);�(*�PUT�OUT�CHKSUM�*) ;ŠWRITELN(SRECORD);‚(*�WRITELN�ACTUALLY�WRITES�THE�RECORD�*)ЇEND;{$E}®DPROCEDURE WRITES2REC(VAR WORKING_ADR : LINT; CURRDATASECTOR:SECTOR); „VAR�INDEX,�CHKSUM�:�INTEGER; †BEGIN >‰WRITE(SRECORD,'S224');‚(*�PUT�OUT�IDENT�&�CARD�SIZE�IN�HEX�*) ‰CHKSUM�:=�36;„(*�INIT�CHKSUM�*) <‰EMITBYTE(WORKING_ADR[3],CHKSUM);‚(*�START�ADDRESS�3�BYTE�*)!‰EMITBYTE(WORKING_ADR[2],CHKSUM);!‰EMITBYTE(WORKING_ADR[1],CHKSUM);  ‰FOR�INDEX�:=�1�TO�256�DO�BEGIN /�EMITBYTE(INT(CURRDATASECTOR[INDEX-1]),CHKSUM); �IF�(INDEX�MOD�S1RECSIZE)�=�0“THEN –BEGIN 2šEMITBYTE(255-CHKSUM,CHKSUM);�(*�PUT�OUT�CHKSUM�*))šWRITELN(SRECORD);‚(*�WRITE�THE�RECORD�*)!šINC_LINT(WORKING_ADR,S1RECSIZE);Ž(*‚INITALIZE�NEXT�RECORD�*)šIF�INDEX�<�256�THEN�BEGINŸWRITE(SRECORD,'S224'); CHKSUM�:=�36;! EMITBYTE(WORKING_ADR[3],CHKSUM);! EMITBYTE(WORKING_ADR[2],CHKSUM);! EMITBYTE(WORKING_ADR[1],CHKSUM);�END –ENDŒEND†END;{$E}FPROCEDURE WRITES1REC(VAR WORKING_ADR : LINT; CURRDATASECTOR : SECTOR);…VARƒINDEX,�CHKSUM�:�INTEGER;  ‡BEGIN ŠWRITE(SRECORD,'S123');ŠCHKSUM�:=�35;!ŠEMITBYTE(WORKING_ADR[2],CHKSUM);!ŠEMITBYTE(WORKING_ADR[1],CHKSUM); ŠFOR�INDEX�:=�1�TO�256�DOŽBEGIN/‘EMITBYTE(INT(CURRDATASECTOR[INDEX-1]),CHKSUM); ‘IF�(INDEX�MOD�S1RECSIZE)�=�0”THEN —BEGIN šEMITBYTE(255-CHKSUM,CHKSUM);šWRITELN(SRECORD);!šINC_LINT(WORKING_ADR,S1RECSIZE);šIF�INDEX�<�256�THEN�BEGIN WRITE(SRECORD,'S123'); CHKSUM�:=�35;! EMITBYTE(WORKING_ADR[2],CHKSUM);! EMITBYTE(WORKING_ADR[1],CHKSUM);�END –ENDŽENDŠEND;{$E}PROCEDURE WRITES1ANDS2REC;†VARˆWORKING_ADR�:�LINT;ˆMEM_ICNT�:�INTEGER;ˆMEM_IPTR‚:�INTEGER;ˆEND_ADR‚:�INTEGER;ˆSTART_ADR�:�INTEGER;ˆADR�:�INTEGER; ‰BEGIN /ŒMEM_ICNT�:=�1;‚(*�INIT�MEMORY�IMAGE�COUNTER�*)7ŒMEM_IPTR�:=�176;‚(*�INIT�MEMORY�IMAGE�POINTER�START�*).ŒSTART_ADR�:=�MAKEINT(MEM_IPTR,LOADINFOBLOCK);/ŒEND_ADR�:=�MAKEINT(MEM_IPTR�+2,LOADINFOBLOCK);ƒ0ŒWHILE�(MEM_ICNT�<=�20)�AND�((START_ADR�<>�0)�ORŸ(END_ADR�<>�-1))‡DO ŒBEGIN "�MAKE_LINT(START_ADR,WORKING_ADR);�MULT_LINT_BY_256(WORKING_ADR); #�FOR�ADR�:=�START_ADR�TO�END_ADR�DO’IF‚EOF(LOADMODULE)‚THEN•BEGIN2•WRITELN('ERROR--INPUT�FILE�IS�NOT�A�LOADMODULE'); •HALT(0);•END’ELSE•BEGIN!•READ(LOADMODULE,CURRDATASECTOR);$•IF�(ADR�>=�0)�AND�(ADR�<=�255)�THEN'˜WRITES1REC(WORKING_ADR,CURRDATASECTOR)•ELSE'˜WRITES2REC(WORKING_ADR,CURRDATASECTOR)•END; �MEM_ICNT�:=�MEM_ICNT�+�1;�MEM_IPTR�:=�MEM_IPTR�+�4;.�START_ADR�:=�MAKEINT(MEM_IPTR,LOADINFOBLOCK);0�END_ADRƒ:=�MAKEINT(MEM_IPTR�+�2,LOADINFOBLOCK); �END„END;{$E}1PROCEDURE WRITES9ORS8REC(LOADINFOBLOCK : SECTOR); ‚VARƒI,CHKSUM�:�INTEGER;ƒSTART„:�INTEGER;  …BEGIN #ˆIF‚INT(LOADINFOBLOCK[23])�=�0�THEN,ŒBEGIN–{ADDRESS�FITS�IN�16�BITS--USE�S9�REC}ŒWRITE(SRECORD,'S903'); ŒCHKSUM�:=�3; ŒSTART�:=�24;ŒENDˆELSE-ŒBEGIN–{ADDRESS�TAKES�UP�24�BITS--USE�S8�REC}ŒWRITE(SRECORD,'S804'); ŒCHKSUM�:=�4; ŒSTART�:=�23;ŒEND; ˆFOR�I�:=�START�TO�25‚DO(ŒEMITBYTE(INT(LOADINFOBLOCK[I]),CHKSUM); ŒEMITBYTE(255-CHKSUM,CHKSUM);6ŒWRITELN(SRECORD);‚(*�WRITE�OUT�THE�S9�OR�S8�RECORD�*) †END;{$E}ˆBEGINƒ(*‚MAIN‚*) &‹WRITELN('BUILDS„REVISION�',REVISION);„*‹INIT;‚(*�PERFORM�INITALIZATION�ROUTINE‚*) ‹IF‚NOT�DONE‚THEN ŽIF�EOF(LOADMODULE)‚THEN‘WRITELN('LOADMODULE�IS�EMPTY')ŽELSE‘BEGIN ‘READ(LOADMODULE,LOADINFOBLOCK);7‘WRITES0REC(LOADINFOBLOCK);‚(*‚PROCESS�THE�S0�RECORD‚*)5‘WRITES1ANDS2REC;‚(*‚PROCESS�THE�S1�AND�S2�RECORDS�*)>‘WRITES9ORS8REC(LOADINFOBLOCK);�(*�PROCESS�THE�S9�OR�S8�REC�*)‘END; 7‹P$SETDIAG(NOABORTCF);ƒ{SET�UP�TO�NOT�ABORT�CHAIN�FILE} ˆE7 ND. éé=/* =/*†CONFIG.LF=/*'=/* Link chain file to create CONFIG.LO=/*:=/* If no output argument is specified for the listing the(=/* chain file will default to CONFIG.LL=/*=/IFC \1ƒ=ARG�CONFIG.LL=/ENDIF=/*=LINK ,CONFIG.LO,\1;AHMIX ATTRIBUTES PSINPUT CONFIG.ROINPUT CONFIG.BIN2ASCI.ROINPUT CONFIG.CFIGDATA.ROINPUT CONFIG.CLSDASGN.ROINPUT CONFIG.CNFGTBLS.ROINPUT CONFIG.FORCE.ROINPUT CONFIG.GETMEMCB.ROINPUT CONFIG.GETSTRCB.ROINPUT CONFIG.HEX2ASCI.ROINPUT CONFIG.INITLIZE.ROINPUT CONFIG.MODMEMCB.ROINPUT CONFIG.MODSTRCB.ROINPUT CONFIG.PRINT.ROLIB 0.&.PASVMDOS.ROEND=/*=ENDéééééÛ=/* =/*†CONFIG.PF=/*I=/* Chain file to compile CONFIG utility and assemble associated routines=/*:=/* If no output argument is specified for the listing the(=/* chain file will default to CONFIG.LS=/*@=/*†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.=/*=/IFC \1ƒ=ARG�CONFIG.LS=/ENDIF=/*)=PASCAL CONFIG.SA,CONFIG.PC,TEMP1.LS;Z=70=/*{ Included files are:=/*ƒ--�none�--=/*}=/* =POPTIM CONFIG.PC,CONFIG.PO;Z=70=PASCAL2 CONFIG.POƒ=COPY�TEMP1.LS,TEMP2.LS;Y=/*=/*5=ASM CONFIG.BIN2ASCI.SA,CONFIG.BIN2ASCI.RO,TEMP1.LS;R=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*=/*9=ASM CONFIG.CFIGDATA.SA,CONFIG.CFIGDATA.RO,TEMP1.LS;RZ=70=/*{ Included files are:=/*ƒ9995.&.EXE.EQ=/*ƒ9995.&.IOE.EQ=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*=/*9=ASM CONFIG.CLSDASGN.SA,CONFIG.CLSDASGN.RO,TEMP1.L7 S;RZ=70=/*{ Included files are:=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.NIO.EQ=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*=/*9=ASM CONFIG.CNFGTBLS.SA,CONFIG.CNFGTBLS.RO,TEMP1.LS;RZ=70=/*{ Included files are:=/*ƒ9995.&.IOE.EQ=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*=/*3=ASM CONFIG.FORCE.SA,CONFIG.FORCE.RO,TEMP1.LS;RZ=70=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*=/*9=ASM CONFIG.GETMEMCB.SA,CONFIG.GETMEMCB.RO,TEMP1.LS;RZ=70=/*{ Included files are:=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.TR1.EQ=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*=/*5=ASM CONFIG.GETSTRCB.SA,CONFIG.GETSTRCB.RO,TEMP1.LS;R=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*=/*5=ASM CONFIG.HEX2ASCI.SA,CONFIG.HEX2ASCI.RO,TEMP1.LS;R=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*=/*:=ASM CONFIG.INITLIZE.SA,CONFIG.INITLIZE.RO,TEMP1.LS;RZ=100=/*{ Included files are:=/*ƒ9995.&.IOE.EQä`í'=/*ƒ9995.&.RMA.EQ=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*=/*:=ASM CONFIG.MODMEMCB.SA,CONFIG.MODMEMCB.RO,TEMP1.LS;RZ=100=/*{ Included files are:=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.NIO.EQ=/*ƒ9995.&.RMA.EQ=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*=/*5=ASM CONFIG.MODSTRCB.SA,CONFIG.MODSTRCB.RO,TEMP1.LS;R=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*=/*3=ASM CONFIG.PRINT.SA,CONFIG.PRINT.RO,TEMP1.LS;RZ=70=/*{ Included files are:=/*ƒ9995.&.IOE.EQ=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*=/*ƒ=COPY�TEMP2.LS,\1;Yƒ=DEL�TEMP1.LS;Yƒ=DEL�TEMP2.LS;Y=/*=ENDéééééPROGRAM CONFIG (input,output);  {$I-, O+, D+, W+.”I-‚Command�line�not�scanned�for�external�file9”O+‚Source�statements�included�as�comments�in�asm�listing7”D+‚If�error�condition�exists�at�runtime,�D1�<--�unit�#-”W+‚Warning�for�non-standard�Pascal�generated.”R+‚Verifies�indices�and�subrange�are�in�range �C�O�N�T�E�N�T�S N The CONFIG banner with the most current date string can be found in PROCEDURE/ WrMsg under the enumerated varaible, "banner". @The following list names and is ordered after CONFIG's contents: CONSTants Data Structure TYPEs Global VARiables External PROCEDUREs‰FORCE ‰INITLIZE ‰GETMEMCB ‰MODMEMCB ‰BIN2ASCI ‰HEX2ASCI ‰GETSTRCB ‰MODSTRCB‰PRINT ‰CLSDASGN Minor PROCEDUR8 Es‰Initialization�PROCEDUREs “DoHeader “FixScreen “InitTblPtrs “GenScrnFixes “InitFlds “InitAttrVals “Dec2ASCI “Int2ASCI“ZeroCB“GrpBits•Grp “InitParmVals “BldScrns+“BldCnfgScrn�(located�with�Read�Procedures) ‰Write�PROCEDUREs “StopScreen“WrMsg “WrMiscMenu “WrHelpMenu “WrValMenu)“PrintCopy�(located�with�Read�Procedures) ‰Read�PROCEDUREs“SetMsg “SkipBlnks “RdDevName•StoreCh•GoodCh “BldCnfgScrn •SaveStars •InstallStars “RdChoice “PrintCopy “RdNewVal ‰Conversion�PROCEDUREs “CkValbuf “CTRL2bin “ASCI2bin •GetBaudRate “ModStrVal “GetBaudCode“ModAttr•ChgAttr “awd2ASCInInt Major PROCEDUREs ‰Initialize ‰GetDevName ‰GetCBType ‰ModParms ‰DoConfig ‰CopyNewCB Main PROCEDURE}{$E}  CONST?ƒastrkcolƒ=�36;Š{col�where�asterisk�is�placed�for�value�change}3ƒattrbitsƒ=�17;Š{number�of�bits�in�attributes�word}0ƒattwrdrow‚=�0;‹{screen�row�for�attributes�word}8ƒattrvallen�=�16;Š{length�of�one�ASCII�attributes�value}+ƒbaudlen„=�10;Š{length�of�baud�rate�string}:ƒbaudrateƒ=�13;Š{position�of�baud�rate�in�parameters�list} ƒblank†=�'�';ƒblank5…=�'…';ƒblank10„=�'Š';ƒblank20„=�'”';ƒblank30„=�'ž'; ƒcol2‡=�36;îõmþ9:E7=&1.C6M>IFINLVY^BfGnPv4~@†FŽA–eži¦K®C¶O¾PÆRÎUÖMÞK0ƒdcol‡=�4;‹{col�where�target�device�name�begins}=ƒEXORtermƒ=�0;‹{code�for�EXORterm�in�terminal�type�fld�in�CB}0ƒheadercol‚=�48;Š{#�of�cols�in�parm/attr�header}7ƒHcol‡=�3;‹{col�where�"H.�Help"�begins,�used�as�signal}(ƒhelpcolsƒ=�64;Š{#�of�cols�in�help�menu}2ƒhelprowsƒ=�13;Š{#�of�rows�reserved�for�help�menu}?ƒlastgrploc�=�14;Š{location�of�first�bit�in�last�group�of�bits}Aƒmaxdecloc‚=�10;Š{maximum�#�of�decimal�digits�allowed�in�integer}@ƒmaxhexloc‚=�8;‹{maximum�#�of�hexidecimalits�allowed�in�integer}1ƒmisccolsƒ=�52;Š{#�of�cols�in�miscellaneous�menu};ƒmiscrowsƒ=�7;‹{#�of�rows�reserved�for�miscellaneous�menus}<ƒnamecol„=�4;‹{col�where�field�name�begin�in�parm/attr�menu}?ƒnamestart‚=�6;‹{col�where�field�anme�starts�in�parm/attr�menu};ƒnamelen„=�32;Š{#�of�char�in�field�name�for�parm/attr�menu};ƒnomodln„=�14;Š{number�of�char�in�'‚not�modifiable'�string}?ƒnotmodcol‚=�55;Š{column�where�'not�modifiable'�message�starts}>ƒnumbitsgrp�=�4;‹{number�of�bits�grouped�together�for�display},ƒnumcodesƒ=�16;Š{current�max�baud�rate�code}.ƒnumgrps„=�4;‹{number�of�groups�in�bit�string}>ƒnumscrncol�=�72;Š{number�of�printable�cols�in�parm/attr�menu}7ƒscrnrowsƒ=�20;Š{#�of�rows�reserved�for�parm/attr�menu}-ƒstar‡=�'*';‰{to�identify�changed�parameters} ƒsz4ˆ=�4; ƒsz5ˆ=�5; ƒsz8ˆ=�8;:ƒvalcol…=�38;Š{col�where�values�for�parm/attr�menus�begin}?ƒvallen…=�33;Š{#�of�char�in�valbuf�for�ASCII�value�in�p/a�menu}/ƒXONˆ=�6;‹{bit�where�XON�is�in�parameters�mask}  ƒ{device�type�codes�from�DCB} ƒfdisk†=�1; ƒhdisk†=�2; ƒterm‡=�3; ƒprnter…=�4; ƒmagtape„=�5;{$E} �{�D�A�T�AƒS�T�R�U�C�T�U�R�E�SŠ}    TYPE  9{The first three types below allow integers in the Pascal9data�structures�to�be�the�declared�with‚the�proper�number4of bytes for use in parameter blocks in the assembly routines.} *ƒsmallint�=�-128..127;�{1�byte�of�storage}-ƒmedintƒ=�-32768..32767;‹{2�bytes�of�storage}8ƒlongint‚=�-2147483648..2147483647;�{4�bytes�of�storage}  {œSTRINGS¡}  'ƒstrg4„=�PACKED�ARRAY�[1..sz4]�OF�CHAR; 'ƒstrg8„=�PACKED�ARRAY�[1..sz8]�OF�CHAR; .ƒnamestrg�=�PACKED�ARRAY�[1..namelen]�OF�CHAR; +ƒstrg33ƒ=�PACKED�ARRAY�[1..vallen]‚OF�CHAR;{$E}  ${’TABLES�USED�FOR�BUILDING�SCREENS‘}   8{The record, parmtable, is used to hold the names of the8parameters fields and other information used in building2the�parameters�screen.‚The�table�is�initialized�as4constant in an assembly routine by means of a macro.4Parmtable is really a set of 5 tab8 les, one table for7each�device�type.‚The�number�of�entries�for�each�of�the7device tables is calculated and inserted into the table4head at assembly time so that any table additions or4deletions at a later time will not require recoding.,Each table varies for the number of entries.4The order of the tables in the set follows the order9of�the�device�type�code�found�in‚the�DCB�for�each�device;Oi.e. the first table is for hard disks, the second for floppy disks, and so on.3The field information in each table is ordered with6respect to the DCB as described in the Data ManagementKManual; e.g., with terminals, the attributes word is followed by line width7and lines per page in the DCB, the table and the menu.}  ƒparminfo�=‚PACKED�RECORD(‘nameƒ:�namestrg;�{holds�parameter�name}1‘sizeƒ:�smallint;�{#�of�bytes�in�parameter�value}5‘baseƒ:�CHAR;�{base�parameter�is�displayed�on�screen}1‘offset�:�longint;�{offset�into�CB�for�parameter}ŽEND;  ,ƒparmtblptr�=�^parmtable;�{address�of�table} ƒparmtable‚=�PACKED�RECORD&’numparm�:�smallint;�{#�rows�in�table}(’entrylen:�smallint;�{#�of�bytes�in�row}2’parmrow�:�PACKED�ARRAY�[0..scrnrows]�OF�parminfo;�END; K{This pointer points to the string 'NOT MODIFIABLE' which has enough blanks- to make the string length equal to namelen.} 0ƒnotmodstrg�=�PACKED�ARRAY�[1..nomodln]�OF�CHAR;ƒnotmod…=�^notmodstrg; 8 {-----------------------------------------------------} 4{The record, attrtable, is used to hold the names of6the attributes fields corresponding to the bits in the3attributes�word.‚The�names�are�used�in�building�the3attributes�screen.‚It�is�initialized�and�ordered�in$the same manner as parmtable above.}  ,ƒattrtblptr�=�^attrtable;�{address�of�table} ƒattrtable�=�PACKED�RECORD)‘numattr‚:�smallint;�{#�of�rows�in�table})‘entrylen�:�smallint;�{#�of�bytes�in�row}>‘attrrow‚:�PACKED�ARRAY�[0..scrnrows]�OF�namestrg;�{attr�name}�END;   8 {-----------------------------------------------------} 5{The record, valtable, is used to hold the attributes6values for the attributes word and is used in building6the�attributes�screen.‚It�is�initialized�and�organized+in�the�same�manner�as�parmtable�above.‚Each3entry has two values for each bit in the attributes7word; one for when the bit equals zero and one for when5the�bit�equals�one.‚Only�one�value�for�each�bit�field*appears in the attributes menu at a time.}  +ƒvaltblptr„=�^avaltable;�{address�of�table} Iƒbothvals…=�PACKED�RECORD{val0=attr�val�if�bit=0;�val1=attr�val�if�bit=1}-”val0�:�PACKED�ARRAY�[1..attrvallen]�OF�CHAR;-”val1�:�PACKED�ARRAY�[1..attrvallen]�OF�CHAR;’END; ƒavaltable„=�PACKED�RECORD%”numattr‚:�smallint;{#�rows�in�table}(”entrylen�:�smallint;{#�of�bytes�in�row}1”valrowƒ:�PACKED�ARRAY�[0..scrnrows]�OF�bothvals;Ÿ{attribute�values}’END;   7{-----------------------------------------------------}  A{The table, baudtbl, has the legal baud rates and their characterJrepresentations arranged in the order of the baud rate codes for the DCB.} 'ƒbaudstrgƒ=�array�[1..baudlen]�OF�CHAR; ƒbaudinfoƒ=�RECORD’rate…:�longint;‚{baud�rate}8’ASCIbaud�:�baudstrg;‚{char�representation�of�baud�rate}�END; Hƒbaudtbl„=�array�[0..numcodes]�OF�baudinfo;�{baud�rate�&�its�ASCII�strg} ;ƒbaudtblptr�=�^baudtbl;�{points�to�head�of�baud�rate�table}{$E}  {’MENUSƒ&�SCREENS¡}    *{The record, scrnimage, is an image of the*parameters or attributes screen in memory.-Parmscrn is built from parmtable and attrscrnCis�built�from�attrtable�and�avaltable.‚Once�built,�they�are�kept�inDmemory�and�modified�as�the�user�enters�new�values.‚When�a�new�targetDdevice name is entered by the user, these two menus are built anew.} 5ƒheaderptr�=�^rowimage;�{points�to�the�header�string} 1ƒrowimage‚=�PACKED�ARRAY�[1..numscrncol]�OF�CHAR;’{1�row�of�a�screen} ƒscrnimage�=�PACKED�RECORD#‘header‚:�rowimage;�{screen�header}19 ‘scrnln‚:�PACKED�ARRAY�[0..scrnrows]�OF�rowimage;#‘{attributes/parameter�screen�rows}�END;  7 {----------------------------------------------------}  0{The matrix, misctable, is a set of tables which-contain the images of all the screens for the&various selection menus except for the,parameters screen and the attributes screen.,There�is�one�table�for�each�menu.‚Each�table)is initialized as constant in an assembly,routine.‚Each�table�is�pointed�to�by�its�own/pointer so that it can be written out directly..All of the tables are the same number of rows.+Each of these tables is stored separately.}  0ƒmiscptrƒ=�^misctable;�{pointer�to�a�menu�in�the œabove�table} Iƒmiscline‚=�PACKED�ARRAY�[1..misccols]�OF�CHAR;�{miscellaneous�menu�line} Iƒmisctable�=�PACKED�ARRAY�[1..miscrows]�OF�miscline;�{miscellaneous�menu} 8 {-----------------------------------------------------} E{The record, helpimage, contains the help screen that is presented toDthe�user�when�"H"�is�selected�on�a�menu.‚There�are�as�many�differentDhelp�screens�as�there�are�menus,�one�help�screen�for�each�menu.‚TheyGare initialized as constant in an assembly routine, and their addressesBare�passed�back�in�their�respective�pointers.‚They�are�written�outEthrough�the�use�of�their�pointers.‚Each�of�these�help�menus�is�stored separately.}  -ƒhelpptrƒ=�^helpimage;†{pointer�to�help�menu} <ƒhelpline‚=�PACKED�ARRAY�[1..helpcols]�OF�CHAR;�{screen�row} @ƒhelpimage�=�PACKED�ARRAY�[1..helprows]�OF�helpline;�{help�menu}{$E} {’ENUMERATEDƒTYPES } 3ƒ{***‚The�boot�file/memory�menu,�btmem,�needs�to�be.„included�below�when�Phase�II�is�implemented.} 2ƒmenutypes„=�(device,�CBtype,�parms,�cnfig,�copy);’{menutype�directs�control} 5ƒselection„=�(zero,�one,�two,�three,�four,�five,�six,)“seven,�eight,�nine,�ten,�eleven,�twelve,1“thirteen,�fourteen,�fifteen,�sixteen,�seventeen,#“help,�cnfg,�hrdcpy,�nextdev,�quit, “exiting);$“{the�number�for�the�menu�selection,”can�be�used�with�any�menu} ƒmask‰=�SET�OF�selection;'’{masks�from�the�target�device's�CB�are"“kept�as�sets;�at�most�only�bits�00“through�16�are�active�along�with�help..exiting}  Eƒ{The�first�messages�are�initialized�in�assembly�routines�and�must�beA„kept�in�order.‚Any�new�messages�ofr�assembly�routines�nedd�to�beC„added�to�the�end�of�the�old�ones�and�given�their�proper�equates�in/„the�assembly�program:�none=0,�devbusy=1,�etc.} 6ƒmsgtype�=�(none,�devbusy,�nosuchdev,�notcnfg,�notrdy,0Žspoolup,�stopscrn,�nospace,�baddtype,�prntbusy,(Ž{latter�msgs�used�in�assembly�routines}$Žbadchoice,�baddev,�badname,�badnum,6Žbadbaud,�banner,�badrange,�baduser,�badval,�cnfgdone,Žcnfgnow,�prntout,�nolbsign);,�{keeps�track�of�whether�a�message�should�be&Ždisplayed�and�which�message�to�write} ƒ{***�Will�be�used�in�Phase�II.} %ƒcnfgtype�=�(memory,�bootfile,�both); Ž{keeps�track�of�what�to�modify} ƒcnfgtime�=�(perm,�temp);,Ž{keeps�track�of�which�kind�of�configuration"�to�perform:‚configure�defaults�or�configure�request}{$E} {•THEƒCB¦} 4{The DCB values for the various types of devices are2stored�in�the�record�below.‚It�is�identical�to�the5parameter block used by IOS and so is used to receive7the DCB values for a device or to reconfigure a device.8It is the structure for the global variable, CB, and canbe used for any device type.}  CBblk = PACKED RECORD/…staterrƒ:�smallint;�{device�status/error�code}5…chancode‚:�smallint;�{channel�code�for�above�status}3…devcodeƒ:�smallint;�{device�code�for�above�status}3…drvcodeƒ:�smallint;�{driver�code�for�above�status}%…attrmask‚:�medint;ƒ{attributes�mask}$…parmmask‚:�medint;ƒ{parameter�mask}%…attrword‚:�medint;ƒ{attributes�word}6…lngwrd0ƒ:�longint;‚{other�fields�+�16�reserved�bytes}…lngwrd1ƒ:�longint;…lngwrd2ƒ:�longint;…lngwrd3ƒ:�longint;…lngwrd4ƒ:�longint;…lngwrd5ƒ:�longint;…lngwrd6ƒ:�longint;…lngwrd7ƒ:�longint;1…lngwrd8ƒ:�longint9 ;„{�W�A�R�N�I�N�Gƒ!�!�!�!�!�!�}…lngwrd9ƒ:�longint;<…lngwrd10‚:�longint;„{NOTE�:ƒThis�parameter�block�is�larger}>…lngwrd11‚:�longint;„{than�any�currently�used�for�configure/�}?…lngwrd12‚:�longint;„{status�requests.‚In�the�future,�however,}>…lngwrd13‚:�longint;„{the�size�of�the�parameter�block�used�to}E…lngwrd14‚:�longint;„{accept�the�info�for�a�configure/status�request}>…lngwrd15‚:�longint;„{should�grow�to�be�larger�than�the�CBblk}F…lngwrd16‚:�longint;„{data�structure,�some�of�the�returned�info�will�}G…lngwrd17‚:�longint;„{write�over�part�of�the�RMA,�corrupting�addresses}>…lngwrd18‚:�longint;„{and�causing�CONFIG�to�crash�in�a�Pascal}/…lngwrd19‚:�longint;„{runtime�library�routine.}…lngwrd20‚:�longint; ƒEND;‚{CBblk}{$E}   {’REGISTERSƒ&ƒDEVICES›}   E{The register values maintained by SCT will be stored in this record.DIt is initialized in an assembly routine at the beginning of CONFIG.FIts values are obtained from the Pascal Runtime Maintenance Area, RMA,Cwhere they were stored by the Pascal runtime library routine, INIT,?when�CONFIG�was�called.‚The�length�of�the�options�field�and�the>options�from�the�command�line�are�in�the�RMA�also.‚They�can�be:added to the record at a future time if it is decided that8options should be included; e.g., a scroll mode option.}  regsavarea = PACKED RECORD(…montaskname�:�strg4;‡{monitor�task,�D0}3…monsessnum‚:�longint;…{monitor�session�number,�D1}+…udefvol…:�strg4;‡{user�default�volume,�D2},…udefnum…:�medint;†{user�default�number,�D3}.…udefcat…:�strg8;‡{user�default�catalog,�D4-5}.…cmdlengthƒ:�medint;†{command�line�length,�D6})…LUN‰:�longint;…{logical�unit�number,�D7}%…devid‡:�strg4;‡{device�mnemonic,�A1}*…ulognum…:�medint;†{user�logon�number,�A2}ƒEND;  8 {-----------------------------------------------------}  8{The values in this record will be used in making menus.:They will determine how the screen is cleared and how manyline feeds will be printed.}  userdev = PACKED RECORD"�termtypeƒ:�smallint;„{0=EXORterm}(�devtype„:�smallint;„{logon�device�type}3�numlinesƒ:�longint;…{number�of�lines�on�logon�CRT}‹END; 8 {-----------------------------------------------------} <{This record holds the name of the device to be reconfiguredand its device type.}   trgtdev = PACKED RECORD*�name„:�strg4;ˆ{device�to�be�reconfigured}%�devtype�:�smallint;…{type�of�device}‹END;{$E} "�{‹G�L�O�B�A�LƒV�A�R�I�A�B�L�E�SŠ}   VAR <{The following variables are the global variables in CONFIG.2Most of them are of the user defined types above.}  ({CB,�resides�in�the�global�data�area.‚It>receives the values for the devices to be reconfigured throughCan IOS configure/status request, or performs configurations through?configure defaults and configure commands in assembly routines.=Its address is passed to an assembly routine where it is usedAas the address of the parameter block for the configure commands.BCB is also modified by the user's new values for reconfiguring thetarget devices.} %ƒCB‰:�CBblk;‡{CB�info�for�all�devicesždescribed�above�in�CBblk} ƒDCBˆ:�CBblk;‡{DCB�info} ƒCCBˆ:�CBblk;‡{CCB�info}8 {-----------------------------------------------------} 5ƒasmmem†:�longint;…{used�to�store�address�of�assembly#ždata�section�with�parameter�blocksžfor�FHS�&�IOS�calls} 3ƒattrscrnƒ:�scrnimage;ƒ{image�of�an�attribute�menu;žbuilt�anew�whenever�a�newžtarget�device�is�chosen}6ƒnumattrlns�:�smallint;„{#�of�lines�in�attribute�menu;žchanges�whenever�a�new�targetždevice�is�chosen} 0ƒclrscrn„:�strg8;‡{array�for�the�escape�sequencežto�clear�the�screen;�it�isžlarge�enough�to�hold�thežescape�sequence�for�any žterminal} 4ƒdurationƒ:�cnfgtime;�{indicates�if�configuration�is šconfigure�defaults�or�configure šrequest} 3ƒgoodbye„:�BOOLEAN;…{indicates�when�CONFIG�is�readyžto�terminate} 9ƒtwicenumlns�:�integer;�{used�to�decide�if�any�line�feedsšcan�be�in: serted�between�thešfields�in�the�parameters�andšattributes�screens} 2ƒlogondevƒ:�userdev;…{stores�info�about�the�user'sžlogon�device;�described�above žin�userdev} 3ƒmenuƒ:�menutype;„{indicates�which�menu�to�display; šholds�the�enumerated�type�valuešused�in�selecting�which�majoršprocedure�receives�control} (ƒmsgˆ:�msgtype;†{an�enumerated�type�thatžpoints�to�one�of�a�number�ofžmessages�for�display;žif�no�message�is�necessay�thenžit�has�a�value�in�it�whichžindicates�there�is�no�message} 2ƒparmscrnƒ:�scrnimage;ƒ{image�of�a�parameter�menu;žbuilt�anew�whenever�a�newžtarget�device�is�chosen}6ƒnumparmlns�:�smallint;„{#�of�lines�in�parameter�menu;žchanges�whenever�a�new�targetždevice�is�chosen}   )ƒprntnameƒ:�strg4;‡{printer�for�hardcopy} 1ƒregsav…:�regsavarea;‚{has�D0-D7,A1-A2;�describedžabove�in�regsavarea} :ƒtrgteqlgƒ:�BOOLEAN;…{reports�if�target�device�=�logondev} .ƒtarget…:�trgtdev;…{device�to�be�reconfigured;ždescribed�above�in�trgtdev} +ƒuserbuf„:�strg33;ƒ{preserves�user's�input} ,ƒvalbuf…:�strg33;ƒ{ASCII�string�for�a�value}{$E}  {œPOINTERS–}   2ƒparmhdr„:�headerptr;ƒ{points�to�header�string�foržbuilding�parmscrn}2ƒattrhdr„:�headerptr;ƒ{points�to�header�string�foržbuilding�attrscrn}2ƒnomod†:�notmod;†{points�to�NOT�MODIFIABLE�string} -ƒptptr†:�parmtblptr;‚{pointer�to�1st�table�inžparmtable�set�of�tables;žvalue�never�changes}2ƒparmptr„:�parmtblptr;‚{pointer�to�specific�devicežtable�in�parmtable�set;�itsžvalue�changes�whenever�ažnew�target�device�is žchoosen} 8 {-----------------------------------------------------}  1ƒatptr†:�attrtblptr;‚{pointer�to�1st�table�in�setžof�attrtable;�it�valuežnever�changes} 2ƒattrptr„:�attrtblptr;‚{pointer�to�specific�devicežtable�in�attrtable�set;‚itsžvalue�changes�whenever�a�newžtarget�device�is�chosen} 8 {-----------------------------------------------------}  0ƒvtptr†:�valtblptr;ƒ{pointer�to�1st�table�in�setžof�valuetables;�its�valuežnever�changes} 1ƒavalptr„:�valtblptr;ƒ{pointer�to�specific�devicežtable�in�avaltable;�its�valuežchanges�whenever�a�new�targetždevice�is�chosen} 8 {-----------------------------------------------------}  C{Each pointers below points to a specific menu in the set of menus,6misctable.‚The�values�in�these�pointers�never�change.} 2ƒdnmmnptrƒ:�miscptr;…{pointer�to�Device�Name�Menu}7ƒbfmmnptrƒ:�miscptr;…{pointer�to�Boot�file/memory�Menu}(ƒCBmnptr„:�miscptr;…{pointer�to�CB�Menu}0ƒcfgmnptrƒ:�miscptr;…{pointer�to�Configure�Menu}.ƒcpymnptrƒ:�miscptr;…{pointer�to�Copy�CB�Menu} 8 {-----------------------------------------------------} H{The pointer below point to the help menus for the various miscellaneous"menus such as the configure menu.} 2ƒCBthelpƒ:�helpptr;…{points�to�the�help�screen�for�DCB/CCB�menu}2ƒbfmhelp„:�helpptr;…{points�to�the�help�screen�for�boot�file/memory�menu}3ƒparmhelpƒ:�helpptr;…{points�to�the�help�screen�for�parameters�menu}3ƒattrhelpƒ:�helpptr;…{points�to�the�help�screen�for�attrributes�menu}3ƒcnfghelpƒ:�helpptr;…{points�to�the�help�screen�for�configure�menu}3ƒcopyhelpƒ:�helpptr;…{points�to�the�help�screen�for�hardcopy�menu}  F{--------------------------------------------------------------------} :ƒbaudptr„:�baudtblptr;ƒ{points�to�head�of�baud�rate�table}{$E}   {›MASKS¤}   1ƒattrmaskƒ:�mask;ˆ{attributes�mask�for�the�targetždevice;�its�value�changesžonly�when�a�new�target�device žis�chosen} .ƒamask†:�mask;ˆ{attributes�mask�for�the�targetždevice;�its�value�changes žwhen�the�user�gives�a�new�value$žto�it�or�the�target�device�changes} 8 {-----------------------------------------------------} 7ƒCaword,�Daword�:�mask;†{attributes�word�for�the�target device;�the�value�changes whenever�a�new�target�device is�chosen�and�possibly�by�the user�before�configuration} 6ƒattrword�:�mask;�{attributes�word�used�to�build�menu} 8 {: -----------------------------------------------------}  1ƒparmmaskƒ:�mask;ˆ{parameters�mask�for�the�targetždevice;�its�value�changesžwhenever�a�new�target�devicežis�chosen;�it�gets�revised�inžread�timeout/write�temeoutžfields�for�temporaryžconfiguration}.ƒpmask†:�mask;ˆ{parameters�mask�for�the�targetždevice;�its�value�changesžonly�when�a�new�target�devicežis�chosen;�it�is�a�copy�of�thežoriginal�parameters�mask�valuežfor�the�target�device}{$E}    '{ŽE�X�T�E�R�N�A�LƒP�R�O�C�E�D�U�R�E�S”}   I{The following procedures are written in M68000 assembly and are includedat link time.}  *PROCEDURE FORCE (VAR fil : text); FORWARD;J{Forces the output buffer to be written in a WRITE call without a carriagereturn.}   ‚FOR�i�:=�0�TO�numparmlns-1�DO�{fill�menu�with�the�parameters}„FOR�j�:=�1�TO�namelen�DO>†parmscrn.scrnln�[i,j]†{copy�field�for�parm�menu�from�parmtbl} Š:=�parmptr^.parmrow[i].name[j]; ;‚numattrlns�:=�attrptr^.numattr;ƒ{get�number�of�attributes}>‚FOR�i�:=�0�TO�numattrlns-1�DO…{attributes�count�started�at�1}„FOR�j�:=�1�TO�namelen�DO8†attrscrn.scrnln�[i,j]„{copy�attrtbl�row�into�attr�menu}ˆ:=�attrptr^.attrrow[i,j] END;‚{InitFlds}{$E}  PROCEDURE InitAttrVals; 9†{InitAttrVals�puts�the�attributes�values�into�attrscrn.} VAR‚bitƒ:�selection;‚i,jƒ:�integer; BEGIN‚{InitAttrVals} *‚bit�:=�zero;…{start�at�bit�0�in�attrmask} )‚IF�duration�=�per; m�{if�change�is�to�DCB}+„THEN�attrword�:=�Daword‚{use�DCB�attrword}1„ELSE�attrword�:=�Caword;�{else�use�CCB�attrword} 8‚FOR�i�:=�0�to�numattrlns-4�DOˆ{no�values�for�help/quit}„BEGIN�{for�loop},†IF�bit�IN�attrword…{bit=1;�use�val1�values}!ˆTHEN�FOR�j�:=�1�TO�attrvallen�DO�attrscrn.scrnln�[i,j+valcol]5“:=�avalptr^.valrow[i].val1[j]�{copy�value�into�menu}:ˆELSE�FOR�j�:=�1�TO�attrvallen�DO‰{bit=0;�use�val0�values}�attrscrn.scrnln�[i,j+valcol]6“:=�avalptr^.valrow[i].val0[j];�{copy�value�into�menu} $‡bit�:=�succ�(bit);…{go�to�next�bit}„END;‚{for�loop} ‚{put�not�modifiable�into�menu} ‚bit�:=�zero;1‚FOR�i�:=�0�TO�numattrlns-4‚DO�{check�each�field}#„BEGIN�{find�not�modifiable�fields};†IF�NOT�(bit�IN�attrmask)�THEN‚{bit=0�means�not�modifiable}1ŠFOR�j�:=�1�TO�nomodln�DOƒ{copy�'not�modifiable'}.Œattrscrn.scrnln�[i,j+notmodcol]�:=�nomod^[j];$†bit�:=�succ�(bit);„{go�to�next�bit}„END;   END;‚{InitAttrVals}{$E}  %PROCEDURE Dec2ASCI (value : longint); †{DEC2ASCI�changes�the8†binary�number�in�value�into�a�decimal�character�string.7†It‚does�this�by�taking�the�value�and�dividing�by�10�to6†get�the�remainder�and�converting�the�remainder‚into‚a4†character.ƒThis‚is‚repeated�with�the�quotient�until6†the�quotient�=�0.‚This�works�because�the�procedure‚is7†written‚in�Pascal�and�gives�decimal�arithmetic�results†with�conversion.} CONST$‚divisor‚=�10;ˆ{base�for�conversion} VAR7‚buf‰:�strg33;„{temporary�stroage�for�converted�digits}%‚i,�jˆ:�INTEGER;ƒ{indices�to�buffers})‚quotˆ:�INTEGER;ƒ{next�number�to�convert}*‚rem‰:�INTEGER;ƒ{this�is�digit�to�convert} BEGIN {Dec2ASCI} '‚IF�value�<>�0�THEN‰{number�to�convert} „BEGIN…{value�<>�0}4†i�:=�0;�{point�to�before�start�of�temporary�buffer}+†quot�:=�value;‰{initialize�first�dividend}-†REPEAT‚{get�remainders�and�convert�to�ASCII}0ˆrem�:=�quot;…{preserve�quot�for�later�division}/ˆrem�:=�rem�mod�10;ƒ{get�digit�to�be�converted}"ˆi�:=�i+1;Œ{point�to�buf�location}/ˆbuf[i]�:=�chr�(rem�+�ord�('0')�);�{store�char}.ˆquot�:=�quot�DIV�divisor;�{get�next�dividend}-†UNTIL�quot�=�0;ˆ{last�remainder�just�stored} )†{pop�characters�out�of�temporary�storage&†and�put�in�valbuf�in�forward�position1†i�points�to�end�of�buf�where�1st�digit�is�stored4†j�points�to�where�first�number�should�go�in�valbuf} #†j�:=�2;ˆ{start�digits�after�blank}†REPEATˆvalbuf�[j]�:=�buf�[i]; ˆj�:=�j+1; ˆi�:=�i-1; †UNTIL�i�=�0;„END‚{value�<>�0} ‚ELSE„valbuf�[2]�:=�'0'; END;‚{Dec2ASCI}{$E}   CPROCEDURE�Int2ASCI�(base�:�CHAR;�size�:�smallint;‚value�:�longint);  $…{Int2ASCI�changes‚an‚integer‚into‚a7†character�string�by�calling�the�appropriate�routine.�} VAR‚i�:�integer;‚{index} BEGIN‚{Int2ASCI} ‚CASE�base�OF/„'B'�:�BIN2ASCI�(valbuf,�value,�size);ˆ{binary}"„'D'�:�Dec2ASCI�(value);–{decimal}4„'H'�:�HEX2ASCI�(valbuf,�value,�size);ˆ{hexadecimal}&„'N'�:�BEGIN¢{no�value�for�this�field} Œvalue�:=�0;ŒFOR�i�:=�1�TO�vallen�DOŽvalbuf�[i]�:=�blank;ŠEND; ‚END;‚{case} END;‚{Int2ASCI}{$E}  PROCEDURE ZeroCB; E„{ZeroCB�zeroes�out�the�CB�record�before�a�configure�status�request.} BEGIN‚{ZeroCB} ‚WITH�CB�DO„BEGIN�{CB�=�0})…staterrƒ:=�0;�{device�status/error�code}/…chancode‚:=�0;�{channel�code�for�above�status}-…devcodeƒ:=�0;�{device�code�for�above�status}-…drvcodeƒ:=�0;�{driver�code�for�above�status}!…attrmask‚:=�0;�{attributes�mask} …parmmask‚:=�0;�{parameter�mask}!…attrword‚:=�0;�{attributes�word}1…lngwrd0ƒ:=�0;�{other�fields�+�16�reserved�bytes}…lngwrd1ƒ:=�0;…lngwrd2ƒ:=�0;…lngwrd3ƒ:=�0;…lngwrd4ƒ:=�0;…lngwrd5ƒ:=�0;…lngwrd6ƒ:=�0;…lngwrd7ƒ:=�0;,…lngwrd8ƒ:=�0;„{�W�A�R�N�I�N�Gƒ!�!�!�!�!�!�}…lngwrd9ƒ:=�0;7…lngwrd10‚:=�0;„{NOTE�:ƒThis�parameter�block�is�larger}9…lngwrd11‚:=�0;„{than�any�currently�used�for�configure/�}:…lngwrd12‚:=�0;„{status�requests.‚In�the�future,�however,}9…lngwrd13‚:=�0;„{the�size�of�the�parameter�block�used�to}@…lngwrd14‚< :=�0;„{accept�the�info�for�a�configure/status�request}9…lngwrd15‚:=�0;„{should�grow�to�be�larger�than�the�CBblk}A…lngwrd16‚:=�0;„{data�structure,�some�of�the�returned�info�will�}B…lngwrd17‚:=�0;„{write�over�part�of�the�RMA,�corrupting�addresses}9…lngwrd18‚:=�0;„{and�causing�CONFIG�to�crash�in�a�Pascal}*…lngwrd19‚:=�0;„{runtime�library�routine.}…lngwrd20‚:=�0;ƒEND;‚{CB�=�0} ‚WITH�CCB�DO„BEGIN�{CCB�=�0})…staterrƒ:=�0;�{device�status/error�code}/…chancode‚:=�0;�{channel�code�for�above�status}-…devcodeƒ:=�0;�{device�code�for�above�status}-…drvcodeƒ:=�0;�{driver�code�for�above�status}!…attrmask‚:=�0;�{attributes�mask} …parmmask‚:=�0;�{parameter�mask}!…attrword‚:=�0;�{attributes�word}1…lngwrd0ƒ:=�0;�{other�fields�+�16�reserved�bytes}…lngwrd1ƒ:=�0;…lngwrd2ƒ:=�0;…lngwrd3ƒ:=�0;…lngwrd4ƒ:=�0;…lngwrd5ƒ:=�0;…lngwrd6ƒ:=�0;…lngwrd7ƒ:=�0;,…lngwrd8ƒ:=�0;„{�W�A�R�N�I�N�Gƒ!�!�!�!�!�!�}…lngwrd9ƒ:=�0;7…lngwrd10‚:=�0;„{NOTE�:ƒThis�parameter�block�is�larger}9…lngwrd11‚:=�0;„{than�any�currently�used�for�configure/�}:…lngwrd12‚:=�0;„{status�requests.‚In�the�future,�however,}9…lngwrd13‚:=�0;„{the�size�of�the�parameter�block�used�to}@…lngwrd14‚:=�0;„{accept�the�info�for�a�configure/status�request}9…lngwrd15‚:=�0;„{should�grow�to�be�larger�than�the�CBblk}A…lngwrd16‚:=�0;„{data�structure,�some�of�the�returned�info�will�}B…lngwrd17‚:=�0;„{write�over�part�of�the�RMA,�corrupting�addresses}9…lngwrd18‚:=�0;„{and�causing�CONFIG�to�crash�in�a�Pascal}*…lngwrd19‚:=�0;„{runtime�library�routine.}…lngwrd20‚:=�0;ƒEND;‚{CCB�=�0} ‚WITH�DCB�DO„BEGIN�{DCB�=�0})…staterrƒ:=�0;�{device�status/error�code}/…chancode‚:=�0;�{channel�code�for�above�status}-…devcodeƒ:=�0;�{device�code�for�above�status}-…drvcodeƒ:=�0;�{driver�code�for�above�status}!…attrmask‚:=�0;�{attributes�mask} …parmmask‚:=�0;�{parameter�mask}!…attrword‚:=�0;�{attributes�word}1…lngwrd0ƒ:=�0;�{other�fields�+�16�reserved�bytes}…lngwrd1ƒ:=�0;…lngwrd2ƒ:=�0;…lngwrd3ƒ:=�0;…lngwrd4ƒ:=�0;…lngwrd5ƒ:=�0;…lngwrd6ƒ:=�0;…lngwrd7ƒ:=�0;,…lngwrd8ƒ:=�0;„{�W�A�R�N�I�N�Gƒ!�!�!�!�!�!�}…lngwrd9ƒ:=�0;7…lngwrd10‚:=�0;„{NOTE�:ƒThis�parameter�block�is�larger}9…lngwrd11‚:=�0;„{than�any�currently�used�for�configure/�}:…lngwrd12‚:=�0;„{status�requests.‚In�the�future,�however,}9…lngwrd13‚:=�0;„{the�size�of�the�parameter�block�used�to}@…lngwrd14‚:=�0;„{accept�the�info�for�a�configure/status�request}9…lngwrd15‚:=�0;„{should�grow�to�be�larger�than�the�CBblk}A…lngwrd16‚:=�0;„{data�structure,�some�of�the�returned�info�will�}B…lngwrd17‚:=�0;„{write�over�part�of�the�RMA,�corrupting�addresses}9…lngwrd18‚:=�0;„{and�causing�CONFIG�to�crash�in�a�Pascal}*…lngwrd19‚:=�0;„{runtime�library�routine.}…lngwrd20‚:=�0;ƒEND;‚{DCB�=�0} END;‚{ZeroCB}{$E}  PROCEDURE GrpBits; E{GrpBits takes an ASCI string and divides it into groups of bits with$blanks inserted between the groups.} ‚VAR9„times�:�integer;‚{controls�number�of�times�for�FOR�loop}<„start,�stop�:�integer;�{initial/ending�values�for�FOR�loop}„i‹:�integer;�{index} '‚PROCEDURE�Grp�(start,�stop�:�integer);2‚{Grp�moves�the�whole�group�of�bits�to�the�right.} „VAR†i�:�integer;‚{index} „BEGIN<†FOR�i�:=�stop�DOWNTO�start�DO„{begin�at�last�char�in�group}@ˆvalbuf�[i+numbitsgrp-times]�:=�valbuf�[i];‚{move�char�to�right}„END; ‚BEGIN�{GrpBits}<„start�:=�lastgrploc;�{where�first�char�in�last�group�lives}J„FOR�times�:=�1�TO�numgrps-1�DO‚{move�this�many�groups,�leave�first�group}†BEGIN@ˆstop�:=�start�+�numbitsgrp�-1;�{where�last�char�in�group�lives}&ˆGrp�(start,�stop);�{move�whole�group}Aˆstart�:=�start�-�numbitsgrp;‚{first�char�loc�in�next�group�down}†END; ‚{put�in�blanks}‚i�:=�1;‚FOR�times�:=�1�TO�numgrps-1�DO„BEGIN†i�:=�i�+�numgrps�+�1;†valbuf�[i]�:=�blank;„END; ‚END;�{GrpBits}{$E}  PROCEDURE InitParmVals; 7„{InitParmVals�puts�the�parameter�values�into�parmscrn. 0„To‚do‚one‚value,‚InitParmVals‚first‚goes‚to‚the5„parmtable‚t< o‚get‚the�offset�into�CB�and�the�base�for0„the�value.‚The‚value‚is‚obtained‚from‚the‚CB‚in7„storage.‚A�routine�is�called�to�convert�the�value�into7„the�proper�character�string�for�that�base.‚This�string.„is�placed�into�the�value�portion�of�parmscrn. 8„The�above�steps�are�repeated�until�all�the�field�values„are�initialized.} VAR3‚offsetc„:�longint;„{offset�to�current�field�in�CB}0‚sizec†:�smallint;ƒ{size�of�current�field�in�CB},‚basec†:�CHAR;‡{base�of�current�field�in�CB}0‚value†:�longint;„{value�of�current�field�in�CB}‚i,�j‡:�integer;„{indices}‚numrows„:�INTEGER;„{index}<‚first†:�BOOLEAN;�{says�if�bit�6�(XON)�has�been�reached�yet}'‚bitˆ:�selection;‚{index�into�parmmask} BEGIN {InitParmVals} <‚FOR�numrows�:=�0�TO�numparmlns-4�DO�{do�for�all�parameters}„BEGIN#†WITH�parmptr^.parmrow�[numrows]�DOˆBEGIN‚{get�info�on�parameters}(Šoffsetc�:=�offset;�{get�current�offset}"Šbasecƒ:=�base;ƒ{get�current�base}"Šsizecƒ:=�size;ƒ{get�current�size}ˆEND; +ŠFOR�i�:=�1�TO�vallen�DO†{blank�out�valbuf}Œvalbuf�[i]�:=�blank; $Švalue�:=�0;ƒ{init�all�bits�to�zero} )Š{get�the�value�of�the�current�parameter}&ŠGETSTRCB�(CB,�offsetc,�sizec,�value); EŠ{if�field�is�baud�rate,�get�the�ASCII�code�for�baud�rate�from�table}4ŠIF�(numrows�=�baudrate)�AND�(target.devtype�=�term)ŒTHENŽFOR�i�:=�1�TO�baudlen�DO,�valbuf�[i+1]�:=�baudptr^[value].ASCIbaud[i]$ŒELSE�{change�value�to�ASCII�string} ŽInt2ASCI�(basec,�sizec,�value); Š{group�attributes�word�bits}%ŠIF�numrows�=�attwrdrow�THEN�GrpBits; 'Š{put�ASCII�value�into�parameters�menu}ŠFOR�j�:=�1�TO�vallen�DO3Œparmscrn.scrnln�[numrows,j+valcol-1]�:=�valbuf[j];  „END;�{get�info} $„{insert�'Not�modifiable'�into�menu}„first�:=�true; „bit�:=�zero;„FOR�i�:=�1�TO�numparmlns-4�DO†BEGIN�{check�all�fields};ˆIF�NOT�(bit�IN�parmmask)�THEN‚{bit=0�means�not�modifiable}1ŠFOR�j�:=�1�TO�nomodln�DOƒ{copy�'Not�modifiable'}.Œparmscrn.scrnln�[i,j+notmodcol]�:=�nomod^[j]; $Šbit�:=�succ�(bit);„{go�to�next�bit} ŠIF�first�AND�(bit�=�FIVE)ƒ{XON};ŒAND�(target.devtype�=�term)�THEN‚{XON�bit�is�same�as�XOFF}ŒBEGIN5Žfirst�:=�not�first;�{next�time�thru;�skip�this�code},Žbit�:=�pred(bit);�{XON�is�same�bit�as�XOFF}ŒEND;†END;�{check�all�fields} END;‚{InitParmVals}{$E}  PROCEDURE BldScrns; 9„{BldScrns�first�act�is�to�call�GenScrnFixes�which�blanks4„out‚the‚two‚screen‚matrices,�parmscrn�and�attrscrn./„This‚prevents‚garbage‚ofƒpreviousƒdevicesƒfrom1„appearing‚in‚the‚new‚menus.ƒIt‚also�installs�the7„target�device�name�in�the�header�of�each�screen�and‚in„several�of�the�other�menus.  7„After‚this,�BldScrns�calls�the�procedure,�InitFlds,�to6„initialize�parmscrn�and�attrscrn�with�the‚field‚names0„forƒthe‚target‚device.ƒThese‚initialized‚screen3„matrices�will�be‚customized‚to‚the‚target‚device's5„parameter‚mask;‚i.e,‚before�a�field�receives�a�name,7„its�bit�in�the�parameters�mask�will�be�checked.‚If�the6„bit‚equals‚zero,�then�the�field�is�not�modifiable,�so0„the‚name‚field‚for‚the‚screen‚will‚receive‚"NOT(„MODIFIABLE"�in�place�of�the�field�name. 6„Next‚it‚will�call�InitParmVals�which�will�convert�the2„values�in�the‚target‚CB‚to‚the‚appropriate‚string4„values‚for‚the‚parameter‚field�by�using�information5„from�parmtable.‚InitParmVals�will�store‚these‚string„values�in�parmscrn. 3„BldScrns‚also‚calls‚InitAttrVals‚to‚initialize�the'„attributes�screen�values�in�attrscrn.} BEGIN„{BldScrns} ‚GenScrnFixes; ‚InitFlds;‚InitAttrVals;‚InitParmVals;END;…{BldScrns}{$E}   !{�W�R�I�T�EƒP�R�O�C�E�D�U�R�E�S–}  PROCEDURE StopScreen; .„{StopScreen�sets�stops�the�screen�so�that�the<…error�written�by�the�Error�Message�Handler�can�be�read.‚The%…user�can�then�continue�the�program.} VAR‚ch�:�char;‚{input} BEGIN„{StopScreen} ‚writeln;�writeln;2‚write�('***�TYPE�CARRIAGE�RETURN�TO�CONTINUE�:');2‚force�(output);„{force�above�message�onto�screen}+‚IF�NOT�eoln�(input)�THEN�read�(ch);�{wait}-‚write= ln;�readln;ƒ{finish�off�write�and�read} 4‚msg�:=�none;…{message�is�out,�wipe�slate�clean�now} END;…{StopScreen}{$E}   )PROCEDURE WrMsg (VAR choice : selection); :ƒ{WrMsg�is�called‚whenever�there�is�a�message�outstanding.<„It�is�written�at�the�top�of�the�menu�about�to‚be‚displayed.5„After‚the‚message‚is�written,�msg�is�set�to�none�and1„remains�that�way‚until‚a‚new‚message‚needs‚to‚be „displayed.} VAR‚i„:�integer;‚{index}‚chƒ:�char;…{user�input} BEGIN {WrMsg} ‚CASE�msg�OF „badbaud�:†BEGINˆwrite�('***�ERROR�***„');ˆFOR�i�:=�1�to�vallen�DOŠwrite�(userbuf[i]);&ˆwriteln�('�IS�AN�INVALID�BAUD�RATE');†END; „badchoice�:-†writeln�('***�ERROR�***…INVALID�SELECTION'); „baddev�:†BEGIN7ˆwrite�('***�ERROR�***…ONLY�USER�0�CAN�RECONFIGURE�#');ˆFOR�i�:=�1�to�sz4�DOŠwrite�(target.name[i]); ˆwriteln;†END; „baddtype:6ˆwriteln�('***�SORRY�***…DEVICE�TYPE�IS�NOT�DEFINED'); „badname�:/†writeln�('***�ERROR�***…INVALID�DEVICE�NAME'); „badnum�:†BEGINˆwrite�('***�ERROR�***…');ˆIF�choice�<=�sixteenŠTHEN�write�(ord�(choice))ŠELSE�write�('CHOICE');ˆwriteln�('�NOT�MODIFIABLE');†END; „banner:†writeln�('CONFIG„020185�4'); „badrange�:†BEGINˆwrite�('***�ERROR�***…');ˆFOR�i�:=�1�to�vallen�DOŠwrite�(userbuf[i]);#Šwriteln�('�:‚VALUE�OUT�OF�RANGE');†END; „baduser�:†BEGIN>ˆwrite�('***�ERROR�***…ONLY�USER�0�CAN�PERFORM�A�CONFIGURE�');ˆwriteln�('DEFAULTS');†END; „badval�:†BEGINˆwrite�('***�ERROR�***„');ˆFOR�i�:=�1�to�vallen�DOŠwrite�(userbuf[i]);"ˆwriteln�('�IS�AN�INVALID�VALUE');†END; „cnfgdone�:†BEGINˆwrite�('***�NOTE�***…#');ˆFOR�i�:=�1�TO�sz4�DOŠwrite�(target.name[i]);"ˆwriteln�('�HAS�BEEN�CONFIGURED');†END; „cnfgnow�:†BEGINˆwrite�('***�NOTE�***…#');ˆFOR�i�:=�1�TO�sz4�DOŠwrite�(target.name[i]);)ˆwriteln�('�IS�READY�FOR�CONFIGURATION');†END; „devbusy�:†BEGINˆwrite�('***�SORRY�***…#');ˆFOR�i�:=�1�to�sz4�DOŠwrite�(target.name[i]);>ˆwriteln�('�IS�BUSY�AND�CANNOT�BE�RECONFIGURED�AT�THIS�TIME');†END; „prntout�:†BEGINˆwrite�('***�NOTE�***…');%ˆwriteln�('�PRINT�COMMAND�EXECUTED');†END; „nolbsign�:†BEGINˆwrite�('***�ERROR�***…');Aˆwriteln�('DEVICE�NAME�MUST�BE�PRECEDED�BY�THE�POUND�SIGN,�"#"');†END; „nospace�:†BEGINˆwrite�('***�SORRY�***…#');ˆFOR�i�:=�1�to�sz4�DOŠwrite�(target.name[i]);@ˆwriteln�('�CANNOT�BE�RECONFIGURED�UNTIL�MORE�MEMORY�IS�FREED');†END; „nosuchdev�:†BEGINˆwrite�('***�ERROR�***…#');ˆFOR�i�:=�1�to�sz4�DO-ŠIF�menu�=�device�THEN�write�(target.name[i])ŠELSE�write�(prntname[i]);Šwriteln�('�DOES�NOT�EXIST');†END; „notcnfg:†BEGINˆwrite�('***�SORRY�***ƒ#');ˆFOR�i�:=�1�to�sz4�DOŠwrite�(target.name[i]);#ˆwriteln�('�CANNOT�BE�CONFIGURED');†END; „notrdy:†BEGINˆwrite�('***�SORRY�***ƒ#');ˆFOR�i�:=�1�to�sz4�DOŠwrite�(target.name[i]);.ˆwriteln�('�NOT�READY�OR�POSSIBLY�NOT�THERE');†END;  „prntbusy:†BEGINˆwrite�('***�SORRY�***ƒ#');ˆFOR�i�:=�1�to�sz4�DOŠwrite�(prntname[i]);ˆwriteln�('�IS�BUSY')†END;   „spoolup�:†BEGINˆwrite�('***�ERROR�***ƒ#');ˆFOR�i�:=�1�to�sz4�DOŠwrite�(target.name[i]);Eˆwriteln�('�CANNOT�BE�RECONFIGURED�UNTIL�THE�SPOOLER�IS�DEACTIVATED')†END; ‚END;�{case} 4‚msg�:=�none;…{msg�is�out;�wipe�the�slate�clean�now} END;‚{WrMsg}{$E}  =PROCEDURE WrMiscMenu (menuptr : miscptr; choice : selection); ?„{WrMiscMenu�writes�the�device�name�menu,�the�DCB/CCB�menu,�the>„congiguration�menu�and�the�print�menu�on�the�screen.‚If�thereB„was�an�error�during�the�last�selection,�it�redisplays‚the‚currentE„device�name,�CB,�Configure�or�Copy�menu�with�an�error�message�at�the„top.} VAR‚i,�j�:�integer;‚{indices}  BEGIN {WrMiscMenu} $‚write�(clrscrn);‰{clear�the�screen} .‚IF�logondev.termtype�<>�0�THEN‡{0�=�EXORterm}0„FOR�i�:=�1�TO�20�DO†{clear�non-EXORterm�screen} †writeln; E‚IF�ms= g�<>�none�THEN�WrMsg�(choice);�{if�there's�error�msg,�write�it} ‚FOR�i�:=�1�TO�5�DO „writeln; H‚FOR�i�:=�1�TO�miscrows�DO…{all�miscellaneous�menus�have�same�#�of�rows}„BEGIN)†IF�(menu�<>�device)�AND�(menu�<>�CBtype)>ˆTHEN�write�(blank20)†{position�miscellaneous�menus�on�screen}ˆELSE�write�(blank10);H†FOR�j�:=�1�to�misccols�DO�{all�miscellaneous�menus�have�same�#�of�cols}=ˆwrite�(menuptr^[i,j]);�{write�miscellaneous�menu�pointed�to} ˆwriteln;CˆIF�menu�<>�device�THEN�writeln;�{double�space�all�but�device�menu}„END; ‚CASE�menu�OF „device�:†BEGINˆwrite�(blank10);?ˆwrite�('Enter�device�name�or�hit�carriage�return�to�exit�:�');†END;0„CBtype‚:�write�(blank10,�'Enter�selection�:�');1„OTHERWISE�write�(blank20,�'Enter�selection�:�'); ‚END;�{case} ‚force�(output); END; {WrMiscMenu}{$E}  *PROCEDURE WrHelpMenu (helpmenu : helpptr); (ƒ{WrHelpMenu�presents�an�explanation�for7„the�various�choices�that�appear�on�a�menu.‚It�gets�the6„number‚of‚rows�in�the�menu�and�then�using�the�pointer*„to�the�menu,�writes�out�all�of�the�rows.} VAR‚i,�j�:�integer;‚{indices}‚chƒ:�char;…{input} BEGIN„{WrHelpMenu} $‚write�(clrscrn);�{clear�the�screen} .‚IF�logondev.termtype�<>�0�THEN‡{0�=�EXORterm}0„FOR�i�:=�1�TO�20�DO†{clear�non-EXORterm�screen} †writeln; ‚writeln;‚writeln�(blank30,�'H�E�L�P');‚FOR�i�:=�1�TO�3�DO „writeln;D‚FOR�i�:=�1�TO�helprows�DO†{all�help�menus�have�same�number�of�rows}„BEGIN/†write�(blank5);Œ{position�help�menu�on�screen}G†FOR�j�:=�1�to�helpcols�DO‚{all�help�menus�have�same�number�of�columns}9ˆwrite�(helpmenu^[i,j]);‚{write�out�help�menu�pointed�to} †writeln;„END; ‚writeln;�writeln;�writeln;E‚write�(blank5,�'Hit�carriage�return�to�return�to�previous�menu�:�');=‚force�(output);‚{force�buffer�to�be�written,�wait�for�input} %‚IF�NOT�eoln�(output)�THEN�read�(ch);#‚readln;�writeln;�{finish�off�read} END;…{WrHelpMenu}{$E}   APROCEDURE WrValMenu (VAR screen : scrnimage; choice : selection); 7ƒ{WrValMenu�displays�on�the�screen�the�previously�built8„menu�which�contains�the�fields�and�their�values�for�the3„target�device.ƒHalfnumlns‚calculated‚previously‚is„used�to�control�line�feeds.} VAR‚i,j‚:�INTEGER;‚{indices}D‚doublespace�:�BOOLEAN;„{indicates�if�double�spacing�is�appropriate}3‚numlns†:�integer;„{number�of�lines�for�the�screen} BEGIN {WrValMenu} 1‚{clear�the�screen�and�write�any�message�pending}‚write�(clrscrn); .‚IF�logondev.termtype�<>�0�THEN‡{0�=�EXORterm}0„FOR�i�:=�1�TO�20�DO†{clear�non-EXORterm�screen} †writeln; #‚IF�msg�<>�none�THEN�WrMsg�(choice) ‘ELSE�writeln;�{forces�clrscrn}; 5‚IF�screen�=�parmscrn‰{get�number�of�lines�in�screen};„THEN�numlns�:=�numparmlns‚{#�of�lines�for�parameters�menu}<„ELSE�numlns�:=�numattrlns;�{#�of�lines�for�attributes�menu} H‚{add�on�msg�line,�etc.�and�double�to�find�#�of�lines�for�double�spaced}(‚IF�logondev.numlines�>�(numlns�+�4)�*�2G„THEN�doublespace�:=�true‚{#�of�lines�on�screen�enough�to�double�space}„ELSE�doublespace�:=�false;‚IF�doublespace�THEN�writeln; ?‚FOR�i�:=�1�TO�numscrncol-2�DO�{omit�carriage�return/line�feed}„write�(screen.header[i]); ‚writeln; ‚IF�doublespace�THEN�writeln; ‚FOR�i�:=�0�TO�numlns-1�DO„BEGIN?†FOR�j�:=�1�TO�numscrncol-2�DO�{omit�carriage�return/line�feed}ˆwrite�(screen.scrnln[i,j]); †writeln;†IF�doublespace�THEN�writeln;„END;‚write�('Enter�selection�:�');‚force�(output); END; {WrValMenu}{$E}  +{ PROCEDURE PrintCopy (VAR ok : BOOLEAN); } { Inserted after RdDevName }{$E}   {’R�E�A�DƒP�R�O�C�E�D�U�R�E�S˜} 7PROCEDURE SetMsg (VAR ok : BOOLEAN; message : msgtype); G„{SetMsg�is�used�by�RdDevName�and�RdChoice�to�set�the�boolean�ok�(whichI…stops�the�repeat�loop)�to�false.‚It�points�msg�at�the�correct�message�to*…display�at�the�top�of�the�repeated�menu.} BEGIN ‚ok�:=�false;B‚IF�msg�=�none„{no�message�in�here�yet,�so�you�can�put> �one�in�now}„THEN�msg�:=�message;END;{$E}   $PROCEDURE SkipBlnks (VAR ch : CHAR); =„{SkipBlnks�reads�until�a�non-blank�character�is�found�or�the…end�of�line�is�encountered.} BEGIN {SkipBlnks} ‚read�(ch);/‚WHILE�((ch�=�blank)�AND�(NOT�eoln�(input)))�DO „read�(ch); END; {SkipBlnks}{$E}  :PROCEDURE RdDevName (VAR ok : BOOLEAN; VAR dname : strg4); ‚{RdDevName�reads6‚the�user's�response�to�the�request�for�a‚device‚name.2‚It‚is‚called‚by‚GetDevName‚to‚get�the�name�of�the6‚device�to�be�reconfigured�and�by‚PrintCopy�to‚get�the8‚the�name�of�the�printer�on�which�to�print�the�values�of7‚the�reconfigured�device.�RdDevName�checks‚the‚response3‚for‚a‚syntactically‚valid‚name.‚If�the�name�is�not3‚valid,�it�returns�that‚piece‚of‚information‚to‚the4‚calling�module�which�will�display�an�error�message. 4‚If‚a‚carriage‚return‚is�entered�for�the�device�name4‚when�the�device�menu�is�active,�then‚exit‚is‚set‚to1‚true�because�the�user�is�signalling�termination. *‚If‚the‚device�name�is�"#"�then�the�target+‚device�is�assumed‚to�be�the�logon‚device.}  VAR‚ch†:�CHAR;Œ{input}‚i‡:�INTEGER;‰{index}‚last„:�BOOLEAN;  BPROCEDURE StoreCh (VAR dname : strg4; ch : char; VAR i : integer); E{StoreCh puts the character read for the device name into its array.} BEGIN‚IF�('a'�<=�ch)�AND�(ch�<=�'z')B„THEN�ch�:=�chr�(ord�(ch)�-�32);�{change�lower�case�to�upper�case}‚dname[i]�:=�ch;‚{store�char}"‚i�:=�i�+�1;†{go�to�next�location}END;   &FUNCTION GoodCh (ch : char) : BOOLEAN; K{GoodCh checks that the character read for the device name is alphnumeric.}  BEGIN„{GoodCh} (‚GoodCh�:=�(('0'�<=�ch)�AND�(ch�<=�'9'))!ŠOR�(('A'�<=�ch)�AND�(ch�<=�'Z'))!ŠOR�(('a'�<=�ch)�AND�(ch�<=�'z'))ŠOR�(ch�=�blank); END; {GoodCh}   BEGIN {RdDevName}%‚ok�:=�true;†{start�with�clean�slate}:‚last�:=�false;„{assume�target�device�is�not�logon�device} D‚{CR�is�not�a�legal�device�name�but�it�is�equal�to�an�exit�signal�ifJƒit�occurs�when�the�device�menu�is�up;�CR�only�is�not�valid�for�copy�menu.;ƒThese�are�the�only�two�menus�which�solicit�a�device�name.} %‚IF�eoln(input)ƒ{check�for�exit�=�CR}„THEN8†IF�menu�=�device‹{only�device�menu�has�CR�as�exit�sign}*ˆTHEN�goodbye�:=�true…{user�wants�to�exit}ˆELSEŠBEGIN6ŒSetMsg�(ok,�badname);�{can't�have�CR�as�printer�name}Œreadln;�{finish�off�read}ŠEND; ‚FOR�i�:=�1�TO�sz4�DO+„dname[i]�:=�blank;�{blank�out�device�name} M‚IF�NOT�goodbye�AND�ok�THEN�{user�doesn't�want�to�exit�&�may�have�valid�name}„BEGIN�{not�eoln} ˆSkipBlnks�(ch); &‡{device�name�must�be�preceded�by�"#"}+‡IF�(ch�<>�'#')�THEN�SetMsg�(ok,�nolbsign); ‡IF�ok…{not�logon�device}‰THEN�{read�name}‹BEGIN�{read�name}�i�:=�1;=�WHILE�(NOT�eoln�(input)�AND�(i�<=�4)�AND�ok�AND�NOT�last)�DO�BEGIN�{while} ‘read�(ch);:‘IF�GoodCh�(ch)‚{check�that�char�is�alphanumeric�or�blank}“THEN�StoreCh�(dname,�ch,�i))“ELSE�SetMsg�(ok,�badname);{invalid�char}!‘IF�ch�=�blank�THEN�last�:=�true; �END;�{while} >�{device�has�maximum�of�4�chars�in�name�and�no�embedded�blanks<Žany�other�characters�on�the�line�before�the�CR�are�commentsŽblank�must�precede�comment} �IF�NOT�eoln�(input)�AND�ok�THEN�BEGIN ‘read�(ch);‘IF�ch�<>�blank“THEN�SetMsg�(ok,�badname);�END;  3�IF�ok�AND�(dname[1]�=�blank)�THEN‚{only�#�on�line}�FOR�i�:=�1�TO�sz4�DO4‘dname[i]�:=�regsav.devid[i];�{name�of�logon�device} ŠEND;�{read�name} …readln;‡{finish�off�read}ƒEND;�{not�eoln} END;‚{RdDevName}{$E}  PROCEDURE BldCnfgScrn; @…{BldCnfgScrn�builds�a�new�parameters�screen�after�configuration?†is�performed.‚The�new�screen�is�built�with�the�values�that�are>†now�in�the�CCB�or�the�DCB�depending�on�which�was�configured.} ‚VAR?‚starset‚:�mask;�{keeps�track�of�parameters�which�were�changed} *‚PROCEDURE�SaveStars�(VAR�starset�:�mask); @‰{SaveStars�makes�a�record�of�the�values�that�the�user�changed.} ‚VAR#„bit�:�selection;Š{enumerate> d�type}„iƒ:�integer;Œ{index} ‚BEGIN�{SaveStars}„starset�:=�[]; „bit�:=�zero;„FOR�i�:=�0�TO�numparmlns-4�DO†BEGIN'ˆIF�parmscrn.scrnln�[i,astrkcol]�=�star!ŠTHEN�starset�:=�starset�+�[bit];ˆbit�:=�succ(bit);…END;‚END;�{SaveStars} -‚PROCEDURE�InstallStars�(VAR�starset�:�mask); A‰{InstallStars�puts�a�star�in�the�parameters�menu�in�front�of�theŠvalues�that�the�user�changed.} ‚VAR#„bit�:�selection;Š{enumerated�type}„iƒ:�integer;Œ{integer} ‚BEGIN�{InstallStars} „bit�:=�zero;„FOR�i�:=�0�TO�numparmlns-4�DO†BEGINˆIF�bit�IN�starset+ŠTHEN�parmscrn.scrnln�[i,astrkcol]�:=�star;ˆbit�:=�succ(bit);†END;‚END;�{InstallStars} BEGIN {BldCnfgScrn}BˆSaveStars�(starset);�{turn�on�bits�where�parameters�were�changed} 4ˆZeroCB;�{prepare�cnfg�blocks�to�recieve�new�values} 0ˆ{re-initialize�pointers�to�beginning�of�tables} ˆInitTblPtrs; ˆ{get�configured�values}BˆGETMEMCB�(target,�regsav.ulognum,�CCB,�DCB,�amask,�pmask,�Caword,1’Daword,�parmptr,�attrptr,�avalptr,�asmmem,�msg); &ˆ{initialize�CB�for�building�parmscrn}ˆIF�duration�=�permŠTHEN�CB�:=�DCBŠELSEŒBEGIN ŽCB�:=�CCB;-Žparmmask�:=�parmmask�-�[two];�{read�timeout}0Žparmmask�:=�parmmask�-�[three];�{write�timeout}6ŽIF�target.devtype�=�term�THEN‚{need�to�turn�off�bits}�BEGIN!’attrmask�:=�attrmask�-�[twelve];#’attrmask�:=�attrmask�-�[thirteen];#’attrmask�:=�attrmask�-�[fourteen];"’attrmask�:=�attrmask�-�[fifteen];�END;ŒEND; $ˆBldScrns;�{get�new�parameters�menu} ,ˆ{put�stars�in�front�of�values�user�changed}ˆInstallStars�(starset); END;‚{BldCnfgScrn}{$E}  'PROCEDURE PrintCopy (VAR ok : BOOLEAN); C‡{PrintCopy�gets�the�name�of�the�display�device�and�outputs�the�newˆmenu.} VAR!‚pname‚:�strg4;‚{name�of�printer}B‚numbytes�:�integer;�{number�of�bytes�in�data�part�of�parm�screen}8‚nochoice�:�selection;�{dummy�needed�for�procedure�call}‚iˆ:�integer;‚{index}:‚same…:�boolean;‚{printing�device�is�same�as�logon�device} BEGIN„{PrintCopy} ‚writeln;+‚write�('Enter�name�of�display�device�:�');‚force�(output); ‚RdDevName�(ok,�pname);‚writeln;�{finish�off�write} ‚IF�ok„THEN†BEGIN>ˆIF�pname�=�regsav.devidƒ{see�if�logon�device�=�output�device}ŠTHEN�same�:=�trueŠELSE�same�:=�false; $ˆ{print�menu�with�configured�values}2ˆPRINT�(asmmem,�parmscrn,�pname,�CB,�numparmlns-2,�numscrncol,�same,�msg);#ˆIF�msg�=�none‚{printing�went�well}ŠTHENŒBEGINŽmsg�:=�prntout;)ŽIF�same�{logon�device�=�printing�device}�THEN�StopScreen;ŒENDŠELSEŒBEGINŽFOR�i�:=�1�TO�sz4�DOŽok�:=�false;�{something�wrong}%Ž{if�a�special�message�then�write�it}*ŽIF�msg�<>�stopscrn�THEN�WrMsg�(nochoice);,ŽStopScreen;�{stop�screen�after�any�message}ŒEND;†END;‚END;�{PrintCopy}{$E}   >PROCEDURE RdChoice (VAR ok : BOOLEAN; VAR choice : selection); B„{RdChoice�reads�the�user's�menu�selection,�and�checks�the�rest�of2„the�line�for‚garbage.ƒThe‚selections‚are‚filtered4„through‚embedded‚case‚statements‚to�determine�which-„enumerated�value�will�be�assigned�to�choice. 5„This�procedure�is�used�to�read�the‚selection‚for‚all„menus.} VAR‚ch�:�char;‚{user�input}‚i‚:�integer;�{index} BEGIN„{RdChoice} %�ok�:=�true;…{start�with�clean�slate}, IF eoln (input) THEN SetMsg (ok, badchoice) ƒELSE…BEGIN�{not�eoln}1‡SkipBlnks�(ch);�{read�first�non-blank�character}A‡IF�ch�=�blank�THEN�SetMsg�(ok,�badchoice);‚{only�blanks�on�line} "‡IF�ok�THEN‚{found�non-blank�char}‰CASE�ch�OF„{legal�first�chars}‹'0'�:‚choice�:=�zero;‹'1'�:‚IF�eoln�(input)”THEN�{only�1�char}–choice�:=�one”ELSE�{more�chars�to�read}–BEGIN˜read�(ch);�{read�second�char} ˜CASE�ch�OF�{legal�second�chars}šblank�:‚choice�:=�one;š'0'ƒ:‚choice�:=�ten;š'1'ƒ:‚choice�:=�eleven;š'2'ƒ:‚choice�:=�twelve;š'3'ƒ:‚choice�:=�thirteen;š'4'ƒ:‚choice�:=�fourteen;š'5'ƒ:‚choice�:=�fifteen;š'6'ƒ:‚choice�:=�sixteen;š'7'ƒ:‚choice�:=�seventeen;!™OTHERWI? SE�{illegal�char�present}›SetMsg�(ok,�badchoice);™END;�{inner�case}—END;�{else�more�chars}‹'2'�:�choice�:=�two;‹'3'�:�choice�:=�three;‹'4'�:�choice�:=�four;‹'5'�:�choice�:=�five;‹'6'�:�choice�:=�six;‹'7'�:�choice�:=�seven;‹'8'�:�choice�:=�eight;‹'9'�:�choice�:=�nine;&‹'C','c'‚:‚choice�:=�cnfg;…{configure}1‹'D','d'‚:‚choice�:=�nextdev;‚{go�to�next�device}2‹'P','p'‚:‚choice�:=�hrdcpy;ƒ{get�user�copy�of�CB}<‹'H','h'‚:‚choice�:=�help;…{display�appropriate�help�screen}5‹'Q','q'‚:‚choice�:=�quit;…{go�back�to�previous�menu}0‹'E','e'‚:‚choice�:=�exiting;‚{terminate�CONFIG}!ŠOTHERWISE…{illegal�char�present}ŒSetMsg�(ok,�badchoice);ŠEND;�{outer�case} 0„{any�other�characters�on�the�line�are�comments}„IF�NOT�eoln�(input)�THEN†BEGIN ˆread�(ch);ˆIF�ch�<>�blankŠTHEN�SetMsg(ok,�badchoice);†END;‚END;�{not�eoln} readln;END;…{RdChoice}{$E}  :PROCEDURE RdNewVal (VAR ok : BOOLEAN; choice : selection); 3‰{RdNewVal�writes�the�field�name�and�a�prompt�below5‰"Enter�Selection"�to�get�the�new�value‚for‚the‚field‰from�the�user.} VAR"‚ch‚:�CHAR;„{input�char�from�user}‚iƒ:�INTEGER;�{index} BEGIN„{RdNewVal} ?‚{blank�out�valbuf�and�userbuf�which�will�receive�user's�input}‚FOR�i�:=�1�TO�vallen�DO„BEGIN†valbuf�[i]�:=�blank;†userbuf�[i]�:=�blank;„END; )‚{write�field�name�and�message�on�screen}‚FOR�i�:=�1�TO�namelen�DO6„write�(parmscrn.scrnln�[ord(choice),i]);…{field�name}!‚write�('�-�Enter�new�value�:‚');‚force�(output);—{write�buffer} :‚IF�NOT�eoln(input)�THEN„{more�than�carriage�return�input}„BEGIN�{not�eoln}&†SkipBlnks�(ch);ˆ{skip�leading�blanks}7†IF�(ch�=�blank)�AND�eoln�(input)�{only�blanks�on�line}ˆTHEN�SetMsg�(ok,�badval); +†IF�ok�THENƒ{more�than�just�blanks�on�line} ˆBEGIN�{ok}Ši�:=�1;�{index�to�valbuf}9Š{read�until�end�of�line�or�end�of�input�buffer�or�blank}?ŠWHILE�(NOT�eoln(input)�AND�(i�<�vallen�)�AND�(ch�<>�blank))�DOŒBEGINŽvalbuf�[i]�:=�ch; Ži�:=�i�+�1; Žread�(ch);ŒEND;Švalbuf�[i]�:=�ch; ,ŠIF„((valbuf[1]�=�'C')�OR�(valbuf[1]�=�'c'))-ŒAND�((valbuf[2]�=�'T')�OR�(valbuf[2]�=�'t'))-ŒAND�((valbuf[3]�=�'R')�OR�(valbuf[3]�=�'r'))-ŒAND�((valbuf[4]�=�'L')�OR�(valbuf[4]�=�'l'))ŒAND�NOT�eoln�(input)ŒTHENŽBEGIN �read�(ch);�valbuf[6]�:=�ch;ŽEND; DŠ{if�end�of�data�reached�&�still�not�eoln�then�blank�must�come�next}(ŠIF�(NOT�eoln�(input))�AND�(ch�<>�blank)ŒTHEN�SetMsg�(ok,�badval); ˆEND;�{ok} ,†FOR�i�:=�1�TO�vallen�DO†{save�user's�input}ˆuserbuf�[i]�:=�valbuf�[i]; „END�{not�eoln} 9„ELSE�SetMsg�(ok,�badval);ƒ{only�carriage�return�entered} ‚readln;�{finish�off�read} END;…{RdNewVal}{$E}   +{�C�O�N�V�E�R�S�I�O�NƒP�R�O�C�E�D�U�R�E�SŽ}  >PROCEDURE CkValbuf (VAR choice : selection; VAR ok : BOOLEAN); 8 {CkValbuf tests each location in the buffer to see that4�only‚legal‚characters‚for�that�base�are�present.‚If8 the string is decimal or hexadecimal then the number of6�digits‚is‚counted�to�make�certain�that�the�value�will5�not�be�too�large.‚Decimals�will�need�a‚further‚check8 later in ASCI2bin to be certain that the value will not5�overflow.‚Binary�integers�can�not�be�too‚large‚since only 32 maximum are read.} VAR‚iƒ:�INTEGER;ƒ{index}%‚first�:�CHAR;„{first�char�in�valbuf} BEGIN {CkValbuf} %‚{start�search�for�control�character}*‚IF�(valbuf[2]�=�'T')�OR�(valbuf[2]�=�'t'))„THEN�i�:=�6„{control�char�in�location�6}*„ELSE�i�:=�2;ƒ{control�char�in�location�2} C‚{if�baud�rate�=�134.5�this�must�be�handled�as�a�special�case�since?ƒit�is�a�real�number�and�value�is�an�integer;�we�fool�Pascal�by:ƒchanging�it�to�an�integer�here�and�doing�the�rest�of�this>ƒprocedure;�note�that�134.5�is�in�the�baud�rate�table�as�1345} 8ƒIF�(ord(choice)�=�baudrate)�AND�(target.devtype�=�term)…THEN,‡IF�(valbuf�[1]�=�'1')�AND�(valbuf[2]�=�'3')-ŠAND�(valbuf�[3]�=�'4')�AND�(valbuf[4]�=�'5')‰THEN�SetMsg�(ok,�badbaud)‰ELSE,‹IF�(valbuf�[1]�=�'1')�AND�(valbuf[2]�=�'3')-�AND? �(valbuf�[3]�=�'4')�AND�(valbuf[4]�=�'.')�AND�(valbuf�[5]�=�'5')�THEN‘BEGIN“valbuf�[4]�:=�valbuf[5];“valbuf�[5]�:=�blank;‘END; ‚IF�ok�THEN „BEGIN�{OK}"„first�:=�valbuf[1];„{select�base}„CASE�first�OF†'%'‚:�{check�rest�of�buffer} �BEGIN‚{%}�i�:=�2;ƒ{first�char�=�%}!�{vallen-last�allowable�location}#�WHILE�((valbuf[i]�<>�blank)�AND�ok—AND�(i�<�vallen))�DO‘IF�(valbuf[i]�=�'0')“OR�(valbuf[i]�=�'1')“THEN‚i�:=�i+1“ELSE�SetMsg�(ok,�badval); �END;�{%} *‡'0','1','2','3','4','5','6','7','8','9'�:�BEGIN�{digit}�i�:=�1;$�{maxdecloc-last�allowable�location}'�WHILE�((valbuf[i]�<>�blank)�AND�ok)�DO‘IF�(('0'�<=�valbuf[i])“AND�(valbuf[i]�<=�'9'))“THEN‚i�:=�i+1“ELSE�SetMsg�(ok,�badval); �END;�{digit} †'$'�:�{check�rest�of�buffer} �BEGIN�{$}�i�:=�2;$�{maxhexloc-last�allowable�location}'�WHILE�((valbuf[i]�<>�blank)�AND�ok)�DO‘IF�(('0'�<=�valbuf[i])“AND�(valbuf[i]�<=�'9'))“OR�(('A'�<=�valbuf[i])“AND�(valbuf[i]�<=�'F'))“OR�(('a'�<=�valbuf[i])“AND�(valbuf[i]�<=�'f'))“THEN‚i�:=�i+1“ELSE�SetMsg�(ok,�badval); ŽEND;�{$} $ˆ'C','c'�:�IF‚((valbuf[2]�<>�'T')�OR˜(valbuf[2]�<>�'t'))’AND�((valbuf[3]�<>�'R')�OR—(valbuf[3]�<>�'r'))’AND�((valbuf[4]�<>�'L')�OR—(valbuf[4]�<>�'l'))’AND�((valbuf[5]�<>�'-')�OR—(valbuf[5]�<>�'/')�OR—(valbuf[5]�<>�blank))’AND�((valbuf[6]�<�blank)�OR—(valbuf[6]�>�chr�(16#7F)))•THEN�SetMsg�(ok,�badval);!ˆ'^'„:‚IF�((valbuf[2]�<�blank)�OR–(valbuf[2]�>�chr�(16#7F))�ORý æLï7÷Rÿ<CGGF'1/D7<??GHOEW–(valbuf[3]�<>�blank))”THEN�SetMsg�(ok,�badval);ˆOTHERWISE�SetMsg�(ok,�badval); †END;�{case} „END;�{OK} END;‚{CkValbuf}{$E}  ;PROCEDURE CTRL2bin (VAR value : longint; VAR ok : BOOLEAN); Bƒ{CTRL2bin�converts�the�ASCII�character�in�the�CTRL�string�entered6„by�the�user�into�hexadecimal�by�subtracting�$40.ƒLeftƒjustify�the�number.} VAR‚chƒ:�CHAR;…{char�in�buffer} BEGIN„{CTRL2bin} A‚IF�valbuf[1]�=�'^'…{^�indicates�control�char,�else�CTRL�is�used}F„THEN�ch�:=�valbuf[2]�{^�-->�control�char;�ch�in�location�2�of�buffer}I„ELSE�ch�:=�valbuf[6];{CTRL�-->�control�char;�ch�in�location�6�of�buffer}#‚IF�ch�>�'_'�{ch�=�$60�through�$7F}7„THEN�ch�:=�chr(ord(ch)�-�32);�{ch�-->�$40�through�$5F}?‚value�:=�ord�(ch)�-�ord('@');�{control�char�=�$00�through�$1F} END;…{CTRL2bin}{$E}  9PROCEDURE ASCI2bin (VAR value : longint; size : smallint;+”VAR�choice�:�selection;�VAR�ok�:�BOOLEAN); C{ASCI2bin converts the ASCII string value typed in by the user intoCan�integer.‚When�valbuf�reaches�this�procedure,�the�first�characterCin the buffer is known to be valid and all the other characters areHknown to be in agreement with the base expressed by the first character.HNo more than the maximum number of characters for the respective base isIin�the�buffer.ƒThus,�overflow�will�not�occur,�except�possibly�in�the�caseIof decimal digits where the value for the maximum number of digits may beHtoo�large.‚This�case�is�checked�for�near�the�end�of�the�procedure�as�theGinteger�value�is�being�built.‚When�this�procedure�ends,�value�holds�theinteger. Algorithm: 31.‚Determine�the�base�and�set�the�base�multipliers.2.‚Count�the�number�of�digits.M3.‚Beginning�at�the�right-hand�side�of�the�buffer;�convert�the�digits�into�anH„integer�in�the�proper�base,�raise�it�to�its�correct�place�value�and�add „it�to�value.K4.‚In�the�case�of�decimal�integers,�check�the�size�of�value�just�before�theK„digit�in�location�1�is�added�on�to�make�sure�that�overflow�does�not�occur.J„Also,�check�the�first�location�to�make�sure�it�is�not�a�digit�that�is�soo!„large�that�overflow�would�occur.:5.‚Check�size�of�integer�with�size�from�parameters�table.} @ CONST /{maximum positive decimal integer = 4294967295} 7‚loc1ƒ=�1;‰{location�of�most�significant�decimal�degit}4‚maxdecidgt�=�10;„{maximun�number�of�decimal�digits}B‚max9chval�=�294967295;�{max�value�that�9�least�significant�digits*šcan�have�if�the�most�significant�digit=4}?‚maxsigdgt�=�'4';„{max�value�most�significant�digit�can�have�if&—9�least�significant�digits=max9chval}  VAR‚digit„:�char;‚base…:�longint;‚placeval�:�longint;‚temp…:�longint;‚left…:�integer;‚right„:�integer;‚count„:�integer; ‚iˆ:�integer;‚decimal‚:�boolean; BEGIN„{ASCI2bin} ?‚{baud�rate�=�134.5�is�a�special�case�of�a�real�number;�we�fool5ƒPascal�typing�by�changing�it�into�an�integer�=�1345}9‚IF�(ord�(choice)�=�baudrate)�AND�(target.devtype�=�term)„THEN+†IF�(valbuf[1]�=�'1')�AND�(valbuf[2]�=�'3'),ˆAND�(valbuf[3]�=�'4')�AND�(valbuf[4]�=�'.')ˆAND�(valbuf[5]�=�'5')†THENˆBEGINŠvalbuf[4]�:=�valbuf�[5];Švalbuf[5]�:=�blank;ˆEND; $‚{identify�base�and�set�multipliers}‚decimal�:=�false;‚CASE�valbuf[1]�OF „'%'‡:�BEGIN ’left�:=�2; ’base�:=�2;�END; „'$'‡:�BEGIN ’left�:=�2; ’base�:=�16;�END;„OTHERWISEƒBEGIN ’left�:=�1; ’base�:=�10;’decimal�:=�true;�END; „END;�{CASE} ‚placeval�:=�base; ‚{count�number�of�digits} ‚i�:=�left; ‚count�:=�0;3‚WHILE�((valbuf[i]�<>�blank)�AND�(i�<�vallen+1))�DO„BEGIN†count�:=�count�+�1; †i�:=�i+1;„END; 7‚{convert�digit;�multiply�by�place�value;�add�to�value}/‚IF�count�>�0„{there�exists�at�least�one�digit}„THEN�{count�>�0}†BEGIN�{count�>�0} ˆvalue�:=�0;6ˆright�:=�left�+�count�-�1;�{start�at�right�of�valbuf}5ˆIF�('0'�<=�valbuf[right])�AND�(valbuf[right]�<=�'9')ŠTHEN'Œvalue�:=�ord(valbuf[right])�-�ord('0')ŠELSE5ŒIF�('a'�<=�valbuf[right])�AND�(valbuf[right]�<=�'f'),ŽTHEN�value�:=�ord(valbuf[right])�-�ord('W')-ŽELSE�value�:=�ord(valbuf[right])�-�ord('7');9ˆFOR�i�:=�right-1�downto�left�DO�{move�to�left�of�valbuf}ŠBEGIN�{convert}-ŒIF�('0'�<=�valbuf[i])�AND�(valbuf[i]�<=�'9')ŽTHEN"�temp�:=�ord(valbuf[i])�-�ord('0')ŽELSE,�IF�('a'�<=�valbuf[i])�AND�(valbuf[i]�<='f')'’THEN�temp�:=�ord(valbuf[i])�-�ord('W')(’ELSE�temp�:=�ord(valbuf[i])�-�ord('7'); Œ{check�for�overflow�on�decimal}3ŒIF�decimal�AND�(i�=�loc1)�AND�(count�=�maxdecidgt)ŽTHEN9�IF�((value�>�max9chval)�AND�(valbuf[loc1]�>=�maxsigdgt))�OR�(valbuf[loc1]�>�maxsigdgt)’THEN�SetMsg�(ok,�badrange); .Œ{multiply�by�place�value,�add�to�accumulator}ŒIF�OKŽTHEN�BEGIN$’value�:=�value�+�(temp�*�placeval);’placeval�:=�placeval�*�base;�END;ŠEND;†END�{count�>�0}&„ELSE�{count�=�0}�SetMsg�(ok,�badval); %‚IF�(NOT�((target.devtype�=�term)�AND(…(ord�(choice)�=�baudrate)))�AND�ok�THEN „CASE�size�OF/†1�:‚IF�value�>�255�THEN�SetMsg�(ok,�badrange);1†2�:‚IF�value�>�65535�THEN�SetMsg�(ok,�badrange);7†4�:‚BEGIN�END;�{the�value�for�4�bytes�is�checked�above,—because�it�needs�special�overflow�handling}„END; END;…{ASCI2bin}{$E}  ;PROCEDURE ModStrVal (choice : selection; VAR ok : BOOLEAN); 1‰{ModStrVal�takes�the�string‚in‚the‚value‚buffer,3Šchecks‚to‚see‚that‚only‚the�correct�characters�are7Špresent�and�changes�each�character�to�an�integer‚type.8ŠThe�integer�value�is�checked�against�the�range�for�that4Šfield.‚If�it�is�not�within�range,�then�OK‚is‚set‚to7Šfalse�so�that�an�error�can�be�reported.‚Otherwise,�the4Šoffset�for�the�parameter�field‚indexed‚by‚choice‚is0Šobtainedƒfrom‚the‚parameter‚table‚pointed‚to‚by5Šparmptr.‚The�assembly�procedure,�MODSTRCB,‚is‚called7Što�put�the�new�value�into�CB�in�CONFIG's�storage�area. 5ŠThe‚value‚ranges‚obtained�from�the�table�will�be�the6Šupper�and�lower�bounds�on�the�size�of�the‚number‚that/Šthe‚field‚can‚hold.ƒNo‚attempt‚will‚be‚made�to1Šdetermine�if�the‚number‚is‚"sensible".ƒIt‚is‚not3Šwithin‚the‚realm‚of‚CONFIG‚to�censor�these�values.3ŠThis�activity�is�properly�left‚to‚the‚user‚and‚the Šdrivers.} VAR+‚offseti…:�longint;†{offset�to�field�in�CB}+‚sizei‡:�smallint;…{size�o@ f�field�in�bytes}8‚value‡:�longint;†{value�which�valbuf�string�represents}‚i,j‰:�INTEGER;†{index}'‚chŠ:�CHAR;‰{an�input�char�from�valbuf} >PROCEDURE GetBaudCode (VAR value : longint; VAR ok : BOOLEAN); Dƒ{GetBaudCode�searches�through�the�baud�rate�table�for�the�baud�rateC„that�the�user�input.‚If�it�is�found,�then�value�takes�on�the�tableC„index�which�corresponds�to�the�baud�rate�code.‚Otherwise,�the�user=„has�input�an�invalid�baud�rate�and�an�error�message�is�set.} VAR6‚found†:�BOOLEAN;�{indicates�if�baud�rate�is�in�table}-‚code‡:�longint;�{index�into�baud�rate�table} BEGIN {GetBaudCode} ‚code�:=�0;‚found�:=�false;,‚WHILE�(NOT�found�AND�(code�<=�numcodes))�DO„IF�value�=�baudptr^[code].rate†THENˆBEGINŠfound�:=�true;Švalue�:=�code;ˆEND†ELSE�code�:=�code�+�1; (‚IF�NOT�found�THEN�SetMsg�(ok,�badbaud); END;‚{GetBaudCode}   BEGIN‚{ModStrVal} C‚WITH�parmptr^.parmrow�[ord�(choice)]�DO„{get�info�from�parm�table}„BEGIN2†offseti�:=�offset;…{offset�into�CB�for�parameter}-†sizeiƒ:=�size;‡{#�of�bytes�in�the�parameter}„END; ;‚ch�:=�valbuf[1];�{get�first�char�in�buf�for�checking�base}B‚IF�(('0'�<=�ch)�AND�(ch�<=�'9'))�OR�(('A'�<=�ch)�AND�(ch�<=�'F'))=‡OR�(('a'�<=�ch)�AND�(ch�<=�'f'))�OR�(ch�=�'%')�OR�(ch�=�'$')‡OR�(ch�=�'^')„THEN†BEGIN‚{valid�first�char}>ˆCkValbuf�(choice,�ok);�{check�rest�of�buffer�for�valid�chars} (ˆIF�ok�{buffer�has�all�valid�characters}ŠTHEN#ŒBEGINŒ{send�to�conversion�routine}1ŽIF�(((valbuf[1]�=�'C')�OR�(valbuf[1]�=�'c'))�AND*‘((valbuf[2]�=�'T')�OR�(valbuf[2]�=�'t')))‘OR�(valbuf[1]�=�'^'):�THEN�CTRL2bin�(value,�ok)‚{get�hex�code�for�control�char}@�ELSE�ASCI2bin�(value,�sizei,�choice,�ok);�{bin,�hex�or�decimal} 9ŽIF�(ord�(choice)�=�baudrate)�AND�(target.devtype�=�term)�THEN�GetBaudCode�(value,�ok); ŽIF�okŠ{number�converted�ok}�THEN!’BEGIN†{put�value�into�Pascal�CB}&”MODSTRCB�(CB,�offseti,�sizei,�value);,”IF�(valbuf�[1]�=�'$')�OR�(valbuf�[1]�=�'%')–THEN�j�:=�valcol-1–ELSE˜BEGIN šj�:=�valcol;"šparmscrn.scrnln�[ord�(choice),�j] �:=�blank;˜END;9”FOR�i�:=�1�TO�vallen�DO�{put�new�value�string�in�screen}$–parmscrn.scrnln�[ord�(choice),�j+i]�:=�userbuf�[i];%”{mark�screen�where�value�is�changed}1”parmscrn.scrnln�[ord�(choice),�astrkcol]�:=�star’ENDˆ{put�value�in�CB}0�ELSE�SetMsg�(ok,�badrange)ƒ{#�not�converted�OK} �ENDƒ{all�valid�characters}‹ELSE�SetMsg�(ok,�badval) ‡END+…ELSE�SetMsg�(ok,�badval);�{1st�char�valid}  END;ƒ{ModStrVal}{$E}   +PROCEDURE ModAttr (VAR cnfgtime : BOOLEAN); 9…{ModAttr�will�display�the�attributes�menu�for�the�target9…After�the�user�types�"Q",‚the‚target‚device's‚parameters5…menu‚will‚be‚redisplayed�with�the�revised�attributes?…word.‚If�"C"�is�chosen�then�the�config�menu�will�be�displayed,$…skipping�over�the�parameters�menu.} VARF‚oldattr„:�mask;†{unaltered�attributes�word�used�for�later�comparison}@‚value†:�medint;„{binary�value�of�attributes�word,�sized�for�CB}‚i,jˆ:�integer;ƒ{index}%‚ok‰:�BOOLEAN;ƒ{controls�repeat�loop}%‚choice…:�selection;�{menu�selection}*‚offset…:�longint;ƒ{offset�to�field�in�CB}*‚size‡:�smallint;‚{size�of�selected�field}  'PROCEDURE ChgAttr (choice : selection);B…{Chg�attr�changes�the�bit�in�the�attributes�word�and�puts�the�new!†value�into�the�attributes�menu.} ‚BEGIN�{ChgAttr} <ƒi�:=�ord�(choice);ˆ{find�attributes�menu�row�for�selection} FƒIF�choice�IN�attrword‚{bit�is�1,�so�val1�in�avaltbl�is�current�value}…THEN‡BEGIN‡{bit=1}3‰attrword�:=�attrword�-�[choice];�{change�bit�to�0}‰FOR�j�:=�1�TO�attrvallen�DO3‹attrscrn.scrnln�[i,j+valcol]„{and�put�in�attrscrn}�:=�avalptr^.valrow[i].val0[j]; ‡END‰{bit=1}…ELSE�{bit�is�0}‡BEGIN‡{bit=0}3‰attrword�:=�attrword�+�[choice];�{change�bit�to�1}‰FOR�j�:=�1�TO�attrvallen�DO3‹attrscrn.scrnln�[i,j+valcol]„{and�put�in�attrscrn}�:=�avalptr^.valrow[i].val1[j]; ‡END;ˆ{bit=0} 3„{put�*�into�attributes�menu�in�front�of�new�value}&„attrscrA n.scrnln�[i,astrkcol]�:=�star;‚END;‚{change�attributes�value} PROCEDURE awd2ASCInInt;E{awd2ASCInInt changes the attributes word from a set variable into an ASCII string and a integer.} VAR=‚bit„:�selection;ˆ{enumerated�value�used�to�see�if�bit�is�on}‚i†:�integer;Š{index}7‚place‚:�medint;‹{accumulates�place�value�for�base�=�2} BEGIN {awd2ASCInInt}  !‚{convert�attrword�to�an�integer})‚place�:=�2;‚{set�up�base�for�conversion}‚IF�zero�IN�attrwordˆ{bit�=�1}„THEN�value�:=�1„ELSE�value�:=�0;‰{bit�=�0} B‚FOR�bit�:=�one�TO�fifteen�DO�{do�rest�of�bits�in�attributes�word}„BEGIN‚{process�bit}D†IF�bit�IN�attrword�{add�place�value�to�value�&�put�'1'�into�valbuf}ˆTHEN‡{bit�=�1}8Œvalue�:=�value�+�place;„{add�value�for�this�power�of�2}*†place�:=�place�*�2;Ž{get�next�power�of�2}„END;�{process�bit} 4‚{convert�attrword�to�an�ASCII�string�for�parm�menu}+‚valbuf�[1]�:=�'%';‚{indicate�binary�value}3‚FOR�i�:=�2�TO�vallen�DO„{blank�out�rest�of�valbuf}„valbuf�[i]�:=�blank; ‚i�:=�2;"‚FOR�bit�:=�fifteen�DOWNTO�zero�DO„BEGIN†IF�bit�IN�attrwordˆTHEN�valbuf[i]�:=�'1'ˆELSE�valbuf[i]�:=�'0'; †i�:=�i�+�1;„END; END; {awd2ASCInInt}  BEGIN„{ModAttr} %‚ok�:=�true;�{start�with�clean�slate}@‚oldattr�:=�attrword;ƒ{keep�old�value�to�see�if�it�gets�changed} ‚REPEAT 6„WrValMenu�(attrscrn,�choice);‚{write�attributes�menu} /„RdChoice�(OK,�choice);œ{get�users�menu�choice} H„IF�ok�AND�((choice�=�help)�OR�(choice�=�quit)‚{check�for�valid�choices}5ŠOR�(choice�=�cnfg)�OR�(ord(choice)�<�numattrlns-2‚))†THEN‚{user�made�good�choice} ‡BEGIN�{valid�choice}=ˆIF�choice�IN�attrmask‚{bit=1;�means�attribute�is�modifiable}$‰THENƒ{choice�is�modifable�or�legal}ŠBEGIN„{good�choice} ‹CASE�choice�OFŽ{find�choice} #Œzero,�one,�two,�three,�four,�five,&Œsix,�seven,�eight,�nine,�ten,�eleven,$Œtwelve,�thirteen,�fourteen,�fifteen.‘:�ChgAttr�(choice);‚{change�attributes�value}Œcnfg�:�cnfgtime�:=�true;0Œhelp�:�WrHelpMenu�(attrhelp);‚{write�help�menu}(Œquit�:�BEGIN�END;�{no�action�necessary} ‹END;�{case}ŠEND�{good�choice}1ˆELSE�SetMsg�(ok,�badnum)…{choice�not�modifiable}‡END�{valid�choice}2†ELSE�SetMsg�(ok,�badchoice);ƒ{choice�not�on�menu} E„UNTIL�ok�AND�((choice�=�quit)�OR�(choice�=�cnfg));„{end�repeat�loop}  +„{show�field�as�changed�in�attributes�menu}.„IF�oldattr�<>�attrword�THENƒ{change�was�made}†BEGIN'ˆparmscrn.scrnln�[0,�astrkcol]�:=�star; :ˆ{change�attrword�into�ASCII�string�and�compute�its�value}ˆawd2ASCInInt; ;ˆGrpBits;�{groups�attrword�in�valbuf�into�4�groups�of�bits} ,‡{put�ASCII�string�into�the�parameters�menu}‡FOR�j�:=�1�TO�vallen�DO.Šparmscrn.scrnln�[0,j+valcol-1]�:=�valbuf�[j]; ‡{put�value�into�CB}‰CB.attrword�:=�value; †END;‰{change�was�made} END;…{ModAttr}  I{=======================================================================}  !{’M�A�J�O�R„P�R�O�C�E�D�U�R�E�S•}  E{The following procedures are called directly by the main procedure.}  PROCEDURE Initialize; A…{Initialize�calls�procedures�which�initialize�many�of�the�globalC…variables.‚INITLIZE�initializes�regsav�and�CB.‚It�also�initializesG…the�pointers�which�point�to�the�tables�for�building�the�parameters�andC…attributes�screens,�the�miscellaneous,�menus�and�the�help�screens.E…DoHeader�puts�the�header�into�the�parameters�and�attributes�screens.3…Fixscreen�takes�care�of�the�clear�screen�command.} BEGIN {Initialize} E‚INITLIZE�(regsav,�CB,�ptptr,�atptr,�vtptr,�asmmem,�parmhdr,�attrhdr,8‹nomod,�dnmmnptr,�bfmmnptr,�CBmnptr,�cfgmnptr,�cpymnptr,&‹CBthelp,�bfmhelp,�parmhelp,�attrhelp,(‹cnfghelp,�copyhelp,�logondev,�baudptr); ‚DoHeader; ‚FixScreen; END; {Initialize}{$E}  BPROCEDURE GetDevName (var menu : menutype; var goodbye : BOOLEAN); N‚{GetDevName�gets�the�name�of�the�device�which�the�user�wishes�to�reconfigure.GƒIf�the�user's�response�is�a�carriage�return,�then�CONFIG�terminatesA �byKƒsetting�goodbye�to�true�and�dropping�out�of�the�case�statement�upon�returnIƒto�main.‚If�the�device�name�has�invalid�syntax�or�if�the�device�does�notMƒexist�or�if�the�target�device�is�a�printer�and�the�spooler�is�active,�or�theKƒdevice�is�busy,�then�message�is�selected�for�display�and�the�BOOLEAN�ok�isHƒset�to�false�so�that�a�message�is�printed�and�a�new�request�for�a�validGƒdevice�name�is�presented.‚The�procedure�will�continue�to�display�errorMƒmessage�and�ask�for�a�device�name�until�either�a�good�name�is�entered�or�theGƒuser�types�a�carriage�return�to�exit.‚At�the�end�of�the�procedure,�theAƒmenu�is�set�to�control�the�calling�of�the�next�major�procedure.} VAR1‚ok‡:�BOOLEAN;ƒ{indicates�if�user�input�is�valid}B‚nochoice�:�selection;�{undefined,�needed�only�for�procedure�call}‚iˆ:�integer;ƒ{index}+‚dname„:�strg4;…{array�for�the�device�name} BEGIN {GetDevName} E‚InitTblPtrs;…{init�pointers�to�sets�of�tables�used�to�build�screens}L‚CLSDASGN�(asmmem,�duration);�{close�any�outstanding�assignment�to�a�device} C‚REPEAT�{write�menu�&�get�name�until�name�is�ok�or�user�terminates} !„WrMiscMenu�(dnmmnptr,�nochoice); 0„RdDevName�(ok,�dname);„{get�target�device�name} ,„IF�ok�AND�NOT�goodbye�THEN�{get�target�DCB}†BEGINˆFOR�i�:=�1�to�sz4�DOBŠtarget.name[i]�:=�dname[i];…{device�name�goes�into�target�record}CˆIF�target.name�=�regsav.devid…{target�device�is�also�logon�device}ŠTHEN�trgteqlg�:=�trueŠELSE�trgteqlg�:=�false;ˆtarget.devtype�:=�0;ˆZeroCB;,ˆGETMEMCB�(target,�regsav.ulognum,�CCB,�DCB,’amask,�pmask,�Caword,�Daword,)’parmptr,�attrptr,�avalptr,�asmmem,�msg);?ˆIF�msg�<>�none�THEN�ok�:=�false;�{something�wrong�in�GETMEMCB}ˆIF�msg�=�stopscrn9ŠTHEN�StopScreen;‡{stop�screen�for�error�message�reading}ˆIF�(target.devtype�=�fdisk)�OR‹(target.devtype�=�hdisk)‰THEN‹BEGIN�msg�:=�notcnfg; �ok�:=�false;‹END;†END; '‚UNTIL�goodbye�OR�ok;�{end�repeat�loop} ,‚menu�:=�CBtype;‚{next�menu�to�be�displayed}END; {GetDevName}{$E}  *PROCEDURE GetCBType (var menu : menutype); M‚{GetCBType�determines�if�the�user�wants�to�modify�the�DCB�or�the�CCB.‚If�theMƒuser�makes�an�invalid�selection�or�wants�to�modify�the�DCB�and�is�not�user�0Lƒthen�msg�is�set�appropriately�and�an�error�message�will�be�displayed�at�the'ƒtop�of�a�new�presentation�of�the�menu. (ƒChoice�holds�the�user's�menu�selection. BƒIf�the�user�makes�valid�selections,�then�at�the�end�of�GetCBType,GƒBldScrns�is�called�to�construct�the�necessary�menus�for�displaying�the>ƒfields�and�values�in�CB.‚The�next�menu,�parms,�is�assigned�to@ƒturn�control�over�to�the�next�major�procedure,�ModParms.‚If�theCƒuser�selected�"Q",�however,�execution�is�moved�back�to�getting�the(ƒdevice�name�by�setting�menu�to�device.} VAR)‚choice„:�selection;�{user's�menu�choice},‚okˆ:�BOOLEAN;ƒ{indicates�if�input�is�valid} BEGIN {GetCBType} N{fix masks to accept valid letter choices for parameters and attributes menus}+‚pmask�:=�pmask�+�[help]�+�[cnfg]�+�[quit];+‚amask�:=�amask�+�[help]�+�[cnfg]�+�[quit]; ‚REPEAT 3„WrMiscMenu�(CBmnptr,�choice);ƒ{write�CB�type�menu}3„RdChoice�(ok,�choice);”{get�user's�menu�selection} H„IF�ok�AND�((choice�=�one)�OR�(choice�=�two)‚{user�made�valid�selection}'ŠOR�(choice�=�help)�OR�(choice�=�quit))†THEN‡BEGIN�{goodchoice}ˆparmmask�:=�pmask;ˆattrmask�:=�amask;ˆCASE�choice�OF(Šone�{perm}�:�BEGIN�{configure�defaults}1™IF�regsav.ulognum�=�0…{user�0�is�running�CONFIG}›THEN�BEGIN* duration�:=�perm;�{configure�defaults�ok}  CB‡:=�DCB;�END,›ELSE�{only�user0�can�do�configure�defaults}�SetMsg�(ok,�baduser);—END;'Štwo�{temp}�:�BEGIN�{configure�request}™duration�:=�temp; ™CB‡:=�CCB;.™parmmask�:=�parmmask�-�[two];�{write�timeout}/™parmmask�:=�parmmask�-�[three];�{read‚timeout}™IF�target.devtype�=�term›THEN�BEGIN! attrmask�:=�attrmask�-�[twelve];# attrmask�:=�attrmask�-�[thirteen];# attrmask�:=�attrmask�-�[fourteen];"B  attrmask�:=�attrmask�-�[fifteen];�END;—END;3Šhelp‡:�WrHelpMenu�(CBthelp);…{display�help�screen}0Šquit‡:�menu�:=�device;�{go�back�to�device�menu}"ŠOTHERWISE�Setmsg�(ok,�badchoice); ˆEND;�{case}‡ENDƒ{goodchoice}†ELSE�SetMsg�(ok,�badchoice); („UNTIL�ok�AND�(choice�<>�help);�{repeat} ;„IF�(choice�=�one)�OR�(choice�=�two)‚{conf�req�or�conf�def}†THENˆBEGIN1Šmenu�:=�parms;‚{give�control�to�parameters�menu}!ŠBldScrns;‡{make�parameters�menu}ˆEND; END; {GetCBType}{$E}  )PROCEDURE ModParms (VAR menu : menutype); 4„{ModParms�(var�menu‚:‚menutype)‚calls‚procedures‚to2…write‚the‚device‚parameters‚menu;‚read,‚check�and6…convert�the�user's�response�to�an�integer;‚and‚revise6…the‚target's�field�values�in�CB�and�on�the�screen.‚If5…the�attributes�word�is�choosen�for‚revision,‚it‚will2…call‚a‚procedure‚to‚do‚similar‚operations�for�the…attributes�word. …ModParms�works�as�follows. 3…After�the�menu�is�written‚and‚the‚user's‚choice‚is7…read,‚the�choice�must�be�checked�to�determine�if�it�is1…a�valid�choice�for‚that‚screen.ƒIf‚the‚choice‚is7…valid,‚then�it�must�be�determined�if�the�target�device7…is�a�terminal.‚If�it�is�a�terminal�then�choice�must�be1…adjusted‚if‚the‚chosen‚field‚is‚after�XOFF.‚This8…occurs�because�in�the�parameters�mask,�XOFF/XON�are�the6…same‚bit;‚but�for�the�user's�convenience�the�two�have7…been�split�into�two�fields�in�the�parameters�menu‚with4…different‚selection‚numbers‚to�identify�them.‚Thus,8…any�field�choice�after�the�XOFF�choice�on�a�terminal�is…off�by�one�until�adjusted. 3…Once‚a‚valid‚choice‚is‚made�and�the�above�has�been7…performed,�a�case�statement�is�entered�to�give‚control…to�the�proper�procedure. 5…If‚the‚attributes‚word�is�selected�for�modification,6…when�control�returns�to�ModParms,�the‚parameters‚menu4…is‚ready‚for‚display‚with�the�attributes�word�field6…modified.‚The�same�logic�applies�when�control‚returns…from�ModStrVal.} VAR7‚choice,�adjchoice�:�selection;ƒ{user's�menu�selection}5‚notdone‚:�BOOLEAN;Š{attributes�menu�selected�signal} ‚cnfgtime�:�BOOLEAN;Š{configure}:‚ok‡:�BOOLEAN;Š{keeps�repeat�loop�going�until�valid�input} BEGIN {ModParms}%‚OK�:=�true;†{start�with�clean�slate}‚cnfgtime�:=�false;�{configure} ‚REPEATƒIF�cnfgtime�THEN„BEGIN+†menu�:=�cnfig;‚{print�configure�menu�next}@†choice�:=�cnfg;�{configure�chosen�in�attributes�menu�selection}„END ƒELSE�{configure�not�chosen�yet} „BEGIN�{parameters�menu}0„notdone�:=�true;�{attributes�menu�not�selected} „{display�parameters�menu}„WrValMenu�(parmscrn,�choice); „RdChoice�(ok,�choice); @„{if�input�is�valid�then�check�if�choice�is�valid�for�this�menu}A„IF�ok�AND�((choice�=�cnfg)�OR�(choice�=�quit)�OR�(choice�=�help)!‹OR�(ord(choice)�<�numparmlns-3))†THEN$ˆBEGIN�{valid�parameter�menu�choice}>Š{if�target�is�terminal�and�choice�is�between�XON�and�terminal;‹code�inclusive�then�adjust�choice�for�XOFF/XON�as�same�bit ‹in�parmmask}0ŠIF�((target.devtype�=�term)�AND�(choice�>�five)”AND�(choice�<=�sixteen)) ŒTHEN�adjchoice�:=�pred�(choice)ŒELSE�adjchoice�:=�choice; 7Š{if�target�is�a�hard�disk�or�a�floppy�disk�then�bit�15A‹controls�both�reduced�write�current�cylinder�number�and�ECC�dataC‹burst�length�which�are�separate�parameters�in�the�CB�and�the�menu};ŠIF�(((target.devtype�=�hdisk)�OR�(target.devtype�=�fdisk))�AND�(choice�=�seventeen))$ŒTHEN�adjchoice�:=�pred�(adjchoice); ŠIF�adjchoice�=�zeroŒTHENŽBEGIN4�ModAttr�(cnfgtime);�{this�is�always�a�valid�choice}�notdone�:=�false;ŽENDŒELSE?Ž{move�adjchoice�down�by�one�to�correspond�to�bits�in�parmmask;;�zero�is�attributes�word�in�menu�but�attributes�word�is�not�part�of�real�parmmask};ŽIF�adjchoice�<=�sixteen�THEN�adjchoice�:=�pred(adjchoice); 6ŠIF�notdone�THEN�BEGIN�{not�attributes�word�selection})Š{determine�if�choice�is�modifable�field}9ŠIF�adjchoice�IN�parmmask‹{bit=1,�so�field�is�modifiable}(ŒTHEN„{choice�is�modifable�aB nd�in�range} ŽCASE�adjchoice�OF„{valid�cases} Ž{modify�parameter�value}6�zero,�one,�two,�three,�four,�five,�six,�seven,�eight,8�nine,�ten,�eleven,�twelve,�thirteen,�fourteen,�fifteen, �sixteen�:˜BEGINšRdNewVal�(OK,�choice);"šIF�ok�THEN�ModStrVal(choice,�OK);˜END;"�cnfg�:�menu�:=�cnfig;„{configure}�help�:�WrHelpMenu�(parmhelp);/�quit�:�menu�:=�CBtype;ƒ{return�to�get�CB�type} ŽEND‚{case}+ŒELSE�SetMsg�(ok,�badnum);‚{not�modifiable}$ŠEND�{not�attributes�word�selection}ˆEND�{valid�choice}1†ELSE�SetMsg�(ok,�badchoice);…{no�such�selection} ƒEND�{configure�not�chosen�yet} 3‚UNTIL�ok�AND�((choice�=�cnfg)�OR�(choice�=�quit)); &‚IF�choice�=�cnfg�THEN�msg�:=�cnfgnow; END;…{ModParms}{$E}  )PROCEDURE DoConfig (VAR menu : menutype); …{DoConfig�prints�and�reads�the6†Configure�Menu�to�make�certain�that�the�user‚wants‚to4†install‚the‚new‚configuration.‚If�the�user�makes�an4†invalid�selection�the‚Configure‚Menu‚is‚redisplayed"†with�an�error�message�at�the�top. 7†If‚the�user�chooses�to�configure�the�device,�MODMEMCB,.†an�assembly�routine�does�the�configuration.�}  VAR%‚ok�:�BOOLEAN;…{controls�repeat�loop}+‚choice‰:�selection;ƒ{user's�menu�selction}2‚nochoice‡:�selection;ƒ{needed�for�procedure�call}  BEGIN„{DoConfig} ‚REPEAT„WrMiscMenu�(cfgmnptr,�choice);„RdChoice�(ok,�choice);.„IF�ok�AND�((choice�=�cnfg)�OR�(choice�=�help)�OR�(choice�=�quit))†THENˆCASE�choice�OFŠcnfg�:�BEGIN�{cnfg}“MODMEMCB�(asmmem,�target,�CB,�msg,�trgteqlg,�duration);&“IF�msg�<>�none‚{something�went�wrong}•THEN—BEGIN)™IF�msg�<>�stopscrn�{msg�not�printed�yet}"›THEN�WrMsg�(nochoice);‡{print�it}*™StopScreen;ˆ{stop�screen�to�read�message}#™menu�:=�parms;�{go�to�last�screen}—END•ELSE—BEGIN"™menu�:=�copy;�{go�to�next�screen}™msg�:=�cnfgdone;—END; ‘END;�{cnfg}Šhelp�:�WrHelpMenu�(cnfghelp);Šquit�:�menu�:=�parms; ˆEND‚{case}†ELSE�SetMsg�(ok,�badchoice); ƒUNTIL�ok�AND�(choice�<>�help); END;…{DoConfig}{$E}  APROCEDURE CopyNewCB (VAR menu : menutype; VAR goodbye : BOOLEAN); ?…{CopyNewCB�inquires�if�the�user�wants�a‚copy‚of‚the‚parameters/†menu‚for‚the‚reconfigured‚device.ƒIf‚a‚copy‚is.†desired,‚then‚a‚query‚for‚the‚printerƒnameƒis5†presented.ƒOtherwise,‚the�user�can�go�on�to�the�next†device�or�exit. 7†If�a�copy�is�desired�and�the�name�for�the�printer‚that4†the‚user‚enters‚does‚not�exist�or�is�busy,�an�error5†message�is�put�out�by�the�Error�Message‚Handler.ƒThe5†copy‚menu‚is‚redisplayed�to�obtain�further�direction3†from�the�user�and�to�allow�the�user�to�try�again.} VAR.‚ok‡:�BOOLEAN;„{used�to�terminate�repeat�loop},‚choiceƒ:�selection;‚{user's�menu�selection} BEGIN„{CopyNewCB} 8‚BldCnfgScrn;…{make�new�parmscrn�with�configured�values} ‚REPEAT „WrMiscMenu�(cpymnptr,�choice);„RdChoice�(ok,�choice);0„IF�ok�AND�((choice�=�hrdcpy)�OR�(choice�=�help)-‘OR�(choice�=�nextdev)�OR�(choice�=�exiting))†THENˆCASE�choice�OFŠhrdcpy‚:�PrintCopy�(ok);Šhelp„:�WrHelpMenu�(copyhelp);Šnextdev�:�menu�:=�device;Šexiting�:�goodbye�:=�true; ˆEND�{case}„ELSE�SetMsg�(ok,�badchoice); 9‚UNTIL�ok�AND�((choice�=�exiting)�OR�(choice�=�nextdev)); END;…{CopyNewCB}  F{====================================================================} {•M�a�i�nƒP�r�o�c�e�d�u�r�e”} N{The main procedure calls Initialize to initialize tables, menus and pointers.LAfter this is accomplished, main enters a repeat loop, doing major procedureMcalls�to�display�menus�for�the�purpose�of�collecting�user�input.‚The�input�isEapplied and at the end of each procedure a new menu is assigned whichGdetermines�what�procedure�is�called�next.‚This�continues�until�the�userEchooses to exit CONFIG, at which time the repeat loop ends and CONFIG terminates.} BEGIN {main} ‚Initialize;A‚goodbye‚:=�false;‚{goodbye�means�user�wants�to�terminate�CONFIG}1‚menu…:=�device;�{device�is�first�menu�to�appear}6‚duration�:=�perC m;ƒ{first�close�done�doesn't�keep�CCB}1‚msg†:=�banner;�{puts�out�CONFIG�version�message} N‚REPEAT�{uses�currently�assigned�menu�to�choose�major�procedure�for�execution} „CASE�menu�OF8†device„:�GetDevName�(menu,�goodbye);„{gets�device�name}:†CBtype„:�GetCBType‚(menu);�{selects�conf�req�or�conf�def},†parms…:�ModParmsƒ(menu);�{changes�CB�value}2†cnfig…:�DoConfigƒ(menu);�{performs�configuration};†copy†:�CopyNewCB‚(menu,�goodbye);„{gives�user�copy�of�DCB}„END; )‚UNTIL�goodbye;ƒ{user�wants�to�terminate} D‚{if�a�temporary�configuration�was�last�performed�and�the�assignmentCƒstill�exists,�close�the�assignment�with‚bit�3�set�so�that�FHS�willCƒnot�find�the�assignment�and�close�it�without�the�bit�set�causing�a5ƒreconfiguration�of�the�device�to�its�default�values} ‚CLSDASGN�(asmmem,�duration);‚write�(clrscrn);�writeln; END.ééé=/*=/*†CONNECT.AF=/*@=/* Chain file to assemble modules making up the CONNECT utility=/*:=/* If no output argument is specified for the listing the)=/* chain file will default to CONNECT.LS=/*=/IFC \1ƒ=ARG�CONNECT.LS=/ENDIF=/*,=ASM CONNECT1.SA,CONNECT1.RO,TEMP1.LS;RZ=106=/*{ Included files are:=/*ƒ9995.&.UTILITY.MC=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.CONNECT.EQ=/*}=/*,=ASM CONNECT2.SA,CONNECT2.RO,TEMP2.LS;RZ=106=/*{ Included files are:=/*ƒ9995.&.UTILITY.MC=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.CONNECT.EQ=/*}=/*ƒ=COPY�TEMP2.LS,TEMP1.LS;Aƒ=COPY�TEMP1.LS,\1;Yƒ=DEL�TEMP1.LSƒ=DEL�TEMP2.LS=/*=ENDééééé_!C =/*=/*†CONNECT.LF=/*&=/* Chain file to link CONNECT utility=/*:=/* If no output argument is specified for the listing the)=/* chain file will default to CONNECT.LL=/*=/IFC \1ƒ=ARG�CONNECT.LL=/ENDIF=/*=LINK ,CONNECT.LO,\1;HAMIXSATTR PSSEG CONN:0-15 $0INPUT CONNECT1.ROINPUT CONNECT2.ROLIB 0.&.UTILIB.ROEND=/*=ENDééééééh3CONNECT1‚IDNTƒ1,1„Part�of�VERSADOS�utility�CONNECT.O*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***J***…FILENAME:‚CONNECT1�--�USER�MODE�PART�OF�VERSADOS�UTILITY�'CONNECT'.******É***3***…ENVIRONMENT:‚Runs�as�a�task�under�VERSAdos.˜******É***H***…FUNCTION:‚To�connect�two�ports�such�that�characters�coming�in�onƒ***2***‡one�are�sent�to�the�other,�and�vice�versa.˜******É***G***…NOTES:‚In�order�to�achieve�high�throughput,�part�of�the�utility„***C***‡(CONNECT2)�runs�in�supervisor�mode�and�at�interrupt�levels.‡******É***,***…EXTERNAL�DATA�STRUCTURES�REFERENCED: ***D***‡Addresses�of�transparent�mode�interface�tables�are�passed�to†***)***‡the�drivers�for�the�serial�ports.¡******É***)***…EXTERNAL�ENTRY�POINTS�REFERENCED:£******É***"***…SERVICES�CALLED�VIA�TRAPS:ª***'***‡FHS�Assign�of�LU�to�a�terminal.£******‡FHS�Close�of�same.°***G***‡IOS�Change�Default�Configuration�to�set/reset�transparent�mode.ƒ***(***‡TRAP�#1�call�to�Wait�for�Wakeup.¢******É***O*******************************************************************************O*******************************************************************************O*^***************************************************************************** *,*‚Revision�history�(add�new�changes�to�top).*…Date†Author‰ChangesG*…--------‚-------------‚----------------------------------------------8*†1/14/85‚Steve�LudwigƒAdd�check�to�not�connect�to�self.3*…12/20/84‚Peggy�Hassett‚Made�position�independent.<*†7/27/83‚Steve�FranckƒChanged�name�from�TM;�added�option�L.'*†6/�3/83‚StD eve�FranckƒInitial�writing. * *‚XDEF's.*1ŠXDEFƒDATA�The�addr�of�the�data�area�for�CONNECT.<ŠXDEFƒTBL1ADDR,A5_1†Stuff�CONNECT2�needs�to�know�to�call�the*§driver�for�port�1.<ŠXDEFƒTBL2ADDR,A5_2†Stuff�CONNECT2�needs�to�know�to�call�theq/zO‚NŠG’>šG¢?ª@²Iº>Â;ÊQÒ)*§driver�for�port�2.  *0*‚XREF's�(indicate�where�the�XDEF�is,�if�known).*5ŠXREFƒTBL1,TBL2ŠTransparent�mode�interface�tables�for(*§ports�1�and�2.‚These�are�in�the�module%*§containing�the�supervisor�mode�code*§for�this�utility.0ŠXREFƒPARSEŽRoutines�from�UTILIB�for�parsing�the6ŠXREFƒEDITFILE‹command�line,�analyzing�a�filename,�andŠXREFƒOPTION�analyzing�options.  **‚Equate�files�included:0*…UTILITY.MC„Utility�macros�(like�PUSH�and�POP).**…TR1.SAˆEquates�for�exec�calls�(TRAP�#1).'*…IOE.EQˆEquates�for�FHS�and�IOS�calls.@*…CONNECT.EQ„Equates�for�CONNECT's�data�area�(this�gets�listed).*ŠNOLISTŠINCLUDE�9995.&.UTILITY.MCŠINCLUDE�9995.&.TR1.EQŠINCLUDE�9995.&.IOE.EQŠLISTŠINCLUDE�9995.&.CONNECT.EQ  *J*‚DIE�macro�--�causes�the�task�to�abort�with�an�illegal�instruction�error.*…DIEƒ[]G*‚If�the�condition�codes�are�specified,�the�task�will�abort�only�if�theJ*‚specified�condition�code�is�true.‚If�no�condition�code�is�specified,�the#*‚task�will�always�abort.‚Examples: *…DIEƒ*…DIE* DIE‡MACRO ŒIFC„'\1','' ŽDC.Wƒ$FFFFŽMEXITŒENDCŒIF…<\1>�THEN.S ŽDC.Wƒ$FFFFŒENDIŠENDMŠPAGEO******************************************************************************** *‰MACROS�FOR�EASY�SEQUENTIAL�I/O*O******************************************************************************* *A*„WRITE‚LABEL‹outputs�LABEL�to�LABELE�using�param�block�WRITEIOS.>*„READƒLABEL‹inputs‚LABEL�to�LABELE�using�param�block�READIOS;*žSBARG�is�called�on�the�input.D*„DISPLAY�<'ABC'>ˆoutputs�the�literal�ABC�using�param�block�DISPIOS.H*„ASK�<'Name?�'>,REPLYƒoutputs�the�literal�Name?�using�WRITEIOS�and�gets.*ža�response�in�REPLY�to�REPLYE�using�READIOS;*žSBARG�is�called�on�the�input.* WRITE…MACROŠLEA„WRITEIOS(PC),A0 ŠPEA„\1(PC)ŠMOVE.L�(SP)+,IOSSAD(A0) ŠPEA„\1E(PC)ŠMOVE.L�(SP)+,IOSEAD(A0)ŠTRAPƒ#2ŠBNE.L‚FATAL_ERRORŠENDM READ†MACROŠLEA„READIOS(PC),A0 ŠPEA„\1(PC)ŠMOVE.L�(SP)+,IOSSAD(A0) ŠPEA„\1E(PC)ŠMOVE.L�(SP)+,IOSEAD(A0)ŠTRAPƒ#2ŠBNE.L‚FATAL_ERROR ŠBSR.L‚SBARGŠBNE.L‚FATAL_ERRORŠENDM DISPLAYƒMACROŠLEA„DISPIOS(PC),A0 ŠPEA„\@1(PC)ŠMOVE.L�(SP)+,IOSSAD(A0) ŠPEA„\@2(PC)ŠMOVE.L�(SP)+,IOSEAD(A0)ŠTRAPƒ#2ŠBNE.L‚FATAL_ERROR ŠBRA.S‚\@3 \@1‡DC.Bƒ\1 \@2‡EQU„*-1\@3‡DS…0ŠENDM ASK‡MACROŠLEA„WRITEIOS(PC),A0 ŠPEA„\@1(PC)ŠMOVE.L�(SP)+,IOSSAD(A0) ŠPEA„\@2(PC)ŠMOVE.L�(SP)+,IOSEAD(A0)ŠTRAPƒ#2ŠBNE.L‚FATAL_ERROR ŠBRA.S‚\@3 \@1‡DC.Bƒ\1 \@2‡EQU„*-1\@3‡DS…0ŠREADƒ\2ŠENDMŠPAGEK**************************************************************************** *‰EQUATES*K*************************************************************************** *F*‚Equates�describing�the�part�of�the�CSB�used�when�setting�TRANSPARENTH*‚MODE.‚We�pass�the�driver�the�address�of�our�branch�table�and�he�passesI*‚us�back�the�address�of�his�branch�table,�the�value�we�should�have�in�A5G*‚when�we�call�him,�and�the�SR�that�we�should�use.‚Actually,�we�may�useG*‚a�different�SR�as�long�as�the�supervisor�bit�is�set�and�the�interrupt9*‚level�is�not�lower�than�the�one�in�the�SR�he�passes�us.*7ŠOFFSET�IOSTTM�This�stuff�will�be�in�the�CSB�at�IOSTTM.9IOSTMU„DS.Bƒ4’Here�the�user�will�store,�before�making�the&*§CHANGE�DEFAULTS�call,�the�address�of*§his�table�of�branches. 7ŠOFFSET�IOSTTM�This�stuff�will�be�in�the�CSB�at�IOSTTM.9IOSTMD„DS.Bƒ4’the�addr�of�the�driver's�table�of�branches;/IOSTMA„DS.Bƒ4’the�value�the�driver�wants�in�A5;5IOSTMS„DS.Bƒ2’the�SR�with�thD e�MINIMUM�interrupt�level*§set.  *5*‚Equates�defining�bits�in�D0�as�returned�from�PARSE.*8NULL_INPUT‚EQU‚22‘Set�if�there�was�no�input�field�in�the*§command�line.:NULL_OUTPUT�EQU‚14‘Set�if�there�was�no�output�field�in�the*§command�line.;NULL_OPTIONS�EQU�6’Set�if�there�was�no�options�field�in�the*§command�line. *8*‚Equates�defining�bits�in�D0�as�returned�from�EDITFILE.*1DEVICE„EQU„1’Set�if�the�field�specifies�a�device. *6*‚Equates�defining�bits�in�D0�as�returned�from�OPTION.*3END_OPTIONS�EQU‚6’Set�if�there�are�no�more�options.8FMT_EQUAL�EQU„4’Set�if�the�format�is�like�L=.7NONNUMERIC�EQUƒ3’Set�if�the��is�not�numeric.-FMT_MINUS�EQU„2’Set�if�the�format�is�like�-L.  **‚Other�equates.*3TRUE†EQU„$FF�Flags�are�FALSE�if�they�are�0�and�TRUE FALSE…EQU„0’if�they�are�nonzero. &CRˆEQU„$0D�ASCII�carriage�return�char. LFˆEQU„$0A�ASCII�line�feed�char. ;LO_MSG_LINE�EQU‚10‘These�values�refer�to�the�line�number�on:HI_MSG_LINE�EQU‚32‘which�the�reminder�message�is�to�be�put9DEF_MSG_LINE�EQU�25‘for�option�L.‚These�are�the�LO�and�HI%*§valid�line�numbers,�and�the�DEFault%*§to�use�if�he�says�;L�but�not�;L=nn. 5LINE_1„EQU„$20�The�EXORterm�155�specifiers�for�line�1COLUMN_1‚EQU„$20�and�column�1. ;DEF_CHAR‚EQU.B‚'V'�Default�exit�char�specifier.‚The�corres-%*§ponding�control�char,�when�typed�on!*§port�1,�will�cause�an�exit�from*§CONNECT�mode. CMD_LINE‚COMLINE�80�This�will�contain�the�device�name�for�port#*§2�and,�optionally,�the�exit�char.  *L*‚Space�for�a�bunch�of�data�to�be�shared�by�CONNECT1�and�CONNECT2,�for�which"*‚the�definition�is�in�CONNECT.EQ.*DATA†DS.BƒDATA_SIZE  *G*‚Characters�which�will�reset�the�screen�on�an�EXORterm�155�and�VME/10.:*‚You�have�to�delay�after�writing�this�to�an�EXORterm�155!*6RESET…DC.Bƒ$F7�Command�to�reset�the�VME/10's�25�lines.3ŠDC.Bƒ$F1�Command�to�reset�the�EXORterm's�24�lines.RESETE„EQU„*-1  *L*‚Reminder�message�to�write�out�if�this�is�an�EXORterm�155�or�a�VME/10�(that*‚is,�if�option�L�is�used).*2WABS†DC.Bƒ$1B,$4AŒSET�BOTTOM�VIRTUAL�LINE�command.:WABS_LN1‚DC.Bƒ'*'�Space�for�bottom�virtual�line�specifier.%ŠDC.Bƒ$1B,$4EŒWRITE�ABSOLUTE�command.&ŠDC.Bƒ$1B,$5DŒSTART�OF�DATA�indicator.-WABS_LN2‚DC.Bƒ'*'�Space�for�line�#�specifier.&ŠDC.BƒCOLUMN_1‹Specifier�for�column�1.ŠDC.Bƒ'�CONNECTed�to�#'@WABS_PORT�DC.Bƒ'****'�Space�for�name�of�port�we're�CONNECTed�to.ŠDC.Bƒ'�--�Type�CTRL-'5WABS_CHAR�DC.Bƒ'*'�Space�for�the�exit�char�specifier.ŠDC.Bƒ'�to�exit.'$ŠDC.Bƒ$1B,$5EŒEND�OF�DATA�indicator. WABSE…EQU„*-1  *A*‚Message�to�write�out�if�this�isn't�an�EXORterm�155�or�a�VME/10.*ŠDS…0GO_MSG„DC.Bƒ'Type�CTRL-';GO_CHARƒDC.BƒDEF_CHAR‹This�will�be�the�exit�char�specified.ŠDC.Bƒ'�to�exit.',CR,LFGO_MSGEƒEQU„*-1  ŠDS…0&SYNTAX„DC.Bƒ'Correct�syntax�is:',CR,LFC‰DC.B�'„CONNECT��[,]�[;L�[=]�]',CR,LFBŠDC.Bƒ'��is�the�device�name�of�the�terminal�port',CR,LF1ŠDC.Bƒ'„to�which�you�want�to�be�CONNECTed.',CR,LF@ŠDC.Bƒ'��is�a�letter�(A..Z);�the�corresponding',CR,LF>ŠDC.Bƒ'„coE ntrol�char,�when�typed�on�this�terminal,�will',CR,LF@ŠDC.Bƒ'„terminate�CONNECT�mode.‚The�exit�char�is�optional',CR,LF@ŠDC.Bƒ'„and�defaults�to�',DEF_CHAR,'�(CTRL-',DEF_CHAR,').',CR,LFDŠDC.Bƒ'�Only�use�option�L�if�this�terminal�is�an�EXORterm�155',CR,LFBŠDC.B�'„or�VME/10.‚�is�optional�and�defaults�to�25;',CR,LFCŠDC.B�'„it�is�the�line�#�on�which�to�put�a�reminder�message.',CR,LFSYNTAXEƒEQU„*-1  *J*‚IOS�param�block�for�use�with�WRITE�macro�to�do�image�output�to�terminal.*ŠDS…0ŠIOS.WRITE�IOWRIT,IOPIMG,LDFLUN *N*‚IOS�param�block�for�use�with�READ�macro�to�do�formatted�input�from�terminal.*ŠIOS.READ�IOREAD,IOPFOR,CDFLUN *N*‚IOS�param�block�for�use�w/�DISPLAY�macro�to�do�formatted�output�to�terminal.*ŠIOS.DISP�IOWRIT,IOPFOR,LDFLUN  *3*‚FHS�param�block�for�assignment�of�port�2�to�a�LU.*ŠFHS.ASGN�FHASGN,,1 *&*‚FHS�param�block�for�close�of�port�2.*ŠFHS.CLOSE�FHCLOS,,1 *=*‚IOS�param�block�for�CHANGE�DEFAULT�CONFIGURATION�of�port�1.*ŠIOS.CHD1�IOCHDC,,LDFLUN *=*‚IOS�param�block�for�CHANGE�DEFAULT�CONFIGURATION�of�port�2.*ŠIOS.CHD2�IOCHDC,,1 *$*‚Configure/Status�Block�for�port�1.*CSB1:…DC.Bƒ0,0,0,09ŠDC.Wƒ1<ŠDS.BƒIOSTLN-(*-CSB1)„(Take�up�space�till�the�end�of�the�CSB.) *$*‚Configure/Status�Block�for�port�2.*CSB2:…DC.Bƒ0,0,0,09ŠDC.Wƒ1<ŠDS.BƒIOSTLN-(*-CSB2)„(Take�up�space�till�the�end�of�the�CSB.)  *K*‚Parameter�block�for�calling�the�Error�Message�Handler�(part�of�the�trap�4D*‚server�task).‚Input�will�be�from�LUN�CDFLUN,�output�to�LUN�LDFLUN.*9EMH_PBLK‚DC.Lƒ0’Error�message�keyvalue�(D0�from�IOS/FHS).ŠDC.Lƒ0’A0�from�IOS/FHS.2ŠDC.Bƒ0<<0�Options:‚bit�0�=�0�(no�query�response).ŠDC.BƒLDFLUN�LUN�for�output.ŠDC.Bƒ0’Query�return�character.ŠDC.BƒCDFLUN�LUN�for�input.+ŠDC.Lƒ0’Start�addr�for�user�text�plug�pool.)ŠDC.Lƒ0’Endƒaddr�for�user�text�plug�pool.ŠPAGEO*v********************************************************************************?***…CONNECT1�--�START�OF�PROGRAM�TO�CONNECT�US�TO�ANOTHER�PORT.***B***…FUNCTION:‚Here�we�hook�ourselves�into�the�drivers�for�both�theC***‡ports�involved.‚The�rest�will�be�handled�by�the�supervisor�mode-***‡routines�which�get�called�by�the�drivers.*** ***…NOTES:******…ENTRY�CONDITIONS:E***‡LU�6�is�an�assignment�to�the�terminal�from�which�we�were�invoked.6***‡Registers�are�loaded�with�the�usual�info�from�SCT.***O*^***************************************************************************** ŠSECTION�0ŠOPT„BRS CONNECT: *'*‚Set�up�a�stack�and�some�initial�data.*)ŠLEA„STACK(PC),SP‹Load�the�stack�pointer.7ŠLEA„DATA(PC),A6ŒA6<--address�of�the�data�area�we�share*§with�CONNECT2.AŠMOVEM.L�D0-D7/A0-A5,SCT_REGISTERS(A6)‚Save�the�data�passed�to�us*§by�SCT�in�registers.  EŠPUT_ADDR�TBL1,TBL1ADDR-DATA(A6)‚Put�the�addr�of�our�transparent�mode'*§table�for�port�1�into�the�port�1�CSB. EŠPUT_ADDR�TBL2,TBL2ADDR-DATA(A6)‚Put�the�addr�of�our�transparent�mode'*§table�for�port�2�into�the�port�2�CSB.  1ŠWRITE‚OPENER�Tell�the�user�he's�running�CONNECT. *1*‚Initialize�some�things�in�the�shared�data�area.*;ŠLEA„PORT1_QUEUE(A6),A0�A0�<--�address�of�queue�for�port�1.;ŠMOVEƒ#Q_MAX,GET(A0)…Initializes�the�GET�and�PUT�indexes�to3ŠMOVEƒ#Q_MAX,PUT(A0)…their�highest�values�to�start. ;ŠLEA„PORT2_QUEUE(A6)E ,A0�A0�<--�address�of�queue�for�port�2.;ŠMOVEƒ#Q_MAX,GET(A0)…Initializes�the�GET�and�PUT�indexes�to3ŠMOVEƒ#Q_MAX,PUT(A0)…their�highest�values�to�start. /ŠSF…READY(A6)ŠMark�that�we're�not�ready�for�the*§supervisor�mode�code�to�run. AŠMOVE.B�#DEF_CHAR-$40,EXIT_CHAR(A6)‚Set�up�the�default�exit�char. 3ŠSF…ACTIVE(A6)‰Mark�that�the�supervisor�mode�code's*§background�is�not�active. 1ŠCLR„WORK(A6)‹Mark�that�there�is�no�work�pending. 5ŠSF…WAIT1_FLAG(A6)…Clear�the�flags�that�tell�what�the8ŠSF…WAIT2_FLAG(A6)…transmitters�are�busy�doing,�since�of,ŠCLR„BREAKS(A6)‰course�they're�not�busy�yet. **‚Make�sure�we're�user�0.*&ŠTST„SCT_LUSN(A6)‡If�we're�not�user�0,ŠIF…�THENŠ* 2ŠDISPLAY�<'ERROR�--�ONLY�USER�0�MAY�RUN�CONNECT.'>)ŠBRA.L‚ERROR_EXIT‰complain�and�terminate. ŠENDI *3*‚Parse�the�command�line�to�get�the�various�fields.*:ŠMOVE.L�SCT_COML(A6),D6„D6�<--�length�of�the�command�line.3ŠBEQ.L‚ER_NO_DEVICE‡If�it's�empty,�that's�an�error. 5ŠLEA„CMD_LINE(PC),A0„A0�<--�addr�of�the�command�line.+ŠBSR.L‚PARSEŽParse�it�and�check�for�errors. ŠTST.L‚D0‘*ŠBMI.L‚ER_INV_ENTRY‡* ?ŠBTSTƒ#NULL_OPTIONS,D0ƒCheck�whether�there�was�an�options�field;ŠSEQ„ANY_OPTIONS(A6)„and�set�the�flag�accordingly.‚Save�theBŠMOVE.L�A2,PTR_OPTIONS(A6)�addr�of�the�options�field�just�in�case. @ŠBTSTƒ#NULL_OUTPUT,D0„If�there�is�something�in�the�output�field,ŠIF…�THENŠ* 8ŠMOVE.B�(A1),D1ŒD1�<--�the�1st�char�in�the�output�field.>ŠIF.B�D1��#'A'�OR.B�D1��#'Z'�THEN„If�it's�not�in�A..Z, ?ŠDISPLAY�<'ERROR�--�THE�EXIT�CONTROL�CHAR�MUST�BE�ALPHABETIC.'>ŠBRA.L‚FAIL�that's�an�error. ŠENDI :ŠLEA„GO_CHAR(PC),A0…It's�in�A..Z,�so�put�it�in�the�message3ŠMOVE.B�D1,(A0)Œwe�may�send�out�when�we�connect�up.3ŠSUB.B‚#$40,D1ŒAlso,�save�the�corresponding�controlAŠMOVE.B�D1,EXIT_CHAR(A6)ƒcharacter�where�we�can�check�against�it. ŠENDI  *.*‚Figure�out�what�port�he�wants�to�CONNECT�to.*<ŠBTSTƒ#NULL_INPUT,D0…If�the�input�field�was�empty,�that's�anŠBNE.L‚ER_NO_DEVICE‡error. 0ŠLEA„CMD_LINE(PC),A0„A0�<--�addr�of�input�field.>ŠLEA„ASGNFHS(PC),A6…A6�<--�addr�of�FHS�param�block�for�assign.9ŠBSR.L‚EDITFILE‹Call�EDITFILE�to�load�the�parameter�block%*£from�the�input�field�the�user�gave..ŠMOVE.L�FHSVOL(A6),D1†Save�device�nameƒ1/14/85'ŠLEA„DATA(PC),A6ˆRestore�base�register.ŠTST.L‚D0‘Check�for�errors.ŠBMI.L‚ER_INV_ENTRY‡* :ŠBTSTƒ#DEVICE,D0‰If�it�did�not�specify�a�device,�that's�anŠBEQ.L‚ER_NO_DEVICE‡error. >ŠCMP.L‚SCT_TERM(A6),D1„Are�we�connecting�to�ourselves?�1/14/85/ŠBEQ.L‚ER_USR_TERMˆYes,�that's�no�good.‚1/14/85 **‚Assign�that�port�to�a�LU.*;ŠLEA„ASGNFHS(PC),A0…A0�<--�addr�of�param�block�for�ASSIGN�c#ŠTRAPƒ#3‘Call�FHS�to�do�the�assign.ŠBNE.L‚FATAL_ERRORˆ* *(*‚Look�for�option�L�on�the�command�line.*6ŠSF…EXORTERM(A6)‡Begin�by�assuming�we're�not�on�a�155. 5ŠTST.B‚ANY_OPTIONS(A6)„If�there�was�no�options�field,ŠBEQ„GO‘skip�all�this. ŠBSR.L‚OPTION�Process�an�option.ŠTST.B‚D0‘Check�for�errors.ŠBMI.L‚ER_INV_ENTRY‡* 1ŠBTSTƒ#END_OPTIONS,D0„If�there�really�wasn't�one,ŠBNE„GO‘skip�all�this. 'ŠCMP.B‚#'L',D1ŒMake�sure�it's�option�L.ŠBNE.L‚ER_INV_OPTION†* ŠTST.L‚D1‘If�it�isn't�-L,ŠIF…�THENŠ* :ŠST…EXORTERM(A6)‡Remember�that�we're�on�an�EXORterm�155�orEŠMOVE.B�#DEF_MSG_LINE,MSG_LINE(A6)‚VME/10,�and�initialize�the�message*§line�#�to�its�default. -ŠBTSTƒ#FMT_EQUAL,D0†If�he�said�L=,ŠIF…�THENŠ* ;ŠBTSTƒ#NONNUMERIC,D0…Make�sure�the��is�a�number.ŠBNE.L‚ER_INV_ENTRY‡* ?ŠCMP.L‚#LO_MSG_LINE,D3„Ensure�that�the�line�#�is�in�range--i.e.ŠBLO.L‚ER_BAD_LINEˆ*=ŠCMP.L‚#HI_MSG_LINE,D3„*‚LO_MSG_LINE‚<=‚line�#‚<=‚HI_MSG_LINEŠBHI.L‚ER_BAD_LINEˆ* 5ŠMOVE.B�D3,MSG_LINE(A6)„Save�the�line�#�he�specified. ŠENDI ŠENDI 'ŠBSR.L‚OPTION�Check�for�another�option.ŠTST.B‚D0‘Check�for�errors.ŠBMI.L‚ER_INV_ENTRF Y‡* ;ŠBTSTƒ#END_OPTIONS,D0„Ensure�that�there�weren't�any�others.ŠBEQ.L‚ER_INV_OPTION†* *5*‚Tell�him�that�we're�CONNECTing�and�how�he�can�exit.*=GOˆTST.B‚EXORTERM(A6)‡If�this�is�an�EXORterm�155�or�a�VME/10,ŠIF…�THENŠ* 6ŠWRITE‚RESETŽIssue�the�command�to�reset�the�screen�and7ŠERQ.DELAY�#RESET_DELAY„wait�for�the�terminal�to�do�it. :ŠMOVEQ‚#LINE_1-1,D0‡Set�the�line�#�specifier�for�the�WRITE9ŠADD.B‚MSG_LINE(A6),D0„ABSOLUTE�of�the�reminder�message�=1ŠLEA„WABS_LN2(PC),A0„*ƒspecifier�for�line�1‚-‚1‚+)ŠMOVE.B�D0,(A0)Œ*�line�#�of�message�line. 1ŠSUB.B‚#1,D0ŽSet�the�line�#�specifier�for�the�SET<ŠLEA„WABS_LN1(PC),A0„BOTTOM�VIRTUAL�LINE�to�be�the�specifier(ŠMOVE.B�D0,(A0)Œfor�the�line�just�above. <ŠLEA„WABS_CHAR(PC),A0ƒSet�the�exit�char�specifier�from�where=ŠMOVE.B�GO_CHAR-DATA(A6),(A0)�we�put�it�in�the�other�message. :ŠLEA„ASGNFHS(PC),A1…Set�the�name�of�the�port�from�where�it;ŠLEA„WABS_PORT(PC),A0ƒwas�put�by�EDITFILE�in�the�FHS�ASSIGN(ŠMOVE.L�FHSVOL(A1),(A0)„parameter�block. +ŠWRITE‚WABS�Write�out�the�reminder�message. ,ŠELSE–Else�(it's�not�an�EXORterm�or�VME/10), 2ŠWRITE‚GO_MSG�Write�out�the�plain�vanilla�message. ŠENDI  *(*‚Put�the�drivers�into�transparent�mode.*8ŠLEA„CHD1IOS(PC),A0…A0�<--�addr�of�param�block�to�Change*§Defaults�on�port�1.AŠPUT_ADDR�CSB1,IOSDBP(A0)‚Set�up�the�CSB�addr�in�the�param�block.ŠTRAPƒ#2‘Make�the�IOS�call.ŠBNE.L‚FATAL_ERRORˆ*  8ŠLEA„CHD2IOS(PC),A0…A0�<--�addr�of�param�block�to�Change*§Defaults�on�port�2.AŠPUT_ADDR�CSB2,IOSDBP(A0)‚Set�up�the�CSB�addr�in�the�param�block.ŠTRAPƒ#2‘Make�the�IOS�call. ŠIF…�THEN /ŠSAVEƒD0/A0ŽSave�info�about�the�original�error./ŠLEA„CSB1(PC),A0ˆA0�<--�addr�of�CSB�for�port�1.CŠBCLRW‚#IOATRM,IOSATW(A0)‚Clear�the�TRANSPARENT�MODE�attribute�bit.9ŠLEA„CHD1IOS(PC),A0…Make�the�CHANGE�DEFAULTS�call�to�IOS. ŠTRAPƒ#2‘*$ŠDIE„�Die�if�there�was�an�error.8ŠRESTORE�D0/A0�Restore�info�about�the�original�error�and ŠBRA.L‚FATAL_ERRORˆgo�report�it. ŠENDI *E*‚Determine�which�runs�at�the�higher�interrupt�level�and�save�his�SR.*,ŠMOVEƒSR_1-DATA(A6),D0ƒD0.W�<--�port�1's�SR.DŠIF�SR_2-DATA(A6)��D0�THENƒIf�port�2's�interrupt�level�is�higher-ŠMOVEƒSR_2-DATA(A6),D0ƒreplace�the�one�in�D0.ŠENDI–* =ŠMOVEƒD0,DISABLE_SR(A6)‚The�higher�SR�will�be�used�to�inhibit*§interrupts�from�the�devices.5ŠSUB„#$0100,D0ŠThe�equivalent�SR,�one�interrupt�level=ŠMOVEƒD0,ENABLE_SR(A6)ƒlower,�will�be�used�to�run�around�in�a&*§sort�of�'background'�mode�(to�lessen)*§the�strain�caused�by�being�at�interrupt*§level�for�so�long). *D*‚Enable�the�supervisor�mode�code�and�wait�for�it�to�say�we're�done.*6ŠST…READY(A6)ŠSet�the�flag�to�tell�the�supervisor�mode(*§code�we're�ready�for�him�to�take�over. 3ŠERQ.WAIT�,�Tell�exec�we�want�to�wait�for�a�wakeup. *C*‚We�got�the�wakeup,�so�somebody�must�have�given�the�signal�to�exitM*‚transparent�mode.‚Take�the�ports�out�of�transparent�mode,�close�up,�&�exit.*/ŠLEA„CSB1(PC),A0ˆA0�<--�addr�of�CSB�for�port�1.CŠBCLRW‚#IOATRM,IOSATW(A0)‚Clear�the�TRANSPARENT�MODE�attribute�bit.9ŠLEA„CHD1IOS(PC),A0…Make�the�CHANGE�DEFAULTS�call�to�IOS. ŠTRAPƒ#2‘*$ŠDIE„�Die�if�there�was�an�error. /ŠLEA„CSB2(PC),A0ˆA0�<--�addr�of�CSB�for�port�2.CŠBCLRW‚#IOATRM,IOSATW(A0)‚Clear�the�TRANSPARENT�MODE�attribute�bit.9ŠLEA„CHD2IOS(PC),A0…Make�the�CHANGE�DEFAULTS�call�to�IOS. ŠTRAPƒ#2‘*$ŠDIE„�Die�if�there�was�an�error. 9ŠTST.B‚EXORTERM(A6)‡If�this�is�an�EXORterm�155�or�VME/10,ŠIF…�THENŠ*6ŠWRITE‚RESETŽIssue�the�command�to�reset�the�screen�and7ŠERQ.DELAY�#RESET_DELAY„wait�for�the�terminal�to�do�it.ŠENDI–* ;ŠLEA„CLOSEFHS(PC),A0„Close�the�assignment�we�got�to�port�2. ŠTRAPƒ#3‘*$ŠDIE„�Die�if�there�was�an�error. #ŠERQ.TERM�#0,#0ŒTerminate�normally.ŠPAGEO*v********************************************************************************(***…SOME�CONNECT-SPECIFIC�ERROR�MESSAGF ES***H***…FUNCTION:‚These�are�some�of�the�routines�to�branch�to�if�you�want�toE***‡terminate�with�an�error.‚FAIL�will�display�the�correct�syntax�forF***‡CONNECT�before�dying;�other�entry�points�will�additionally�display7***‡some�message�appropriate�to�a�particular�situation.*** ***…NOTES:******…ENTRY�CONDITIONS:***O*^***************************************************************************** **********7*‚Display�NO�DEVICE�message�and�terminate�through�FAIL.* ER_NO_DEVICE: G‰DISPLAY�<'ERROR�--�THE�DEVICE�NAME�FOR�A�TERMINAL�MUST�BE�SPECIFIED.'> ŠBRA.L‚FAIL  **********“<<1/14/853*‚Display�CAN'T�TALK�TO�SELF�message�and�terminate.* ER_USR_TERM: FŠDISPLAY�<'ERROR�--�THE�DEVICE�NAME�FOR�A�TERMINAL�CANT�BE�YOUR�OWN.'>‹BRA.L‚ERROR_EXIT�1/14/85>>  **********<*‚Display�INVALID�OPTION�message�and�terminate�through�FAIL.*ER_INV_OPTION: %ŠDISPLAY�<'ERROR�--�INVALID�OPTION.'> ŠBRA.L‚FAIL  **********=*‚Display�BAD�LINE�NUMBER�message�and�terminate�through�FAIL.* ER_BAD_LINE: EŠDISPLAY�<'ERROR�--�LINE�NUMBER�IN�L�OPTION�IS�OUT�OF�RANGE�10..32.'> ŠBRA„FAIL  **********;*‚Display�INVALID�ENTRY�message�and�terminate�through�FAIL.* ER_INV_ENTRY: $ŠDISPLAY�<'ERROR�--�INVALID�ENTRY.'>  **********3*‚Write�out�the�correct�syntax�for�CONNECT�and�die.*FAIL: .ŠWRITE‚SYNTAX�Print�out�the�correct�syntax�and,ŠBRA„ERROR_EXIT‰terminate�with�error�status.ŠPAGEO*v********************************************************************************"***…ROUTINES�FOR�ERROR�TERMINATION***G***…FUNCTION:‚These�two�entry�points�will�terminate�the�task�with�errorF***‡status.‚Entry�point�FATAL_ERROR�will,�before�it�kills�us,�call�theC***‡error�message�handler,�and�as�such�is�suitable�for�handling�bad)***‡return�status�from�IOS�and�FHS�calls.*** ***…NOTES:******…ENTRY�CONDITIONS:***O*^***************************************************************************** *********A*‚Call�the�error�message�handler�and�terminate�with�error�status.* FATAL_ERROR: -ŠBSR„CALL_EMH‹Call�the�error�message�handler. **********;*‚Terminate�with�error�status;�this�will�abort�a�chainfile.* ERROR_EXIT: 7ŠERQ.TERM�#0,#$C000ˆExit�to�the�exec�with�error�status.ŠPAGEO*v*****************************************************************************O**********************************************************************************É***:***‹CALL�THE�ERROR�MESSAGE�HANDLER�TO�DISPLAY�AN�ERRORŒ******É***I***…FUNCTION:‚This�routine�may�be�called�at�any�time�to�get�the�error‚***G***‡message�handler�to�display�the�text�corresponding�to�the�error.ƒ***H***‡For�IOS�and�FHS�calls�(and�perhaps�others),�information�from�the‚***=***‡parameter�block�will�be�printed�along�with�the�error.�******É******…NOTES:¾******É***E***…REGISTER�USAGE:‚(A)rgument‚(D)estroyed‚(P)reserved‚(R)eturnedƒ***)***Œ0ƒ1ƒ2ƒ3ƒ4ƒ5ƒ6ƒ7‡SR�hi„SR�lo�(CCR)…******‡D:ƒAP‚.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.‡.ˆD�******‡A:ƒAP‚.ƒ.ƒ.ƒ.ƒ.ƒ.ƒP ******É******…ENTRY�CONDITIONS:³***<***‡D0�=�error�code�understood�by�error�message�handler.Ž***0***‡A0�=�addr�of�param�block,�if�applicable.š******É***-***…EXIT�CONDITIONS�DIFFERENT�FROM�ENTRY:Ÿ******É***O*^*****************************************************************************O******************************************************************************* CALL_EMH: +ŠSAVEƒD0/A0ŽSave�registers�we'll�blow�away. -ŠPUSH.L�A0‘Save�the�caller's�A0�for�a�moment.8ŠLEA„EMH_PBLK(PC),A0„A0�<--�addr�of�EMH�parameter�block.;ŠMOVE.L�D0,(A0)ŒPut�the�D0�and�A0�given�to�us�by�the�caller1ŠMOVE.L�(SP)+,4(A0)ˆout�there�in�the�param�block. 2ŠMOVEQ‚#2,D0ŽCall�the�Loader/EMH�task�with�D0�=�2,+ŠTRAPƒ#4‘indicating�it's�a�job�for�the�EMH. ,ŠRESTORE�D0/A0�Restore�registers�and�return.ŠRTS—*   ŠEND„CONNECTG éé9CONNECT2‚IDNTƒ1,0„CONNECT�utility's�supervisor�mode�code.O*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***G***…FILENAME:‚CONNECT2�--�SUPERVISOR�MODE�CODE�FOR�CONNECT�UTILITY.„******É***;***…ENVIRONMENT:‚CONNECT�runs�as�a�task�under�VERSAdos.�******É***H***…FUNCTION:‚To�connect�two�ports�such�that�characters�coming�in�onƒ***E***‡one�are�sent�to�the�other,�and�vice�versa.‚This�part�actually„***E***‡takes�characters�from�one�driver�and�gives�them�to�the�other.…******É***H***…NOTES:‚In�order�to�achieve�high�throughput,�this�routine�runs�inƒ***0***‡supervisor�mode�and�at�interrupt�levels.š***I***‡It�is�VERY�IMPORTANT�that�none�of�the�code�called�by�CONNECT2�set�***H***‡the�interrupt�level�without�regard�for�the�level�at�which�it�was‚***E***‡entered.‚In�particular,�drivers�may�NOT�use�their�INHIBIT�and„***B***‡ENABLE�macros�in�transparent�mode�since�they�may�have�beenˆ***1***‡entered�at�a�much�higher�interrupt�level.™******É***,***…EXTERNAL�DATA�STRUCTURES�REFERENCED: ******É***)***…EXTERNAL�ENTRY�POINTS�REFERENCED:£***?***‡Transparent�mode�output�routines�in�drivers�are�called.‹******É***"***…SERVICES�CALLED�VIA�TRAPS:ª***I***‡TRAP�#0�call�(from�supervisor�mode)�to�do�Wakeup�of�the�CONNECT1.�******É***O*******************************************************************************O*******************************************************************************O*^***************************************************************************** *,*‚Revision�history�(add�new�changes�to�top).*…Date†Author‰ChangesG*…--------‚-------------‚----------------------------------------------/*†7/22/83‚Steve�FranckƒChanged�name�from�TMSUP.'*†6/�3/83‚Steve�FranckƒInitial�writing.3*…12/20/84‚Peggy�Hassett‚Made�position�independent. * *‚XDEF's.*Ú,ãFëCó>û= @ K A ? #A +%;ŠXDEFƒTBL1,TBL2ŠTransparent�mode�interface�tables�for�ports'*§1�and�2.‚The�CONNECT1�task�level�code(*§passes�these�addresses�to�the�drivers. *0*‚XREF's�(indicate�where�the�XDEF�is,�if�known).*4ŠXREFƒDATA�Base�of�data�area�we�share�with�CONNECT1.CŠXREFƒTBL1ADDR,A5_1‚CONNECT1�info�we�use�to�call�the�port�1�driver.CŠXREFƒTBL2ADDR,A5_2‚CONNECT1�info�we�use�to�call�the�port�2�driver.  **‚Equate�files�included:0*…UTILITY.MC„Utility�macros�(like�PUSH�and�POP).:*…EQUSTR.EQ…Supervisor�mode�exec�equates/macros�(TRAP�#0).E*…CONNECT.EQ„Equates�describing�a�data�area�common�to�CONNECT1�and�2.*ŠNOLISTŠINCLUDE�9995.&.UTILITY.MCŠINCLUDE�9995.&.STR.EQŠLISTŠPAGEŠINCLUDE�9995.&.CONNECT.EQ  **‚Other�equates.*3TRUE†EQU„$FF�Flags�are�FALSE�if�they�are�0�and�TRUE FALSE…EQU„0’if�they�are�nonzero. LFˆEQU„$0A�ASCII�line�feed�char.ŠPAGEO*v********************************************************************************<***…TBL1�and�TBL2�--�TABLES�ENABLING�THE�DRIVERS�TO�CALL�US.***F***…FUNCTION:‚The�task�level�code�has�passed�the�addresses�of�TBL1�andD***‡TBL2�to�the�drivers�for�ports�1�and�2,�respectively.‚The�drivers/***‡JSR�into�these�tables�to�call�our�routines.*** ***…NOTES:******…ENG TRY�CONDITIONS:***O*^***************************************************************************** ŠSECTION�0ŠOPT„BRS $*£The�port�1�driver�JSR's�here�when:(TBL1:…BRA.S‚RECV1Ž...a�char�is�received.ŠNOP—*.ŠBRA.L‚TBE1�...the�transmit�buffer�goes�empty.1ŠBRA.L‚BRK1_RECVŠ...it�detects�an�incoming�break.2ŠBRA.L‚BRK1_OVERŠ...it�is�through�sending�a�break. $*£The�port�2�driver�JSR's�here�when:(TBL2:…BRA.S‚RECV2Ž...a�char�is�received.ŠNOP—*.ŠBRA.L‚TBE2�...the�transmit�buffer�goes�empty.1ŠBRA.L‚BRK2_RECVŠ...it�detects�an�incoming�break.2ŠBRA.L‚BRK2_OVERŠ...it�is�through�sending�a�break.  *N*‚This�is�the�layout�of�the�interface�table�WE�will�use�in�calling�the�DRIVER.* ŠOFFSET�04XMIT†DS.Bƒ4’Entry�to�JSR�to�in�order�to�send�a�char.9SEND_BRK‚DS.Bƒ4’Entry�to�JSR�to�in�order�to�send�a�break. ŠSECTION�0ŠPAGEO*v*****************************************************************************O**********************************************************************************É***2***…RECV1�--�HANDLE�CHAR'S�COMING�IN�ON�PORT�1š******É***F***…FUNCTION:‚This�routine�gets�called�by�the�port�1�driver�when�a…***C***‡character�arrives�at�that�port.‚It�puts�the�char�in�a�queue†***%***‡for�output�to�the�other�port.¥******É******…NOTES:¾******É***E***…REGISTER�USAGE:‚(A)rgument‚(D)estroyed‚(P)reserved‚(R)eturnedƒ***)***Œ0ƒ1ƒ2ƒ3ƒ4ƒ5ƒ6ƒ7‡SR�hi„SR�lo�(CCR)…******‡D:ƒAD‚Pƒ.ƒ.ƒ.ƒ.ƒ.ƒ.‡.ˆD�******‡A:ƒPƒPƒ.ƒ.ƒ.ƒPƒ.ƒP ******É******…ENTRY�CONDITIONS:³***!***‡D0.B�=�the�char�received.©******É***-***…EXIT�CONDITIONS�DIFFERENT�FROM�ENTRY:Ÿ******É***O*^*****************************************************************************O******************************************************************************* RECV1: * *‚Get�set�up.*(ŠSAVEƒD1/A0/A1/A5ˆSave�registers�and�SR. ŠPUSHƒSR‘* 2ŠLEA„DATA(PC),A1ˆA1�<--�base�address�of�data�area. *(*‚Does�he�want�to�exit�transparent�mode?*:ŠIF.B�D0��EXIT_CHAR(A1)�THEN‚If�this�is�the�exit�char, ?ŠBSETW‚#W_EXIT,WORK(A1)ƒgo�run�the�background�task�to�terminate,ŠBRA.L‚BKG_EXEC‹transparent�mode�processing. ŠENDI *J*‚He�doesn't�want�to�exit�TM;�put�the�char�in�the�queue�to�send�to�port�2.*?ŠLEA„PORT2_QUEUE(A1),A5�A5�<--�addr�of�queue�for�port�2�output. ŠMOVEƒPUT(A5),D1‰D1�<--�PUT�ptr.@ŠMOVE.B�D0,QUEUE(A5,D1)„Add�the�char�in�D0�to�the�queue�(maybe). ŠSUBQƒ#1,D1ŽAdvance�the�PUT�ptr."ŠIF…�THENŠIf�it�goes�negative,)ŠMOVEƒ#Q_MAX,D1Š.�set�it�back�to�the�top. ŠENDI–.�* :ŠIFƒD1��GET(A5)�THEN�If�the�queue�wasn't�already�full,9ŠMOVEƒD1,PUT(A5)‰.�update�the�real�pointer�for�next�time. ŠENDI–.�* *2*‚Call�the�background�transmit�routine�for�port�2.*?ŠBSETW‚#W_XMIT2,WORK(A1)‚Run�the�background�to�send�the�char�toŠBRA.L‚BKG_EXEC‹port�2.ŠPAGEO*v*****************************************************************************O**********************************************************************************É***2***…RECV2�--�HANDLE�CHAR'S�COMING�IN�ON�PORT�2š******É***F***…FUNCTION:‚This�routine�gets�called�by�the�port�2�driver�when�a…***C***‡character�arrives�at�that�port.‚It�puts�the�char�in�a�queue†***%***‡for�output�to�the�other�port.¥******É******…NOTES:¾******É***E***…REGISTER�USAGE:‚(A)rgument‚(D)estroyed‚(P)reserved‚(R)eturnedƒ***)***Œ0ƒ1ƒ2ƒ3ƒ4ƒ5ƒ6ƒ7‡SR�hi„SR�lo�(CCR)…******‡D:ƒAD‚Pƒ.ƒ.ƒ.ƒ.ƒ.ƒ.‡.ˆD�******‡A:ƒPƒPƒ.ƒ.ƒ.ƒPƒ.ƒP ******É******…ENTRY�CONDITIONS:³***!***‡D0.B�=�the�char�received.©******É***-***…EXIT�CONDITIONS�DIFFERENT�FROM�ENTRY:Ÿ******É***O*^*****************************************************************************O******************************************************************************* RECV2: * *‚Get�set�up.*(ŠSAVEƒD1/A0/A1/A5ˆSave�registers�and�SR. ŠPUSHƒSR‘* 2ŠLEA„DATA(PC),A1ˆA1�<--�base�address�of�data�area. *.*‚Put�the�char�in�the�queue�to�send�to�port�1.*?ŠLEA„PORT1_QUEUE(A1),A5�A5�<--H �addr�of�queue�for�port�1�output. ŠMOVEƒPUT(A5),D1‰D1�<--�PUT�ptr.@ŠMOVE.B�D0,QUEUE(A5,D1)„Add�the�char�in�D0�to�the�queue�(maybe). ŠSUBQƒ#1,D1ŽAdvance�the�PUT�ptr."ŠIF…�THENŠIf�it�goes�negative,)ŠMOVEƒ#Q_MAX,D1Š.�set�it�back�to�the�top. ŠENDI–.�* :ŠIFƒD1��GET(A5)�THEN�If�the�queue�wasn't�already�full,9ŠMOVEƒD1,PUT(A5)‰.�update�the�real�pointer�for�next�time. ŠENDI–.�* *2*‚Call�the�background�transmit�routine�for�port�1.*?ŠBSETW‚#W_XMIT1,WORK(A1)‚Run�the�background�to�send�the�char�toŠBRA.L‚BKG_EXEC‹port�1.ŠPAGEO*v*****************************************************************************O**********************************************************************************É***?***…TBE1�(TBE2)�--�TRANSMIT�BUFFER�WENT�EMPTY�ON�PORT�1�(2)�******É***I***…FUNCTION:‚These�routines�get�called�by�the�port�1�(2)�driver�when‚***H***‡the�device�on�that�port�becomes�ready�for�more�output.‚Basically�***F***‡we�just�set�up�for�the�background�to�do�more�output�if�it�can.„******É******…NOTES:¾******É***E***…REGISTER�USAGE:‚(A)rgument‚(D)estroyed‚(P)reserved‚(R)eturnedƒ***)***Œ0ƒ1ƒ2ƒ3ƒ4ƒ5ƒ6ƒ7‡SR�hi„SR�lo�(CCR)…******‡D:ƒDƒPƒ.ƒ.ƒ.ƒ.ƒ.ƒ.‡.ˆD�******‡A:ƒPƒPƒ.ƒ.ƒ.ƒPƒ.ƒP ******É******…ENTRY�CONDITIONS:³******É***-***…EXIT�CONDITIONS�DIFFERENT�FROM�ENTRY:Ÿ******É***O*^*****************************************************************************O******************************************************************************* **********-*‚The�transmitter�has�become�ready�on�port�1.*TBE1: (ŠSAVEƒD1/A0/A1/A5ˆSave�registers�and�SR. ŠPUSHƒSR‘*2ŠLEA„DATA(PC),A1ˆA1�<--�base�address�of�data�area. *2*‚Call�the�background�transmit�routine�for�port�1.*5ŠSF…WAIT1_FLAG(A1)…Mark�the�port�1�transmitter�ready.?ŠBSETW‚#W_XMIT1,WORK(A1)‚Run�the�background�routine�to�transmitŠBRA.L‚BKG_EXEC‹on�port�1.  **********-*‚The�transmitter�has�become�ready�on�port�2.*TBE2: (ŠSAVEƒD1/A0/A1/A5ˆSave�registers�and�SR. ŠPUSHƒSR‘*2ŠLEA„DATA(PC),A1ˆA1�<--�base�address�of�data�area. *2*‚Call�the�background�transmit�routine�for�port�2.*5ŠSF…WAIT2_FLAG(A1)…Mark�the�port�2�transmitter�ready.?ŠBSETW‚#W_XMIT2,WORK(A1)‚Run�the�background�routine�to�transmitŠBRA.L‚BKG_EXEC‹on�port�2.ŠPAGEO*v*****************************************************************************O**********************************************************************************É***C***…BRK1_RECV�(BRK2_RECV)�--�A�BREAK�WAS�DETECTED�ON�PORT�1�(2)‰******É***I***…FUNCTION:‚These�routines�get�called�by�the�port�1�(2)�driver�when‚***E***‡the�device�on�that�port�detects�an�incoming�break�signal.‚All„***2***‡we�do�is�call�the�background�to�handle�it.˜******É******…NOTES:¾******É***E***…REGISTER�USAGE:‚(A)rgument‚(D)estroyed‚(P)reserved‚(R)eturnedƒ***)***Œ0ƒ1ƒ2ƒ3ƒ4ƒ5ƒ6ƒ7‡SR�hi„SR�lo�(CCR)…******‡D:ƒDƒPƒ.ƒ.ƒ.ƒ.ƒ.ƒ.‡.ˆD�******‡A:ƒPƒPƒ.ƒ.ƒ.ƒPƒ.ƒP ******É******…ENTRY�CONDITIONS:³******É***-***…EXIT�CONDITIONS�DIFFERENT�FROM�ENTRY:Ÿ******É***O*^*****************************************************************************O******************************************************************************* **********!*‚A�break�was�detected�on�port�1.* BRK1_RECV: (ŠSAVEƒD1/A0/A1/A5ˆSave�registers�and�SR. ŠPUSHƒSR‘*2ŠLEA„DATA(PC),A1ˆA1�<--�base�address�of�data�area. *4*‚Call�the�background�to�transmit�a�break�on�port�2.*BŠBSETW‚#W_BRK2,WORK(A1)ƒMark�work�for�the�routine�that�transmits�a:ŠBRA.L‚BKG_EXEC‹break�on�port�2�and�invoke�the�background. **********!*‚A�break�was�detected�on�port�2.* BRK2_RECV: (ŠSAVEƒD1/A0/A1/A5ˆSave�registers�and�SR. ŠPUSHƒSR‘*2ŠLEA„DATA(PC),A1ˆA1�<--�base�address�of�data�area. *4*‚Call�the�background�to�transmit�a�break�on�port�1.*BŠBSETW‚#W_BRK1,WORK(A1)ƒMark�work�for�the�routine�that�transmits�a:ŠBRA.L‚BKG_EXEC‹break�on�port�1�and�invoke�the�background.ŠPAGEO*v******************************************H ***********************************O**********************************************************************************É***E***…BRK1_OVER�(BRK2_OVER)�--�FINISHED�SENDING�BREAK�ON�PORT�1�(2)‡******É***I***…FUNCTION:‚These�routines�get�called�by�the�port�1�(2)�driver�when‚***F***‡the�device�on�that�port�has�completed�sending�the�break�signal„***F***‡(which�we�must�have�requested�it�to�do).‚Simply�give�the�back-ƒ***F***‡ground�transmit�routines�a�chance�to�transmit�if�they�want�to.„******É******…NOTES:¾******É***E***…REGISTER�USAGE:‚(A)rgument‚(D)estroyed‚(P)reserved‚(R)eturnedƒ***)***Œ0ƒ1ƒ2ƒ3ƒ4ƒ5ƒ6ƒ7‡SR�hi„SR�lo�(CCR)…******‡D:ƒDƒPƒ.ƒ.ƒ.ƒ.ƒ.ƒ.‡.ˆD�******‡A:ƒPƒPƒ.ƒ.ƒ.ƒPƒ.ƒP ******É******…ENTRY�CONDITIONS:³******É***-***…EXIT�CONDITIONS�DIFFERENT�FROM�ENTRY:Ÿ******É***O*^*****************************************************************************O******************************************************************************* **********,*‚The�break�we�sent�to�port�1�has�completed.* BRK1_OVER: (ŠSAVEƒD1/A0/A1/A5ˆSave�registers�and�SR. ŠPUSHƒSR‘*2ŠLEA„DATA(PC),A1ˆA1�<--�base�address�of�data�area. *@*‚Call�the�background�to�let�the�transmitters�run�on�both�ports.*8ŠSF…BREAK1(A1)‰Mark�that�we're�not�sending�a�break�on�1.=ŠBSETW‚#W_XMIT1,WORK(A1)‚Mark�work�for�both�transmit�routines3ŠBSETW‚#W_XMIT2,WORK(A1)‚and�invoke�the�background.ŠBRA.L‚BKG_EXEC‹* **********,*‚The�break�we�sent�to�port�2�has�completed.* BRK2_OVER: (ŠSAVEƒD1/A0/A1/A5ˆSave�registers�and�SR. ŠPUSHƒSR‘*2ŠLEA„DATA(PC),A1ˆA1�<--�base�address�of�data�area. *@*‚Call�the�background�to�let�the�transmitters�run�on�both�ports.*8ŠSF…BREAK2(A1)‰Mark�that�we're�not�sending�a�break�on�2.=ŠBSETW‚#W_XMIT1,WORK(A1)‚Mark�work�for�both�transmit�routines3ŠBSETW‚#W_XMIT2,WORK(A1)‚and�invoke�the�background.ŠBRA.L‚BKG_EXEC‹*ŠPAGEO*v********************************************************************************#***…BKG_EXEC�--�BACKGROUND�EXECUTOR***H***…FUNCTION:‚Branch�to�here�to�dispatch�background�processes�whose�bits***‡are�set�in�the�WORK�word.*** ***…NOTES:******…ENTRY�CONDITIONS:#***‡A1�=�addr�of�base�of�data�area.***O*^***************************************************************************** BKG_EXEC: *'*‚Make�sure�we're�ready�for�processing.* ŠTST.B‚READY(A1)ŠIf�we're�ready,ŠIF…�THENŠ* * *‚Ensure�we�don't�get�reentered.*9ŠMOVEƒDISABLE_SR(A1),SR‚Disable�interrupts�on�both�ports.3ŠTAS„ACTIVE(A1)‰Mark�that�the�background�is�active.#ŠIF…�THENŠIf�it�wasn't�already, *0*‚Do�all�the�background�work�that's�outstanding.*ŠREPEAT AŠMOVEƒENABLE_SR(A1),SRƒEnable�interrupts�(drop�the�level�by�one). AŠBCLRW‚#W_XMIT1,WORK(A1)‚If�we're�supposed�to�transmit�to�port�1,ŠBNE„DO_XMIT1‹go�do�it. AŠBCLRW‚#W_XMIT2,WORK(A1)‚If�we're�supposed�to�transmit�to�port�2,ŠBNE„DO_XMIT2‹go�do�it. AŠBCLRW‚#W_BRK1,WORK(A1)�If�we're�supposed�to�send�a�break�to�portŠBNE.L‚DO_BRK1Œ1,�go�do�it. AŠBCLRW‚#W_BRK2,WORK(A1)�If�we're�supposed�to�send�a�break�to�portŠBNE.L‚DO_BRK2Œ2,�go�do�it. CŠBCLRW‚#W_EXIT,WORK(A1)�If�we're�supposed�to�exit�transparent�mode,ŠBNE.L‚DO_EXITŒgo�do�it. *G*‚Check�for�more�background�work�to�do.‚This�is�the�common�return�point*‚for�all�background�routines.* CHECK_WORK:9ŠMOVEƒDISABLE_SR(A1),SR‚Disable�interrupts�on�both�ports.6ŠTST„WORK(A1)‹Keep�on�doing�all�this�until�there�is�noŠUNTIL‚�more�work�to�do. 6ŠSF…ACTIVE(A1)‰Mark�that�the�background�is�not�active. ŠENDI ŠENDI  *?*‚Exit�from�the�interrupt�(return�to�the�driver�who�called�us).*-ŠPOP„SR‘Restore�the�SR�and�registers�we�saved6ŠRESTORE�D1/A0/A1/A5‡when�we�were�entered,�and�return.ŠRTS—*ŠPAGEO*v********************************************************************************2***…DO_XMIT1�--�SEND�A�CHAR�TO�PORT�1�IF�POSSIBLE.***J***…FUNCTION:‚This�routine�is�called�whenever�an�opportunity�may�have�beI enF***‡created�for�the�program�to�output�a�char�to�port�1.‚This�guy�looksG***‡to�see�whether�the�transmitter�is�already�in�use�and,�if�not,�sends3***‡the�next�char�from�the�queue�if�it's�not�empty.*** ***…NOTES:******…ENTRY�CONDITIONS:&***‡A1ƒ=�addr�of�base�of�data�segment.***O*^***************************************************************************** DO_XMIT1: /ŠCLR„D1‘If�we�aren't�sending�a�break�either�wayAŠMOVE.B�WAIT1_FLAG(A1),D1‚and�we�aren't�already�outputting�a�charŠOR…BREAKS(A1),D1†on�port�1,ŠIF…�THENŠ* AŠLEA„PORT1_QUEUE(A1),A5�.�A5�<--�addr�of�queue�for�port�1�output."ŠMOVEƒGET(A5),D1‰.�D1�<--�GET�ptr.5ŠIFƒD1��PUT(A5)�THEN�.�If�the�queue�is�not�empty, 8ŠMOVE.B�QUEUE(A5,D1),D0„.ƒD0.B�<--�next�char�from�queue."ŠSUBQƒ#1,D1Ž.ƒAdvance�the�GET�ptr.$ŠIF…�THENŠ.ƒIf�it�goes�negative,*ŠMOVEƒ#Q_MAX,D1Š.…move�it�back�to�the�top. ŠENDI–.…*(ŠMOVEƒD1,GET(A5)‰.ƒSave�the�new�GET�ptr. **‚Output�the�char.*9ŠST…WAIT1_FLAG(A1)….ƒMark�that�we're�busy�transmitting�on *£.ƒport�1.7ŠMOVE.L�A5_1-DATA(A1),A5ƒ.ƒA5�<--�addr�of�port�1's�CCB.BŠMOVE.L�TBL1ADDR-DATA(A1),A0ƒA0�<--�addr�of�driver�interface�table1ŠJSR„XMIT(A0)‹.ƒJump�to�the�entry�to�output�D0.B. ŠIF…�THENŠ.ƒIf�CCR�=�,9ŠSF…WAIT1_FLAG(A1)….…we�can�send�more�without�waiting,�so4ŠBRA„DO_XMIT1‹.…go�back�up�&�check�for�more�to�xmit. ŠENDI–.…* ŠENDI–.ƒ* ŠENDI–.�* 3ŠBRA„CHECK_WORK‰Go�check�for�other�background�work.ŠPAGEO*v********************************************************************************2***…DO_XMIT2�--�SEND�A�CHAR�TO�PORT�2�IF�POSSIBLE.***J***…FUNCTION:‚This�routine�is�called�whenever�an�opportunity�may�have�beenF***‡created�for�the�program�to�output�a�char�to�port�2.‚This�guy�looksG***‡to�see�whether�the�transmitter�is�already�in�use�and,�if�not,�sends3***‡the�next�char�from�the�queue�if�it's�not�empty.*** ***…NOTES:******…ENTRY�CONDITIONS:&***‡A1ƒ=�addr�of�base�of�data�segment.***O*^***************************************************************************** DO_XMIT2: /ŠCLR„D1‘If�we�aren't�sending�a�break�either�wayAŠMOVE.B�WAIT2_FLAG(A1),D1‚and�we�aren't�already�outputting�a�charŠOR…BREAKS(A1),D1†on�port�2,ŠIF…�THENŠ* AŠLEA„PORT2_QUEUE(A1),A5�.�A5�<--�addr�of�queue�for�port�2�output."ŠMOVEƒGET(A5),D1‰.�D1�<--�GET�ptr.5ŠIFƒD1��PUT(A5)�THEN�.�If�the�queue�is�not�empty, 8ŠMOVE.B�QUEUE(A5,D1),D0„.ƒD0.B�<--�next�char�from�queue."ŠSUBQƒ#1,D1Ž.ƒAdvance�the�GET�ptr.$ŠIF…�THENŠ.ƒIf�it�goes�negative,*ŠMOVEƒ#Q_MAX,D1Š.…move�it�back�to�the�top. ŠENDI–.…*(ŠMOVEƒD1,GET(A5)‰.ƒSave�the�new�GET�ptr. 9ŠST…WAIT2_FLAG(A1)….ƒMark�that�we're�busy�transmitting�on *£.ƒport�2.7ŠMOVE.L�A5_2-DATA(A1),A5ƒ.ƒA5�<--�addr�of�port�2's�CCB.?ŠMOVE.L�TBL2ADDR-DATA(A1),A0ƒA0�<--�addr�of�driver�interface�ta1ŠJSR„XMIT(A0)‹.ƒJump�to�the�entry�to�output�D0.B.  ŠIF…�THENŠ.ƒIf�CCR�=�,9ŠSF…WAIT2_FLAG(A1)….…we�can�send�more�without�waiting,�so4ŠBRA„DO_XMIT2‹.…go�back�up�&�check�for�more�to�xmit. ŠENDI–.…* ŠENDI–.ƒ* ŠENDI–.�* 3ŠBRA„CHECK_WORK‰Go�check�for�other�background�work.ŠPAGEO*v********************************************************************************3***…DO_BRK1�(DO_BRK2)�--�SEND�A�BREAK�ON�PORT�1�(2)***F***…FUNCTION:‚This�routine�is�called�to�send�a�break�on�port�1�(2).‚It-***‡just�calls�the�driver�to�do�all�the�work.*** ***…NOTES:******…ENTRY�CONDITIONS:&***‡A1ƒ=�addr�of�base�of�data�segment.***O*^***************************************************************************** ***********‚Send�a�break�on�port�1.*DO_BRK1: >ŠSF…WAIT1_FLAG(A1)…Mark�that�we're�not�transmitting�on�port�1.4ŠST…BREAK1(A1)‰Mark�that�we're�sending�a�break�on�1.5ŠMOVE.L�A5_1-DATA(A1),A5ƒA5�<--�addr�of�port�1's�CCB.BŠMOVE.L�TBL1ADDR-DATA(A1),A0�A0�<--�addr�of�driver�interface�table3ŠJSR„SEND_BRK(A0)‡JSR�to�the�entry�to�send�a�break. 9ŠIF…�THENŠIf�we�shouldn't�waI it�for�the�driver�to�call$*§us�at�TM_BRK_OVER�(if�CCR�=�),8ŠSF…BREAK1(A1)‰mark�that�we're�not�sending�a�break�here.ŠENDI 3ŠBRA„CHECK_WORK‰Go�check�for�other�background�work.  ***********‚Send�a�break�on�port�2.*DO_BRK2: >ŠSF…WAIT2_FLAG(A1)…Mark�that�we're�not�transmitting�on�port�2.4ŠST…BREAK2(A1)‰Mark�that�we're�sending�a�break�on�2.5ŠMOVE.L�A5_2-DATA(A1),A5ƒA5�<--�addr�of�port�2's�CCB.CŠMOVE.L�TBL2ADDR-DATA(A1),A0�A0�<--�addr�of�driver�interface�table.3ŠJSR„SEND_BRK(A0)‡JSR�to�the�entry�to�send�a�break. 9ŠIF…�THENŠIf�we�shouldn't�wait�for�the�driver�to�call$*§us�at�TM_BRK_OVER�(if�CCR�=�),8ŠSF…BREAK2(A1)‰mark�that�we're�not�sending�a�break�here.ŠENDI 3ŠBRA„CHECK_WORK‰Go�check�for�other�background�work.ŠPAGEO*v********************************************************************************)***…DO_EXIT�--�EXIT�FROM�TRANSPARENT�MODE***G***…FUNCTION:‚This�background�routine�sends�the�WAKEUP�to�the�task�partC***‡of�TM�which�causes�us�to�terminate�transparent�mode�processing.*** ***…NOTES:******…ENTRY�CONDITIONS:.***‡A1�=�addr�of�the�base�of�the�data�segment.***O*^***************************************************************************** DO_EXIT: 7ŠSF…READY(A1)ŠMark�that�we're�not�ready,�so�we�won't�do*§any�more�work. 8ŠSAVEƒD0-D7/A0-A6ˆSave�registers�while�we�call�the�exec. ,ŠMOVE.L�SCT_TASK(A1),A0„A0�<--�our�taskname.+ŠMOVE.L�SCT_SESS(A1),D1„D1�<--�our�session.1ŠTR0$.GTXTCB�,�Call�exec:‚A0�<--�addr�of�our�TCB.)ŠBRA„WAKE_HIM‹We�found�it--go�wake�us�up.6ŠBRA„EXIT1ŽTransparent�mode�task�not�found--just�exit. 4WAKE_HIM‚TR0$.WAKEUP�,�Call�exec:‚Send�wakeup�to�us.+ŠNOP—Whether�it�worked�or�not,�just�restore8EXIT1…RESTORE�D0-D7/A0-A6‡registers�and�forget�about�it. 2ŠBRA„CHECK_WORK‰Return�to�the�background�executor.  ŠENDééé=/* =/*†COPY.AF=/*'=/* Chain file to assemble COPY utility=/*:=/* If no output argument is specified for the listing the&=/* chain file will default to COPY.LS=/*=/IFC \1 ƒ=ARG�COPY.LS=/ENDIF=/*=ASM COPY.SA,COPY.RO,\1;RZ=150=/*{ Included files are:=/*ƒ9995.&.FME.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.TR1.EQ=/*}=/*=ENDéééJ ééé 3=/* =/*†COPY.LF=/*%=/* Link chain file to create COPY.LO=/*:=/* If no output argument is specified for the listing the&=/* chain file will default to COPY.LL=/*=/IFC \1 ƒ=ARG�COPY.LL=/ENDIF=/*=LINK ,COPY.LO,\1;AHMIXATTRIBUTES D PSEG SEG0:0,14 $0000 INPUT COPY.ROLIB 0.&.UTILIB.ROEND=/*=ENDéééééé <ŠTTLˆCOPY�UTILITY‚REV�121984�4COPY†IDNTƒ4,0�COPY�UTILITY ŠOPT„FRS,CRE<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;*************************************************************%*‹PROGRAM�NAME�IS‚C�O�P�Y�U�.�D�A�T�A****ˆ***ˆCOPY�COMMANDƒ******/*ˆTHIS�COMMAND�WILL�COPY�A�FILE�FROM�ONE�VOLUME"*ˆTO�ANOTHER�VOLUME�OR�TO�THE�SAME*ˆVOLUME�BUT�ANOTHER�NAME..*ˆTHERE�WILL�BE�NO�DATA�CONVERSION�OF�THE�FILE*ˆDURING�THE�COPY�PROCESSING.* *ˆREV�1.00!*ˆREGISTERS�USED:�0�1�2�3�4�5�6�7*’D…*�*�*�*�*�*�**’A…*�*�*�*�*�*�***=**************************************************************ŠLIST ŠLLENƒ120ŠPAGE****’COPYƒMODIFICATION�HISTORY**ˆREVISION�CODE‡122084�4*)*’THE�CODE�WJ AS�MADE�POSITION�INDEPENDENT:"*”1.‚THE�PBA�WAS�LOADED�OFF�THE�PC.*”2.‚ALL�LEA�INSTRUCTIONS�WERE�DONE�OFF�THE�PC2*”3.‚ALL�IOSCALL�AND�FHSCALL�WERE�DONE�WITH�LABELS *˜OFF�THE�PC7*”4.‚SEVERAL�MOVE�INSTRUCTIONS�WERE�REVISED�SO�THAT�THE$*˜ADDRESS�MOVED�FROM�WAS�OFF�THE�PC.**ˆREVISION�CODE‡080684�4*;*’A�NEW�ROUTINE,�IOERCHK,�WAS�ADDED�TO�CHECK�FOR�IOS�BUFFER<*’OVERFLOW�ERRORS.�IF�ONE�IS�FOUND,�THE�UTILITY�ASSUMES�THAT<*’THE�FILE�BEING�VERIFIED�IS�NOT�AN�ASCII�FILE,�AND�PERFORMS1*’THE�REMAINDER�OF�THE�READS�USING�BINARY�FORMAT.*6*’CHGEND�IS�NOW�RESET�BEFORE�EACH�RECORD�IS�READ,�THIS9*’FIXES�AN�UNDOCUMENTED�PROBLEM�WHICH�CAUSED�THE�'RECORDS>*’NOT�THE�SAME�LENGTH'�MESSAGE�TO�CONTINUE�TO�BE�PRINTED,�EVEN**’WHEN�THE�RECORDS�WERE�OF�THE�SAME�LENGTH*9*’TWO�ADDITIONAL�CHECKS,�ONE�FOR�NULL�INPUT�AND�ONE�FOR�A7*’COMMA�AS�THE�FIRST�CHARACTER�OF�THE�OUTPUT�FIELD�WERE*’ADDED.*9*’TWO�ENHANCEMENTS�WERE�ADDED.�ONE�ALLOWS�WILDCARD�COPIES8*’TO�A�SINGLE�FILE.�WHEN�A�WILD�CARD�IS�SPECIFIED�IN�THE6*’INPUT�FIELD,�ALL�OF�THE�FILES�MATCHING�THAT�WILDCARD7*’(OR�ALL�THE�FILES�SELECTED,�IF�THAT�OPTION�IS�CHOSEN)8*’WILL�BE�CONCATENATED�INTO�ONE.�INCOMPATIBLE�TYPES�WILL<*’PRODUCE�ERROR�MESSAGES.�THE�SECOND�ENHANCEMENT�IS�SIMILAR, EC NB Vd ^` fU nW vF ~< †c Žg –W ž> ¦I ®9 ¶+ ¾B Æ6 ÎE Ö: Þ5 æ; îQ9*’BUT�IN�THIS�CASE�THE�MULTIPLE�INPUT�FILES�ARE�SEPARATED6*’WITH�A�'/'.�THE�FILENAMES�WILL�BE�OUTPUT�AS�THEY�ARE *’COPIED.*4*’THE�VERSION�NUMBER�IS�NOW�PRINTED�AT�THE�BEGINNING*4*’THE�CHECK�FOR�OPTIONS�IS�NOW�DONE�BEFORE�THE�CHECK4*’FOR�NULL�FIELDS�SO�THAT�A�'COPY�;H'�WILL�PRODUCE�A*’HELP�LISTING**ˆREVISION�CODE‡020384�4**7*’IF�THERE�IS�AN�SPR�FOR�THIS�PROBLEM�I�DON'T�KNOW�WHAT.*’THE�NUMBER�IS�BUT�THE�PROBLEM�IS�AS�FOLLOWS:!*’=COPY�JUNK.CF,JUNK.XX,JUNK.YY;B:*’THE�ABOVE�COMMAND�LINE�WOULD�NOT�WORK�IF�THE�LIST/DEVICE'*’PORTION�OF�THE�COMMAND�LINE�WAS�FIXED *’IT�DOES�NOW**ˆREVISION�CODE‡101983�4*4*’SPR�669�fixed.‚A�problem�occurred�using�COPY�X,Y;B3*’when�the�data�block�of�X�was�greater�than�13,�the0*’default�size�for�verify.‚This�program�will�now6*’get�a�segment�the�size�of�the�data�block�as�found�in/*’the�parameter�table�after�the�assign�is�made.**ˆREVISION�CODE‡100583�4*6*’'V=�x'�ADDED,�WHERE�x�REPRESENTS�THE�MAX�#�OF�VERIFY8*’ERRORS�TO�BE�DISPLAYED.�COPY�TERMINATES�WITH�A�WARNING"*’IF�ANY�VERIFY�ERRORS�WERE�FOUND.**ˆREVISION�CODE‡092083�4*3*’CONTAINS�NEW�'U'�OPTION,�WHICH�ENABLES�THE�USE�OF.*’THE�USER�NUMBER�OF�THE�INPUT�FOR�THE�OUTPUT.**ˆREVISION�CODE‡082383�4*.*’CORRECTED�PROBLEM�OF�ONLY�THE�1ST�DIFFERENCE/*’BIENG�PRINTED�PER�13�SECTOR�BUFFER�INSTEAD�OF5*’1ST�DIFFERNCE�PER�1�SECTOR�OF�THE�13�SECTOR�BUFFER.**’THIS�OCCURED�IF�THE�'T'�OPTION�WAS�USED.**ˆREVISION�CODE‡060183�4*$*’CONTAINS�CODE�TO�ENABLE�'C'�OPTION**ˆREVISION�CODE‡042883�4*+*’CONTAINS�CODE�TO�DO�RECORD�I/O�FOR�APPEND$*•IF�FILES�HAVE�DIFFERENT�BLOCK�SIZE***ˆREVISION�CODE‡100681�3* *’CONTAINS�ERROR�MESSAGE�HANDLER$*’CONTAINS�POSITION�INDEPENDENT�CODE-*’CONTAINS�CURRENT�REVISION�CODE�MODIFICATION5*’CONTAINS�TERMINATION�LOGIC�FOR�USE�WITH�CHAIN�FILES1*’CONTAINS�COMMON�SUBROUTINES�PULLED�FROM�LIBRARY*’USES�THE�'SBARG'�ROUTINE3*’CONTAINS�THE�ADDED�CHARACTER�SPACE�FOR�'SBARG'�TO*œPLACE�A�'CR'"*’CONTAINS�NEW�'T'�AND�'P'�OPTIONS$*’WILL�APPEND�TO�A�NON-EXISTENT�FILE*’RETRY�LOGIC�WAS�REMOVED:*’GIVES�NOTIFICATION�OF�COPY/VERIFY�STATUS�UPON�COMPLETION *œOF�REQUEST9*’WHEN�VERIFY�DIFFERENCES�ARE�DISPLAYED�THE�RECORD�NUMBER'*œWILL�BE�SHOWN�IN�DECIMAL�AT�ALL�TIMES***ˆREVISION�CODE‡102881�3*:*’INCREASED�STACK�SIZE�TO�ACCOMODATE�SBARG�IF�A�CHAIN�FILE0*’FIX�PROBLEM�OF�COPYING�TO�THE�DEFAULT�TERMINAL***ˆREVISION�CODE‡102981�3*%*’CORRECT�ERROR�WITH�COPY�ERROR�COUNT**K ******ˆREVISION�CODE‡110381�3*2*’REWORK�COPY/VERIFY�OUTPUT�WHEN�REQUEST�COMPLETED:*’SHOW�RECORD�NUMBERS�IN�HEX�ASCII�IF�CONTIGIOUS�FILE�TYPE*******ˆREVISION�CODE‡120281�3*)*’CORRECT�PROBLEM…,T.SA…NEW�ERROR�MESSAGE(*’CORRECT�PROBLEM…*.TES*.*,*.TES*.*,FIX:*°ELEMINATE�LOOP*’CORRECT�PROBLEM…X.SA,Y.SA;Q*°WHERE�Q�IS�AN�INVALID�OPTION9*’CORRECT�PROBLEM…ADJUSTED�SBARG�INPUT�BUFFERS�TO�MINIMUM**¦OF�5�CHARACTERS�PLUS�A�DEAD�BYTE�FOR�THE*¦CARRIAGE�RETURN6*’CORRECT�PROBLEM…FORCE�USER�TO�SPECIFY�'A'�OR�'S'�FOR*¦ALL�OR�SELECT**’CORRECT�PROBLEM…CLEANED�UP�THE�HELP�MASK*******ˆINCLUDE�FILES***ˆINCLUDE�9995.&.FME.EQ*ˆINCLUDE�9995.&.IOE.EQ*ˆINCLUDE�9995.&.TR1.EQ**ŠNOLISTŠINCLUDE�9995.&.FME.EQŠINCLUDE�9995.&.IOE.EQŠINCLUDE�9995.&.TR1.EQŠLIST**ŠPAGE<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;*************************************************************!*ˆ***†C�O�P�Y‚C�O�M�M�A�N�Dƒ*******ˆ***‰DATAƒSEGMENT„*******=****************************************************************ˆ****‚EQUATE�AREA‚******* BEGDATAƒEQU„0(STKLEN„EQU„25‘STACK�LENGTH�IN�LONG�WORDS)BUFSIZEƒEQU„160�INPUT�COMMAND�BUFFER�SIZE DSKLUI„EQU„1(DSKLUO„EQU„2’DISK�LOG�UNIT�ASSIGN�OUTPUT!LISTLU„EQU„3’LISTING�LOGICAL�UNIT"DIRLU…EQU„4’LOG�UNIT�FOR�DIRECTORY LU6‡EQU„6SECLEN„EQU„256�SECTOR�LENGTHHSECLENƒEQU„$100�SECTOR�LENGTH CRˆEQU„$0D LFˆEQU„$0A*ŠPAGE ŠOFFSET�0**ˆDUMMY�DATA�SEGMENT*3******************************************************ˆBUFFER�AREA�TO�READ�CONTIGUOUG�FILE�INTO*3****************************************************ŠPAGE ŠSECTION�0!ŠXREFƒEDITFILE,PARSE,OPTION,SBARG**ˆ****‚MACRO�AREA‚*********ˆNEXT�WORD�BOUNDRY�MACRO**ŠPAGE2*******************************************************„DATA�SEGMENT�(DSEG)ƒ****1**************************************************** PBA‡EQU„**;**************************************************************ˆ***ƒDATA�AREA‚******:************************************************************ REV_CODE:ŠDC.Bƒ'122084�4'&*œWHERE�REV_CODE�IS�DEFINED�AS�FOLLOWS *œMMDDYYXZ*3*œMMDDYY�=�MONTH�DAY�YEAR�OF�LAST�ASSEMBLY�OR�PATCH*œX†=�REVISION�TYPE�CODE*¦SPACE�=�CLEAN�ASSEMBLY *¦P…=�PATCHED*¦C…=�CUSTOMIZED�PATCHED**#*œZ†=�VERSADOS�MAJOR�REVISION�FIELD* ŠDS.LƒSTKLEN PROGSTKƒEQU„**ŠDC.Lƒ0ŠDS.Wƒ08*+++++++++++++++++++++++++++++++++++++++++++++++++++++++*,*ˆ***ƒBUFFIN�IS�THE�AREA�THE�COMMAND�LINE�IS.*ˆ***ƒREAD�INTO�WHEN�THIS�PROGRAM�IS�CALLED�IN*8*+++++++++++++++++++++++++++++++++++++++++++++++++++++++**BUFFIN„COMLINE�BUFSIZE‹***‚INPUT�BUFFER‚***-**********************************************5******************************************************+*ˆ**‚IOS�PARAMETER�TABLE�FOR�DISK�READS‚***6*ˆ**‚REFER�TO�IOS�EQUATES�UNDER�IOS�PARAMETER�BLOCK‚***5******************************************************ŠDS.Wƒ0/ŠIOS.DSKR�IOREAD,IOPWAT+IOPREC,DSKLUI,0,0,0,0,0$************************************%*ˆIOS�PARAMENTER�TABLE�FOR�DISK�WRITE*$*************************************(ŠIOS.DSKW�IOWRIT,IOPREC,DSKLUO,0,0,0,0,0ŠDS.Wƒ0*1*ˆHOLD�AREA�FOR�IOS�TABLES�FOR�B�OPT�USING�FAMILY HOLDPTFƒDS.Lƒ2’HOLD�AREA�FOR�FMSHOLDPTIƒDS.Bƒ56HOLDPTEƒEQU„*-13*****************************************************ŒIOS�PARAMETER�TABLE(*ˆSET�UP�IOS�(ERR0R-LOG)‚PARAMETER�BLOCK*3****************************************************7ŠIOS.OUT6I�IOWRIT,IOPASC+IOPIMG+IOPWAT,LDFLUN,0,0,0,0,0**ŠDS.Wƒ0**ˆGET�SEGMENT�PARAMETER�BLOCK* BUFPAR„EQU„*ŠDC.Lƒ0,0�TASK�(0=SELF)ŠDC.Wƒ$2000ŽOPTIONS0*œRMS68K�SUPPLIES�LOGICAL�ADDRESS�EQUAL�PHYSICAL *œADDRESSŠDC.Wƒ0’(RAM�SEGMENT)ŠDC.Lƒ'BUFR'�NAME�OF�SEGŠDC.Lƒ0’START�OF�BUFFER'BUFLEN„DC.Lƒ0’length�of�buffer‘10/19/83**ˆSET�UP�IOS�FOR�LISTING�LU3*6ŠIOS.OUT3�IOWRIT,IOPASC+IOPFOR+IOPWAT,LISTLU,0,0,0,0K ,0ŠDS.Wƒ0ŠPAGE"***********************************8*ˆFHS�PARAMETER�TABLE�FOR�CHANGE�LOGICAL�UNIT�ASSIGNMENT5*ˆCHANGE�IS�FROM�6�TO�3�-�SEND�SOURCE�IS�LU�A�IN�MASK*ˆAND�RECEIVE�IS�LU�B�IN�MASK4*ˆLU3�IS�USED�F0R�LISTING�AND�LU6�FOR�ERR0R�/LOGGING**3*ˆPARAMETER�TABLE�FOR�CHANG�LOGICAL�UNIT�ASSIGNMENT,*ˆIS�DIFFERENT�FROM�STANDART�PARAMETER�TABLE*%************************************** LU3AFHSƒEQU„*'ŠDC.WƒFHCHLU�COMMAND�(CHANGE�LU�ASSIGN)&ŠDC.WƒFOPKEP+FOPSLU†OPTION�KEEP�ASSIGNŠDC.Bƒ0’STATUSŠDC.BƒLDFLUN�SEND�LU�NUMBERŠDC.BƒLISTLU�RECEIVE�LU�NUMŠDC.Bƒ0’RESERVED&ŠDC.Lƒ0’TASK-ID�(0�MEANS�USE�YOURSELF)(ŠDC.Lƒ0’SESSION�#�(0�MEANS�USE�YOURSELF)*ŠDS.Wƒ0* *ˆSET�LU2�=�LU6�IF�OUTPUT�#�ONLY* LU2AFHSƒEQU„*'ŠDC.WƒFHCHLU�COMMAND�(CHANGE�LU�ASSIGN)&ŠDC.WƒFOPKEP+FOPSLU†OPTION�KEEP�ASSIGNŠDC.Bƒ0’STATUSŠDC.BƒLDFLUN�SEND�LU�NUMBERŠDC.BƒDSKLUO�RECEIVE�LU�NUMŠDC.Bƒ0’RESERVED&ŠDC.Lƒ0’TASK-ID�(0�MEANS�USE�YOURSELF)(ŠDC.Lƒ0’SESSION�#�(0�MEANS�USE�YOURSELF)*ŠDS.Wƒ0***,*********************************************&*ˆPARAMETER�BLOCK�FOR‚INPUT�(TERMINAL)*,*********************************************'ŠIOS.OUTIN�IOREAD,IOPFOR,CDFLUN,,,0,0,2*ŠDS.Wƒ0%ŠIOS.DNR�IOREAD,IOPFOR,CDFLUN,,,0,0,2*ŠDS.Wƒ0)******************************************?*ˆLU3FHS�IS�PARM�TABLE�FOR�LU3�WHICH�IS�USED�FOR�OUTPUT�LISTING*********************************************#*ˆFHS.LU3�FHCLOS,0,LISTLU,0,0,0,0,0&ŠFHS.LU3�FHASGN,FOPEW,LISTLU,0,0,0,0,0 ŠDC.Lƒ0,0,0*ŠDS.Wƒ0*;************************************************************:*ˆ***�DSKFHS�IS�THE�PARAMETER�TABLE�FOR�THE�FHS�INPUT�FILE*;***********************************************************INFHS…DC.WƒFHASGN�COMMANDŠDC.WƒFOPPRŽOPTIONS�PUBLIC�READŠDC.Bƒ0’STATUS ŠDC.BƒDSKLUI�LOGICAL�UNIT�NUMBER INVOL…DC.Lƒ$20202020ŠVOLUME�NAMEINUSN…DC.Wƒ0’USER�NUMBER!INCAT…DC.Lƒ$20202020ŠCATALOG�NAMEŠDC.Lƒ$20202020ŠDC.Lƒ$20202020ŠFILE�NAMEŠDC.Lƒ$20202020ŠDC.Wƒ$2020ŽEXTENSIONINFHSR„DC.Wƒ0’RESERVEDŠDC.Bƒ0’WRITE�PROTECT�CODEŠDC.Bƒ0’READ�PROTECT�CODEŠDC.Wƒ0’LOGICAL�RCORD�LENGTH5INSEC…DC.Lƒ0’CONTIGUOUS�FILE�SIZE�/�DIR�ENTRY�POINTER6*ˆFOLLOWING�FHS�PARAMENTERS�FOR�SHARED�SEGMENT�REQUEST(ŠDC.Lƒ0’SEGMENT�STARTING�LOGICAL�ADDRESS$ŠDC.Lƒ0’SEGMENT�ENDING�LOGICAL�ADDR.3ŠDC.Lƒ0’LENGTH�OF�PARM�BLOCK�FOR�SHARED�SEG�REQUESTŠDS.Wƒ0***%*ˆFHS�PARAMETER�BLOCK�FOR�DISK�OUTPUT* OUTFHS„EQU„*ŠDC.WƒFHASGN�COMMAND ŠDC.WƒFOPPWŽOPTIONS-PUBLIC�WRITEŠDC.Bƒ0’STATUSŠDC.BƒDSKLUO�LOGICAL�UNIT�NUM!OUTVOL„DC.Lƒ$20202020ŠVOLUME�NAMEŠDC.Wƒ0’USER�NUMOUTCAT„DC.Lƒ$20202020ŠCAT�NAMEŠDC.Lƒ$20202020ŠDC.Lƒ$20202020ŠFILE�NAMEŠDC.Lƒ$20202020 ŠDC.Wƒ$2020ŠDC.Wƒ0ŠDC.Bƒ0’WRITE�PROT�CODEŠDC.Bƒ0ŠDC.Wƒ0ŠDC.Lƒ0’CONT�FILE�SIZE ŠDC.Lƒ0,0,0ŽCONTIGIOUS�FILE�INFOŠDS.Wƒ0*"*�VOLUME�ASSIGNMENT�FOR�FAMILY�AND**ˆPARAMETER�BLOCK�FOR�FETCH�DIRECTORY�CALL DIRFHS„EQU„*ŠDC.WƒFHFDEN�CMDŠDC.WƒFOPPRŽOPTIONSŠDC.Bƒ0’STATUSŠDC.BƒDIRLUŽLOG�UNITDIRFHSVƒDC.Lƒ$20202020ŠVOLŠDC.Wƒ-2‘USER�NUMDIRCAT„DC.Lƒ'„'�CATALOGUE ŠDC.Lƒ'„'ŠDC.Lƒ'„'�FILE ŠDC.Lƒ'„'DIRFHSEƒDC.Wƒ'‚'�EXTŠDC.Wƒ0ŠDC.Bƒ0ŠDC.Bƒ0ŠDC.Wƒ0ŠDC.Lƒ0’DIR�ADDR�PARM*ŠDS.Wƒ0&*ˆDIRECTORY�ENTRY�(DIR)�DATA�STRUCTURE'*ˆTHE�DIR�ENTRY�IS�READ�INTO�THIS�BLOCK*DIRBLK„DS.BƒFDLEN*ˆDS.W�0;************************************************************(*ˆPARAMETER�BLOCK�TO�ASSIGN�INPUT�VOLUME*DIRVOL„DC.WƒFHASGN�COMMANDŠDC.WƒFOPPRŽOPTIONS�PUBLIC�READŠDC.Bƒ0’STATUSŠDC.BƒDIRLUŽLOGICAL�UNIT�NUMBERŠDC.Lƒ$20202020ŠVOLUME�NAMEŠDC.Wƒ0’USER�NUMBERŠDC.Lƒ$20202020ŠCAT�NAMEŠDC.Lƒ$20202020ŠDC.Lƒ$20202020ŠFILE�NAMEŠDC.Lƒ$20202020 ŠDC.Wƒ$2020ŠDS.Lƒ3(ŠDC.Lƒ0’SEGMENT�STARTING�LOGICAL�ADDRESS$ŠDC.Lƒ0’SEGMENT�ENDING�LOGICAL�ADDR.3ŠDC.Lƒ0’LENGTH�OF�PARM�BLOCK�FOR�SHARED�SEG�REQUESTŠDS.Wƒ0**'HOLDFUSN‚DC.Wƒ0’FAMILY�USER�NUMBER�MASK*’HOLD�MASK�OUTPUT�FOR�FAMILYHOLDFAMƒDC.Lƒ'„'�CAT ŠDC.Lƒ'„'L ŠDC.Lƒ'„'�FILE ŠDC.Lƒ'„' ŠDC.Lƒ'‚'�EXŠDS.Wƒ08**********************************************************ˆ***ƒWORK‚AREAƒ******9**********************************************************STSKNAMƒDC.Lƒ0’SAVE�TASK�NAMESESNUM„DC.Lƒ0’SAVE�SESSION�NUM#VOLNAM„DC.Lƒ0’SAVE�VOL�DEFAULT�NAMEŠDC.Wƒ0’TOP�HALF�OF�D3"USERNUMƒDC.Wƒ0’DEFAULT�USER�NUMBER*CATNAM„DC.Lƒ0,0�SAVE�DEFAULT�CATAGORY�NAMEŠDS.Lƒ3’REG�D6�D7�&�A0&TIDLOGON‚DC.Lƒ0’TERM�ID�AT�LOG�ON�TIMEŠDC.Wƒ0’TOP�HALF�OF�A2"LUSERNUM‚DC.Wƒ0’LOG�ON�USER�NUMBERŠDS.Lƒ8’SAVE�OTHERS�REGISTERS-PROTIN„DC.Wƒ0’SAVE�INPUT�PROT�CODE�FOR�FAMILY$PROTOUTƒDC.Wƒ0’SAVE�OUTPUT�PROT�CODEOFLAG…DC.Lƒ0’MORE�OUTPUT�FLAG DNRR†DC.Bƒ'‚'�NOT�READY�RESPONSEDEVFLAGƒDC.Bƒ0’DEVICE�FLAG!FLAGA…DC.Bƒ0’OPTION�A�APPEND�FILEEXFLAG„DC.Bƒ0’END�OF�INPUT�FLAG"NCFLAG„DC.Bƒ0’CONTIGUOUS�FILE�FLAG!FAMIFLAG‚DC.Bƒ0’FAMILY�FLAG�INPUT"FAMOFLAG‚DC.Bƒ0’FAMILY�FLAG�OUTPUT#ERFLAG„DC.Bƒ0’ERROR�FLAG�FOR�FAMILY0QFLAG…DC.Bƒ0’SET�WHEN�FAMILY�COPY�ABORTED�WITH�Q*£***�080684�***4FAMAPEND‚DC.Bƒ0’WILD�CARD�APPEND�FLAG�***�080684�***3REREAD„DC.Bƒ0’FLAG�FOR�REREAD�AFTER�BUFFER�OVERFLOW!*£ADDED�080684�TO�CORRECT�SPR1035*ŠDS.Wƒ0*0SAVOADDƒDC.Lƒ0’1ST�TIME�FLAG�FOR�PRT�DETAIL�LINE'FORMFEED‚DC.Bƒ$0C�TOP�OF�PAGE�CHARACTER!ODEV†DC.Bƒ0’OUTPUT�IS�DEVICE�FLAG IDEV†DC.Bƒ0’INPUT�IS�DEVICE�FLAG%ISDEV…DC.Bƒ0’INPUT�OR�OUTPUT�WS�A�DEVFLAGY…DC.Bƒ0’BYPASS�FLAG,FLAGN…DC.Bƒ0’DUP�FILE�DO�NOT�OVER�DELETE�OLDFLAGV…DC.Bƒ0’VERIFY�FLAGFLAGB…DC.Bƒ0’COPY�&�VERIFY�FLAG'FLAGC…DC.Bƒ0’MAINTAIN�CATALOG�NAME�FLAG&FLAGU…DC.Bƒ0’MAINTAIN�USER�NUMBER�FLAG/CHGEND„DC.Bƒ0’END�OF�RECORDS�NOT�SAME�IN�VERIFY-NOTEND„DC.Bƒ1’END�FLAG�NOT�AT�END�=�1�END�=�0SEL‡DC.Bƒ0’SELECT�INDICATOR2V_EQUALƒDC.Bƒ0’"="�IN�OPTIONS�FIELD�AFTER�"V"�FLAG5OV_VALUE‚DC.Bƒ0’ORIG�VALUE�AFTER�'V='�IN�OPTION�FIELD,V_VALUEƒDC.Wƒ0’DECREMENTED�VALUE�OF�OV_VALUE*)BUFCE…DS.Lƒ1’#�sectors�*�256�-�1Ž10/19/83 BUFNUM„DS.Lƒ1’BUFCE�+�1˜10/19/834BUFNUMEƒDS.Lƒ1’#�sectors�in�file�data�block…10/19/830BUFSIZ„DS.ééééééééL ééééééééééééééééM ééééééééééééééééM ééééééééééééééééN ééééééééééééééééN ééééééééééééééééO ééééééééééééééééO éééééééééééééééé